From bf143472d7d89b2b66027415fb439bdf14d9bd07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D1=8F=201=D0=A1?= Date: Thu, 13 Apr 2023 23:19:00 +0300 Subject: [PATCH] 3_1_8_276 --- .../Задание/Forms/ДействиеВыполнить/Form.form | 11 - .../Задание/Forms/ДействиеПроверить/Form.form | 11 - .../Forms/ФормаБизнесПроцесса/Form.form | 11 - .../Задание/Forms/ФормаСписка/Form.form | 3 - .../Задание/ManagerModule.bsl | 11 +- .../Forms/ПараметрыПрописиВалюты_en/Form.form | 4 - .../Form.form | 2 - .../Валюты/Forms/ФормаСписка/Form.form | 1 - .../Валюты/Forms/ФормаСписка/Module.bsl | 4 +- .../Валюты/Forms/ФормаЭлемента/Form.form | 7 - SSL/src/Catalogs/Валюты/ObjectModule.bsl | 2 +- .../Forms/ФормаВыбора/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЭлемента/Form.form | 1 - .../Forms/РазмещениеВРазделах/Form.form | 29 + .../Forms/РазмещениеВРазделах/Module.bsl | 2 +- .../Forms/ФормаСписка/Form.form | 21 +- .../Forms/ФормаСписка/Module.bsl | 41 +- .../Forms/ФормаЭлемента/Form.form | 70 +- .../Forms/ФормаЭлемента/Module.bsl | 9 +- .../ВариантыОтчетов/ManagerModule.bsl | 6 +- .../Catalogs/ВариантыОтчетов/ObjectModule.bsl | 8 +- .../Forms/ФормаСписка/Form.form | 1 - .../ВерсииРасширений/ManagerModule.bsl | 68 +- .../ВерсииФайлов/Forms/ВерсииФайла/Form.form | 32 + .../ВерсииФайлов/Forms/ФормаВыбора/Form.form | 33 +- .../ВерсииФайлов/Forms/ФормаСписка/Form.form | 33 +- .../Forms/ФормаВыбора/Form.form | 47 +- .../Forms/ФормаВыбораГруппы/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 249 +- .../Forms/ФормаСписка/Module.bsl | 32 +- .../Forms/ФормаЭлемента/Form.form | 74 +- .../Forms/ФормаЭлемента/Help/ru.html | 10 +- .../Forms/ФормаЭлемента/Module.bsl | 61 +- .../ManagerModule.bsl | 47 +- .../ВидыКонтактнойИнформации/ObjectModule.bsl | 4 + .../ВидыКонтактнойИнформации.mdo | 25 +- .../Forms/ФормаЭлемента/Form.form | 1 - .../Form.form | 1 - .../ПоискКомпонентыНаПортале1СИТС/Form.form | 5 +- .../Forms/ФормаСписка/Form.form | 2 - .../Forms/ФормаЭлемента/Form.form | 5 - .../Forms/ФормаЭлемента/Module.bsl | 5 +- .../ВнешниеКомпоненты/ManagerModule.bsl | 10 +- .../Commands/ВнешнийДоступ/CommandModule.bsl | 4 +- .../Forms/ФормаСписка/Form.form | 467 +- .../Forms/ФормаСписка/Module.bsl | 28 +- .../Forms/ФормаЭлемента/Form.form | 1752 ++-- .../Forms/ФормаЭлемента/Module.bsl | 188 +- .../ВнешниеПользователи/ManagerModule.bsl | 2 +- .../ВнешниеПользователи/ObjectModule.bsl | 5 + .../ВнешниеПользователи.mdo | 4 +- .../ВопросыШаблонаАнкеты/ManagerModule.bsl | 2 +- .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЭлемента/Form.form | 330 +- .../Forms/ВыборПоОтветственному/Form.form | 32 + .../ГруппыДоступа/Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЭлемента/Form.form | 37 +- .../Forms/ФормаЭлемента/Module.bsl | 2 +- .../Catalogs/ГруппыДоступа/ManagerModule.bsl | 25 +- .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЭлемента/Form.form | 189 +- .../ГруппыПользователей.mdo | 2 +- .../Form.form | 2 - .../Form.form | 1 - .../Forms/РазмещениеВРазделах/Form.form | 1 + .../Forms/ФормаСписка/Form.form | 3 - .../Forms/ФормаЭлемента/Form.form | 46 +- .../Forms/ФормаЭлемента/Module.bsl | 108 +- .../ObjectModule.bsl | 2 +- .../ДополнительныеОтчетыИОбработки.mdo | 95 + .../Forms/ФормаСписка/Form.form | 1 - .../Заметки/Forms/ВсеЗаметки/Form.form | 2 - .../Заметки/Forms/ЗаметкиПоПредмету/Form.form | 2 - .../Заметки/Forms/ФормаЭлемента/Form.form | 4 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЭлемента/Form.form | 3 - .../ManagerModule.bsl | 30 +- .../ИдентификаторыОбъектовМетаданных.mdo | 37 +- .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЭлемента/Form.form | 3 - .../Календари/Forms/ФормаСписка/Form.form | 1 - .../Календари/Forms/ФормаЭлемента/Form.form | 27 - SSL/src/Catalogs/Календари/ManagerModule.bsl | 2 +- .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЭлемента/Form.form | 5 - .../Forms/ФормаСписка/Form.form | 1 - .../КлючиДоступа/Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЭлемента/Form.form | 3 - .../УсловияВидимостиВПодменюПечать/Module.bsl | 45 +- .../МакетыПечатныхФорм/ManagerModule.bsl | 174 +- .../МакетыПечатныхФорм/МакетыПечатныхФорм.mdo | 34 + .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЭлемента/Form.form | 2 - .../Forms/ФормаСписка/Form.form | 119 +- .../Forms/ФормаСписка/Module.bsl | 272 +- .../ManagerModule.bsl | 4 +- .../Forms/ФормаЭлемента/Form.form | 46 +- .../НастройкиАвторизацииИнтернетСервисов.mdo | 44 +- .../ПапкиФайлов/Forms/ФормаВыбора/Form.form | 1 - .../ПапкиФайлов/Forms/ФормаСписка/Form.form | 1 - .../ПапкиФайлов/Forms/ФормаЭлемента/Form.form | 1 - SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl | 12 +- .../Forms/ФормаВыбора/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЭлемента/Form.form | 1 - .../ПапкиЭлектронныхПисем/ManagerModule.bsl | 4 +- .../Form.form | 1540 +-- .../Module.bsl | 18 +- .../ОграничениеНаВходВПрограмму/Form.form | 3 - .../ПользователиИнформационнойБазы/Form.form | 247 +- .../ПользователиИнформационнойБазы/Module.bsl | 79 +- .../Пользователи/Forms/ФормаСписка/Form.form | 476 +- .../Пользователи/Forms/ФормаСписка/Module.bsl | 40 +- .../Forms/ФормаЭлемента/Form.form | 2612 +++-- .../Forms/ФормаЭлемента/Module.bsl | 371 +- .../Catalogs/Пользователи/ManagerModule.bsl | 13 +- .../Catalogs/Пользователи/ObjectModule.bsl | 12 +- .../Catalogs/Пользователи/Пользователи.mdo | 4 +- .../Forms/ПрименениеПравил/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../ManagerModule.bsl | 203 +- .../Forms/ФормаСписка/Form.form | 107 +- .../Forms/ФормаСписка/Module.bsl | 18 +- .../Forms/ФормаЭлемента/Form.form | 6 - .../ПравилаПроверкиУчета/ManagerModule.bsl | 2 +- .../ПредопределенныеВариантыОтчетов.mdo | 15 + ...допределенныеВариантыОтчетовРасширений.mdo | 15 + .../Forms/ВстроенныйКриптопровайдер/Form.form | 1 - .../Forms/ОшибкаОбращенияКПрограмме/Form.form | 50 +- .../ОшибкаОбращенияКПрограмме/Module.bsl | 36 +- .../Form.form | 620 ++ .../Module.bsl | 78 + .../Forms/ФормаЭлемента/Form.form | 95 + .../Forms/ФормаЭлемента/Module.bsl | 131 +- .../ManagerModule.bsl | 64 +- ...ПрограммыЭлектроннойПодписиИШифрования.mdo | 26 + .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЭлемента/Form.form | 4 - .../ManagerModule.bsl | 2 +- .../Forms/ФормаСписка/Form.form | 2 - .../Forms/ФормаЭлемента/Form.form | 141 +- .../ПрофилиГруппДоступа/ManagerModule.bsl | 49 +- .../ПрофилиГруппДоступа/ObjectModule.bsl | 10 +- .../Forms/ФормаВыбора/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/SMSРассылкаПаролей/Form.form | 2162 +++++ .../Forms/SMSРассылкаПаролей/Help/ru.html | 14 + .../Forms/SMSРассылкаПаролей/Module.bsl | 224 + .../Forms/ПараметрыFTP/Form.form | 1 - .../Forms/ПаролиШифрование/Form.form | 1944 ++++ .../Forms/ПаролиШифрование/Help/ru.html | 33 + .../Forms/ПаролиШифрование/Module.bsl | 764 ++ .../Forms/ПолучателиРассылки/Form.form | 332 +- .../Forms/ПолучателиРассылки/Module.bsl | 36 + .../Forms/Предупреждение/Form.form | 2 - .../Forms/ФормаВыбораГруппы/Module.bsl | 8 + .../Forms/ФормаГруппы/Module.bsl | 7 + .../Forms/ФормаСписка/Form.form | 98 +- .../Forms/ФормаСписка/Module.bsl | 63 +- .../Forms/ФормаЭлемента/Form.form | 1306 ++- .../Forms/ФормаЭлемента/Help/ru.html | 26 +- .../Forms/ФормаЭлемента/Module.bsl | 465 +- SSL/src/Catalogs/РассылкиОтчетов/Help/ru.html | 51 +- .../РассылкиОтчетов/ManagerModule.bsl | 400 + .../Catalogs/РассылкиОтчетов/ObjectModule.bsl | 59 +- .../Template.mxlx | 403 + .../РассылкиОтчетов/РассылкиОтчетов.mdo | 35 + .../Forms/ФормаВыбора/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЭлемента/Form.form | 7 - .../РолиИсполнителей/ManagerModule.bsl | 12 +- .../Form.form | 208 +- .../Module.bsl | 43 +- .../Forms/ДобавлениеСертификата/Form.form | 756 +- .../Forms/ДобавлениеСертификата/Module.bsl | 111 +- .../Form.form | 207 +- .../Module.bsl | 42 +- .../Form.form | 1306 +++ .../Module.bsl | 424 + .../Form.form | 1 - .../ПодборСертификатовДляШифрования/Form.form | 7 +- .../Module.bsl | 6 - .../Forms/ПодписаниеДанных/Form.form | 17 +- .../Forms/ПодписаниеДанных/Module.bsl | 48 +- .../Forms/ПроверкаСертификата/Form.form | 148 +- .../Forms/ПроверкаСертификата/Module.bsl | 97 +- .../Forms/ПросмотрДанных/Form.form | 32 + .../Forms/РасшифровкаДанных/Form.form | 7 - .../Forms/РасшифровкаДанных/Module.bsl | 39 +- .../Forms/СписокПользователей/Form.form | 3 - .../Forms/УстановкаСертификата/Form.form | 1269 +++ .../Forms/УстановкаСертификата/Module.bsl | 213 + .../Forms/ФормаЭлемента/Form.form | 748 +- .../Forms/ФормаЭлемента/Help/ru.html | 3 +- .../Forms/ФормаЭлемента/Module.bsl | 87 +- .../Forms/ШифрованиеДанных/Form.form | 74 +- .../Forms/ШифрованиеДанных/Module.bsl | 98 +- .../ManagerModule.bsl | 10 +- .../Templates/Штамп/Template.mxlx | 8 +- ...атыКлючейЭлектроннойПодписиИШифрования.mdo | 18 + .../Forms/ФормаВыбора/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Module.bsl | 6 +- .../ManagerModule.bsl | 2 +- .../СтраныМира/Forms/Классификатор/Form.form | 26 - .../СтраныМира/Forms/ФормаСписка/Form.form | 3 +- .../СтраныМира/Forms/ФормаСписка/Module.bsl | 2 +- .../СтраныМира/Forms/ФормаЭлемента/Form.form | 2 - SSL/src/Catalogs/СтраныМира/ManagerModule.bsl | 2 +- .../Forms/ВыборУзлаПланаОбмена/Form.form | 642 ++ .../Forms/ВыборУзлаПланаОбмена/Module.bsl | 174 + .../Module.bsl | 6 +- .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЭлемента/Form.form | 125 +- .../Forms/ФормаЭлемента/Module.bsl | 137 +- .../СценарииОбменовДанными/ManagerModule.bsl | 90 +- .../СценарииОбменовДанными/ObjectModule.bsl | 20 +- .../СценарииОбменовДанными.mdo | 25 + .../УдалениеЛишнихФайловИзТома/Form.form | 3 - .../УдалениеЛишнихФайловИзТома/Module.bsl | 8 +- .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЭлемента/Form.form | 3 - .../Catalogs/ТомаХраненияФайлов/Help/ru.html | 6 +- .../ТомаХраненияФайлов/ObjectModule.bsl | 2 +- .../Forms/ФормаЭлемента/Form.form | 5 - .../Forms/ФормаЭлемента/Module.bsl | 2 +- .../ПомощникНастройкиУчетнойЗаписи/Form.form | 47 +- .../ПомощникНастройкиУчетнойЗаписи/Module.bsl | 25 +- .../ПроверкаНастроекУчетнойЗаписи/Form.form | 8 - .../Forms/ФормаСписка/Form.form | 2 - .../Forms/ФормаЭлемента/Form.form | 15 +- .../ManagerModule.bsl | 31 +- .../ObjectModule.bsl | 21 +- SSL/src/Catalogs/Файлы/Forms/Файлы/Form.form | 67 +- SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl | 36 +- .../Файлы/Forms/ФормаВыбора/Form.form | 6 +- .../Файлы/Forms/ФормаПеретаскивания/Form.form | 6 +- .../Файлы/Forms/ФормаПодбора/Form.form | 6 +- .../Файлы/Forms/ФормаЭлемента/Form.form | 76 +- .../Файлы/Forms/ФормаЭлемента/Module.bsl | 35 +- SSL/src/Catalogs/Файлы/ManagerModule.bsl | 3 +- .../ШаблоныАнкет/Forms/ФормаВыбора/Form.form | 1 - .../ФормаМастераКомплексныхВопросов/Form.form | 3 - .../ФормаМастераТабличныхВопросов/Form.form | 9 - .../Forms/ФормаПростыхВопросов/Form.form | 2 - .../ШаблоныАнкет/Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЭлемента/Form.form | 33 +- .../ЗаполнитьПроизвольныеПараметры/Form.form | 1 - .../Forms/ПроизвольныйПараметр/Module.bsl | 2 +- .../Forms/СформироватьСообщение/Form.form | 9 +- .../Forms/СформироватьСообщение/Module.bsl | 4 +- .../Forms/ФормаСписка/Form.form | 2 - .../Forms/ФормаЭлемента/Form.form | 132 +- .../Forms/ФормаЭлемента/Module.bsl | 91 +- .../ШаблоныСообщений/ManagerModule.bsl | 50 +- .../ШаблоныСообщений/ObjectModule.bsl | 12 +- .../ШаблоныСообщений/ШаблоныСообщений.mdo | 53 +- .../ПодборЯзыкаИзСпискаДоступных/Form.form | 72 +- .../ПодборЯзыкаИзСпискаДоступных/Module.bsl | 39 - .../Forms/ФормаСписка/Form.form | 2 - .../ЯзыкиПечатныхФорм/ManagerModule.bsl | 19 +- .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЭлемента/Form.form | 5 - .../ВопросыДляАнкетирования/ManagerModule.bsl | 2 +- .../Forms/ЗависимостьРеквизитов/Module.bsl | 2 +- .../ИзменениеНастройкиСвойства/Form.form | 2 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЭлемента/Form.form | 49 +- .../Forms/ФормаЭлемента/Module.bsl | 394 +- .../ManagerModule.bsl | 20 +- .../ДополнительныеРеквизитыИСведения.mdo | 3 + .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../ManagerModule.bsl | 15 + .../ОбластьДанныхВспомогательныеДанные.mdo | 4 - .../ОбластьДанныхОсновныеДанные.mdo | 24 +- .../АрхивСообщенийОбменов/CommandModule.bsl | 24 + .../АрхивСообщенийОбменов.mdo | 14 + .../ВремяТекущегоСеанса/CommandModule.bsl | 2 +- .../НастройкаОнлайнПоддержки.mdo | 11 - .../CommandModule.bsl | 20 + ...ктыНезарегистрированныеПриЗацикливании.mdo | 10 + .../CommandModule.bsl | 24 + ...ПереходаНаИнтернетВнутренняяПубликация.mdo | 10 + ...СвязатьсяСоСпециалистомОнлайнПоддержки.mdo | 13 - .../CommonForms/АвтономнаяРабота/Form.form | 63 +- .../CommonForms/АвтономнаяРабота/Module.bsl | 12 + .../АвтономнаяРаботаВМоделиСервиса/Form.form | 10 - SSL/src/CommonForms/АдреснаяКнига/Form.form | 5 - .../АутентификацияВСервисе/Module.bsl | 4 +- .../ВводЗначенийСпискомСФлажками/Form.form | 33 +- .../ВводЗначенийСпискомСФлажками/Module.bsl | 2 +- .../CommonForms/ВводНаРазныхЯзыках/Form.form | 28 +- .../CommonForms/ВводНаРазныхЯзыках/Module.bsl | 30 +- SSL/src/CommonForms/Вопрос/Form.form | 2 - SSL/src/CommonForms/Вопрос/Module.bsl | 2 +- .../Form.form | 1 - .../ВосстановлениеПаролей/Form.form | 7 - .../ВосстановлениеПаролей/Help/ru.html | 2 +- .../ВосстановлениеПаролей/Module.bsl | 98 +- .../Form.form | 1 - .../Form.form | 1 - .../ВходВПрограммуЗапрещен/Form.form | 1 - .../Form.form | 7 - .../ВыборИсполнителяБизнесПроцесса/Form.form | 10 +- .../ВыборИсполнителяБизнесПроцесса/Module.bsl | 17 + SSL/src/CommonForms/ВыборКонтакта/Form.form | 1 - .../ВыборОбъектовМетаданных/Form.form | 3 +- .../ВыборОбъектовМетаданных/Module.bsl | 3 +- .../ВыборПутиКАрхивуФайловТомов/Form.form | 1 - .../ВыборРолиИсполнителя/Form.form | 2 - .../ВыборРолиИсполнителя/Module.bsl | 4 +- .../ВыборТиповПользователей/Form.form | 120 +- .../ВыборУзловПлановОбмена/Form.form | 14 +- .../ВыборУзловПлановОбмена/Module.bsl | 119 +- .../ВыборФорматаВложений/Form.form | 69 +- .../ВыборФорматаВложений/Module.bsl | 52 +- .../CommonForms/ГруппыПользователей/Form.form | 32 + .../ГруппыПользователей/Module.bsl | 4 - .../CommonForms/ДлительнаяОперация/Form.form | 3 - .../CommonForms/ДлительнаяОперация/Module.bsl | 20 +- .../Form.form | 1 - .../Module.bsl | 40 +- .../ДополнительныеОтчетыИОбработки/Form.form | 2 +- .../Form.form | 5 - .../КонтрольДинамическогоОбновления/Form.form | 4 - .../Form.form | 1 - .../МастерАнкетыПоРазделам/Form.form | 8 +- .../МастерАнкетыПоРазделам/Module.bsl | 10 +- .../Form.form | 4 +- .../НапоминаниеПриРедактировании/Form.form | 1 - .../НастройкаКолонтитулов/Form.form | 3 - .../НастройкаКомандПечати/Form.form | 32 + .../НастройкаМоихОтчетовИОбработок/Form.form | 2 +- .../НастройкаОнлайнПоддержки/Form.form | 789 -- .../НастройкаОнлайнПоддержки/Help/ru.html | 18 - .../НастройкаОнлайнПоддержки/Module.bsl | 149 - .../НастройкаОтправкиSMS/Form.form | 1 - .../НастройкаПереводаТекста/Form.form | 1 - .../НастройкаПереводаТекста/Module.bsl | 6 +- .../НастройкаРабочегоКаталога/Form.form | 2 - .../НастройкиВходаПользователей/Form.form | 3840 ++++++-- .../НастройкиВходаПользователей/Help/ru.html | 31 +- .../НастройкиВходаПользователей/Module.bsl | 233 +- .../НастройкиПравОбъектов/Form.form | 139 +- .../НастройкиПравОбъектов/Module.bsl | 8 +- .../НастройкиСинхронизацииДанных/Form.form | 495 +- .../НастройкиСинхронизацииДанных/Module.bsl | 115 +- .../Form.form | 839 +- .../Help/ru.html | 22 +- .../Module.bsl | 540 +- SSL/src/CommonForms/НовыйПароль/Form.form | 57 + SSL/src/CommonForms/НовыйПароль/Module.bsl | 23 +- .../ОписаниеИзмененийПрограммы/Form.form | 4 - .../ОписаниеИзмененийПрограммы/Module.bsl | 1 + .../Form.form | 3 - .../Module.bsl | 2 +- SSL/src/CommonForms/ОтправкаSMS/Form.form | 7 - SSL/src/CommonForms/ОтправкаSMS/Module.bsl | 2 +- .../CommonForms/ОтправкаСообщения/Form.form | 2 - .../CommonForms/ОтправкаСообщения/Module.bsl | 18 +- SSL/src/CommonForms/ПанельОтчетов/Form.form | 22 - SSL/src/CommonForms/ПанельОтчетов/Module.bsl | 3 +- .../Form.form | 4 - .../ПараметрыПроксиСервера/Form.form | 4 - .../CommonForms/ПечатьДокументов/Form.form | 280 +- .../CommonForms/ПечатьДокументов/Module.bsl | 954 +- .../ПечатьДокументовOfficeOpen/Form.form | 2422 +++++ .../ПечатьДокументовOfficeOpen/Help/ru.html | 29 + .../ПечатьДокументовOfficeOpen/Module.bsl | 1578 ++++ .../ПечатьДокументовOfficeOpen.mdo} | 7 +- .../ПодготовкаНовогоПисьма/Form.form | 65 +- .../ПодготовкаНовогоПисьма/Module.bsl | 18 +- .../Form.form | 12 - .../Form.form | 401 - .../Help/ru.html | 3 - .../Module.bsl | 71 - .../CommonForms/ПользователиСервиса/Form.form | 118 +- .../ПользователиСервиса/Module.bsl | 16 +- SSL/src/CommonForms/ПраваДоступа/Form.form | 65 +- SSL/src/CommonForms/ПраваДоступа/Module.bsl | 2 +- .../ПраваДоступаУпрощенно/Form.form | 574 +- .../ПраваДоступаУпрощенно/Module.bsl | 4 +- .../ПредупреждениеБезопасности/Form.form | 3 - .../Form.form | 11 +- .../Module.bsl | 51 +- .../ПроверкаФайлаОбновления/Form.form | 1 - .../ПроверкаФайлаОбновления/Module.bsl | 4 +- .../Form.form | 36 +- .../CommonForms/ПустойРабочийСтол/Form.form | 14 +- .../CommonForms/ПустойРабочийСтол/Module.bsl | 14 + .../РазблокированиеРеквизитов/Form.form | 563 ++ .../РазблокированиеРеквизитов/Module.bsl | 377 + .../РазблокированиеРеквизитов.mdo | 11 + .../РазрешенныеНеаккредитованныеУЦ/Form.form | 3 +- SSL/src/CommonForms/Расширения/Form.form | 37 +- SSL/src/CommonForms/Расширения/Module.bsl | 133 +- .../РасширенноеПредставлениеОшибки/Form.form | 54 +- .../РасширенноеПредставлениеОшибки/Module.bsl | 85 +- .../РегиональныеНастройки/Form.form | 8 - .../РегиональныеНастройки/Module.bsl | 16 + .../Form.form | 2317 +++++ .../Help/ru.html | 45 + .../Module.bsl | 2497 +++++ .../РедактированиеДокументаOfficeOpen.mdo} | 7 +- .../Module.bsl | 2 +- .../ExtInfo/SpreadsheetData.mxlx | 23 + .../ExtInfo/SpreadsheetData.mxlx | 23 + .../Form.form | 1179 ++- .../Help/ru.html | 3 +- .../Module.bsl | 789 +- .../CommonForms/РезультатПроверки/Module.bsl | 2 + .../CommonForms/СвязанныеДокументы/Form.form | 1 - .../CommonForms/СвязанныеДокументы/Module.bsl | 572 +- SSL/src/CommonForms/Сертификат/Form.form | 799 +- SSL/src/CommonForms/Сертификат/Help/ru.html | 22 +- SSL/src/CommonForms/Сертификат/Module.bsl | 175 + SSL/src/CommonForms/Склонения/Form.form | 2 - SSL/src/CommonForms/СменаПароля/Form.form | 17 +- SSL/src/CommonForms/СменаПароля/Module.bsl | 66 +- .../Form.form | 5 - .../Module.bsl | 2 +- .../Form.form | 2 - .../СохранениеПечатнойФормы/Form.form | 305 +- .../СохранениеПечатнойФормы/Module.bsl | 175 +- .../СравнениеТабличныхДокументов/Form.form | 3 - .../СравнениеТабличныхДокументов/Module.bsl | 8 +- .../Form.form | 1 - .../Module.bsl | 71 +- .../УстановленныеИсправления/Form.form | 376 +- .../УстановленныеИсправления/Module.bsl | 155 +- .../CommonForms/УточнениеКонтактов/Module.bsl | 44 +- SSL/src/CommonForms/ФайлыВТоме/Form.form | 1 - .../CommonForms/ФормаВыбораЦвета/Form.form | 158 + .../CommonForms/ФормаВыбораЦвета/Module.bsl | 93 + .../ФормаВыбораЦвета/ФормаВыбораЦвета.mdo | 11 + .../CommonForms/ФормаВыбораШрифта/Form.form | 492 + .../CommonForms/ФормаВыбораШрифта/Module.bsl | 48 + .../ФормаВыбораШрифта/ФормаВыбораШрифта.mdo | 12 + .../CommonForms/ФормаНастроекОтчета/Form.form | 492 +- .../ФормаНастроекОтчета/Module.bsl | 163 +- SSL/src/CommonForms/ФормаОтчета/Form.form | 1437 +-- SSL/src/CommonForms/ФормаОтчета/Module.bsl | 397 +- SSL/src/CommonForms/ФормаПоиска/Form.form | 4 - .../CommonForms/ЭлектроннаяПодпись/Module.bsl | 2 + .../CommonModules/GoogleПереводчик/Module.bsl | 2 +- .../CommonModules/АвтономнаяРабота/Module.bsl | 4 +- .../АвтономнаяРаботаСлужебный/Module.bsl | 31 +- .../АдминистрированиеКластераCOM/Module.bsl | 4 +- .../Module.bsl | 2 +- .../АдминистрированиеКластераRAS/Module.bsl | 2 +- .../АдресныйКлассификатор/Module.bsl | 6 +- .../АдресныйКлассификаторКлиент/Module.bsl | 20 + .../АдресныйКлассификаторПовтИсп/Module.bsl | 217 +- .../АдресныйКлассификаторСлужебный/Module.bsl | 1929 ++-- .../CommonModules/Анкетирование/Module.bsl | 36 +- .../Module.bsl | 96 +- .../БизнесПроцессыИЗадачиСервер/Module.bsl | 628 +- .../CommonModules/ВариантыОтчетов/Module.bsl | 437 +- .../ВариантыОтчетовВызовСервера/Module.bsl | 10 +- .../ВариантыОтчетовКлиент/Module.bsl | 136 +- .../Module.bsl | 10 +- .../ВариантыОтчетовПовтИсп/Module.bsl | 24 +- .../ВариантыОтчетовСлужебный/Module.bsl | 278 +- .../ВариантыОтчетовСлужебныйКлиент/Module.bsl | 563 +- .../Module.bsl | 38 +- .../ВерсионированиеОбъектов/Module.bsl | 138 +- .../CommonModules/Взаимодействия/Module.bsl | 1648 ++-- .../ВзаимодействияКлиент/Module.bsl | 28 +- .../ВзаимодействияЛокализация/Module.bsl | 19 + .../ВзаимодействияСобытия/Module.bsl | 6 +- .../Module.bsl | 2 +- .../ВнешниеКомпонентыКлиент/Module.bsl | 124 +- .../ВнешниеКомпонентыСервер/Module.bsl | 30 +- .../ВнешниеКомпонентыСлужебный/Module.bsl | 10 +- .../Module.bsl | 6 +- .../Module.bsl | 284 +- .../ВнешниеПользователи/Module.bsl | 115 +- .../ВызовОнлайнПоддержки/Module.bsl | 118 - .../Module.bsl | 52 - .../ВызовОнлайнПоддержкиКлиент/Module.bsl | 215 - .../ГенерацияШтрихкода/Module.bsl | 61 +- .../Module.bsl | 15 + .../ДатыЗапретаИзменения/Module.bsl | 13 +- .../ДатыЗапретаИзмененияСлужебный/Module.bsl | 581 +- .../ДлительныеОперации/Module.bsl | 1690 ++-- .../ДлительныеОперацииКлиент/Module.bsl | 51 +- .../ДополнительныеОтчетыИОбработки/Module.bsl | 154 +- .../Module.bsl | 4 +- .../Module.bsl | 30 +- .../Module.bsl | 1 + .../Module.bsl | 5 +- .../Module.bsl | 5 + .../ЖурналРегистрации/Module.bsl | 11 +- .../ЗагрузкаДанныхИзФайла/Module.bsl | 25 +- .../ЗаметкиПользователяСлужебный/Module.bsl | 2 +- .../Module.bsl | 65 +- .../Module.bsl | 261 +- .../Module.bsl | 23 +- .../Module.bsl | 131 +- .../Module.bsl | 19 +- .../ЗащитаПерсональныхДанных/Module.bsl | 286 +- .../Module.bsl | 6 +- .../Module.bsl | 2 +- .../ИнтеграцияПодсистемБСП/Module.bsl | 191 +- .../ИнтеграцияПодсистемБСПКлиент/Module.bsl | 33 +- .../ИнформацияПриЗапуске/Module.bsl | 2 +- .../КалендарныеГрафики/Module.bsl | 2 +- .../КалендарныеГрафикиСлужебный/Module.bsl | 2 +- .../КонструкторФормул/Module.bsl | 15 +- .../КонструкторФормулКлиент/Module.bsl | 251 +- .../КонструкторФормулКлиентСервер/Module.bsl | 1 + .../КонструкторФормулПовтИсп/Module.bsl | 29 + .../КонструкторФормулПовтИсп.mdo | 12 + .../КонструкторФормулСлужебный/Module.bsl | 1174 ++- .../КонтрольВеденияУчета/Module.bsl | 6 +- .../КонтрольВеденияУчетаСлужебный/Module.bsl | 128 +- .../Module.bsl | 4 +- .../МультиязычностьПовтИсп/Module.bsl | 4 +- .../МультиязычностьСервер/Module.bsl | 76 +- .../НапоминанияПользователя/Module.bsl | 72 + .../Module.bsl | 3 +- .../НапоминанияПользователяКлиент/Module.bsl | 250 +- .../Module.bsl | 224 + .../Module.bsl | 294 +- .../НастройкаПорядкаЭлементов/Module.bsl | 1 + .../НастройкиПрограммы/Module.bsl | 350 + .../НастройкиПрограммы.mdo} | 6 +- .../НастройкиПрограммыКлиент/Module.bsl | 341 + .../НастройкиПрограммыКлиент.mdo} | 6 +- .../ОбменДаннымиXDTOСервер/Module.bsl | 283 +- .../ОбменДаннымиВМоделиСервиса/Module.bsl | 114 +- .../Module.bsl | 6 +- .../Module.bsl | 4 +- .../ОбменДаннымиВебСервис/Module.bsl | 1609 ++++ .../ОбменДаннымиВебСервис.mdo} | 6 +- .../ОбменДаннымиВнешнееСоединение/Module.bsl | 4 +- .../Module.bsl | 1458 +++ .../ОбменДаннымиВнутренняяПубликация.mdo | 11 + .../Module.bsl | 31 + ...аннымиВнутренняяПубликацияВызовСервера.mdo | 10 + .../Module.bsl | 42 + ...ОбменДаннымиВнутренняяПубликацияКлиент.mdo | 10 + .../ОбменДаннымиВызовСервера/Module.bsl | 4 +- .../ОбменДаннымиКлиент/Module.bsl | 21 + .../Module.bsl | 698 ++ .../ОбменДаннымиКонтрольЗацикливания.mdo | 11 + .../ОбменДаннымиПереопределяемый/Module.bsl | 12 +- .../ОбменДаннымиПовтИсп/Module.bsl | 168 +- .../ОбменДаннымиРегистрацияПовтИсп/Module.bsl | 97 + .../ОбменДаннымиРегистрацияПовтИсп.mdo | 12 + .../ОбменДаннымиРегистрацияСервер/Module.bsl | 831 ++ .../ОбменДаннымиРегистрацияСервер.mdo | 11 + .../ОбменДаннымиСервер/Module.bsl | 7103 ++++++-------- .../ОбменДаннымиСлужебный/Module.bsl | 67 +- .../ОбменДаннымиСобытия/Module.bsl | 359 +- .../Module.bsl | 2352 +++++ .../ОбменДаннымиТрансляцияФорматаПовтИсп.mdo | 12 + .../ОбновлениеИнформационнойБазы/Module.bsl | 313 +- .../Module.bsl | 2 +- .../Module.bsl | 2 +- .../Module.bsl | 12 +- .../Module.bsl | 10 +- .../Module.bsl | 1052 ++- .../Module.bsl | 71 +- .../ОбновлениеКонфигурации/Module.bsl | 39 +- .../Module.bsl | 14 +- .../ОбновлениеКонфигурацииКлиент/Module.bsl | 14 +- SSL/src/CommonModules/Обсуждения/Module.bsl | 20 +- .../CommonModules/ОбсужденияКлиент/Module.bsl | 15 + .../ОбсужденияСлужебный/Module.bsl | 33 +- .../ОбсужденияСлужебныйКлиент/Module.bsl | 4 +- .../CommonModules/ОбщегоНазначения/Module.bsl | 1335 ++- .../ОбщегоНазначенияКлиент/Module.bsl | 126 +- .../Module.bsl | 18 +- .../ОбщегоНазначенияКлиентСервер/Module.bsl | 95 +- .../Module.bsl | 19 +- .../Module.bsl | 494 +- .../Module.bsl | 30 +- SSL/src/CommonModules/ОтправкаSMS/Module.bsl | 4 +- .../ОтправкаSMSКлиент/Module.bsl | 27 +- .../ОтправкаSMSПовтИсп/Module.bsl | 7 + .../ОтправкаSMSЧерезSMS4B/Module.bsl | 2 +- .../ОтправкаSMSЧерезSMSRU/Module.bsl | 2 +- .../ОтправкаSMSЧерезSMSЦЕНТР/Module.bsl | 2 +- .../ОтправкаSMSЧерезБилайн/Module.bsl | 2 +- .../ОтправкаSMSЧерезМТС/Module.bsl | 2 +- .../ОтправкаSMSЧерезСМСУслуги/Module.bsl | 2 +- SSL/src/CommonModules/ОтчетыКлиент/Module.bsl | 8 +- .../ОтчетыКлиентСервер/Module.bsl | 9 + SSL/src/CommonModules/ОтчетыСервер/Module.bsl | 27 +- .../ОценкаПроизводительности/Module.bsl | 204 +- .../Module.bsl | 14 +- .../ОценкаПроизводительностиКлиент/Module.bsl | 554 +- .../ПереводТекстаНаДругиеЯзыки/Module.bsl | 8 +- .../ПодключаемыеКоманды/Module.bsl | 230 +- .../ПодключаемыеКомандыКлиент/Module.bsl | 7 +- .../Module.bsl | 248 +- .../Module.bsl | 3 + .../ПодключаемыеКомандыПовтИсп/Module.bsl | 37 + .../ПоискИУдалениеДублей/Module.bsl | 144 +- .../ПолнотекстовыйПоискСервер/Module.bsl | 4 +- .../ПолучениеФайловИзИнтернета/Module.bsl | 5 + .../Module.bsl | 27 +- .../Module.bsl | 14 +- ...еФайловИзИнтернетаСлужебныйЛокализация.mdo | 11 + SSL/src/CommonModules/Пользователи/Module.bsl | 698 +- .../ПользователиКлиентСервер/Module.bsl | 8 + .../ПользователиПереопределяемый/Module.bsl | 6 + .../ПользователиСлужебный/Module.bsl | 1789 ++-- .../Module.bsl | 85 +- .../ПользователиСлужебныйКлиент/Module.bsl | 44 +- .../ПользователиСлужебныйПовтИсп/Module.bsl | 85 +- .../ПрефиксацияОбъектовСлужебный/Module.bsl | 40 +- .../Module.bsl | 4 +- .../CommonModules/РаботаСАдресами/Module.bsl | 369 +- .../РаботаСАдресамиКлиент/Module.bsl | 21 +- .../РаботаСАдресамиКлиентСервер/Module.bsl | 9 +- .../CommonModules/РаботаСБанками/Module.bsl | 8 +- .../РаботаСБанкамиВызовСервера/Module.bsl | 17 + .../РаботаСБанкамиВызовСервера.mdo} | 6 +- .../РаботаСБанкамиКлиент/Module.bsl | 6 +- .../РаботаСБанкамиПереопределяемый/Module.bsl | 18 + .../РаботаСКурсамиВалют/Module.bsl | 49 +- .../Module.bsl | 17 + .../РаботаСКурсамиВалютВызовСервера.mdo | 10 + .../РаботаСКурсамиВалютГлобальный/Module.bsl | 2 +- .../РаботаСКурсамиВалютКлиент/Module.bsl | 18 +- .../РаботаСКурсамиВалютСлужебный/Module.bsl | 20 +- .../РаботаСПочтовымиСообщениями/Module.bsl | 1 + .../Module.bsl | 28 +- .../Module.bsl | 29 + .../Module.bsl | 668 +- .../Module.bsl | 36 + ...чтовымиСообщениямиСлужебныйЛокализация.mdo | 11 + .../CommonModules/РаботаСФайлами/Module.bsl | 256 +- .../РаботаСФайламиВТомахСлужебный/Module.bsl | 134 +- .../РаботаСФайламиКлиент/Module.bsl | 324 +- .../РаботаСФайламиПереопределяемый/Module.bsl | 9 +- .../РаботаСФайламиСлужебный/Module.bsl | 461 +- .../Module.bsl | 10 +- .../Module.bsl | 181 +- .../РаботаСФайламиСлужебныйКлиент/Module.bsl | 235 +- .../Module.bsl | 340 +- .../РаботаСФайламиСлужебныйПовтИсп/Module.bsl | 2 +- .../CommonModules/РассылкаОтчетов/Module.bsl | 1476 ++- .../РассылкаОтчетовВызовСервера/Module.bsl | 59 + .../РассылкаОтчетовКлиент/Module.bsl | 135 +- .../РассылкаОтчетовКлиентСервер/Module.bsl | 217 +- .../Module.bsl | 6 +- .../РегламентныеЗаданияСервер/Module.bsl | 342 +- .../РегламентныеЗаданияСлужебный/Module.bsl | 347 +- .../РезервноеКопированиеИБКлиент/Module.bsl | 21 +- .../РезервноеКопированиеИБСервер/Module.bsl | 47 +- .../СерверныеОповещения/Module.bsl | 30 +- .../СерверныеОповещенияКлиент/Module.bsl | 21 +- .../СервисКриптографииDSS/Module.bsl | 148 +- .../Module.bsl | 2 +- .../Module.bsl | 8 +- .../Module.bsl | 10 - .../Module.bsl | 2 +- .../СервисКриптографииDSSСлужебный/Module.bsl | 301 +- .../Module.bsl | 14 +- .../Module.bsl | 15 +- .../СклонениеПредставленийОбъектов/Module.bsl | 157 +- .../Module.bsl | 10 + SSL/src/CommonModules/СоединенияИБ/Module.bsl | 6 +- .../СоединенияИБВызовСервера/Module.bsl | 4 +- .../СоединенияИБКлиент/Module.bsl | 26 +- .../Module.bsl | 22 +- .../Module.bsl | 343 + ...иУправлениеОбработчикСообщения_3_0_1_1.mdo | 11 + .../Module.bsl | 86 + ...енаДаннымиУправлениеТрансляция_2_1_2_1.mdo | 11 + .../Module.bsl | 30 +- .../Module.bsl | 12 +- .../Module.bsl | 12 +- .../Module.bsl | 10 +- .../Module.bsl | 2 +- .../Module.bsl | 2 +- .../Module.bsl | 53 +- .../Module.bsl | 27 +- .../Module.bsl | 10 + .../СтандартныеПодсистемыКлиент/Module.bsl | 373 +- .../Module.bsl | 13 +- .../СтандартныеПодсистемыПовтИсп/Module.bsl | 31 +- .../СтандартныеПодсистемыСервер/Module.bsl | 221 +- .../СтроковыеФункцииКлиентСервер/Module.bsl | 67 +- .../ТекущиеДелаСервер/Module.bsl | 3 +- .../ТекущиеДелаСлужебный/Module.bsl | 5 + .../УдалениеПомеченныхОбъектов/Module.bsl | 81 +- .../Module.bsl | 2 +- .../Module.bsl | 25 + .../Module.bsl | 751 +- .../УправлениеДоступом/Module.bsl | 32 +- .../УправлениеДоступомСлужебный/Module.bsl | 1346 ++- .../Module.bsl | 6 +- .../Module.bsl | 1556 ++- .../Module.bsl | 695 +- .../Module.bsl | 154 + .../Module.bsl | 2 +- .../Module.bsl | 53 + .../Module.bsl | 224 +- .../Module.bsl | 63 + .../УправлениеПечатью/Module.bsl | 1499 ++- .../УправлениеПечатьюMSWordКлиент/Module.bsl | 14 +- .../УправлениеПечатьюMSWordКлиент.mdo | 2 +- .../Module.bsl | 10 +- .../УправлениеПечатьюOOWriterКлиент.mdo | 2 +- .../УправлениеПечатьюКлиент/Module.bsl | 141 +- .../УправлениеПечатьюКлиентСервер/Module.bsl | 8 + .../Module.bsl | 193 +- .../Module.bsl | 59 +- .../УправлениеПечатьюСлужебный/Module.bsl | 2286 ++++- .../Module.bsl | 10 +- .../УправлениеСвойствами/Module.bsl | 413 +- .../УправлениеСвойствамиСлужебный/Module.bsl | 633 +- .../УправлениеЭлектроннойПочтой/Module.bsl | 658 +- .../Module.bsl | 4 +- .../Module.bsl | 70 +- .../Module.bsl | 210 +- .../Module.bsl | 2 +- .../CommonModules/ФайловаяСистема/Module.bsl | 27 +- .../ФайловаяСистемаКлиент/Module.bsl | 236 +- .../ФайловаяСистемаСлужебныйКлиент/Module.bsl | 73 +- .../ЦентрМониторингаКлиент/Module.bsl | 16 +- .../ЦентрМониторингаСлужебный/Module.bsl | 99 +- .../CommonModules/ШаблоныСообщений/Module.bsl | 156 +- .../ШаблоныСообщенийКлиентСервер/Module.bsl | 22 +- .../Module.bsl | 41 + .../ШаблоныСообщенийСлужебный/Module.bsl | 143 +- .../ЭлектроннаяПодпись/Module.bsl | 585 +- .../ЭлектроннаяПодписьКлиент/Module.bsl | 90 +- .../ЭлектроннаяПодписьКлиентСервер/Module.bsl | 1 + .../Module.bsl | 158 + .../ЭлектроннаяПодписьСлужебный/Module.bsl | 1937 +++- .../Module.bsl | 196 +- .../Module.bsl | 2983 +++++- .../Module.bsl | 802 +- .../Module.bsl | 448 +- .../Module.bsl | 143 +- .../CommonModules/ЯндексПереводчик/Module.bsl | 2 +- SSL/src/CommonPictures/GoogleMaps/Picture.svg | 7 + SSL/src/CommonPictures/GoogleMaps/Picture.zip | Bin 17951 -> 0 bytes SSL/src/CommonPictures/Skype/Picture.zip | Bin 10368 -> 12876 bytes SSL/src/CommonPictures/Адрес/Picture.zip | Bin 0 -> 7611 bytes SSL/src/CommonPictures/Адрес/Адрес.mdo | 8 + .../CommonPictures/ВебСтраница/Picture.zip | Bin 0 -> 9674 bytes .../ВебСтраница/ВебСтраница.mdo | 8 + .../ВидимостьПароляЗакрыто/Picture.png | Bin 591 -> 0 bytes .../ВидимостьПароляЗакрыто.mdo | 8 - .../ВидимостьПароляОткрыто/Picture.png | Bin 744 -> 0 bytes .../ВидимостьПароляОткрыто.mdo | 8 - .../ВыпадающийСписок/Picture.zip | Bin 6886 -> 3700 bytes SSL/src/CommonPictures/Другое/Picture.zip | Bin 0 -> 7209 bytes SSL/src/CommonPictures/Другое/Другое.mdo | 8 + .../ИспользованиеМакета/Picture.zip | Bin 24454 -> 31776 bytes .../ИсторияИзменений/Picture.svg | 5 + .../ИсторияИзменений/Picture.zip | Bin 10825 -> 0 bytes .../Picture.svg | 5 + .../Picture.zip | Bin 17177 -> 0 bytes .../МенюДополнительныеФункции/Picture.svg | 5 + .../МенюДополнительныеФункции/Picture.zip | Bin 5708 -> 0 bytes .../CommonPictures/МестоДляQRКода/Picture.png | Bin 0 -> 1697 bytes .../МестоДляQRКода/МестоДляQRКода.mdo | 8 + .../МестоДляШтрихкода/Picture.gif | Bin 0 -> 3419 bytes .../МестоДляШтрихкода/МестоДляШтрихкода.mdo | 8 + .../CommonPictures/ОтправитьSMS/Picture.svg | 1 + .../CommonPictures/ОтправитьSMS/Picture.zip | Bin 13530 -> 0 bytes .../ОтправитьЭлектронноеПисьмо/Picture.svg | 4 + .../ОтправитьЭлектронноеПисьмо/Picture.zip | Bin 10207 -> 0 bytes SSL/src/CommonPictures/Позвонить/Picture.svg | 12 + SSL/src/CommonPictures/Позвонить/Picture.zip | Bin 6907 -> 0 bytes .../ПоказатьНаКарте/Picture.zip | Bin 0 -> 8800 bytes .../ПоказатьНаКарте/ПоказатьНаКарте.mdo | 8 + .../Picture.png | Bin 0 -> 1900 bytes .../ПредварительныйПросмотрКартинка.mdo | 8 + .../СостояниеПользователя01/Picture.svg | 10 + .../СостояниеПользователя01/Picture.zip | Bin 22241 -> 0 bytes .../СостояниеПользователя02/Picture.svg | 8 + .../СостояниеПользователя02/Picture.zip | Bin 20646 -> 0 bytes .../СостояниеПользователя03/Picture.svg | 15 + .../СостояниеПользователя03/Picture.zip | Bin 24019 -> 0 bytes .../СостояниеПользователя04/Picture.svg | 13 + .../СостояниеПользователя04/Picture.zip | Bin 23490 -> 0 bytes .../СостояниеПользователя05/Picture.svg | 10 + .../СостояниеПользователя05/Picture.zip | Bin 23248 -> 0 bytes .../СостояниеПользователя06/Picture.svg | 10 + .../СостояниеПользователя06/Picture.zip | Bin 22398 -> 0 bytes .../СостояниеПользователя07/Picture.svg | 10 + .../СостояниеПользователя07/Picture.zip | Bin 22400 -> 0 bytes .../СостояниеПользователя08/Picture.svg | 8 + .../СостояниеПользователя08/Picture.zip | Bin 20874 -> 0 bytes .../СостояниеПользователя09/Picture.svg | 15 + .../СостояниеПользователя09/Picture.zip | Bin 24053 -> 0 bytes .../СостояниеПользователя10/Picture.svg | 13 + .../СостояниеПользователя10/Picture.zip | Bin 22829 -> 0 bytes .../СостояниеПользователя11/Picture.svg | 10 + .../СостояниеПользователя11/Picture.zip | Bin 22476 -> 0 bytes .../СостояниеПользователя12/Picture.svg | 10 + .../СостояниеПользователя12/Picture.zip | Bin 22105 -> 0 bytes .../СостояниеПользователя13/Picture.svg | 10 + .../СостояниеПользователя13.mdo | 8 + .../СостояниеПользователя14/Picture.svg | 11 + .../СостояниеПользователя14.mdo | 8 + .../СостояниеПользователя15/Picture.svg | 5 + .../СостояниеПользователя15.mdo | 8 + .../СостояниеПользователя16/Picture.svg | 10 + .../СостояниеПользователя16.mdo | 8 + .../СостояниеПользователя17/Picture.svg | 11 + .../СостояниеПользователя17.mdo | 8 + .../СостояниеПользователя18/Picture.svg | 5 + .../СостояниеПользователя18.mdo | 8 + .../СостоянияПользователей/Picture.svg | 150 + .../СостоянияПользователей/Picture.zip | Bin 49741 -> 0 bytes .../ТипыСертификатов/Picture.png | Bin 1117 -> 2701 bytes SSL/src/CommonPictures/Факс/Picture.zip | Bin 0 -> 6313 bytes SSL/src/CommonPictures/Факс/Факс.mdo | 8 + .../CommonPictures/ЦветГраницы/Picture.svg | 6 + .../ЦветГраницы/ЦветГраницы.mdo | 8 + .../ЭлектроннаяПочта/Picture.zip | Bin 0 -> 9350 bytes .../ЭлектроннаяПочта/ЭлектроннаяПочта.mdo | 8 + .../CommonPictures/ЯндексКарты/Picture.svg | 1 + .../CommonPictures/ЯндексКарты/Picture.zip | Bin 10389 -> 0 bytes .../Template.htmldoc | 4 + .../ru.html | 156 + ...яКакВыполнитьНастройкуМакетаOfficeOpen.mdo | 10 + .../МакетШтемпеляЭЦПOfficeOpen/Template.txt | 184 + .../МакетШтемпеляЭЦПOfficeOpen.mdo | 9 + .../Template.dcs | 22 +- .../ПустойМакетDOCX/Template.bin | Bin 0 -> 11781 bytes .../ПустойМакетDOCX/ПустойМакетDOCX.mdo | 10 + .../СтруктураПодчиненности/Template.mxlx | 16 - SSL/src/Configuration/Configuration.mdo | 115 +- .../ManagedApplicationModule.bsl | 15 +- .../OrdinaryApplicationModule.bsl | 15 +- .../Configuration/ParentConfigurations.bin | 2 +- SSL/src/Configuration/SessionModule.bsl | 2 + SSL/src/Configuration/Splash.png | Bin 43330 -> 43462 bytes .../ValueManagerModule.bsl | 23 +- .../ИспользоватьОнлайнПоддержку.mdo | 20 - .../ValueManagerModule.bsl | 10 +- ...оМесяцевХраненияИсторииРассылкиОтчетов.mdo | 26 + .../ValueManagerModule.bsl | 4 +- .../ПорядокОбрабатываемыхДанных.mdo | 20 + .../ManagerModule.bsl | 74 - .../ХранитьИсториюРассылкиОтчетов.mdo | 20 + .../Forms/Форма/Form.form | 2 - .../Forms/Форма/Module.bsl | 44 +- .../Forms/АктивныеПользователи/Form.form | 156 +- .../Forms/АктивныеПользователи/Module.bsl | 106 +- .../Form.form | 5 - .../Module.bsl | 18 +- .../Form.form | 5 - .../Module.bsl | 6 +- .../Forms/ВводАдресаВСвободнойФорме/Form.form | 5 - .../Forms/ВводТелефона/Form.form | 81 +- .../Forms/ВводТелефона/Help/ru.html | 5 +- .../Forms/ВводТелефона/Module.bsl | 102 +- .../ИсторияКонтактнойИнформации/Form.form | 395 +- .../ИсторияКонтактнойИнформации/Help/ru.html | 8 +- .../РедактированиеПериодаИОтбора/Form.form | 1 - .../Forms/Форма/Form.form | 10 - .../ObjectModule.bsl | 6 +- .../ObjectModule.bsl | 40 +- .../Forms/Форма/Form.form | 311 +- .../Forms/Форма/Module.bsl | 137 +- .../ВыполнениеОбменаДанными/ManagerModule.bsl | 2 +- .../Forms/ВыборВидаОбъектов/Form.form | 32 + .../Forms/ВыбранныеЭлементы/Form.form | 49 +- .../Forms/ВыбранныеЭлементы/Module.bsl | 66 +- .../Forms/ДополнительныеПараметры/Form.form | 6 - .../Forms/РедактированиеФормулы/Form.form | 4 - .../Forms/РедактированиеФормулы/Module.bsl | 1 - .../Forms/Форма/Form.form | 74 - .../Forms/Форма/Module.bsl | 374 +- .../ObjectModule.bsl | 83 +- .../Forms/АрхивАнкет/Form.form | 142 +- .../Forms/АрхивАнкет/Module.bsl | 2 +- .../ДоступныеАнкеты/Forms/Форма/Form.form | 57 +- .../Forms/ЖурналРегистрации/Form.form | 33 +- .../Forms/ЖурналРегистрации/Module.bsl | 26 +- .../Forms/ОтборЖурналаРегистрации/Form.form | 10 - .../Forms/РедакторСоставаСвойства/Form.form | 32 + .../Forms/РедакторСоставаСвойства/Module.bsl | 2 +- .../ЖурналРегистрации/Forms/Событие/Form.form | 10 - .../ЖурналРегистрации/ManagerModule.bsl | 33 + .../Forms/ВыборКолонок/Form.form | 110 +- .../Forms/ЗагрузкаДанныхИзФайла/Form.form | 50 +- .../Forms/ЗагрузкаДанныхИзФайла/Module.bsl | 71 +- .../РазрешенияНеоднозначностей/Form.form | 2 - .../ЗагрузкаДанныхИзФайла/ManagerModule.bsl | 328 +- .../ManagerModule.bsl | 53 +- .../Forms/ПараметрыПрописиВалюты_ru/Form.form | 5 - .../ПодборВалютИзКлассификатора/Form.form | 1 + .../ПодборВалютИзКлассификатора/Module.bsl | 2 +- .../ЗагрузкаКурсовВалют/Forms/Форма/Form.form | 33 +- .../ЗагрузкаКурсовВалют/ManagerModule.bsl | 52 +- .../ObjectModule.bsl | 6 +- .../Forms/ЗаменаЭлементов/Form.form | 132 +- .../Forms/ЗаменаЭлементов/Module.bsl | 4 +- .../Forms/ОбъединениеЭлементов/Form.form | 70 +- .../Forms/ОбъединениеЭлементов/Module.bsl | 2 +- .../ManagerModule.bsl | 16 +- .../Forms/Форма/Form.form | 71 +- .../Forms/Информация/Form.form | 9 - .../Forms/Информация/Module.bsl | 2 +- .../СведенияОВладельцеСертификата/Form.form | 11 - .../Forms/СведенияОбОрганизации/Form.form | 8 - .../Forms/Форма/Form.form | 263 +- .../Forms/Форма/Module.bsl | 556 +- .../ManagerModule.bsl | 18 +- .../Templates/ЮридическоеЛицо/Template.mxlx | 8 - .../РедактированиеПериодаИОтбора/Form.form | 1 - .../Forms/Форма/Form.form | 3 - .../Forms/Форма/Module.bsl | 4 +- .../Forms/Форма/Form.form | 3 - .../КонвертацияОбъектовXDTO/ObjectModule.bsl | 27 +- .../ObjectModule.bsl | 1154 +-- .../ObjectModule.bsl | 23 +- .../Forms/РедактированиеФормулы/Form.form | 3 - .../Forms/РедактированиеФормулы/Module.bsl | 32 +- .../Form.form | 2 - .../ИнициализацияЗапросаРазрешений/Form.form | 1 - .../ИнициализацияЗапросаРазрешений/Module.bsl | 10 +- .../Form.form | 15 - .../Module.bsl | 2 +- .../Form.form | 14 - .../ManagerModule.bsl | 60 +- .../НастройкаРезервногоКопирования/Form.form | 16 - .../НастройкаРезервногоКопирования/Module.bsl | 2 +- .../Form.form | 2 - .../ЗависимостиОбъектаМетаданных/Form.form | 4 +- .../ЗависимостиОбъектаМетаданных/Module.bsl | 4 +- .../Form.form | 4 - .../Module.bsl | 2 +- .../ManagerModule.bsl | 46 +- .../ObjectModule.bsl | 2 +- .../Forms/ВыборНастроек/Form.form | 113 +- .../Forms/ВыборНастроек/Module.bsl | 108 +- .../Forms/ВыборПользователей/Form.form | 135 +- .../Forms/ВыборПользователей/Module.bsl | 8 + .../Form.form | 4 - .../Forms/НастройкиПользователей/Form.form | 97 +- .../Forms/НастройкиПользователей/Module.bsl | 43 - .../ОчисткаНастроекПользователей/Form.form | 14 +- .../ОчисткаНастроекПользователей/Module.bsl | 68 +- .../Form.form | 2 - .../НастройкиПользователей/ManagerModule.bsl | 180 +- .../Form.form | 3 - .../НастройкиЦентраМониторинга/Form.form | 2 - .../НастройкиЦентраМониторинга/Module.bsl | 2 +- .../НеобходимоОбновитьПлатформу/Form.form | 44 +- .../НеобходимоОбновитьПлатформу/Module.bsl | 6 +- .../НерекомендуемаяВерсияПлатформы/Form.form | 3 - .../ПорядокОбновленияПлатформы/Module.bsl | 2 +- .../ПорядокУдаленияПлатформы/ru.html | 2 +- .../ОбъектыПересеченияОбработчика/Form.form | 1098 ++- .../ОбъектыПересеченияОбработчика/Module.bsl | 13 +- .../Form.form | 7 + .../Module.bsl | 9 +- .../Forms/ФормаОбработчика/Form.form | 353 +- .../Forms/ФормаОбработчика/Module.bsl | 163 +- .../Forms/ФормаСпискаОбработчиков/Form.form | 169 +- .../Forms/ФормаСпискаОбработчиков/Module.bsl | 189 +- .../ObjectModule.bsl | 306 +- .../ОписаниеОбработчиковОбновления.mdo | 187 + .../Forms/Форма/Form.form | 3 - .../Form.form | 7 - .../Module.bsl | 4 +- .../Form.form | 1 - .../CommandModule.bsl | 22 +- .../СинхронизацияДанных/CommandModule.bsl | 2 +- .../Forms/ИнтернетПоддержкаИСервисы/Form.form | 3992 +------- .../ИнтернетПоддержкаИСервисы/Help/ru.html | 9 +- .../ИнтернетПоддержкаИСервисы/Module.bsl | 993 +- .../НастройкиПользователейИПрав/Form.form | 469 +- .../НастройкиПользователейИПрав/Help/ru.html | 14 +- .../НастройкиПользователейИПрав/Module.bsl | 23 +- .../Forms/НастройкиРаботыСФайлами/Form.form | 152 +- .../Forms/НастройкиРаботыСФайлами/Module.bsl | 7 + .../Forms/Обслуживание/Form.form | 757 +- .../Forms/Обслуживание/Module.bsl | 101 +- .../Forms/ОбщиеНастройки/Form.form | 174 +- .../Forms/ОбщиеНастройки/Help/ru.html | 3 +- .../Forms/ОбщиеНастройки/Module.bsl | 314 +- .../Forms/Органайзер/Form.form | 34 - .../Forms/Органайзер/Help/ru.html | 2 +- .../ПечатныеФормыОтчетыИОбработки/Form.form | 610 +- .../ПечатныеФормыОтчетыИОбработки/Module.bsl | 50 +- .../Forms/СинхронизацияДанных/Form.form | 13 - .../ПанельАдминистрированияБСП.mdo | 2 +- .../Form.form | 13 - .../ПереносФайлов/Forms/Форма/Form.form | 8 - .../ПереносФайлов/Forms/Форма/Module.bsl | 6 +- .../ПереносФайлов/ManagerModule.bsl | 4 +- .../Module.bsl | 4 +- .../Forms/СозданиеБотаВКонтакте/Form.form | 2 - .../Forms/СозданиеБотаВКонтакте/Module.bsl | 12 +- .../Forms/СозданиеБотаТелеграм/Form.form | 2 - .../Forms/СозданиеБотаТелеграм/Module.bsl | 12 +- .../Forms/Форма/Form.form | 3 - .../Forms/Форма/Module.bsl | 4 +- .../Forms/ОбластьПоискаДублей/Form.form | 32 + .../Forms/ПоискДублей/Form.form | 64 +- .../Forms/ПоискДублей/Module.bsl | 2 +- .../Forms/ПравилаОтбора/Form.form | 1 + .../Forms/ПравилаПоиска/Form.form | 2 +- .../ПоискИУдалениеДублей/ObjectModule.bsl | 67 +- .../Forms/ВыборОбластиПоиска/Form.form | 1 - .../Form.form | 12 - .../Module.bsl | 2 +- .../ВыгрузкаДанныхДляСопоставления/Form.form | 39 +- .../ВыгрузкаДанныхДляСопоставления/Module.bsl | 22 +- .../Forms/Форма/Form.form | 240 +- .../Forms/Форма/Module.bsl | 149 +- .../ManagerModule.bsl | 12 +- .../ManagerModule.bsl | 32 +- .../ManagerModule.bsl | 176 +- .../Forms/НастройкаНаСторонеСервиса/Form.form | 15 - .../НастройкаНаСторонеСервиса/Module.bsl | 6 +- .../ObjectModule.bsl | 12 +- .../Forms/ИзменениеПрефиксаУзлаИБ/Form.form | 5 +- .../Forms/ИзменениеПрефиксаУзлаИБ/Module.bsl | 4 +- .../Forms/НастройкаПодключения/Form.form | 581 +- .../Forms/НастройкаПодключения/Module.bsl | 253 +- .../Forms/НастройкаСинхронизации/Form.form | 11 +- .../Forms/НастройкаСинхронизации/Module.bsl | 2 +- .../Forms/НоваяСинхронизацияДанных/Form.form | 7 +- .../НовыйКодПредопределенногоУзла/Form.form | 1 - .../ПереходНаИнтернетСоединение/Form.form | 2663 ++++++ .../ПереходНаИнтернетСоединение/Module.bsl | 882 ++ .../УдалениеНастройкиСинхронизации/Form.form | 6 - .../Help/ru.html | 8 +- .../ManagerModule.bsl | 330 +- .../ObjectModule.bsl | 4 +- .../ПомощникСозданияОбменаДанными.mdo | 79 +- .../Forms/ВстроенныйКриптопровайдер/Form.form | 1 - .../Form.form | 520 + .../Module.bsl | 150 + .../Form.form | 400 + .../Module.bsl | 73 + .../Form.form | 318 + .../Module.bsl | 44 + .../Form.form | 356 + .../Module.bsl | 125 + .../ManagerModule.bsl | 15 +- .../Template.bin | 158 +- ...ПрограммыЭлектроннойПодписиИШифрования.mdo | 36 + .../ВерсияПрисоединенногоФайла/Form.form | 6 - .../ВерсияПрисоединенногоФайла/Module.bsl | 4 +- .../Forms/ВопросПриИмпортеФайлов/Form.form | 2 +- .../РаботаСФайлами/Forms/ВсеФайлы/Form.form | 85 +- .../РаботаСФайлами/Forms/ВсеФайлы/Module.bsl | 54 +- .../Forms/ВыборГруппы/Form.form | 43 + .../Forms/ВыборКодировки/Form.form | 2 +- .../Forms/ГруппаФайлов/Form.form | 3 - .../Forms/ГруппаФайлов/Module.bsl | 4 +- .../Forms/ПрисоединенныеФайлы/Form.form | 145 +- .../Forms/ПрисоединенныеФайлы/Module.bsl | 108 +- .../Forms/ПрисоединенныйФайл/Form.form | 78 +- .../Forms/ПрисоединенныйФайл/Module.bsl | 45 +- .../РедактированиеТекстовогоФайла/Form.form | 1 - .../Forms/РедактируемыеФайлы/Form.form | 1 - .../Form.form | 3 - .../Forms/СписокЗанятыхСВопросом/Form.form | 33 +- .../Forms/ФормаВопроса/Form.form | 2 +- .../Forms/ФормаВыбораРежимаОткрытия/Form.form | 1 - .../ФормаЗавершениеРедактирования/Form.form | 3 +- .../Forms/ФормаИмпортаПапки/Form.form | 2 - .../Forms/ФормаИмпортаФайлов/Form.form | 5 +- .../Forms/ФормаЭкспортаПапки/Module.bsl | 20 +- .../Forms/ВводАдреса/Form.form | 35 +- .../Forms/ВводАдреса/Module.bsl | 23 +- .../ВыборАдресаПоПочтовомуИндексу/Form.form | 496 +- .../ВыборАдресаПоПочтовомуИндексу/Module.bsl | 29 +- .../Forms/ВыборАдресаПоУровню/Form.form | 13 +- .../Forms/ВыборАдресаПоУровню/Module.bsl | 2 +- .../Forms/ВыборДома/Form.form | 225 +- .../Forms/ВыборДома/Module.bsl | 33 +- .../Forms/ВыборУлицы/Form.form | 336 +- .../Forms/ВыборУлицы/Module.bsl | 24 - .../Forms/ИсправлениеАдресов/Form.form | 74 +- .../Forms/ИсправлениеАдресов/Module.bsl | 4 +- .../Forms/НаселенныйПунктАдреса/Form.form | 29 +- .../Forms/НастройкиАдреса/Form.form | 4 - .../ManagerModule.bsl | 8 + .../Forms/ВыборКонстанты/Form.form | 1 - .../Forms/ВыборОбъектовОтбором/Form.form | 2 - .../Forms/Настройки/Form.form | 8 - .../НомераСообщенийУзлаПланаОбмена/Form.form | 1 - .../Forms/УзлыРегистрацииОбъекта/Form.form | 1 - .../Forms/Форма/Form.form | 7 - .../Forms/РегламентноеЗадание/Form.form | 6 - .../РегламентныеИФоновыеЗадания/Form.form | 53 +- .../РегламентныеИФоновыеЗадания/Module.bsl | 6 +- .../Forms/ФоновоеЗадание/Form.form | 3 - .../Form.form | 11 - .../Module.bsl | 11 +- .../РезервноеКопированиеДанных/Form.form | 12 - .../РезервноеКопированиеДанных/Module.bsl | 2 +- .../ЗаставкаВосстановления/Template.txt | 2 +- .../Template.txt | 2 +- .../ОбновлениеВерсииПрограммы/Module.bsl | 31 +- .../ОтложенноеОбновлениеНеЗавершено/Form.form | 2 - .../Forms/ОтложенныеОбработчики/Form.form | 5 - .../Forms/ОтложенныеОбработчики/Module.bsl | 18 +- .../Forms/ОчисткаУстаревшихДанных/Form.form | 10 +- .../ПредупреждениеБезопасности/Form.form | 1 - .../РезультатыОбновленияПрограммы/Form.form | 33 - .../РезультатыОбновленияПрограммы/Module.bsl | 2 + .../Module.bsl | 2 +- .../СообщениеОНеудачномОбновлении/Form.form | 2 - .../СообщениеОНеудачномОбновлении/Module.bsl | 5 +- .../Forms/ОсновнаяФорма/Form.form | 3 +- .../Forms/НастройкаСканирования/Form.form | 9 - .../НастройкаСканированияНаСеанс/Form.form | 7 - .../Forms/РезультатСканирования/Form.form | 5 +- .../Forms/РезультатСканирования/Module.bsl | 25 +- .../Forms/ВыборПравилОбработки/Form.form | 5 - .../Forms/Форма/Form.form | 12 +- .../ObjectModule.bsl | 14 +- .../Form.form | 12 - .../Module.bsl | 2 +- .../Forms/Форма/Form.form | 93 +- .../Forms/Форма/Module.bsl | 79 + .../ObjectModule.bsl | 20 +- .../Forms/НастройкаТекущихДел/Form.form | 34 +- .../ТекущиеДела/Forms/Форма/Form.form | 4 - .../ObjectModule.bsl | 41 +- .../ТранспортСообщенийОбменаEMAIL.mdo | 14 +- .../ObjectModule.bsl | 11 +- .../ТранспортСообщенийОбменаFILE.mdo | 12 + .../ObjectModule.bsl | 24 +- .../ТранспортСообщенийОбменаFTP.mdo | 12 + .../Form.form | 29 +- .../Forms/НастройкиУдаленияОбъектов/Form.form | 31 +- .../НастройкиУдаленияОбъектов/Module.bsl | 2 +- .../Forms/ОсновнаяФорма/Form.form | 91 +- .../Forms/ОсновнаяФорма/Module.bsl | 113 +- .../ManagerModule.bsl | 374 +- .../Forms/УправляемаяФорма/Form.form | 13 - .../Forms/УправляемаяФорма/Module.bsl | 2 +- .../Form.form | 6 - .../ObjectModule.bsl | 134 +- .../Forms/ОсновнаяФорма/Form.form | 7 - .../Forms/ОсновнаяФорма/Module.bsl | 6 +- .../Forms/ВводПароля/Form.form | 2 - .../Forms/ВводПароля/Module.bsl | 26 +- .../Forms/ВводПинКода/Form.form | 4 - .../Forms/ВводПинКода/Module.bsl | 27 +- .../Forms/ВебАутентификация/Form.form | 1 - .../Forms/ВывестиИнформацию/Form.form | 3 - .../Forms/ВывестиИнформацию/Module.bsl | 3 +- .../Form.form | 18 - .../Module.bsl | 2 +- .../Forms/НовыйЗапросНаСертификат/Form.form | 5 - .../Forms/ПодборУчетнойЗаписи/Form.form | 44 +- .../Forms/ПодборУчетнойЗаписи/Module.bsl | 2 - .../Form.form | 12 - .../Form.form | 6 - .../Module.bsl | 1 - .../Form.form | 5 - .../Module.bsl | 1 - .../ПодтверждениеОперацииОфлайн/Form.form | 7 - .../ПодтверждениеОперацииОфлайн/Module.bsl | 1 - .../ПодтверждениеОперацииОшибка/Form.form | 2 - .../Forms/ПодтверждениеПользователя/Form.form | 5 - .../ПодтверждениеПользователя/Module.bsl | 2 - .../Forms/ПроверкаСервиса/Form.form | 5 - .../Forms/СвойствоСертификата/Form.form | 4 - .../Forms/СменаПинКода/Form.form | 6 - .../Forms/СменаПинКода/Module.bsl | 27 +- .../Forms/ФормаУчетнойЗаписи/Form.form | 7 - .../Forms/ФормаЭкземпляраСервераDSS/Form.form | 9 - .../ManagerModule.bsl | 18 +- .../Forms/НастройкаРезервнойКопии/Form.form | 2 - .../Forms/ОбновлениеНеПодходит/Form.form | 2 +- .../УстановкаОбновлений/Forms/Форма/Form.form | 25 - .../Template.txt | 2 +- .../ВерсионируемыеДанные.mdo | 1 + .../ВерсионируемыеДанныеОбъект.mdo | 1 + .../ВладелецДополнительныхСведений.mdo | 1 + .../МестоХраненияФункциональныхОпций.mdo | 1 - ...енДаннымиУчетныеЗаписиЭлектроннойПочты.mdo | 14 + .../Forms/НастройкиРаботыСПочтой/Form.form | 4 - .../Forms/НастройкиРаботыСПочтой/Module.bsl | 4 +- .../ПараметрыЭлектронногоПисьма/Form.form | 4 - .../Forms/ПечатьЭлектронногоПисьма/Form.form | 12 +- .../Forms/ПечатьЭлектронногоПисьма/Module.bsl | 11 +- .../Forms/ФормаСписка/Form.form | 49 +- .../Forms/ФормаСписка/Module.bsl | 50 +- .../ФормаСпискаПараметрическая/Form.form | 2 - .../Forms/ФормаСписка/Form.form | 40 +- .../Анкета/Forms/ФормаДокумента/Form.form | 11 +- .../Анкета/Forms/ФормаДокумента/Module.bsl | 26 +- .../Анкета/Forms/ФормаСписка/Form.form | 1 - SSL/src/Documents/Анкета/ManagerModule.bsl | 2 +- .../Встреча/Forms/ФормаВыбора/Form.form | 1 - .../Встреча/Forms/ФормаДокумента/Form.form | 7 - .../Встреча/Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаВыбора/Form.form | 1 - .../Forms/ФормаДокумента/Form.form | 3 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаВыбора/Form.form | 1 - .../Forms/ФормаДокумента/Form.form | 37 +- .../Forms/ФормаСписка/Form.form | 1 - .../НазначениеОпросов/ManagerModule.bsl | 1 + .../Forms/ФормаДокумента/Form.form | 9 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаДокумента/Form.form | 11 - .../Forms/ФормаСписка/Form.form | 1 - .../ManagerModule.bsl | 212 +- .../Template.bin | Bin 24442 -> 18998 bytes .../СообщениеSMS/Forms/ФормаВыбора/Form.form | 1 - .../Forms/ФормаДокумента/Form.form | 7 - .../СообщениеSMS/Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаВыбора/Form.form | 1 - .../Forms/ФормаДокумента/Form.form | 4 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаВыбора/Form.form | 1 - .../Forms/ФормаДокумента/Form.form | 4 - .../Forms/ФормаДокумента/Module.bsl | 55 +- .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаВыбора/Form.form | 1 - .../Forms/ФормаДокумента/Form.form | 49 +- .../Forms/ФормаДокумента/Module.bsl | 77 +- .../Forms/ФормаСписка/Form.form | 1 - .../Form.form | 4 - .../ManagerModule.bsl | 4 +- .../ДействияПриОбменеВнутренняяПубликация.mdo | 66 + .../ПорядокОбработчиковОбновления.mdo | 52 + ...пользованияПрограммыЭлектроннойПодписи.mdo | 52 + .../СтатусыЭлектронныхПисем.mdo | 52 + .../ТипыКонтактнойИнформации.mdo | 2 +- .../ТипыПроблемОбменаДанными.mdo | 7 + .../ФорматыСохраненияОтчетов.mdo | 1 + ...аПроверитьВозможностьЗаписиОбщихДанных.mdo | 18 - ...тьВозможностьЗаписиОбщихДанныхДокумент.mdo | 13 - ...ьВозможностьЗаписиОбщихДанныхКонстанта.mdo | 13 - ...зможностьЗаписиОбщихДанныхНаборЗаписей.mdo | 15 - ...тьЗаписиОбщихДанныхНаборЗаписейРасчета.mdo | 13 - ...КонтрольНеразделенныхОбъектовПриЗаписи.mdo | 2 +- .../ОбновлениеИнформационнойБазы.mdo | 27 +- .../ФайлыВТоме/Forms/ФормаСписка/Form.form | 1 - ...ватьНастройкиПодключенияВМоделиСервиса.mdo | 11 + .../ИспользоватьОнлайнПоддержку.mdo | 14 - ...оватьСинхронизациюДанныхВМоделиСервиса.mdo | 1 + ...ыхВМоделиСервисаСПриложениемВИнтернете.mdo | 2 +- .../ИспользоватьСценарииВМоделиСервиса.mdo | 11 + .../ХранитьИсториюРассылкиОтчетов.mdo | 12 + .../ХранитьФайлыВТомахНаДиске.mdo | 1 + .../ОбщиеНастройкиУзлов.mdo | 9 + .../ЗагрузкаАдресногоКлассификатора/Form.form | 447 +- .../Module.bsl | 53 +- .../ОчисткаАдресногоКлассификатора/Form.form | 8 +- .../АдресныеОбъекты/ManagerModule.bsl | 2 +- .../Forms/ФормаЗаписи/Form.form | 363 + .../Forms/ФормаЗаписи/Module.bsl} | 11 +- .../Список/ExtInfo/ListSettings.dcss | 0 .../Forms/ФормаСписка/Form.form | 524 +- .../Forms/ФормаСписка/Module.bsl | 108 + .../АрхивСообщенийОбменов/ManagerModule.bsl | 174 + .../АрхивСообщенийОбменов/RecordSetModule.bsl | 40 + .../АрхивСообщенийОбменов.mdo | 209 + .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ВыборРеквизитовОбъекта/Form.form | 32 + .../Forms/ВыборХранимыхВерсий/Form.form | 32 + .../Forms/ФормаСписка/Module.bsl | 63 - .../ВерсииОбъектов/ManagerModule.bsl | 3 +- .../ВерсииОбъектов/ВерсииОбъектов.mdo | 9 - .../Forms/ФормаЗаписи/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 39 +- .../ГруппыЗначенийДоступа/ManagerModule.bsl | 7 +- .../Forms/ФормаСписка/Form.form | 1 - .../ДампыПлатформы/ManagerModule.bsl | 6 +- .../Forms/МоиБизнесПроцессы/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ДатыЗапретаИзменения/Form.form | 91 +- .../Forms/ДатыЗапретаИзменения/Module.bsl | 252 +- .../Forms/РедактированиеДатыЗапрета/Form.form | 5 - .../Forms/ФормаЗаписи/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../ДатыЗапретаИзменения/Help/ru.html | 21 +- .../ДатыЗапретаИзменения/ManagerModule.bsl | 44 +- .../ДатыЗапретаИзменения/RecordSetModule.bsl | 4 + .../Forms/ФормаЗаписи/Form.form | 2 +- .../Forms/ФормаСписка/Form.form | 1 - .../ДвоичныеДанныеФайлов/ManagerModule.bsl | 4 +- .../Forms/ФормаЗаписи/Form.form | 760 ++ .../Forms/ФормаЗаписи/Module.bsl | 34 + .../Список/ExtInfo/ListSettings.dcss | 17 + .../Forms/ФормаСписка/Form.form | 729 ++ .../Forms/ФормаСписка/Module.bsl | 30 + .../ДлительныеОперации/ДлительныеОперации.mdo | 253 +- .../Forms/ФормаСписка/Form.form | 1 - .../ЗависимостиПравДоступа/ManagerModule.bsl | 4 +- .../Forms/ФормаЗаписи/Form.form | 431 + .../Список/ExtInfo/ListSettings.dcss | 25 + .../Forms/ФормаСписка/Form.form | 601 ++ ...адачиОбменаДаннымиВнутренняяПубликация.mdo | 256 + .../ЗамерыВремени/Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../ManagerModule.bsl | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../ЗамерыОбластиСтатистики/ManagerModule.bsl | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../ManagerModule.bsl | 3 +- .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../ЗначенияГруппДоступа/ManagerModule.bsl | 19 +- .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Form.form | 33 +- .../Forms/РолиИИсполнителиЗадач/Form.form | 32 + .../Forms/ФормаЗаписи/Form.form | 3 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../ИсторияРассылкиОтчетов/ManagerModule.bsl | 50 + .../RecordSetModule.bsl | 0 .../ИсторияРассылкиОтчетов.mdo | 275 + .../КалендарныеГрафики/ManagerModule.bsl | 13 +- .../КалендарныеГрафики/RecordSetModule.bsl | 0 .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../КодировкиФайлов/ManagerModule.bsl | 248 +- .../Forms/ЗацикливаниеСинхронизации/Form.form | 931 ++ .../ЗацикливаниеСинхронизации/Module.bsl | 164 + .../Forms/ФормаСписка/Form.form | 595 ++ .../Forms/ФормаСписка/Module.bsl | 128 + .../КонтурСинхронизации/ManagerModule.bsl | 0 .../КонтурСинхронизации.mdo | 228 + .../КурсыВалют/Forms/ФормаСписка/Form.form | 1 - .../КурсыВалют/RecordSetModule.bsl | 8 +- .../ManagerModule.bsl | 10 +- .../Forms/ФормаЗаписи/Form.form | 2 - .../Forms/ФормаСписка/Form.form | 1 - .../НаличиеФайлов/ManagerModule.bsl | 3 +- .../Forms/МоиНапоминания/Form.form | 1 - .../Forms/Напоминание/Form.form | 6 +- .../Forms/Напоминание/Module.bsl | 6 +- .../Forms/ФормаОповещения/Form.form | 1 - .../Forms/ФормаОповещения/Module.bsl | 4 +- .../Forms/ФормаСписка/Form.form | 1 - .../ManagerModule.bsl | 6 +- .../ExtInfo/ListSettings.dcss | 17 + .../Forms/ФормаЗаписи/Form.form | 914 ++ .../Forms/ФормаЗаписи/Module.bsl | 237 + .../Список/ExtInfo/ListSettings.dcss | 17 + .../Forms/ФормаСписка/Form.form | 371 + .../ManagerModule.bsl | 44 + .../НастройкиАрхиваСообщенийОбменов.mdo | 181 + .../ManagerModule.bsl | 36 +- .../Forms/НастройкиХраненияИстории/Form.form | 35 +- .../ManagerModule.bsl | 2 +- .../Forms/ДобавлениеУсловияПоДате}/Form.form | 1 - .../Module.bsl | 0 .../Forms/ФормаЗаписи/Form.form | 32 + .../Forms/ФормаЗаписи/Module.bsl | 4 +- .../Forms/ФормаСписка/Form.form | 37 +- .../НастройкиОчисткиФайлов.mdo | 4 +- .../Forms/ФормаЗаписи/Form.form | 6 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ДобавлениеУсловияПоДате}/Form.form | 1 - .../Module.bsl | 0 .../НастройкиСинхронизацииФайлов/Form.form | 34 +- .../НастройкиСинхронизацииФайлов/Module.bsl | 11 +- .../Forms/ФормаЗаписиНастройки/Form.form | 36 +- .../Forms/ФормаЗаписиНастройки/Module.bsl | 4 +- .../НастройкиСинхронизацииФайлов.mdo | 2 +- .../НастройкаПодключенияКСервису/Form.form | 3 - .../НастройкаПодключенияКСервису/Module.bsl | 2 +- .../Form.form | 1 - .../Module.bsl | 20 +- .../Forms/ФормаЗаписи/Form.form | 107 +- .../Forms/ФормаЗаписи/Module.bsl | 29 +- .../Forms/ФормаСписка/Form.form | 1 - .../Help/ru.html | 2 +- .../ManagerModule.bsl | 17 +- .../НастройкиТранспортаОбменаДанными.mdo | 36 +- .../Forms/ФормаЗаписи/Form.form | 5 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../ManagerModule.bsl | 4 +- .../Forms/ФормаЗаписи/Form.form | 9 - .../Forms/ФормаСписка/Form.form | 1 - .../Form.form | 48 +- .../Module.bsl | 12 +- .../Form.form | 675 +- .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаСписка/Module.bsl | 2 +- .../ПерезапускОтложенногоОбновления/Form.form | 2 - .../Forms/ФормаВыбора/Form.form | 1 - .../Forms/ФормаЗаписи/Form.form | 161 +- .../Forms/ФормаСписка/Form.form | 251 +- .../ОбработчикиОбновления.mdo | 63 + .../ManagerModule.bsl | 40 +- .../ОбщиеНастройкиУзловИнформационныхБаз.mdo | 126 + .../ManagerModule.bsl | 4 +- .../Forms/ФормаЗаписи/Form.form | 248 + .../Forms/ФормаЗаписи/Module.bsl} | 10 +- .../Список/ExtInfo/ListSettings.dcss | 17 + .../Forms/ФормаСписка/Form.form | 464 + .../Forms/ФормаСписка/Module.bsl | 116 + .../ManagerModule.bsl | 111 + ...ктыНезарегистрированныеПриЗацикливании.mdo | 176 + .../Forms/ФормаСписка/Form.form | 1 - .../Forms/ФормаЗаписи/Form.form | 6 +- .../Forms/ФормаСписка/Form.form | 5 +- .../ПакетыДляОтправки/ManagerModule.bsl | 8 +- .../Forms/ФормаСписка/Form.form | 1 - .../ManagerModule.bsl | 8 +- .../Forms/ФормаСписка/Form.form | 1 - .../ManagerModule.bsl | 8 +- .../Forms/ФормаСписка/Form.form | 1 - .../ManagerModule.bsl | 23 +- .../Forms/ФормаЗаписи/Form.form | 4 + .../Forms/ФормаСписка/Form.form | 5 +- .../ВыбораРежимаОткрытияМакета/Form.form | 1 - .../Forms/МакетыПечатныхФорм/Form.form | 414 +- .../Forms/МакетыПечатныхФорм/Module.bsl | 1404 ++- .../Forms/ПроверкаПечатныхФорм/Form.form | 1 - .../Forms/РедактированиеМакета/Form.form | 1 - .../Forms/РедактированиеМакета/Module.bsl | 57 +- .../ManagerModule.bsl | 464 +- .../ManagerModule.bsl | 4 +- .../ПраваРолей/Forms/ФормаЗаписи/Form.form | 4 - .../ПраваРолей/Forms/ФормаСписка/Form.form | 1 - .../Form.form | 91 - .../Module.bsl | 1 - .../ПравилаКонвертацииОбъектов/Form.form | 75 - .../ПравилаРегистрацииОбъектов/Form.form | 9 - .../ПравилаРегистрацииОбъектов/Module.bsl | 7 +- .../ПроверкаСинхронизацииДанных/Form.form | 1 - .../СообщениеОНеудачномОбновлении/Form.form | 3 - .../Forms/ФормаСписка/Form.form | 1 - .../ПравилаДляОбменаДанными/ManagerModule.bsl | 1 - .../ПравилаДляОбменаДанными.mdo | 21 +- .../ManagerModule.bsl | 125 +- .../RecordSetModule.bsl | 0 .../Form.form | 5 - .../Forms/ФормаСписка/Form.form | 1 - .../РабочиеКаталогиФайлов/RecordSetModule.bsl | 2 +- .../Module.bsl | 2 +- .../Module.bsl | 2 +- .../Module.bsl | 2 +- .../ОтборПредупрежденийПоТипам/Form.form | 54 +- .../ОтборПредупрежденийПоТипам/Module.bsl | 4 + .../Forms/ОтборСинхронизаций/Form.form | 1 - .../Form.form | 2 +- .../Form.form | 1 - .../Form.form | 1 - .../Form.form | 2 - .../Forms/ПредупреждениеОКоллизии/Form.form | 2 - .../Form.form | 2 - .../Form.form | 1 - .../ПредупрежденияСинхронизаций/Form.form | 6 - .../Form.form | 1 - .../Forms/Форма/Form.form | 1 - .../Forms/Форма/Module.bsl | 4 +- .../РезультатыОбменаДанными/ManagerModule.bsl | 31 +- .../РезультатыПроверкиУчета/ManagerModule.bsl | 4 +- .../Forms/ФормаЗаписи/Form.form | 1573 ++- .../Forms/ФормаСписка/Form.form | 218 +- .../Forms/ФормаСписка/Module.bsl | 32 + .../СведенияОПользователях/ManagerModule.bsl | 781 ++ .../СведенияОПользователях.mdo | 368 +- .../СведенияОФайлах/ManagerModule.bsl | 3 +- .../ManagerModule.bsl | 42 + .../RecordSetModule.bsl | 0 .../СертификатыПолучателейРассылкиОтчетов.mdo | 86 + .../ManagerModule.bsl | 21 +- .../СессииОбменаСообщениямиСистемы.mdo | 16 + .../Forms/ФормаСписка/Form.form | 1 - .../Form.form | 6 - .../Module.bsl | 70 +- .../Forms/ФормаЗаписи/Form.form | 1 - .../ManagerModule.bsl | 58 +- .../Forms/ФормаСписка/Form.form | 1 - .../СтатистикаКонфигурации/ManagerModule.bsl | 6 +- .../Forms/ФормаЗаписи/Form.form | 3 - .../Forms/ФормаСписка/Form.form | 1 - .../ТаблицыГруппДоступа/ManagerModule.bsl | 11 +- .../УдалитьНастройкиТранспортаОбмена.mdo | 2 +- .../УдаляемыеОбъекты/УдаляемыеОбъекты.mdo | 17 +- .../Forms/ФормаСписка/Form.form | 33 +- .../ManagerModule.bsl | 0 .../RecordSetModule.bsl | 0 .../ФиксацияОбработкиДанныхОбработчиками.mdo | 69 + .../ЭлектронныеПодписи/ManagerModule.bsl | 6 +- .../ManagerModule.bsl | 40 +- .../Template.mxlx | 4 +- .../АнализОпроса/Forms/ФормаОтчета/Form.form | 1 - SSL/src/Reports/АнализОпроса/ObjectModule.bsl | 12 +- .../АнализПравДоступа/ManagerModule.bsl | 24 +- .../АнализПравДоступа/ObjectModule.bsl | 53 +- .../Templates/Макет/Template.dcs | 12 + .../АнализПравДоступа/АнализПравДоступа.mdo | 1 - .../Forms/ФормаОтчета/Form.form | 1 - .../ДатыЗапретаЗагрузки/ObjectModule.bsl | 155 +- .../Forms/ФормаОтчета/Form.form | 1 - .../ДатыЗапретаИзменения/ObjectModule.bsl | 135 +- .../ДвиженияДокумента/ManagerModule.bsl | 10 +- .../ДвиженияДокумента/ObjectModule.bsl | 2 +- .../ManagerModule.bsl | 38 + .../ObjectModule.bsl | 427 + .../Templates/ДиаграммаГанта/Template.mxlx | 334 + .../Template.dcs | 315 + .../ДлительностьОтложенногоОбновления.mdo | 33 + .../ObjectModule.bsl | 2 +- .../КонтрольРассылкиОтчетов/ManagerModule.bsl | 47 + .../КонтрольРассылкиОтчетов/ObjectModule.bsl | 403 + .../Template.dcs | 659 ++ .../КонтрольРассылкиОтчетов.mdo | 26 + SSL/src/Reports/ПраваДоступа/ObjectModule.bsl | 1 + SSL/src/Reports/ПраваДоступа/ПраваДоступа.mdo | 1 - SSL/src/Reports/ПраваРолей/ManagerModule.bsl | 9 +- SSL/src/Reports/ПраваРолей/ObjectModule.bsl | 6 +- SSL/src/Reports/ПраваРолей/ПраваРолей.mdo | 1 - .../Forms/ЗарегистрированныеДанные/Form.form | 1 - .../Forms/ЗарегистрированныеДанные/Module.bsl | 2 +- .../ObjectModule.bsl | 4 +- .../Template.dcs | 88 +- .../ManagerModule.bsl | 2 +- ...длениеСрокаДействияЭлектронныхПодписей.mdo | 2 - .../Forms/АвтоисправлениеПроблемы/Module.bsl | 25 +- .../РезультатыПроверкиУчета/ObjectModule.bsl | 2 +- .../СведенияОПользователях/ObjectModule.bsl | 38 +- .../Template.dcs | 476 +- .../УниверсальныйОтчет/ManagerModule.bsl | 26 +- .../УниверсальныйОтчет/ObjectModule.bsl | 14 +- .../Roles/АдминистраторСистемы/Rights.rights | 276 +- SSL/src/Roles/БазовыеПраваБСП/Rights.rights | 122 +- .../Rights.rights | 122 +- .../Roles/ВызовОнлайнПоддержки/Rights.rights | 68 - .../ВызовОнлайнПоддержки.mdo | 8 - .../Rights.rights | 65 +- .../Rights.rights | 54 +- .../Rights.rights | 28 +- .../Rights.rights | 54 +- .../Rights.rights | 54 +- .../Rights.rights | 541 ++ .../ДобавлениеИзменениеДатЗапретаЗагрузки.mdo | 8 + .../Rights.rights | 54 +- .../Rights.rights | 54 +- .../ДобавлениеИзменениеЗаданий/Rights.rights | 42 +- .../ДобавлениеИзменениеЗаметок/Rights.rights | 14 +- .../Rights.rights | 14 +- .../Rights.rights | 22 +- .../Rights.rights | 54 +- .../ДобавлениеИзменениеОпросов/Rights.rights | 7 - .../Rights.rights | 14 +- .../Rights.rights | 54 +- .../Rights.rights | 54 +- .../Rights.rights | 22 +- .../Rights.rights | 95 +- .../Rights.rights | 54 +- .../Rights.rights | 54 +- .../Rights.rights | 7 - .../ИзменениеВыполнениеЗадач/Rights.rights | 36 +- .../Rights.rights | 38 +- .../Rights.rights | 30 +- .../Rights.rights | 14 +- SSL/src/Roles/ПолныеПрава/Rights.rights | 173 +- .../Roles/УдаленныйДоступOData/Rights.rights | 141 +- .../Rights.rights | 28 +- .../ЧтениеВариантовОтчетов/Rights.rights | 14 +- .../ЧтениеВнешнихПользователей/Rights.rights | 52 +- .../ЧтениеДанныхСервисаDSS/Rights.rights | 14 +- .../ЧтениеДатЗапретаЗагрузки/Rights.rights | 495 + .../ЧтениеДатЗапретаЗагрузки.mdo | 8 + .../ЧтениеДатЗапретаИзменения/Rights.rights | 495 + .../ЧтениеДатЗапретаИзменения.mdo | 8 + .../Rights.rights | 46 +- SSL/src/Roles/ЧтениеЗадач/Rights.rights | 14 +- .../ЧтениеОтветовНаВопросыАнкет/Rights.rights | 7 - .../Roles/ЧтениеРассылокОтчетов/Rights.rights | 43 +- .../Rights.rights | 30 +- .../ЧтениеШаблоновСообщений/Rights.rights | 22 +- .../ScheduledJobs/ОтправкаSMS/ОтправкаSMS.mdo | 2 +- .../Schedule.schedule | 22 + .../ОчисткаИсторииРассылкиОтчетов.mdo | 12 + .../Schedule.schedule | 22 + .../ПолучениеСтатусовЭлектронныхПисем.mdo | 12 + .../Schedule.schedule | 22 + ...дкаОтложенногоОбновленияВМоделиСервиса.mdo | 14 + .../ОбновлениеСправочниковПользователей.mdo | 11 + .../ПраваДоступаКДатамЗапрета.mdo | 12 + .../ПравилаВыборочнойРегистрацииОбъектов.mdo | 11 - .../Forms/БыстрыеНастройкиОтчета/Form.form | 2 - .../Forms/ВыборВариантаОтчета/Form.form | 30 +- .../Forms/ВыборПоляОтчета/Form.form | 1 - .../Forms/ВыборПоляОтчета/Module.bsl | 30 +- .../Forms/ВыборФинансовогоПериода/Form.form | 11 - .../Forms/ВыборФинансовогоПериода/Module.bsl | 6 +- .../Forms/НастройкаПоля/Form.form | 53 +- .../Forms/ПанельДругихОтчетов/Form.form | 119 +- .../Forms/ПанельДругихОтчетов/Module.bsl | 80 +- .../Forms/СохранениеВариантаОтчета/Form.form | 901 +- .../Forms/СохранениеВариантаОтчета/Module.bsl | 32 +- .../Forms/ФильтроватьПоПолю/Form.form | 6 - .../Form.form | 8 - .../ManagerModule.bsl | 2 +- .../ОсновнойЭлементСписка.mdo | 2 +- .../Администрирование/CommandInterface.cmi | 41 +- .../Администрирование/Администрирование.mdo | 2 +- .../АдресныйКлассификатор.mdo | 14 +- .../БазоваяФункциональность.mdo | 8 + .../Subsystems/Банки/Банки.mdo | 1 + .../Subsystems/Валюты/Валюты.mdo | 1 + .../Взаимодействия/Взаимодействия.mdo | 1 - .../ВызовОнлайнПоддержки.mdo | 20 - .../ДатыЗапретаИзменения.mdo | 4 + ...ЗапретРедактированияРеквизитовОбъектов.mdo | 1 + .../КонструкторФормул/КонструкторФормул.mdo | 1 + .../КонтактнаяИнформация.mdo | 6 + .../НастройкиПрограммы/НастройкиПрограммы.mdo | 2 + .../Subsystems/Регистрация/Регистрация.mdo | 12 + .../Subsystems/ОбменДанными/ОбменДанными.mdo | 16 +- .../ОбновлениеВерсииИБ/ОбновлениеВерсииИБ.mdo | 5 + .../Subsystems/Печать/Печать.mdo | 5 + .../ПолучениеФайловИзИнтернета.mdo | 1 + .../Subsystems/Пользователи/Пользователи.mdo | 7 + .../ОбменДаннымиВМоделиСервиса.mdo | 60 +- .../РаботаСПочтовымиСообщениями.mdo | 3 + .../РассылкаОтчетов/РассылкаОтчетов.mdo | 7 + .../ЭлектроннаяПодпись/ЭлектроннаяПодпись.mdo | 3 +- .../ЭлектроннаяПодписьСервисаDSS.mdo | 3 - .../СтандартныеПодсистемы.mdo | 1 - .../Forms/Дополнительно/Form.form | 8 - .../Forms/ЗадачиПоБизнесПроцессу/Form.form | 5 +- .../Forms/ЗадачиПоБизнесПроцессу/Module.bsl | 151 +- .../Forms/ЗадачиПоПредмету/Form.form | 5 +- .../Forms/ЗадачиПоПредмету/Module.bsl | 117 +- .../Forms/МоиЗадачи/Form.form | 1 - .../Forms/ПеренаправитьЗадачи/Form.form | 8 - .../Forms/ФормаЗадачи/Form.form | 11 - .../Forms/ФормаСписка/Form.form | 3 - .../EnterpriseDataExchange_1_0_1_1/Module.bsl | 8 +- .../EnterpriseDataUpload_1_0_1_1/Module.bsl | 4 +- SSL/src/WebServices/Exchange/Module.bsl | 12 +- .../WebServices/Exchange_2_0_1_6/Module.bsl | 16 +- .../WebServices/Exchange_3_0_1_1/Module.bsl | 18 +- .../Exchange_3_0_2_1/Exchange_3_0_2_1.mdo | 1206 +++ .../WebServices/Exchange_3_0_2_1/Module.bsl | 1025 ++ .../RemoteAdministrationOfExchange/Module.bsl | 2 +- .../EnterpriseData_1_11_7/Package.xdto | 8302 ---------------- .../EnterpriseData_1_12_1/Package.xdto | 8273 ---------------- .../EnterpriseData_1_15_3/Package.xdto | 8397 ----------------- .../XDTOPackages/ExchangeMessage/Package.xdto | 19 + .../Package.xdto | 59 + ...рованиеОбменаДаннымиУправление_3_0_1_1.mdo | 9 + 1664 files changed, 135734 insertions(+), 75376 deletions(-) create mode 100644 SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ПрограммаОпределеннаяАвтоматически/Form.form create mode 100644 SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ПрограммаОпределеннаяАвтоматически/Module.bsl create mode 100644 SSL/src/Catalogs/РассылкиОтчетов/Forms/SMSРассылкаПаролей/Form.form create mode 100644 SSL/src/Catalogs/РассылкиОтчетов/Forms/SMSРассылкаПаролей/Help/ru.html create mode 100644 SSL/src/Catalogs/РассылкиОтчетов/Forms/SMSРассылкаПаролей/Module.bsl create mode 100644 SSL/src/Catalogs/РассылкиОтчетов/Forms/ПаролиШифрование/Form.form create mode 100644 SSL/src/Catalogs/РассылкиОтчетов/Forms/ПаролиШифрование/Help/ru.html create mode 100644 SSL/src/Catalogs/РассылкиОтчетов/Forms/ПаролиШифрование/Module.bsl create mode 100644 SSL/src/Catalogs/РассылкиОтчетов/Templates/ПФ_MXL_ПаролиРассылкиОтчетов/Template.mxlx create mode 100644 SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатовДляШифрования/Form.form create mode 100644 SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатовДляШифрования/Module.bsl create mode 100644 SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/УстановкаСертификата/Form.form create mode 100644 SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/УстановкаСертификата/Module.bsl create mode 100644 SSL/src/Catalogs/СценарииОбменовДанными/Forms/ВыборУзлаПланаОбмена/Form.form create mode 100644 SSL/src/Catalogs/СценарииОбменовДанными/Forms/ВыборУзлаПланаОбмена/Module.bsl create mode 100644 SSL/src/CommonCommands/АрхивСообщенийОбменов/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/АрхивСообщенийОбменов/АрхивСообщенийОбменов.mdo delete mode 100644 SSL/src/CommonCommands/НастройкаОнлайнПоддержки/НастройкаОнлайнПоддержки.mdo create mode 100644 SSL/src/CommonCommands/ОбъектыНезарегистрированныеПриЗацикливании/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ОбъектыНезарегистрированныеПриЗацикливании/ОбъектыНезарегистрированныеПриЗацикливании.mdo create mode 100644 SSL/src/CommonCommands/ПомощникПереходаНаИнтернетВнутренняяПубликация/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ПомощникПереходаНаИнтернетВнутренняяПубликация/ПомощникПереходаНаИнтернетВнутренняяПубликация.mdo delete mode 100644 SSL/src/CommonCommands/СвязатьсяСоСпециалистомОнлайнПоддержки/СвязатьсяСоСпециалистомОнлайнПоддержки.mdo delete mode 100644 SSL/src/CommonForms/НастройкаОнлайнПоддержки/Form.form delete mode 100644 SSL/src/CommonForms/НастройкаОнлайнПоддержки/Help/ru.html delete mode 100644 SSL/src/CommonForms/НастройкаОнлайнПоддержки/Module.bsl create mode 100644 SSL/src/CommonForms/ПечатьДокументовOfficeOpen/Form.form create mode 100644 SSL/src/CommonForms/ПечатьДокументовOfficeOpen/Help/ru.html create mode 100644 SSL/src/CommonForms/ПечатьДокументовOfficeOpen/Module.bsl rename SSL/src/CommonForms/{НастройкаОнлайнПоддержки/НастройкаОнлайнПоддержки.mdo => ПечатьДокументовOfficeOpen/ПечатьДокументовOfficeOpen.mdo} (57%) delete mode 100644 SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Form.form delete mode 100644 SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Help/ru.html delete mode 100644 SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Module.bsl create mode 100644 SSL/src/CommonForms/РазблокированиеРеквизитов/Form.form create mode 100644 SSL/src/CommonForms/РазблокированиеРеквизитов/Module.bsl create mode 100644 SSL/src/CommonForms/РазблокированиеРеквизитов/РазблокированиеРеквизитов.mdo create mode 100644 SSL/src/CommonForms/РедактированиеДокументаOfficeOpen/Form.form create mode 100644 SSL/src/CommonForms/РедактированиеДокументаOfficeOpen/Help/ru.html create mode 100644 SSL/src/CommonForms/РедактированиеДокументаOfficeOpen/Module.bsl rename SSL/src/CommonForms/{ПоискИсполняемогоФайлаОнлайнПоддержки/ПоискИсполняемогоФайлаОнлайнПоддержки.mdo => РедактированиеДокументаOfficeOpen/РедактированиеДокументаOfficeOpen.mdo} (55%) create mode 100644 SSL/src/CommonForms/РедактированиеТабличногоДокумента/Attributes/ПоставляемыйМакет/ExtInfo/SpreadsheetData.mxlx create mode 100644 SSL/src/CommonForms/РедактированиеТабличногоДокумента/Attributes/ТабличныйДокумент/ExtInfo/SpreadsheetData.mxlx create mode 100644 SSL/src/CommonForms/ФормаВыбораЦвета/Form.form create mode 100644 SSL/src/CommonForms/ФормаВыбораЦвета/Module.bsl create mode 100644 SSL/src/CommonForms/ФормаВыбораЦвета/ФормаВыбораЦвета.mdo create mode 100644 SSL/src/CommonForms/ФормаВыбораШрифта/Form.form create mode 100644 SSL/src/CommonForms/ФормаВыбораШрифта/Module.bsl create mode 100644 SSL/src/CommonForms/ФормаВыбораШрифта/ФормаВыбораШрифта.mdo delete mode 100644 SSL/src/CommonModules/ВызовОнлайнПоддержки/Module.bsl delete mode 100644 SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/Module.bsl delete mode 100644 SSL/src/CommonModules/ВызовОнлайнПоддержкиКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/КонструкторФормулПовтИсп/Module.bsl create mode 100644 SSL/src/CommonModules/КонструкторФормулПовтИсп/КонструкторФормулПовтИсп.mdo create mode 100644 SSL/src/CommonModules/НастройкиПрограммы/Module.bsl rename SSL/src/CommonModules/{ВызовОнлайнПоддержки/ВызовОнлайнПоддержки.mdo => НастройкиПрограммы/НастройкиПрограммы.mdo} (63%) create mode 100644 SSL/src/CommonModules/НастройкиПрограммыКлиент/Module.bsl rename SSL/src/CommonModules/{ВызовОнлайнПоддержкиКлиент/ВызовОнлайнПоддержкиКлиент.mdo => НастройкиПрограммыКлиент/НастройкиПрограммыКлиент.mdo} (59%) create mode 100644 SSL/src/CommonModules/ОбменДаннымиВебСервис/Module.bsl rename SSL/src/CommonModules/{ВызовОнлайнПоддержкиПереопределяемый/ВызовОнлайнПоддержкиПереопределяемый.mdo => ОбменДаннымиВебСервис/ОбменДаннымиВебСервис.mdo} (55%) create mode 100644 SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликация/Module.bsl create mode 100644 SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликация/ОбменДаннымиВнутренняяПубликация.mdo create mode 100644 SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликацияВызовСервера/Module.bsl create mode 100644 SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликацияВызовСервера/ОбменДаннымиВнутренняяПубликацияВызовСервера.mdo create mode 100644 SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликацияКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликацияКлиент/ОбменДаннымиВнутренняяПубликацияКлиент.mdo create mode 100644 SSL/src/CommonModules/ОбменДаннымиКонтрольЗацикливания/Module.bsl create mode 100644 SSL/src/CommonModules/ОбменДаннымиКонтрольЗацикливания/ОбменДаннымиКонтрольЗацикливания.mdo create mode 100644 SSL/src/CommonModules/ОбменДаннымиРегистрацияПовтИсп/Module.bsl create mode 100644 SSL/src/CommonModules/ОбменДаннымиРегистрацияПовтИсп/ОбменДаннымиРегистрацияПовтИсп.mdo create mode 100644 SSL/src/CommonModules/ОбменДаннымиРегистрацияСервер/Module.bsl create mode 100644 SSL/src/CommonModules/ОбменДаннымиРегистрацияСервер/ОбменДаннымиРегистрацияСервер.mdo create mode 100644 SSL/src/CommonModules/ОбменДаннымиТрансляцияФорматаПовтИсп/Module.bsl create mode 100644 SSL/src/CommonModules/ОбменДаннымиТрансляцияФорматаПовтИсп/ОбменДаннымиТрансляцияФорматаПовтИсп.mdo rename SSL/src/CommonModules/{ВызовОнлайнПоддержкиПереопределяемый => ПолучениеФайловИзИнтернетаСлужебныйЛокализация}/Module.bsl (54%) create mode 100644 SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебныйЛокализация/ПолучениеФайловИзИнтернетаСлужебныйЛокализация.mdo create mode 100644 SSL/src/CommonModules/РаботаСБанкамиВызовСервера/Module.bsl rename SSL/src/CommonModules/{ВызовОнлайнПоддержкиВызовСервера/ВызовОнлайнПоддержкиВызовСервера.mdo => РаботаСБанкамиВызовСервера/РаботаСБанкамиВызовСервера.mdo} (50%) create mode 100644 SSL/src/CommonModules/РаботаСКурсамиВалютВызовСервера/Module.bsl create mode 100644 SSL/src/CommonModules/РаботаСКурсамиВалютВызовСервера/РаботаСКурсамиВалютВызовСервера.mdo create mode 100644 SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебныйЛокализация/Module.bsl create mode 100644 SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебныйЛокализация/РаботаСПочтовымиСообщениямиСлужебныйЛокализация.mdo create mode 100644 SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1/Module.bsl create mode 100644 SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1/СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1.mdo create mode 100644 SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеТрансляция_2_1_2_1/Module.bsl create mode 100644 SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеТрансляция_2_1_2_1/СообщенияАдминистрированиеОбменаДаннымиУправлениеТрансляция_2_1_2_1.mdo create mode 100644 SSL/src/CommonPictures/GoogleMaps/Picture.svg delete mode 100644 SSL/src/CommonPictures/GoogleMaps/Picture.zip create mode 100644 SSL/src/CommonPictures/Адрес/Picture.zip create mode 100644 SSL/src/CommonPictures/Адрес/Адрес.mdo create mode 100644 SSL/src/CommonPictures/ВебСтраница/Picture.zip create mode 100644 SSL/src/CommonPictures/ВебСтраница/ВебСтраница.mdo delete mode 100644 SSL/src/CommonPictures/ВидимостьПароляЗакрыто/Picture.png delete mode 100644 SSL/src/CommonPictures/ВидимостьПароляЗакрыто/ВидимостьПароляЗакрыто.mdo delete mode 100644 SSL/src/CommonPictures/ВидимостьПароляОткрыто/Picture.png delete mode 100644 SSL/src/CommonPictures/ВидимостьПароляОткрыто/ВидимостьПароляОткрыто.mdo create mode 100644 SSL/src/CommonPictures/Другое/Picture.zip create mode 100644 SSL/src/CommonPictures/Другое/Другое.mdo create mode 100644 SSL/src/CommonPictures/ИсторияИзменений/Picture.svg delete mode 100644 SSL/src/CommonPictures/ИсторияИзменений/Picture.zip create mode 100644 SSL/src/CommonPictures/КонтактнаяИнформацияПерейтиПоСсылке/Picture.svg delete mode 100644 SSL/src/CommonPictures/КонтактнаяИнформацияПерейтиПоСсылке/Picture.zip create mode 100644 SSL/src/CommonPictures/МенюДополнительныеФункции/Picture.svg delete mode 100644 SSL/src/CommonPictures/МенюДополнительныеФункции/Picture.zip create mode 100644 SSL/src/CommonPictures/МестоДляQRКода/Picture.png create mode 100644 SSL/src/CommonPictures/МестоДляQRКода/МестоДляQRКода.mdo create mode 100644 SSL/src/CommonPictures/МестоДляШтрихкода/Picture.gif create mode 100644 SSL/src/CommonPictures/МестоДляШтрихкода/МестоДляШтрихкода.mdo create mode 100644 SSL/src/CommonPictures/ОтправитьSMS/Picture.svg delete mode 100644 SSL/src/CommonPictures/ОтправитьSMS/Picture.zip create mode 100644 SSL/src/CommonPictures/ОтправитьЭлектронноеПисьмо/Picture.svg delete mode 100644 SSL/src/CommonPictures/ОтправитьЭлектронноеПисьмо/Picture.zip create mode 100644 SSL/src/CommonPictures/Позвонить/Picture.svg delete mode 100644 SSL/src/CommonPictures/Позвонить/Picture.zip create mode 100644 SSL/src/CommonPictures/ПоказатьНаКарте/Picture.zip create mode 100644 SSL/src/CommonPictures/ПоказатьНаКарте/ПоказатьНаКарте.mdo create mode 100644 SSL/src/CommonPictures/ПредварительныйПросмотрКартинка/Picture.png create mode 100644 SSL/src/CommonPictures/ПредварительныйПросмотрКартинка/ПредварительныйПросмотрКартинка.mdo create mode 100644 SSL/src/CommonPictures/СостояниеПользователя01/Picture.svg delete mode 100644 SSL/src/CommonPictures/СостояниеПользователя01/Picture.zip create mode 100644 SSL/src/CommonPictures/СостояниеПользователя02/Picture.svg delete mode 100644 SSL/src/CommonPictures/СостояниеПользователя02/Picture.zip create mode 100644 SSL/src/CommonPictures/СостояниеПользователя03/Picture.svg delete mode 100644 SSL/src/CommonPictures/СостояниеПользователя03/Picture.zip create mode 100644 SSL/src/CommonPictures/СостояниеПользователя04/Picture.svg delete mode 100644 SSL/src/CommonPictures/СостояниеПользователя04/Picture.zip create mode 100644 SSL/src/CommonPictures/СостояниеПользователя05/Picture.svg delete mode 100644 SSL/src/CommonPictures/СостояниеПользователя05/Picture.zip create mode 100644 SSL/src/CommonPictures/СостояниеПользователя06/Picture.svg delete mode 100644 SSL/src/CommonPictures/СостояниеПользователя06/Picture.zip create mode 100644 SSL/src/CommonPictures/СостояниеПользователя07/Picture.svg delete mode 100644 SSL/src/CommonPictures/СостояниеПользователя07/Picture.zip create mode 100644 SSL/src/CommonPictures/СостояниеПользователя08/Picture.svg delete mode 100644 SSL/src/CommonPictures/СостояниеПользователя08/Picture.zip create mode 100644 SSL/src/CommonPictures/СостояниеПользователя09/Picture.svg delete mode 100644 SSL/src/CommonPictures/СостояниеПользователя09/Picture.zip create mode 100644 SSL/src/CommonPictures/СостояниеПользователя10/Picture.svg delete mode 100644 SSL/src/CommonPictures/СостояниеПользователя10/Picture.zip create mode 100644 SSL/src/CommonPictures/СостояниеПользователя11/Picture.svg delete mode 100644 SSL/src/CommonPictures/СостояниеПользователя11/Picture.zip create mode 100644 SSL/src/CommonPictures/СостояниеПользователя12/Picture.svg delete mode 100644 SSL/src/CommonPictures/СостояниеПользователя12/Picture.zip create mode 100644 SSL/src/CommonPictures/СостояниеПользователя13/Picture.svg create mode 100644 SSL/src/CommonPictures/СостояниеПользователя13/СостояниеПользователя13.mdo create mode 100644 SSL/src/CommonPictures/СостояниеПользователя14/Picture.svg create mode 100644 SSL/src/CommonPictures/СостояниеПользователя14/СостояниеПользователя14.mdo create mode 100644 SSL/src/CommonPictures/СостояниеПользователя15/Picture.svg create mode 100644 SSL/src/CommonPictures/СостояниеПользователя15/СостояниеПользователя15.mdo create mode 100644 SSL/src/CommonPictures/СостояниеПользователя16/Picture.svg create mode 100644 SSL/src/CommonPictures/СостояниеПользователя16/СостояниеПользователя16.mdo create mode 100644 SSL/src/CommonPictures/СостояниеПользователя17/Picture.svg create mode 100644 SSL/src/CommonPictures/СостояниеПользователя17/СостояниеПользователя17.mdo create mode 100644 SSL/src/CommonPictures/СостояниеПользователя18/Picture.svg create mode 100644 SSL/src/CommonPictures/СостояниеПользователя18/СостояниеПользователя18.mdo create mode 100644 SSL/src/CommonPictures/СостоянияПользователей/Picture.svg delete mode 100644 SSL/src/CommonPictures/СостоянияПользователей/Picture.zip create mode 100644 SSL/src/CommonPictures/Факс/Picture.zip create mode 100644 SSL/src/CommonPictures/Факс/Факс.mdo create mode 100644 SSL/src/CommonPictures/ЦветГраницы/Picture.svg create mode 100644 SSL/src/CommonPictures/ЦветГраницы/ЦветГраницы.mdo create mode 100644 SSL/src/CommonPictures/ЭлектроннаяПочта/Picture.zip create mode 100644 SSL/src/CommonPictures/ЭлектроннаяПочта/ЭлектроннаяПочта.mdo create mode 100644 SSL/src/CommonPictures/ЯндексКарты/Picture.svg delete mode 100644 SSL/src/CommonPictures/ЯндексКарты/Picture.zip create mode 100644 SSL/src/CommonTemplates/ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen/Template.htmldoc create mode 100644 SSL/src/CommonTemplates/ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen/ru.html create mode 100644 SSL/src/CommonTemplates/ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen/ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen.mdo create mode 100644 SSL/src/CommonTemplates/МакетШтемпеляЭЦПOfficeOpen/Template.txt create mode 100644 SSL/src/CommonTemplates/МакетШтемпеляЭЦПOfficeOpen/МакетШтемпеляЭЦПOfficeOpen.mdo create mode 100644 SSL/src/CommonTemplates/ПустойМакетDOCX/Template.bin create mode 100644 SSL/src/CommonTemplates/ПустойМакетDOCX/ПустойМакетDOCX.mdo delete mode 100644 SSL/src/Constants/ИспользоватьОнлайнПоддержку/ИспользоватьОнлайнПоддержку.mdo create mode 100644 SSL/src/Constants/КоличествоМесяцевХраненияИсторииРассылкиОтчетов/КоличествоМесяцевХраненияИсторииРассылкиОтчетов.mdo create mode 100644 SSL/src/Constants/ПорядокОбрабатываемыхДанных/ПорядокОбрабатываемыхДанных.mdo create mode 100644 SSL/src/Constants/ХранитьИсториюРассылкиОтчетов/ХранитьИсториюРассылкиОтчетов.mdo create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/ПереходНаИнтернетСоединение/Form.form create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/ПереходНаИнтернетСоединение/Module.bsl create mode 100644 SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаCryptoProCSPРегистрационныеДанные/Form.form create mode 100644 SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаCryptoProCSPРегистрационныеДанные/Module.bsl create mode 100644 SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаViPNetCSPРегистрационныеДанные/Form.form create mode 100644 SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаViPNetCSPРегистрационныеДанные/Module.bsl create mode 100644 SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаКриптопровайдераИнформацияОДистрибутиве/Form.form create mode 100644 SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаКриптопровайдераИнформацияОДистрибутиве/Module.bsl create mode 100644 SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаПрограммКриптопровайдеров/Form.form create mode 100644 SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаПрограммКриптопровайдеров/Module.bsl create mode 100644 SSL/src/DefinedTypes/ОбменДаннымиУчетныеЗаписиЭлектроннойПочты/ОбменДаннымиУчетныеЗаписиЭлектроннойПочты.mdo create mode 100644 SSL/src/Enums/ДействияПриОбменеВнутренняяПубликация/ДействияПриОбменеВнутренняяПубликация.mdo create mode 100644 SSL/src/Enums/ПорядокОбработчиковОбновления/ПорядокОбработчиковОбновления.mdo create mode 100644 SSL/src/Enums/РежимыИспользованияПрограммыЭлектроннойПодписи/РежимыИспользованияПрограммыЭлектроннойПодписи.mdo create mode 100644 SSL/src/Enums/СтатусыЭлектронныхПисем/СтатусыЭлектронныхПисем.mdo delete mode 100644 SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанных/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанных.mdo delete mode 100644 SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхДокумент/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхДокумент.mdo delete mode 100644 SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхКонстанта/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхКонстанта.mdo delete mode 100644 SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписей/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписей.mdo delete mode 100644 SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписейРасчета/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписейРасчета.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьНастройкиПодключенияВМоделиСервиса/ИспользоватьНастройкиПодключенияВМоделиСервиса.mdo delete mode 100644 SSL/src/FunctionalOptions/ИспользоватьОнлайнПоддержку/ИспользоватьОнлайнПоддержку.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьСценарииВМоделиСервиса/ИспользоватьСценарииВМоделиСервиса.mdo create mode 100644 SSL/src/FunctionalOptions/ХранитьИсториюРассылкиОтчетов/ХранитьИсториюРассылкиОтчетов.mdo create mode 100644 SSL/src/FunctionalOptionsParameters/ОбщиеНастройкиУзлов/ОбщиеНастройкиУзлов.mdo create mode 100644 SSL/src/InformationRegisters/АрхивСообщенийОбменов/Forms/ФормаЗаписи/Form.form rename SSL/src/{CommonCommands/НастройкаОнлайнПоддержки/CommandModule.bsl => InformationRegisters/АрхивСообщенийОбменов/Forms/ФормаЗаписи/Module.bsl} (69%) rename SSL/src/InformationRegisters/{ВерсииОбъектов => АрхивСообщенийОбменов}/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss (100%) rename SSL/src/InformationRegisters/{ВерсииОбъектов => АрхивСообщенийОбменов}/Forms/ФормаСписка/Form.form (68%) create mode 100644 SSL/src/InformationRegisters/АрхивСообщенийОбменов/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/InformationRegisters/АрхивСообщенийОбменов/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/АрхивСообщенийОбменов/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/АрхивСообщенийОбменов/АрхивСообщенийОбменов.mdo delete mode 100644 SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/InformationRegisters/ДлительныеОперации/Forms/ФормаЗаписи/Form.form create mode 100644 SSL/src/InformationRegisters/ДлительныеОперации/Forms/ФормаЗаписи/Module.bsl create mode 100644 SSL/src/InformationRegisters/ДлительныеОперации/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/ДлительныеОперации/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/ДлительныеОперации/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/InformationRegisters/ЗадачиОбменаДаннымиВнутренняяПубликация/Forms/ФормаЗаписи/Form.form create mode 100644 SSL/src/InformationRegisters/ЗадачиОбменаДаннымиВнутренняяПубликация/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/ЗадачиОбменаДаннымиВнутренняяПубликация/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/ЗадачиОбменаДаннымиВнутренняяПубликация/ЗадачиОбменаДаннымиВнутренняяПубликация.mdo create mode 100644 SSL/src/InformationRegisters/ИсторияРассылкиОтчетов/ManagerModule.bsl rename SSL/src/InformationRegisters/{ЗагруженныеВерсииАдресныхСведений => ИсторияРассылкиОтчетов}/RecordSetModule.bsl (100%) create mode 100644 SSL/src/InformationRegisters/ИсторияРассылкиОтчетов/ИсторияРассылкиОтчетов.mdo create mode 100644 SSL/src/InformationRegisters/КалендарныеГрафики/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/КонтурСинхронизации/Forms/ЗацикливаниеСинхронизации/Form.form create mode 100644 SSL/src/InformationRegisters/КонтурСинхронизации/Forms/ЗацикливаниеСинхронизации/Module.bsl create mode 100644 SSL/src/InformationRegisters/КонтурСинхронизации/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/КонтурСинхронизации/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/InformationRegisters/КонтурСинхронизации/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/КонтурСинхронизации/КонтурСинхронизации.mdo create mode 100644 SSL/src/InformationRegisters/НастройкиАрхиваСообщенийОбменов/Forms/ФормаЗаписи/Attributes/АрхивСообщенийОбменов/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/НастройкиАрхиваСообщенийОбменов/Forms/ФормаЗаписи/Form.form create mode 100644 SSL/src/InformationRegisters/НастройкиАрхиваСообщенийОбменов/Forms/ФормаЗаписи/Module.bsl create mode 100644 SSL/src/InformationRegisters/НастройкиАрхиваСообщенийОбменов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/НастройкиАрхиваСообщенийОбменов/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/НастройкиАрхиваСообщенийОбменов/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/НастройкиАрхиваСообщенийОбменов/НастройкиАрхиваСообщенийОбменов.mdo rename SSL/src/InformationRegisters/{НастройкиСинхронизацииФайлов/Forms/ДобавленияУсловияПоДате => НастройкиОчисткиФайлов/Forms/ДобавлениеУсловияПоДате}/Form.form (99%) rename SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/{ФормаДобавленияУсловияПоДате => ДобавлениеУсловияПоДате}/Module.bsl (100%) rename SSL/src/InformationRegisters/{НастройкиОчисткиФайлов/Forms/ФормаДобавленияУсловияПоДате => НастройкиСинхронизацииФайлов/Forms/ДобавлениеУсловияПоДате}/Form.form (99%) rename SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/{ДобавленияУсловияПоДате => ДобавлениеУсловияПоДате}/Module.bsl (100%) create mode 100644 SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/Forms/ФормаЗаписи/Form.form rename SSL/src/{CommonCommands/СвязатьсяСоСпециалистомОнлайнПоддержки/CommandModule.bsl => InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/Forms/ФормаЗаписи/Module.bsl} (69%) create mode 100644 SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/ОбъектыНезарегистрированныеПриЗацикливании.mdo create mode 100644 SSL/src/InformationRegisters/ПредопределенныеВариантыОтчетовВерсийРасширений/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/СведенияОПользователях/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/СертификатыПолучателейРассылкиОтчетов/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/СертификатыПолучателейРассылкиОтчетов/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/СертификатыПолучателейРассылкиОтчетов/СертификатыПолучателейРассылкиОтчетов.mdo create mode 100644 SSL/src/InformationRegisters/ФиксацияОбработкиДанныхОбработчиками/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/ФиксацияОбработкиДанныхОбработчиками/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/ФиксацияОбработкиДанныхОбработчиками/ФиксацияОбработкиДанныхОбработчиками.mdo create mode 100644 SSL/src/Reports/ДлительностьОтложенногоОбновления/ManagerModule.bsl create mode 100644 SSL/src/Reports/ДлительностьОтложенногоОбновления/ObjectModule.bsl create mode 100644 SSL/src/Reports/ДлительностьОтложенногоОбновления/Templates/ДиаграммаГанта/Template.mxlx create mode 100644 SSL/src/Reports/ДлительностьОтложенногоОбновления/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs create mode 100644 SSL/src/Reports/ДлительностьОтложенногоОбновления/ДлительностьОтложенногоОбновления.mdo create mode 100644 SSL/src/Reports/КонтрольРассылкиОтчетов/ManagerModule.bsl create mode 100644 SSL/src/Reports/КонтрольРассылкиОтчетов/ObjectModule.bsl create mode 100644 SSL/src/Reports/КонтрольРассылкиОтчетов/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs create mode 100644 SSL/src/Reports/КонтрольРассылкиОтчетов/КонтрольРассылкиОтчетов.mdo delete mode 100644 SSL/src/Roles/ВызовОнлайнПоддержки/Rights.rights delete mode 100644 SSL/src/Roles/ВызовОнлайнПоддержки/ВызовОнлайнПоддержки.mdo create mode 100644 SSL/src/Roles/ДобавлениеИзменениеДатЗапретаЗагрузки/Rights.rights create mode 100644 SSL/src/Roles/ДобавлениеИзменениеДатЗапретаЗагрузки/ДобавлениеИзменениеДатЗапретаЗагрузки.mdo create mode 100644 SSL/src/Roles/ЧтениеДатЗапретаЗагрузки/Rights.rights create mode 100644 SSL/src/Roles/ЧтениеДатЗапретаЗагрузки/ЧтениеДатЗапретаЗагрузки.mdo create mode 100644 SSL/src/Roles/ЧтениеДатЗапретаИзменения/Rights.rights create mode 100644 SSL/src/Roles/ЧтениеДатЗапретаИзменения/ЧтениеДатЗапретаИзменения.mdo create mode 100644 SSL/src/ScheduledJobs/ОчисткаИсторииРассылкиОтчетов/Schedule.schedule create mode 100644 SSL/src/ScheduledJobs/ОчисткаИсторииРассылкиОтчетов/ОчисткаИсторииРассылкиОтчетов.mdo create mode 100644 SSL/src/ScheduledJobs/ПолучениеСтатусовЭлектронныхПисем/Schedule.schedule create mode 100644 SSL/src/ScheduledJobs/ПолучениеСтатусовЭлектронныхПисем/ПолучениеСтатусовЭлектронныхПисем.mdo create mode 100644 SSL/src/ScheduledJobs/УстановкаПорядкаОтложенногоОбновленияВМоделиСервиса/Schedule.schedule create mode 100644 SSL/src/ScheduledJobs/УстановкаПорядкаОтложенногоОбновленияВМоделиСервиса/УстановкаПорядкаОтложенногоОбновленияВМоделиСервиса.mdo create mode 100644 SSL/src/SessionParameters/ОбновлениеСправочниковПользователей/ОбновлениеСправочниковПользователей.mdo create mode 100644 SSL/src/SessionParameters/ПраваДоступаКДатамЗапрета/ПраваДоступаКДатамЗапрета.mdo delete mode 100644 SSL/src/SessionParameters/ПравилаВыборочнойРегистрацииОбъектов/ПравилаВыборочнойРегистрацииОбъектов.mdo delete mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВызовОнлайнПоддержки/ВызовОнлайнПоддержки.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ОбменДанными/Subsystems/Регистрация/Регистрация.mdo create mode 100644 SSL/src/WebServices/Exchange_3_0_2_1/Exchange_3_0_2_1.mdo create mode 100644 SSL/src/WebServices/Exchange_3_0_2_1/Module.bsl delete mode 100644 SSL/src/XDTOPackages/EnterpriseData_1_11_7/Package.xdto delete mode 100644 SSL/src/XDTOPackages/EnterpriseData_1_12_1/Package.xdto delete mode 100644 SSL/src/XDTOPackages/EnterpriseData_1_15_3/Package.xdto create mode 100644 SSL/src/XDTOPackages/АдминистрированиеОбменаДаннымиУправление_3_0_1_1/Package.xdto create mode 100644 SSL/src/XDTOPackages/АдминистрированиеОбменаДаннымиУправление_3_0_1_1/АдминистрированиеОбменаДаннымиУправление_3_0_1_1.mdo diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Form.form b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Form.form index 12a48ddc2..e878fd75a 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Form.form +++ b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Form.form @@ -126,7 +126,6 @@ UsualGroup Vertical - Auto true true Auto @@ -249,7 +248,6 @@ UsualGroup Vertical - Auto true true Auto @@ -367,7 +365,6 @@ UsualGroup Vertical - Auto true true Auto @@ -396,7 +393,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -532,7 +528,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -561,7 +556,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -731,7 +725,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -893,7 +886,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1168,7 +1160,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1197,7 +1188,6 @@ UsualGroup Vertical - Auto true true auto @@ -1228,7 +1218,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Form.form b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Form.form index 52480be31..645b750a0 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Form.form +++ b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Form.form @@ -28,7 +28,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -165,7 +164,6 @@ UsualGroup Vertical - Auto true true Auto @@ -288,7 +286,6 @@ UsualGroup Vertical - Auto true true Auto @@ -405,7 +402,6 @@ UsualGroup Vertical - Auto true true Auto @@ -434,7 +430,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -570,7 +565,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -599,7 +593,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -774,7 +767,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1202,7 +1194,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1231,7 +1222,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1263,7 +1253,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Form.form b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Form.form index b43898f82..3fe74eb47 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Form.form +++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Form.form @@ -142,7 +142,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -303,7 +302,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -514,7 +512,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -543,7 +540,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -571,7 +567,6 @@ UsualGroup Vertical - Auto true true Auto @@ -693,7 +688,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -965,7 +959,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -994,7 +987,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -1022,7 +1014,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1142,7 +1133,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1173,7 +1163,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Form.form b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Form.form index 76bc97fd2..b280994db 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Form.form +++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Form.form @@ -166,7 +166,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -274,7 +273,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -306,7 +304,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/BusinessProcesses/Задание/ManagerModule.bsl b/SSL/src/BusinessProcesses/Задание/ManagerModule.bsl index 9c39d217e..20c89ac9d 100644 --- a/SSL/src/BusinessProcesses/Задание/ManagerModule.bsl +++ b/SSL/src/BusinessProcesses/Задание/ManagerModule.bsl @@ -42,13 +42,14 @@ // Вызывается при открытии формы выполнения задачи. // // Параметры: -// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя - задача. -// ТочкаМаршрутаБизнесПроцесса - ТочкаМаршрутаБизнесПроцессаСсылка.Задание - точка маршрута. +// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя - открываемая задача. +// ТочкаМаршрутаБизнесПроцесса - ТочкаМаршрутаБизнесПроцессаСсылка.Задание - текущая точка маршрута. // // Возвращаемое значение: -// Структура - структуру с описанием формы выполнения задачи. -// Ключ "ИмяФормы" содержит имя формы, передаваемое в метод контекста ОткрытьФорму(). -// Ключ "ПараметрыФормы" содержит параметры формы. +// Структура: +// * ПараметрыФормы - Структура: +// ** Ключ - ЗадачаСсылка.ЗадачаИсполнителя +// * ИмяФормы - Строка - имя формы, передаваемое в метод контекста ОткрытьФорму() // Функция ФормаВыполненияЗадачи(ЗадачаСсылка, ТочкаМаршрутаБизнесПроцесса) Экспорт diff --git a/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалюты_en/Form.form b/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалюты_en/Form.form index c12d68e13..4f162ddf5 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалюты_en/Form.form +++ b/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалюты_en/Form.form @@ -133,7 +133,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -275,7 +274,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -384,7 +382,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -507,7 +504,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true diff --git a/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалютыНаДругихЯзыках/Form.form b/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалютыНаДругихЯзыках/Form.form index bea48a229..0e727a7d7 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалютыНаДругихЯзыках/Form.form +++ b/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалютыНаДругихЯзыках/Form.form @@ -29,7 +29,6 @@ UsualGroup Vertical - Auto true true Auto @@ -184,7 +183,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form index 3ea479879..c00f37381 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl index 93d5334a4..3314cd9ac 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl @@ -107,9 +107,9 @@ &НаКлиенте Процедура ЗагрузитьКурсыВалют(Команда) - ИмяФормыЗагрузки = "Обработка.ЗагрузкаКурсовВалют.Форма"; ПараметрыФормы = Новый Структура("ОткрытиеИзСписка"); - ОткрытьФорму(ИмяФормыЗагрузки, ПараметрыФормы); + + РаботаСКурсамиВалютКлиент.ПоказатьЗагрузкуКурсовВалют(ПараметрыФормы); КонецПроцедуры diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form index b82c2a640..3eb0e1b53 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form @@ -167,7 +167,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -196,7 +195,6 @@ UsualGroup Vertical - Auto true true Auto @@ -568,7 +566,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -598,7 +595,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -627,7 +623,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -763,7 +758,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -791,7 +785,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/Валюты/ObjectModule.bsl b/SSL/src/Catalogs/Валюты/ObjectModule.bsl index e9556a9d1..29812952d 100644 --- a/SSL/src/Catalogs/Валюты/ObjectModule.bsl +++ b/SSL/src/Catalogs/Валюты/ObjectModule.bsl @@ -209,7 +209,7 @@ |ИЗ | Справочник.Валюты КАК Валюты |ГДЕ - | &ФормулаРасчетаКурса ПОДОБНО ""%"" + Валюты.Наименование + ""%"" + | &ФормулаРасчетаКурса ПОДОБНО ""%"" + Валюты.Наименование + ""%"" СПЕЦСИМВОЛ ""~"" | И Валюты.Наименование <> """""; Запрос = Новый Запрос(ТекстЗапроса); diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Form.form index 9e8334f2b..72b0b7687 100644 --- a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Form.form @@ -23,7 +23,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Form.form index 9cc26280e..9b2328dd6 100644 --- a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Form.form @@ -23,7 +23,6 @@ UsualGroup Vertical - Auto true true auto diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Form.form index d7d475f0c..a513cc69a 100644 --- a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Form.form @@ -106,7 +106,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Form.form index 4412839e3..37c8cbc3a 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Form.form +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Form.form @@ -194,6 +194,7 @@ Normal + None ДеревоПодсистемКоманднаяПанель 9 @@ -389,6 +390,34 @@ Auto InAdditionalSubmenu + + true + true + + true + + СтрокаПоиска + 99 + + СтрокаПоискаРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 100 + true + + ДеревоПодсистем + + true + + Left true diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Module.bsl index 4a8d3e54d..3abc06778 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Module.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Module.bsl @@ -159,7 +159,7 @@ ВхожденияПодсистем = ДанныеЗаполнения.ВхожденияПодсистем; - ДеревоИсточник = ВариантыОтчетовПовтИсп.ПодсистемыТекущегоПользователя(); + ДеревоИсточник = ВариантыОтчетовПовтИсп.ПодсистемыТекущегоПользователя().Дерево; ДеревоПриемник = РеквизитФормыВЗначение("ДеревоПодсистем", Тип("ДеревоЗначений")); ДеревоПриемник.Строки.Очистить(); diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form index 7dbc24962..510a3ef30 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form @@ -178,7 +178,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -210,7 +209,6 @@ UsualGroup Vertical - Auto true true Auto @@ -970,7 +968,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1792,7 +1789,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1980,10 +1976,19 @@ ГДЕ ВариантыОтчетовПереопределяемый.Отчет В (&ДоступныеОтчеты) И ВЫБОР - КОГДА НЕ &ЕстьОтборПоВариантам - ТОГДА НЕ ВариантыОтчетовПереопределяемый.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы) - ИНАЧЕ ВариантыОтчетовПереопределяемый.Ссылка В (&ВариантыПользователя) - КОНЕЦ + КОГДА &ЕстьОтборПоВариантам + ТОГДА ВариантыОтчетовПереопределяемый.Ссылка В (&ВариантыПользователя) + КОГДА НЕ ВариантыОтчетовПереопределяемый.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы) + ТОГДА ИСТИНА + ИНАЧЕ ВариантыОтчетовПереопределяемый.Ссылка В + (ВЫБРАТЬ + РодителиПереопределяемый.Родитель + ИЗ + Справочник.ВариантыОтчетов КАК РодителиПереопределяемый + ГДЕ + РодителиПереопределяемый.Отчет В (&ДоступныеОтчеты) + И НЕ РодителиПереопределяемый.Ссылка В (&ВариантыПользователя)) + КОНЕЦ Catalog.ВариантыОтчетов true true diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl index 67a6b83f1..a46ba27c4 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl @@ -17,7 +17,7 @@ ПараметрыКлиента = ВариантыОтчетов.ПараметрыКлиента(); ВключаяПодчиненные = Истина; - ДеревоЗначений = ВариантыОтчетовПовтИсп.ПодсистемыТекущегоПользователя().Скопировать(); + ДеревоЗначений = ВариантыОтчетовПовтИсп.ПодсистемыТекущегоПользователя().Дерево.Скопировать(); ДеревоПодсистемЗаполнитьПолноеПредставление(ДеревоЗначений.Строки); ЗначениеВРеквизитФормы(ДеревоЗначений, "ДеревоПодсистем"); @@ -178,9 +178,7 @@ ПодключитьОбработчикОжидания("ДеревоПодсистемОбработчикАктивизацииСтроки", 0.1, Истина); ИначеЕсли ИмяСобытия = ВариантыОтчетовКлиент.ИмяСобытияОбновленияВариантовОтчетовИзФайлов() Тогда - УстановитьОтборПоОбновленнымИзФайловОтчетов(Параметр); - КонецЕсли; КонецПроцедуры @@ -322,16 +320,15 @@ Возврат; КонецЕсли; - ОткрытьФорму( - "ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.СохранениеВариантаОтчетаВФайл", + ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.СохранениеВариантаОтчетаВФайл", Новый Структура("ВыбранныеВариантыОтчетов", ВыбранныеВариантыОтчетов), ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ОбновитьВариантОтчетаИзФайла(Команда) + ВыбранныеВариантыОтчетов = Элементы.Список.ВыделенныеСтроки; - Если ВыбранныеВариантыОтчетов.Количество() = 0 Тогда Возврат; КонецЕсли; @@ -339,17 +336,8 @@ СвойстваВариантаОтчета = ВариантыОтчетовКлиент.СвойстваВариантаОтчетаОснования(); СвойстваВариантаОтчета.Ссылка = ВыбранныеВариантыОтчетов[0]; СвойстваВариантаОтчета.ПредставлениеВарианта = Строка(ВыбранныеВариантыОтчетов[0]); - - ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла(); - ПараметрыЗагрузки.Диалог.Фильтр = НСтр("ru = 'Архив ZIP (*.zip)|*.zip'"); - ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор; - - Обработчик = Новый ОписаниеОповещения( - ВариантыОтчетовКлиент.ИмяСобытияОбновленияВариантовОтчетовИзФайлов(), - ВариантыОтчетовКлиент, - СвойстваВариантаОтчета); - - ФайловаяСистемаКлиент.ЗагрузитьФайлы(Обработчик, ПараметрыЗагрузки); + ВариантыОтчетовКлиент.ОбновитьВариантОтчетаИзФайлов(СвойстваВариантаОтчета, УникальныйИдентификатор); + КонецПроцедуры #КонецОбласти @@ -892,7 +880,7 @@ КонецФункции // Параметры: -// ОписаниеВариантовОтчетов - см. ВариантыОтчетов.СвойстваВариантовОтчетовИзФайлов +// ОписаниеВариантовОтчетов - см. ВариантыОтчетов.ОбновитьВариантыОтчетовИзФайлов // &НаКлиенте Процедура УстановитьОтборПоОбновленнымИзФайловОтчетов(ОписаниеВариантовОтчетов) @@ -999,10 +987,19 @@ |ГДЕ | ВариантыОтчетовПереопределяемый.Отчет В (&ДоступныеОтчеты) | И ВЫБОР - | КОГДА НЕ &ЕстьОтборПоВариантам - | ТОГДА НЕ ВариантыОтчетовПереопределяемый.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы) - | ИНАЧЕ ВариантыОтчетовПереопределяемый.Ссылка В (&ВариантыПользователя) - | КОНЕЦ"; + | КОГДА &ЕстьОтборПоВариантам + | ТОГДА ВариантыОтчетовПереопределяемый.Ссылка В (&ВариантыПользователя) + | КОГДА НЕ ВариантыОтчетовПереопределяемый.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы) + | ТОГДА ИСТИНА + | ИНАЧЕ ВариантыОтчетовПереопределяемый.Ссылка В + | (ВЫБРАТЬ + | РодителиПереопределяемый.Родитель + | ИЗ + | Справочник.ВариантыОтчетов КАК РодителиПереопределяемый + | ГДЕ + | РодителиПереопределяемый.Отчет В (&ДоступныеОтчеты) + | И НЕ РодителиПереопределяемый.Ссылка В (&ВариантыПользователя)) + | КОНЕЦ"; Возврат ТекстЗапроса; diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Form.form index 996ff395a..dc2ab58b6 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Form.form @@ -186,19 +186,19 @@ ru - Только автору + Автору - ТолькоДляАвтора + Автору ru - Указанным пользователям + Всем - УказаннымПользователям + Всем Vertical @@ -226,7 +226,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -238,7 +237,7 @@ 275 <key>ru</key> - <value>Пользователи варианта</value> + <value>Показать в панелях отчетов пользователей (начальная настройка)</value> true true @@ -248,7 +247,7 @@ ПользователиВарианта - None + Top Add Change Copy @@ -490,6 +489,34 @@ Auto InCommandBarAndInAdditionalSubmenu + + true + true + + true + + СтрокаПоиска + 309 + + СтрокаПоискаРасширеннаяПодсказка + 311 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 310 + true + + ПользователиВарианта + + true + + Left @@ -879,6 +906,34 @@ ДеревоПодсистемКоманднаяПанель 82 + + true + true + + true + + СтрокаПоискаРазделов + 312 + + СтрокаПоискаРазделовРасширеннаяПодсказка + 314 + Label + true + true + + Left + + + + СтрокаПоискаРазделовКонтекстноеМеню + 313 + true + + ДеревоПодсистем + + true + + Left @@ -1608,7 +1663,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl index d671ab001..7eda3dc6b 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl @@ -18,7 +18,7 @@ ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(Объект, ЭтотОбъект); - Доступен = ?(Объект.ТолькоДляАвтора, "ТолькоДляАвтора", "УказаннымПользователям"); + Доступен = ?(Объект.ТолькоДляАвтора, "Автору", "Всем"); ПолныеПраваНаВарианты = ВариантыОтчетов.ПолныеПраваНаВарианты(); ПравоНаЭтотВариант = ПолныеПраваНаВарианты Или Объект.Автор = Пользователи.АвторизованныйПользователь(); @@ -33,9 +33,8 @@ Если Не Объект.Пользовательский Тогда Элементы.Наименование.ТолькоПросмотр = Истина; - Элементы.Доступен.ТолькоПросмотр = Истина; - Элементы.Автор.ТолькоПросмотр = Истина; Элементы.Автор.АвтоОтметкаНезаполненного = Ложь; + Элементы.Доступен.Видимость = Ложь; КонецЕсли; ЭтоВнешний = (Объект.ТипОтчета = Перечисления.ТипыОтчетов.Внешний); @@ -44,6 +43,8 @@ КонецЕсли; Элементы.Доступен.ТолькоПросмотр = Не ПолныеПраваНаВарианты; + Элементы.УведомитьПользователей.Видимость = ПолныеПраваНаВарианты; + Элементы.Пользователи.Видимость = ПолныеПраваНаВарианты Или Доступен = "Всем"; Элементы.Автор.ТолькоПросмотр = Не ПолныеПраваНаВарианты; Элементы.ТехническаяИнформация.Видимость = ПолныеПраваНаВарианты; @@ -205,7 +206,7 @@ &НаКлиенте Процедура ДоступенПриИзменении(Элемент) - Объект.ТолькоДляАвтора = (Доступен = "ТолькоДляАвтора"); + Объект.ТолькоДляАвтора = (Доступен = "Автору"); ВариантыОтчетовКлиент.ПроверитьПользователейВариантаОтчета(ЭтотОбъект); ВариантыОтчетовКлиент.ОформитьПользователейВариантаОтчета(ЭтотОбъект, Ложь); diff --git a/SSL/src/Catalogs/ВариантыОтчетов/ManagerModule.bsl b/SSL/src/Catalogs/ВариантыОтчетов/ManagerModule.bsl index bd4f794d2..5fa3dc751 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/ManagerModule.bsl @@ -75,10 +75,6 @@ Если Не ЗначениеЗаполнено(СсылкаВарианта) Тогда ВызватьИсключение НСтр("ru = 'Новый вариант отчета можно создать только из формы отчета'"); КонецЕсли; - ПоказатьКарточку = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ПоказатьКарточку"); - Если ПоказатьКарточку = Истина Тогда - Возврат; - КонецЕсли; ПараметрыОткрытия = ВариантыОтчетов.ПараметрыОткрытия(СсылкаВарианта); @@ -208,7 +204,7 @@ | |Техническая информация о проблеме: %2'"); Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонКомментария, Вариант.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ШаблонКомментария, Вариант.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации( ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, diff --git a/SSL/src/Catalogs/ВариантыОтчетов/ObjectModule.bsl b/SSL/src/Catalogs/ВариантыОтчетов/ObjectModule.bsl index 0432c1ea5..c9499d0e1 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/ObjectModule.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/ObjectModule.bsl @@ -68,7 +68,7 @@ НаименованиеЗанято = ВариантыОтчетов.НаименованиеЗанято(Отчет, Ссылка, Наименование); КлючВариантаЗанят = ВариантыОтчетов.КлючВариантаЗанят(Отчет, Ссылка, КлючВарианта); Если НаименованиеЗанято ИЛИ КлючВариантаЗанят Тогда - ТекстОшибки = НСтр("ru = 'Ошибка снятия пометки удаления варианта отчета:'"); + ТекстОшибки = НСтр("ru = 'Не удалось снять пометку удаления варианта отчета:'"); Если НаименованиеЗанято Тогда ТекстОшибки = ТекстОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Наименование ""%1"" уже занято другим вариантом этого отчета.'"), @@ -91,6 +91,10 @@ ПроверитьРазмещение(); ЗаполнитьПоляДляПоиска(); + Если Не Пользовательский И ТолькоДляАвтора Тогда + ТолькоДляАвтора = Ложь; + КонецЕсли; + КонецПроцедуры Процедура ПриЗаписи(Отказ) @@ -242,7 +246,7 @@ ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось проиндексировать схему варианта ""%1"" отчета ""%2"":'"), КлючВарианта, Строка(Отчет)); - ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ТекстОшибки + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ВариантыОтчетов.ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, Ссылка); КонецПопытки; diff --git a/SSL/src/Catalogs/ВерсииРасширений/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВерсииРасширений/Forms/ФормаСписка/Form.form index 491ff6332..9315a76ff 100644 --- a/SSL/src/Catalogs/ВерсииРасширений/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВерсииРасширений/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Catalogs/ВерсииРасширений/ManagerModule.bsl b/SSL/src/Catalogs/ВерсииРасширений/ManagerModule.bsl index 66c5af360..2ce4f4d94 100644 --- a/SSL/src/Catalogs/ВерсииРасширений/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВерсииРасширений/ManagerModule.bsl @@ -471,6 +471,66 @@ КонецПроцедуры +// Для общих форм Расширения, УстановленныеИсправления. +// +Процедура ПереключитьИспользованиеРасширения(ИдентификаторРасширения, ТекущееИспользование) Экспорт + + Расширение = НайтиРасширение(ИдентификаторРасширения); + + Если Расширение = Неопределено + Или Расширение.Активно = ТекущееИспользование Тогда + + Возврат; + КонецЕсли; + + Расширение.Активно = ТекущееИспользование; + ОтключитьПредупрежденияБезопасности(Расширение); + ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(Расширение); + Попытка + Расширение.Записать(); + Исключение + ВызватьИсключение; + КонецПопытки; + + Попытка + РегистрыСведений.ПараметрыРаботыВерсийРасширений.ОбновитьПараметрыРаботыРасширений(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + Если Расширение.Активно Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Возникла непредвиденная ситуация при подготовке расширений к работе (после включения расширения): + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + Иначе + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Возникла непредвиденная ситуация при подготовке расширений к работе (после отключения расширения): + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + КонецЕсли; + КонецПопытки; + + Если ЗначениеЗаполнено(ТекстОшибки) Тогда + ИнформацияОбОшибкеВосстановления = Неопределено; + Попытка + Расширение.Активно = Не Расширение.Активно; + Расширение.Записать(); + Исключение + ИнформацияОбОшибкеВосстановления = ИнформацияОбОшибке(); + ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Возникла непредвиденная ситуация при попытке отменить изменение флажка подключения расширения: + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибкеВосстановления)); + КонецПопытки; + Если ИнформацияОбОшибкеВосстановления = Неопределено Тогда + ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + + НСтр("ru = 'Отменено изменение флажка подключения расширения.'"); + КонецЕсли; + КонецЕсли; + + Если ЗначениеЗаполнено(ТекстОшибки) Тогда + ВызватьИсключение ТекстОшибки; + КонецЕсли; + +КонецПроцедуры + // Для общих форм Расширения, УстановленныеИсправления. // // Возвращаемое значение: @@ -547,7 +607,7 @@ НСтр("ru = 'Не удалось удалить расширение ""%1"" по причине: |%2'"), УдаляемоеРасширение, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; Если Не ЗначениеЗаполнено(ТекстОшибки) Тогда @@ -561,7 +621,7 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'После удаления, при обработке случая удаления всех расширений, произошла ошибка: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; КонецЕсли; @@ -572,7 +632,7 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'После удаления, при подготовке оставшихся расширений к работе, произошла ошибка: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; КонецЕсли; @@ -592,7 +652,7 @@ ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'При попытке восстановить удаленные расширения произошла еще одна ошибка: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибкеВосстановления)); + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибкеВосстановления)); КонецПопытки; Если ВосстановлениеВыполнялось И ИнформацияОбОшибкеВосстановления = Неопределено Тогда diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Form.form b/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Form.form index 28c45cef1..23cbfd181 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Form.form +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Form.form @@ -1060,6 +1060,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 124 + + СтрокаПоискаРасширеннаяПодсказка + 126 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 125 + true + + Список + + true + + Left diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Form.form index bac2cb0c1..d6b2c460f 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Form.form @@ -29,7 +29,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -508,6 +507,38 @@ Auto InAdditionalSubmenu + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 94 + + СтрокаПоискаРасширеннаяПодсказка + 96 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 95 + true + + Список + + true + + true true diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Form.form index 375d7726d..a49b3e088 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -222,6 +221,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 78 + + СтрокаПоискаРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 79 + true + + Список + + true + + true true diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбора/Form.form index 4cdbcf029..312f00123 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбора/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -37,6 +36,10 @@ Список 3 + + <key>ru</key> + <value>Список</value> + true true @@ -84,6 +87,45 @@ true + + Ссылка + 19 + true + true + + + Список.Ref + + + СсылкаРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 20 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + None СписокКоманднаяПанель @@ -277,6 +319,9 @@ Список.PredefinedDataName + + Список.Ref + Список.Скрыть diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Form.form b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Form.form index 553eb693b..3081185bc 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Form.form +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Form.form index 50e200c86..466935c58 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Form.form @@ -1,5 +1,5 @@ - + ГруппаПользовательскихНастроек 42 @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto true true Auto @@ -376,68 +375,224 @@ ВЫБРАТЬ ВЫБОР - КОГДА СправочникВидыКонтактнойИнформации.ЭтоГруппа + КОГДА СправочникВидыКонтактнойИнформацииПереопределяемый.ЭтоГруппа ТОГДА ВЫБОР - КОГДА СправочникВидыКонтактнойИнформации.ПометкаУдаления - ТОГДА 1 - КОГДА СправочникВидыКонтактнойИнформации.Предопределенный - ТОГДА 2 - ИНАЧЕ 0 - КОНЕЦ - КОГДА СправочникВидыКонтактнойИнформации.ПометкаУдаления + КОГДА СправочникВидыКонтактнойИнформацииПереопределяемый.ПометкаУдаления + ТОГДА 1 + КОГДА СправочникВидыКонтактнойИнформацииПереопределяемый.Предопределенный + ТОГДА 2 + ИНАЧЕ 0 + КОНЕЦ + КОГДА СправочникВидыКонтактнойИнформацииПереопределяемый.ПометкаУдаления ТОГДА 4 - КОГДА СправочникВидыКонтактнойИнформации.Предопределенный - ТОГДА ВЫБОР СправочникВидыКонтактнойИнформации.Тип - КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон) - ТОГДА 14 - КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты) - ТОГДА 15 - КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.ВебСтраница) - ТОГДА 16 - КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Факс) - ТОГДА 17 - КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Другое) - ТОГДА 18 - КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес) - ТОГДА 19 - КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Skype) - ТОГДА 21 - ИНАЧЕ 3 - КОНЕЦ - ИНАЧЕ ВЫБОР СправочникВидыКонтактнойИнформации.Тип + КОГДА СправочникВидыКонтактнойИнформацииПереопределяемый.Предопределенный + ТОГДА ВЫБОР СправочникВидыКонтактнойИнформацииПереопределяемый.Тип КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон) - ТОГДА 7 + ТОГДА 14 КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты) - ТОГДА 8 + ТОГДА 15 КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.ВебСтраница) - ТОГДА 9 + ТОГДА 16 КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Факс) - ТОГДА 10 + ТОГДА 17 КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Другое) - ТОГДА 11 + ТОГДА 18 КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес) - ТОГДА 12 + ТОГДА 19 КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Skype) - ТОГДА 20 + ТОГДА 21 ИНАЧЕ 3 КОНЕЦ + ИНАЧЕ ВЫБОР СправочникВидыКонтактнойИнформацииПереопределяемый.Тип + КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон) + ТОГДА 7 + КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты) + ТОГДА 8 + КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.ВебСтраница) + ТОГДА 9 + КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Факс) + ТОГДА 10 + КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Другое) + ТОГДА 11 + КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес) + ТОГДА 12 + КОГДА ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Skype) + ТОГДА 20 + ИНАЧЕ 3 + КОНЕЦ КОНЕЦ КАК ИндексПиктограммы, - СправочникВидыКонтактнойИнформации.Ссылка КАК Ссылка, - СправочникВидыКонтактнойИнформации.Наименование КАК Наименование, - СправочникВидыКонтактнойИнформации.РеквизитДопУпорядочивания КАК РеквизитДопУпорядочивания, - СправочникВидыКонтактнойИнформации.Используется КАК Используется, - СправочникВидыКонтактнойИнформации.ЭтоГруппа КАК ЭтоГруппа + СправочникВидыКонтактнойИнформацииПереопределяемый.Ссылка КАК Ссылка, + СправочникВидыКонтактнойИнформацииПереопределяемый.Наименование КАК Наименование, + СправочникВидыКонтактнойИнформацииПереопределяемый.РеквизитДопУпорядочивания КАК РеквизитДопУпорядочивания, + СправочникВидыКонтактнойИнформацииПереопределяемый.Используется КАК Используется, + СправочникВидыКонтактнойИнформацииПереопределяемый.ЭтоГруппа КАК ЭтоГруппа ИЗ - Справочник.ВидыКонтактнойИнформации КАК СправочникВидыКонтактнойИнформации + Справочник.ВидыКонтактнойИнформации КАК СправочникВидыКонтактнойИнформацииПереопределяемый ГДЕ - СправочникВидыКонтактнойИнформации.Используется - И ЕСТЬNULL(СправочникВидыКонтактнойИнформации.Родитель.Используется, ИСТИНА) + СправочникВидыКонтактнойИнформацииПереопределяемый.Используется + И ЕСТЬNULL(СправочникВидыКонтактнойИнформацииПереопределяемый.Родитель.Используется, ИСТИНА) Catalog.ВидыКонтактнойИнформации true true true true true + + ИндексПиктограммы + ИндексПиктограммы + + <localValue> + <content> + <key>ru</key> + <value>Индекс пиктограммы</value> + </content> + </localValue> + + + + Ссылка + Ссылка + + + Наименование + Наименование + + + РеквизитДопУпорядочивания + РеквизитДопУпорядочивания + + + Используется + Используется + + + ЭтоГруппа + ЭтоГруппа + + + ВводитьНомерПоМаске + ВводитьНомерПоМаске + + + ВключатьСтрануВПредставление + ВключатьСтрануВПредставление + + + ВидПоляДругое + ВидПоляДругое + + + ВидРедактирования + ВидРедактирования + + + ЗапретитьРедактированиеПользователем + ЗапретитьРедактированиеПользователем + + + ИдентификаторДляФормул + ИдентификаторДляФормул + + + ИмяГруппы + ИмяГруппы + + + ИмяПредопределенногоВида + ИмяПредопределенногоВида + + + ИсправлятьУстаревшиеАдреса + ИсправлятьУстаревшиеАдреса + + + МаскаНомераТелефона + МаскаНомераТелефона + + + МеждународныйФорматАдреса + МеждународныйФорматАдреса + + + МожноИзменятьСпособРедактирования + МожноИзменятьСпособРедактирования + + + ОбязательноеЗаполнение + ОбязательноеЗаполнение + + + ПроверятьКорректность + ПроверятьКорректность + + + УдалитьПроверятьПоФИАС + УдалитьПроверятьПоФИАС + + + РазрешитьВводНесколькихЗначений + РазрешитьВводНесколькихЗначений + + + СкрыватьНеактуальныеАдреса + СкрыватьНеактуальныеАдреса + + + ТелефонCДобавочнымНомером + ТелефонCДобавочнымНомером + + + Тип + Тип + + + ТолькоНациональныйАдрес + ТолькоНациональныйАдрес + + + УдалитьРедактированиеТолькоВДиалоге + УдалитьРедактированиеТолькоВДиалоге + + + УказыватьОКТМО + УказыватьОКТМО + + + ХранитьИсториюИзменений + ХранитьИсториюИзменений + + + ОтображатьВсегда + ОтображатьВсегда + + + НаименованиеЯзык1 + НаименованиеЯзык1 + + + НаименованиеЯзык2 + НаименованиеЯзык2 + + + Представления + Представления + + + Предопределенный + Предопределенный + + + ИмяПредопределенныхДанных + ИмяПредопределенныхДанных + + + ПометкаУдаления + ПометкаУдаления + + + Родитель + Родитель + @@ -462,6 +617,12 @@ Auto Auto + + ВладелецКонтактнойИнформации + + AnyRef + + diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl index c4e06bc42..b44d2472e 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl @@ -13,6 +13,10 @@ УстановитьУсловноеОформление(); + Если Параметры.ВладелецКонтактнойИнформации <> Неопределено Тогда + УстановитьОтборПоВладельцуКонтактнойИнформации(Параметры.ВладелецКонтактнойИнформации); + КонецЕсли; + // СтандартныеПодсистемы.ПодключаемыеКоманды ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект); // Конец СтандартныеПодсистемы.ПодключаемыеКоманды @@ -20,7 +24,9 @@ СуффиксТекущегоЯзыка = ОбщегоНазначения.СуффиксЯзыкаТекущегоПользователя(); Если СуффиксТекущегоЯзыка = Неопределено Тогда - Список.ТекстЗапроса = "ВЫБРАТЬ + СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка(); + + СвойстваСписка.ТекстЗапроса = "ВЫБРАТЬ | ВЫБОР | КОГДА СправочникВидыКонтактнойИнформации.ЭтоГруппа | ТОГДА ВЫБОР @@ -87,6 +93,8 @@ | СправочникВидыКонтактнойИнформации.Используется | И ЕСТЬNULL(СправочникВидыКонтактнойИнформации.Родитель.Используется, ИСТИНА)"; + ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.Список, СвойстваСписка); + Список.Параметры.УстановитьЗначениеПараметра("ЭтоОсновнойЯзык", ОбщегоНазначения.ЭтоОсновнойЯзык()); Список.Параметры.УстановитьЗначениеПараметра("КодЯзыка", ТекущийЯзык().КодЯзыка); @@ -190,6 +198,28 @@ КонецПроцедуры +&НаСервере +Процедура УстановитьОтборПоВладельцуКонтактнойИнформации(ВладелецКонтактнойИнформации) + + ТипСсылки = ТипЗнч(ВладелецКонтактнойИнформации); + МетаданныеСправочника = Метаданные.НайтиПоТипу(ТипСсылки); + Если МетаданныеСправочника = Неопределено Тогда + Возврат; + КонецЕсли; + ГруппаВидовКИ = УправлениеКонтактнойИнформациейСлужебныйПовтИсп.ГруппаВидаКонтактнойИнформацииПоИмениОбъекта( + МетаданныеСправочника.ПолноеИмя()); + + ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Родитель"); + ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбора.Использование = Истина; + ЭлементОтбора.ПравоеЗначение = ГруппаВидовКИ; + + Элементы.Список.Отображение = ОтображениеТаблицы.Список; + Заголовок = ?(ГруппаВидовКИ = Неопределено, "", ГруппаВидовКИ.Наименование); + +КонецПроцедуры + &НаСервереБезКонтекста Функция ИмяФормыСписка(ВидКонтактнойИнформацииСсылка) diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form index 441d04f44..81dafe3b7 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form @@ -81,7 +81,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -198,7 +197,6 @@ UsualGroup Vertical - Auto true true Auto @@ -211,6 +209,41 @@ ГруппаТипОбщиеДляВсех 64 + + ОтображатьВсегда + 189 + true + true + + true + + + Объект.ОтображатьВсегда + + Right + Button + + ОтображатьВсегдаРасширеннаяПодсказка + 191 + Label + true + true + + Left + + + + ОтображатьВсегдаКонтекстноеМеню + 190 + true + + CheckBoxField + Enter + true + Left + true + + ОбязательноеЗаполнение 18 @@ -223,6 +256,10 @@ Объект.ОбязательноеЗаполнение Right + + OnChange + ОбязательноеЗаполнениеПриИзменении + ОбязательноеЗаполнениеExtendedTooltip 92 @@ -420,7 +457,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -491,7 +527,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -715,6 +750,10 @@ Объект.ТелефонCДобавочнымНомером Right + + OnChange + ТелефонCДобавочнымНомеромПриИзменении + ТелефонCДобавочнымНомеромРасширеннаяПодсказка 136 @@ -791,6 +830,10 @@ Объект.ВводитьНомерПоМаске Right + + OnChange + МаскаПриВводеНомераТелефонаПриИзменении + МаскаПриВводеНомераТелефонаРасширеннаяПодсказка 180 @@ -865,16 +908,14 @@ 183 <key>ru</key> - <value><font Arial><fontsize 8><color #333333><bgcolor #FFFFFF>В строке маски допустимо использование следующих специальных символов:</></></></> -<font Arial><fontsize 8><color #333333><bgcolor #FFFFFF>! - любой введенный символ преобразуется в верхний регистр;</></></></> -<font Arial><fontsize 8><color #333333><bgcolor #FFFFFF>9 - допустимо ввести произвольный символ цифры;</></></></> -<font Arial><fontsize 8><color #333333><bgcolor #FFFFFF># - допустимо ввести произвольный символ цифры или - (знак минус) или + (знак плюс) или пробел;</></></></> -<font Arial><fontsize 8><color #333333><bgcolor #FFFFFF>N - допустимо ввести любые алфавитно-цифровые символы (буквы или цифры);</></></></> -<font Arial><fontsize 8><color #333333><bgcolor #FFFFFF>U - допустимо ввести любые алфавитно-цифровые символы (буквы или цифры) и любой введенный символ преобразуется в верхний регистр;</></></></> -<font Arial><fontsize 8><color #333333><bgcolor #FFFFFF>X (латинского алфавита) - допустимо ввести произвольный символ;</></></></> -<font Arial><fontsize 8><color #333333><bgcolor #FFFFFF>^ - недопустимо вводить этот символ интерактивно пользователем, он может устанавливаться только из языка;</></></></> -<font Arial><fontsize 8><color #333333><bgcolor #FFFFFF>@ – допустимо ввести любые алфавитно-цифровые символы (буквы или цифры) в верхнем регистре или пробел.</></></></> -</value> + <value><font Arial><fontsize 8><bgcolor #ffffff><color #333333>В строке маски допустимо использование следующих специальных символов:</></></></> +<font Arial><fontsize 8><bgcolor #ffffff><color #333333>! - любой введенный символ преобразуется в верхний регистр;</></></></> +<font Arial><fontsize 8><bgcolor #ffffff><color #333333>9 - допустимо ввести произвольный символ цифры;</></></></> +<font Arial><fontsize 8><bgcolor #ffffff><color #333333># - допустимо ввести произвольный символ цифры или - (знак минус) или + (знак плюс) или пробел;</></></></> +<font Arial><fontsize 8><bgcolor #ffffff><color #333333>N - допустимо ввести любой алфавитно-цифровой символ (буква или цифра);</></></></> +<font Arial><fontsize 8><bgcolor #ffffff><color #333333>U - допустимо ввести любой алфавитно-цифровой символ (буква или цифра) и любой введенный символ преобразуется в верхний регистр;</></></></> +<font Arial><fontsize 8><bgcolor #ffffff><color #333333>X (латинского алфавита) - допустимо ввести произвольный символ;</></></></> +<font Arial><fontsize 8><bgcolor #ffffff><color #333333>@ – допустимо ввести любой алфавитно-цифровой символ (буква или цифра) в верхнем регистре или пробел.</></></></></value> true Label @@ -931,7 +972,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1224,7 +1264,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1254,7 +1293,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1275,6 +1313,7 @@ Объект.ИдентификаторДляФормул + 2 ИдентификаторДляФормулРасширеннаяПодсказка 175 @@ -1354,7 +1393,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Help/ru.html index 1f5cdf84f..0ba59698d 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Help/ru.html @@ -13,7 +13,7 @@
Адрес электронной почты - поле с таким видом контактной информации предназначено для хранения адреса электронной почты. Реквизит используется при отправке электронных писем из программы.
  • -
    Веб-страница - поле с таким видом контактной информации предназначено для хранения адресов веб страниц. Позволяет прикрепить гиперссылки на интернет-страницы, после этого ссылки будут храниться в базе с возможностью перехода по ним.
    +
    Веб-страница - поле с таким видом контактной информации предназначено для хранения адресов веб-страниц. Позволяет прикрепить гиперссылки на интернет-страницы, после этого ссылки будут храниться в базе с возможностью перехода по ним.
  • Факс - поле с таким видом контактной информации предназначено для хранения номеров факсов в виде произвольной строки, или в соответствии с шаблоном ввода номера факса. Реквизит используется в печатных формах документов.
    @@ -32,8 +32,9 @@
  • Выберите Группу, если она не введена по умолчанию. Группа соответствует документу или списку программы, в который добавляется новое поле контактной информации.
  • Поле Идентификатор для формул заполняется автоматически по специальным правилам. Не рекомендуется его изменять. Если автоматического заполнения не произошло, можно нажать кнопку  Заполнить. Данный реквизит будет использоваться для построения и выполнения формул пользователями с разными языками интерфейса.
  • Настройки полей контактной информации

    -
    • -
      Включите флажок Обязательное заполнение, для того чтобы программа проверяла заполнение поля контактной информации при вводе документов или списков. Сохранение данных без заполнения этого поля будет невозможно.
      +
      • Включите флажок Отображать всегда, для того чтобы вид контактной информации всегда отображался и предлагался к заполнению в карточке владельца.
      • +
      • +
        Включите флажок Обязательное заполнение, для того чтобы программа проверяла заполнение поля контактной информации при вводе документов или списков. Сохранение данных без заполнения этого поля будет невозможно. Если включен флажок Обязательное заполнение, то  Отображать всегда включится автоматически. 
      • Настройка Редактировать используется для типов контактной информации Адрес, Телефон, Факс. Такая настройка позволяет выбрать способ ввода этих видов контактной информации:
        • В диалоге - позволяет ограничить ввод нового и редактирование существующего адреса, телефона или факса шаблоном ввода, а также выбором адреса из адресного классификатора. При выбранном значении предусмотрена возможность ввести адрес в свободной форме. Это может понадобиться в исключительных случаях, например, если данные адреса в каких-либо документах приводятся с ошибкой, но для печати необходимо их проставить. При этом такой адрес будет храниться в программе с пометкой, что он введен в свободной форме, и использоваться с ограничениями. После уточнения адрес можно будет исправить, заполнив по шаблону.
        • @@ -55,7 +56,7 @@
        • Автоматически исправлять устаревшие адреса - можно включить автоматическую проверку и исправление адресов. В этом случае регламентное задание 1 раз в неделю проверяет и исправляет адреса, ставшие устаревшими.

      Особенности настройки поля Телефон и факс

      • Для того чтобы использовать Телефон с добавочным номером, включите соответствующий флажок. Для некоторых типов телефонов (например, мобильный телефон) не предусмотрено добавочных номеров.
      -
      • Включите флажок Вводить номер по маске, при этом можно выбрать маску из списка, при необходимости поправить ее. Маска используется только при вводе новых номеров телефонов.
      • +
        • Включите флажок Вводить номер по маске, при этом можно выбрать маску из списка, при необходимости поправить ее. Маска используется только при вводе новых номеров телефонов. Использование добавочного номера при этом становится невозможным. 
        • В строке маски допустимо использование следующих специальных символов:
          • ! - любой введенный символ преобразуется в верхний регистр;
          • 9 - допустимо ввести произвольный символ цифры;
          • @@ -63,7 +64,6 @@
          • N - допустимо ввести любые алфавитно-цифровые символы (буквы или цифры) 
          • U - допустимо ввести любые алфавитно-цифровые символы (буквы или цифры) и любой введенный символ преобразуется в верхний регистр;
          • X (латинского алфавита) - допустимо ввести произвольный символ;
          • -
          • ^ - недопустимо вводить этот символ интерактивно пользователем, он может устанавливаться только из языка;
          • @ - допустимо ввести любые алфавитно-цифровые символы (буквы или цифры) в верхнем регистре или пробел.
        • Например, при маске "+7(999)999-99-99" текст "9001234567" преобразуется в "+7(900)123-45-67".
        • Для того чтобы использовать в маске один из специальных символов, нужно использовать перед ним символ "\".
        • Допускается указание нескольких масок в одном параметре. Маски разделяются символом ";". В этом случае использоваться будет та маска, к которой подходит введенный текст.

        Особенности настройки поля Адрес электронной почты

        diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl index eb4e9f815..b9a052f8e 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl @@ -35,7 +35,9 @@ СсылкаРодителя = Объект.Родитель; Элементы.ХранитьИсториюИзменений.Доступность = Объект.ВидРедактирования = "Диалог"; - Элементы.РазрешитьВводНесколькихЗначений.Доступность = НЕ Объект.ХранитьИсториюИзменений; + Элементы.РазрешитьВводНесколькихЗначений.Доступность = НЕ Объект.ХранитьИсториюИзменений; + Элементы.ОтображатьВсегда.Доступность = НЕ Объект.ОбязательноеЗаполнение; + ОбновитьДоступностьЭлементовТелефонаФакса(ЭтотОбъект); Если Не Объект.МожноИзменятьСпособРедактирования Тогда Элементы.ВидРедактирования.Доступность = Ложь; @@ -78,8 +80,12 @@ Элементы.МаскаПриВводеНомераТелефона.Доступность = Ложь; КонецЕсли; - ДоступныДополнительныеНастройкиАдреса = (Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") <> Неопределено - И Метаданные.Обработки["РасширенныйВводКонтактнойИнформации"].Формы.Найти("НастройкиАдреса") <> Неопределено); + Если Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") <> Неопределено Тогда + МодульРасширенныйВводКонтактнойИнформации = ОбщегоНазначения.ОбщийМодуль("Обработки.РасширенныйВводКонтактнойИнформации"); + ДоступныДополнительныеНастройкиАдреса = МодульРасширенныйВводКонтактнойИнформации.ДоступныДополнительныеНастройкиАдреса() + Иначе + ДоступныДополнительныеНастройкиАдреса = Ложь; + КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); @@ -128,7 +134,13 @@ КонецПроцедуры &НаКлиенте -Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) +Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) + + Если Объект.ТелефонCДобавочнымНомером И Объект.ВводитьНомерПоМаске Тогда + ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр( + "ru = 'Нельзя вводить номер телефона с добавочным номером при установленной настройке ""Вводить номер по маске""'"), + , "ТелефонCДобавочнымНомером", "Объект", Отказ); + КонецЕсли; Если НЕ ПараметрыЗаписи.Свойство("КогдаИдентификаторДляФормулУжеИспользуется") И ЗначениеЗаполнено(Объект.ИдентификаторДляФормул) Тогда @@ -245,19 +257,31 @@ КонецПроцедуры +&НаКлиенте +Процедура ОбязательноеЗаполнениеПриИзменении(Элемент) + + Если Объект.ОбязательноеЗаполнение Тогда + Объект.ОтображатьВсегда = Истина; + Элементы.ОтображатьВсегда.Доступность = Ложь; + Иначе + Элементы.ОтображатьВсегда.Доступность = Истина; + КонецЕсли; + +КонецПроцедуры + &НаКлиенте Процедура ВидРедактированияПриИзменении(Элемент) Если Объект.ВидРедактирования = "Диалог" Тогда Элементы.ХранитьИсториюИзменений.Доступность = Истина; Объект.ВводитьНомерПоМаске = Ложь; - Элементы.МаскаПриВводеНомераТелефона.Доступность = Ложь; Иначе Элементы.ХранитьИсториюИзменений.Доступность = Ложь; Объект.ХранитьИсториюИзменений = Ложь; - Элементы.МаскаПриВводеНомераТелефона.Доступность = Истина; КонецЕсли; + ОбновитьДоступностьЭлементовТелефонаФакса(ЭтотОбъект); + Элементы.РазрешитьВводНесколькихЗначений.Доступность = НЕ Объект.ХранитьИсториюИзменений; КонецПроцедуры @@ -294,6 +318,20 @@ КонецПроцедуры +&НаКлиенте +Процедура ТелефонCДобавочнымНомеромПриИзменении(Элемент) + + ОбновитьДоступностьЭлементовТелефонаФакса(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура МаскаПриВводеНомераТелефонаПриИзменении(Элемент) + + ОбновитьДоступностьЭлементовТелефонаФакса(ЭтотОбъект); + +КонецПроцедуры + &НаКлиенте Процедура Подключаемый_Открытие(Элемент, СтандартнаяОбработка) @@ -447,6 +485,16 @@ КонецЕсли; КонецПроцедуры +&НаКлиентеНаСервереБезКонтекста +Процедура ОбновитьДоступностьЭлементовТелефонаФакса(Форма) + + Форма.Элементы.ШаблонМаскиНомераТелефона.Доступность = Форма.Объект.ВводитьНомерПоМаске; + Форма.Элементы.ШаблонМаскиНомераТелефона.АвтоОтметкаНезаполненного = Форма.Объект.ВводитьНомерПоМаске; + Форма.Элементы.МаскаПриВводеНомераТелефона.Доступность = (НЕ Форма.Объект.ТелефонCДобавочнымНомером И НЕ Форма.Объект.ВидРедактирования = "Диалог") ИЛИ Форма.Объект.ВводитьНомерПоМаске; + Форма.Элементы.ТелефонCДобавочнымНомером.Доступность = НЕ Форма.Объект.ВводитьНомерПоМаске ИЛИ Форма.Объект.ТелефонCДобавочнымНомером; + +КонецПроцедуры + &НаСервере Процедура ОбновитьПредлагаемоеЗначениеИдентификатора() @@ -540,7 +588,6 @@ КонецФункции - &НаСервереБезКонтекста Функция ИдентификаторДляФормулУжеИспользуется(Знач ИдентификаторДляФормул, Знач ТекущийВидКонтактнойИнформации, Знач Родитель) diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl index 9f985f09c..cb9bd92dd 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl @@ -206,6 +206,7 @@ Элемент.ВидРедактирования = "ПолеВвода"; Элемент.Используется = Истина; Элемент.РеквизитДопУпорядочивания = 2; + Элемент.ОтображатьВсегда = Истина; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); МодульМультиязычностьСервер.ЗаполнитьМультиязычныйРеквизит(Элемент, "Наименование", @@ -226,6 +227,7 @@ Элемент.Используется = Истина; Элемент.ВидРедактирования = "ПолеВводаИДиалог"; Элемент.РеквизитДопУпорядочивания = 1; + Элемент.ОтображатьВсегда = Истина; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); МодульМультиязычностьСервер.ЗаполнитьМультиязычныйРеквизит(Элемент, "Наименование", @@ -398,13 +400,13 @@ |ИЗ | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации |ГДЕ - | ВидыКонтактнойИнформации.ИдентификаторДляФормул ПОДОБНО &ИдентификаторДляФормулПодобие + | ВидыКонтактнойИнформации.ИдентификаторДляФормул ПОДОБНО &ИдентификаторДляФормулПодобие СПЕЦСИМВОЛ ""~"" | И ВидыКонтактнойИнформации.Ссылка <> &СсылкаНаТекущийОбъект | И ВидыКонтактнойИнформации.Ссылка В ИЕРАРХИИ (&РодительВерхнегоУровня)"; Запрос.УстановитьПараметр("СсылкаНаТекущийОбъект", СсылкаНаТекущийОбъект); Запрос.УстановитьПараметр("РодительВерхнегоУровня", РодительВерхнегоУровня); Запрос.УстановитьПараметр("ИдентификаторДляФормул", Идентификатор); - Запрос.УстановитьПараметр("ИдентификаторДляФормулПодобие", Идентификатор + "%"); + Запрос.УстановитьПараметр("ИдентификаторДляФормулПодобие", ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(Идентификатор) + "%"); РезультатыЗапроса = Запрос.ВыполнитьПакет(); УникальностьПоТочномуСоответствию = РезультатыЗапроса[0]; @@ -530,16 +532,35 @@ // Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт + ЯзыковБольшеОдного = Метаданные.Языки.Количество() > 1; + Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ + | ВидыКонтактнойИнформации.Ссылка КАК Ссылка + |ИЗ + | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации + |ГДЕ + | ВидыКонтактнойИнформации.ЭтоГруппа = ЛОЖЬ + | И (ЕСТЬNULL(ВидыКонтактнойИнформации.ИдентификаторДляФормул, """") = """" + | ИЛИ ЕСТЬNULL(ВидыКонтактнойИнформации.ВидРедактирования, """") = """" + | ИЛИ ВидыКонтактнойИнформации.ОтображатьВсегда = ЛОЖЬ)"; + + Если ЯзыковБольшеОдного Тогда + Запрос.Текст = Запрос.Текст + " + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ | ВидыКонтактнойИнформации.Ссылка КАК Ссылка |ИЗ - | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации"; - + | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации + |ГДЕ + | НЕ ВидыКонтактнойИнформации.Представления.Ссылка = ВидыКонтактнойИнформации.Ссылка + | И ВидыКонтактнойИнформации.ЭтоГруппа = ЛОЖЬ"; + КонецЕсли; + РезультатЗапроса = Запрос.Выполнить().Выгрузить(); - - ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, - РезультатЗапроса.ВыгрузитьКолонку("Ссылка")); + + ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, РезультатЗапроса.ВыгрузитьКолонку("Ссылка")); КонецПроцедуры @@ -553,6 +574,8 @@ ПроблемныхОбъектов = 0; ОбъектовОбработано = 0; + УстановитьОтображатьВсегда = ОбщегоНазначенияКлиентСервер.СравнитьВерсии("3.1.8.270", Параметры.ВерсияПодсистемыНаНачалоОбновления) > 0; + Пока ВидКонтактнойИнформацииСсылка.Следующий() Цикл Блокировка = Новый БлокировкаДанных; @@ -576,7 +599,7 @@ КонецЕсли; КонецЕсли; - Если Не ВидКонтактнойИнформации.ЭтоГруппа Тогда + Если Не ВидКонтактнойИнформации.ЭтоГруппа И ПустаяСтрока(ВидКонтактнойИнформации.ВидРедактирования) Тогда Если ВидКонтактнойИнформации.УдалитьРедактированиеТолькоВДиалоге Тогда ВидКонтактнойИнформации.ВидРедактирования = "Диалог"; ИначеЕсли ВидКонтактнойИнформации.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты @@ -597,7 +620,11 @@ ВидКонтактнойИнформации.ИдентификаторДляФормул = УникальныйИдентификаторДляФормул(НаименованиеДляИдентификатора, ВидКонтактнойИнформации.Ссылка, ВидКонтактнойИнформации.Родитель); КонецЕсли; - + + Если НЕ ВидКонтактнойИнформации.ЭтоГруппа И УстановитьОтображатьВсегда Тогда + ВидКонтактнойИнформации.ОтображатьВсегда = Истина; + КонецЕсли; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(ВидКонтактнойИнформации); ОбъектовОбработано = ОбъектовОбработано + 1; @@ -611,7 +638,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать вид контактной информации %1 по причине: |%2'"), - ВидКонтактнойИнформацииСсылка.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВидКонтактнойИнформацииСсылка.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Метаданные.Справочники.ВидыКонтактнойИнформации, ВидКонтактнойИнформацииСсылка.Ссылка, ТекстСообщения); КонецПопытки; diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ObjectModule.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ObjectModule.bsl index 8b8369102..b0a098d37 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ObjectModule.bsl +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ObjectModule.bsl @@ -51,6 +51,10 @@ Если СтрНачинаетсяС(ИмяПредопределенныхДанных, "Удалить") Тогда ПроверяемыеРеквизиты.Очистить(); Возврат; + КонецЕсли; + + Если НЕ ЭтоГруппа И ВводитьНомерПоМаске Тогда + ПроверяемыеРеквизиты.Добавить("МаскаНомераТелефона"); КонецЕсли; Если ЭтоГруппа Тогда diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo index 7a349d666..986346b6f 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo @@ -462,10 +462,10 @@ Use - ПроверятьПоФИАС + УдалитьПроверятьПоФИАС ru - Проверять по адресному классификатору + (не используется) Проверять по ФИАС Boolean @@ -659,6 +659,27 @@ Use Use + + ОтображатьВсегда + + ru + Отображать всегда + + + Boolean + + + ru + Вид контактной информации всегда отображается и предлагается к заполнению в карточке владельца + + + + + true + + Use + Use + diff --git a/SSL/src/Catalogs/ВидыПроверок/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВидыПроверок/Forms/ФормаЭлемента/Form.form index 07c8f8877..6bfa55d07 100644 --- a/SSL/src/Catalogs/ВидыПроверок/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ВидыПроверок/Forms/ФормаЭлемента/Form.form @@ -107,7 +107,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОбновлениеКомпонентСПортала1СИТС/Form.form b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОбновлениеКомпонентСПортала1СИТС/Form.form index d9ad1ee87..ed5a81092 100644 --- a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОбновлениеКомпонентСПортала1СИТС/Form.form +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОбновлениеКомпонентСПортала1СИТС/Form.form @@ -108,7 +108,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true diff --git a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ПоискКомпонентыНаПортале1СИТС/Form.form b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ПоискКомпонентыНаПортале1СИТС/Form.form index 165265ca0..f73c3337c 100644 --- a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ПоискКомпонентыНаПортале1СИТС/Form.form +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ПоискКомпонентыНаПортале1СИТС/Form.form @@ -109,7 +109,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -527,12 +526,12 @@ ПодключитьИнтернетПоддержку <key>ru</key> - <value>Подключить интернет поддержку</value> + <value>Подключить интернет-поддержку пользователей</value> 1 ru - Подключить интернет поддержку + Подключить Интернет-поддержку пользователей true diff --git a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаСписка/Form.form index a4ae61f7d..b147e2bfa 100644 --- a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -137,7 +136,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаЭлемента/Form.form index f25b19d6d..eebc7cef9 100644 --- a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаЭлемента/Form.form @@ -96,7 +96,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -216,7 +215,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -298,7 +296,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -428,7 +425,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -460,7 +456,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаЭлемента/Module.bsl index 69c1e2468..791a32b88 100644 --- a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ФормаЭлемента/Module.bsl @@ -274,8 +274,9 @@ СтрокаСПредупреждением = НСтр("ru = '%1 |Укажите zip-архив с внешней компонентой. - |Подробнее см. Технология создания внешних компонент'"); - СтрокаСПредупреждением = СтроковыеФункцииКлиент.ФорматированнаяСтрока(СтрокаСПредупреждением, ОписаниеОшибки); + |Подробнее см. Технология создания внешних компонент'"); + СтрокаСПредупреждением = СтроковыеФункцииКлиент.ФорматированнаяСтрока(СтрокаСПредупреждением, ОписаниеОшибки, + "https://its.1c.eu/db/metod8dev/content/3221"); ПоказатьПредупреждение(Оповещение, СтрокаСПредупреждением); КонецЕсли; diff --git a/SSL/src/Catalogs/ВнешниеКомпоненты/ManagerModule.bsl b/SSL/src/Catalogs/ВнешниеКомпоненты/ManagerModule.bsl index 8301aedca..239cf07b7 100644 --- a/SSL/src/Catalogs/ВнешниеКомпоненты/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/ManagerModule.bsl @@ -125,8 +125,7 @@ // Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию(Параметры) Экспорт - Выборка = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, - "Справочник.ВнешниеКомпоненты"); + Выборка = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, "Справочник.ВнешниеКомпоненты"); Если Выборка.Количество() > 0 Тогда ОбработатьВнешниеКомпоненты(Выборка); КонецЕсли; @@ -137,6 +136,10 @@ КонецПроцедуры +// Параметры: +// Выборка - ВыборкаИзРезультатаЗапроса: +// * Ссылка - СправочникСсылка.ВнешниеКомпоненты +// Процедура ОбработатьВнешниеКомпоненты(Выборка) ОбъектовОбработано = 0; @@ -146,7 +149,6 @@ РеквизитыКомпоненты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Выборка.Ссылка, "ХранилищеКомпоненты, MacOS_x86_64_Safari, MacOS_x86_64_Chrome, MacOS_x86_64_Firefox"); - Если ТипЗнч(РеквизитыКомпоненты.ХранилищеКомпоненты) <> Тип("ХранилищеЗначения") Тогда ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(Выборка.Ссылка); ОбъектовОбработано = ОбъектовОбработано + 1; @@ -210,7 +212,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать компоненту %1 по причине: - |%2'"), Выборка.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + |%2'"), Выборка.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Выборка.Ссылка.Метаданные(), Выборка.Ссылка, ТекстСообщения); diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Commands/ВнешнийДоступ/CommandModule.bsl b/SSL/src/Catalogs/ВнешниеПользователи/Commands/ВнешнийДоступ/CommandModule.bsl index 1949dbdf6..1ebb00b57 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Commands/ВнешнийДоступ/CommandModule.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/Commands/ВнешнийДоступ/CommandModule.bsl @@ -23,10 +23,10 @@ ПараметрыВыполненияКоманды.Окно); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - Если СтрНайти(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке), + Если СтрНайти(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке), "ВызватьИсключение" + " " + "ОписаниеОшибкиКакПредупреждения") > 0 Тогда - ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ПоказатьПредупреждение(, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Иначе ВызватьИсключение; КонецЕсли; diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Form.form index ff71896dc..7429be20f 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Form.form @@ -82,7 +82,6 @@ UsualGroup Vertical - Auto true true Auto @@ -114,7 +113,6 @@ UsualGroup Vertical - Auto true true Auto @@ -904,7 +902,6 @@ true false false - false Auto Auto ExpandTopLevel @@ -1039,7 +1036,6 @@ Vertical Center - Auto true true Auto @@ -1053,7 +1049,7 @@ <key>ru</key> - <value>Группы пользователей</value> + <value>Группы внешних пользователей</value> ГруппаГруппыExtendedTooltip @@ -1068,7 +1064,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1107,7 +1102,7 @@ true - ВнешниеПользователиСписок.Description + ВнешниеПользователиСписок.Наименование НаименованиеExtendedTooltip @@ -1141,7 +1136,7 @@ true - ВнешниеПользователиСписок.Ref + ВнешниеПользователиСписок.Ссылка СсылкаРасширеннаяПодсказка @@ -1482,7 +1477,6 @@ true false false - false Auto Auto true @@ -1496,6 +1490,10 @@ true + + OnGetDataAtServer + ВнешниеПользователиСписокПриПолученииДанныхНаСервере + 60 0001-01-01T00:00:00 @@ -1615,7 +1613,6 @@ Vertical Center - Auto true true Auto @@ -1644,7 +1641,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1673,7 +1669,6 @@ UsualGroup HorizontalIfPossible - Auto true true LeftNarrowest @@ -1862,7 +1857,6 @@ AutoUse true true - false true Auto Auto @@ -1899,7 +1893,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1928,7 +1921,6 @@ UsualGroup HorizontalIfPossible - Auto true true Equal @@ -2037,7 +2029,415 @@ UsualGroup HorizontalIfPossible - Auto + true + true + Auto + Auto + + + + Легенда + 255 + + ВходОграничен + 257 + + ВходОграниченКартинка + 259 + + <key>ru</key> + <value>Вход ограничен картинка</value> + + true + true + + true + + + ВходОграниченКартинкаРасширеннаяПодсказка + 261 + Label + true + true + + Left + + + + ВходОграниченКартинкаКонтекстноеМеню + 260 + true + + true + true + + + CommonPicture.СостояниеПользователя17 + + AsFileRef + + + + ВходОграниченНадпись + 262 + + <key>ru</key> + <value>Вход ограничен</value> + + true + true + + true + + + ru + Установлено ограничение входа до даты или +установлен срок максимальной неактивности + + + ВходОграниченНадписьРасширеннаяПодсказка + 264 + Label + true + true + + Left + + + + ВходОграниченНадписьКонтекстноеМеню + 263 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Вход ограничен</value> + + + ВходОграниченРасширеннаяПодсказка + 258 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + + Отступ1 + 265 + true + true + + true + + + Отступ1РасширеннаяПодсказка + 267 + Label + true + true + + Left + + + + Отступ1КонтекстноеМеню + 266 + true + + Label + true + true + + Left + + + + НетВхода + 268 + + НетВходаКартинка + 270 + + <key>ru</key> + <value>Нет входа картинка</value> + + true + true + + true + + + НетВходаКартинкаРасширеннаяПодсказка + 272 + Label + true + true + + Left + + + + НетВходаКартинкаКонтекстноеМеню + 271 + true + + true + true + + + CommonPicture.СостояниеПользователя16 + + AsFileRef + + + + НетВходаНадпись + 273 + + <key>ru</key> + <value>Нет входа</value> + + true + true + + true + + + ru + Не включен вход в программу, нет прав или +нет ни одного права запуска (тонкий клиент, веб-клиент) + + + НетВходаНадписьРасширеннаяПодсказка + 275 + Label + true + true + + Left + + + + НетВходаНадписьКонтекстноеМеню + 274 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Нет входа</value> + + + НетВходаРасширеннаяПодсказка + 269 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + + Отступ2 + 276 + true + true + + true + + + Отступ2РасширеннаяПодсказка + 278 + Label + true + true + + Left + + + + Отступ2КонтекстноеМеню + 277 + true + + Label + true + true + + Left + + + + БезНастройки + 279 + + БезНастройкиКартинка + 281 + + <key>ru</key> + <value>Без настройки картинка</value> + + true + true + + true + + + БезНастройкиКартинкаРасширеннаяПодсказка + 283 + Label + true + true + + Left + + + + БезНастройкиКартинкаКонтекстноеМеню + 282 + true + + true + true + + + CommonPicture.СостояниеПользователя18 + + AsFileRef + + + + БезНастройкиНадпись + 284 + + <key>ru</key> + <value>Без настройки</value> + + true + true + + true + + + ru + Нет пользователя информационной базы +(пустое имя для входа) + + + БезНастройкиНадписьРасширеннаяПодсказка + 286 + Label + true + true + + Left + + + + БезНастройкиНадписьКонтекстноеМеню + 285 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Без настройки</value> + + + БезНастройкиРасширеннаяПодсказка + 280 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Легенда</value> + + + ЛегендаРасширеннаяПодсказка + 256 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible true true Auto @@ -2116,7 +2516,6 @@ UsualGroup Vertical - Auto true true @@ -2222,11 +2621,10 @@ UsualGroup Vertical - Auto true true - Items.ВнешниеПользователиСписок.CurrentData.Description + Items.ВнешниеПользователиСписок.CurrentData.Наименование Auto Auto @@ -2333,31 +2731,27 @@ true - - ВнешниеПользователиСписок.Ref - ВнешниеПользователиСписок.ВозможноСменитьПароль ВнешниеПользователиСписок.Недействителен + + ВнешниеПользователиСписок.Ссылка +
        true
        ВЫБРАТЬ - ВнешниеПользователи.Ссылка, - ВнешниеПользователи.Подготовлен, - ВнешниеПользователи.ПометкаУдаления, - ВнешниеПользователи.Недействителен, - ВнешниеПользователи.Предопределенный, - ВнешниеПользователи.Наименование, - ВнешниеПользователи.Комментарий, + ВнешниеПользователи.Ссылка КАК Ссылка, + ВнешниеПользователи.Подготовлен КАК Подготовлен, + ВнешниеПользователи.ПометкаУдаления КАК ПометкаУдаления, + ВнешниеПользователи.Недействителен КАК Недействителен, + ВнешниеПользователи.Предопределенный КАК Предопределенный, + ВнешниеПользователи.Наименование КАК Наименование, + ВнешниеПользователи.Комментарий КАК Комментарий, ТИПЗНАЧЕНИЯ(ВнешниеПользователи.Ссылка.ОбъектАвторизации) КАК ТипОбъектаАвторизации, - ВЫБОР - КОГДА ВнешниеПользователи.ПометкаУдаления - ТОГДА 6 - ИНАЧЕ 7 - КОНЕЦ КАК НомерКартинки, + -1 КАК НомерКартинки, ВЫБОР КОГДА ВнешниеПользователи.Недействителен ТОГДА ЛОЖЬ @@ -2369,9 +2763,12 @@ ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ КАК ВозможноСменитьПароль, - ВнешниеПользователи.ИдентификаторПользователяИБ + ВнешниеПользователи.ИдентификаторПользователяИБ КАК ИдентификаторПользователяИБ, + СведенияОПользователях.* ИЗ Справочник.ВнешниеПользователи КАК ВнешниеПользователи + {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях + ПО (СведенияОПользователях.Пользователь = ВнешниеПользователи.Ссылка)} ГДЕ ВЫБОР КОГДА &ВсеВнешниеПользователи diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl index 00993e8d4..ba5c57ad6 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl @@ -174,6 +174,9 @@ Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда Элементы.ЗавершитьИЗакрыть.Отображение = ОтображениеКнопки.Картинка; КонецЕсли; + + ПользователиСлужебный.НастроитьПолеНомерКартинкиДинамическогоСписка(ВнешниеПользователиСписок); + КонецПроцедуры &НаКлиенте @@ -183,9 +186,11 @@ ПроверкаИзмененияТекущегоЭлементаФормы(); КонецЕсли; - #Если МобильныйКлиент Тогда +#Если МобильныйКлиент Тогда Если ХранимыеПараметры.Свойство("ИспользоватьГруппы") И ХранимыеПараметры.ИспользоватьГруппы Тогда - Элементы.ГруппаГруппы.Заголовок = Строка(Элементы.ГруппыВнешнихПользователей.ТекущиеДанные.Ссылка); + Элементы.ГруппаГруппы.Заголовок = ?(Элементы.ГруппыВнешнихПользователей.ТекущиеДанные = Неопределено, + НСтр("ru = 'Группы внешних пользователей'"), + Строка(Элементы.ГруппыВнешнихПользователей.ТекущиеДанные.Ссылка)); КонецЕсли; #КонецЕсли @@ -195,7 +200,9 @@ Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Если ВРег(ИмяСобытия) = ВРег("Запись_ГруппыВнешнихПользователей") - И Источник = Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока Тогда + И Источник = Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока + Или ВРег(ИмяСобытия) = ВРег("РазмещениеПользователейВГруппах") + Или ВРег(ИмяСобытия) = ВРег("Запись_ГруппыДоступа") Тогда Элементы.ГруппыВнешнихПользователей.Обновить(); Элементы.ВнешниеПользователиСписок.Обновить(); @@ -207,10 +214,6 @@ ПодключитьОбработчикОжидания("ПриИзмененииИспользованияГруппПользователей", 0.1, Истина); КонецЕсли; - ИначеЕсли ВРег(ИмяСобытия) = ВРег("РазмещениеПользователейВГруппах") Тогда - - Элементы.ВнешниеПользователиСписок.Обновить(); - КонецЕсли; КонецПроцедуры @@ -270,7 +273,9 @@ #Если МобильныйКлиент Тогда Если ХранимыеПараметры.Свойство("РасширенныйПодбор") И Не ХранимыеПараметры.РасширенныйПодбор Тогда - Элементы.ГруппаГруппы.Заголовок = Строка(Элементы.ГруппыВнешнихПользователей.ТекущиеДанные.Ссылка); + Элементы.ГруппаГруппы.Заголовок = ?(Элементы.ГруппыВнешнихПользователей.ТекущиеДанные = Неопределено, + НСтр("ru = 'Группы внешних пользователей'"), + Строка(Элементы.ГруппыВнешнихПользователей.ТекущиеДанные.Ссылка)); ТекущийЭлемент = Элементы.ВнешниеПользователиСписок; КонецЕсли; #КонецЕсли @@ -520,6 +525,13 @@ КонецПроцедуры +&НаСервереБезКонтекста +Процедура ВнешниеПользователиСписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки) + + ПользователиСлужебный.ДинамическийСписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки); + +КонецПроцедуры + &НаКлиенте Процедура ВнешниеПользователиСписокПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form index a0f2810f2..d5e673fcf 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form @@ -105,7 +105,6 @@ UsualGroup Vertical - Auto true true Auto @@ -134,7 +133,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -239,7 +237,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -360,7 +357,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -389,7 +385,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -442,6 +437,215 @@ true
        + + ГруппаНетПрав + 376 + + НетПравКартинка + 378 + + <key>ru</key> + <value>Нет прав картинка</value> + + true + true + + true + + + НетПравКартинкаРасширеннаяПодсказка + 380 + Label + true + true + + Left + + + + НетПравКартинкаКонтекстноеМеню + 379 + true + + true + true + + + CommonPicture.Предупреждение + + AsFileRef + + + + НетПравНадпись + 381 + + <key>ru</key> + <value>Нет прав</value> + + true + true + + true + + + ru + Пользователю не назначены права доступа (нет ни одной роли) + + + НетПравНадписьРасширеннаяПодсказка + 383 + Label + true + true + + Left + + + + НетПравНадписьКонтекстноеМеню + 382 + true + + Label + true + true + + Left + + + true + + true + + + <key>ru</key> + <value>Нет прав</value> + + + ГруппаНетПравРасширеннаяПодсказка + 377 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + + ГруппаНетПравНаЗапуск + 384 + + НетПравНаЗапускКартина + 386 + + <key>ru</key> + <value>Нет прав на запуск картина</value> + + true + true + + true + + + НетПравНаЗапускКартинаРасширеннаяПодсказка + 388 + Label + true + true + + Left + + + + НетПравНаЗапускКартинаКонтекстноеМеню + 387 + true + + true + true + + + CommonPicture.Предупреждение + + AsFileRef + + + + НетПравНаЗапускНадпись + 389 + + <key>ru</key> + <value>Нет прав на запуск</value> + + true + true + + true + + + ru + У пользователя нет ни одного права запуска (тонкий клиент, веб-клиент, +толстый клиент, automation, внешнее соединение) + + + НетПравНаЗапускНадписьРасширеннаяПодсказка + 391 + Label + true + true + + Left + + + + НетПравНаЗапускНадписьКонтекстноеМеню + 390 + true + + Label + true + true + + Left + + + true + + true + + + <key>ru</key> + <value>Нет прав на запуск</value> + + + ГруппаНетПравНаЗапускРасширеннаяПодсказка + 385 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + ГруппаИзменитьОграничение 346 @@ -494,7 +698,6 @@ UsualGroup Vertical - Auto true true Auto @@ -565,7 +768,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -573,194 +775,95 @@ - СтраницыГлавноеИКомментарий + Страницы 281 - СтраницаГлавное + Главное 283 - СвойстваПользователяИБ - 65 - - ОсновныеСвойства - 75 - - ИмяПереключениеОтметкиНезаполненного - 238 - - ИмяСОтметкойНезаполненного - 240 - - ПользовательИБИмя1 - 242 - true - true - - true - - - ПользовательИБИмя - - - OnChange - ПользовательИБИмяПриИзменении - - - ПользовательИБИмя1РасширеннаяПодсказка - 244 - Label - true - true - - Left - - - - ПользовательИБИмя1КонтекстноеМеню - 243 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Имя с отметкой незаполненного</value> - - - ИмяСОтметкойНезаполненногоРасширеннаяПодсказка - 241 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - ИмяБезОтметкиНезаполненного - 245 - - ПользовательИБИмя2 - 247 - true - true - - true - - - ПользовательИБИмя - - - OnChange - ПользовательИБИмяПриИзменении - - - ПользовательИБИмя2РасширеннаяПодсказка - 249 - Label - true - true - - Left - - - - ПользовательИБИмя2КонтекстноеМеню - 248 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Имя без отметки незаполненного</value> - - - ИмяБезОтметкиНезаполненногоРасширеннаяПодсказка - 246 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - true - true - - true - - - <key>ru</key> - <value>Имя (переключение отметки незаполненного)</value> - - - ИмяПереключениеОтметкиНезаполненногоРасширеннаяПодсказка - 239 - Label - true - true - - Left - - - Pages - - Auto + ГруппаИмя + 374 + + ПользовательИБИмя + 242 + true + true + + true + + + ПользовательИБИмя + + + OnChange + ПользовательИБИмяПриИзменении + + + ПользовательИБИмяРасширеннаяПодсказка + 244 + Label + true + true + + Left - +
        + + ПользовательИБИмяКонтекстноеМеню + 243 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Имя</value> + + + ГруппаИмяРасширеннаяПодсказка + 375 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + + СвойстваПользователяИБ + 75 + + СвойстваАутентификации + 366 СвойстваАутентификации1СПредприятия 193 @@ -932,7 +1035,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1081,7 +1183,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1110,7 +1211,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1139,7 +1239,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1148,7 +1247,7 @@ - СвойстваАутентификацииOpenID + СвойстваАутентификацииДополнительные 279 ПользовательИБАутентификацияOpenID @@ -1194,6 +1293,95 @@ true + + ПользовательИБАутентификацияOpenIDConnect + 368 + true + true + + true + + + ПользовательИБАутентификацияOpenIDConnect + + Right + + OnChange + ПользовательИБАутентификацияOpenIDConnectПриИзменении + + + ПользовательИБАутентификацияOpenIDConnectРасширеннаяПодсказка + 370 + + <key>ru</key> + <value>OpenID Connect позволяет системе 1С:Предприятие проверить личность пользователя на основе аутентификации, выполненной сторонним провайдером. В результате, для того, чтобы получить доступ к прикладному решению 1С:Предприятия, пользователи могут использовать свои учетные данные на других сайтах, поддерживающих OpenID Connect аутентификацию. В частности, в качестве такого сайта можно использовать Единую систему идентификации и аутентификации (ЕСИА), при этом авторизация будет происходить через сайт gosuslugi.ru. + +Используется только при подключении через веб-сервер (адрес службы должен быть настроен).</value> + + Label + true + true + + Left + + + + ПользовательИБАутентификацияOpenIDConnectКонтекстноеМеню + 369 + true + + CheckBoxField + Enter + true + Left + true + + + + ПользовательИБАутентификацияТокеномДоступа + 371 + true + true + + true + + + ПользовательИБАутентификацияТокеномДоступа + + Right + + OnChange + ПользовательИБАутентификацияТокеномДоступаПриИзменении + + + ПользовательИБАутентификацияТокеномДоступаРасширеннаяПодсказка + 373 + + <key>ru</key> + <value>Аутентификация с помощью JWT-токенов (стандарт RFC 7519). +Более продвинутая аутентификация по сравнению с OpenID и OpenID-Connect. + +Многие публичные сервисы используют аутентификацию через JWT-токены – например, Единая Система Авторизации И Аутентификации (ЕСИА), сервисы Министерства здравоохранения и социального развития, Национальная система цифровой маркировки "Честный знак".</value> + + Label + true + true + + Left + + + + ПользовательИБАутентификацияТокеномДоступаКонтекстноеМеню + 372 + true + + CheckBoxField + Enter + true + Left + true + + true true @@ -1201,10 +1389,10 @@ <key>ru</key> - <value>Свойства аутентификации open ID</value> + <value>Свойства аутентификации дополнительные</value> - СвойстваАутентификацииOpenIDРасширеннаяПодсказка + СвойстваАутентификацииДополнительныеРасширеннаяПодсказка 280 Label true @@ -1216,91 +1404,6 @@ UsualGroup Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - - СвойстваДополнительные - 192 - - ПользовательИБЯзык - 348 - true - true - - true - - - ПользовательИБЯзык - - - OnChange - ПользовательИБЯзыкПриИзменении - - - ПользовательИБЯзыкРасширеннаяПодсказка - 350 - Label - true - true - - Left - - - - ПользовательИБЯзыкКонтекстноеМеню - 349 - true - - InputField - Enter - true - Left - true - Left - - true - true - true - true - true - true - true - - Style.BorderColor - - Normal - - - true - true - - true - - - <key>ru</key> - <value>Свойства дополнительные</value> - - false - - СвойстваДополнительныеРасширеннаяПодсказка - 215 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto NormalSeparation true true @@ -1315,11 +1418,11 @@
        <key>ru</key> - <value>Основные свойства</value> + <value>Свойства аутентификации</value> - ОсновныеСвойстваExtendedTooltip - 206 + СвойстваАутентификацииРасширеннаяПодсказка + 367 Label true true @@ -1329,8 +1432,7 @@ UsualGroup - Vertical - Auto + HorizontalIfPossible true true Auto @@ -1338,27 +1440,26 @@ - РедактированиеИлиПросмотрРолей - 168 + СвойстваДополнительные + 192 - УстановитьРолиНепосредственно - 166 + ПользовательИБЯзык + 348 true true true - Объект.УстановитьРолиНепосредственно + ПользовательИБЯзык - Right OnChange - УстановитьРолиНепосредственноПриИзменении + ПользовательИБЯзыкПриИзменении - УстановитьРолиНепосредственноExtendedTooltip - 218 + ПользовательИБЯзыкРасширеннаяПодсказка + 350 Label true true @@ -1367,432 +1468,28 @@
        - УстановитьРолиНепосредственноКонтекстноеМеню - 167 + ПользовательИБЯзыкКонтекстноеМеню + 349 true - CheckBoxField + InputField Enter true Left true - - - - ОтображениеРолей - 103 - - Роли - 174 - - <key>ru</key> - <value>Разрешенные действия (роли)</value> - - true - true - - true - - - Роли - - false - None - Add - Change - Copy - Delete - EndEdit - HierarchicalList - List - MoveDown - MoveUp - SortListAsc - SortListDesc - Tree - - РолиКолонок - 177 - - РолиПометка - 185 - true - true - - true - - - Роли.Пометка - - - OnChange - РолиПометкаПриИзменении - - - РолиПометкаExtendedTooltip - 226 - Label - true - true - - Left - - - - РолиПометкаКонтекстноеМеню - 186 - true - - CheckBoxField - Left - true - - - - РолиСиноним - 187 - true - true - - true - - - Роли.Синоним - - - РолиСинонимExtendedTooltip - 227 - Label - true - true - - Left - - - - РолиСинонимКонтекстноеМеню - 188 - true - - InputField - true - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Роли колонок</value> - - - РолиКолонокExtendedTooltip - 225 - Label - true - true - - Left - - - ColumnGroup - - InCell - auto - true - - - - РолиКоманднаяПанель - 176 - - РолиУстановитьФлажки - 182 - true - true - - true - - false - - РолиУстановитьФлажкиExtendedTooltip - 220 - Label - true - true - - Left - - - Form.Command.ВключитьРоли - Normal - Auto - true - true - UserCmds - Auto - - - РолиСнятьФлажки - 183 - true - true - - true - - false - - РолиСнятьФлажкиExtendedTooltip - 221 - Label - true - true - - Left - - - Form.Command.ИсключитьРоли - Normal - Auto - true - true - UserCmds - Auto - - - РолиПоказатьТолькоВыбранныеРоли - 184 - true - true - - true - - false - - РолиПоказатьТолькоВыбранныеРолиExtendedTooltip - 222 - Label - true - true - - Left - - - Form.Command.ПоказатьТолькоВыбранныеРоли - Normal - Auto - true - true - UserCmds - Auto - - - РолиПоказатьПодсистемыРолей - 189 - true - true - - true - - - РолиПоказатьПодсистемыРолейExtendedTooltip - 223 - Label - true - true - - Left - - - Form.Command.ГруппировкаРолейПоПодсистемам - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - РолиСтандартныеКоманды - 289 - true - true - - true - - - <key>ru</key> - <value>Роли стандартные команды</value> - - - РолиСтандартныеКомандыРасширеннаяПодсказка - 290 - Label - true - true - - Left - - - - Item.Роли - - - Left - - - РолиСтрокаПоиска - 291 - - РолиСтрокаПоискаРасширеннаяПодсказка - 293 - Label - true - true - - Left - - - - РолиСтрокаПоискаКонтекстноеМеню - 292 - true - - Роли - - true - - - - РолиСостояниеПросмотра - 294 - - РолиСостояниеПросмотраРасширеннаяПодсказка - 296 - Label - true - true - - Left - - - - РолиСостояниеПросмотраКонтекстноеМеню - 295 - true - - ViewStatusAddition - Роли - - true - - - - РолиУправлениеПоиском - 297 - - РолиУправлениеПоискомРасширеннаяПодсказка - 299 - Label - true - true - - Left - - - - РолиУправлениеПоискомКонтекстноеМеню - 298 - true - - SearchControlAddition - Роли - - true - - - - РолиExtendedTooltip - 224 - Label - true - true - - Left - - - - РолиКонтекстноеМеню - 175 - - Tree + Left + true true - true - 1 - 1 - AutoUse - AutoUse - true - true - true - Auto - Auto - ExpandAllLevels - true - true - true - true - - Роли.НомерКартинки - - - CommonPicture.ПиктограммыЭлементов - - true - - true - true - - true - - - <key>ru</key> - <value>Список ролей</value> - - - ОтображениеРолейExtendedTooltip - 219 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto + true + true + true + true + true + + Style.BorderColor + + Normal true @@ -1802,11 +1499,12 @@ <key>ru</key> - <value>Редактирование или просмотр ролей</value> + <value>Свойства дополнительные</value> + false - РедактированиеИлиПросмотрРолейExtendedTooltip - 217 + СвойстваДополнительныеРасширеннаяПодсказка + 215 Label true true @@ -1817,7 +1515,7 @@ UsualGroup Vertical - Auto + NormalSeparation true true Auto @@ -1834,8 +1532,8 @@ Свойства пользователя информационной базы - СвойстваПользователяИБExtendedTooltip - 205 + СвойстваПользователяИБРасширеннаяПодсказка + 206 Label true true @@ -1845,9 +1543,7 @@ UsualGroup - HorizontalIfPossible - Auto - NormalSeparation + Vertical true true Auto @@ -1864,7 +1560,7 @@ Главное - СтраницаГлавноеРасширеннаяПодсказка + ГлавноеРасширеннаяПодсказка 284 Label true @@ -1880,6 +1576,547 @@ false + + РедактированиеИлиПросмотрРолей + 364 + + УстановитьРолиНепосредственно + 166 + true + true + + true + + + Объект.УстановитьРолиНепосредственно + + Right + + OnChange + УстановитьРолиНепосредственноПриИзменении + + + УстановитьРолиНепосредственноExtendedTooltip + 218 + Label + true + true + + Left + + + + УстановитьРолиНепосредственноКонтекстноеМеню + 167 + true + + CheckBoxField + Enter + true + Left + true + + + + ОтображениеРолей + 103 + + Роли + 174 + + <key>ru</key> + <value>Разрешенные действия (роли)</value> + + true + true + + true + + + Роли + + false + None + Add + Change + Copy + Delete + EndEdit + HierarchicalList + List + MoveDown + MoveUp + SortListAsc + SortListDesc + Tree + + РолиКолонок + 177 + + РолиПометка + 185 + true + true + + true + + + Роли.Пометка + + + OnChange + РолиПометкаПриИзменении + + + РолиПометкаExtendedTooltip + 226 + Label + true + true + + Left + + + + РолиПометкаКонтекстноеМеню + 186 + true + + CheckBoxField + Left + true + + + + РолиСиноним + 187 + true + true + + true + + + Роли.Синоним + + + РолиСинонимExtendedTooltip + 227 + Label + true + true + + Left + + + + РолиСинонимКонтекстноеМеню + 188 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Роли колонок</value> + + + РолиКолонокExtendedTooltip + 225 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + РолиКоманднаяПанель + 176 + + РолиГруппаКомандФлажки + 392 + + РолиУстановитьФлажки + 182 + true + true + + true + + false + + РолиУстановитьФлажкиExtendedTooltip + 220 + Label + true + true + + Left + + + Form.Command.ВключитьРоли + Normal + Auto + true + true + UserCmds + Auto + + + РолиСнятьФлажки + 183 + true + true + + true + + false + + РолиСнятьФлажкиExtendedTooltip + 221 + Label + true + true + + Left + + + Form.Command.ИсключитьРоли + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Роли группа команд флажки</value> + + + РолиГруппаКомандФлажкиРасширеннаяПодсказка + 393 + Label + true + true + + Left + + + + Compact + + + + РолиПоказатьТолькоВыбранныеРоли + 184 + true + true + + true + + false + + РолиПоказатьТолькоВыбранныеРолиExtendedTooltip + 222 + Label + true + true + + Left + + + Form.Command.ПоказатьТолькоВыбранныеРоли + Normal + Auto + true + true + UserCmds + Auto + + + РолиПоказатьПодсистемыРолей + 189 + true + true + + true + + + РолиПоказатьПодсистемыРолейExtendedTooltip + 223 + Label + true + true + + Left + + + Form.Command.ГруппировкаРолейПоПодсистемам + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + РолиСтандартныеКоманды + 289 + true + true + + true + + + <key>ru</key> + <value>Роли стандартные команды</value> + + + РолиСтандартныеКомандыРасширеннаяПодсказка + 290 + Label + true + true + + Left + + + + Item.Роли + + + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + РолиСтрокаПоиск + 394 + + РолиСтрокаПоискРасширеннаяПодсказка + 396 + Label + true + true + + Left + + + + РолиСтрокаПоискКонтекстноеМеню + 395 + true + + Роли + + true + + + Left + + + РолиСтрокаПоиска + 291 + + РолиСтрокаПоискаРасширеннаяПодсказка + 293 + Label + true + true + + Left + + + + РолиСтрокаПоискаКонтекстноеМеню + 292 + true + + Роли + + true + + + + РолиСостояниеПросмотра + 294 + + РолиСостояниеПросмотраРасширеннаяПодсказка + 296 + Label + true + true + + Left + + + + РолиСостояниеПросмотраКонтекстноеМеню + 295 + true + + ViewStatusAddition + Роли + + true + + + + РолиУправлениеПоиском + 297 + + РолиУправлениеПоискомРасширеннаяПодсказка + 299 + Label + true + true + + Left + + + + РолиУправлениеПоискомКонтекстноеМеню + 298 + true + + SearchControlAddition + Роли + + true + + + + РолиExtendedTooltip + 224 + Label + true + true + + Left + + + + РолиКонтекстноеМеню + 175 + + Tree + true + true + true + 1 + 1 + AutoUse + AutoUse + true + true + true + Auto + Auto + ExpandAllLevels + true + true + true + true + + Роли.НомерКартинки + + + CommonPicture.ПиктограммыЭлементов + + true + + true + true + + true + + + <key>ru</key> + <value>Список ролей</value> + + + ОтображениеРолейExtendedTooltip + 219 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Разрешенные действия (роли)</value> + + + РедактированиеИлиПросмотрРолейРасширеннаяПодсказка + 365 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + СтраницаКонтактнаяИнформация 357 @@ -1908,7 +2145,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -2048,10 +2284,10 @@ <key>ru</key> - <value>Страницы главное и комментарий</value> + <value>Страницы</value> - СтраницыГлавноеИКомментарийРасширеннаяПодсказка + СтраницыРасширеннаяПодсказка 282 Label true @@ -2064,7 +2300,7 @@ OnCurrentPageChange - СтраницыГлавноеИКомментарийПриСменеСтраницы + СтраницыПриСменеСтраницы TabsOnTop Auto @@ -2918,6 +3154,66 @@ true + + ПользовательИБАутентификацияOpenIDConnect + + <key>ru</key> + <value>Аутентификация по протоколу OpenID-Connect</value> + + 42 + + Boolean + + + true + + + true + + true + + + ПользовательИБАутентификацияТокеномДоступа + + <key>ru</key> + <value>Аутентификация токеном доступа</value> + + 43 + + Boolean + + + true + + + true + + true + + + НаличиеПрав + 44 + + + true + + + true + + + + ПользовательИБЗащитаОтОпасныхДействий + 45 + + Boolean + + + true + + + true + + ПоказатьТолькоВыбранныеРоли diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl index b7d2b5c25..861ed7e23 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl @@ -162,13 +162,12 @@ КонецЕсли; Если ОбщегоНазначения.РазделениеВключено() - Или Не ПользователиСлужебныйПовтИсп.Настройки().ОбщиеНастройкиВхода Тогда + Или Не Пользователи.ОбщиеНастройкиВходаИспользуются() Тогда Элементы.ГруппаИзменитьОграничение.Видимость = Ложь; КонецЕсли; - Если Не ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() - Или ОбщегоНазначения.РазделениеВключено() Тогда - Элементы.ПользовательИБЗапрещеноВосстанавливатьПароль.Видимость = Ложь; + Если ОбщегоНазначения.РазделениеВключено() Тогда + Элементы.ПользовательИБЗапрещеноВосстанавливатьПароль.Видимость = Ложь; КонецЕсли; Элементы.ПотребоватьСменуПароляПриВходе.РасширеннаяПодсказка.Заголовок = @@ -201,6 +200,10 @@ КонецЕсли; КонецЕсли; + Если ВРег(ИмяСобытия) = ВРег("Запись_ГруппыДоступа") Тогда + ПодключитьОбработчикОжидания("ПриИзмененияГруппыДоступа", 0.1, Истина); + КонецЕсли; + КонецПроцедуры &НаСервере @@ -382,6 +385,8 @@ ТекущийОбъект.Ссылка, "ПометкаУдаления")); КонецЕсли; + РегистрыСведений.СведенияОПользователях.УстановитьСведенияОПользователе(ЭтотОбъект, ТекущийОбъект); + ТекущийОбъект.ДополнительныеСвойства.Вставить( "ГруппаНовогоВнешнегоПользователя", ГруппаНовогоВнешнегоПользователя); @@ -417,9 +422,6 @@ КонецЕсли; // Конец СтандартныеПодсистемы.КонтактнаяИнформация - УстановитьПривилегированныйРежим(Истина); - ПользователиСлужебный.ЗаписатьСведенияОПользователе(ЭтотОбъект, ТекущийОбъект); - Если ПараметрыЗаписи.Свойство("КопироватьПраваПользователя") Тогда Источник = ЗначениеКопирования; Приемник = ТекущийОбъект.Ссылка; @@ -590,6 +592,8 @@ Если Объект.Недействителен Тогда ВходВПрограммуРазрешен = Ложь; Если Не ПользовательИБАутентификацияOpenID + И Не ПользовательИБАутентификацияOpenIDConnect + И Не ПользовательИБАутентификацияТокеномДоступа И Не ПользовательИБАутентификацияСтандартнаяЗначениеПрямогоИзменения И ПользовательИБАутентификацияСтандартная Тогда @@ -597,7 +601,9 @@ КонецЕсли; ИначеЕсли ВходВПрограммуРазрешенЗначениеПрямогоИзменения Тогда Если Не ПользовательИБАутентификацияСтандартная - И Не ПользовательИБАутентификацияOpenID Тогда + И Не ПользовательИБАутентификацияOpenID + И Не ПользовательИБАутентификацияOpenIDConnect + И Не ПользовательИБАутентификацияТокеномДоступа Тогда ПользовательИБАутентификацияСтандартная = Истина; КонецЕсли; ВходВПрограммуРазрешен = Истина; @@ -620,6 +626,8 @@ Если Не ВходВПрограммуРазрешен И Не ПользовательИБАутентификацияOpenID + И Не ПользовательИБАутентификацияOpenIDConnect + И Не ПользовательИБАутентификацияТокеномДоступа И Не ПользовательИБАутентификацияСтандартнаяЗначениеПрямогоИзменения И ПользовательИБАутентификацияСтандартная Тогда @@ -629,8 +637,10 @@ ОбновитьИмяДляВхода(ЭтотОбъект); Если ВходВПрограммуРазрешен - И НЕ ПользовательИБАутентификацияOpenID - И НЕ ПользовательИБАутентификацияСтандартная Тогда + И Не ПользовательИБАутентификацияOpenID + И Не ПользовательИБАутентификацияOpenIDConnect + И Не ПользовательИБАутентификацияТокеномДоступа + И Не ПользовательИБАутентификацияСтандартная Тогда ПользовательИБАутентификацияСтандартная = Истина; КонецЕсли; @@ -702,6 +712,20 @@ КонецПроцедуры +&НаКлиенте +Процедура ПользовательИБАутентификацияOpenIDConnectПриИзменении(Элемент) + + АутентификацияПриИзменении(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПользовательИБАутентификацияТокеномДоступаПриИзменении(Элемент) + + АутентификацияПриИзменении(); + +КонецПроцедуры + &НаКлиенте Процедура ПользовательИБЯзыкПриИзменении(Элемент) @@ -723,7 +747,7 @@ КонецПроцедуры &НаКлиенте -Процедура СтраницыГлавноеИКомментарийПриСменеСтраницы(Элемент, ТекущаяСтраница) +Процедура СтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница) Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") И ТекущаяСтраница.Имя = "СтраницаДополнительныеРеквизиты" @@ -1051,6 +1075,24 @@ КонецПроцедуры +&НаКлиенте +Процедура ПриИзмененияГруппыДоступа() + + ПриИзмененияГруппыДоступаНаСервере(); + +КонецПроцедуры + +&НаСервере +Процедура ПриИзмененияГруппыДоступаНаСервере() + + УстановитьПривилегированныйРежим(Истина); + НаличиеПрав = РегистрыСведений.СведенияОПользователях.НаличиеПрав(Объект.ИдентификаторПользователяИБ); + УстановитьПривилегированныйРежим(Ложь); + + УстановитьДоступностьСвойств(ЭтотОбъект); + +КонецПроцедуры + &НаСервере Процедура НастроитьФорму(ТекущийОбъект, ПриСозданииНаСервере = Ложь, ПараметрыЗаписи = Неопределено) @@ -1065,7 +1107,8 @@ КонецЕсли; УстановитьПривилегированныйРежим(Истина); - ПользователиСлужебный.ПрочитатьСведенияОПользователе(ЭтотОбъект); + РегистрыСведений.СведенияОПользователях.ПрочитатьСведенияОПользователе(ЭтотОбъект); + НаличиеПрав = РегистрыСведений.СведенияОПользователях.НаличиеПрав(Объект.ИдентификаторПользователяИБ); УстановитьПривилегированныйРежим(Ложь); УровеньДоступа = ПользователиСлужебный.УровеньДоступаКСвойствамПользователя(ТекущийОбъект); @@ -1080,6 +1123,9 @@ Элементы.СвойстваПользователяИБ.Видимость = ЗначениеЗаполнено(ДействияВФорме.СвойстваПользователяИБ); + Элементы.ГруппаИмя.Видимость = + ЗначениеЗаполнено(ДействияВФорме.СвойстваПользователяИБ); + Элементы.ОтображениеРолей.Видимость = ЗначениеЗаполнено(ДействияВФорме.Роли); @@ -1124,14 +1170,10 @@ Элементы = Форма.Элементы; // Настройка необходимости заполнения. - Если ТребуетсяЗаписьПользователяИБ(Форма, Ложь) Тогда - НоваяСтраница = Элементы.ИмяСОтметкойНезаполненного; - Иначе - НоваяСтраница = Элементы.ИмяБезОтметкиНезаполненного; - КонецЕсли; - - Если Элементы.ИмяПереключениеОтметкиНезаполненного.ТекущаяСтраница <> НоваяСтраница Тогда - Элементы.ИмяПереключениеОтметкиНезаполненного.ТекущаяСтраница = НоваяСтраница; + ПоказатьИмяСОтметкойНезаполненного = ТребуетсяЗаписьПользователяИБ(Форма, Ложь); + Элементы.ПользовательИБИмя.АвтоОтметкаНезаполненного = ПоказатьИмяСОтметкойНезаполненного; + Если Не ПоказатьИмяСОтметкойНезаполненного Тогда + Элементы.ПользовательИБИмя.ОтметкаНезаполненного = Ложь; КонецЕсли; Если Форма.ПользовательИБСуществует Тогда @@ -1141,7 +1183,7 @@ КраткоеИмя = ПользователиСлужебныйКлиентСервер.ПолучитьКраткоеИмяПользователяИБ( Форма.ТекущееПредставлениеОбъектаАвторизации); - Если Элементы.ИмяПереключениеОтметкиНезаполненного.ТекущаяСтраница = Элементы.ИмяБезОтметкиНезаполненного Тогда + Если Не ПоказатьИмяСОтметкойНезаполненного Тогда Если (Не ЗначениеЗаполнено(Форма.ПользовательИБИмяЗначениеПрямогоИзменения) Или Форма.ПользовательИБИмяЗначениеПрямогоИзменения = КраткоеИмя) @@ -1162,8 +1204,10 @@ &НаКлиенте Процедура АутентификацияПриИзменении() - Если НЕ ПользовательИБАутентификацияOpenID - И НЕ ПользовательИБАутентификацияСтандартная Тогда + Если Не ПользовательИБАутентификацияСтандартная + И Не ПользовательИБАутентификацияOpenID + И Не ПользовательИБАутентификацияOpenIDConnect + И Не ПользовательИБАутентификацияТокеномДоступа Тогда ВходВПрограммуРазрешен = Ложь; @@ -1305,10 +1349,12 @@ КонецЕсли; Если УровеньДоступа.НастройкиДляВхода Тогда - Результат.Вставить("АутентификацияСтандартная", ПользовательИБАутентификацияСтандартная); - Результат.Вставить("Пароль", ПользовательИБПароль); - Результат.Вставить("Имя", ПользовательИБИмя); - Результат.Вставить("АутентификацияOpenID", ПользовательИБАутентификацияOpenID); + Результат.Вставить("АутентификацияСтандартная", ПользовательИБАутентификацияСтандартная); + Результат.Вставить("Пароль", ПользовательИБПароль); + Результат.Вставить("Имя", ПользовательИБИмя); + Результат.Вставить("АутентификацияOpenID", ПользовательИБАутентификацияOpenID); + Результат.Вставить("АутентификацияOpenIDConnect", ПользовательИБАутентификацияOpenIDConnect); + Результат.Вставить("АутентификацияТокеномДоступа", ПользовательИБАутентификацияТокеномДоступа); КонецЕсли; КонецЕсли; @@ -1554,16 +1600,21 @@ ПрочитанныеСвойства, "Имя, |ПолноеИмя, - |АутентификацияOpenID, + |АдресЭлектроннойПочты, |АутентификацияСтандартная, |ПоказыватьВСпискеВыбора, |ЗапрещеноИзменятьПароль, + |ЗапрещеноВосстанавливатьПароль, + |АутентификацияOpenID, + |АутентификацияOpenIDConnect, + |АутентификацияТокеномДоступа, |АутентификацияОС, |ПользовательОС, |ОсновнойИнтерфейс, |РежимЗапуска" + ?(Не Элементы.ПользовательИБЯзык.Видимость, "", ", |Язык") + ?(ПользователиСлужебный.ЗапретРедактированияРолей(), "", ", - |Роли") + ПользователиСлужебный.ПоляВосстановленияПаролей()); + |Роли") + ", + |ЗащитаОтОпасныхДействий"); КонецЕсли; Если ПрочитанныеСвойства = Неопределено Тогда @@ -1585,8 +1636,10 @@ Если ПользовательИБОсновной И Не ВходВПрограммуРазрешен Тогда ХранимыеСвойства = ПользователиСлужебный.ХранимыеСвойстваПользователяИБ(Объект.Ссылка); - ПользовательИБАутентификацияOpenID = ХранимыеСвойства.АутентификацияOpenID; - ПользовательИБАутентификацияСтандартная = ХранимыеСвойства.АутентификацияСтандартная; + ПользовательИБАутентификацияСтандартная = ХранимыеСвойства.АутентификацияСтандартная; + ПользовательИБАутентификацияOpenID = ХранимыеСвойства.АутентификацияOpenID; + ПользовательИБАутентификацияOpenIDConnect = ХранимыеСвойства.АутентификацияOpenIDConnect; + ПользовательИБАутентификацияТокеномДоступа = ХранимыеСвойства.АутентификацияТокеномДоступа; КонецЕсли; Если ПользовательИБСуществует Тогда @@ -1657,7 +1710,18 @@ УточнениеСвойств.Добавить(НСтр("ru = 'Режим запуска (не Авто)'")); КонецЕсли; - Если УточнениеСвойств.Количество() > 0 Тогда + УстановитьПривилегированныйРежим(Истина); + ОтличаютсяСохраненныеСвойстваПользователяИБ = ЗначениеЗаполнено(Объект.Ссылка) + И РегистрыСведений.СведенияОПользователях.ОтличаютсяСохраненныеСвойстваПользователяИБ(Объект); + УстановитьПривилегированныйРежим(Ложь); + + ЕстьРазличияУстранимыеБезАдминистратора = + ЕстьРазличияУстранимыеБезАдминистратора + Или ОтличаютсяСохраненныеСвойстваПользователяИБ; + + Если УточнениеСвойств.Количество() > 0 + Или ОтличаютсяСохраненныеСвойстваПользователяИБ Тогда + СтрокаУточненияСвойств = ""; ТекущаяСтрока = ""; Для каждого УточнениеСвойства Из УточнениеСвойств Цикл @@ -1683,10 +1747,19 @@ Иначе Рекомендация = ""; КонецЕсли; - Элементы.СвойстваПояснениеНесоответствия.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + Если ЗначениеЗаполнено(СтрокаУточненияСвойств) Тогда + ПояснениеНесоответствия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Следующие свойства пользователя информационной базы отличаются от указанных в этой форме: |%1.'"), - СтрокаУточненияСвойств) + Рекомендация; + СтрокаУточненияСвойств) + ?(Не ОтличаютсяСохраненныеСвойстваПользователяИБ, "", " + |" + НСтр("ru = 'Картинка в списке внешних пользователей и объектов авторизации может отображать устаревшее состояние, + |так как отличаются и некоторые другие сохраненные свойства.'")); + Иначе + ПояснениеНесоответствия = + НСтр("ru = 'Картинка в списке внешних пользователей и объектов авторизации может отображать устаревшее состояние, + |так как некоторые свойства пользователя информационной базы отличаются от сохраненных.'"); + КонецЕсли; + Элементы.СвойстваПояснениеНесоответствия.Заголовок = ПояснениеНесоответствия + Рекомендация; Иначе ПоказатьНесоответствие = Ложь; КонецЕсли; @@ -1744,6 +1817,16 @@ ДействияВФорме = Форма.ДействияВФорме; УровеньДоступа = Форма.УровеньДоступа; + // Пояснение состояния "Нет входа". + Если Форма.ВходВПрограммуРазрешен Тогда + Элементы.ГруппаНетПрав.Видимость = Форма.НаличиеПрав.НетПрав; + Элементы.ГруппаНетПравНаЗапуск.Видимость = Не Форма.НаличиеПрав.НетПрав + И Форма.НаличиеПрав.НедостаточноПравДляВхода; + Иначе + Элементы.ГруппаНетПрав.Видимость = Ложь; + Элементы.ГруппаНетПравНаЗапуск.Видимость = Ложь; + КонецЕсли; + // Настройка возможности изменения. Элементы.ОбъектАвторизации.ТолькоПросмотр = ДействияВФорме.СвойстваЭлемента <> "Редактирование" @@ -1754,20 +1837,22 @@ Элементы.Недействителен.ТолькоПросмотр = Не (ДействияВФорме.СвойстваЭлемента = "Редактирование" И УровеньДоступа.УправлениеСписком); - Элементы.ОсновныеСвойства.ТолькоПросмотр = + Элементы.СвойстваПользователяИБ.ТолькоПросмотр = Не ( ДействияВФорме.СвойстваПользователяИБ = "Редактирование" И (УровеньДоступа.УправлениеСписком Или УровеньДоступа.ИзменениеТекущего)); + Элементы.ГруппаИмя.ТолькоПросмотр = Элементы.СвойстваПользователяИБ.ТолькоПросмотр; Элементы.ВходВПрограммуРазрешен.ТолькоПросмотр = - Не ( Элементы.ОсновныеСвойства.ТолькоПросмотр = Ложь + Не ( Элементы.СвойстваПользователяИБ.ТолькоПросмотр = Ложь И ( УровеньДоступа.ИзменениеРазрешенияНаВход Или УровеньДоступа.ОтключениеРазрешенияНаВход И Форма.ПриЧтенииВходВПрограммуРазрешен)); - Элементы.ПользовательИБИмя1.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; - Элементы.ПользовательИБИмя2.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; - Элементы.ПользовательИБАутентификацияСтандартная.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; - Элементы.ПользовательИБАутентификацияOpenID.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; - Элементы.УстановитьРолиНепосредственно.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; + Элементы.ПользовательИБИмя.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; + Элементы.ПользовательИБАутентификацияСтандартная.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; + Элементы.ПользовательИБАутентификацияOpenID.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; + Элементы.ПользовательИБАутентификацияOpenIDConnect.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; + Элементы.ПользовательИБАутентификацияТокеномДоступа.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; + Элементы.УстановитьРолиНепосредственно.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; Элементы.ПотребоватьСменуПароляПриВходе.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; Элементы.ПользовательИБЗапрещеноИзменятьПароль.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; @@ -1787,7 +1872,8 @@ // Настройка доступности связанных элементов. Элементы.ВходВПрограммуРазрешен.Доступность = Не Объект.Недействителен; - Элементы.ОсновныеСвойства.Доступность = Не Объект.Недействителен; + Элементы.СвойстваПользователяИБ.Доступность = Не Объект.Недействителен; + Элементы.ГруппаИмя.Доступность = Не Объект.Недействителен; Элементы.РедактированиеИлиПросмотрРолей.Доступность = Не Объект.Недействителен; Элементы.ГруппаИзменитьОграничение.Доступность = Не Объект.Недействителен И Не Элементы.Недействителен.ТолькоПросмотр; @@ -1827,14 +1913,16 @@ КонецЕсли; Если Форма.ПользовательИБСуществует - ИЛИ Форма.ВходВПрограммуРазрешен - ИЛИ Форма.ПользовательИБИмя <> ТекущееИмя - ИЛИ Форма.ПользовательИБАутентификацияСтандартная <> Шаблон.АутентификацияСтандартная - ИЛИ Форма.ПользовательИБЗапрещеноИзменятьПароль <> Шаблон.ЗапрещеноИзменятьПароль - ИЛИ Форма.ПользовательИБПароль <> Неопределено - ИЛИ Форма.ПользовательИБАутентификацияOpenID <> Шаблон.АутентификацияOpenID - ИЛИ Форма.ПользовательИБЯзык <> Шаблон.Язык - ИЛИ Форма.ПользовательИБРоли.Количество() <> 0 Тогда + Или Форма.ВходВПрограммуРазрешен + Или Форма.ПользовательИБИмя <> ТекущееИмя + Или Форма.ПользовательИБАутентификацияСтандартная <> Шаблон.АутентификацияСтандартная + Или Форма.ПользовательИБЗапрещеноИзменятьПароль <> Шаблон.ЗапрещеноИзменятьПароль + Или Форма.ПользовательИБПароль <> Неопределено + Или Форма.ПользовательИБАутентификацияOpenID <> Шаблон.АутентификацияOpenID + Или Форма.ПользовательИБАутентификацияOpenIDConnect <> Шаблон.АутентификацияOpenIDConnect + Или Форма.ПользовательИБАутентификацияТокеномДоступа <> Шаблон.АутентификацияТокеномДоступа + Или Форма.ПользовательИБЯзык <> Шаблон.Язык + Или Форма.ПользовательИБРоли.Количество() <> 0 Тогда Возврат Истина; КонецЕсли; diff --git a/SSL/src/Catalogs/ВнешниеПользователи/ManagerModule.bsl b/SSL/src/Catalogs/ВнешниеПользователи/ManagerModule.bsl index b78b387fd..74a70b7cb 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/ManagerModule.bsl @@ -27,7 +27,7 @@ НеРедактируемыеРеквизиты.Добавить("УстановитьРолиНепосредственно"); НеРедактируемыеРеквизиты.Добавить("ИдентификаторПользователяИБ"); НеРедактируемыеРеквизиты.Добавить("ИдентификаторПользователяСервиса"); - НеРедактируемыеРеквизиты.Добавить("СвойстваПользователяИБ"); + НеРедактируемыеРеквизиты.Добавить("УдалитьСвойстваПользователяИБ"); Возврат НеРедактируемыеРеквизиты; diff --git a/SSL/src/Catalogs/ВнешниеПользователи/ObjectModule.bsl b/SSL/src/Catalogs/ВнешниеПользователи/ObjectModule.bsl index cf8227c5b..e6f747d11 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/ObjectModule.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/ObjectModule.bsl @@ -66,6 +66,11 @@ ПользователиСлужебный.НачатьОбработкуПользователяИБ(ЭтотОбъект, ПараметрыОбработкиПользователяИБ); + УстановитьПривилегированныйРежим(Истина); + РегистрыСведений.СведенияОПользователях.ОбновитьСведенияОПользователе( + ПользователиСлужебный.СсылкаОбъекта(ЭтотОбъект), ЭтотОбъект); + УстановитьПривилегированныйРежим(Ложь); + КонецПроцедуры Процедура ПриЗаписи(Отказ) diff --git a/SSL/src/Catalogs/ВнешниеПользователи/ВнешниеПользователи.mdo b/SSL/src/Catalogs/ВнешниеПользователи/ВнешниеПользователи.mdo index 6cbeca92d..177157471 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/ВнешниеПользователи.mdo +++ b/SSL/src/Catalogs/ВнешниеПользователи/ВнешниеПользователи.mdo @@ -298,10 +298,10 @@ <dataHistory>Use</dataHistory> </attributes> <attributes uuid="3e090261-4aa2-4ece-9f77-62df83c890b3"> - <name>СвойстваПользователяИБ</name> + <name>УдалитьСвойстваПользователяИБ</name> <synonym> <key>ru</key> - <value>Свойства пользователя ИБ</value> + <value>(не используется) Свойства пользователя ИБ</value> </synonym> <type> <types>ValueStorage</types> diff --git a/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ManagerModule.bsl b/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ManagerModule.bsl index 689017575..c8d4dd27a 100644 --- a/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ManagerModule.bsl @@ -85,7 +85,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать вопрос шаблона анкеты %1 по причине: |%2'"), - Выборка.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Выборка.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Метаданные.Справочники.ВопросыШаблонаАнкеты, Выборка.Ссылка, ТекстСообщения); КонецПопытки; diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Form.form index ed228a5f5..a081d82b2 100644 --- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Form.form index 0f7c81632..87d43746f 100644 --- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Form.form @@ -123,7 +123,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -297,7 +296,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -326,7 +324,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -516,33 +513,6 @@ <placementArea>UserCmds</placementArea> <representationInContextMenu>Auto</representationInContextMenu> </items> - <items xsi:type="form:Button"> - <name>СоставСкопировать</name> - <id>49</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <skipOnInput>false</skipOnInput> - <extendedTooltip> - <name>СоставСкопироватьExtendedTooltip</name> - <id>165</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <commandName>0</commandName> - <buttonImportance>Normal</buttonImportance> - <representation>Auto</representation> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <placementArea>UserCmds</placementArea> - <representationInContextMenu>Auto</representationInContextMenu> - </items> <items xsi:type="form:Button"> <name>СоставУдалить</name> <id>33</id> @@ -625,17 +595,73 @@ <representationInContextMenu>Auto</representationInContextMenu> <locationInCommandBar>InAdditionalSubmenu</locationInCommandBar> </items> - <items xsi:type="form:Button"> - <name>СоставСортироватьПоВозрастанию</name> - <id>198</id> + <items xsi:type="form:FormGroup"> + <name>СоставГруппаКомандСортировать</name> + <id>245</id> + <items xsi:type="form:Button"> + <name>СоставСортироватьПоВозрастанию</name> + <id>198</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>СоставСортироватьПоВозрастаниюРасширеннаяПодсказка</name> + <id>199</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Command.СортироватьПоВозрастанию</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> + <items xsi:type="form:Button"> + <name>СоставСортироватьПоУбыванию</name> + <id>200</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>СоставСортироватьПоУбываниюРасширеннаяПодсказка</name> + <id>201</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Command.СортироватьПоУбыванию</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> <visible>true</visible> <enabled>true</enabled> <userVisible> <common>true</common> </userVisible> + <title> + <key>ru</key> + <value>Состав группа команд сортировать</value> + - СоставСортироватьПоВозрастаниюРасширеннаяПодсказка - 199 + СоставГруппаКомандСортироватьРасширеннаяПодсказка + 246 Label true true @@ -643,39 +669,9 @@ Left - Form.Command.СортироватьПоВозрастанию - Normal - Auto - true - true - UserCmds - Auto - - - СоставСортироватьПоУбыванию - 200 - true - true - - true - - - СоставСортироватьПоУбываниюРасширеннаяПодсказка - 201 - Label - true - true - - Left - - - Form.Command.СортироватьПоУбыванию - Normal - Auto - true - true - UserCmds - Auto + + Compact + СоставСтандартныеКоманды @@ -730,6 +726,38 @@ Item.Состав + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СоставСтрокаПоиск + 247 + + СоставСтрокаПоискРасширеннаяПодсказка + 249 + Label + true + true + + Left + + + + СоставСтрокаПоискКонтекстноеМеню + 248 + true + + Состав + + true + + Left @@ -908,33 +936,6 @@ UserCmds Auto - - СоставКонтекстноеМенюСкопировать - 50 - true - true - - true - - false - - СоставКонтекстноеМенюСкопироватьРасширеннаяПодсказка - 161 - Label - true - true - - Left - - - 0 - Normal - Auto - true - true - UserCmds - Auto - СоставКонтекстноеМенюУдалить 46 @@ -1239,18 +1240,75 @@ РолиКоманднаяПанель 133 - - РолиУстановитьФлажки - 139 + + РолиГруппаКомандФлажки + 243 + + РолиУстановитьФлажки + 139 + true + true + + true + + false + + РолиУстановитьФлажкиExtendedTooltip + 176 + Label + true + true + + Left + + + Form.Command.ВключитьРоли + Normal + Auto + true + true + UserCmds + Auto + + + РолиСнятьФлажки + 140 + true + true + + true + + false + + РолиСнятьФлажкиExtendedTooltip + 177 + Label + true + true + + Left + + + Form.Command.ИсключитьРоли + Normal + Auto + true + true + UserCmds + Auto + true true true - false + + <key>ru</key> + <value>Роли группа команд флажки</value> + - РолиУстановитьФлажкиExtendedTooltip - 176 + РолиГруппаКомандФлажкиРасширеннаяПодсказка + 244 Label true true @@ -1258,40 +1316,9 @@ Left - Form.Command.ВключитьРоли - Normal - Auto - true - true - UserCmds - Auto - - - РолиСнятьФлажки - 140 - true - true - - true - - false - - РолиСнятьФлажкиExtendedTooltip - 177 - Label - true - true - - Left - - - Form.Command.ИсключитьРоли - Normal - Auto - true - true - UserCmds - Auto + + Compact + РолиПоказатьТолькоВыбранныеРоли @@ -1373,6 +1400,38 @@ Item.Роли
        + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + РолиСтрокаПоиск + 250 + + РолиСтрокаПоискРасширеннаяПодсказка + 252 + Label + true + true + + Left + + + + РолиСтрокаПоискКонтекстноеМеню + 251 + true + + Роли + + true + + Left @@ -1510,7 +1569,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Form.form b/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Form.form index 97da86dd0..ac0672f1a 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Form.form +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Form.form @@ -303,6 +303,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 25 + + СтрокаПоискРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 26 + true + + ГруппыДоступа + + true + + Left true diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Form.form index 3ef41762b..9e7c92d2e 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form index 3940f236b..483d170f7 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form @@ -150,7 +150,6 @@ UsualGroup Vertical - Auto true true Auto @@ -360,6 +359,38 @@ Item.Пользователи + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + ПользователиСтрокаПоиск + 451 + + ПользователиСтрокаПоискРасширеннаяПодсказка + 453 + Label + true + true + + Left + + + + ПользователиСтрокаПоискКонтекстноеМеню + 452 + true + + Пользователи + + true + + Left @@ -1329,7 +1360,6 @@ UsualGroup Vertical - Auto true true @@ -1578,7 +1608,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1993,7 +2022,7 @@ Number - 1 + 2 diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl index 416364b97..38212b289 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl @@ -161,7 +161,7 @@ &НаКлиенте Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) - Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено + Если ОбщегоНазначенияКлиент.РазделениеВключено() И Объект.Ссылка = ГруппаДоступаАдминистраторы И ПарольПользователяСервиса = Неопределено Тогда diff --git a/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl b/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl index 01d6c5bd1..228028242 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl @@ -305,6 +305,7 @@ ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ГруппаДоступаОбъект); РегистрыСведений.ТаблицыГруппДоступа.ОбновитьДанныеРегистра(Выборка.Ссылка); РегистрыСведений.ЗначенияГруппДоступа.ОбновитьДанныеРегистра(Выборка.Ссылка); + // @skip-check query-in-loop - Порционная обработка данных в транзакции ПользователиДляОбновления = ПользователиДляОбновленияРолей(Неопределено, ГруппаДоступаОбъект); УправлениеДоступом.ОбновитьРолиПользователей(ПользователиДляОбновления); ЕстьИзменения = Истина; @@ -467,16 +468,16 @@ НаименованиеГруппыЭлементов = НСтр("ru = 'Персональные группы доступа'"); - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("НаименованиеГруппыЭлементов", НаименованиеГруппыЭлементов); - Запрос.Текст = - "ВЫБРАТЬ - | ГруппыДоступа.Ссылка - |ИЗ - | Справочник.ГруппыДоступа КАК ГруппыДоступа - |ГДЕ - | ГруппыДоступа.Наименование ПОДОБНО &НаименованиеГруппыЭлементов - | И ГруппыДоступа.ЭтоГруппа"; + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ГруппыДоступа.Ссылка + |ИЗ + | Справочник.ГруппыДоступа КАК ГруппыДоступа + |ГДЕ + | ГруппыДоступа.Наименование ПОДОБНО &НаименованиеГруппыЭлементов СПЕЦСИМВОЛ ""~"" + | И ГруппыДоступа.ЭтоГруппа"); + Запрос.УстановитьПараметр("НаименованиеГруппыЭлементов", + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(НаименованиеГруппыЭлементов)); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда ГруппаЭлементов = Выборка.Ссылка; @@ -1191,7 +1192,7 @@ НСтр("ru = 'Фоновое задание ""%1"" завершилось с ошибкой: |%2'"), НаименованиеЗадания, - ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке)); Иначе ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Фоновое задание ""%1"" не завершилось.'"), НаименованиеЗадания); @@ -1285,7 +1286,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, Строка(ГруппаДоступа), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, , , ТекстСообщения); diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Form.form index 2dafe3e66..a7fb73aa0 100644 --- a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Form.form index 0c28d41d9..e9c7943f4 100644 --- a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Form.form @@ -115,7 +115,6 @@ UsualGroup Vertical - Auto true true Auto @@ -310,33 +309,6 @@ UserCmds Auto - - СоставСкопировать - 49 - true - true - - true - - false - - СоставСкопироватьExtendedTooltip - 62 - Label - true - true - - Left - - - 0 - Normal - Auto - true - true - UserCmds - Auto - СоставУдалить 33 @@ -419,17 +391,73 @@ Auto InAdditionalSubmenu - - СоставСортироватьПоВозрастанию - 84 + + СоставГруппаКомандСортировать + 119 + + СоставСортироватьПоВозрастанию + 84 + true + true + + true + + + СоставСортироватьПоВозрастаниюРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + Form.Command.СортироватьПоВозрастанию + Normal + Auto + true + true + UserCmds + Auto + + + СоставСортироватьПоУбыванию + 86 + true + true + + true + + + СоставСортироватьПоУбываниюРасширеннаяПодсказка + 87 + Label + true + true + + Left + + + Form.Command.СортироватьПоУбыванию + Normal + Auto + true + true + UserCmds + Auto + true true true + + <key>ru</key> + <value>Состав группа команд сортировать</value> + - СоставСортироватьПоВозрастаниюРасширеннаяПодсказка - 85 + СоставГруппаКомандСортироватьРасширеннаяПодсказка + 120 Label true true @@ -437,39 +465,9 @@ Left - Form.Command.СортироватьПоВозрастанию - Normal - Auto - true - true - UserCmds - Auto - - - СоставСортироватьПоУбыванию - 86 - true - true - - true - - - СоставСортироватьПоУбываниюРасширеннаяПодсказка - 87 - Label - true - true - - Left - - - Form.Command.СортироватьПоУбыванию - Normal - Auto - true - true - UserCmds - Auto + + Compact + ПоказыватьНедействительныхПользователей @@ -524,6 +522,38 @@ Item.Состав + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СоставСтрокаПоиск + 121 + + СоставСтрокаПоискРасширеннаяПодсказка + 123 + Label + true + true + + Left + + + + СоставСтрокаПоискКонтекстноеМеню + 122 + true + + Состав + + true + + Left @@ -702,33 +732,6 @@ UserCmds Auto - - СоставКонтекстноеМенюСкопировать - 50 - true - true - - true - - false - - СоставКонтекстноеМенюСкопироватьРасширеннаяПодсказка - 58 - Label - true - true - - Left - - - 0 - Normal - Auto - true - true - UserCmds - Auto - СоставКонтекстноеМенюУдалить 46 diff --git a/SSL/src/Catalogs/ГруппыПользователей/ГруппыПользователей.mdo b/SSL/src/Catalogs/ГруппыПользователей/ГруппыПользователей.mdo index c80abbc17..48e116997 100644 --- a/SSL/src/Catalogs/ГруппыПользователей/ГруппыПользователей.mdo +++ b/SSL/src/Catalogs/ГруппыПользователей/ГруппыПользователей.mdo @@ -140,7 +140,7 @@ ВсеПользователи Все пользователи - 000000001 + diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Form.form index af6bcd7a8..b180b00fb 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Form.form +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Form.form @@ -384,7 +384,6 @@ UsualGroup Vertical - Auto true true Auto @@ -658,7 +657,6 @@ UsualGroup - Auto true true Auto diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПроверкаДополнительныхОтчетовИОбработок/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПроверкаДополнительныхОтчетовИОбработок/Form.form index beba495ee..e46dbc9e3 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПроверкаДополнительныхОтчетовИОбработок/Form.form +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПроверкаДополнительныхОтчетовИОбработок/Form.form @@ -95,7 +95,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/РазмещениеВРазделах/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/РазмещениеВРазделах/Form.form index cdb73ac5f..fb96ff4df 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/РазмещениеВРазделах/Form.form +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/РазмещениеВРазделах/Form.form @@ -246,6 +246,7 @@ true true true + Top true diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form index ec5bbc9b7..03f4d84da 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto true true Auto @@ -163,7 +162,6 @@ UsualGroup - Auto true true Auto @@ -260,7 +258,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Form.form index 901c1a85f..0724f0776 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Form.form @@ -151,7 +151,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -180,7 +179,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -264,7 +262,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1129,7 +1126,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1277,7 +1273,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2098,7 +2093,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2278,7 +2272,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2858,7 +2851,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -2891,6 +2883,35 @@ false + + СтраницаДополнительныеРеквизиты + 411 + true + true + + true + + + <key>ru</key> + <value>Дополнительные реквизиты</value> + + + СтраницаДополнительныеРеквизитыРасширеннаяПодсказка + 412 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + true true @@ -2913,6 +2934,10 @@ Pages + + OnCurrentPageChange + СтраницыВариантыКомандыРазрешенияПриСменеСтраницы + TabsOnTop Auto @@ -3025,7 +3050,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3309,6 +3333,10 @@ OnCreateAtServer ПриСозданииНаСервере + + FillCheckProcessingAtServer + ОбработкаПроверкиЗаполненияНаСервере + DontBlock true true diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl index 34c00bc60..1bab17b35 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl @@ -30,6 +30,14 @@ Возврат; КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "СтраницаДополнительныеРеквизиты"); + ДополнительныеПараметры.Вставить("ОтложеннаяИнициализация", Истина); + МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами"); + МодульУправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры); + КонецЕсли; + // Проверка возможности загрузки новых обработок в информационную базу. ЭтоНовый = Объект.Ссылка.Пустая(); ПравоДобавления = ДополнительныеОтчетыИОбработки.ПравоДобавления(); @@ -92,6 +100,11 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); + МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект); + КонецЕсли; + КлиентскийКэш = Новый Структура; Если ПоказатьДиалогЗагрузкиИзФайлаПриОткрытии Тогда @@ -156,11 +169,24 @@ КонецЕсли; + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); + Если МодульУправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда + ОбновитьЭлементыДополнительныхРеквизитов(); + МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект); + КонецЕсли; + КонецЕсли + КонецПроцедуры &НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами"); + МодульУправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; + Если ДополнительныеОтчетыИОбработки.ВозможнаВыгрузкаОбработкиВФайл(Объект.Ссылка) Тогда АдресДанныхОбработки = ПоместитьВоВременноеХранилище( @@ -209,6 +235,11 @@ ТекущийОбъект.ДополнительныеСвойства.Вставить("БыстрыйДоступ", БыстрыйДоступ.Выгрузить()); ТекущийОбъект.Разрешения.Загрузить(ПолучитьИзВременногоХранилища(АдресРазрешений)); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами"); + МодульУправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; КонецПроцедуры &НаСервере @@ -244,6 +275,14 @@ КонецПроцедуры +&НаСервере +Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами"); + МодульУправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты); + КонецЕсли; +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовШапкиФормы @@ -329,6 +368,18 @@ КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура СтраницыВариантыКомандыРазрешенияПриСменеСтраницы(Элемент, ТекущаяСтраница) + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") + И ТекущаяСтраница.Имя = "СтраницаДополнительныеРеквизиты" + И Не ЭтотОбъект.ПараметрыСвойств.ВыполненаОтложеннаяИнициализация Тогда + + СвойстваВыполнитьОтложеннуюИнициализацию(); + МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); + МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект); + КонецЕсли; +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыОбъектКоманды @@ -478,6 +529,16 @@ КонецПроцедуры +&НаКлиенте +Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); + МодульУправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -1109,7 +1170,7 @@ Объект.Назначение.Очистить(); Для Каждого ЭлементПараметр Из Параметр Цикл - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ЭлементПараметр.Значение); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ЭлементПараметр.Значение); Если ОбъектМетаданных = Неопределено Тогда Продолжить; КонецЕсли; @@ -1467,7 +1528,7 @@ ВнешнийОбъект = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(Объект.Ссылка); Исключение ТекстОшибки = НСтр("ru = 'Не удалось получить список вариантов отчета из-за ошибки, возникшей при подключении этого отчета:'"); - ТекстСообщения = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстСообщения = ТекстОшибки + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ОбщегоНазначения.СообщитьПользователю(ТекстСообщения); Возврат; КонецПопытки; @@ -1574,4 +1635,47 @@ КонецЕсли; КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Дополнительные реквизиты + +&НаСервере +Процедура СвойстваВыполнитьОтложеннуюИнициализацию() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами"); + МодульУправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьЗависимостиДополнительныхРеквизитов() + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); + МодульУправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); + МодульУправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьЭлементыДополнительныхРеквизитов() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами"); + МодульУправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl index 1bff88c91..aecaaf892 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl @@ -384,7 +384,7 @@ ВнешнийОбъект = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(Ссылка); КонецЕсли; Исключение - ТекстОшибки = НСтр("ru = 'Ошибка подключения:'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = НСтр("ru = 'Ошибка подключения:'") + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ДополнительныеОтчетыИОбработки.ЗаписатьОшибку(Ссылка, ТекстОшибки); ДополнительныеСвойства.Вставить("ОшибкаПодключения", ТекстОшибки); ВнешнийОбъект = Неопределено; diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo index 5b1d39fa1..a2d8776d1 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo @@ -105,6 +105,30 @@ + + Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеРеквизиты + Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеРеквизиты.Attribute.Свойство + Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеРеквизиты.Attribute.ИмяПредопределенногоНабора + + Справочник_ДополнительныеОтчетыИОбработки + + Catalog.ДополнительныеОтчетыИОбработки.TabularSection.ДополнительныеРеквизиты + Catalog.ДополнительныеОтчетыИОбработки.TabularSection.ДополнительныеРеквизиты.StandardAttribute.Ref + Catalog.ДополнительныеОтчетыИОбработки.TabularSection.ДополнительныеРеквизиты.Attribute.Свойство + Catalog.ДополнительныеОтчетыИОбработки.TabularSection.ДополнительныеРеквизиты.Attribute.Значение + + + Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеСведения + Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеСведения.Attribute.Свойство + Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеСведения.Attribute.ИмяПредопределенногоНабора + + Справочник_ДополнительныеОтчетыИОбработки + + InformationRegister.ДополнительныеСведения + InformationRegister.ДополнительныеСведения.Dimension.Объект + InformationRegister.ДополнительныеСведения.Dimension.Свойство + InformationRegister.ДополнительныеСведения.Resource.Значение + Use true @@ -761,6 +785,77 @@ Use
        + + + + + + ДополнительныеРеквизиты + + ru + Дополнительные реквизиты + + + Use + LineNumber + + Use + + + + + Свойство + + ru + Свойство + + + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + + + + Use + Use + + + Значение + + ru + Значение + + Значение + + Characteristic.ДополнительныеРеквизитыИСведения + + + ru + Значение дополнительного реквизита + + + + + Отбор.Владелец + Catalog.ДополнительныеОтчетыИОбработки.TabularSection.ДополнительныеРеквизиты.Attribute.Свойство + + Use + Use + + + ТекстоваяСтрока + + ru + Текстовая строка + + + String + + + + + Use + Use + + ФормаСписка diff --git a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаСписка/Form.form index f380b22b5..34f3f1c3f 100644 --- a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаСписка/Form.form @@ -23,7 +23,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Form.form b/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Form.form index 00d3464bf..f497b793c 100644 --- a/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Form.form +++ b/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Form.form @@ -218,7 +218,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -250,7 +249,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Form.form b/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Form.form index 0cc1f8854..94a31432f 100644 --- a/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Form.form +++ b/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Form.form @@ -29,7 +29,6 @@ UsualGroup Vertical - Auto true true Auto @@ -432,7 +431,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Form.form index a9b768e2c..8b6f5745c 100644 --- a/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Form.form @@ -104,7 +104,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -133,7 +132,6 @@ UsualGroup Vertical - Auto true true Auto @@ -343,7 +341,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -450,7 +447,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Form.form index d0d2d4dac..f833a1d86 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Form.form index a2578fd59..bc83285bc 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Form.form index 672ff8c27..909e99102 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаЭлемента/Form.form index 11de22024..e3d8a9d70 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаЭлемента/Form.form @@ -206,7 +206,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -332,7 +331,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -528,7 +526,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl index c8bfe51a6..5e96b27a9 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl @@ -321,7 +321,7 @@ КлючиЗагружаемых = Новый Соответствие; Для каждого СвойстваЗагружаемого Из ТаблицаЗагружаемых Цикл - Объект = СвойстваЗагружаемого.Объект; + Объект = СвойстваЗагружаемого.Объект; // СправочникОбъект.ИдентификаторыОбъектовМетаданных Ссылка = СвойстваЗагружаемого.Ссылка; Если СвойстваЗагружаемого.Совпадает Тогда @@ -2023,6 +2023,7 @@ ЗаполнитьЗначенияСвойств(ТаблицаОбъект, Свойства); ТаблицаОбъект.КлючОбъектаМетаданных = Новый ХранилищеЗначения(Свойства.КлючОбъектаМетаданных); ТаблицаОбъект.ОбменДанными.Загрузка = Истина; + // @skip-check query-in-loop - В вызываемом варианте ветка с запросом не используется ПроверитьОбъектПередЗаписью(ТаблицаОбъект, Истина); ТаблицаОбъект.Записать(); КонецЦикла; @@ -2231,14 +2232,24 @@ КонецФункции +// Параметры: +// СвойстваИдентификатора - СтрокаТаблицыЗначений: +// * ИдентификаторРасширения - Строка +// * ИмяРасширения - Строка +// * КлючОбъектаМетаданных - ХранилищеЗначения +// * ПолноеИмя - Строка +// * ПолноеИмяКоллекции - Строка +// * ПометкаУдаления - Булево +// * Представление - Строка +// * Ссылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// * ХешСуммаРасширения - Строка +// // Возвращаемое значение: // Структура: // * НеСоответствует - Булево // * КлючОбъектаМетаданных - Произвольный // * ОбъектМетаданных - ОбъектМетаданных -// - Неопределено // * ОбъектМетаданныхУдаленного - ОбъектМетаданных -// - Неопределено // * ПредставлениеУдаленного - Строка // Функция КлючОбъектаМетаданныхСоответствуетПолномуИмени(СвойстваИдентификатора) @@ -3227,6 +3238,7 @@ Если КонфигурацияБазыДанныхИзмененаДинамически Тогда Если ИдентификаторыИзКлючей = Неопределено Тогда + // @skip-check query-in-loop - Вызывается не более одного раза ИдентификаторыИзКлючей = ИдентификаторыИзКлючей(); КонецЕсли; Идентификатор = ИдентификаторыИзКлючей.Получить(ПолноеИмяОбъектаМетаданных); @@ -4047,7 +4059,7 @@ НСтр("ru = 'При записи объекта ""%1"" возникла ошибка: |%2'"), ПолучитьНавигационнуюСсылку(Параметры.Объект.Ссылка), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); Если ТранзакцияАктивна() Тогда ВызватьИсключение ТекстОшибки; КонецЕсли; @@ -4217,7 +4229,7 @@ |%3'"), ПолучитьНавигационнуюСсылку(Параметры.Объект.Ссылка), НаборЗаписей.Метаданные().ПолноеИмя(), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); Если ТранзакцияАктивна() Тогда ВызватьИсключение ТекстОшибки; КонецЕсли; @@ -4256,7 +4268,7 @@ |%3'"), ПолучитьНавигационнуюСсылку(СтрокаТаблицы.Данные), НаборЗаписи.Метаданные().ПолноеИмя(), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); Если ТранзакцияАктивна() Тогда ВызватьИсключение ТекстОшибки; КонецЕсли; @@ -4369,7 +4381,7 @@ НСтр("ru = 'При удалении записи ""%1"" возникла ошибка: |%2'"), ПолучитьНавигационнуюСсылку(МенеджерРегистра.СоздатьКлючЗаписи(СтруктураИзмерений)), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ВызватьИсключение; КонецПопытки; @@ -4398,7 +4410,7 @@ НСтр("ru = 'При добавлении записи ""%1"" возникла ошибка: |%2'"), ПолучитьНавигационнуюСсылку(МенеджерРегистра.СоздатьКлючЗаписи(СтруктураИзмерений)), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ВызватьИсключение; КонецПопытки; @@ -4438,7 +4450,7 @@ НСтр("ru = 'При записи объекта ""%1"" возникла ошибка: |%2'"), ПолучитьНавигационнуюСсылку(Параметры.Объект.Ссылка), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); Если ТранзакцияАктивна() Тогда ВызватьИсключение ТекстОшибки; КонецЕсли; diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ИдентификаторыОбъектовМетаданных.mdo b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ИдентификаторыОбъектовМетаданных.mdo index b880d3036..414b5dfc8 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ИдентификаторыОбъектовМетаданных.mdo +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ИдентификаторыОбъектовМетаданных.mdo @@ -683,6 +683,12 @@ + + РегистрСведенийОриентирыАдресныхОбъектов + + + + РегистрСведенийОтветыНаВопросыАнкет @@ -1199,6 +1205,12 @@ + + РегистрСведенийСвязиАдресныхОбъектов + + + + РегистрСведенийСостоянияПроверокВеденияУчета @@ -1265,31 +1277,6 @@ - - РегистрСведенийАдминистративнаяИерархия - - - - - - РегистрСведенийИсторияАдминистративнойИерархии - - - - - - РегистрСведенийИсторияМуниципальнойИерархии - Регистр сведений история муниципальной иерархии - - - - - - РегистрСведенийМуниципальнаяИерархия - - - - DontAutoUpdate InDialog diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/Forms/ФормаСписка/Form.form index ada9ed83d..dfe6afa09 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/Forms/ФормаЭлемента/Form.form index cc730e9b0..ab2ff082d 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/Forms/ФормаЭлемента/Form.form @@ -284,7 +284,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -410,7 +409,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -607,7 +605,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Form.form index 832c349e6..ffbcb62b5 100644 --- a/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Form.form index e2cc1991c..905576a90 100644 --- a/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Form.form @@ -73,7 +73,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -251,7 +250,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -285,7 +283,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -314,7 +311,6 @@ UsualGroup Vertical - Auto true true Auto @@ -398,7 +394,6 @@ UsualGroup Vertical - Auto true true Auto @@ -427,7 +422,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true Auto @@ -714,7 +708,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -743,7 +736,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -777,7 +769,6 @@ UsualGroup Vertical - Auto true true Auto @@ -852,7 +843,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -998,7 +988,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1027,7 +1016,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1056,7 +1044,6 @@ UsualGroup Vertical - Auto true true Equal @@ -1451,7 +1438,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1480,7 +1466,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true Auto @@ -1509,7 +1494,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1602,7 +1586,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1631,7 +1614,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1735,7 +1717,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1765,7 +1746,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1843,7 +1823,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -1957,7 +1936,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2015,7 +1993,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2196,7 +2173,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2287,7 +2263,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2316,7 +2291,6 @@ UsualGroup HorizontalIfPossible - Auto true true LeftWidest @@ -2422,7 +2396,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/Catalogs/Календари/ManagerModule.bsl b/SSL/src/Catalogs/Календари/ManagerModule.bsl index b470a9eb4..dc476c650 100644 --- a/SSL/src/Catalogs/Календари/ManagerModule.bsl +++ b/SSL/src/Catalogs/Календари/ManagerModule.bsl @@ -56,7 +56,7 @@ НСтр("ru = 'Не удалось обработать график работы ""%1"" по причине: |%2'"), Выборка.Ссылка, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации( ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, diff --git a/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаСписка/Form.form index 6843debe5..0907bc090 100644 --- a/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаЭлемента/Form.form index 1564461a5..f642df605 100644 --- a/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаЭлемента/Form.form @@ -195,7 +195,6 @@ UsualGroup Vertical - Auto true true Auto @@ -434,7 +433,6 @@ UsualGroup - Auto true true Auto @@ -506,7 +504,6 @@ UsualGroup Vertical - Auto true true Auto @@ -618,7 +615,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -925,7 +921,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаСписка/Form.form index 576ec5158..e9e2be80b 100644 --- a/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/КлючиДоступа/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/КлючиДоступа/Forms/ФормаСписка/Form.form index 01bc0a9eb..a5ad77c8d 100644 --- a/SSL/src/Catalogs/КлючиДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/КлючиДоступа/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Catalogs/КлючиДоступа/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/КлючиДоступа/Forms/ФормаЭлемента/Form.form index cf9e4511c..6907c1a26 100644 --- a/SSL/src/Catalogs/КлючиДоступа/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/КлючиДоступа/Forms/ФормаЭлемента/Form.form @@ -141,7 +141,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -255,7 +254,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -367,7 +365,6 @@ HorizontalIfPossible Center - Auto true true Auto diff --git a/SSL/src/Catalogs/МакетыПечатныхФорм/Forms/УсловияВидимостиВПодменюПечать/Module.bsl b/SSL/src/Catalogs/МакетыПечатныхФорм/Forms/УсловияВидимостиВПодменюПечать/Module.bsl index a5fce9d83..3125779c6 100644 --- a/SSL/src/Catalogs/МакетыПечатныхФорм/Forms/УсловияВидимостиВПодменюПечать/Module.bsl +++ b/SSL/src/Catalogs/МакетыПечатныхФорм/Forms/УсловияВидимостиВПодменюПечать/Module.bsl @@ -165,27 +165,30 @@ &НаСервере Процедура ЗаполнитьСписокВыбораПоля() - Если Не ЗначениеЗаполнено(Объект.ИсточникДанных) Тогда - Возврат; - КонецЕсли; - - ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(Объект.ИсточникДанных, Ложь); - Если ОбъектМетаданных = Неопределено Тогда - Возврат; - КонецЕсли; - - КоллекцииРеквизитов = Новый Массив; - КоллекцииРеквизитов.Добавить(ОбъектМетаданных.СтандартныеРеквизиты); - КоллекцииРеквизитов.Добавить(ОбъектМетаданных.Реквизиты); - - Для Каждого КоллекцияРеквизитов Из КоллекцииРеквизитов Цикл - Для Каждого Реквизит Из КоллекцияРеквизитов Цикл - ОписаниеРеквизита = РеквизитыОбъекта.Добавить(); - ОписаниеРеквизита.Поле = Реквизит.Имя; - ОписаниеРеквизита.Тип = Реквизит.Тип; - ОписаниеРеквизита.ПредставлениеПоля = Реквизит.Представление(); - - Элементы.УсловияВидимостиПоле.СписокВыбора.Добавить(ОписаниеРеквизита.Поле, ОписаниеРеквизита.ПредставлениеПоля); + Для Каждого СтрокаТаблицы Из Объект.ИсточникиДанных Цикл + ИсточникДанных = СтрокаТаблицы.ИсточникДанных; + Если Не ЗначениеЗаполнено(ИсточникДанных) Тогда + Продолжить; + КонецЕсли; + + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ИсточникДанных, Ложь); + Если ОбъектМетаданных = Неопределено Тогда + Возврат; + КонецЕсли; + + КоллекцииРеквизитов = Новый Массив; + КоллекцииРеквизитов.Добавить(ОбъектМетаданных.СтандартныеРеквизиты); + КоллекцииРеквизитов.Добавить(ОбъектМетаданных.Реквизиты); + + Для Каждого КоллекцияРеквизитов Из КоллекцииРеквизитов Цикл + Для Каждого Реквизит Из КоллекцияРеквизитов Цикл + ОписаниеРеквизита = РеквизитыОбъекта.Добавить(); + ОписаниеРеквизита.Поле = Реквизит.Имя; + ОписаниеРеквизита.Тип = Реквизит.Тип; + ОписаниеРеквизита.ПредставлениеПоля = Реквизит.Представление(); + + Элементы.УсловияВидимостиПоле.СписокВыбора.Добавить(ОписаниеРеквизита.Поле, ОписаниеРеквизита.ПредставлениеПоля); + КонецЦикла; КонецЦикла; КонецЦикла; diff --git a/SSL/src/Catalogs/МакетыПечатныхФорм/ManagerModule.bsl b/SSL/src/Catalogs/МакетыПечатныхФорм/ManagerModule.bsl index 1ef8d033f..c632be23d 100644 --- a/SSL/src/Catalogs/МакетыПечатныхФорм/ManagerModule.bsl +++ b/SSL/src/Catalogs/МакетыПечатныхФорм/ManagerModule.bsl @@ -8,6 +8,57 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// Возвращает реквизиты объекта, которые разрешается редактировать +// с помощью обработки группового изменения реквизитов. +// +// Возвращаемое значение: +// Массив из Строка +// +Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт + + РедактируемыеРеквизиты = Новый Массив; + РедактируемыеРеквизиты.Добавить("Используется"); + + Возврат РедактируемыеРеквизиты; + +КонецФункции + +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// Регистрирует на плане обмена ОбновлениеИнформационнойБазы объекты, +// которые необходимо обновить на новую версию. +// +// Параметры: +// Параметры - Структура - служебный параметр для передачи в процедуру ОбновлениеИнформационнойБазы.ОтметитьКОбработке. +// +Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт + + ТекстЗапроса = + "ВЫБРАТЬ + | МакетыПечатныхФорм.Ссылка + |ИЗ + | Справочник.МакетыПечатныхФорм КАК МакетыПечатныхФорм + |ГДЕ + | МакетыПечатныхФорм.ИсточникДанных <> НЕОПРЕДЕЛЕНО"; + + Запрос = Новый Запрос(ТекстЗапроса); + Макеты = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + + ДополнительныеПараметры = ОбновлениеИнформационнойБазы.ДополнительныеПараметрыОтметкиОбработки(); + ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, Макеты, ДополнительныеПараметры); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + #Область СлужебныйПрограммныйИнтерфейс // Параметры: @@ -60,18 +111,52 @@ #Область СлужебныеПроцедурыИФункции +Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию(Параметры) Экспорт + + Выборка = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, "Справочник.МакетыПечатныхФорм"); + Пока Выборка.Следующий() Цикл + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.МакетыПечатныхФорм"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + + Макет = Выборка.Ссылка.ПолучитьОбъект(); // СправочникОбъект.МакетыПечатныхФорм + СтрокаТаблицы = Макет.ИсточникиДанных.Добавить(); + СтрокаТаблицы.ИсточникДанных = Макет.ИсточникДанных; + Макет.ИсточникДанных = Неопределено; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Макет); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + КонецЦикла; + + Параметры.ОбработкаЗавершена = ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, "РегистрСведений.ПользовательскиеМакетыПечати"); + +КонецПроцедуры + Функция ЗаписатьМакет(ОписаниеМакета) Экспорт Ссылка = ОписаниеМакета.Ссылка; Если ЗначениеЗаполнено(Ссылка) Тогда Объект = Ссылка.ПолучитьОбъект(); Иначе - Объект = Справочники.МакетыПечатныхФорм.СоздатьЭлемент(); - Объект.ИсточникДанных = ОписаниеМакета.Владелец; + Объект = СоздатьЭлемент(); Объект.ТипМакета = ОписаниеМакета.ТипМакета; Объект.Идентификатор = Новый УникальныйИдентификатор; КонецЕсли; - + + Объект.ИсточникиДанных.Очистить(); + Для Каждого ИсточникДанных Из ОписаниеМакета.ИсточникиДанных Цикл + НоваяСтрока = Объект.ИсточникиДанных.Добавить(); + НоваяСтрока.ИсточникДанных = ИсточникДанных; + КонецЦикла; + Наименование = ОписаниеМакета.Наименование; КодЯзыка = ОписаниеМакета.КодЯзыка; Макет = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(ОписаниеМакета.АдресМакетаВоВременномХранилище)); @@ -186,7 +271,9 @@ Если Макет = Неопределено Тогда Продолжить; КонецЕсли; - Макет.КодЯзыка = ОбщегоНазначения.КодОсновногоЯзыка(); + Если ТипЗнч(Макет) <> Тип("ДвоичныеДанные") Тогда + Макет.КодЯзыка = ОбщегоНазначения.КодОсновногоЯзыка(); + КонецЕсли; Возврат Макет; КонецЦикла; @@ -194,33 +281,7 @@ КонецФункции -Функция ВладелецМакета(ПутьКМакету) Экспорт - - Идентификатор = ИдентификаторМакета(ПутьКМакету); - Если Идентификатор = Неопределено Тогда - Возврат Неопределено; - КонецЕсли; - - ТекстЗапроса = - "ВЫБРАТЬ - | МакетыПечатныхФорм.ИсточникДанных КАК ИсточникДанных - |ИЗ - | Справочник.МакетыПечатныхФорм КАК МакетыПечатныхФорм - |ГДЕ - | МакетыПечатныхФорм.Идентификатор = &Идентификатор"; - - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("Идентификатор", Идентификатор); - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - Возврат Выборка.ИсточникДанных; - КонецЕсли; - - Возврат Неопределено; - -КонецФункции - -Функция ИдентификаторМакета(ПутьКМакету) +Функция ИдентификаторМакета(ПутьКМакету) Экспорт ЧастиПути = СтрРазделить(ПутьКМакету, ".", Истина); @@ -291,6 +352,57 @@ КонецПроцедуры +Функция ИсточникиДанныхМакета(ПутьКМакету) Экспорт + + Идентификатор = ИдентификаторМакета(ПутьКМакету); + Если Идентификатор = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ + | МакетыПечатныхФормИсточникиДанных.ИсточникДанных КАК ИсточникДанных + |ИЗ + | Справочник.МакетыПечатныхФорм.ИсточникиДанных КАК МакетыПечатныхФормИсточникиДанных + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.МакетыПечатныхФорм КАК МакетыПечатныхФорм + | ПО МакетыПечатныхФормИсточникиДанных.Ссылка = МакетыПечатныхФорм.Ссылка + |ГДЕ + | МакетыПечатныхФорм.Идентификатор = &Идентификатор"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("Идентификатор", Идентификатор); + + ИсточникиДанныхМакета = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ИсточникДанных"); + + Возврат ИсточникиДанныхМакета; + +КонецФункции + +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.Процедура = "Справочники.МакетыПечатныхФорм.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Обработчик.Версия = "3.1.8.48"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("959d09e5-1dc3-4f32-833a-05ff17365e30"); + Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.МакетыПечатныхФорм.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; + Обработчик.Комментарий = НСтр("ru = 'Заполняет сведения об источниках данных печати для пользовательских печатных форм. До завершения обработки некоторые печатные формы могут быть недоступны.'"); + + Читаемые = Новый Массив; + Читаемые.Добавить(Метаданные.Справочники.МакетыПечатныхФорм.ПолноеИмя()); + Обработчик.ЧитаемыеОбъекты = СтрСоединить(Читаемые, ","); + + Изменяемые = Новый Массив; + Изменяемые.Добавить(Метаданные.Справочники.МакетыПечатныхФорм.ПолноеИмя()); + Обработчик.ИзменяемыеОбъекты = СтрСоединить(Изменяемые, ","); + + Блокируемые = Новый Массив; + Блокируемые.Добавить(Метаданные.Справочники.МакетыПечатныхФорм.ПолноеИмя()); + Обработчик.БлокируемыеОбъекты = СтрСоединить(Блокируемые, ","); + +КонецПроцедуры + #КонецОбласти #КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/МакетыПечатныхФорм/МакетыПечатныхФорм.mdo b/SSL/src/Catalogs/МакетыПечатныхФорм/МакетыПечатныхФорм.mdo index d0ed44f53..3693b2256 100644 --- a/SSL/src/Catalogs/МакетыПечатныхФорм/МакетыПечатныхФорм.mdo +++ b/SSL/src/Catalogs/МакетыПечатныхФорм/МакетыПечатныхФорм.mdo @@ -289,6 +289,40 @@ ForFolderAndItem + + + + + + ИсточникиДанных + + ru + Источники данных + + + Use + LineNumber + + Use + + + + + ИсточникДанных + + ru + Источник данных + + + CatalogRef.ИдентификаторыОбъектовРасширений + CatalogRef.ИдентификаторыОбъектовМетаданных + + + + Use + Use + + УсловияВидимостиВПодменюПечать diff --git a/SSL/src/Catalogs/НаборыГруппДоступа/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/НаборыГруппДоступа/Forms/ФормаСписка/Form.form index d5c467191..f7f2ff47b 100644 --- a/SSL/src/Catalogs/НаборыГруппДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/НаборыГруппДоступа/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Catalogs/НаборыГруппДоступа/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/НаборыГруппДоступа/Forms/ФормаЭлемента/Form.form index 60a52dff6..6a359b350 100644 --- a/SSL/src/Catalogs/НаборыГруппДоступа/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/НаборыГруппДоступа/Forms/ФормаЭлемента/Form.form @@ -133,7 +133,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -256,7 +255,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Form.form index ee149ae04..f74a94689 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Form.form @@ -91,7 +91,6 @@ UsualGroup Vertical - Auto true true Auto @@ -107,6 +106,52 @@ Основная 190 + + ПолеПоиска + 213 + true + true + + true + + + ПолеПоиска + + None + + ПолеПоискаРасширеннаяПодсказка + 215 + Label + true + true + + Left + + + + ПолеПоискаКонтекстноеМеню + 214 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + ru + Поле поиска + + + НаборыСвойств 1 @@ -1271,6 +1316,7 @@ Style.FormBackColor + Top true @@ -1296,7 +1342,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1638,58 +1683,6 @@ Auto InAdditionalSubmenu - - СписокНайти - 36 - true - true - - true - - - СписокНайтиExtendedTooltip - 117 - Label - true - true - - Left - - - 0 - Normal - Auto - true - true - UserCmds - Auto - - - СписокОтменитьПоиск - 37 - true - true - - true - - - СписокОтменитьПоискExtendedTooltip - 118 - Label - true - true - - Left - - - 0 - Normal - Auto - true - true - UserCmds - Auto - ГруппаКнопокКопирование 177 @@ -2266,6 +2259,24 @@ true + + ПолеПоиска + + <key>ru</key> + <value>Поле поиска</value> + + 15 + + String + + + + true + + + true + + ПереместитьВверх diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Module.bsl index 93076b3df..77418881b 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Module.bsl @@ -497,6 +497,31 @@ ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("СвойстваЗаголовок"); ЭлементОформляемогоПоля.Использование = Истина; + // Оформление свойств, обязательных для заполнения. + ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); + ЭлементВидимость = ЭлементУсловногоОформления.Оформление.Элементы.Найти("Видимость"); + ЭлементВидимость.Значение = Ложь; + ЭлементВидимость.Использование = Истина; + + ГруппаЭлементовОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); + ГруппаЭлементовОтбораДанных.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ; + ГруппаЭлементовОтбораДанных.Использование = Истина; + + ЭлементОтбораДанных = ГруппаЭлементовОтбораДанных.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПолеПоиска"); + ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено; + ЭлементОтбораДанных.Использование = Истина; + + ЭлементОтбораДанных = ГруппаЭлементовОтбораДанных.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НаборыСвойств.Представление"); + ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.НеСодержит; + ЭлементОтбораДанных.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ПолеПоиска"); + ЭлементОтбораДанных.Использование = Истина; + + ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); + ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("Представление"); + ЭлементОформляемогоПоля.Использование = Истина; + КонецПроцедуры &НаКлиенте @@ -777,7 +802,10 @@ Если Элементы.Свойства.ЦветФона <> Элементы.НаборыСвойств.ЦветФона Тогда Элементы.Свойства.ЦветФона = Элементы.НаборыСвойств.ЦветФона; КонецЕсли; - ОбновитьСписокСвойствТекущегоНабора(ТекущаяДоступность); + УправлениеСвойствамиСлужебный.ОбновитьСписокСвойствТекущегоНабора(ЭтотОбъект, + ТекущийНабор, + ЭтоНаборыДополнительныхСведений, + ТекущаяДоступность); Иначе ТекущаяДоступность = Ложь; Если Элементы.Свойства.ЦветФона <> ЦветФормы Тогда @@ -837,248 +865,6 @@ КонецПроцедуры -&НаСервере -Процедура ОбновитьСписокСвойствТекущегоНабора(ТекущаяДоступность) - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Набор", ТекущийНабор); - Запрос.УстановитьПараметр("ЭтоОсновнойЯзык", ОбщегоНазначения.ЭтоОсновнойЯзык()); - Запрос.УстановитьПараметр("КодЯзыка", ТекущийЯзык().КодЯзыка); - - Если Не ПоказатьНеиспользуемыеРеквизиты Тогда - Запрос.Текст = - "ВЫБРАТЬ - | СвойстваНаборов.НомерСтроки, - | СвойстваНаборов.Свойство, - | СвойстваНаборов.ПометкаУдаления, - | Свойства.Заголовок КАК Заголовок, - | Свойства.ВладелецДополнительныхЗначений, - | Свойства.ЗаполнятьОбязательно, - | Свойства.ТипЗначения КАК ТипЗначения, - | ИСТИНА КАК Общее, - | ВЫБОР - | КОГДА СвойстваНаборов.ПометкаУдаления = ИСТИНА - | ТОГДА 4 - | ИНАЧЕ 3 - | КОНЕЦ КАК НомерКартинки - |ИЗ - | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК СвойстваНаборов - | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства - | ПО СвойстваНаборов.Свойство = Свойства.Ссылка - |ГДЕ - | СвойстваНаборов.Ссылка = &Набор - | - |УПОРЯДОЧИТЬ ПО - | СвойстваНаборов.НомерСтроки - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | Наборы.ВерсияДанных КАК ВерсияДанных - |ИЗ - | Справочник.НаборыДополнительныхРеквизитовИСведений КАК Наборы - |ГДЕ - | Наборы.Ссылка = &Набор"; - Иначе - Запрос.Текст = - "ВЫБРАТЬ - | Свойства.Ссылка КАК Свойство, - | Свойства.ПометкаУдаления КАК ПометкаУдаления, - | Свойства.Заголовок КАК Заголовок, - | Свойства.ВладелецДополнительныхЗначений, - | Свойства.ТипЗначения КАК ТипЗначения, - | ИСТИНА КАК Общее, - | ВЫБОР - | КОГДА Свойства.ПометкаУдаления = ИСТИНА - | ТОГДА 4 - | ИНАЧЕ 3 - | КОНЕЦ КАК НомерКартинки, - | Свойства.Подсказка КАК Подсказка, - | Свойства.ЗаголовокФормыЗначения КАК ЗаголовокФормыЗначения, - | Свойства.ЗаголовокФормыВыбораЗначения КАК ЗаголовокФормыВыбораЗначения - |ИЗ - | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства - | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Представления КАК СвойстваПредставления - | ПО Свойства.Ссылка = СвойстваПредставления.Ссылка - | И СвойстваПредставления.КодЯзыка = &КодЯзыка - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК СоставНабора - | ПО Свойства.Ссылка = СоставНабора.Свойство - |ГДЕ - | Свойства.ЭтоДополнительноеСведение = &ЭтоДополнительноеСведение - | И СоставНабора.Свойство ЕСТЬ NULL - | - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ""ВерсияДанных"" КАК ВерсияДанных"; - - Запрос.УстановитьПараметр("ЭтоДополнительноеСведение", (ЭтоНаборыДополнительныхСведений = 1)); - КонецЕсли; - - Если ЭтоНаборыДополнительныхСведений Тогда - Запрос.Текст = СтрЗаменить( - Запрос.Текст, - "Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты", - "Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения"); - КонецЕсли; - - СуффиксТекущегоЯзыка = ОбщегоНазначения.СуффиксЯзыкаТекущегоПользователя(); - Если СуффиксТекущегоЯзыка = Неопределено Тогда - - Если Не ПоказатьНеиспользуемыеРеквизиты Тогда - Позиция = СтрНайти(Запрос.Текст, "ГДЕ"); - Запрос.Текст = Лев(Запрос.Текст, Позиция - 1 ) + " ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Представления КАК СвойстваПредставления - | ПО Свойства.Ссылка = СвойстваПредставления.Ссылка - | И СвойстваПредставления.КодЯзыка = &КодЯзыка" + Сред(Запрос.Текст, Позиция -1); - КонецЕсли; - - Запрос.Текст = СтрЗаменить(Запрос.Текст, "Свойства.Заголовок КАК Заголовок", - "ВЫРАЗИТЬ(ЕСТЬNULL(СвойстваПредставления.Заголовок, Свойства.Заголовок) КАК СТРОКА(150)) КАК Заголовок"); - Запрос.Текст = СтрЗаменить(Запрос.Текст, "Свойства.Подсказка КАК Подсказка", - "ВЫРАЗИТЬ(ЕСТЬNULL(СвойстваПредставления.Подсказка, Свойства.Подсказка) КАК СТРОКА(150)) КАК Подсказка"); - Запрос.Текст = СтрЗаменить(Запрос.Текст, "Свойства.ЗаголовокФормыЗначения КАК ЗаголовокФормыЗначения", - "ВЫРАЗИТЬ(ЕСТЬNULL(СвойстваПредставления.ЗаголовокФормыЗначения, Свойства.ЗаголовокФормыЗначения) КАК СТРОКА(150)) КАК ЗаголовокФормыЗначения"); - Запрос.Текст = СтрЗаменить(Запрос.Текст, "Свойства.ЗаголовокФормыВыбораЗначения КАК ЗаголовокФормыВыбораЗначения", - "ВЫРАЗИТЬ(ЕСТЬNULL(СвойстваПредставления.ЗаголовокФормыВыбораЗначения, Свойства.ЗаголовокФормыВыбораЗначения) КАК СТРОКА(150)) КАК ЗаголовокФормыВыбораЗначения"); - Иначе - - Если ЗначениеЗаполнено(СуффиксТекущегоЯзыка) И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда - МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); - МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(Запрос.Текст, "Свойства.Заголовок КАК Заголовок"); - Если ПоказатьНеиспользуемыеРеквизиты Тогда - МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(Запрос.Текст, "Свойства.Подсказка КАК Подсказка"); - МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(Запрос.Текст, "Свойства.ЗаголовокФормыЗначения КАК ЗаголовокФормыЗначения"); - МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(Запрос.Текст, "Свойства.ЗаголовокФормыВыбораЗначения КАК ЗаголовокФормыВыбораЗначения"); - КонецЕсли; - КонецЕсли; - - КонецЕсли; - - НачатьТранзакцию(); - Попытка - РезультатыЗапроса = Запрос.ВыполнитьПакет(); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - Если Элементы.Свойства.ТекущаяСтрока = Неопределено Тогда - Строка = Неопределено; - Иначе - Строка = Свойства.НайтиПоИдентификатору(Элементы.Свойства.ТекущаяСтрока); - КонецЕсли; - ТекущееСвойство = ?(Строка = Неопределено, Неопределено, Строка.Свойство); - - Свойства.Очистить(); - - Если РезультатыЗапроса[1].Пустой() Тогда - ТекущаяДоступность = Ложь; - Возврат; - КонецЕсли; - - ТекущийНаборВерсияДанных = РезультатыЗапроса[1].Выгрузить()[0].ВерсияДанных; - - Выборка = РезультатыЗапроса[0].Выбрать(); - Пока Выборка.Следующий() Цикл - - НоваяСтрока = Свойства.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка); - - НоваяСтрока.ОбщиеЗначения = ЗначениеЗаполнено(Выборка.ВладелецДополнительныхЗначений); - - Если Выборка.ТипЗначения <> NULL - И УправлениеСвойствамиСлужебный.ТипЗначенияСодержитЗначенияСвойств(Выборка.ТипЗначения) Тогда - - НоваяСтрока.ТипЗначения = Строка(Новый ОписаниеТипов( - Выборка.ТипЗначения, - , - "СправочникСсылка.ЗначенияСвойствОбъектовИерархия, - |СправочникСсылка.ЗначенияСвойствОбъектов")); - - Запрос = Новый Запрос; - Если ЗначениеЗаполнено(Выборка.ВладелецДополнительныхЗначений) Тогда - Запрос.УстановитьПараметр("Владелец", Выборка.ВладелецДополнительныхЗначений); - Иначе - Запрос.УстановитьПараметр("Владелец", Выборка.Свойство); - КонецЕсли; - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 4 - | ПРЕДСТАВЛЕНИЕ(ЗначенияСвойствОбъектов.Ссылка) КАК Наименование - |ИЗ - | Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов - |ГДЕ - | ЗначенияСвойствОбъектов.Владелец = &Владелец - | И НЕ ЗначенияСвойствОбъектов.ЭтоГруппа - | И НЕ ЗначенияСвойствОбъектов.ПометкаУдаления - | - |ОБЪЕДИНИТЬ - | - |ВЫБРАТЬ ПЕРВЫЕ 4 - | ПРЕДСТАВЛЕНИЕ(ЗначенияСвойствОбъектовИерархия.Ссылка) КАК Наименование - |ИЗ - | Справочник.ЗначенияСвойствОбъектовИерархия КАК ЗначенияСвойствОбъектовИерархия - |ГДЕ - | ЗначенияСвойствОбъектовИерархия.Владелец = &Владелец - | И НЕ ЗначенияСвойствОбъектовИерархия.ПометкаУдаления - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА КАК ЗначениеИстина - |ИЗ - | Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов - |ГДЕ - | ЗначенияСвойствОбъектов.Владелец = &Владелец - | И НЕ ЗначенияСвойствОбъектов.ЭтоГруппа - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - |ИЗ - | Справочник.ЗначенияСвойствОбъектовИерархия КАК ЗначенияСвойствОбъектовИерархия - |ГДЕ - | ЗначенияСвойствОбъектовИерархия.Владелец = &Владелец"; - РезультатыЗапроса = Запрос.ВыполнитьПакет(); - - ПервыеЗначения = РезультатыЗапроса[0].Выгрузить().ВыгрузитьКолонку("Наименование"); - - Если ПервыеЗначения.Количество() = 0 Тогда - Если РезультатыЗапроса[1].Пустой() Тогда - ПредставлениеЗначений = НСтр("ru = 'Значения еще не введены'"); - Иначе - ПредставлениеЗначений = НСтр("ru = 'Значения помечены на удаление'"); - КонецЕсли; - Иначе - ПредставлениеЗначений = ""; - Номер = 0; - Для каждого Значение Из ПервыеЗначения Цикл - Номер = Номер + 1; - Если Номер = 4 Тогда - ПредставлениеЗначений = ПредставлениеЗначений + ",..."; - Прервать; - КонецЕсли; - ПредставлениеЗначений = ПредставлениеЗначений + ?(Номер > 1, ", ", "") + Значение; - КонецЦикла; - КонецЕсли; - ПредставлениеЗначений = "<" + ПредставлениеЗначений + ">"; - Если ЗначениеЗаполнено(НоваяСтрока.ТипЗначения) Тогда - ПредставлениеЗначений = ПредставлениеЗначений + ", "; - КонецЕсли; - НоваяСтрока.ТипЗначения = ПредставлениеЗначений + НоваяСтрока.ТипЗначения; - КонецЕсли; - - Если Выборка.Свойство = ТекущееСвойство Тогда - Элементы.Свойства.ТекущаяСтрока = - Свойства[Свойства.Количество()-1].ПолучитьИдентификатор(); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - &НаСервере Процедура ДобавитьОбщееСвойствоПеретаскиванием(ДобавляемоеСвойство) diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl index 495d050c8..af793d8ff 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl @@ -259,7 +259,7 @@ |ГДЕ | НаборыДополнительныхРеквизитовИСведений.Родитель = &Родитель | И НаборыДополнительныхРеквизитовИСведений.Предопределенный = ЛОЖЬ"; - ПереносимыеНаборы = Запрос.Выполнить().Выгрузить(); + ПереносимыеНаборы = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - Порционная обработка данных. Для Каждого Строка Из ПереносимыеНаборы Цикл НаборОбъект = Строка.Ссылка.ПолучитьОбъект(); НаборОбъект.Родитель = НовыйНабор; @@ -276,7 +276,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать набор свойств %1 по причине: |%2'"), - ОбновляемыйНабор.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбновляемыйНабор.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Метаданные.Справочники.НаборыДополнительныхРеквизитовИСведений, ОбновляемыйНабор.Ссылка, ТекстСообщения); КонецПопытки; diff --git a/SSL/src/Catalogs/НастройкиАвторизацииИнтернетСервисов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/НастройкиАвторизацииИнтернетСервисов/Forms/ФормаЭлемента/Form.form index 373dd0632..b69a8dddf 100644 --- a/SSL/src/Catalogs/НастройкиАвторизацииИнтернетСервисов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/НастройкиАвторизацииИнтернетСервисов/Forms/ФормаЭлемента/Form.form @@ -15,10 +15,6 @@ <dataPath xsi:type="form:DataPath"> <segments>Объект.ВладелецДанных</segments> </dataPath> - <toolTip> - <key>ru</key> - <value>Имя домена-владельца данных. По этому имени определяется возможность использования аутентификации по протоколу OAuth. Например, mycompany.zzz.</value> - </toolTip> <toolTipRepresentation>Button</toolTipRepresentation> <extendedTooltip> <name>ВладелецДанныхРасширеннаяПодсказка</name> @@ -61,10 +57,6 @@ <dataPath xsi:type="form:DataPath"> <segments>Объект.ИмяИнтернетСервиса</segments> </dataPath> - <toolTip> - <key>ru</key> - <value>Доменное имя сервера, на котором хранятся данные. Например, outlook.com.</value> - </toolTip> <toolTipRepresentation>Button</toolTipRepresentation> <extendedTooltip> <name>ИмяИнтернетСервисаРасширеннаяПодсказка</name> @@ -107,10 +99,6 @@ <dataPath xsi:type="form:DataPath"> <segments>Объект.АдресАвторизации</segments> </dataPath> - <toolTip> - <key>ru</key> - <value>Адрес для интерактивной авторизации пользователя</value> - </toolTip> <toolTipRepresentation>Button</toolTipRepresentation> <extendedTooltip> <name>АдресАвторизацииРасширеннаяПодсказка</name> @@ -153,10 +141,6 @@ <dataPath xsi:type="form:DataPath"> <segments>Объект.АдресПеренаправления</segments> </dataPath> - <toolTip> - <key>ru</key> - <value>Адрес перенаправления пользователя после авторизации</value> - </toolTip> <toolTipRepresentation>Button</toolTipRepresentation> <extendedTooltip> <name>АдресПеренаправленияРасширеннаяПодсказка</name> @@ -281,10 +265,6 @@ <dataPath xsi:type="form:DataPath"> <segments>Объект.АдресПолученияКлюча</segments> </dataPath> - <toolTip> - <key>ru</key> - <value>Адрес для получения и обновления токенов</value> - </toolTip> <toolTipRepresentation>Button</toolTipRepresentation> <extendedTooltip> <name>АдресПолученияКлючаРасширеннаяПодсказка</name> @@ -327,10 +307,6 @@ <dataPath xsi:type="form:DataPath"> <segments>Объект.ЗапрашиваемыеРазрешения</segments> </dataPath> - <toolTip> - <key>ru</key> - <value>Идентификаторы разрешений, разделенные пробелом.</value> - </toolTip> <toolTipRepresentation>Button</toolTipRepresentation> <extendedTooltip> <name>ЗапрашиваемыеРазрешенияРасширеннаяПодсказка</name> @@ -373,10 +349,6 @@ <dataPath xsi:type="form:DataPath"> <segments>Объект.ИдентификаторПриложения</segments> </dataPath> - <toolTip> - <key>ru</key> - <value>Идентификатор этого приложения на сервере с данными</value> - </toolTip> <toolTipRepresentation>Button</toolTipRepresentation> <extendedTooltip> <name>ИдентификаторПриложенияРасширеннаяПодсказка</name> @@ -459,7 +431,7 @@ <passwordMode>true</passwordMode> <choiceButton>true</choiceButton> <choiceButtonPicture xsi:type="core:PictureRef"> - <picture>CommonPicture.ВводимыеСимволыСкрыты</picture> + <picture>CommonPicture.ВводимыеСимволыВидны</picture> </choiceButtonPicture> <chooseType>true</chooseType> <typeDomainEnabled>true</typeDomainEnabled> @@ -478,10 +450,6 @@ <dataPath xsi:type="form:DataPath"> <segments>Объект.ДополнительныеПараметрыАвторизации</segments> </dataPath> - <toolTip> - <key>ru</key> - <value>Дополнительные параметры, которые необходимо передать в запросе авторизации. Указываются в формате ИмяПараметра=Значение, разделитель - пробел.</value> - </toolTip> <toolTipRepresentation>Button</toolTipRepresentation> <extendedTooltip> <name>ДополнительныеПараметрыАвторизацииРасширеннаяПодсказка</name> @@ -524,10 +492,6 @@ <dataPath xsi:type="form:DataPath"> <segments>Объект.ДополнительныеПараметрыПолученияТокена</segments> </dataPath> - <toolTip> - <key>ru</key> - <value>Дополнительные параметры, которые необходимо передать в запросе обмена кода авторизации на токен доступа. Указываются в формате ИмяПараметра=Значение, разделитель - пробел.</value> - </toolTip> <toolTipRepresentation>Button</toolTipRepresentation> <extendedTooltip> <name>ДополнительныеПараметрыПолученияТокенаРасширеннаяПодсказка</name> @@ -571,10 +535,6 @@ <segments>Объект.ИспользоватьКлючПроверкиПодлинностиPKCE</segments> </dataPath> <titleLocation>Right</titleLocation> - <toolTip> - <key>ru</key> - <value>Установите этот флажок, если в запросах авторизации и обмена кода авторизации на токен доступа на сервере авторизации поддерживается защита с помощью ключа проверки подлинности "Proof Key for Code Exchange (PKCE)"</value> - </toolTip> <toolTipRepresentation>Button</toolTipRepresentation> <extendedTooltip> <name>ИспользоватьКлючПроверкиПодлинностиPKCEРасширеннаяПодсказка</name> @@ -610,10 +570,6 @@ <segments>Объект.ИспользоватьПарольПриложения</segments> </dataPath> <titleLocation>Right</titleLocation> - <toolTip> - <key>ru</key> - <value>Установите этот флажок, если для получения токенов требуется передавать в запросах пароль приложения (client_secret)</value> - </toolTip> <toolTipRepresentation>Button</toolTipRepresentation> <extendedTooltip> <name>ИспользоватьПарольПриложенияРасширеннаяПодсказка</name> diff --git a/SSL/src/Catalogs/НастройкиАвторизацииИнтернетСервисов/НастройкиАвторизацииИнтернетСервисов.mdo b/SSL/src/Catalogs/НастройкиАвторизацииИнтернетСервисов/НастройкиАвторизацииИнтернетСервисов.mdo index 48bf96bfd..459fc8767 100644 --- a/SSL/src/Catalogs/НастройкиАвторизацииИнтернетСервисов/НастройкиАвторизацииИнтернетСервисов.mdo +++ b/SSL/src/Catalogs/НастройкиАвторизацииИнтернетСервисов/НастройкиАвторизацииИнтернетСервисов.mdo @@ -122,6 +122,10 @@ <length>200</length> </stringQualifiers> </type> + <toolTip> + <key>ru</key> + <value>Имя домена-владельца данных. По этому имени определяется возможность использования аутентификации по протоколу OAuth. Например, mycompany.zzz.</value> + </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:UndefinedValue"/> @@ -140,7 +144,7 @@ </type> <toolTip> <key>ru</key> - <value>Адрес для получения кода авторизации</value> + <value>Адрес для интерактивной авторизации пользователя</value> </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> @@ -160,7 +164,7 @@ </type> <toolTip> <key>ru</key> - <value>Адрес для получения и обновления ключей доступа</value> + <value>Адрес для получения и обновления токенов</value> </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> @@ -180,6 +184,10 @@ <length>200</length> </stringQualifiers> </type> + <toolTip> + <key>ru</key> + <value>Доменное имя сервера, на котором хранятся данные. Например, outlook.com.</value> + </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:UndefinedValue"/> @@ -196,6 +204,10 @@ <types>String</types> <stringQualifiers/> </type> + <toolTip> + <key>ru</key> + <value>Идентификатор этого приложения на сервере с данными</value> + </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:UndefinedValue"/> @@ -212,6 +224,10 @@ <types>String</types> <stringQualifiers/> </type> + <toolTip> + <key>ru</key> + <value>Адрес перенаправления пользователя после авторизации</value> + </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:UndefinedValue"/> @@ -227,6 +243,10 @@ <type> <types>Boolean</types> </type> + <toolTip> + <key>ru</key> + <value>Установите этот флажок, если в запросах авторизации и обмена кода авторизации на токен доступа на сервере авторизации поддерживается защита с помощью ключа проверки подлинности "Proof Key for Code Exchange (PKCE)"</value> + </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:UndefinedValue"/> @@ -243,6 +263,10 @@ <types>String</types> <stringQualifiers/> </type> + <toolTip> + <key>ru</key> + <value>Идентификаторы разрешений, разделенные пробелом.</value> + </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:UndefinedValue"/> @@ -258,6 +282,10 @@ <type> <types>Boolean</types> </type> + <toolTip> + <key>ru</key> + <value>Установите этот флажок, если для получения токенов требуется передавать в запросах пароль приложения (client_secret)</value> + </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:UndefinedValue"/> @@ -274,6 +302,10 @@ <types>String</types> <stringQualifiers/> </type> + <toolTip> + <key>ru</key> + <value>Дополнительные параметры, которые необходимо передать в запросе авторизации. Указываются в формате Параметр=Значение, разделитель - пробел.</value> + </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:UndefinedValue"/> @@ -290,6 +322,10 @@ <types>String</types> <stringQualifiers/> </type> + <toolTip> + <key>ru</key> + <value>Дополнительные параметры, которые необходимо передать в запросе обмена кода авторизации на токен доступа. Указываются в формате Параметр=Значение, разделитель - пробел.</value> + </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:UndefinedValue"/> @@ -306,6 +342,10 @@ <types>String</types> <stringQualifiers/> </type> + <toolTip> + <key>ru</key> + <value>Адрес перенаправления пользователя после авторизации (при работе в веб-клиенте)</value> + </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:UndefinedValue"/> diff --git a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Form.form index af64f22e3..1090b27c3 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Form.form @@ -29,7 +29,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаСписка/Form.form index 01efb098c..de83ff8ea 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Form.form index 524fc23b7..a2a9934df 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Form.form @@ -95,7 +95,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl b/SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl index f8b8bc3db..ba5821cbf 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl +++ b/SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl @@ -101,7 +101,7 @@ НовыйРабочийКаталогПапки = РабочийКаталогРодителяПапки + Наименование + ПолучитьРазделительПути(); - РаботаСФайламиСлужебныйВызовСервера.СохранитьРабочийКаталогПапки(Ссылка, НовыйРабочийКаталогПапки); + РаботаСФайламиСлужебный.СохранитьРабочийКаталогПапки(Ссылка, НовыйРабочийКаталогПапки); КонецЕсли; КонецЕсли; КонецЕсли; @@ -127,9 +127,9 @@ НовыйРабочийКаталогПапки = РабочийКаталогНовогоРодителяПапки + Наименование + ПолучитьРазделительПути(); - РаботаСФайламиСлужебныйВызовСервера.СохранитьРабочийКаталогПапки(Ссылка, НовыйРабочийКаталогПапки); + РаботаСФайламиСлужебный.СохранитьРабочийКаталогПапки(Ссылка, НовыйРабочийКаталогПапки); Иначе - РаботаСФайламиСлужебныйВызовСервера.ОчиститьРабочийКаталог(Ссылка); + РаботаСФайламиСлужебный.ОчиститьРабочийКаталог(Ссылка); КонецЕсли; КонецЕсли; КонецЕсли; @@ -150,9 +150,9 @@ Если ДополнительныеСвойства.Свойство("РабочийКаталог", РабочийКаталог) Или ДополнительныеСвойства.ПрошлыйЭтоНовый Тогда Если РабочийКаталог = "" Тогда - РаботаСФайламиСлужебныйВызовСервера.ОчиститьРабочийКаталог(Ссылка); + РаботаСФайламиСлужебный.ОчиститьРабочийКаталог(Ссылка); ИначеЕсли РабочийКаталог <> Неопределено Тогда - РаботаСФайламиСлужебныйВызовСервера.СохранитьРабочийКаталогПапки(Ссылка, РабочийКаталог); + РаботаСФайламиСлужебный.СохранитьРабочийКаталогПапки(Ссылка, РабочийКаталог); Иначе РабочийКаталогПапки = РаботаСФайламиСлужебныйВызовСервера.РабочийКаталогПапки(Родитель); Если РабочийКаталогПапки <> "" Тогда @@ -164,7 +164,7 @@ РабочийКаталогПапки = РабочийКаталогПапки + Наименование + ПолучитьРазделительПути(); - РаботаСФайламиСлужебныйВызовСервера.СохранитьРабочийКаталогПапки(Ссылка, РабочийКаталогПапки); + РаботаСФайламиСлужебный.СохранитьРабочийКаталогПапки(Ссылка, РабочийКаталогПапки); КонецЕсли; КонецЕсли; КонецЕсли; diff --git a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Form.form index 27d5dddd9..f1b0243f8 100644 --- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Form.form @@ -72,7 +72,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <showTitle>auto</showTitle> diff --git a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаСписка/Form.form index 787e09976..263e3ddfd 100644 --- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаСписка/Form.form @@ -23,7 +23,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <showTitle>auto</showTitle> diff --git a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаЭлемента/Form.form index c975f17cd..b9c7a2865 100644 --- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаЭлемента/Form.form @@ -105,7 +105,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ManagerModule.bsl b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ManagerModule.bsl index 8c8e4b76c..43ade1f61 100644 --- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ManagerModule.bsl @@ -147,12 +147,12 @@ ОтменитьТранзакцию(); - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать %1 %2 по причине: |%3'"), - ПолноеИмяОбъекта, ОбъектыДляОбработки.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ПолноеИмяОбъекта, ОбъектыДляОбработки.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, diff --git a/SSL/src/Catalogs/Пользователи/Forms/ВыборПользователяОперационнойСистемы/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ВыборПользователяОперационнойСистемы/Form.form index 1a0b56178..6a695858c 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ВыборПользователяОперационнойСистемы/Form.form +++ b/SSL/src/Catalogs/Пользователи/Forms/ВыборПользователяОперационнойСистемы/Form.form @@ -1,220 +1,26 @@ <?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"> <items xsi:type="form:FormGroup"> - <name>ДоменыИПользователи</name> - <id>2</id> + <name>Страницы</name> + <id>71</id> <items xsi:type="form:FormGroup"> - <name>ГруппаДомены</name> - <id>51</id> - <items xsi:type="form:Table"> - <name>ТаблицаДоменов</name> - <id>5</id> + <name>СтраницаОжидание</name> + <id>73</id> + <items xsi:type="form:Decoration"> + <name>ДлительнаяОперация</name> + <id>77</id> <title> <key>ru</key> - <value>Таблица доменов</value> + <value>Длительная операция</value> true true true - - СписокДоменов - - false - None - Add - Change - Copy - CopyToClipboard - Delete - EndEdit - MoveDown - MoveUp - SortListAsc - SortListDesc - - Домены - 11 - - <key>ru</key> - <value>Домены</value> - - true - true - - true - - - СписокДоменов.ИмяДомена - - - ДоменыExtendedTooltip - 34 - Label - true - true - - Left - - - - ДоменыКонтекстноеМеню - 12 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - - Style.BorderColor - - Normal - - - - ТаблицаДоменовКоманднаяПанель - 7 - - ТаблицаДоменовНайти - 41 - true - true - - true - - - ТаблицаДоменовНайтиРасширеннаяПодсказка - 42 - Label - true - true - - Left - - - Form.Item.ТаблицаДоменов.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - - - ТаблицаДоменовОтменитьПоиск - 43 - true - true - - true - - - ТаблицаДоменовОтменитьПоискРасширеннаяПодсказка - 44 - Label - true - true - - Left - - - Form.Item.ТаблицаДоменов.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto - - Left - - - OnActivateRow - ТаблицаДоменовПриАктивизацииСтроки - - - ТаблицаДоменовSearchString - 53 - - ТаблицаДоменовSearchStringExtendedTooltip - 55 - Label - true - true - - Left - - - - ТаблицаДоменовSearchStringContextMenu - 54 - true - - ТаблицаДоменов - - true - - - - ТаблицаДоменовViewStatus - 56 - - ТаблицаДоменовViewStatusExtendedTooltip - 58 - Label - true - true - - Left - - - - ТаблицаДоменовViewStatusContextMenu - 57 - true - - ViewStatusAddition - ТаблицаДоменов - - true - - - - ТаблицаДоменовSearchControl - 59 - - ТаблицаДоменовSearchControlExtendedTooltip - 61 - Label - true - true - - Left - - - - ТаблицаДоменовSearchControlContextMenu - 60 - true - - SearchControlAddition - ТаблицаДоменов - - true - - - ТаблицаДоменовExtendedTooltip - 33 + ДлительнаяОперацияРасширеннаяПодсказка + 79 Label true true @@ -223,115 +29,52 @@ - ТаблицаДоменовКонтекстноеМеню - 6 - - ТаблицаДоменовКонтекстноеМенюНайти - 17 - true - true - - true - - - ТаблицаДоменовКонтекстноеМенюНайтиExtendedTooltip - 30 - Label - true - true - - Left - - - Form.Item.ТаблицаДоменов.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - - - ТаблицаДоменовКонтекстноеМенюОтменитьПоиск - 18 - true - true - - true - - - ТаблицаДоменовКонтекстноеМенюОтменитьПоискExtendedTooltip - 31 - Label - true - true - - Left - - - Form.Item.ТаблицаДоменов.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto - - - ТаблицаДоменовКонтекстноеМенюВывестиСписок - 21 - true - true - - true - - - ТаблицаДоменовКонтекстноеМенюВывестиСписокExtendedTooltip - 32 - Label - true - true - - Left - - - Form.Item.ТаблицаДоменов.StandardCommand.OutputList - Normal - Auto - true - true - UserCmds - Auto - + ДлительнаяОперацияКонтекстноеМеню + 78 true - true - true - true - true - 40 true true - 4 - true - 1 - 1 - AutoUse - AutoUse - true - true - false - false - false - Auto - Auto - true - true - - Style.BorderColor - - true - + + + CommonPicture.ДлительнаяОперация48 + + AsFileRef + + + + ДлительнаяОперацияПояснение + 80 + + <key>ru</key> + <value>Заполняются домены и пользователи операционной системы...</value> + + true + true + + true + + + ДлительнаяОперацияПояснениеРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + + ДлительнаяОперацияПояснениеКонтекстноеМеню + 81 + true + + Label + true + true + + Left + true true @@ -340,11 +83,11 @@ <key>ru</key> - <value>Домены:</value> + <value>Страница ожидание</value> - ГруппаДоменыРасширеннаяПодсказка - 52 + СтраницаОжиданиеРасширеннаяПодсказка + 74 Label true true @@ -352,66 +95,32 @@ Left - UsualGroup - - Vertical - Auto - WeakSeparation - true - true + Page + + AlwaysHorizontal + Center auto - Auto - Auto + false - ГруппаПользователи - 49 - - ТаблицаПользователейДомена - 8 - - <key>ru</key> - <value>Таблица пользователей домена</value> - - true - true - - true - - - СписокПользователейТекущегоДомена - - false - None - Add - Change - Copy - CopyToClipboard - Delete - EndEdit - MoveDown - MoveUp - SortListAsc - SortListDesc - - Пользователи - 13 - - <key>ru</key> - <value>Пользователи</value> - + СтраницаВыбор + 83 + + КомандыФормы + 75 + + Выбрать + 16 true true true - - СписокПользователейТекущегоДомена.ИмяПользователя - + false - ПользователиExtendedTooltip - 40 + ВыбратьExtendedTooltip + 28 Label true true @@ -419,163 +128,35 @@ Left - - ПользователиКонтекстноеМеню - 14 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - - Style.BorderColor - - Normal - + Form.Command.Выбрать + Auto + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto - - ТаблицаПользователейДоменаКоманднаяПанель - 10 - - ТаблицаПользователейДоменаНайти - 45 - true - true - - true - - - ТаблицаПользователейДоменаНайтиРасширеннаяПодсказка - 46 - Label - true - true - - Left - - - Form.Item.ТаблицаПользователейДомена.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - - - ТаблицаПользователейДоменаОтменитьПоиск - 47 - true - true - - true - - - ТаблицаПользователейДоменаОтменитьПоискРасширеннаяПодсказка - 48 - Label - true - true - - Left - - - Form.Item.ТаблицаПользователейДомена.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto - - Left - - - Selection - ТаблицаПользователейДоменаВыбор - - - ТаблицаПользователейДоменаSearchString - 62 - - ТаблицаПользователейДоменаSearchStringExtendedTooltip - 64 - Label - true - true - - Left - - - - ТаблицаПользователейДоменаSearchStringContextMenu - 63 - true - - ТаблицаПользователейДомена - - true - - - - ТаблицаПользователейДоменаViewStatus - 65 - - ТаблицаПользователейДоменаViewStatusExtendedTooltip - 67 - Label - true - true - - Left - - - - ТаблицаПользователейДоменаViewStatusContextMenu - 66 - true - - ViewStatusAddition - ТаблицаПользователейДомена - - true - - - - ТаблицаПользователейДоменаSearchControl - 68 - - ТаблицаПользователейДоменаSearchControlExtendedTooltip - 70 - Label - true - true - - Left - - - - ТаблицаПользователейДоменаSearchControlContextMenu - 69 - true - - SearchControlAddition - ТаблицаПользователейДомена - - true - - + true + true + + true + + + <key>ru</key> + <value>Команды формы</value> + - ТаблицаПользователейДоменаExtendedTooltip - 39 + КомандыФормыРасширеннаяПодсказка + 76 Label true true @@ -583,20 +164,228 @@ Left - - ТаблицаПользователейДоменаКонтекстноеМеню - 9 - - ТаблицаПользователейДоменаКонтекстноеМенюВыбрать - 27 + CommandBar + + Left + Form + + + + ДоменыИПользователи + 2 + + ГруппаДомены + 51 + + ТаблицаДоменов + 5 + + <key>ru</key> + <value>Таблица доменов</value> + true true true + + СписокДоменов + + false + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + SortListAsc + SortListDesc + + Домены + 11 + + <key>ru</key> + <value>Домены</value> + + true + true + + true + + + СписокДоменов.ИмяДомена + + + ДоменыExtendedTooltip + 34 + Label + true + true + + Left + + + + ДоменыКонтекстноеМеню + 12 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ТаблицаДоменовКоманднаяПанель + 7 + + ТаблицаДоменовНайти + 41 + true + true + + true + + + ТаблицаДоменовНайтиРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + Form.Item.ТаблицаДоменов.StandardCommand.Find + Normal + PictureAndText + true + true + UserCmds + Auto + + + ТаблицаДоменовОтменитьПоиск + 43 + true + true + + true + + + ТаблицаДоменовОтменитьПоискРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + Form.Item.ТаблицаДоменов.StandardCommand.CancelSearch + Normal + PictureAndText + true + true + UserCmds + Auto + + Left + true + + + OnActivateRow + ТаблицаДоменовПриАктивизацииСтроки + + + ТаблицаДоменовSearchString + 53 + + ТаблицаДоменовSearchStringExtendedTooltip + 55 + Label + true + true + + Left + + + + ТаблицаДоменовSearchStringContextMenu + 54 + true + + ТаблицаДоменов + + true + + + + ТаблицаДоменовViewStatus + 56 + + ТаблицаДоменовViewStatusExtendedTooltip + 58 + Label + true + true + + Left + + + + ТаблицаДоменовViewStatusContextMenu + 57 + true + + ViewStatusAddition + ТаблицаДоменов + + true + + + + ТаблицаДоменовSearchControl + 59 + + ТаблицаДоменовSearchControlExtendedTooltip + 61 + Label + true + true + + Left + + + + ТаблицаДоменовSearchControlContextMenu + 60 + true + + SearchControlAddition + ТаблицаДоменов + + true + + - ТаблицаПользователейДоменаКонтекстноеМенюВыбратьExtendedTooltip - 35 + ТаблицаДоменовExtendedTooltip + 33 Label true true @@ -604,25 +393,360 @@ Left - Form.Command.Выбрать - Normal - Auto + + ТаблицаДоменовКонтекстноеМеню + 6 + + ТаблицаДоменовКонтекстноеМенюНайти + 17 + true + true + + true + + + ТаблицаДоменовКонтекстноеМенюНайтиExtendedTooltip + 30 + Label + true + true + + Left + + + Form.Item.ТаблицаДоменов.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаДоменовКонтекстноеМенюОтменитьПоиск + 18 + true + true + + true + + + ТаблицаДоменовКонтекстноеМенюОтменитьПоискExtendedTooltip + 31 + Label + true + true + + Left + + + Form.Item.ТаблицаДоменов.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаДоменовКонтекстноеМенюВывестиСписок + 21 + true + true + + true + + + ТаблицаДоменовКонтекстноеМенюВывестиСписокExtendedTooltip + 32 + Label + true + true + + Left + + + Form.Item.ТаблицаДоменов.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + true + true + 15 true true - UserCmds - Auto + 3 + true + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + Auto + Auto + true + true + + Style.BorderColor + + true + - - ТаблицаПользователейДоменаКонтекстноеМенюНайти - 22 + true + true + + true + + + <key>ru</key> + <value>Домены:</value> + + + ГруппаДоменыРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + UsualGroup + + Vertical + WeakSeparation + true + true + auto + Auto + Auto + + + + ГруппаПользователи + 49 + + ТаблицаПользователейДомена + 8 + + <key>ru</key> + <value>Таблица пользователей домена</value> + true true true + + СписокПользователейТекущегоДомена + + false + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + SortListAsc + SortListDesc + + Пользователи + 13 + + <key>ru</key> + <value>Пользователи</value> + + true + true + + true + + + СписокПользователейТекущегоДомена.ИмяПользователя + + + ПользователиExtendedTooltip + 40 + Label + true + true + + Left + + + + ПользователиКонтекстноеМеню + 14 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ТаблицаПользователейДоменаКоманднаяПанель + 10 + + ТаблицаПользователейДоменаНайти + 45 + true + true + + true + + + ТаблицаПользователейДоменаНайтиРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + Form.Item.ТаблицаПользователейДомена.StandardCommand.Find + Normal + PictureAndText + true + true + UserCmds + Auto + + + ТаблицаПользователейДоменаОтменитьПоиск + 47 + true + true + + true + + + ТаблицаПользователейДоменаОтменитьПоискРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + Form.Item.ТаблицаПользователейДомена.StandardCommand.CancelSearch + Normal + PictureAndText + true + true + UserCmds + Auto + + Left + true + + + Selection + ТаблицаПользователейДоменаВыбор + + + ТаблицаПользователейДоменаSearchString + 62 + + ТаблицаПользователейДоменаSearchStringExtendedTooltip + 64 + Label + true + true + + Left + + + + ТаблицаПользователейДоменаSearchStringContextMenu + 63 + true + + ТаблицаПользователейДомена + + true + + + + ТаблицаПользователейДоменаViewStatus + 65 + + ТаблицаПользователейДоменаViewStatusExtendedTooltip + 67 + Label + true + true + + Left + + + + ТаблицаПользователейДоменаViewStatusContextMenu + 66 + true + + ViewStatusAddition + ТаблицаПользователейДомена + + true + + + + ТаблицаПользователейДоменаSearchControl + 68 + + ТаблицаПользователейДоменаSearchControlExtendedTooltip + 70 + Label + true + true + + Left + + + + ТаблицаПользователейДоменаSearchControlContextMenu + 69 + true + + SearchControlAddition + ТаблицаПользователейДомена + + true + + - ТаблицаПользователейДоменаКонтекстноеМенюНайтиExtendedTooltip - 36 + ТаблицаПользователейДоменаExtendedTooltip + 39 Label true true @@ -630,95 +754,200 @@ Left - Form.Item.ТаблицаПользователейДомена.StandardCommand.Find - Normal - Auto + + ТаблицаПользователейДоменаКонтекстноеМеню + 9 + + ТаблицаПользователейДоменаКонтекстноеМенюВыбрать + 27 + true + true + + true + + + ТаблицаПользователейДоменаКонтекстноеМенюВыбратьExtendedTooltip + 35 + Label + true + true + + Left + + + Form.Command.Выбрать + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаПользователейДоменаКонтекстноеМенюНайти + 22 + true + true + + true + + + ТаблицаПользователейДоменаКонтекстноеМенюНайтиExtendedTooltip + 36 + Label + true + true + + Left + + + Form.Item.ТаблицаПользователейДомена.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаПользователейДоменаКонтекстноеМенюОтменитьПоиск + 23 + true + true + + true + + + ТаблицаПользователейДоменаКонтекстноеМенюОтменитьПоискExtendedTooltip + 37 + Label + true + true + + Left + + + Form.Item.ТаблицаПользователейДомена.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаПользователейДоменаКонтекстноеМенюВывестиСписок + 26 + true + true + + true + + + ТаблицаПользователейДоменаКонтекстноеМенюВывестиСписокExtendedTooltip + 38 + Label + true + true + + Left + + + Form.Item.ТаблицаПользователейДомена.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + true + true true true - UserCmds - Auto + 5 + true + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + Auto + Auto + true + true + + Style.BorderColor + + true + - - ТаблицаПользователейДоменаКонтекстноеМенюОтменитьПоиск - 23 - true - true - - true - - - ТаблицаПользователейДоменаКонтекстноеМенюОтменитьПоискExtendedTooltip - 37 - Label - true - true - - Left - - - Form.Item.ТаблицаПользователейДомена.StandardCommand.CancelSearch - Normal - Auto + true + true + + true + + + <key>ru</key> + <value>Пользователи:</value> + + + ГруппаПользователиРасширеннаяПодсказка + 50 + Label true true - UserCmds - Auto - - - ТаблицаПользователейДоменаКонтекстноеМенюВывестиСписок - 26 - true - true - - true - - - ТаблицаПользователейДоменаКонтекстноеМенюВывестиСписокExtendedTooltip - 38 - Label - true - true - - Left - - - Form.Item.ТаблицаПользователейДомена.StandardCommand.OutputList - Normal - Auto - true - true - UserCmds - Auto - - true - - true - true - true - true - 40 - true - true - 4 - true - 1 - 1 - AutoUse - AutoUse - true - true - false - false - false - Auto - Auto - true - true - - Style.BorderColor - - true - + + Left + + + UsualGroup + + Vertical + WeakSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Домены и пользователи</value> + + + ДоменыИПользователиExtendedTooltip + 29 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + true true @@ -727,11 +956,11 @@ <key>ru</key> - <value>Пользователи:</value> + <value>Страница выбор</value> - ГруппаПользователиРасширеннаяПодсказка - 50 + СтраницаВыборРасширеннаяПодсказка + 84 Label true true @@ -739,16 +968,11 @@ Left - UsualGroup - + Page + Vertical - Auto - WeakSeparation - true - true auto - Auto - Auto + false true @@ -758,11 +982,11 @@ <key>ru</key> - <value>Домены и пользователи</value> + <value>Страницы</value> - ДоменыИПользователиExtendedTooltip - 29 + СтраницыРасширеннаяПодсказка + 85 Label true true @@ -770,58 +994,15 @@ Left - UsualGroup - - HorizontalIfPossible - Auto - NormalSeparation - true - true - Auto + Pages + Auto ФормаКоманднаяПанель -1 - - Выбрать - 16 - true - true - - true - - false - - ВыбратьExtendedTooltip - 28 - Label - true - true - - Left - - - Form.Command.Выбрать - Auto - true - true - true - UserCmds - - Style.ButtonTextColor - - - Style.ButtonBackColor - - - Style.BorderColor - - Auto - Left - true OnOpen @@ -830,7 +1011,6 @@ Abort Cancel Close - CustomizeForm Ignore No OK @@ -838,8 +1018,6 @@ Retry SaveValues Yes - 80 - 20 LockOwner true true diff --git a/SSL/src/Catalogs/Пользователи/Forms/ВыборПользователяОперационнойСистемы/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ВыборПользователяОперационнойСистемы/Module.bsl index d536b83a1..3d11b973a 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ВыборПользователяОперационнойСистемы/Module.bsl +++ b/SSL/src/Catalogs/Пользователи/Forms/ВыборПользователяОперационнойСистемы/Module.bsl @@ -11,13 +11,7 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) -#Если ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда - ТаблицаДоменовИПользователей = ПользователиОС(); -#ИначеЕсли ТонкийКлиент Тогда - ТаблицаДоменовИПользователей = Новый ФиксированныйМассив (ПользователиОС()); -#КонецЕсли - - ЗаполнитьСписокДоменов(); + ПодключитьОбработчикОжидания("ЗаполнитьПользователейОС", 0.1, Истина); КонецПроцедуры @@ -87,7 +81,13 @@ #Область СлужебныеПроцедурыИФункции &НаКлиенте -Процедура ЗаполнитьСписокДоменов() +Процедура ЗаполнитьПользователейОС() + +#Если ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда + ТаблицаДоменовИПользователей = ПользователиОС(); +#ИначеЕсли ТонкийКлиент Тогда + ТаблицаДоменовИПользователей = Новый ФиксированныйМассив (ПользователиОС()); +#КонецЕсли СписокДоменов.Очистить(); @@ -98,6 +98,8 @@ СписокДоменов.Сортировать("ИмяДомена"); + Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаВыбор; + КонецПроцедуры &НаКлиенте diff --git a/SSL/src/Catalogs/Пользователи/Forms/ОграничениеНаВходВПрограмму/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ОграничениеНаВходВПрограмму/Form.form index 4c28c2dab..b6b5f6652 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ОграничениеНаВходВПрограмму/Form.form +++ b/SSL/src/Catalogs/Пользователи/Forms/ОграничениеНаВходВПрограмму/Form.form @@ -220,7 +220,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -380,7 +379,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -409,7 +407,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИнформационнойБазы/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИнформационнойБазы/Form.form index ce3bcd76d..ab3a0d39e 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИнформационнойБазы/Form.form +++ b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИнформационнойБазы/Form.form @@ -42,7 +42,7 @@ КоманднаяПанель 49 - ПользователиИБСопоставить + Сопоставить 94 true true @@ -50,7 +50,7 @@ true - ПользователиИБСопоставитьРасширеннаяПодсказка + СопоставитьРасширеннаяПодсказка 95 Label true @@ -68,7 +68,7 @@ Auto - ПользователиИБСопоставитьСНовым + СопоставитьСНовым 98 true true @@ -76,7 +76,7 @@ true - ПользователиИБСопоставитьСНовымРасширеннаяПодсказка + СопоставитьСНовымРасширеннаяПодсказка 99 Label true @@ -94,7 +94,7 @@ Auto - ПользователиИБОтменитьСопоставление + ОтменитьСопоставление 102 true true @@ -102,7 +102,7 @@ true - ПользователиИБОтменитьСопоставлениеРасширеннаяПодсказка + ОтменитьСопоставлениеРасширеннаяПодсказка 103 Label true @@ -120,7 +120,7 @@ Auto - ПользователиИБНайти + Найти 20 true true @@ -129,7 +129,7 @@ false - ПользователиИБНайтиРасширеннаяПодсказка + НайтиРасширеннаяПодсказка 59 Label true @@ -147,7 +147,7 @@ Auto - ПользователиИБОтменитьПоиск + ОтменитьПоиск 21 true true @@ -156,7 +156,7 @@ false - ПользователиИБОтменитьПоискРасширеннаяПодсказка + ОтменитьПоискРасширеннаяПодсказка 60 Label true @@ -174,7 +174,7 @@ Auto - ПользователиИБОбновить + Обновить 31 true true @@ -183,7 +183,7 @@ false - ПользователиИБОбновитьРасширеннаяПодсказка + ОбновитьРасширеннаяПодсказка 58 Label true @@ -201,7 +201,7 @@ Auto - ПользователиИБУдалить + Удалить 40 true false @@ -210,7 +210,7 @@ false - ПользователиИБУдалитьРасширеннаяПодсказка + УдалитьРасширеннаяПодсказка 57 Label true @@ -228,7 +228,7 @@ Auto - ПользователиИБПерейтиКПользователю + ПерейтиКПользователю 96 true true @@ -236,7 +236,7 @@ true - ПользователиИБПерейтиКПользователюРасширеннаяПодсказка + ПерейтиКПользователюРасширеннаяПодсказка 97 Label true @@ -254,7 +254,7 @@ Auto - ПользователиИБВывестиСписок + ВывестиСписок 120 true true @@ -262,7 +262,7 @@ true - ПользователиИБВывестиСписокРасширеннаяПодсказка + ВывестиСписокРасширеннаяПодсказка 121 Label true @@ -279,6 +279,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 137 + + СтрокаПоискРасширеннаяПодсказка + 139 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 138 + true + + ПользователиИБ + + true + + true true @@ -319,6 +351,7 @@ ПользователиИБ + true false None Add @@ -433,7 +466,7 @@ ru Способ входа в программу с помощью имени и пароля, -указанного для пользователя 1С:Предприятия. +указанного для пользователя 1С:Предприятия АутентификацияСтандартнаяExtendedTooltip @@ -481,7 +514,7 @@ ru Способ входа в программу с помощью имени, указанного для пользователя 1С:Предприятия, которое передается службе аутентификации по протоколу OpenID. -Используется только при подключении через веб-сервер (адрес службы должен быть настроен). +Используется только при подключении через веб-сервер (адрес службы должен быть настроен) АутентификацияOpenIDРасширеннаяПодсказка @@ -514,8 +547,103 @@ + + АутентификацияOpenIDConnect + 131 + true + true + + true + + + ПользователиИБ.АутентификацияOpenIDConnect + + + ru + Способ входа в программу с проверкой личности по протоколу OpenID-Connect, +сопоставление имени, как при использовании аутентификации по протоколу OpenID. +Используется только при подключении через веб-сервер (адрес службы должен быть настроен) + + + АутентификацияOpenIDConnectРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + + АутентификацияOpenIDConnectКонтекстноеМеню + 132 + true + + LabelField + true + Center + Auto + true + Left + true + + true + true + + ru + БЛ=; БИ=Да + + + + + АутентификацияТокеномДоступа + 134 + true + true + + true + + + ПользователиИБ.АутентификацияТокеномДоступа + + + ru + Аутентификация с помощью JWT-токенов (стандарт RFC 7519). +Более продвинутая аутентификация по сравнению с OpenID и OpenID-Connect + + + АутентификацияТокеномДоступаРасширеннаяПодсказка + 136 + Label + true + true + + Left + + + + АутентификацияТокеномДоступаКонтекстноеМеню + 135 + true + + LabelField + true + Center + Auto + true + Left + true + + true + true + + ru + БЛ=; БИ=Да + + + - ПользователиИБНастройкиАутентификацияОС + НастройкиАутентификацияОС 50 АутентификацияОС @@ -532,7 +660,7 @@ ru Способ входа в программу с помощью имени и пароля, указанного для пользователя операционной системы, -связанного с пользователем 1С:Предприятия. +связанного с пользователем 1С:Предприятия АутентификацияОСExtendedTooltip @@ -607,10 +735,10 @@ <key>ru</key> - <value>Пользователи ИБ настройки аутентификация ОС</value> + <value>Настройки аутентификация ОС</value> - ПользователиИБНастройкиАутентификацияОСРасширеннаяПодсказка + НастройкиАутентификацияОСРасширеннаяПодсказка 70 Label true @@ -886,7 +1014,7 @@ ПользователиИБКонтекстноеМеню 2 - ПользователиИБКонтекстноеМенюПерейтиКПользователю + КонтекстноеМенюПерейтиКПользователю 104 true true @@ -894,7 +1022,7 @@ true - ПользователиИБКонтекстноеМенюПерейтиКПользователюРасширеннаяПодсказка + КонтекстноеМенюПерейтиКПользователюРасширеннаяПодсказка 105 Label true @@ -912,7 +1040,7 @@ Auto - ПользователиИБКонтекстноеМенюОбновить + КонтекстноеМенюОбновить 39 true true @@ -921,7 +1049,7 @@ false - ПользователиИБКонтекстноеМенюОбновитьРасширеннаяПодсказка + КонтекстноеМенюОбновитьРасширеннаяПодсказка 64 Label true @@ -939,7 +1067,7 @@ Auto - ПользователиИБКонтекстноеМенюВывестиСписок + КонтекстноеМенюВывестиСписок 118 true true @@ -947,7 +1075,7 @@ true - ПользователиИБКонтекстноеМенюВывестиСписокРасширеннаяПодсказка + КонтекстноеМенюВывестиСписокРасширеннаяПодсказка 119 Label true @@ -972,7 +1100,7 @@ true Row
        true
        - 1 + 2 1 AutoUse AutoUse @@ -1090,7 +1218,8 @@ АутентификацияСтандартная <key>ru</key> - <value>Аутентификация 1С</value> + <value>Аутентификация +1С</value> 4 @@ -1107,7 +1236,8 @@ АутентификацияОС <key>ru</key> - <value>Аутентификация ОС</value> + <value>Аутентификация +ОС</value> 5 @@ -1169,7 +1299,8 @@ СопоставленСВнешнимПользователем <key>ru</key> - <value>Сопоставлен с внешним пользователем</value> + <value>Сопоставлен с +внешним пользователем</value> 11 @@ -1186,7 +1317,8 @@ АутентификацияOpenID <key>ru</key> - <value>Аутентификация OpenID</value> + <value>Аутентификация +OpenID</value> 14 @@ -1203,7 +1335,8 @@ ДобавленВКонфигураторе <key>ru</key> - <value>Добавлен в конфигураторе</value> + <value>Добавлен в +конфигураторе</value> 8 @@ -1220,7 +1353,8 @@ ИзмененВКонфигураторе <key>ru</key> - <value>Изменен в конфигураторе</value> + <value>Изменен в +конфигураторе</value> 10 @@ -1237,7 +1371,8 @@ УдаленВКонфигураторе <key>ru</key> - <value>Удален в конфигураторе</value> + <value>Удален в +конфигураторе</value> 12 @@ -1250,6 +1385,42 @@ true + + АутентификацияOpenIDConnect + + <key>ru</key> + <value>Аутентификация +OpenID-Connect</value> + + 13 + + Boolean + + + true + + + true + + + + АутентификацияТокеномДоступа + + <key>ru</key> + <value>Аутентификация +токеном доступа</value> + + 15 + + Boolean + + + true + + + true + + ТипыПользователей diff --git a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИнформационнойБазы/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИнформационнойБазы/Module.bsl index ea8bc5259..b157f6483 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИнформационнойБазы/Module.bsl +++ b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИнформационнойБазы/Module.bsl @@ -76,15 +76,15 @@ МожноОтменитьСопоставление = ЗначениеЗаполнено(ТекущиеДанные.Ссылка); КонецЕсли; - Элементы.ПользователиИБУдалить.Доступность = МожноУдалить; + Элементы.Удалить.Доступность = МожноУдалить; - Элементы.ПользователиИБПерейтиКПользователю.Доступность = МожноПерейтиКПользователю; - Элементы.ПользователиИБКонтекстноеМенюПерейтиКПользователю.Доступность = МожноПерейтиКПользователю; + Элементы.ПерейтиКПользователю.Доступность = МожноПерейтиКПользователю; + Элементы.КонтекстноеМенюПерейтиКПользователю.Доступность = МожноПерейтиКПользователю; - Элементы.ПользователиИБСопоставить.Доступность = МожноСопоставить; - Элементы.ПользователиИБСопоставитьСНовым.Доступность = МожноСопоставить; + Элементы.Сопоставить.Доступность = МожноСопоставить; + Элементы.СопоставитьСНовым.Доступность = МожноСопоставить; - Элементы.ПользователиИБОтменитьСопоставление.Доступность = МожноОтменитьСопоставление; + Элементы.ОтменитьСопоставление.Доступность = МожноОтменитьСопоставление; КонецПроцедуры @@ -176,15 +176,21 @@ ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияСтандартная.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияOpenID.Имя); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияOpenIDConnect.Имя); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияТокеномДоступа.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияОС.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПользовательОС.Имя); - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияOpenID.Имя); - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПользователиИБ.ДобавленВКонфигураторе"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; @@ -205,15 +211,21 @@ ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияСтандартная.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияOpenID.Имя); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияOpenIDConnect.Имя); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияТокеномДоступа.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияОС.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПользовательОС.Имя); - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияOpenID.Имя); - ГруппаОтбора1 = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); ГруппаОтбора1.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли; @@ -240,10 +252,16 @@ ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияСтандартная.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияОС.Имя); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияOpenID.Имя); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияOpenID.Имя); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияOpenIDConnect.Имя); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияТокеномДоступа.Имя); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.АутентификацияОС.Имя); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПользователиИБ.УдаленВКонфигураторе"); @@ -314,6 +332,10 @@ Выгрузка.Индексы.Добавить("ИдентификаторПользователяИБ"); Выгрузка.Колонки.Добавить("Сопоставлен", Новый ОписаниеТипов("Булево")); + ЗапросСведений = РегистрыСведений.СведенияОПользователях.ЗапросСвойств(Неопределено); + ВыгрузкаСведений = ЗапросСведений.Выполнить().Выгрузить(); + ВыгрузкаСведений.Индексы.Добавить("Ссылка"); + ВсеПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); Для Каждого ПользовательИБ Из ВсеПользователиИБ Цикл @@ -329,6 +351,17 @@ Строка.Сопоставлен = Истина; Если Строка.ПолноеИмя <> СвойстваПользовательИБ.ПолноеИмя Тогда ИзмененВКонфигураторе = Истина; + Иначе + СтрокаСведений = ВыгрузкаСведений.Найти(Строка.Ссылка, "Ссылка"); + Если СтрокаСведений = Неопределено Тогда + ИзмененВКонфигураторе = Истина; + Иначе + НовыеСвойства = РегистрыСведений.СведенияОПользователях.НовыеСвойстваПользователя( + СтрокаСведений.Ссылка, СтрокаСведений,, ПользовательИБ); + Если НовыеСвойства <> Неопределено Тогда + ИзмененВКонфигураторе = Истина; + КонецЕсли; + КонецЕсли; КонецЕсли; КонецЕсли; @@ -340,13 +373,15 @@ КонецЕсли; НоваяСтрока = ПользователиИБ.Добавить(); - НоваяСтрока.ПолноеИмя = СвойстваПользовательИБ.ПолноеИмя; - НоваяСтрока.Имя = СвойстваПользовательИБ.Имя; - НоваяСтрока.АутентификацияСтандартная = СвойстваПользовательИБ.АутентификацияСтандартная; - НоваяСтрока.АутентификацияОС = СвойстваПользовательИБ.АутентификацияОС; - НоваяСтрока.ИдентификаторПользователяИБ = СвойстваПользовательИБ.УникальныйИдентификатор; - НоваяСтрока.ПользовательОС = СвойстваПользовательИБ.ПользовательОС; - НоваяСтрока.АутентификацияOpenID = СвойстваПользовательИБ.АутентификацияOpenID; + НоваяСтрока.ПолноеИмя = СвойстваПользовательИБ.ПолноеИмя; + НоваяСтрока.Имя = СвойстваПользовательИБ.Имя; + НоваяСтрока.ИдентификаторПользователяИБ = СвойстваПользовательИБ.УникальныйИдентификатор; + НоваяСтрока.АутентификацияСтандартная = СвойстваПользовательИБ.АутентификацияСтандартная; + НоваяСтрока.АутентификацияOpenID = СвойстваПользовательИБ.АутентификацияOpenID; + НоваяСтрока.АутентификацияOpenIDConnect = СвойстваПользовательИБ.АутентификацияOpenIDConnect; + НоваяСтрока.АутентификацияТокеномДоступа = СвойстваПользовательИБ.АутентификацияТокеномДоступа; + НоваяСтрока.АутентификацияОС = СвойстваПользовательИБ.АутентификацияОС; + НоваяСтрока.ПользовательОС = СвойстваПользовательИБ.ПользовательОС; Если Строка = Неопределено Тогда // Пользователя ИБ нет в справочнике. @@ -385,7 +420,7 @@ Попытка Пользователи.УдалитьПользователяИБ(ИдентификаторПользователяИБ); Исключение - ОбщегоНазначения.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), , , , Отказ); + ОбщегоНазначения.СообщитьПользователю(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), , , , Отказ); КонецПопытки; КонецПроцедуры diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form index dce465489..c97c0ed3a 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1066,7 +1065,6 @@ HorizontalIfPossible Right - Auto true true Auto @@ -1095,7 +1093,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1369,7 +1366,6 @@ true false false - false Auto Auto ExpandTopLevel @@ -1504,7 +1500,6 @@ Vertical Center - Auto true true Auto @@ -1533,7 +1528,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1571,7 +1565,7 @@ true - ПользователиСписок.Description + ПользователиСписок.Наименование НаименованиеExtendedTooltip @@ -1605,7 +1599,7 @@ true - ПользователиСписок.Ref + ПользователиСписок.Ссылка СсылкаРасширеннаяПодсказка @@ -1946,7 +1940,6 @@ true false false - false Auto Auto true @@ -1960,6 +1953,10 @@ true + + OnGetDataAtServer + ПользователиСписокПриПолученииДанныхНаСервере + 60 0001-01-01T00:00:00 @@ -2079,7 +2076,6 @@ Vertical Center - Auto true true Auto @@ -2108,7 +2104,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2137,7 +2132,6 @@ UsualGroup HorizontalIfPossible - Auto true true LeftNarrowest @@ -2200,7 +2194,7 @@ true - ПользователиСписок.Description + ПользователиСписок.Наименование ПользователиСписокПоискНаименованиеРасширеннаяПодсказка @@ -2234,7 +2228,7 @@ true - ПользователиСписок.Ref + ПользователиСписок.Ссылка ПользователиСписокПоискСсылкаРасширеннаяПодсказка @@ -2590,6 +2584,10 @@ true + + OnGetDataAtServer + ПользователиСписокПриПолученииДанныхНаСервере + 60 0001-01-01T00:00:00 @@ -2711,7 +2709,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2959,7 +2956,6 @@ true false false - false true Auto Auto @@ -2996,7 +2992,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3025,7 +3020,6 @@ UsualGroup HorizontalIfPossible - Auto true true Equal @@ -3134,7 +3128,416 @@ UsualGroup HorizontalIfPossible - Auto + true + true + Auto + Auto + +
        + + Легенда + 325 + + ВходОграничен + 345 + + ВходОграниченКартинка + 339 + + <key>ru</key> + <value>Вход ограничен картинка</value> + + true + true + + true + + + ВходОграниченКартинкаРасширеннаяПодсказка + 341 + Label + true + true + + Left + + + + ВходОграниченКартинкаКонтекстноеМеню + 340 + true + + true + true + + + CommonPicture.СостояниеПользователя14 + + AsFileRef + + + + ВходОграниченНадпись + 342 + + <key>ru</key> + <value>Вход ограничен</value> + + true + true + + true + + + ru + Установлено ограничение входа до даты или +установлен срок максимальной неактивности + + + ВходОграниченНадписьРасширеннаяПодсказка + 344 + Label + true + true + + Left + + + + ВходОграниченНадписьКонтекстноеМеню + 343 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Вход ограничен</value> + + + ВходОграниченРасширеннаяПодсказка + 346 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + + Отступ1 + 351 + true + true + + true + + + Отступ1РасширеннаяПодсказка + 353 + Label + true + true + + Left + + + + Отступ1КонтекстноеМеню + 352 + true + + Label + true + true + + Left + + + + НетВхода + 347 + + НетВходаКартинка + 333 + + <key>ru</key> + <value>Нет входа картинка</value> + + true + true + + true + + + НетВходаКартинкаРасширеннаяПодсказка + 335 + Label + true + true + + Left + + + + НетВходаКартинкаКонтекстноеМеню + 334 + true + + true + true + + + CommonPicture.СостояниеПользователя13 + + AsFileRef + + + + НетВходаНадпись + 336 + + <key>ru</key> + <value>Нет входа</value> + + true + true + + true + + + ru + Не включен вход в программу, нет прав или +нет ни одного права запуска (тонкий клиент, веб-клиент, +толстый клиент, automation, внешнее соединение) + + + НетВходаНадписьРасширеннаяПодсказка + 338 + Label + true + true + + Left + + + + НетВходаНадписьКонтекстноеМеню + 337 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Нет входа</value> + + + НетВходаРасширеннаяПодсказка + 348 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + + Отступ2 + 354 + true + true + + true + + + Отступ2РасширеннаяПодсказка + 356 + Label + true + true + + Left + + + + Отступ2КонтекстноеМеню + 355 + true + + Label + true + true + + Left + + + + БезНастройки + 349 + + БезНастройкиКартинка + 327 + + <key>ru</key> + <value>Без настройки картинка</value> + + true + true + + true + + + БезНастройкиКартинкаРасширеннаяПодсказка + 329 + Label + true + true + + Left + + + + БезНастройкиКартинкаКонтекстноеМеню + 328 + true + + true + true + + + CommonPicture.СостояниеПользователя15 + + AsFileRef + + + + БезНастройкиНадпись + 330 + + <key>ru</key> + <value>Без настройки</value> + + true + true + + true + + + ru + Нет пользователя информационной базы +(пустое имя для входа) + + + БезНастройкиНадписьРасширеннаяПодсказка + 332 + Label + true + true + + Left + + + + БезНастройкиНадписьКонтекстноеМеню + 331 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Без настройки</value> + + + БезНастройкиРасширеннаяПодсказка + 350 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Легенда</value> + + + ЛегендаРасширеннаяПодсказка + 326 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible true true Auto @@ -3343,7 +3746,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -3450,12 +3852,11 @@ UsualGroup Vertical - Auto NormalSeparation true true - Items.ПользователиСписок.CurrentData.Description + Items.ПользователиСписок.CurrentData.Наименование Auto Auto @@ -3564,30 +3965,26 @@ true - - ПользователиСписок.Ref - ПользователиСписок.ВозможноСменитьПароль ПользователиСписок.Недействителен + + ПользователиСписок.Ссылка +
        true
        ВЫБРАТЬ - Пользователи.Ссылка, - Пользователи.Подготовлен, - Пользователи.ПометкаУдаления, - Пользователи.Недействителен, - Пользователи.Наименование, - Пользователи.Служебный, - Пользователи.Комментарий, - ВЫБОР - КОГДА Пользователи.ПометкаУдаления - ТОГДА 0 - ИНАЧЕ 1 - КОНЕЦ КАК НомерКартинки, + Пользователи.Ссылка КАК Ссылка, + Пользователи.Подготовлен КАК Подготовлен, + Пользователи.ПометкаУдаления КАК ПометкаУдаления, + Пользователи.Недействителен КАК Недействителен, + Пользователи.Наименование КАК Наименование, + Пользователи.Служебный КАК Служебный, + Пользователи.Комментарий КАК Комментарий, + -1 КАК НомерКартинки, ВЫБОР КОГДА Пользователи.Служебный ТОГДА ЛОЖЬ @@ -3601,9 +3998,12 @@ ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ КАК ВозможноСменитьПароль, - Пользователи.ИдентификаторПользователяИБ + Пользователи.ИдентификаторПользователяИБ КАК ИдентификаторПользователяИБ, + СведенияОПользователях.* ИЗ Справочник.Пользователи КАК Пользователи + {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях + ПО (СведенияОПользователях.Пользователь = Пользователи.Ссылка)} ГДЕ ВЫБОР КОГДА &ВсеПользователи diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl index 7d1769628..2ff376b60 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl @@ -193,6 +193,8 @@ Элементы.ЗаблокироватьНедействительныхПользователейВСистемеВзаимодействий.Видимость = Истина; КонецЕсли; + ПользователиСлужебный.НастроитьПолеНомерКартинкиДинамическогоСписка(ПользователиСписок); + КонецПроцедуры &НаКлиенте @@ -204,7 +206,9 @@ #Если МобильныйКлиент Тогда Если ХранимыеПараметры.ИспользоватьГруппы Тогда - Элементы.ГруппаГруппы.Заголовок = Строка(Элементы.ГруппыПользователей.ТекущиеДанные.Ссылка); + Элементы.ГруппаГруппы.Заголовок = ?(Элементы.ГруппыПользователей.ТекущиеДанные = Неопределено, + НСтр("ru = 'Группы пользователей'"), + Строка(Элементы.ГруппыПользователей.ТекущиеДанные.Ссылка)); КонецЕсли; #КонецЕсли @@ -214,22 +218,19 @@ Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Если ВРег(ИмяСобытия) = ВРег("Запись_ГруппыПользователей") - И Источник = Элементы.ГруппыПользователей.ТекущаяСтрока Тогда + И Источник = Элементы.ГруппыПользователей.ТекущаяСтрока + Или ВРег(ИмяСобытия) = ВРег("РазмещениеПользователейВГруппах") + Или ВРег(ИмяСобытия) = ВРег("Запись_ГруппыДоступа") Тогда Элементы.ПользователиСписок.Обновить(); ИначеЕсли ВРег(ИмяСобытия) = ВРег("Запись_НаборКонстант") Тогда - Если ВРег(Источник) = ВРег("ИспользоватьГруппыПользователей") Тогда ПодключитьОбработчикОжидания("ПриИзмененииИспользованияГруппПользователей", 0.1, Истина); КонецЕсли; + ИначеЕсли ВРег(ИмяСобытия) = ВРег("Запись_Пользователи") Тогда - ПодключитьОбработчикОжидания("ОбновитьКонтактнуюИнформациюПользователяЗавершение", 0.1, Истина); - ИначеЕсли ВРег(ИмяСобытия) = ВРег("РазмещениеПользователейВГруппах") Тогда - - Элементы.ПользователиСписок.Обновить(); - КонецЕсли; КонецПроцедуры @@ -302,9 +303,9 @@ |ИЗ | Справочник.Пользователи.КонтактнаяИнформация КАК ПользователиКонтактнаяИнформация |ГДЕ - | ПользователиКонтактнаяИнформация.Представление ПОДОБНО &СтрокаПоиска"; + | ПользователиКонтактнаяИнформация.Представление ПОДОБНО &СтрокаПоиска СПЕЦСИМВОЛ ""~"""; - Запрос.УстановитьПараметр("СтрокаПоиска", СтрокаПоискаТекст+"%"); + Запрос.УстановитьПараметр("СтрокаПоиска", ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(СтрокаПоискаТекст) + "%"); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл @@ -603,6 +604,13 @@ КонецПроцедуры +&НаСервереБезКонтекста +Процедура ПользователиСписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки) + + ПользователиСлужебный.ДинамическийСписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки); + +КонецПроцедуры + &НаКлиенте Процедура ПользователиСписокПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) @@ -841,10 +849,10 @@ Для каждого НедействительныйПользователь Из НедействительныеПользователи Цикл РезультатБлокировки = МодульОбсужденияСлужебный.ЗаблокироватьПользователяСистемыВзаимодействия(НедействительныйПользователь); Если РезультатБлокировки <> Неопределено Тогда - Результат = КраткоеПредставлениеОшибки(РезультатБлокировки); + Результат = ОбработкаОшибок.КраткоеПредставлениеОшибки(РезультатБлокировки); ЗаписьЖурналаРегистрации(НСтр("ru='Обсуждения.Блокировка недействительных пользователей'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(РезультатБлокировки)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(РезультатБлокировки)); КонецЕсли; КонецЦикла; Возврат Результат; @@ -1231,7 +1239,9 @@ Иначе Параметры.ТекущаяСтрока = Неопределено; КонецЕсли; - ИначеЕсли ТипЗнч(ТекущиеХранимыеПараметры.ТекущаяСтрока) = Тип("СправочникСсылка.Пользователи") Тогда + ИначеЕсли Не ХранимыеПараметры.РасширенныйПодбор + Или ТипЗнч(ТекущиеХранимыеПараметры.ТекущаяСтрока) = Тип("СправочникСсылка.Пользователи") Тогда + ТекущийЭлемент = Элементы.ПользователиСписок; Элементы.ГруппыПользователей.ТекущаяСтрока = Справочники.ГруппыПользователей.ВсеПользователи; КонецЕсли; @@ -1348,7 +1358,9 @@ #Если МобильныйКлиент Тогда Если Не ХранимыеПараметры.РасширенныйПодбор Тогда - Элементы.ГруппаГруппы.Заголовок = Строка(Элементы.ГруппыПользователей.ТекущиеДанные.Ссылка); + Элементы.ГруппаГруппы.Заголовок = ?(Элементы.ГруппыПользователей.ТекущиеДанные = Неопределено, + НСтр("ru = 'Группы пользователей'"), + Строка(Элементы.ГруппыПользователей.ТекущиеДанные.Ссылка)); ТекущийЭлемент = Элементы.ПользователиСписок; КонецЕсли; #КонецЕсли diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form index 3355aac97..cce3fc793 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form @@ -101,7 +101,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -222,37 +221,6 @@ UserCmds Auto
        - - Записать - 261 - true - true - - true - - - ЗаписатьРасширеннаяПодсказка - 262 - Label - true - true - - Left - - - UsualButton - Form.StandardCommand.Write - Normal - PictureAndText - 10 - true - true - UserCmds - - StdPicture.Write - - Auto - true true @@ -275,7 +243,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -304,7 +271,6 @@ UsualGroup Vertical - Auto true true Auto @@ -333,7 +299,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -439,7 +404,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -676,7 +640,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -787,7 +750,6 @@ UsualGroup Vertical - Auto true true Auto @@ -816,7 +778,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -869,6 +830,214 @@ true
        + + ГруппаНетПрав + 411 + + НетПравКартинка + 413 + + <key>ru</key> + <value>Нет прав картинка</value> + + true + true + + true + + + НетПравКартинкаРасширеннаяПодсказка + 415 + Label + true + true + + Left + + + + НетПравКартинкаКонтекстноеМеню + 414 + true + + true + true + + + CommonPicture.Предупреждение + + AsFileRef + + + + НетПравНадпись + 416 + + <key>ru</key> + <value>Нет прав</value> + + true + true + + true + + + ru + Пользователю не назначены права доступа (нет ни одной роли) + + + НетПравНадписьРасширеннаяПодсказка + 418 + Label + true + true + + Left + + + + НетПравНадписьКонтекстноеМеню + 417 + true + + Label + true + true + + Left + + + true + + true + + + <key>ru</key> + <value>Нет прав</value> + + + ГруппаНетПравРасширеннаяПодсказка + 412 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + + ГруппаНетПравНаЗапуск + 419 + + НетПравНаЗапускКартина + 421 + + <key>ru</key> + <value>Нет прав на запуск картина</value> + + true + true + + true + + + НетПравНаЗапускКартинаРасширеннаяПодсказка + 423 + Label + true + true + + Left + + + + НетПравНаЗапускКартинаКонтекстноеМеню + 422 + true + + true + true + + + CommonPicture.Предупреждение + + AsFileRef + + + + НетПравНаЗапускНадпись + 424 + + <key>ru</key> + <value>Нет прав на запуск</value> + + true + true + + true + + + ru + У пользователя нет ни одного права запуска (тонкий клиент, веб-клиент) + + + НетПравНаЗапускНадписьРасширеннаяПодсказка + 426 + Label + true + true + + Left + + + + НетПравНаЗапускНадписьКонтекстноеМеню + 425 + true + + Label + true + true + + Left + + + true + + true + + + <key>ru</key> + <value>Нет прав на запуск</value> + + + ГруппаНетПравНаЗапускРасширеннаяПодсказка + 420 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + ГруппаИзменитьОграничение 331 @@ -921,7 +1090,6 @@ UsualGroup Vertical - Auto true true Auto @@ -992,7 +1160,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1003,76 +1170,32 @@ Страницы 70 - СвойстваПользователяИБ + Главное 65 - ОсновныеСвойства - 75 + ИмяЭлектроннаяПочтаТелефон + 384 - ИмяПереключениеОтметкиНезаполненного - 249 - - ИмяСОтметкойНезаполненного - 251 - - ПользовательИБИмя1 - 95 - true - true - - true - - - ПользовательИБИмя - - - OnChange - ПользовательИБИмяПриИзменении - - - ПользовательИБИмя1РасширеннаяПодсказка - 222 - Label - true - true - - Left - - - - ПользовательИБИмя1КонтекстноеМеню - 96 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - true - Normal - - + ГруппаИмя + 409 + + ПользовательИБИмя + 95 true true true - - <key>ru</key> - <value>Имя с отметкой незаполненного</value> - + + ПользовательИБИмя + + + OnChange + ПользовательИБИмяПриИзменении + - ИмяСОтметкойНезаполненногоРасширеннаяПодсказка - 252 + ПользовательИБИмяРасширеннаяПодсказка + 222 Label true true @@ -1080,85 +1203,26 @@ Left - Page - - Vertical - auto - false - - - - ИмяБезОтметкиНезаполненного - 253 - - ПользовательИБИмя2 - 255 - true - true - - true - - - ПользовательИБИмя - - - OnChange - ПользовательИБИмяПриИзменении - - - ПользовательИБИмя2РасширеннаяПодсказка - 257 - Label - true - true - - Left - - - - ПользовательИБИмя2КонтекстноеМеню - 256 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Имя без отметки незаполненного</value> - - - ИмяБезОтметкиНезаполненногоРасширеннаяПодсказка - 254 - Label + + ПользовательИБИмяКонтекстноеМеню + 96 + true + + InputField + true + Enter + true + Left + true + true true - - Left - - - Page - - Vertical - auto - false + true + true + true + true + true + Normal true @@ -1168,11 +1232,11 @@ <key>ru</key> - <value>Имя (переключение отметки незаполненного)</value> + <value>Имя</value> - ИмяПереключениеОтметкиНезаполненногоРасширеннаяПодсказка - 250 + ГруппаИмяРасширеннаяПодсказка + 410 Label true true @@ -1180,38 +1244,36 @@ Left
        - Pages - + UsualGroup + + HorizontalIfPossible + true + true + Auto Auto - СвойстваАутентификации1СПредприятия - 10 + ГруппаКонтактнаяИнформацияПолеEmailПользователя + 401 - ПользовательИБАутентификацияСтандартная - 19 + КонтактнаяИнформацияПолеEmailПользователя + 395 true true true - ПользовательИБАутентификацияСтандартная + КонтактнаяИнформацияПолеEmailПользователя - Right - - ru - Способ входа в программу с помощью имени и пароля, -указанного для пользователя 1С:Предприятия. - OnChange - ПользовательИБАутентификацияСтандартнаяПриИзменении + Подключаемый_КонтактнаяИнформацияПриИзменении - ПользовательИБАутентификацияСтандартнаяРасширеннаяПодсказка - 224 + КонтактнаяИнформацияПолеEmailПользователяРасширеннаяПодсказка + 397 Label true true @@ -1220,32 +1282,260 @@ - ПользовательИБАутентификацияСтандартнаяКонтекстноеМеню - 20 + КонтактнаяИнформацияПолеEmailПользователяКонтекстноеМеню + 396 true - CheckBoxField + InputField Enter true Left true - Left - + + + StartChoice + Подключаемый_КонтактнаяИнформацияНачалоВыбора + + + Clearing + Подключаемый_КонтактнаяИнформацияОчистка + + true + true + true + true + true + true + Normal + + + КомандаКонтактнаяИнформацияПолеEmailПользователя + 405 + true + true + + true + + + КомандаКонтактнаяИнформацияПолеEmailПользователяРасширеннаяПодсказка + 406 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаКонтактнаяИнформацияПолеEmailПользователя + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Электронная почта</value> + + + ГруппаКонтактнаяИнформацияПолеEmailПользователяРасширеннаяПодсказка + 402 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + + ГруппаКонтактнаяИнформацияПолеТелефонПользователя + 403 + + КонтактнаяИнформацияПолеТелефонПользователя + 398 + true + true + + true + + + КонтактнаяИнформацияПолеТелефонПользователя + + + OnChange + Подключаемый_КонтактнаяИнформацияПриИзменении + + + КонтактнаяИнформацияПолеТелефонПользователяРасширеннаяПодсказка + 400 + Label + true + true + + Left + + + + КонтактнаяИнформацияПолеТелефонПользователяКонтекстноеМеню + 399 + true + + InputField + Enter + true + Left + true + + + StartChoice + Подключаемый_КонтактнаяИнформацияНачалоВыбора + + + Clearing + Подключаемый_КонтактнаяИнформацияОчистка + + true + true + true + true + true + true + true + Normal + + + + КомандаКонтактнаяИнформацияПолеТелефонПользователя + 407 + true + true + + true + + + КомандаКонтактнаяИнформацияПолеТелефонПользователяРасширеннаяПодсказка + 408 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаКонтактнаяИнформацияПолеТелефонПользователя + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Телефон</value> + + + ГруппаКонтактнаяИнформацияПолеТелефонПользователяРасширеннаяПодсказка + 404 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Имя электронная почта телефон</value> + + + ИмяЭлектроннаяПочтаТелефонРасширеннаяПодсказка + 385 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + + + + СвойстваПользователяИБ + 75 + + СвойстваАутентификации + 389 - ГруппаОтступ - 270 - - Отступ - 272 + СвойстваАутентификации1СПредприятия + 10 + + ПользовательИБАутентификацияСтандартная + 19 true true true + + ПользовательИБАутентификацияСтандартная + + Right + + ru + Способ входа в программу с помощью имени и пароля, +указанного для пользователя 1С:Предприятия. + + + OnChange + ПользовательИБАутентификацияСтандартнаяПриИзменении + - ОтступРасширеннаяПодсказка - 274 + ПользовательИБАутентификацияСтандартнаяРасширеннаяПодсказка + 224 Label true true @@ -1254,38 +1544,217 @@ - ОтступКонтекстноеМеню - 273 + ПользовательИБАутентификацияСтандартнаяКонтекстноеМеню + 20 true - Label - true - true - - Left - + CheckBoxField + Enter + true + Left + true + Left + - ПараметрыАутентификации1СПредприятия - 201 + ГруппаОтступ + 270 + + Отступ + 272 + true + true + + true + + + ОтступРасширеннаяПодсказка + 274 + Label + true + true + + Left + + + + ОтступКонтекстноеМеню + 273 + true + + Label + true + true + + Left + + - ГруппаПароль - 319 - - НадписьНаличиеПароля - 321 - - <key>ru</key> - <value>Пустой пароль</value> - + ПараметрыАутентификации1СПредприятия + 201 + + ГруппаПароль + 319 + + НадписьНаличиеПароля + 321 + + <key>ru</key> + <value>Пустой пароль</value> + + true + true + + true + + + НадписьНаличиеПароляРасширеннаяПодсказка + 323 + Label + true + true + + Left + + + + НадписьНаличиеПароляКонтекстноеМеню + 322 + true + + Label + true + + Style.ПоясняющийТекст + + + Left + + + + СменитьПароль + 324 + true + true + + true + + + СменитьПарольРасширеннаяПодсказка + 325 + Label + true + true + + Left + + + UsualButton + Form.Command.СменитьПароль + Normal + Auto + true + true + UserCmds + Auto + true true true + + <key>ru</key> + <value>Пароль</value> + - НадписьНаличиеПароляРасширеннаяПодсказка - 323 + ГруппаПарольРасширеннаяПодсказка + 320 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + + ПотребоватьСменуПароляПриВходе + 316 + true + true + + true + + + ПотребоватьСменуПароляПриВходе + + Right + Button + + OnChange + ПотребоватьСменуПароляПриВходеПриИзменении + + + ПотребоватьСменуПароляПриВходеРасширеннаяПодсказка + 318 + true + Label + true + true + + + URLProcessing + ПотребоватьСменуПароляПриВходеРасширеннаяПодсказкаОбработкаНавигационнойСсылки + + Left + + + + ПотребоватьСменуПароляПриВходеКонтекстноеМеню + 317 + true + + CheckBoxField + Enter + true + Left + true + + + + ПользовательИБЗапрещеноИзменятьПароль + 51 + true + true + + true + + + ПользовательИБЗапрещеноИзменятьПароль + + Right + + ru + Запрещает изменение своего пароля +неполноправному пользователю, +а также при входе. + + + OnChange + ПользовательИБЗапрещеноИзменятьПарольПриИзменении + + + ПользовательИБЗапрещеноИзменятьПарольРасширеннаяПодсказка + 229 Label true true @@ -1294,30 +1763,32 @@ - НадписьНаличиеПароляКонтекстноеМеню - 322 + ПользовательИБЗапрещеноИзменятьПарольКонтекстноеМеню + 52 true - Label - true - - Style.ПоясняющийТекст - - - Left - + CheckBoxField + Enter + true + Left + true + - - СменитьПароль - 324 + + ПользовательИБЗапрещеноВосстанавливатьПароль + 366 true true true + + ПользовательИБЗапрещеноВосстанавливатьПароль + + Right - СменитьПарольРасширеннаяПодсказка - 325 + ПользовательИБЗапрещеноВосстанавливатьПарольРасширеннаяПодсказка + 368 Label true true @@ -1325,14 +1796,56 @@ Left - UsualButton - Form.Command.СменитьПароль - Normal - Auto - true - true - UserCmds - Auto + + ПользовательИБЗапрещеноВосстанавливатьПарольКонтекстноеМеню + 367 + true + + CheckBoxField + Enter + true + Left + true + + + + ПользовательИБПоказыватьВСпискеВыбора + 25 + true + true + + true + + + ПользовательИБПоказыватьВСпискеВыбора + + Right + + OnChange + ПользовательИБПоказыватьВСпискеВыбораПриИзменении + + + ПользовательИБПоказыватьВСпискеВыбораРасширеннаяПодсказка + 228 + Label + true + true + + Left + + + + ПользовательИБПоказыватьВСпискеВыбораКонтекстноеМеню + 26 + true + + CheckBoxField + Enter + true + Left + true + Left + true true @@ -1341,11 +1854,11 @@ <key>ru</key> - <value>Пароль</value> + <value>Параметры аутентификации 1С:Предприятия</value> - ГруппаПарольРасширеннаяПодсказка - 320 + ПараметрыАутентификации1СПредприятияРасширеннаяПодсказка + 225 Label true true @@ -1355,175 +1868,13 @@ UsualGroup - HorizontalIfPossible - Auto + Vertical true true Auto Auto - - ПотребоватьСменуПароляПриВходе - 316 - true - true - - true - - - ПотребоватьСменуПароляПриВходе - - Right - Button - - OnChange - ПотребоватьСменуПароляПриВходеПриИзменении - - - ПотребоватьСменуПароляПриВходеРасширеннаяПодсказка - 318 - true - Label - true - true - - - URLProcessing - ПотребоватьСменуПароляПриВходеРасширеннаяПодсказкаОбработкаНавигационнойСсылки - - Left - - - - ПотребоватьСменуПароляПриВходеКонтекстноеМеню - 317 - true - - CheckBoxField - Enter - true - Left - true - - - - ПользовательИБЗапрещеноИзменятьПароль - 51 - true - true - - true - - - ПользовательИБЗапрещеноИзменятьПароль - - Right - - ru - Запрещает изменение своего пароля -неполноправному пользователю, -а также при входе. - - - OnChange - ПользовательИБЗапрещеноИзменятьПарольПриИзменении - - - ПользовательИБЗапрещеноИзменятьПарольРасширеннаяПодсказка - 229 - Label - true - true - - Left - - - - ПользовательИБЗапрещеноИзменятьПарольКонтекстноеМеню - 52 - true - - CheckBoxField - Enter - true - Left - true - - - - ПользовательИБЗапрещеноВосстанавливатьПароль - 366 - true - true - - true - - - ПользовательИБЗапрещеноВосстанавливатьПароль - - Right - - ПользовательИБЗапрещеноВосстанавливатьПарольРасширеннаяПодсказка - 368 - Label - true - true - - Left - - - - ПользовательИБЗапрещеноВосстанавливатьПарольКонтекстноеМеню - 367 - true - - CheckBoxField - Enter - true - Left - true - - - - ПользовательИБПоказыватьВСпискеВыбора - 25 - true - true - - true - - - ПользовательИБПоказыватьВСпискеВыбора - - Right - - OnChange - ПользовательИБПоказыватьВСпискеВыбораПриИзменении - - - ПользовательИБПоказыватьВСпискеВыбораРасширеннаяПодсказка - 228 - Label - true - true - - Left - - - - ПользовательИБПоказыватьВСпискеВыбораКонтекстноеМеню - 26 - true - - CheckBoxField - Enter - true - Left - true - Left - - true true @@ -1531,11 +1882,11 @@ <key>ru</key> - <value>Параметры аутентификации 1С:Предприятия</value> + <value>Отступ</value> - ПараметрыАутентификации1СПредприятияРасширеннаяПодсказка - 225 + ГруппаОтступРасширеннаяПодсказка + 271 Label true true @@ -1545,8 +1896,7 @@ UsualGroup - Vertical - Auto + HorizontalIfPossible true true Auto @@ -1560,11 +1910,11 @@ <key>ru</key> - <value>Отступ</value> + <value>Свойства аутентификации 1С предприятия</value> - ГруппаОтступРасширеннаяПодсказка - 271 + СвойстваАутентификации1СПредприятияExtendedTooltip + 223 Label true true @@ -1574,223 +1924,42 @@ UsualGroup - HorizontalIfPossible - Auto + Vertical + NormalSeparation true true Auto Auto - true - true - - true - - - <key>ru</key> - <value>Свойства аутентификации 1С предприятия</value> - - - СвойстваАутентификации1СПредприятияExtendedTooltip - 223 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - - СвойстваАутентификацииOpenID - 275 - - ПользовательИБАутентификацияOpenID - 205 - true - true - - true - - - ПользовательИБАутентификацияOpenID - - Right - - ru - Способ входа в программу с помощью имени, указанного для пользователя 1С:Предприятия, -которое передается службе аутентификации по протоколу OpenID. -Используется только при подключении через веб-сервер (адрес службы должен быть настроен). - - - OnChange - ПользовательИБАутентификацияOpenIDПриИзменении - - - ПользовательИБАутентификацияOpenIDРасширеннаяПодсказка - 230 - Label - true - true - - Left - - - - ПользовательИБАутентификацияOpenIDКонтекстноеМеню - 206 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Свойства аутентификации open ID</value> - - - СвойстваАутентификацииOpenIDРасширеннаяПодсказка - 276 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - СвойстваАутентификацииОС - 11 - - ПользовательИБАутентификацияОС - 27 - true - true - - true - - - ПользовательИБАутентификацияОС - - Right - - ru - Способ входа в программу с помощью имени и пароля, -указанного для пользователя операционной системы, -связанного с пользователем 1С:Предприятия. - - - OnChange - ПользовательИБАутентификацияОСПриИзменении - - - ПользовательИБАутентификацияОСРасширеннаяПодсказка - 232 - Label - true - true - - Left - - - - ПользовательИБАутентификацияОСКонтекстноеМеню - 28 - true - - CheckBoxField - Enter - true - Left - true - Left - - - СвойстваПараметрыАутентификацииОС - 202 - - ДекорацияОтступ - 203 - true - true - - true - - - ДекорацияОтступExtendedTooltip - 234 - Label - true - true - - Left - - - - ДекорацияОтступКонтекстноеМеню - 204 - true - - Label - true - - Left - - + СвойстваАутентификацииДополнительные + 275 - ПользовательИБПользовательОС - 29 + ПользовательИБАутентификацияOpenID + 205 true true true - ПользовательИБПользовательОС + ПользовательИБАутентификацияOpenID - Left + Right ru - Пользователь операционной системы + Способ входа в программу с помощью имени, указанного для пользователя 1С:Предприятия, +которое передается службе аутентификации по протоколу OpenID. +Используется только при подключении через веб-сервер (адрес службы должен быть настроен). OnChange - ПользовательИБПользовательОСПриИзменении + ПользовательИБАутентификацияOpenIDПриИзменении - ПользовательИБПользовательОСРасширеннаяПодсказка - 235 + ПользовательИБАутентификацияOpenIDРасширеннаяПодсказка + 230 Label true true @@ -1799,31 +1968,298 @@ - ПользовательИБПользовательОСКонтекстноеМеню - 30 + ПользовательИБАутентификацияOpenIDКонтекстноеМеню + 206 true - InputField + CheckBoxField Enter true Left true - Left - - - StartChoice - ПользовательИБПользовательОСНачалоВыбора - + + + + ПользовательИБАутентификацияOpenIDConnect + 375 + true + true + + true + + + ПользовательИБАутентификацияOpenIDConnect + + Right + + OnChange + ПользовательИБАутентификацияOpenIDConnectПриИзменении + + + ПользовательИБАутентификацияOpenIDConnectРасширеннаяПодсказка + 377 + + <key>ru</key> + <value>OpenID Connect позволяет системе 1С:Предприятие проверить личность пользователя на основе аутентификации, выполненной сторонним провайдером. В результате, для того, чтобы получить доступ к прикладному решению 1С:Предприятия, пользователи могут использовать свои учетные данные на других сайтах, поддерживающих OpenID Connect аутентификацию. В частности, в качестве такого сайта можно использовать Единую систему идентификации и аутентификации (ЕСИА), при этом авторизация будет происходить через сайт gosuslugi.ru. + +Используется только при подключении через веб-сервер (адрес службы должен быть настроен).</value> + + Label true true - true - true - true - true - - Style.BorderColor - - Normal + + Left + + + + ПользовательИБАутентификацияOpenIDConnectКонтекстноеМеню + 376 + true + + CheckBoxField + Enter + true + Left + true + + + + ПользовательИБАутентификацияТокеномДоступа + 378 + true + true + + true + + + ПользовательИБАутентификацияТокеномДоступа + + Right + + OnChange + ПользовательИБАутентификацияТокеномДоступаПриИзменении + + + ПользовательИБАутентификацияТокеномДоступаРасширеннаяПодсказка + 380 + + <key>ru</key> + <value>Аутентификация с помощью JWT-токенов (стандарт RFC 7519). +Более продвинутая аутентификация по сравнению с OpenID и OpenID-Connect. + +Многие публичные сервисы используют аутентификацию через JWT-токены – например, Единая Система Авторизации И Аутентификации (ЕСИА), сервисы Министерства здравоохранения и социального развития, Национальная система цифровой маркировки "Честный знак".</value> + + Label + true + true + + Left + + + + ПользовательИБАутентификацияТокеномДоступаКонтекстноеМеню + 379 + true + + CheckBoxField + Enter + true + Left + true + + + + СвойстваАутентификацииОС + 11 + + ПользовательИБАутентификацияОС + 27 + true + true + + true + + + ПользовательИБАутентификацияОС + + Right + + ru + Способ входа в программу с помощью имени и пароля, +указанного для пользователя операционной системы, +связанного с пользователем 1С:Предприятия. + + + OnChange + ПользовательИБАутентификацияОСПриИзменении + + + ПользовательИБАутентификацияОСРасширеннаяПодсказка + 232 + Label + true + true + + Left + + + + ПользовательИБАутентификацияОСКонтекстноеМеню + 28 + true + + CheckBoxField + Enter + true + Left + true + Left + + + + СвойстваПараметрыАутентификацииОС + 202 + + ДекорацияОтступ + 203 + true + true + + true + + + ДекорацияОтступExtendedTooltip + 234 + Label + true + true + + Left + + + + ДекорацияОтступКонтекстноеМеню + 204 + true + + Label + true + + Left + + + + ПользовательИБПользовательОС + 29 + true + true + + true + + + ПользовательИБПользовательОС + + Left + + ru + Пользователь операционной системы + + + OnChange + ПользовательИБПользовательОСПриИзменении + + + ПользовательИБПользовательОСРасширеннаяПодсказка + 235 + Label + true + true + + Left + + + + ПользовательИБПользовательОСКонтекстноеМеню + 30 + true + + InputField + Enter + true + Left + true + Left + + + StartChoice + ПользовательИБПользовательОСНачалоВыбора + + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Свойства параметры аутентификации ОС</value> + + + СвойстваПараметрыАутентификацииОСExtendedTooltip + 233 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Аутентификация операционной системы</value> + + + СвойстваАутентификацииОСExtendedTooltip + 231 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto true @@ -1833,11 +2269,11 @@ <key>ru</key> - <value>Свойства параметры аутентификации ОС</value> + <value>Свойства аутентификации дополнительные</value> - СвойстваПараметрыАутентификацииОСExtendedTooltip - 233 + СвойстваАутентификацииДополнительныеРасширеннаяПодсказка + 276 Label true true @@ -1847,8 +2283,7 @@ UsualGroup - HorizontalIfPossible - Auto + Vertical true true Auto @@ -1862,11 +2297,11 @@ <key>ru</key> - <value>Аутентификация операционной системы</value> + <value>Свойства аутентификации</value> - СвойстваАутентификацииОСExtendedTooltip - 231 + СвойстваАутентификацииРасширеннаяПодсказка + 390 Label true true @@ -1876,8 +2311,7 @@ UsualGroup - Vertical - Auto + HorizontalIfPossible true true Auto @@ -2009,8 +2443,7 @@ UsualGroup - Vertical - Auto + HorizontalIfPossible NormalSeparation true true @@ -2026,10 +2459,10 @@ <key>ru</key> - <value>Основные свойства</value> + <value>Свойства пользователя ИБ</value> - ОсновныеСвойстваExtendedTooltip + СвойстваПользователяИБРасширеннаяПодсказка 221 Label true @@ -2041,137 +2474,91 @@ UsualGroup Vertical - Auto true true Auto Auto - - ОтображениеРолей - 192 - - Роли - 177 - - <key>ru</key> - <value>Разрешенные действия (роли)</value> - - true - true - - true - - - Роли - - false - Top - Add - Change - Copy - Delete - EndEdit - HierarchicalList - List - MoveDown - MoveUp - SortListAsc - SortListDesc - Tree - - РолиКолонок - 180 - - РолиПометка - 188 - true - true - - true - - - Роли.Пометка - - - OnChange - РолиПометкаПриИзменении - - - РолиПометкаExtendedTooltip - 246 - Label - true - true - - Left - - - - РолиПометкаКонтекстноеМеню - 189 - true - - CheckBoxField - Left - true - - - - РолиСиноним - 190 - true - true - - true - - - Роли.Синоним - - - РолиСинонимExtendedTooltip - 247 - Label - true - true - - Left - - - - РолиСинонимКонтекстноеМеню - 191 - true - - InputField - true - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - + true + true + + true + + + <key>ru</key> + <value>Главное</value> + + + ГлавноеРасширеннаяПодсказка + 220 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + ОтображениеРолей + 393 + + Роли + 177 + + <key>ru</key> + <value>Разрешенные действия (роли)</value> + + true + true + + true + + + Роли + + false + None + Add + Change + Copy + Delete + EndEdit + HierarchicalList + List + MoveDown + MoveUp + SortListAsc + SortListDesc + Tree + + РолиКолонок + 180 + + РолиПометка + 188 true true true - - <key>ru</key> - <value>Роли колонок</value> - + + Роли.Пометка + + + OnChange + РолиПометкаПриИзменении + - РолиКолонокExtendedTooltip - 245 + РолиПометкаExtendedTooltip + 246 Label true true @@ -2179,16 +2566,90 @@ Left - ColumnGroup - - InCell - auto - true + + РолиПометкаКонтекстноеМеню + 189 + true + + CheckBoxField + Left + true + + + + РолиСиноним + 190 + true + true + + true + + + Роли.Синоним + + + РолиСинонимExtendedTooltip + 247 + Label + true + true + + Left + + + + РолиСинонимКонтекстноеМеню + 191 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal - - РолиКоманднаяПанель - 179 + true + true + + true + + + <key>ru</key> + <value>Роли колонок</value> + + + РолиКолонокExtendedTooltip + 245 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + РолиКоманднаяПанель + 179 + + РолиГруппаКомандФлажки + 427 РолиУстановитьФлажки 185 @@ -2243,94 +2704,124 @@ UserCmds Auto - - РолиПоказатьТолькоВыбранныеРоли - 187 - true - true - - true - - false - - РолиПоказатьТолькоВыбранныеРолиExtendedTooltip - 242 - Label - true - true - - Left - - - Form.Command.ПоказатьТолькоВыбранныеРоли - Normal - Auto - true - true - UserCmds - Auto - - - РолиПоказатьПодсистемыРолей - 193 - true - true - - true - - - РолиПоказатьПодсистемыРолейExtendedTooltip - 243 - Label - true - true - - Left - - - Form.Command.ГруппировкаРолейПоПодсистемам - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - РолиСтандартныеКоманды - 281 - true - true - - true - - - <key>ru</key> - <value>Роли стандартные команды</value> - - - РолиСтандартныеКомандыРасширеннаяПодсказка - 282 - Label - true - true - - Left - - - - Item.Роли - - - Left - - - РолиСтрокаПоиска - 283 + true + true + + true + + + <key>ru</key> + <value>Роли группа команд флажки</value> + - РолиСтрокаПоискаРасширеннаяПодсказка - 285 + РолиГруппаКомандФлажкиРасширеннаяПодсказка + 428 + Label + true + true + + Left + + + + Compact + + + + РолиПоказатьТолькоВыбранныеРоли + 187 + true + true + + true + + false + + РолиПоказатьТолькоВыбранныеРолиExtendedTooltip + 242 + Label + true + true + + Left + + + Form.Command.ПоказатьТолькоВыбранныеРоли + Normal + Auto + true + true + UserCmds + Auto + + + РолиПоказатьПодсистемыРолей + 193 + true + true + + true + + + РолиПоказатьПодсистемыРолейExtendedTooltip + 243 + Label + true + true + + Left + + + Form.Command.ГруппировкаРолейПоПодсистемам + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + РолиСтандартныеКоманды + 281 + true + true + + true + + + <key>ru</key> + <value>Роли стандартные команды</value> + + + РолиСтандартныеКомандыРасширеннаяПодсказка + 282 + Label + true + true + + Left + + + + Item.Роли + + + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + РолиСтрокаПоиск + 429 + + РолиСтрокаПоискРасширеннаяПодсказка + 431 Label true true @@ -2339,66 +2830,23 @@ - РолиСтрокаПоискаКонтекстноеМеню - 284 + РолиСтрокаПоискКонтекстноеМеню + 430 true Роли true - - - РолиСостояниеПросмотра - 286 - - РолиСостояниеПросмотраРасширеннаяПодсказка - 288 - Label - true - true - - Left - - - - РолиСостояниеПросмотраКонтекстноеМеню - 287 - true - - ViewStatusAddition - Роли - - true - - - - РолиУправлениеПоиском - 289 - - РолиУправлениеПоискомРасширеннаяПодсказка - 291 - Label - true - true - - Left - - - - РолиУправлениеПоискомКонтекстноеМеню - 290 - true - - SearchControlAddition - Роли - - true - - + + Left + + + РолиСтрокаПоиска + 283 - РолиExtendedTooltip - 244 + РолиСтрокаПоискаРасширеннаяПодсказка + 285 Label true true @@ -2407,47 +2855,66 @@ - РолиКонтекстноеМеню - 178 + РолиСтрокаПоискаКонтекстноеМеню + 284 + true - Tree - true - true - true - 1 - 1 - AutoUse - AutoUse - true - true - true - Auto - Auto - ExpandAllLevels - true - true - true - true - - Роли.НомерКартинки - - - CommonPicture.ПиктограммыЭлементов - - true - - true - true - - true - - - <key>ru</key> - <value>Разрешенные действия (роли)</value> - + Роли + + true + + + + РолиСостояниеПросмотра + 286 + + РолиСостояниеПросмотраРасширеннаяПодсказка + 288 + Label + true + true + + Left + + + + РолиСостояниеПросмотраКонтекстноеМеню + 287 + true + + ViewStatusAddition + Роли + + true + + + + РолиУправлениеПоиском + 289 + + РолиУправлениеПоискомРасширеннаяПодсказка + 291 + Label + true + true + + Left + + + + РолиУправлениеПоискомКонтекстноеМеню + 290 + true + + SearchControlAddition + Роли + + true + + - ОтображениеРолейExtendedTooltip - 239 + РолиExtendedTooltip + 244 Label true true @@ -2455,15 +2922,35 @@ Left - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - + + РолиКонтекстноеМеню + 178 + + Tree + true + true + true + 1 + 1 + AutoUse + AutoUse + true + true + true + Auto + Auto + ExpandAllLevels + true + true + true + true + + Роли.НомерКартинки + + + CommonPicture.ПиктограммыЭлементов + + true true true @@ -2472,11 +2959,11 @@ <key>ru</key> - <value>Главное</value> + <value>Разрешенные действия (роли)</value> - СвойстваПользователяИБExtendedTooltip - 220 + ОтображениеРолейРасширеннаяПодсказка + 394 Label true true @@ -2486,7 +2973,7 @@ Page - HorizontalIfPossible + Vertical auto false @@ -3697,9 +4184,7 @@ 34 String - - 256 - + true @@ -3753,6 +4238,129 @@ true + + ПользовательИБАутентификацияOpenIDConnect + + <key>ru</key> + <value>Аутентификация по протоколу OpenID-Connect</value> + + 48 + + Boolean + + + true + + + true + + true + + + ПользовательИБАутентификацияТокеномДоступа + + <key>ru</key> + <value>Аутентификация токеном доступа</value> + + 49 + + Boolean + + + true + + + true + + true + + + КонтактнаяИнформацияПолеEmailПользователя + + <key>ru</key> + <value>Электронная почта</value> + + 50 + + String + + + + true + + + true + + + + КонтактнаяИнформацияПолеТелефонПользователя + + <key>ru</key> + <value>Телефон</value> + + 51 + + String + + + + true + + + true + + + + НаличиеПрав + 52 + + + true + + + true + + + + ПользовательИБЗащитаОтОпасныхДействий + 53 + + Boolean + + + true + + + true + + + + РазделениеВключено + 54 + + Boolean + + + true + + + true + + + + ОбщаяНастройкаПоказыватьВСпискеВыбора + 55 + + String + + + + true + + + true + + ПоказатьТолькоВыбранныеРоли @@ -3984,6 +4592,58 @@ <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>КомандаКонтактнаяИнформацияПолеEmailПользователя</name> + <title> + <key>ru</key> + <value>Написать письмо</value> + + 11 + + ru + Написать письмо + + + true + + + CommonPicture.ОтправитьЭлектронноеПисьмо + + + + Подключаемый_КонтактнаяИнформацияВыполнитьКоманду + + + Picture + Auto + Auto + + + КомандаКонтактнаяИнформацияПолеТелефонПользователя + + <key>ru</key> + <value>Позвонить или отправить SMS</value> + + 12 + + ru + Позвонить или отправить SMS + + + true + + + CommonPicture.МенюДополнительныеФункции + + + + Подключаемый_КонтактнаяИнформацияВыполнитьКоманду + + + Picture + Auto + Auto + ГруппаНовогоПользователя diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl index 15d9d4014..8b337eae2 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl @@ -27,8 +27,11 @@ КонецЕсли; // Конец СтандартныеПодсистемы.ПодключаемыеКоманды + ОбщаяНастройкаПоказыватьВСпискеВыбора = + ПользователиСлужебный.НастройкиВхода().Общие.ПоказыватьВСпискеВыбора; + Если ОбщегоНазначения.РазделениеВключено() Тогда - + РазделениеВключено = Истина; ДоступноИзменениеПользователей = Истина; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); @@ -48,7 +51,9 @@ Элементы.НадписьНаличиеПароля.Видимость = Ложь; Элементы.СменитьПароль.Видимость = Ложь; КонецЕсли; - Элементы.ПользовательИБАутентификацияOpenID.Видимость = Ложь; + Элементы.ПользовательИБАутентификацияOpenID.Видимость = Ложь; + Элементы.ПользовательИБАутентификацияOpenIDConnect.Видимость = Ложь; + Элементы.ПользовательИБАутентификацияТокеномДоступа.Видимость = Ложь; Элементы.ПользовательИБАутентификацияСтандартная.Видимость = Ложь; Элементы.ПотребоватьСменуПароляПриВходе.Видимость = Ложь; Элементы.ПользовательИБЗапрещеноИзменятьПароль.Видимость = Ложь; @@ -144,8 +149,14 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + + ИсключаемыеВиды = Новый Массив; + ИсключаемыеВиды.Добавить(ВидКонтактнойИнформации("ТелефонПользователя")); + ИсключаемыеВиды.Добавить(ВидКонтактнойИнформации("EmailПользователя")); + ДополнительныеПараметры = МодульУправлениеКонтактнойИнформацией.ПараметрыКонтактнойИнформации(); ДополнительныеПараметры.ИмяЭлементаДляРазмещения = "КонтактнаяИнформация"; + ДополнительныеПараметры.ИсключаемыеВиды = ИсключаемыеВиды; МодульУправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтотОбъект, Объект, ДополнительныеПараметры); @@ -189,13 +200,13 @@ МодульУправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры); КонецЕсли; - ПодготовитьНеобязательныйРеквизит("ФизическоеЛицо"); - ПодготовитьНеобязательныйРеквизит("Подразделение"); + ПодготовитьНеобязательныйРеквизит("ФизическоеЛицо", Пользователи.ФизическоеЛицоИспользуется()); + ПодготовитьНеобязательныйРеквизит("Подразделение", Пользователи.ПодразделениеИспользуется()); ОбновитьВидимостьРеквизитаПоказыватьВСпискеВыбора(); Если ОбщегоНазначения.РазделениеВключено() - Или Не ПользователиСлужебныйПовтИсп.Настройки().ОбщиеНастройкиВхода Тогда + Или Не Пользователи.ОбщиеНастройкиВходаИспользуются() Тогда Элементы.ГруппаИзменитьОграничение.Видимость = Ложь; КонецЕсли; @@ -215,10 +226,6 @@ АдресФотографии = ПоместитьВоВременноеХранилище(БиблиотекаКартинок.ПользовательБезФотографии, УникальныйИдентификатор); КонецЕсли; - Если Не ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда - Элементы.ПользовательИБЗапрещеноВосстанавливатьПароль.Видимость = Ложь; - КонецЕсли; - КонецПроцедуры &НаКлиенте @@ -228,6 +235,8 @@ Элементы.ПользовательИБПользовательОС.КнопкаВыбора = Ложь; #КонецЕсли + ОбновитьСвойствоПоказыватьВСпискеВыбора(); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент"); МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект); @@ -253,10 +262,17 @@ КонецЕсли; КонецЕсли; - Если ВРег(ИмяСобытия) = ВРег("Запись_НаборКонстант") - И ВРег(Источник) = ВРег("ИспользоватьВнешнихПользователей") Тогда - - ПодключитьОбработчикОжидания("ПриИзмененияИспользованияВнешнихПользователей", 0.1, Истина); + Если ВРег(ИмяСобытия) = ВРег("Запись_НаборКонстант") Тогда + Если ВРег(Источник) = ВРег("ИспользоватьВнешнихПользователей") Тогда + ПодключитьОбработчикОжидания("ПриИзмененияИспользованияВнешнихПользователей", 0.1, Истина); + КонецЕсли; + Если ВРег(Источник) = ВРег("НастройкиВходаПользователей") Тогда + ПодключитьОбработчикОжидания("ПриИзмененияНастроекВходаПользователей", 0.1, Истина); + КонецЕсли; + КонецЕсли; + + Если ВРег(ИмяСобытия) = ВРег("Запись_ГруппыДоступа") Тогда + ПодключитьОбработчикОжидания("ПриИзмененияГруппыДоступа", 0.1, Истина); КонецЕсли; КонецПроцедуры @@ -374,7 +390,7 @@ Если Не ПараметрыЗаписи.Свойство("СПустымEmail") И Не ЗначениеЗаполнено(Объект.Ссылка) И ТребуетсяСинхронизацияССервисом - И СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено + И ОбщегоНазначенияКлиент.РазделениеВключено() И Не ЗаполненEmail() Тогда Отказ = Истина; @@ -389,7 +405,7 @@ КонецЕсли; // Запрос пароля должен быть последним, чтобы работала попытка / исключение. - Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено + Если ОбщегоНазначенияКлиент.РазделениеВключено() И ТребуетсяСинхронизацияССервисом И ПарольПользователяСервиса = Неопределено Тогда @@ -480,6 +496,8 @@ ТекущийОбъект.Ссылка, "Наименование, ПометкаУдаления")); КонецЕсли; + РегистрыСведений.СведенияОПользователях.УстановитьСведенияОПользователе(ЭтотОбъект, ТекущийОбъект); + ТекущийОбъект.ДополнительныеСвойства.Вставить("ГруппаНовогоПользователя", ГруппаНовогоПользователя); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда @@ -505,10 +523,6 @@ &НаСервере Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) - УстановитьПривилегированныйРежим(Истина); - ПользователиСлужебный.ЗаписатьСведенияОПользователе(ЭтотОбъект, ТекущийОбъект); - УстановитьПривилегированныйРежим(Ложь); - Если ПараметрыЗаписи.Свойство("КопироватьПраваПользователя") Тогда Источник = ЗначениеКопирования; Приемник = ТекущийОбъект.Ссылка; @@ -603,9 +617,8 @@ ОписаниеПользователяИБ = ОписаниеПользователяИБ(); ОписаниеПользователяИБ.Вставить("ИдентификаторПользователяИБ", Объект.ИдентификаторПользователяИБ); - Если ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() - И ЗначениеЗаполнено(ИмяРеквизитаСПочтойДляВосстановленияПароля) Тогда - ОписаниеПользователяИБ.АдресЭлектроннойПочты = ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля]; + Если ЗначениеЗаполнено(ИмяРеквизитаСПочтойДляВосстановленияПароля) Тогда + ОписаниеПользователяИБ.АдресЭлектроннойПочты = ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля]; КонецЕсли; ПользователиСлужебный.ПроверитьОписаниеПользователяИБ(ОписаниеПользователяИБ, Отказ, Ложь); @@ -699,9 +712,16 @@ &НаКлиенте Процедура НедействителенПриИзменении(Элемент) + Если РазделениеВключено + И Не Объект.Недействителен Тогда + ВходВПрограммуРазрешенЗначениеПрямогоИзменения = Истина; + КонецЕсли; + Если Объект.Недействителен Тогда ВходВПрограммуРазрешен = Ложь; Если Не ПользовательИБАутентификацияOpenID + И Не ПользовательИБАутентификацияOpenIDConnect + И Не ПользовательИБАутентификацияТокеномДоступа И Не ПользовательИБАутентификацияОС И Не ПользовательИБАутентификацияСтандартнаяЗначениеПрямогоИзменения И ПользовательИБАутентификацияСтандартная Тогда @@ -711,12 +731,16 @@ ИначеЕсли ВходВПрограммуРазрешенЗначениеПрямогоИзменения Тогда Если Не ПользовательИБАутентификацияСтандартная И Не ПользовательИБАутентификацияOpenID + И Не ПользовательИБАутентификацияOpenIDConnect + И Не ПользовательИБАутентификацияТокеномДоступа И Не ПользовательИБАутентификацияОС Тогда ПользовательИБАутентификацияСтандартная = Истина; КонецЕсли; ВходВПрограммуРазрешен = Истина; КонецЕсли; + ОбновитьСвойствоПоказыватьВСпискеВыбора(); + УстановитьДоступностьСвойств(ЭтотОбъект); УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект); @@ -726,6 +750,15 @@ &НаКлиенте Процедура ВходВПрограммуРазрешенПриИзменении(Элемент) + Если РазделениеВключено + И Не ВходВПрограммуРазрешен Тогда + + ВходВПрограммуРазрешен = Истина; + Объект.Недействителен = Истина; + НедействителенПриИзменении(Элементы.Недействителен); + Возврат; + КонецЕсли; + Если Объект.ПометкаУдаления И ВходВПрограммуРазрешен Тогда ВходВПрограммуРазрешен = Ложь; ПоказатьПредупреждение(, @@ -736,6 +769,8 @@ Если Не ВходВПрограммуРазрешен И Не ПользовательИБАутентификацияOpenID + И Не ПользовательИБАутентификацияOpenIDConnect + И Не ПользовательИБАутентификацияТокеномДоступа И Не ПользовательИБАутентификацияОС И Не ПользовательИБАутентификацияСтандартнаяЗначениеПрямогоИзменения И ПользовательИБАутентификацияСтандартная Тогда @@ -746,13 +781,17 @@ ОбновитьИмяДляВхода(ЭтотОбъект); Если ВходВПрограммуРазрешен - И НЕ ПользовательИБАутентификацияOpenID - И НЕ ПользовательИБАутентификацияСтандартная - И НЕ ПользовательИБАутентификацияОС Тогда + И Не ПользовательИБАутентификацияOpenID + И Не ПользовательИБАутентификацияOpenIDConnect + И Не ПользовательИБАутентификацияТокеномДоступа + И Не ПользовательИБАутентификацияОС + И Не ПользовательИБАутентификацияСтандартная Тогда ПользовательИБАутентификацияСтандартная = Истина; КонецЕсли; + ОбновитьСвойствоПоказыватьВСпискеВыбора(); + УстановитьДоступностьСвойств(ЭтотОбъект); УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект); @@ -830,6 +869,20 @@ КонецПроцедуры +&НаКлиенте +Процедура ПользовательИБАутентификацияOpenIDConnectПриИзменении(Элемент) + + АутентификацияПриИзменении(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПользовательИБАутентификацияТокеномДоступаПриИзменении(Элемент) + + АутентификацияПриИзменении(); + +КонецПроцедуры + &НаКлиенте Процедура ПользовательИБАутентификацияОСПриИзменении(Элемент) @@ -1319,15 +1372,59 @@ Процедура ПриИзмененияИспользованияВнешнихПользователей() ОбновитьВидимостьРеквизитаПоказыватьВСпискеВыбора(); + ОбновитьСвойствоПоказыватьВСпискеВыбора(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриИзмененияНастроекВходаПользователей() + + ПриИзмененияНастроекВходаПользователейНаСервере(); + ОбновитьСвойствоПоказыватьВСпискеВыбора(); + +КонецПроцедуры + +&НаСервере +Процедура ПриИзмененияНастроекВходаПользователейНаСервере() + + ОбщаяНастройкаПоказыватьВСпискеВыбора = + ПользователиСлужебный.НастройкиВхода().Общие.ПоказыватьВСпискеВыбора; + + ОбновитьВидимостьРеквизитаПоказыватьВСпискеВыбора(); КонецПроцедуры &НаСервере Процедура ОбновитьВидимостьРеквизитаПоказыватьВСпискеВыбора() + Если ОбщегоНазначения.РазделениеВключено() + Или ВнешниеПользователи.ИспользоватьВнешнихПользователей() Тогда + + Элементы.ПользовательИБПоказыватьВСпискеВыбора.Видимость = Ложь; + Возврат; + КонецЕсли; + Элементы.ПользовательИБПоказыватьВСпискеВыбора.Видимость = - Не ОбщегоНазначения.РазделениеВключено() - И Не ПолучитьФункциональнуюОпцию("ИспользоватьВнешнихПользователей") + ОбщаяНастройкаПоказыватьВСпискеВыбора = "ВключеноДляНовыхПользователей" + Или ОбщаяНастройкаПоказыватьВСпискеВыбора = "ВыключеноДляНовыхПользователей" + +КонецПроцедуры + +&НаКлиенте +Процедура ПриИзмененияГруппыДоступа() + + ПриИзмененияГруппыДоступаНаСервере(); + +КонецПроцедуры + +&НаСервере +Процедура ПриИзмененияГруппыДоступаНаСервере() + + УстановитьПривилегированныйРежим(Истина); + НаличиеПрав = РегистрыСведений.СведенияОПользователях.НаличиеПрав(Объект.ИдентификаторПользователяИБ); + УстановитьПривилегированныйРежим(Ложь); + + УстановитьДоступностьСвойств(ЭтотОбъект); КонецПроцедуры @@ -1343,7 +1440,8 @@ КонецЕсли; УстановитьПривилегированныйРежим(Истина); - ПользователиСлужебный.ПрочитатьСведенияОПользователе(ЭтотОбъект); + РегистрыСведений.СведенияОПользователях.ПрочитатьСведенияОПользователе(ЭтотОбъект); + НаличиеПрав = РегистрыСведений.СведенияОПользователях.НаличиеПрав(Объект.ИдентификаторПользователяИБ); УстановитьПривилегированныйРежим(Ложь); УровеньДоступа = ПользователиСлужебный.УровеньДоступаКСвойствамПользователя(ТекущийОбъект); @@ -1368,11 +1466,10 @@ // Настройка возможности просмотра. Элементы.КонтактнаяИнформация.Видимость = ЗначениеЗаполнено(ДействияВФорме.КонтактнаяИнформация); Элементы.СвойстваПользователяИБ.Видимость = ЗначениеЗаполнено(ДействияВФорме.СвойстваПользователяИБ); + Элементы.ГруппаИмя.Видимость = ЗначениеЗаполнено(ДействияВФорме.СвойстваПользователяИБ); ВыводитьСписокРолей = ЗначениеЗаполнено(ДействияВФорме.Роли); Элементы.ОтображениеРолей.Видимость = ВыводитьСписокРолей; - Элементы.СвойстваАутентификации1СПредприятия.Отображение = - ?(ВыводитьСписокРолей, ОтображениеОбычнойГруппы.Нет, ОтображениеОбычнойГруппы.ОбычноеВыделение); Элементы.РекомендуетсяПроверитьНастройкиДляВхода.Видимость = УровеньДоступа.ИзменениеРазрешенияНаВход @@ -1413,16 +1510,18 @@ Элементы.ФизическоеЛицо.ТолькоПросмотр = Элементы.Наименование.ТолькоПросмотр; Элементы.Подразделение.ТолькоПросмотр = Элементы.Наименование.ТолькоПросмотр; - Элементы.ОсновныеСвойства.ТолькоПросмотр = + Элементы.СвойстваПользователяИБ.ТолькоПросмотр = Не ( ДействияВФорме.СвойстваПользователяИБ = "Редактирование" И (УровеньДоступа.УправлениеСписком Или УровеньДоступа.ИзменениеТекущего)); + Элементы.ГруппаИмя.ТолькоПросмотр = Элементы.СвойстваПользователяИБ.ТолькоПросмотр; - Элементы.ПользовательИБИмя1.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; - Элементы.ПользовательИБИмя2.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; - Элементы.ПользовательИБАутентификацияСтандартная.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; - Элементы.ПользовательИБАутентификацияOpenID.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; - Элементы.ПользовательИБАутентификацияОС.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; - Элементы.ПользовательИБПользовательОС.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; + Элементы.ПользовательИБИмя.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; + Элементы.ПользовательИБАутентификацияСтандартная.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; + Элементы.ПользовательИБАутентификацияOpenID.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; + Элементы.ПользовательИБАутентификацияOpenIDConnect.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; + Элементы.ПользовательИБАутентификацияТокеномДоступа.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; + Элементы.ПользовательИБАутентификацияОС.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; + Элементы.ПользовательИБПользовательОС.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; Элементы.ПользовательИБПоказыватьВСпискеВыбора.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; Элементы.ПотребоватьСменуПароляПриВходе.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; @@ -1438,9 +1537,9 @@ КонецПроцедуры &НаСервере -Процедура ПодготовитьНеобязательныйРеквизит(ИмяРеквизита) +Процедура ПодготовитьНеобязательныйРеквизит(ИмяРеквизита, Используется) - Если ТипЗнч(Объект[ИмяРеквизита]) = Тип("Строка") Тогда + Если Не Используется Тогда Элементы[ИмяРеквизита].Видимость = Ложь; Иначе ТипыПодразделения = Метаданные.ОпределяемыеТипы[ИмяРеквизита].Тип.Типы(); @@ -1499,14 +1598,10 @@ Элементы = Форма.Элементы; // Настройка необходимости заполнения. - Если ТребуетсяЗаписьПользователяИБ(Форма, Ложь) Тогда - НоваяСтраница = Элементы.ИмяСОтметкойНезаполненного; - Иначе - НоваяСтраница = Элементы.ИмяБезОтметкиНезаполненного; - КонецЕсли; - - Если Элементы.ИмяПереключениеОтметкиНезаполненного.ТекущаяСтраница <> НоваяСтраница Тогда - Элементы.ИмяПереключениеОтметкиНезаполненного.ТекущаяСтраница = НоваяСтраница; + ПоказатьИмяСОтметкойНезаполненного = ТребуетсяЗаписьПользователяИБ(Форма, Ложь); + Элементы.ПользовательИБИмя.АвтоОтметкаНезаполненного = ПоказатьИмяСОтметкойНезаполненного; + Если Не ПоказатьИмяСОтметкойНезаполненного Тогда + Элементы.ПользовательИБИмя.ОтметкаНезаполненного = Ложь; КонецЕсли; Если Форма.ПользовательИБСуществует Тогда @@ -1515,8 +1610,7 @@ КраткоеИмя = ПользователиСлужебныйКлиентСервер.ПолучитьКраткоеИмяПользователяИБ(Форма.Объект.Наименование); - Если Элементы.ИмяПереключениеОтметкиНезаполненного.ТекущаяСтраница = Элементы.ИмяБезОтметкиНезаполненного Тогда - + Если Не ПоказатьИмяСОтметкойНезаполненного Тогда Если (Не ЗначениеЗаполнено(Форма.ПользовательИБИмяЗначениеПрямогоИзменения) Или Форма.ПользовательИБИмяЗначениеПрямогоИзменения = КраткоеИмя) И Форма.ПользовательИБИмя = КраткоеИмя Тогда @@ -1536,13 +1630,21 @@ &НаКлиенте Процедура АутентификацияПриИзменении() - Если НЕ ПользовательИБАутентификацияOpenID - И НЕ ПользовательИБАутентификацияСтандартная - И НЕ ПользовательИБАутентификацияОС Тогда + Если Не ПользовательИБАутентификацияСтандартная + И Не ПользовательИБАутентификацияOpenID + И Не ПользовательИБАутентификацияOpenIDConnect + И Не ПользовательИБАутентификацияТокеномДоступа + И Не ПользовательИБАутентификацияОС Тогда ВходВПрограммуРазрешен = Ложь; ПользовательИБЗапрещеноВосстанавливатьПароль = Истина; + Если РазделениеВключено Тогда + Объект.Недействителен = Истина; + НедействителенПриИзменении(Элементы.Недействителен); + Возврат; + КонецЕсли; + ИначеЕсли Не ВходВПрограммуРазрешен Тогда ВходВПрограммуРазрешен = ВходВПрограммуРазрешенЗначениеПрямогоИзменения; @@ -1557,6 +1659,18 @@ КонецПроцедуры +&НаКлиенте +Процедура ОбновитьСвойствоПоказыватьВСпискеВыбора() + + Если ОбщаяНастройкаПоказыватьВСпискеВыбора = "СкрытоИВключеноДляВсехПользователей" Тогда + ПользовательИБПоказыватьВСпискеВыбора = ПользовательИБАутентификацияСтандартная; + + ИначеЕсли ОбщаяНастройкаПоказыватьВСпискеВыбора = "СкрытоИВыключеноДляВсехПользователей" Тогда + ПользовательИБПоказыватьВСпискеВыбора = Ложь; + КонецЕсли; + +КонецПроцедуры + &НаКлиенте Процедура ПослеСменыПочты(Результат, Контекст) Экспорт @@ -1733,25 +1847,20 @@ Результат = Новый Структура; Если УровеньДоступа.ИзменениеТекущего Тогда + Результат.Вставить("АдресЭлектроннойПочты", ПользовательИБАдресЭлектроннойПочты); Результат.Вставить("Пароль", ПользовательИБПароль); Результат.Вставить("Язык", ПользовательИБЯзык); - Если ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда - Результат.Вставить("АдресЭлектроннойПочты", ПользовательИБАдресЭлектроннойПочты); - КонецЕсли; КонецЕсли; Если УровеньДоступа.УправлениеСписком Тогда + Результат.Вставить("АдресЭлектроннойПочты", ПользовательИБАдресЭлектроннойПочты); Результат.Вставить("ВходВПрограммуРазрешен", ВходВПрограммуРазрешен); Результат.Вставить("ПоказыватьВСпискеВыбора", ПользовательИБПоказыватьВСпискеВыбора - И Не ПолучитьФункциональнуюОпцию("ИспользоватьВнешнихПользователей")); + И Не ВнешниеПользователи.ИспользоватьВнешнихПользователей()); Результат.Вставить("ЗапрещеноИзменятьПароль", ПользовательИБЗапрещеноИзменятьПароль); - + Результат.Вставить("ЗапрещеноВосстанавливатьПароль", ПользовательИБЗапрещеноВосстанавливатьПароль); Результат.Вставить("Язык", ПользовательИБЯзык); Результат.Вставить("РежимЗапуска", ПользовательИБРежимЗапуска); - Если ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда - Результат.Вставить("ЗапрещеноВосстанавливатьПароль", ПользовательИБЗапрещеноВосстанавливатьПароль); - Результат.Вставить("АдресЭлектроннойПочты", ПользовательИБАдресЭлектроннойПочты); - КонецЕсли; Если ДействияВФорме.СвойстваЭлемента = "Редактирование" Тогда Результат.Вставить("ПолноеИмя", ПользовательИБПолноеИмя); @@ -1759,12 +1868,14 @@ КонецЕсли; Если УровеньДоступа.НастройкиДляВхода Тогда - Результат.Вставить("АутентификацияСтандартная", ПользовательИБАутентификацияСтандартная); - Результат.Вставить("Имя", ПользовательИБИмя); - Результат.Вставить("Пароль", ПользовательИБПароль); - Результат.Вставить("АутентификацияOpenID", ПользовательИБАутентификацияOpenID); - Результат.Вставить("АутентификацияОС", ПользовательИБАутентификацияОС); - Результат.Вставить("ПользовательОС", ПользовательИБПользовательОС); + Результат.Вставить("АутентификацияСтандартная", ПользовательИБАутентификацияСтандартная); + Результат.Вставить("Имя", ПользовательИБИмя); + Результат.Вставить("Пароль", ПользовательИБПароль); + Результат.Вставить("АутентификацияOpenID", ПользовательИБАутентификацияOpenID); + Результат.Вставить("АутентификацияOpenIDConnect", ПользовательИБАутентификацияOpenIDConnect); + Результат.Вставить("АутентификацияТокеномДоступа", ПользовательИБАутентификацияТокеномДоступа); + Результат.Вставить("АутентификацияОС", ПользовательИБАутентификацияОС); + Результат.Вставить("ПользовательОС", ПользовательИБПользовательОС); КонецЕсли; КонецЕсли; @@ -1874,6 +1985,8 @@ ВходВПрограммуРазрешен = Истина; ПользовательИБАутентификацияСтандартная = Истина; + ОбновитьСвойствоПоказыватьВСпискеВыбора(); + ПараметрыЗаписи.Вставить("ССозданиемПервогоАдминистратора"); Записать(ПараметрыЗаписи); @@ -1937,7 +2050,7 @@ КонтактнаяИнформация = ЭтотОбъект.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; - СтрокаEMail = КонтактнаяИнформация.НайтиСтроки(Новый Структура("Вид", Справочники["ВидыКонтактнойИнформации"].EmailПользователя))[0]; + СтрокаEMail = КонтактнаяИнформация.НайтиСтроки(Новый Структура("Вид", ВидКонтактнойИнформации("EmailПользователя")))[0]; ЭлементEMail = Элементы[СтрокаEMail.ИмяРеквизита]; ЭлементEMail.УстановитьДействие("ПриИзменении", "Подключаемый_EMailПриИзменении"); ЭлементEMail.УстановитьДействие("Очистка", "Подключаемый_EMailОчистка"); @@ -1947,7 +2060,7 @@ ЭлементEMail.РедактированиеТекста = Не ЭлементEMail.КнопкаВыбора; ЭлементEMail.УстановитьДействие("НачалоВыбора", "Подключаемый_EMailНачалоВыбора"); - СтрокаТелефон = КонтактнаяИнформация.НайтиСтроки(Новый Структура("Вид", Справочники["ВидыКонтактнойИнформации"].ТелефонПользователя))[0]; + СтрокаТелефон = КонтактнаяИнформация.НайтиСтроки(Новый Структура("Вид", ВидКонтактнойИнформации("ТелефонПользователя")))[0]; ЭлементТелефон = Элементы[СтрокаТелефон.ИмяРеквизита]; ЭлементТелефон.УстановитьДействие("ПриИзменении", "Подключаемый_ТелефонПриИзменении"); @@ -1962,7 +2075,7 @@ КонтактнаяИнформация = ЭтотОбъект.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; - СтрокаEMail = КонтактнаяИнформация.НайтиСтроки(Новый Структура("Вид", Справочники["ВидыКонтактнойИнформации"].EmailПользователя))[0]; + СтрокаEMail = КонтактнаяИнформация.НайтиСтроки(Новый Структура("Вид", ВидКонтактнойИнформации("EmailПользователя")))[0]; ЭлементEMail = Элементы[СтрокаEMail.ИмяРеквизита]; ЭлементEMail.КнопкаВыбора = ЗначениеЗаполнено(Объект.Ссылка) И ЗначениеЗаполнено(ЭтотОбъект[СтрокаEMail.ИмяРеквизита]); @@ -1970,6 +2083,14 @@ КонецПроцедуры +&НаСервереБезКонтекста +Функция ВидКонтактнойИнформации(ИмяВида) + + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + Возврат МодульУправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени(ИмяВида); + +КонецФункции + &НаКлиентеНаСервереБезКонтекста Функция ВидКонтактнойИнформацииEmailПользователя() @@ -2049,11 +2170,13 @@ ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ(); - Если ОбщегоНазначения.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() + Или ВнешниеПользователи.ИспользоватьВнешнихПользователей() Тогда ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Ложь; Иначе ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = - НЕ Константы.ИспользоватьВнешнихПользователей.Получить(); + ОбщаяНастройкаПоказыватьВСпискеВыбора = "ВключеноДляНовыхПользователей" + Или ОбщаяНастройкаПоказыватьВСпискеВыбора = "СкрытоИВключеноДляВсехПользователей"; КонецЕсли; ОписаниеПользователяИБ.Роли = Новый Массив; @@ -2135,16 +2258,21 @@ ПрочитанныеСвойства, "Имя, |ПолноеИмя, - |АутентификацияOpenID, + |АдресЭлектроннойПочты, |АутентификацияСтандартная, |ПоказыватьВСпискеВыбора, |ЗапрещеноИзменятьПароль, + |ЗапрещеноВосстанавливатьПароль, + |АутентификацияOpenID, + |АутентификацияOpenIDConnect, + |АутентификацияТокеномДоступа, |АутентификацияОС, |ПользовательОС, |ОсновнойИнтерфейс, |РежимЗапуска" + ?(Не Элементы.ПользовательИБЯзык.Видимость, "", ", |Язык") + ?(ПользователиСлужебный.ЗапретРедактированияРолей(), "", ", - |Роли") + ПользователиСлужебный.ПоляВосстановленияПаролей()); + |Роли") + ", + |ЗащитаОтОпасныхДействий"); КонецЕсли; Если ПрочитанныеСвойства = Неопределено Тогда @@ -2161,15 +2289,17 @@ ОписаниеПользователяИБ, , "УникальныйИдентификатор, - |Роли" + ?(ПолучитьФункциональнуюОпцию("ИспользоватьВнешнихПользователей"), ", + |Роли" + ?(ВнешниеПользователи.ИспользоватьВнешнихПользователей(), ", |ПоказыватьВСпискеВыбора", ""), "ПользовательИБ"); Если ПользовательИБОсновной И Не ВходВПрограммуРазрешен Тогда ХранимыеСвойства = ПользователиСлужебный.ХранимыеСвойстваПользователяИБ(Объект.Ссылка); - ПользовательИБАутентификацияOpenID = ХранимыеСвойства.АутентификацияOpenID; - ПользовательИБАутентификацияСтандартная = ХранимыеСвойства.АутентификацияСтандартная; - ПользовательИБАутентификацияОС = ХранимыеСвойства.АутентификацияОС; + ПользовательИБАутентификацияСтандартная = ХранимыеСвойства.АутентификацияСтандартная; + ПользовательИБАутентификацияOpenID = ХранимыеСвойства.АутентификацияOpenID; + ПользовательИБАутентификацияOpenIDConnect = ХранимыеСвойства.АутентификацияOpenIDConnect; + ПользовательИБАутентификацияТокеномДоступа = ХранимыеСвойства.АутентификацияТокеномДоступа; + ПользовательИБАутентификацияОС = ХранимыеСвойства.АутентификацияОС; КонецЕсли; Если ПользовательИБСуществует Тогда @@ -2227,10 +2357,8 @@ МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); - ВидEmailПользователя = МодульУправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени("EmailПользователя"); - СтрокаОписания = МодульУправлениеКонтактнойИнформацией.СтрокаОписанияПочтыДляВосстановленияПароляИзДанныхФормы( - ЭтотОбъект, ВидEmailПользователя, ПользовательИБАдресЭлектроннойПочты); + ЭтотОбъект, ВидКонтактнойИнформации("EmailПользователя"), ПользовательИБАдресЭлектроннойПочты); Если СтрокаОписания = Неопределено Тогда ПоказатьКомандыУстраненияРазличий = @@ -2243,7 +2371,19 @@ КонецЕсли; КонецЕсли; - Если УточнениеСвойств.Количество() > 0 Тогда + УстановитьПривилегированныйРежим(Истина); + ОтличаютсяСохраненныеСвойстваПользователяИБ = ЗначениеЗаполнено(Объект.Ссылка) + И РегистрыСведений.СведенияОПользователях.ОтличаютсяСохраненныеСвойстваПользователяИБ(Объект); + УстановитьПривилегированныйРежим(Ложь); + + ПоказатьКомментарийУстраненияРазличий = + ПоказатьКомандыУстраненияРазличий + Или ОтличаютсяСохраненныеСвойстваПользователяИБ + И ДействияВФорме.СвойстваЭлемента = "Редактирование"; + + Если УточнениеСвойств.Количество() > 0 + Или ОтличаютсяСохраненныеСвойстваПользователяИБ Тогда + СтрокаУточненияСвойств = ""; ТекущаяСтрока = ""; Для каждого УточнениеСвойства Из УточнениеСвойств Цикл @@ -2256,7 +2396,7 @@ Если ЗначениеЗаполнено(ТекущаяСтрока) Тогда СтрокаУточненияСвойств = СтрокаУточненияСвойств + ТекущаяСтрока; КонецЕсли; - Если ПоказатьКомандыУстраненияРазличий Тогда + Если ПоказатьКомментарийУстраненияРазличий Тогда Рекомендация = Символы.ПС + НСтр("ru = 'Нажмите ""Записать"", чтобы устранить различия и не выводить это предупреждение.'"); @@ -2266,10 +2406,19 @@ Иначе Рекомендация = ""; КонецЕсли; - Элементы.СвойстваПояснениеНесоответствия.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Следующие свойства пользователя информационной базы отличаются от указанных в этой форме: - |%1.'"), - СтрокаУточненияСвойств) + Рекомендация; + Если ЗначениеЗаполнено(СтрокаУточненияСвойств) Тогда + ПояснениеНесоответствия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Следующие свойства пользователя информационной базы отличаются от указанных в этой форме: + |%1.'"), + СтрокаУточненияСвойств) + ?(Не ОтличаютсяСохраненныеСвойстваПользователяИБ, "", " + |" + НСтр("ru = 'Картинка в списке пользователей может отображать устаревшее состояние, + |так как отличаются и некоторые другие сохраненные свойства.'")); + Иначе + ПояснениеНесоответствия = + НСтр("ru = 'Картинка в списке пользователей может отображать устаревшее состояние, + |так как некоторые свойства пользователя информационной базы отличаются от сохраненных.'"); + КонецЕсли; + Элементы.СвойстваПояснениеНесоответствия.Заголовок = ПояснениеНесоответствия + Рекомендация; Иначе ПоказатьНесоответствие = Ложь; КонецЕсли; @@ -2354,7 +2503,7 @@ Если ЗначениеЗаполнено(ПочтаДляВосстановленияПароляИзОбъекта[ИмяРеквизитаСПочтойДляВосстановленияПароля]) Или ПочтаДляВосстановленияПароляИзОбъекта[ИмяРеквизитаСПочтойДляВосстановленияПароля] <> ПользовательИБАдресЭлектроннойПочты Тогда - ВидEmailПользователя = МодульУправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени("EmailПользователя"); + ВидEmailПользователя = ВидКонтактнойИнформации("EmailПользователя"); ОписаниеПочты = МодульУправлениеКонтактнойИнформацией.СтрокаОписанияПочтыДляВосстановленияПароляИзДанныхФормы(ЭтотОбъект, ВидEmailПользователя, ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля]); Если ОписаниеПочты <> Неопределено Тогда @@ -2382,9 +2531,19 @@ УровеньДоступа = Форма.УровеньДоступа; ДействияСПользователемСервиса = Форма.ДействияСПользователемСервиса; + // Пояснение состояния "Нет входа". + Если Форма.ВходВПрограммуРазрешен Тогда + Элементы.ГруппаНетПрав.Видимость = Форма.НаличиеПрав.НетПрав; + Элементы.ГруппаНетПравНаЗапуск.Видимость = Не Форма.НаличиеПрав.НетПрав + И Форма.НаличиеПрав.НедостаточноПравДляВхода; + Иначе + Элементы.ГруппаНетПрав.Видимость = Ложь; + Элементы.ГруппаНетПравНаЗапуск.Видимость = Ложь; + КонецЕсли; + // Настройка возможности изменения. Элементы.ВходВПрограммуРазрешен.ТолькоПросмотр = - Не ( Элементы.ОсновныеСвойства.ТолькоПросмотр = Ложь + Не ( Элементы.СвойстваПользователяИБ.ТолькоПросмотр = Ложь И ( УровеньДоступа.ИзменениеРазрешенияНаВход Или УровеньДоступа.ОтключениеРазрешенияНаВход И Форма.ПриЧтенииВходВПрограммуРазрешен)); @@ -2398,7 +2557,8 @@ // Настройка доступности связанных элементов. Элементы.ВходВПрограммуРазрешен.Доступность = Не Объект.Недействителен; - Элементы.ОсновныеСвойства.Доступность = Не Объект.Недействителен; + Элементы.СвойстваПользователяИБ.Доступность = Не Объект.Недействителен; + Элементы.ГруппаИмя.Доступность = Не Объект.Недействителен; Элементы.ГруппаИзменитьОграничение.Доступность = Не Объект.Недействителен И Не Элементы.Наименование.ТолькоПросмотр; @@ -2427,10 +2587,7 @@ Элементы.СменитьПароль.Доступность = Элементы.СменитьПароль.Доступность И МожноИзменятьПароль; - Элементы.ПользовательИБИмя1.ТолькоПросмотр = Элементы.ПользовательИБИмя1.ТолькоПросмотр - ИЛИ НЕ ДействияСПользователемСервиса.ИзменениеИмени; - - Элементы.ПользовательИБИмя2.ТолькоПросмотр = Элементы.ПользовательИБИмя2.ТолькоПросмотр + Элементы.ПользовательИБИмя.ТолькоПросмотр = Элементы.ПользовательИБИмя.ТолькоПросмотр ИЛИ НЕ ДействияСПользователемСервиса.ИзменениеИмени; Элементы.Наименование.ТолькоПросмотр = Элементы.Наименование.ТолькоПросмотр @@ -2498,18 +2655,20 @@ КонецЕсли; Если Форма.ПользовательИБСуществует - ИЛИ Форма.ВходВПрограммуРазрешен - ИЛИ Форма.ПользовательИБИмя <> ТекущееИмя - ИЛИ Форма.ПользовательИБАутентификацияСтандартная <> Шаблон.АутентификацияСтандартная - ИЛИ Форма.ПользовательИБПоказыватьВСпискеВыбора <> Шаблон.ПоказыватьВСпискеВыбора - ИЛИ Форма.ПользовательИБЗапрещеноИзменятьПароль <> Шаблон.ЗапрещеноИзменятьПароль - ИЛИ Форма.ПользовательИБПароль <> Неопределено - ИЛИ Форма.ПользовательИБАутентификацияОС <> Шаблон.АутентификацияОС - ИЛИ Форма.ПользовательИБПользовательОС <> "" - ИЛИ Форма.ПользовательИБАутентификацияOpenID <> Шаблон.АутентификацияOpenID - ИЛИ Форма.ПользовательИБРежимЗапуска <> Шаблон.РежимЗапуска - ИЛИ Форма.ПользовательИБЯзык <> Шаблон.Язык - ИЛИ Форма.ПользовательИБРоли.Количество() <> 0 Тогда + Или Форма.ВходВПрограммуРазрешен + Или Форма.ПользовательИБИмя <> ТекущееИмя + Или Форма.ПользовательИБАутентификацияСтандартная <> Шаблон.АутентификацияСтандартная + Или Форма.ПользовательИБПоказыватьВСпискеВыбора <> Шаблон.ПоказыватьВСпискеВыбора + Или Форма.ПользовательИБЗапрещеноИзменятьПароль <> Шаблон.ЗапрещеноИзменятьПароль + Или Форма.ПользовательИБПароль <> Неопределено + Или Форма.ПользовательИБАутентификацияOpenID <> Шаблон.АутентификацияOpenID + Или Форма.ПользовательИБАутентификацияOpenIDConnect <> Шаблон.АутентификацияOpenIDConnect + Или Форма.ПользовательИБАутентификацияТокеномДоступа <> Шаблон.АутентификацияТокеномДоступа + Или Форма.ПользовательИБАутентификацияОС <> Шаблон.АутентификацияОС + Или Форма.ПользовательИБПользовательОС <> "" + Или Форма.ПользовательИБРежимЗапуска <> Шаблон.РежимЗапуска + Или Форма.ПользовательИБЯзык <> Шаблон.Язык + Или Форма.ПользовательИБРоли.Количество() <> 0 Тогда Возврат Истина; КонецЕсли; diff --git a/SSL/src/Catalogs/Пользователи/ManagerModule.bsl b/SSL/src/Catalogs/Пользователи/ManagerModule.bsl index bda890af5..e12166a1b 100644 --- a/SSL/src/Catalogs/Пользователи/ManagerModule.bsl +++ b/SSL/src/Catalogs/Пользователи/ManagerModule.bsl @@ -26,7 +26,7 @@ НеРедактируемыеРеквизиты.Добавить("Служебный"); НеРедактируемыеРеквизиты.Добавить("ИдентификаторПользователяИБ"); НеРедактируемыеРеквизиты.Добавить("ИдентификаторПользователяСервиса"); - НеРедактируемыеРеквизиты.Добавить("СвойстваПользователяИБ"); + НеРедактируемыеРеквизиты.Добавить("УдалитьСвойстваПользователяИБ"); Возврат НеРедактируемыеРеквизиты; @@ -182,14 +182,9 @@ Процедура ВключитьСтандартныеНастройкиВосстановленияПароля() - Настройки = ПользователиСлужебный.НастройкиВосстановленияПароля(); - - Если Настройки = Неопределено Тогда - Возврат; - КонецЕсли; - - Настройки.СпособВосстановленияПароля = ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("ОтправкаКодаПодтвержденияЧерезСтандартныйСервис"); - ПользователиСлужебный.УстановитьНастройкиВосстановленияПароля(Настройки); + Настройки = ДополнительныеНастройкиАутентификации.ПолучитьНастройкиВосстановленияПароля(); + Настройки.СпособВосстановленияПароля = СпособВосстановленияПароляПользователяИнформационнойБазы.ОтправкаКодаПодтвержденияЧерезСтандартныйСервис; + ДополнительныеНастройкиАутентификации.УстановитьНастройкиВосстановленияПароля(Настройки); КонецПроцедуры diff --git a/SSL/src/Catalogs/Пользователи/ObjectModule.bsl b/SSL/src/Catalogs/Пользователи/ObjectModule.bsl index 562ba6fa8..9a5a5b4ec 100644 --- a/SSL/src/Catalogs/Пользователи/ObjectModule.bsl +++ b/SSL/src/Catalogs/Пользователи/ObjectModule.bsl @@ -44,9 +44,10 @@ // - Неопределено - флажок не изменяется (аналогично, // если свойство не указано). // -// АутентификацияСтандартная, АутентификацияОС, АутентификацияOpenID - установить -// сохраняемые значения видов аутентификации и, в зависимости от использования свойства. -// ВходВПрограммуРазрешен, установить действующие значения видов аутентификации. +// АутентификацияСтандартная, АутентификацияOpenID, АутентификацияOpenIDConnect, +// АутентификацияТокеномДоступа, АутентификацияОС - установить сохраняемые значения +// видов аутентификации и действующие значения видов аутентификации +// в зависимости от использования свойства ВходВПрограммуРазрешен. // // Остальные свойства. // Состав остальных свойств указывается аналогично составу свойств параметра. @@ -87,6 +88,11 @@ ПользователиСлужебный.НачатьОбработкуПользователяИБ(ЭтотОбъект, ПараметрыОбработкиПользователяИБ); + УстановитьПривилегированныйРежим(Истина); + РегистрыСведений.СведенияОПользователях.ОбновитьСведенияОПользователе( + ПользователиСлужебный.СсылкаОбъекта(ЭтотОбъект), ЭтотОбъект); + УстановитьПривилегированныйРежим(Ложь); + КонецПроцедуры Процедура ПриЗаписи(Отказ) diff --git a/SSL/src/Catalogs/Пользователи/Пользователи.mdo b/SSL/src/Catalogs/Пользователи/Пользователи.mdo index 3f03cab78..416df1f63 100644 --- a/SSL/src/Catalogs/Пользователи/Пользователи.mdo +++ b/SSL/src/Catalogs/Пользователи/Пользователи.mdo @@ -354,10 +354,10 @@ Use - СвойстваПользователяИБ + УдалитьСвойстваПользователяИБ ru - Свойства пользователя ИБ + (не используется) Свойства пользователя ИБ ValueStorage diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Form.form b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Form.form index 41f089c68..be0dcff30 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Form.form +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Form.form @@ -108,7 +108,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Form.form index 7c3b21bcb..44024db3d 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Form.form @@ -27,7 +27,6 @@ UsualGroup Vertical - Auto true true auto diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl index 0c754a9b2..07ef17f41 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl @@ -69,57 +69,57 @@ // Процедура ПрименитьПравила(ПараметрыВыгрузки, АдресХранилища) Экспорт - ТаблицаСоответствий = Новый ТаблицаЗначений; - ТаблицаСоответствий.Колонки.Добавить("Папка"); - ТаблицаСоответствий.Колонки.Добавить("Письмо"); - - ТекстУсловияПоПапке = ?(ПараметрыВыгрузки.ВключаяПодчиненные," В ИЕРАРХИИ(&ПапкаЭлектронногоПисьма) "," = &ПапкаЭлектронногоПисьма "); - - Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ - | ВыбранныеПравила.Правило, - | ВыбранныеПравила.Применять - |ПОМЕСТИТЬ ВыбранныеПравила - |ИЗ - | &ВыбранныеПравила КАК ВыбранныеПравила - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ВыбранныеПравила.Правило, - | ПравилаОбработкиЭлектроннойПочты.КомпоновщикНастроек, - | ПравилаОбработкиЭлектроннойПочты.ПомещатьВПапку - |ИЗ - | ВыбранныеПравила КАК ВыбранныеПравила - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПравилаОбработкиЭлектроннойПочты КАК ПравилаОбработкиЭлектроннойПочты - | ПО ВыбранныеПравила.Правило = ПравилаОбработкиЭлектроннойПочты.Ссылка - |ГДЕ - | ВыбранныеПравила.Применять - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ - | ЭлектронноеПисьмоВходящее.Ссылка, - | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма КАК Папка - |ИЗ - | Документ.ЭлектронноеПисьмоВходящее КАК ЭлектронноеПисьмоВходящее - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий - | ПО ПредметыПапкиВзаимодействий.Взаимодействие = ЭлектронноеПисьмоВходящее.Ссылка - |ГДЕ - | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма " + ТекстУсловияПоПапке +" - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ - | ЭлектронноеПисьмоИсходящее.Ссылка, - | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма - |ИЗ - | Документ.ЭлектронноеПисьмоИсходящее КАК ЭлектронноеПисьмоИсходящее - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий - | ПО ПредметыПапкиВзаимодействий.Взаимодействие = ЭлектронноеПисьмоИсходящее.Ссылка - |ГДЕ - | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма " + ТекстУсловияПоПапке ; + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ВыбранныеПравила.Правило, + | ВыбранныеПравила.Применять + |ПОМЕСТИТЬ ВыбранныеПравила + |ИЗ + | &ВыбранныеПравила КАК ВыбранныеПравила + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВыбранныеПравила.Правило КАК Ссылка, + | ПравилаОбработкиЭлектроннойПочты.Владелец КАК УчетнаяЗапись, + | ПравилаОбработкиЭлектроннойПочты.Наименование КАК НаименованиеПравила, + | ПравилаОбработкиЭлектроннойПочты.КомпоновщикНастроек, + | ПравилаОбработкиЭлектроннойПочты.ПомещатьВПапку + |ИЗ + | ВыбранныеПравила КАК ВыбранныеПравила + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПравилаОбработкиЭлектроннойПочты КАК ПравилаОбработкиЭлектроннойПочты + | ПО ВыбранныеПравила.Правило = ПравилаОбработкиЭлектроннойПочты.Ссылка + |ГДЕ + | ВыбранныеПравила.Применять + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЭлектронноеПисьмоВходящее.Ссылка, + | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма КАК Папка + |ИЗ + | Документ.ЭлектронноеПисьмоВходящее КАК ЭлектронноеПисьмоВходящее + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий + | ПО ПредметыПапкиВзаимодействий.Взаимодействие = ЭлектронноеПисьмоВходящее.Ссылка + |ГДЕ + | &УсловиеПоПапке + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ЭлектронноеПисьмоИсходящее.Ссылка, + | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее КАК ЭлектронноеПисьмоИсходящее + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий + | ПО ПредметыПапкиВзаимодействий.Взаимодействие = ЭлектронноеПисьмоИсходящее.Ссылка + |ГДЕ + | &УсловиеПоПапке"); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеПоПапке", + ?(ПараметрыВыгрузки.ВключаяПодчиненные, + "ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма В ИЕРАРХИИ(&ПапкаЭлектронногоПисьма)", + "ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма = &ПапкаЭлектронногоПисьма")); Запрос.УстановитьПараметр("ВыбранныеПравила", ПараметрыВыгрузки.ТаблицаПравил); Запрос.УстановитьПараметр("ПапкаЭлектронногоПисьма", ПараметрыВыгрузки.ДляПисемВПапке); @@ -131,65 +131,84 @@ КонецЕсли; ТаблицаПисем = Результат[2].Выгрузить(); - МассивПисем = ТаблицаПисем.ВыгрузитьКолонку("Ссылка"); - МассивПапок = ТаблицаПисем.ВыгрузитьКолонку("Папка"); - МассивПапок = Взаимодействия.УдалитьПовторяющиесяЭлементыМассива(МассивПапок); + ОбрабатываемыеПисьма = ТаблицаПисем.ВыгрузитьКолонку("Ссылка"); + ОбрабатываемыеПапки = ТаблицаПисем.ВыгрузитьКолонку("Папка"); + ОбрабатываемыеПапки = ОбщегоНазначенияКлиентСервер.СвернутьМассив(ОбрабатываемыеПапки); - Выборка = Результат[1].Выбрать(); - Пока Выборка.Следующий() Цикл + ПапкиПисем = Новый ТаблицаЗначений; + ПапкиПисем.Колонки.Добавить("Папка"); + ПапкиПисем.Колонки.Добавить("Письмо"); + + ВыбранноеПравило = Результат[1].Выбрать(); + Пока ВыбранноеПравило.Следующий() Цикл - СхемаПравилаОбработки = ПолучитьМакет("СхемаПравилаОбработкиЭлектроннойПочты"); + Попытка + СхемаПравилаОбработки = ПолучитьМакет("СхемаПравилаОбработкиЭлектроннойПочты"); + + КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных(); + КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; + КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаПравилаОбработки)); + КомпоновщикНастроек.ЗагрузитьНастройки(ВыбранноеПравило.КомпоновщикНастроек.Получить()); + КомпоновщикНастроек.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.ПроверятьДоступность); + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(КомпоновщикНастроек.Настройки.Отбор, + "Ссылка", ОбрабатываемыеПисьма, ВидСравненияКомпоновкиДанных.ВСписке); + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(КомпоновщикНастроек.Настройки.Отбор, + "Ссылка.УчетнаяЗапись", ПараметрыВыгрузки.УчетнаяЗапись, ВидСравненияКомпоновкиДанных.Равно); + + МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаПравилаОбработки, + КомпоновщикНастроек.ПолучитьНастройки(),,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); + + ТекстЗапроса = МакетКомпоновкиДанных.НаборыДанных.ОсновнойНаборДанных.Запрос; + ЗапросПравило = Новый Запрос(ТекстЗапроса); + Для каждого Параметр Из МакетКомпоновкиДанных.ЗначенияПараметров Цикл + ЗапросПравило.Параметры.Вставить(Параметр.Имя, Параметр.Значение); + КонецЦикла; + + // @skip-check query-in-loop - Порционная обработка писем по учетным записям. + РезультатПисьма = ЗапросПравило.Выполнить(); - КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных(); - КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; - КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаПравилаОбработки)); - КомпоновщикНастроек.ЗагрузитьНастройки(Выборка.КомпоновщикНастроек.Получить()); - КомпоновщикНастроек.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.ПроверятьДоступность); - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(КомпоновщикНастроек.Настройки.Отбор, - "Ссылка",МассивПисем,ВидСравненияКомпоновкиДанных.ВСписке); - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(КомпоновщикНастроек.Настройки.Отбор, - "Ссылка.УчетнаяЗапись",ПараметрыВыгрузки.УчетнаяЗапись,ВидСравненияКомпоновкиДанных.Равно); + Исключение + + ШаблонСообщенияОбОшибке = НСтр("ru = 'Не удалось применить правило обработки писем ""%1"" для учетной записи ""%2"" по причине: + |%3 + |Требуется исправить правило.'", ОбщегоНазначения.КодОсновногоЯзыка()); - МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаПравилаОбработки, - КомпоновщикНастроек.ПолучитьНастройки(),,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонСообщенияОбОшибке, + ВыбранноеПравило.НаименованиеПравила, + ВыбранноеПравило.УчетнаяЗапись, + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Ошибка, , ВыбранноеПравило.Ссылка, ТекстСообщенияОбОшибке); + Продолжить; + + КонецПопытки; - ТекстЗапроса = МакетКомпоновкиДанных.НаборыДанных.ОсновнойНаборДанных.Запрос; - ЗапросПравило = Новый Запрос(ТекстЗапроса); - Для каждого Параметр Из МакетКомпоновкиДанных.ЗначенияПараметров Цикл - ЗапросПравило.Параметры.Вставить(Параметр.Имя, Параметр.Значение); - КонецЦикла; - - РезультатПисьма = ЗапросПравило.Выполнить(); Если Не РезультатПисьма.Пустой() Тогда - ВыборкаПисьма = РезультатПисьма.Выбрать(); - Пока ВыборкаПисьма.Следующий() Цикл + ВыбранноеПисьмо = РезультатПисьма.Выбрать(); + Пока ВыбранноеПисьмо.Следующий() Цикл - НоваяСтрокаТаблицы = ТаблицаСоответствий.Добавить(); - НоваяСтрокаТаблицы.Папка = Выборка.ПомещатьВПапку; - НоваяСтрокаТаблицы.Письмо = ВыборкаПисьма.Ссылка; + НоваяСтрокаТаблицы = ПапкиПисем.Добавить(); + НоваяСтрокаТаблицы.Папка = ВыбранноеПравило.ПомещатьВПапку; + НоваяСтрокаТаблицы.Письмо = ВыбранноеПисьмо.Ссылка; - ИндексЭлементаМассиваКУдалению = МассивПисем.Найти(ВыборкаПисьма.Ссылка); - Если ИндексЭлементаМассиваКУдалению <> Неопределено Тогда - МассивПисем.Удалить(ИндексЭлементаМассиваКУдалению); + Индекс = ОбрабатываемыеПисьма.Найти(ВыбранноеПисьмо.Ссылка); + Если Индекс <> Неопределено Тогда + ОбрабатываемыеПисьма.Удалить(Индекс); КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; - Для каждого СтрокаТаблицы Из ТаблицаСоответствий Цикл - Взаимодействия.УстановитьПапкуЭлектронногоПисьма(СтрокаТаблицы.Письмо, СтрокаТаблицы.Папка, Ложь); - Если ЗначениеЗаполнено(СтрокаТаблицы.Папка) И МассивПапок.Найти(СтрокаТаблицы.Папка) = Неопределено Тогда - МассивПапок.Добавить(СтрокаТаблицы.Папка); - КонецЕсли; - КонецЦикла; - - Взаимодействия.РассчитатьРассмотреноПоПапкам(Взаимодействия.ТаблицаДанныхДляРасчетаРассмотрено(МассивПапок, "Папка")); + Взаимодействия.УстановитьПапкиЭлектронныхПисем(ПапкиПисем, Ложь); + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ОбрабатываемыеПапки, ПапкиПисем.ВыгрузитьКолонку("Папка"), Истина); + Взаимодействия.РассчитатьРассмотреноПоПапкам(Взаимодействия.ТаблицаДанныхДляРасчетаРассмотрено(ОбрабатываемыеПапки, "Папка")); - Если ТаблицаСоответствий.Количество() > 0 Тогда + Если ПапкиПисем.Количество() > 0 Тогда ТекстСообщения = НСтр("ru = 'Перенос писем в папки выполнен.'"); Иначе - ТекстСообщения = НСтр("ru = 'Ни одно письмо не было перенесено'"); + ТекстСообщения = НСтр("ru = 'Ни одно письмо не было перенесено.'"); КонецЕсли; ПоместитьВоВременноеХранилище(ТекстСообщения, АдресХранилища); diff --git a/SSL/src/Catalogs/ПравилаПроверкиУчета/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ПравилаПроверкиУчета/Forms/ФормаСписка/Form.form index 8cec7493c..5c98ba7c8 100644 --- a/SSL/src/Catalogs/ПравилаПроверкиУчета/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ПравилаПроверкиУчета/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto true true Auto @@ -594,21 +593,87 @@ ГруппаПользовательскихНастроек - - ПредставлениеОбщегоРасписания - 114 - - <key>ru</key> - <value><Представление общего расписания></value> - + + ГруппаРасписание + 156 + + ПредставлениеОбщегоРасписания + 114 + + <key>ru</key> + <value><Представление общего расписания></value> + + true + true + + true + + Button + + ПредставлениеОбщегоРасписанияРасширеннаяПодсказка + 116 + Label + true + true + + Left + + + + ПредставлениеОбщегоРасписанияКонтекстноеМеню + 115 + true + + Label + true + + + URLProcessing + ПредставлениеОбщегоРасписанияОбработкаНавигационнойСсылки + + Left + Center + + + + ИнформацияПоПоследнейПроверке + 158 + true + + true + + + ИнформацияПоПоследнейПроверкеРасширеннаяПодсказка + 160 + Label + true + true + + Left + + + + ИнформацияПоПоследнейПроверкеКонтекстноеМеню + 159 + true + + true + true + + + StdPicture.Information + + AsFileRef + + true true true - ПредставлениеОбщегоРасписанияРасширеннаяПодсказка - 116 + ГруппаРасписаниеРасширеннаяПодсказка + 157 Label true true @@ -616,20 +681,14 @@ Left - - ПредставлениеОбщегоРасписанияКонтекстноеМеню - 115 - true - - Label - true - - - URLProcessing - ПредставлениеОбщегоРасписанияОбработкаНавигационнойСсылки - - Left - Center + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto diff --git a/SSL/src/Catalogs/ПравилаПроверкиУчета/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ПравилаПроверкиУчета/Forms/ФормаСписка/Module.bsl index c37d4b192..9545ff869 100644 --- a/SSL/src/Catalogs/ПравилаПроверкиУчета/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ПравилаПроверкиУчета/Forms/ФормаСписка/Module.bsl @@ -24,7 +24,23 @@ ОбщееРегламентноеЗадание = РегламентныеЗаданияСервер.Задание(Метаданные.РегламентныеЗадания.ПроверкаВеденияУчета); Если ОбщееРегламентноеЗадание <> Неопределено Тогда Если Не ОбщегоНазначения.РазделениеВключено() Тогда - ОбщееРасписаниеПредставление = Строка(ОбщееРегламентноеЗадание.Расписание) + ОбщееРасписаниеПредставление = Строка(ОбщееРегламентноеЗадание.Расписание); + СвойстваПоследнегоЗадания = РегламентныеЗаданияСервер.СвойстваПоследнегоЗадания(ОбщееРегламентноеЗадание); + Если СвойстваПоследнегоЗадания <> Неопределено Тогда + ДатаПоследнейПроверки = СвойстваПоследнегоЗадания.Конец; + Иначе + ИнформацияОПоследнейПроверке = КонтрольВеденияУчетаСлужебный.ИнформацияОПоследнейПроверкеВеденияУчета(); + ДатаПоследнейПроверки = ИнформацияОПоследнейПроверке.ДатаПоследнейПроверки; + КонецЕсли; + + Если ДатаПоследнейПроверки = Неопределено Тогда + ТекстПодсказки = НСтр("ru = 'Нет информации о последнем запуске проверки.'"); + Иначе + ТекстПодсказки = НСтр("ru = 'Последняя проверка закончилась %1 в %2'"); + ТекстПодсказки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПодсказки, + Формат(ДатаПоследнейПроверки, "ДЛФ=D"), Формат(ДатаПоследнейПроверки, "ДЛФ=T")); + КонецЕсли; + Элементы.ПредставлениеОбщегоРасписания.Подсказка = ТекстПодсказки; Иначе Если ЭтоАдминистраторСистемы Тогда ОбщееРасписаниеПредставление = Строка(ОбщееРегламентноеЗадание.Шаблон.Расписание.Получить()); diff --git a/SSL/src/Catalogs/ПравилаПроверкиУчета/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПравилаПроверкиУчета/Forms/ФормаЭлемента/Form.form index c592247e7..a648abe29 100644 --- a/SSL/src/Catalogs/ПравилаПроверкиУчета/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ПравилаПроверкиУчета/Forms/ФормаЭлемента/Form.form @@ -108,7 +108,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -281,7 +280,6 @@ UsualGroup Vertical - Auto true true Auto @@ -488,7 +486,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -518,7 +515,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -548,7 +544,6 @@ UsualGroup Vertical - Auto true Button WeakSeparation @@ -694,7 +689,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true diff --git a/SSL/src/Catalogs/ПравилаПроверкиУчета/ManagerModule.bsl b/SSL/src/Catalogs/ПравилаПроверкиУчета/ManagerModule.bsl index aacb1e955..0ac87eee2 100644 --- a/SSL/src/Catalogs/ПравилаПроверкиУчета/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПравилаПроверкиУчета/ManagerModule.bsl @@ -79,7 +79,7 @@ Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать правило проверки %1 по причине: |%2'"), - ОтключаемаяПроверкаСсылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОтключаемаяПроверкаСсылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации( ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), diff --git a/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ПредопределенныеВариантыОтчетов.mdo b/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ПредопределенныеВариантыОтчетов.mdo index 83e2f16c0..ef048fde4 100644 --- a/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ПредопределенныеВариантыОтчетов.mdo +++ b/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ПредопределенныеВариантыОтчетов.mdo @@ -514,6 +514,21 @@ Use + + ПоказыватьВПодменюВариантов + + ru + Показывать в подменю вариантов + + + Boolean + + + + + Use + Use + diff --git a/SSL/src/Catalogs/ПредопределенныеВариантыОтчетовРасширений/ПредопределенныеВариантыОтчетовРасширений.mdo b/SSL/src/Catalogs/ПредопределенныеВариантыОтчетовРасширений/ПредопределенныеВариантыОтчетовРасширений.mdo index 91571f58e..6881edf18 100644 --- a/SSL/src/Catalogs/ПредопределенныеВариантыОтчетовРасширений/ПредопределенныеВариантыОтчетовРасширений.mdo +++ b/SSL/src/Catalogs/ПредопределенныеВариантыОтчетовРасширений/ПредопределенныеВариантыОтчетовРасширений.mdo @@ -514,6 +514,21 @@ Use Use + + ПоказыватьВПодменюВариантов + + ru + Показывать в подменю вариантов + + + Boolean + + + + + Use + Use + diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ВстроенныйКриптопровайдер/Form.form b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ВстроенныйКриптопровайдер/Form.form index fce18e30e..831bcc2db 100644 --- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ВстроенныйКриптопровайдер/Form.form +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ВстроенныйКриптопровайдер/Form.form @@ -100,7 +100,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Form.form b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Form.form index 0c711e8c9..d58fa0e5d 100644 --- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Form.form +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Form.form @@ -281,51 +281,14 @@ Инструкция 54 - - ТипичныеПроблемы - 56 - - <key>ru</key> - <value>При возникновении затруднений ознакомьтесь со списком <link ТипичныеПроблемы>типичных проблем при работе с программой электронной подписи и их решений</>.</value> - - true - true - - true - - - ТипичныеПроблемыРасширеннаяПодсказка - 58 - Label - true - true - - Left - - - - ТипичныеПроблемыКонтекстноеМеню - 57 - true - - true - Label - true - true - - - URLProcessing - ТипичныеПроблемыОбработкаНавигационнойСсылки - - Left - - ИнформацияДляПоддержки - 59 + 69 <key>ru</key> - <value>В иных случаях обратитесь в службу поддержки фирмы "1С", предоставив <link Ссылка>техническую информацию о возникшей проблеме</>.</value> + <value>При возникновении затруднений ознакомьтесь со списком <link %1>типичных проблем при работе с программой электронной подписи и их решений</>. + +В иных случаях обратитесь в службу поддержки фирмы "1С", предоставив <link %2>техническую информацию о возникшей проблеме</>.</value> true true @@ -334,7 +297,7 @@ ИнформацияДляПоддержкиРасширеннаяПодсказка - 61 + 71 Label true true @@ -344,7 +307,7 @@ ИнформацияДляПоддержкиКонтекстноеМеню - 60 + 70 true true @@ -521,7 +484,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl index d498cff5a..58768c622 100644 --- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl @@ -11,6 +11,8 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Элементы.ИнформацияДляПоддержки.Заголовок = ЭлектроннаяПодписьСлужебный.ЗаголовокИнформацииДляПоддержки(); + ЭлектроннаяПодписьСлужебный.УстановитьЗаголовокОшибки(ЭтотОбъект, Параметры.ЗаголовокФормы); @@ -91,28 +93,26 @@ #Область ОбработчикиСобытийЭлементовШапкиФормы -&НаКлиенте -Процедура ТипичныеПроблемыОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - ЭлектроннаяПодписьКлиент.ОткрытьИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами(); - -КонецПроцедуры - &НаКлиенте Процедура ИнформацияДляПоддержкиОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - ТекстОшибок = ""; - ОписаниеФайлов = Новый Массив; - Если ЗначениеЗаполнено(ДополнительныеДанные) Тогда - ЭлектроннаяПодписьСлужебныйВызовСервера.ДобавитьОписаниеДополнительныхДанных( - ДополнительныеДанные, ОписаниеФайлов, ТекстОшибок); - КонецЕсли; + Если НавигационнаяСсылка = "ТипичныеПроблемы" Тогда + ЭлектроннаяПодписьКлиент.ОткрытьИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами(); + Иначе - ТекстОшибок = ТекстОшибок + ОписаниеОшибки; - ЭлектроннаяПодписьСлужебныйКлиент.СформироватьТехническуюИнформацию(ТекстОшибок, , ОписаниеФайлов); + ТекстОшибок = ""; + ОписаниеФайлов = Новый Массив; + Если ЗначениеЗаполнено(ДополнительныеДанные) Тогда + ЭлектроннаяПодписьСлужебныйВызовСервера.ДобавитьОписаниеДополнительныхДанных( + ДополнительныеДанные, ОписаниеФайлов, ТекстОшибок); + КонецЕсли; + + ТекстОшибок = ТекстОшибок + ОписаниеОшибки; + ЭлектроннаяПодписьСлужебныйКлиент.СформироватьТехническуюИнформацию(ТекстОшибок, , ОписаниеФайлов); + + КонецЕсли; КонецПроцедуры @@ -132,6 +132,10 @@ ПараметрыОшибки.Вставить("ЗаголовокПредупреждения", Заголовок); ПараметрыОшибки.Вставить(?(ТекущиеДанные.ОшибкаНаСервере, "ТекстОшибкиСервер", "ТекстОшибкиКлиент"), ТекущиеДанные.ОписаниеСЗаголовком); + + Если ЗначениеЗаполнено(ДополнительныеДанные) Тогда + ПараметрыОшибки.Вставить("ДополнительныеДанные", ДополнительныеДанные); + КонецЕсли; ОткрытьФорму("ОбщаяФорма.РасширенноеПредставлениеОшибки", ПараметрыОшибки, ЭтотОбъект); diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ПрограммаОпределеннаяАвтоматически/Form.form b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ПрограммаОпределеннаяАвтоматически/Form.form new file mode 100644 index 000000000..fab08d07f --- /dev/null +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ПрограммаОпределеннаяАвтоматически/Form.form @@ -0,0 +1,620 @@ + + + + ИмяПрограммы + 4 + true + true + + true + + + ИмяПрограммы + + + ИмяПрограммыРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + ИмяПрограммыКонтекстноеМеню + 5 + true + + InputField + true + Enter + true + Left + true + + 50 + true + true + true + true + true + true + Normal + + + + ТипПрограммы + 7 + true + true + + true + + + ТипПрограммы + + + ТипПрограммыРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ТипПрограммыКонтекстноеМеню + 8 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + АлгоритмПодписи + 10 + true + true + + true + + + АлгоритмПодписи + + + АлгоритмПодписиРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + АлгоритмПодписиКонтекстноеМеню + 11 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + АлгоритмХеширования + 13 + true + true + + true + + + АлгоритмХеширования + + + АлгоритмХешированияРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + АлгоритмХешированияКонтекстноеМеню + 14 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + АлгоритмШифрования + 16 + true + true + + true + + + АлгоритмШифрования + + + АлгоритмШифрованияРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + АлгоритмШифрованияКонтекстноеМеню + 17 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПутьКПрограмме + 21 + true + true + + true + + + ПутьКПрограмме + + + ПутьКПрограммеРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + ПутьКПрограммеКонтекстноеМеню + 22 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПутьКПрограммеНаСервере + 24 + true + true + + true + + + ПутьКПрограммеНаСервере + + + ПутьКПрограммеНаСервереРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ПутьКПрограммеНаСервереКонтекстноеМеню + 25 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + + ФормаЗакрыть + 19 + true + true + + true + + + ФормаЗакрытьРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + Form.StandardCommand.Close + Auto + true + true + true + UserCmds + Auto + + + ФормаИзменить + 27 + true + true + + true + + + ФормаИзменитьРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.Command.Изменить + Normal + Auto + true + true + UserCmds + Auto + + + ФормаЗапретить + 29 + true + true + + true + + + ФормаЗапретитьРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + Form.Command.Запретить + Normal + Auto + true + true + UserCmds + Auto + + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + auto + true + + Наименование + 1 + + String + + + + true + + + true + + + + ИмяПрограммы + + <key>ru</key> + <value>Имя программы</value> + + 2 + + String + + + + true + + + true + + + + ТипПрограммы + + <key>ru</key> + <value>Тип программы</value> + + 3 + + Number + + 10 + + + + true + + + true + + + + АлгоритмПодписи + + <key>ru</key> + <value>Алгоритм подписи</value> + + 4 + + String + + + + true + + + true + + + + АлгоритмШифрования + + <key>ru</key> + <value>Алгоритм шифрования</value> + + 5 + + String + + + + true + + + true + + + + АлгоритмХеширования + + <key>ru</key> + <value>Алгоритм хеширования</value> + + 6 + + String + + + + true + + + true + + + + ПутьКПрограмме + + <key>ru</key> + <value>Путь к программе</value> + + 7 + + String + + + + true + + + true + + + + ПутьКПрограммеНаСервере + + <key>ru</key> + <value>Путь к программе на сервере</value> + + 8 + + String + + + + true + + + true + + + + ЭтоПодчиненныйУзелРИБ + 9 + + Boolean + + + true + + + true + + + + ЕстьПраваНаДобавлениеПрограммы + 10 + + Boolean + + + true + + + true + + + + Изменить + + <key>ru</key> + <value>Изменить...</value> + + 1 + + ru + Изменить настройки программы, сохранив ее в справочнике. Настройки будут изменены для всех пользователей. + + + true + + + StdPicture.Change + + + + Изменить + + + TextPicture + Auto + Auto + + + Запретить + + <key>ru</key> + <value>Запретить...</value> + + 2 + + true + + + StdPicture.AppearanceCrossIcon + + + + Запретить + + + TextPicture + Auto + Auto + + + Программа + + true + + + + + + diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ПрограммаОпределеннаяАвтоматически/Module.bsl b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ПрограммаОпределеннаяАвтоматически/Module.bsl new file mode 100644 index 000000000..eab0b2e01 --- /dev/null +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ПрограммаОпределеннаяАвтоматически/Module.bsl @@ -0,0 +1,78 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЭтоПодчиненныйУзелРИБ = ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ(); + ЕстьПраваНаДобавлениеПрограммы = ПравоДоступа("Добавление", Метаданные.Справочники.ПрограммыЭлектроннойПодписиИШифрования); + + Если ЗначениеЗаполнено(Параметры.Программа) Тогда + ЗаполнитьЗначенияСвойств(ЭтотОбъект, Параметры.Программа); + + Заголовок = Параметры.Программа.Представление; + + ПутьКПрограмме = Параметры.Программа.ПутьКПрограммеАвто; + Элементы.ПутьКПрограмме.Видимость = ЗначениеЗаполнено(ПутьКПрограмме); + + ПутьКПрограммеНаСервере = Параметры.Программа.ПутьКПрограммеАвто; + Элементы.ПутьКПрограммеНаСервере.Видимость = ЗначениеЗаполнено(ПутьКПрограммеНаСервере); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Изменить(Команда) + + ДобавитьВСправочник(ПредопределенноеЗначение( + "Перечисление.РежимыИспользованияПрограммыЭлектроннойПодписи.Настроена")); + +КонецПроцедуры + +&НаКлиенте +Процедура Запретить(Команда) + + ДобавитьВСправочник(ПредопределенноеЗначение( + "Перечисление.РежимыИспользованияПрограммыЭлектроннойПодписи.НеИспользуется")); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ДобавитьВСправочник(РежимИспользования) + + Если Не ЕстьПраваНаДобавлениеПрограммы Тогда + + ПоказатьПредупреждение( , НСтр("ru = 'Для изменения настроек программы обратитесь к администратору.'")); + + ИначеЕсли ЭтоПодчиненныйУзелРИБ Тогда + + ПоказатьПредупреждение( , НСтр("ru = 'Для изменения настроек программы необходимо добавить ее в справочник. + |Выполните добавление в главном узле информационной базы.'")); + + Иначе + + ПараметрыФормы = Новый Структура("Программа, РежимИспользования", Параметры.Программа, РежимИспользования); + ОткрытьФорму("Справочник.ПрограммыЭлектроннойПодписиИШифрования.ФормаОбъекта", ПараметрыФормы,,,,,, + РежимОткрытияОкнаФормы.Независимый); + Закрыть(); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form index 09a3da493..301aec3ab 100644 --- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form @@ -311,6 +311,91 @@ Normal + + РежимИспользования + 78 + true + true + + true + + + Объект.РежимИспользования + + + OnChange + РежимИспользованияПриИзменении + + + РежимИспользованияРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + + РежимИспользованияКонтекстноеМеню + 79 + true + + InputField + Enter + true + Left + true + + + ChoiceProcessing + РежимИспользованияОбработкаВыбора + + true + true + true + true + true + true + Normal + + + + ДекорацияНадписьАвтоматическиеНастройки + 83 + + <key>ru</key> + <value>Автоматические настройки:</value> + + true + true + + true + + + ДекорацияНадписьАвтоматическиеНастройкиРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + + ДекорацияНадписьАвтоматическиеНастройкиКонтекстноеМеню + 84 + true + + Label + true + + Left + + Style.ToolTipBackColor + + + ФормаКоманднаяПанель -1 @@ -473,6 +558,16 @@ + + Программа + + + + РежимИспользования + + EnumRef.РежимыИспользованияПрограммыЭлектроннойПодписи + + diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl index e0e1af887..b1382b900 100644 --- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl @@ -34,14 +34,30 @@ // Заполнение нового объекта по поставляемой настройке. Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда - Отбор = Новый Структура("Идентификатор", Параметры.ИдентификаторПоставляемойНастройки); - Строки = ПоставляемыеНастройки.НайтиСтроки(Отбор); - Если Строки.Количество() > 0 Тогда - ЗаполнитьЗначенияСвойств(Объект, Строки[0]); - Объект.Наименование = Строки[0].Представление; + + Если ЗначениеЗаполнено(Параметры.ИдентификаторПоставляемойНастройки) Тогда + + Отбор = Новый Структура("Идентификатор", Параметры.ИдентификаторПоставляемойНастройки); + Строки = ПоставляемыеНастройки.НайтиСтроки(Отбор); + Если Строки.Количество() > 0 Тогда + ЗаполнитьЗначенияСвойств(Объект, Строки[0]); + Объект.Наименование = Строки[0].Представление; + Элементы.Наименование.ТолькоПросмотр = Истина; + Элементы.ИмяПрограммы.ТолькоПросмотр = Истина; + Элементы.ТипПрограммы.ТолькоПросмотр = Истина; + КонецЕсли; + + ИначеЕсли ЗначениеЗаполнено(Параметры.Программа) Тогда + + ПрограммаАвто = Параметры.Программа; // см. ЭлектроннаяПодписьСлужебныйКлиентСервер.РасширенноеОписаниеПрограммы + + ЗаполнитьЗначенияСвойств(Объект, ПрограммаАвто,,"Ссылка"); + Объект.Наименование = ПрограммаАвто.Представление; Элементы.Наименование.ТолькоПросмотр = Истина; Элементы.ИмяПрограммы.ТолькоПросмотр = Истина; Элементы.ТипПрограммы.ТолькоПросмотр = Истина; + Объект.РежимИспользования = Параметры.РежимИспользования; + КонецЕсли; КонецЕсли; @@ -50,18 +66,24 @@ Строки = ПоставляемыеНастройки.НайтиСтроки(Отбор); ПоставляемаяНастройка = ?(Строки.Количество() = 0, Неопределено, Строки[0]); ЗаполнитьСпискиВыбораАлгоритмов(ПоставляемаяНастройка); + УстановитьЗаголовокАвтоматическиеНастройки(ПоставляемаяНастройка); + УстановитьВидимостьИДоступность(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) - ЗаполнитьАлгоритмыВыбраннойПрограммы(); + ЗаполнитьАлгоритмыВыбраннойПрограммы(Истина); Если ЗначениеЗаполнено(Объект.Ссылка) Тогда Возврат; КонецЕсли; + Если ЗначениеЗаполнено(Объект.ИмяПрограммы) Тогда + Возврат; + КонецЕсли; + ПодключитьОбработчикОжидания("ОбработчикОжиданияНачатьВыборПрограммыПослеОткрытия", 0.1, Истина); КонецПроцедуры @@ -144,13 +166,44 @@ &НаКлиенте Процедура ИмяПрограммыПриИзменении(Элемент) - ЗаполнитьАлгоритмыВыбраннойПрограммы(); + ПодключитьОбработчикОжидания("ОбработчикОжиданияИмяИТипПриИзменении", 0.1, Истина); КонецПроцедуры &НаКлиенте Процедура ТипПрограммыПриИзменении(Элемент) + ПодключитьОбработчикОжидания("ОбработчикОжиданияИмяИТипПриИзменении", 0.1, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура РежимИспользованияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + Если ВыбранноеЗначение = ПредопределенноеЗначение( + "Перечисление.РежимыИспользованияПрограммыЭлектроннойПодписи.Автоматически") Тогда + + ПрограммыПоИменамСТипом = ЭлектроннаяПодписьКлиент.ОбщиеНастройки().ПрограммыПоИменамСТипом; + Ключ = ЭлектроннаяПодписьСлужебныйКлиентСервер.КлючПоискаПрограммыПоИмениСТипом(Объект.ИмяПрограммы, Объект.ТипПрограммы); + ПоставляемаяПрограмма = ПрограммыПоИменамСТипом.Получить(Ключ); + Если ПоставляемаяПрограмма = Неопределено Тогда + СтандартнаяОбработка = Ложь; + ПоказатьПредупреждение(, НСтр("ru = 'Программа с указанным именем и типом не может быть определена автоматически.'")); + Возврат; + КонецЕсли; + + ЗаполнитьЗначенияСвойств(Объект, ПоставляемаяПрограмма); + Объект.РежимИспользования = ВыбранноеЗначение; + РежимИспользованияПриИзменении(Неопределено); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура РежимИспользованияПриИзменении(Элемент) + + УстановитьВидимостьИДоступность(ЭтотОбъект); ЗаполнитьАлгоритмыВыбраннойПрограммы(); КонецПроцедуры @@ -182,17 +235,40 @@ Процедура ЗаполнитьНастройкиВыбраннойПрограммы(Представление) ПоставляемыеНастройки = Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПоставляемыеНастройкиПрограмм(); + Если ТипЗнч(Представление) = Тип("Структура") Тогда + Строки = ПоставляемыеНастройки.НайтиСтроки(Представление); + ПоставляемаяНастройка = ?(Строки.Количество() = 0, Неопределено, Строки[0]); + Иначе + ПоставляемаяНастройка = ПоставляемыеНастройки.Найти(Представление, "Представление"); + КонецЕсли; - ПоставляемаяНастройка = ПоставляемыеНастройки.Найти(Представление, "Представление"); Если ПоставляемаяНастройка <> Неопределено Тогда ЗаполнитьЗначенияСвойств(Объект, ПоставляемаяНастройка); Объект.Наименование = ПоставляемаяНастройка.Представление; КонецЕсли; + УстановитьЗаголовокАвтоматическиеНастройки(ПоставляемаяНастройка); ЗаполнитьСпискиВыбораАлгоритмов(ПоставляемаяНастройка); КонецПроцедуры +&НаСервере +Процедура УстановитьЗаголовокАвтоматическиеНастройки(ПоставляемаяНастройка) + + Если ПоставляемаяНастройка = Неопределено Тогда + Элементы.ДекорацияНадписьАвтоматическиеНастройки.Заголовок = НСтр("ru = 'Эта программа не может быть определена автоматически'"); + Возврат; + КонецЕсли; + + Элементы.ДекорацияНадписьАвтоматическиеНастройки.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'При работе с этой программой используются алгоритмы: + |Алгоритм подписи: %1 + |Алгоритм хеширования: %2 + |Алгоритм шифрования: %3'"), ПоставляемаяНастройка.АлгоритмПодписи, ПоставляемаяНастройка.АлгоритмХеширования, + ПоставляемаяНастройка.АлгоритмШифрования); + +КонецПроцедуры + &НаСервере Процедура ЗаполнитьСпискиВыбораАлгоритмов(ПоставляемаяНастройка) @@ -211,7 +287,12 @@ КонецПроцедуры &НаКлиенте -Процедура ЗаполнитьАлгоритмыВыбраннойПрограммы() +Процедура ЗаполнитьАлгоритмыВыбраннойПрограммы(ПриОткрытии = Ложь) + + Если Объект.РежимИспользования = ПредопределенноеЗначение( + "Перечисление.РежимыИспользованияПрограммыЭлектроннойПодписи.Автоматически") Тогда + Возврат; + КонецЕсли; НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения( "ЗаполнитьАлгоритмыВыбраннойПрограммыПослеПодключенияРасширенияРаботыСКриптографией", ЭтотОбъект)); @@ -352,6 +433,18 @@ КонецПроцедуры +&НаКлиенте +Процедура ОбработчикОжиданияИмяИТипПриИзменении() + + Если ЗначениеЗаполнено(Объект.ИмяПрограммы) И ЗначениеЗаполнено(Объект.ТипПрограммы) Тогда + ЗаполнитьНастройкиВыбраннойПрограммы(Новый Структура("ИмяПрограммы, ТипПрограммы", + Объект.ИмяПрограммы, Объект.ТипПрограммы)); + КонецЕсли; + + ЗаполнитьАлгоритмыВыбраннойПрограммы(); + +КонецПроцедуры + &НаСервере Функция ЕстьВОСКлиентаИлиВОССервера(Настройка) @@ -364,4 +457,24 @@ КонецФункции +&НаКлиентеНаСервереБезКонтекста +Процедура УстановитьВидимостьИДоступность(Форма) + + ДоступностьНастроек = Не ЭлектроннаяПодписьСлужебныйКлиентСервер.ИспользуютсяАвтоматическиеНастройки( + Форма.Объект.РежимИспользования); + + Форма.Элементы.АлгоритмПодписи.Видимость = ДоступностьНастроек; + Форма.Элементы.АлгоритмХеширования.Видимость = ДоступностьНастроек; + Форма.Элементы.АлгоритмШифрования.Видимость = ДоступностьНастроек; + Форма.Элементы.АлгоритмПодписи.Видимость = ДоступностьНастроек; + Форма.Элементы.ДекорацияНадписьАвтоматическиеНастройки.Видимость = Не ДоступностьНастроек; + + Если Не ДоступностьНастроек Тогда + Форма.Элементы.Наименование.ТолькоПросмотр = Истина; + Форма.Элементы.ИмяПрограммы.ТолькоПросмотр = Истина; + Форма.Элементы.ТипПрограммы.ТолькоПросмотр = Истина; + КонецЕсли; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl index 562e77301..6bd16dbf3 100644 --- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl @@ -127,6 +127,28 @@ Настройка.НетВLinux = Истина; Настройка.НетВMacOS = Истина; + // Microsoft Strong Cryptographic Provider + Настройка = Настройки.Добавить(); + Настройка.Представление = НСтр("ru = 'Microsoft Strong CSP'"); + Настройка.ИмяПрограммы = "Microsoft Strong Cryptographic Provider"; + Настройка.ТипПрограммы = 1; + Настройка.АлгоритмПодписи = "RSA_SIGN"; // Один вариант. + Настройка.АлгоритмХеширования = "MD5"; // Варианты: SHA-1, MD2, MD4, MD5. + Настройка.АлгоритмШифрования = "RC2"; // Варианты: RC2, RC4, DES, 3DES. + Настройка.Идентификатор = "MicrosoftStrong"; + + Настройка.АлгоритмыПодписи.Добавить("RSA_SIGN"); + Настройка.АлгоритмыХеширования.Добавить("SHA-1"); + Настройка.АлгоритмыХеширования.Добавить("MD2"); + Настройка.АлгоритмыХеширования.Добавить("MD4"); + Настройка.АлгоритмыХеширования.Добавить("MD5"); + Настройка.АлгоритмыШифрования.Добавить("RC2"); + Настройка.АлгоритмыШифрования.Добавить("RC4"); + Настройка.АлгоритмыШифрования.Добавить("DES"); + Настройка.АлгоритмыШифрования.Добавить("3DES"); + Настройка.НетВLinux = Истина; + Настройка.НетВMacOS = Истина; + КонецПроцедуры Функция ПоставляемыеПутиКМодулямПрограмм() Экспорт @@ -149,7 +171,6 @@ Если Программы = Неопределено Тогда Программы = Новый Соответствие; - ДобавитьПрограммыНачальногоЗаполнения(Программы); КонецЕсли; ОписаниеПрограмм = Новый Массив; @@ -172,18 +193,6 @@ КонецПроцедуры -Процедура ДобавитьПрограммыНачальногоЗаполнения(Программы) - - Если Метаданные.Обработки.Найти("ПрограммыЭлектроннойПодписиИШифрования") <> Неопределено Тогда - ОбработкаПрограммыЭлектроннойПодписиИШифрования = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( - "Обработка.ПрограммыЭлектроннойПодписиИШифрования"); - ОбработкаПрограммыЭлектроннойПодписиИШифрования.ДобавитьПрограммыНачальногоЗаполнения(Программы); - Иначе - Программы.Вставить("Microsoft Enhanced Cryptographic Provider v1.0", 1); - КонецЕсли; - -КонецПроцедуры - Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт Запрос = Новый Запрос; @@ -218,7 +227,7 @@ ПоставляемыеНастройки = ПоставляемыеНастройкиПрограмм(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл - ОбновитьПредставлениеПрограммыОтложенно(ВыборкаДетальныеЗаписи.Ссылка, + ОбновитьДанныеПрограммыОтложенно(ВыборкаДетальныеЗаписи.Ссылка, ОбъектовОбработано, ПроблемныхОбъектов, ПоставляемыеНастройки); КонецЦикла; @@ -248,7 +257,7 @@ // Параметры: // Программа - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования // -Процедура ОбновитьПредставлениеПрограммыОтложенно(Программа, ОбъектовОбработано, ПроблемныхОбъектов, ПоставляемыеНастройки) +Процедура ОбновитьДанныеПрограммыОтложенно(Программа, ОбъектовОбработано, ПроблемныхОбъектов, ПоставляемыеНастройки) Блокировка = Новый БлокировкаДанных; Блокировка.Добавить("Справочник.ПрограммыЭлектроннойПодписиИШифрования"); @@ -258,19 +267,31 @@ Блокировка.Заблокировать(); Свойства = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Программа, - "ИмяПрограммы, ТипПрограммы, Наименование, ЭтоВстроенныйКриптопровайдер"); + "ИмяПрограммы, ТипПрограммы, Наименование, ЭтоВстроенныйКриптопровайдер, ПометкаУдаления, РежимИспользования"); Отбор = Новый Структура("ИмяПрограммы, ТипПрограммы", Свойства.ИмяПрограммы, Свойства.ТипПрограммы); Строки = ПоставляемыеНастройки.НайтиСтроки(Отбор); Если Не Свойства.ЭтоВстроенныйКриптопровайдер И Строки.Количество() = 1 - И Строки[0].Представление <> Свойства.Наименование Тогда + И (Строки[0].Представление <> Свойства.Наименование Или Не ЗначениеЗаполнено(Свойства.РежимИспользования)) Тогда ПрограммаОбъект = Программа.ПолучитьОбъект(); ПрограммаОбъект.Наименование = Строки[0].Представление; - + Если Не ЗначениеЗаполнено(Свойства.РежимИспользования) Тогда + ПрограммаОбъект.РежимИспользования = ?(Свойства.ПометкаУдаления, + Перечисления.РежимыИспользованияПрограммыЭлектроннойПодписи.НеИспользуется, + Перечисления.РежимыИспользованияПрограммыЭлектроннойПодписи.Настроена) + КонецЕсли; ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрограммаОбъект); + ИначеЕсли Не ЗначениеЗаполнено(Свойства.РежимИспользования) Тогда + + ПрограммаОбъект = Программа.ПолучитьОбъект(); + ПрограммаОбъект.РежимИспользования = ?(Свойства.ПометкаУдаления, + Перечисления.РежимыИспользованияПрограммыЭлектроннойПодписи.НеИспользуется, + Перечисления.РежимыИспользованияПрограммыЭлектроннойПодписи.Настроена); + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрограммаОбъект); + КонецЕсли; ЗафиксироватьТранзакцию(); @@ -280,7 +301,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обновить программу ""%1"" по причине: - |%2'"), Строка(Программа), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + |%2'"), Строка(Программа), ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, , , ТекстСообщения); @@ -288,7 +309,7 @@ КонецПопытки; ОбъектовОбработано = ОбъектовОбработано + 1; - ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(Программа.Ссылка); + ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(Программа); КонецПроцедуры @@ -305,7 +326,6 @@ | ПрограммыЭлектроннойПодписиИШифрования.ЭтоВстроенныйКриптопровайдер"; Программы = Новый Соответствие; - ДобавитьПрограммыНачальногоЗаполнения(Программы); Блокировка = Новый БлокировкаДанных; Блокировка.Добавить("Справочник.ПрограммыЭлектроннойПодписиИШифрования"); @@ -330,7 +350,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось дозаполнить начальные настройки программ по причине: - |%1'"), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + |%1'"), ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение ТекстСообщения; КонецПопытки; diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ПрограммыЭлектроннойПодписиИШифрования.mdo b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ПрограммыЭлектроннойПодписиИШифрования.mdo index 8618183ec..05fff5ee3 100644 --- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ПрограммыЭлектроннойПодписиИШифрования.mdo +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ПрограммыЭлектроннойПодписиИШифрования.mdo @@ -252,6 +252,23 @@ Use Use + + РежимИспользования + + ru + Режим использования + + + EnumRef.РежимыИспользованияПрограммыЭлектроннойПодписи + + + + + Enum.РежимыИспользованияПрограммыЭлектроннойПодписи.EnumValue.Настроена + + Use + Use + ФормаЭлемента @@ -293,4 +310,13 @@ PersonalComputer MobileDevice + + ПрограммаОпределеннаяАвтоматически + + ru + Программа, определенная автоматически + + PersonalComputer + MobileDevice + diff --git a/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаСписка/Form.form index 5008ab9fd..f389f4357 100644 --- a/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаСписка/Form.form @@ -245,7 +245,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Form.form index c4bf971d1..80c2bb57a 100644 --- a/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Form.form @@ -160,7 +160,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -279,7 +278,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -384,7 +382,6 @@ UsualGroup HorizontalIfPossible - Auto true true auto @@ -734,7 +731,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl b/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl index e5cc7a4ed..a986c84fa 100644 --- a/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl @@ -897,7 +897,7 @@ НСтр("ru = 'Не удалось получить список производственных календарей из классификатора. |Список календарей получен из поставляемого макета. |%1'"), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, , , ТекстСообщения); КонецПопытки; diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Form.form index 99d22be07..317b5e198 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Form.form @@ -174,7 +174,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -206,7 +205,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Form.form index 9c2a52bfa..b18df72f2 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Form.form @@ -96,7 +96,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -271,7 +270,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -526,18 +524,75 @@ РолиКоманднаяПанель 199 - - РолиУстановитьФлажки - 212 + + РолиГруппаКомандФлажки + 412 + + РолиУстановитьФлажки + 212 + true + true + + true + + false + + РолиУстановитьФлажкиExtendedTooltip + 257 + Label + true + true + + Left + + + Form.Command.ВключитьРоли + Normal + Auto + true + true + UserCmds + Auto + + + РолиСнятьФлажки + 213 + true + true + + true + + false + + РолиСнятьФлажкиExtendedTooltip + 258 + Label + true + true + + Left + + + Form.Command.ИсключитьРоли + Normal + Auto + true + true + UserCmds + Auto + true true true - false + + <key>ru</key> + <value>Роли группа команд флажки</value> + - РолиУстановитьФлажкиExtendedTooltip - 257 + РолиГруппаКомандФлажкиРасширеннаяПодсказка + 413 Label true true @@ -545,40 +600,9 @@ Left - Form.Command.ВключитьРоли - Normal - Auto - true - true - UserCmds - Auto - - - РолиСнятьФлажки - 213 - true - true - - true - - false - - РолиСнятьФлажкиExtendedTooltip - 258 - Label - true - true - - Left - - - Form.Command.ИсключитьРоли - Normal - Auto - true - true - UserCmds - Auto + + Compact + РолиПоказатьТолькоВыбранныеРоли @@ -660,6 +684,38 @@ Item.Роли + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + РолиСтрокаПоиск + 414 + + РолиСтрокаПоискРасширеннаяПодсказка + 416 + Label + true + true + + Left + + + + РолиСтрокаПоискКонтекстноеМеню + 415 + true + + Роли + + true + + Left @@ -1536,7 +1592,6 @@ UsualGroup Vertical - Auto true true diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl index d386e6593..388cfe0e4 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl @@ -370,11 +370,10 @@ // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь // не делается проверка существования подсистемы. Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Справочники.ПрофилиГруппДоступа.ПолноеИмя()); + КоличествоНесовместимыхПрофилейГруппДоступа = НесовместимыеПрофилиГруппДоступа().Количество(); Для Каждого Раздел Из Разделы Цикл - КоличествоНесовместимыхПрофилейГруппДоступа = НесовместимыеПрофилиГруппДоступа().Количество(); - ИдентификаторПрофиля = "НеСовместимыСТекущейВерсией" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); Дело = ТекущиеДела.Добавить(); Дело.Идентификатор = ИдентификаторПрофиля; @@ -785,9 +784,7 @@ Для Каждого ОписаниеЗначенияДоступа Из СвойстваПрофиля.ЗначенияДоступа Цикл Отбор = Новый Структура; - Запрос = Новый Запрос(СтрЗаменить("ВЫБРАТЬ Значение(ЗначениеДоступа) КАК Значение", - "ЗначениеДоступа", ОписаниеЗначенияДоступа.ЗначениеДоступа)); - Отбор.Вставить("ЗначениеДоступа", Запрос.Выполнить().Выгрузить()[0].Значение); + Отбор.Вставить("ЗначениеДоступа", ПредопределенноеЗначение(ОписаниеЗначенияДоступа.ЗначениеДоступа)); Если Профиль.ЗначенияДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда Возврат Истина; КонецЕсли; @@ -1752,6 +1749,37 @@ КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Начальное заполнение + +// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов +// +// Параметры: +// Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки +// +Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт + + Настройки.ПриНачальномЗаполненииЭлемента = Ложь; + +КонецПроцедуры + +// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов +// +// Параметры: +// КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков +// Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы +// ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти +// +Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт + + Элемент = Элементы.Добавить(); + Элемент.ИмяПредопределенныхДанных = "Администратор"; + Элемент.Наименование = НСтр("ru = 'Администратор'", ОбщегоНазначения.КодОсновногоЯзыка()); + Элемент.ИдентификаторПоставляемыхДанных = + Новый УникальныйИдентификатор(ИдентификаторПрофиляАдминистратор()); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Вспомогательные процедуры и функции. @@ -2436,11 +2464,11 @@ Если СтрокаТекущейПапки <> Неопределено Тогда СтрокаТекущейПапки.Найден = Истина; КонецЕсли; - + // @skip-check query-in-loop - Порционная обработка данных в транзакции Если ОбновитьПрофильИлиПапкуПрофилей(СвойстваПрофиля, Удаленные, Истина) Тогда ЕстьИзменения = Истина; КонецЕсли; - + // @skip-check query-in-loop - Порционная обработка данных в транзакции ОбновитьПоставляемыеПапкиПрофилей(КлючИЗначение.Ключ, ТекущиеПапкиПрофилей, ПоставляемыеПрофили, Удаленные, ЕстьИзменения); КонецЦикла; @@ -2507,9 +2535,11 @@ Если СтрокаТекущегоПрофиля = Неопределено Тогда // Создание нового поставляемого профиля. + // @skip-check query-in-loop - Порционная обработка данных в транзакции Если ОбновитьПрофильИлиПапкуПрофилей(СвойстваПрофиля, Удаленные, Истина) Тогда ЕстьИзменения = Истина; КонецЕсли; + // @skip-check query-in-loop - Порционная обработка данных в транзакции Профиль = ПоставляемыйПрофильПоИдентификатору(СвойстваПрофиля.Идентификатор); Иначе @@ -2519,6 +2549,7 @@ Если Не СтрокаТекущегоПрофиля.ПоставляемыйПрофильИзменен Или ПараметрыОбновления.ОбновлятьИзмененныеПрофили Тогда // Обновление поставляемого профиля. + // @skip-check query-in-loop - Порционная обработка данных в транзакции ПрофильОбновлен = ОбновитьПрофильИлиПапкуПрофилей(СвойстваПрофиля, Удаленные, Истина); КонецЕсли; КонецЕсли; @@ -2696,9 +2727,7 @@ СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(ОписаниеЗначенияДоступа.ВидДоступа); СтрокаЗначения = ПрофильОбъект.ЗначенияДоступа.Добавить(); СтрокаЗначения.ВидДоступа = СвойстваВидаДоступа.Ссылка; - Запрос = Новый Запрос(СтрЗаменить("ВЫБРАТЬ Значение(ЗначениеДоступа) КАК Значение", - "ЗначениеДоступа", ОписаниеЗначенияДоступа.ЗначениеДоступа)); - СтрокаЗначения.ЗначениеДоступа = Запрос.Выполнить().Выгрузить()[0].Значение; + СтрокаЗначения.ЗначениеДоступа = ПредопределенноеЗначение(ОписаниеЗначенияДоступа.ЗначениеДоступа); КонецЦикла; ПрофильОбъект.Назначение.Очистить(); diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl index e88b1f343..33b22fb10 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl @@ -408,15 +408,13 @@ Если Выборка.Количество() > 1 Тогда КраткоеПредставлениеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при записи профиля ""%1"". - |Поставляемый профиль уже существует:'"), + НСтр("ru = 'Поставляемый профиль ""%1"" уже существует:'"), Наименование); ПодробноеПредставлениеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при записи профиля ""%1"". - |Идентификатор поставляемых данных ""%2"" уже используется в профиле:'"), - Наименование, - Строка(ИдентификаторПоставляемыхДанных)); + НСтр("ru = 'Идентификатор поставляемых данных ""%1"" уже используется в профиле ""%2"":'"), + Строка(ИдентификаторПоставляемыхДанных), + Наименование); Пока Выборка.Следующий() Цикл Если Выборка.Ссылка <> Ссылка Тогда diff --git a/SSL/src/Catalogs/ПрофилиКлючевыхОпераций/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ПрофилиКлючевыхОпераций/Forms/ФормаВыбора/Form.form index 6468a8390..eaf566ba7 100644 --- a/SSL/src/Catalogs/ПрофилиКлючевыхОпераций/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ПрофилиКлючевыхОпераций/Forms/ФормаВыбора/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Catalogs/ПрофилиКлючевыхОпераций/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ПрофилиКлючевыхОпераций/Forms/ФормаСписка/Form.form index d941e8a33..15c036af1 100644 --- a/SSL/src/Catalogs/ПрофилиКлючевыхОпераций/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ПрофилиКлючевыхОпераций/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/SMSРассылкаПаролей/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/SMSРассылкаПаролей/Form.form new file mode 100644 index 000000000..d9a705f02 --- /dev/null +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/SMSРассылкаПаролей/Form.form @@ -0,0 +1,2162 @@ + + + + Страницы + 66 + + СтраницаОтправить + 68 + + ДекорацияПодсказка + 35 + + <key>ru</key> + <value>Нажмите на кнопку <b>Отправить</> для отправки SMS с паролями архивов получателям рассылки отчетов.</value> + + true + true + + true + + + ru + гг + + Button + + ДекорацияПодсказкаРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + ДекорацияПодсказкаКонтекстноеМеню + 36 + true + + true + Label + 50 + true + true + true + + Left + + + + ШапкаСтраницаОтправить + 152 + + ВидТелефонаПолучателей + 26 + true + true + + true + + + ВидТелефонаПолучателей + + + OnChange + ВидТелефонаПолучателейПриИзменении + + + ВидТелефонаПолучателейРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ВидТелефонаПолучателейКонтекстноеМеню + 27 + true + + InputField + Enter + true + Left + true + + true + true + true + false + false + true + true + true + + Отбор.Тип + + + Enum.ТипыКонтактнойИнформации.EnumValue.Телефон + + + + Normal + + + + ГруппаКоманднаяПанель + 42 + + ВывестиСписок + 50 + true + true + + true + + + ВывестиСписокРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + Form.Item.Получатели.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + + + КопироватьВБуферОбмена + 52 + true + true + + true + + + КопироватьВБуферОбменаРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + Form.Item.Получатели.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + + + ВыделитьВсе + 54 + true + true + + true + + + ВыделитьВсеРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + Form.Item.Получатели.StandardCommand.SelectAll + Normal + Auto + true + true + UserCmds + Auto + + + ПоказатьМножественноеВыделение + 56 + true + true + + true + + + ПоказатьМножественноеВыделениеРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + Form.Item.Получатели.StandardCommand.ShowMultipleSelection + Normal + Auto + true + true + UserCmds + Auto + + + SearchEverywhere + 58 + true + true + + true + + + SearchEverywhereРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + Form.Item.Получатели.StandardCommand.SearchEverywhere + Normal + Auto + true + true + UserCmds + Auto + + + Найти + 60 + true + true + + true + + + НайтиРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + Form.Item.Получатели.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ОтменитьПоиск + 62 + true + true + + true + + + ОтменитьПоискРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + Form.Item.Получатели.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + Справка + 170 + true + true + + true + + + СправкаРасширеннаяПодсказка + 171 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + + ПоискПоТекущемуЗначению + 64 + true + true + + true + + + ПоискПоТекущемуЗначениюРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + Form.Item.Получатели.StandardCommand.FindByCurrentValue + Normal + Auto + true + true + UserCmds + Auto + + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоискаПолучатели + 156 + + СтрокаПоискаПолучателиРасширеннаяПодсказка + 158 + Label + true + true + + Left + + + + СтрокаПоискаПолучателиКонтекстноеМеню + 157 + true + + Получатели + + true + + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + ГруппаКоманднаяПанельРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + CommandBar + + Left + + + true + true + + true + + + <key>ru</key> + <value>Шапка </value> + + + ШапкаСтраницаОтправитьРасширеннаяПодсказка + 153 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + + Получатели + 1 + + <key>ru</key> + <value>Получатели</value> + + true + true + + true + + + Получатели + + None + + ПолучательНаименованиеИТелефон + 29 + + ПолучателиПолучатель + 14 + true + true + + true + + + Получатели.Получатель + + + ПолучателиПолучательРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ПолучателиПолучательКонтекстноеМеню + 15 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПолучателиНомерТелефона + 17 + true + true + + true + + + Получатели.Телефон + + + ПолучателиНомерТелефонаРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ПолучателиНомерТелефонаКонтекстноеМеню + 18 + true + + InputField + true + Enter + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Получатель наименование и телефон</value> + + + ПолучательНаименованиеИТелефонРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + ПолучателиКоманднаяПанель + 2 + Left + + + Selection + ПолучателиВыбор + + + BeforeAddRow + ПолучателиПередНачаломДобавления + + + BeforeDeleteRow + ПолучателиПередУдалением + + + ПолучателиСтрокаПоиска + 5 + + ПолучателиСтрокаПоискаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + ПолучателиСтрокаПоискаКонтекстноеМеню + 6 + true + + Получатели + + true + + + + ПолучателиСостояниеПросмотра + 11 + + ПолучателиСостояниеПросмотраРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ПолучателиСостояниеПросмотраКонтекстноеМеню + 12 + true + + ViewStatusAddition + Получатели + + true + + + + ПолучателиУправлениеПоиском + 8 + + ПолучателиУправлениеПоискомРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + ПолучателиУправлениеПоискомКонтекстноеМеню + 9 + true + + SearchControlAddition + Получатели + + true + + + + ПолучателиРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + + ПолучателиКонтекстноеМеню + 3 + true + + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + AsFileRef + true + + + + ГруппаКоманднаяПанельПодвал + 20 + + Отправить + 38 + true + true + + true + + + ОтправитьРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + Form.Command.Отправить + Auto + true + true + true + UserCmds + Auto + + + Отмена + 31 + + <key>ru</key> + <value>Отмена</value> + + true + true + + true + + + ОтменаРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + Right + + ГруппаКоманднаяПанельПодвалРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Отправить</value> + + + СтраницаОтправитьРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаСостояниеВыполнения + 70 + + ДекорацияЗначокДлительнойОперации + 74 + + <key>ru</key> + <value>Декорация значок длительной операции</value> + + true + true + + true + + + ДекорацияЗначокДлительнойОперацииРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + ДекорацияЗначокДлительнойОперацииКонтекстноеМеню + 75 + true + + true + true + Center + + + CommonPicture.ДлительнаяОперация48 + + AsFileRef + + + + ДекорацияПредставлениеДлительнойОперации + 77 + + <key>ru</key> + <value>Выполняется рассылка SMS с паролями архивов.</value> + + true + true + + true + + + ДекорацияПредставлениеДлительнойОперацииРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + ДекорацияПредставлениеДлительнойОперацииКонтекстноеМеню + 78 + true + + Label + true + true + Center + + Left + + + true + true + + true + + + <key>ru</key> + <value>Отображение состояния</value> + + + СтраницаСостояниеВыполненияРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + Page + + AlwaysHorizontal + auto + false + + + + СтраницаИнформация + 72 + + ШапкаСтраницаИнформация + 154 + + ГруппаОтборОтправлено + 109 + + ОтборОтправлено + 117 + + <key>ru</key> + <value>Показать</value> + + true + true + + true + + + ОтборОтправлено + + + OnChange + ОтборОтправленоПриИзменении + + + ОтборОтправленоРасширеннаяПодсказка + 119 + Label + true + true + + Left + + + + ОтборОтправленоКонтекстноеМеню + 118 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + true + + + ru + Все + + + Все + + + + + ru + Отправленные + + + Отправленные + + + + + ru + Неотправленные + + + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + ГруппаОтборОтправленоРасширеннаяПодсказка + 110 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + + ГруппаКоманднаяПанельРезультатРассылки + 120 + + ВывестиСписок1 + 136 + true + true + + true + + + ВывестиСписок1РасширеннаяПодсказка + 137 + Label + true + true + + Left + + + Form.Item.РезультатРассылкиSMS.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + + + КопироватьВБуферОбмена1 + 138 + true + true + + true + + + КопироватьВБуферОбмена1РасширеннаяПодсказка + 139 + Label + true + true + + Left + + + Form.Item.РезультатРассылкиSMS.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + + + ВыделитьВсе1 + 140 + true + true + + true + + + ВыделитьВсе1РасширеннаяПодсказка + 141 + Label + true + true + + Left + + + Form.Item.РезультатРассылкиSMS.StandardCommand.SelectAll + Normal + Auto + true + true + UserCmds + Auto + + + ПоказатьМножественноеВыделение1 + 142 + true + true + + true + + + ПоказатьМножественноеВыделение1РасширеннаяПодсказка + 143 + Label + true + true + + Left + + + Form.Item.РезультатРассылкиSMS.StandardCommand.ShowMultipleSelection + Normal + Auto + true + true + UserCmds + Auto + + + SearchEverywhere1 + 144 + true + true + + true + + + SearchEverywhere1РасширеннаяПодсказка + 145 + Label + true + true + + Left + + + Form.Item.РезультатРассылкиSMS.StandardCommand.SearchEverywhere + Normal + Auto + true + true + UserCmds + Auto + + + Найти1 + 146 + true + true + + true + + + Найти1РасширеннаяПодсказка + 147 + Label + true + true + + Left + + + Form.Item.РезультатРассылкиSMS.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ОтменитьПоиск1 + 148 + true + true + + true + + + ОтменитьПоиск1РасширеннаяПодсказка + 149 + Label + true + true + + Left + + + Form.Item.РезультатРассылкиSMS.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ПоискПоТекущемуЗначению1 + 150 + true + true + + true + + + ПоискПоТекущемуЗначению1РасширеннаяПодсказка + 151 + Label + true + true + + Left + + + Form.Item.РезультатРассылкиSMS.StandardCommand.FindByCurrentValue + Normal + Auto + true + true + UserCmds + Auto + + + Справка1 + 172 + true + true + + true + + + Справка1РасширеннаяПодсказка + 173 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоискаРезультатРассылкиSMS + 159 + + СтрокаПоискаРезультатРассылкиSMSРасширеннаяПодсказка + 161 + Label + true + true + + Left + + + + СтрокаПоискаРезультатРассылкиSMSКонтекстноеМеню + 160 + true + + РезультатРассылкиSMS + + true + + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + ГруппаКоманднаяПанельРезультатРассылкиРасширеннаяПодсказка + 121 + Label + true + true + + Left + + + CommandBar + + Left + + + true + true + + true + + + <key>ru</key> + <value>Шапка</value> + + + ШапкаСтраницаИнформацияРасширеннаяПодсказка + 155 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + + РезультатРассылкиSMS + 82 + + <key>ru</key> + <value>Результат рассылки SMS</value> + + true + true + + true + + + РезультатРассылкиSMS + + None + + РезультатРассылкиSMSПолучатель + 95 + true + true + + true + + + РезультатРассылкиSMS.Получатель + + + РезультатРассылкиSMSПолучательРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + + РезультатРассылкиSMSПолучательКонтекстноеМеню + 96 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + РезультатРассылкиSMSКомментарий + 98 + true + true + + true + + + РезультатРассылкиSMS.Комментарий + + + РезультатРассылкиSMSКомментарийРасширеннаяПодсказка + 100 + Label + true + true + + Left + + + + РезультатРассылкиSMSКомментарийКонтекстноеМеню + 99 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + ByContent + + + + РезультатРассылкиSMSКоманднаяПанель + 83 + Left + + + Selection + РезультатРассылкиSMSВыбор + + + РезультатРассылкиSMSСтрокаПоиска + 86 + + РезультатРассылкиSMSСтрокаПоискаРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + РезультатРассылкиSMSСтрокаПоискаКонтекстноеМеню + 87 + true + + РезультатРассылкиSMS + + true + + + + РезультатРассылкиSMSСостояниеПросмотра + 92 + + РезультатРассылкиSMSСостояниеПросмотраРасширеннаяПодсказка + 94 + Label + true + true + + Left + + + + РезультатРассылкиSMSСостояниеПросмотраКонтекстноеМеню + 93 + true + + ViewStatusAddition + РезультатРассылкиSMS + + true + + + + РезультатРассылкиSMSУправлениеПоиском + 89 + + РезультатРассылкиSMSУправлениеПоискомРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + + РезультатРассылкиSMSУправлениеПоискомКонтекстноеМеню + 90 + true + + SearchControlAddition + РезультатРассылкиSMS + + true + + + + РезультатРассылкиSMSРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + + РезультатРассылкиSMSКонтекстноеМеню + 84 + true + + true + true + true + true + true + true + MultiRow +
        true
        + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + AsFileRef + + РезультатРассылкиSMS.НеОтправлено + + + CommonPicture.Предупреждение + + true + +
        + + ГруппаПодвал + 104 + + ГруппаИтоги + 162 + + КоличествоОтправлено + 164 + true + true + + true + + + КоличествоОтправлено + + Left + + КоличествоОтправленоРасширеннаяПодсказка + 166 + Label + true + true + + Left + + + + КоличествоОтправленоКонтекстноеМеню + 165 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + КоличествоНеОтправлено + 167 + true + true + + true + + + КоличествоНеОтправлено + + Left + + КоличествоНеОтправленоРасширеннаяПодсказка + 169 + Label + true + true + + Left + + + + КоличествоНеОтправленоКонтекстноеМеню + 168 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Итоги</value> + + Right + Bottom + + ГруппаИтогиРасширеннаяПодсказка + 163 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Right + Bottom + Auto + true + true + + Style.ИтогиФонГруппы + + Auto + Auto + + + + Закрыть + 80 + true + true + + true + + + ЗакрытьРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + UsualButton + Form.StandardCommand.Close + Normal + Auto + true + true + Right + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + Right + + ГруппаПодвалРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Информация</value> + + + СтраницаИнформацияРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + Page + + Vertical + auto + false + +
        + true + true + + true + + + <key>ru</key> + <value>Страницы</value> + + + СтраницыРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + Pages + + Auto + +
        + + ФормаКоманднаяПанель + -1 + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + auto + true + + Получатели + + <key>ru</key> + <value>Получатели</value> + + 1 + + ValueTable + + + true + + + true + + + Получатель + + <key>ru</key> + <value>Получатель</value> + + 2 + + DefinedType.ПолучательРассылки + + + true + + + true + + + + Телефон + + <key>ru</key> + <value>Телефон</value> + + 3 + + String + + + + true + + + true + + + + ПарольАрхива + 8 + + String + + + + true + + + true + + + + + ВидТелефонаПолучателей + + <key>ru</key> + <value>Телефон</value> + + 4 + + CatalogRef.ВидыКонтактнойИнформации + + + true + + + true + + + + ТипПолучателейРассылки + 5 + + TypeDescription + + + true + + + true + + + + ИдентификаторОбъектаМетаданных + 6 + + + true + + + true + + + + НаименованиеРассылки + 7 + + String + + 100 + + + + true + + + true + + + + РезультатРассылкиSMS + + <key>ru</key> + <value>Результат рассылки SMS</value> + + 10 + + ValueTable + + + true + + + true + + + Получатель + + <key>ru</key> + <value>Получатель</value> + + 11 + + DefinedType.ПолучательРассылки + + + true + + + true + + + + Комментарий + + <key>ru</key> + <value>Комментарий</value> + + 12 + + String + + + + true + + + true + + + + НеОтправлено + 13 + + Boolean + + + true + + + true + + + + + ОтборОтправлено + + <key>ru</key> + <value>Отправлено</value> + + 14 + + String + + 15 + + + + true + + + true + + + + РезультатРассылкиSMSБезОтборов + 16 + + ValueTable + + + true + + + true + + + Получатель + 11 + + DefinedType.ПолучательРассылки + + + true + + + true + + + + Комментарий + 12 + + String + + + + true + + + true + + + + НеОтправлено + 13 + + Boolean + + + true + + + true + + + + + КоличествоОтправлено + + <key>ru</key> + <value>Отправлено</value> + + 2 + + Number + + 7 + + + + true + + + true + + + + КоличествоНеОтправлено + + <key>ru</key> + <value>Не отправлено</value> + + 3 + + Number + + 7 + + + + true + + + true + + + + Отправить + + <key>ru</key> + <value>Отправить</value> + + 1 + + true + + + + Отправить + + + Auto + Auto + + + НаименованиеРассылки + + String + + 100 + + + + + АдресПолучателей + + String + + + + + Ссылка + + CatalogRef.РассылкиОтчетов + + + + ТипПолучателейРассылки + + TypeDescription + + + + ИдентификаторОбъектаМетаданных + + + + + + +
        diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/SMSРассылкаПаролей/Help/ru.html b/SSL/src/Catalogs/РассылкиОтчетов/Forms/SMSРассылкаПаролей/Help/ru.html new file mode 100644 index 000000000..179215410 --- /dev/null +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/SMSРассылкаПаролей/Help/ru.html @@ -0,0 +1,14 @@ + +

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

        +

        Пример SMS: Ваш пароль 12345 для получения рассылки "Демо:Персонализированная по получателям(HTML, NOZIP)".

        +

        +

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

        +


        +

        См. также: 

        +

        +

        +

        +


        \ No newline at end of file diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/SMSРассылкаПаролей/Module.bsl b/SSL/src/Catalogs/РассылкиОтчетов/Forms/SMSРассылкаПаролей/Module.bsl new file mode 100644 index 000000000..95d01237c --- /dev/null +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/SMSРассылкаПаролей/Module.bsl @@ -0,0 +1,224 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ОтборОтправлено = "Все"; + ТипПолучателейРассылки = Параметры.ТипПолучателейРассылки; + НаименованиеРассылки = Параметры.НаименованиеРассылки; + ИдентификаторОбъектаМетаданных = Параметры.ИдентификаторОбъектаМетаданных; + + // АПК:1223-выкл Это пример текста SMS. + Элементы.ДекорацияПодсказка.Подсказка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Пример SMS: Ваш пароль: ******* для получения рассылки ""%1"".'"), НаименованиеРассылки); + // АПК:1223-вкл + + Если НЕ ЭтоАдресВременногоХранилища(Параметры.АдресПолучателей) Тогда + Возврат; + КонецЕсли; + + Получатели.Загрузить(ПолучитьИзВременногоХранилища(Параметры.АдресПолучателей)); + + УдалитьИзВременногоХранилища(Параметры.АдресПолучателей); + + УстановитьВидТелефонаПолучателей(); + ЗаполнитьТелефоны(); + + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиФормы.Верх; + Элементы.Переместить(Элементы.Отправить, КоманднаяПанель); + Элементы.ПолучательНаименованиеИТелефон.Группировка = ГруппировкаКолонок.Вертикальная; + Элементы.Закрыть.Видимость = Ложь; + Элементы.Переместить(Элементы.Закрыть, КоманднаяПанель); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ВидТелефонаПолучателейПриИзменении(Элемент) + ЗаполнитьТелефоны(); +КонецПроцедуры + +&НаКлиенте +Процедура ОтборОтправленоПриИзменении(Элемент) + УстановитьОтборыВРезультатеРассылкиSMS(); +КонецПроцедуры + + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыПолучатели + +&НаКлиенте +Процедура ПолучателиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Получатель = Элементы.Получатели.ТекущиеДанные.Получатель; + + Если ЗначениеЗаполнено(Получатель) Тогда + ПоказатьЗначение( , Получатель); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПолучателиПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, ЭтоГруппа, Параметр) + Отказ = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура ПолучателиПередУдалением(Элемент, Отказ) + Отказ = Истина; +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыРезультатРассылкиSMS + +&НаКлиенте +Процедура РезультатРассылкиSMSВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Получатель = Элементы.РезультатРассылкиSMS.ТекущиеДанные.Получатель; + + Если ЗначениеЗаполнено(Получатель) Тогда + ПоказатьЗначение( , Получатель); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Отправить(Команда) + Элементы.Отправить.Видимость = Ложь; + Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаСостояниеВыполнения; + + РезультатРассылкиSMS.Очистить(); + ПодготовленныеSMS = Новый Массив; + КоличествоНеОтправлено = 0; + Для Каждого СтрокаПолучатели Из Получатели Цикл + + Если Не ЗначениеЗаполнено(СтрокаПолучатели.ПарольАрхива) Или Не ЗначениеЗаполнено(СтрокаПолучатели.Телефон) Тогда + + СтрокаРезультат = РезультатРассылкиSMS.Добавить(); + СтрокаРезультат.Получатель = СтрокаПолучатели.Получатель; + СтрокаРезультат.НеОтправлено = Истина; + + Если Не ЗначениеЗаполнено(СтрокаПолучатели.ПарольАрхива) Тогда + СтрокаРезультат.Комментарий = НСтр("ru = 'Не установлен пароль.'"); + КонецЕсли; + + Если Не ЗначениеЗаполнено(СтрокаПолучатели.Телефон) Тогда + СтрокаРезультат.Комментарий = ?(ЗначениеЗаполнено(СтрокаРезультат.Комментарий), + СтрокаРезультат.Комментарий + Символы.ПС + НСтр("ru = 'Не указан номер телефона.'"), + НСтр("ru = 'Не указан номер телефона.'")); + КонецЕсли; + + СтрокаРезультатБезОтборов = РезультатРассылкиSMSБезОтборов.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаРезультатБезОтборов, СтрокаРезультат); + КоличествоНеОтправлено = КоличествоНеОтправлено + 1; + Продолжить; + КонецЕсли; + + ПодготовкаSMS = Новый Структура("Получатель, ТекстSMS, НомераТелефонов"); + ПодготовкаSMS.Получатель = СтрокаПолучатели.Получатель; + // АПК:1223-выкл Это текст SMS. + ПодготовкаSMS.ТекстSMS = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ваш пароль: %1 для получения рассылки ""%2"".'"), СтрокаПолучатели.ПарольАрхива, + НаименованиеРассылки); + // АПК:1223-вкл + ПодготовкаSMS.НомераТелефонов = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СтрокаПолучатели.Телефон); + ПодготовленныеSMS.Добавить(ПодготовкаSMS); + + КонецЦикла; + + ПараметрыЗапуска = Новый Структура("ПодготовленныеSMS, КоличествоНеОтправлено, Форма"); + ПараметрыЗапуска.ПодготовленныеSMS = ПодготовленныеSMS; + ПараметрыЗапуска.Форма = ЭтотОбъект; + ПараметрыЗапуска.КоличествоНеОтправлено = КоличествоНеОтправлено; + + РассылкаОтчетовКлиент.ВыполнитьРассылкуSMS(ПараметрыЗапуска); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура УстановитьОтборыВРезультатеРассылкиSMS() + + ТаблицаРезультатРассылкиSMSБезОтборов = РеквизитФормыВЗначение("РезультатРассылкиSMSБезОтборов"); + + Построитель = Новый ПостроительЗапроса; + Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаРезультатРассылкиSMSБезОтборов); + + Отбор = Построитель.Отбор; + + Отправлено = Отбор.Добавить("НеОтправлено"); + Отправлено.ВидСравнения = ВидСравнения.Равно; + Отправлено.Значение = ?(ОтборОтправлено = "Отправленные", Ложь, Истина); + Отправлено.Использование = ?(ОтборОтправлено = "Все", Ложь, Истина); + + Построитель.Выполнить(); + ТаблицаРезультат = Построитель.Результат.Выгрузить(); + + ЗначениеВРеквизитФормы(ТаблицаРезультат, "РезультатРассылкиSMS"); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьТелефоны() + + ПолучателиТаблица = РеквизитФормыВЗначение("Получатели"); + МассивПолучателей = ПолучателиТаблица.ВыгрузитьКолонку("Получатель"); + + ПолучателиСТелефонами = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(МассивПолучателей, + Перечисления.ТипыКонтактнойИнформации.Телефон, ВидТелефонаПолучателей); + + Если ПолучателиСТелефонами.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Для каждого ПолучательРассылки Из Получатели Цикл + ПараметрыОтбора = Новый Структура("Объект", ПолучательРассылки.Получатель); + НайденныеСтрокиСТелефонами = ПолучателиСТелефонами.НайтиСтроки(ПараметрыОтбора); + Если НайденныеСтрокиСТелефонами.Количество() > 0 Тогда + ПолучательРассылки.Телефон = НайденныеСтрокиСТелефонами[0].Представление; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьВидТелефонаПолучателей() + + ПолучателиМетаданные = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ИдентификаторОбъектаМетаданных, Ложь); + ИмяГруппыКИ = СтрЗаменить(ПолучателиМетаданные.ПолноеИмя(), ".", ""); + ГруппаКИ = УправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени(ИмяГруппыКИ); + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка ИЗ Справочник.ВидыКонтактнойИнформации ГДЕ Родитель = &Родитель И Тип = &Тип"; + Запрос.УстановитьПараметр("Родитель", ГруппаКИ); + Запрос.Параметры.Вставить("Тип", Перечисления.ТипыКонтактнойИнформации.Телефон); + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + ВидТелефонаПолучателей = Выборка.Ссылка; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Form.form index 1015c1ad2..457466471 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Form.form +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Form.form @@ -191,7 +191,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПаролиШифрование/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПаролиШифрование/Form.form new file mode 100644 index 000000000..65cd73118 --- /dev/null +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПаролиШифрование/Form.form @@ -0,0 +1,1944 @@ + + + + ГруппаОтборы + 62 + + ГруппаОтборыПароль + 99 + + ГруппаОтборПарольУстановлен + 64 + + ИспользоватьОтборПарольУстановлен + 74 + true + true + + true + + + ИспользоватьОтборПарольУстановлен + + None + + OnChange + ИспользоватьОтборПарольУстановленПриИзменении + + + ИспользоватьОтборПарольУстановленРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + ИспользоватьОтборПарольУстановленКонтекстноеМеню + 75 + true + + CheckBoxField + Enter + true + Left + true + + + + ОтборПарольУстановлен + 80 + true + true + + true + + + ОтборПарольУстановлен + + + OnChange + ОтборПарольУстановленПриИзменении + + + ОтборПарольУстановленРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + + ОтборПарольУстановленКонтекстноеМеню + 81 + 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 + true + Auto + Auto + + + + ГруппаОтборПарольИзменен + 83 + + ИспользоватьОтборПарольИзменен + 90 + true + true + + true + + + ИспользоватьОтборПарольИзменен + + None + + OnChange + ИспользоватьОтборПарольИзмененПриИзменении + + + ИспользоватьОтборПарольИзмененРасширеннаяПодсказка + 92 + Label + true + true + + Left + + + + ИспользоватьОтборПарольИзмененКонтекстноеМеню + 91 + true + + CheckBoxField + Enter + true + Left + true + + + + ОтборПарольИзменен + 87 + true + true + + true + + + ОтборПарольИзменен + + + OnChange + ОтборПарольИзмененПриИзменении + + + ОтборПарольИзмененРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + + ОтборПарольИзмененКонтекстноеМеню + 88 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Отбор пароль изменен</value> + + + ГруппаОтборПарольИзмененРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Отборы пароль</value> + + + ГруппаОтборыПарольРасширеннаяПодсказка + 100 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + Auto + Auto + + + + ГруппаОтборыСертификат + 101 + + ГруппаОтборСертификатУказан + 66 + + ИспользоватьОтборСертификатУказан + 71 + true + true + + true + + + ИспользоватьОтборСертификатУказан + + None + + OnChange + ИспользоватьОтборСертификатУказанПриИзменении + + + ИспользоватьОтборСертификатУказанРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + ИспользоватьОтборСертификатУказанКонтекстноеМеню + 72 + true + + CheckBoxField + Enter + true + Left + true + + + + ОтборСертификатУказан + 77 + true + true + + true + + + ОтборСертификатУказан + + + OnChange + ОтборСертификатУказанПриИзменении + + + ОтборСертификатУказанРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + ОтборСертификатУказанКонтекстноеМеню + 78 + 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 + true + Auto + Auto + + + + ГруппаОтборСертификатИзменен + 85 + + ИспользоватьОтборСертификатИзменен + 93 + true + true + + true + + + ИспользоватьОтборСертификатИзменен + + None + + OnChange + ИспользоватьОтборСертификатИзмененПриИзменении + + + ИспользоватьОтборСертификатИзмененРасширеннаяПодсказка + 95 + Label + true + true + + Left + + + + ИспользоватьОтборСертификатИзмененКонтекстноеМеню + 94 + true + + CheckBoxField + Enter + true + Left + true + + + + ОтборСертификатИзменен + 96 + true + true + + true + + + ОтборСертификатИзменен + + + OnChange + ОтборСертификатИзмененПриИзменении + + + ОтборСертификатИзмененРасширеннаяПодсказка + 98 + Label + true + true + + Left + + + + ОтборСертификатИзмененКонтекстноеМеню + 97 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Отбор сертификат изменен</value> + + + ГруппаОтборСертификатИзмененРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Отборы сертификат</value> + + + ГруппаОтборыСертификатРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + ГруппаОтборыРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + + + + ГруппаКоманднаяПанель + 26 + + ЗаполнитьСертификаты + 52 + true + true + + true + + + ЗаполнитьСертификатыРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + Form.Command.ЗаполнитьСертификаты + Normal + Auto + true + true + UserCmds + Auto + + + УстановитьПароли + 54 + true + true + + true + + + УстановитьПаролиРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + Form.Command.УстановитьПароли + Normal + Auto + true + true + UserCmds + Auto + + + ПечатьСпискаПаролей + 58 + true + true + + true + + + ПечатьСпискаПаролейРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + Form.Command.ПечатьСпискаПаролей + Normal + PictureAndText + true + true + UserCmds + Auto + + + ОтправитьПаролиПоSMS + 60 + true + true + + true + + + ОтправитьПаролиПоSMSРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + Form.Command.ОтправитьПаролиПоSMS + Normal + PictureAndText + true + true + UserCmds + Auto + + + СкрытьПоказатьПароли + 56 + true + true + + true + + + СкрытьПоказатьПаролиРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + Form.Command.СкрытьПоказатьПароли + Normal + Auto + true + true + UserCmds + Auto + + + ВывестиСписок + 36 + true + true + + true + + + ВывестиСписокРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + Form.Item.Получатели.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + КопироватьВБуферОбмена + 38 + true + true + + true + + + КопироватьВБуферОбменаРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + Form.Item.Получатели.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ВыделитьВсе + 40 + true + true + + true + + + ВыделитьВсеРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + Form.Item.Получатели.StandardCommand.SelectAll + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ПоказатьМножественноеВыделение + 42 + true + true + + true + + + ПоказатьМножественноеВыделениеРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + Form.Item.Получатели.StandardCommand.ShowMultipleSelection + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + SearchEverywhere + 44 + true + true + + true + + + SearchEverywhereРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + Form.Item.Получатели.StandardCommand.SearchEverywhere + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + Найти + 46 + true + true + + true + + + НайтиРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + Form.Item.Получатели.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ОтменитьПоиск + 48 + true + true + + true + + + ОтменитьПоискРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + Form.Item.Получатели.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ПоискПоТекущемуЗначению + 50 + true + true + + true + + + ПоискПоТекущемуЗначениюРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + Form.Item.Получатели.StandardCommand.FindByCurrentValue + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 118 + + СтрокаПоискаРасширеннаяПодсказка + 120 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 119 + true + + Получатели + + true + + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + ГруппаКоманднаяПанельРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + CommandBar + + Left + Form + + + + Получатели + 1 + + <key>ru</key> + <value>Получатели</value> + + true + true + + true + + + Получатели + + None + + ПолучателиПолучатель + 14 + true + true + + true + + + Получатели.Получатель + + + ПолучателиПолучательРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ПолучателиПолучательКонтекстноеМеню + 15 + true + + InputField + true + Enter + true + Left + true + + 31 + true + true + true + true + true + true + Normal + + + + ПолучателиАдресЭлектроннойПочты + 17 + true + true + + true + + + Получатели.АдресЭлектроннойПочты + + + ПолучателиАдресЭлектроннойПочтыРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ПолучателиАдресЭлектроннойПочтыКонтекстноеМеню + 18 + true + + InputField + true + Enter + true + Left + true + + 30 + true + true + true + true + true + true + Normal + + + + ПолучателиПарольАрхива + 23 + true + true + + true + + + Получатели.ПарольАрхива + + + OnChange + ПолучателиПарольАрхиваПриИзменении + + + ПолучателиПарольАрхиваРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ПолучателиПарольАрхиваКонтекстноеМеню + 24 + true + + InputField + Enter + true + + StdPicture.Change + + Left + true + + 15 + true + true + true + true + true + true + true + + Style.ФонУправляющегоПоля + + Normal + + + + ПолучателиПарольАрхива2 + 103 + true + + true + + + Получатели.ПарольАрхива + + + OnChange + ПолучателиПарольАрхиваПриИзменении + + + ПолучателиПарольАрхива2РасширеннаяПодсказка + 105 + Label + true + true + + Left + + + + ПолучателиПарольАрхива2КонтекстноеМеню + 104 + true + + InputField + Enter + true + + StdPicture.Change + + Left + true + + 15 + true + true + true + false + true + true + true + + Style.ФонУправляющегоПоля + + Normal + + + + ПолучателиКоманднаяПанель + 2 + Left + + + Selection + ПолучателиВыбор + + + BeforeAddRow + ПолучателиПередНачаломДобавления + + + BeforeDeleteRow + ПолучателиПередУдалением + + + ПолучателиСтрокаПоиска + 5 + + ПолучателиСтрокаПоискаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + ПолучателиСтрокаПоискаКонтекстноеМеню + 6 + true + + Получатели + + true + + + + ПолучателиСостояниеПросмотра + 11 + + ПолучателиСостояниеПросмотраРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ПолучателиСостояниеПросмотраКонтекстноеМеню + 12 + true + + ViewStatusAddition + Получатели + + true + + + + ПолучателиУправлениеПоиском + 8 + + ПолучателиУправлениеПоискомРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + ПолучателиУправлениеПоискомКонтекстноеМеню + 9 + true + + SearchControlAddition + Получатели + + true + + + + ПолучателиРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + + ПолучателиКонтекстноеМеню + 3 + true + + true + true + true + true + true + MultiRow +
        true
        + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + AsFileRef + true + +
        + Bottom + true + + ФормаКоманднаяПанель + -1 + + ЗаписатьИЗакрыть + 114 + true + true + + true + + + ЗаписатьИЗакрытьРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + true + true + true + UserCmds + Auto + + + Закрыть + 108 + + <key>ru</key> + <value>Отмена</value> + + true + true + + true + + + ЗакрытьРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + 130 + DontBlock + true + true + true + Vertical + true + true + true + auto + true + + Получатели + + <key>ru</key> + <value>Получатели</value> + + 1 + + ValueTable + + + true + + + true + + + Получатель + + <key>ru</key> + <value>Получатель</value> + + 3 + + DefinedType.ПолучательРассылки + + + true + + + true + + + + АдресЭлектроннойПочты + + <key>ru</key> + <value>Адрес электронной почты</value> + + 4 + + String + + + + true + + + true + + + + ПарольАрхива + + <key>ru</key> + <value>Пароль архива</value> + + 6 + + String + + 50 + + + + true + + + true + + + + ПарольИзменен + 8 + + Boolean + + + true + + + true + + + + СертификатИзменен + 9 + + Boolean + + + true + + + true + + + + Исключен + 22 + + Boolean + + + true + + + true + + + + + ОтборПарольИзменен + + <key>ru</key> + <value>Пароль изменен</value> + + 11 + + Boolean + + + true + + + true + + + + ОтборСертификатУказан + + <key>ru</key> + <value>Сертификат указан</value> + + 12 + + Boolean + + + true + + + true + + + + ОтборСертификатИзменен + + <key>ru</key> + <value>Сертификат изменен</value> + + 13 + + Boolean + + + true + + + true + + + + ИспользоватьОтборСертификатУказан + + <key>ru</key> + <value>Использовать отбор сертификат указан</value> + + 14 + + Boolean + + + true + + + true + + + + ИспользоватьОтборПарольИзменен + + <key>ru</key> + <value>Использовать отбор пароль изменен</value> + + 15 + + Boolean + + + true + + + true + + + + ИспользоватьОтборСертификатИзменен + + <key>ru</key> + <value>Использовать отбор сертификат изменен</value> + + 16 + + Boolean + + + true + + + true + + + + ИспользоватьОтборПарольУстановлен + + <key>ru</key> + <value>Использовать отбор пароль установлен</value> + + 17 + + Boolean + + + true + + + true + + + + ОтборПарольУстановлен + + <key>ru</key> + <value>Пароль установлен</value> + + 18 + + Boolean + + + true + + + true + + + + ИдентификаторОбъектаМетаданных + 19 + + + true + + + true + + + + ВидПочтовогоАдресаПолучателей + 20 + + CatalogRef.ВидыКонтактнойИнформации + + + true + + + true + + + + ТипПолучателейРассылки + 21 + + TypeDescription + + + true + + + true + + + + ПолучателиБезОтборов + 24 + + ValueTable + + + true + + + true + + + Получатель + 3 + + DefinedType.ПолучательРассылки + + + true + + + true + + + + АдресЭлектроннойПочты + 4 + + String + + + + true + + + true + + + + ПарольАрхива + 6 + + String + + 50 + + + + true + + + true + + + + ПарольИзменен + 8 + + Boolean + + + true + + + true + + + + СертификатИзменен + 9 + + Boolean + + + true + + + true + + + + Исключен + 22 + + Boolean + + + true + + + true + + + + + Ссылка + 25 + + CatalogRef.РассылкиОтчетов + + + true + + + true + + + + НаименованиеРассылки + 26 + + String + + 100 + + + + true + + + true + + + + ЗаполнитьСертификаты + + <key>ru</key> + <value>Заполнить сертификаты</value> + + 1 + + true + + + + ЗаполнитьСертификаты + + + Auto + Auto + + + УстановитьПароли + + <key>ru</key> + <value>Установить пароли</value> + + 2 + + true + + + + УстановитьПароли + + + Auto + Auto + + + СкрытьПоказатьПароли + + <key>ru</key> + <value>Скрыть/показать пароли</value> + + 3 + + ru + Скрыть/показать пароли + + + true + + + CommonPicture.ВводимыеСимволыВидны + + + + СкрытьПоказатьПароли + + + Auto + Auto + + + ПечатьСпискаПаролей + + <key>ru</key> + <value>Список паролей</value> + + 4 + + true + + + StdPicture.Print + + + + ПечатьСпискаПаролей + + + Auto + Auto + + + ОтправитьПаролиПоSMS + + <key>ru</key> + <value>Отправить пароли</value> + + 6 + + true + + + CommonPicture.ОтправитьSMS + + + + ОтправитьПаролиПоSMS + + + Auto + Auto + + + ЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 7 + + true + + + StdPicture.WriteAndClose + + + + ЗаписатьИЗакрыть + + + Auto + Auto + + + АдресПолучателей + + String + + + + + Архивировать + + Boolean + + + + ТипПолучателейРассылки + + TypeDescription + + + + ВидПочтовогоАдресаПолучателей + + CatalogRef.ВидыКонтактнойИнформации + + + + Ссылка + + CatalogRef.РассылкиОтчетов + + + + НаименованиеРассылки + + String + + 100 + + + + + + + +
        diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПаролиШифрование/Help/ru.html b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПаролиШифрование/Help/ru.html new file mode 100644 index 000000000..2b6c52ed4 --- /dev/null +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПаролиШифрование/Help/ru.html @@ -0,0 +1,33 @@ + +

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

        +

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

        +

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

        +
        +
        +
        + +
        + +
        +

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

        +

        Если установить флажок в поле Пароль изменен или Сертификат изменен и выбрать значение Да, то отобразятся получатели с измененным паролем или сертификатом. Если выбрать значение Нет, то отобразятся те получатели, у которых пароль и сертификат не менялся. 

        +

        Нажмите:

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

        Для информирования получателей об установке паролей можно воспользоваться SMS-рассылкой  , также возможна печать   списка паролей , чтобы передать пароль лично. 

        +

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

        +

        В колонке:

        +

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


        +

        Данные настройки сохранятся для всех последующих рассылок, в которых участвуют выбранные получатели. 

        +

        + + + \ No newline at end of file diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПаролиШифрование/Module.bsl b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПаролиШифрование/Module.bsl new file mode 100644 index 000000000..f131a702f --- /dev/null +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПаролиШифрование/Module.bsl @@ -0,0 +1,764 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ИзмененыПаролиСертификаты; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ТипПолучателейРассылки = Параметры.ТипПолучателейРассылки; + ВидПочтовогоАдресаПолучателей = Параметры.ВидПочтовогоАдресаПолучателей; + НаименованиеРассылки = Параметры.НаименованиеРассылки; + Ссылка = Параметры.Ссылка; + + ЗаполнитьСведенияОТипеПолучателей(Отказ); + ПодготовитьВидимостьЭлементов(Параметры.Архивировать); + ЗаполнитьОтборыПоУмолчанию(); + + Если ЭтоАдресВременногоХранилища(Параметры.АдресПолучателей) Тогда + ЗаполнитьПолучателейРассылкиСАдресомЭлектроннойПочты(ПолучитьИзВременногоХранилища(Параметры.АдресПолучателей)); + УдалитьИзВременногоХранилища(Параметры.АдресПолучателей); + КонецЕсли; + + ТаблицаПолучатели = РеквизитФормыВЗначение("Получатели"); + ЗначениеВРеквизитФормы(ТаблицаПолучатели, "ПолучателиБезОтборов"); + + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиФормы.Верх; + Элементы.ЗаписатьИЗакрыть.Отображение = ОтображениеКнопки.Картинка; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ИзмененыПаролиСертификаты = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если ИзмененыПаролиСертификаты Тогда + Отказ = Истина; + ТекстВопроса = СтроковыеФункцииКлиент.ФорматированнаяСтрока(НСтр( + "ru = 'Для получателей рассылки были изменены пароли и сертификаты для шифрования. Сохранить изменения? + | + |• Нажмите Да, чтобы сохранить изменения. + |• Нажмите Нет, чтобы закрыть без сохранения.'")); + + ПоказатьВопрос(Новый ОписаниеОповещения("ОтветСохранениеИзмененийПаролейСертификатов", ЭтотОбъект), ТекстВопроса, + РежимДиалогаВопрос.ДаНетОтмена, , КодВозвратаДиалога.Да); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ИспользоватьОтборПарольУстановленПриИзменении(Элемент) + УстановитьОтборы(); +КонецПроцедуры + +&НаКлиенте +Процедура ОтборПарольУстановленПриИзменении(Элемент) + УстановитьОтборы(); +КонецПроцедуры + +&НаКлиенте +Процедура ИспользоватьОтборПарольИзмененПриИзменении(Элемент) + УстановитьОтборы(); +КонецПроцедуры + +&НаКлиенте +Процедура ОтборПарольИзмененПриИзменении(Элемент) + УстановитьОтборы(); +КонецПроцедуры + +&НаКлиенте +Процедура ИспользоватьОтборСертификатУказанПриИзменении(Элемент) + УстановитьОтборы(); +КонецПроцедуры + +&НаКлиенте +Процедура ОтборСертификатУказанПриИзменении(Элемент) + УстановитьОтборы(); +КонецПроцедуры + +&НаКлиенте +Процедура ИспользоватьОтборСертификатИзмененПриИзменении(Элемент) + УстановитьОтборы(); +КонецПроцедуры + +&НаКлиенте +Процедура ОтборСертификатИзмененПриИзменении(Элемент) + УстановитьОтборы(); +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыПолучатели + +&НаКлиенте +Процедура ПолучателиПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, ЭтоГруппа, Параметр) + Отказ = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура ПолучателиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Получатель = Элементы.Получатели.ТекущиеДанные.Получатель; + + Если Элемент.ТекущийЭлемент = Элементы.ПолучателиПолучатель Или Элемент.ТекущийЭлемент = Элементы.ПолучателиАдресЭлектроннойПочты Тогда + Если ЗначениеЗаполнено(Получатель) Тогда + ПоказатьЗначение( , Получатель); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПолучателиПередУдалением(Элемент, Отказ) + Отказ = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура ПолучателиПарольАрхиваПриИзменении(Элемент) + + СтрокаПолучатели = Элементы.Получатели.ТекущиеДанные; + СтрокаПолучатели.ПарольИзменен = Истина; + + ПараметрыОтбора = Новый Структура; + ПараметрыОтбора.Вставить("Получатель", СтрокаПолучатели.Получатель); + + СтрокиПолучателиБезОтбора = ПолучателиБезОтборов.НайтиСтроки(ПараметрыОтбора); + Если СтрокиПолучателиБезОтбора.Количество() > 0 Тогда + СтрокиПолучателиБезОтбора[0].ПарольАрхива = СтрокаПолучатели.ПарольАрхива; + СтрокиПолучателиБезОтбора[0].ПарольИзменен = Истина; + КонецЕсли; + + ИзмененыПаролиСертификаты = Истина; + + ОбновитьОтборы(); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПолучателиСертификатДляШифрованияПриИзменении(Элемент) + + СтрокаПолучатели = Элементы.Получатели.ТекущиеДанные; + СтрокаПолучатели.СертификатИзменен = Истина; + + ПараметрыОтбора = Новый Структура; + ПараметрыОтбора.Вставить("Получатель", СтрокаПолучатели.Получатель); + + СтрокиПолучателиБезОтбора = ПолучателиБезОтборов.НайтиСтроки(ПараметрыОтбора); + Если СтрокиПолучателиБезОтбора.Количество() > 0 Тогда + СтрокаПолучателиБезОтбора = СтрокиПолучателиБезОтбора[0]; + СтрокаПолучателиБезОтбора["СертификатДляШифрования"] = СтрокаПолучатели["СертификатДляШифрования"]; + СтрокаПолучателиБезОтбора.СертификатИзменен = Истина; + КонецЕсли; + + ИзмененыПаролиСертификаты = Истина; + + ОбновитьОтборы(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ЗаполнитьСертификаты(Команда) + + ТекстВопроса = СтроковыеФункцииКлиент.ФорматированнаяСтрока(НСтр( + "ru = 'Для получателей рассылки будут заполнены сертификаты для шифрования, если они существуют для соответствующего физического лица. + | + |• Нажмите Да, чтобы перезаполнить сертификаты, даже если они уже были указаны. + |• Нажмите Нет, чтобы заполнить только отсутствующие сертификаты.'")); + + ПоказатьВопрос( + Новый ОписаниеОповещения("ПередЗаполнениемСертификатов", ЭтотОбъект), ТекстВопроса, + РежимДиалогаВопрос.ДаНетОтмена, , КодВозвратаДиалога.Нет); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьПароли(Команда) + + ТекстВопроса = СтроковыеФункцииКлиент.ФорматированнаяСтрока(НСтр( + "ru = 'Для получателей рассылки будут установлены пароли. + | + |• Нажмите Да, чтобы устанавливать новые пароли, даже если они уже были установлены. + |• Нажмите Нет, чтобы установить пароли, только при их отсутствии.'")); + + ПоказатьВопрос( + Новый ОписаниеОповещения("ПередУстановкойПаролей", ЭтотОбъект), ТекстВопроса, + РежимДиалогаВопрос.ДаНетОтмена, , КодВозвратаДиалога.Нет); + +КонецПроцедуры + +&НаКлиенте +Процедура СкрытьПоказатьПароли(Команда) + + Если Элементы.ПолучателиПарольАрхива.Видимость Тогда + Элементы.ПолучателиПарольАрхива.Видимость = Ложь; + Элементы.ПолучателиПарольАрхива2.Видимость = Истина; + Элементы.СкрытьПоказатьПароли.Картинка = БиблиотекаКартинок.ВводимыеСимволыСкрыты; + Иначе + Элементы.ПолучателиПарольАрхива.Видимость = Истина; + Элементы.ПолучателиПарольАрхива2.Видимость = Ложь; + Элементы.СкрытьПоказатьПароли.Картинка = БиблиотекаКартинок.ВводимыеСимволыВидны; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПечатьСпискаПаролей(Команда) + + МассивПолучателей = Новый Массив; + Для Каждого Строка Из Получатели Цикл + ИнформацияПолучателя = Новый Структура; + ИнформацияПолучателя.Вставить("Получатель", Строка.Получатель); + ИнформацияПолучателя.Вставить("АдресЭлектроннойПочты", Строка.АдресЭлектроннойПочты); + ИнформацияПолучателя.Вставить("ПарольАрхива", Строка.ПарольАрхива); + МассивПолучателей.Добавить(ИнформацияПолучателя); + КонецЦикла; + + ПараметрыПечати = Новый Структура; + ПараметрыПечати.Вставить("Получатели", МассивПолучателей); + ПараметрыПечати.Вставить("ТипПолучателейРассылки", ТипПолучателейРассылки); + ПараметрыПечати.Вставить("ИдентификаторОбъектаМетаданных", ИдентификаторОбъектаМетаданных); + ПараметрыПечати.Вставить("НаименованиеРассылки", НаименованиеРассылки); + ПараметрыПечати.Вставить("Ссылка", Ссылка); + + ПараметрКоманды = Новый Массив; + ПараметрКоманды.Добавить(Ссылка); + + МодульУправлениеПечатьюКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюКлиент"); + МодульУправлениеПечатьюКлиент.ВыполнитьКомандуПечати("Справочник.РассылкиОтчетов", "ПаролиРассылокОтчетов", + ПараметрКоманды, ЭтотОбъект, ПараметрыПечати); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтправитьПаролиПоSMS(Команда) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("АдресПолучателей", ПоместитьПолучателейВХранилище()); + ПараметрыФормы.Вставить("ТипПолучателейРассылки", ТипПолучателейРассылки); + ПараметрыФормы.Вставить("Ссылка", Ссылка); + ПараметрыФормы.Вставить("НаименованиеРассылки", НаименованиеРассылки); + ПараметрыФормы.Вставить("ИдентификаторОбъектаМетаданных", ИдентификаторОбъектаМетаданных); + ОткрытьФорму("Справочник.РассылкиОтчетов.Форма.SMSРассылкаПаролей", ПараметрыФормы, ЭтотОбъект, , , , , + РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + ЗаписатьПаролиИСертификатыДляШифрованияВБезопасноеХранилище(); + ИзмененыПаролиСертификаты = Ложь; + Закрыть(); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ОбновитьОтборы() + + Если ИспользоватьОтборПарольУстановлен Или ИспользоватьОтборПарольИзменен Или ИспользоватьОтборСертификатУказан + Или ИспользоватьОтборСертификатИзменен Тогда + УстановитьОтборы(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗаполнениемСертификатов(Результат, Параметры) Экспорт + + Если Результат = КодВозвратаДиалога.Да Тогда + ЗаполнитьСертификатыПолучателейНаСервере(Истина); + ИзмененыПаролиСертификаты = Истина; + ИначеЕсли Результат = КодВозвратаДиалога.Нет Тогда + ЗаполнитьСертификатыПолучателейНаСервере(Ложь); + ИзмененыПаролиСертификаты = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередУстановкойПаролей(Результат, Параметры) Экспорт + + Если Результат = КодВозвратаДиалога.Да Тогда + УстановитьПаролиПолучателейНаСервере(Истина); + ИзмененыПаролиСертификаты = Истина; + ИначеЕсли Результат = КодВозвратаДиалога.Нет Тогда + УстановитьПаролиПолучателейНаСервере(Ложь); + ИзмененыПаролиСертификаты = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтветСохранениеИзмененийПаролейСертификатов(Результат, Параметры) Экспорт + + Если Результат = КодВозвратаДиалога.Да Тогда + ЗаписатьПаролиИСертификатыДляШифрованияВБезопасноеХранилище(); + ИзмененыПаролиСертификаты = Ложь; + ИначеЕсли Результат = КодВозвратаДиалога.Нет Тогда + ИзмененыПаролиСертификаты = Ложь; + Закрыть(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСертификатыПолучателейНаСервере(ПерезаполнятьСертификаты) + + ТаблицаПолучатели = РеквизитФормыВЗначение("Получатели"); + + Если НЕ ПерезаполнятьСертификаты Тогда + МассивПолучателей = Новый Массив; + Для Каждого СтрокаПолучатели Из ТаблицаПолучатели Цикл + Если НЕ ЗначениеЗаполнено(СтрокаПолучатели.СертификатДляШифрования) Тогда + МассивПолучателей.Добавить(СтрокаПолучатели.Получатель); + КонецЕсли; + КонецЦикла; + Иначе + // Очистка сертификатов + СертификатыПустаяСсылка = Новый (ТаблицаПолучатели.Колонки["СертификатДляШифрования"].ТипЗначения.Типы()[0]); + Для Каждого СтрокаПолучатели Из Получатели Цикл + Если ЗначениеЗаполнено(СтрокаПолучатели.СертификатДляШифрования) Тогда + СтрокаПолучатели.СертификатИзменен = Истина; + СтрокаПолучатели["СертификатДляШифрования"] = СертификатыПустаяСсылка; + + ПараметрыОтбора = Новый Структура; + ПараметрыОтбора.Вставить("Получатель", СтрокаПолучатели.Получатель); + + СтрокиПолучателиБезОтбора = ПолучателиБезОтборов.НайтиСтроки(ПараметрыОтбора); + Если СтрокиПолучателиБезОтбора.Количество() > 0 Тогда + СтрокаПолучателиБезОтбора = СтрокиПолучателиБезОтбора[0]; + СтрокаПолучателиБезОтбора["СертификатДляШифрования"] = СертификатыПустаяСсылка; + СтрокаПолучателиБезОтбора.СертификатИзменен = Истина; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + МассивПолучателей = ТаблицаПолучатели.ВыгрузитьКолонку("Получатель"); + КонецЕсли; + + МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); + + МассивТипов = Новый Массив; + МассивТипов.Добавить(Тип("СправочникСсылка.Пользователи")); + МассивТипов.Добавить(Тип("СправочникСсылка.ГруппыПользователей")); + + ВыборкаФизическихЛиц = Ложь; + Если ТипПолучателейРассылки = Метаданные.ОпределяемыеТипы.ФизическоеЛицо.Тип Тогда + Выборка = МодульЭлектроннаяПодписьСлужебный.СертификатыФизическихЛиц(МассивПолучателей); + ВыборкаФизическихЛиц = Истина; + ИначеЕсли ТипПолучателейРассылки = Новый ОписаниеТипов(МассивТипов) Тогда + Выборка = МодульЭлектроннаяПодписьСлужебный.СертификатыФизическихЛицПользователей(МассивПолучателей); + Иначе + Возврат; + КонецЕсли; + + Пока Выборка.Следующий() Цикл + ПараметрыОтбора = Новый Структура; + ПараметрыОтбора.Вставить("Получатель", ?(ВыборкаФизическихЛиц, Выборка.ФизическоеЛицо, Выборка.Пользователь)); + + СтрокиПолучателиБезОтбора = ПолучателиБезОтборов.НайтиСтроки(ПараметрыОтбора); + Если СтрокиПолучателиБезОтбора.Количество() > 0 Тогда + СтрокаПолучателиБезОтбора = СтрокиПолучателиБезОтбора[0]; + СтрокаПолучателиБезОтбора["СертификатДляШифрования"] = Выборка.Сертификат; + СтрокаПолучателиБезОтбора.СертификатИзменен = Истина; + КонецЕсли; + КонецЦикла; + + УстановитьОтборы(); + +КонецПроцедуры + +&НаСервере +Процедура УстановитьПаролиПолучателейНаСервере(ПереустанавливатьПароли) + + СвойстваПароля = Пользователи.СвойстваПароля(); + СвойстваПароля.НаименьшаяДлина = 8; + СвойстваПароля.Сложный = Истина; + СвойстваПароля.УчестьНастройки = "ДляПользователей"; + + Для Каждого СтрокаПолучатели Из Получатели Цикл + + Если НЕ ПереустанавливатьПароли И ЗначениеЗаполнено(СтрокаПолучатели.ПарольАрхива) Тогда + Продолжить; + КонецЕсли; + + СтрокаПолучатели.ПарольАрхива = Пользователи.СоздатьПароль(СвойстваПароля); + СтрокаПолучатели.ПарольИзменен = Истина; + + ПараметрыОтбора = Новый Структура; + ПараметрыОтбора.Вставить("Получатель", СтрокаПолучатели.Получатель); + + СтрокиПолучателиБезОтбора = ПолучателиБезОтборов.НайтиСтроки(ПараметрыОтбора); + Если СтрокиПолучателиБезОтбора.Количество() > 0 Тогда + ЗаполнитьЗначенияСвойств(СтрокиПолучателиБезОтбора[0], СтрокаПолучатели); + КонецЕсли; + + КонецЦикла; + + УстановитьОтборы(); + +КонецПроцедуры + +&НаСервере +Процедура УстановитьОтборы() + + ТаблицаПолучателиБезОтборов = РеквизитФормыВЗначение("ПолучателиБезОтборов"); + + Построитель = Новый ПостроительЗапроса; + Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаПолучателиБезОтборов); + + Отбор = Построитель.Отбор; + + УстановленПароль = Отбор.Добавить("ПарольАрхива"); + УстановленПароль.ВидСравнения = ?(ОтборПарольУстановлен, ВидСравнения.НеРавно, ВидСравнения.Равно); + УстановленПароль.Значение = ""; + УстановленПароль.Использование = ИспользоватьОтборПарольУстановлен; + + НовыйПароль = Отбор.Добавить("ПарольИзменен"); + НовыйПароль.ВидСравнения = ВидСравнения.Равно; + НовыйПароль.Значение = ОтборПарольИзменен; + НовыйПароль.Использование = ИспользоватьОтборПарольИзменен; + + Если РассылкаОтчетов.ДоступноШифрованиеВложений() Тогда + ЗаполненСертификат = Отбор.Добавить("СертификатДляШифрования"); + ЗаполненСертификат.ВидСравнения = ?(ОтборСертификатУказан, ВидСравнения.НеРавно, ВидСравнения.Равно); + ЗаполненСертификат.Значение = Новый (ТаблицаПолучателиБезОтборов.Колонки["СертификатДляШифрования"].ТипЗначения.Типы()[0]); + ЗаполненСертификат.Использование = ИспользоватьОтборСертификатУказан; + + НовыйСертификат = Отбор.Добавить("СертификатИзменен"); + НовыйСертификат.ВидСравнения = ВидСравнения.Равно; + НовыйСертификат.Значение = ОтборСертификатИзменен; + НовыйСертификат.Использование = ИспользоватьОтборСертификатИзменен; + КонецЕсли; + + Построитель.Выполнить(); + ТаблицаРезультат = Построитель.Результат.Выгрузить(); + + ЗначениеВРеквизитФормы(ТаблицаРезультат, "Получатели"); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьПолучателейРассылкиСАдресомЭлектроннойПочты(ТаблицаПолучателей) + + ПолучателиМетаданные = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ИдентификаторОбъектаМетаданных, Ложь); + ТипПолучателей = ИдентификаторОбъектаМетаданных.КлючОбъектаМетаданных.Получить(); + + Запрос = Новый Запрос; + + Если ТипПолучателей = Тип("СправочникСсылка.Пользователи") Тогда + + ТекстЗапроса = + "ВЫБРАТЬ + | ТаблицаПолучателей.Получатель, + | ТаблицаПолучателей.Исключен + |ПОМЕСТИТЬ ТаблицаПолучателей + |ИЗ + | &ТаблицаПолучателей КАК ТаблицаПолучателей + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | Пользователь.Ссылка КАК Получатель, + | МАКСИМУМ(ТаблицаПолучателей.Исключен) КАК Исключен, + | Пользователи.Наименование + |ПОМЕСТИТЬ Получатели + |ИЗ + | ТаблицаПолучателей КАК ТаблицаПолучателей + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ПО СоставыГруппПользователей.ГруппаПользователей = ТаблицаПолучателей.Получатель + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи + | ПО Пользователи.Ссылка = СоставыГруппПользователей.Пользователь + |ГДЕ + | НЕ Пользователи.ПометкаУдаления + | И НЕ Пользователи.Недействителен + | И НЕ Пользователи.Служебный + |СГРУППИРОВАТЬ ПО + | Пользователь.Ссылка, + | Пользователи.Наименование + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | Получатели.Получатель КАК Получатель, + | Контакты.Представление КАК EMail, + | Получатели.Наименование КАК Наименование + |ИЗ + | Получатели КАК Получатели + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи.КонтактнаяИнформация КАК Контакты + | ПО Контакты.Ссылка = Получатели.Получатель + | И Контакты.Вид = &ВидПочтовогоАдресаПолучателей + |ГДЕ + | НЕ Получатели.Исключен + | + |УПОРЯДОЧИТЬ ПО + | Наименование + |ИТОГИ + | МАКСИМУМ(Наименование) КАК Наименование + |ПО + | Получатель"; + + Иначе + + ТекстЗапроса = + "ВЫБРАТЬ + | ТаблицаПолучателей.Получатель, + | ТаблицаПолучателей.Исключен + |ПОМЕСТИТЬ ТаблицаПолучателей + |ИЗ + | &ТаблицаПолучателей КАК ТаблицаПолучателей + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | Получатели.Ссылка КАК Получатель, + | Контакты.Представление КАК EMail, + | Получатели.Наименование КАК Наименование + |ИЗ + | Справочник.Пользователи КАК Получатели + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи.КонтактнаяИнформация КАК Контакты + | ПО Контакты.Ссылка = Получатели.Ссылка + | И Контакты.Вид = &ВидПочтовогоАдресаПолучателей + |ГДЕ + | Получатели.Ссылка В ИЕРАРХИИ + | (ВЫБРАТЬ + | Получатель + | ИЗ + | ТаблицаПолучателей + | ГДЕ + | НЕ Исключен) + | И НЕ Получатели.Ссылка В ИЕРАРХИИ + | (ВЫБРАТЬ + | Получатель + | ИЗ + | ТаблицаПолучателей + | ГДЕ + | Исключен) + | И НЕ Получатели.ПометкаУдаления + | И &ЭтоНеГруппа + | + |УПОРЯДОЧИТЬ ПО + | Наименование + |ИТОГИ + | МАКСИМУМ(Наименование) КАК Наименование + |ПО + | Получатель"; + + Если Не ПолучателиМетаданные.Иерархический Тогда + // Не иерархический + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "В ИЕРАРХИИ", "В"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ЭтоНеГруппа", ""); + ИначеЕсли ПолучателиМетаданные.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияЭлементов Тогда + // Иерархия элементов + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ЭтоНеГруппа", ""); + Иначе + // Иерархия групп + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ЭтоНеГруппа", "И НЕ Получатели.ЭтоГруппа"); + КонецЕсли; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Справочник.Пользователи", ПолучателиМетаданные.ПолноеИмя()); + + КонецЕсли; + + Запрос.УстановитьПараметр("ТаблицаПолучателей", ТаблицаПолучателей); + Если ЗначениеЗаполнено(ВидПочтовогоАдресаПолучателей) Тогда + Запрос.УстановитьПараметр("ВидПочтовогоАдресаПолучателей", ВидПочтовогоАдресаПолучателей); + Иначе + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ".Вид = &ВидПочтовогоАдресаПолучателей", ".Тип = &ТипПочтовогоАдреса"); + Запрос.УстановитьПараметр("ТипПочтовогоАдреса", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты); + КонецЕсли; + Запрос.Текст = ТекстЗапроса; + + Попытка + РезультатЗапроса = Запрос.Выполнить(); + ВыборкаПолучатели = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + Исключение + Возврат; + КонецПопытки; + + МассивПолучателей = Новый Массив; + Пока ВыборкаПолучатели.Следующий() Цикл + Выборка = ВыборкаПолучатели.Выбрать(); + СтрокаПолучатели = Получатели.Добавить(); + СтрокаПолучатели.Получатель = ВыборкаПолучатели.Получатель; + МассивПолучателей.Добавить(СтрокаПолучатели.Получатель); + Пока Выборка.Следующий() Цикл + ТекущийАдрес = ?(ПустаяСтрока(СтрокаПолучатели.АдресЭлектроннойПочты), "", + СтрокаПолучатели.АдресЭлектроннойПочты + "; "); + СтрокаПолучатели.АдресЭлектроннойПочты = ТекущийАдрес + Выборка.EMail; + КонецЦикла; + КонецЦикла; + + ЗаполнитьПаролиАрхиваИСертификатыДляШифрования(МассивПолучателей); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСведенияОТипеПолучателей(Отказ) + ТаблицаТиповПолучателей = РассылкаОтчетовПовтИсп.ТаблицаТиповПолучателей(); + Найденные = ТаблицаТиповПолучателей.НайтиСтроки(Новый Структура("ТипПолучателей", ТипПолучателейРассылки)); + Если Найденные.Количество() = 1 Тогда + СтрокаПолучатель = Найденные[0]; + ИдентификаторОбъектаМетаданных = СтрокаПолучатель.ИдентификаторОбъектаМетаданных; + Иначе + Отказ = Истина; + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьПаролиАрхиваИСертификатыДляШифрования(СписокПолучателей) + + УстановитьПривилегированныйРежим(Истина); + ПолучателиПароли = ОбщегоНазначения.ПрочитатьДанныеВладельцевИзБезопасногоХранилища(СписокПолучателей, "ПарольАрхива"); + УстановитьПривилегированныйРежим(Ложь); + + Для Каждого Получатель Из ПолучателиПароли Цикл + СтрокиПолучатели = Получатели.НайтиСтроки(Новый Структура("Получатель", Получатель.Ключ)); + Если СтрокиПолучатели.Количество() > 0 Тогда + СтрокиПолучатели[0].ПарольАрхива = Получатель.Значение; + КонецЕсли; + КонецЦикла; + + Если РассылкаОтчетов.ДоступноШифрованиеВложений() Тогда + ПолучателиСертификаты = РассылкаОтчетов.ПолучитьСертификатыШифрованияПолучателейРассылки(СписокПолучателей); + Для Каждого СтрокаПолучатели Из ПолучателиСертификаты Цикл + СтрокиПолучатели = Получатели.НайтиСтроки(Новый Структура("Получатель", СтрокаПолучатели.ПолучательРассылки)); + Если СтрокиПолучатели.Количество() > 0 Тогда + ЗаполнитьЗначенияСвойств(СтрокиПолучатели[0], СтрокаПолучатели); + КонецЕсли; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ЗаписатьПаролиИСертификатыДляШифрованияВБезопасноеХранилище() + + ДоступноШифрованиеВложений = РассылкаОтчетов.ДоступноШифрованиеВложений(); + + Для Каждого Строка Из ПолучателиБезОтборов Цикл + Если Строка.ПарольИзменен Тогда + УстановитьПривилегированныйРежим(Истина); + ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(Строка.Получатель, Строка.ПарольАрхива, "ПарольАрхива"); + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + Если ДоступноШифрованиеВложений И Строка.СертификатИзменен Тогда + РегистрыСведений.СертификатыПолучателейРассылкиОтчетов.СохранитьСертификатДляПолучателяРассылки( + Строка.Получатель, Строка.СертификатДляШифрования); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ПодготовитьВидимостьЭлементов(Архивировать) + + АвтоЗаголовок = Ложь; + + Если РассылкаОтчетов.ДоступноШифрованиеВложений() Тогда + МассивДобавляемыхРеквизитов = Новый Массив; + МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("СертификатДляШифрования", + Новый ОписаниеТипов("СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования"), "Получатели", НСтр( + "ru = 'Сертификат для шифрования'"))); + МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("СертификатДляШифрования", + Новый ОписаниеТипов("СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования"), "ПолучателиБезОтборов", НСтр( + "ru = 'Сертификат для шифрования'"))); + + ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); + + Элемент = Элементы.Добавить("ПолучателиСертификатДляШифрования", Тип("ПолеФормы"), Элементы.Получатели); + Элемент.Заголовок = НСтр("ru = 'Сертификат для шифрования'"); + Элемент.ПутьКДанным = "Получатели.СертификатДляШифрования"; + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе; + Элемент.Ширина = 30; + Элемент.КартинкаШапки = БиблиотекаКартинок.Изменить; + Элемент.ЦветФона = ЦветаСтиля.ФонУправляющегоПоля; + Элемент.УстановитьДействие("ПриИзменении", "Подключаемый_ПолучателиСертификатДляШифрованияПриИзменении"); + + МассивТипов = Новый Массив; + МассивТипов.Добавить(Тип("СправочникСсылка.Пользователи")); + МассивТипов.Добавить(Тип("СправочникСсылка.ГруппыПользователей")); + + ОписаниеТиповФизическоеЛицо = Метаданные.ОпределяемыеТипы.ФизическоеЛицо.Тип; + Если ОписаниеТиповФизическоеЛицо.Типы()[0] = Тип("Строка") Или (ТипПолучателейРассылки + <> ОписаниеТиповФизическоеЛицо И ТипПолучателейРассылки <> Новый ОписаниеТипов(МассивТипов)) Тогда + Элементы.ЗаполнитьСертификаты.Видимость = Ложь; + КонецЕсли; + + Заголовок = ?(Архивировать, НСтр("ru = 'Пароли и шифрование для рассылки отчетов'"), НСтр( + "ru = 'Шифрование для рассылки отчетов'")); + + Иначе + Элементы.ГруппаОтборыСертификат.Видимость = Ложь; + Элементы.ЗаполнитьСертификаты.Видимость = Ложь; + Заголовок = НСтр("ru = 'Пароли для рассылки отчетов'"); + КонецЕсли; + + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + Элементы.ПечатьСпискаПаролей.Видимость = Ложь; + КонецЕсли; + + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОтправкаSMS") Тогда + Элементы.ОтправитьПаролиПоSMS.Видимость = Ложь; + КонецЕсли; + + Если НЕ Архивировать Тогда + Элементы.ГруппаОтборыПароль.Видимость = Ложь; + Элементы.УстановитьПароли.Видимость = Ложь; + Элементы.ПечатьСпискаПаролей.Видимость = Ложь; + Элементы.ОтправитьПаролиПоSMS.Видимость = Ложь; + Элементы.СкрытьПоказатьПароли.Видимость = Ложь; + Элементы.ПолучателиПарольАрхива.Видимость = Ложь; + ИначеЕсли НЕ ПравоДоступа("Изменение", Метаданные.Справочники.РассылкиОтчетов) Тогда + Элементы.СкрытьПоказатьПароли.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьОтборыПоУмолчанию() + + ОтборПарольУстановлен = Истина; + ОтборПарольИзменен = Истина; + ОтборСертификатУказан = Истина; + ОтборСертификатИзменен = Истина; + +КонецПроцедуры + +&НаСервере +Функция ПоместитьПолучателейВХранилище() + Возврат ПоместитьВоВременноеХранилище(Получатели.Выгрузить( , "Получатель, ПарольАрхива"), УникальныйИдентификатор); +КонецФункции + +#КонецОбласти diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Form.form index 10f53d7d8..6ccfaff5d 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Form.form +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Form.form @@ -81,9 +81,7 @@ true None - Change Copy - EndEdit ПолучательНаименованиеИПочта 78 @@ -208,6 +206,10 @@ Получатели.Исключен + + OnChange + ПолучателиИсключенПриИзменении + ПолучателиИсключенРасширеннаяПодсказка 73 @@ -446,6 +448,38 @@ Form
        + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 125 + + СтрокаПоискРасширеннаяПодсказка + 127 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 126 + true + + Получатели + + true + + Left @@ -456,6 +490,10 @@ ChoiceProcessing ПолучателиОбработкаВыбора + + AfterDeleteRow + ПолучателиПослеУдаления + ПолучателиСтрокаПоиска 86 @@ -573,49 +611,109 @@ - ГруппаКоманднаяПанель - 47 - - ОК - 49 + ГруппаПодвал + 115 + + ГруппаИтоги + 117 + + ИтогВсего + 119 + true + true + + true + + + ИтогВсего + + + ИтогВсегоРасширеннаяПодсказка + 121 + Label + true + true + + Left + + + + ИтогВсегоКонтекстноеМеню + 120 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ИтогИсключены + 122 + true + true + + true + + + ИтогИсключены + + + ИтогИсключеныРасширеннаяПодсказка + 124 + Label + true + true + + Left + + + + ИтогИсключеныКонтекстноеМеню + 123 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + true true true - - ОКРасширеннаяПодсказка - 50 - Label - true - true - - Left - - - Form.Command.ОК - Auto - true - true - true - UserCmds - Auto - - - ФормаЗакрыть - 39 <key>ru</key> - <value>Отмена</value> + <value>Итоги</value> - true - true - - true - + Right + Bottom - ФормаЗакрытьРасширеннаяПодсказка - 40 + ГруппаИтогиРасширеннаяПодсказка + 118 Label true true @@ -623,12 +721,104 @@ Left
        - Form.StandardCommand.Close - Normal - true - true - UserCmds - Auto + UsualGroup + + HorizontalIfPossible + Right + Bottom + Auto + true + true + + Style.ИтогиФонГруппы + + Auto + Auto + + + + ГруппаКоманднаяПанель + 47 + + ОК + 49 + true + true + + true + + + ОКРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаЗакрыть + 39 + + <key>ru</key> + <value>Отмена</value> + + true + true + + true + + + ФормаЗакрытьРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + false + Right + + ГруппаКоманднаяПанельРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + CommandBar + + Right + true true @@ -637,11 +827,12 @@ <key>ru</key> - <value>Командная панель</value> + <value>Подвал</value> + Right - ГруппаКоманднаяПанельРасширеннаяПодсказка - 48 + ГруппаПодвалРасширеннаяПодсказка + 116 Label true true @@ -649,9 +840,14 @@ Left
        - CommandBar - - Right + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto @@ -839,6 +1035,46 @@ true + + ИтогВсего + + <key>ru</key> + <value>Всего</value> + + 7 + + Number + + 7 + + + + true + + + true + + + + ИтогИсключены + + <key>ru</key> + <value>Исключены</value> + + 8 + + Number + + 7 + + + + true + + + true + + ПолучателиПодобрать diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Module.bsl b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Module.bsl index 8a4c6cb10..9f3c76f61 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Module.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Module.bsl @@ -31,6 +31,9 @@ Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗагрузкаДанныхИзФайла") Тогда Элементы.ВставитьИзБуфераОбмена.Видимость = Ложь; КонецЕсли; + + ОбновитьКоличествоПолучателей(ЭтотОбъект); + КонецПроцедуры #КонецОбласти @@ -87,6 +90,7 @@ Процедура ПолучателиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ДобавитьПеретащитьПолучателя(ВыбранноеЗначение); + ОбновитьКоличествоПолучателей(ЭтотОбъект); КонецПроцедуры &НаКлиенте @@ -95,6 +99,16 @@ ОткрытьФормаДобавленияПолучателей(Ложь); КонецПроцедуры +&НаКлиенте +Процедура ПолучателиИсключенПриИзменении(Элемент) + ОбновитьКоличествоПолучателей(ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура ПолучателиПослеУдаления(Элемент) + ОбновитьКоличествоПолучателей(ЭтотОбъект); +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы @@ -129,6 +143,8 @@ Получатель.Исключен = Истина; КонецЦикла; + ОбновитьКоличествоПолучателей(ЭтотОбъект); + КонецПроцедуры &НаКлиенте @@ -138,6 +154,8 @@ Получатель.Исключен = Ложь; КонецЦикла; + ОбновитьКоличествоПолучателей(ЭтотОбъект); + КонецПроцедуры #КонецОбласти @@ -307,4 +325,22 @@ КонецЕсли; КонецПроцедуры +&НаКлиентеНаСервереБезКонтекста +Процедура ОбновитьКоличествоПолучателей(Форма) + + КоличествоПолучателей = КоличествоПолучателейСУчетомГрупп(Форма.Получатели, + Форма.ИдентификаторОбъектаМетаданных); + + Форма.ИтогВсего = КоличествоПолучателей.Всего; + Форма.ИтогИсключены = КоличествоПолучателей.Исключены; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция КоличествоПолучателейСУчетомГрупп(Знач Получатели, Знач ИдентификаторОбъектаМетаданных) + + Возврат Справочники.РассылкиОтчетов.КоличествоПолучателейСУчетомГрупп(Получатели, ИдентификаторОбъектаМетаданных); + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/Предупреждение/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/Предупреждение/Form.form index 643a84632..1f74d1ecf 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/Предупреждение/Form.form +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/Предупреждение/Form.form @@ -137,7 +137,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -250,7 +249,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Module.bsl b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Module.bsl index 050243094..3f439bd0e 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Module.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Module.bsl @@ -15,6 +15,14 @@ Список, "ЭтоГруппа", Истина, ВидСравненияКомпоновкиДанных.Равно, , , РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный); + + // СтандартныеПодсистемы.ВерсионированиеОбъектов + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект); + КонецЕсли; + // Конец СтандартныеПодсистемы.ВерсионированиеОбъектов + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаГруппы/Module.bsl b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаГруппы/Module.bsl index 3d7998c28..635e7a673 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаГруппы/Module.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаГруппы/Module.bsl @@ -17,6 +17,13 @@ КонецЕсли; КонецЕсли; + // СтандартныеПодсистемы.ВерсионированиеОбъектов + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект); + КонецЕсли; + // Конец СтандартныеПодсистемы.ВерсионированиеОбъектов + КонецПроцедуры &НаСервере diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Form.form index bd692802e..e01638815 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Form.form @@ -209,7 +209,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -241,7 +240,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -272,7 +270,7 @@ <horizontalAlign>Left</horizontalAlign> </extInfo> </extendedTooltip> - <commandName>0</commandName> + <commandName>Form.StandardCommand.Choose</commandName> <buttonImportance>Normal</buttonImportance> <representation>Auto</representation> <autoMaxWidth>true</autoMaxWidth> @@ -513,35 +511,6 @@ <placementArea>UserCmds</placementArea> <representationInContextMenu>Auto</representationInContextMenu> </items> - <items xsi:type="form:Button"> - <name>СобытияРассылки</name> - <id>30</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <dataPath xsi:type="form:DataPath"> - <segments>Items.Список.CurrentData.Ref</segments> - </dataPath> - <extendedTooltip> - <name>СобытияРассылкиExtendedTooltip</name> - <id>58</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <commandName>Catalog.РассылкиОтчетов.Command.СобытияРассылки</commandName> - <buttonImportance>Normal</buttonImportance> - <representation>Auto</representation> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <placementArea>UserCmds</placementArea> - <representationInContextMenu>Auto</representationInContextMenu> - </items> <items xsi:type="form:Button"> <name>ИзменитьВыделенные</name> <id>79</id> @@ -590,6 +559,66 @@ </extendedTooltip> <extInfo xsi:type="form:ButtonGroupExtInfo"/> </items> + <items xsi:type="form:FormGroup"> + <name>ПодменюОтчеты</name> + <id>174</id> + <items xsi:type="form:Button"> + <name>СобытияРассылки</name> + <id>30</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Items.Список.CurrentData.Ref</segments> + </dataPath> + <extendedTooltip> + <name>СобытияРассылкиExtendedTooltip</name> + <id>58</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Catalog.РассылкиОтчетов.Command.СобытияРассылки</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <title> + <key>ru</key> + <value>Отчеты</value> + + + ПодменюОтчетыРасширеннаяПодсказка + 175 + Label + true + true + + Left + + + Popup + + + CommonPicture.Отчеты + + PictureAndText + Normal + + ВторостепенныеКоманды 127 @@ -1753,6 +1782,10 @@ 3 Left + + OnActivateRow + СписокПриАктивизацииСтроки + СписокСтрокаПоиска 139 @@ -1929,6 +1962,7 @@ true true true + true MultiRow
        true
        1 diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Module.bsl index 6a74cbc25..7ffa2b8d9 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Module.bsl @@ -22,6 +22,20 @@ ВызватьИсключение ТекстОшибкиПриОткрытии; КонецЕсли; + // СтандартныеПодсистемы.ПодключаемыеКоманды + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда + МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды"); + МодульПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект); + КонецЕсли; + // Конец СтандартныеПодсистемы.ПодключаемыеКоманды + + // СтандартныеПодсистемы.ВерсионированиеОбъектов + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект); + КонецЕсли; + // Конец СтандартныеПодсистемы.ВерсионированиеОбъектов + // Установка отборов динамического списка. ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( Список, "ВыполнятьПоРасписанию", Ложь, @@ -61,7 +75,7 @@ Список.Параметры.УстановитьЗначениеПараметра("ПустаяДата", '00010101'); Список.Параметры.УстановитьЗначениеПараметра("ПредставлениеСостоянияНовая", НСтр("ru = 'Новая'")); Список.Параметры.УстановитьЗначениеПараметра("ПредставлениеСостоянияНеВыполнена", НСтр("ru = 'Не выполнена'")); - Список.Параметры.УстановитьЗначениеПараметра("ПредставлениеСостоянияВыполненаСОшибками", НСтр("ru = 'Выполнена с ошибками'")); + Список.Параметры.УстановитьЗначениеПараметра("ПредставлениеСостоянияВыполненаСОшибками", НСтр("ru = 'Выполнена частично'")); Список.Параметры.УстановитьЗначениеПараметра("ПредставлениеСостоянияВыполнена", НСтр("ru = 'Выполнена'")); Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") @@ -101,6 +115,22 @@ #КонецОбласти +#Область ОбработчикиСобытийЭлементовТаблицыФормыСписок + +&НаКлиенте +Процедура СписокПриАктивизацииСтроки(Элемент) + + // СтандартныеПодсистемы.ПодключаемыеКоманды + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда + МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент"); + МодульПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект); + КонецЕсли; + // Конец СтандартныеПодсистемы.ПодключаемыеКоманды + +КонецПроцедуры + +#КонецОбласти + #Область ОбработчикиКомандФормы &НаКлиенте @@ -173,4 +203,35 @@ КонецПроцедуры +// СтандартныеПодсистемы.ПодключаемыеКоманды +&НаКлиенте +Процедура Подключаемый_ВыполнитьКоманду(Команда) + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда + МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент"); + МодульПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Элементы.Список); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт + ВыполнитьКомандуНаСервере(ПараметрыВыполнения); +КонецПроцедуры + +&НаСервере +Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения) + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда + МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды"); + МодульПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Элементы.Список); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ОбновитьКоманды() + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда + МодульПодключаемыеКомандыКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиентСервер"); + МодульПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.Список); + КонецЕсли; +КонецПроцедуры +// Конец СтандартныеПодсистемы.ПодключаемыеКоманды + #КонецОбласти diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Form.form index 16dc88187..c44327c47 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Form.form @@ -106,7 +106,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -410,7 +409,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -440,8 +438,6 @@ None Add - Change - Copy ОтчетыПредставление 223 @@ -726,6 +722,38 @@ Item.Отчеты + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоискаОтчеты + 1200 + + СтрокаПоискаОтчетыРасширеннаяПодсказка + 1202 + Label + true + true + + Left + + + + СтрокаПоискаОтчетыКонтекстноеМеню + 1201 + true + + Отчеты + + true + + Left @@ -914,19 +942,6 @@ None Add - CancelSearch - Change - Copy - CopyToClipboard - Delete - EndEdit - Find - MoveDown - MoveUp - OutputList - SelectAll - SortListAsc - SortListDesc НастройкиТекущегоОтчетаИспользование1 660 @@ -1216,12 +1231,7 @@ КомпоновщикНастроекКД.UserSettings None - Change - EndEdit - HierarchicalList List - Tree - UseFieldAsValue ПользовательскиеНастройкиИспользование 581 @@ -1588,6 +1598,36 @@ Auto InCommandBarAndInAdditionalSubmenu + + ПользовательскиеНастройкиГруппаУстановитьСнятьФлажки + 1225 + true + true + + true + + + <key>ru</key> + <value>Пользовательские настройки группа установить снять флажки</value> + + + ru + Пользовательские настройки группа установить снять флажки + + + ПользовательскиеНастройкиГруппаУстановитьСнятьФлажкиРасширеннаяПодсказка + 1226 + Label + true + true + + Left + + + + Compact + + ПользовательскиеНастройкиСнятьФлажки 953 @@ -1864,18 +1904,6 @@ None Add - CancelSearch - Change - Copy - CopyToClipboard - Delete - EndEdit - Find - MoveDown - MoveUp - SelectAll - SortListAsc - SortListDesc НастройкиТекущегоОтчетаИспользование 245 @@ -2252,7 +2280,6 @@ UsualGroup Vertical - Auto true true auto @@ -2602,7 +2629,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2631,7 +2657,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2748,7 +2773,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3075,7 +3099,6 @@ UsualGroup HorizontalIfPossible - Auto true true Equal @@ -3321,7 +3344,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3470,7 +3492,6 @@ UsualGroup Vertical - Auto true true auto @@ -3617,7 +3638,6 @@ UsualGroup Vertical - Auto true true auto @@ -3764,7 +3784,6 @@ UsualGroup Vertical - Auto true true auto @@ -3911,7 +3930,6 @@ UsualGroup Vertical - Auto true true auto @@ -3999,7 +4017,6 @@ UsualGroup Vertical - Auto true true Auto @@ -4028,7 +4045,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -4726,7 +4742,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -4789,6 +4804,10 @@ ПолучателиРассылки None + + ru + Указать список получателей рассылки + Balloon ПолучателиРассылкиРасширеннаяПодсказка @@ -4815,7 +4834,6 @@ Click ПолучателиРассылкиНажатие - 50 true true @@ -4842,7 +4860,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -4961,7 +4978,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -6917,7 +6933,6 @@ UsualGroup Vertical - Auto true true Auto @@ -6946,7 +6961,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -6975,7 +6989,116 @@ UsualGroup Vertical - Auto + true + true + Auto + Auto + + + + ДополнительныеПараметрыРассылкиПоЭлектроннойПочте + 200 + + АдресОтвета + 33 + true + true + + true + + + Объект.АдресОтвета + + + АдресОтветаExtendedTooltip + 937 + Label + true + true + + Left + + + + АдресОтветаКонтекстноеМеню + 34 + true + + InputField + Auto + true + Left + true + + 10 + true + 35 + true + true + true + true + true + Normal + + + + ИспользоватьСкрытыеКопии + 35 + true + true + + true + + + Объект.СкрытыеКопии + + Right + Button + + ИспользоватьСкрытыеКопииExtendedTooltip + 938 + Label + true + true + + Left + + + + ИспользоватьСкрытыеКопииКонтекстноеМеню + 36 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Параметры доставки по электронной почте</value> + + + ДополнительныеПараметрыРассылкиПоЭлектроннойПочтеExtendedTooltip + 936 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + WeakSeparation true true Auto @@ -7018,59 +7141,307 @@ СтраницаДополнительно 199 - - ФорматыПоУмолчанию - 335 - true - true - - true - - - ФорматыПоУмолчанию - - - ФорматыПоУмолчаниюExtendedTooltip - 916 - Label - true - true - - Left - - - - ФорматыПоУмолчаниюКонтекстноеМеню - 336 - true - - InputField - Enter - true - Left - true - - - StartChoice - ФорматыПоУмолчаниюНачалоВыбора - - - Clearing - ФорматыПоУмолчаниюОчистка - - true - true - true - false - true - true - true - Normal - - ФорматыОтчетовИКнопки 686 + + ГруппаФорматыОтчетов + 1214 + + ГруппаШапкаФорматыОтчетов + 1216 + + ФорматыПоУмолчанию + 335 + true + true + + true + + + ФорматыПоУмолчанию + + + ФорматыПоУмолчаниюExtendedTooltip + 916 + Label + true + true + + Left + + + + ФорматыПоУмолчаниюКонтекстноеМеню + 336 + + СброситьФорматПоУмолчанию + 1198 + true + true + + true + + + СброситьФорматПоУмолчаниюРасширеннаяПодсказка + 1199 + Label + true + true + + Left + + + Form.Command.СброситьФорматПоУмолчанию + Normal + Auto + true + true + UserCmds + Auto + + true + + LabelField + Enter + true + Left + true + + + Click + ФорматыПоУмолчаниюНажатие + + 70 + true + true + + + + КоманднаяПанельФорматыОтчетов + 1212 + + ФорматыОтчетовВывестиСписок + 1223 + true + true + + true + + + ФорматыОтчетовВывестиСписокРасширеннаяПодсказка + 1224 + Label + true + true + + Left + + + Form.Item.ФорматыОтчетов.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоискаФорматыОтчетов + 1220 + + СтрокаПоискаФорматыОтчетовРасширеннаяПодсказка + 1222 + Label + true + true + + Left + + + + СтрокаПоискаФорматыОтчетовКонтекстноеМеню + 1221 + true + + ФорматыОтчетов + Right + + true + + + + ГруппаСнятьУстановитьПометкиЕслиПустой + 1218 + + СнятьПометкиОтправлятьЕслиПустой + 689 + true + true + + true + + + СнятьПометкиОтправлятьЕслиПустойExtendedTooltip + 928 + Label + true + true + + Left + + + Form.Command.СнятьПометкиОтправлятьЕслиПустой + Normal + Picture + true + true + UserCmds + Auto + + + УстановитьПометкиОтправлятьЕслиПустой + 688 + true + true + + true + + + УстановитьПометкиОтправлятьЕслиПустойExtendedTooltip + 927 + Label + true + true + + Left + + + Form.Command.УстановитьПометкиОтправлятьЕслиПустой + Normal + Picture + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Снять установить пометки если пустой</value> + + true + Right + + ГруппаСнятьУстановитьПометкиЕслиПустойРасширеннаяПодсказка + 1219 + Label + true + true + + Left + + + + Compact + + + true + true + + true + + + <key>ru</key> + <value>Командная панель форматы отчетов</value> + + Right + + КоманднаяПанельФорматыОтчетовРасширеннаяПодсказка + 1213 + Label + true + true + + Left + + + CommandBar + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа шапка форматы отчетов</value> + + + ГруппаШапкаФорматыОтчетовРасширеннаяПодсказка + 1217 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Форматы отчетов</value> + + + ГруппаФорматыОтчетовРасширеннаяПодсказка + 1215 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + ФорматыОтчетов 100 @@ -7088,18 +7459,6 @@ None Add - CancelSearch - Change - Copy - CopyToClipboard - Delete - EndEdit - Find - MoveDown - MoveUp - OutputList - SortListAsc - SortListDesc ФорматыОтчетовПредставление 230 @@ -7272,58 +7631,7 @@ ФорматыОтчетовКоманднаяПанель 102 - - ФорматыОтчетовУстановитьПометкиОтправлятьЕслиПустой - 690 - true - - true - - - ФорматыОтчетовУстановитьПометкиОтправлятьЕслиПустойExtendedTooltip - 920 - Label - true - true - - Left - - - Form.Command.УстановитьПометкиОтправлятьЕслиПустой - Normal - PictureAndText - true - true - UserCmds - Auto - - - ФорматыОтчетовСнятьПометкиОтправлятьЕслиПустой - 691 - true - - true - - - ФорматыОтчетовСнятьПометкиОтправлятьЕслиПустойExtendedTooltip - 921 - Label - true - true - - Left - - - Form.Command.СнятьПометкиОтправлятьЕслиПустой - Normal - PictureAndText - true - true - UserCmds - Auto - Right - true BeforeAddRow @@ -7493,92 +7801,6 @@ true - - КнопкиФорматовОтчетов - 687 - - УстановитьПометкиОтправлятьЕслиПустой - 688 - true - true - - true - - - УстановитьПометкиОтправлятьЕслиПустойExtendedTooltip - 927 - Label - true - true - - Left - - - UsualButton - Form.Command.УстановитьПометкиОтправлятьЕслиПустой - Normal - Picture - true - true - UserCmds - Auto - - - СнятьПометкиОтправлятьЕслиПустой - 689 - true - true - - true - - - СнятьПометкиОтправлятьЕслиПустойExtendedTooltip - 928 - Label - true - true - - Left - - - UsualButton - Form.Command.СнятьПометкиОтправлятьЕслиПустой - Normal - Picture - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Кнопки форматов отчетов</value> - - - КнопкиФорматовОтчетовExtendedTooltip - 926 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - true true @@ -7600,8 +7822,7 @@ UsualGroup - HorizontalIfPossible - Auto + Vertical true true Auto @@ -7713,89 +7934,6 @@ ИмяАрхиваКонтекстноеМеню 16 - - ИмяАрхиваКонтекстноеМенюПодменюПараметр - 697 - - ИмяАрхиваКонтекстноеМенюДобавитьИлиИзменитьШаблонДатыРассылки - 352 - true - true - - true - - - ИмяАрхиваКонтекстноеМенюДобавитьИлиИзменитьШаблонДатыРассылкиExtendedTooltip - 932 - Label - true - true - - Left - - - Form.Command.ДобавитьИзменитьШаблонДатыРассылки - Normal - Auto - true - true - UserCmds - Auto - - - ИмяАрхиваКонтекстноеМенюДобавитьШаблонРассылки - 351 - true - true - - true - - - ИмяАрхиваКонтекстноеМенюДобавитьШаблонРассылкиExtendedTooltip - 933 - Label - true - true - - Left - - - Form.Command.ДобавитьШаблонНаименованияРассылки - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Параметр</value> - - - ИмяАрхиваКонтекстноеМенюПодменюПараметрExtendedTooltip - 931 - Label - true - true - - Left - - - Popup - - - StdPicture.DataCompositionConditionalAppearance - - Auto - Normal - - true InputField @@ -7804,14 +7942,37 @@ Left true - 10 + + ChoiceProcessing + ИмяАрхиваОбработкаВыбора + + 50 true 45 true true + true true true true + + + ru + Наименование рассылки + + + [НаименованиеРассылки] + + + + + ru + Наименование и дата расылки + + + НаименованиеДатаРассылки + + Normal ru @@ -7819,28 +7980,110 @@ - - ПарольАрхива - 17 - - <key>ru</key> - <value>Пароль</value> - + + ГруппаПарольАрхива + 1192 + + ПарольАрхива + 17 + + <key>ru</key> + <value>Пароль</value> + + true + true + + true + + + ПарольАрхива + + + OnChange + ПарольАрхиваПриИзменении + + + ПарольАрхиваExtendedTooltip + 935 + Label + true + true + + Left + + + + ПарольАрхиваКонтекстноеМеню + 18 + true + + InputField + Auto + true + Left + true + + + StartChoice + ПарольАрхиваНачалоВыбора + + 20 + true + true + true + true + + CommonPicture.ВводимыеСимволыВидны + + true + true + true + Normal + + ru + Пароль архива + + + + + СоздатьПарольАрхива + 1190 + true + true + + true + + + СоздатьПарольАрхиваРасширеннаяПодсказка + 1191 + Label + true + true + + Left + + + UsualButton + Form.Command.СоздатьПарольАрхива + Normal + Picture + true + true + UserCmds + Auto + true true true - - ПарольАрхива - - - OnChange - ПарольАрхиваПриИзменении - + + <key>ru</key> + <value>Пароль архива</value> + - ПарольАрхиваExtendedTooltip - 935 + ГруппаПарольАрхиваРасширеннаяПодсказка + 1193 Label true true @@ -7848,31 +8091,41 @@ Left - - ПарольАрхиваКонтекстноеМеню - 18 - true - - InputField - Auto - true - Left - true - - 12 - true - true - true - true - true - true - Normal - - ru - Пароль архива - + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + ПаролиШифрование + 1194 + true + + true + + + ПаролиШифрованиеРасширеннаяПодсказка + 1195 + Label + true + true + + Left + + + Hyperlink + Form.Command.ПаролиШифрование + Normal + Auto + true + true + UserCmds + Auto + true true @@ -7895,125 +8148,12 @@ UsualGroup HorizontalIfPossible - Auto true true Auto Auto - - ДополнительныеПараметрыРассылкиПоЭлектроннойПочте - 200 - - АдресОтвета - 33 - true - true - - true - - - Объект.АдресОтвета - - - АдресОтветаExtendedTooltip - 937 - Label - true - true - - Left - - - - АдресОтветаКонтекстноеМеню - 34 - true - - InputField - Auto - true - Left - true - - 10 - true - 35 - true - true - true - true - true - Normal - - - - ИспользоватьСкрытыеКопии - 35 - true - true - - true - - - Объект.СкрытыеКопии - - Right - Button - - ИспользоватьСкрытыеКопииExtendedTooltip - 938 - Label - true - true - - Left - - - - ИспользоватьСкрытыеКопииКонтекстноеМеню - 36 - true - - CheckBoxField - Auto - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Параметры доставки по электронной почте</value> - - - ДополнительныеПараметрыРассылкиПоЭлектроннойПочтеExtendedTooltip - 936 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - WeakSeparation - true - true - auto - Auto - Auto - - ДополнительныеПараметры 355 @@ -8086,11 +8226,9 @@ UsualGroup Vertical - Auto - WeakSeparation + NormalSeparation true true - auto Auto Auto @@ -8283,6 +8421,56 @@ UserCmds Auto + true + true + + true + + + <key>ru</key> + <value>Общие команды</value> + + + ОбщиеКомандыРасширеннаяПодсказка + 995 + Label + true + true + + Left + + + + + + Кнопки + 959 + true + true + + true + + + <key>ru</key> + <value>Кнопки</value> + + + КнопкиРасширеннаяПодсказка + 960 + Label + true + true + + Left + + + + Form + + + + ПодменюОтчеты + 1196 КомандаСобытияРассылки 1053 @@ -8344,11 +8532,11 @@ <key>ru</key> - <value>Общие команды</value> + <value>Отчеты</value> - ОбщиеКомандыРасширеннаяПодсказка - 995 + ПодменюОтчетыРасширеннаяПодсказка + 1197 Label true true @@ -8356,32 +8544,13 @@ Left - - - - Кнопки - 959 - true - true - - true - - - <key>ru</key> - <value>Кнопки</value> - - - КнопкиРасширеннаяПодсказка - 960 - Label - true - true - - Left - - - - Form + Popup + + + CommonPicture.Отчеты + + PictureAndText + Normal @@ -8956,7 +9125,7 @@ ФорматыПоУмолчанию <key>ru</key> - <value>Форматы сохранения отчетов (по умолчанию)</value> + <value>Сохранять отчеты (по умолчанию)</value> 20 @@ -9893,6 +10062,32 @@ + + СертификатДляШифрованияИзменен + 65 + + Boolean + + + true + + + true + + + + ДоступноШифрованиеВложений + 54 + + Boolean + + + true + + + true + + ДобавитьИзменитьШаблонДатыРассылки @@ -10549,11 +10744,76 @@ <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>СоздатьПарольАрхива</name> + <title> + <key>ru</key> + <value>Создать пароль архива</value> + + 30 + + ru + Создать новый надежный пароль для архива + + + true + + + StdPicture.MoveLeft + + + + СоздатьПарольАрхива + + + Auto + Auto + + + ПаролиШифрование + + <key>ru</key> + <value>Пароли шифрование</value> + + 31 + + true + + + + ПаролиШифрование + + + Auto + Auto + + + СброситьФорматПоУмолчанию + + <key>ru</key> + <value>Сбросить</value> + + 32 + + true + + + + СброситьФорматПоУмолчанию + + + Auto + Auto + + + AfterWrite + ПослеЗаписи + AfterWriteAtServer ПослеЗаписиНаСервере diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Help/ru.html index 9dfab4a76..84ff880a6 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Help/ru.html @@ -90,16 +90,20 @@
      • [СпособДоставки] - представление ресурса, на котором был опубликован отчет.
    • -
      По умолчанию установлен формат письма HTML, можно изменить его на Обычный. В формате HTML доступны стандартные команды форматирования текста (часть из них размещена в виде кнопок, остальные можно найти в меню Еще).
      -
    • -
    • -
      С помощью соответствующего флажка можно Транслитерировать имена файлов. В этом случае сохраненные файлы будут иметь имена, содержащие только латинские буквы и цифры, для возможности переноса между различными операционными системами. Например, файл Отчет.mxl будет сохранен с именем Otchet.mxl.

    Дополнительно

    +
    По умолчанию установлен формат письма HTML, можно изменить его на Обычный. В формате HTML доступны стандартные команды форматирования текста (часть из них размещена в виде кнопок, остальные можно найти в меню Еще).
    +
    • В поле Адрес ответа укажите E-mail адрес, на который будут высылаться ответы на рассылку. Можно указать обратный адрес, для того чтобы получателям рассылки можно было отправить на него предложения и замечания по поводу присылаемых в рассылке отчетов (с помощью кнопки Ответить в полученном письме с отчетами. Этот адрес невозможно использовать для анализа результатов рассылки, т.к. он предназначен для ответов реальных пользователей и письма с этого адреса не придут автоматически. Адрес ответа может отличаться от адреса системной учетной записи, с которой обычно осуществляется рассылка.
    • +
    • Включите флажок Отправлять письма через скрытые копии, для того чтобы получатели не знали, кто еще получает отчеты из данной рассылки.
    +

    +

    Дополнительно

    +

    • Форматы сохранения отчетов (по умолчанию) - определяет форматы, в которых будут по умолчанию сохранены отчеты.  Выберите общие форматы для всех отчетов с помощью флажков. Можно выбрать несколько форматов.
    • В таблице ниже для каждого отчета можно задать свой набор форматов в колонке Форматы.
    • В колонке Отправлять пустой установите флажок для отправки сформированного отчета, даже если он пустой. По умолчанию флажок снят. Отчеты с графикой всегда считаются не пустыми.
    • +
    • +
      С помощью соответствующего флажка можно Транслитерировать имена файлов. В этом случае сохраненные файлы будут иметь имена, содержащие только латинские буквы и цифры, для возможности переноса между различными операционными системами. Например, файл Отчет.mxl будет сохранен с именем Otchet.mxl.
    • Установите флажок Архивировать в ZIP, для того чтобы архивировать сформированные отчеты в формате .zip. Рекомендуется включать архивацию, если отчеты отправляются по электронной почте, для снижения объема вложений.
      • Становится доступным поле Наименование архива (наименование архива формируется автоматически по указанному в поле шаблону).
      • @@ -108,18 +112,18 @@
      • Наименование рассылки.
    • При необходимости напишите Пароль архива.
    -
  • В поле Адрес ответа укажите E-mail адрес, на который будут высылаться ответы на рассылку. Можно указать обратный адрес, для того чтобы получателям рассылки можно было отправить на него предложения и замечания по поводу присылаемых в рассылке отчетов (с помощью кнопки Ответить в полученном письме с отчетами. Этот адрес невозможно использовать для анализа результатов рассылки, т.к. он предназначен для ответов реальных пользователей и письма с этого адреса не придут автоматически. Адрес ответа может отличаться от адреса системной учетной записи, с которой обычно осуществляется рассылка.
  • -
  • Включите флажок Отправлять письма через скрытые копии, для того чтобы получатели не знали, кто еще получает отчеты из данной рассылки. -
  • -
  • Группа - рассылки можно сгруппировать по различным признакам. Для того чтобы поместить рассылку в группу, выберите ее из списка.
  • Выполнение рассылки

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

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

    Просмотр событий рассылки

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

    Анализ результатов рассылки

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

    Анализ результатов рассылки

    Для контроля результатов рассылки можно использовать:

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

    diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Module.bsl index 24d40030b..811bda40f 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Module.bsl @@ -12,6 +12,13 @@ Процедура ПриЧтенииНаСервере(ТекущийОбъект) ПовторноеЧтение = (Кэш <> Неопределено); + // СтандартныеПодсистемы.ПодключаемыеКоманды + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда + МодульПодключаемыеКомандыКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКомандыКлиентСервер"); + МодульПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект); + КонецЕсли; + // Конец СтандартныеПодсистемы.ПодключаемыеКоманды + // Чтение хранилища значений Если ТекущийОбъект.ПисьмоВФорматеHTML Тогда СтруктураВложенийПисьмаВФорматеHTML = ТекущийОбъект.КартинкиПисьмаВФорматеHTML.Получить(); @@ -31,6 +38,9 @@ Строка.НеОтправлятьПустой = Не Строка.ОтправлятьЕслиПустой; КонецЦикла; + СоздатьРеквизитЭлементСертификатДляШифрования(); + ВидимостьДоступностьПаролейСертификатов(ЭтотОбъект); + // СтандартныеПодсистемы.УправлениеДоступом Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); @@ -49,6 +59,20 @@ Возврат; КонецЕсли; + // СтандартныеПодсистемы.ПодключаемыеКоманды + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда + МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды"); + МодульПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект); + КонецЕсли; + // Конец СтандартныеПодсистемы.ПодключаемыеКоманды + + // СтандартныеПодсистемы.ВерсионированиеОбъектов + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект); + КонецЕсли; + // Конец СтандартныеПодсистемы.ВерсионированиеОбъектов + Если Объект.ПометкаУдаления Тогда ЭтотОбъект.ТолькоПросмотр = Истина; КонецЕсли; @@ -78,6 +102,10 @@ ЭтоНовый = Объект.Ссылка.Пустая(); СозданКопированием = Не РассылкаОснование.Пустая(); + Если ЭтоНовый Тогда + СоздатьРеквизитЭлементСертификатДляШифрования(); + КонецЕсли; + // Добавление отчетов в табличную часть. Если Параметры.Свойство("ПрисоединяемыеОтчеты") И ТипЗнч(Параметры.ПрисоединяемыеОтчеты) = Тип("Массив") Тогда Модифицированность = Истина; @@ -116,11 +144,9 @@ ПараметрыЖурнала.Вставить("Метаданные", Метаданные.Справочники.РассылкиОтчетов); Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка заполнения автора рассылки: - |Пользователь ""%1"" (%2) не может быть автором.'"), - Строка(ТекущийПользователь), - Строка(ТипЗнч(ТекущийПользователь))); - + НСтр("ru = '%1 не может быть указан автором рассылки.'"), + ОбщегоНазначения.ПредметСтрокой(ТекущийПользователь)); + РассылкаОтчетов.ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Ошибка, Текст); Возврат; @@ -131,16 +157,23 @@ АвторОснования = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(РассылкаОснование, "Автор"); Если АвторОснования = ТекущийПользователь Тогда УстановитьПривилегированныйРежим(Истина); - Пароли = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(РассылкаОснование, "ПарольАрхива, FTPПароль"); + Пароли = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(РассылкаОснование, + "ПарольАрхива, FTPПароль"); УстановитьПривилегированныйРежим(Ложь); Если ЗначениеЗаполнено(Пароли.ПарольАрхива) Тогда - ПарольАрхива = ПарольСкрыт(); ПарольАрхиваИзменен = Истина; // См. обработку этого параметра в ПриЗаписиНаСервере. КонецЕсли; Если ЗначениеЗаполнено(Пароли.FTPПароль) Тогда FTPПароль = ПарольСкрыт(); FTPПарольИзменен = Истина; // См. обработку этого параметра в ПриЗаписиНаСервере. КонецЕсли; + Если Объект.Личная И ДоступноШифрованиеВложений Тогда + ПолучателиСертификаты = РассылкаОтчетов.ПолучитьСертификатыШифрованияПолучателейРассылки(Объект.Автор); + Если ПолучателиСертификаты.Количество() > 0 Тогда + ЭтотОбъект["СертификатДляШифрования"] = ПолучателиСертификаты[0].СертификатДляШифрования; + СертификатДляШифрованияИзменен = Истина; // См. обработку этого параметра в ПриЗаписиНаСервере. + КонецЕсли; + КонецЕсли; КонецЕсли; КонецЕсли; @@ -158,8 +191,14 @@ УстановитьПривилегированныйРежим(Истина); Пароли = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Объект.Ссылка, "ПарольАрхива, FTPПароль"); УстановитьПривилегированныйРежим(Ложь); - ПарольАрхива = ?(ЗначениеЗаполнено(Пароли.ПарольАрхива), ПарольСкрыт(), ""); + ПарольАрхива = ?(ЗначениеЗаполнено(Пароли.ПарольАрхива), Пароли.ПарольАрхива, ""); FTPПароль = ?(ЗначениеЗаполнено(Пароли.FTPПароль), ПарольСкрыт(), ""); + Если Объект.Личная И ДоступноШифрованиеВложений Тогда + ПолучателиСертификаты = РассылкаОтчетов.ПолучитьСертификатыШифрованияПолучателейРассылки(Объект.Автор); + Если ПолучателиСертификаты.Количество() > 0 Тогда + ЭтотОбъект["СертификатДляШифрования"] = ПолучателиСертификаты[0].СертификатДляШифрования; + КонецЕсли; + КонецЕсли; КонецЕсли; Пароли = Неопределено; @@ -236,11 +275,20 @@ Строка.НеОтправлятьПустой = Не Строка.ОтправлятьЕслиПустой; КонецЦикла; + Если ПравоДоступа("Изменение", Метаданные.Справочники.РассылкиОтчетов) Тогда + Элементы.ПарольАрхива.КнопкаВыбора = Истина; + Иначе + Элементы.ПарольАрхива.КнопкаВыбора = Ложь; + КонецЕсли; + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда Элементы.КомандаЗаписатьИЗакрыть.Отображение = ОтображениеКнопки.Картинка; Элементы.ДругиеСпособыДоставки.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно; Элементы.ИспользоватьСетевойКаталог.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно; Элементы.ИспользоватьПапку.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно; + Элементы.Переместить(Элементы.ФорматыПоУмолчанию, Элементы.ГруппаФорматыОтчетов, Элементы.ГруппаШапкаФорматыОтчетов); + Элементы.ФорматыПоУмолчанию.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; + Элементы.ПолучателиРассылки.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; КонецЕсли; КонецПроцедуры @@ -255,6 +303,14 @@ ПоказатьПредупреждение(, ТекстОшибкиПриОткрытии); Возврат; КонецЕсли; + + // СтандартныеПодсистемы.ПодключаемыеКоманды + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда + МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент"); + МодульПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект); + КонецЕсли; + // Конец СтандартныеПодсистемы.ПодключаемыеКоманды + Если ЗначениеЗаполнено(ТекстВсплывающегоОповещенияПриОткрытии) Тогда ПоказатьОповещениеПользователя(ТекстВсплывающегоОповещенияПриОткрытии, , , БиблиотекаКартинок.ВыполнитьЗадачу) КонецЕсли; @@ -358,6 +414,16 @@ КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + // СтандартныеПодсистемы.ПодключаемыеКоманды + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда + МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент"); + МодульПодключаемыеКомандыКлиент.ПослеЗаписи(ЭтотОбъект, Объект, ПараметрыЗаписи); + КонецЕсли; + // Конец СтандартныеПодсистемы.ПодключаемыеКоманды +КонецПроцедуры + &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) // Запись настроек текущей строки. @@ -553,6 +619,11 @@ УстановитьПривилегированныйРежим(Ложь); КонецЕсли; + Если ДоступноШифрованиеВложений И СертификатДляШифрованияИзменен Тогда + РегистрыСведений.СертификатыПолучателейРассылкиОтчетов.СохранитьСертификатДляПолучателяРассылки( + Объект.Автор, ЭтотОбъект["СертификатДляШифрования"]); + КонецЕсли; + КонецПроцедуры &НаСервере @@ -848,20 +919,12 @@ // Страница "Дополнительно" &НаКлиенте -Процедура ФорматыПоУмолчаниюНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) +Процедура ФорматыПоУмолчаниюНажатие(Элемент, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; Обработчик = Новый ОписаниеОповещения("ФорматыПоУмолчаниюЗавершениеВыбора", ЭтотОбъект); ВыбратьФормат(Кэш.ПустоеЗначениеОтчета, Обработчик); КонецПроцедуры -&НаКлиенте -Процедура ФорматыПоУмолчаниюОчистка(Элемент, СтандартнаяОбработка) - СтандартнаяОбработка = Ложь; - ОчиститьФормат(Кэш.ПустоеЗначениеОтчета); - ФорматыПоУмолчанию = СписокФорматовПоУмолчаниюПредставление; - ВидимостьДоступностьКорректность(ЭтотОбъект, "ФорматыПоУмолчанию"); -КонецПроцедуры - &НаКлиенте Процедура АрхивироватьПриИзменении(Элемент) ВидимостьДоступностьКорректность(ЭтотОбъект, "Архивировать"); @@ -889,11 +952,52 @@ КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура ИмяАрхиваОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + Если ВыбранноеЗначение = "НаименованиеДатаРассылки" Тогда + ДобавитьШаблон(); + + СтандартнаяОбработка = Ложь; + ТекущийЭлемент.ВыделенныйТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 от %2'"), "[НаименованиеРассылки]", "[ДатаВыполнения()]"); + + Переменные = Новый Структура; + Переменные.Вставить("Элемент", ТекущийЭлемент); + Переменные.Вставить("СтарыйТекст", ""); + Переменные.Вставить("Префикс", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 от %2'"), "[НаименованиеРассылки]", "[ДатаВыполнения(")); + Переменные.Вставить("Постфикс", ")]"); + Переменные.Вставить("ТекстФормата", ""); + Переменные.Вставить("СтарыйФрагментНайден", Ложь); + + Обработчик = Новый ОписаниеОповещения("ДобавитьИзменитьШаблонДатыРассылкиЗавершение", ЭтотОбъект, Переменные); + + Диалог = Новый КонструкторФорматнойСтроки; + Диалог.ДоступныеТипы = Новый ОписаниеТипов("Дата"); + Диалог.Текст = Переменные.ТекстФормата; + Диалог.Показать(Обработчик); + КонецЕсли; + +КонецПроцедуры + &НаКлиенте Процедура ПарольАрхиваПриИзменении(Элемент) ПарольАрхиваИзменен = Истина; КонецПроцедуры +&НаКлиенте +Процедура ПарольАрхиваНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + РаботаСПочтовымиСообщениямиКлиент.ПолеПароляНачалоВыбора(Элемент, ПарольАрхива, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_СертификатДляШифрованияПриИзменении(Элемент) + СертификатДляШифрованияИзменен = Истина; +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыОтчеты @@ -1248,9 +1352,6 @@ &НаКлиенте Процедура ПредварительныйПросмотрОтчета(Команда) - Если Не ПроверитьЗаполнение() Тогда - Возврат; - КонецЕсли; ОчиститьСообщения(); @@ -1740,11 +1841,11 @@ КонецЦикла; СформированныеОтчеты = СокрЛ(СформированныеОтчеты); - ПараметрыДоставки = Новый Структура("ТолькоУведомить, ПисьмоВФорматеHTML, Папка, СетевойКаталогWindows, Сервер, Порт, Каталог"); + ПараметрыДоставки = РассылкаОтчетовКлиентСервер.ПараметрыДоставки(); ЗаполнитьЗначенияСвойств(ПараметрыДоставки, Объект); - ПараметрыДоставки.Вставить("ВыполненаВПапку", Объект.ИспользоватьПапку); - ПараметрыДоставки.Вставить("ВыполненаВСетевойКаталог", Объект.ИспользоватьСетевойКаталог); - ПараметрыДоставки.Вставить("ВыполненаНаFTP", Объект.ИспользоватьFTPРесурс); + ПараметрыДоставки.ВыполненаВПапку = Объект.ИспользоватьПапку; + ПараметрыДоставки.ВыполненаВСетевойКаталог = Объект.ИспользоватьСетевойКаталог; + ПараметрыДоставки.ВыполненаНаFTP = Объект.ИспользоватьFTPРесурс; СпособДоставки = РассылкаОтчетовКлиентСервер.ПредставлениеСпособовДоставки(ПараметрыДоставки); ПараметрыШаблона = Новый Структура; @@ -1764,11 +1865,13 @@ &НаКлиенте Процедура ПроверитьВозможностьРассылки(Команда) - ПараметрыДоставки = Новый Структура; - ПараметрыДоставки.Вставить("ИспользоватьПапку", Объект.ИспользоватьПапку); - ПараметрыДоставки.Вставить("ИспользоватьСетевойКаталог", Объект.ИспользоватьСетевойКаталог); - ПараметрыДоставки.Вставить("ИспользоватьFTPРесурс", Объект.ИспользоватьFTPРесурс); - ПараметрыДоставки.Вставить("ИспользоватьЭлектроннуюПочту", Объект.ИспользоватьЭлектроннуюПочту); + ПараметрыДоставки = РассылкаОтчетовКлиентСервер.ПараметрыДоставки(); + ПараметрыДоставки.ДатаВыполнения = ОбщегоНазначенияКлиент.ДатаСеанса(); + ПараметрыДоставки.Автор = Объект.Автор; + ПараметрыДоставки.ИспользоватьПапку = Объект.ИспользоватьПапку; + ПараметрыДоставки.ИспользоватьСетевойКаталог = Объект.ИспользоватьСетевойКаталог; + ПараметрыДоставки.ИспользоватьFTPРесурс = Объект.ИспользоватьFTPРесурс; + ПараметрыДоставки.ИспользоватьЭлектроннуюПочту = Объект.ИспользоватьЭлектроннуюПочту; ПроверитьРассылку(ПараметрыДоставки); @@ -1802,6 +1905,13 @@ //////////////////////////////////////////////////////////////////////////////// // Страница "Дополнительно" +&НаКлиенте +Процедура СброситьФорматПоУмолчанию(Команда) + ОчиститьФормат(Кэш.ПустоеЗначениеОтчета); + ФорматыПоУмолчанию = СписокФорматовПоУмолчаниюПредставление; + ВидимостьДоступностьКорректность(ЭтотОбъект, "ФорматыПоУмолчанию"); +КонецПроцедуры + &НаКлиенте Процедура СнятьПометкиОтправлятьЕслиПустой(Команда) Если Объект.Отчеты.Количество() > 0 Тогда @@ -1824,6 +1934,40 @@ КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура СоздатьПарольАрхива(Команда) + + Если ЗначениеЗаполнено(ПарольАрхива) Тогда + + ПоказатьВопрос( + Новый ОписаниеОповещения("ПриСозданииПароляАрхива", ЭтотОбъект), + НСтр("ru = 'Пароль для архива уже установлен. Установить новый пароль?'"), + РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); + + Возврат; + + КонецЕсли; + + ПарольАрхива = СоздатьПароль(); + ПарольАрхиваИзменен = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура ПаролиШифрование(Команда) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("АдресПолучателей", ПоместитьПолучателейВХранилище()); + ПараметрыФормы.Вставить("Архивировать", Объект.Архивировать); + ПараметрыФормы.Вставить("ТипПолучателейРассылки", ТипПолучателейРассылки); + ПараметрыФормы.Вставить("ВидПочтовогоАдресаПолучателей", Объект.ВидПочтовогоАдресаПолучателей); + ПараметрыФормы.Вставить("Ссылка", Объект.Ссылка); + ПараметрыФормы.Вставить("НаименованиеРассылки", Объект.Наименование); + ОткрытьФорму("Справочник.РассылкиОтчетов.Форма.ПаролиШифрование", ПараметрыФормы, ЭтотОбъект, , , , , + РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -1942,30 +2086,30 @@ ОчиститьСообщения(); // Формирование параметров доставки. - ПараметрыДоставки.Вставить("Рассылка", Объект.Наименование); + ПараметрыДоставки.Рассылка = Объект.Наименование; // Папка. Если ПараметрыДоставки.ИспользоватьПапку Тогда - ПараметрыДоставки.Вставить("Папка", Объект.Папка); + ПараметрыДоставки.Папка = Объект.Папка; КонецЕсли; // Сетевой каталог. Если ПараметрыДоставки.ИспользоватьСетевойКаталог Тогда - ПараметрыДоставки.Вставить("СетевойКаталогWindows", Объект.СетевойКаталогWindows); - ПараметрыДоставки.Вставить("СетевойКаталогLinux", Объект.СетевойКаталогLinux); + ПараметрыДоставки.СетевойКаталогWindows = Объект.СетевойКаталогWindows; + ПараметрыДоставки.СетевойКаталогLinux = Объект.СетевойКаталогLinux; КонецЕсли; // FTP. Если ПараметрыДоставки.ИспользоватьFTPРесурс Тогда - ПараметрыДоставки.Вставить("Владелец", Объект.Ссылка); - ПараметрыДоставки.Вставить("Сервер", Объект.FTPСервер); - ПараметрыДоставки.Вставить("Порт", Объект.FTPПорт); - ПараметрыДоставки.Вставить("Логин", Объект.FTPЛогин); + ПараметрыДоставки.Владелец = Объект.Ссылка; + ПараметрыДоставки.Сервер = Объект.FTPСервер; + ПараметрыДоставки.Порт = Объект.FTPПорт; + ПараметрыДоставки.Логин = Объект.FTPЛогин; Если FTPПарольИзменен Тогда - ПараметрыДоставки.Вставить("Пароль", FTPПароль); + ПараметрыДоставки.Пароль = FTPПароль; КонецЕсли; - ПараметрыДоставки.Вставить("Каталог", Объект.FTPКаталог); - ПараметрыДоставки.Вставить("ПассивноеСоединение", Объект.FTPПассивноеСоединение); + ПараметрыДоставки.Каталог = Объект.FTPКаталог; + ПараметрыДоставки.ПассивноеСоединение = Объект.FTPПассивноеСоединение; КонецЕсли; Обработчик = Новый ОписаниеОповещения("ПроверитьРассылкуПослеВыбораПолучателей", ЭтотОбъект, ПараметрыДоставки); @@ -1988,23 +2132,14 @@ Возврат; КонецЕсли; - ПараметрыДоставки.Вставить("УчетнаяЗапись", Объект.УчетнаяЗапись); - ПараметрыДоставки.Вставить("СкрытыеКопии", Объект.СкрытыеКопии); - ПараметрыДоставки.Вставить("ШаблонТемы", НСтр("ru = 'Тестовое сообщение 1С:Предприятие'")); - ПараметрыДоставки.Вставить("ШаблонТекста", НСтр("ru = 'Это сообщение отправлено системой рассылок 1С:Предприятие.'") + Символы.ПС + Кэш.ЗаголовокСистемы); - ПараметрыДоставки.Вставить("Получатели", РезультатВыбора); - ПараметрыДоставки.Вставить("ТолькоУведомить", Ложь); - ПараметрыДоставки.Вставить("ЗаполнитьСпособДоставкиВШаблонеСообщения", Ложь); - ПараметрыДоставки.Вставить("ЗаполнитьСформированныеОтчетыВШаблонеСообщения", Ложь); - ПараметрыДоставки.Вставить("ЗаполнитьПолучателяВШаблонеТемы", Ложь); - ПараметрыДоставки.Вставить("ЗаполнитьПолучателяВШаблонеСообщения", Ложь); - ПараметрыДоставки.Вставить("ПараметрыПисьма", Новый Структура); - ПараметрыДоставки.Вставить("Соединение", Неопределено); - + ПараметрыДоставки.УчетнаяЗапись = Объект.УчетнаяЗапись; + ПараметрыДоставки.СкрытыеКопии = Объект.СкрытыеКопии; + ПараметрыДоставки.ШаблонТемы = НСтр("ru = 'Тестовое сообщение 1С:Предприятие'"); + ПараметрыДоставки.ШаблонТекста = НСтр("ru = 'Это сообщение отправлено системой рассылок 1С:Предприятие.'") + + Символы.ПС + Кэш.ЗаголовокСистемы; + ПараметрыДоставки.Получатели = РезультатВыбора; КонецЕсли; - ПараметрыДоставки.Вставить("ДобавлятьСсылки", ""); - РезультатВыполнения = ПроверитьСпособДоставки(Объект.Ссылка, ПараметрыДоставки); ПараметрыПредупреждения = Новый Структура("Заголовок, Текст, Подробно, Ссылка, ИспользоватьЭлектроннуюПочту"); @@ -2343,6 +2478,16 @@ КонецПроцедуры +&НаКлиенте +Процедура ПриСозданииПароляАрхива(Ответ, Контекст) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + ПарольАрхива = СоздатьПароль(); + ПарольАрхиваИзменен = Истина; + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Клиент, Сервер @@ -2389,7 +2534,7 @@ Элементы.УчетнаяЗапись.АвтоОтметкаНезаполненного = Объект.Подготовлена И Объект.ИспользоватьЭлектроннуюПочту; КонецЕсли; - + Если Изменения = "" Или Изменения = "ВидРассылки" Тогда // Корректность Если Объект.Личная И Объект.Персонализирована Тогда @@ -2458,6 +2603,8 @@ Элементы.ИспользоватьПолучателяРассылкиВНастройкеОтчета2.Видимость = Объект.Персонализирована; Элементы.ИспользоватьПолучателяРассылкиВНастройкеОтчета3.Видимость = Объект.Персонализирована; Элементы.ИспользоватьПолучателяРассылкиВНастройкеОтчета4.Видимость = Объект.Персонализирована; + + ВидимостьДоступностьПаролейСертификатов(Форма); КонецЕсли; Если Изменения = "" Или Изменения = "Отчеты" Тогда @@ -2491,9 +2638,10 @@ КонецЕсли; Если Изменения = "" Или Изменения = "ПолучателиРассылки" Тогда - ПредставлениеПолучателей = ПредставлениеПолучателей(Форма); - Форма.ПолучателиРассылки = ПредставлениеПолучателей.Краткое; - Элементы.ПолучателиРассылки.Подсказка = ПредставлениеПолучателей.Полное; + Если Форма.ВидРассылки <> "Личная" Тогда + ПредставлениеПолучателей = ПредставлениеПолучателей(Форма); + Форма.ПолучателиРассылки = ПредставлениеПолучателей.Краткое; + КонецЕсли; КонецЕсли; Если Изменения = "" @@ -2533,8 +2681,10 @@ КонецЕсли; Если Изменения = "" Или Изменения = "Архивировать" Тогда - Элементы.ИмяАрхива.Доступность = Объект.Архивировать; - Элементы.ПарольАрхива.Доступность = Объект.Архивировать; + Элементы.ИмяАрхива.Доступность = Объект.Архивировать; + Элементы.ПарольАрхива.Доступность = Объект.Архивировать; + Элементы.СоздатьПарольАрхива.Доступность = Объект.Архивировать; + ВидимостьДоступностьПаролейСертификатов(Форма); КонецЕсли; Если Изменения = "" Или Изменения = "ВыполнятьПоРасписанию" Тогда @@ -2640,7 +2790,7 @@ КонецЕсли; Если Изменения = "" Или Изменения = "ФорматыПоУмолчанию" Тогда - Элементы.ФорматыПоУмолчанию.КнопкаОчистки = (Форма.ФорматыПоУмолчанию <> Форма.СписокФорматовПоУмолчаниюПредставление); + Элементы.СброситьФорматПоУмолчанию.Видимость = (Форма.ФорматыПоУмолчанию <> Форма.СписокФорматовПоУмолчаниюПредставление); КонецЕсли; Если Изменения = "" Или Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаРасписание Тогда @@ -2651,6 +2801,43 @@ КонецЕсли; КонецПроцедуры +&НаКлиентеНаСервереБезКонтекста +Процедура ВидимостьДоступностьПаролейСертификатов(Форма) + Объект = Форма.Объект; + Элементы = Форма.Элементы; + + Если Форма.ДоступноШифрованиеВложений Тогда + Если Объект.Персонализирована Тогда + Элементы["ГруппаСертификатДляШифрования"].Видимость = Ложь; + Если Объект.Архивировать Тогда + Элементы.ПаролиШифрование.Заголовок = НСтр("ru = 'Пароли и шифрование'"); + Иначе + Элементы.ПаролиШифрование.Заголовок = НСтр("ru = 'Шифрование'"); + КонецЕсли; + Элементы.ПаролиШифрование.Видимость = Истина; + Элементы.ГруппаПарольАрхива.Видимость = Ложь; + Иначе + Элементы["ГруппаСертификатДляШифрования"].Видимость = ?(Форма.Объект.Личная, Истина, Ложь); + Элементы.ГруппаПарольАрхива.Видимость = Истина; + Элементы.ПаролиШифрование.Видимость = Ложь; + КонецЕсли; + Иначе + Если Объект.Персонализирована Тогда + Элементы.ПаролиШифрование.Заголовок = НСтр("ru = 'Пароли'"); + Элементы.ПаролиШифрование.Видимость = Истина; + Элементы.ГруппаПарольАрхива.Видимость = Ложь; + Элементы.ПаролиШифрование.Доступность = Объект.Архивировать; + Иначе + Элементы.ГруппаПарольАрхива.Видимость = Истина; + Элементы.ПаролиШифрование.Видимость = Ложь; + Если Элементы.Найти("ГруппаСертификатДляШифрования") <> Неопределено Тогда + Элементы["ГруппаСертификатДляШифрования"].Видимость = Ложь; + КонецЕсли; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + // Формирует представление расписания регламентного задания. // // Параметры: @@ -2664,6 +2851,11 @@ ПредставлениеРасписания = Строка(Расписание); ПредставлениеРасписания = ВРег(Лев(ПредставлениеРасписания, 1)) + Сред(ПредставлениеРасписания, 2); ПредставлениеРасписания = СтрЗаменить(СтрЗаменить(ПредставлениеРасписания, " ", " "), " ]", "]") + "."; + Если ЗначениеЗаполнено(Расписание.ВремяНачала) Или ЗначениеЗаполнено(Расписание.ВремяКонца) Тогда + Дополнение = ДополнениеПредставленияРасписанияВМоделиСервиса(); + ПредставлениеРасписания = ?(ЗначениеЗаполнено(Дополнение), ПредставлениеРасписания + Символы.ПС + Дополнение, + ПредставлениеРасписания); + КонецЕсли; Возврат ПредставлениеРасписания; КонецФункции @@ -2676,7 +2868,11 @@ ПредставлениеОтключенных = РассылкаОтчетовКлиентСервер.ПредставлениеСписка(Отключенные, "Получатель", 0); Остаток = 75 - ПредставлениеОтключенных.ДлинаКраткого; Представление = РассылкаОтчетовКлиентСервер.ПредставлениеСписка(Включенные, "Получатель", Остаток); - Если Представление.Всего = 0 Тогда + + КоличествоПолучателей = КоличествоПолучателейСУчетомГрупп(Форма.Объект.Получатели, + Форма.Объект.ТипПолучателейРассылки); + + Если КоличествоПолучателей.Всего = 0 Тогда Представление.Краткое = НСтр("ru = '<Укажите получателей>'"); Возврат Представление; КонецЕсли; @@ -2688,7 +2884,7 @@ Представление.Краткое = Представление.Краткое + ", ..."; КонецЕсли; - Если ПредставлениеОтключенных.Всего > 0 Тогда + Если КоличествоПолучателей.Исключены > 0 Тогда ШаблонРазделения = НСтр("ru = 'Кроме'")+ ": "; Представление.Полное = Представление.Полное + ";" + Символы.ПС + ШаблонРазделения + ПредставлениеОтключенных.Полное; Если Представление.ДлинаКраткого + ПредставлениеОтключенных.ДлинаКраткого <= 75 Тогда @@ -2697,15 +2893,15 @@ КонецЕсли; Если Представление.МаксимумПревышен Или ПредставлениеОтключенных.МаксимумПревышен Тогда - Если ПредставлениеОтключенных.Всего > 0 Тогда + Если КоличествоПолучателей.Исключены > 0 Тогда ШаблонОкончания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '(всего %1, исключая %2)'"), - Представление.Всего, - ПредставлениеОтключенных.Всего); + КоличествоПолучателей.Всего, + КоличествоПолучателей.Исключены); Иначе ШаблонОкончания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '(всего %1)'"), - Представление.Всего); + КоличествоПолучателей.Всего); КонецЕсли; Представление.Краткое = Представление.Краткое + "; " + ШаблонОкончания; КонецЕсли; @@ -2713,6 +2909,13 @@ Возврат Представление; КонецФункции +&НаСервереБезКонтекста +Функция КоличествоПолучателейСУчетомГрупп(Знач Получатели, Знач ИдентификаторОбъектаМетаданных) + + Возврат Справочники.РассылкиОтчетов.КоличествоПолучателейСУчетомГрупп(Получатели, ИдентификаторОбъектаМетаданных); + +КонецФункции + &НаКлиентеНаСервереБезКонтекста Процедура УстановитьМодифицированностьФормы(Форма, Поле = "", ПутьКДанным = "", Текст = "") Если Не Форма.Модифицированность Тогда @@ -2799,6 +3002,29 @@ КонецФункции +&НаСервереБезКонтекста +Функция СоздатьПароль() + + СвойстваПароля = Пользователи.СвойстваПароля(); + СвойстваПароля.НаименьшаяДлина = 8; + СвойстваПароля.Сложный = Истина; + СвойстваПароля.УчестьНастройки = "ДляПользователей"; + + Возврат Пользователи.СоздатьПароль(СвойстваПароля); + +КонецФункции + +&НаСервереБезКонтекста +Функция ДополнениеПредставленияРасписанияВМоделиСервиса() + + Если ОбщегоНазначения.РазделениеВключено() Тогда + Возврат НСтр("ru = 'Точное время запуска может отличаться от указанного.'"); + Иначе + Возврат ""; + КонецЕсли; + +КонецФункции + &НаСервере Функция ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтроки, ДобавитьДежурнуюФразу = Истина, Знач ПользовательскиеНастройки = Неопределено) // Сохранение настроек предыдущего отчета. @@ -3071,7 +3297,9 @@ &НаСервере Функция ПроверитьСпособДоставки(Рассылка, Знач ПараметрыДоставки) - ПараметрыДоставки.Вставить("ДатаВыполнения", ТекущаяДатаСеанса()); + + ПараметрыДоставки.ДатаВыполнения = ТекущаяДатаСеанса(); + ПараметрыДоставки.РежимТестирования = Истина; // Инициализация параметров записи в журнал регистрации. УстановитьПривилегированныйРежим(Истина); @@ -3084,20 +3312,11 @@ УстановитьПривилегированныйРежим(Ложь); - // Добавление параметров доставки для записи результатов выполнения. - ПараметрыДоставки.Вставить("РежимТестирования", Истина); - ПараметрыДоставки.Вставить("БылиОшибки", Ложь); - ПараметрыДоставки.Вставить("БылиПредупреждения", Ложь); - ПараметрыДоставки.Вставить("ВыполненаВПапку", Ложь); - ПараметрыДоставки.Вставить("ВыполненаВСетевойКаталог", Ложь); - ПараметрыДоставки.Вставить("ВыполненаНаFTP", Ложь); - ПараметрыДоставки.Вставить("ВыполненаПоЭлектроннойПочте", Ложь); - - // Запись пустого табличного документа в html 4. + // Запись пустого табличного документа в html 5. ПолноеИмяФайла = ПолучитьИмяВременногоФайла(".html"); ТабДок = Новый ТабличныйДокумент; - ТабДок.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.HTML4); + ТабДок.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.HTML5); // Формирование вложений Файл = Новый Файл(ПолноеИмяФайла); @@ -3106,7 +3325,7 @@ Вложения.Вставить(Файл.Имя, Файл.ПолноеИмя); // Доставка - НачатьТранзакцию(); + НачатьТранзакцию(); // АПК:326 Транзакция открывается только для целей отмены. Попытка РассылкаОтчетов.ВыполнитьДоставку(ПараметрыЖурнала, ПараметрыДоставки, Вложения); ОтменитьТранзакцию(); // После окончания теста откатываются все изменения в базе. @@ -3120,6 +3339,8 @@ УдалитьФайлы(Вложение.Значение); КонецЦикла; + УдалитьФайлы(ПолноеИмяФайла); + РезультатВыполнения = Новый Структура("Текст, Подробно", "", ""); Если ПараметрыЖурнала.МассивОшибок.Количество() = 0 Тогда @@ -3132,6 +3353,11 @@ Возврат РезультатВыполнения; КонецФункции +&НаСервере +Функция ПоместитьПолучателейВХранилище() + Возврат ПоместитьВоВременноеХранилище(Объект.Получатели.Выгрузить(), УникальныйИдентификатор); +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Сервер @@ -3252,9 +3478,9 @@ // Умолчания для полей, поддерживающих шаблоны заполнения. Шаблоны = Новый ФиксированнаяСтруктура("Тема, Текст, ИмяАрхива", - РассылкаОтчетов.ШаблонТемы(), + РассылкаОтчетовКлиентСервер.ШаблонТемы(), РассылкаОтчетов.ШаблонТекста(), - РассылкаОтчетов.ШаблонИмениАрхива()); + РассылкаОтчетовКлиентСервер.ШаблонИмениАрхива()); // Структура кэша. Кэш = Новый Структура; @@ -3296,7 +3522,7 @@ УстановитьПривилегированныйРежим(Истина); ИдентификаторЗадания = ?(СозданКопированием, РассылкаОснование.РегламентноеЗадание, Объект.РегламентноеЗадание); Если ТипЗнч(ИдентификаторЗадания) = Тип("УникальныйИдентификатор") Тогда - Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания); + Задание = РегламентныеЗаданияСервер.Задание(ИдентификаторЗадания); Если Задание <> Неопределено Тогда Расписание = Задание.Расписание; Если Объект.ПериодичностьРасписания <> Перечисления.ПериодичностиРасписанийРассылокОтчетов.Произвольное Тогда @@ -3539,6 +3765,46 @@ ИдентификаторТекущейСтрокиТаблицыОтчетов = -1; КонецПроцедуры +&НаСервере +Процедура СоздатьРеквизитЭлементСертификатДляШифрования() + + Если НЕ РассылкаОтчетов.ДоступноШифрованиеВложений() Тогда + ДоступноШифрованиеВложений = Ложь; + Возврат; + КонецЕсли; + + ДоступноШифрованиеВложений = Истина; + + Если Элементы.Найти("ГруппаСертификатДляШифрования") <> Неопределено Тогда + Возврат; + КонецЕсли; + + МассивДобавляемыхРеквизитов = Новый Массив; + МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("СертификатДляШифрования", + Новый ОписаниеТипов("СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования"),, + НСтр("ru = 'Сертификат для шифрования'"))); + + ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); + + Группа = Элементы.Добавить("ГруппаСертификатДляШифрования", Тип("ГруппаФормы"), Элементы.СтраницаДополнительно); + Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа; + Группа.Заголовок = НСтр("ru = 'Группа сертификат для шифрования'"); + Группа.ОтображатьЗаголовок = Ложь; + Группа.РазрешитьИзменениеСостава = Ложь; + Группа.Отображение = ОтображениеОбычнойГруппы.Нет; + Группа.Объединенная = Истина; + Группа.СквозноеВыравнивание = СквозноеВыравнивание.НеИспользовать; + Элементы.Переместить(Группа, Элементы.СтраницаДополнительно, Элементы.ДополнительныеПараметры); + + Элемент = Элементы.Добавить("СертификатДляШифрования", Тип("ПолеФормы"), Группа); + Элемент.Заголовок = НСтр("ru = 'Сертификат для шифрования'"); + Элемент.ПутьКДанным = "СертификатДляШифрования"; + Элемент.Ширина = 70; + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.УстановитьДействие("ПриИзменении", "Подключаемый_СертификатДляШифрованияПриИзменении"); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Запись объекта @@ -3693,6 +3959,37 @@ КонецПроцедуры +// СтандартныеПодсистемы.ПодключаемыеКоманды +&НаКлиенте +Процедура Подключаемый_ВыполнитьКоманду(Команда) + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда + МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент"); + МодульПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт + ВыполнитьКомандуНаСервере(ПараметрыВыполнения); +КонецПроцедуры + +&НаСервере +Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения) + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда + МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды"); + МодульПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ОбновитьКоманды() + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда + МодульПодключаемыеКомандыКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиентСервер"); + МодульПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект); + КонецЕсли; +КонецПроцедуры +// Конец СтандартныеПодсистемы.ПодключаемыеКоманды + //////////////////////////////////////////////////////////////////////////////// // Копия команды "Выполнить сейчас" для поддержки асинхронности. diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Help/ru.html b/SSL/src/Catalogs/РассылкиОтчетов/Help/ru.html index 5d310403e..0dd624918 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Help/ru.html +++ b/SSL/src/Catalogs/РассылкиОтчетов/Help/ru.html @@ -1,22 +1,50 @@

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

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

    -

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

    -

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

    -

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

    -

    Например, одна рассылка может быть предназначена исключительно для директора и руководства фирмы. Другая рассылка может содержать отчеты, которые ежедневно отправляются некоторым сотрудникам. Третья рассылка может содержать отчеты, формируемые для контрагентов по их требованию.

    +

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

    +

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

    +

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

    +

    + + + + + + + +

    +

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

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

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

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

        Запуск рассылок

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

        Просмотр событий рассылки

        -
        • -
          Для расследования ошибок, возникших при выполнении рассылки, предусмотрена кнопка События рассылки, которая показывает события журнала регистрации с отбором по этой рассылке.

        См. также:

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

        Отчеты

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

        +

        См. также:

        \ No newline at end of file diff --git a/SSL/src/Catalogs/РассылкиОтчетов/ManagerModule.bsl b/SSL/src/Catalogs/РассылкиОтчетов/ManagerModule.bsl index ede18b2c5..d5060080f 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/ManagerModule.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/ManagerModule.bsl @@ -51,12 +51,167 @@ // Конец СтандартныеПодсистемы.УправлениеДоступом +// СтандартныеПодсистемы.ВариантыОтчетов + +// Определяет список команд отчетов. +// +// Параметры: +// КомандыОтчетов - ТаблицаЗначений - таблица с командами отчетов. Для изменения. +// См. описание 1 параметра процедуры ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов(). +// Параметры - Структура - вспомогательные параметры. Для чтения. +// См. описание 2 параметра процедуры ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов(). +// +Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт + + Если ПравоДоступа("Просмотр", Метаданные.Отчеты.КонтрольРассылкиОтчетов) + И ПолучитьФункциональнуюОпцию("ХранитьИсториюРассылкиОтчетов") Тогда + Команда = КомандыОтчетов.Добавить(); + Команда.Представление = НСтр("ru = 'Контроль рассылки отчетов'"); + Команда.КлючВарианта = "КонтрольРассылкиОтчетов"; + Команда.Картинка = БиблиотекаКартинок.Отчет; + Команда.МножественныйВыбор = Ложь; + Команда.Менеджер = "Отчет.КонтрольРассылкиОтчетов"; + Команда.ТипПараметра = Новый ОписаниеТипов("СправочникСсылка.РассылкиОтчетов"); + КонецЕсли; + +КонецПроцедуры + +// Конец СтандартныеПодсистемы.ВариантыОтчетов + +// СтандартныеПодсистемы.Печать + +// Формирует печатные формы. +// +// Параметры: +// МассивОбъектов - см. УправлениеПечатьюПереопределяемый.ПриПечати.МассивОбъектов +// ПараметрыПечати - см. УправлениеПечатьюПереопределяемый.ПриПечати.ПараметрыПечати +// КоллекцияПечатныхФорм - см. УправлениеПечатьюПереопределяемый.ПриПечати.КоллекцияПечатныхФорм +// ОбъектыПечати - см. УправлениеПечатьюПереопределяемый.ПриПечати.ОбъектыПечати +// ПараметрыВывода - см. УправлениеПечатьюПереопределяемый.ПриПечати.ПараметрыВывода +// +Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ВывестиТабличныйДокументВКоллекцию( + КоллекцияПечатныхФорм, + "ПаролиРассылокОтчетов", + НСтр("ru = 'Пароли для рассылки отчетов'"), + ПечатнаяФормаПаролиРассылкиОтчетов(ПараметрыПечати, ОбъектыПечати), + , + "Справочник.РассылкиОтчетов.ПФ_MXL_ПаролиРассылкиОтчетов", НСтр("ru = 'Пароли для рассылки отчетов'")); + КонецЕсли; + +КонецПроцедуры + +// Конец СтандартныеПодсистемы.Печать + +// СтандартныеПодсистемы.ВерсионированиеОбъектов + +// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов. +// +// Параметры: +// Настройки - Структура - настройки подсистемы. +// +Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт +КонецПроцедуры + +// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов + #КонецОбласти #КонецОбласти #Область СлужебныеПроцедурыИФункции +// Регистрирует к обработке рассылки отчетов. +// +Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | РассылкиОтчетовФорматыОтчетов.Ссылка КАК Ссылка + |ИЗ + | Справочник.РассылкиОтчетов.ФорматыОтчетов КАК РассылкиОтчетовФорматыОтчетов + |ГДЕ + | РассылкиОтчетовФорматыОтчетов.Формат = &Формат + |СГРУППИРОВАТЬ ПО + | РассылкиОтчетовФорматыОтчетов.Ссылка"; + + Запрос.УстановитьПараметр("Формат", Перечисления.ФорматыСохраненияОтчетов.HTML4); + РезультатЗапроса = Запрос.Выполнить().Выгрузить(); + + ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, + РезультатЗапроса.ВыгрузитьКолонку("Ссылка")); + +КонецПроцедуры + +Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию(Параметры) Экспорт + + РассылкаОтчетовСсылка = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, "Справочник.РассылкиОтчетов"); + + ПроблемныхОбъектов = 0; + ОбъектовОбработано = 0; + + Пока РассылкаОтчетовСсылка.Следующий() Цикл + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.РассылкиОтчетов"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", РассылкаОтчетовСсылка.Ссылка); + + НачатьТранзакцию(); + Попытка + + Блокировка.Заблокировать(); + + РассылкаОтчетовОбъект = РассылкаОтчетовСсылка.Ссылка.ПолучитьОбъект(); // СправочникОбъект.РассылкиОтчетов + + ПараметрыОтбора = Новый Структура; + ПараметрыОтбора.Вставить("Формат", Перечисления.ФорматыСохраненияОтчетов.HTML4); + + МассивСтрокФорматов = РассылкаОтчетовОбъект.ФорматыОтчетов.НайтиСтроки(ПараметрыОтбора); + + Для Каждого Строка Из МассивСтрокФорматов Цикл + Строка.Формат = Перечисления.ФорматыСохраненияОтчетов.HTML; + КонецЦикла; + + ОбновлениеИнформационнойБазы.ЗаписатьДанные(РассылкаОтчетовОбъект); + ОбъектовОбработано = ОбъектовОбработано + 1; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + + // Если не удалось обработать одну из рассылок отчетов, повторяем попытку снова. + ПроблемныхОбъектов = ПроблемныхОбъектов + 1; + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось обработать рассылку отчетов %1 по причине: + |%2'"), + РассылкаОтчетовСсылка.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, + Метаданные.Справочники.РассылкиОтчетов, РассылкаОтчетовСсылка.Ссылка, ТекстСообщения); + КонецПопытки; + КонецЦикла; + + Параметры.ОбработкаЗавершена = ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, "Справочник.РассылкиОтчетов"); + + Если ОбъектовОбработано = 0 И ПроблемныхОбъектов <> 0 Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось обработать некоторые рассылки отчетов (пропущены): %1'"), + ПроблемныхОбъектов); + ВызватьИсключение ТекстСообщения; + Иначе + ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Информация, + Метаданные.Справочники.ВидыКонтактнойИнформации,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Обработана очередная порция рассылок отчетов: %1'"), + ОбъектовОбработано)); + КонецЕсли; + +КонецПроцедуры + // Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов // // Параметры: @@ -83,6 +238,251 @@ КонецПроцедуры +Функция КоличествоПолучателейСУчетомГрупп(Знач Получатели, Знач ИдентификаторОбъектаМетаданных) Экспорт + + КоличествоПолучателей = Новый Структура("Всего, Исключены", 0, 0); + + Если ИдентификаторОбъектаМетаданных = Неопределено Тогда + Возврат КоличествоПолучателей; + КонецЕсли; + + ПолучателиМетаданные = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ИдентификаторОбъектаМетаданных, Ложь); + + Если ПолучателиМетаданные = Неопределено Тогда + Возврат КоличествоПолучателей; + КонецЕсли; + + ТипПолучателей = ИдентификаторОбъектаМетаданных.КлючОбъектаМетаданных.Получить(); + + Запрос = Новый Запрос; + + Если ТипПолучателей = Тип("СправочникСсылка.Пользователи") Тогда + + ТекстЗапроса = + "ВЫБРАТЬ + | ТаблицаПолучателей.Получатель, + | ТаблицаПолучателей.Исключен + |ПОМЕСТИТЬ ТаблицаПолучателей + |ИЗ + | &ТаблицаПолучателей КАК ТаблицаПолучателей + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | Пользователь.Ссылка КАК Получатель, + | МАКСИМУМ(ТаблицаПолучателей.Исключен) КАК Исключен + |ПОМЕСТИТЬ Получатели + |ИЗ + | ТаблицаПолучателей КАК ТаблицаПолучателей + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ПО СоставыГруппПользователей.ГруппаПользователей = ТаблицаПолучателей.Получатель + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи + | ПО Пользователи.Ссылка = СоставыГруппПользователей.Пользователь + |ГДЕ + | НЕ Пользователи.ПометкаУдаления + | И НЕ Пользователи.Недействителен + | И НЕ Пользователи.Служебный + |СГРУППИРОВАТЬ ПО + | Пользователь.Ссылка + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | КОЛИЧЕСТВО(Получатели.Получатель) КАК КоличествоИсключены, + | 0 КАК КоличествоОтправлять + |ПОМЕСТИТЬ КоличествоПолучателей + |ИЗ + | Получатели КАК Получатели + |ГДЕ + | Получатели.Исключен + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | 0 КАК КоличествоИсключены, + | КОЛИЧЕСТВО(Получатели.Получатель) КАК КоличествоОтправлять + |ИЗ + | Получатели КАК Получатели + |ГДЕ + | НЕ Получатели.Исключен + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | СУММА(КоличествоПолучателей.КоличествоИсключены) КАК КоличествоИсключены, + | СУММА(КоличествоПолучателей.КоличествоОтправлять) КАК КоличествоОтправлять + |ИЗ + | КоличествоПолучателей КАК КоличествоПолучателей"; + + Иначе + + ТекстЗапроса = + "ВЫБРАТЬ + | ТаблицаПолучателей.Получатель, + | ТаблицаПолучателей.Исключен + |ПОМЕСТИТЬ ТаблицаПолучателей + |ИЗ + | &ТаблицаПолучателей КАК ТаблицаПолучателей + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | КОЛИЧЕСТВО(ИСТИНА) КАК КоличествоИсключены, + | СУММА(0) КАК КоличествоОтправлять + |ПОМЕСТИТЬ КоличествоПолучателей + |ИЗ + | Справочник.Пользователи КАК Получатели + |ГДЕ + | Получатели.Ссылка В ИЕРАРХИИ + | (ВЫБРАТЬ + | Получатель + | ИЗ + | ТаблицаПолучателей + | ГДЕ + | Исключен) + | И НЕ Получатели.ПометкаУдаления + | И &ЭтоНеГруппа + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | СУММА(0) КАК КоличествоИсключены, + | КОЛИЧЕСТВО(ЛОЖЬ) КАК КоличествоОтправлять + |ИЗ + | Справочник.Пользователи КАК Получатели + |ГДЕ + | Получатели.Ссылка В ИЕРАРХИИ + | (ВЫБРАТЬ + | Получатель + | ИЗ + | ТаблицаПолучателей + | ГДЕ + | НЕ Исключен) + | И НЕ Получатели.ПометкаУдаления + | И &ЭтоНеГруппа + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | СУММА(КоличествоПолучателей.КоличествоИсключены) КАК КоличествоИсключены, + | СУММА(КоличествоПолучателей.КоличествоОтправлять) КАК КоличествоОтправлять + |ИЗ + | КоличествоПолучателей КАК КоличествоПолучателей"; + + Если Не ПолучателиМетаданные.Иерархический Тогда + // Не иерархический + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "В ИЕРАРХИИ", "В"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ЭтоНеГруппа", ""); + ИначеЕсли ПолучателиМетаданные.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияЭлементов Тогда + // Иерархия элементов + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ЭтоНеГруппа", ""); + Иначе + // Иерархия групп + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ЭтоНеГруппа", "И НЕ Получатели.ЭтоГруппа"); + КонецЕсли; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Справочник.Пользователи", ПолучателиМетаданные.ПолноеИмя()); + + КонецЕсли; + + Запрос.УстановитьПараметр("ТаблицаПолучателей", Получатели.Выгрузить()); + Запрос.Текст = ТекстЗапроса; + + Попытка + РезультатЗапроса = Запрос.Выполнить(); + ВыборкаПолучатели = РезультатЗапроса.Выбрать(); + Если ВыборкаПолучатели.Следующий() Тогда + КоличествоПолучателей.Всего = ВыборкаПолучатели.КоличествоОтправлять; + КоличествоПолучателей.Исключены = ВыборкаПолучатели.КоличествоИсключены; + КонецЕсли; + Исключение + Возврат КоличествоПолучателей; + КонецПопытки; + + Возврат КоличествоПолучателей; + +КонецФункции + +Функция ПечатнаяФормаПаролиРассылкиОтчетов(Параметры, ОбъектыПечати) + + ТабличныйДокумент = Новый ТабличныйДокумент; + + Макет = ПолучитьМакет("ПФ_MXL_ПаролиРассылкиОтчетов"); + + НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1; + + ЗаголовокПечати = Макет.ПолучитьОбласть("Заголовок"); + + ЗаголовокПечати.Параметры.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Пароли для получения рассылки отчетов %1 ""%2""'"), Символы.ПС, Параметры.НаименованиеРассылки); + + ТабличныйДокумент.Вывести(ЗаголовокПечати); + + ШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы"); + ТабличныйДокумент.Вывести(ШапкаТаблицы); + + СтрокаТаблицы = Макет.ПолучитьОбласть("СтрокаТаблицы"); + + Запрос = Новый Запрос; + ТекстЗапроса = + "ВЫБРАТЬ + | ТаблицаПолучатели.Получатель, + | ТаблицаПолучатели.АдресЭлектроннойПочты, + | ТаблицаПолучатели.ПарольАрхива + |ПОМЕСТИТЬ ТаблицаПолучатели + |ИЗ + | &ТаблицаПолучатели КАК ТаблицаПолучатели + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗРЕШЕННЫЕ + | СправочникПолучатели.Наименование КАК Получатель, + | Получатели.АдресЭлектроннойПочты, + | Получатели.ПарольАрхива + |ИЗ + | ТаблицаПолучатели КАК Получатели + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК СправочникПолучатели + | ПО СправочникПолучатели.Ссылка = Получатели.Получатель"; + + ПолучателиМетаданные = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(Параметры.ИдентификаторОбъектаМетаданных, + Ложь); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Справочник.Пользователи", ПолучателиМетаданные.ПолноеИмя()); + + ТаблицаПолучатели = Новый ТаблицаЗначений; + ТаблицаПолучатели.Колонки.Добавить("Получатель", Параметры.ТипПолучателейРассылки); + ТаблицаПолучатели.Колонки.Добавить("АдресЭлектроннойПочты", Новый ОписаниеТипов("Строка", , + Новый КвалификаторыСтроки(250))); + ТаблицаПолучатели.Колонки.Добавить("ПарольАрхива", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(50))); + + Для Каждого ЭлементПолучатель Из Параметры.Получатели Цикл + СтрокаПолучатели = ТаблицаПолучатели.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаПолучатели, ЭлементПолучатель); + КонецЦикла; + + Запрос.УстановитьПараметр("ТаблицаПолучатели", ТаблицаПолучатели); + Запрос.Текст = ТекстЗапроса; + + НомерСтроки = 1; + + РезультатЗапроса = Запрос.Выполнить(); + Выборка= РезультатЗапроса.Выбрать(); + + Пока Выборка.Следующий() Цикл + ЗаполнитьЗначенияСвойств(СтрокаТаблицы.Параметры, Выборка); + СтрокаТаблицы.Параметры.НомерСтроки = НомерСтроки; + ТабличныйДокумент.Вывести(СтрокаТаблицы); + НомерСтроки = НомерСтроки + 1; + КонецЦикла; + + ТабличныйДокумент.АвтоМасштаб = Истина; + + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, Параметры.Ссылка); + + Возврат ТабличныйДокумент; + +КонецФункции + #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/РассылкиОтчетов/ObjectModule.bsl b/SSL/src/Catalogs/РассылкиОтчетов/ObjectModule.bsl index cbe6d454a..59b253f1a 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/ObjectModule.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/ObjectModule.bsl @@ -19,20 +19,19 @@ УстановитьПривилегированныйРежим(Истина); РегламентныеЗаданияСервер.ЗаблокироватьРегламентноеЗадание(РегламентноеЗадание); - Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(РегламентноеЗадание); // АПК:453 задание запускается от имени пользователя, выбранного в форме рассылки. - + + Задание = РегламентныеЗаданияСервер.Задание(РегламентноеЗадание); Если Задание = Неопределено Тогда - // Из-за выполнения индивидуального регламентного задания непосредственно в необходимой области модели сервиса. - // Создание регламентного задания осуществляется платформенным способом, - // а не через программный интерфейс общего модуля РегламентныеЗадания. - Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание(Метаданные.РегламентныеЗадания.РассылкаОтчетов); - Задание.ИмяПользователя = РассылкаОтчетов.ИмяПользователяИБ(Автор); - Задание.Использование = Ложь; - Задание.Наименование = ПредставлениеЗаданияПоРассылке(Наименование); - Задание.Записать(); + ПараметрыЗадания = Новый Структура(); + ПараметрыЗадания.Вставить("Метаданные", Метаданные.РегламентныеЗадания.РассылкаОтчетов); + ПараметрыЗадания.Вставить("ИмяМетода", Метаданные.РегламентныеЗадания.РассылкаОтчетов.ИмяМетода); + ПараметрыЗадания.Вставить("ИмяПользователя", РассылкаОтчетов.ИмяПользователяИБ(Автор)); + ПараметрыЗадания.Вставить("Использование", Ложь); + ПараметрыЗадания.Вставить("Наименование", ПредставлениеЗаданияПоРассылке(Наименование)); + Задание = РегламентныеЗаданияСервер.ДобавитьЗадание(ПараметрыЗадания); - РегламентноеЗадание = Задание.УникальныйИдентификатор; + РегламентноеЗадание = РегламентныеЗаданияСервер.УникальныйИдентификатор(Задание); РегламентныеЗаданияСервер.ЗаблокироватьРегламентноеЗадание(РегламентноеЗадание); КонецЕсли; @@ -60,10 +59,10 @@ Возврат; КонецЕсли; - УстановитьПривилегированныйРежим(Истина); - Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(РегламентноеЗадание); // АПК:453 задание запускается от имени пользователя, выбранного в форме рассылки. - Если Задание <> Неопределено Тогда - Задание.Удалить(); + Если ЗначениеЗаполнено(РегламентноеЗадание) Тогда + УстановитьПривилегированныйРежим(Истина); + РегламентныеЗаданияСервер.УдалитьЗадание(РегламентноеЗадание); + УстановитьПривилегированныйРежим(Ложь); КонецЕсли; ОбщегоНазначения.УдалитьДанныеИзБезопасногоХранилища(Ссылка); @@ -90,47 +89,45 @@ КонецЕсли; УстановитьПривилегированныйРежим(Истина); - Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(РегламентноеЗадание); // АПК:453 задание запускается от имени пользователя, выбранного в форме рассылки. + Задание = РегламентныеЗаданияСервер.Задание(РегламентноеЗадание); Если Задание <> Неопределено Тогда - ЗаданиеИзменено = Ложь; + Изменения = Новый Структура; ВключитьЗадание = ВыполнятьПоРасписанию И Подготовлена; Если Задание.Использование <> ВключитьЗадание Тогда - Задание.Использование = ВключитьЗадание; - ЗаданиеИзменено = Истина; + Изменения.Вставить("Использование", ВключитьЗадание); КонецЕсли; // Расписание устанавливается в форме элемента. Если ДополнительныеСвойства.Свойство("Расписание") И ТипЗнч(ДополнительныеСвойства.Расписание) = Тип("РасписаниеРегламентногоЗадания") И Строка(ДополнительныеСвойства.Расписание) <> Строка(Задание.Расписание) Тогда - Задание.Расписание = ДополнительныеСвойства.Расписание; - ЗаданиеИзменено = Истина; + Изменения.Вставить("Расписание", ДополнительныеСвойства.Расписание); КонецЕсли; ИмяПользователя = РассылкаОтчетов.ИмяПользователяИБ(Автор); Если Задание.ИмяПользователя <> ИмяПользователя Тогда - Задание.ИмяПользователя = ИмяПользователя; - ЗаданиеИзменено = Истина; + Изменения.Вставить("ИмяПользователя", ИмяПользователя); КонецЕсли; - НаименованиеЗадания = ПредставлениеЗаданияПоРассылке(Наименование); - Если Задание.Наименование <> НаименованиеЗадания Тогда - Задание.Наименование = НаименованиеЗадания; - ЗаданиеИзменено = Истина; + Если ТипЗнч(Задание) = Тип("РегламентноеЗадание") Тогда + НаименованиеЗадания = ПредставлениеЗаданияПоРассылке(Наименование); + Если Задание.Наименование <> НаименованиеЗадания Тогда + Изменения.Вставить("Наименование", НаименованиеЗадания); + КонецЕсли; КонецЕсли; Если Задание.Параметры.Количество() <> 1 ИЛИ Задание.Параметры[0] <> Ссылка Тогда ПараметрыЗадания = Новый Массив; ПараметрыЗадания.Добавить(Ссылка); - Задание.Параметры = ПараметрыЗадания; - ЗаданиеИзменено = Истина; + Изменения.Вставить("Параметры", ПараметрыЗадания); КонецЕсли; - Если ЗаданиеИзменено Тогда - Задание.Записать(); + Если Изменения.Количество() > 0 Тогда + РегламентныеЗаданияСервер.ИзменитьЗадание(РегламентноеЗадание, Изменения); КонецЕсли; КонецЕсли; + УстановитьПривилегированныйРежим(Ложь); КонецПроцедуры diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Templates/ПФ_MXL_ПаролиРассылкиОтчетов/Template.mxlx b/SSL/src/Catalogs/РассылкиОтчетов/Templates/ПФ_MXL_ПаролиРассылкиОтчетов/Template.mxlx new file mode 100644 index 000000000..ecef67ab6 --- /dev/null +++ b/SSL/src/Catalogs/РассылкиОтчетов/Templates/ПФ_MXL_ПаролиРассылкиОтчетов/Template.mxlx @@ -0,0 +1,403 @@ + + + + ru + ru + + ru + Русский + Русский + + + + 11 + + 0 + + 1 + + + + 2 + + 2 + + + + 3 + + 3 + + + + 4 + + 4 + + + + 5 + + 4 + + + + 7 + + 5 + + + + 9 + + 6 + + + + 10 + + 1 + + + + + 0 + + + + 0 + + + + + + + 1 + + 7 + + + 8 + Заголовок + + + + + 8 + + + + + 8 + + + + + 8 + + + + + 8 + + + + + 8 + + + + + 8 + + + + + 8 + + + + + 8 + + + + + 8 + + + + + + 2 + 5 + + true + + + + 6 + + + 1 + + 9 + + + ru + № + + + + + + + 9 + + + ru + Получатель + + + + + + + 9 + + + + + 9 + + + + + 9 + + + ru + Адрес электронной почты + + + + + + + 9 + + + + + 9 + + + + + 10 + + + ru + Пароль архива + + + + + + + 10 + + + + + + 7 + + true + + + + 8 + + + 1 + + 11 + НомерСтроки + + + + + 12 + Получатель + + + + + 12 + + + + + 12 + + + + + 12 + АдресЭлектроннойПочты + + + + + 12 + + + + + 12 + + + + + 12 + ПарольАрхива + + + + + 12 + + + + + true + 9 + 9 + + 1 + 0 + 9 + + + 6 + 2 + 2 + + + 6 + 5 + 2 + + + 6 + 8 + 1 + + + 8 + 2 + 2 + + + 8 + 5 + 2 + + + 8 + 8 + 1 + + + Заголовок + + Rows + 1 + 3 + -1 + -1 + + + + СтрокаТаблицы + + Rows + 8 + 8 + -1 + -1 + + + + ШапкаТаблицы + + Rows + 6 + 6 + -1 + -1 + + + + Solid + + + Dotted + + + + + + 24 + + + 110 + + + 112 + + + 158 + + + 114 + + + 120 + + + 138 + + + 0 + Center + Center + Wrap + Parameter + + + 1 + 0 + Center + + + 1 + 0 + 0 + 0 + 1 + Center + + + 2 + 0 + Parameter + + + 2 + 0 + Wrap + Parameter + + \ No newline at end of file diff --git a/SSL/src/Catalogs/РассылкиОтчетов/РассылкиОтчетов.mdo b/SSL/src/Catalogs/РассылкиОтчетов/РассылкиОтчетов.mdo index d5353a826..6a400a020 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/РассылкиОтчетов.mdo +++ b/SSL/src/Catalogs/РассылкиОтчетов/РассылкиОтчетов.mdo @@ -1125,6 +1125,41 @@ PersonalComputer MobileDevice + + ПаролиШифрование + + ru + Пароли и шифрование + + + + ru + + + PersonalComputer + MobileDevice + + + SMSРассылкаПаролей + + ru + SMS-рассылка паролей + + + + ru + + + PersonalComputer + MobileDevice + + + ПФ_MXL_ПаролиРассылкиОтчетов + + ru + Пароли рассылки отчетов + + ВыполнитьСейчас diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Form.form index b0226dd9d..144d823c0 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Form.form @@ -53,7 +53,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Form.form index ed2eb4289..9280249c4 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Form.form index c77276fc3..278d8c358 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Form.form @@ -110,7 +110,6 @@ UsualGroup Vertical - Auto true true Auto @@ -180,7 +179,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -273,7 +271,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -520,7 +517,6 @@ UsualGroup Vertical - Auto true true Auto @@ -549,7 +545,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -578,7 +573,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -660,7 +654,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/Catalogs/РолиИсполнителей/ManagerModule.bsl b/SSL/src/Catalogs/РолиИсполнителей/ManagerModule.bsl index e6e0f367f..5d1ec5214 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/ManagerModule.bsl +++ b/SSL/src/Catalogs/РолиИсполнителей/ManagerModule.bsl @@ -61,15 +61,15 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); - + Если МодульМультиязычностьСервер.ИспользуетсяПервыйДополнительныйЯзык() Тогда ФрагментыТекстаПоискДляДополнительныхЯзыков.Добавить( - "РолиИсполнителей.НаименованиеЯзык1 ПОДОБНО &СтрокаПоиска"); + "РолиИсполнителей.НаименованиеЯзык1 ПОДОБНО &СтрокаПоиска СПЕЦСИМВОЛ ""~"""); КонецЕсли; Если МодульМультиязычностьСервер.ИспользуетсяВторойДополнительныйЯзык() Тогда ФрагментыТекстаПоискДляДополнительныхЯзыков.Добавить( - "РолиИсполнителей.НаименованиеЯзык2 ПОДОБНО &СтрокаПоиска"); + "РолиИсполнителей.НаименованиеЯзык2 ПОДОБНО &СтрокаПоиска СПЕЦСИМВОЛ ""~"""); КонецЕсли; КонецЕсли; @@ -82,9 +82,9 @@ | ПО РолиИсполнителейНазначение.Ссылка = РолиИсполнителей.Ссылка |ГДЕ | РолиИсполнителейНазначение.ТипПользователей = &Тип - | И (РолиИсполнителей.Наименование ПОДОБНО &СтрокаПоиска + | И (РолиИсполнителей.Наименование ПОДОБНО &СтрокаПоиска СПЕЦСИМВОЛ ""~"" | ИЛИ &ПоискДляДополнительныхЯзыков - | ИЛИ РолиИсполнителей.Код ПОДОБНО &СтрокаПоиска) + | ИЛИ РолиИсполнителей.Код ПОДОБНО &СтрокаПоиска СПЕЦСИМВОЛ ""~"") | И НЕ РолиИсполнителей.Ссылка ЕСТЬ NULL"; Если ФрагментыТекстаПоискДляДополнительныхЯзыков.Количество() > 0 Тогда @@ -95,7 +95,7 @@ Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("Тип", ОбъектАвторизации); - Запрос.УстановитьПараметр("СтрокаПоиска", "%" + Параметры.СтрокаПоиска + "%"); + Запрос.УстановитьПараметр("СтрокаПоиска", "%" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(Параметры.СтрокаПоиска) + "%"); РезультатЗапроса = Запрос.Выполнить().Выбрать(); ДанныеВыбора = Новый СписокЗначений; diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Form.form index 7dc578b40..5ff53acfd 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Form.form @@ -114,7 +114,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -219,7 +218,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -248,7 +246,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -354,7 +351,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -473,17 +469,21 @@ СертификатыКоманднаяПанель 219 - - Найти - 810 + + + <key>ru</key> + <value>Поиск</value> + true true true + СтрокаПоиск + 873 - НайтиРасширеннаяПодсказка - 811 + СтрокаПоискРасширеннаяПодсказка + 875 Label true true @@ -491,39 +491,15 @@ Left - Form.Item.Сертификаты.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - - - ОтменитьПоиск - 812 - true - true - - true - - - ОтменитьПоискРасширеннаяПодсказка - 813 - Label + + СтрокаПоискКонтекстноеМеню + 874 + true + + Сертификаты + true - true - - Left - - - Form.Item.Сертификаты.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto + Обновить @@ -910,7 +886,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1307,7 +1282,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1462,6 +1436,107 @@ DontUse + + ГруппаФизическоеЛицо + 866 + + СертификатФизическоеЛицо + 868 + true + true + + true + + + СертификатФизическоеЛицо + + + СертификатФизическоеЛицоРасширеннаяПодсказка + 870 + Label + true + true + + Left + + + + СертификатФизическоеЛицоКонтекстноеМеню + 869 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПодобратьФизическоеЛицо + 871 + true + true + + true + + + ПодобратьФизическоеЛицоРасширеннаяПодсказка + 872 + Label + true + true + + Left + + + UsualButton + Form.Command.ПодобратьФизическоеЛицо + Normal + Picture + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа физическое лицо</value> + + 30 + + ГруппаФизическоеЛицоРасширеннаяПодсказка + 867 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + ГруппаВводитьПарольВПрограммеЭлектроннойПодписи 856 @@ -1627,7 +1702,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1827,7 +1901,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1856,7 +1929,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1886,7 +1958,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1917,7 +1988,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -2752,6 +2822,23 @@ true + + СертификатФизическоеЛицо + + <key>ru</key> + <value>Физическое лицо</value> + + 37 + + DefinedType.ФизическоеЛицо + + + true + + + true + + Далее @@ -2890,6 +2977,31 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>ПодобратьФизическоеЛицо</name> + <title> + <key>ru</key> + <value>Подобрать физическое лицо</value> + + 8 + + ru + Подобрать физическое лицо по наименованию из поля сертификата "Кому выдан" + + + true + + + StdPicture.MoveLeft + + + + ПодобратьФизическоеЛицо + + + Auto + Auto + ДляШифрованияИРасшифровки diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Module.bsl index a6fc5ba6c..56fbd5c61 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Module.bsl @@ -18,6 +18,8 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ЭлектроннаяПодписьСлужебный.УстановитьВидимостьСсылкиНаИнструкциюПоРаботеСПрограммами(Элементы.Инструкция); + ЕстьПравоНаДобавлениеВСправочник = ПравоДоступа("Добавление", Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования); ЭтоПолноправныйПользователь = Пользователи.ЭтоПолноправныйПользователь(Пользователи.ТекущийПользователь()); @@ -110,6 +112,10 @@ Элементы.СертификатОрганизация.Подсказка = Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.Реквизиты.Организация.Подсказка; + Если Метаданные.ОпределяемыеТипы.ФизическоеЛицо.Тип.СодержитТип(Тип("Строка")) Тогда + Элементы.ГруппаФизическоеЛицо.Видимость = Ложь; + КонецЕсли; + Если ЗначениеЗаполнено(Параметры.ОтпечатокВыбранногоСертификата) Тогда ОтпечатокВыбранногоСертификатаНеНайден = Ложь; ОтпечатокВыбранногоСертификата = Параметры.ОтпечатокВыбранногоСертификата; @@ -154,7 +160,8 @@ Возврат; КонецЕсли; - Если ВРег(ИмяСобытия) = ВРег("Установка_РасширениеРаботыСКриптографией") Тогда + Если ВРег(ИмяСобытия) = ВРег("Установка_РасширениеРаботыСКриптографией") + Или ВРег(ИмяСобытия) = ВРег("Установка_КомпонентаExtraCryptoAPI") Тогда ОбновитьСписокСертификатов(); Возврат; КонецЕсли; @@ -216,8 +223,8 @@ ЭлектроннаяПодписьСлужебныйКлиент.ПоказатьОшибкуОбращенияКПрограмме( НСтр("ru = 'Сертификаты недоступны на сервере'"), "", - ОшибкаПолученияСертификатовНаСервере, - Новый Структура); + Новый Структура, + ОшибкаПолученияСертификатовНаСервере); КонецПроцедуры @@ -532,7 +539,7 @@ ДополнительныеПараметры = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыОповещенияПриЗаписиСертификата(); Если Не Результат.Выполнено Тогда - ОписаниеОшибки = КраткоеПредставлениеОшибки(Результат.ИнформацияОбОшибке); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(Результат.ИнформацияОбОшибке); ИначеЕсли Не Результат.Действителен Тогда ОписаниеОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТекстОшибкиСервисаСертификатНедействителен(); КонецЕсли; @@ -574,6 +581,23 @@ КонецПроцедуры +&НаКлиенте +Процедура ПодобратьФизическоеЛицо(Команда) + + ПараметрыОтбора = Новый Структура; + ПараметрыОтбора.Вставить("Свойство", НСтр("ru = 'Кому выдан:'")); + СтрокиОписанияДанныхСертификата = СертификатОписаниеДанных.НайтиСтроки(ПараметрыОтбора); + Если СтрокиОписанияДанныхСертификата.Количество() = 0 Тогда + ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Подходящее физическое лицо не существует.'")); + Возврат; + КонецЕсли; + + КомуВыдан = СтрокиОписанияДанныхСертификата[0].Значение; + + ЭлектроннаяПодписьСлужебныйКлиент.ПодобратьФизическоеЛицоДляСертификата(ЭтотОбъект, КомуВыдан, СертификатФизическоеЛицо); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -1019,4 +1043,15 @@ КонецПроцедуры +&НаКлиенте +Процедура ПриЗакрытииФормыВыбораФизическогоЛица(Значение, Параметры) Экспорт + + Если Значение = Неопределено Тогда + Возврат; + КонецЕсли; + + СертификатФизическоеЛицо = Значение; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификата/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификата/Form.form index c6e941636..6d0e26a8a 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификата/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификата/Form.form @@ -1,82 +1,19 @@ - Страницы - 13 - - СтраницаСпособДобавленияСертификата - 21 - - СпособДобавленияСертификата1 - 23 - true - true - - true - - - СпособДобавленияСертификата - - None - - OnChange - СпособДобавленияСертификатаПриИзменении - - - СпособДобавленияСертификата1РасширеннаяПодсказка - 25 - Label - true - true - - Left - - - - СпособДобавленияСертификата1КонтекстноеМеню - 24 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Заявление на выпуск сертификата - - - ЗаявлениеНаВыпускСертификата - - - - - ru - Из установленных на компьютере - - - ИзУстановленныхНаКомпьютере - - - Vertical - - + ГруппаКоманды + 80 + + ДобавитьЗаявлениеНаВыпускСертификата + 100 true true true - - <key>ru</key> - <value>Страница способ добавления сертификата</value> - - СтраницаСпособДобавленияСертификатаРасширеннаяПодсказка - 22 + ДобавитьЗаявлениеНаВыпускСертификатаРасширеннаяПодсказка + 101 Label true true @@ -84,468 +21,26 @@ Left - Page - - Vertical - auto - false - - - - СтраницаСпособДобавленияСертификатаБезШифрования - 42 - - СпособДобавленияСертификата2 - 44 - true - true - - true - - - СпособДобавленияСертификата - - None - - СпособДобавленияСертификата2РасширеннаяПодсказка - 46 - Label - true - true - - Left - - - - СпособДобавленияСертификата2КонтекстноеМеню - 45 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Заявление на выпуск сертификата - - - ЗаявлениеНаВыпускСертификата - - - - - ru - Из установленных на компьютере - - - ДляПодписанияШифрованияИРасшифровки - - - Vertical - - - true - true - - true - - - <key>ru</key> - <value>Страница способ добавления сертификата без шифрования</value> - - - СтраницаСпособДобавленияСертификатаБезШифрованияРасширеннаяПодсказка - 43 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - - СтраницаНазначение - 15 - - Назначение - 1 - - <key>ru</key> - <value>Добавить новый сертификат</value> - - true - true - - true - - - Назначение - - None - - OnChange - НазначениеПриИзменении - - - НазначениеРасширеннаяПодсказка - 3 - Label - true - true - - Left - - - - НазначениеКонтекстноеМеню - 2 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Для подписания и шифрования - - - ДляПодписанияШифрованияИРасшифровки - - - - - ru - Только для шифрования - - - ТолькоДляШифрования - - - Vertical - - - - ВертикальнаяГруппа1 - 35 - - ДобавитьИзФайла1 - 40 - true - true - - true - - - ДобавитьИзФайла1РасширеннаяПодсказка - 41 - Label - true - true - - Left - - - Hyperlink - Form.Command.ДобавитьИзФайла - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Вертикальная группа 1</value> - - Bottom - - ВертикальнаяГруппа1РасширеннаяПодсказка - 36 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Страница назначение</value> - - - СтраницаНазначениеРасширеннаяПодсказка - 16 - Label - true - true - - Left - - - Page - - HorizontalIfPossible - auto - false - - - - СтраницаНазначениеБезЭлектроннойПодписи - 17 - - НазначениеБезЭлектроннойПодписи - 10 - - <key>ru</key> - <value>Добавить новый сертификат</value> - - true - true - - true - - - Назначение - - None - - OnChange - НазначениеПриИзменении - - - НазначениеБезЭлектроннойПодписиРасширеннаяПодсказка - 12 - Label - true - true - - Left - - - - НазначениеБезЭлектроннойПодписиКонтекстноеМеню - 11 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Для шифрования и расшифровки - - - ДляШифрованияИРасшифровки - - - - - ru - Только для шифрования - - - ТолькоДляШифрования - - - Vertical - - - - ВертикальнаяГруппа2 - 33 - - ДобавитьИзФайла2 - 19 - true - true - - true - - - ДобавитьИзФайла2РасширеннаяПодсказка - 20 - Label - true - true - - Left - - - Hyperlink - Form.Command.ДобавитьИзФайла - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Вертикальная группа 2</value> - - Bottom - - ВертикальнаяГруппа2РасширеннаяПодсказка - 34 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Страница назначение без электронной подписи</value> - - - СтраницаНазначениеБезЭлектроннойПодписиРасширеннаяПодсказка - 18 - Label - true - true - - Left - - - Page - - HorizontalIfPossible - auto - false - - - true - true - - true - - - <key>ru</key> - <value>Страницы</value> - - - СтраницыРасширеннаяПодсказка - 14 - Label + UsualButton + Form.Command.ДобавитьЗаявлениеНаВыпускСертификата + Normal + Auto true true - - Left - - - Pages - - Auto - - - - Команды - 47 - - КомандаНазад - 49 - - ФормаНазад - 28 - true - - true - - - ФормаНазадРасширеннаяПодсказка - 29 - Label - true - true - - Left - - - Form.Command.Назад - Normal - Auto - true - true - UserCmds - Auto - + UserCmds + Auto + + + ДобавитьДляПодписанияИШифрования + 84 true true true - - <key>ru</key> - <value>Команда назад</value> - - КомандаНазадРасширеннаяПодсказка - 50 + ДобавитьДляПодписанияИШифрованияРасширеннаяПодсказка + 85 Label true true @@ -553,25 +48,29 @@ Left - CommandBar - - Left - + UsualButton + Form.Command.ДобавитьДляПодписанияИШифрования + Normal + Auto + true + true + UserCmds + Auto - ОсновныеКоманды - 51 + ГруппаТолькоДляШифрования + 94 - ФормаДобавить - 4 + ДобавитьТолькоДляШифрования + 92 true true true - ФормаДобавитьРасширеннаяПодсказка - 5 + ДобавитьТолькоДляШифрованияРасширеннаяПодсказка + 93 Label true true @@ -579,32 +78,8 @@ Left - Form.Command.Добавить - Auto - true - true - true - UserCmds - Auto - - - ФормаДалее - 26 - true - - true - - - ФормаДалееРасширеннаяПодсказка - 27 - Label - true - true - - Left - - - Form.Command.Далее + UsualButton + Form.Command.ДобавитьТолькоДляШифрования Normal Auto true @@ -613,16 +88,16 @@ Auto - ФормаОтмена - 6 + ДобавитьИзФайлов + 90 true true true - ФормаОтменаРасширеннаяПодсказка - 7 + ДобавитьИзФайловРасширеннаяПодсказка + 91 Label true true @@ -630,7 +105,35 @@ Left - Form.StandardCommand.Cancel + UsualButton + Form.Command.ДобавитьИзФайлов + Normal + Auto + true + true + UserCmds + Auto + + + ДобавитьИзКаталога + 88 + true + true + + true + + + ДобавитьИзКаталогаРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + UsualButton + Form.Command.ДобавитьИзКаталога Normal Auto true @@ -645,11 +148,11 @@ <key>ru</key> - <value>Основные команды</value> + <value>Только для шифрования</value> - ОсновныеКомандыРасширеннаяПодсказка - 52 + ГруппаТолькоДляШифрованияРасширеннаяПодсказка + 95 Label true true @@ -657,9 +160,15 @@ Left - CommandBar - - Right + UsualGroup + + Vertical + WeakSeparation + true + true + auto + Auto + Auto true @@ -669,11 +178,11 @@ <key>ru</key> - <value>Команды</value> + <value>Группа1</value> - КомандыРасширеннаяПодсказка - 48 + ГруппаКомандыРасширеннаяПодсказка + 81 Label true true @@ -683,9 +192,9 @@ UsualGroup - HorizontalIfPossible + Vertical Auto - NormalSeparation + WeakSeparation true true Auto @@ -703,7 +212,6 @@ OnCreateAtServer ПриСозданииНаСервере - 35 LockOwner true true @@ -715,11 +223,7 @@ auto true - Назначение - - <key>ru</key> - <value>Назначение</value> - + НазначениеДляПодписанияИШифрования 1 String @@ -732,94 +236,114 @@ true - - СпособДобавленияСертификата - - <key>ru</key> - <value>Способ добавления сертификата</value> - - 2 - - String - - - - true - - - true - - - Добавить + ДобавитьДляПодписанияИШифрования <key>ru</key> - <value>Добавить</value> + <value>Добавить для подписания и шифрования...</value> 1 true + + CommonPicture.СертификатВЛичномХранилище + - Добавить + ДобавитьДляПодписанияИШифрования + TextPicture DontUse Auto - ДобавитьИзФайла + ДобавитьИзФайлов <key>ru</key> - <value>Добавить из файла</value> + <value>Добавить из файлов...</value> 2 true + + CommonPicture.СертификатКлюча + - ДобавитьИзФайла + ДобавитьИзФайлов + TextPicture DontUse Auto - Назад + ДобавитьИзКаталога <key>ru</key> - <value>< Назад</value> + <value>Добавить из каталога...</value> - 3 + 5 true + + CommonPicture.СертификатКлюча + - Назад + ДобавитьИзКаталога - DontUse + TextPicture + Auto Auto - Далее + ДобавитьЗаявлениеНаВыпускСертификата <key>ru</key> - <value>Далее ></value> + <value>Оформить заявление на выпуск сертификата...</value> - 4 + 6 true + + CommonPicture.ЗаявлениеНаВыпускСертификатаКлюча + - Далее + ДобавитьЗаявлениеНаВыпускСертификата - DontUse + TextPicture + Auto + Auto + + + ДобавитьТолькоДляШифрования + + <key>ru</key> + <value>Добавить из личного хранилища...</value> + + 7 + + true + + + CommonPicture.СертификатВЛичномХранилище + + + + ДобавитьТолькоДляШифрования + + + TextPicture + Auto Auto diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификата/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификата/Module.bsl index 5b6ca6369..f6e1f7456 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификата/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификата/Module.bsl @@ -13,53 +13,28 @@ Если ЭлектроннаяПодпись.ОбщиеНастройки().ЗаявлениеНаВыпускСертификатаДоступно И Не Параметры.СкрытьЗаявление Тогда - - СпособДобавленияСертификата = "ЗаявлениеНаВыпускСертификата"; - Если Не ЭлектроннаяПодпись.ИспользоватьШифрование() Тогда - Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаСпособДобавленияСертификатаБезШифрования; - КонецЕсли; + Элементы.ДобавитьЗаявлениеНаВыпускСертификата.Видимость = Истина; Иначе - Элементы.СтраницаСпособДобавленияСертификата.Видимость = Ложь; - Элементы.СтраницаСпособДобавленияСертификатаБезШифрования.Видимость = Ложь; - КонецЕсли; - - Назначение = "ДляПодписанияШифрованияИРасшифровки"; - Если Не ЗначениеЗаполнено(СпособДобавленияСертификата) Тогда - Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаНазначение; + Элементы.ДобавитьЗаявлениеНаВыпускСертификата.Видимость = Ложь; КонецЕсли; Если Не ЭлектроннаяПодпись.ДобавлениеИзменениеЭлектронныхПодписей() Тогда - Назначение = "ДляШифрованияИРасшифровки"; - Если Не ЗначениеЗаполнено(СпособДобавленияСертификата) Тогда - Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаНазначениеБезЭлектроннойПодписи; - КонецЕсли; + + Элементы.ДобавитьДляПодписанияИШифрования.Заголовок = НСтр("ru = 'Добавить для шифрования и расшифровки...'"); + НазначениеДляПодписанияИШифрования = "ДляШифрованияИРасшифровки"; ИначеЕсли Не ЭлектроннаяПодпись.ИспользоватьШифрование() - И Не ЗначениеЗаполнено(СпособДобавленияСертификата) Тогда + И Не Элементы.ДобавитьЗаявлениеНаВыпускСертификата.Видимость Тогда + Отказ = Истина; Возврат; + + Иначе + + Элементы.ДобавитьДляПодписанияИШифрования.Заголовок = НСтр("ru = 'Добавить для подписания и шифрования...'"); + НазначениеДляПодписанияИШифрования = "ДляПодписанияШифрованияИРасшифровки"; КонецЕсли; - УстановитьСоставКомандТолькоДляШифрования(ЭтотОбъект); - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура СпособДобавленияСертификатаПриИзменении(Элемент) - - УстановитьСоставКомандПриИзмененииСпособаДобавленияСертификата(); - -КонецПроцедуры - -&НаКлиенте -Процедура НазначениеПриИзменении(Элемент) - - УстановитьСоставКомандТолькоДляШифрования(ЭтотОбъект); - КонецПроцедуры #КонецОбласти @@ -67,79 +42,37 @@ #Область ОбработчикиКомандФормы &НаКлиенте -Процедура Добавить(Команда) +Процедура ДобавитьДляПодписанияИШифрования(Команда) - Если Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаСпособДобавленияСертификата - Или Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаСпособДобавленияСертификатаБезШифрования Тогда - - Закрыть(СпособДобавленияСертификата); - Иначе - Закрыть(Назначение); - КонецЕсли; + Закрыть(НазначениеДляПодписанияИШифрования); КонецПроцедуры &НаКлиенте -Процедура Далее(Команда) +Процедура ДобавитьИзФайлов(Команда) - Если ЭлектроннаяПодписьКлиент.ИспользоватьЭлектронныеПодписи() Тогда - Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаНазначение; - Назначение = "ДляПодписанияШифрованияИРасшифровки"; - Иначе - Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаНазначениеБезЭлектроннойПодписи; - Назначение = "ДляШифрованияИРасшифровки"; - КонецЕсли; - - Элементы.ФормаДобавить.Видимость = Истина; - Элементы.ФормаДалее.Видимость = Ложь; - Элементы.ФормаНазад.Видимость = Истина; - Элементы.ФормаДобавить.КнопкаПоУмолчанию = Истина; - - УстановитьСоставКомандТолькоДляШифрования(ЭтотОбъект); + Закрыть("ТолькоДляШифрованияИзФайлов"); КонецПроцедуры &НаКлиенте -Процедура Назад(Команда) +Процедура ДобавитьИзКаталога(Команда) - Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаСпособДобавленияСертификата; - Элементы.ФормаНазад.Видимость = Ложь; - - УстановитьСоставКомандПриИзмененииСпособаДобавленияСертификата(); + Закрыть("ТолькоДляШифрованияИзКаталога"); КонецПроцедуры &НаКлиенте -Процедура ДобавитьИзФайла(Команда) +Процедура ДобавитьЗаявлениеНаВыпускСертификата(Команда) - Закрыть("ТолькоДляШифрованияИзФайла"); + Закрыть("ЗаявлениеНаВыпускСертификата"); КонецПроцедуры -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - &НаКлиенте -Процедура УстановитьСоставКомандПриИзмененииСпособаДобавленияСертификата() - - ДобавитьЗаявку = СпособДобавленияСертификата = "ЗаявлениеНаВыпускСертификата"; - - Элементы.ФормаДобавить.Видимость = ДобавитьЗаявку; - Элементы.ФормаДалее.Видимость = Не ДобавитьЗаявку; - Элементы.ФормаДобавить.КнопкаПоУмолчанию = ДобавитьЗаявку; - Элементы.ФормаДалее.КнопкаПоУмолчанию = Не ДобавитьЗаявку; - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура УстановитьСоставКомандТолькоДляШифрования(Форма) - - Элементы = Форма.Элементы; - ИзФайла = Форма.Назначение = "ТолькоДляШифрования"; +Процедура ДобавитьТолькоДляШифрования(Команда) - Элементы.ДобавитьИзФайла1.Видимость = ИзФайла; - Элементы.ДобавитьИзФайла2.Видимость = ИзФайла; + Закрыть("ТолькоДляШифрования"); КонецПроцедуры diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Form.form index 8bff0568c..f0411774f 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Form.form @@ -114,7 +114,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -215,7 +214,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -244,7 +242,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -363,17 +360,21 @@ СертификатыКоманднаяПанель 219 - - Найти - 808 + + + <key>ru</key> + <value>Поиск</value> + true true true + СтрокаПоиск + 830 - НайтиРасширеннаяПодсказка - 809 + СтрокаПоискРасширеннаяПодсказка + 832 Label true true @@ -381,39 +382,15 @@ Left - Form.Item.Сертификаты.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - - - ОтменитьПоиск - 810 - true - true - - true - - - ОтменитьПоискРасширеннаяПодсказка - 811 - Label + + СтрокаПоискКонтекстноеМеню + 831 + true + + Сертификаты + true - true - - Left - - - Form.Item.Сертификаты.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto + Обновить @@ -691,10 +668,10 @@ true true - Сертификаты.СостояниеСертификата + Сертификаты.ТипРазмещения - CommonPicture.КоллекцияВидыСобытийЖурналаРегистрации + CommonPicture.ТипыСертификатов true @@ -801,7 +778,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1200,7 +1176,6 @@ HorizontalIfPossible Left - Auto true true Auto @@ -1354,6 +1329,107 @@ Normal + + ГруппаФизическоеЛицо + 823 + + СертификатФизическоеЛицо + 825 + true + true + + true + + + СертификатФизическоеЛицо + + + СертификатФизическоеЛицоРасширеннаяПодсказка + 827 + Label + true + true + + Left + + + + СертификатФизическоеЛицоКонтекстноеМеню + 826 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПодобратьФизическоеЛицо + 828 + true + true + + true + + + ПодобратьФизическоеЛицоРасширеннаяПодсказка + 829 + Label + true + true + + Left + + + UsualButton + Form.Command.ПодобратьФизическоеЛицо + Normal + Picture + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа физическое лицо</value> + + 30 + + ГруппаФизическоеЛицоРасширеннаяПодсказка + 824 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + true true @@ -1378,7 +1454,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -2006,6 +2081,23 @@ true + + СертификатФизическоеЛицо + + <key>ru</key> + <value>Физическое лицо</value> + + 26 + + DefinedType.ФизическоеЛицо + + + true + + + true + + Далее @@ -2144,6 +2236,31 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>ПодобратьФизическоеЛицо</name> + <title> + <key>ru</key> + <value>Подобрать физическое лицо</value> + + 8 + + ru + Подобрать физическое лицо по наименованию из поля сертификата "Кому выдан" + + + true + + + StdPicture.MoveLeft + + + + ПодобратьФизическоеЛицо + + + Auto + Auto + ЛичныйСписокПриДобавлении diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Module.bsl index f50a3bb78..d799aee75 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Module.bsl @@ -11,6 +11,8 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ЭлектроннаяПодписьСлужебный.УстановитьВидимостьСсылкиНаИнструкциюПоРаботеСПрограммами(Элементы.Инструкция); + ЕстьПравоНаДобавлениеВСправочник = ПравоДоступа("Добавление", Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования); @@ -71,9 +73,8 @@ ОпределяемыйТипОрганизацияНастроен = Истина; КонецЕсли; - Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда - МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS"); - Элементы.Сертификаты.КартинкаСтрок = МодульСервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ТипыСертификатов"); + Если Метаданные.ОпределяемыеТипы.ФизическоеЛицо.Тип.СодержитТип(Тип("Строка")) Тогда + Элементы.ГруппаФизическоеЛицо.Видимость = Ложь; КонецЕсли; Элементы.СертификатПользователь.Подсказка = @@ -116,7 +117,8 @@ Возврат; КонецЕсли; - Если ВРег(ИмяСобытия) = ВРег("Установка_РасширениеРаботыСКриптографией") Тогда + Если ВРег(ИмяСобытия) = ВРег("Установка_РасширениеРаботыСКриптографией") + Или ВРег(ИмяСобытия) = ВРег("Установка_КомпонентаExtraCryptoAPI") Тогда ОбновитьСписокСертификатов(); Возврат; КонецЕсли; @@ -168,8 +170,8 @@ ЭлектроннаяПодписьСлужебныйКлиент.ПоказатьОшибкуОбращенияКПрограмме( НСтр("ru = 'Сертификаты недоступны на сервере'"), "", - ОшибкаПолученияСертификатовНаСервере, - Новый Структура); + Новый Структура, + ОшибкаПолученияСертификатовНаСервере); КонецПроцедуры @@ -431,6 +433,23 @@ КонецПроцедуры +&НаКлиенте +Процедура ПодобратьФизическоеЛицо(Команда) + + ПараметрыОтбора = Новый структура; + ПараметрыОтбора.Вставить("Свойство", НСтр("ru = 'Кому выдан:'")); + СтрокиОписанияДанныхСертификата = СертификатОписаниеДанных.НайтиСтроки(ПараметрыОтбора); + Если СтрокиОписанияДанныхСертификата.Количество() = 0 Тогда + ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Подходящее физическое лицо не существует.'")); + Возврат; + КонецЕсли; + + КомуВыдан = СтрокиОписанияДанныхСертификата[0].Значение; + + ЭлектроннаяПодписьСлужебныйКлиент.ПодобратьФизическоеЛицоДляСертификата(ЭтотОбъект, КомуВыдан, СертификатФизическоеЛицо); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -560,4 +579,15 @@ КонецПроцедуры +&НаКлиенте +Процедура ПриЗакрытииФормыВыбораФизическогоЛица(Значение, Параметры) Экспорт + + Если Значение = Неопределено Тогда + Возврат; + КонецЕсли; + + СертификатФизическоеЛицо = Значение; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатовДляШифрования/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатовДляШифрования/Form.form new file mode 100644 index 000000000..9fd1dfcc9 --- /dev/null +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатовДляШифрования/Form.form @@ -0,0 +1,1306 @@ + + + + ГруппаГоризонтальная + 59 + + ГруппаСертификаты + 49 + + Сертификаты + 1 + true + true + + true + + + Сертификаты + + None + Add + Change + Copy + EndEdit + + СертификатыПредставление + 93 + true + true + + true + + + Сертификаты.Представление + + + OnChange + СертификатыПредставлениеПриИзменении + + + СертификатыПредставлениеРасширеннаяПодсказка + 95 + Label + true + true + + Left + + + + СертификатыПредставлениеКонтекстноеМеню + 94 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + СертификатыФизическоеЛицо + 17 + true + true + + true + + + Сертификаты.ФизическоеЛицо + + + СертификатыФизическоеЛицоРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + СертификатыФизическоеЛицоКонтекстноеМеню + 18 + true + + InputField + Enter + true + Left + true + + + AutoComplete + СертификатыФизическоеЛицоАвтоПодбор + + + StartChoice + СертификатыФизическоеЛицоНачалоВыбора + + true + true + true + false + true + ShowInInputField + false + false + true + true + Normal + DontUse + + + + СертификатыКоманднаяПанель + 2 + Left + true + + + BeforeAddRow + СертификатыПередНачаломДобавления + + + OnActivateRow + СертификатыПриАктивизацииСтроки + + + СертификатыСтрокаПоиска + 5 + + СертификатыСтрокаПоискаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + СертификатыСтрокаПоискаКонтекстноеМеню + 6 + true + + Сертификаты + + true + + + + СертификатыСостояниеПросмотра + 11 + + СертификатыСостояниеПросмотраРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СертификатыСостояниеПросмотраКонтекстноеМеню + 12 + true + + ViewStatusAddition + Сертификаты + + true + + + + СертификатыУправлениеПоиском + 8 + + СертификатыУправлениеПоискомРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СертификатыУправлениеПоискомКонтекстноеМеню + 9 + true + + SearchControlAddition + Сертификаты + + true + + + + СертификатыРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + + СертификатыКонтекстноеМеню + 3 + true + + true + true + true + true + true + MultiRow +
        true
        + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + AsFileRef + true + +
        + + Организация + 56 + true + true + + true + + + Организация + + Button + + ОрганизацияРасширеннаяПодсказка + 58 + + <key>ru</key> + <value>Заполняется только при добавлении в справочник новых сертификатов</value> + + Label + true + true + + Left + + + + ОрганизацияКонтекстноеМеню + 57 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа сертификаты</value> + + + ГруппаСертификатыРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + +
        + + ГруппаОписаниеСертификата + 26 + + ДекорацияОтступ + 51 + true + true + + true + + + ДекорацияОтступРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ДекорацияОтступКонтекстноеМеню + 52 + true + + Label + 2 + + Left + + + + ГруппаСвойстваСертификата + 54 + + СертификатОписаниеДанных + 28 + + <key>ru</key> + <value>Сертификат описание данных</value> + + true + true + + true + + + СертификатОписаниеДанных + + true + None + + СертификатОписаниеДанныхСвойство + 41 + true + true + + true + + + СертификатОписаниеДанных.Свойство + + true + + СертификатОписаниеДанныхСвойствоРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + СертификатОписаниеДанныхСвойствоКонтекстноеМеню + 42 + true + + InputField + Auto + true + Left + true + + 13 + true + true + false + true + true + true + true + Normal + + + + СертификатОписаниеДанныхЗначение + 44 + true + true + + true + + + СертификатОписаниеДанных.Значение + + true + + СертификатОписаниеДанныхЗначениеРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + СертификатОписаниеДанныхЗначениеКонтекстноеМеню + 45 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + СертификатОписаниеДанныхКоманднаяПанель + 30 + Left + + + СертификатОписаниеДанныхСтрокаПоиска + 32 + + СертификатОписаниеДанныхСтрокаПоискаРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + СертификатОписаниеДанныхСтрокаПоискаКонтекстноеМеню + 33 + true + + СертификатОписаниеДанных + + true + + + + СертификатОписаниеДанныхСостояниеПросмотра + 35 + + СертификатОписаниеДанныхСостояниеПросмотраРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + СертификатОписаниеДанныхСостояниеПросмотраКонтекстноеМеню + 36 + true + + ViewStatusAddition + СертификатОписаниеДанных + + true + + + + СертификатОписаниеДанныхУправлениеПоиском + 38 + + СертификатОписаниеДанныхУправлениеПоискомРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + СертификатОписаниеДанныхУправлениеПоискомКонтекстноеМеню + 39 + true + + SearchControlAddition + СертификатОписаниеДанных + + true + + + + СертификатОписаниеДанныхРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + СертификатОписаниеДанныхКонтекстноеМеню + 29 + true + + true + true + true + 51 + 51 + 4 + true + true + MultiRow + Row + 1 + 1 + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + true + true + + + + ПоказатьДанныеСертификата + 47 + true + true + + true + + true + + ПоказатьДанныеСертификатаРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + UsualButton + Form.Command.ПоказатьДанныеСертификата + Normal + Picture + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + ГруппаСвойстваСертификатаРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + WeakSeparation + true + true + Auto + Auto + + + + СертификатыСертификат + 96 + true + true + + true + + + Items.Сертификаты.CurrentData.Сертификат + + + СертификатыСертификатРасширеннаяПодсказка + 98 + Label + true + true + + Left + + + + СертификатыСертификатКонтекстноеМеню + 97 + true + + LabelField + true + Enter + true + Left + true + + true + true + true + + + true + true + + true + + + <key>ru</key> + <value>Описание сертификата</value> + + Left + + ГруппаОписаниеСертификатаРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + UsualGroup + + Vertical + Left + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа горизонтальная</value> + + + ГруппаГоризонтальнаяРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + WeakSeparation + true + true + Auto + Auto + +
        + + ГруппаНеСертификаты + 85 + + ФайлыНеЯвляютсяСертификатами + 61 + true + + true + + + ФайлыНеЯвляютсяСертификатами + + None + + НеСертификатыПутьКФайлу + 74 + true + true + + true + + + ФайлыНеЯвляютсяСертификатами.ПутьКФайлу + + + НеСертификатыПутьКФайлуРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + НеСертификатыПутьКФайлуКонтекстноеМеню + 75 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФайлыНеЯвляютсяСертификатамиКоманднаяПанель + 62 + Left + + + ФайлыНеЯвляютсяСертификатамиСтрокаПоиска + 65 + + ФайлыНеЯвляютсяСертификатамиСтрокаПоискаРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + + ФайлыНеЯвляютсяСертификатамиСтрокаПоискаКонтекстноеМеню + 66 + true + + ФайлыНеЯвляютсяСертификатами + + true + + + + ФайлыНеЯвляютсяСертификатамиСостояниеПросмотра + 71 + + ФайлыНеЯвляютсяСертификатамиСостояниеПросмотраРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + ФайлыНеЯвляютсяСертификатамиСостояниеПросмотраКонтекстноеМеню + 72 + true + + ViewStatusAddition + ФайлыНеЯвляютсяСертификатами + + true + + + + ФайлыНеЯвляютсяСертификатамиУправлениеПоиском + 68 + + ФайлыНеЯвляютсяСертификатамиУправлениеПоискомРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + + ФайлыНеЯвляютсяСертификатамиУправлениеПоискомКонтекстноеМеню + 69 + true + + SearchControlAddition + ФайлыНеЯвляютсяСертификатами + + true + + + + ФайлыНеЯвляютсяСертификатамиРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + ФайлыНеЯвляютсяСертификатамиКонтекстноеМеню + 63 + true + + true + true + true + true + true + true + MultiRow +
        true
        + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + AsFileRef + true + +
        + true + true + + true + + + <key>ru</key> + <value>Файлы не являются сертификатами электронной подписи</value> + + + ГруппаНеСертификатыРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Collapsible + true + Button + WeakSeparation + true + true + auto + Auto + Auto + +
        + + ФормаКоманднаяПанель + -1 + + СертификатыДобавитьСертификатыВСправочник + 77 + true + true + + true + + + СертификатыДобавитьСертификатыВСправочникРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + Form.Command.ДобавитьСертификатыВСправочник + Auto + true + true + true + UserCmds + Auto + + Left + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + auto + true + + Сертификаты + + <key>ru</key> + <value>Сертификаты</value> + + 1 + + ValueTable + + + true + + + true + + + КомуВыдан + 2 + + String + + + + true + + + true + + + + ФизическоеЛицо + + <key>ru</key> + <value>Физическое лицо</value> + + 3 + + DefinedType.ФизическоеЛицо + + + true + + + true + + + + АдресСертификата + 4 + + String + + + + true + + + true + + + + ОписаниеДанных + 6 + + String + + + + true + + + true + + + + Отпечаток + 13 + + String + + 28 + + + + true + + + true + + + + Сертификат + + <key>ru</key> + <value>Сертификат в справочнике</value> + + 14 + + CatalogRef.СертификатыКлючейЭлектроннойПодписиИШифрования + + + true + + + true + + + + ДействителенДо + 15 + + Date + + + + true + + + true + + + + Обновить + 16 + + Boolean + + + true + + + true + + + + Представление + + <key>ru</key> + <value>Сертификат</value> + + 17 + + String + + + + true + + + true + + + + + СертификатОписаниеДанных + + <key>ru</key> + <value>Сертификат описание данных</value> + + 5 + + ValueTable + + + true + + + true + + + Свойство + + <key>ru</key> + <value>Свойство</value> + + 1 + + String + + + + true + + + true + + + + Значение + + <key>ru</key> + <value>Значение</value> + + 2 + + String + + + + true + + + true + + + + + Организация + + <key>ru</key> + <value>Организация</value> + + 7 + + DefinedType.Организация + + + true + + + true + + + + ФайлыНеЯвляютсяСертификатами + + <key>ru</key> + <value>Файлы не являются сертификатами электронной подписи</value> + + 8 + + ValueTable + + + true + + + true + + + ПутьКФайлу + + <key>ru</key> + <value>Путь к файлу</value> + + 9 + + String + + + + true + + + true + + + + + РасширениеПодключено + 18 + + + true + + + true + + + + ПоказатьДанныеСертификата + + <key>ru</key> + <value>Показать данные сертификата</value> + + 1 + + ru + Показать данные сертификата, которые сохраняются в файле + + + true + + + CommonPicture.СертификатКлюча + + + + ПоказатьДанныеСертификата + + + DontUse + Auto + + + ДобавитьСертификатыВСправочник + + <key>ru</key> + <value>Добавить сертификаты в справочник</value> + + 2 + + true + + + + ДобавитьСертификатыВСправочник + + + Auto + Auto + + + ПомещенныеФайлы + + + + + + +
        diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатовДляШифрования/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатовДляШифрования/Module.bsl new file mode 100644 index 000000000..c8d941a8b --- /dev/null +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатовДляШифрования/Module.bsl @@ -0,0 +1,424 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ПомещенныеФайлы = Параметры.ПомещенныеФайлы; + + ДляПоискаФизическихЛиц = Новый Массив; + + Если ЗначениеЗаполнено(ПомещенныеФайлы) Тогда + + Для Каждого ФайлСертификата Из ПомещенныеФайлы Цикл + + ДанныеСертификата = ПолучитьИзВременногоХранилища(ФайлСертификата.Хранение); + + СертификатКриптографии = ЭлектроннаяПодписьСлужебный.СертификатИзДвоичныхДанных(ДанныеСертификата); + Если СертификатКриптографии = Неопределено Тогда + НоваяСтрока = ФайлыНеЯвляютсяСертификатами.Добавить(); + Если ЗначениеЗаполнено(ФайлСертификата.ПолноеИмя) Тогда + НоваяСтрока.ПутьКФайлу = ФайлСертификата.ПолноеИмя; + Иначе + НоваяСтрока.ПутьКФайлу = ФайлСертификата.ИмяФайла; + КонецЕсли; + Иначе + СвойстваСертификата = ЭлектроннаяПодпись.СвойстваСертификата(СертификатКриптографии); + + Если Сертификаты.НайтиСтроки(Новый Структура("Отпечаток, ДействителенДо", + СвойстваСертификата.Отпечаток, СвойстваСертификата.ДействителенДо)).Количество() > 0 Тогда + Продолжить; + КонецЕсли; + + КомуВыдан = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПреобразоватьКомуВыданКВидуФИО(СвойстваСертификата.КомуВыдан); // Строка + + НоваяСтрока = Сертификаты.Добавить(); + НоваяСтрока.Представление = СвойстваСертификата.Представление; + НоваяСтрока.КомуВыдан = КомуВыдан; + НоваяСтрока.АдресСертификата = ПоместитьВоВременноеХранилище(СертификатКриптографии.Выгрузить(), УникальныйИдентификатор); + НоваяСтрока.Отпечаток = СвойстваСертификата.Отпечаток; + НоваяСтрока.ДействителенДо = СвойстваСертификата.ДействителенДо; + + ДляПоискаФизическихЛиц.Добавить(КомуВыдан); + КонецЕсли; + КонецЦикла; + + КонецЕсли; + + Если Метаданные.ОпределяемыеТипы.ФизическоеЛицо.Тип.СодержитТип(Тип("Строка")) Тогда + Элементы.СертификатыФизическоеЛицо.Видимость = Ложь; + Иначе + Элементы.СертификатыФизическоеЛицо.Подсказка = + Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.Реквизиты.ФизическоеЛицо.Подсказка; + КонецЕсли; + + ЗаполнитьСертификатыВТаблице(); + + Если Элементы.СертификатыФизическоеЛицо.Видимость И ДляПоискаФизическихЛиц.Количество() > 0 Тогда + + ФизическиеЛица = ЭлектроннаяПодписьСлужебный.ПолучитьФизическиеЛицаПоПолюСертификатаКомуВыдан(ДляПоискаФизическихЛиц); + Для Каждого ТекущаяСтрока Из Сертификаты Цикл + + Если ЗначениеЗаполнено(ТекущаяСтрока.ФизическоеЛицо) Тогда + Продолжить; + КонецЕсли; + + МассивЗначений = ФизическиеЛица.Получить(ТекущаяСтрока.КомуВыдан); + Если ТипЗнч(МассивЗначений) = Тип("Массив") И МассивЗначений.Количество() = 1 Тогда + ТекущаяСтрока.ФизическоеЛицо = МассивЗначений[0]; + ТекущаяСтрока.Обновить = Истина; + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + Элементы.ФайлыНеЯвляютсяСертификатами.Видимость = ФайлыНеЯвляютсяСертификатами.Количество() > 0; + + Если Метаданные.ОпределяемыеТипы.Организация.Тип.СодержитТип(Тип("Строка")) Тогда + Элементы.Организация.Видимость = Ложь; + Иначе + Если Параметры.Свойство("Организация") Тогда + Организация = Параметры.Организация; + КонецЕсли; + + Элементы.Организация.Подсказка = + Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.Реквизиты.Организация.Подсказка; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "Запись_СертификатыКлючейЭлектроннойПодписиИШифрования" Тогда + + Если Не Элементы.СертификатыФизическоеЛицо.Видимость Тогда + Возврат; + КонецЕсли; + + Найдено = Сертификаты.НайтиСтроки(Новый Структура("Сертификат", Источник)); + + Если Найдено.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ФизическоеЛицоСертификата = ФизическоеЛицоСертификата(Источник); + Для Каждого ТекущаяСтрока Из Найдено Цикл + ТекущаяСтрока.ФизическоеЛицо = ФизическоеЛицоСертификата; + ТекущаяСтрока.Обновить = Ложь; + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыСертификаты + +&НаКлиенте +Процедура СертификатыПриАктивизацииСтроки(Элемент) + + ТекущиеДанные = Элементы.Сертификаты.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Элементы.СертификатыСертификат.Видимость = ЗначениеЗаполнено(ТекущиеДанные.Сертификат); + + Если РасширениеПодключено = Ложь Тогда + ЗаполнитьОписаниеДанныхСертификатаНаСервере(ТекущиеДанные.АдресСертификата); + ИначеЕсли РасширениеПодключено = Истина Тогда + ЗаполнитьОписаниеДанныхСертификата(Истина, ТекущиеДанные.АдресСертификата); + Иначе + ЭлектроннаяПодписьКлиент.УстановитьРасширение(Ложь, Новый ОписаниеОповещения( + "ЗаполнитьОписаниеДанныхСертификата", ЭтотОбъект, ТекущиеДанные.АдресСертификата), + НСтр("ru = 'Для продолжения установите расширение для работы с криптографией.'")); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СертификатыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, ЭтоГруппа, Параметр) + + Отказ = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура СертификатыФизическоеЛицоАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) + + НачалоВыбораФизическогоЛица(СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура СертификатыФизическоеЛицоНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + НачалоВыбораФизическогоЛица(СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура СертификатыПредставлениеПриИзменении(Элемент) + + Элементы.Сертификаты.ТекущиеДанные.Обновить = Истина; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ПоказатьДанныеСертификата(Команда) + + Если Элементы.Сертификаты.ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + СертификатАдрес = Элементы.Сертификаты.ТекущиеДанные.АдресСертификата; + ЭлектроннаяПодписьКлиент.ОткрытьСертификат(СертификатАдрес, Истина); + +КонецПроцедуры + +&НаКлиенте +Асинх Процедура ДобавитьСертификатыВСправочник(Команда) + + Успех = ДобавитьСертификатыВСправочникНаСервере(); + Оповестить("Запись_СертификатыКлючейЭлектроннойПодписиИШифрования"); + + Если Успех Тогда + Ответ = Ждать ВопросАсинх(НСтр("ru = 'Сертификаты добавлены успешно. Закрыть форму?'"), РежимДиалогаВопрос.ДаНет); + Если Ответ = КодВозвратаДиалога.Да Тогда + Закрыть(); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ПриЗакрытииФормыВыбораФизическогоЛица(Значение, Параметры) Экспорт + + Если Значение = Неопределено Тогда + Возврат; + КонецЕсли; + + Элементы.Сертификаты.ТекущиеДанные.ФизическоеЛицо = Значение; + Элементы.Сертификаты.ТекущиеДанные.Обновить = Истина; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСертификатыВТаблице() + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Отпечатки", Сертификаты.Выгрузить(, "Отпечаток")); + + Запрос.Текст = + "ВЫБРАТЬ + | Отпечатки.Отпечаток + |ПОМЕСТИТЬ Отпечатки + |ИЗ + | &Отпечатки КАК Отпечатки + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Сертификаты.Отпечаток, + | Сертификаты.ФизическоеЛицо, + | Сертификаты.Ссылка + |ИЗ + | Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК Сертификаты + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Отпечатки КАК Отпечатки + | ПО Сертификаты.Отпечаток = Отпечатки.Отпечаток"; + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + СтрокаСертификата = Сертификаты.НайтиСтроки(Новый Структура("Отпечаток", Выборка.Отпечаток)); + Для Каждого ТекущаяСтрока Из СтрокаСертификата Цикл + + Если Элементы.СертификатыФизическоеЛицо.Видимость Тогда + ТекущаяСтрока.ФизическоеЛицо = Выборка.ФизическоеЛицо; + КонецЕсли; + ТекущаяСтрока.Сертификат = Выборка.Ссылка; + + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ФизическоеЛицоСертификата(Сертификат) + + Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Сертификат, "ФизическоеЛицо"); + +КонецФункции + +&НаКлиенте +Процедура НачалоВыбораФизическогоЛица(СтандартнаяОбработка) + + ТекущиеДанные = Элементы.Сертификаты.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ЗначениеЗаполнено(ТекущиеДанные.Сертификат) И ЗначениеЗаполнено(ТекущиеДанные.ФизическоеЛицо) + И Не ТекущиеДанные.Обновить Тогда + СтандартнаяОбработка = Ложь; + ПоказатьЗначение(, ТекущиеДанные.Сертификат); + Возврат; + КонецЕсли; + + Результат = ЭлектроннаяПодписьСлужебныйВызовСервера.ПолучитьФизическиеЛицаПоПолюСертификатаКомуВыдан( + ТекущиеДанные.КомуВыдан); + + Если Не Результат.Свойство("ФизическиеЛица") Тогда + Возврат; + КонецЕсли; + + ФизическиеЛица = Результат.ФизическиеЛица.Получить(ТекущиеДанные.КомуВыдан); + + СтандартнаяОбработка = Ложь; + + Если ФизическиеЛица = Неопределено Тогда + ОбработкаВыбора = Новый ОписаниеОповещения("ПриЗакрытииФормыВыбораФизическогоЛица", ЭтотОбъект); + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ОткрытьФорму(Результат.ПутьФормыВыбораФизическогоЛица, ПараметрыФормы, ЭтотОбъект, , , , ОбработкаВыбора, + РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + Возврат; + КонецЕсли; + + Если ФизическиеЛица.Количество() = 1 Тогда + Если ТекущиеДанные.ФизическоеЛицо <> ФизическиеЛица[0] Тогда + ТекущиеДанные.ФизическоеЛицо = ФизическиеЛица[0]; + Иначе + ОбработкаВыбора = Новый ОписаниеОповещения("ПриЗакрытииФормыВыбораФизическогоЛица", ЭтотОбъект); + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ОткрытьФорму(Результат.ПутьФормыВыбораФизическогоЛица, ПараметрыФормы, ЭтотОбъект, , , , ОбработкаВыбора, + РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + КонецЕсли; + Возврат; + КонецЕсли; + + ФиксированныеНастройки = Новый НастройкиКомпоновкиДанных; + + Отбор = ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка"); + Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; + Отбор.ПравоеЗначение = ФизическиеЛица; + Отбор.Использование = Истина; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ФиксированныеНастройки", ФиксированныеНастройки); + ПараметрыФормы.Вставить("ОтборПоСсылке", Истина); + ПараметрыФормы.Вставить("РежимВыбора", Истина); + + ОбработкаВыбора = Новый ОписаниеОповещения("ПриЗакрытииФормыВыбораФизическогоЛица", ЭтотОбъект); + ОткрытьФорму(Результат.ПутьФормыВыбораФизическогоЛица, ПараметрыФормы, ЭтотОбъект, , , , ОбработкаВыбора, + РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + +КонецПроцедуры + +&НаСервере +Функция ДобавитьСертификатыВСправочникНаСервере() + + Успех = Истина; + + Для Каждого ТекущаяСтрока Из Сертификаты Цикл + + ПараметрыСертификата = Новый Структура; + + Если ЗначениеЗаполнено(ТекущаяСтрока.Сертификат) Тогда + Если ТекущаяСтрока.Обновить Тогда + ПараметрыСертификата.Вставить("СсылкаНаСертификат", ТекущаяСтрока.Сертификат); + Иначе + Продолжить; + КонецЕсли; + КонецЕсли; + + ПараметрыСертификата.Вставить("Наименование", ТекущаяСтрока.Представление); + + Если Элементы.СертификатыФизическоеЛицо.Видимость И ЗначениеЗаполнено(ТекущаяСтрока.ФизическоеЛицо) Тогда + ПараметрыСертификата.Вставить("ФизическоеЛицо", ТекущаяСтрока.ФизическоеЛицо); + КонецЕсли; + + Если ЗначениеЗаполнено(Организация) И Не ЗначениеЗаполнено(ТекущаяСтрока.Сертификат) Тогда + ПараметрыСертификата.Вставить("Организация", Организация); + КонецЕсли; + + Попытка + + СсылкаНаСертификат = ЭлектроннаяПодпись.ЗаписатьСертификатВСправочник(ТекущаяСтрока.АдресСертификата, ПараметрыСертификата); + ТекущаяСтрока.Сертификат = СсылкаНаСертификат; + ТекущаяСтрока.Обновить = Ложь; + + Исключение + + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось записать сертификат %1: %2'"), ТекущаяСтрока.Представление, + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + ИндексСтроки = Сертификаты.Индекс(ТекущаяСтрока); + ОбщегоНазначения.СообщитьПользователю(СообщениеОбОшибке,, "Сертификаты[" + ИндексСтроки + "].Представление"); + Успех = Ложь; + + КонецПопытки; + + КонецЦикла; + + Возврат Успех; + +КонецФункции + +&НаКлиенте +Асинх Процедура ЗаполнитьОписаниеДанныхСертификата(Результат, АдресСертификата) Экспорт + + Если Результат <> Истина Тогда + РасширениеПодключено = Ложь; + ЗаполнитьОписаниеДанныхСертификатаНаСервере(АдресСертификата); + Возврат; + ИначеЕсли РасширениеПодключено <> Истина Тогда + РасширениеПодключено = Истина; + КонецЕсли; + + СертификатКриптографии = Новый СертификатКриптографии; + Ждать СертификатКриптографии.ИнициализироватьАсинх(ПолучитьИзВременногоХранилища(АдресСертификата)); + СвойстваСертификата = ЭлектроннаяПодписьКлиент.СвойстваСертификата(СертификатКриптографии); + + ЭлектроннаяПодписьСлужебныйКлиентСервер.ЗаполнитьОписаниеДанныхСертификата( + СертификатОписаниеДанных, СвойстваСертификата); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьОписаниеДанныхСертификатаНаСервере(АдресСертификата) + + СертификатКриптографии = Новый СертификатКриптографии(ПолучитьИзВременногоХранилища(АдресСертификата)); + СвойстваСертификата = ЭлектроннаяПодпись.СвойстваСертификата(СертификатКриптографии); + + ЭлектроннаяПодписьСлужебныйКлиентСервер.ЗаполнитьОписаниеДанныхСертификата( + СертификатОписаниеДанных, СвойстваСертификата); + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ОповещениеОбОкончанииСрокаДействия/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ОповещениеОбОкончанииСрокаДействия/Form.form index c9a0edd95..c2fc8e2ff 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ОповещениеОбОкончанииСрокаДействия/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ОповещениеОбОкончанииСрокаДействия/Form.form @@ -216,7 +216,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Form.form index 88739c73e..b742f5dfc 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Form.form @@ -29,7 +29,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -147,7 +146,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1140,8 +1138,11 @@ true true - Список.DefaultPicture + Список.ТипРазмещения + + CommonPicture.ТипыСертификатов + true 60 diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Module.bsl index 05a8acd07..c6cb400f6 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Module.bsl @@ -35,12 +35,6 @@ ГруппаПользователейПриИзмененииНаСервере(); - Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда - МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS"); - Элементы.Список.КартинкаСтрок = МодульСервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ТипыСертификатов");; - Элементы.Список.ПутьКДаннымКартинкиСтроки = "Список.ТипРазмещения"; - КонецЕсли; - КонецПроцедуры &НаКлиенте diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Form.form index b1a0cc835..b146387c1 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Form.form @@ -73,7 +73,6 @@ UsualGroup Vertical - Auto true true Auto @@ -115,13 +114,16 @@ Left true + + Clearing + ТипПодписиОчистка + true true true true true true - true Normal @@ -147,7 +149,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -295,7 +296,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -396,7 +396,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -523,7 +522,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -717,7 +715,6 @@ UsualGroup Vertical - Auto true true Auto @@ -746,7 +743,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -779,7 +775,6 @@ UsualGroup Vertical - Auto true true Auto @@ -858,7 +853,6 @@ UsualGroup Vertical - Auto true true Auto @@ -888,7 +882,6 @@ UsualGroup Vertical - Auto true Auto @@ -921,7 +914,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1061,7 +1053,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Module.bsl index 39e2cf87d..cc3d81493 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Module.bsl @@ -263,6 +263,13 @@ КонецПроцедуры +&НаКлиенте +Процедура ТипПодписиОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы @@ -281,7 +288,7 @@ Если МодульСервисКриптографииDSSПодтверждениеКлиент.ПроверкаПередВыполнениемОперации(ЭтотОбъект, СвойстваПароля.Значение) Тогда МодульСервисКриптографииDSSПодтверждениеКлиент.ВыполнитьНачальнуюОперациюСервиса(ЭтотОбъект, ОписаниеДанных, СвойстваПароля.Значение); КонецЕсли; - Иначе + Иначе Если Не Элементы.Подписать.Доступность Тогда Возврат; КонецЕсли; @@ -601,14 +608,7 @@ ОбработатьОшибку(Контекст.Оповещение, Контекст.ОшибкаНаКлиенте, Контекст.ОшибкаНаСервере); Возврат; КонецЕсли; - - Если Не ЗначениеЗаполнено(СертификатПрограмма) Тогда - Контекст.ОшибкаНаКлиенте.Вставить("ОписаниеОшибки", - НСтр("ru = 'Программа для использования закрытого ключа не указана в сертификате.'")); - ОбработатьОшибку(Контекст.Оповещение, Контекст.ОшибкаНаКлиенте, Контекст.ОшибкаНаСервере); - Возврат; - КонецЕсли; - + Если СертификатОтозван Тогда Контекст.ОшибкаНаКлиенте.Вставить("ОписаниеОшибки", НСтр("ru = 'Сертификат помечен в программе как отозванный. @@ -623,7 +623,7 @@ ПодписаниеРазрешено = ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекЗагрузить( Сертификат, "РазрешитьПодписание", Неопределено); - + Если ПодписаниеРазрешено = Неопределено Тогда Оповещение = Новый ОписаниеОповещения("ПодписатьДанныеПослеОтветаНаВопрос", ЭтотОбъект, Контекст); @@ -644,7 +644,6 @@ ПодписатьДанныеПослеОтветаНаВопрос(ПодписаниеРазрешено, Контекст); Возврат; - КонецЕсли; ПодписатьДанныеПослеОтветаНаВопрос(Истина, Контекст) @@ -728,7 +727,7 @@ // Продолжение процедуры ПодписатьДанные. &НаКлиенте -Процедура ПодписатьДанныеПослеПроверкиСертификата(Результат, Контекст) Экспорт +Асинх Процедура ПодписатьДанныеПослеПроверкиСертификата(Результат, Контекст) Экспорт Если ПеременныеОчищены() Тогда Возврат; @@ -770,7 +769,7 @@ // Продолжение процедуры ПодписатьДанные. &НаКлиенте -Процедура ПодписатьДанныеПослеВыполненияНаСторонеСервера(Результат, Контекст) Экспорт +Асинх Процедура ПодписатьДанныеПослеВыполненияНаСторонеСервера(Результат, Контекст) Экспорт Если ПеременныеОчищены() Тогда Возврат; @@ -915,48 +914,49 @@ #Область ПодключаемыеОбработчики -//@skip-warning &НаКлиенте Процедура Подключаемый_ПодтверждениеОбработкаКоманды(Команда) МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); - МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаКоманды(ЭтотОбъект, Команда, ОписаниеДанных, СвойстваПароля.Значение); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаКоманды(ЭтотОбъект, Команда, ОписаниеДанных, + СвойстваПароля.Значение); КонецПроцедуры -//@skip-warning &НаКлиенте -Процедура Подключаемый_ПодтверждениеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) +Процедура Подключаемый_ПодтверждениеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, + СтандартнаяОбработка) МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); - МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаНавигационнойСсылки(ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаНавигационнойСсылки(ЭтотОбъект, Элемент, + НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка); КонецПроцедуры -//@skip-warning &НаКлиенте Процедура Подключаемый_ПодтверждениеПриИзменении(Элемент) МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); - МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриИзменении(ЭтотОбъект, Элемент, ОписаниеДанных, СвойстваПароля.Значение); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриИзменении(ЭтотОбъект, Элемент, ОписаниеДанных, + СвойстваПароля.Значение); КонецПроцедуры -//@skip-warning &НаКлиенте Процедура Подключаемый_ПодтверждениеОбработчикОжидания() МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); - МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаОжидания(ЭтотОбъект, ОписаниеДанных, СвойстваПароля.Значение); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаОжидания(ЭтотОбъект, ОписаниеДанных, + СвойстваПароля.Значение); КонецПроцедуры -//@skip-warning &НаКлиенте Процедура Подключаемый_ПодтверждениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); - МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеНачалоВыбора(ЭтотОбъект, Элемент, ДанныеВыбора, СтандартнаяОбработка); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеНачалоВыбора(ЭтотОбъект, Элемент, ДанныеВыбора, + СтандартнаяОбработка); КонецПроцедуры diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Form.form index 3815c5082..db63e9898 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Form.form @@ -109,7 +109,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -345,7 +344,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -492,7 +490,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -562,7 +559,6 @@ UsualGroup Vertical - Auto true true Auto @@ -590,7 +586,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -825,7 +820,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -972,7 +966,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -1042,7 +1035,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1071,7 +1063,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1312,7 +1303,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -1459,7 +1449,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -1529,7 +1518,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1558,7 +1546,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1793,7 +1780,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -1940,7 +1926,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -2010,7 +1995,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2039,7 +2023,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -2068,7 +2051,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2306,7 +2288,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -2453,7 +2434,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -2523,7 +2503,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2552,7 +2531,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -2788,7 +2766,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -2935,7 +2912,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -3005,7 +2981,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3034,7 +3009,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -3270,7 +3244,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -3417,7 +3390,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -3487,7 +3459,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3516,7 +3487,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -3751,7 +3721,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -3898,7 +3867,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -3968,7 +3936,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3997,7 +3964,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -4026,7 +3992,6 @@ UsualGroup Vertical - Auto true true Auto @@ -4058,7 +4023,6 @@ UsualGroup Vertical - Auto true true Auto @@ -4220,7 +4184,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -4414,7 +4377,6 @@ UsualGroup Vertical - Auto true true Auto @@ -4447,7 +4409,6 @@ UsualGroup HorizontalIfPossible - Auto true true auto @@ -4455,6 +4416,43 @@ Auto + + ДекорацияПредупреждение + 436 + + <key>ru</key> + <value>Выполните проверку заново</value> + + true + true + + true + + + ДекорацияПредупреждениеРасширеннаяПодсказка + 438 + Label + true + true + + Left + + + + ДекорацияПредупреждениеКонтекстноеМеню + 437 + true + + Label + true + true + + Left + + Style.ToolTipBackColor + + + ГруппаПодвал 156 @@ -4462,51 +4460,14 @@ ГруппаТребуетсяПомощь 158 Low - - ТипичныеПроблемы - 160 - - <key>ru</key> - <value>При возникновении затруднений ознакомьтесь со списком <link ТипичныеПроблемы>типичных проблем при работе с программой электронной подписи и их решений</>.</value> - - true - true - - true - - - ТипичныеПроблемыРасширеннаяПодсказка - 162 - Label - true - true - - Left - - - - ТипичныеПроблемыКонтекстноеМеню - 161 - true - - true - Label - true - true - - - URLProcessing - ТипичныеПроблемыОбработкаНавигационнойСсылки - - Left - - ИнформацияДляПоддержки - 163 + 439 <key>ru</key> - <value>В иных случаях обратитесь в службу поддержки фирмы "1С", предоставив <link Ссылка>техническую информацию о возникшей проблеме</>.</value> + <value>При возникновении затруднений ознакомьтесь со списком <link %1>типичных проблем при работе с программой электронной подписи и их решений</>. + +В иных случаях обратитесь в службу поддержки фирмы "1С", предоставив <link %2>техническую информацию о возникшей проблеме</>.</value> true true @@ -4515,7 +4476,7 @@
        ИнформацияДляПоддержкиРасширеннаяПодсказка - 165 + 441 Label true true @@ -4525,7 +4486,7 @@ ИнформацияДляПоддержкиКонтекстноеМеню - 164 + 440 true true @@ -4702,7 +4663,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -5156,6 +5116,28 @@ true + + ПрограммаАвтоНаКлиенте + 29 + + + true + + + true + + + + ПрограммаАвтоНаСервере + 30 + + + true + + + true + + Проверить diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl index d551adb81..6097e797d 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl @@ -18,6 +18,8 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Элементы.ИнформацияДляПоддержки.Заголовок = ЭлектроннаяПодписьСлужебный.ЗаголовокИнформацииДляПоддержки(); + ЭлектроннаяПодписьСлужебный.НастроитьПояснениеВводаПароля( ЭтотОбъект, , Элементы.ПояснениеУсиленногоПароля.Имя); @@ -176,6 +178,7 @@ Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда Элементы.ГруппаТребуетсяПомощь.Поведение = ПоведениеОбычнойГруппы.Свертываемая; КонецЕсли; + Элементы.ДекорацияПредупреждение.Видимость = Ложь; СтандартныеПодсистемыСервер.СброситьРазмерыИПоложениеОкна(ЭтотОбъект); @@ -203,6 +206,12 @@ Возврат; КонецЕсли; + Если ВРег(ИмяСобытия) = ВРег("Установка_КомпонентаExtraCryptoAPI") Тогда + Элементы.ДекорацияПредупреждение.Видимость = Истина; + Элементы.ДекорацияПредупреждение.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Установлена компонента %1, выполните проверку заново.'"), "ExtraCryptoAPI"); + КонецЕсли; + // При изменении настроек использования. Если ВРег(ИмяСобытия) <> ВРег("Запись_НаборКонстант") Тогда Возврат; @@ -279,18 +288,15 @@ КонецПроцедуры -&НаКлиенте -Процедура ТипичныеПроблемыОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - ЭлектроннаяПодписьКлиент.ОткрытьИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами(); - -КонецПроцедуры - &НаКлиенте Процедура ИнформацияДляПоддержкиОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; + + Если НавигационнаяСсылка = "ТипичныеПроблемы" Тогда + ЭлектроннаяПодписьКлиент.ОткрытьИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами(); + Возврат; + КонецЕсли; Если Не ПроверкаВыполнена Тогда ПоказатьПредупреждение(, @@ -327,6 +333,7 @@ &НаКлиенте Процедура Проверить(Команда) + Элементы.ДекорацияПредупреждение.Видимость = Ложь; Элементы.ФормаПроверить.Доступность = Ложь; Элементы.ФормаПроверить.Отображение = ОтображениеКнопки.КартинкаИТекст; ПроверитьСертификат(Новый ОписаниеОповещения("ПроверитьЗавершение", ЭтотОбъект)); @@ -650,7 +657,7 @@ СтандартнаяОбработка = Ложь; - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); УстановитьЭлемент(ЭтотОбъект, ИмяПервойПроверки, Ложь, ОписаниеОшибки, Истина, ОбъединятьРезультаты); ВыполнитьОбработкуОповещения(Контекст.Оповещение); @@ -816,7 +823,7 @@ // Продолжение процедуры ПроверитьНаСторонеКлиента. &НаКлиенте -Процедура ПроверитьНаСторонеКлиентаПослеПроверкиСертификата(Результат, Контекст) Экспорт +Асинх Процедура ПроверитьНаСторонеКлиентаПослеПроверкиСертификата(Результат, Контекст) Экспорт Если Результат = Истина Тогда ОписаниеОшибкиНаКлиенте = ""; @@ -846,8 +853,24 @@ "ПроверкаСертификата", ПараметрыСоздания); Иначе - ОписаниеОшибки = НСтр("ru = 'Программа для использования закрытого ключа не указана в сертификате.'"); - ПроверитьНаСторонеКлиентаПослеСозданияМенеджераКриптографии(ОписаниеОшибки, Контекст); + + ПрограммаАвтоНаКлиентеРезультат = Ждать ЭлектроннаяПодписьСлужебныйКлиент.ПрограммаПоСертификату( + АдресСертификата); + ПрограммаАвтоНаКлиенте = ПрограммаАвтоНаКлиентеРезультат.Программа; + Если ПрограммаАвтоНаКлиентеРезультат.Программа = Неопределено Тогда + ОписаниеОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТекстОшибкиНеУдалосьОпределитьПрограмму( + ПрограммаАвтоНаКлиентеРезультат.Ошибка); + ПроверитьНаСторонеКлиентаПослеСозданияМенеджераКриптографии(ОписаниеОшибки, Контекст); + Иначе + ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыСозданияМенеджераКриптографии(); + ПараметрыСоздания.Программа = ПрограммаАвтоНаКлиенте; + ПараметрыСоздания.ПоказатьОшибку = Ложь; + ПараметрыСоздания.ИнтерактивныйРежим = СертификатВводитьПарольВПрограммеЭлектроннойПодписи; + + ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографии( + Новый ОписаниеОповещения("ПроверитьНаСторонеКлиентаПослеСозданияМенеджераКриптографии", ЭтотОбъект, + Контекст), "ПроверкаСертификата", ПараметрыСоздания); + КонецЕсли; КонецЕсли; КонецПроцедуры @@ -868,13 +891,14 @@ Иначе ОписаниеОшибки = Результат.ИнформацияОбОшибке.Описание; КонецЕсли; + УстановитьЭлемент(ЭтотОбъект, "ДанныеСертификата", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты); Если Контекст.ПроверкаВСервисеВместоПроверкиНаСервере Тогда ВыполнитьОбработкуОповещения(Контекст.Оповещение); Возврат; КонецЕсли; - + // Наличие программы Если ЗначениеЗаполнено(Программа) Тогда ПроверитьНаСторонеКлиентаВМоделиСервиса("СервисКриптографии", Контекст); @@ -967,7 +991,7 @@ Процедура ПроверитьНаСторонеКлиентаПослеОшибкиПодписания(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; - ПроверитьНаСторонеКлиентаПослеПодписания(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст); + ПроверитьНаСторонеКлиентаПослеПодписания(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст); КонецПроцедуры @@ -1043,7 +1067,7 @@ Процедура ПроверитьНаСторонеКлиентаПослеОшибкиПроверкиПодписи(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; - ПроверитьНаСторонеКлиентаПослеПроверкиПодписи(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст); + ПроверитьНаСторонеКлиентаПослеПроверкиПодписи(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст); КонецПроцедуры @@ -1102,7 +1126,7 @@ Процедура ПроверитьНаСторонеКлиентаПослеОшибкиШифрования(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; - ПроверитьНаСторонеКлиентаПослеШифрования(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст); + ПроверитьНаСторонеКлиентаПослеШифрования(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст); КонецПроцедуры @@ -1170,7 +1194,7 @@ Процедура ПроверитьНаСторонеКлиентаПослеОшибкиРасшифровки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; - ПроверитьНаСторонеКлиентаПослеРасшифровки(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст); + ПроверитьНаСторонеКлиентаПослеРасшифровки(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст); КонецПроцедуры @@ -1279,7 +1303,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ПараметрыВыполнения.ОжидатьПродолжения = Ложь; - ПараметрыВыполнения.ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПараметрыВыполнения.ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Если ПараметрыВыполнения.ОжидатьПродолжения <> Истина Тогда @@ -1598,7 +1622,7 @@ СертификатКриптографии = Новый СертификатКриптографии(ДанныеСертификата); Исключение УстановитьЭлемент(ЭтотОбъект, ИмяПервойПроверки, Истина, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), Истина, ОбъединятьРезультаты); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), Истина, ОбъединятьРезультаты); Возврат; КонецПопытки; @@ -1642,8 +1666,21 @@ МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии("ПроверкаСертификата", ПараметрыСоздания); ОписаниеОшибки = ПараметрыСоздания.ОписаниеОшибки; Иначе - МенеджерКриптографии = Неопределено; - ОписаниеОшибки = НСтр("ru = 'Программа для использования закрытого ключа не указана в сертификате.'"); + + ПрограммаАвтоНаСервереРезультат = ЭлектроннаяПодписьСлужебный.ПрограммаПоСертификату(АдресСертификата); + ПрограммаАвтоНаСервере = ПрограммаАвтоНаСервереРезультат.Программа; + + Если ПрограммаАвтоНаСервереРезультат.Программа = Неопределено Тогда + ОписаниеОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТекстОшибкиНеУдалосьОпределитьПрограмму( + ПрограммаАвтоНаСервереРезультат.Ошибка); + МенеджерКриптографии = Неопределено; + Иначе + ПараметрыСоздания = ЭлектроннаяПодписьСлужебный.ПараметрыСозданияМенеджераКриптографии(); + ПараметрыСоздания.Программа = ПрограммаАвтоНаСервере; + МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии("ПроверкаСертификата", ПараметрыСоздания); + ОписаниеОшибки = ПараметрыСоздания.ОписаниеОшибки; + КонецЕсли; + КонецЕсли; Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда @@ -1723,7 +1760,7 @@ ДанныеПодписи = МенеджерКриптографии.Подписать(ДанныеСертификата, СертификатКриптографии); ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеДанныеПодписи(ДанныеПодписи, ОписаниеОшибки); Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; ПарольПринят = Не ЗначениеЗаполнено(ОписаниеОшибки); @@ -1739,7 +1776,7 @@ Попытка МенеджерКриптографии.ПроверитьПодпись(ДанныеСертификата, ДанныеПодписи); Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; УстановитьЭлемент(ЭтотОбъект, "ПроверкаПодписи", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты); @@ -1752,7 +1789,7 @@ ЗашифрованныеДанные = МенеджерКриптографии.Зашифровать(ДанныеСертификата, СертификатКриптографии); ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеЗашифрованныеДанные(ЗашифрованныеДанные, ОписаниеОшибки); Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; УстановитьЭлемент(ЭтотОбъект, "Шифрование", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты); @@ -1768,7 +1805,7 @@ РасшифрованныеДанные = МенеджерКриптографии.Расшифровать(ЗашифрованныеДанные); ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеРасшифрованныеДанные(РасшифрованныеДанные, ОписаниеОшибки); Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; УстановитьЭлемент(ЭтотОбъект, "Расшифровка", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты); @@ -1799,7 +1836,7 @@ ОписаниеОшибки = ПараметрыВыполнения.ОписаниеОшибки; ЭтоПредупреждение = ПараметрыВыполнения.ЭтоПредупреждение; Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; УстановитьЭлемент(ЭтотОбъект, ЭлементСписка.Имя, Истина, @@ -1983,7 +2020,7 @@ ЭлементНадписьОшибка.Заголовок = ОписаниеОшибки; Если ПредупреждениеПослеПроверкиУЦ = Неопределено Тогда - ОписаниеИзвестнойОшибки = ОшибкаПоКлассификатору(ОписаниеОшибки); + ОписаниеИзвестнойОшибки = ОшибкаПоКлассификатору(ОписаниеОшибки, НаСервере); ЭтоИзвестнаяОшибка = ОписаниеИзвестнойОшибки <> Неопределено; ИмяНадписиРешение = НачалоЭлемента + ?(НаСервере, "РешениеСерверНадпись", "РешениеКлиентНадпись"); @@ -2162,9 +2199,9 @@ КонецПроцедуры &НаСервереБезКонтекста -Функция ОшибкаПоКлассификатору(ОписаниеОшибки) +Функция ОшибкаПоКлассификатору(ОписаниеОшибки, ОшибкаНаСервере) - Возврат ЭлектроннаяПодписьСлужебный.ОшибкаПоКлассификатору(ОписаниеОшибки); + Возврат ЭлектроннаяПодписьСлужебный.ОшибкаПоКлассификатору(ОписаниеОшибки, ОшибкаНаСервере); КонецФункции @@ -2190,6 +2227,8 @@ ДополнительныеДанные = ЭлектроннаяПодписьСлужебныйКлиент.ДополнительныеДанныеДляКлассификатораОшибок(); ДополнительныеДанные.Сертификат = Сертификат; + ДополнительныеДанные.ДанныеСертификата = АдресСертификата; + Если ИмяОшибки <> Неопределено Тогда ДополнительныеДанные.ДополнительныеДанныеПроверокНаКлиенте = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеДанныеПроверокНаКлиенте, ИмяОшибки, Неопределено); diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПросмотрДанных/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПросмотрДанных/Form.form index 2baa7e97a..976f4f66f 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПросмотрДанных/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПросмотрДанных/Form.form @@ -237,6 +237,38 @@ <commandSource>Item.Список</commandSource> </extInfo> </items> + <items xsi:type="form:Addition"> + <title> + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 27 + + СтрокаПоискРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 28 + true + + Список + + true + + Left true diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Form.form index 88eea90ff..94e80c15f 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Form.form @@ -74,7 +74,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -277,7 +276,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -470,7 +468,6 @@ UsualGroup Vertical - Auto true true Auto @@ -502,7 +499,6 @@ UsualGroup Vertical - Auto true true Auto @@ -531,7 +527,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -567,7 +562,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -707,7 +701,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Module.bsl index f437888b9..5ddca5b62 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Module.bsl @@ -548,19 +548,11 @@ Контекст.Вставить("ОшибкаНаКлиенте", Новый Структура); Контекст.Вставить("ОшибкаНаСервере", Новый Структура); - Если Не ЗначениеЗаполнено(СертификатПрограмма) Тогда - Контекст.ОшибкаНаКлиенте.Вставить("ОписаниеОшибки", - НСтр("ru = 'У выбранного сертификата не указана программа для закрытого ключа. - |Выберите сертификат повторно из полного списка или - |откройте сертификат и укажите программу вручную.'")); - ОбработатьОшибку(Контекст.Оповещение, Контекст.ОшибкаНаКлиенте, Контекст.ОшибкаНаСервере); - Возврат; - КонецЕсли; - ВыбранныйСертификат = Новый Структура; ВыбранныйСертификат.Вставить("Ссылка", Сертификат); ВыбранныйСертификат.Вставить("Отпечаток", СертификатОтпечаток); ВыбранныйСертификат.Вставить("Данные", СертификатАдрес); + ОписаниеДанных.Вставить("ВыбранныйСертификат", ВыбранныйСертификат); Если ОписаниеДанных.Свойство("ПередВыполнением") @@ -580,7 +572,7 @@ // Продолжение процедуры РасшифроватьДанные. &НаКлиенте -Процедура РасшифроватьДанныеПослеОбработкиПередВыполнением(Результат, Контекст) Экспорт +Асинх Процедура РасшифроватьДанныеПослеОбработкиПередВыполнением(Результат, Контекст) Экспорт Если ПеременныеОчищены() Тогда Возврат; @@ -603,6 +595,8 @@ ПараметрыВыполнения.Вставить("Форма", ЭтотОбъект); ПараметрыВыполнения.Вставить("ИдентификаторФормы", Контекст.ИдентификаторФормы); ПараметрыВыполнения.Вставить("ЗначениеПароля", СвойстваПароля.Значение); + ПараметрыВыполнения.Вставить("СертификатАдрес", СертификатАдрес); // Для определения программы автоматически. + Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения); Если ЭлектроннаяПодписьКлиент.СоздаватьЭлектронныеПодписиНаСервере() @@ -622,12 +616,11 @@ РасшифроватьДанныеПослеВыполненияНаСторонеСервера(Неопределено, Контекст); КонецЕсли; - КонецПроцедуры // Продолжение процедуры РасшифроватьДанные. &НаКлиенте -Процедура РасшифроватьДанныеПослеВыполненияНаСторонеСервера(Результат, Контекст) Экспорт +Асинх Процедура РасшифроватьДанныеПослеВыполненияНаСторонеСервера(Результат, Контекст) Экспорт Если ПеременныеОчищены() Тогда Возврат; @@ -773,7 +766,7 @@ ОтменитьТранзакцию(); ИнформацияОбОшибке = ИнформацияОбОшибке(); Ошибка.Вставить("ОписаниеОшибки", НСтр("ru = 'При очистке сертификатов шифрования возникла ошибка:'") - + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; КонецПроцедуры @@ -816,48 +809,48 @@ // Локализация -//@skip-warning &НаКлиенте Процедура Подключаемый_ПодтверждениеОбработкаКоманды(Команда) МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); - МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаКоманды(ЭтотОбъект, Команда, ОписаниеДанных, СвойстваПароля.Значение); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаКоманды(ЭтотОбъект, Команда, ОписаниеДанных, + СвойстваПароля.Значение); КонецПроцедуры -//@skip-warning &НаКлиенте Процедура Подключаемый_ПодтверждениеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); - МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаНавигационнойСсылки(ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаНавигационнойСсылки(ЭтотОбъект, Элемент, + НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка); КонецПроцедуры -//@skip-warning &НаКлиенте Процедура Подключаемый_ПодтверждениеПриИзменении(Элемент) МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); - МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриИзменении(ЭтотОбъект, Элемент, ОписаниеДанных, СвойстваПароля.Значение); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриИзменении(ЭтотОбъект, Элемент, ОписаниеДанных, + СвойстваПароля.Значение); КонецПроцедуры -//@skip-warning &НаКлиенте Процедура Подключаемый_ПодтверждениеОбработчикОжидания() МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); - МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаОжидания(ЭтотОбъект, ОписаниеДанных, СвойстваПароля.Значение); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаОжидания(ЭтотОбъект, ОписаниеДанных, + СвойстваПароля.Значение); КонецПроцедуры -//@skip-warning &НаКлиенте Процедура Подключаемый_ПодтверждениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); - МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеНачалоВыбора(ЭтотОбъект, Элемент, ДанныеВыбора, СтандартнаяОбработка); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеНачалоВыбора(ЭтотОбъект, Элемент, ДанныеВыбора, + СтандартнаяОбработка); КонецПроцедуры diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/СписокПользователей/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/СписокПользователей/Form.form index 9a85d67aa..e8dca4262 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/СписокПользователей/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/СписокПользователей/Form.form @@ -81,7 +81,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -429,7 +428,6 @@ UsualGroup Vertical - Auto true true Auto @@ -458,7 +456,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/УстановкаСертификата/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/УстановкаСертификата/Form.form new file mode 100644 index 000000000..18d31d730 --- /dev/null +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/УстановкаСертификата/Form.form @@ -0,0 +1,1269 @@ + + + + ГруппаОписаниеСертификата + 53 + + СертификатОписаниеДанных + 55 + + <key>ru</key> + <value>Сертификат</value> + + true + true + + true + + + СертификатОписаниеДанных + + true + Top + + СертификатОписаниеДанныхСвойство + 68 + true + true + + true + + + СертификатОписаниеДанных.Свойство + + true + + СертификатОписаниеДанныхСвойствоРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + + СертификатОписаниеДанныхСвойствоКонтекстноеМеню + 69 + true + + InputField + Auto + true + Left + true + + 13 + true + true + false + true + true + true + true + Normal + + + + СертификатОписаниеДанныхЗначение + 71 + true + true + + true + + + СертификатОписаниеДанных.Значение + + true + + СертификатОписаниеДанныхЗначениеРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + СертификатОписаниеДанныхЗначениеКонтекстноеМеню + 72 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + СертификатОписаниеДанныхКоманднаяПанель + 57 + Left + + + СертификатОписаниеДанныхСтрокаПоиска + 59 + + СертификатОписаниеДанныхСтрокаПоискаРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + СертификатОписаниеДанныхСтрокаПоискаКонтекстноеМеню + 60 + true + + СертификатОписаниеДанных + + true + + + + СертификатОписаниеДанныхСостояниеПросмотра + 62 + + СертификатОписаниеДанныхСостояниеПросмотраРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + СертификатОписаниеДанныхСостояниеПросмотраКонтекстноеМеню + 63 + true + + ViewStatusAddition + СертификатОписаниеДанных + + true + + + + СертификатОписаниеДанныхУправлениеПоиском + 65 + + СертификатОписаниеДанныхУправлениеПоискомРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + + СертификатОписаниеДанныхУправлениеПоискомКонтекстноеМеню + 66 + true + + SearchControlAddition + СертификатОписаниеДанных + + true + + + + СертификатОписаниеДанныхРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + СертификатОписаниеДанныхКонтекстноеМеню + 56 + true + + true + true + true + 51 + 51 + 4 + true + true + MultiRow + Row + 1 + 1 + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + true + true + + + + ПоказатьДанныеСертификата + 74 + true + true + + true + + true + + ПоказатьДанныеСертификатаРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + UsualButton + Form.Command.ПоказатьДанныеСертификата + Normal + Picture + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Описание сертификата</value> + + Left + + ГруппаОписаниеСертификатаРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Left + true + true + Auto + Auto + + + + ГруппаВариантУстановки + 82 + + ВариантУстановки + 29 + true + true + + true + + + ВариантУстановки + + Button + + OnChange + ВариантУстановкиПриИзменении + + + ВариантУстановкиРасширеннаяПодсказка + 31 + + <key>ru</key> + <value><b>Хранилища сертификатов</> - это области операционной системы, в которых хранятся сертификаты.  +<b>Личные сертификаты</> должны быть установлены в хранилище личных сертификатов. +Сертификаты <b>доверенных корневых центров</> должны быть установлены в хранилище доверенных корневых сертификатов. Если вы устанавливаете сертификат в доверенные корневые сертификаты, это означает, что вы будете автоматически доверять любому сертификату, выданному с использованием этого сертификата. +Для операций с закрытым ключом, таких как подписание и расшифровка данных, сертификат также должен быть установлен в контейнер закрытого ключа, который был создан в момент создания запроса на сертификат.</value> + + true + Label + true + true + + Left + + + + ВариантУстановкиКонтекстноеМеню + 30 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + + + ru + Личное хранилище + + + MY + + + + + ru + Доверенные корневые сертификаты + + + ROOT + + + + + ru + Контейнер и личное хранилище + + + Контейнер + + + Normal + + + + ДекорацияПредупреждение + 79 + + <key>ru</key> + <value>Внимание, установка сертификата в доверенные корневые сертификаты означает, что вы будете автоматически доверять любому сертификату, выданному с использованием этого сертификата.</value> + + true + true + + true + + + ДекорацияПредупреждениеРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + ДекорацияПредупреждениеКонтекстноеМеню + 80 + true + + true + Label + true + true + + Left + + Style.ToolTipBackColor + + + + true + true + + true + + + <key>ru</key> + <value>Группа Вариант установки</value> + + 45 + + ГруппаВариантУстановкиРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + + + + ГруппаКонтейнеры + 38 + + ТаблицаКонтейнеры + 40 + + Контейнеры + 1 + + <key>ru</key> + <value>Контейнеры</value> + + true + true + + true + + + Контейнеры + + None + + КонтейнерыСчитыватель + 50 + true + true + + true + + + Контейнеры.Считыватель + + + КонтейнерыСчитывательРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + КонтейнерыСчитывательКонтекстноеМеню + 51 + true + + InputField + Enter + true + Left + true + + 10 + true + true + false + true + true + true + true + Normal + + + + КонтейнерыДружественноеИмя + 17 + true + true + + true + + + Контейнеры.ДружественноеИмя + + + КонтейнерыДружественноеИмяРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + КонтейнерыДружественноеИмяКонтекстноеМеню + 18 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + КонтейнерыКоманднаяПанель + 2 + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 84 + + СтрокаПоискРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 85 + true + + Контейнеры + + true + + + Left + + + КонтейнерыСтрокаПоиска + 5 + + КонтейнерыСтрокаПоискаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + КонтейнерыСтрокаПоискаКонтекстноеМеню + 6 + true + + Контейнеры + + true + + + + КонтейнерыСостояниеПросмотра + 11 + + КонтейнерыСостояниеПросмотраРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + КонтейнерыСостояниеПросмотраКонтекстноеМеню + 12 + true + + ViewStatusAddition + Контейнеры + + true + + + + КонтейнерыУправлениеПоиском + 8 + + КонтейнерыУправлениеПоискомРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + КонтейнерыУправлениеПоискомКонтекстноеМеню + 9 + true + + SearchControlAddition + Контейнеры + + true + + + + КонтейнерыРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + + КонтейнерыКонтекстноеМеню + 3 + true + + true + true + true + true + true + true + MultiRow +
        true
        + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + AsFileRef + true + +
        + true + true + + true + + + <key>ru</key> + <value>Таблица контейнеры</value> + + + ТаблицаКонтейнерыРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + Page + + Vertical + auto + false + +
        + + ОбновлениеТаблицы + 42 + + ДекорацияКартинка + 44 + + <key>ru</key> + <value>Декорация картинка</value> + + true + true + + true + + + ДекорацияКартинкаРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ДекорацияКартинкаКонтекстноеМеню + 45 + true + + true + true + + + CommonPicture.ДлительнаяОперация48 + + AsFileRef + + + + ДекорацияНадпись + 47 + + <key>ru</key> + <value>Поиск контейнеров на компьютере</value> + + true + true + + true + + + ДекорацияНадписьРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + ДекорацияНадписьКонтекстноеМеню + 48 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Обновление</value> + + + ОбновлениеТаблицыРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + Page + + AlwaysHorizontal + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Контейнеры</value> + + + ГруппаКонтейнерыРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + Pages + + Auto + +
        + + ДекорацияТекущийКонтейнер + 76 + + <key>ru</key> + <value>Сертификат установлен в контейнер:</value> + + true + true + + true + + + ДекорацияТекущийКонтейнерРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + + ДекорацияТекущийКонтейнерКонтекстноеМеню + 77 + true + + Label + true + true + + Left + + + + ФормаКоманднаяПанель + -1 + + КонтейнерыОбновить + 32 + true + true + + true + + + КонтейнерыОбновитьРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.Command.Обновить + Normal + PictureAndText + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ФормаУстановить + 36 + true + true + + true + + + ФормаУстановитьРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + Form.Command.Установить + Auto + true + true + true + UserCmds + Auto + + + ФормаЗакрыть + 34 + true + true + + true + + + ФормаЗакрытьРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + Auto + true + true + UserCmds + Auto + + Left + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + auto + true + + Контейнеры + + <key>ru</key> + <value>Контейнеры на компьютере</value> + + 3 + + ValueTable + + + true + + + true + + + Имя + 4 + + String + + + + true + + + true + + + + ДружественноеИмя + + <key>ru</key> + <value>Имя</value> + + 5 + + String + + + + true + + + true + + + + ИмяПрограммы + 6 + + String + + + + true + + + true + + + + ТипПрограммы + 7 + + Number + + 10 + + + + true + + + true + + + + Путь + 8 + + String + + + + true + + + true + + + + ЭтоТекущийКонтейнер + 12 + + Boolean + + + true + + + true + + + + Считыватель + + <key>ru</key> + <value>Считыватель</value> + + 13 + + String + + + + true + + + true + + + + + ВариантУстановки + + <key>ru</key> + <value>Установить в</value> + + 9 + + String + + + + true + + + true + + + + Сертификат + 11 + + String + + + + true + + + true + + + + СертификатОписаниеДанных + + <key>ru</key> + <value>Сертификат описание данных</value> + + 14 + + ValueTable + + + true + + + true + + + Свойство + + <key>ru</key> + <value>Свойство</value> + + 1 + + String + + + + true + + + true + + + + Значение + + <key>ru</key> + <value>Значение</value> + + 2 + + String + + + + true + + + true + + + + + Обновить + + <key>ru</key> + <value>Обновить контейнеры</value> + + 1 + + true + + + StdPicture.Refresh + + + + Обновить + + + Auto + Auto + + + Установить + + <key>ru</key> + <value>Установить</value> + + 2 + + true + + + + Установить + + + Auto + Auto + + + ПоказатьДанныеСертификата + + <key>ru</key> + <value>Показать данные сертификата</value> + + 3 + + ru + Показать данные сертификата, которые сохраняются в файле + + + true + + + CommonPicture.СертификатКлюча + + + + ПоказатьДанныеСертификата + + + DontUse + Auto + + + Сертификат + + String + + + true + + + СвойстваКонтейнера + + + + ВариантыУстановки + + + + + + +
        diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/УстановкаСертификата/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/УстановкаСертификата/Module.bsl new file mode 100644 index 000000000..52d55a421 --- /dev/null +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/УстановкаСертификата/Module.bsl @@ -0,0 +1,213 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + СписокВыбора = Элементы.ВариантУстановки.СписокВыбора; + СписокВыбора.Очистить(); + + Если Не ЗначениеЗаполнено(Параметры.ВариантыУстановки) Тогда + ВариантыУстановки = ВариантыУстановкиСертификата(); + Для Каждого ТекущийВариантУстановки Из ВариантыУстановки Цикл + СписокВыбора.Добавить(ТекущийВариантУстановки.Значение, ТекущийВариантУстановки.Представление); + КонецЦикла; + ИначеЕсли Параметры.ВариантыУстановки = "Контейнер" Тогда + СписокВыбора.Добавить("Контейнер", НСтр("ru = 'Контейнер и личное хранилище'")); + ИначеЕсли ТипЗнч(Параметры.ВариантыУстановки) = Тип("Строка") Тогда + СписокВыбора.Добавить(Параметры.ВариантыУстановки); + Иначе + Для Каждого ТекущийВариантУстановки Из Параметры.ВариантыУстановки Цикл + СписокВыбора.Добавить(ТекущийВариантУстановки.Значение, ТекущийВариантУстановки.Представление); + КонецЦикла; + КонецЕсли; + + ВариантУстановки = СписокВыбора[0].Значение; + + СертификатДвоичныеДанные = Неопределено; + Если ЭтоАдресВременногоХранилища(Параметры.Сертификат) Тогда + СертификатДвоичныеДанные = ПолучитьИзВременногоХранилища(Параметры.Сертификат); + ИначеЕсли ЗначениеЗаполнено(Параметры.Сертификат) Тогда + СертификатДвоичныеДанные = Base64Значение(Параметры.Сертификат); + КонецЕсли; + + Если СертификатДвоичныеДанные <> Неопределено Тогда + СвойстваСертификата = ЭлектроннаяПодпись.СвойстваСертификата( + Новый СертификатКриптографии(СертификатДвоичныеДанные)); + ЭлектроннаяПодписьСлужебныйКлиентСервер.ЗаполнитьОписаниеДанныхСертификата( + СертификатОписаниеДанных, СвойстваСертификата); + КонецЕсли; + + Элементы.ДекорацияТекущийКонтейнер.Видимость = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ВариантУстановкиПриИзменении(Неопределено); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ВариантУстановкиПриИзменении(Элемент) + + Если ВариантУстановки = "Контейнер" Тогда + Элементы.ГруппаКонтейнеры.Видимость = Истина; + Элементы.КонтейнерыОбновить.Видимость = Истина; + Если Контейнеры.Количество() = 0 Тогда + ПодключитьОбработчикОжидания("НайтиКонтейнеры", 0.1, Истина); + КонецЕсли; + Иначе + Элементы.ГруппаКонтейнеры.Видимость = Ложь; + Элементы.КонтейнерыОбновить.Видимость = Ложь; + КонецЕсли; + + Элементы.ДекорацияПредупреждение.Видимость = ВРег(ВариантУстановки) = "ROOT"; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Обновить(Команда) + + ПодключитьОбработчикОжидания("НайтиКонтейнеры", 0.1, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура Установить(Команда) + + ПараметрыУстановкиСертификата = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыУстановкиСертификата(Параметры.Сертификат); + ПараметрыУстановкиСертификата.Форма = ЭтотОбъект; + ПараметрыУстановкиСертификата.ОповещениеОЗавершении = Новый ОписаниеОповещения("ПослеУстановкиСертификата", ЭтотОбъект, ПараметрыУстановкиСертификата); + + Если ВариантУстановки = "Контейнер" Тогда + + ТекущиеДанные = Элементы.Контейнеры.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Выберите контейнер'")); + Возврат; + КонецЕсли; + + СвойстваКонтейнера = ЭлектроннаяПодписьСлужебныйКлиент.НовыеСвойстваКонтейнера(); + ЗаполнитьЗначенияСвойств(СвойстваКонтейнера, ТекущиеДанные); + ПараметрыУстановкиСертификата.СвойстваКонтейнера = СвойстваКонтейнера; + ПараметрыУстановкиСертификата.Хранилище = НСтр("ru = 'контейнер'"); + + Иначе + + ЭлементСписка = Элементы.ВариантУстановки.СписокВыбора.НайтиПоЗначению(ВариантУстановки); + ПараметрыУстановкиСертификата.Хранилище = Новый Структура("Значение, Представление", ВариантУстановки, ЭлементСписка.Представление); + + КонецЕсли; + + ЭлектроннаяПодписьСлужебныйКлиент.УстановитьСертификатПослеВыбораВариантаУстановки(ПараметрыУстановкиСертификата); + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьДанныеСертификата(Команда) + + ЭлектроннаяПодписьКлиент.ОткрытьСертификат(Параметры.Сертификат, Истина); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ПослеУстановкиСертификата(Результат, Контекст) Экспорт + + Если Результат.УстановкаВыполнена = Истина Тогда + Закрыть(Результат); + Иначе + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ЗаголовокПредупреждения", НСтр("ru = 'Не удалось установить сертификат.'")); + ПараметрыФормы.Вставить("ТекстОшибкиКлиент", Результат.Сообщение); + + ОткрытьФорму("ОбщаяФорма.РасширенноеПредставлениеОшибки", + ПараметрыФормы, Контекст.Форма,,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Асинх Процедура НайтиКонтейнеры() + + Элементы.ГруппаКонтейнеры.ТекущаяСтраница = Элементы.ОбновлениеТаблицы; + Контейнеры.Очистить(); + Элементы.ДекорацияТекущийКонтейнер.Видимость = Ложь; + Элементы.ДекорацияТекущийКонтейнер.Заголовок= ""; + + КонтейнерыПоСертификату = Ждать ЭлектроннаяПодписьСлужебныйКлиент.КонтейнерыПоСертификату( + Параметры.Сертификат); // Массив из см. ЭлектроннаяПодписьСлужебныйКлиент.НовыеСвойстваКонтейнера + + Для Каждого Контейнер Из КонтейнерыПоСертификату Цикл + НоваяСтрока = Контейнеры.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, Контейнер); + НоваяСтрока.Считыватель = Считыватель(Контейнер.Имя); + Если Контейнер.ЭтоТекущийКонтейнер = Истина Тогда + Элементы.ДекорацияТекущийКонтейнер.Видимость = Истина; + Элементы.ДекорацияТекущийКонтейнер.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сертификат установлен в контейнер: %1'"), Контейнер.Имя); + КонецЕсли; + КонецЦикла; + + Элементы.ГруппаКонтейнеры.ТекущаяСтраница = Элементы.ТаблицаКонтейнеры; + Если КонтейнерыПоСертификату.Количество() = 0 Тогда + Элементы.ДекорацияТекущийКонтейнер.Заголовок = НСтр("ru = 'Не найдено подходящих контейнеров для установки сертификата'"); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция Считыватель(Знач ИмяКонтейнера) + + ИмяКонтейнера = ВРег(ИмяКонтейнера); + + Если СтрНачинаетсяС(ИмяКонтейнера, "\\.\REGISTRY") Тогда + Возврат НСтр("ru = 'Реестр'"); + КонецЕсли; + + Если СтрНачинаетсяС(ИмяКонтейнера, "\\.\FAT12") Тогда + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Диск %1'"), Сред(ИмяКонтейнера, 11, 1)); + КонецЕсли; + + Если СтрНачинаетсяС(ИмяКонтейнера, "\\.\HDIMAGE") Тогда + Возврат НСтр("ru = 'Диск'"); + КонецЕсли; + + Возврат ""; + +КонецФункции + +&НаСервере +Функция ВариантыУстановкиСертификата() + + СписокЗначений = Новый СписокЗначений; + СписокЗначений.Добавить("MY", НСтр("ru = 'Личное хранилище сертификатов'")); + СписокЗначений.Добавить("CA", НСтр("ru = 'Промежуточные сертификаты'")); + СписокЗначений.Добавить("ROOT", НСтр("ru = 'Доверенные корневые сертификаты'")); + СписокЗначений.Добавить("Контейнер", НСтр("ru = 'Контейнер и личное хранилище'")); + Возврат СписокЗначений; + +КонецФункции + +#КонецОбласти diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form index 9d7f6cf2f..d26174345 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form @@ -1,287 +1,138 @@ - ПредупреждениеГруппа - 310 - - ПредупреждениеКартинка - 315 - true - true - - true - - - ПредупреждениеКартинкаРасширеннаяПодсказка - 317 - Label + ШапкаГруппа + 325 + + ПредупреждениеГруппа + 310 + + ПредупреждениеКартинка + 315 + true + true + + true + + + ПредупреждениеКартинкаРасширеннаяПодсказка + 317 + Label + true + true + + Left + + + + ПредупреждениеКартинкаКонтекстноеМеню + 316 + true + true true - - Left + + + CommonPicture.Предупреждение + + AsFileRef - - - ПредупреждениеКартинкаКонтекстноеМеню - 316 - true - - true - true - - - CommonPicture.Предупреждение - - AsFileRef - - - - Предупреждение - 312 - - <key>ru</key> - <value>Предупреждение</value> - - true - true - - true - - - ПредупреждениеРасширеннаяПодсказка - 314 - Label - true - true - - Left - - - - ПредупреждениеКонтекстноеМеню - 313 - true - - Label - 70 - true - true - - - URLProcessing - ПредупреждениеОбработкаНавигационнойСсылки - - Left - - - - ПодписаниеРазрешено - 318 - true - true - - true - - - ПодписаниеРазрешено - - Right - Button - - OnChange - ПодписаниеРазрешеноПриИзменении - - - ПодписаниеРазрешеноРасширеннаяПодсказка - 320 + + + Предупреждение + 312 <key>ru</key> - <value>Эта персональная настройка позволяет игнорировать проверку квалифицированности сертификата при создании и проверке подписи. Подпись, сделанная данным сертификатом, не будет являться юридически значимой, но может использоваться, например, для внутреннего документооборота.</value> + <value>Предупреждение</value> + true + true + + true + + + ПредупреждениеРасширеннаяПодсказка + 314 + Label + true + true + + Left + + + + ПредупреждениеКонтекстноеМеню + 313 + true + Label - true + 70 true + true + + URLProcessing + ПредупреждениеОбработкаНавигационнойСсылки + Left - - - ПодписаниеРазрешеноКонтекстноеМеню - 319 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Предупреждение группа</value> - - - ПредупреждениеГруппаРасширеннаяПодсказка - 311 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - WeakSeparation - true - true - - Style.ЦветФонаВнимание - - Auto - Auto - - - - СостояниеСертификатаГруппа - 276 - - КартинкаСертификата - 281 - - <key>ru</key> - <value>Картинка сертификата</value> - - true - true - - true - - - КартинкаСертификатаРасширеннаяПодсказка - 283 - Label - true - true - - Left - - - - КартинкаСертификатаКонтекстноеМеню - 282 - true - - true - true - Center - - - CommonPicture.СертификатКлюча - - AsFileRef - - - - СостояниеСертификата - 290 - - <key>ru</key> - <value>Состояние сертификата</value> - - true - true - - true - - - СостояниеСертификатаРасширеннаяПодсказка - 292 - Label - true - true - - Left - - - - СостояниеСертификатаКонтекстноеМеню - 291 - true - - Label - 70 - true - true - - Left - - - - ДекорацияПеревыпущен - 305 - - <key>ru</key> - <value><link СертификатПеревыпущен>(перевыпущен)</></value> - - true - - true - - - ДекорацияПеревыпущенРасширеннаяПодсказка - 307 - Label - true - true - - Left - - - - ДекорацияПеревыпущенКонтекстноеМеню - 306 - true - - true - Label - true - true - + + + ПодписаниеРазрешено + 322 + true + true + + true + + + ПодписаниеРазрешено + + Right + Button - URLProcessing - ДекорацияПеревыпущенОбработкаНавигационнойСсылки + OnChange + ПодписаниеРазрешеноПриИзменении - Left -
        - - - НапомнитьОПеревыпуске - 278 + + ПодписаниеРазрешеноРасширеннаяПодсказка + 324 + + <key>ru</key> + <value>Эта персональная настройка позволяет игнорировать проверку квалифицированности сертификата при создании и проверке подписи. Подпись, сделанная данным сертификатом, не будет являться юридически значимой, но может использоваться, например, для внутреннего документооборота.</value> + + Label + true + true + + Left + + + + ПодписаниеРазрешеноКонтекстноеМеню + 323 + true + + CheckBoxField + Right + Enter + true + Left + true + + true true true - - НапомнитьОПеревыпуске - - Right - - OnChange - НапомнитьОПеревыпускеПриИзменении - + + <key>ru</key> + <value>Предупреждение группа</value> + - НапомнитьОПеревыпускеРасширеннаяПодсказка - 280 + ПредупреждениеГруппаРасширеннаяПодсказка + 311 Label true true @@ -289,18 +140,200 @@ Left
        - - НапомнитьОПеревыпускеКонтекстноеМеню - 279 - true - - CheckBoxField - Right - Enter - true - Left - true - + UsualGroup + + HorizontalIfPossible + WeakSeparation + true + true + + Style.ЦветФонаВнимание + + Auto + Auto + + + + СостояниеСертификатаГруппа + 276 + + КартинкаСертификата + 281 + + <key>ru</key> + <value>Картинка сертификата</value> + + true + true + + true + + + КартинкаСертификатаРасширеннаяПодсказка + 283 + Label + true + true + + Left + + + + КартинкаСертификатаКонтекстноеМеню + 282 + true + + true + true + Center + + + CommonPicture.СертификатКлюча + + AsFileRef + + + + СостояниеСертификата + 290 + + <key>ru</key> + <value>Состояние сертификата</value> + + true + true + + true + + + СостояниеСертификатаРасширеннаяПодсказка + 292 + Label + true + true + + Left + + + + СостояниеСертификатаКонтекстноеМеню + 291 + true + + Label + 70 + true + true + + + + ДекорацияПеревыпущен + 305 + + <key>ru</key> + <value><link СертификатПеревыпущен>(перевыпущен)</></value> + + true + + true + + + ДекорацияПеревыпущенРасширеннаяПодсказка + 307 + Label + true + true + + Left + + + + ДекорацияПеревыпущенКонтекстноеМеню + 306 + true + + true + Label + true + true + + + URLProcessing + ДекорацияПеревыпущенОбработкаНавигационнойСсылки + + Left + + + + НапомнитьОПеревыпуске + 278 + true + true + + true + + + НапомнитьОПеревыпуске + + Right + + OnChange + НапомнитьОПеревыпускеПриИзменении + + + НапомнитьОПеревыпускеРасширеннаяПодсказка + 280 + Label + true + true + + Left + + + + НапомнитьОПеревыпускеКонтекстноеМеню + 279 + true + + CheckBoxField + Right + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Состояние сертификата группа</value> + + + СостояниеСертификатаГруппаРасширеннаяПодсказка + 277 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + WeakSeparation + true + true + + Style.ToolTipBackColor + + Auto + Auto + true true @@ -309,11 +342,11 @@ <key>ru</key> - <value>Состояние сертификата группа</value> + <value>Шапка группа</value> - СостояниеСертификатаГруппаРасширеннаяПодсказка - 277 + ШапкаГруппаРасширеннаяПодсказка + 326 Label true true @@ -323,14 +356,10 @@ UsualGroup - HorizontalIfPossible + Vertical Auto - WeakSeparation true true - - Style.ToolTipBackColor - Auto Auto @@ -638,7 +667,6 @@ UsualGroup Vertical - Auto true true Auto @@ -667,7 +695,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -864,7 +891,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -981,7 +1007,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1010,7 +1035,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1124,20 +1148,89 @@ DontUse - - ФизическоеЛицо - 287 + + ГруппаФизическоеЛицо + 318 + + ФизическоеЛицо + 287 + true + true + + true + + + Объект.ФизическоеЛицо + + + ФизическоеЛицоРасширеннаяПодсказка + 289 + Label + true + true + + Left + + + + ФизическоеЛицоКонтекстноеМеню + 288 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПодобратьФизическоеЛицо + 320 + true + true + + true + + + ПодобратьФизическоеЛицоРасширеннаяПодсказка + 321 + Label + true + true + + Left + + + UsualButton + Form.Command.ПодобратьФизическоеЛицо + Normal + Picture + true + true + UserCmds + Auto + true true true - - Объект.ФизическоеЛицо - + + <key>ru</key> + <value>Группа физическое лицо</value> + - ФизическоеЛицоРасширеннаяПодсказка - 289 + ГруппаФизическоеЛицоРасширеннаяПодсказка + 319 Label true true @@ -1145,24 +1238,14 @@ Left - - ФизическоеЛицоКонтекстноеМеню - 288 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - Normal + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto true @@ -1187,7 +1270,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1310,7 +1392,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1339,7 +1420,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1368,7 +1448,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1414,6 +1493,10 @@ Left true + + Opening + ПрограммаОткрытие + true true true @@ -1483,7 +1566,6 @@ UsualGroup HorizontalIfPossible - Auto true true auto @@ -1513,7 +1595,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2114,9 +2195,9 @@ ПодписаниеРазрешено <key>ru</key> - <value>Подписание разрешено</value> + <value>Разрешить подписание</value> - 19 + 18 Boolean @@ -2345,6 +2426,31 @@ Auto Auto
        + + ПодобратьФизическоеЛицо + + <key>ru</key> + <value>Подобрать физическое лицо</value> + + 11 + + ru + Подобрать физическое лицо по наименованию из поля сертификата "Кому выдан" + + + true + + + StdPicture.MoveLeft + + + + ПодобратьФизическоеЛицо + + + Auto + Auto + diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Help/ru.html index 6f9745951..c96fc2740 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Help/ru.html @@ -17,13 +17,14 @@
      • Представление - полное наименование сертификата (заполняется автоматически);
      • Заполните поля:
        • Организация - выберите из списка организацию, которой выдан сертификат;
        • +
        • Физическое лицо - выберите из списка физическое лицо или нажмите Подобрать автоматически  (физическое лицо подберется по наименованию из поля сертификата Кому выдан);
        • Пользователи - заполняется автоматически при добавлении сертификата. Редактировать можно в карточке сертификата. Выберите из списка пользователей. В карточке сертификата поле предназначено для указания списка пользователей, у которых данный сертификат будет отображаться в окнах подписания и шифрования данных;
        • Добавил - выберите пользователя, который добавил сертификат в список.

      Настройки закрытого ключа

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

      Проверка сертификата

      -
      • Нажмите Проверить, для того чтобы произвести проверку сертификата.

      Просмотр данных сертификата

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

      Просмотр данных сертификата

      Просмотр заявления

      • diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl index 2a002ebee..b8096e167 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl @@ -173,6 +173,7 @@ &НаКлиенте Процедура ПрограммаПриИзменении(Элемент) + СертификатОблачнойПодписи = ИнформацияОблачнойПодписи(Объект.Программа); ОбновитьВидимостьЭлементаВводитьПарольВПрограммеЭлектроннойПодписи(ЭтотОбъект); КонецПроцедуры @@ -230,6 +231,50 @@ КонецПроцедуры +&НаКлиенте +Асинх Процедура ПрограммаОткрытие(Элемент, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Объект.Программа) Тогда + Возврат; + КонецЕсли; + + СтандартнаяОбработка = Ложь; + + ПрограммаАвто = Неопределено; + ОшибкаНаКлиенте = ""; + ОшибкаНаСервере = ""; + + ПрограммаПоСертификатуРезультат = Ждать ЭлектроннаяПодписьСлужебныйКлиент.ПрограммаПоСертификату(АдресСертификата, Неопределено, Неопределено, Истина); + Если ПрограммаПоСертификатуРезультат.Программа = Неопределено Тогда + ОшибкаНаКлиенте = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТекстОшибкиНеУдалосьОпределитьПрограмму( + ПрограммаПоСертификатуРезультат.Ошибка); + Если ЭлектроннаяПодписьКлиент.ОбщиеНастройки().ПроверятьЭлектронныеПодписиНаСервере + Или ЭлектроннаяПодписьКлиент.ОбщиеНастройки().СоздаватьЭлектронныеПодписиНаСервере Тогда + ПрограммаАвто = ПрограммаПоСертификату(АдресСертификата, ОшибкаНаСервере); + КонецЕсли; + Иначе + ПрограммаАвто = ПрограммаПоСертификатуРезультат.Программа; + КонецЕсли; + + Если ПрограммаАвто <> Неопределено Тогда + Если ЗначениеЗаполнено(ПрограммаАвто.Ссылка) Тогда + ПоказатьЗначение(,ПрограммаАвто.Ссылка); + Иначе + ОткрытьФорму("Справочник.ПрограммыЭлектроннойПодписиИШифрования.Форма.ПрограммаОпределеннаяАвтоматически", + Новый Структура("Программа", ПрограммаАвто), ЭтотОбъект,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + КонецЕсли; + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ЗаголовокПредупреждения", НСтр("ru = 'Не удалось определить программу автоматически'")); + ПараметрыФормы.Вставить("ТекстОшибкиКлиент", ОшибкаНаКлиенте); + ПараметрыФормы.Вставить("ТекстОшибкиСервер", ОшибкаНаСервере); + + ОткрытьФорму("ОбщаяФорма.РасширенноеПредставлениеОшибки", ПараметрыФормы, ЭтотОбъект); + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы @@ -352,7 +397,14 @@ РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); КонецПроцедуры + +&НаКлиенте +Процедура ПодобратьФизическоеЛицо(Команда) + ЭлектроннаяПодписьСлужебныйКлиент.ПодобратьФизическоеЛицоДляСертификата(ЭтотОбъект, Объект.КомуВыдан, Объект.ФизическоеЛицо); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -412,6 +464,7 @@ Иначе // Обычный пользователь не может изменить права доступа. Элементы.ФизическоеЛицо.ТолькоПросмотр = Не ЗначениеЗаполнено(Объект.ФизическоеЛицо); + Элементы.ПодобратьФизическоеЛицо.Доступность = ЗначениеЗаполнено(Объект.ФизическоеЛицо); Если НЕ ЭтоАвтор Тогда // Обычный пользователь не может изменять реквизит Пользователь, // если не он добавил сертификат. @@ -565,10 +618,9 @@ &НаКлиентеНаСервереБезКонтекста Процедура ОбновитьВидимостьЭлементаВводитьПарольВПрограммеЭлектроннойПодписи(Форма) - Форма.Элементы.ВводитьПарольВПрограммеЭлектроннойПодписи.Видимость = - Форма.Объект.Программа <> Форма.ВстроенныйКриптопровайдер - И НЕ Форма.СертификатОблачнойПодписи.ОблачнаяПодпись; - + Форма.Элементы.ВводитьПарольВПрограммеЭлектроннойПодписи.Видимость = Не Форма.СертификатОблачнойПодписи.ОблачнаяПодпись + И Не (ЗначениеЗаполнено(Форма.ВстроенныйКриптопровайдер) И Форма.Объект.Программа = Форма.ВстроенныйКриптопровайдер); + Форма.Элементы.ФормаСменитьПинКод.Видимость = Форма.СертификатОблачнойПодписи.ОблачнаяПодпись; КонецПроцедуры @@ -857,7 +909,7 @@ Если Результат.НайтиПоЗначению(ВыбраннаяПрограмма) = Неопределено Тогда ПредставлениеПрограммы = ?(ЗначениеЗаполнено(ВыбраннаяПрограмма), СокрЛ(ВыбраннаяПрограмма), - НСтр("ru = 'Не выбрана'")); + НСтр("ru = 'По умолчанию'")); Результат.Добавить(ВыбраннаяПрограмма, ПредставлениеПрограммы); КонецЕсли; @@ -878,5 +930,30 @@ КонецПроцедуры +&НаКлиенте +Процедура ПриЗакрытииФормыВыбораФизическогоЛица(Значение, Параметры) Экспорт + + Если Значение = Неопределено Тогда + Возврат; + КонецЕсли; + + Объект.ФизическоеЛицо = Значение; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПрограммаПоСертификату(АдресСертификата, ОшибкаНаСервере) + + ПрограммаПоСертификатуРезультат = ЭлектроннаяПодписьСлужебный.ПрограммаПоСертификату(АдресСертификата); + + Если ПрограммаПоСертификатуРезультат.Программа = Неопределено Тогда + ОшибкаНаСервере = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТекстОшибкиНеУдалосьОпределитьПрограмму( + ПрограммаПоСертификатуРезультат.Ошибка); + Возврат Неопределено; + КонецЕсли; + + Возврат ПрограммаПоСертификатуРезультат.Программа; + +КонецФункции #КонецОбласти diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Form.form index 7e293b912..a2187dc05 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Form.form @@ -73,7 +73,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -193,7 +192,6 @@ UsualGroup Vertical - Auto true true Auto @@ -225,7 +223,6 @@ UsualGroup Vertical - Auto true true Auto @@ -411,6 +408,38 @@ Item.СертификатыШифрования + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 540 + + СтрокаПоискРасширеннаяПодсказка + 542 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 541 + true + + СертификатыШифрования + + true + + Left @@ -576,7 +605,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -848,7 +876,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -935,7 +962,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1076,7 +1102,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1460,19 +1485,6 @@ true - - ПерваяПрограммаНаСервере - 19 - - DefinedType.ПрограммаЭлектроннойПодписи - - - true - - - true - - ВыполнятьВМоделиСервиса 21 @@ -1500,6 +1512,28 @@ true + + ПрограммаАвто + 23 + + + true + + + true + + + + ПрограммаАвтоНаСервере + 24 + + + true + + + true + + Зашифровать diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Module.bsl index 90bbdd66a..868b22122 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Module.bsl @@ -66,6 +66,8 @@ МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриОткрытии(ЭтотОбъект, Отказ, Ложь, ОписаниеДанных); КонецЕсли; + ПодключитьОбработчикОжидания("ЗаполнитьПрограммуШифрованияОбработчикОжидания", 0.1, Истина); + КонецПроцедуры &НаКлиенте @@ -145,6 +147,8 @@ МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриИзменении(ЭтотОбъект, Элементы.Сертификат, ОписаниеДанных, ""); КонецЕсли; + ЗаполнитьПрограммуШифрования(); + КонецПроцедуры &НаКлиенте @@ -196,6 +200,8 @@ МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриИзменении(ЭтотОбъект, Элементы.Сертификат, ОписаниеДанных, ""); КонецЕсли; + ЗаполнитьПрограммуШифрования(); + КонецПроцедуры &НаКлиенте @@ -416,7 +422,7 @@ НСтр("ru = 'Данные сертификата ""%1"" в справочнике не корректны по причине: |%2'"), Выборка.Представление, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; СвойстваСертификата = ЭлектроннаяПодпись.СвойстваСертификата(СертификатКриптографии); Строка.Отпечаток = Выборка.Отпечаток; @@ -482,7 +488,8 @@ Процедура ЗаполнитьПрограммуШифрованияНаСервере() СертификатПрограмма = Неопределено; - ПерваяПрограммаНаСервере = Неопределено; + ПрограммаАвто = Неопределено; + ПрограммаАвтоНаСервере = Неопределено; Если НаборСертификатов.Количество() > 0 Тогда СертификатАдрес = НаборСертификатов[0].АдресДанных; @@ -501,11 +508,11 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При получении данных сертификата ""%1"" - |из информационной базы возникла ошибка: + НСтр("ru = 'Не удалось получить данные сертификата ""%1"" + |из информационной базы по причине: |%2'"), СертификатыШифрования[0].Сертификат, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; СертификатАдрес = ПоместитьВоВременноеХранилище(ДвоичныеДанныеСертификата, УникальныйИдентификатор); КонецЕсли; @@ -518,6 +525,17 @@ СертификатКриптографии = Новый СертификатКриптографии(ДвоичныеДанныеСертификата); ТестовыеДанные = ТестовыеДвоичныеДанные(); + ПрограммаПоСертификатуРезультат = ЭлектроннаяПодписьСлужебный.ПрограммаПоСертификату(ДвоичныеДанныеСертификата, + Неопределено); + Если ЗначениеЗаполнено(ПрограммаПоСертификатуРезультат.Программа) Тогда + ПрограммаАвтоНаСервере = ПрограммаПоСертификатуРезультат.Программа; + Возврат; + Иначе + ТекстОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТекстОшибкиНеУдалосьОпределитьПрограмму( + ПрограммаПоСертификатуРезультат.Ошибка); + СертификатНаСервереОписаниеОшибки.Вставить("ОписаниеОшибки", ТекстОшибки); + КонецЕсли; + ОписанияПрограмм = ЭлектроннаяПодпись.ОбщиеНастройки().ОписанияПрограмм; АлгоритмПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмПодписиСертификата(ДвоичныеДанныеСертификата); @@ -532,9 +550,6 @@ Если МенеджерКриптографии = Неопределено Тогда Продолжить; КонецЕсли; - Если Не ЗначениеЗаполнено(ПерваяПрограммаНаСервере) Тогда - ПерваяПрограммаНаСервере = ОписаниеПрограммы.Ссылка; - КонецЕсли; Попытка ЗашифрованныеТестовыеДанные = МенеджерКриптографии.Зашифровать(ТестовыеДанные, СертификатКриптографии); Исключение @@ -556,17 +571,34 @@ КонецФункции &НаКлиенте -Процедура ЗаполнитьПрограммуШифрования(Оповещение = Неопределено) +Процедура ЗаполнитьПрограммуШифрованияОбработчикОжидания() + ЗаполнитьПрограммуШифрования(); +КонецПроцедуры + +&НаКлиенте +Асинх Процедура ЗаполнитьПрограммуШифрования(Оповещение = Неопределено) Контекст = Новый Структура; Контекст.Вставить("Оповещение", Оповещение); - Контекст.Вставить("ПерваяПрограммаНаКлиенте", Неопределено); Если ЗначениеЗаполнено(СертификатПрограмма) Тогда ЗаполнитьПрограммуШифрованияПослеЦикла(Контекст); Возврат; КонецЕсли; + Если Не ЭтоАдресВременногоХранилища(СертификатАдрес) Тогда + ЗаполнитьПрограммуШифрованияПослеЦикла(Контекст); + Возврат; + КонецЕсли; + + РезультатПрограммаПоСертификату = Ждать ЭлектроннаяПодписьСлужебныйКлиент.ПрограммаПоСертификату( + СертификатАдрес, Неопределено, Неопределено, Истина); + Если ЗначениеЗаполнено(РезультатПрограммаПоСертификату.Программа) Тогда + ПрограммаАвто = РезультатПрограммаПоСертификату.Программа; + ЗаполнитьПрограммуШифрованияПослеЦикла(Контекст); + Возврат; + КонецЕсли; + ДанныеСертификата = ПолучитьИзВременногоХранилища(СертификатАдрес); Контекст.Вставить("АлгоритмПодписи", ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмПодписиСертификата(ДанныеСертификата)); @@ -647,11 +679,7 @@ ЗаполнитьПрограммуШифрованияЦиклНачало(Контекст); Возврат; КонецЕсли; - - Если Не ЗначениеЗаполнено(Контекст.ПерваяПрограммаНаКлиенте) Тогда - Контекст.ПерваяПрограммаНаКлиенте = Контекст.ОписаниеПрограммы.Ссылка; - КонецЕсли; - + МенеджерКриптографии.НачатьШифрование(Новый ОписаниеОповещения( "ЗаполнитьПрограммуШифрованияПослеШифрования", ЭтотОбъект, Контекст, "ЗаполнитьПрограммуШифрованияПослеОшибкиШифрования", ЭтотОбъект), @@ -694,16 +722,6 @@ &НаКлиенте Процедура ЗаполнитьПрограммуШифрованияПослеЦикла(Контекст) - Если Не ЗначениеЗаполнено(СертификатПрограмма) Тогда - - Если ЗначениеЗаполнено(Контекст.ПерваяПрограммаНаКлиенте) Тогда - СертификатПрограмма = Контекст.ПерваяПрограммаНаКлиенте; - - ИначеЕсли ЗначениеЗаполнено(ПерваяПрограммаНаСервере) Тогда - СертификатПрограмма = ПерваяПрограммаНаСервере; - КонецЕсли; - КонецЕсли; - Если Контекст.Оповещение <> Неопределено Тогда ВыполнитьОбработкуОповещения(Контекст.Оповещение); КонецЕсли; @@ -880,7 +898,7 @@ КонецПроцедуры &НаКлиенте -Процедура ЗашифроватьДанные(Оповещение) +Асинх Процедура ЗашифроватьДанные(Оповещение) Если ЭлектроннаяПодписьСлужебныйКлиент.ЭтоОперацияОблачнойПодписи(ЭтотОбъект) Тогда ЭлектроннаяПодписьСлужебныйКлиент.УстановитьСвойстваОблачнойПодписи(ОписаниеДанных, @@ -896,9 +914,10 @@ Контекст.Вставить("ОшибкаНаСервере", Новый Структура); Если ЗначениеЗаполнено(Сертификат) Тогда - Если Не ЗначениеЗаполнено(СертификатПрограмма) Тогда + Если Не ЗначениеЗаполнено(СертификатПрограмма) + И Не ЗначениеЗаполнено(ПрограммаАвто) И Не ЗначениеЗаполнено(ПрограммаАвтоНаСервере) Тогда Контекст.ОшибкаНаКлиенте.Вставить("ОписаниеОшибки", - НСтр("ru = 'У выбранного личного сертификата не указана программа для закрытого ключа. + НСтр("ru = 'У выбранного личного сертификата не указана программа для закрытого ключа и ее не удалось определить автоматически. |Выберите другой сертификат.'")); ОбработатьОшибку(Оповещение, Контекст.ОшибкаНаКлиенте, Контекст.ОшибкаНаСервере); Возврат; @@ -924,8 +943,7 @@ Ссылки.Добавить(Строка.Сертификат); КонецЕсли; КонецЦикла; - ОписаниеДанных.Вставить("СертификатыШифрования", - СвойстваСертификатов(Ссылки, Контекст.ИдентификаторФормы)); + ОписаниеДанных.Вставить("СертификатыШифрования", СвойстваСертификатов(Ссылки, Контекст.ИдентификаторФормы)); Иначе ОписаниеДанных.Вставить("СертификатыШифрования", АдресСвойствСертификатов); КонецЕсли; @@ -934,6 +952,8 @@ ПараметрыВыполнения.Вставить("ОписаниеДанных", ОписаниеДанных); ПараметрыВыполнения.Вставить("Форма", ЭтотОбъект); ПараметрыВыполнения.Вставить("ИдентификаторФормы", Контекст.ИдентификаторФормы); + ПараметрыВыполнения.Вставить("СертификатАдрес", СертификатАдрес); // Для определения программы автоматически. + Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения); Если ЭлектроннаяПодписьКлиент.СоздаватьЭлектронныеПодписиНаСервере() @@ -957,7 +977,7 @@ // Продолжение процедуры ЗашифроватьДанные. &НаКлиенте -Процедура ЗашифроватьДанныеПослеВыполненияНаСторонеСервера(Результат, Контекст) Экспорт +Асинх Процедура ЗашифроватьДанныеПослеВыполненияНаСторонеСервера(Результат, Контекст) Экспорт Если ПеременныеОчищены() Тогда Возврат; @@ -978,7 +998,7 @@ КонецЕсли; КонецЕсли; - // Попытка подписания на клиенте. + // Попытка шифрования на клиенте. ЭлектроннаяПодписьСлужебныйКлиент.ВыполнитьНаСтороне(Новый ОписаниеОповещения( "ЗашифроватьДанныеПослеВыполненияНаСторонеКлиента", ЭтотОбъект, Контекст), "Шифрование", "НаСторонеКлиента", Контекст.ПараметрыВыполнения); @@ -1083,7 +1103,7 @@ НСтр("ru = 'Данные сертификата ""%1"" в справочнике не корректны по причине: |%2'"), Выборка.Наименование, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; СвойстваСертификата = ЭлектроннаяПодпись.СвойстваСертификата(СертификатКриптографии); @@ -1168,8 +1188,8 @@ Исключение ОтменитьТранзакцию(); ИнформацияОбОшибке = ИнформацияОбОшибке(); - Ошибка.Вставить("ОписаниеОшибки", НСтр("ru = 'При записи сертификатов шифрования возникла ошибка:'") - + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + Ошибка.Вставить("ОписаниеОшибки", НСтр("ru = 'Не удалось записать сертификаты шифрования по причине:'") + + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; КонецПроцедуры @@ -1237,7 +1257,6 @@ // Локализация -//@skip-warning &НаКлиенте Процедура Подключаемый_ПодтверждениеОбработкаКоманды(Команда) @@ -1246,16 +1265,15 @@ КонецПроцедуры -//@skip-warning &НаКлиенте Процедура Подключаемый_ПодтверждениеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); - МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаНавигационнойСсылки(ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаНавигационнойСсылки(ЭтотОбъект, Элемент, + НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка); КонецПроцедуры -//@skip-warning &НаКлиенте Процедура Подключаемый_ПодтверждениеПриИзменении(Элемент) @@ -1264,7 +1282,6 @@ КонецПроцедуры -//@skip-warning &НаКлиенте Процедура Подключаемый_ПодтверждениеОбработчикОжидания() @@ -1273,7 +1290,6 @@ КонецПроцедуры -//@skip-warning &НаКлиенте Процедура Подключаемый_ПодтверждениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/ManagerModule.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/ManagerModule.bsl index b4d8bd674..092828e59 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/ManagerModule.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/ManagerModule.bsl @@ -231,7 +231,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать сертификат: %1 по причине: - |%2'"), Выборка.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + |%2'"), Выборка.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Выборка.Ссылка.Метаданные(), Выборка.Ссылка, ТекстСообщения); @@ -247,10 +247,10 @@ ВызватьИсключение ТекстСообщения; Иначе ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Информация, Метаданные.НайтиПоПолномуИмени( - "Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования"), , СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Обработана очередная порция сертификатов: %1'"), - ОбъектовОбработано)); + УровеньЖурналаРегистрации.Информация, + Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Обработана очередная порция сертификатов: %1'"), ОбъектовОбработано)); КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/Штамп/Template.mxlx b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/Штамп/Template.mxlx index 2a582a8af..b54d3c56e 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/Штамп/Template.mxlx +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/Штамп/Template.mxlx @@ -182,6 +182,7 @@ </row> </rowsItem> <templateMode>true</templateMode> + <defaultFormatIndex>18</defaultFormatIndex> <height>11</height> <vgRows>11</vgRows> <merge> @@ -324,10 +325,6 @@ <endColumn>2</endColumn> </area> </namedItem> - <groupsBackColor>#000000</groupsBackColor> - <groupsColor>#000000</groupsColor> - <headersBackColor>#000000</headersBackColor> - <headersColor>#000000</headersColor> <line width="1" gap="false"> <v8ui:style xsi:type="v8ui:SpreadsheetDocumentCellLineType">None</v8ui:style> </line> @@ -467,6 +464,9 @@ <fillType>Parameter</fillType> <protection>true</protection> </format> + <format> + <width>72</width> + </format> <picture> <index>0</index> <picture/> diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/СертификатыКлючейЭлектроннойПодписиИШифрования.mdo b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/СертификатыКлючейЭлектроннойПодписиИШифрования.mdo index 7804126ba..3b970ffe7 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/СертификатыКлючейЭлектроннойПодписиИШифрования.mdo +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/СертификатыКлючейЭлектроннойПодписиИШифрования.mdo @@ -689,6 +689,15 @@ <usePurposes>PersonalComputer</usePurposes> <usePurposes>MobileDevice</usePurposes> </forms> + <forms uuid="993d8672-af86-4179-a9ef-228303748bcd"> + <name>ДобавлениеСертификатовДляШифрования</name> + <synonym> + <key>ru</key> + <value>Добавление сертификатов для шифрования</value> + </synonym> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> <forms uuid="0f1b284c-6c9e-4799-bc47-3326c4b7bec2"> <name>ПодборСертификатовДляШифрования</name> <synonym> @@ -818,6 +827,15 @@ <usePurposes>PersonalComputer</usePurposes> <usePurposes>MobileDevice</usePurposes> </forms> + <forms uuid="f7e6da22-c2b7-47c9-8062-e612a56ae61c"> + <name>УстановкаСертификата</name> + <synonym> + <key>ru</key> + <value>Установка сертификата</value> + </synonym> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> <templates uuid="5189beb9-b939-4f97-aca0-c2f3492ac8b9"> <name>КомпонентаExtraCryptoAPI_3_0_2_23</name> <synonym> diff --git a/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/Forms/ФормаВыбора/Form.form index fc09a23f2..83beeecbd 100644 --- a/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/Forms/ФормаВыбора/Form.form @@ -26,7 +26,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/Forms/ФормаСписка/Form.form index 3ca006b81..fd8c753af 100644 --- a/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/Forms/ФормаСписка/Module.bsl index 606ed3f9b..4307a7d0a 100644 --- a/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/Forms/ФормаСписка/Module.bsl @@ -44,15 +44,15 @@ ТекущиеДанные = Элементы.Список.ТекущиеДанные; - Если Команда.Имя = "НастройкаПорядкаЭлементовОбычное_Вниз" Или Команда.Имя = "НастройкаПорядкаЭлементовОбычное_Вверх" Тогда + Если Команда.Имя = "НастройкаПорядкаЭлементовОбычное__Вниз" Или Команда.Имя = "НастройкаПорядкаЭлементовОбычное__Вверх" Тогда Если ТекущиеДанные.Ссылка = ПредопределенноеЗначение("Справочник.СостоянияОригиналовПервичныхДокументов.ФормаНапечатана") Или ТекущиеДанные.Ссылка = ПредопределенноеЗначение("Справочник.СостоянияОригиналовПервичныхДокументов.ОригиналПолучен") Тогда ПоказатьПредупреждение(,НСтр("ru='Начальное и конечное состояние перемещать нельзя.'")); Иначе - Если Команда.Имя = "НастройкаПорядкаЭлементовОбычное_Вниз" Тогда + Если Команда.Имя = "НастройкаПорядкаЭлементовОбычное__Вниз" Тогда Перемещать = ВозможностьПеремещения("Вниз",ТекущиеДанные.РеквизитДопУпорядочивания); - ИначеЕсли Команда.Имя = "НастройкаПорядкаЭлементовОбычное_Вверх" Тогда + ИначеЕсли Команда.Имя = "НастройкаПорядкаЭлементовОбычное__Вверх" Тогда Перемещать = ВозможностьПеремещения("Вверх",ТекущиеДанные.РеквизитДопУпорядочивания); КонецЕсли; diff --git a/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl b/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl index 069c45927..8162b34ae 100644 --- a/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl +++ b/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl @@ -128,7 +128,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать %1 по причине: |%2'"), - СостояниеИзм.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + СостояниеИзм.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Метаданные.Справочники.СостоянияОригиналовПервичныхДокументов, СостояниеИзм.Ссылка, ТекстСообщения); КонецПопытки; diff --git a/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Form.form b/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Form.form index c8ed78362..b92d4f405 100644 --- a/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Form.form +++ b/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Form.form @@ -815,32 +815,6 @@ <placementArea>UserCmds</placementArea> <representationInContextMenu>Auto</representationInContextMenu> </items> - <items xsi:type="form:Button"> - <name>КлассификаторКонтекстноеМенюВыделитьВсе</name> - <id>42</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <extendedTooltip> - <name>КлассификаторКонтекстноеМенюВыделитьВсеExtendedTooltip</name> - <id>55</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <commandName>0</commandName> - <buttonImportance>Normal</buttonImportance> - <representation>Auto</representation> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <placementArea>UserCmds</placementArea> - <representationInContextMenu>Auto</representationInContextMenu> - </items> <autoFill>true</autoFill> </contextMenu> <changeRowSet>true</changeRowSet> diff --git a/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Form.form index 18286c505..2249e50a1 100644 --- a/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -659,7 +658,7 @@ <items xsi:type="form:Addition"> <title> <key>ru</key> - <value>Строка поиска</value> + <value>Поиск</value> true true diff --git a/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Module.bsl index 37ddc4a03..9538a7f9e 100644 --- a/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Module.bsl @@ -39,7 +39,7 @@ Элементы.СписокКлассификатор.Видимость = Ложь; Если МожноДобавлятьВСправочник Тогда - Элементы.СписокСоздать.ТолькоВоВсехДействиях = Ложь; + Элементы.СписокСоздать.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели; Элементы.СписокСоздать.КнопкаПоУмолчанию = Не РежимВыбора; Элементы.СписокСоздать.Заголовок = ""; КонецЕсли; diff --git a/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Form.form index 24a08ed21..616c13756 100644 --- a/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Form.form @@ -105,7 +105,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -305,7 +304,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl b/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl index 69c93bb02..dcc41b8e5 100644 --- a/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl +++ b/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl @@ -282,7 +282,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать страну %1 по причине: |%2'"), - СтранаМираСсылка.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + СтранаМираСсылка.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Метаданные.Справочники.СтраныМира, СтранаМираСсылка.Ссылка, ТекстСообщения); КонецПопытки; diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ВыборУзлаПланаОбмена/Form.form b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ВыборУзлаПланаОбмена/Form.form new file mode 100644 index 000000000..e217d51cc --- /dev/null +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ВыборУзлаПланаОбмена/Form.form @@ -0,0 +1,642 @@ + + + + <key>ru</key> + <value>Выбор узла плана обмена</value> + + + ДеревоУзловОбмена + 1 + + <key>ru</key> + <value>Узлы обмена</value> + + true + true + + true + + + ДеревоУзловОбмена + + true + None + Add + Change + Copy + Delete + EndEdit + HierarchicalList + List + MoveDown + MoveUp + SortListAsc + SortListDesc + Tree + + ДеревоУзловОбменаПометкаНаименование + 14 + + ДеревоУзловОбменаНаименование + 4 + + <key>ru</key> + <value>Узел</value> + + true + true + + true + + + ДеревоУзловОбмена.Наименование + + + ДеревоУзловОбменаНаименованиеExtendedTooltip + 46 + Label + true + true + + Left + + + + ДеревоУзловОбменаНаименованиеКонтекстноеМеню + 5 + true + + LabelField + true + Auto + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Описание узла</value> + + + ДеревоУзловОбменаПометкаНаименованиеExtendedTooltip + 44 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + ДеревоУзловОбменаКод + 31 + + <key>ru</key> + <value>Код</value> + + true + true + + true + + + ДеревоУзловОбмена.Код + + + ДеревоУзловОбменаКодExtendedTooltip + 47 + Label + true + true + + Left + + + + ДеревоУзловОбменаКодКонтекстноеМеню + 32 + true + + LabelField + Auto + true + Left + true + + true + true + + + None + + ДеревоУзловОбменаКоманднаяПанель + 3 + Left + + + Selection + ДеревоУзловОбменаВыбор + + + ДеревоУзловОбменаСтрокаПоиска + 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 + + + + ДеревоУзловОбменаExtendedTooltip + 43 + Label + true + true + + Left + + + + ДеревоУзловОбменаКонтекстноеМеню + 2 + + ДеревоУзловОбменаКонтекстноеМенюВыбратьУзел + 27 + + <key>ru</key> + <value>Выбрать узел</value> + + true + true + + true + + + ДеревоУзловОбменаКонтекстноеМенюВыбратьУзелExtendedTooltip + 38 + Label + true + true + + Left + + + Form.Command.ВыбратьУзел + Normal + Auto + true + true + UserCmds + + StdPicture.ChooseValue + + Auto + + + ДеревоУзловОбменаКонтекстноеМенюИзменитьУзел + 28 + + <key>ru</key> + <value>Изменить узел</value> + + true + true + + true + + + ДеревоУзловОбменаКонтекстноеМенюИзменитьУзелExtendedTooltip + 39 + Label + true + true + + Left + + + Form.Command.ИзменитьУзел + Normal + Auto + true + true + UserCmds + + StdPicture.Change + + Auto + + + ДеревоУзловОбменаКонтекстноеМенюГруппа1 + 33 + + ДеревоУзловОбменаКонтекстноеМенюВывестиСписок + 34 + true + true + + true + + + ДеревоУзловОбменаКонтекстноеМенюВывестиСписокExtendedTooltip + 41 + Label + true + true + + Left + + + Form.Item.ДеревоУзловОбмена.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + + + ДеревоУзловОбменаКонтекстноеМенюКопироватьВБуферОбмена + 35 + true + true + + true + + + ДеревоУзловОбменаКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip + 42 + Label + true + true + + Left + + + Form.Item.ДеревоУзловОбмена.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Дерево узлов обмена контекстное меню группа 1</value> + + + ДеревоУзловОбменаКонтекстноеМенюГруппа1ExtendedTooltip + 40 + Label + true + true + + Left + + + + + + Tree + true + true + true +
        true
        + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + ExpandAllLevels + true + true + + ДеревоУзловОбмена.ИндексКартинки + + true +
        + + ФормаКоманднаяПанель + -1 + + ФормаВыбратьУзел + 29 + + <key>ru</key> + <value>Выбрать</value> + + true + true + + true + + + ФормаВыбратьУзелExtendedTooltip + 36 + Label + true + true + + Left + + + Form.Command.ВыбратьУзел + PictureAndText + true + true + true + UserCmds + Auto + + + ФормаИзменитьУзел + 30 + + <key>ru</key> + <value>Изменить</value> + + true + true + + true + + + ФормаИзменитьУзелExtendedTooltip + 37 + Label + true + true + + Left + + + Form.Command.ИзменитьУзел + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + OnOpen + ПриОткрытии + + + OnReopen + ПриПовторномОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + auto + true + + ДеревоУзловОбмена + + <key>ru</key> + <value>Дерево узлов обмена</value> + + 2 + + ValueTree + + + true + + + true + + + Наименование + + <key>ru</key> + <value>Узел обмена</value> + + 1 + + String + + + + true + + + true + + + + ИндексКартинки + 8 + + Number + + + + true + + + true + + + + Ссылка + 4 + + ExchangePlanRef + + + true + + + true + + + + Код + + <key>ru</key> + <value>Код</value> + + 2 + + String + + + + true + + + true + + + + + ВыбратьУзел + + <key>ru</key> + <value>Выбрать</value> + + 1 + + ru + Выбрать узел + + + true + + + StdPicture.ChooseValue + + + + ВыбратьУзел + + + DontUse + Auto + + + ИзменитьУзел + + <key>ru</key> + <value>Изменить</value> + + 2 + + ru + Изменить узел + + + true + + F2 + + StdPicture.Change + + + + ИзменитьУзел + + + DontUse + Auto + + + МножественныйВыбор + + Boolean + + true + + + НачальноеЗначениеВыбора + + true + + + + + +
        diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ВыборУзлаПланаОбмена/Module.bsl b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ВыборУзлаПланаОбмена/Module.bsl new file mode 100644 index 000000000..f6d72eb05 --- /dev/null +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ВыборУзлаПланаОбмена/Module.bsl @@ -0,0 +1,174 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы +// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УстановитьУсловноеОформление(); + ПрочитатьДеревоУзловОбмена(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ТекПараметры = УстановитьПараметрыФормы(); + Элементы.ДеревоУзловОбмена.ТекущаяСтрока = ТекПараметры.ТекущаяСтрока; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриПовторномОткрытии() + + ТекПараметры = УстановитьПараметрыФормы(); + Элементы.ДеревоУзловОбмена.ТекущаяСтрока = ТекПараметры.ТекущаяСтрока; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоУзлов + +&НаКлиенте +Процедура ДеревоУзловОбменаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + ПроизвестиВыборУзлов(); +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +// Выбирает узел и передает выбранные значения в вызывающую форму. +&НаКлиенте +Процедура ВыбратьУзел(Команда) + ПроизвестиВыборУзлов(); +КонецПроцедуры + +// Открывает форму узла, заданную в конфигурации. +&НаКлиенте +Процедура ИзменитьУзел(Команда) + + Узел = Элементы.ДеревоУзловОбмена.ТекущиеДанные.Ссылка; + Если Узел <> Неопределено Тогда + ПоказатьЗначение(,Узел); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура УстановитьУсловноеОформление() + + УсловноеОформление.Элементы.Очистить(); + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ДеревоУзловОбменаКод.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоУзловОбмена.Ссылка"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено; + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроизвестиВыборУзлов() + + Данные = Элементы.ДеревоУзловОбмена.ТекущиеДанные; + Если Данные <> Неопределено И Данные.Ссылка <> Неопределено Тогда + ОповеститьОВыборе(Данные.Ссылка); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПрочитатьДеревоУзловОбмена() + + Дерево = РеквизитФормыВЗначение("ДеревоУзловОбмена", Тип("ДеревоЗначений")); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | НастройкиТранспорта.Корреспондент КАК Ссылка, + | НастройкиТранспорта.Корреспондент.Код КАК Код, + | НастройкиТранспорта.Корреспондент.Наименование КАК Наименование, + | ТИПЗНАЧЕНИЯ(НастройкиТранспорта.Корреспондент) КАК ТипУзла + |ИЗ + | РегистрСведений.НастройкиТранспортаОбменаДанными КАК НастройкиТранспорта + |ГДЕ + | НастройкиТранспорта.ВидТранспортаСообщенийОбменаПоУмолчанию = &ВидТранспорта + | И НастройкиТранспорта.WSКонечнаяТочкаКорреспондента <> &ОбменСообщениямиПустаяСсылка + |ИТОГИ ПО + | ТипУзла"; + + Запрос.УстановитьПараметр("ВидТранспорта", Перечисления.ВидыТранспортаСообщенийОбмена.WS); + Запрос.УстановитьПараметр("ОбменСообщениямиПустаяСсылка", ПланыОбмена["ОбменСообщениями"].ПустаяСсылка()); + + ВыборкаПоТипамУзлов = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + + Пока ВыборкаПоТипамУзлов.Следующий() Цикл + + ПланОбмена = Метаданные.НайтиПоТипу(ВыборкаПоТипамУзлов.ТипУзла); + + СтрокаПланОбмена = Дерево.Строки.Добавить(); + СтрокаПланОбмена.Наименование = Строка(ПланОбмена); + СтрокаПланОбмена.ИндексКартинки = 0; + + ВыборкаПоУзлам = ВыборкаПоТипамУзлов.Выбрать(); + + Пока ВыборкаПоУзлам.Следующий() Цикл + + СтрокаУзел = СтрокаПланОбмена.Строки.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаУзел, ВыборкаПоУзлам); + СтрокаУзел.ИндексКартинки = 2; + + КонецЦикла; + + КонецЦикла; + + ЗначениеВРеквизитФормы(Дерево, "ДеревоУзловОбмена"); + +КонецПроцедуры + +&НаСервере +Функция УстановитьПараметрыФормы() + + Результат = Новый Структура("ТекущаяСтрока"); + + Если Параметры.НачальноеЗначениеВыбора <> Неопределено Тогда + Результат.ТекущаяСтрока = ИдентификаторСтрокиПоУзлу(ДеревоУзловОбмена, Параметры.НачальноеЗначениеВыбора); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервере +Функция ИдентификаторСтрокиПоУзлу(Данные, Ссылка) + Для Каждого ТекСтрока Из Данные.ПолучитьЭлементы() Цикл + Если ТекСтрока.Ссылка = Ссылка Тогда + Возврат ТекСтрока.ПолучитьИдентификатор(); + КонецЕсли; + Результат = ИдентификаторСтрокиПоУзлу(ТекСтрока, Ссылка); + Если Результат <> Неопределено Тогда + Возврат Результат; + КонецЕсли; + КонецЦикла; + Возврат Неопределено; +КонецФункции + +#КонецОбласти diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Module.bsl b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Module.bsl index 9947f02af..ea09d31de 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Module.bsl +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Module.bsl @@ -72,7 +72,8 @@ ПараметрыФормы = Новый Структура("УзелИнформационнойБазы", Параметры.УзелИнформационнойБазы); - ОткрытьФорму("Справочник.СценарииОбменовДанными.ФормаОбъекта", ПараметрыФормы, ЭтотОбъект); + ОткрытьФорму("Справочник.СценарииОбменовДанными.ФормаОбъекта", ПараметрыФормы, ЭтотОбъект,,,,, + РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); КонецПроцедуры @@ -88,7 +89,8 @@ ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("Ключ", ТекущиеДанные.Ссылка); - ОткрытьФорму("Справочник.СценарииОбменовДанными.ФормаОбъекта", ПараметрыФормы, ЭтотОбъект); + ОткрытьФорму("Справочник.СценарииОбменовДанными.ФормаОбъекта", ПараметрыФормы, ЭтотОбъект,,,,, + РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); КонецПроцедуры diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Form.form index 22f93c714..0e9b95de7 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Form.form index 03433b4a3..11d3188e3 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Form.form @@ -102,7 +102,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -166,8 +165,12 @@ НастроитьРасписаниеРегламентногоЗаданияExtendedTooltip 133 + + <key>ru</key> + <value>Минимальный интервал не должен быть меньше 15 минут (900 секунд). +Точное время выполнения сценария зависит от загруженности программы.</value> + Label - true true Left @@ -204,7 +207,104 @@ UsualGroup HorizontalIfPossible - Auto + true + true + Auto + Auto + + + + ГруппаПредупреждение + 156 + + Декорация1 + 158 + true + true + + true + + + Декорация1РасширеннаяПодсказка + 160 + Label + true + true + + Left + + + + Декорация1КонтекстноеМеню + 159 + true + + true + true + + + CommonPicture.Предупреждение32 + + AsFileRef + + + + Декорация2 + 161 + + <key>ru</key> + <value>Минимальный интервал не должен быть меньше 15 минут. +Точное время выполнения сценария зависит от загруженности программы.</value> + + true + true + + true + + + Декорация2РасширеннаяПодсказка + 163 + Label + true + true + + Left + + + + Декорация2КонтекстноеМеню + 162 + true + + Label + 60 + true + true + + Left + + + true + + true + + + <key>ru</key> + <value>Предупреждение</value> + + + ГруппаПредупреждениеРасширеннаяПодсказка + 157 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible true true Auto @@ -352,6 +452,10 @@ Left true + + StartChoice + НастройкиОбменаУзелИнформационнойБазыНачалоВыбора + ChoiceProcessing НастройкиОбменаУзелИнформационнойБазыОбработкаВыбора @@ -673,7 +777,6 @@ UsualGroup Vertical - Auto true true Auto @@ -750,7 +853,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -876,6 +978,19 @@ + + РазделениеВключено + 4 + + Boolean + + + true + + + true + + НастроитьРасписаниеРегламентногоЗадания diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Module.bsl index 252cb7bb8..695e92c98 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Module.bsl @@ -44,6 +44,21 @@ РасписаниеРегламентногоЗадания = Справочники.СценарииОбменовДанными.ПолучитьРасписаниеВыполненияОбменаДанными(Объект.Ссылка); КонецЕсли; + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); + + Если РазделениеВключено Тогда + + ТекстПодсказки = НСтр("ru = 'Минимальный интервал не должен быть меньше 15 минут (900 секунд). + |Точное время выполнения сценария зависит от загруженности программы.'"); + + Элементы.НастроитьРасписаниеРегламентногоЗадания.РасширеннаяПодсказка.Заголовок = ТекстПодсказки; + Элементы.НастроитьРасписаниеРегламентногоЗадания.ОтображениеПодсказки = ОтображениеПодсказки.ОтображатьСнизу; + Элементы.НастройкиОбменаВидТранспортаОбмена.Видимость = Ложь; + Элементы.НастройкиОбменаУзелИнформационнойБазы.ИсторияВыбораПриВводе = ИсторияВыбораПриВводе.НеИспользовать; + Элементы.НастройкиОбменаУзелИнформационнойБазы.КнопкаВыпадающегоСписка = Ложь; + + КонецЕсли; + Если Не ЭтоНовый Тогда ОбновитьСостоянияОбменовДанными(); КонецЕсли; @@ -67,6 +82,8 @@ &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект) + ПроверитьЗаполнениеНастройкиОбменаВСервисе(Отказ); + Справочники.СценарииОбменовДанными.ОбновитьДанныеРегламентногоЗадания(Отказ, РасписаниеРегламентногоЗадания, ТекущийОбъект); КонецПроцедуры @@ -103,7 +120,27 @@ &НаКлиенте Процедура НастройкиОбменаУзелИнформационнойБазыПриИзменении(Элемент) - Элементы.СоставРасписания.ТекущиеДанные.ВидТранспортаОбмена = Неопределено; + Если РазделениеВключено Тогда + Элементы.СоставРасписания.ТекущиеДанные.ВидТранспортаОбмена = + ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.WS"); + Иначе + Элементы.СоставРасписания.ТекущиеДанные.ВидТранспортаОбмена = Неопределено; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура НастройкиОбменаУзелИнформационнойБазыНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + Если РазделениеВключено Тогда + + НачальноеЗначениеВыбора = Элементы.СоставРасписания.ТекущиеДанные.УзелИнформационнойБазы; + ПараметрыФормы = Новый Структура("НачальноеЗначениеВыбора", НачальноеЗначениеВыбора); + + СтандартнаяОбработка = Ложь; + ОткрытьФорму("Справочник.СценарииОбменовДанными.Форма.ВыборУзлаПланаОбмена", ПараметрыФормы, Элемент); + + КонецЕсли; КонецПроцедуры @@ -237,7 +274,17 @@ Если Расписание <> Неопределено Тогда + Если РазделениеВключено + И Расписание.ПериодПовтораВТечениеДня < 15*60 Тогда + + Расписание.ПериодПовтораВТечениеДня = 15*60; + ТекстПредупреждения = НСтр("ru = 'Минимальный интервал не должен быть меньше 15 минут (900 секунд).'"); + ПоказатьПредупреждение(, ТекстПредупреждения); + + КонецЕсли; + РасписаниеРегламентногоЗадания = Расписание; + ОбновитьПредставлениеРасписания(); КонецЕсли; @@ -306,6 +353,8 @@ &НаСервере Процедура ОбновитьСостоянияОбменовДанными() + УстановитьПривилегированныйРежим(Истина); + ТекстЗапроса = " |ВЫБРАТЬ | СценарииОбменовДаннымиНастройкиОбмена.УзелИнформационнойБазы, @@ -378,4 +427,90 @@ КонецФункции +&НаСервере +Процедура ПроверитьЗаполнениеНастройкиОбменаВСервисе(Отказ) + + Если РазделениеВключено Тогда + + НастройкиОбмена = Объект.НастройкиОбмена.Выгрузить(); + НастройкиОбмена.Свернуть("УзелИнформационнойБазы,ВидТранспортаОбмена,ВыполняемоеДействие"); + Объект.НастройкиОбмена.Загрузить(НастройкиОбмена); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | НастройкиОбмена.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | НастройкиОбмена.ВыполняемоеДействие КАК ВыполняемоеДействие + |ПОМЕСТИТЬ ВТ_НастройкиОбмена + |ИЗ + | &НастройкиОбмена КАК НастройкиОбмена + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВТ_НастройкиОбмена.УзелИнформационнойБазы КАК УзелИнформационнойБазы + |ПОМЕСТИТЬ ВТ_Загрузка + |ИЗ + | ВТ_НастройкиОбмена КАК ВТ_НастройкиОбмена + |ГДЕ + | ВТ_НастройкиОбмена.ВыполняемоеДействие = ЗНАЧЕНИЕ(Перечисление.ДействияПриОбмене.ЗагрузкаДанных) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВТ_НастройкиОбмена.УзелИнформационнойБазы КАК УзелИнформационнойБазы + |ПОМЕСТИТЬ ВТ_Выгрузка + |ИЗ + | ВТ_НастройкиОбмена КАК ВТ_НастройкиОбмена + |ГДЕ + | ВТ_НастройкиОбмена.ВыполняемоеДействие = ЗНАЧЕНИЕ(Перечисление.ДействияПриОбмене.ВыгрузкаДанных) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ЕСТЬNULL(ВТ_Выгрузка.УзелИнформационнойБазы, ВТ_Загрузка.УзелИнформационнойБазы) КАК УзелИнформационнойБазы, + | ВЫБОР + | КОГДА ВТ_Выгрузка.УзелИнформационнойБазы ЕСТЬ NULL + | ТОГДА 1 + | КОГДА ВТ_Загрузка.УзелИнформационнойБазы ЕСТЬ NULL + | ТОГДА 2 + | КОНЕЦ КАК НедостающееДействие + |ИЗ + | ВТ_Загрузка КАК ВТ_Загрузка + | ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Выгрузка КАК ВТ_Выгрузка + | ПО ВТ_Загрузка.УзелИнформационнойБазы = ВТ_Выгрузка.УзелИнформационнойБазы + |ГДЕ + | (ВТ_Выгрузка.УзелИнформационнойБазы ЕСТЬ NULL + | ИЛИ ВТ_Загрузка.УзелИнформационнойБазы ЕСТЬ NULL)"; + + Запрос.УстановитьПараметр("НастройкиОбмена", НастройкиОбмена); + + Результат = Запрос.Выполнить(); + + Если Не Результат.Пустой() Тогда + + Отказ = Истина; + + Выборка = Результат.Выбрать(); + + Пока Выборка.Следующий() Цикл + + Если Выборка.НедостающееДействие = 1 Тогда + ШаблонСообщения = НСтр("ru = 'Для информационной базы ""%1"" не хватает действия по отправке данных'"); + Иначе + ШаблонСообщения = НСтр("ru = 'Для информационной базы ""%1"" не хватает действия по получению данных'"); + КонецЕсли; + + ТекстСообщения = СтрШаблон(ШаблонСообщения, Выборка.УзелИнформационнойБазы); + + ОбщегоНазначения.СообщитьПользователю(ТекстСообщения); + + КонецЦикла; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/ManagerModule.bsl b/SSL/src/Catalogs/СценарииОбменовДанными/ManagerModule.bsl index d1cdcd5c0..33ff66645 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/ManagerModule.bsl +++ b/SSL/src/Catalogs/СценарииОбменовДанными/ManagerModule.bsl @@ -130,21 +130,33 @@ Процедура ОбновитьДанныеРегламентногоЗадания(Отказ, РасписаниеРегламентногоЗадания, ТекущийОбъект) Экспорт - // Получаем регламентное задание по идентификатору, если объект не находим, то создаем новый. - РегламентноеЗаданиеОбъект = СоздатьРегламентноеЗаданиеПриНеобходимости(Отказ, ТекущийОбъект); - Если Отказ Тогда Возврат; КонецЕсли; + + Если ПустаяСтрока(ТекущийОбъект.Код) Тогда + ТекущийОбъект.УстановитьНовыйКод(); + КонецЕсли; - // обновляем свойства РЗ - УстановитьПараметрыРегламентногоЗадания(РегламентноеЗаданиеОбъект, РасписаниеРегламентногоЗадания, ТекущийОбъект); + Если ОбщегоНазначения.РазделениеВключено() Тогда + + СоздатьОбновитьРегламентноеЗаданиеВСервисе(РасписаниеРегламентногоЗадания, ТекущийОбъект); + + Иначе - // Записываем измененное задание. - ЗаписатьРегламентноеЗадание(Отказ, РегламентноеЗаданиеОбъект); + // Получаем регламентное задание по идентификатору, если объект не находим, то создаем новый. + РегламентноеЗаданиеОбъект = СоздатьРегламентноеЗаданиеПриНеобходимости(Отказ, ТекущийОбъект); + + // обновляем свойства РЗ + УстановитьПараметрыРегламентногоЗадания(РегламентноеЗаданиеОбъект, РасписаниеРегламентногоЗадания, ТекущийОбъект); + + // Записываем измененное задание. + ЗаписатьРегламентноеЗадание(Отказ, РегламентноеЗаданиеОбъект); + + // Запоминаем GUID регламентное задания в реквизите объекта. + ТекущийОбъект.РегламентноеЗаданиеGUID = Строка(РегламентноеЗаданиеОбъект.УникальныйИдентификатор); - // Запоминаем GUID регламентное задания в реквизите объекта. - ТекущийОбъект.РегламентноеЗаданиеGUID = Строка(РегламентноеЗаданиеОбъект.УникальныйИдентификатор); + КонецЕсли; КонецПроцедуры @@ -163,13 +175,7 @@ КонецФункции Процедура УстановитьПараметрыРегламентногоЗадания(РегламентноеЗаданиеОбъект, РасписаниеРегламентногоЗадания, ТекущийОбъект) - - Если ПустаяСтрока(ТекущийОбъект.Код) Тогда - ТекущийОбъект.УстановитьНовыйКод(); - - КонецЕсли; - ПараметрыРегламентногоЗадания = Новый Массив; ПараметрыРегламентногоЗадания.Добавить(ТекущийОбъект.Код); @@ -206,13 +212,65 @@ Исключение СтрокаСообщения = НСтр("ru = 'Произошла ошибка при сохранении расписания выполнения обменов. Подробное описание ошибки: %1'"); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ОбменДаннымиСервер.СообщитьОбОшибке(СтрокаСообщения, Отказ); КонецПопытки; КонецПроцедуры +Процедура СоздатьОбновитьРегламентноеЗаданиеВСервисе(РасписаниеРегламентногоЗадания, ТекущийОбъект) + + ЗаданиеОбъект = Неопределено; + Если ЗначениеЗаполнено(ТекущийОбъект.РегламентноеЗаданиеGUID) Тогда + ЗаданиеGUID = Новый УникальныйИдентификатор(ТекущийОбъект.РегламентноеЗаданиеGUID); + ЗаданиеОбъект = РегламентныеЗаданияСервер.Задание(ЗаданиеGUID); + КонецЕсли; + + Если ЗаданиеОбъект = Неопределено Тогда + + ПараметрыПроцедуры = Новый Массив; + ПараметрыПроцедуры.Добавить(ТекущийОбъект.Код); + + Ключ = ЗаданиеGUID; + + ПараметрыЗадания = Новый Структура; + ПараметрыЗадания.Вставить("Ключ", Лев(Ключ, 120)); + ПараметрыЗадания.Вставить("ИмяМетода" , "ОбменДаннымиВнутренняяПубликация.ВыполнитьОбменДаннымиПоСценарию"); + ПараметрыЗадания.Вставить("ОбластьДанных", ПараметрыСеанса["ОбластьДанныхЗначение"]); + ПараметрыЗадания.Вставить("Использование", Истина); + ПараметрыЗадания.Вставить("ЗапланированныйМоментЗапуска", ТекущаяДатаСеанса()); + ПараметрыЗадания.Вставить("Параметры", ПараметрыПроцедуры); + ПараметрыЗадания.Вставить("Использование", ТекущийОбъект.ИспользоватьРегламентноеЗадание); + + Если РасписаниеРегламентногоЗадания <> Неопределено Тогда + ПараметрыЗадания.Вставить("Расписание", РасписаниеРегламентногоЗадания); + КонецЕсли; + + МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); + ЗаданиеОбъект = МодульОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания); + + ЗаданиеGUID = ЗаданиеОбъект.УникальныйИдентификатор(); + + Иначе + + ПараметрыЗадания = Новый Структура; + ПараметрыЗадания.Вставить("Использование", ТекущийОбъект.ИспользоватьРегламентноеЗадание); + ПараметрыЗадания.Вставить("ЗапланированныйМоментЗапуска", ТекущаяДатаСеанса()); + + Если РасписаниеРегламентногоЗадания <> Неопределено Тогда + ПараметрыЗадания.Вставить("Расписание", РасписаниеРегламентногоЗадания); + КонецЕсли; + + МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); + МодульОчередьЗаданий.ИзменитьЗадание(ЗаданиеОбъект.Идентификатор, ПараметрыЗадания); + + КонецЕсли; + + ТекущийОбъект.РегламентноеЗаданиеGUID = Строка(ЗаданиеGUID); + +КонецПроцедуры + // Возвращает регламентное задание по GUID. // // Параметры: diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/ObjectModule.bsl b/SSL/src/Catalogs/СценарииОбменовДанными/ObjectModule.bsl index f0986eda2..71e3c5824 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/ObjectModule.bsl +++ b/SSL/src/Catalogs/СценарииОбменовДанными/ObjectModule.bsl @@ -22,6 +22,12 @@ КонецЕсли; + Если ИспользоватьРегламентноеЗадание И ОтключенАвтоматически Тогда + + ОтключенАвтоматически = Ложь; + + КонецЕсли; + КонецПроцедуры Процедура ПриЗаписи(Отказ) @@ -73,22 +79,26 @@ Процедура УдалитьРегламентноеЗадание(Отказ) УстановитьПривилегированныйРежим(Истина); - + // Определяем регламентное задание. РегламентноеЗаданиеОбъект = Справочники.СценарииОбменовДанными.РегламентноеЗаданиеПоИдентификатору(РегламентноеЗаданиеGUID); Если РегламентноеЗаданиеОбъект <> Неопределено Тогда Попытка - РегламентноеЗаданиеОбъект.Удалить(); + Если ОбщегоНазначения.РазделениеВключено() Тогда + РегламентныеЗаданияСервер.УдалитьЗадание(РегламентноеЗаданиеОбъект); + Иначе + РегламентноеЗаданиеОбъект.Удалить(); + КонецЕсли; Исключение СтрокаСообщения = НСтр("ru = 'Ошибка при удалении регламентного задания: %1'"); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ОбменДаннымиСервер.СообщитьОбОшибке(СтрокаСообщения, Отказ); КонецПопытки; - - КонецЕсли; + КонецЕсли; + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/СценарииОбменовДанными.mdo b/SSL/src/Catalogs/СценарииОбменовДанными/СценарииОбменовДанными.mdo index 5d77c4bb6..5dc8086e7 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/СценарииОбменовДанными.mdo +++ b/SSL/src/Catalogs/СценарииОбменовДанными/СценарииОбменовДанными.mdo @@ -191,6 +191,22 @@ <fullTextSearch>Use</fullTextSearch> <dataHistory>Use</dataHistory> </attributes> + <attributes uuid="a805d33c-2cb0-4862-943f-06ded997b940"> + <name>ОтключенАвтоматически</name> + <synonym> + <key>ru</key> + <value>Отключен автоматически</value> + </synonym> + <comment>Отключен из-за часто повторяющейся ошибке при выполнении обмена</comment> + <type> + <types>Boolean</types> + </type> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> <tabularSections uuid="32b11498-542f-46b2-829f-1525936ab7fa"> <producedTypes> <objectType typeId="c3ba48a0-2883-49cf-8127-e08789b81004" valueTypeId="a6e8f9db-43ac-4e39-b9c4-9f4e260ffbe0"/> @@ -304,4 +320,13 @@ <usePurposes>PersonalComputer</usePurposes> <usePurposes>MobileDevice</usePurposes> </forms> + <forms uuid="87ed7963-c2e4-4515-b768-47cf72442fd0"> + <name>ВыборУзлаПланаОбмена</name> + <synonym> + <key>ru</key> + <value>Выбор узла плана обмена</value> + </synonym> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> </mdclass:Catalog> diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Form.form b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Form.form index 223babf5e..72ee32ebe 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Form.form +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Form.form @@ -104,7 +104,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -212,7 +211,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -335,7 +333,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Module.bsl b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Module.bsl index f67e298a9..329b65b94 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Module.bsl +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Module.bsl @@ -350,7 +350,7 @@ ПараметрыИтоговогоОповещения.Вставить("МассивФайловСОшибками", МассивФайловСОшибками); Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда - ОбработатьСообщениеОбОшибке(ТекущийФайл.ПолноеИмя, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработатьСообщениеОбОшибке(ТекущийФайл.ПолноеИмя, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); Иначе ТекстПояснения = НСтр("ru='Подробное описание ошибки |см. в ранее произошедшем событии ""Файлы.Удаление файлов в томе""'"); @@ -374,7 +374,7 @@ &НаКлиенте Функция СтруктураОшибки(ИмяТекущегоФайла, ИнформацияОбОшибке) Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); Иначе ТекстОшибки = ИнформацияОбОшибке; КонецЕсли; @@ -508,7 +508,7 @@ | |%1'"); - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстОшибки, , , "ПутьКПапкеДляКопирования"); ВыполнитьОбработкуОповещения(ИсходноеОповещение, Ложь); @@ -540,7 +540,7 @@ ТабМакет = Справочники.ТомаХраненияФайлов.ПолучитьМакет("МакетОтчета"); ОбластьЗаголовок = ТабМакет.ПолучитьОбласть("Заголовок"); - ОбластьЗаголовок.Параметры.Описание = НСтр("ru = 'Файлы с ошибками:'"); + ОбластьЗаголовок.Параметры.Описание = НСтр("ru = 'Проблемные файлы:'"); ОтчетОбОшибках.Вывести(ОбластьЗаголовок); ОбластьСтрока = ТабМакет.ПолучитьОбласть("Строка"); diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Form.form index 56a38cc67..32ab400ac 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form index ee25fc983..ac9f04381 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form @@ -108,7 +108,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -256,7 +255,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -418,7 +416,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Help/ru.html b/SSL/src/Catalogs/ТомаХраненияФайлов/Help/ru.html index 7f419aa23..eddbde38f 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Help/ru.html +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Help/ru.html @@ -39,9 +39,11 @@ </li> <li>После переключения режима хранения файлов (например, в значение <strong>В томах на диске</strong>) все ранее накопленные файлы не перемещаются в тома - только вновь добавленные файлы будут размещаться в соответствии с настройкой. Для того чтобы <a href="DataProcessor.ПереносФайлов/Help">перенести ранее накопленные файлы</a> из информационной базы в тома, воспользуйтесь командой <strong>Перенос файлов в тома</strong>. </li> -<li>Если используется синхронизация данных между программой-источником и программой-приемником и при этом в программе-источнике используется хранение файлов в томах на дисках, то в процессе <a href="CommonForm.СозданиеНачальногоОбразаСФайлами/Help">создания начального образа</a> необходимо будет создать архивный файл с томами хранимых файлов. +<li>При работе в распределенной информационной базе (РИБ) способ хранения файлов настраивается независимо в каждом узле. Например, в главном узле могут быть включены тома, а в подчиненных узлах файлы хранятся в информационной базе, или наоборот.</li> +<li>Если настраивать в разных узлах одни и те же тома хранения файлов (сетевые каталоги), то это приведет к конфликтам. Также файлы в томе, относящиеся к другим узлам, будут считаться "лишними" и могут быть очищены. </li> +<li>Если в главном узле файлы хранятся в томах, то при создании нового узла РИБ вместе с <a href="CommonForm.СозданиеНачальногоОбразаСФайлами/Help">созданием начального образа</a> будет выгружен архив с хранимыми файлами (для этого необходимо указать полное имя архива с файлами томов). </li> -<li>В процессе получения начального образа в программу-приемник необходимо будет указать и расположение архивного файла с томами хранимых файлов. Для <a href="CommonForm.ВыборПутиКАрхивуФайловТомов/Help">получения файлов в томах из архива</a> выполните команду <strong>Разместить файлы начального образа</strong>.</li></ul><table width="100%"><tbody><tr><td valign="top" width="36"><img src="CommonPicture.Предупреждение32" width="32" height="32"></img></td> +<li>Для <a href="CommonForm.ВыборПутиКАрхивуФайловТомов/Help">получения файлов в томах из архива</a> необходимо в <b>Настройках синхронизации данных </b>выполнить синхронизацию подчиненного узла с главным узлом, нажав на кнопку<b> Синхронизировать <img src="CommonPicture.СинхронизацияДанныхВыполнение"></img></b>.</li></ul><table width="100%"><tbody><tr><td valign="top" width="36"><img src="CommonPicture.Предупреждение32" width="32" height="32"></img></td> <td>Примечание<br>Для использования томов, расположенных на сетевых дисках, сервер 1С:Предприятия 8 нужно запускать от лица доменного пользователя вида <strong>domain1\user1</strong>, имеющего права доступа к тому, указанному в виде UNC пути. Этот пользователь должен входить в группу <strong>Users</strong> локального компьютера,иметь права "Run as service" и "Run as batch job" и права на каталоги, в которых сервер 1С:Предприятия 8 хранит служебные файлы - журнал регистрации, каталог временных файлов и пр.</td></tr></tbody></table><h3>См. также:</h3> <ul><li><a href="Catalog.Файлы/Help">Общая информация о файлах</a>; </li> diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/ObjectModule.bsl b/SSL/src/Catalogs/ТомаХраненияФайлов/ObjectModule.bsl index 03d0642f8..af7d33732 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/ObjectModule.bsl +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/ObjectModule.bsl @@ -106,7 +106,7 @@ КонецЕсли; ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонОшибки, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ШаблонОшибки, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ОбщегоНазначения.СообщитьПользователю( ТекстОшибки, , ИмяПоляСПолнымПутем, "Объект", Отказ); diff --git a/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Forms/ФормаЭлемента/Form.form index 7502afd3a..a3510fe45 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Forms/ФормаЭлемента/Form.form @@ -262,7 +262,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -291,7 +290,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -320,7 +318,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -511,7 +508,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -540,7 +536,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Forms/ФормаЭлемента/Module.bsl index 6b4be75cf..53f39df66 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/Forms/ФормаЭлемента/Module.bsl @@ -92,7 +92,7 @@ &НаКлиенте Процедура СервисНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) ДанныеВыбора = Новый СписокЗначений(); - ДанныеВыбора.Добавить("https://webdav.yandex.ru", НСтр("ru = 'Яндекс.Диск'")); + ДанныеВыбора.Добавить("https://webdav.yandex.com", НСтр("ru = 'Яндекс.Диск'")); ДанныеВыбора.Добавить("https://dav.box.com/dav", НСтр("ru = 'Box'")); ДанныеВыбора.Добавить("https://dav.dropdav.com", НСтр("ru = 'DropBox (через dropdav.com)'")); СтандартнаяОбработка = Ложь; diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Form.form b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Form.form index d3c60d09e..f775416b7 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Form.form +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Form.form @@ -206,7 +206,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -235,7 +234,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -467,7 +465,7 @@ <passwordMode>true</passwordMode> <choiceButton>true</choiceButton> <choiceButtonPicture xsi:type="core:PictureRef"> - <picture>CommonPicture.ВводимыеСимволыСкрыты</picture> + <picture>CommonPicture.ВводимыеСимволыВидны</picture> </choiceButtonPicture> <autoMarkIncomplete>true</autoMarkIncomplete> <chooseType>true</chooseType> @@ -499,7 +497,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -579,7 +576,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -687,7 +683,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -775,7 +770,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -902,7 +896,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1182,7 +1175,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1370,7 +1362,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1566,7 +1557,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1595,7 +1585,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2292,7 +2281,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2484,7 +2472,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2655,7 +2642,6 @@ vasyapupkin@example.com завершена.</value> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2803,7 +2789,6 @@ vasyapupkin@example.com завершена.</value> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2869,7 +2854,6 @@ vasyapupkin@example.com завершена.</value> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <controlRepresentation>Button</controlRepresentation> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> @@ -2938,7 +2922,6 @@ vasyapupkin@example.com завершена.</value> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <controlRepresentation>Button</controlRepresentation> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> @@ -3015,7 +2998,6 @@ vasyapupkin@example.com завершена.</value> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> <verticalAlign>Bottom</verticalAlign> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -3105,32 +3087,6 @@ vasyapupkin@example.com завершена.</value> <placementArea>UserCmds</placementArea> <representationInContextMenu>Auto</representationInContextMenu> </items> - <items xsi:type="form:Button"> - <name>ФормаИзменитьФорму</name> - <id>171</id> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <extendedTooltip> - <name>ФормаИзменитьФормуРасширеннаяПодсказка</name> - <id>172</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <commandName>0</commandName> - <buttonImportance>Normal</buttonImportance> - <representation>Auto</representation> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <placementArea>UserCmds</placementArea> - <representationInContextMenu>Auto</representationInContextMenu> - <locationInCommandBar>InCommandBarAndInAdditionalSubmenu</locationInCommandBar> - </items> <visible>true</visible> <enabled>true</enabled> <userVisible> @@ -3284,7 +3240,6 @@ vasyapupkin@example.com завершена.</value> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> <verticalAlign>Bottom</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Module.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Module.bsl index f536e5c5e..12715cddb 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Module.bsl +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Module.bsl @@ -754,7 +754,7 @@ СоздатьУчетнуюЗапись(); Исключение ПроверкаЗавершиласьСОшибками = Истина; - СообщенияОбОшибках = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщенияОбОшибках = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; КонецЕсли; @@ -763,6 +763,7 @@ &НаСервере Процедура СоздатьУчетнуюЗапись() + ПреобразоватьНастройкиИзPunycode(); НастройкиАвторизации = НастройкиАвторизацииНаПочтовомСервере; // см. НастройкиАвторизацииНаПочтовомСервере СистемнаяУчетнаяЗапись = Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты; @@ -831,8 +832,8 @@ ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - ЗаписьЖурналаРегистрации(НСтр("ru = 'Ошибка при создании учетной записи электронной почты'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Работа с почтовыми сообщениями'", ОбщегоНазначения.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, , УчетнаяЗаписьСсылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -903,12 +904,6 @@ СообщенияОбОшибках = НСтр("ru = 'Не удалось определить настройки подключения. |Настройте параметры подключения вручную.'"); - Если СтрНайти(НРег(АдресЭлектроннойПочты), "@gmail.com") > 0 Тогда - СообщенияОбОшибках = СообщенияОбОшибках + Символы.ПС - + НСтр("ru = 'См. также рекомендации по настройке почты Gmail: - |http://buh.ru/articles/documents/42429/#briefly_43166'"); - КонецЕсли; - ПроверкаЗавершиласьСОшибками = Ложь; ДлительнаяОперация = НачатьПоискНастроекУчетнойЗаписи(); @@ -968,7 +963,7 @@ СоздатьУчетнуюЗапись(); Исключение ПроверкаЗавершиласьСОшибками = Истина; - СообщенияОбОшибках = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщенияОбОшибках = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; ОповеститьОбИзменении(СсылкаНовойУчетнойЗаписи); КонецЕсли; @@ -1580,4 +1575,14 @@ КонецПроцедуры +&НаСервере +Процедура ПреобразоватьНастройкиИзPunycode() + + СерверВходящейПочты = РаботаСПочтовымиСообщениямиСлужебный.PunycodeВСтроку(СерверВходящейПочты); + СерверИсходящейПочты = РаботаСПочтовымиСообщениямиСлужебный.PunycodeВСтроку(СерверИсходящейПочты); + ИмяПользователяДляОтправкиПисем = РаботаСПочтовымиСообщениямиСлужебный.PunycodeВСтроку(ИмяПользователяДляОтправкиПисем); + ИмяПользователяДляПолученияПисем = РаботаСПочтовымиСообщениямиСлужебный.PunycodeВСтроку(ИмяПользователяДляПолученияПисем); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПроверкаНастроекУчетнойЗаписи/Form.form b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПроверкаНастроекУчетнойЗаписи/Form.form index b7f56b19f..180b3da77 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПроверкаНастроекУчетнойЗаписи/Form.form +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПроверкаНастроекУчетнойЗаписи/Form.form @@ -164,7 +164,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -245,7 +244,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -315,7 +313,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <controlRepresentation>Button</controlRepresentation> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> @@ -388,7 +385,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <controlRepresentation>Button</controlRepresentation> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> @@ -504,7 +500,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> <verticalAlign>Bottom</verticalAlign> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -676,7 +671,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -827,7 +821,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -856,7 +849,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form index 4ab9704f9..48fa46ddf 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -508,7 +507,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form index b6cde1de7..8ad7e2728 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form @@ -175,7 +175,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -292,7 +291,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -441,7 +439,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -728,7 +725,7 @@ <passwordMode>true</passwordMode> <choiceButton>true</choiceButton> <choiceButtonPicture xsi:type="core:PictureRef"> - <picture>CommonPicture.ВводимыеСимволыСкрыты</picture> + <picture>CommonPicture.ВводимыеСимволыВидны</picture> </choiceButtonPicture> <chooseType>true</chooseType> <typeDomainEnabled>true</typeDomainEnabled> @@ -758,7 +755,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -956,7 +952,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -985,7 +980,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1014,7 +1008,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1201,7 +1194,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1387,7 +1379,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1595,7 +1586,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1624,7 +1614,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1653,7 +1642,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -1723,7 +1711,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ManagerModule.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ManagerModule.bsl index 511b17a74..0ecdff54c 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ManagerModule.bsl +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ManagerModule.bsl @@ -187,7 +187,7 @@ Исключение ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление учетных записей'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -367,18 +367,14 @@ ПараметрыЗапускаПрограммы.ПолучитьПотокОшибок = Истина; ПараметрыЗапускаПрограммы.КодировкаИсполнения = "OEM"; - АдресаСерверовИмен = Новый Массив; - АдресаСерверовИмен.Добавить(""); // Сервер по умолчанию. - АдресаСерверовИмен.Добавить("8.8.8.8"); // dns.google - АдресаСерверовИмен.Добавить("8.8.4.4"); // dns.google - АдресаСерверовИмен.Добавить("78.88.8.8"); // dns.yandex - АдресаСерверовИмен.Добавить("78.8.8.1"); // dns.yandex + АдресаСерверовDNS = РаботаСПочтовымиСообщениямиСлужебный.АдресаСерверовDNS(); + АдресаСерверовDNS.Вставить(0, ""); // Сервер по умолчанию. СтрокиКоманд = Новый Массив; - Для Каждого АдресСервераИмен Из АдресаСерверовИмен Цикл + Для Каждого АдресСервера Из АдресаСерверовDNS Цикл ШаблонКоманды = "nslookup -type=mx %1 %2"; - СтрокаКоманды = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонКоманды, Домен, АдресСервераИмен); + СтрокаКоманды = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонКоманды, Домен, АдресСервера); СтрокиКоманд.Добавить(СтрокаКоманды); РезультатЗапуска = ФайловаяСистема.ЗапуститьПрограмму(СтрокаКоманды, ПараметрыЗапускаПрограммы); @@ -404,8 +400,9 @@ КонецФункции -Функция ОпределитьНастройкиУчетнойЗаписи(АдресЭлектроннойПочты, Пароль, ДляОтправки, ДляПолучения) Экспорт +Функция ОпределитьНастройкиУчетнойЗаписи(Знач АдресЭлектроннойПочты, Пароль, ДляОтправки, ДляПолучения) Экспорт + АдресЭлектроннойПочты = РаботаСПочтовымиСообщениямиСлужебный.СтрокаВPunycode(АдресЭлектроннойПочты); УстановитьПривилегированныйРежим(Истина); НайденныеНастройки = НастройкиПодключенияПоАдресуЭлектроннойПочты(АдресЭлектроннойПочты, Пароль); УстановитьПривилегированныйРежим(Ложь); @@ -586,7 +583,10 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета"); - ЗагруженныйФайл = МодульПолучениеФайловИзИнтернета.СкачатьФайлНаСервере("https://downloads.v8.1c.ru/content/common/settings/mailservers.json"); + + АдресФайлаСНастройками = РаботаСПочтовымиСообщениямиСлужебный.АдресФайлаСНастройками(); + ЗагруженныйФайл = МодульПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(АдресФайлаСНастройками); + Если ЗагруженныйФайл.Статус Тогда ЧтениеJSON = Новый ЧтениеJSON(); ЧтениеJSON.ОткрытьФайл(ЗагруженныйФайл.Путь); @@ -871,7 +871,7 @@ Попытка ИнтернетПочта.Подключиться(Профиль, Протокол); Исключение - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; ИнтернетПочта.Отключиться(); @@ -925,7 +925,7 @@ ИнтернетПочта.Подключиться(Профиль); ИнтернетПочта.Послать(Письмо); Исключение - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; ИнтернетПочта.Отключиться(); @@ -1276,14 +1276,15 @@ КонецЕсли; УстановитьОтключениеБезопасногоРежима(Ложь); - АдресЭлектроннойПочты = НастройкиУчетнойЗаписи.АдресЭлектроннойПочты; + АдресЭлектроннойПочты = РаботаСПочтовымиСообщениямиСлужебный.СтрокаВPunycode(НастройкиУчетнойЗаписи.АдресЭлектроннойПочты); Возврат ПроверитьНастройкиПрофилей(ПрофильИсходящейПочты, ПрофильВходящейПочты, АдресЭлектроннойПочты); КонецФункции -Функция ПроверитьНастройкиПрофилей(ПрофильИсходящейПочты, ПрофильВходящейПочты, АдресЭлектроннойПочты) Экспорт +Функция ПроверитьНастройкиПрофилей(ПрофильИсходящейПочты, ПрофильВходящейПочты, Знач АдресЭлектроннойПочты) Экспорт + АдресЭлектроннойПочты = РаботаСПочтовымиСообщениямиСлужебный.СтрокаВPunycode(АдресЭлектроннойПочты); ТекстСообщения = Новый Массив; ТехническиеПодробности = Новый Массив; ВыполненныеПроверки = Новый Массив; diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl index e1dbfbf59..78801c769 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl @@ -99,20 +99,15 @@ ПарольSMTP = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Ссылка, "ПарольSMTP"); УстановитьПривилегированныйРежим(Ложь); - Настройки = ПользователиСлужебный.НастройкиВосстановленияПароля(); - - Если Настройки <> Неопределено Тогда - - Настройки.АдресСервераSMTP = СерверИсходящейПочты; - Настройки.ИмяОтправителя = ИмяПользователя; - Настройки.ИспользоватьSSL = ИспользоватьЗащищенноеСоединениеДляИсходящейПочты; - Настройки.ПарольSMTP = ПарольSMTP; - Настройки.ПользовательSMTP = ПользовательSMTP; - Настройки.ПортSMTP = ПортСервераИсходящейПочты; - - ПользователиСлужебный.УстановитьНастройкиВосстановленияПароля(Настройки); - КонецЕсли; + Настройки = ДополнительныеНастройкиАутентификации.ПолучитьНастройкиВосстановленияПароля(); + Настройки.АдресСервераSMTP = СерверИсходящейПочты; + Настройки.ИмяОтправителя = ИмяПользователя; + Настройки.ИспользоватьSSL = ИспользоватьЗащищенноеСоединениеДляИсходящейПочты; + Настройки.ПарольSMTP = ПарольSMTP; + Настройки.ПользовательSMTP = ПользовательSMTP; + Настройки.ПортSMTP = ПортСервераИсходящейПочты; + ДополнительныеНастройкиАутентификации.УстановитьНастройкиВосстановленияПароля(Настройки); Иначе ВызватьИсключение НСтр("ru='Настройки почты используются для восстановления пароля и |могут быть изменены только администратором.'"); diff --git a/SSL/src/Catalogs/Файлы/Forms/Файлы/Form.form b/SSL/src/Catalogs/Файлы/Forms/Файлы/Form.form index 71d85d22b..f67cb6602 100644 --- a/SSL/src/Catalogs/Файлы/Forms/Файлы/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/Файлы/Form.form @@ -30,7 +30,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -633,6 +632,35 @@ </extendedTooltip> <extInfo xsi:type="form:ButtonGroupExtInfo"/> </items> + <items xsi:type="form:Button"> + <name>ПапкиКонтекстноеМенюНастроитьПрава</name> + <id>448</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Items.Папки.CurrentData.Ref</segments> + </dataPath> + <extendedTooltip> + <name>ПапкиКонтекстноеМенюНастроитьПраваРасширеннаяПодсказка</name> + <id>449</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>CommonCommand.НастроитьПрава</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> <items xsi:type="form:Button"> <name>ПапкиКонтекстноеМенюКопироватьВБуферОбмена</name> <id>141</id> @@ -695,7 +723,7 @@ <borderColor xsi:type="core:ColorRef"> <color>Style.BorderColor</color> </borderColor> - <searchStringLocation>None</searchStringLocation> + <searchStringLocation>Top</searchStringLocation> <viewStatusLocation>None</viewStatusLocation> <searchControlLocation>None</searchControlLocation> <currentRowUse>SelectionPresentation</currentRowUse> @@ -891,7 +919,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2478,7 +2505,7 @@ <borderColor xsi:type="core:ColorRef"> <color>Style.BorderColor</color> </borderColor> - <searchStringLocation>None</searchStringLocation> + <searchStringLocation>Top</searchStringLocation> <viewStatusLocation>None</viewStatusLocation> <searchControlLocation>None</searchControlLocation> <autoMaxCardHeight>true</autoMaxCardHeight> @@ -2517,7 +2544,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2593,7 +2619,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2622,7 +2647,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -3824,6 +3848,35 @@ <representationInContextMenu>Auto</representationInContextMenu> <locationInCommandBar>InAdditionalSubmenu</locationInCommandBar> </items> + <items xsi:type="form:Button"> + <name>ФормаНастроитьПрава</name> + <id>450</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Items.Папки.CurrentData.Ref</segments> + </dataPath> + <extendedTooltip> + <name>ФормаНастроитьПраваРасширеннаяПодсказка</name> + <id>451</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>CommonCommand.НастроитьПрава</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> <items xsi:type="form:FormGroup"> <name>ФормаГруппаНастройкаСписка</name> <id>329</id> diff --git a/SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl index 3d89d4be2..3a98a52d6 100644 --- a/SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl @@ -601,7 +601,7 @@ ОписаниеОповещения = Новый ОписаниеОповещения("ПодписатьЗавершение", ЭтотОбъект); ДополнительныеПараметры = Новый Структура("ОбработкаРезультата", ОписаниеОповещения); - РаботаСФайламиКлиент.ПодписатьФайл(Элементы.Список.ТекущаяСтрока, УникальныйИдентификатор, ДополнительныеПараметры); + РаботаСФайламиКлиент.ПодписатьФайл(Элементы.Список.ВыделенныеСтроки, УникальныйИдентификатор, ДополнительныеПараметры); КонецПроцедуры @@ -1044,15 +1044,14 @@ МассивФайловВРабочемКаталогеДляУдаления, ИмяРабочегоКаталога, ОбъектСсылка) - Зашифровать = Истина; + ПараметрыЗаписиИнформацииОШифровании = РаботаСФайламиСлужебный.ПараметрыЗаписиИнформацииОШифровании(); + ПараметрыЗаписиИнформацииОШифровании.ИмяРабочегоКаталога = ИмяРабочегоКаталога; + ПараметрыЗаписиИнформацииОШифровании.МассивДанныхДляЗанесенияВБазу = МассивДанныхДляЗанесенияВБазу; + ПараметрыЗаписиИнформацииОШифровании.МассивОтпечатков = МассивОтпечатков; + ПараметрыЗаписиИнформацииОШифровании.МассивФайловВРабочемКаталогеДляУдаления = МассивФайловВРабочемКаталогеДляУдаления; + РаботаСФайламиСлужебный.ЗаписатьИнформациюОШифровании( - ОбъектСсылка, - Зашифровать, - МассивДанныхДляЗанесенияВБазу, - Неопределено, // УникальныйИдентификатор - ИмяРабочегоКаталога, - МассивФайловВРабочемКаталогеДляУдаления, - МассивОтпечатков); + ОбъектСсылка, ПараметрыЗаписиИнформацииОШифровании); КонецПроцедуры @@ -1082,18 +1081,13 @@ Процедура РасшифроватьСервер(МассивДанныхДляЗанесенияВБазу, ИмяРабочегоКаталога, ОбъектСсылка) - Зашифровать = Ложь; - МассивОтпечатков = Новый Массив; - МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + ПараметрыЗаписиИнформацииОШифровании = РаботаСФайламиСлужебный.ПараметрыЗаписиИнформацииОШифровании(); + ПараметрыЗаписиИнформацииОШифровании.Зашифровать = Ложь; + ПараметрыЗаписиИнформацииОШифровании.ИмяРабочегоКаталога = ИмяРабочегоКаталога; + ПараметрыЗаписиИнформацииОШифровании.МассивДанныхДляЗанесенияВБазу = МассивДанныхДляЗанесенияВБазу; РаботаСФайламиСлужебный.ЗаписатьИнформациюОШифровании( - ОбъектСсылка, - Зашифровать, - МассивДанныхДляЗанесенияВБазу, - Неопределено, // УникальныйИдентификатор - ИмяРабочегоКаталога, - МассивФайловВРабочемКаталогеДляУдаления, - МассивОтпечатков); + ОбъектСсылка, ПараметрыЗаписиИнформацииОШифровании); КонецПроцедуры @@ -1191,7 +1185,7 @@ Если Элементы.Папки.ТекущиеДанные.ПапкаСинхронизируется Тогда АдресПапкиВОблачномСервисе = РаботаСФайламиСлужебныйКлиентСервер.АдресВОблачномСервисе( - Элементы.Папки.ТекущиеДанные.УчетнаяЗаписьСервис, Элементы.Папки.ТекущиеДанные.Href); + Элементы.Папки.ТекущиеДанные.УчетнаяЗаписьСервис, Элементы.Папки.ТекущиеДанные.Href); СведенияОСинхронизации = СведенияОСинхронизации(Элементы.Папки.ТекущиеДанные.Ссылка); Если ЗначениеЗаполнено(СведенияОСинхронизации) Тогда @@ -1545,7 +1539,7 @@ Исключение // Если файла не существует, то будет вызвано исключение. АдресДанныхФайла = Неопределено; - ТекстНевыбраннойКартинки = НСтр("ru = 'Предварительный просмотр недоступен по причине:'") + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстНевыбраннойКартинки = НСтр("ru = 'Предварительный просмотр недоступен по причине:'") + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Иначе diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Form.form index 73344c37a..87ddb135b 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Form.form @@ -29,7 +29,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -342,7 +341,7 @@ <borderColor xsi:type="core:ColorRef"> <color>Style.BorderColor</color> </borderColor> - <searchStringLocation>None</searchStringLocation> + <searchStringLocation>Top</searchStringLocation> <viewStatusLocation>None</viewStatusLocation> <searchControlLocation>None</searchControlLocation> <currentRowUse>SelectionPresentation</currentRowUse> @@ -974,7 +973,7 @@ <borderColor xsi:type="core:ColorRef"> <color>Style.BorderColor</color> </borderColor> - <searchStringLocation>None</searchStringLocation> + <searchStringLocation>Top</searchStringLocation> <viewStatusLocation>None</viewStatusLocation> <searchControlLocation>None</searchControlLocation> <autoMaxCardHeight>true</autoMaxCardHeight> @@ -1011,7 +1010,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form index 924c06388..59ea6d09c 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form @@ -72,7 +72,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -361,7 +360,7 @@ <verticalStretch>true</verticalStretch> <enableStartDrag>true</enableStartDrag> <enableDrag>true</enableDrag> - <searchStringLocation>None</searchStringLocation> + <searchStringLocation>Top</searchStringLocation> <viewStatusLocation>None</viewStatusLocation> <searchControlLocation>None</searchControlLocation> <autoMaxCardHeight>true</autoMaxCardHeight> @@ -388,7 +387,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -588,7 +586,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -681,7 +678,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Form.form index 023cd0560..201f71927 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Form.form @@ -30,7 +30,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -342,7 +341,7 @@ <borderColor xsi:type="core:ColorRef"> <color>Style.BorderColor</color> </borderColor> - <searchStringLocation>None</searchStringLocation> + <searchStringLocation>Top</searchStringLocation> <viewStatusLocation>None</viewStatusLocation> <searchControlLocation>None</searchControlLocation> <currentRowUse>SelectionPresentation</currentRowUse> @@ -797,7 +796,7 @@ <borderColor xsi:type="core:ColorRef"> <color>Style.BorderColor</color> </borderColor> - <searchStringLocation>None</searchStringLocation> + <searchStringLocation>Top</searchStringLocation> <viewStatusLocation>None</viewStatusLocation> <searchControlLocation>None</searchControlLocation> <autoMaxCardHeight>true</autoMaxCardHeight> @@ -835,7 +834,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Form.form index 92865b695..134d8253a 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Form.form @@ -959,7 +959,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <backColor xsi:type="core:ColorRef"> @@ -1217,7 +1216,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1489,7 +1487,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1613,7 +1610,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1677,7 +1673,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1706,7 +1701,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1739,7 +1733,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -1963,7 +1956,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2078,7 +2070,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2297,7 +2288,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2425,7 +2415,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2490,7 +2479,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -3069,6 +3057,38 @@ <placementArea>UserCmds</placementArea> <representationInContextMenu>Auto</representationInContextMenu> </items> + <items xsi:type="form:Addition"> + <title> + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоискаЭлектронныеПодписи + 300 + + СтрокаПоискаЭлектронныеПодписиРасширеннаяПодсказка + 302 + Label + true + true + + Left + + + + СтрокаПоискаЭлектронныеПодписиКонтекстноеМеню + 301 + true + + ЭлектронныеПодписи + + true + + Left @@ -3349,6 +3369,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоискаСертификатыШифрования + 303 + + СтрокаПоискаСертификатыШифрованияРасширеннаяПодсказка + 305 + Label + true + true + + Left + + + + СтрокаПоискаСертификатыШифрованияКонтекстноеМеню + 304 + true + + СертификатыШифрования + + true + + Left diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl index 8552a5281..3515a81dd 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl @@ -1281,16 +1281,15 @@ МассивФайловВРабочемКаталогеДляУдаления, ИмяРабочегоКаталога) - Зашифровать = Истина; - + ПараметрыЗаписиИнформацииОШифровании = РаботаСФайламиСлужебный.ПараметрыЗаписиИнформацииОШифровании(); + ПараметрыЗаписиИнформацииОШифровании.ИмяРабочегоКаталога = ИмяРабочегоКаталога; + ПараметрыЗаписиИнформацииОШифровании.МассивДанныхДляЗанесенияВБазу = МассивДанныхДляЗанесенияВБазу; + ПараметрыЗаписиИнформацииОШифровании.МассивОтпечатков = МассивОтпечатков; + ПараметрыЗаписиИнформацииОШифровании.МассивФайловВРабочемКаталогеДляУдаления = МассивФайловВРабочемКаталогеДляУдаления; + ПараметрыЗаписиИнформацииОШифровании.УникальныйИдентификатор = УникальныйИдентификатор; + РаботаСФайламиСлужебный.ЗаписатьИнформациюОШифровании( - ЭтотОбъект.Объект.Ссылка, - Зашифровать, - МассивДанныхДляЗанесенияВБазу, - УникальныйИдентификатор, - ИмяРабочегоКаталога, - МассивФайловВРабочемКаталогеДляУдаления, - МассивОтпечатков); + ЭтотОбъект.Объект.Ссылка, ПараметрыЗаписиИнформацииОШифровании); ОбновитьИнформациюОСертификатахОбъекта(); @@ -1300,18 +1299,14 @@ Процедура РасшифроватьСервер(МассивДанныхДляЗанесенияВБазу, ИмяРабочегоКаталога) - Зашифровать = Ложь; - МассивОтпечатков = Новый Массив; - МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + ПараметрыЗаписиИнформацииОШифровании = РаботаСФайламиСлужебный.ПараметрыЗаписиИнформацииОШифровании(); + ПараметрыЗаписиИнформацииОШифровании.Зашифровать = Ложь; + ПараметрыЗаписиИнформацииОШифровании.ИмяРабочегоКаталога = ИмяРабочегоКаталога; + ПараметрыЗаписиИнформацииОШифровании.МассивДанныхДляЗанесенияВБазу = МассивДанныхДляЗанесенияВБазу; + ПараметрыЗаписиИнформацииОШифровании.УникальныйИдентификатор = УникальныйИдентификатор; РаботаСФайламиСлужебный.ЗаписатьИнформациюОШифровании( - ЭтотОбъект.Объект.Ссылка, - Зашифровать, - МассивДанныхДляЗанесенияВБазу, - УникальныйИдентификатор, - ИмяРабочегоКаталога, - МассивФайловВРабочемКаталогеДляУдаления, - МассивОтпечатков); + ЭтотОбъект.Объект.Ссылка, ПараметрыЗаписиИнформацииОШифровании); ОбновитьИнформациюОСертификатахОбъекта(); @@ -1348,7 +1343,7 @@ РаботаСФайламиСлужебныйКлиент.КорректноеИмяФайла(ЭтотОбъект.Объект.Наименование); Исключение ОбщегоНазначенияКлиент.СообщитьПользователю( - КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ,"Наименование", "Объект"); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ,"Наименование", "Объект"); Возврат Ложь; КонецПопытки; diff --git a/SSL/src/Catalogs/Файлы/ManagerModule.bsl b/SSL/src/Catalogs/Файлы/ManagerModule.bsl index df0cfbb36..f5d60629f 100644 --- a/SSL/src/Catalogs/Файлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/Файлы/ManagerModule.bsl @@ -166,6 +166,7 @@ | Ссылка"; Запрос.УстановитьПараметр("Ссылка", Ссылка); + // @skip-check query-in-loop - Порционная обработка большого объема данных. МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, МассивСсылок); @@ -247,7 +248,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать файл %1 по причине: |%2'"), - Строка.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Строка.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Строка.Ссылка.Метаданные(), Строка.Ссылка, ТекстСообщения); КонецПопытки; diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаВыбора/Form.form index 618be5ac3..fe007208b 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаВыбора/Form.form @@ -23,7 +23,6 @@ UsualGroup Vertical - Auto true true auto diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераКомплексныхВопросов/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераКомплексныхВопросов/Form.form index eaed3b1c1..aed9f4a0b 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераКомплексныхВопросов/Form.form +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераКомплексныхВопросов/Form.form @@ -238,7 +238,6 @@ true true true - None None None true @@ -266,7 +265,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -384,7 +382,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Form.form index 3f99e7b25..63762cd4a 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Form.form +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Form.form @@ -776,7 +776,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1068,7 +1067,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1097,7 +1095,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1350,7 +1347,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1707,7 +1703,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2068,7 +2063,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2311,7 +2305,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -2430,7 +2423,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2656,7 +2648,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Form.form index 3e16f9034..dd3c61cd7 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Form.form +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Form.form @@ -245,7 +245,6 @@ UsualGroup Vertical - Auto true true Auto @@ -388,7 +387,6 @@ HorizontalIfPossible Right - Auto true true Auto diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Form.form index a3b7435bc..359af32e8 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Form.form @@ -23,7 +23,6 @@ UsualGroup Vertical - Auto true true auto diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Form.form index d28f9dc20..8d7feadb7 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Form.form @@ -107,7 +107,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -914,6 +913,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 146 + + СтрокаПоискаРасширеннаяПодсказка + 148 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 147 + true + + ФормаДереваАнкеты + + true + + Left diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ЗаполнитьПроизвольныеПараметры/Form.form b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ЗаполнитьПроизвольныеПараметры/Form.form index 349d7ba83..5fa8d38e4 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ЗаполнитьПроизвольныеПараметры/Form.form +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ЗаполнитьПроизвольныеПараметры/Form.form @@ -29,7 +29,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ПроизвольныйПараметр/Module.bsl b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ПроизвольныйПараметр/Module.bsl index bcdf2e38b..f0b49c839 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ПроизвольныйПараметр/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ПроизвольныйПараметр/Module.bsl @@ -143,7 +143,7 @@ Если СтрСравнить(ПредметШаблона.Имя, Параметры.ПолноеИмяТипаПараметраВводаНаОсновании) = 0 Тогда Продолжить; КонецЕсли; - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПредметШаблона.Имя); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПредметШаблона.Имя); Если МетаданныеОбъекта = Неопределено Тогда Продолжить; КонецЕсли; diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Form.form b/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Form.form index 1548976a2..52e82dfff 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Form.form +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Form.form @@ -30,7 +30,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -795,7 +794,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -876,7 +874,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -966,7 +963,7 @@ true UserCmds Auto - InAdditionalSubmenu + InCommandBar ФормаСкопировать @@ -1039,7 +1036,9 @@ Left - + + Compact + Left true diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Module.bsl b/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Module.bsl index f08f524c7..2b141ae6e 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Module.bsl @@ -285,7 +285,7 @@ ПараметрыВызоваСервера.Вставить("ВидСообщения", ВидСообщения); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); - ПараметрыОтправки.ДополнительныеПараметры.Вставить("РасширенныйСписокПолучателей", МодульВзаимодействия.ИспользуетсяПрочиеВзаимодействия()); + ПараметрыОтправки.ДополнительныеПараметры.Вставить("РасширенныйСписокПолучателей", МодульВзаимодействия.ИспользуютсяПрочиеВзаимодействия()); КонецЕсли; ШаблоныСообщенийСлужебный.СформироватьСообщениеВФоне(ПараметрыВызоваСервера, АдресВременногоХранилища, СформироватьИОтправить); @@ -509,7 +509,7 @@ КонецЕсли; Если Шаблоны.Количество() = 0 Тогда - Элементы.ФормаСоздать.ТолькоВоВсехДействиях = Ложь; + Элементы.ФормаСоздать.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели; Элементы.ФормаСоздать.Отображение = ОтображениеКнопки.КартинкаИТекст; Элементы.ФормаСформировать.Доступность = Ложь; Элементы.ФормаСформироватьИОтправить.Доступность = Ложь; diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаСписка/Form.form index 9d2a7b8e8..fd789e26d 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -150,7 +149,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Form.form index fd649ed0f..02c4a2801 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Form.form @@ -131,7 +131,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -497,7 +496,6 @@ HorizontalIfPossible Right - Auto true true Auto @@ -527,7 +525,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -760,6 +757,60 @@ + + Доступен + 369 + true + true + + true + + + Доступен + + Ctrl+S + + ДоступенРасширеннаяПодсказка + 371 + Label + true + true + + Left + + + + ДоступенКонтекстноеМеню + 370 + true + + RadioButtonField + Enter + true + Left + true + + + + ru + Только автору + + + ТолькоАвтору + + + + + ru + Всем + + + Всем + + + Vertical + + true true @@ -782,7 +833,6 @@ UsualGroup HorizontalIfPossible - Auto Button true true @@ -812,7 +862,6 @@ UsualGroup Vertical - Auto true true Auto @@ -935,7 +984,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2297,7 +2345,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2880,6 +2927,40 @@ true + + ДобавлятьПрисоединенныеФайлы + 364 + true + true + + true + + + Объект.ДобавлятьПрисоединенныеФайлы + + Right + + ДобавлятьПрисоединенныеФайлыРасширеннаяПодсказка + 366 + Label + true + true + + Left + + + + ДобавлятьПрисоединенныеФайлыКонтекстноеМеню + 365 + true + + CheckBoxField + Enter + true + Left + true + + ТранслитерироватьИменаФайлов 349 @@ -2977,7 +3058,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3006,7 +3086,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3035,7 +3114,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3064,7 +3142,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -3779,6 +3856,39 @@ true + + Доступен + + <key>ru</key> + <value>Доступен</value> + + 14 + + String + + 20 + + + + true + + + true + + + + ОграничениеУсловием + 15 + + Boolean + + + true + + + true + + ПроверитьШаблон diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Module.bsl index bdc36b0c8..365eb3328 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Module.bsl @@ -25,7 +25,10 @@ КонецЦикла; СписокВложений = Неопределено; - Если Параметры.Ключ = Неопределено Или Параметры.Ключ.Пустая() Тогда + ЭтоНовыйШаблон = Объект.Ссылка.Пустая(); + ОграничениеУсловием = ПараметрыДоступа("Изменение", Метаданные.Справочники.ШаблоныСообщений, "Ссылка").ОграничениеУсловием; + + Если ЭтоНовыйШаблон Тогда Если Параметры.ЗначениеКопирования = Справочники.ШаблоныСообщений.ПустаяСсылка() Тогда @@ -76,6 +79,18 @@ УстановитьТекстШаблона(Объект, СписокВложений); + Если ОграничениеУсловием Тогда + + Если ЭтоНовыйШаблон Тогда + Объект.Автор = Пользователи.ТекущийПользователь(); + Объект.ТолькоДляАвтора = Истина; + Доступен = "ТолькоАвтору"; + ИначеЕсли Объект.Автор = Пользователи.ТекущийПользователь() Тогда + Доступен = "ТолькоАвтору"; + КонецЕсли; + + КонецЕсли; + КонецПроцедуры &НаСервере @@ -141,6 +156,18 @@ Возврат; КонецЕсли; + Если ОграничениеУсловием Тогда + + Если Доступен = "ТолькоАвтору" Тогда + ТекущийОбъект.Автор = Пользователи.ТекущийПользователь(); + ТекущийОбъект.ТолькоДляАвтора = Истина; + Иначе + ТекущийОбъект.Автор = Справочники.Пользователи.ПустаяСсылка(); + ТекущийОбъект.ТолькоДляАвтора = Ложь; + КонецЕсли; + + КонецЕсли; + Если ТекущийОбъект.ПредназначенДляSMS Тогда ТекущийОбъект.ТекстШаблонаSMS = ИнформацияОПроверке.ОбычныйТекст; ТекущийОбъект.ФорматВложений = Неопределено; @@ -1160,8 +1187,17 @@ Элементы.ФормаПроверитьШаблон.Видимость = Истина; КонецЕсли; - Элементы.ГруппаДоступ.Видимость = - НЕ ПараметрыДоступа("Изменение", Метаданные.Справочники.ШаблоныСообщений, "Ссылка").ОграничениеУсловием; + Элементы.Доступен.Видимость = Ложь; + Если ОграничениеУсловием Тогда + + Элементы.Автор.Видимость = Ложь; + Если Объект.Ссылка.Пустая() Или Объект.Автор = Пользователи.ТекущийПользователь() Тогда + Элементы.Доступен.Видимость = Истина; + КонецЕсли; + + Иначе + Элементы.Автор.Видимость = Истина; + КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); @@ -1238,6 +1274,8 @@ &НаСервере Процедура СформироватьСписокРеквизитовИПечатныхФорм() + ОпределитьВозможностьПрисоединятьФайлы (); + ПараметрыШаблона = ШаблоныСообщенийСлужебный.ПараметрыШаблона(Объект); СведенияОШаблоне = ШаблоныСообщенийСлужебный.СведенияОШаблоне(ПараметрыШаблона); ПараметрыШаблона.ПараметрыСообщения = ПараметрыСообщения; @@ -1252,6 +1290,42 @@ КонецПроцедуры +&НаСервере +Процедура ОпределитьВозможностьПрисоединятьФайлы () + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + Возврат; + КонецЕсли; + + МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); + + МожноПрисоединятьФайлы = Ложь; + + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Объект.ПолноеИмяТипаПараметраВводаНаОсновании); + Если ЗначениеЗаполнено(Объект.ПолноеИмяТипаПараметраВводаНаОсновании) + И ОбъектМетаданных <> Неопределено + И ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(ОбъектМетаданных) Тогда + + ПустаяСсылка = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(Объект.ПолноеИмяТипаПараметраВводаНаОсновании).ПустаяСсылка(); + МожноПрисоединятьФайлы = МодульРаботаСФайлами.КОбъектуМожноПрисоединятьФайлы(ПустаяСсылка); + Если МожноПрисоединятьФайлы Тогда + + Элементы.ДобавлятьПрисоединенныеФайлы.Видимость = Истина; + Элементы.ДобавлятьПрисоединенныеФайлы.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 (%2)", + Метаданные.Справочники.ШаблоныСообщений.Реквизиты.ДобавлятьПрисоединенныеФайлы.Представление(), + Объект.Назначение); + + КонецЕсли; + + КонецЕсли; + + Элементы.ДобавлятьПрисоединенныеФайлы.Видимость = МожноПрисоединятьФайлы; + Если Не МожноПрисоединятьФайлы Тогда + Объект.ДобавлятьПрисоединенныеФайлы = Ложь; + КонецЕсли; + +КонецПроцедуры + &НаСервере Процедура СформироватьСписокПечатныхФорм(СведенияОШаблоне) @@ -1479,7 +1553,7 @@ КонецЕсли; Исключение - ОбщегоНазначенияКлиент.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()),, "Вложения",, Отказ); + ОбщегоНазначенияКлиент.СообщитьПользователю(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()),, "Вложения",, Отказ); КонецПопытки; КонецЕсли; КонецЦикла; @@ -1589,7 +1663,7 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); ЗаписатьОшибкуВЖурналРегистрации(ИмяСобытияШаблоныСообщений(), ИнформацияОбОшибке, НСтр("ru = 'Не удалось извлечь и записать присоединенный файл для копирования'")); - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ОписаниеОшибки, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ОписаниеОшибки, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(СписокОшибок, "Вложения", ТекстОшибки, "Вложения",, ТекстОшибки); Продолжить; КонецПопытки; @@ -1792,7 +1866,7 @@ &НаСервере Процедура ЗаписатьОшибкуВЖурналРегистрации(ИмяСобытия, ИнформацияОбОшибке, ТекстСобытия) - Комментарий = ТекстСобытия + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + Комментарий = ТекстСобытия + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, Метаданные.Справочники.ШаблоныСообщений,, Комментарий); КонецПроцедуры @@ -1822,12 +1896,13 @@ &НаСервере Процедура ЗаполнитьШаблонПоВнешнейОбработке() - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); ОчиститьШаблон(ЭтотОбъект); ВнешнийОбъект = МодульДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(Объект.ВнешняяОбработка); - Если Объект.ВнешняяОбработка.Вид <> Перечисления["ВидыДополнительныхОтчетовИОбработок"].ШаблонСообщения Тогда + + Если Не МодульДополнительныеОтчетыИОбработки.ЭтоВидОбработкиДляШаблоновСообщений(Объект.ВнешняяОбработка.Вид) Тогда Возврат; КонецЕсли; diff --git a/SSL/src/Catalogs/ШаблоныСообщений/ManagerModule.bsl b/SSL/src/Catalogs/ШаблоныСообщений/ManagerModule.bsl index 61e4fcd02..d431a8ced 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/ManagerModule.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/ManagerModule.bsl @@ -90,6 +90,52 @@ #КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов +// +// Параметры: +// Настройки - см. ОбновлениеИнформационнойБазыСлужебный.НастройкиЗаполненияЭлементов +// +Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт + + ШаблоныСообщенийПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов(Настройки); + + Настройки.ПриНачальномЗаполненииЭлемента = Истина; + Настройки.ИмяКлючевогоРеквизита = "Ссылка"; + +КонецПроцедуры + +// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов +// +// Параметры: +// КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков +// Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы +// ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти +// +Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт + + ШаблоныСообщенийПереопределяемый.ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти); + +КонецПроцедуры + +// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов +// +// Параметры: +// Объект - СправочникОбъект.ВидыКонтактнойИнформации - заполняемый объект. +// Данные - СтрокаТаблицыЗначений - данные заполнения объекта. +// ДополнительныеПараметры - Структура: +// * ПредопределенныеДанные - ТаблицаЗначений - данные заполненные в процедуре ПриНачальномЗаполненииЭлементов. +// +Процедура ПриНачальномЗаполненииЭлемента(Объект, Данные, ДополнительныеПараметры) Экспорт + + ШаблоныСообщенийПереопределяемый.ПриНачальномЗаполненииЭлемента(Объект, Данные, ДополнительныеПараметры); + +КонецПроцедуры + +#КонецОбласти + #Область СлужебныеПроцедурыИФункции #Область ОбновлениеИнформационнойБазы @@ -164,7 +210,7 @@ ПараметрыШаблона = ШаблоныСообщенийСлужебный.ПараметрыШаблона(Шаблон.Ссылка); СведенияОШаблоне = ШаблоныСообщенийСлужебный.СведенияОШаблоне(ПараметрыШаблона); - МетаданныеОбъект = Метаданные.НайтиПоПолномуИмени(ПараметрыШаблона.ПолноеИмяТипаНазначения); + МетаданныеОбъект = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПараметрыШаблона.ПолноеИмяТипаНазначения); Если МетаданныеОбъект = Неопределено Тогда ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(Шаблон.Ссылка); @@ -228,7 +274,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать шаблон сообщения %1 по причине: |%2'"), - Шаблон.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Шаблон.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Метаданные.Справочники.ШаблоныСообщений, Шаблон.Ссылка, ТекстСообщения); КонецПопытки; diff --git a/SSL/src/Catalogs/ШаблоныСообщений/ObjectModule.bsl b/SSL/src/Catalogs/ШаблоныСообщений/ObjectModule.bsl index c153abb5d..6477acd49 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/ObjectModule.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/ObjectModule.bsl @@ -72,7 +72,7 @@ КонецЕсли; Если ЗначениеЗаполнено(ПараметрыШаблона.ПолноеИмяТипаНазначения) Тогда - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПараметрыШаблона.ПолноеИмяТипаНазначения); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПараметрыШаблона.ПолноеИмяТипаНазначения); ПолноеИмяТипаПараметраВводаНаОсновании = ПараметрыШаблона.ПолноеИмяТипаНазначения; Назначение= МетаданныеОбъекта.Представление(); ПредназначенДляВводаНаОсновании = Истина; @@ -105,6 +105,16 @@ ПредназначенДляЭлектронныхПисем = Ложь; КонецЕсли; + + Если ТипЗнч(ПараметрыШаблона.КомандыПечати) = Тип("Массив") Тогда + + Для каждого КомандаПечати Из ПараметрыШаблона.КомандыПечати Цикл + Строка = ПечатныеФормыИВложения.Добавить(); + Строка.Идентификатор = КомандаПечати; + КонецЦикла; + + КонецЕсли; + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ШаблоныСообщений/ШаблоныСообщений.mdo b/SSL/src/Catalogs/ШаблоныСообщений/ШаблоныСообщений.mdo index 623c8f408..7c21a6669 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/ШаблоныСообщений.mdo +++ b/SSL/src/Catalogs/ШаблоныСообщений/ШаблоныСообщений.mdo @@ -183,6 +183,21 @@ <fullTextSearch>Use</fullTextSearch> <dataHistory>Use</dataHistory> </attributes> + <attributes uuid="0f0ac56d-b068-46f2-8440-731683c2b42a"> + <name>ДобавлятьПрисоединенныеФайлы</name> + <synonym> + <key>ru</key> + <value>Добавлять присоединенные файлы</value> + </synonym> + <type> + <types>Boolean</types> + </type> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> <attributes uuid="5814cb3a-8f7c-45b4-a590-b69d4912120f"> <name>Назначение</name> <synonym> @@ -246,6 +261,25 @@ <fullTextSearch>Use</fullTextSearch> <dataHistory>Use</dataHistory> </attributes> + <attributes uuid="5c17a594-eb0b-4cdf-af35-0eaba968e065"> + <name>ПодписьИПечать</name> + <synonym> + <key>ru</key> + <value>Подпись и печать</value> + </synonym> + <type> + <types>Boolean</types> + </type> + <toolTip> + <key>ru</key> + <value>Добавляет факсимильную подпись и печать в печатную форму</value> + </toolTip> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + </attributes> <attributes uuid="af922fb8-a99c-4154-89fe-d30a4d13024a"> <name>ПолноеИмяТипаПараметраВводаНаОсновании</name> <synonym> @@ -526,25 +560,6 @@ <fullTextSearch>Use</fullTextSearch> <dataHistory>Use</dataHistory> </attributes> - <attributes uuid="5c17a594-eb0b-4cdf-af35-0eaba968e065"> - <name>ПодписьИПечать</name> - <synonym> - <key>ru</key> - <value>Подпись и печать</value> - </synonym> - <type> - <types>Boolean</types> - </type> - <toolTip> - <key>ru</key> - <value>Добавляет факсимильную подпись и печать в печатную форму</value> - </toolTip> - <minValue xsi:type="core:UndefinedValue"/> - <maxValue xsi:type="core:UndefinedValue"/> - <fillValue xsi:type="core:UndefinedValue"/> - <fullTextSearch>Use</fullTextSearch> - <dataHistory>Use</dataHistory> - </attributes> <tabularSections uuid="2f4ea53a-c84d-4d5f-ae7a-817a20ccd96a"> <producedTypes> <objectType typeId="fc3cbef9-0d18-4366-ab46-dc95b4a163a7" valueTypeId="db394ba9-529e-43a2-bb62-c8b9a5905bdf"/> diff --git a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ПодборЯзыкаИзСпискаДоступных/Form.form b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ПодборЯзыкаИзСпискаДоступных/Form.form index 1aa52bdcb..910ba4824 100644 --- a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ПодборЯзыкаИзСпискаДоступных/Form.form +++ b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ПодборЯзыкаИзСпискаДоступных/Form.form @@ -34,25 +34,21 @@ <placementArea>UserCmds</placementArea> <representationInContextMenu>Auto</representationInContextMenu> </items> - <items xsi:type="form:FormField"> - <name>Поиск</name> - <id>24</id> + <items xsi:type="form:Addition"> + <title> + <key>ru</key> + <value>Поиск</value> + true true true - - СтрокаПоиска - - None - - OnChange - ПоискПриИзменении - + СтрокаПоиска + 43 - ПоискРасширеннаяПодсказка - 26 + СтрокаПоискаРасширеннаяПодсказка + 45 Label true true @@ -61,36 +57,13 @@ - ПоискКонтекстноеМеню - 25 + СтрокаПоискаКонтекстноеМеню + 44 true - InputField - Enter - true - Left - true - - - AutoComplete - ПоискАвтоПодбор - - - Clearing - ПоискОчистка - + Список + true - true - true - true - true - true - true - Normal - - ru - Найти... - @@ -169,7 +142,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -519,24 +491,6 @@ - - СтрокаПоиска - - <key>ru</key> - <value>Строка поиска</value> - - 2 - - String - - - - true - - - true - - Сворачивать 3 diff --git a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ПодборЯзыкаИзСпискаДоступных/Module.bsl b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ПодборЯзыкаИзСпискаДоступных/Module.bsl index bf397a55b..1aa5af536 100644 --- a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ПодборЯзыкаИзСпискаДоступных/Module.bsl +++ b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ПодборЯзыкаИзСпискаДоступных/Module.bsl @@ -11,7 +11,6 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - ТекущийЭлемент = Элементы.Поиск; Элементы.Список.МножественныйВыбор = Не ЗначениеЗаполнено(Параметры.Отбор); Если ЗначениеЗаполнено(Параметры.Отбор) Тогда @@ -27,24 +26,6 @@ #КонецОбласти -#Область ОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура ПоискОчистка(Элемент, СтандартнаяОбработка) - - УстановитьОтбор(); - -КонецПроцедуры - -&НаКлиенте -Процедура ПоискПриИзменении(Элемент) - - УстановитьОтбор(); - -КонецПроцедуры - -#КонецОбласти - #Область ОбработчикиСобытийЭлементовТаблицыФормыСписок &НаКлиенте @@ -144,24 +125,4 @@ КонецФункции -&НаКлиенте -Процедура ПоискАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) - - УстановитьОтбор(Текст); - -КонецПроцедуры - -&НаКлиенте -Процедура УстановитьОтбор(Текст = Неопределено); - - Если Текст = Неопределено Тогда - Текст = СтрокаПоиска; - КонецЕсли; - - СтруктураОтбора = Новый Структура; - СтруктураОтбора.Вставить("СтрокаПоиска", Текст); - Элементы.Список.ОтборСтрок = Новый ФиксированнаяСтруктура(СтруктураОтбора); - -КонецПроцедуры - #КонецОбласти diff --git a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаСписка/Form.form index 6c455205a..98a1fc999 100644 --- a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаСписка/Form.form @@ -100,7 +100,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -133,7 +132,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ManagerModule.bsl b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ManagerModule.bsl index 45d4164d5..22bc61ebd 100644 --- a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ManagerModule.bsl +++ b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ManagerModule.bsl @@ -12,7 +12,20 @@ Процедура ЗаполнитьПоставляемыеЯзыки() Экспорт - Для Каждого КодЯзыка Из СтандартныеПодсистемыСервер.ЯзыкиКонфигурации() Цикл + КодыЯзыков = Новый Массив; + КодыЯзыков.Добавить(ОбщегоНазначения.КодОсновногоЯзыка()); + + ДобавитьЯзыки(КодыЯзыков); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ДобавитьЯзыки(КодыЯзыков) Экспорт + + Для Каждого КодЯзыка Из КодыЯзыков Цикл НачатьТранзакцию(); Попытка @@ -37,10 +50,6 @@ КонецПроцедуры -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - Функция ДоступныеЯзыки(СРегиональнымиНастройками = Ложь, ТолькоДополнительные = Ложь) Экспорт ТекстЗапроса = diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Form.form index 873e8a92f..261410bc7 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Form.form @@ -23,7 +23,6 @@ UsualGroup Vertical - Auto true true auto diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Form.form index d10907e2e..45a4607dc 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Form.form @@ -114,7 +114,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -325,7 +324,6 @@ UsualGroup Vertical - Auto true true Auto @@ -653,7 +651,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -868,7 +865,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1078,7 +1074,6 @@ UsualGroup HorizontalIfPossible - Auto true true LeftNarrowest diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ManagerModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ManagerModule.bsl index e26f1b16d..106a38fd8 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ManagerModule.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ManagerModule.bsl @@ -76,7 +76,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать вопрос для анкетирования %1 по причине: |%2'"), - Выборка.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Выборка.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Метаданные.ПланыВидовХарактеристик.ВопросыДляАнкетирования, Выборка.Ссылка, ТекстСообщения); КонецПопытки; diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ЗависимостьРеквизитов/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ЗависимостьРеквизитов/Module.bsl index 0cfaec19f..bb22a1caa 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ЗависимостьРеквизитов/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ЗависимостьРеквизитов/Module.bsl @@ -280,7 +280,7 @@ РеквизитыОбъекта.Колонки.Добавить("НомерКартинки", Новый ОписаниеТипов("Число")); РеквизитыОбъекта.Колонки.Добавить("РежимВыбора", Новый ОписаниеТипов("ИспользованиеГруппИЭлементов")); - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъектаМетаданных); Для Каждого ДополнительныйРеквизит Из НаборДополнительныхРеквизитов Цикл СвойстваОбъекта = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДополнительныйРеквизит.Свойство, "Заголовок, ТипЗначения", , ТекущийЯзык().КодЯзыка); diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Form.form index 56f1d7cc4..373bb255f 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Form.form @@ -109,7 +109,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -590,7 +589,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Form.form index edae7680c..f9a2c82ca 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Form.form index cf49a3a53..9eb5a5918 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Form.form @@ -145,7 +145,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -685,7 +684,6 @@ UsualGroup Vertical - Auto true Auto Auto @@ -1126,7 +1124,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1159,7 +1156,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1188,7 +1184,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1445,7 +1440,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1561,7 +1555,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1658,7 +1651,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1687,7 +1679,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1809,7 +1800,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -1949,7 +1939,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -1978,7 +1967,6 @@ Vertical Half - Auto true true Auto @@ -2091,7 +2079,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -2194,7 +2181,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -2305,7 +2291,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -2333,7 +2318,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2436,7 +2420,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2608,7 +2591,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2690,7 +2672,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2791,7 +2772,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -4185,7 +4165,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -4535,7 +4514,6 @@ HorizontalIfPossible Bottom - Auto true true Auto @@ -5287,6 +5265,33 @@ true + + ПоказатьНеиспользуемыеРеквизиты + 25 + + Boolean + + + true + + + true + + + + ТекущийНаборВерсияДанных + 26 + + String + + + + true + + + true + + РедактироватьФорматЗначения diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl index a939883b4..ba72ead44 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl @@ -126,7 +126,6 @@ Объект.Заголовок, Объект.Ссылка, ТекущийНаборСвойств, Объект.Наименование, "", ""); КонецЕсли; - Если ЗначениеЗаполнено(ТекстВопроса) Тогда Кнопки = Новый СписокЗначений; Кнопки.Добавить("ПродолжитьЗапись", НСтр("ru = 'Продолжить запись'")); @@ -144,8 +143,7 @@ Если НЕ ПараметрыЗаписи.Свойство("КогдаИмяУжеИспользуется") И ЗначениеЗаполнено(Объект.Имя) Тогда - // Заполнение наименования по набору свойств - // и проверка есть ли свойство с тем же наименованием. + // Проверка есть ли свойство с тем же именем. ТекстВопроса = ИмяУжеИспользуется( Объект.Имя, Объект.Ссылка, Объект.Наименование); @@ -167,7 +165,7 @@ Если НЕ ПараметрыЗаписи.Свойство("КогдаИдентификаторДляФормулУжеИспользуется") И ЗначениеЗаполнено(Объект.ИдентификаторДляФормул) Тогда // Заполнение идентификатора для формул - // и проверка есть ли свойство с тем же наименованием. + // и проверка есть ли свойство с тем же идентификатором. ТекстВопроса = ИдентификаторДляФормулУжеИспользуется( Объект.ИдентификаторДляФормул, Объект.Ссылка); @@ -240,7 +238,7 @@ ТекущийОбъект.Имя = ТекущийОбъект.Имя + ВРег(Лев(ЧастьЗаголовка, 1)) + Сред(ЧастьЗаголовка, 2); КонецЦикла; - Если ИмяНачинаетсяСЦифры(ТекущийОбъект.Имя) Тогда + Если УправлениеСвойствамиСлужебный.ИмяНачинаетсяСЦифры(ТекущийОбъект.Имя) Тогда ТекущийОбъект.Имя = "_" + ТекущийОбъект.Имя; КонецЕсли; @@ -783,6 +781,7 @@ &НаКлиенте Процедура ПоказатьНеиспользуемыеРеквизиты(Команда) НовоеЗначение = Не Элементы.НеиспользуемыеРеквизиты.Пометка; + ПоказатьНеиспользуемыеРеквизиты = НовоеЗначение; Элементы.НеиспользуемыеРеквизиты.Пометка = НовоеЗначение; Если НовоеЗначение Тогда Элементы.СтраницыНаборыСвойств.ТекущаяСтраница = Элементы.СтраницаОбщиеНаборы; @@ -2349,205 +2348,9 @@ &НаСервере Процедура ОбновитьСписокСвойствТекущегоНабора() - Запрос = Новый Запрос; - - Если Не Элементы.НеиспользуемыеРеквизиты.Пометка Тогда - Запрос.УстановитьПараметр("Набор", ВыбранныйНаборСвойств); - Запрос.Текст = - "ВЫБРАТЬ - | СвойстваНаборов.НомерСтроки, - | СвойстваНаборов.Свойство, - | СвойстваНаборов.ПометкаУдаления, - | Свойства.Заголовок КАК Заголовок, - | Свойства.ВладелецДополнительныхЗначений, - | Свойства.ТипЗначения КАК ТипЗначения, - | ИСТИНА КАК Общее, - | ВЫБОР - | КОГДА СвойстваНаборов.ПометкаУдаления = ИСТИНА - | ТОГДА 4 - | ИНАЧЕ 3 - | КОНЕЦ КАК НомерКартинки, - | Свойства.Подсказка КАК Подсказка, - | Свойства.ЗаголовокФормыЗначения КАК ЗаголовокФормыЗначения, - | Свойства.ЗаголовокФормыВыбораЗначения КАК ЗаголовокФормыВыбораЗначения - |ИЗ - | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК СвойстваНаборов - | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства - | ПО СвойстваНаборов.Свойство = Свойства.Ссылка - | - |ГДЕ - | СвойстваНаборов.Ссылка = &Набор - | - |УПОРЯДОЧИТЬ ПО - | СвойстваНаборов.НомерСтроки - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | Наборы.ВерсияДанных КАК ВерсияДанных - |ИЗ - | Справочник.НаборыДополнительныхРеквизитовИСведений КАК Наборы - |ГДЕ - | Наборы.Ссылка = &Набор"; - - Иначе - Запрос.Текст = - "ВЫБРАТЬ - | Свойства.Ссылка КАК Свойство, - | Свойства.ПометкаУдаления КАК ПометкаУдаления, - | Свойства.Заголовок КАК Заголовок, - | Свойства.ВладелецДополнительныхЗначений, - | Свойства.ТипЗначения КАК ТипЗначения, - | ИСТИНА КАК Общее, - | ВЫБОР - | КОГДА Свойства.ПометкаУдаления = ИСТИНА - | ТОГДА 4 - | ИНАЧЕ 3 - | КОНЕЦ КАК НомерКартинки, - | Свойства.Подсказка КАК Подсказка, - | Свойства.ЗаголовокФормыЗначения КАК ЗаголовокФормыЗначения, - | Свойства.ЗаголовокФормыВыбораЗначения КАК ЗаголовокФормыВыбораЗначения - |ИЗ - | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК СоставНабора - | ПО Свойства.Ссылка = СоставНабора.Свойство - | - |ГДЕ - | Свойства.ЭтоДополнительноеСведение = &ЭтоДополнительноеСведение - | И СоставНабора.Свойство ЕСТЬ NULL - | - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ""ВерсияДанных"" КАК ВерсияДанных"; - - Запрос.УстановитьПараметр("ЭтоДополнительноеСведение", ЭтоДополнительноеСведение = 1); - КонецЕсли; - Если ЭтоДополнительноеСведение Тогда - Запрос.Текст = СтрЗаменить( - Запрос.Текст, - "Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты", - "Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения"); - КонецЕсли; - - Запрос.УстановитьПараметр("ЭтоОсновнойЯзык", ОбщегоНазначения.ЭтоОсновнойЯзык()); - Запрос.УстановитьПараметр("КодЯзыка", ТекущийЯзык().КодЯзыка); - - НачатьТранзакцию(); - Попытка - РезультатыЗапроса = Запрос.ВыполнитьПакет(); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - Если Элементы.Свойства.ТекущаяСтрока = Неопределено Тогда - Строка = Неопределено; - Иначе - Строка = Свойства.НайтиПоИдентификатору(Элементы.Свойства.ТекущаяСтрока); - КонецЕсли; - ТекущееСвойство = ?(Строка = Неопределено, Неопределено, Строка.Свойство); - - Свойства.Очистить(); - - Выборка = РезультатыЗапроса[0].Выбрать(); - Пока Выборка.Следующий() Цикл - - НоваяСтрока = Свойства.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка); - - НоваяСтрока.ОбщиеЗначения = ЗначениеЗаполнено(Выборка.ВладелецДополнительныхЗначений); - - Если Выборка.ТипЗначения <> NULL - И УправлениеСвойствамиСлужебный.ТипЗначенияСодержитЗначенияСвойств(Выборка.ТипЗначения) Тогда - - НоваяСтрока.ТипЗначения = Строка(Новый ОписаниеТипов( - Выборка.ТипЗначения, - , - "СправочникСсылка.ЗначенияСвойствОбъектовИерархия, - |СправочникСсылка.ЗначенияСвойствОбъектов")); - - Запрос = Новый Запрос; - Если ЗначениеЗаполнено(Выборка.ВладелецДополнительныхЗначений) Тогда - Запрос.УстановитьПараметр("Владелец", Выборка.ВладелецДополнительныхЗначений); - Иначе - Запрос.УстановитьПараметр("Владелец", Выборка.Свойство); - КонецЕсли; - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 4 - | ПРЕДСТАВЛЕНИЕ(ЗначенияСвойствОбъектов.Ссылка) КАК Наименование - |ИЗ - | Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов - |ГДЕ - | ЗначенияСвойствОбъектов.Владелец = &Владелец - | И НЕ ЗначенияСвойствОбъектов.ЭтоГруппа - | И НЕ ЗначенияСвойствОбъектов.ПометкаУдаления - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ ПЕРВЫЕ 4 - | ПРЕДСТАВЛЕНИЕ(ЗначенияСвойствОбъектовИерархия.Ссылка) КАК Наименование - |ИЗ - | Справочник.ЗначенияСвойствОбъектовИерархия КАК ЗначенияСвойствОбъектовИерархия - |ГДЕ - | ЗначенияСвойствОбъектовИерархия.Владелец = &Владелец - | И НЕ ЗначенияСвойствОбъектовИерархия.ПометкаУдаления - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА КАК ЗначениеИстина - |ИЗ - | Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов - |ГДЕ - | ЗначенияСвойствОбъектов.Владелец = &Владелец - | И НЕ ЗначенияСвойствОбъектов.ЭтоГруппа - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - |ИЗ - | Справочник.ЗначенияСвойствОбъектовИерархия КАК ЗначенияСвойствОбъектовИерархия - |ГДЕ - | ЗначенияСвойствОбъектовИерархия.Владелец = &Владелец"; - РезультатыЗапроса = Запрос.ВыполнитьПакет(); - - ПервыеЗначения = РезультатыЗапроса[0].Выгрузить().ВыгрузитьКолонку("Наименование"); - - Если ПервыеЗначения.Количество() = 0 Тогда - Если РезультатыЗапроса[1].Пустой() Тогда - ПредставлениеЗначений = НСтр("ru = 'Значения еще не введены'"); - Иначе - ПредставлениеЗначений = НСтр("ru = 'Значения помечены на удаление'"); - КонецЕсли; - Иначе - ПредставлениеЗначений = ""; - Номер = 0; - Для каждого Значение Из ПервыеЗначения Цикл - Номер = Номер + 1; - Если Номер = 4 Тогда - ПредставлениеЗначений = ПредставлениеЗначений + ",..."; - Прервать; - КонецЕсли; - ПредставлениеЗначений = ПредставлениеЗначений + ?(Номер > 1, ", ", "") + Значение; - КонецЦикла; - КонецЕсли; - ПредставлениеЗначений = "<" + ПредставлениеЗначений + ">"; - Если ЗначениеЗаполнено(НоваяСтрока.ТипЗначения) Тогда - ПредставлениеЗначений = ПредставлениеЗначений + ", "; - КонецЕсли; - НоваяСтрока.ТипЗначения = ПредставлениеЗначений + НоваяСтрока.ТипЗначения; - КонецЕсли; - - Если Выборка.Свойство = ТекущееСвойство Тогда - Элементы.Свойства.ТекущаяСтрока = - Свойства[Свойства.Количество()-1].ПолучитьИдентификатор(); - КонецЕсли; - КонецЦикла; + УправлениеСвойствамиСлужебный.ОбновитьСписокСвойствТекущегоНабора(ЭтотОбъект, + ВыбранныйНаборСвойств, + ЭтоДополнительноеСведение = 1); КонецПроцедуры @@ -2592,198 +2395,27 @@ НовоеНаименование = Заголовок; - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | СвойстваНабора.Свойство КАК Свойство, - | РеквизитыИСведения.ЭтоДополнительноеСведение КАК ЭтоДополнительноеСведение - |ИЗ - | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК СвойстваНабора - | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК РеквизитыИСведения - | ПО (РеквизитыИСведения.Ссылка = СвойстваНабора.Свойство) - |ГДЕ - | РеквизитыИСведения.Заголовок = &Наименование - | И СвойстваНабора.Ссылка = &НаборСвойств - | И СвойстваНабора.Свойство <> &Ссылка - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ ПЕРВЫЕ 1 - | СвойстваНабора.Свойство КАК Свойство, - | РеквизитыИСведения.ЭтоДополнительноеСведение КАК ЭтоДополнительноеСведение - |ИЗ - | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения КАК СвойстваНабора - | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК РеквизитыИСведения - | ПО (РеквизитыИСведения.Ссылка = СвойстваНабора.Свойство) - |ГДЕ - | РеквизитыИСведения.Заголовок = &Наименование - | И СвойстваНабора.Ссылка = &НаборСвойств - | И СвойстваНабора.Свойство <> &Ссылка"; - - Запрос.УстановитьПараметр("Ссылка", ТекущееСвойство); - Запрос.УстановитьПараметр("НаборСвойств", НаборСвойств); - Запрос.УстановитьПараметр("Наименование", НовоеНаименование); - - НачатьТранзакцию(); - Попытка - Выборка = Запрос.Выполнить().Выбрать(); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - Если НЕ Выборка.Следующий() Тогда - Возврат ""; - КонецЕсли; - - Если Выборка.ЭтоДополнительноеСведение Тогда - ТекстВопроса = НСтр("ru = 'Существует дополнительное сведение с наименованием - |""%1"".'"); - Иначе - ТекстВопроса = НСтр("ru = 'Существует дополнительный реквизит с наименованием - |""%1"".'"); - КонецЕсли; - - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ТекстВопроса + Символы.ПС + Символы.ПС - + НСтр("ru = 'Рекомендуется использовать другое наименование, - |иначе программа может работать некорректно.'"), - НовоеНаименование); - - Возврат ТекстВопроса; + Возврат УправлениеСвойствамиСлужебный.НаименованиеУжеИспользуется(ТекущееСвойство, НаборСвойств, НовоеНаименование); КонецФункции &НаСервереБезКонтекста Функция ИмяУжеИспользуется(Знач Имя, Знач ТекущееСвойство, НовоеНаименование) - НовоеИмя = Имя; - УправлениеСвойствамиСлужебный.УдалитьНедопустимыеСимволы(НовоеИмя); - Если НовоеИмя <> Имя - Или ИмяНачинаетсяСЦифры(Имя) - Или СтрРазделить(НовоеИмя, " ", Истина).Количество() > 1 Тогда - - ТекстВопроса = НСтр("ru = 'Имя (группа Для разработчиков) должно состоять из одного слова, начинаться с буквы и не содержать специальных символов, кроме ""_"".'"); - Возврат ТекстВопроса; - КонецЕсли; + Возврат УправлениеСвойствамиСлужебный.ИмяУжеИспользуется(Имя, ТекущееСвойство); - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | Свойства.ЭтоДополнительноеСведение - |ИЗ - | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства - |ГДЕ - | Свойства.Имя = &Имя - | И Свойства.Ссылка <> &Ссылка"; - - Запрос.УстановитьПараметр("Ссылка", ТекущееСвойство); - Запрос.УстановитьПараметр("Имя", Имя); - - НачатьТранзакцию(); - Попытка - Выборка = Запрос.Выполнить().Выбрать(); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - Если НЕ Выборка.Следующий() Тогда - Возврат ""; - КонецЕсли; - - Если Выборка.ЭтоДополнительноеСведение Тогда - ТекстВопроса = НСтр("ru = 'Существует дополнительное сведение с именем - |""%1"".'"); - Иначе - ТекстВопроса = НСтр("ru = 'Существует дополнительный реквизит с именем - |""%1"".'"); - КонецЕсли; - - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ТекстВопроса + Символы.ПС + Символы.ПС - + НСтр("ru = 'Рекомендуется использовать другое имя, - |иначе программа может работать некорректно. - | - |Создать новое имя и продолжить запись?'"), - Имя); - - Возврат ТекстВопроса; - -КонецФункции - -&НаСервереБезКонтекста -Функция ИмяНачинаетсяСЦифры(ИмяРеквизита) - ПервыйСимвол = Лев(ИмяРеквизита, 1); - Если СтрНайти("0123456789", ПервыйСимвол) > 0 Тогда - Возврат Истина; - КонецЕсли; - - Возврат Ложь; КонецФункции &НаСервереБезКонтекста Функция ИдентификаторДляФормулУжеИспользуется(Знач ИдентификаторДляФормул, Знач ТекущееСвойство) - ПроверочныйИдентификатор = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ИдентификаторДляФормул(ИдентификаторДляФормул); - Если ВРег(ИдентификаторДляФормул) <> ВРег(ПроверочныйИдентификатор) Тогда - ТекстВопроса = НСтр("ru = 'Идентификатор ""%1"" не соответствует правилам именования переменных. - |Идентификатор не должен содержать пробелов и специальных символов. - | - |Создать новый идентификатор для формул и продолжить запись?'"); - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ТекстВопроса, - ИдентификаторДляФормул); - Возврат ТекстВопроса; - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | Свойства.ЭтоДополнительноеСведение - |ИЗ - | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства - |ГДЕ - | Свойства.ИдентификаторДляФормул = &ИдентификаторДляФормул - | И Свойства.Ссылка <> &Ссылка"; - - Запрос.УстановитьПараметр("Ссылка", ТекущееСвойство); - Запрос.УстановитьПараметр("ИдентификаторДляФормул", ИдентификаторДляФормул); - - НачатьТранзакцию(); - Попытка - Выборка = Запрос.Выполнить().Выбрать(); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - Если НЕ Выборка.Следующий() Тогда + ТекстВопроса = УправлениеСвойствамиСлужебный.ИдентификаторДляФормулУжеИспользуется(ИдентификаторДляФормул, ТекущееСвойство); + Если Не ЗначениеЗаполнено(ТекстВопроса) Тогда Возврат ""; КонецЕсли; - Если Выборка.ЭтоДополнительноеСведение Тогда - ТекстВопроса = НСтр("ru = 'Существует дополнительное сведение с идентификатором для формул - |""%1"".'"); - Иначе - ТекстВопроса = НСтр("ru = 'Существует дополнительный реквизит с идентификатором для формул - |""%1"".'"); - КонецЕсли; - - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ТекстВопроса + Символы.ПС + Символы.ПС - + НСтр("ru = 'Рекомендуется использовать другой идентификатор для формул, - |иначе программа может работать некорректно. - | - |Создать новый идентификатор для формул и продолжить запись?'"), - ИдентификаторДляФормул); - + Уточнение = НСтр("ru = 'Создать новый идентификатор для формул и продолжить запись?'"); + ТекстВопроса = ТекстВопроса + Символы.ПС + Символы.ПС + Уточнение; Возврат ТекстВопроса; КонецФункции diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl index db05cb09e..6994f0bdc 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl @@ -255,11 +255,11 @@ |ИЗ | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения |ГДЕ - | ДополнительныеРеквизитыИСведения.ИдентификаторДляФормул ПОДОБНО &ИдентификаторДляФормулПодобие + | ДополнительныеРеквизитыИСведения.ИдентификаторДляФормул ПОДОБНО &ИдентификаторДляФормулПодобие СПЕЦСИМВОЛ ""~"" | И ДополнительныеРеквизитыИСведения.Ссылка <> &СсылкаНаТекущийОбъект"; Запрос.УстановитьПараметр("СсылкаНаТекущийОбъект", СсылкаНаТекущийОбъект); Запрос.УстановитьПараметр("ИдентификаторДляФормул", Идентификатор); - Запрос.УстановитьПараметр("ИдентификаторДляФормулПодобие", Идентификатор + "%"); + Запрос.УстановитьПараметр("ИдентификаторДляФормулПодобие", ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(Идентификатор) + "%"); РезультатыЗапроса = Запрос.ВыполнитьПакет(); УникальностьПоТочномуСоответствию = РезультатыЗапроса[0]; @@ -457,7 +457,7 @@ Если МетаданныеВладельца = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при изменении настройки свойства %1. + НСтр("ru = 'Настройки свойства %1 не были изменены. |Набор свойств %2 не связан ни с одним владельцем значений свойств.'"), Свойство, ТекущийНаборСвойств); @@ -501,7 +501,7 @@ ИначеЕсли Свойство = СвойствоОбъект.Ссылка Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при изменении настройки свойства %1. + НСтр("ru = 'Настройки свойства %1 не были изменены. |Тип значения не содержит дополнительных значений.'"), Свойство); КонецЕсли; @@ -653,6 +653,7 @@ ЗапросАнализа.УстановитьПараметр("ВсеНаборыОбъекта", УправлениеСвойствамиСлужебный.ПолучитьНаборыСвойствОбъекта( Выборка.Объект).ВыгрузитьКолонку("Набор")); + // @skip-check query-in-loop - Порционная обработка больших объемов данных. Заменить = ЗапросАнализа.Выполнить().Пустой(); КонецЕсли; НаборСтаройЗаписи.Отбор.Объект.Установить(Выборка.Объект); @@ -742,6 +743,7 @@ ЗапросАнализа.УстановитьПараметр("ВсеНаборыОбъекта", УправлениеСвойствамиСлужебный.ПолучитьНаборыСвойствОбъекта( Выборка.Ссылка).ВыгрузитьКолонку("Набор")); + // @skip-check query-in-loop - Порционная обработка больших объемов данных. Заменить = ЗапросАнализа.Выполнить().Пустой(); КонецЕсли; Для каждого Строка Из ТекущийОбъект.ДополнительныеРеквизиты Цикл @@ -840,9 +842,9 @@ |ИЗ | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения |ГДЕ - | ДополнительныеРеквизитыИСведения.Имя ПОДОБНО """" - | ИЛИ ДополнительныеРеквизитыИСведения.Имя ПОДОБНО ""%-%"" - | ИЛИ ДополнительныеРеквизитыИСведения.Имя ПОДОБНО ""%«%"" + | ДополнительныеРеквизитыИСведения.Имя ПОДОБНО """" СПЕЦСИМВОЛ ""~"" + | ИЛИ ДополнительныеРеквизитыИСведения.Имя ПОДОБНО ""%-%"" СПЕЦСИМВОЛ ""~"" + | ИЛИ ДополнительныеРеквизитыИСведения.Имя ПОДОБНО ""%«%"" СПЕЦСИМВОЛ ""~"" | |ОБЪЕДИНИТЬ ВСЕ | @@ -893,6 +895,7 @@ Объект = Ссылка.ПолучитьОбъект(); Если Не ЗначениеЗаполнено(Объект.Имя) Тогда + // @skip-check query-in-loop - Порционная обработка больших объемов данных. УстановитьИмяРеквизита(Выборка, Объект); Иначе УправлениеСвойствамиСлужебный.УдалитьНедопустимыеСимволы(Объект.Имя); @@ -920,6 +923,7 @@ Если НЕ ЗначениеЗаполнено(Объект.ИдентификаторДляФормул) Тогда ЗаголовокДляФормул = ЗаголовокДляФормированияИдентификатора(Объект.Заголовок, Объект.Представления); + // @skip-check query-in-loop - Порционная обработка больших объемов данных. Объект.ИдентификаторДляФормул = УникальныйИдентификаторДляФормул(ЗаголовокДляФормул, Объект.Ссылка); КонецЕсли; @@ -934,7 +938,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать дополнительный реквизит (сведение) %1 по причине: |%2'"), - Выборка.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Выборка.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Метаданные.ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения, Выборка.Ссылка, ТекстСообщения); КонецПопытки; diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ДополнительныеРеквизитыИСведения.mdo b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ДополнительныеРеквизитыИСведения.mdo index bd8f6460d..83c4e7025 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ДополнительныеРеквизитыИСведения.mdo +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ДополнительныеРеквизитыИСведения.mdo @@ -410,6 +410,7 @@ <key>ru</key> <value>Наименование (дополнительный язык)</value> </synonym> + <comment>АПК:58</comment> <type> <types>String</types> <stringQualifiers> @@ -435,6 +436,7 @@ <key>ru</key> <value>Наименование (дополнительный язык 2)</value> </synonym> + <comment>АПК:58</comment> <type> <types>String</types> <stringQualifiers> @@ -510,6 +512,7 @@ <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:StringValue"/> + <indexing>Index</indexing> <fullTextSearch>Use</fullTextSearch> <dataHistory>Use</dataHistory> </attributes> diff --git a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Form.form index ade2dcfeb..f11d794ee 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаСписка/Form.form b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаСписка/Form.form index 00803bf13..419385c0c 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаСписка/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/Forms/ФормаСписка/Form.form @@ -81,7 +81,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/ManagerModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/ManagerModule.bsl index ca416612b..3824eb477 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/ManagerModule.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/ManagerModule.bsl @@ -36,6 +36,21 @@ #Область СлужебныеПроцедурыИФункции +// Возвращаемое значение: +// ФиксированнаяСтруктура: +// * БезРазделовИОбъектов - Булево +// * ВсеРазделыБезОбъектов - Булево +// * ЕдинственныйРаздел - ПланВидовХарактеристикСсылка.РазделыДатЗапретаИзменения +// * ПоказыватьРазделы - Булево +// * Разделы - ФиксированноеСоответствие из КлючИЗначение: +// ** Ключ - Строка +// ** Значение - ФиксированнаяСтруктура: +// *** Имя - Строка +// *** Представление - Строка +// *** Ссылка - ПланВидовХарактеристикСсылка.РазделыДатЗапретаИзменения +// *** ТипыОбъектов - ФиксированныйМассив +// * РазделыБезОбъектов - ФиксированныйМассив +// Функция СвойстваРазделовДатЗапрета() Экспорт Разделы = Новый ТаблицаЗначений; diff --git a/SSL/src/CommonAttributes/ОбластьДанныхВспомогательныеДанные/ОбластьДанныхВспомогательныеДанные.mdo b/SSL/src/CommonAttributes/ОбластьДанныхВспомогательныеДанные/ОбластьДанныхВспомогательныеДанные.mdo index dff9d1862..1822db063 100644 --- a/SSL/src/CommonAttributes/ОбластьДанныхВспомогательныеДанные/ОбластьДанныхВспомогательныеДанные.mdo +++ b/SSL/src/CommonAttributes/ОбластьДанныхВспомогательныеДанные/ОбластьДанныхВспомогательныеДанные.mdo @@ -16,10 +16,6 @@ <maxValue xsi:type="core:UndefinedValue"/> <dataHistory>Use</dataHistory> <fillValue xsi:type="core:UndefinedValue"/> - <content> - <metadata>ScheduledJob.РассылкаОтчетов</metadata> - <use>Use</use> - </content> <content> <metadata>InformationRegister.ИспользованиеПоставляемыхДополнительныхОтчетовИОбработокВОбластяхДанных</metadata> <use>Use</use> diff --git a/SSL/src/CommonAttributes/ОбластьДанныхОсновныеДанные/ОбластьДанныхОсновныеДанные.mdo b/SSL/src/CommonAttributes/ОбластьДанныхОсновныеДанные/ОбластьДанныхОсновныеДанные.mdo index 800140ad0..53ea2e603 100644 --- a/SSL/src/CommonAttributes/ОбластьДанныхОсновныеДанные/ОбластьДанныхОсновныеДанные.mdo +++ b/SSL/src/CommonAttributes/ОбластьДанныхОсновныеДанные/ОбластьДанныхОсновныеДанные.mdo @@ -94,6 +94,10 @@ <metadata>Constant.СоздаватьПодкаталогиСИменамиВладельцев</metadata> <use>DontUse</use> </content> + <content> + <metadata>ScheduledJob.УстановкаПорядкаОтложенногоОбновленияВМоделиСервиса</metadata> + <use>DontUse</use> + </content> <content> <metadata>Constant.СпособХраненияФайлов</metadata> <use>DontUse</use> @@ -126,6 +130,10 @@ <metadata>Constant.ВыполнятьЗамерыПроизводительности</metadata> <use>DontUse</use> </content> + <content> + <metadata>ScheduledJob.РассылкаОтчетов</metadata> + <use>DontUse</use> + </content> <content> <metadata>Constant.ПрофильБезопасностиИнформационнойБазы</metadata> <use>DontUse</use> @@ -146,6 +154,10 @@ <metadata>ScheduledJob.ПланированиеИзвлеченияТекстаВМоделиСервиса</metadata> <use>DontUse</use> </content> + <content> + <metadata>ScheduledJob.ПолучениеСтатусовЭлектронныхПисем</metadata> + <use>DontUse</use> + </content> <content> <metadata>InformationRegister.ПрогрессОбновления</metadata> <use>DontUse</use> @@ -170,10 +182,6 @@ <metadata>ScheduledJob.СкрытиеПерсональныхДанныхСубъектов</metadata> <use>DontUse</use> </content> - <content> - <metadata>Catalog.СценарииОбменовДанными</metadata> - <use>DontUse</use> - </content> <content> <metadata>Catalog.ИдентификаторыОбъектовМетаданных</metadata> <use>DontUse</use> @@ -694,6 +702,10 @@ <metadata>ScheduledJob.ОбновлениеСостоянияЗаявленияНаВыпускСертификата</metadata> <use>DontUse</use> </content> + <content> + <metadata>ScheduledJob.ОчисткаИсторииРассылкиОтчетов</metadata> + <use>DontUse</use> + </content> <content> <metadata>Constant.СинхронизироватьДанныеСПриложениемВИнтернетеПриЗавершенииРаботыПрограммы</metadata> <use>DontUse</use> @@ -774,6 +786,10 @@ <metadata>InformationRegister.ПакетыДляОтправки</metadata> <use>DontUse</use> </content> + <content> + <metadata>Constant.ПорядокОбрабатываемыхДанных</metadata> + <use>DontUse</use> + </content> <content> <metadata>Constant.ДетализироватьОбновлениеИБВЖурналеРегистрации</metadata> <use>DontUse</use> diff --git a/SSL/src/CommonCommands/АрхивСообщенийОбменов/CommandModule.bsl b/SSL/src/CommonCommands/АрхивСообщенийОбменов/CommandModule.bsl new file mode 100644 index 000000000..95fda99b7 --- /dev/null +++ b/SSL/src/CommonCommands/АрхивСообщенийОбменов/CommandModule.bsl @@ -0,0 +1,24 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытий + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + УзелИнформационнойБазы = ПараметрКоманды; + + Отбор = Новый Структура("УзелИнформационнойБазы", УзелИнформационнойБазы); + ЗначенияЗаполнения = Новый Структура("УзелИнформационнойБазы", УзелИнформационнойБазы); + + ОбменДаннымиКлиент.ОткрытьФормуЗаписиРегистраСведенийПоОтбору(Отбор, + ЗначенияЗаполнения, "НастройкиАрхиваСообщенийОбменов", ПараметрыВыполненияКоманды.Источник); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/CommonCommands/АрхивСообщенийОбменов/АрхивСообщенийОбменов.mdo b/SSL/src/CommonCommands/АрхивСообщенийОбменов/АрхивСообщенийОбменов.mdo new file mode 100644 index 000000000..8374ddb4d --- /dev/null +++ b/SSL/src/CommonCommands/АрхивСообщенийОбменов/АрхивСообщенийОбменов.mdo @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonCommand xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="85d6d214-2b70-4cc4-ba80-f4325dd4ca65"> + <name>АрхивСообщенийОбменов</name> + <synonym> + <key>ru</key> + <value>Архив сообщений обменов</value> + </synonym> + <group>CommandGroup.ПараметрыСинхронизацииДанных</group> + <representation>Auto</representation> + <toolTip> + <key>ru</key> + <value>Настройка параметров подключения обмена данными</value> + </toolTip> +</mdclass:CommonCommand> diff --git a/SSL/src/CommonCommands/ВремяТекущегоСеанса/CommandModule.bsl b/SSL/src/CommonCommands/ВремяТекущегоСеанса/CommandModule.bsl index 8139c4d0d..ba05d6b83 100644 --- a/SSL/src/CommonCommands/ВремяТекущегоСеанса/CommandModule.bsl +++ b/SSL/src/CommonCommands/ВремяТекущегоСеанса/CommandModule.bsl @@ -36,7 +36,7 @@ Функция ДополнительнаяИнформация() Результат = Новый Структура; Результат.Вставить("ПредставлениеЧасовогоПояса", ПредставлениеЧасовогоПояса(ЧасовойПоясСеанса())); - Результат.Вставить("ДатаСервера", ТекущаяДата()); + Результат.Вставить("ДатаСервера", ТекущаяДата()); // АПК:143 ТекущаяДата вызывается для получения даты сервера. Возврат Результат; КонецФункции diff --git a/SSL/src/CommonCommands/НастройкаОнлайнПоддержки/НастройкаОнлайнПоддержки.mdo b/SSL/src/CommonCommands/НастройкаОнлайнПоддержки/НастройкаОнлайнПоддержки.mdo deleted file mode 100644 index 1828638a2..000000000 --- a/SSL/src/CommonCommands/НастройкаОнлайнПоддержки/НастройкаОнлайнПоддержки.mdo +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonCommand xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="e417e2ab-5e25-40a9-8dc2-9552a4fe1a38"> - <name>НастройкаОнлайнПоддержки</name> - <synonym> - <key>ru</key> - <value>Настройка онлайн-поддержки</value> - </synonym> - <group>FormCommandBarImportant</group> - <representation>Auto</representation> - <includeHelpInContents>true</includeHelpInContents> -</mdclass:CommonCommand> diff --git a/SSL/src/CommonCommands/ОбъектыНезарегистрированныеПриЗацикливании/CommandModule.bsl b/SSL/src/CommonCommands/ОбъектыНезарегистрированныеПриЗацикливании/CommandModule.bsl new file mode 100644 index 000000000..84bc678f1 --- /dev/null +++ b/SSL/src/CommonCommands/ОбъектыНезарегистрированныеПриЗацикливании/CommandModule.bsl @@ -0,0 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 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/CommonCommands/ОбъектыНезарегистрированныеПриЗацикливании/ОбъектыНезарегистрированныеПриЗацикливании.mdo b/SSL/src/CommonCommands/ОбъектыНезарегистрированныеПриЗацикливании/ОбъектыНезарегистрированныеПриЗацикливании.mdo new file mode 100644 index 000000000..734575105 --- /dev/null +++ b/SSL/src/CommonCommands/ОбъектыНезарегистрированныеПриЗацикливании/ОбъектыНезарегистрированныеПриЗацикливании.mdo @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonCommand xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="e29d96ee-e8fa-4100-8a0e-494398e4ec9d"> + <name>ОбъектыНезарегистрированныеПриЗацикливании</name> + <synonym> + <key>ru</key> + <value>Объекты незарегистрированные при зацикливании</value> + </synonym> + <group>FormCommandBarImportant</group> + <representation>Auto</representation> +</mdclass:CommonCommand> diff --git a/SSL/src/CommonCommands/ПомощникПереходаНаИнтернетВнутренняяПубликация/CommandModule.bsl b/SSL/src/CommonCommands/ПомощникПереходаНаИнтернетВнутренняяПубликация/CommandModule.bsl new file mode 100644 index 000000000..018207a3e --- /dev/null +++ b/SSL/src/CommonCommands/ПомощникПереходаНаИнтернетВнутренняяПубликация/CommandModule.bsl @@ -0,0 +1,24 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 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/CommonCommands/ПомощникПереходаНаИнтернетВнутренняяПубликация/ПомощникПереходаНаИнтернетВнутренняяПубликация.mdo b/SSL/src/CommonCommands/ПомощникПереходаНаИнтернетВнутренняяПубликация/ПомощникПереходаНаИнтернетВнутренняяПубликация.mdo new file mode 100644 index 000000000..d7cff39fc --- /dev/null +++ b/SSL/src/CommonCommands/ПомощникПереходаНаИнтернетВнутренняяПубликация/ПомощникПереходаНаИнтернетВнутренняяПубликация.mdo @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonCommand xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="19ea515f-65f7-4ed9-812b-c97b92e2498f"> + <name>ПомощникПереходаНаИнтернетВнутренняяПубликация</name> + <synonym> + <key>ru</key> + <value>Помощник перехода на Интернет (внутренняя публикация)</value> + </synonym> + <group>FormCommandBarImportant</group> + <representation>Auto</representation> +</mdclass:CommonCommand> diff --git a/SSL/src/CommonCommands/СвязатьсяСоСпециалистомОнлайнПоддержки/СвязатьсяСоСпециалистомОнлайнПоддержки.mdo b/SSL/src/CommonCommands/СвязатьсяСоСпециалистомОнлайнПоддержки/СвязатьсяСоСпециалистомОнлайнПоддержки.mdo deleted file mode 100644 index db9ab2098..000000000 --- a/SSL/src/CommonCommands/СвязатьсяСоСпециалистомОнлайнПоддержки/СвязатьсяСоСпециалистомОнлайнПоддержки.mdo +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonCommand xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="3b9c03bc-8517-498f-8052-e53854fb0753"> - <name>СвязатьсяСоСпециалистомОнлайнПоддержки</name> - <synonym> - <key>ru</key> - <value>Связаться со специалистом онлайн-поддержки</value> - </synonym> - <group>FormCommandBarImportant</group> - <toolTip> - <key>ru</key> - <value>Мгновенное соединение со специалистом онлайн-поддержки</value> - </toolTip> -</mdclass:CommonCommand> diff --git a/SSL/src/CommonForms/АвтономнаяРабота/Form.form b/SSL/src/CommonForms/АвтономнаяРабота/Form.form index 0ecb48c33..9f5e7db2a 100644 --- a/SSL/src/CommonForms/АвтономнаяРабота/Form.form +++ b/SSL/src/CommonForms/АвтономнаяРабота/Form.form @@ -38,7 +38,7 @@ <autoMaxHeight>true</autoMaxHeight> <extInfo xsi:type="form:PictureDecorationExtInfo"> <picture xsi:type="core:PictureRef"> - <picture>CommonPicture.УдалитьИнформация</picture> + <picture>StdPicture.Information</picture> </picture> </extInfo> </items> @@ -93,7 +93,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -185,7 +184,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -276,7 +274,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -301,7 +298,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -447,7 +443,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -593,7 +588,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -761,7 +755,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -791,7 +784,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -816,7 +808,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -847,7 +838,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -856,6 +846,33 @@ <currentRowUse>Auto</currentRowUse> </extInfo> </items> + <items xsi:type="form:Button"> + <name>АрхивСообщенийОбменов</name> + <id>114</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>АрхивСообщенийОбменовРасширеннаяПодсказка</name> + <id>115</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <type>UsualButton</type> + <commandName>Form.Command.АрхивСообщенийОбменов</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> <visible>true</visible> <enabled>true</enabled> <userVisible> @@ -973,7 +990,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1091,7 +1107,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1435,6 +1450,28 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>АрхивСообщенийОбменов</name> + <title> + <key>ru</key> + <value>Архив сообщений обменов...</value> + + 6 + + ru + Архив сообщений обменов + + + true + + + + АрхивСообщенийОбменов + + + Auto + Auto + diff --git a/SSL/src/CommonForms/АвтономнаяРабота/Module.bsl b/SSL/src/CommonForms/АвтономнаяРабота/Module.bsl index 3b912aad1..d7972725d 100644 --- a/SSL/src/CommonForms/АвтономнаяРабота/Module.bsl +++ b/SSL/src/CommonForms/АвтономнаяРабота/Module.bsl @@ -169,6 +169,17 @@ КонецПроцедуры +&НаКлиенте +Процедура АрхивСообщенийОбменов(Команда) + + Отбор = Новый Структура("УзелИнформационнойБазы", ПриложениеВСервисе); + ЗначенияЗаполнения = Новый Структура("УзелИнформационнойБазы", ПриложениеВСервисе); + + ОбменДаннымиКлиент.ОткрытьФормуЗаписиРегистраСведенийПоОтбору(Отбор, + ЗначенияЗаполнения, "НастройкиАрхиваСообщенийОбменов", ЭтаФорма); + +КонецПроцедуры + &НаКлиенте Процедура ПерейтиККонфликтам(Команда) @@ -475,4 +486,5 @@ Возврат Расписание; КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Form.form b/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Form.form index 0b77cf26b..22372ce9a 100644 --- a/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Form.form +++ b/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Form.form @@ -158,7 +158,6 @@ UsualGroup Vertical - Auto true true Auto @@ -182,7 +181,6 @@ UsualGroup - Auto true true Auto @@ -269,7 +267,6 @@ UsualGroup - Auto NormalSeparation true true @@ -427,7 +424,6 @@ UsualGroup - Auto true true Auto @@ -518,7 +514,6 @@ UsualGroup - Auto true true Auto @@ -604,7 +599,6 @@ UsualGroup - Auto true true Auto @@ -662,7 +656,6 @@ UsualGroup - Auto true true Auto @@ -751,7 +744,6 @@ UsualGroup - Auto NormalSeparation true true @@ -777,7 +769,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -865,7 +856,6 @@ UsualGroup - Auto NormalSeparation true true diff --git a/SSL/src/CommonForms/АдреснаяКнига/Form.form b/SSL/src/CommonForms/АдреснаяКнига/Form.form index 835250338..1692c486d 100644 --- a/SSL/src/CommonForms/АдреснаяКнига/Form.form +++ b/SSL/src/CommonForms/АдреснаяКнига/Form.form @@ -318,7 +318,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1632,7 +1631,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -2912,7 +2910,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2941,7 +2938,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -2970,7 +2966,6 @@ UsualGroup AlwaysHorizontal - Auto true true Equal diff --git a/SSL/src/CommonForms/АутентификацияВСервисе/Module.bsl b/SSL/src/CommonForms/АутентификацияВСервисе/Module.bsl index 8ff24afc4..015ef62e2 100644 --- a/SSL/src/CommonForms/АутентификацияВСервисе/Module.bsl +++ b/SSL/src/CommonForms/АутентификацияВСервисе/Module.bsl @@ -42,8 +42,8 @@ ВыполнитьОбработкуОповещения(ЭтотОбъект.ОписаниеОповещенияОЗакрытии, ПарольПользователяСервиса); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ЗаписатьОшибкуВЖурнал(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке) + Символы.ПС + ЗаписатьОшибкуВЖурнал(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке) + Символы.ПС + НСтр("ru = 'Возможно пароль введен неверно, повторите ввод пароля.'"); КонецПопытки; ЭтотОбъект.ОписаниеОповещенияОЗакрытии = Неопределено; diff --git a/SSL/src/CommonForms/ВводЗначенийСпискомСФлажками/Form.form b/SSL/src/CommonForms/ВводЗначенийСпискомСФлажками/Form.form index 4b94b95fd..abf90c293 100644 --- a/SSL/src/CommonForms/ВводЗначенийСпискомСФлажками/Form.form +++ b/SSL/src/CommonForms/ВводЗначенийСпискомСФлажками/Form.form @@ -760,7 +760,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1135,6 +1134,38 @@ Compact + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 110 + + СтрокаПоискаРасширеннаяПодсказка + 112 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 111 + true + + Список + + true + + ФормаИзменитьФорму 70 diff --git a/SSL/src/CommonForms/ВводЗначенийСпискомСФлажками/Module.bsl b/SSL/src/CommonForms/ВводЗначенийСпискомСФлажками/Module.bsl index d81df47e2..a35644929 100644 --- a/SSL/src/CommonForms/ВводЗначенийСпискомСФлажками/Module.bsl +++ b/SSL/src/CommonForms/ВводЗначенийСпискомСФлажками/Module.bsl @@ -76,7 +76,7 @@ Элементы.СписокПодбор.Видимость = Ложь; Элементы.СписокПодборМеню.Видимость = Ложь; Элементы.СписокПодборПодвал.Видимость = Ложь; - Элементы.СписокДобавить.ТолькоВоВсехДействиях = Ложь; + Элементы.СписокДобавить.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели; КонецЕсли; ВыборГруппИЭлементов = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ВыборГруппИЭлементов"); diff --git a/SSL/src/CommonForms/ВводНаРазныхЯзыках/Form.form b/SSL/src/CommonForms/ВводНаРазныхЯзыках/Form.form index e05215191..c6769e8ed 100644 --- a/SSL/src/CommonForms/ВводНаРазныхЯзыках/Form.form +++ b/SSL/src/CommonForms/ВводНаРазныхЯзыках/Form.form @@ -59,7 +59,6 @@ UsualGroup Vertical - Auto true true Auto @@ -267,6 +266,33 @@ true + + ПредставлениеНаИсходномЯзыке + 7 + + String + + + + true + + + true + + + + ПредставлениеНаИсходномЯзыкеИзменено + 8 + + Boolean + + + true + + + true + + ОК diff --git a/SSL/src/CommonForms/ВводНаРазныхЯзыках/Module.bsl b/SSL/src/CommonForms/ВводНаРазныхЯзыках/Module.bsl index b39d5d19e..961336031 100644 --- a/SSL/src/CommonForms/ВводНаРазныхЯзыках/Module.bsl +++ b/SSL/src/CommonForms/ВводНаРазныхЯзыках/Module.bsl @@ -200,6 +200,7 @@ МодульПереводТекстаНаДругиеЯзыки = ОбщегоНазначения.ОбщийМодуль("ПереводТекстаНаДругиеЯзыки"); Элементы.Перевести.Видимость = МодульПереводТекстаНаДругиеЯзыки.ДоступенПереводТекста() И Не Параметры.ТолькоПросмотр И Не ТолькоПросмотр; + ПредставлениеНаИсходномЯзыке = ПредставлениеНаИсходномЯзыке(); КонецЕсли; Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда @@ -329,22 +330,27 @@ Возврат; КонецЕсли; - ЗначениеДляПеревода = Языки[0]; - ИсходныйЯзык = СтрРазделить(ЗначениеДляПеревода.КодЯзыка, "_", Ложь)[0]; - ПредставлениеНаИсходномЯзыке = ЭтотОбъект[ЗначениеДляПеревода.Имя]; + ИсходныйЯзык = СтрРазделить(ОбщегоНазначения.КодОсновногоЯзыка(), "_", Ложь)[0]; + Если ПредставлениеНаИсходномЯзыке <> ПредставлениеНаИсходномЯзыке() Тогда + ПредставлениеНаИсходномЯзыке = ПредставлениеНаИсходномЯзыке(); + ПредставлениеНаИсходномЯзыкеИзменено = Истина; + КонецЕсли; ДоступныеЯзыки = МодульПереводТекстаНаДругиеЯзыки.ДоступныеЯзыки(); Если ДоступныеЯзыки.НайтиПоЗначению(ИсходныйЯзык) = Неопределено Тогда Возврат; КонецЕсли; - Для Индекс = 1 По Языки.Количество() - 1 Цикл + Для Индекс = 0 По Языки.Количество() - 1 Цикл СтрокаТаблицы = Языки[Индекс]; ЯзыкПеревода = СтрРазделить(СтрокаТаблицы.КодЯзыка, "_", Ложь)[0]; + Если ИсходныйЯзык = ЯзыкПеревода Тогда + Продолжить; + КонецЕсли; Если ДоступныеЯзыки.НайтиПоЗначению(ЯзыкПеревода) = Неопределено Тогда Продолжить; КонецЕсли; - Если ЗначениеЗаполнено(ЭтотОбъект[СтрокаТаблицы.Имя]) Тогда + Если Не ПредставлениеНаИсходномЯзыкеИзменено И ЗначениеЗаполнено(ЭтотОбъект[СтрокаТаблицы.Имя]) Тогда Элементы[СтрокаТаблицы.Имя].ЦветФона = Новый Цвет; Иначе ЭтотОбъект[СтрокаТаблицы.Имя] = ПеревестиТекстНаСервере(ПредставлениеНаИсходномЯзыке, ЯзыкПеревода, ИсходныйЯзык); @@ -353,6 +359,8 @@ КонецЕсли; КонецЦикла; + ПредставлениеНаИсходномЯзыкеИзменено = Ложь; + КонецПроцедуры &НаСервереБезКонтекста @@ -365,4 +373,16 @@ КонецФункции +&НаСервере +Функция ПредставлениеНаИсходномЯзыке() + + НайденныеСтроки = Языки.НайтиСтроки(Новый Структура("КодЯзыка", ОбщегоНазначения.КодОсновногоЯзыка())); + Для Каждого ОписаниеЯзыка Из НайденныеСтроки Цикл + Возврат ЭтотОбъект[ОписаниеЯзыка.Имя]; + КонецЦикла; + + Возврат ""; + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonForms/Вопрос/Form.form b/SSL/src/CommonForms/Вопрос/Form.form index dd7f538db..9df8a5150 100644 --- a/SSL/src/CommonForms/Вопрос/Form.form +++ b/SSL/src/CommonForms/Вопрос/Form.form @@ -209,7 +209,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -238,7 +237,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/CommonForms/Вопрос/Module.bsl b/SSL/src/CommonForms/Вопрос/Module.bsl index 83dd7a973..041fe4b46 100644 --- a/SSL/src/CommonForms/Вопрос/Module.bsl +++ b/SSL/src/CommonForms/Вопрос/Module.bsl @@ -211,7 +211,7 @@ Команда.ИзменяетСохраняемыеДанные = Ложь; Кнопка= Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), КоманднаяПанель); - Кнопка.ТолькоВоВсехДействиях = Ложь; + Кнопка.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели; Кнопка.ИмяКоманды = ИмяКоманды; СоответствиеКнопокЗначениям.Вставить(ИмяКоманды, ЭлементОписаниеКнопки.Значение); diff --git a/SSL/src/CommonForms/ВопросОбУстановкеВнешнейКомпоненты/Form.form b/SSL/src/CommonForms/ВопросОбУстановкеВнешнейКомпоненты/Form.form index 50a9c1edc..d300ee19b 100644 --- a/SSL/src/CommonForms/ВопросОбУстановкеВнешнейКомпоненты/Form.form +++ b/SSL/src/CommonForms/ВопросОбУстановкеВнешнейКомпоненты/Form.form @@ -68,7 +68,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/CommonForms/ВосстановлениеПаролей/Form.form b/SSL/src/CommonForms/ВосстановлениеПаролей/Form.form index a98fa878e..29665e8e0 100644 --- a/SSL/src/CommonForms/ВосстановлениеПаролей/Form.form +++ b/SSL/src/CommonForms/ВосстановлениеПаролей/Form.form @@ -417,7 +417,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -500,7 +499,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -529,7 +527,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -705,7 +702,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -822,7 +818,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1543,7 +1538,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1777,7 +1771,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/CommonForms/ВосстановлениеПаролей/Help/ru.html b/SSL/src/CommonForms/ВосстановлениеПаролей/Help/ru.html index 66631be45..4c193a28d 100644 --- a/SSL/src/CommonForms/ВосстановлениеПаролей/Help/ru.html +++ b/SSL/src/CommonForms/ВосстановлениеПаролей/Help/ru.html @@ -33,7 +33,7 @@ <li><b>Пользователь</b>;</li> <li><b>Пароль</b>.</li> <li><b>Отправитель</b>.</li></ul></ul><h3>Шаблон сообщения с кодом восстановления пароля</h3></div> -<div>Можно написать текст письма, который придет пользователю с кодом для восстановления пароля. Текст сообщения является произвольным, но в него необходимо <b>Вставить параметры</b> с помощью кнопки:</div> +<div>Можно написать текст письма, который придет пользователю с кодом для восстановления пароля. Шаблоном сообщения можно воспользоваться только при отправке писем в вариантах <b>Настройки почты</b> и <b>Указанный почтовый сервер</b>. Текст сообщения является произвольным, но в него необходимо <b>Вставить параметры</b> с помощью кнопки:</div> <div> <ul><li>Код подтверждения (<b>&VerificationCode</b>) - код для восстановления пароля, является обязательным, генерируется программой автоматически во время отправки сообщения;</li> <li>Имя пользователя <b>(&UserPresentation</b>);</li> diff --git a/SSL/src/CommonForms/ВосстановлениеПаролей/Module.bsl b/SSL/src/CommonForms/ВосстановлениеПаролей/Module.bsl index 57bf76c01..1a9f4d66b 100644 --- a/SSL/src/CommonForms/ВосстановлениеПаролей/Module.bsl +++ b/SSL/src/CommonForms/ВосстановлениеПаролей/Module.bsl @@ -15,12 +15,7 @@ ВызватьИсключение НСтр("ru = 'Недостаточно прав для выполнения операции.'"); КонецЕсли; - Если Не ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда - ВызватьИсключение НСтр("ru = 'Восстановление паролей пользователей не поддерживается. - |Обновите версию платформы 1С: Предприятие.'"); - КонецЕсли; - - ПрочитьНастройкиВосстановленияПароля(); + ПрочитатьНастройкиВосстановленияПароля(); Если ОтображатьГиперссылкуПомощи И ПустаяСтрока(НавигационнаяСсылкаПомощи) Тогда Элементы.НавигационнаяСсылкаПомощи.ОтметкаНезаполненного = Истина; @@ -337,21 +332,15 @@ &НаСервере Функция ТребуетсяЗапускЗаполненияПочтыПользователей() - Если Не ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда - Возврат Ложь; - КонецЕсли; - Если Не ВосстанавливатьПароль Тогда Возврат Ложь; КонецЕсли; - Настройки = ПользователиСлужебный.НастройкиВосстановленияПароля(); - Если Настройки = Неопределено Тогда - Возврат Ложь; - КонецЕсли; + Настройки = ДополнительныеНастройкиАутентификации.ПолучитьНастройкиВосстановленияПароля(); // НастройкиВосстановленияПароля // Предыдущие значение - Если Настройки.СпособВосстановленияПароля <> ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("Нет") Тогда + Если Настройки.СпособВосстановленияПароля + <> СпособВосстановленияПароляПользователяИнформационнойБазы.Нет Тогда Возврат Ложь; КонецЕсли; @@ -374,12 +363,8 @@ Если ПарольИзменен Тогда ТекущийПарольSMTP = ПарольSMTP; Иначе - ТекущиеНастройки = ПользователиСлужебный.НастройкиВосстановленияПароля(); - Если ТекущиеНастройки <> Неопределено Тогда - ТекущийПарольSMTP = ТекущиеНастройки.ПарольSMTP; - Иначе - ТекущийПарольSMTP = ""; - КонецЕсли; + ТекущиеНастройки = ДополнительныеНастройкиАутентификации.ПолучитьНастройкиВосстановленияПароля(); // НастройкиВосстановленияПароля + ТекущийПарольSMTP = ТекущиеНастройки.ПарольSMTP; КонецЕсли; Вложения = Новый Структура; @@ -397,11 +382,7 @@ КонецЦикла; - Настройки = ПользователиСлужебный.НовыеНастройкиВосстановленияПароля(); - Если Настройки = Неопределено Тогда - Возврат; - КонецЕсли; - + Настройки = ДополнительныеНастройкиАутентификации.ПолучитьНастройкиВосстановленияПароля(); // НастройкиВосстановленияПароля ЗаполнитьЗначенияСвойств(Настройки, ЭтотОбъект, СписокПолейНастроек()); Настройки.Заголовок = ТемаПисьма; @@ -410,37 +391,35 @@ Если ВосстанавливатьПароль Тогда Если ВариантВосстановленияПароля = "ПереходПоСсылке" Тогда - Настройки.СпособВосстановленияПароля = - ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("ПереходПоНавигационнойСсылке"); + Настройки.СпособВосстановленияПароля = + СпособВосстановленияПароляПользователяИнформационнойБазы.ПереходПоНавигационнойСсылке; + ИначеЕсли ВариантОтправкиПоПочте = "СтандартныйСервис" Тогда - Настройки.СпособВосстановленияПароля = - ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("ОтправкаКодаПодтвержденияЧерезСтандартныйСервис"); + Настройки.СпособВосстановленияПароля = + СпособВосстановленияПароляПользователяИнформационнойБазы.ОтправкаКодаПодтвержденияЧерезСтандартныйСервис; + ИначеЕсли ВариантОтправкиПоПочте = "ВнешнийПочтовыйСервер" Тогда - Настройки.СпособВосстановленияПароля = - ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("ОтправкаКодаПодтвержденияПоЗаданнымПараметрам"); + Настройки.СпособВосстановленияПароля = + СпособВосстановленияПароляПользователяИнформационнойБазы.ОтправкаКодаПодтвержденияПоЗаданнымПараметрам; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); НастройкиУчетнойЗаписиДляОтправкиПочта = МодульРаботаСПочтовымиСообщениямиСлужебный.НастройкиУчетнойЗаписиДляОтправкиПочта(УчетнаяЗаписьПочты); ЗаполнитьЗначенияСвойств(Настройки, НастройкиУчетнойЗаписиДляОтправкиПочта); - КонецЕсли; - Иначе - Настройки.СпособВосстановленияПароля = - ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("ОтправкаКодаПодтвержденияПоЗаданнымПараметрам"); + СпособВосстановленияПароляПользователяИнформационнойБазы.ОтправкаКодаПодтвержденияПоЗаданнымПараметрам; ЗаполнитьЗначенияСвойств(Настройки, ЭтотОбъект, "АдресСервераSMTP, ПарольSMTP, ПользовательSMTP, ПортSMTP,ИмяОтправителя"); Настройки.ИспользоватьSSL = ШифрованиеПриОтправкеПочты = "SSL"; КонецЕсли; Иначе - Настройки.СпособВосстановленияПароля = ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("Нет"); + Настройки.СпособВосстановленияПароля = СпособВосстановленияПароляПользователяИнформационнойБазы.Нет; КонецЕсли; УстановитьУчетнуюЗаписьДляВосстановленияПароля(УчетнаяЗаписьПочты, ВариантОтправкиПоПочте = "ВнешнийПочтовыйСервер"); - ПользователиСлужебный.УстановитьНастройкиВосстановленияПароля(Настройки); + ДополнительныеНастройкиАутентификации.УстановитьНастройкиВосстановленияПароля(Настройки); Модифицированность = Ложь; Если ЗапуститьФоновоеЗаполнениеПочтыПользователей Тогда @@ -450,7 +429,7 @@ КонецПроцедуры &НаСервере -Процедура ПрочитьНастройкиВосстановленияПароля() +Процедура ПрочитатьНастройкиВосстановленияПароля() ВариантОтправкиПоПочте = "СтандартныйСервис"; ВариантВосстановленияПароля = "ЧерезЭлектроннуюПочту"; @@ -461,11 +440,7 @@ УчетнаяЗаписьПочты = СведенияОбУчетнойЗаписи.УчетнаяЗаписьПочты; КонецЕсли; - Настройки = ПользователиСлужебный.НастройкиВосстановленияПароля(); - Если Настройки = Неопределено Тогда - Возврат; - КонецЕсли; - + Настройки = ДополнительныеНастройкиАутентификации.ПолучитьНастройкиВосстановленияПароля(); // НастройкиВосстановленияПароля ЗаполнитьЗначенияСвойств(ЭтотОбъект, Настройки, СписокПолейНастроек()); Если ЗначениеЗаполнено(Настройки.ПарольSMTP) Тогда @@ -482,29 +457,28 @@ ТемаПисьма = ?(ЗначениеЗаполнено(Настройки.Заголовок), Настройки.Заголовок, НСтр("ru='Восстановление пароля'")); - Если Настройки.СпособВосстановленияПароля = ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("Нет") Тогда + Если Настройки.СпособВосстановленияПароля = СпособВосстановленияПароляПользователяИнформационнойБазы.Нет Тогда ВосстанавливатьПароль = Ложь; Иначе ВосстанавливатьПароль = Истина; - Если Настройки.СпособВосстановленияПароля = ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("ОтправкаКодаПодтвержденияЧерезСтандартныйСервис") Тогда + Если Настройки.СпособВосстановленияПароля = СпособВосстановленияПароляПользователяИнформационнойБазы.ОтправкаКодаПодтвержденияЧерезСтандартныйСервис Тогда ВариантОтправкиПоПочте = "СтандартныйСервис"; - Иначе - Если Настройки.СпособВосстановленияПароля = - ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("ОтправкаКодаПодтвержденияПоЗаданнымПараметрам") Тогда - Элементы.ВариантыВосстановления.ТекущаяСтраница = Элементы.ЭлектроннаяПочта; - ВариантВосстановленияПароля = "ЧерезЭлектроннуюПочту"; - Если СведенияОбУчетнойЗаписи.Используется Тогда - ВариантОтправкиПоПочте = "ВнешнийПочтовыйСервер"; - Иначе - ВариантОтправкиПоПочте = "РучнаяНастройка"; - Элементы.ГруппаРучныеНастройкиПочты.Показать(); - КонецЕсли; - Иначе - Элементы.ВариантыВосстановления.ТекущаяСтраница = Элементы.ПереходПоСсылке; - ВариантВосстановленияПароля = "ПереходПоСсылке"; - КонецЕсли; + ИначеЕсли Настройки.СпособВосстановленияПароля + = СпособВосстановленияПароляПользователяИнформационнойБазы.ОтправкаКодаПодтвержденияПоЗаданнымПараметрам Тогда + + Элементы.ВариантыВосстановления.ТекущаяСтраница = Элементы.ЭлектроннаяПочта; + ВариантВосстановленияПароля = "ЧерезЭлектроннуюПочту"; + Если СведенияОбУчетнойЗаписи.Используется Тогда + ВариантОтправкиПоПочте = "ВнешнийПочтовыйСервер"; + Иначе + ВариантОтправкиПоПочте = "РучнаяНастройка"; + Элементы.ГруппаРучныеНастройкиПочты.Показать(); + КонецЕсли; + Иначе + Элементы.ВариантыВосстановления.ТекущаяСтраница = Элементы.ПереходПоСсылке; + ВариантВосстановленияПароля = "ПереходПоСсылке"; КонецЕсли; КонецЕсли; diff --git a/SSL/src/CommonForms/ВосстановлениеСвязиСГлавнымУзлом/Form.form b/SSL/src/CommonForms/ВосстановлениеСвязиСГлавнымУзлом/Form.form index a8bb66908..1354f6a62 100644 --- a/SSL/src/CommonForms/ВосстановлениеСвязиСГлавнымУзлом/Form.form +++ b/SSL/src/CommonForms/ВосстановлениеСвязиСГлавнымУзлом/Form.form @@ -98,7 +98,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/CommonForms/ВспомогательнаяФормаНастроекОтчета/Form.form b/SSL/src/CommonForms/ВспомогательнаяФормаНастроекОтчета/Form.form index 69b13c7a9..159f51035 100644 --- a/SSL/src/CommonForms/ВспомогательнаяФормаНастроекОтчета/Form.form +++ b/SSL/src/CommonForms/ВспомогательнаяФормаНастроекОтчета/Form.form @@ -25,7 +25,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/CommonForms/ВходВПрограммуЗапрещен/Form.form b/SSL/src/CommonForms/ВходВПрограммуЗапрещен/Form.form index 5cb044ac4..d3b72df24 100644 --- a/SSL/src/CommonForms/ВходВПрограммуЗапрещен/Form.form +++ b/SSL/src/CommonForms/ВходВПрограммуЗапрещен/Form.form @@ -97,7 +97,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Form.form b/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Form.form index 3aea1a980..3bcd47cec 100644 --- a/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Form.form +++ b/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Form.form @@ -99,7 +99,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -202,7 +201,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -238,7 +236,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -272,7 +269,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -390,7 +386,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -508,7 +503,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -539,7 +533,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Form.form b/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Form.form index d60924aac..c7dfa8e0c 100644 --- a/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Form.form +++ b/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Form.form @@ -256,6 +256,10 @@ </rowsPicture> <autoMaxCardHeight>true</autoMaxCardHeight> <extInfo xsi:type="form:DynamicListTableExtInfo"> + <handlers> + <event>OnGetDataAtServer</event> + <name>СписокПользователиПриПолученииДанныхНаСервере</name> + </handlers> <autoRefreshPeriod>60</autoRefreshPeriod> <period> <startDate>0001-01-01T00:00:00</startDate> @@ -692,11 +696,7 @@ Пользователи.ПометкаУдаления, Пользователи.Предопределенный, Пользователи.Наименование, - ВЫБОР - КОГДА Пользователи.ПометкаУдаления - ТОГДА 0 - ИНАЧЕ 1 - КОНЕЦ КАК НомерКартинки + -1 КАК НомерКартинки ИЗ Справочник.Пользователи КАК Пользователи ГДЕ diff --git a/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Module.bsl b/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Module.bsl index f5c607bad..cb03ed1d9 100644 --- a/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Module.bsl +++ b/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Module.bsl @@ -40,6 +40,8 @@ КонецЕсли; + ПользователиСлужебный.НастроитьПолеНомерКартинкиДинамическогоСписка(СписокПользователи); + КонецПроцедуры &НаКлиенте @@ -53,6 +55,17 @@ #КонецОбласти +#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокПользователи + +&НаСервереБезКонтекста +Процедура СписокПользователиПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки) + + ПользователиСлужебный.ДинамическийСписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки); + +КонецПроцедуры + +#КонецОбласти + #Область ОбработчикиСобытийЭлементовТаблицыФормыСписокРоли &НаКлиенте @@ -94,6 +107,10 @@ &НаКлиенте Процедура ВыборРоли(ТекущиеДанные) + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + Если ТекущиеДанные.ИспользуетсяСОбъектамиАдресации Тогда ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("РольИсполнителя", ТекущиеДанные.Ссылка); diff --git a/SSL/src/CommonForms/ВыборКонтакта/Form.form b/SSL/src/CommonForms/ВыборКонтакта/Form.form index 930223a2c..ddea7aba0 100644 --- a/SSL/src/CommonForms/ВыборКонтакта/Form.form +++ b/SSL/src/CommonForms/ВыборКонтакта/Form.form @@ -157,7 +157,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Form.form b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Form.form index 914a0e59f..a59be43fb 100644 --- a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Form.form +++ b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Form.form @@ -111,7 +111,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -133,6 +132,7 @@ <dataPath xsi:type="form:DataPath"> <segments>ДеревоОбъектовМетаданных</segments> </dataPath> + <defaultItem>true</defaultItem> <skipOnInput>false</skipOnInput> <titleLocation>None</titleLocation> <excludedCommands>Add</excludedCommands> @@ -419,6 +419,7 @@ <initialTreeView>ExpandTopLevel</initialTreeView> <horizontalStretch>true</horizontalStretch> <verticalStretch>true</verticalStretch> + <searchStringLocation>Top</searchStringLocation> <autoMaxCardHeight>true</autoMaxCardHeight> </items> <commandBarLocation>Top</commandBarLocation> diff --git a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl index a32f2587b..a0ec10a00 100644 --- a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl +++ b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl @@ -68,7 +68,8 @@ Если ФильтрПоОбъектамМетаданных.Количество() > 0 Тогда КоллекцииВыбираемыхОбъектовМетаданных.Очистить(); Для Каждого ОбъектМетаданныхПолноеИмя Из ФильтрПоОбъектамМетаданных Цикл - ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(Метаданные.НайтиПоПолномуИмени(ОбъектМетаданныхПолноеИмя.Значение)); + ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных( + ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ОбъектМетаданныхПолноеИмя.Значение)); Если КоллекцииВыбираемыхОбъектовМетаданных.НайтиПоЗначению(ИмяБазовогоТипа) = Неопределено Тогда КоллекцииВыбираемыхОбъектовМетаданных.Добавить(ИмяБазовогоТипа); КонецЕсли; diff --git a/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Form.form b/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Form.form index c64ac3bc2..f59c43748 100644 --- a/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Form.form +++ b/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Form.form @@ -126,7 +126,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/CommonForms/ВыборРолиИсполнителя/Form.form b/SSL/src/CommonForms/ВыборРолиИсполнителя/Form.form index afc831eb5..61cf8b696 100644 --- a/SSL/src/CommonForms/ВыборРолиИсполнителя/Form.form +++ b/SSL/src/CommonForms/ВыборРолиИсполнителя/Form.form @@ -194,7 +194,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -223,7 +222,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/CommonForms/ВыборРолиИсполнителя/Module.bsl b/SSL/src/CommonForms/ВыборРолиИсполнителя/Module.bsl index 46f644e32..1f80b6e15 100644 --- a/SSL/src/CommonForms/ВыборРолиИсполнителя/Module.bsl +++ b/SSL/src/CommonForms/ВыборРолиИсполнителя/Module.bsl @@ -127,11 +127,11 @@ Результат.Вставить("ОсновнойОбъектАдресации", ОсновнойОбъектАдресации); Результат.Вставить("ДополнительныйОбъектАдресации", ДополнительныйОбъектАдресации); - Если Результат.ОсновнойОбъектАдресации <> Неопределено И Результат.ОсновнойОбъектАдресации.Пустая() Тогда + Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Результат.ОсновнойОбъектАдресации)) И Результат.ОсновнойОбъектАдресации.Пустая() Тогда Результат.ОсновнойОбъектАдресации = Неопределено; КонецЕсли; - Если Результат.ДополнительныйОбъектАдресации <> Неопределено И Результат.ДополнительныйОбъектАдресации.Пустая() Тогда + Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Результат.ДополнительныйОбъектАдресации)) И Результат.ДополнительныйОбъектАдресации.Пустая() Тогда Результат.ДополнительныйОбъектАдресации = Неопределено; КонецЕсли; diff --git a/SSL/src/CommonForms/ВыборТиповПользователей/Form.form b/SSL/src/CommonForms/ВыборТиповПользователей/Form.form index 5f94beafc..0b2bf4f0f 100644 --- a/SSL/src/CommonForms/ВыборТиповПользователей/Form.form +++ b/SSL/src/CommonForms/ВыборТиповПользователей/Form.form @@ -57,11 +57,11 @@ <extInfo xsi:type="form:CheckBoxFieldExtInfo"/> </items> <items xsi:type="form:FormField"> - <name>НазначениеЗначение</name> + <name>НазначениеПредставление</name> <id>60</id> <title> <key>ru</key> - <value>Значение</value> + <value>Представление</value> true true @@ -69,10 +69,10 @@ true - Назначение.Value + Назначение.Presentation - НазначениеЗначениеРасширеннаяПодсказка + НазначениеПредставлениеРасширеннаяПодсказка 62 Label true @@ -82,7 +82,7 @@ - НазначениеЗначениеКонтекстноеМеню + НазначениеПредставлениеКонтекстноеМеню 61 true @@ -273,17 +273,75 @@ UserCmds Auto - - НазначениеУстановитьФлажки - 68 + + ГруппаКомандФлажки + 72 + + НазначениеУстановитьФлажки + 68 + true + true + + true + + + НазначениеУстановитьФлажкиРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + Form.Item.Назначение.StandardCommand.CheckAll + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + НазначениеСнятьФлажки + 70 + true + true + + true + + + НазначениеСнятьФлажкиРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + Form.Item.Назначение.StandardCommand.UncheckAll + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + true true true + + <key>ru</key> + <value>Группа команд флажки</value> + - НазначениеУстановитьФлажкиРасширеннаяПодсказка - 69 + ГруппаКомандФлажкиРасширеннаяПодсказка + 73 Label true true @@ -291,26 +349,25 @@ Left - Form.Item.Назначение.StandardCommand.CheckAll - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu + + Compact + - - НазначениеСнятьФлажки - 70 + + + <key>ru</key> + <value>Поиск</value> + true true true + СтрокаПоиск + 74 - НазначениеСнятьФлажкиРасширеннаяПодсказка - 71 + СтрокаПоискРасширеннаяПодсказка + 76 Label true true @@ -318,14 +375,15 @@ Left - Form.Item.Назначение.StandardCommand.UncheckAll - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu + + СтрокаПоискКонтекстноеМеню + 75 + true + + Назначение + + true + Left true diff --git a/SSL/src/CommonForms/ВыборУзловПлановОбмена/Form.form b/SSL/src/CommonForms/ВыборУзловПлановОбмена/Form.form index 78d22bf47..ad73afa02 100644 --- a/SSL/src/CommonForms/ВыборУзловПлановОбмена/Form.form +++ b/SSL/src/CommonForms/ВыборУзловПлановОбмена/Form.form @@ -61,6 +61,7 @@ Left true + 40 true true true @@ -102,6 +103,7 @@ Left true + 40 true true true @@ -221,7 +223,6 @@ AutoUse true true - false true Auto Auto @@ -229,6 +230,7 @@ true true true + Top true @@ -432,15 +434,11 @@ true - - StdPicture.ChooseValue - Выбрать - TextPicture DontUse Auto
        @@ -454,6 +452,12 @@ ПланыОбменаДляВыбора + + ТекущаяСтрока + + ExchangePlanRef + + diff --git a/SSL/src/CommonForms/ВыборУзловПлановОбмена/Module.bsl b/SSL/src/CommonForms/ВыборУзловПлановОбмена/Module.bsl index d805e4e74..7fd1fcf7a 100644 --- a/SSL/src/CommonForms/ВыборУзловПлановОбмена/Module.bsl +++ b/SSL/src/CommonForms/ВыборУзловПлановОбмена/Module.bsl @@ -24,31 +24,28 @@ КонецЕсли; КонецЕсли; - // Подготовка списка используемых планов обмена. Если ТипЗнч(Параметры.ПланыОбменаДляВыбора) = Тип("Массив") Тогда + ИспользуемыеПланыОбмена = Новый Массив; Для каждого Элемент Из Параметры.ПланыОбменаДляВыбора Цикл Если ТипЗнч(Элемент) = Тип("Строка") Тогда - // Поиск плана обмена по имени. - ДобавитьИспользуемыйПланОбмена(Метаданные.НайтиПоПолномуИмени(Элемент)); - ДобавитьИспользуемыйПланОбмена(Метаданные.НайтиПоПолномуИмени("ПланОбмена." + Элемент)); - // + ПланОбменаМетаданные = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Элемент); + Если ПланОбменаМетаданные = Неопределено Тогда + ПланОбменаМетаданные = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени("ПланОбмена." + Элемент); + КонецЕсли; ИначеЕсли ТипЗнч(Элемент) = Тип("Тип") Тогда - // Поиск плана обмена по заданному типу. - ДобавитьИспользуемыйПланОбмена(Метаданные.НайтиПоТипу(Элемент)); + ПланОбменаМетаданные = Метаданные.НайтиПоТипу(Элемент); Иначе - // Поиск плана обмена по типу заданного узла. - ДобавитьИспользуемыйПланОбмена(Метаданные.НайтиПоТипу(ТипЗнч(Элемент))); + ПланОбменаМетаданные = Метаданные.НайтиПоТипу(ТипЗнч(Элемент)); + КонецЕсли; + Если ПланОбменаМетаданные <> Неопределено Тогда + ИспользуемыеПланыОбмена.Добавить(ПланОбменаМетаданные); КонецЕсли; КонецЦикла; + ЗаполнитьПланыОбмена(ИспользуемыеПланыОбмена); Иначе - // Все планы обмена участвуют в выборе. - Для каждого ОбъектМетаданных Из Метаданные.ПланыОбмена Цикл - ДобавитьИспользуемыйПланОбмена(ОбъектМетаданных); - КонецЦикла; + ЗаполнитьПланыОбмена(Метаданные.ПланыОбмена); КонецЕсли; - УзлыПлановОбмена.Сортировать("ПланОбменаПредставление Возр"); - Если РежимПодбора Тогда Заголовок = НСтр("ru = 'Подбор узлов планов обмена'"); КонецЕсли; @@ -56,11 +53,7 @@ Элементы.УзлыПлановОбмена.РежимВыделения = РежимВыделенияТаблицы.Множественный; КонецЕсли; - ТекущаяСтрока = Неопределено; - Параметры.Свойство("ТекущаяСтрока", ТекущаяСтрока); - - НайденныеСтроки = УзлыПлановОбмена.НайтиСтроки(Новый Структура("Узел", ТекущаяСтрока)); - + НайденныеСтроки = УзлыПлановОбмена.НайтиСтроки(Новый Структура("Узел", Параметры.ТекущаяСтрока)); Если НайденныеСтроки.Количество() > 0 Тогда Элементы.УзлыПлановОбмена.ТекущаяСтрока = НайденныеСтроки[0].ПолучитьИдентификатор(); КонецЕсли; @@ -113,52 +106,70 @@ #Область СлужебныеПроцедурыИФункции &НаСервере -Процедура ДобавитьИспользуемыйПланОбмена(ОбъектМетаданных) +Процедура ЗаполнитьПланыОбмена(ПланыОбмена) - Если ОбъектМетаданных = Неопределено - ИЛИ НЕ Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных) Тогда + ТекстыЗапросов = Новый Массив; + + Для каждого ОбъектМетаданных Из ПланыОбмена Цикл + + Если ОбъектМетаданных = Неопределено Или Не Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных) Тогда + Продолжить; + КонецЕсли; + + Если Не ПравоДоступа("Просмотр", ОбъектМетаданных) Тогда + Продолжить; + КонецЕсли; + + ПланОбменаСсылка = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()).ПустаяСсылка(); + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | &ПланОбменаПустаяСсылка КАК ПустаяСсылка, + | &ПланОбменаПредставление КАК ПланОбменаПредставление, + | ТаблицаПланаОбмена.Ссылка КАК Ссылка, + | ТаблицаПланаОбмена.Представление КАК Представление + |ИЗ + | &ТаблицаПланаОбмена КАК ТаблицаПланаОбмена + |ГДЕ + | НЕ ТаблицаПланаОбмена.ЭтотУзел"; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПланОбменаПустаяСсылка", + "ЗНАЧЕНИЕ(" + ОбъектМетаданных.ПолноеИмя() + ".ПустаяСсылка)"); // @query-part-2 + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПланОбменаПредставление", """" + ОбъектМетаданных.Представление() + """"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаПланаОбмена", ОбъектМетаданных.ПолноеИмя()); + Если ТекстыЗапросов.Количество() > 0 Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); // @query-part + КонецЕсли; + + ТекстыЗапросов.Добавить(ТекстЗапроса); + + Если Параметры.ВыбиратьВсеУзлы Тогда + НоваяСтрока = УзлыПлановОбмена.Добавить(); + НоваяСтрока.ПланОбмена = ПланОбменаСсылка; + НоваяСтрока.ПланОбменаПредставление = ОбъектМетаданных.Синоним; + НоваяСтрока.Узел = ПланОбменаСсылка; + НоваяСтрока.УзелПредставление = НСтр("ru = '<Все информационные базы>'"); + КонецЕсли; + + КонецЦикла; + + Если ТекстыЗапросов.Количество() = 0 Тогда Возврат; КонецЕсли; - Если Не ПравоДоступа("Чтение", ОбъектМетаданных) Тогда - Возврат; - КонецЕсли; - - ПланОбмена = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()).ПустаяСсылка(); - - // Заполнение узлов используемых планов обмена. - Если Параметры.ВыбиратьВсеУзлы Тогда - НоваяСтрока = УзлыПлановОбмена.Добавить(); - НоваяСтрока.ПланОбмена = ПланОбмена; - НоваяСтрока.ПланОбменаПредставление = ОбъектМетаданных.Синоним; - НоваяСтрока.Узел = ПланОбмена; - НоваяСтрока.УзелПредставление = НСтр("ru = '<Все информационные базы>'"); - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ТаблицаПланаОбмена.Ссылка, - | ТаблицаПланаОбмена.Представление КАК Представление - |ИЗ - | &ТаблицаПланаОбмена КАК ТаблицаПланаОбмена - |ГДЕ - | НЕ ТаблицаПланаОбмена.ЭтотУзел - | - |УПОРЯДОЧИТЬ ПО - | Представление"; - Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТаблицаПланаОбмена", ОбъектМетаданных.ПолноеИмя()); + ТекстЗапроса = СтрСоединить(ТекстыЗапросов, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС); + Запрос = Новый Запрос(ТекстЗапроса); Выборка = Запрос.Выполнить().Выбрать(); - Пока Выборка.Следующий() Цикл НоваяСтрока = УзлыПлановОбмена.Добавить(); - НоваяСтрока.ПланОбмена = ПланОбмена; - НоваяСтрока.ПланОбменаПредставление = ОбъектМетаданных.Синоним; + НоваяСтрока.ПланОбмена = Выборка.ПустаяСсылка; + НоваяСтрока.ПланОбменаПредставление = Выборка.ПланОбменаПредставление; НоваяСтрока.Узел = Выборка.Ссылка; НоваяСтрока.УзелПредставление = Выборка.Представление; КонецЦикла; + УзлыПлановОбмена.Сортировать("ПланОбменаПредставление Возр"); + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonForms/ВыборФорматаВложений/Form.form b/SSL/src/CommonForms/ВыборФорматаВложений/Form.form index 5b005b8bf..903c1f402 100644 --- a/SSL/src/CommonForms/ВыборФорматаВложений/Form.form +++ b/SSL/src/CommonForms/ВыборФорматаВложений/Form.form @@ -226,6 +226,7 @@ ВыбранныеФорматыСохранения.Picture + Top true true @@ -250,7 +251,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -338,6 +338,40 @@ true + + Подписать + 62 + true + true + + true + + + Подписать + + Right + + ПодписатьРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + ПодписатьКонтекстноеМеню + 63 + true + + CheckBoxField + Enter + true + Left + true + + true true @@ -360,7 +394,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -429,6 +462,10 @@ Right true + + OnSaveDataInSettingsAtServer + ПриСохраненииДанныхВНастройкахНаСервере + OnOpen ПриОткрытии @@ -527,6 +564,27 @@ ПереводитьИменаФайловВТранслит + + Подписать + + <key>ru</key> + <value>Подписать</value> + + 6 + + Boolean + + + true + + + true + + FunctionalOption.ИспользоватьЭлектронныеПодписи + + Подписать + + Выбрать @@ -553,6 +611,13 @@ <name>НастройкиФормата</name> <valueType/> </parameters> + <parameters> + <name>ОграничениеФорматовСохранения</name> + <valueType> + <types>String</types> + <stringQualifiers/> + </valueType> + </parameters> <commandInterface> <navigationPanel/> <commandBar/> diff --git a/SSL/src/CommonForms/ВыборФорматаВложений/Module.bsl b/SSL/src/CommonForms/ВыборФорматаВложений/Module.bsl index 4d17b83d9..1416a7eae 100644 --- a/SSL/src/CommonForms/ВыборФорматаВложений/Module.bsl +++ b/SSL/src/CommonForms/ВыборФорматаВложений/Module.bsl @@ -17,8 +17,11 @@ ПереданныйМассивФорматов = Параметры.НастройкиФормата.ФорматыСохранения; УпаковатьВАрхив = Параметры.НастройкиФормата.УпаковатьВАрхив; ПереводитьИменаФайловВТранслит = Параметры.НастройкиФормата.ПереводитьИменаФайловВТранслит; + Подписать = Параметры.НастройкиФормата.Подписать; КонецЕсли; + МассивОграниченийФорматовСохранения = СтрРазделить(Параметры.ОграничениеФорматовСохранения, ",", Ложь); + // заполнение списка форматов Для Каждого ФорматСохранения Из СтандартныеПодсистемыСервер.НастройкиФорматовСохраненияТабличногоДокумента() Цикл Пометка = Ложь; @@ -28,13 +31,28 @@ Пометка = Истина; КонецЕсли; КонецЕсли; - ВыбранныеФорматыСохранения.Добавить(Строка(ФорматСохранения.ТипФайлаТабличногоДокумента), ФорматСохранения.Представление, Пометка, ФорматСохранения.Картинка); + + Если МассивОграниченийФорматовСохранения.Количество() = 0 + Или МассивОграниченийФорматовСохранения.Найти(ФорматСохранения.Расширение) <> Неопределено Тогда + + ВыбранныеФорматыСохранения.Добавить(Строка(ФорматСохранения.ТипФайлаТабличногоДокумента), ФорматСохранения.Представление, Пометка, ФорматСохранения.Картинка); + КонецЕсли; КонецЦикла; + Если ВыбранныеФорматыСохранения.Количество() = 1 Тогда + Элементы.ГруппаВыборФорматов.Видимость = Ложь; + АвтоЗаголовок = Ложь; + Заголовок = НСтр("ru = 'Выбор параметров вложений'"); + СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, "БезВыбораФормата"); + ИначеЕсли ВыбранныеФорматыСохранения.Количество() > 1 Тогда + СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, ""); + КонецЕсли; + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиФормы.Верх; + Элементы.Подписать.Видимость = Ложь; КонецЕсли; - + КонецПроцедуры &НаСервере @@ -52,16 +70,33 @@ Возврат; КонецЕсли; - ФорматыСохраненияИзНастроек = Настройки["ВыбранныеФорматыСохранения"]; - Если ФорматыСохраненияИзНастроек <> Неопределено Тогда - Для Каждого ВыбранныйФормат Из ВыбранныеФорматыСохранения Цикл - ФорматИзНастроек = ФорматыСохраненияИзНастроек.НайтиПоЗначению(ВыбранныйФормат.Значение); - ВыбранныйФормат.Пометка = ФорматИзНастроек <> Неопределено И ФорматИзНастроек.Пометка; - КонецЦикла; + Если ВыбранныеФорматыСохранения.Количество() <> 1 Тогда + ФорматыСохраненияИзНастроек = Настройки["ВыбранныеФорматыСохранения"]; + Если ФорматыСохраненияИзНастроек <> Неопределено Тогда + Для Каждого ВыбранныйФормат Из ВыбранныеФорматыСохранения Цикл + ФорматИзНастроек = ФорматыСохраненияИзНастроек.НайтиПоЗначению(ВыбранныйФормат.Значение); + ВыбранныйФормат.Пометка = ФорматИзНастроек <> Неопределено И ФорматИзНастроек.Пометка; + КонецЦикла; + Настройки.Удалить("ВыбранныеФорматыСохранения"); + КонецЕсли; + Иначе + Настройки.Удалить("ВыбранныеФорматыСохранения"); + КонецЕсли; + + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + Настройки["Подписать"] = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки) + Если ВыбранныеФорматыСохранения.Количество() = 1 Тогда Настройки.Удалить("ВыбранныеФорматыСохранения"); КонецЕсли; КонецПроцедуры + &НаКлиенте Процедура ПриОткрытии(Отказ) УстановитьВыборФормата(); @@ -112,6 +147,7 @@ Результат.Вставить("УпаковатьВАрхив", УпаковатьВАрхив); Результат.Вставить("ФорматыСохранения", ФорматыСохранения); Результат.Вставить("ПереводитьИменаФайловВТранслит", ПереводитьИменаФайловВТранслит); + Результат.Вставить("Подписать", Подписать); Возврат Результат; diff --git a/SSL/src/CommonForms/ГруппыПользователей/Form.form b/SSL/src/CommonForms/ГруппыПользователей/Form.form index b0b592529..5761e6795 100644 --- a/SSL/src/CommonForms/ГруппыПользователей/Form.form +++ b/SSL/src/CommonForms/ГруппыПользователей/Form.form @@ -91,6 +91,38 @@ <placementArea>UserCmds</placementArea> <representationInContextMenu>Auto</representationInContextMenu> </items> + <items xsi:type="form:Addition"> + <title> + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 52 + + СтрокаПоискРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 53 + true + + ДеревоГрупп + + true + + true true diff --git a/SSL/src/CommonForms/ГруппыПользователей/Module.bsl b/SSL/src/CommonForms/ГруппыПользователей/Module.bsl index 4c09ec551..8a969d68a 100644 --- a/SSL/src/CommonForms/ГруппыПользователей/Module.bsl +++ b/SSL/src/CommonForms/ГруппыПользователей/Module.bsl @@ -564,13 +564,9 @@ ЗаписатьИЗакрытьЗавершение(); Иначе ЗаголовокСообщения = НСтр("ru = 'Пользователи, не включенные в группы'"); -#Если МобильныйКлиент Тогда - ПоказатьПредупреждение(, ЗаголовокСообщения + Символы.ПС + ПолныйТекстСообщения); -#Иначе Отчет = Новый ТекстовыйДокумент; Отчет.ДобавитьСтроку(ПолныйТекстСообщения); Отчет.Показать(ЗаголовокСообщения); -#КонецЕсли КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonForms/ДлительнаяОперация/Form.form b/SSL/src/CommonForms/ДлительнаяОперация/Form.form index 52c00772a..bfd51f9a8 100644 --- a/SSL/src/CommonForms/ДлительнаяОперация/Form.form +++ b/SSL/src/CommonForms/ДлительнаяОперация/Form.form @@ -140,7 +140,6 @@ UsualGroup Vertical - Auto true true Auto @@ -170,7 +169,6 @@ HorizontalIfPossible Center - Auto true true Auto @@ -199,7 +197,6 @@ UsualGroup Vertical - Auto NormalSeparation true Auto diff --git a/SSL/src/CommonForms/ДлительнаяОперация/Module.bsl b/SSL/src/CommonForms/ДлительнаяОперация/Module.bsl index cf87b3f7f..47be10455 100644 --- a/SSL/src/CommonForms/ДлительнаяОперация/Module.bsl +++ b/SSL/src/CommonForms/ДлительнаяОперация/Module.bsl @@ -9,7 +9,7 @@ #Область ОписаниеПеременных &НаКлиенте -Перем ФормаЗакрывается; +Перем ФормаЗакрывается, НакопленныеСообщения; &НаКлиенте Перем СтандартноеОповещениеОЗакрытии; @@ -54,6 +54,7 @@ Если Параметры.ВыводитьОкноОжидания Тогда ФормаЗакрывается = Ложь; Статус = "Выполняется"; + НакопленныеСообщения = Новый Массив; ДлительнаяОперация = Новый Структура; ДлительнаяОперация.Вставить("Статус", Статус); @@ -142,17 +143,13 @@ КонецЕсли; - Если Параметры.ВыводитьСообщения - И ДлительнаяОперация.Сообщения <> Неопределено - И ВладелецФормы <> Неопределено Тогда - - ИдентификаторНазначения = ВладелецФормы.УникальныйИдентификатор; - Для Каждого СообщениеПользователю Из ДлительнаяОперация.Сообщения Цикл - СообщениеПользователю.ИдентификаторНазначения = ИдентификаторНазначения; - СообщениеПользователю.Сообщить(); - КонецЦикла; + Если ДлительнаяОперация.Сообщения = Неопределено Тогда + Возврат; КонецЕсли; + ДлительныеОперацииКлиент.ОбработатьСообщенияПользователю(ДлительнаяОперация.Сообщения, + НакопленныеСообщения, Параметры.ВыводитьСообщения, ВладелецФормы); + КонецПроцедуры &НаКлиенте @@ -284,7 +281,8 @@ Результат.Вставить("АдресДополнительногоРезультата", Параметры.АдресДополнительногоРезультата); Результат.Вставить("КраткоеПредставлениеОшибки", ДлительнаяОперация.КраткоеПредставлениеОшибки); Результат.Вставить("ПодробноеПредставлениеОшибки", ДлительнаяОперация.ПодробноеПредставлениеОшибки); - Результат.Вставить("Сообщения", Новый ФиксированныйМассив(Новый Массив)); + Результат.Вставить("Сообщения", Новый ФиксированныйМассив( + ?(НакопленныеСообщения = Неопределено, Новый Массив, НакопленныеСообщения))); Если Параметры.ПолучатьРезультат Тогда Результат.Вставить("Результат", ДлительнаяОперация.Результат); diff --git a/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Form.form b/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Form.form index 12367176d..c876aa91f 100644 --- a/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Form.form +++ b/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Form.form @@ -69,7 +69,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Module.bsl b/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Module.bsl index 0e8097181..9e1b8a956 100644 --- a/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Module.bsl +++ b/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Module.bsl @@ -134,7 +134,7 @@ ДобавитьПодпись(ОписаниеДанных.Объект, ВерсияОбъекта, МассивПодписей); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ОКЗавершение(Новый Структура("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); + ОКЗавершение(Новый Структура("ОписаниеОшибки", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); Возврат; КонецПопытки; ОписаниеДанных.Вставить("Подписи", МассивПодписей); @@ -151,7 +151,7 @@ Возврат; Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ОКЗавершение(Новый Структура("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); + ОКЗавершение(Новый Структура("ОписаниеОшибки", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); Возврат; КонецПопытки; КонецЕсли; @@ -168,7 +168,7 @@ ОписаниеДанных.Удалить("Подписи"); Ошибка = Новый Структура("ОписаниеОшибки", - НСтр("ru = 'При записи подписи возникла ошибка:'") + Символы.ПС + Результат.ОписаниеОшибки); + НСтр("ru = 'Не удалось записать подпись по причине:'") + Символы.ПС + Результат.ОписаниеОшибки); ЭлектроннаяПодписьСлужебныйКлиент.ПоказатьОшибкуОбращенияКПрограмме( НСтр("ru = 'Не удалось добавить электронную подпись из файла'"), "", Ошибка, Новый Структура); @@ -323,9 +323,9 @@ СтандартнаяОбработка = Ложь; ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При получении контейнера подписи из файла подписи произошла ошибка: + НСтр("ru = 'Не удалось получить контейнер подписи из файла подписи по причине: |%1'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); ДополнительныеПараметры = Новый Структура; ДополнительныеПараметры.Вставить("ПоказатьИнструкцию", Истина); @@ -345,15 +345,16 @@ КонтейнерПодписи, ДобавкаВремени, ДатаСеанса); Контекст.Вставить("ПараметрыПодписи", ПараметрыПодписи); - ДатаПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.ДатаПодписиИзПараметровПодписи(ПараметрыПодписи); + ДатаПодписи = ПараметрыПодписи.НеподтвержденнаяДатаПодписи; Если ЗначениеЗаполнено(ДатаПодписи) Тогда Контекст.Вставить("ДатаПодписи", ДатаПодписи); КонецЕсли; - СертификатПодписи = КонтейнерПодписи.Подписи[0].СертификатПодписи; - Сертификаты = Новый Массив; - Сертификаты.Добавить(СертификатПодписи); + Если ПараметрыПодписи.ОписаниеСертификата <> Неопределено Тогда + Сертификаты.Добавить(КонтейнерПодписи.Подписи[0].СертификатПодписи); + КонецЕсли; + ВыбратьФайлПослеПолученияСертификатовИзПодписи(Сертификаты, Контекст); КонецПроцедуры @@ -365,9 +366,9 @@ СтандартнаяОбработка = Ложь; ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При получении сертификатов из файла подписи произошла ошибка: + НСтр("ru = 'Не удалось получить сертификаты из файла подписи по причине: |%1'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); ДополнительныеПараметры = Новый Структура; ДополнительныеПараметры.Вставить("ПоказатьИнструкцию", Истина); @@ -397,7 +398,7 @@ КонецЕсли; Исключение ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ПоказатьОшибку(ОшибкаНаКлиенте, Контекст.ОшибкаНаСервере); Возврат; КонецПопытки; @@ -473,7 +474,11 @@ ТекущаяДатаСеанса = ТекущаяДатаСеанса(); СвойстваПодписи = ПолучитьИзВременногоХранилища(АдресСвойствПодписи); - ДатаПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.ДатаПодписиИзПараметровПодписи(СвойстваПодписи); + Если ЗначениеЗаполнено(ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( + СвойстваПодписи, "НеподтвержденнаяДатаПодписи", Неопределено)) Тогда + ДатаПодписи = СвойстваПодписи.НеподтвержденнаяДатаПодписи; + КонецЕсли; + Если Не ЗначениеЗаполнено(ДатаПодписи) Тогда Если Не ЗначениеЗаполнено(СвойстваПодписи.ДатаПодписи) Тогда СвойстваПодписи.ДатаПодписи = ТекущаяДатаСеанса; @@ -507,7 +512,7 @@ НСтр("ru = 'Электронная подпись.Удаление временного файла'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; СтрокаBase64 = Неопределено; @@ -527,7 +532,7 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); ОшибкаНаСервере.Вставить("ОписаниеОшибки", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось получить данные из файла подписи по причине: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); Возврат Ложь; КонецПопытки; КонецЕсли; @@ -556,11 +561,10 @@ КонтейнерПодписи = МенеджерКриптографии.ПолучитьКонтейнерПодписейКриптографии(ДанныеПодписи); ПараметрыПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПараметрыПодписиКриптографии(КонтейнерПодписи, ЭлектроннаяПодписьСлужебный.ДобавкаВремени(), ТекущаяДатаСеанса()); - + Если ЗначениеЗаполнено(ПараметрыПодписи.НеподтвержденнаяДатаПодписи) Тогда ДатаПодписи = ПараметрыПодписи.НеподтвержденнаяДатаПодписи; КонецЕсли; - КонецЕсли; Если ПараметрыПодписи = Неопределено Тогда @@ -591,7 +595,7 @@ ОшибкаНаСервере.Вставить("ОписаниеОшибки", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось получить сертификаты из файла подписи по причине: |%1'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); Возврат Ложь; КонецПопытки; diff --git a/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Form.form b/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Form.form index fb609ef47..fc0b1fa40 100644 --- a/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Form.form +++ b/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Form.form @@ -191,6 +191,7 @@ true true true + Top true @@ -483,7 +484,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Form.form b/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Form.form index 51d53899f..875abfd74 100644 --- a/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Form.form +++ b/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Form.form @@ -128,7 +128,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -256,7 +255,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -388,7 +386,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -417,7 +414,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -703,7 +699,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/CommonForms/КонтрольДинамическогоОбновления/Form.form b/SSL/src/CommonForms/КонтрольДинамическогоОбновления/Form.form index c5bfe79d8..0ce95e4c3 100644 --- a/SSL/src/CommonForms/КонтрольДинамическогоОбновления/Form.form +++ b/SSL/src/CommonForms/КонтрольДинамическогоОбновления/Form.form @@ -115,7 +115,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -193,7 +192,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -223,7 +221,6 @@ UsualGroup Vertical - Auto true true Auto @@ -252,7 +249,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/CommonForms/КонтрольИзмененияРолейПользователяИБ/Form.form b/SSL/src/CommonForms/КонтрольИзмененияРолейПользователяИБ/Form.form index 22018c6b2..189b0ccd0 100644 --- a/SSL/src/CommonForms/КонтрольИзмененияРолейПользователяИБ/Form.form +++ b/SSL/src/CommonForms/КонтрольИзмененияРолейПользователяИБ/Form.form @@ -98,7 +98,6 @@ AlwaysHorizontal Center - Auto NormalSeparation true true diff --git a/SSL/src/CommonForms/МастерАнкетыПоРазделам/Form.form b/SSL/src/CommonForms/МастерАнкетыПоРазделам/Form.form index 6ba9add9f..36d5068b8 100644 --- a/SSL/src/CommonForms/МастерАнкетыПоРазделам/Form.form +++ b/SSL/src/CommonForms/МастерАнкетыПоРазделам/Form.form @@ -237,7 +237,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -270,7 +269,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -564,6 +562,7 @@ CommonPicture.КоллекцияДеревоАнкеты + Top true true @@ -588,7 +587,6 @@ UsualGroup Vertical - Auto true true Auto @@ -693,7 +691,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -725,7 +722,6 @@ Vertical Center - Auto WeakSeparation true Auto @@ -789,7 +785,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -819,7 +814,6 @@ UsualGroup HorizontalIfPossible - Auto true true LeftNarrowest diff --git a/SSL/src/CommonForms/МастерАнкетыПоРазделам/Module.bsl b/SSL/src/CommonForms/МастерАнкетыПоРазделам/Module.bsl index 13b80af58..a80d5b749 100644 --- a/SSL/src/CommonForms/МастерАнкетыПоРазделам/Module.bsl +++ b/SSL/src/CommonForms/МастерАнкетыПоРазделам/Module.bsl @@ -190,13 +190,15 @@ Для каждого ПодчиненныйВопрос Из ЭлементКоллекции.Подчиненные Цикл - Элементы[ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса].ТолькоПросмотр = (НЕ ЭтотОбъект[ИмяВопроса]); - Если СтрЧислоВхождений(ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса,"Реквизит") = 0 Тогда + ЭлементПодчиненногоВопроса = Элементы[ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса]; + ЭлементПодчиненногоВопроса.ТолькоПросмотр = Не ЭтотОбъект[ИмяВопроса]; + Если СтрЧислоВхождений(ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса, "Реквизит") = 0 Тогда Попытка - Элементы[ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса].АвтоОтметкаНезаполненного = (ЭтотОбъект[ИмяВопроса] И ПодчиненныйВопрос.Обязательный); + ЭлементПодчиненногоВопроса.АвтоОтметкаНезаполненного = + ЭтотОбъект[ИмяВопроса] И ПодчиненныйВопрос.Обязательный; Исключение - // У флажка и переключателя нет свойства АвтоОтметкаНезаполненного. + // АПК:280 У флажка и переключателя нет свойства АвтоОтметкаНезаполненного. КонецПопытки; КонецЕсли; diff --git a/SSL/src/CommonForms/МониторСинхронизацииДанныхВМоделиСервиса/Form.form b/SSL/src/CommonForms/МониторСинхронизацииДанныхВМоделиСервиса/Form.form index 2d606fa03..61841e294 100644 --- a/SSL/src/CommonForms/МониторСинхронизацииДанныхВМоделиСервиса/Form.form +++ b/SSL/src/CommonForms/МониторСинхронизацииДанныхВМоделиСервиса/Form.form @@ -354,7 +354,7 @@ - ГруппаЗагрузки + ГруппаЗагрузка 48 ГруппаСостоянияЗагрузки @@ -539,7 +539,7 @@ true - ГруппаЗагрузкиExtendedTooltip + ГруппаЗагрузкаExtendedTooltip 81 Label true diff --git a/SSL/src/CommonForms/НапоминаниеПриРедактировании/Form.form b/SSL/src/CommonForms/НапоминаниеПриРедактировании/Form.form index 931ac663c..72c6f872f 100644 --- a/SSL/src/CommonForms/НапоминаниеПриРедактировании/Form.form +++ b/SSL/src/CommonForms/НапоминаниеПриРедактировании/Form.form @@ -253,7 +253,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/CommonForms/НастройкаКолонтитулов/Form.form b/SSL/src/CommonForms/НастройкаКолонтитулов/Form.form index 9f7e7507f..e4247c02e 100644 --- a/SSL/src/CommonForms/НастройкаКолонтитулов/Form.form +++ b/SSL/src/CommonForms/НастройкаКолонтитулов/Form.form @@ -511,7 +511,6 @@ UsualGroup - Auto true true Auto @@ -687,7 +686,6 @@ UsualGroup - Auto true true Auto @@ -1202,7 +1200,6 @@ UsualGroup - Auto true true Auto diff --git a/SSL/src/CommonForms/НастройкаКомандПечати/Form.form b/SSL/src/CommonForms/НастройкаКомандПечати/Form.form index 4598473db..91a3f5a8e 100644 --- a/SSL/src/CommonForms/НастройкаКомандПечати/Form.form +++ b/SSL/src/CommonForms/НастройкаКомандПечати/Form.form @@ -494,6 +494,38 @@ + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 50 + + СтрокаПоискаРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 51 + true + + КомандыПечати + + true + + Left true diff --git a/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Form.form b/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Form.form index ba4ed6c08..36052d724 100644 --- a/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Form.form +++ b/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Form.form @@ -163,7 +163,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -400,6 +399,7 @@ true true true + Top true diff --git a/SSL/src/CommonForms/НастройкаОнлайнПоддержки/Form.form b/SSL/src/CommonForms/НастройкаОнлайнПоддержки/Form.form deleted file mode 100644 index a16869037..000000000 --- a/SSL/src/CommonForms/НастройкаОнлайнПоддержки/Form.form +++ /dev/null @@ -1,789 +0,0 @@ - - - - ВидимостьКнопки - 88 - true - true - - true - - - ВидимостьКнопки - - Right - 2 - - OnChange - ВидимостьКнопкиПриИзменении - - - ВидимостьКнопкиExtendedTooltip - 192 - Label - true - true - - Left - - - - ВидимостьКнопкиКонтекстноеМеню - 89 - true - - CheckBoxField - Enter - true - Left - true - - - - ГруппаПараметрыЗапуска - 213 - - ПутьКФайлу - 21 - true - true - - true - - - ПутьКФайлу - - Top - - ПутьКФайлуExtendedTooltip - 182 - Label - true - true - - Left - - - - ПутьКФайлуКонтекстноеМеню - 22 - true - - InputField - Left - Enter - true - Left - true - - - StartChoice - ПутьКФайлуНачалоВыбора - - true - true - true - false - true - true - true - Normal - - - - ГруппаЛогинПароль - 68 - - СохранитьЛогинПароль - 36 - true - true - - true - - - СохранитьЛогинПароль - - Right - - OnChange - СохранитьЛогинПарольПриИзменении - - - СохранитьЛогинПарольExtendedTooltip - 193 - Label - true - true - - Left - - - - СохранитьЛогинПарольКонтекстноеМеню - 37 - true - - CheckBoxField - Enter - true - Left - true - - - - ЛогинПароль - 155 - - ДекорацияОтступСлева - 226 - true - true - - true - - - ДекорацияОтступСлеваРасширеннаяПодсказка - 228 - Label - true - true - - Left - - - - ДекорацияОтступСлеваКонтекстноеМеню - 227 - true - - Label - 1 - true - true - - Left - - - - Логин - 33 - - <key>ru</key> - <value> Логин</value> - - true - true - - true - - - Логин - - - ЛогинExtendedTooltip - 195 - Label - true - true - - Left - - - - ЛогинКонтекстноеМеню - 34 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - Normal - - - - Пароль - 38 - - <key>ru</key> - <value>Пароль</value> - - true - true - - true - - - Пароль - - - ПарольExtendedTooltip - 196 - Label - true - true - - Left - - - - ПарольКонтекстноеМеню - 39 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Логин пароль</value> - - - ЛогинПарольExtendedTooltip - 194 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Логин пароль</value> - - - ГруппаЛогинПарольРасширеннаяПодсказка - 191 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Параметры запуска</value> - - - ГруппаПараметрыЗапускаРасширеннаяПодсказка - 214 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - - ГруппаИнформацияОЗагрузке - 215 - - ДекорацияИнформация - 217 - - <key>ru</key> - <value>Декорация информация</value> - - true - true - - true - - - ДекорацияИнформацияРасширеннаяПодсказка - 219 - Label - true - true - - Left - - - - ДекорацияИнформацияКонтекстноеМеню - 218 - true - - true - true - - - CommonPicture.Информация32 - - - - - ГруппыГиперссылки - 43 - - СкачатьПриложение - 229 - true - true - - true - - - СкачатьПриложениеРасширеннаяПодсказка - 230 - Label - true - true - - Left - - - Hyperlink - Form.Command.СкачатьПриложение - Normal - Auto - true - 1 - true - UserCmds - Auto - - - АккаунтОнлайнПоддержки - 40 - true - true - - true - - 2 - - АккаунтОнлайнПоддержкиРасширеннаяПодсказка - 204 - Label - true - true - - Left - - - Hyperlink - Form.Command.ПолучитьАккаунтОнлайнПоддержки - Normal - Auto - true - true - UserCmds - Auto - - - ТехническиеТребования - 42 - true - true - - true - - - ТехническиеТребованияExtendedTooltip - 206 - Label - true - true - - Left - - - Hyperlink - Form.Command.ТехническиеТребования - Normal - Auto - true - 1 - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Группы гиперссылки</value> - - - ГруппыГиперссылкиРасширеннаяПодсказка - 202 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Информация о загрузке</value> - - - ГруппаИнформацияОЗагрузкеРасширеннаяПодсказка - 216 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - NormalSeparation - true - true - Auto - Auto - - - Bottom - true - - ФормаКоманднаяПанель - -1 - - Сохранить - 48 - true - true - - true - - true - true - - СохранитьExtendedTooltip - 210 - Label - true - true - - Left - - - Form.Command.Сохранить - Auto - true - true - true - UserCmds - Auto - - - Отмена - 211 - true - true - - true - - - ОтменаРасширеннаяПодсказка - 212 - Label - true - true - - Left - - - Form.StandardCommand.Cancel - Normal - Auto - true - true - UserCmds - Auto - - Right - true - - - OnOpen - ПриОткрытии - - - OnCreateAtServer - ПриСозданииНаСервере - - Abort - Close - CustomizeForm - Ignore - No - OK - RestoreValues - Retry - SaveValues - Yes - LockOwner - true - true - true - Vertical - true - true - true - auto - true - - ПутьКФайлу - - <key>ru</key> - <value>Путь к исполняемому файлу приложения</value> - - 1 - - String - - - - true - - - true - - true - - - СохранитьЛогинПароль - - <key>ru</key> - <value>Подставлять логин и пароль при запуске приложения</value> - - 2 - - Boolean - - - true - - - true - - - - Логин - - <key>ru</key> - <value>Логин</value> - - 3 - - String - - 10 - - - - true - - - true - - - - Пароль - - <key>ru</key> - <value>Пароль</value> - - 4 - - String - - 10 - - - - true - - - true - - - - ВидимостьКнопки - - <key>ru</key> - <value>Отображать кнопку запуска приложения для соединения со специалистом онлайн-поддержки на начальной странице</value> - - 5 - - Boolean - - - true - - - true - - - - ПолучитьАккаунтОнлайнПоддержки - - <key>ru</key> - <value>Зарегистрироваться в сервисе онлайн-поддержки (1С-Коннект)</value> - - 2 - - true - - - - ПолучитьАккаунтВызовОнлайнПоддержки - - - DontUse - Auto - - - ТехническиеТребования - - <key>ru</key> - <value>Технические требования</value> - - 3 - - true - - - - ТехническиеТребования - - - DontUse - Auto - - - Сохранить - - <key>ru</key> - <value>Сохранить</value> - - 5 - - true - - - - Сохранить - - - DontUse - Auto - - - СкачатьПриложение - - <key>ru</key> - <value>Скачать приложение</value> - - 7 - - true - - - - СкачатьПриложение - - - DontUse - Auto - - - - - - diff --git a/SSL/src/CommonForms/НастройкаОнлайнПоддержки/Help/ru.html b/SSL/src/CommonForms/НастройкаОнлайнПоддержки/Help/ru.html deleted file mode 100644 index 17b598354..000000000 --- a/SSL/src/CommonForms/НастройкаОнлайнПоддержки/Help/ru.html +++ /dev/null @@ -1,18 +0,0 @@ - -

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

        -

        Открывается по команде Настройка онлайн-поддержки в разделе Администрирование - Интернет-поддержка и сервисы - Онлайн-поддержка.

        -

        Запуск одной и той же базы под веб-клиентом и тонким клиентом потребует две процедуры настройки.

        -

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

        -

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

        -

        На втором шаге задайте настройки:

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

        На третьем шаге задайте настройки:

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

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

        -

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

        \ No newline at end of file diff --git a/SSL/src/CommonForms/НастройкаОнлайнПоддержки/Module.bsl b/SSL/src/CommonForms/НастройкаОнлайнПоддержки/Module.bsl deleted file mode 100644 index 52b6ff4d6..000000000 --- a/SSL/src/CommonForms/НастройкаОнлайнПоддержки/Module.bsl +++ /dev/null @@ -1,149 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////// -// Copyright (c) 2023, ООО 1С-Софт -// Все права защищены. Эта программа и сопроводительные материалы предоставляются -// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) -// Текст лицензии доступен по ссылке: -// https://creativecommons.org/licenses/by/4.0/legalcode -/////////////////////////////////////////////////////////////////////////////////////////////////////// - -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - // Заполнение элементов формы согласно предыдущих настроек текущего пользователя. - Результат = ВызовОнлайнПоддержкиВызовСервера.НастройкиУчетнойЗаписиПользователя(); - ВидимостьКнопки = Результат.ВидимостьКнопкиВызовОнлайнПоддержки; - СохранитьЛогинПароль = Результат.ИспользоватьЛП; - Элементы.Логин.Доступность = Результат.ИспользоватьЛП; - Элементы.Пароль.Доступность = Результат.ИспользоватьЛП; - Логин = Результат.Логин; - Пароль = Результат.Пароль; - СистемнаяИнформация = Новый СистемнаяИнформация; - ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; - ПутьКФайлу = ВызовОнлайнПоддержкиВызовСервера.РасположениеИсполняемогоФайла(ИдентификаторКлиента); - - ИнициализироватьЭлементыФормы(ЭтотОбъект); - -КонецПроцедуры - -&НаКлиенте -Процедура ПриОткрытии(Отказ) - Если НЕ ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда - ПоказатьПредупреждение(,НСтр("ru = 'Для работы с приложением необходима операционная система Microsoft Windows.'")); - Отказ = Истина; - КонецЕсли; - Если ПутьКФайлу="" Тогда - ПутьКФайлу = ВызовОнлайнПоддержкиКлиент.ПутьКИсполняемомуФайлуИзРеестраWindows(); - КонецЕсли; -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура СохранитьЛогинПарольПриИзменении(Элемент) - - Доступ = СохранитьЛогинПароль; - Элементы.Логин.Доступность = Доступ; - Элементы.Пароль.Доступность = Доступ; - -КонецПроцедуры - -&НаКлиенте -Процедура ВидимостьКнопкиПриИзменении(Элемент) - ИнициализироватьЭлементыФормы(ЭтотОбъект); -КонецПроцедуры - -&НаКлиенте -Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - Оповещение = Новый ОписаниеОповещения("ПутьКФайлуНачалоВыбораЗавершение", ЭтотОбъект); - ВызовОнлайнПоддержкиКлиент.ВыбратьФайлВызовОнлайнПоддержки(Оповещение, ПутьКФайлу); -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиКомандФормы - -&НаКлиенте -Процедура Сохранить(Команда) - - ИдентификаторКлиента = ВызовОнлайнПоддержкиКлиент.ИдентификаторКлиента(); - СохранитьНастройкиПользователяВХранилище(Логин, Пароль, СохранитьЛогинПароль, ВидимостьКнопки); - НовыйПутьКИсполняемомуФайлу(ИдентификаторКлиента, ПутьКФайлу); - // Оповестим форму кнопки для управления видимостью кнопки. - Оповестить("СохранениеНастроекВызовОнлайнПоддержки"); - ПриИзмененииНастроек(); - ОбновитьИнтерфейс(); - Закрыть(); - -КонецПроцедуры - -&НаКлиенте -Процедура ПолучитьАккаунтВызовОнлайнПоддержки(Команда) - - ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("http://buhphone.com/clients/be-client/"); - -КонецПроцедуры - -&НаКлиенте -Процедура ТехническиеТребования(Команда) - - ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("http://buhphone.com/require/#anchor_1"); - -КонецПроцедуры - -&НаКлиенте -Процедура СкачатьПриложение(Команда) - - ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("http://distribs.buhphone.com/current"); - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -&НаСервереБезКонтекста -Процедура НовыйПутьКИсполняемомуФайлу(ИдентификаторКлиента, ПутьКФайлу) - ВызовОнлайнПоддержки.СохранитьРасположениеИсполняемогоФайлаВызовОнлайнПоддержки(ИдентификаторКлиента, ПутьКФайлу); -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура СохранитьНастройкиПользователяВХранилище(Логин, - Пароль, - СохранитьЛогинПароль, - ВидимостьКнопки) - - ВызовОнлайнПоддержки.СохранитьНастройкиПользователяВХранилище(Логин, Пароль, СохранитьЛогинПароль, ВидимостьКнопки); - -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура ПриИзмененииНастроек() - ВызовОнлайнПоддержкиПереопределяемый.ПриИзмененииНастроек(); -КонецПроцедуры - -// Выполняет инициализацию элементов формы в зависимости от -// настроек приложения. -// -&НаКлиентеНаСервереБезКонтекста -Процедура ИнициализироватьЭлементыФормы(Форма) - - Форма.Элементы.ГруппаПараметрыЗапуска.Доступность = Форма.ВидимостьКнопки; - -КонецПроцедуры - -&НаКлиенте -Процедура ПутьКФайлуНачалоВыбораЗавершение(НовыйПутьКФайлу, ДополнительныеПараметры) Экспорт - Если НовыйПутьКФайлу <> "" Тогда - ПутьКФайлу = НовыйПутьКФайлу; - КонецЕсли; -КонецПроцедуры - -#КонецОбласти - - - - diff --git a/SSL/src/CommonForms/НастройкаОтправкиSMS/Form.form b/SSL/src/CommonForms/НастройкаОтправкиSMS/Form.form index 42f41d5c8..9b8848c2d 100644 --- a/SSL/src/CommonForms/НастройкаОтправкиSMS/Form.form +++ b/SSL/src/CommonForms/НастройкаОтправкиSMS/Form.form @@ -97,7 +97,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/CommonForms/НастройкаПереводаТекста/Form.form b/SSL/src/CommonForms/НастройкаПереводаТекста/Form.form index 2a52cf640..128298a15 100644 --- a/SSL/src/CommonForms/НастройкаПереводаТекста/Form.form +++ b/SSL/src/CommonForms/НастройкаПереводаТекста/Form.form @@ -103,7 +103,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/CommonForms/НастройкаПереводаТекста/Module.bsl b/SSL/src/CommonForms/НастройкаПереводаТекста/Module.bsl index ddd3f445e..2a8326071 100644 --- a/SSL/src/CommonForms/НастройкаПереводаТекста/Module.bsl +++ b/SSL/src/CommonForms/НастройкаПереводаТекста/Module.bsl @@ -121,7 +121,7 @@ ПолеВвода.УстановитьДействие("ИзменениеТекстаРедактирования", "Подключаемый_ПараметрАвторизацииИзменениеТекстаРедактирования"); ПолеВвода.РежимПароля = Истина; ПолеВвода.КнопкаВыбора = Не ЗначениеЗаполнено(ЗначениеПараметра); - ПолеВвода.КартинкаКнопкиВыбора = БиблиотекаКартинок.ВводимыеСимволыСкрыты; + ПолеВвода.КартинкаКнопкиВыбора = БиблиотекаКартинок.ВводимыеСимволыВидны; КонецЦикла; КонецПроцедуры @@ -133,9 +133,9 @@ Реквизит = Элемент.ТекстРедактирования; Элемент.РежимПароля = Не Элемент.РежимПароля; Если Элемент.РежимПароля Тогда - Элемент.КартинкаКнопкиВыбора = БиблиотекаКартинок.ВводимыеСимволыСкрыты; - Иначе Элемент.КартинкаКнопкиВыбора = БиблиотекаКартинок.ВводимыеСимволыВидны; + Иначе + Элемент.КартинкаКнопкиВыбора = БиблиотекаКартинок.ВводимыеСимволыСкрыты; КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonForms/НастройкаРабочегоКаталога/Form.form b/SSL/src/CommonForms/НастройкаРабочегоКаталога/Form.form index fc86c53e9..a074482b0 100644 --- a/SSL/src/CommonForms/НастройкаРабочегоКаталога/Form.form +++ b/SSL/src/CommonForms/НастройкаРабочегоКаталога/Form.form @@ -110,7 +110,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -371,7 +370,6 @@ UsualGroup AlwaysHorizontal - Auto NormalSeparation true true diff --git a/SSL/src/CommonForms/НастройкиВходаПользователей/Form.form b/SSL/src/CommonForms/НастройкиВходаПользователей/Form.form index 06781b6b9..1ef931403 100644 --- a/SSL/src/CommonForms/НастройкиВходаПользователей/Form.form +++ b/SSL/src/CommonForms/НастройкиВходаПользователей/Form.form @@ -1,107 +1,9 @@ - - ПредупреждениеВосстановлениеПароля - 112 - - ПредупреждениеВосстановлениеПароляКартинка - 114 - true - true - - true - - - ПредупреждениеВосстановлениеПароляКартинкаРасширеннаяПодсказка - 116 - Label - true - true - - Left - - - - ПредупреждениеВосстановлениеПароляКартинкаКонтекстноеМеню - 115 - true - - true - true - false - - - CommonPicture.Предупреждение32 - - - - - ПредупреждениеВосстановлениеПароляПояснение - 117 - - <key>ru</key> - <value>Параметры пароля не контролируются в окне -"Восстановление пароля" по ссылке "Забыли пароль?" -</value> - - true - true - - true - - - ПредупреждениеВосстановлениеПароляПояснениеРасширеннаяПодсказка - 119 - Label - true - true - - Left - - - - ПредупреждениеВосстановлениеПароляПояснениеКонтекстноеМеню - 118 - true - - Label - true - true - false - - Left - Center - - - true - true - - true - - - <key>ru</key> - <value>Предупреждение восстановление пароля</value> - - - ПредупреждениеВосстановлениеПароляРасширеннаяПодсказка - 113 - Label - true - true - - Left - - - UsualGroup - - AlwaysHorizontal - Auto - true - true - Auto - Auto - - + + <key>ru</key> + <value>Настройки входа</value> + ПредупреждениеНастройкаВСервисе 120 @@ -199,7 +101,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -207,163 +108,226 @@ - ГруппаНастройки - 128 + Страницы + 130 - ГруппаСложностьПароля - 33 - - ПарольДолженОтвечатьТребованиямСложности - 4 - true - true - - true - - - ПарольДолженОтвечатьТребованиямСложности - - Right - - ru - Проверять, чтобы новый пароль: + ДляПользователей + 132 + + ГруппаНастройки + 128 + + ГруппаСложностьПароля + 33 + + ПарольДолженОтвечатьТребованиямСложности + 4 + true + true + + true + + + ПарольДолженОтвечатьТребованиямСложности + + Right + + ru + Проверять, чтобы новый пароль: - имел не менее 7 символов; - содержал любые 3 из 4-х типов символов: заглавные буквы, строчные буквы, цифры, специальные символы; - не совпадал с именем (для входа). - - Button - - OnChange - ПарольДолженОтвечатьТребованиямСложностиПриИзменении - - - ПарольДолженОтвечатьТребованиямСложностиРасширеннаяПодсказка - 6 - Label - true - true - - Left - - - - ПарольДолженОтвечатьТребованиямСложностиКонтекстноеМеню - 5 - true - - CheckBoxField - Enter - true - Left - true - - - - ГруппаМинимальнаяДлинаПароля - 43 - - МинимальнаяДлинаПароляВключить - 86 + + Button + + OnChange + ПарольДолженОтвечатьТребованиямСложностиПриИзменении + + + ПарольДолженОтвечатьТребованиямСложностиРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + ПарольДолженОтвечатьТребованиямСложностиКонтекстноеМеню + 5 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаМинимальнаяДлинаПароля + 43 + + МинимальнаяДлинаПароляВключить + 86 + true + true + + true + + + МинимальнаяДлинаПароляВключить + + Right + + OnChange + НастройкаВключитьПриИзменении + + + МинимальнаяДлинаПароляВключитьРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + МинимальнаяДлинаПароляВключитьКонтекстноеМеню + 87 + true + + CheckBoxField + Enter + true + Left + true + + + + МинимальнаяДлинаПароля + 1 + true + true + + true + + + МинимальнаяДлинаПароля + + None + + OnChange + МинимальнаяДлинаПароляПриИзменении + + + МинимальнаяДлинаПароляРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + МинимальнаяДлинаПароляКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + + ПояснениеМинимальнаяДлинаПароля + 45 + + <key>ru</key> + <value>знак.</value> + + true + true + + true + + + ПояснениеМинимальнаяДлинаПароляРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ПояснениеМинимальнаяДлинаПароляКонтекстноеМеню + 46 + true + + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Минимальная длина пароля</value> + + + ГруппаМинимальнаяДлинаПароляРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + Auto + Auto + + true true true - - МинимальнаяДлинаПароляВключить - - Right - - OnChange - НастройкаВключитьПриИзменении - - - МинимальнаяДлинаПароляВключитьРасширеннаяПодсказка - 88 - Label - true - true - - Left - - - - МинимальнаяДлинаПароляВключитьКонтекстноеМеню - 87 - true - - CheckBoxField - Enter - true - Left - true - - - - МинимальнаяДлинаПароля - 1 - true - true - - true - - - МинимальнаяДлинаПароля - - None - - OnChange - МинимальнаяДлинаПароляПриИзменении - - - МинимальнаяДлинаПароляРасширеннаяПодсказка - 3 - Label - true - true - - Left - - - - МинимальнаяДлинаПароляКонтекстноеМеню - 2 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - - 1 - - Normal - - - - ПояснениеМинимальнаяДлинаПароля - 45 <key>ru</key> - <value>знак.</value> + <value>Сложность пароля</value> - true - true - - true - - ПояснениеМинимальнаяДлинаПароляРасширеннаяПодсказка - 47 + ГруппаСложностьПароляРасширеннаяПодсказка + 34 Label true true @@ -371,338 +335,594 @@ Left - - ПояснениеМинимальнаяДлинаПароляКонтекстноеМеню - 46 - true - - Label - true - - Left + UsualGroup + + Vertical + NormalSeparation + true + + Style.FormBackColor + + Auto + Auto - true - true - - true - - - <key>ru</key> - <value>Минимальная длина пароля</value> - - - ГруппаМинимальнаяДлинаПароляРасширеннаяПодсказка - 44 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Сложность пароля</value> - - - ГруппаСложностьПароляРасширеннаяПодсказка - 34 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - - Style.FormBackColor - - Auto - Auto - - - - ГруппаСменаПароля - 108 - - ГруппаМаксимальныйСрокДействияПароля - 53 - - МаксимальныйСрокДействияПароляВключить - 92 - true - true - - true - - - МаксимальныйСрокДействияПароляВключить - - Right - - OnChange - НастройкаВключитьПриИзменении - - - МаксимальныйСрокДействияПароляВключитьРасширеннаяПодсказка - 94 - Label - true - true - - Left - - - - МаксимальныйСрокДействияПароляВключитьКонтекстноеМеню - 93 - true - - CheckBoxField - Enter - true - Left - true - - - - МаксимальныйСрокДействияПароля - 12 - true - true - - true - - - МаксимальныйСрокДействияПароля - - None - - ru - Срок после первого входа с новым паролем, + + ГруппаСменаПароля + 108 + + ГруппаМаксимальныйСрокДействияПароля + 53 + + МаксимальныйСрокДействияПароляВключить + 92 + true + true + + true + + + МаксимальныйСрокДействияПароляВключить + + Right + + OnChange + НастройкаВключитьПриИзменении + + + МаксимальныйСрокДействияПароляВключитьРасширеннаяПодсказка + 94 + Label + true + true + + Left + + + + МаксимальныйСрокДействияПароляВключитьКонтекстноеМеню + 93 + true + + CheckBoxField + Enter + true + Left + true + + + + МаксимальныйСрокДействияПароля + 12 + true + true + + true + + + МаксимальныйСрокДействияПароля + + None + + ru + Срок после первого входа с новым паролем, после которого пользователю потребуется сменить пароль. - - - МаксимальныйСрокДействияПароляРасширеннаяПодсказка - 14 - Label - true - true - - Left + + + МаксимальныйСрокДействияПароляРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + МаксимальныйСрокДействияПароляКонтекстноеМеню + 13 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + + ПояснениеМаксимальныйСрокДействияПароля + 55 + + <key>ru</key> + <value>дн.</value> + + true + true + + true + + + ПояснениеМаксимальныйСрокДействияПароляРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + ПояснениеМаксимальныйСрокДействияПароляКонтекстноеМеню + 56 + true + + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Максимальный срок действия пароля</value> + + + ГруппаМаксимальныйСрокДействияПароляРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + Auto + Auto - - - МаксимальныйСрокДействияПароляКонтекстноеМеню - 13 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - - 1 - - Normal - - - - ПояснениеМаксимальныйСрокДействияПароля - 55 - - <key>ru</key> - <value>дн.</value> - - true - true - - true - - - ПояснениеМаксимальныйСрокДействияПароляРасширеннаяПодсказка - 57 - Label - true - true - - Left - - - - ПояснениеМаксимальныйСрокДействияПароляКонтекстноеМеню - 56 - true - - Label - true - - Left - - - true - true - - true - - - <key>ru</key> - <value>Максимальный срок действия пароля</value> - - - ГруппаМаксимальныйСрокДействияПароляРасширеннаяПодсказка - 54 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - Auto - Auto - - - - ГруппаМинимальныйСрокДействияПароля - 48 - - МинимальныйСрокДействияПароляВключить - 89 - true - true - - true - - - МинимальныйСрокДействияПароляВключить - - Right - - OnChange - НастройкаВключитьПриИзменении - - - МинимальныйСрокДействияПароляВключитьРасширеннаяПодсказка - 91 - Label - true - true - - Left - - - - МинимальныйСрокДействияПароляВключитьКонтекстноеМеню - 90 - true - - CheckBoxField - Enter - true - Left - true - - - - МинимальныйСрокДействияПароля - 25 - true - true - - true - - - МинимальныйСрокДействияПароля - - None - - ru - Срок после первого входа с новым паролем, + + + ГруппаМинимальныйСрокДействияПароля + 48 + + МинимальныйСрокДействияПароляВключить + 89 + true + true + + true + + + МинимальныйСрокДействияПароляВключить + + Right + + OnChange + НастройкаВключитьПриИзменении + + + МинимальныйСрокДействияПароляВключитьРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + + МинимальныйСрокДействияПароляВключитьКонтекстноеМеню + 90 + true + + CheckBoxField + Enter + true + Left + true + + + + МинимальныйСрокДействияПароля + 25 + true + true + + true + + + МинимальныйСрокДействияПароля + + None + + ru + Срок после первого входа с новым паролем, в течение которого пользователь не сможет сменить пароль. - - - МинимальныйСрокДействияПароляРасширеннаяПодсказка - 27 - Label - true - true - - Left + + + МинимальныйСрокДействияПароляРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + МинимальныйСрокДействияПароляКонтекстноеМеню + 26 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + + ПояснениеМинимальныйСрокДействияПароля + 50 + + <key>ru</key> + <value>дн.</value> + + true + true + + true + + + ПояснениеМинимальныйСрокДействияПароляРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ПояснениеМинимальныйСрокДействияПароляКонтекстноеМеню + 51 + true + + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Минимальный срок действия пароля</value> + + + ГруппаМинимальныйСрокДействияПароляРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + Auto + Auto - - - МинимальныйСрокДействияПароляКонтекстноеМеню - 26 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - - 1 - - Normal - - - - ПояснениеМинимальныйСрокДействияПароля - 50 + + + ГруппаЗапретитьПовторениеПароляСредиПоследних + 38 + + ЗапретитьПовторениеПароляСредиПоследнихВключить + 83 + true + true + + true + + + ЗапретитьПовторениеПароляСредиПоследнихВключить + + Right + + OnChange + НастройкаВключитьПриИзменении + + + ЗапретитьПовторениеПароляСредиПоследнихВключитьРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + + ЗапретитьПовторениеПароляСредиПоследнихВключитьКонтекстноеМеню + 84 + true + + CheckBoxField + Enter + true + Left + true + + + + ЗапретитьПовторениеПароляСредиПоследних + 7 + true + true + + true + + + ЗапретитьПовторениеПароляСредиПоследних + + None + + ЗапретитьПовторениеПароляСредиПоследнихРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ЗапретитьПовторениеПароляСредиПоследнихКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Запретить повторение пароля среди последних</value> + + + ГруппаЗапретитьПовторениеПароляСредиПоследнихРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + Auto + Auto + + + + ГруппаПредупреждатьОбОкончанииСрокаДействияПароля + 229 + + ПредупреждатьОбОкончанииСрокаДействияПароляВключить + 231 + true + true + + true + + + ПредупреждатьОбОкончанииСрокаДействияПароляВключить + + Right + + OnChange + НастройкаВключитьПриИзменении + + + ПредупреждатьОбОкончанииСрокаДействияПароляВключитьРасширеннаяПодсказка + 233 + Label + true + true + + Left + + + + ПредупреждатьОбОкончанииСрокаДействияПароляВключитьКонтекстноеМеню + 232 + true + + CheckBoxField + Enter + true + Left + true + + + + ПредупреждатьОбОкончанииСрокаДействияПароля + 234 + true + true + + true + + + ПредупреждатьОбОкончанииСрокаДействияПароля + + None + + ПредупреждатьОбОкончанииСрокаДействияПароляРасширеннаяПодсказка + 236 + Label + true + true + + Left + + + + ПредупреждатьОбОкончанииСрокаДействияПароляКонтекстноеМеню + 235 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + + ПояснениеПредупреждатьОбОкончанииСрокаДействияПароля + 237 + + <key>ru</key> + <value>дн.</value> + + true + true + + true + + + ПояснениеПредупреждатьОбОкончанииСрокаДействияПароляРасширеннаяПодсказка + 239 + Label + true + true + + Left + + + + ПояснениеПредупреждатьОбОкончанииСрокаДействияПароляКонтекстноеМеню + 238 + true + + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Предупреждать об окончании срока действия пароля</value> + + + ГруппаПредупреждатьОбОкончанииСрокаДействияПароляРасширеннаяПодсказка + 230 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + Auto + Auto + + + true + true + + true + <key>ru</key> - <value>дн.</value> + <value>Смена пароля</value> - true - true - - true - - ПояснениеМинимальныйСрокДействияПароляРасширеннаяПодсказка - 52 + ГруппаСменаПароляРасширеннаяПодсказка + 109 Label true true @@ -710,301 +930,186 @@ Left - - ПояснениеМинимальныйСрокДействияПароляКонтекстноеМеню - 51 - true - - Label - true - - Left + UsualGroup + + Vertical + NormalSeparation + true + + Style.FormBackColor + + Auto + Auto - true - true - - true - - - <key>ru</key> - <value>Минимальный срок действия пароля</value> - - - ГруппаМинимальныйСрокДействияПароляРасширеннаяПодсказка - 49 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - Auto - Auto - - - - ГруппаЗапретитьПовторениеПароляСредиПоследних - 38 - - ЗапретитьПовторениеПароляСредиПоследнихВключить - 83 - true - true - - true - - - ЗапретитьПовторениеПароляСредиПоследнихВключить - - Right - - OnChange - НастройкаВключитьПриИзменении - - - ЗапретитьПовторениеПароляСредиПоследнихВключитьРасширеннаяПодсказка - 85 - Label - true - true - - Left - - - - ЗапретитьПовторениеПароляСредиПоследнихВключитьКонтекстноеМеню - 84 - true - - CheckBoxField - Enter - true - Left - true - - - - ЗапретитьПовторениеПароляСредиПоследних - 7 - true - true - - true - - - ЗапретитьПовторениеПароляСредиПоследних - - None - - ЗапретитьПовторениеПароляСредиПоследнихРасширеннаяПодсказка - 9 - Label - true - true - - Left - - - - ЗапретитьПовторениеПароляСредиПоследнихКонтекстноеМеню - 8 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - - 1 - - Normal - - - true - true - - true - - - <key>ru</key> - <value>Запретить повторение пароля среди последних</value> - - - ГруппаЗапретитьПовторениеПароляСредиПоследнихРасширеннаяПодсказка - 39 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Смена пароля</value> - - - ГруппаСменаПароляРасширеннаяПодсказка - 109 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - - Style.FormBackColor - - Auto - Auto - - - - ГруппаПросрочкаРаботыВПрограммеДоЗапрещенияВхода - 75 - - ПросрочкаРаботыВПрограммеДоЗапрещенияВходаВключить - 95 - true - true - - true - - - ПросрочкаРаботыВПрограммеДоЗапрещенияВходаВключить - - Right - 2 - - OnChange - НастройкаВключитьПриИзменении - - - ПросрочкаРаботыВПрограммеДоЗапрещенияВходаВключитьРасширеннаяПодсказка - 97 - Label - true - true - - Left - - - - ПросрочкаРаботыВПрограммеДоЗапрещенияВходаВключитьКонтекстноеМеню - 96 - true - - CheckBoxField - Top - Enter - true - Left - true - - - - ПросрочкаРаботыВПрограммеДоЗапрещенияВхода - 77 - true - true - - true - - - ПросрочкаРаботыВПрограммеДоЗапрещенияВхода - - None - - ru - Срок относительно последней активности пользователя, + + ГруппаПросрочкаРаботыВПрограммеДоЗапрещенияВхода + 75 + + ПросрочкаРаботыВПрограммеДоЗапрещенияВходаВключить + 95 + true + true + + true + + + ПросрочкаРаботыВПрограммеДоЗапрещенияВходаВключить + + Right + 2 + + OnChange + НастройкаВключитьПриИзменении + + + ПросрочкаРаботыВПрограммеДоЗапрещенияВходаВключитьРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + + ПросрочкаРаботыВПрограммеДоЗапрещенияВходаВключитьКонтекстноеМеню + 96 + true + + CheckBoxField + Top + Enter + true + Left + true + + + + ПросрочкаРаботыВПрограммеДоЗапрещенияВхода + 77 + true + true + + true + + + ПросрочкаРаботыВПрограммеДоЗапрещенияВхода + + None + + ru + Срок относительно последней активности пользователя, после которого вход в программу будет запрещен. Не влияет на администраторов. - - - ПросрочкаРаботыВПрограммеДоЗапрещенияВходаРасширеннаяПодсказка - 79 - Label - true - true - - Left + + + ПросрочкаРаботыВПрограммеДоЗапрещенияВходаРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + ПросрочкаРаботыВПрограммеДоЗапрещенияВходаКонтекстноеМеню + 78 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + + ПояснениеПросрочкаРаботыВПрограммеДоЗапрещенияВхода + 80 + + <key>ru</key> + <value>дн.</value> + + true + true + + true + + + ПояснениеПросрочкаРаботыВПрограммеДоЗапрещенияВходаРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + + ПояснениеПросрочкаРаботыВПрограммеДоЗапрещенияВходаКонтекстноеМеню + 81 + true + + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Просрочка работы в программе до запрещения входа</value> + + + ГруппаПросрочкаРаботыВПрограммеДоЗапрещенияВходаРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + NormalSeparation + true + Auto + Auto - - - ПросрочкаРаботыВПрограммеДоЗапрещенияВходаКонтекстноеМеню - 78 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - - 1 - - Normal - - - - ПояснениеПросрочкаРаботыВПрограммеДоЗапрещенияВхода - 80 - - <key>ru</key> - <value>дн.</value> - + true true true + + <key>ru</key> + <value>Настройки</value> + - ПояснениеПросрочкаРаботыВПрограммеДоЗапрещенияВходаРасширеннаяПодсказка - 82 + ГруппаНастройкиРасширеннаяПодсказка + 129 Label true true @@ -1012,15 +1117,13 @@ Left - - ПояснениеПросрочкаРаботыВПрограммеДоЗапрещенияВходаКонтекстноеМеню - 81 - true - - Label - true - - Left + UsualGroup + + Vertical + true + true + Auto + Auto true @@ -1030,11 +1133,11 @@
        <key>ru</key> - <value>Просрочка работы в программе до запрещения входа</value> + <value>Для пользователей</value> - ГруппаПросрочкаРаботыВПрограммеДоЗапрещенияВходаРасширеннаяПодсказка - 76 + ДляПользователейРасширеннаяПодсказка + 133 Label true true @@ -1042,14 +1145,1571 @@ Left
        - UsualGroup - - HorizontalIfPossible - Auto - NormalSeparation - true - Auto - Auto + Page + + Vertical + auto + false + + + + ДляВнешнихПользователей + 163 + + ОтдельныеНастройкиДляВнешнихПользователей + 226 + true + true + + true + + + ОтдельныеНастройкиДляВнешнихПользователей + + Right + + OnChange + ОтдельныеНастройкиДляВнешнихПользователейПриИзменении + + + ОтдельныеНастройкиДляВнешнихПользователейРасширеннаяПодсказка + 228 + Label + true + true + + Left + + + + ОтдельныеНастройкиДляВнешнихПользователейКонтекстноеМеню + 227 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаНастройки2 + 165 + + ГруппаСложностьПароля2 + 167 + + ПарольДолженОтвечатьТребованиямСложности2 + 169 + true + true + + true + + + ПарольДолженОтвечатьТребованиямСложности2 + + Right + + ru + Проверять, чтобы новый пароль: +- имел не менее 7 символов; +- содержал любые 3 из 4-х типов символов: заглавные буквы, + строчные буквы, цифры, специальные символы; +- не совпадал с именем (для входа). + + Button + + OnChange + ПарольДолженОтвечатьТребованиямСложностиПриИзменении + + + ПарольДолженОтвечатьТребованиямСложности2РасширеннаяПодсказка + 171 + Label + true + true + + Left + + + + ПарольДолженОтвечатьТребованиямСложности2КонтекстноеМеню + 170 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаМинимальнаяДлинаПароля2 + 172 + + МинимальнаяДлинаПароля2Включить + 174 + true + true + + true + + + МинимальнаяДлинаПароля2Включить + + Right + + OnChange + НастройкаВключитьПриИзменении + + + МинимальнаяДлинаПароля2ВключитьРасширеннаяПодсказка + 176 + Label + true + true + + Left + + + + МинимальнаяДлинаПароля2ВключитьКонтекстноеМеню + 175 + true + + CheckBoxField + Enter + true + Left + true + + + + МинимальнаяДлинаПароля2 + 177 + true + true + + true + + + МинимальнаяДлинаПароля2 + + None + + OnChange + МинимальнаяДлинаПароляПриИзменении + + + МинимальнаяДлинаПароля2РасширеннаяПодсказка + 179 + Label + true + true + + Left + + + + МинимальнаяДлинаПароля2КонтекстноеМеню + 178 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + + ПояснениеМинимальнаяДлинаПароля2 + 180 + + <key>ru</key> + <value>знак.</value> + + true + true + + true + + + ПояснениеМинимальнаяДлинаПароля2РасширеннаяПодсказка + 182 + Label + true + true + + Left + + + + ПояснениеМинимальнаяДлинаПароля2КонтекстноеМеню + 181 + true + + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Минимальная длина пароля</value> + + + ГруппаМинимальнаяДлинаПароля2РасширеннаяПодсказка + 173 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Сложность пароля</value> + + + ГруппаСложностьПароля2РасширеннаяПодсказка + 168 + Label + true + true + + Left + + + UsualGroup + + Vertical + NormalSeparation + true + + Style.FormBackColor + + Auto + Auto + + + + ГруппаСменаПароля2 + 183 + + ГруппаМаксимальныйСрокДействияПароля2 + 185 + + МаксимальныйСрокДействияПароля2Включить + 187 + true + true + + true + + + МаксимальныйСрокДействияПароля2Включить + + Right + + OnChange + НастройкаВключитьПриИзменении + + + МаксимальныйСрокДействияПароля2ВключитьРасширеннаяПодсказка + 189 + Label + true + true + + Left + + + + МаксимальныйСрокДействияПароля2ВключитьКонтекстноеМеню + 188 + true + + CheckBoxField + Enter + true + Left + true + + + + МаксимальныйСрокДействияПароля2 + 190 + true + true + + true + + + МаксимальныйСрокДействияПароля2 + + None + + ru + Срок после первого входа с новым паролем, +после которого пользователю потребуется сменить пароль. + + + МаксимальныйСрокДействияПароля2РасширеннаяПодсказка + 192 + Label + true + true + + Left + + + + МаксимальныйСрокДействияПароля2КонтекстноеМеню + 191 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + + ПояснениеМаксимальныйСрокДействияПароля2 + 193 + + <key>ru</key> + <value>дн.</value> + + true + true + + true + + + ПояснениеМаксимальныйСрокДействияПароля2РасширеннаяПодсказка + 195 + Label + true + true + + Left + + + + ПояснениеМаксимальныйСрокДействияПароля2КонтекстноеМеню + 194 + true + + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Максимальный срок действия пароля</value> + + + ГруппаМаксимальныйСрокДействияПароля2РасширеннаяПодсказка + 186 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + Auto + Auto + + + + ГруппаМинимальныйСрокДействияПароля2 + 196 + + МинимальныйСрокДействияПароля2Включить + 198 + true + true + + true + + + МинимальныйСрокДействияПароля2Включить + + Right + + OnChange + НастройкаВключитьПриИзменении + + + МинимальныйСрокДействияПароля2ВключитьРасширеннаяПодсказка + 200 + Label + true + true + + Left + + + + МинимальныйСрокДействияПароля2ВключитьКонтекстноеМеню + 199 + true + + CheckBoxField + Enter + true + Left + true + + + + МинимальныйСрокДействияПароля2 + 201 + true + true + + true + + + МинимальныйСрокДействияПароля2 + + None + + ru + Срок после первого входа с новым паролем, +в течение которого пользователь не сможет сменить пароль. + + + МинимальныйСрокДействияПароля2РасширеннаяПодсказка + 203 + Label + true + true + + Left + + + + МинимальныйСрокДействияПароля2КонтекстноеМеню + 202 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + + ПояснениеМинимальныйСрокДействияПароля2 + 204 + + <key>ru</key> + <value>дн.</value> + + true + true + + true + + + ПояснениеМинимальныйСрокДействияПароля2РасширеннаяПодсказка + 206 + Label + true + true + + Left + + + + ПояснениеМинимальныйСрокДействияПароля2КонтекстноеМеню + 205 + true + + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Минимальный срок действия пароля</value> + + + ГруппаМинимальныйСрокДействияПароля2РасширеннаяПодсказка + 197 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + Auto + Auto + + + + ГруппаЗапретитьПовторениеПароляСредиПоследних2 + 207 + + ЗапретитьПовторениеПароляСредиПоследних2Включить + 209 + true + true + + true + + + ЗапретитьПовторениеПароляСредиПоследних2Включить + + Right + + OnChange + НастройкаВключитьПриИзменении + + + ЗапретитьПовторениеПароляСредиПоследних2ВключитьРасширеннаяПодсказка + 211 + Label + true + true + + Left + + + + ЗапретитьПовторениеПароляСредиПоследних2ВключитьКонтекстноеМеню + 210 + true + + CheckBoxField + Enter + true + Left + true + + + + ЗапретитьПовторениеПароляСредиПоследних2 + 212 + true + true + + true + + + ЗапретитьПовторениеПароляСредиПоследних2 + + None + + ЗапретитьПовторениеПароляСредиПоследних2РасширеннаяПодсказка + 214 + Label + true + true + + Left + + + + ЗапретитьПовторениеПароляСредиПоследних2КонтекстноеМеню + 213 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Запретить повторение пароля среди последних</value> + + + ГруппаЗапретитьПовторениеПароляСредиПоследних2РасширеннаяПодсказка + 208 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + Auto + Auto + + + + ГруппаПредупреждатьОбОкончанииСрокаДействияПароля2 + 240 + + ПредупреждатьОбОкончанииСрокаДействияПароля2Включить + 242 + true + true + + true + + + ПредупреждатьОбОкончанииСрокаДействияПароля2Включить + + Right + + OnChange + НастройкаВключитьПриИзменении + + + ПредупреждатьОбОкончанииСрокаДействияПароля2ВключитьРасширеннаяПодсказка + 244 + Label + true + true + + Left + + + + ПредупреждатьОбОкончанииСрокаДействияПароля2ВключитьКонтекстноеМеню + 243 + true + + CheckBoxField + Enter + true + Left + true + + + + ПредупреждатьОбОкончанииСрокаДействияПароля2 + 245 + true + true + + true + + + ПредупреждатьОбОкончанииСрокаДействияПароля2 + + None + + ПредупреждатьОбОкончанииСрокаДействияПароля2РасширеннаяПодсказка + 247 + Label + true + true + + Left + + + + ПредупреждатьОбОкончанииСрокаДействияПароля2КонтекстноеМеню + 246 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + + ПояснениеПредупреждатьОбОкончанииСрокаДействияПароля2 + 248 + + <key>ru</key> + <value>дн.</value> + + true + true + + true + + + ПояснениеПредупреждатьОбОкончанииСрокаДействияПароля2РасширеннаяПодсказка + 250 + Label + true + true + + Left + + + + ПояснениеПредупреждатьОбОкончанииСрокаДействияПароля2КонтекстноеМеню + 249 + true + + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Предупреждать об окончании срока действия пароля</value> + + + ГруппаПредупреждатьОбОкончанииСрокаДействияПароля2РасширеннаяПодсказка + 241 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Смена пароля</value> + + + ГруппаСменаПароля2РасширеннаяПодсказка + 184 + Label + true + true + + Left + + + UsualGroup + + Vertical + NormalSeparation + true + + Style.FormBackColor + + Auto + Auto + + + + ГруппаПросрочкаРаботыВПрограммеДоЗапрещенияВхода2 + 215 + + ПросрочкаРаботыВПрограммеДоЗапрещенияВхода2Включить + 217 + true + true + + true + + + ПросрочкаРаботыВПрограммеДоЗапрещенияВхода2Включить + + Right + 2 + + OnChange + НастройкаВключитьПриИзменении + + + ПросрочкаРаботыВПрограммеДоЗапрещенияВхода2ВключитьРасширеннаяПодсказка + 219 + Label + true + true + + Left + + + + ПросрочкаРаботыВПрограммеДоЗапрещенияВхода2ВключитьКонтекстноеМеню + 218 + true + + CheckBoxField + Top + Enter + true + Left + true + + + + ПросрочкаРаботыВПрограммеДоЗапрещенияВхода2 + 220 + true + true + + true + + + ПросрочкаРаботыВПрограммеДоЗапрещенияВхода2 + + None + + ru + Срок относительно последней активности пользователя, +после которого вход в программу будет запрещен. + +Не влияет на администраторов. + + + ПросрочкаРаботыВПрограммеДоЗапрещенияВхода2РасширеннаяПодсказка + 222 + Label + true + true + + Left + + + + ПросрочкаРаботыВПрограммеДоЗапрещенияВхода2КонтекстноеМеню + 221 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + + ПояснениеПросрочкаРаботыВПрограммеДоЗапрещенияВхода2 + 223 + + <key>ru</key> + <value>дн.</value> + + true + true + + true + + + ПояснениеПросрочкаРаботыВПрограммеДоЗапрещенияВхода2РасширеннаяПодсказка + 225 + Label + true + true + + Left + + + + ПояснениеПросрочкаРаботыВПрограммеДоЗапрещенияВхода2КонтекстноеМеню + 224 + true + + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Просрочка работы в программе до запрещения входа</value> + + + ГруппаПросрочкаРаботыВПрограммеДоЗапрещенияВхода2РасширеннаяПодсказка + 216 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + NormalSeparation + true + Auto + Auto + + + true + false + + true + + + <key>ru</key> + <value>Настройки</value> + + + ГруппаНастройки2РасширеннаяПодсказка + 166 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Для внешних пользователей</value> + + + ДляВнешнихПользователейРасширеннаяПодсказка + 164 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + Дополнительно + 140 + + ГруппаКоличествоПопытокВводаПароляДоБлокировки + 142 + + КоличествоПопытокВводаПароляДоБлокировкиВключить + 144 + true + true + + true + + + КоличествоПопытокВводаПароляДоБлокировкиВключить + + Right + + OnChange + ОбщаяНастройкаВключитьПриИзменении + + + КоличествоПопытокВводаПароляДоБлокировкиВключитьРасширеннаяПодсказка + 146 + Label + true + true + + Left + + + + КоличествоПопытокВводаПароляДоБлокировкиВключитьКонтекстноеМеню + 145 + true + + CheckBoxField + Enter + true + Left + true + + + + КоличествоПопытокВводаПароляДоБлокировки + 134 + true + true + + true + + + КоличествоПопытокВводаПароляДоБлокировки + + None + + КоличествоПопытокВводаПароляДоБлокировкиРасширеннаяПодсказка + 136 + Label + true + true + + Left + + + + КоличествоПопытокВводаПароляДоБлокировкиКонтекстноеМеню + 135 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Количество попыток ввода пароля до блокировки</value> + + + ГруппаКоличествоПопытокВводаПароляДоБлокировкиРасширеннаяПодсказка + 143 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + Auto + Auto + + + + ГруппаДлительностьБлокировкиВводаПароля + 150 + + ДлительностьБлокировкиВводаПароляВключить + 147 + true + true + + true + + + ДлительностьБлокировкиВводаПароляВключить + + Right + + OnChange + ОбщаяНастройкаВключитьПриИзменении + + + ДлительностьБлокировкиВводаПароляВключитьРасширеннаяПодсказка + 149 + Label + true + true + + Left + + + + ДлительностьБлокировкиВводаПароляВключитьКонтекстноеМеню + 148 + true + + CheckBoxField + Enter + true + Left + true + + + + ДлительностьБлокировкиВводаПароля + 137 + true + true + + true + + + ДлительностьБлокировкиВводаПароля + + None + + ДлительностьБлокировкиВводаПароляРасширеннаяПодсказка + 139 + Label + true + true + + Left + + + + ДлительностьБлокировкиВводаПароляКонтекстноеМеню + 138 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПояснениеДлительностьБлокировкиВводаПароля + 152 + + <key>ru</key> + <value>мин.</value> + + true + true + + true + + + ПояснениеДлительностьБлокировкиВводаПароляРасширеннаяПодсказка + 154 + Label + true + true + + Left + + + + ПояснениеДлительностьБлокировкиВводаПароляКонтекстноеМеню + 153 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Длительность блокировки ввода пароля</value> + + + ГруппаДлительностьБлокировкиВводаПароляРасширеннаяПодсказка + 151 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + Auto + Auto + + + + ГруппаПоказыватьВСпискеВыбора + 158 + + ПоказыватьВСпискеВыбора + 155 + true + true + + true + + + ПоказыватьВСпискеВыбора + + Top + + ПоказыватьВСпискеВыбораРасширеннаяПодсказка + 157 + Label + true + true + + Left + + + + ПоказыватьВСпискеВыбораКонтекстноеМеню + 156 + true + + InputField + Enter + true + Left + true + + + Clearing + ПоказыватьВСпискеВыбораОчистка + + + ChoiceProcessing + ПоказыватьВСпискеВыбораОбработкаВыбора + + true + true + true + true + true + true + true + + + ru + Включено для новых пользователей + + + ВключеноДляНовыхПользователей + + + + + ru + Выключено для новых пользователей + + + ВыключеноДляНовыхПользователей + + + + + ru + Скрыто и включено для всех пользователей + + + СкрытоИВключеноДляВсехПользователей + + + + + ru + Скрыто и выключено для всех пользователей + + + СкрытоИВыключеноДляВсехПользователей + + + Normal + + + + ПояснениеПоказыватьВСпискеВыбораВнешниеПользователи + 160 + + <key>ru</key> + <value>Пояснение к блокировке настройки флажка Показывать в списке выбора (внешние пользователи)</value> + + true + + true + + + ru + Разрешен доступ внешним пользователям, поэтому +флажок скрыт и выключен для всех пользователей + + ShowRight + + ПояснениеПоказыватьВСпискеВыбораВнешниеПользователиРасширеннаяПодсказка + 162 + Label + true + true + + Left + + + + ПояснениеПоказыватьВСпискеВыбораВнешниеПользователиКонтекстноеМеню + 161 + true + + true + true + + + CommonPicture.ИнформацияПоНедоступнымПолям + + + + + ПояснениеПоказыватьВСпискеВыбораРазделениеВключено + 251 + + <key>ru</key> + <value>Пояснение к блокировке настройки флажка Показывать в списке выбора (разделение включено)</value> + + true + + true + + + ru + В модели сервиса флажок скрыт и выключен для всех пользователей + + ShowRight + + ПояснениеПоказыватьВСпискеВыбораРазделениеВключеноРасширеннаяПодсказка + 253 + Label + true + true + + Left + + + + ПояснениеПоказыватьВСпискеВыбораРазделениеВключеноКонтекстноеМеню + 252 + true + + true + true + + + CommonPicture.ИнформацияПоНедоступнымПолям + + + + true + true + + true + + + <key>ru</key> + <value>Показывать в списке выбора</value> + + + ГруппаПоказыватьВСпискеВыбораРасширеннаяПодсказка + 159 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Дополнительно</value> + + + ДополнительноРасширеннаяПодсказка + 141 + Label + true + true + + Left + + + Page + + Vertical + auto + false true @@ -1059,11 +2719,11 @@
        <key>ru</key> - <value>Настройки</value> + <value>Страницы</value> - ГруппаНастройкиРасширеннаяПодсказка - 129 + СтраницыРасширеннаяПодсказка + 131 Label true true @@ -1071,13 +2731,9 @@ Left
        - UsualGroup - - Vertical - Auto - true - true - Auto + Pages + + TabsOnTop Auto @@ -1144,7 +2800,6 @@
        LockOwner true - true true Vertical true @@ -1384,8 +3039,88 @@ - ТекстВопросаОбОчисткеНастроекКонфигуратора - 22 + КоличествоПопытокВводаПароляДоБлокировки + + <key>ru</key> + <value>Количество попыток ввода пароля до блокировки</value> + + 3 + + Number + + 2 + true + + + + true + + + true + + + + ПредупреждатьОбОкончанииСрокаДействияПароля + + <key>ru</key> + <value>Предупреждать об окончании срока действия пароля</value> + + 6 + + Number + + 2 + true + + + + true + + + true + + + + КоличествоПопытокВводаПароляДоБлокировкиВключить + + <key>ru</key> + <value>Количество попыток ввода пароля до блокировки</value> + + 7 + + Boolean + + + true + + + true + + + + ДлительностьБлокировкиВводаПароляВключить + + <key>ru</key> + <value>Длительность блокировки ввода пароля</value> + + 10 + + Boolean + + + true + + + true + + + + ПоказыватьВСпискеВыбора + + <key>ru</key> + <value>Показывать в списке выбора</value> + + 11 String @@ -1397,6 +3132,343 @@ true + + ОтдельныеНастройкиДляВнешнихПользователей + + <key>ru</key> + <value>Отдельные настройки для внешних пользователей</value> + + 12 + + Boolean + + + true + + + true + + + + ПредупреждатьОбОкончанииСрокаДействияПароляВключить + + <key>ru</key> + <value>Предупреждать об окончании срока действия пароля за</value> + + 13 + + Boolean + + + true + + + true + + + + ДлительностьБлокировкиВводаПароля + + <key>ru</key> + <value>Длительность блокировки ввода пароля</value> + + 14 + + Number + + 2 + true + + + + true + + + true + + + + ПарольДолженОтвечатьТребованиямСложности2 + + <key>ru</key> + <value>Пароль должен отвечать требованиям сложности</value> + + 23 + + Boolean + + + true + + + true + + + + МинимальнаяДлинаПароля2Включить + + <key>ru</key> + <value>Минимальная длина пароля:</value> + + 24 + + Boolean + + + true + + + true + + + + МинимальнаяДлинаПароля2 + + <key>ru</key> + <value>Минимальная длина пароля</value> + + 25 + + Number + + 2 + true + + + + true + + + true + + + + МаксимальныйСрокДействияПароля2Включить + + <key>ru</key> + <value>Максимальный срок действия пароля:</value> + + 26 + + Boolean + + + true + + + true + + + + МаксимальныйСрокДействияПароля2 + + <key>ru</key> + <value>Максимальный срок действия пароля</value> + + 27 + + Number + + 2 + true + + + + true + + + true + + + + МинимальныйСрокДействияПароля2Включить + + <key>ru</key> + <value>Минимальный срок действия пароля:</value> + + 28 + + Boolean + + + true + + + true + + + + МинимальныйСрокДействияПароля2 + + <key>ru</key> + <value>Минимальный срок действия пароля</value> + + 29 + + Number + + 2 + true + + + + true + + + true + + + + ПредупреждатьОбОкончанииСрокаДействияПароля2Включить + + <key>ru</key> + <value>Предупреждать об окончании срока действия пароля за</value> + + 30 + + Boolean + + + true + + + true + + + + ПредупреждатьОбОкончанииСрокаДействияПароля2 + + <key>ru</key> + <value>Предупреждать об окончании срока действия пароля</value> + + 31 + + Number + + 2 + true + + + + true + + + true + + + + ЗапретитьПовторениеПароляСредиПоследних2Включить + + <key>ru</key> + <value>Запретить повторение пароля среди последних:</value> + + 32 + + Boolean + + + true + + + true + + + + ЗапретитьПовторениеПароляСредиПоследних2 + + <key>ru</key> + <value>Запретить повторение пароля среди последних</value> + + 33 + + Number + + 2 + true + + + + true + + + true + + + + ПросрочкаРаботыВПрограммеДоЗапрещенияВхода2Включить + + <key>ru</key> + <value>Запрещать вход в программу пользователям, которые не работали в программе более:</value> + + 34 + + Boolean + + + true + + + true + + + + ПросрочкаРаботыВПрограммеДоЗапрещенияВхода2 + + <key>ru</key> + <value>Просрочка работы в программе до запрещения входа</value> + + 35 + + Number + + 2 + true + + + + true + + + true + + + + ИспользоватьВнешнихПользователей + 36 + + Boolean + + + true + + + true + + + + ПредлагаемыеЗначенияОбщихНастроек + 37 + + + true + + + true + + + + ПодтвержденоМассовоеИзменениеСвойстваПоказыватьВСпискеВыбора + 22 + + Boolean + + + true + + + true + + ЗаписатьИЗакрыть diff --git a/SSL/src/CommonForms/НастройкиВходаПользователей/Help/ru.html b/SSL/src/CommonForms/НастройкиВходаПользователей/Help/ru.html index efd1a28ca..e1a65498f 100644 --- a/SSL/src/CommonForms/НастройкиВходаПользователей/Help/ru.html +++ b/SSL/src/CommonForms/НастройкиВходаПользователей/Help/ru.html @@ -1,11 +1,28 @@ <!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 9.00.8112.16421"></meta></head><body> -<p>Предназначена для настройки параметров входа в программу раздельно для <a href="Catalog.Пользователи/Help">внутренних</a> и <a href="Catalog.ВнешниеПользователи/Help">внешних пользователей</a>.</p> -<h3>Требования к паролю</h3> +<p>Предназначена для настройки параметров входа в программу для <a href="Catalog.Пользователи/Help">внутренних</a> и <a href="Catalog.ВнешниеПользователи/Help">внешних пользователей</a>.</p> +<h3><font size="2">Содержит три вкладки:</font></h3> +<ul><li><b>Для пользователей</b>;</li> +<li><b>Для внешних пользователей </b>(если разрешен доступ внешним пользователям);</li> +<li><b>Дополнительно</b>.</li></ul><h3>Требования к паролю</h3> +<div><br></div> <p>Для защиты от несанкционированного доступа к программе укажите с помощью флажков:</p> <ul><li><strong>Пароль должен отвечать требованиям сложности</strong> - настройка и контроль сложности пароля. Включите флажок, для того чтобы проверять, чтобы новый пароль имел не менее 7 символов, содержал любые 3 из 4-х типов символов: заглавные буквы, строчные буквы, цифры, специальные символы, не совпадал с именем (для входа); -</li><li><strong>Минимальная длина пароля</strong> - по умолчанию 8 знаков; -</li><li><strong>Максимальный срок действия пароля</strong> - срок после первого входа с новым паролем, после которого пользователю потребуется сменить пароль, по умолчанию 30 дней. -</li><li><strong>Минимальный срок действия пароля</strong> - срок после первого входа с новым паролем, в течение которого пользователь не может сменить пароль, по умолчанию 1 день. -</li><li><strong>Запретить повторение пароля среди последних</strong> - по умолчанию 10 значений. Таким образом, обеспечивается контроль повторяемости паролей; -</li><li><strong>Запрещать вход в программу пользователям, которые не работали в программе более</strong> - срок относительно последней активности пользователя, после которого вход в программу будет запрещен, по умолчанию 45 дней.</li></ul><h3>См. также:</h3> +</li> +<li><strong>Минимальная длина пароля</strong> - по умолчанию 8 знаков; +</li> +<li><strong>Максимальный срок действия пароля</strong> - срок после первого входа с новым паролем, после которого пользователю потребуется сменить пароль, по умолчанию 30 дней. +</li> +<li><strong>Минимальный срок действия пароля</strong> - срок после первого входа с новым паролем, в течение которого пользователь не может сменить пароль, по умолчанию 1 день. +</li> +<li><strong>Запретить повторение пароля среди последних</strong> - по умолчанию 10 значений. Таким образом, обеспечивается контроль повторяемости паролей; +</li> +<li><b>Предупреждать об окончании срока действия пароля за</b> - по умолчанию 5 дней до истечения срока действия пароля.  При входе в программу появляется предупреждающее окно для смены пароля, где сразу можно сменить пароль;</li> +<li><strong>Запрещать вход в программу пользователям, которые не работали в программе более</strong> - срок относительно последней активности пользователя, после которого вход в программу будет запрещен, по умолчанию 45 дней.</li></ul><p class="Usual">Можно установить<b> Отдельные настройки для внешних пользователей. </b></p> +<p class="Usual">На вкладке <b>Дополнительно</b> отображается настройка списка выбора пользователей в окне 1С:Предприятие при начале работы с программой: </p> +<ul><li><b>Включено для новых пользователей </b>- в карточке нового пользователя флажок <b>Показывать в списке выбора</b> будет включен;</li> +<li><strong>Выключено для новых пользователей</strong> - в карточке нового пользователя флажок <b>Показывать в списке выбора</b> будет выключен; </li> +<li><strong>Скрыто и включено для всех пользователей</strong> - при входе в программу список выбора пользователей будет полным, а флажок <b>Показывать в списке выбора</b> в карточках всех пользователей будет включен и скрыт;</li> +<li><strong>Скрыто и включено для всех пользователей</strong>  - при входе в программу список пользователей станет пустым, а флажок <b>Показывать в списке выбора</b> в карточках всех пользователей будет очищен и скрыт. </li></ul><p>Если в настройках программы включен флажок <b>Разрешить доступ внешним пользователям</b>, то настройка <b>Показывать в списке выбора</b> на вкладке <b>Дополнительно</b> станет недоступной.</p> +<p class="">В случае клиент-серверного варианта работы на вкладке <b>Дополнительно</b> также можно указать<b> Количество попыток ввода пароля до блокировки</b> (по умолчанию 3 попытки) и <b>Длительность блокировки ввода пароля</b> (по умолчанию 5 мин.).</p> +<h3>См. также:</h3> <ul><li><a href="v8help://frame/form_common">Работа с формами</a>.</li></ul></body></html> \ No newline at end of file diff --git a/SSL/src/CommonForms/НастройкиВходаПользователей/Module.bsl b/SSL/src/CommonForms/НастройкиВходаПользователей/Module.bsl index abf46382b..36f2dfdf7 100644 --- a/SSL/src/CommonForms/НастройкиВходаПользователей/Module.bsl +++ b/SSL/src/CommonForms/НастройкиВходаПользователей/Module.bsl @@ -12,56 +12,61 @@ Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ПоказатьНастройкиВнешнихПользователей = Параметры.ПоказатьНастройкиВнешнихПользователей; + ИспользоватьВнешнихПользователей = ВнешниеПользователи.ИспользоватьВнешнихПользователей(); ПредлагаемыеЗначенияНастроек = Новый Структура; ПредлагаемыеЗначенияНастроек.Вставить("МинимальнаяДлинаПароля", 8); ПредлагаемыеЗначенияНастроек.Вставить("МаксимальныйСрокДействияПароля", 30); ПредлагаемыеЗначенияНастроек.Вставить("МинимальныйСрокДействияПароля", 1); ПредлагаемыеЗначенияНастроек.Вставить("ЗапретитьПовторениеПароляСредиПоследних", 10); + ПредлагаемыеЗначенияНастроек.Вставить("ПредупреждатьОбОкончанииСрокаДействияПароля", 5); ПредлагаемыеЗначенияНастроек.Вставить("ПросрочкаРаботыВПрограммеДоЗапрещенияВхода", 45); - Если ПоказатьНастройкиВнешнихПользователей Тогда - СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, "ВнешниеПользователи"); - АвтоЗаголовок = Ложь; - Заголовок = НСтр("ru = 'Настройки входа внешних пользователей'"); - ЗаполнитьЗначенияСвойств(ЭтотОбъект, ПользователиСлужебный.НастройкиВхода().ВнешниеПользователи); - Иначе - ЗаполнитьЗначенияСвойств(ЭтотОбъект, ПользователиСлужебный.НастройкиВхода().Пользователи); + ПредлагаемыеЗначенияОбщихНастроек = Новый Структура; + ПредлагаемыеЗначенияОбщихНастроек.Вставить("КоличествоПопытокВводаПароляДоБлокировки", 3); + ПредлагаемыеЗначенияОбщихНастроек.Вставить("ДлительностьБлокировкиВводаПароля", 5); + + НастройкиВхода = ПользователиСлужебный.НастройкиВхода(); + Если ОбщегоНазначения.РазделениеВключено() Тогда + Элементы.ГруппаПредупреждатьОбОкончанииСрокаДействияПароля.Видимость = Ложь; + Элементы.ГруппаПредупреждатьОбОкончанииСрокаДействияПароля2.Видимость = Ложь; КонецЕсли; - Для Каждого КлючИЗначение Из ПредлагаемыеЗначенияНастроек Цикл - Если ЗначениеЗаполнено(ЭтотОбъект[КлючИЗначение.Ключ]) Тогда - ЭтотОбъект[КлючИЗначение.Ключ + "Включить"] = Истина; - Иначе - ЭтотОбъект[КлючИЗначение.Ключ] = КлючИЗначение.Значение; - Элементы[КлючИЗначение.Ключ].Доступность = Ложь; - КонецЕсли; - КонецЦикла; + ЗаполнитьНастройкиВФорме(НастройкиВхода.Общие, ПредлагаемыеЗначенияОбщихНастроек); + ПоказыватьВСпискеВыбора = НастройкиВхода.Общие.ПоказыватьВСпискеВыбора; + ОтдельныеНастройкиДляВнешнихПользователей = НастройкиВхода.Общие.ОтдельныеНастройкиДляВнешнихПользователей; - ВидимостьГруппыВосстановлениеПароля = Ложь; + ЗаполнитьНастройкиВФорме(НастройкиВхода.Пользователи, ПредлагаемыеЗначенияНастроек); + ПарольДолженОтвечатьТребованиямСложности = НастройкиВхода.Пользователи.ПарольДолженОтвечатьТребованиямСложности; + + ЗаполнитьНастройкиВФорме(НастройкиВхода.ВнешниеПользователи, ПредлагаемыеЗначенияНастроек, Истина); + ПарольДолженОтвечатьТребованиямСложности2 = НастройкиВхода.ВнешниеПользователи.ПарольДолженОтвечатьТребованиямСложности; + + Если ИспользоватьВнешнихПользователей Тогда + Если ПоказатьНастройкиВнешнихПользователей Тогда + Элементы.Страницы.ТекущаяСтраница = Элементы.ДляВнешнихПользователей; + КонецЕсли; + ОбновитьДоступностьНастроекВнешнихПользователей(ЭтотОбъект); + Иначе + Элементы.ДляВнешнихПользователей.Видимость = Ложь; + КонецЕсли; Если ОбщегоНазначения.РазделениеВключено() Тогда - Элементы.ПредупреждениеНастройкаВСервисе.Видимость = Истина; Элементы.ФормаЗаписатьИЗакрыть.Доступность = Ложь; - Элементы.ГруппаНастройки.Доступность = Ложь; + Элементы.Страницы.ТолькоПросмотр = Истина; + Элементы.ПояснениеПоказыватьВСпискеВыбораРазделениеВключено.Видимость = Истина; + Элементы.ПоказыватьВСпискеВыбора.Доступность = Ложь; - Иначе - - НастройкиВосстановленияПароля = ПользователиСлужебный.НастройкиВосстановленияПароля(); - Если НастройкиВосстановленияПароля <> Неопределено Тогда - ВидимостьГруппыВосстановлениеПароля = - НастройкиВосстановленияПароля.СпособВосстановленияПароля - = ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы( - "ОтправкаКодаПодтвержденияПоЗаданнымПараметрам") - Или НастройкиВосстановленияПароля.СпособВосстановленияПароля - = ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы( - "ОтправкаКодаПодтвержденияЧерезСтандартныйСервис"); - КонецЕсли; - + ИначеЕсли ИспользоватьВнешнихПользователей Тогда + Элементы.ПояснениеПоказыватьВСпискеВыбораВнешниеПользователи.Видимость = Истина; + Элементы.ПоказыватьВСпискеВыбора.Доступность = Ложь; КонецЕсли; - Элементы.ПредупреждениеВосстановлениеПароля.Видимость = ВидимостьГруппыВосстановлениеПароля; + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Элементы.ГруппаКоличествоПопытокВводаПароляДоБлокировки.Видимость = Ложь; + Элементы.ГруппаДлительностьБлокировкиВводаПароля.Видимость = Ложь; + КонецЕсли; КонецПроцедуры @@ -69,12 +74,22 @@ #Область ОбработчикиСобытийЭлементовШапкиФормы +&НаКлиенте +Процедура ОтдельныеНастройкиДляВнешнихПользователейПриИзменении(Элемент) + + ОбновитьДоступностьНастроекВнешнихПользователей(ЭтотОбъект); + +КонецПроцедуры + &НаКлиенте Процедура ПарольДолженОтвечатьТребованиямСложностиПриИзменении(Элемент) Если МинимальнаяДлинаПароля < 7 Тогда МинимальнаяДлинаПароля = 7; КонецЕсли; + Если МинимальнаяДлинаПароля2 < 7 Тогда + МинимальнаяДлинаПароля2 = 7; + КонецЕсли; КонецПроцедуры @@ -87,19 +102,89 @@ МинимальнаяДлинаПароля = 7; КонецЕсли; + Если МинимальнаяДлинаПароля2 < 7 + И ПарольДолженОтвечатьТребованиямСложности2 Тогда + + МинимальнаяДлинаПароля2 = 7; + КонецЕсли; + КонецПроцедуры &НаКлиенте Процедура НастройкаВключитьПриИзменении(Элемент) + ИмяВФорме = Лев(Элемент.Имя, СтрДлина(Элемент.Имя) - СтрДлина("Включить")); + ИмяНастройки = ?(СтрЗаканчиваетсяНа(ИмяВФорме, "2"), + Лев(ИмяВФорме, СтрДлина(ИмяВФорме) - 1), ИмяВФорме); + + Если ЭтотОбъект[Элемент.Имя] = Ложь Тогда + ЭтотОбъект[ИмяВФорме] = ПредлагаемыеЗначенияНастроек[ИмяНастройки]; + КонецЕсли; + + Элементы[ИмяВФорме].Доступность = ЭтотОбъект[Элемент.Имя]; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбщаяНастройкаВключитьПриИзменении(Элемент) + ИмяНастройки = Лев(Элемент.Имя, СтрДлина(Элемент.Имя) - СтрДлина("Включить")); Если ЭтотОбъект[Элемент.Имя] = Ложь Тогда - ЭтотОбъект[ИмяНастройки] = ПредлагаемыеЗначенияНастроек[ИмяНастройки]; + ЭтотОбъект[ИмяНастройки] = ПредлагаемыеЗначенияОбщихНастроек[ИмяНастройки]; КонецЕсли; Элементы[ИмяНастройки].Доступность = ЭтотОбъект[Элемент.Имя]; + Если Элемент.Имя = "КоличествоПопытокВводаПароляДоБлокировкиВключить" Тогда + Если ДлительностьБлокировкиВводаПароляВключить <> КоличествоПопытокВводаПароляДоБлокировкиВключить Тогда + ДлительностьБлокировкиВводаПароляВключить = КоличествоПопытокВводаПароляДоБлокировкиВключить; + ОбщаяНастройкаВключитьПриИзменении(Элементы.ДлительностьБлокировкиВводаПароляВключить); + КонецЕсли; + ИначеЕсли Элемент.Имя = "ДлительностьБлокировкиВводаПароляВключить" Тогда + Если КоличествоПопытокВводаПароляДоБлокировкиВключить <> ДлительностьБлокировкиВводаПароляВключить Тогда + КоличествоПопытокВводаПароляДоБлокировкиВключить = ДлительностьБлокировкиВводаПароляВключить; + ОбщаяНастройкаВключитьПриИзменении(Элементы.КоличествоПопытокВводаПароляДоБлокировкиВключить); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказыватьВСпискеВыбораОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказыватьВСпискеВыбораОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + Если ПоказыватьВСпискеВыбора = ВыбранноеЗначение + Или ВыбранноеЗначение = "ВключеноДляНовыхПользователей" + Или ВыбранноеЗначение = "ВыключеноДляНовыхПользователей" Тогда + Возврат; + КонецЕсли; + + СтандартнаяОбработка = Ложь; + + Оповещение = Новый ОписаниеОповещения("ПоказыватьВСпискеВыбораОбработкаВыбораЗавершение", + ЭтотОбъект, ВыбранноеЗначение); + + Если ВыбранноеЗначение = "СкрытоИВключеноДляВсехПользователей" Тогда + ТекстВопроса = + НСтр("ru = 'При входе в программу список выбора пользователей станет полным + |(реквизит ""Показывать в списке выбора"" в карточках всех + | пользователей будет включен и скрыт).'"); + Иначе + ТекстВопроса = + НСтр("ru = 'При входе в программу список выбора пользователей станет пустым + |(реквизит ""Показывать в списке выбора"" в карточках всех + | пользователей будет очищен и скрыт).'"); + КонецЕсли; + + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + КонецПроцедуры #КонецОбласти @@ -119,24 +204,90 @@ #Область СлужебныеПроцедурыИФункции -&НаСервере -Процедура ЗаписатьНаСервере() +&НаКлиентеНаСервереБезКонтекста +Процедура ОбновитьДоступностьНастроекВнешнихПользователей(Форма) - Настройки = Пользователи.НовоеОписаниеНастроекВхода(); - Настройки.ПарольДолженОтвечатьТребованиямСложности = ПарольДолженОтвечатьТребованиямСложности; + Форма.Элементы.ГруппаНастройки2.Доступность = + Форма.ОтдельныеНастройкиДляВнешнихПользователей; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьНастройкиВФорме(Настройки, ПредлагаемыеЗначенияНастроек, ДляВнешнихПользователей = Ложь) Для Каждого КлючИЗначение Из ПредлагаемыеЗначенияНастроек Цикл - Если ЭтотОбъект[КлючИЗначение.Ключ + "Включить"] Тогда - Настройки[КлючИЗначение.Ключ] = ЭтотОбъект[КлючИЗначение.Ключ]; + ИмяВФорме = КлючИЗначение.Ключ + ?(ДляВнешнихПользователей, "2", ""); + Если ЗначениеЗаполнено(Настройки[КлючИЗначение.Ключ]) Тогда + ЭтотОбъект[ИмяВФорме + "Включить"] = Истина; + ЭтотОбъект[ИмяВФорме] = Настройки[КлючИЗначение.Ключ]; Иначе - Настройки[КлючИЗначение.Ключ] = 0; + ЭтотОбъект[ИмяВФорме] = КлючИЗначение.Значение; + Элементы[ИмяВФорме].Доступность = Ложь; КонецЕсли; КонецЦикла; - Пользователи.УстановитьНастройкиВхода(Настройки, ПоказатьНастройкиВнешнихПользователей); +КонецПроцедуры + +&НаСервере +Процедура ЗаписатьНаСервере() + + НачатьТранзакцию(); + Попытка + Общие = Пользователи.НовоеОписаниеОбщихНастроекВхода(); + ЗаполнитьНастройкиИзФормы(Общие, ПредлагаемыеЗначенияОбщихНастроек); + Если ПодтвержденоМассовоеИзменениеСвойстваПоказыватьВСпискеВыбора + И Общие.ПоказыватьВСпискеВыбора <> ПоказыватьВСпискеВыбора + И ( ПоказыватьВСпискеВыбора = "СкрытоИВключеноДляВсехПользователей" + Или ПоказыватьВСпискеВыбора = "СкрытоИВыключеноДляВсехПользователей") Тогда + ПользователиСлужебный.УстановитьРеквизитПоказыватьВСпискеВыбораУВсехПользователейИБ( + ПоказыватьВСпискеВыбора = "СкрытоИВключеноДляВсехПользователей"); + КонецЕсли; + Общие.ПоказыватьВСпискеВыбора = ПоказыватьВСпискеВыбора; + Общие.ОтдельныеНастройкиДляВнешнихПользователей = ОтдельныеНастройкиДляВнешнихПользователей; + Пользователи.УстановитьОбщиеНастройкиВхода(Общие); + + НастройкиПользователей = Пользователи.НовоеОписаниеНастроекВхода(); + ЗаполнитьНастройкиИзФормы(НастройкиПользователей, ПредлагаемыеЗначенияНастроек); + НастройкиПользователей.ПарольДолженОтвечатьТребованиямСложности = ПарольДолженОтвечатьТребованиямСложности; + Пользователи.УстановитьНастройкиВхода(НастройкиПользователей); + + НастройкиВнешнихПользователей = Пользователи.НовоеОписаниеНастроекВхода(); + ЗаполнитьНастройкиИзФормы(НастройкиВнешнихПользователей, ПредлагаемыеЗначенияНастроек, Истина); + НастройкиВнешнихПользователей.ПарольДолженОтвечатьТребованиямСложности = ПарольДолженОтвечатьТребованиямСложности2; + Пользователи.УстановитьНастройкиВхода(НастройкиВнешнихПользователей, Истина); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; ОбновитьПовторноИспользуемыеЗначения(); КонецПроцедуры +&НаСервере +Процедура ЗаполнитьНастройкиИзФормы(Настройки, ПредлагаемыеЗначенияНастроек, ДляВнешнихПользователей = Ложь) + + Для Каждого КлючИЗначение Из ПредлагаемыеЗначенияНастроек Цикл + ИмяВФорме = КлючИЗначение.Ключ + ?(ДляВнешнихПользователей, "2", ""); + Если ЭтотОбъект[ИмяВФорме + "Включить"] Тогда + Настройки[КлючИЗначение.Ключ] = ЭтотОбъект[ИмяВФорме]; + Иначе + Настройки[КлючИЗначение.Ключ] = 0; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказыватьВСпискеВыбораОбработкаВыбораЗавершение(Ответ, ВыбранноеЗначение) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + ПоказыватьВСпискеВыбора = ВыбранноеЗначение; + ПодтвержденоМассовоеИзменениеСвойстваПоказыватьВСпискеВыбора = Истина; + КонецЕсли; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonForms/НастройкиПравОбъектов/Form.form b/SSL/src/CommonForms/НастройкиПравОбъектов/Form.form index 34eba55dc..1ad74c292 100644 --- a/SSL/src/CommonForms/НастройкиПравОбъектов/Form.form +++ b/SSL/src/CommonForms/НастройкиПравОбъектов/Form.form @@ -583,7 +583,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -702,7 +701,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -812,7 +810,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -852,7 +849,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -880,7 +876,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -997,17 +992,73 @@ <placementArea>UserCmds</placementArea> <representationInContextMenu>Auto</representationInContextMenu> </items> - <items xsi:type="form:Button"> - <name>ФормаПереместитьВверх</name> - <id>37</id> + <items xsi:type="form:FormGroup"> + <name>КнопкиПеремещения</name> + <id>113</id> + <items xsi:type="form:Button"> + <name>ФормаПереместитьВверх</name> + <id>37</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ФормаПереместитьВверхExtendedTooltip</name> + <id>46</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Item.ГруппыПрав.StandardCommand.MoveUp</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> + <items xsi:type="form:Button"> + <name>ФормаПереместитьВниз</name> + <id>38</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ФормаПереместитьВнизExtendedTooltip</name> + <id>47</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Item.ГруппыПрав.StandardCommand.MoveDown</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> <visible>true</visible> <enabled>true</enabled> <userVisible> <common>true</common> </userVisible> + <title> + <key>ru</key> + <value>Кнопки перемещения</value> + - ФормаПереместитьВверхExtendedTooltip - 46 + КнопкиПеремещенияРасширеннаяПодсказка + 114 Label true true @@ -1015,39 +1066,9 @@ Left
        - Form.Item.ГруппыПрав.StandardCommand.MoveUp - Normal - Auto - true - true - UserCmds - Auto - - - ФормаПереместитьВниз - 38 - true - true - - true - - - ФормаПереместитьВнизExtendedTooltip - 47 - Label - true - true - - Left - - - Form.Item.ГруппыПрав.StandardCommand.MoveDown - Normal - Auto - true - true - UserCmds - Auto + + Compact + ФормаСправка @@ -1129,6 +1150,38 @@ Auto InAdditionalSubmenu + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 115 + + СтрокаПоискРасширеннаяПодсказка + 117 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 116 + true + + ГруппыПрав + + true + + Left diff --git a/SSL/src/CommonForms/НастройкиПравОбъектов/Module.bsl b/SSL/src/CommonForms/НастройкиПравОбъектов/Module.bsl index 7d9e8795f..53e8175bf 100644 --- a/SSL/src/CommonForms/НастройкиПравОбъектов/Module.bsl +++ b/SSL/src/CommonForms/НастройкиПравОбъектов/Module.bsl @@ -18,10 +18,10 @@ ВызватьИсключение НСтр("ru = 'Не указан владелец настроек прав.'"); КонецЕсли; - ВозможныеПрава = УправлениеДоступомСлужебный.ВозможныеПраваДляНастройкиПравОбъектов(); + ВозможныеПраваДляНастройки = УправлениеДоступомСлужебный.ВозможныеПраваДляНастройкиПравОбъектов(); ТипСсылкиНаОбъект = ТипЗнч(СсылкаНаОбъект); - Если ВозможныеПрава.ПоТипамСсылок.Получить(ТипСсылкиНаОбъект) = Неопределено Тогда + Если ВозможныеПраваДляНастройки.ПоТипамСсылок.Получить(ТипСсылкиНаОбъект) = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Права доступа для каждого объекта не настраиваются |для объектов типа ""%1"".'"), @@ -527,9 +527,9 @@ &НаСервере Процедура ДобавитьРеквизитыИлиЭлементыФормы(НовыеРеквизиты = Неопределено) - Права = УправлениеДоступомСлужебный.ВозможныеПраваДляНастройкиПравОбъектов(); + ВозможныеПраваДляНастройки = УправлениеДоступомСлужебный.ВозможныеПраваДляНастройкиПравОбъектов(); ТипСсылкиВладельцаПрав = ТипЗнч(Параметры.СсылкаНаОбъект); - ОписанияВозможныхПрав = Права.ПоТипамСсылок.Получить(ТипСсылкиВладельцаПрав); + ОписанияВозможныхПрав = ВозможныеПраваДляНастройки.ПоТипамСсылок.Получить(ТипСсылкиВладельцаПрав); ОписаниеТиповПсевдоФлажка = Новый ОписаниеТипов("Булево, Число", Новый КвалификаторыЧисла(1, 0, ДопустимыйЗнак.Неотрицательный)); diff --git a/SSL/src/CommonForms/НастройкиСинхронизацииДанных/Form.form b/SSL/src/CommonForms/НастройкиСинхронизацииДанных/Form.form index 06c0e534f..7febc4a42 100644 --- a/SSL/src/CommonForms/НастройкиСинхронизацииДанных/Form.form +++ b/SSL/src/CommonForms/НастройкиСинхронизацииДанных/Form.form @@ -216,7 +216,6 @@ UsualGroup Vertical - Auto true true Auto @@ -243,7 +242,6 @@ UsualGroup - Auto NormalSeparation true true @@ -490,7 +488,6 @@ UsualGroup - Auto true true @@ -568,6 +565,7 @@ true Label true + Center URLProcessing @@ -598,7 +596,6 @@ UsualGroup HorizontalIfPossible - Auto true true @@ -608,6 +605,348 @@ Auto + + ИнформационнаяПанельОбнаруженоЗацикливание + 769 + + ПредупреждениеОЗацикливанииКартинка + 771 + + <key>ru</key> + <value>Предупреждение о зацикливании картинка</value> + + true + true + + true + + + ПредупреждениеОЗацикливанииКартинкаРасширеннаяПодсказка + 773 + Label + true + true + + Left + + + + ПредупреждениеОЗацикливанииКартинкаКонтекстноеМеню + 772 + true + + 3 + true + 2 + true + + + CommonPicture.Предупреждение32 + + + + + ПредупреждениеОЗацикливанииОписание + 774 + + <key>ru</key> + <value>Обнаружено зацикливание синхронизаций. Для получения подробной информации перейдите по <link 1>ссылке</>.</value> + + true + true + + true + + + ПредупреждениеОЗацикливанииОписаниеРасширеннаяПодсказка + 776 + Label + true + true + + Left + + + + ПредупреждениеОЗацикливанииОписаниеКонтекстноеМеню + 775 + true + + true + Label + true + true + Center + + + URLProcessing + ПредупреждениеОЗацикливанииОписаниеОбработкаНавигационнойСсылки + + Left + + + true + true + + true + + + <key>ru</key> + <value>Предупреждение</value> + + + ИнформационнаяПанельОбнаруженоЗацикливаниеРасширеннаяПодсказка + 770 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + + Style.ЦветФонаПредупреждения + + Auto + Auto + + + + ИнформационнаяПанельОтключенныеСценариях + 788 + + ПредупреждениеОбОтключенныхСценарияхКартинка + 790 + + <key>ru</key> + <value>Предупреждение об отключенных сценариях</value> + + true + true + + true + + + ПредупреждениеОбОтключенныхСценарияхКартинкаРасширеннаяПодсказка + 792 + Label + true + true + + Left + + + + ПредупреждениеОбОтключенныхСценарияхКартинкаКонтекстноеМеню + 791 + true + + 3 + true + 2 + true + + + CommonPicture.Предупреждение32 + + + + + ПредупреждениеОбОтключенныхСценарияхОписание + 793 + + <key>ru</key> + <value>Отключенные сценарии</value> + + true + true + + true + + + ПредупреждениеОбОтключенныхСценарияхОписаниеРасширеннаяПодсказка + 795 + Label + true + true + + Left + + + + ПредупреждениеОбОтключенныхСценарияхОписаниеКонтекстноеМеню + 794 + true + + Label + true + true + Center + + + URLProcessing + ПредупреждениеОЗацикливанииОписаниеОбработкаНавигационнойСсылки + + Left + + + true + true + + true + + + <key>ru</key> + <value>Предупреждение</value> + + + ИнформационнаяПанельОтключенныеСценарияхРасширеннаяПодсказка + 789 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + + Style.ЦветФонаПредупреждения + + Auto + Auto + + + + ИнформационнаяПанельПереходНаИнтернет + 777 + + ИнформацияОПереходеНаИнтернетКартинка + 779 + + <key>ru</key> + <value>Информация о переходе на интернет (картинка)</value> + + true + true + + true + + + ИнформацияОПереходеНаИнтернетКартинкаРасширеннаяПодсказка + 781 + Label + true + true + + Left + + + + ИнформацияОПереходеНаИнтернетКартинкаКонтекстноеМеню + 780 + true + + 3 + true + 2 + true + + + StdPicture.Information + + Proportionally + 200 + + + + ИнформацияОПереходеНаИнтернетОписание + 782 + + <key>ru</key> + <value>Для некоторых синхронизаций есть возможность настроить обмен через Интернет (веб-сервис). +Это позволит ускорить обмен и более гибко настроить график синхронизации. +Для перехода на обмен посредством веб-сервиса, воспользуйтесь помощником перехода в списке <img 0:2d40609d-b56f-4082-9a6f-8216817ebd24/>. + +<link НеПредлагатьПерейтиНаВебСервис>Больше не предлагать перейти на веб-сервис</>. (Вызвать помощник перехода можно через меню узла синхронизации <b>Ещё</>)</value> + + true + true + + true + + + ИнформацияОПереходеНаИнтернетОписаниеРасширеннаяПодсказка + 784 + Label + true + true + + Left + + + + ИнформацияОПереходеНаИнтернетОписаниеКонтекстноеМеню + 783 + true + + true + Label + true + true + Center + + + URLProcessing + ИнформацияОПереходеНаИнтернетОписаниеОбработкаНавигационнойСсылки + + Left + + + true + true + + true + + + <key>ru</key> + <value>Предупреждение</value> + + + ru + Информационная панель обнаружено зацикливание + + + ИнформационнаяПанельПереходНаИнтернетРасширеннаяПодсказка + 778 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + + Web.PaleGreen + + Auto + Auto + + ПанельСписокПриложений 701 @@ -1824,6 +2163,56 @@ true + + СписокПриложенийДоступенПереходНаWS + 785 + true + true + + true + + + СписокПриложений.ДоступенПереходНаWS + + None + + СписокПриложенийДоступенПереходНаWSРасширеннаяПодсказка + 787 + Label + true + true + + Left + + + + СписокПриложенийДоступенПереходНаWSКонтекстноеМеню + 786 + true + + PictureField + Auto + true + + StdPicture.Setting + + Left + true + + true + true + true + true + + CommonPicture.СинхронизацияДанныхНастройка + + + + 1 + + AsFileRef + + СписокПриложенийРасписаниеНастроено 641 @@ -2482,7 +2871,11 @@ ИзменитьПрефиксИБ - 769 + 796 + + <key>ru</key> + <value>Изменить</value> + true true @@ -2490,7 +2883,7 @@ ИзменитьПрефиксИБРасширеннаяПодсказка - 770 + 797 Label true true @@ -2562,7 +2955,6 @@ HorizontalIfPossible Right - Auto WeakSeparation true true @@ -2593,7 +2985,6 @@ AlwaysHorizontal Center - Auto true true Auto @@ -3191,6 +3582,23 @@ true + + ДоступенПереходНаWS + + <key>ru</key> + <value>Доступен переход на WS</value> + + 26 + + Boolean + + + true + + + true + + ЕстьПраваНаАдминистрированиеОбменов @@ -3405,6 +3813,19 @@ true + + ДоступенExchangeAdministrationManage_3_0_1_1 + 4 + + Boolean + + + true + + + true + + ИндексСтрокиСписокПриложений @@ -3441,6 +3862,62 @@ true + + ДоступенПереходНаWS + 6 + + Boolean + + + true + + + true + + + + ОбнаруженоЗацикливание + 7 + + Boolean + + + true + + + true + + + + ОтключенныеСценарии + 11 + + ValueList + + + true + + + true + + + + + + + ИзменитьПрефиксИБ + 12 + + String + + + + true + + + true + + ОбновитьМонитор @@ -3819,7 +4296,7 @@ <name>ИзменитьПрефиксИБ</name> <title> <key>ru</key> - <value>Изменить</value> + <value>Изменить префикс ИБ</value> 13 diff --git a/SSL/src/CommonForms/НастройкиСинхронизацииДанных/Module.bsl b/SSL/src/CommonForms/НастройкиСинхронизацииДанных/Module.bsl index 6e2d3aa99..b6e95951f 100644 --- a/SSL/src/CommonForms/НастройкиСинхронизацииДанных/Module.bsl +++ b/SSL/src/CommonForms/НастройкиСинхронизацииДанных/Module.bsl @@ -64,7 +64,8 @@ Или ИмяСобытия = "Запись_СценарииОбменовДанными" Или ИмяСобытия = "Запись_УзелПланаОбмена" Или ИмяСобытия = "ЗакрытаФормаПомощникаСопоставленияОбъектов" - Или ИмяСобытия = "ЗакрытаФормаРезультатовОбменаДанными" Тогда + Или ИмяСобытия = "ЗакрытаФормаРезультатовОбменаДанными" + Или ИмяСобытия = "ЗакрытаФормаПомощникаПереходаНаИнтернетСоединение" Тогда ОбновитьДанныеМонитораВФоне(); @@ -75,7 +76,7 @@ ИначеЕсли ИмяСобытия = "НаборКонстант.ПрефиксУзлаРаспределеннойИнформационнойБазы" Тогда ПрефиксИБ = Параметр; - + КонецЕсли; КонецПроцедуры @@ -103,6 +104,18 @@ ВыполнитьКомандуСПредварительнойПроверкой("ОткрытьРезультатыСинхронизацииСобытияЗагрузки"); + ИначеЕсли Поле.Имя = "СписокПриложенийДоступенПереходНаWS" Тогда + + ТекущиеДанные = Элементы.СписокПриложений.ТекущиеДанные; + + Если ТекущиеДанные.ДоступенПереходНаWS Тогда + + ПараметрыФормы = Новый Структура("УзелОбмена", ТекущиеДанные.УзелИнформационнойБазы); + ОткрытьФорму("Обработка.ПомощникСозданияОбменаДанными.Форма.ПереходНаИнтернетСоединение", + ПараметрыФормы, ЭтаФорма,,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + + КонецЕсли; + Иначе ВыполнитьКомандуСПредварительнойПроверкой("ИзменитьНастройкиСинхронизации"); @@ -324,10 +337,12 @@ ИначеЕсли ОписаниеСтрокиПриложения.ЗапускОбменаИзКорреспондента И НЕ РезультатыПроверок.ПолученоСообщениеДляСопоставления Тогда - ШаблонПредупреждения = НСтр("ru = 'Запуск синхронизации с ""%1"" из этой программы не поддерживается. - |Перейдите в ""%1"" и запустите синхронизацию из нее.'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + ТексПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Запуск синхронизации с ""%1"" из этой программы не поддерживается. + |Перейдите в ""%1"" и запустите синхронизацию из нее.'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), + ТекущиеДанные.НаименованиеКорреспондента); - ПоказатьПредупреждение(, СтрШаблон(ШаблонПредупреждения, ТекущиеДанные.НаименованиеКорреспондента)); + ПоказатьПредупреждение(,ТексПредупреждения); ИначеЕсли НЕ ОписаниеСтрокиПриложения.ЭтоОбменСПриложениемВСервисе И НЕ РезультатыПроверок.ПравилаКонвертацииСовместимы Тогда @@ -414,6 +429,7 @@ ОтборТипыПредупреждений.Добавить(ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.НепроведенныйДокумент")); ОтборТипыПредупреждений.Добавить(ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.НезаполненныеРеквизиты")); ОтборТипыПредупреждений.Добавить(ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриПолученииДанных")); + ОтборТипыПредупреждений.Добавить(ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.СообщениеОбменаНеПомещеноВАрхив")); Если КэшЗначений.ПодсистемаВерсионированияСуществует Тогда @@ -1223,6 +1239,28 @@ КонецПроцедуры +&НаКлиенте +Процедура ПредупреждениеОЗацикливанииОписаниеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ОткрытьФорму("РегистрСведений.КонтурСинхронизации.Форма.ЗацикливаниеСинхронизации",,,,,,, + РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + +КонецПроцедуры + +&НаКлиенте +Процедура ИнформацияОПереходеНаИнтернетОписаниеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + + СтандартнаяОбработка = Истина; + + Элементы.ИнформационнаяПанельПереходНаИнтернет.Видимость = Ложь; + + МодульОбменДаннымиВнутренняяПубликацияВызовСервера = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбменДаннымиВнутренняяПубликацияВызовСервера"); + МодульОбменДаннымиВнутренняяПубликацияВызовСервера.ФлагНастройкиНеПредлагатьПерейтиНаВебСервис( + "НастройкиСинхронизацииДанных", Истина); + +КонецПроцедуры + &НаСервереБезКонтекста Функция АктуализироватьИнформациюОПроблемахСинхронизацииДанных(УзелСинхронизации) @@ -1541,7 +1579,8 @@ Если Не СтатусЗавершения.Отказ Тогда ТаблицаПриложений = СтатусЗавершения.Результат; - ПриложенияМоделиСервиса.Загрузить(ТаблицаПриложений.Скопировать(, "Корреспондент, ОбластьДанных, НаименованиеПриложения")); + Колонки = "Корреспондент, ОбластьДанных, НаименованиеПриложения, ДоступенExchangeAdministrationManage_3_0_1_1"; + ПриложенияМоделиСервиса.Загрузить(ТаблицаПриложений.Скопировать(,Колонки)); КонецЕсли; КонецЕсли; @@ -1573,12 +1612,42 @@ Элементы.ПравоОбновленияСтраницы.ТекущаяСтраница = Элементы.ИнформацияОбменДаннымиПриостановленНетПраваОбновления; КонецЕсли; - Элементы.ИнформационнаяПанельТребуетсяПерезагрузка.Видимость = ТребуетсяПерезагрузка; + Элементы.ИнформационнаяПанельТребуетсяПерезагрузка.Видимость = ТребуетсяПерезагрузка И СписокПриложений.Количество() > 0; + + Элементы.ИнформационнаяПанельОбнаруженоЗацикливание.Видимость = ОбнаруженоЗацикливание; + + Элементы.СписокПриложенийДоступенПереходНаWS.Видимость = ДоступенПереходНаWS; // Безусловное отключение видимости команд настройки расписания и загрузки правил в модели сервиса. Если МодельСервиса Тогда - Элементы.СписокПриложенийГруппаРасписаниеВыполненияОбмена.Видимость = Ложь; + Элементы.СписокПриложенийГруппаРасписаниеВыполненияОбмена.Видимость = Ложь; + + МодульОбменДаннымиВнутренняяПубликацияВызовСервера = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВнутренняяПубликацияВызовСервера"); + Элементы.ИнформационнаяПанельПереходНаИнтернет.Видимость = + ДоступенПереходНаWS + И Не МодульОбменДаннымиВнутренняяПубликацияВызовСервера.ФлагНастройкиНеПредлагатьПерейтиНаВебСервис("НастройкиСинхронизацииДанных"); + + Иначе + + Элементы.ИнформационнаяПанельПереходНаИнтернет.Видимость = Ложь; + + КонецЕсли; + + Элементы.ИнформационнаяПанельОтключенныеСценариях.Видимость = ОтключенныеСценарии.Количество() > 0; + + Если ОтключенныеСценарии.Количество() = 1 Тогда + + Шаблон = НСтр("ru = 'Обнаружен сценарий, который были отключен из-за ошибок выполнения: %1'"); + Текст = СтрШаблон(Шаблон, ОтключенныеСценарии[0].Значение); + Элементы.ПредупреждениеОбОтключенныхСценарияхОписание.Заголовок = Текст; + + ИначеЕсли ОтключенныеСценарии.Количество() > 1 Тогда + + Шаблон = НСтр("ru = 'Обнаружены сценарии, которые были отключены из-за ошибок выполнения: %1'"); + МассивСценариев = ОтключенныеСценарии.ВыгрузитьЗначения(); + Текст = СтрШаблон(Шаблон, СтрСоединить(МассивСценариев, ", ")); + Элементы.ПредупреждениеОбОтключенныхСценарияхОписание.Заголовок = Текст; КонецЕсли; @@ -1611,6 +1680,8 @@ СписокПриложений.Загрузить(ТаблицаМонитора); + ДоступенПереходНаWS = Ложь; + Для Каждого СтрокаПриложение Из СписокПриложений Цикл УстановитьПривилегированныйРежим(Истина); @@ -1627,6 +1698,8 @@ СтрокаПриложение.ЭтоОбменСПриложениемВСервисе = Истина; СтрокаПриложение.ОбластьДанных = СтрокаПриложениеМоделиСервиса.ОбластьДанных; СтрокаПриложение.НаименованиеКорреспондента = СтрокаПриложениеМоделиСервиса.НаименованиеПриложения; + СтрокаПриложение.ДоступенПереходНаWS = СтрокаПриложениеМоделиСервиса.ДоступенExchangeAdministrationManage_3_0_1_1 + И СтрокаПриложение.ДоступенПереходНаWS; КонецЕсли; Если СтрокаПриложение.ЭтоОбменСПриложениемВСервисе Тогда @@ -1697,7 +1770,9 @@ СтрокаПриложение.СостояниеЗагрузкиКартинка = 5; КонецЕсли; - СтрокаПриложение.ИспользуютсяПравилаКонвертации = ОбменДаннымиПовтИсп.ЕстьМакетПланаОбмена(СтрокаПриложение.ИмяПланаОбмена, "ПравилаОбмена") + СтрокаПриложение.ИспользуютсяПравилаКонвертации = ОбменДаннымиПовтИсп.ЕстьМакетПланаОбмена(СтрокаПриложение.ИмяПланаОбмена, "ПравилаОбмена"); + + ДоступенПереходНаWS = Макс(ДоступенПереходНаWS, СтрокаПриложение.ДоступенПереходНаWS); КонецЦикла; @@ -1709,8 +1784,30 @@ ТребуетсяПерезагрузка = Справочники.ВерсииРасширений.РасширенияИзмененыДинамически(); КонецЕсли; + ОбнаруженоЗацикливание = ОбменДаннымиКонтрольЗацикливания.ЕстьЗацикливание(); + + ПолучитьОтключенныеСценарии(); + УстановитьОтображениеЭлементовФормы(); КонецПроцедуры +&НаСервере +Процедура ПолучитьОтключенныеСценарии() + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | СценарииОбменовДанными.Ссылка КАК Ссылка + |ИЗ + | Справочник.СценарииОбменовДанными КАК СценарииОбменовДанными + |ГДЕ + | СценарииОбменовДанными.ОтключенАвтоматически + | И НЕ СценарииОбменовДанными.ПометкаУдаления"; + + Массив = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");; + ОтключенныеСценарии.ЗагрузитьЗначения(Массив); + +КонецПроцедуры + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form index 5c39a05ec..10db25be7 100644 --- a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form +++ b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form @@ -98,6 +98,10 @@ СертификатыТолькоДействующие Right + + ru + Только действующие сертификаты + OnChange СертификатыТолькоДействующиеПриИзменении @@ -244,7 +248,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -276,7 +279,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -287,66 +289,11 @@ СертификатыКоманднаяПанельСписка 266 - - СертификатыСоздать - 135 - - <key>ru</key> - <value>Добавить...</value> - - true - - true - - - СертификатыСоздатьРасширеннаяПодсказка - 136 - Label - true - true - - Left - - - Form.Item.Сертификаты.StandardCommand.Create - Normal - Auto - true - true - UserCmds - Auto - - СертификатыДобавить - 344 + ГруппаДобавитьСертификаты + 463 - ДобавитьЗаявлениеНаВыпускСертификата - 346 - true - true - - true - - - ДобавитьЗаявлениеНаВыпускСертификатаРасширеннаяПодсказка - 347 - Label - true - true - - Left - - - Form.Command.ДобавитьЗаявлениеНаВыпускСертификата - Normal - Auto - true - true - UserCmds - Auto - - - ДобавитьИзУстановленныхНаКомпьютере + ДобавитьДляПодписанияИШифрования 348 true true @@ -354,7 +301,7 @@ true - ДобавитьИзУстановленныхНаКомпьютереРасширеннаяПодсказка + ДобавитьДляПодписанияИШифрованияРасширеннаяПодсказка 349 Label true @@ -363,7 +310,135 @@ Left - Form.Command.ДобавитьИзУстановленныхНаКомпьютере + Form.Command.ДобавитьДляПодписанияИШифрования + Normal + Auto + true + true + UserCmds + Balloon + Auto + + + ГруппаТолькоДляШифрования + 455 + + ДобавитьТолькоДляШифрования + 457 + true + true + + true + + + ДобавитьТолькоДляШифрованияРасширеннаяПодсказка + 458 + Label + true + true + + Left + + + Form.Command.ДобавитьТолькоДляШифрования + Normal + Auto + true + true + UserCmds + Auto + + + ДобавитьИзФайлов + 459 + true + true + + true + + + ДобавитьИзФайловРасширеннаяПодсказка + 460 + Label + true + true + + Left + + + Form.Command.ДобавитьИзФайлов + Normal + Auto + true + true + UserCmds + Auto + + + ДобавитьИзКаталога + 461 + true + true + + true + + + ДобавитьИзКаталогаРасширеннаяПодсказка + 462 + Label + true + true + + Left + + + Form.Command.ДобавитьИзКаталога + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Добавить только для шифрования</value> + + + ГруппаТолькоДляШифрованияРасширеннаяПодсказка + 456 + Label + true + true + + Left + + + + + + Создать + 465 + true + + true + + + СоздатьРасширеннаяПодсказка + 466 + Label + true + true + + Left + + + Form.Item.Сертификаты.StandardCommand.Create Normal Auto true @@ -378,11 +453,11 @@ <key>ru</key> - <value>Добавить</value> + <value>Добавить...</value> - СертификатыДобавитьРасширеннаяПодсказка - 345 + ГруппаДобавитьСертификатыРасширеннаяПодсказка + 464 Label true true @@ -392,10 +467,39 @@ Popup - Auto + + StdPicture.CreateListItem + + PictureAndText Normal + + ДобавитьЗаявлениеНаВыпускСертификата + 346 + true + true + + true + + + ДобавитьЗаявлениеНаВыпускСертификатаРасширеннаяПодсказка + 347 + Label + true + true + + Left + + + Form.Command.ДобавитьЗаявлениеНаВыпускСертификата + Normal + Auto + true + true + UserCmds + Auto + ПеревыпуститьСертификат 353 @@ -424,9 +528,13 @@ Form.Item.Сертификаты.StandardCommand.Copy Normal + PictureAndText true true UserCmds + + StdPicture.CloneListItem + Auto @@ -980,7 +1088,6 @@ true - true ГруппаПользовательскихНастроек @@ -1082,7 +1189,6 @@ UsualGroup AlwaysHorizontal - Auto WeakSeparation true true @@ -1185,7 +1291,6 @@ UsualGroup AlwaysHorizontal - Auto WeakSeparation true true @@ -1287,7 +1392,6 @@ UsualGroup AlwaysHorizontal - Auto WeakSeparation true true @@ -1389,7 +1493,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -1496,14 +1599,14 @@ - ГруппаВебКлиентРасширениеНеУстановлено - 171 + ГруппаПодсказкаКриптопровайдеры + 436 - ПояснениеВебКлиентРасширениеНеУстановлено - 165 + ДекорацияИнформацияКриптопровайдеры + 438 <key>ru</key> - <value>В браузере не установлено расширение для работы с электронной подписью и шифрованием. Невозможно проверить, какие из программ установлены на компьютере.</value> + <value>Декорация информация</value> true true @@ -1511,8 +1614,8 @@ true - ПояснениеВебКлиентРасширениеНеУстановленоРасширеннаяПодсказка - 167 + ДекорацияИнформацияКриптопровайдерыРасширеннаяПодсказка + 440 Label true true @@ -1521,30 +1624,33 @@ - ПояснениеВебКлиентРасширениеНеУстановленоКонтекстноеМеню - 166 + ДекорацияИнформацияКриптопровайдерыКонтекстноеМеню + 439 true - Label true - - Style.ПоясняющийОшибкуТекст - - - Left + + + StdPicture.Information + + AsFileRef - - УстановитьРасширение - 297 + + ДекорацияПроверкаУстановкиКриптопровайдера + 447 + + <key>ru</key> + <value><link ПроверитьУстановкуПрограммКриптографии>Нажмите здесь</>, чтобы увидеть все установленные на компьютере программы для работы с электронной подписью. </value> + true true true - УстановитьРасширениеРасширеннаяПодсказка - 298 + ДекорацияПроверкаУстановкиКриптопровайдераРасширеннаяПодсказка + 449 Label true true @@ -1552,14 +1658,22 @@ Left - UsualButton - Form.Command.УстановитьРасширение - Normal - Auto - true + + ДекорацияПроверкаУстановкиКриптопровайдераКонтекстноеМеню + 448 + true + + true + Label + 100 true - UserCmds - Auto + + + URLProcessing + ДекорацияПроверкаУстановкиКриптопровайдераОбработкаНавигационнойСсылки + + Left + true true @@ -1568,11 +1682,11 @@ <key>ru</key> - <value>Веб клиент расширение не установлено</value> + <value>Подсказка о криптопровайдерах</value> - ГруппаВебКлиентРасширениеНеУстановленоРасширеннаяПодсказка - 172 + ГруппаПодсказкаКриптопровайдерыРасширеннаяПодсказка + 437 Label true true @@ -1582,8 +1696,8 @@ UsualGroup - HorizontalIfPossible - Auto + AlwaysHorizontal + NormalSeparation true true Auto @@ -1724,6 +1838,71 @@ UserCmds Auto + + + <key>ru</key> + <value>Программы поиск</value> + + true + true + + true + + ПрограммыПоиск + 467 + + ПрограммыПоискРасширеннаяПодсказка + 469 + Label + true + true + + Left + + + + ПрограммыПоискКонтекстноеМеню + 468 + true + + Программы + + true + + + + + <key>ru</key> + <value>Программы поиск управление</value> + + true + true + + true + + ПрограммыПоискУправление + 470 + + ПрограммыПоискУправлениеРасширеннаяПодсказка + 472 + Label + true + true + + Left + + + + ПрограммыПоискУправлениеКонтекстноеМеню + 471 + true + + SearchControlAddition + Программы + + true + + true true @@ -1818,23 +1997,20 @@ - ПрограммыРезультатПроверки - 223 - - <key>ru</key> - <value>Результат проверки</value> - + ПрограммыРежимИспользованияКартинка + 452 true true true - Программы.РезультатПроверки + Программы.РежимИспользованияКартинка + None - ПрограммыРезультатПроверкиРасширеннаяПодсказка - 225 + ПрограммыРежимИспользованияКартинкаРасширеннаяПодсказка + 454 Label true true @@ -1843,26 +2019,149 @@ - ПрограммыРезультатПроверкиКонтекстноеМеню - 224 + ПрограммыРежимИспользованияКартинкаКонтекстноеМеню + 453 true - InputField - Auto - true + PictureField + Enter true + + StdPicture.Change + Left - true - - 40 + + + StdPicture.Change + + + + 1 + + AsFileRef + + + + ПрограммыГруппаРезультатПроверки + 445 + + ПрограммыРезультатПроверки + 223 + + <key>ru</key> + <value>На компьютере</value> + + true + true + + true + + + Программы.РезультатПроверки + + None + + ПрограммыРезультатПроверкиРасширеннаяПодсказка + 225 + Label + true + true + + Left + + + + ПрограммыРезультатПроверкиКонтекстноеМеню + 224 + true + + InputField + Auto + true + Left + true + + 40 + true + true + true + true + true + true + true + Normal + + + + ПрограммыРезультатПроверкиНаСервере + 442 + + <key>ru</key> + <value>На сервере</value> + + true + true + + true + + + Программы.РезультатПроверкиНаСервере + + None + + ПрограммыРезультатПроверкиНаСервереРасширеннаяПодсказка + 444 + Label + true + true + + Left + + + + ПрограммыРезультатПроверкиНаСервереКонтекстноеМеню + 443 + true + + InputField + Enter + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Результат проверки</value> + + + ПрограммыГруппаРезультатПроверкиРасширеннаяПодсказка + 446 + Label true true - true - true - true - true - true - Normal + + Left + + + ColumnGroup + + Vertical + auto + true + true @@ -2227,10 +2526,10 @@ true true - Программы.НомерКартинки + Программы.ТипРазмещения - CommonPicture.ПиктограммыЭлементов + CommonPicture.ТипыСертификатов true @@ -2325,7 +2624,6 @@ UsualGroup Vertical - Auto true true auto @@ -2917,6 +3215,33 @@ Auto InAdditionalSubmenu + + ФормаУстановитьРасширение + 450 + true + true + + true + + + ФормаУстановитьРасширениеРасширеннаяПодсказка + 451 + Label + true + true + + Left + + + Form.Command.УстановитьРасширение + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + ФормаТехническаяИнформация 432 @@ -3334,23 +3659,6 @@ true - - НомерКартинки - 10 - - Number - - 1 - true - - - - true - - - true - - ПометкаУдаления 12 @@ -3411,6 +3719,113 @@ true + + РезультатПроверкиНаСервере + + <key>ru</key> + <value>Результат проверки на сервере</value> + + 23 + + String + + + + true + + + true + + + + ПутьКПрограммеАвто + 26 + + String + + + + true + + + true + + + + ПутьКПрограммеНаСервереАвто + 27 + + String + + + + true + + + true + + + + УстановленаНаСервере + 29 + + Boolean + String + + + + true + + + true + + + + РежимИспользования + 31 + + EnumRef.РежимыИспользованияПрограммыЭлектроннойПодписи + + + true + + + true + + + + Автоопределение + 33 + + Boolean + + + true + + + true + + + + РежимИспользованияКартинка + + <key>ru</key> + <value>Режим использования картинка</value> + + 34 + + Number + + 10 + + + + true + + + true + + СертификатыПоказать @@ -3594,7 +4009,7 @@ СертификатыТолькоДействующие <key>ru</key> - <value>Только действующие сертификаты</value> + <value>Только действующие</value> 20 @@ -3623,6 +4038,46 @@ + + ЕстьПравоНаДобавлениеСертификатов + 36 + + Boolean + + + true + + + true + + + + НазначениеДляПодписанияИШифрования + 38 + + String + + + + true + + + true + + + + ЕстьПроверяемыеПрограммы + 39 + + Boolean + + + true + + + true + + Обновить @@ -3679,7 +4134,7 @@ <name>УстановитьРасширение</name> <title> <key>ru</key> - <value>Установить расширение</value> + <value>Установить расширение для работы с криптографией</value> 2 @@ -3701,43 +4156,47 @@ ДобавитьЗаявлениеНаВыпускСертификата <key>ru</key> - <value>Заявление на выпуск сертификата</value> + <value>Оформить заявление...</value> 3 ru - Заявление на выпуск сертификата + Оформить заявление на выпуск сертификата true + + CommonPicture.ЗаявлениеНаВыпускСертификатаКлюча + ДобавитьЗаявлениеНаВыпускСертификата + TextPicture DontUse Auto - ДобавитьИзУстановленныхНаКомпьютере + ДобавитьДляПодписанияИШифрования <key>ru</key> - <value>Из установленных на компьютере...</value> + <value>Для подписания и шифрования...</value> 5 - - ru - Из установленных на компьютере ... - true + + CommonPicture.СертификатВЛичномХранилище + - ДобавитьИзУстановленныхНаКомпьютере + ДобавитьДляПодписанияИШифрования + TextPicture DontUse Auto @@ -3803,6 +4262,72 @@ Auto Auto + + ДобавитьИзКаталога + + <key>ru</key> + <value>Только для шифрования из каталога...</value> + + 9 + + true + + + CommonPicture.СертификатКлюча + + + + ДобавитьИзКаталога + + + TextPicture + Auto + Auto + + + ДобавитьИзФайлов + + <key>ru</key> + <value>Только для шифрования из файлов...</value> + + 10 + + true + + + CommonPicture.СертификатКлюча + + + + ДобавитьИзФайлов + + + TextPicture + DontUse + Auto + + + ДобавитьТолькоДляШифрования + + <key>ru</key> + <value>Только для шифрования из личного хранилища...</value> + + 11 + + true + + + CommonPicture.СертификатВЛичномХранилище + + + + ДобавитьТолькоДляШифрования + + + TextPicture + Auto + Auto + СертификатыПоказать diff --git a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Help/ru.html b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Help/ru.html index 66e47ffad..ebfdf08f1 100644 --- a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Help/ru.html +++ b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Help/ru.html @@ -5,6 +5,7 @@

        Для того чтобы подписывать данные, нужно включить флажок Электронная подпись, а для шифрования нужно включить флажок Шифрование в разделе Администрирование - Общие настройки. После этого становятся доступными соответствующие команды в программе.

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

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

        +

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

        Сертификаты

        • Показывает все сертификаты, которые используются для подписания и шифрования данных, а также заявления на выпуск нового сертификата.
        • @@ -16,21 +17,15 @@
          • Сертификат только для шифрования можно Добавить из файла. Выберите нужное действие и перейдите по ссылке, укажите путь к файлу на компьютере.
        • Также с помощью кнопки Добавить можно подготовить Заявление на выпуск нового сертификата.
        • Просмотреть сертификат или заявление на выпуск нового сертификата можно, дважды щелкнув по нему мышью. Также можно это сделать с помощью команды Изменить контекстного меню по правой кнопке мыши или меню Еще.

        Программы

        -
        • Содержит список программ, которые будут использованы в информационной базе (в том числе во всех узлах распределенной ИБ). +
          • Содержит список настроенных программ, которые будут использованы в информационной базе (в том числе во всех узлах распределенной ИБ). 
          • +
          • Данные программы не обязательно должны быть установлены на всех компьютерах. Более того, установка более одной программы на одном компьютере может вызвать конфликты между ними.
          • -
          • Эти программы не обязательно должны быть установлены на всех компьютерах. Более того, установка более одной программы на одном компьютере может вызвать конфликты между ними. -
          • -
          • После запуска в списке уже присутствуют две записи о программах, наиболее распространенных в России - ViPNet CSP и КриптоПро CSP. -
          • -
          • Можно добавить записи о других программах (поставляются готовые настройки для Microsoft Enhanced CSP, ViPNet CSP, КриптоПро CSP, ЛИССИ CSP, Сигнал-КОМ CSP). -
          • -
          • Если требуется использовать программу отличную от известных, тогда нужно указать ее имя, тип и алгоритмы, как указано в инструкции, поставляемой ее производителем. -
          • -
          • В колонке Результат проверки отражаются сведения, по которым можно понять установлена ли программа на компьютере или нет или же установлена, но некорректно. -
          • +
          • Если программа не установлена, то после установки компоненты будет предложена гиперссылка на загрузку дистрибутива ViPNet CSP или КриптоПро CSP, поддерживающие ГОСТ. 
          • +
          • По гиперссылке также можно перейти на домашние страницы других программ, соответствующих стандартам безопасности (например, ЛИССИ CSP, Сигнал-КОМ CSP). 
          • +
          • Если требуется использовать программу отличную от известных, тогда нужно указать ее имя, тип и алгоритмы, как указано в инструкции, поставляемой ее производителем.
          • +
          • В колонке Результат проверки отражаются сведения, по которым можно понять установлена ли программа на компьютере или нет или же установлена, но некорректно.
          • Linux: Путь к программе (<Имя программы, соответствующей выделенной строке в списке>) - поле, которое требуется обязательно заполнять на компьютерах под управлением ОС Linux.
          • -
          • В нижней части списка расположена ссылка Инструкция по работе с программами электронной подписи и шифрования. Перейдите по этой ссылке в соответствующий раздел 1С:ИТС, если имеются вопросы.

          Дополнительно

          -
          • Задайте Расширение для зашифрованных файлов при отправке по почте, при выполнении команды Сохранить как и при экспорте папки (по умолчанию .p7m).
          • Напишите Расширение для файлов подписи (по умолчанию .p7s).
            @@ -44,4 +39,5 @@
            Спрашивать - выбор сохраняемых подписей осуществляется из списка.
        • Включите флажок Сохранять сертификат для сохранения на компьютер сертификата вместе с файлом и электронной подписью.

        См. также:

        +
        • Перейдите по этой ссылке в соответствующий раздел 1С:ИТС, если имеются вопросы.

        Дополнительно

        \ No newline at end of file diff --git a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Module.bsl b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Module.bsl index 8b94ff4d4..788fd4d8c 100644 --- a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Module.bsl +++ b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Module.bsl @@ -18,6 +18,8 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ЭлектроннаяПодписьСлужебный.УстановитьВидимостьСсылкиНаИнструкциюПоРаботеСПрограммами(Элементы.Инструкция); + УстановитьУсловноеОформление(); ЭлектроннаяПодписьСлужебный.УстановитьУсловноеОформлениеСпискаСертификатов(Сертификаты, Истина); @@ -79,37 +81,33 @@ ТекстЗапроса = Сертификаты.ТекстЗапроса; ЗаявлениеНаВыпускСертификатаДоступно = ЭлектроннаяПодпись.ОбщиеНастройки().ЗаявлениеНаВыпускСертификатаДоступно; + Если ЗаявлениеНаВыпускСертификатаДоступно Тогда + МодульЗаявлениеНаВыпускНовогоКвалифицированногоСертификата = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата"); МодульЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ЗаполнитьСписокВыбораСостоянияЗаявления(Элементы.СертификатыПоказатьЗаявления.СписокВыбора); МодульЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ДополнитьЗапросСостояниемВСпискеСертификатов(ТекстЗапроса); МодульЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ДобавитьЛегенду(ЭтотОбъект, Элементы.ГруппаЛегенда); Элементы.СертификатыПоказать.СписокВыбора.Добавить("МоиЗаявленияВРаботе", НСтр("ru = 'Мои заявления в работе'")); СостоянияЗаявленияНеВРаботе = МодульЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.СостоянияЗаявленияНеВРаботе(); - - Если Не ПравоДоступа("Добавление", Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования) Тогда - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, - "СертификатыДобавить", "Видимость", Ложь); - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, - "ПеревыпуститьСертификат", "Видимость", Ложь); - КонецЕсли; + Элементы.ДобавитьЗаявлениеНаВыпускСертификата.Видимость = Истина; Иначе ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ДополнительноеПоле", "НЕОПРЕДЕЛЕНО"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ДополнительноеСоединение", ""); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ЭтоЗаявление", "Ложь"); - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, - "СертификатыСоздать", "Видимость", Истина); - - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, - "СертификатыДобавить", "Видимость", Ложь); ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "ПеревыпуститьСертификат", "Видимость", Ложь); + Элементы.СертификатыПоказатьЗаявления.Видимость = Ложь; Элементы.СертификатыСостояниеЗаявления.Видимость = Ложь; + Элементы.ДобавитьЗаявлениеНаВыпускСертификата.Видимость = Ложь; КонецЕсли; + ЕстьПравоНаДобавлениеСертификатов = + ПравоДоступа("Добавление", Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования); + СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка(); СвойстваСписка.ТекстЗапроса = ТекстЗапроса; ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.Сертификаты, СвойстваСписка); @@ -134,17 +132,11 @@ Элементы.ГруппаПрограммыLinuxПутьКПрограмме.Видимость = Ложь; КонецЕсли; - Элементы.ГруппаВебКлиентРасширениеНеУстановлено.Видимость = ОбщегоНазначения.ЭтоВебКлиент() + Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = ОбщегоНазначения.ЭтоВебКлиент() И Параметры.Свойство("РасширениеНеПодключено"); + Элементы.ФормаУстановитьРасширение.Видимость = ОбщегоНазначения.ЭтоВебКлиент(); ЗаполнитьПрограммыИНастройки(); - - Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда - МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS"); - Элементы.Программы.КартинкаСтрок = МодульСервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ТипыСертификатов"); - Элементы.Программы.ПутьКДаннымКартинкиСтроки = "Программы.ТипРазмещения"; - КонецЕсли; - ОбновитьТекущуюВидимостьЭлементов(); КонецПроцедуры @@ -164,7 +156,7 @@ Если ЗначениеЗаполнено(Параметры.СертификатыПоказать) Тогда СертификатыПоказать = Параметры.СертификатыПоказать; СертификатыОбновитьОтбор(ЭтотОбъект, СостоянияЗаявленияНеВРаботе); - КонецЕсли; + КонецЕсли; КонецПроцедуры @@ -172,7 +164,7 @@ Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Если ВРег(ИмяСобытия) = ВРег("Запись_СертификатыКлючейЭлектроннойПодписиИШифрования") Тогда - Если Параметр.Количество() = 0 Тогда + Если Не ЗначениеЗаполнено(Параметр) Тогда Элементы.Сертификаты.Обновить(); ИначеЕсли Параметр.Установлен Тогда ПодключитьОбработчикОжидания("ОбновитьСписокСертификатов", 0.1, Истина); @@ -192,7 +184,8 @@ Возврат; КонецЕсли; - Если ВРег(ИмяСобытия) = ВРег("Установка_РасширениеРаботыСКриптографией") Тогда + Если ВРег(ИмяСобытия) = ВРег("Установка_РасширениеРаботыСКриптографией") + Или ВРег(ИмяСобытия) = ВРег("Установка_КомпонентаExtraCryptoAPI") Тогда ОпределитьУстановленныеПрограммы(); Возврат; КонецЕсли; @@ -337,6 +330,25 @@ КонецПроцедуры +&НаКлиенте +Процедура ДекорацияПроверкаУстановкиКриптопровайдераОбработкаНавигационнойСсылки( + Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ПараметрыПроверки = Новый Структура; + ПараметрыПроверки.Вставить("УстанавливатьРасширение", Истина); + ПараметрыПроверки.Вставить("УстанавливатьКомпоненту", Истина); + ПараметрыПроверки.Вставить("ПредлагатьУстановитьПрограмму", Истина); + ПараметрыПроверки.Вставить("РасширенноеОписание", Истина); + + ОповещениеПослеПроверкиПрограмм = Новый ОписаниеОповещения( + "ОпределитьУстановленныеПрограммыПослеПроверкиПрограммКриптографии", ЭтотОбъект); + ЭлектроннаяПодписьСлужебныйКлиент.ПроверитьУстановкуПрограммКриптографии(ЭтотОбъект, ПараметрыПроверки, + Новый ОписаниеОповещения("ПослеПроверкиПрограммКриптографии", ЭтотОбъект, ОповещениеПослеПроверкиПрограмм)); + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыСертификаты @@ -345,18 +357,17 @@ Процедура СертификатыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; - ПараметрыСоздания = Новый Структура; + ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыДобавленияСертификата(); Если Копирование И ЗаявлениеНаВыпускСертификатаДоступно Тогда Если Элементы.Сертификаты.ТекущаяСтрока = Неопределено Тогда Возврат; КонецЕсли; ТекущиеДанные = СертификатыТекущиеДанные(Элементы.Сертификаты); - ПараметрыСоздания.Вставить("СоздатьЗаявление", Истина); - ПараметрыСоздания.Вставить("СертификатОснование", ТекущиеДанные.Ссылка); + ПараметрыСоздания.СоздатьЗаявление = Истина; + ПараметрыСоздания.СертификатОснование = ТекущиеДанные.Ссылка; Иначе - ПараметрыСоздания = Новый Структура; - ПараметрыСоздания.Вставить("СкрытьЗаявление", Не ЗаявлениеНаВыпускСертификатаДоступно); + ПараметрыСоздания.СкрытьЗаявление = Не ЗаявлениеНаВыпускСертификатаДоступно; КонецЕсли; ЭлектроннаяПодписьСлужебныйКлиент.ДобавитьСертификат(ПараметрыСоздания); @@ -395,7 +406,7 @@ |ПО | Ссылка"; Запрос.УстановитьПараметр("Ссылки", Строки.ПолучитьКлючи()); - РезультатЗапроса = Запрос.Выполнить(); + РезультатЗапроса = Запрос.Выполнить(); // @skip-check query-in-loop - Запрос выполняется один раз Если РезультатЗапроса.Пустой() Тогда Возврат; КонецЕсли; @@ -460,8 +471,17 @@ Если Элементы.Найти("ПрограммыИзменить") <> Неопределено И Элементы.ПрограммыИзменить.Видимость Тогда - - ПоказатьЗначение(, Элементы.Программы.ТекущиеДанные.Ссылка); + Если ЗначениеЗаполнено(Элементы.Программы.ТекущиеДанные.Ссылка) Тогда + ПоказатьЗначение(, Элементы.Программы.ТекущиеДанные.Ссылка); + Иначе + РасширенноеОписаниеПрограммы = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовоеРасширенноеОписаниеПрограммы(); + ЗаполнитьЗначенияСвойств(РасширенноеОписаниеПрограммы, Элементы.Программы.ТекущиеДанные); + РасширенноеОписаниеПрограммы.Представление = Элементы.Программы.ТекущиеДанные.Наименование; + ПараметрыФормы = Новый Структура("Программа, РежимИспользования", РасширенноеОписаниеПрограммы, + ПредопределенноеЗначение("Перечисление.РежимыИспользованияПрограммыЭлектроннойПодписи.Настроена")); + ОткрытьФорму("Справочник.ПрограммыЭлектроннойПодписиИШифрования.ФормаОбъекта", ПараметрыФормы, ЭтотОбъект,,,,, + РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + КонецЕсли; КонецЕсли; КонецПроцедуры @@ -491,18 +511,28 @@ ТекущиеДанные = Элементы.Программы.ТекущиеДанные; Если Поле = Элементы.ПрограммыПодробнее - И Не ПустаяСтрока(ТекущиеДанные.Подробнее)Тогда + И Не ПустаяСтрока(ТекущиеДанные.Подробнее) Тогда СтандартнаяОбработка = Ложь; ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ЗаголовокПредупреждения", НСтр("ru = 'Результат проверки программы'")); ПараметрыФормы.Вставить("ТекстОшибкиКлиент", ТекущиеДанные.РезультатПроверки); + ПараметрыФормы.Вставить("ТекстОшибкиСервер", ТекущиеДанные.РезультатПроверкиНаСервере); ПараметрыФормы.Вставить("ПоказатьТребуетсяПомощь", Истина); ПараметрыФормы.Вставить("ПоказатьИнструкцию", Истина); ОткрытьФорму("ОбщаяФорма.РасширенноеПредставлениеОшибки", ПараметрыФормы, ЭтотОбъект); - + + ИначеЕсли Не ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда + + СтандартнаяОбработка = Ложь; + ОписаниеПрограммы = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовоеРасширенноеОписаниеПрограммы(); + ЗаполнитьЗначенияСвойств(ОписаниеПрограммы, ТекущиеДанные); + ОписаниеПрограммы.Представление = ТекущиеДанные.Наименование; + ОткрытьФорму("Справочник.ПрограммыЭлектроннойПодписиИШифрования.Форма.ПрограммаОпределеннаяАвтоматически", + Новый Структура("Программа", ОписаниеПрограммы), ЭтотОбъект,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + КонецЕсли; КонецПроцедуры @@ -514,6 +544,7 @@ &НаКлиенте Процедура Обновить(Команда) + ЭлектроннаяПодписьСлужебныйКлиент.ОчиститьКэшУстановленныхКриптопровайдеров(); ЗаполнитьПрограммыИНастройки(Истина); ОпределитьУстановленныеПрограммы(); ОбновитьСписокСертификатов(); @@ -523,17 +554,46 @@ &НаКлиенте Процедура ДобавитьЗаявлениеНаВыпускСертификата(Команда) - ПараметрыСоздания = Новый Структура; - ПараметрыСоздания.Вставить("СоздатьЗаявление", Истина); - - ЭлектроннаяПодписьСлужебныйКлиент.ДобавитьСертификат(ПараметрыСоздания); + ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыДобавленияСертификата(); + ПараметрыСоздания.СоздатьЗаявление = Истина; + ЭлектроннаяПодписьСлужебныйКлиент.ДобавитьСертификатПослеВыбораНазначения("ЗаявлениеНаВыпускСертификата", + ПараметрыСоздания); КонецПроцедуры &НаКлиенте -Процедура ДобавитьИзУстановленныхНаКомпьютере(Команда) +Процедура ДобавитьДляПодписанияИШифрования(Команда) - ЭлектроннаяПодписьСлужебныйКлиент.ДобавитьСертификат(); + ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыДобавленияСертификата(); + ЭлектроннаяПодписьСлужебныйКлиент.ДобавитьСертификатПослеВыбораНазначения(НазначениеДляПодписанияИШифрования, + ПараметрыСоздания); + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьИзФайлов(Команда) + + ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыДобавленияСертификата(); + ЭлектроннаяПодписьСлужебныйКлиент.ДобавитьСертификатПослеВыбораНазначения("ТолькоДляШифрованияИзФайлов", + ПараметрыСоздания); + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьИзКаталога(Команда) + + ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыДобавленияСертификата(); + ЭлектроннаяПодписьСлужебныйКлиент.ДобавитьСертификатПослеВыбораНазначения("ТолькоДляШифрованияИзКаталога", + ПараметрыСоздания); + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьТолькоДляШифрования(Команда) + + ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыДобавленияСертификата(); + ЭлектроннаяПодписьСлужебныйКлиент.ДобавитьСертификатПослеВыбораНазначения("ТолькоДляШифрования", + ПараметрыСоздания); КонецПроцедуры @@ -575,6 +635,10 @@ Возврат; КонецЕсли; + Если Не ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда + Возврат; + КонецЕсли; + Если ТекущиеДанные.ПометкаУдаления Тогда ТекстВопроса = НСтр("ru = 'Снять с ""%1"" пометку на удаление?'"); Иначе @@ -673,6 +737,25 @@ ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("ПрограммыНаименование"); ЭлементОформляемогоПоля.Использование = Истина; + Если Элементы.ПрограммыРезультатПроверкиНаСервере.Видимость Тогда + ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); + + ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("TextColor"); + ЭлементЦветаОформления.Значение = Метаданные.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет.Значение; + ЭлементЦветаОформления.Использование = Истина; + + ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Программы.УстановленаНаСервере"); + ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбораДанных.ПравоеЗначение = Ложь; + ЭлементОтбораДанных.Использование = Истина; + + ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); + ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("ПрограммыРезультатПроверкиНаСервере"); + ЭлементОформляемогоПоля.Использование = Истина; + + КонецЕсли; + ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("TextColor"); @@ -793,6 +876,11 @@ Объект = Программа.ПолучитьОбъект(); Объект.ПометкаУдаления = Не Объект.ПометкаУдаления; + Если Объект.ПометкаУдаления Тогда + Объект.РежимИспользования = Перечисления.РежимыИспользованияПрограммыЭлектроннойПодписи.НеИспользуется; + Иначе + Объект.РежимИспользования = Перечисления.РежимыИспользованияПрограммыЭлектроннойПодписи.Настроена; + КонецЕсли; Объект.Записать(); ЗафиксироватьТранзакцию(); @@ -820,51 +908,7 @@ &НаСервере Процедура ОбновитьТекущуюВидимостьЭлементов() - Если Константы.ИспользоватьШифрование.Получить() - Или ЭлектроннаяПодпись.ОбщиеНастройки().ЗаявлениеНаВыпускСертификатаДоступно Тогда - - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, - "СертификатыСоздать", "Заголовок", НСтр("ru = 'Добавить...'")); - - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, - "СертификатыКонтекстноеМенюСоздать", "Заголовок", НСтр("ru = 'Добавить...'")); - - Элементы.РасширениеДляЗашифрованныхФайлов.Видимость = Истина; - Иначе - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, - "СертификатыСоздать", "Заголовок", НСтр("ru = 'Добавить'")); - - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, - "СертификатыКонтекстноеМенюСоздать", "Заголовок", НСтр("ru = 'Добавить'")); - - Элементы.РасширениеДляЗашифрованныхФайлов.Видимость = Ложь; - КонецЕсли; - - Если Константы.ИспользоватьШифрование.Получить() Тогда - Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда - Элементы.ДобавитьИзУстановленныхНаКомпьютере.Заголовок = - НСтр("ru = 'Из установленных на сервере DSS и на компьютере...'"); - ИначеЕсли ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда - Элементы.ДобавитьИзУстановленныхНаКомпьютере.Заголовок = - НСтр("ru = 'Из установленных в сервисе и на компьютере...'"); - Иначе - Элементы.ДобавитьИзУстановленныхНаКомпьютере.Заголовок = - НСтр("ru = 'Из установленных на компьютере...'"); - КонецЕсли; - Иначе - Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда - Элементы.ДобавитьИзУстановленныхНаКомпьютере.Заголовок = - НСтр("ru = 'Из установленных на сервере DSS и на компьютере...'"); - ИначеЕсли ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда - Элементы.ДобавитьИзУстановленныхНаКомпьютере.Заголовок = - НСтр("ru = 'Из установленных в сервисе и на компьютере'"); - Иначе - Элементы.ДобавитьИзУстановленныхНаКомпьютере.Заголовок = - НСтр("ru = 'Из установленных на компьютере'"); - КонецЕсли; - КонецЕсли; - - Если Константы.ИспользоватьЭлектронныеПодписи.Получить() Тогда + Если ЭлектроннаяПодпись.ИспользоватьЭлектронныеПодписи() Тогда Элементы.РасширениеДляФайловПодписи.Видимость = Истина; Элементы.ДействияПриСохраненииДанныхСЭлектроннойПодписью.Видимость = Истина; Иначе @@ -872,6 +916,55 @@ Элементы.ДействияПриСохраненииДанныхСЭлектроннойПодписью.Видимость = Ложь; КонецЕсли; + Элементы.РасширениеДляЗашифрованныхФайлов.Видимость = ЭлектроннаяПодпись.ИспользоватьШифрование(); + + Если Не ЕстьПравоНаДобавлениеСертификатов Тогда + + Элементы.ГруппаДобавитьСертификаты.Видимость = Ложь; + Элементы.ДобавитьЗаявлениеНаВыпускСертификата.Видимость = Ложь; + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( + Элементы, "ПеревыпуститьСертификат", "Видимость", Ложь); + Возврат; + КонецЕсли; + + Элементы.ДобавитьЗаявлениеНаВыпускСертификата.Видимость = ЗаявлениеНаВыпускСертификатаДоступно; + + Если ЭлектроннаяПодпись.ДобавлениеИзменениеЭлектронныхПодписей() Тогда + + Элементы.ДобавитьДляПодписанияИШифрования.Заголовок = НСтр("ru = 'Для подписания и шифрования...'"); + + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + Элементы.ДобавитьДляПодписанияИШифрования.РасширеннаяПодсказка.Заголовок = НСтр( + "ru = 'Добавить для подписания и шифрования из установленных на сервере DSS и на компьютере'"); + ИначеЕсли ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда + Элементы.ДобавитьДляПодписанияИШифрования.РасширеннаяПодсказка.Заголовок = НСтр( + "ru = 'Добавить для подписания и шифрования из установленных в сервисе и на компьютере'"); + Иначе + Элементы.ДобавитьДляПодписанияИШифрования.РасширеннаяПодсказка.Заголовок = НСтр( + "ru = 'Добавить для подписания и шифрования из установленных на компьютере'"); + КонецЕсли; + + НазначениеДляПодписанияИШифрования = "ДляПодписанияШифрованияИРасшифровки"; + + Иначе + + Элементы.ДобавитьДляПодписанияИШифрования.Заголовок = НСтр("ru = 'Для шифрования и расшифровки...'"); + + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + Элементы.ДобавитьДляПодписанияИШифрования.РасширеннаяПодсказка.Заголовок = НСтр( + "ru = 'Добавить для шифрования и расшифровки из установленных на сервере DSS и на компьютере'"); + ИначеЕсли ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда + Элементы.ДобавитьДляПодписанияИШифрования.РасширеннаяПодсказка.Заголовок = НСтр( + "ru = 'Добавить для шифрования и расшифровки из установленных в сервисе и на компьютере'"); + Иначе + Элементы.ДобавитьДляПодписанияИШифрования.РасширеннаяПодсказка.Заголовок = НСтр( + "ru = 'Добавить для шифрования и расшифровки из установленных на компьютере'"); + КонецЕсли; + + НазначениеДляПодписанияИШифрования = "ДляШифрованияИРасшифровки"; + + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -929,21 +1022,46 @@ Процедура ОбработчикОжиданияОпределитьУстановленныеПрограммыПослеПодключенияРасширения(Подключено, Контекст) Экспорт Если Не Подключено Тогда - Если Не Элементы.ГруппаВебКлиентРасширениеНеУстановлено.Видимость Тогда - УстановитьВидимостьГруппаВебКлиентРасширениеНеУстановлено(Истина); - КонецЕсли; + Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Истина; + Элементы.ДекорацияПроверкаУстановкиКриптопровайдера.Заголовок = СтроковыеФункцииКлиент.ФорматированнаяСтрока( + НСтр("ru = 'Нажмите здесь, чтобы установить расширение для работы с электронной подписью и увидеть все установленные на компьютере программы для работы с электронной подписью.'"), + "ПроверитьУстановкуПрограммКриптографии"); ПодключитьОбработчикОжидания("ОбработчикОжиданияОпределитьУстановленныеПрограммы", 3, Истина); Возврат; КонецЕсли; - Если Элементы.ГруппаВебКлиентРасширениеНеУстановлено.Видимость Тогда - УстановитьВидимостьГруппаВебКлиентРасширениеНеУстановлено(Ложь); - КонецЕсли; - ПутиКПрограммамПоУмолчанию.Очистить(); + ПараметрыПроверки = Новый Структура; + ПараметрыПроверки.Вставить("УстанавливатьРасширение", Ложь); + ПараметрыПроверки.Вставить("УстанавливатьКомпоненту", Ложь); + ПараметрыПроверки.Вставить("ПредлагатьУстановитьПрограмму", Ложь); + ПараметрыПроверки.Вставить("ПроверятьНаСервере", Ложь); + ПараметрыПроверки.Вставить("РасширенноеОписание", Истина); + + ОповещениеПослеПроверкиПрограмм = Новый ОписаниеОповещения( + "ОпределитьУстановленныеПрограммыПослеПроверкиПрограммКриптографии", ЭтотОбъект, Контекст); + + ЭлектроннаяПодписьСлужебныйКлиент.ПроверитьУстановкуПрограммКриптографии(ЭтотОбъект, ПараметрыПроверки, + Новый ОписаниеОповещения("ПослеПроверкиПрограммКриптографии", ЭтотОбъект, ОповещениеПослеПроверкиПрограмм)); + +КонецПроцедуры + +&НаКлиенте +Асинх Процедура ОпределитьУстановленныеПрограммыПослеПроверкиПрограммКриптографии(Результат, Контекст) Экспорт + + Подключено = Ждать ПодключитьРасширениеРаботыСКриптографиейАсинх(); + + Если Не Подключено Тогда + Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Истина; + Элементы.ДекорацияПроверкаУстановкиКриптопровайдера.Заголовок = СтроковыеФункцииКлиент.ФорматированнаяСтрока( + НСтр("ru = 'Нажмите здесь, чтобы установить расширение для работы с электронной подписью и увидеть все установленные на компьютере программы для работы с электронной подписью.'"), + "ПроверитьУстановкуПрограммКриптографии"); + КонецЕсли; + Контекст = Новый Структура; Контекст.Вставить("Индекс", -1); + Контекст.Вставить("РасширениеПодключено", Подключено); ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст); @@ -962,12 +1080,16 @@ КонецЕсли; Контекст.Индекс = Контекст.Индекс + 1; ОписаниеПрограммы = Программы.Получить(Контекст.Индекс); - + Контекст.Вставить("ОписаниеПрограммы", ОписаниеПрограммы); - ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьПутьКПрограммеПоУмолчанию(Новый ОписаниеОповещения( - "ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклПослеПолученияПутиКПрограмме", ЭтотОбъект, Контекст), - ОписаниеПрограммы.Ссылка); + Если ОписаниеПрограммы.Автоопределение Тогда + ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклПослеПолученияПутиКПрограмме(Неопределено, Контекст); + Иначе + ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьПутьКПрограммеПоУмолчанию(Новый ОписаниеОповещения( + "ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклПослеПолученияПутиКПрограмме", ЭтотОбъект, Контекст), + ОписаниеПрограммы.Ссылка); + КонецЕсли; КонецПроцедуры @@ -977,7 +1099,7 @@ ОписаниеПрограммы = Контекст.ОписаниеПрограммы; - Если ЗначениеЗаполнено(ОписаниеПути.ПутьКПрограмме) Тогда + Если ЗначениеЗаполнено(ОписаниеПути) И ЗначениеЗаполнено(ОписаниеПути.ПутьКПрограмме) Тогда НоваяСтрока = ПутиКПрограммамПоУмолчанию.Добавить(); НоваяСтрока.Программа = ОписаниеПрограммы.Ссылка; НоваяСтрока.Путь = ОписаниеПути.ПутьКПрограмме; @@ -987,6 +1109,7 @@ ОбновитьЗначение(ОписаниеПрограммы.РезультатПроверки, ""); ОбновитьЗначение(ОписаниеПрограммы.Подробнее, ""); ОбновитьЗначение(ОписаниеПрограммы.Установлена, ""); + ОбновитьЗначение(ОписаниеПрограммы.УстановленаНаСервере, ""); ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст); Возврат; ИначеЕсли ОписаниеПрограммы.ЭтоВстроенныйКриптопровайдер Тогда @@ -1001,6 +1124,11 @@ Возврат; КонецЕсли; + Если Не Контекст.РасширениеПодключено Тогда + ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст); + Возврат; + КонецЕсли; + ОписанияПрограмм = Новый Массив; ОписанияПрограмм.Добавить(Контекст.ОписаниеПрограммы); @@ -1033,7 +1161,12 @@ Если Менеджер <> Неопределено Тогда ОбновитьЗначение(ОписаниеПрограммы.РезультатПроверки, НСтр("ru = 'Установлена на компьютере.'")); - ОбновитьЗначение(ОписаниеПрограммы.Подробнее, ""); + Если ЗначениеЗаполнено(ОписаниеПрограммы.РезультатПроверкиНаСервере) + И ОписаниеПрограммы.УстановленаНаСервере <> Истина Тогда + ОбновитьЗначение(ОписаниеПрограммы.Подробнее, НСтр("ru = 'Подробнее'") + "..."); + Иначе + ОбновитьЗначение(ОписаниеПрограммы.Подробнее, ""); + КонецЕсли; ОбновитьЗначение(ОписаниеПрограммы.Установлена, Истина); ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст); Возврат; @@ -1068,6 +1201,13 @@ ПутьПоУмолчанию = ""; Если ТекущиеДанные <> Неопределено Тогда + Если ТекущиеДанные.Автоопределение Тогда + Элементы.ПрограммыLinuxПутьКПрограмме.КнопкаВыпадающегоСписка = Ложь; + Элементы.ПрограммыLinuxПутьКПрограмме.ТолькоПросмотр = Истина; + Элементы.ПрограммыLinuxПутьКПрограмме.ПодсказкаВвода = НСтр("ru = 'Определяется автоматически'"); + Возврат; + КонецЕсли; + Отбор = Новый Структура("Программа", ТекущиеДанные.Ссылка); Строки = ПутиКПрограммамПоУмолчанию.НайтиСтроки(Отбор); Если Строки.Количество() > 0 Тогда @@ -1077,6 +1217,7 @@ Элементы.ПрограммыLinuxПутьКПрограмме.КнопкаВыпадающегоСписка = ЗначениеЗаполнено(ПутьПоУмолчанию); Элементы.ПрограммыLinuxПутьКПрограмме.ПодсказкаВвода = ПутьПоУмолчанию; + Элементы.ПрограммыLinuxПутьКПрограмме.ТолькоПросмотр = Ложь; СписокВыбораПутей = Элементы.ПрограммыLinuxПутьКПрограмме.СписокВыбора; СписокВыбораПутей.Очистить(); @@ -1090,13 +1231,6 @@ КонецПроцедуры -&НаСервере -Процедура УстановитьВидимостьГруппаВебКлиентРасширениеНеУстановлено(Знач ВидимостьЭлемента) - - Элементы.ГруппаВебКлиентРасширениеНеУстановлено.Видимость = ВидимостьЭлемента; - -КонецПроцедуры - &НаКлиенте Процедура ПриИзмененииСоставаИлиНастроекПрограмм() @@ -1106,6 +1240,79 @@ КонецПроцедуры +&НаКлиенте +Процедура ПослеПроверкиПрограммКриптографии(Результат, Оповещение) Экспорт + + Если Не Результат.ПроверкаВыполнена Тогда + Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Истина; + Элементы.ДекорацияПроверкаУстановкиКриптопровайдера.Заголовок = СтроковыеФункцииКлиент.ФорматированнаяСтрока( + НСтр("ru = 'Нажмите здесь, чтобы увидеть все установленные на компьютере программы для работы с электронной подписью.'"), + "ПроверитьУстановкуПрограммКриптографии"); + // Локализация + ИначеЕсли Результат.ВозможенКонфликт Тогда + + МассивПрограмм = Новый Массив; + Для Каждого Программа Из Результат.Программы Цикл + Если ЗначениеЗаполнено(Программа.Программа) + И МассивПрограмм.Найти(Программа.Программа) = Неопределено Тогда + МассивПрограмм.Добавить(Программа.Программа); + КонецЕсли; + КонецЦикла; + + Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Истина; + Элементы.ДекорацияПроверкаУстановкиКриптопровайдера.Заголовок = СтроковыеФункцииКлиент.ФорматированнаяСтрока( + НСтр("ru = 'На вашем компьютере установлено несколько программ с алгоритмами ГОСТ: %1. + |Возможна некорректная работа из-за конфликта между ними. В этом случае программы следует удалить и после перезагрузки установить одну из них.'"), + СтрСоединить(МассивПрограмм, ", ")); + // Конец Локализация + Иначе + Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Ложь; + КонецЕсли; + + Если Результат.ПроверкаВыполнена Тогда + + Для Каждого Криптопровайдер Из Результат.Программы Цикл + + Если ЗначениеЗаполнено(Криптопровайдер.Программа) И Не ЕстьПроверяемыеПрограммы Тогда + ЕстьПроверяемыеПрограммы = Истина; + КонецЕсли; + + Найдено = Программы.НайтиСтроки(Новый Структура("ИмяПрограммы, ТипПрограммы", + Криптопровайдер.ИмяПрограммы, Криптопровайдер.ТипПрограммы)); + + Если Найдено.Количество() = 0 + Или ЭлектроннаяПодписьСлужебныйКлиентСервер.ИспользуютсяАвтоматическиеНастройки(Найдено[0].РежимИспользования) Тогда + + Если Найдено.Количество() = 0 Тогда + НоваяСтрока = Программы.Добавить(); + Иначе + НоваяСтрока = Найдено[0]; + КонецЕсли; + + ЗаполнитьЗначенияСвойств(НоваяСтрока, Криптопровайдер,, "Ссылка, ПутьКПрограммеНаСервереАвто"); + НоваяСтрока.LinuxПутьКПрограмме = НоваяСтрока.ПутьКПрограммеАвто; + НоваяСтрока.ТипРазмещения = 1; + НоваяСтрока.Автоопределение = Истина; + НоваяСтрока.РежимИспользованияКартинка = -1; + НоваяСтрока.Наименование = Криптопровайдер.Представление; + КонецЕсли; + + КонецЦикла; + + Если Не ЕстьПроверяемыеПрограммы Тогда + Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Истина; + Элементы.ДекорацияПроверкаУстановкиКриптопровайдера.Заголовок = СтроковыеФункцииКлиент.ФорматированнаяСтрока( + НСтр("ru = 'Если планируется работа с усиленной квалифицированной электронной подписью, то на компьютере должна быть установлена сертифицированная программа (средство криптографической защиты информации). + |Установить.'"), "ПроверитьУстановкуПрограммКриптографии"); + КонецЕсли; + КонецЕсли; + + Если Оповещение <> Неопределено Тогда + ВыполнитьОбработкуОповещения(Оповещение); + КонецЕсли; + +КонецПроцедуры + &НаСервере Процедура ЗаполнитьПрограммыИНастройки(ОбновитьПовтИсп = Ложь) @@ -1120,6 +1327,7 @@ РасширениеДляФайловПодписи = ПерсональныеНастройки.РасширениеДляФайловПодписи; ПутиКПрограммам = ПерсональныеНастройки.ПутиКПрограммамЭлектроннойПодписиИШифрования; СохранятьСертификатВместеСПодписью = ПерсональныеНастройки.СохранятьСертификатВместеСПодписью; + ЕстьПрограммыНаСервере = Ложь; Запрос = Новый Запрос; Запрос.Текст = @@ -1133,6 +1341,7 @@ | Программы.АлгоритмШифрования, | Программы.ПометкаУдаления КАК ПометкаУдаления, | Программы.ЭтоВстроенныйКриптопровайдер, + | Программы.РежимИспользования, | 1 КАК ТипРазмещения |ИЗ | Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК Программы @@ -1151,6 +1360,7 @@ | Программы.АлгоритмШифрования, | Программы.ПометкаУдаления, | Программы.ЭтоВстроенныйКриптопровайдер, + | ЗНАЧЕНИЕ(Перечисление.РежимыИспользованияПрограммыЭлектроннойПодписи.Настроена), | 4 |ИЗ | Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК Программы @@ -1171,14 +1381,71 @@ МодульСервисКриптографииDSSСлужебный.ДополнитьВыборкуПрограмм(ТаблицаВыборки); КонецЕсли; + ТаблицаВыборки.Колонки.Добавить("ПутьКПрограммеНаСервереАвто", Новый ОписаниеТипов("Строка")); + ТаблицаВыборки.Колонки.Добавить("РезультатПроверкиНаСервере", Новый ОписаниеТипов("Строка")); + ТаблицаВыборки.Колонки.Добавить("Автоопределение", Новый ОписаниеТипов("Булево")); + + Настройки = ЭлектроннаяПодпись.ОбщиеНастройки(); + Если Настройки.ПроверятьЭлектронныеПодписиНаСервере Или Настройки.СоздаватьЭлектронныеПодписиНаСервере Тогда + + ПараметрыПроверки = Новый Структура; + ПараметрыПроверки.Вставить("РасширенноеОписание", Истина); + РезультатКриптопровайдеры = ЭлектроннаяПодпись.ПроверитьУстановкуПрограммКриптографии(ПараметрыПроверки); + + Если РезультатКриптопровайдеры.ПроверкаВыполнена Тогда + + Для Каждого Криптопровайдер Из РезультатКриптопровайдеры.Программы Цикл + + Если ЗначениеЗаполнено(Криптопровайдер.Программа) И Не ЕстьПроверяемыеПрограммы Тогда + ЕстьПроверяемыеПрограммы = Истина; + КонецЕсли; + + Найдено = ТаблицаВыборки.НайтиСтроки(Новый Структура("ИмяПрограммы, ТипПрограммы", + Криптопровайдер.ИмяПрограммы, Криптопровайдер.ТипПрограммы)); + + Если Найдено.Количество() = 0 + Или ЭлектроннаяПодписьСлужебныйКлиентСервер.ИспользуютсяАвтоматическиеНастройки(Найдено[0].РежимИспользования) Тогда + Если Найдено.Количество() = 0 Тогда + СтрокаВыборки = ТаблицаВыборки.Добавить(); + Иначе + СтрокаВыборки = Найдено[0]; + КонецЕсли; + ЗаполнитьЗначенияСвойств(СтрокаВыборки, Криптопровайдер,,"Ссылка"); + СтрокаВыборки.ТипРазмещения = 1; + СтрокаВыборки.ПометкаУдаления = Ложь; + СтрокаВыборки.ПутьКПрограммеНаСервереАвто = Криптопровайдер.ПутьКПрограммеНаСервереАвто; + СтрокаВыборки.Наименование = Криптопровайдер.Представление; + СтрокаВыборки.Автоопределение = Истина; + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + Элементы.ПрограммыРезультатПроверкиНаСервере.Видимость = ЭтоПолноправныйПользователь; + Иначе + Элементы.ПрограммыРезультатПроверкиНаСервере.Видимость = Ложь; + КонецЕсли; + ОбработанныеСтроки = Новый Соответствие; Индекс = 0; Для каждого СтрокаВыборки Из ТаблицаВыборки Цикл - Если Не Пользователи.ЭтоПолноправныйПользователь() И СтрокаВыборки.ПометкаУдаления Тогда + + ПрограммаНеИспользуется = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПрограммаНеИспользуется(СтрокаВыборки.РежимИспользования); + + Если Не Пользователи.ЭтоПолноправныйПользователь() + И (ПрограммаНеИспользуется Или СтрокаВыборки.ПометкаУдаления) Тогда Продолжить; КонецЕсли; - Строки = Программы.НайтиСтроки(Новый Структура("Ссылка", СтрокаВыборки.Ссылка)); + + Если ЗначениеЗаполнено(СтрокаВыборки.Ссылка) Тогда + Строки = Программы.НайтиСтроки(Новый Структура("Ссылка", СтрокаВыборки.Ссылка)); + Иначе + Строки = Программы.НайтиСтроки(Новый Структура("ИмяПрограммы, ТипПрограммы", + СтрокаВыборки.ИмяПрограммы, СтрокаВыборки.ТипПрограммы)); + КонецЕсли; + Если Строки.Количество() = 0 Тогда Если Программы.Количество()-1 < Индекс Тогда Строка = Программы.Добавить(); @@ -1193,18 +1460,33 @@ КонецЕсли; КонецЕсли; // Обновление только измененных значений, чтобы таблица формы не обновлялась лишний раз. - ОбновитьЗначение(Строка.Ссылка, СтрокаВыборки.Ссылка); - ОбновитьЗначение(Строка.ПометкаУдаления, СтрокаВыборки.ПометкаУдаления); - ОбновитьЗначение(Строка.Наименование, СтрокаВыборки.Наименование); - ОбновитьЗначение(Строка.ИмяПрограммы, СтрокаВыборки.ИмяПрограммы); - ОбновитьЗначение(Строка.ТипПрограммы, СтрокаВыборки.ТипПрограммы); - ОбновитьЗначение(Строка.АлгоритмПодписи, СтрокаВыборки.АлгоритмПодписи); - ОбновитьЗначение(Строка.АлгоритмХеширования, СтрокаВыборки.АлгоритмХеширования); - ОбновитьЗначение(Строка.АлгоритмШифрования, СтрокаВыборки.АлгоритмШифрования); - ОбновитьЗначение(Строка.LinuxПутьКПрограмме, ПутиКПрограммам.Получить(СтрокаВыборки.Ссылка)); - ОбновитьЗначение(Строка.НомерКартинки, ?(СтрокаВыборки.ПометкаУдаления, 4, 3)); + ОбновитьЗначение(Строка.Ссылка, СтрокаВыборки.Ссылка); + ОбновитьЗначение(Строка.ПометкаУдаления, СтрокаВыборки.ПометкаУдаления); + ОбновитьЗначение(Строка.Наименование, СтрокаВыборки.Наименование); + ОбновитьЗначение(Строка.ИмяПрограммы, СтрокаВыборки.ИмяПрограммы); + ОбновитьЗначение(Строка.ТипПрограммы, СтрокаВыборки.ТипПрограммы); + ОбновитьЗначение(Строка.АлгоритмПодписи, СтрокаВыборки.АлгоритмПодписи); + ОбновитьЗначение(Строка.АлгоритмХеширования, СтрокаВыборки.АлгоритмХеширования); + ОбновитьЗначение(Строка.АлгоритмШифрования, СтрокаВыборки.АлгоритмШифрования); + ОбновитьЗначение(Строка.Автоопределение, СтрокаВыборки.Автоопределение); + ОбновитьЗначение(Строка.РежимИспользования, СтрокаВыборки.РежимИспользования); + ОбновитьЗначение(Строка.ПутьКПрограммеНаСервереАвто, СтрокаВыборки.ПутьКПрограммеНаСервереАвто); ОбновитьЗначение(Строка.ЭтоВстроенныйКриптопровайдер, СтрокаВыборки.ЭтоВстроенныйКриптопровайдер); - ОбновитьЗначение(Строка.ТипРазмещения, СтрокаВыборки.ТипРазмещения + ?(СтрокаВыборки.ПометкаУдаления, 4, 0)); + + Если ПрограммаНеИспользуется И Не СтрокаВыборки.ПометкаУдаления Тогда + ОбновитьЗначение(Строка.ТипРазмещения, 9); + Иначе + ОбновитьЗначение(Строка.ТипРазмещения, СтрокаВыборки.ТипРазмещения + ?(СтрокаВыборки.ПометкаУдаления, 4, 0)); + КонецЕсли; + + Если СтрокаВыборки.Автоопределение Тогда // установленный криптопровайдер + ОбновитьЗначение(Строка.LinuxПутьКПрограмме, СтрокаВыборки.ПутьКПрограммеНаСервереАвто); + ОбновитьЗначение(Строка.РежимИспользованияКартинка, -1); + Иначе + ОбновитьЗначение(Строка.LinuxПутьКПрограмме, ПутиКПрограммам.Получить(СтрокаВыборки.Ссылка)); + ОбновитьЗначение(Строка.РежимИспользованияКартинка, 0); + КонецЕсли; + Если Строка.ЭтоВстроенныйКриптопровайдер И Не Строка.ПометкаУдаления Тогда ОбновитьЗначение(Строка.РезультатПроверки, НСтр("ru = 'Доступен.'")); ОбновитьЗначение(Строка.Установлена, Истина); @@ -1212,6 +1494,25 @@ И Не Строка.ПометкаУдаления Тогда ОбновитьЗначение(Строка.РезультатПроверки, НСтр("ru = 'Доступен.'")); ОбновитьЗначение(Строка.Установлена, Истина); + ИначеЕсли СтрокаВыборки.ТипРазмещения = 5 Тогда + ОбновитьЗначение(Строка.РезультатПроверки, НСтр("ru = 'Доступен.'")); + ОбновитьЗначение(Строка.Установлена, Истина); + ИначеЕсли Строка.ТипРазмещения = 1 И (Настройки.ПроверятьЭлектронныеПодписиНаСервере Или Настройки.СоздаватьЭлектронныеПодписиНаСервере) Тогда + ПараметрыСоздания = ЭлектроннаяПодписьСлужебный.ПараметрыСозданияМенеджераКриптографии(); + ПараметрыСоздания.Автоопределение = Ложь; + ОписаниеПрограммы = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовоеРасширенноеОписаниеПрограммы(); + ЗаполнитьЗначенияСвойств(ОписаниеПрограммы, Строка); + ОписаниеПрограммы.Представление = Строка.Наименование; + ПараметрыСоздания.Программа = ОписаниеПрограммы; + ПараметрыСоздания.ОписаниеОшибки = Новый Структура; + МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии("", ПараметрыСоздания); + Если МенеджерКриптографии = Неопределено Тогда + ОбновитьЗначение(Строка.РезультатПроверкиНаСервере, ПараметрыСоздания.ОписаниеОшибки.ОписаниеОшибки); + ОбновитьЗначение(Строка.УстановленаНаСервере, Ложь); + Иначе + ОбновитьЗначение(Строка.РезультатПроверкиНаСервере, НСтр("ru = 'Установлена на сервере.'")); + ОбновитьЗначение(Строка.УстановленаНаСервере, Истина); + КонецЕсли; КонецЕсли; ОбработанныеСтроки.Вставить(Строка, Истина); @@ -1320,7 +1621,7 @@ Исключение ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось определить версию компоненты. - | %1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + | %1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ПоказатьПредупреждение(, ТекстОшибки); КонецПопытки; Иначе @@ -1345,6 +1646,9 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Установлена компонента %1 версии %2.'"), "ExtraCryptoAPI", Результат); ПоказатьПредупреждение(, ТекстСообщения); + ОбновитьПовторноИспользуемыеЗначения(); + ЭлектроннаяПодписьСлужебныйКлиент.ОчиститьКэшУстановленныхКриптопровайдеров(); + Оповестить("Установка_КомпонентаExtraCryptoAPI"); КонецПроцедуры diff --git a/SSL/src/CommonForms/НовыйПароль/Form.form b/SSL/src/CommonForms/НовыйПароль/Form.form index a2e9ee050..229946bc1 100644 --- a/SSL/src/CommonForms/НовыйПароль/Form.form +++ b/SSL/src/CommonForms/НовыйПароль/Form.form @@ -54,6 +54,32 @@ ФормаКоманднаяПанель -1 + + ФормаСоздатьДругой + 11 + true + true + + true + + + ФормаСоздатьДругойРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + Form.Command.СоздатьДругой + Normal + Auto + true + true + UserCmds + Auto + ФормаЗакрыть 3 @@ -124,6 +150,37 @@ true + + ДляВнешнегоПользователя + 2 + + Boolean + + + true + + + true + + + + СоздатьДругой + + <key>ru</key> + <value>Создать другой</value> + + 1 + + true + + + + СоздатьДругой + + + Auto + Auto + ДляВнешнегоПользователя diff --git a/SSL/src/CommonForms/НовыйПароль/Module.bsl b/SSL/src/CommonForms/НовыйПароль/Module.bsl index ca5f5e20c..bf240b651 100644 --- a/SSL/src/CommonForms/НовыйПароль/Module.bsl +++ b/SSL/src/CommonForms/НовыйПароль/Module.bsl @@ -11,8 +11,8 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - НовыйПароль = Пользователи.СоздатьПароль(8, Истина, ?(Параметры.ДляВнешнегоПользователя, - "ДляВнешнихПользователей", "ДляПользователей")); + ДляВнешнегоПользователя = Параметры.ДляВнешнегоПользователя; + НовыйПароль = НовыйПароль(ДляВнешнегоПользователя); Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда Элементы.ФормаЗакрыть.Видимость = Ложь; @@ -20,4 +20,23 @@ КонецПроцедуры +&НаКлиенте +Процедура СоздатьДругой(Команда) + + НовыйПароль = НовыйПароль(ДляВнешнегоПользователя); + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция НовыйПароль(ДляВнешнегоПользователя) + + СвойстваПароля = Пользователи.СвойстваПароля(); + СвойстваПароля.НаименьшаяДлина = 8; + СвойстваПароля.Сложный = Истина; + СвойстваПароля.УчестьНастройки = ?(ДляВнешнегоПользователя, "ДляВнешнихПользователей", "ДляПользователей"); + + Возврат Пользователи.СоздатьПароль(СвойстваПароля); + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Form.form b/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Form.form index 068c0ff23..e82bde181 100644 --- a/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Form.form +++ b/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Form.form @@ -66,7 +66,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -169,7 +168,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -398,7 +396,6 @@ UsualGroup Vertical - Auto true true Auto @@ -427,7 +424,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Module.bsl b/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Module.bsl index 8284b2d93..af3c742eb 100644 --- a/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Module.bsl +++ b/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Module.bsl @@ -206,6 +206,7 @@ Если Результат = КодВозвратаДиалога.Да Тогда НовыйПараметрЗапуска = СтрЗаменить(ПараметрЗапуска, "РегламентныеЗаданияОтключены", ""); НовыйПараметрЗапуска = СтрЗаменить(НовыйПараметрЗапуска, "ЗапуститьОбновлениеИнформационнойБазы", ""); + НовыйПараметрЗапуска = СтрСоединить(СтрРазделить(НовыйПараметрЗапуска, ";", Ложь), ";"); НовыйПараметрЗапуска = "/C """ + НовыйПараметрЗапуска + """"; ПрекратитьРаботуСистемы(Истина, НовыйПараметрЗапуска); КонецЕсли; diff --git a/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Form.form b/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Form.form index c39f00559..d6267b859 100644 --- a/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Form.form +++ b/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Form.form @@ -101,7 +101,6 @@ UsualGroup Center - Auto NormalSeparation true true @@ -229,7 +228,6 @@ UsualGroup Center - Auto true true Auto @@ -353,7 +351,6 @@ UsualGroup Center - Auto NormalSeparation true true diff --git a/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Module.bsl b/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Module.bsl index 50e0298c5..499c57c07 100644 --- a/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Module.bsl +++ b/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Module.bsl @@ -79,7 +79,7 @@ Исключение ЗаписатьОшибкуВЖурналРегистрации( - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СобытиеЖурналаРегистрацииУдалениеАвтономногоРабочегоМеста); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СобытиеЖурналаРегистрацииУдалениеАвтономногоРабочегоМеста); ДлительнаяОперация = Ложь; ПерейтиНазад(); diff --git a/SSL/src/CommonForms/ОтправкаSMS/Form.form b/SSL/src/CommonForms/ОтправкаSMS/Form.form index acd7250c3..59a8a2ca3 100644 --- a/SSL/src/CommonForms/ОтправкаSMS/Form.form +++ b/SSL/src/CommonForms/ОтправкаSMS/Form.form @@ -79,7 +79,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -232,7 +231,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -349,7 +347,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -378,7 +375,6 @@ UsualGroup Vertical - Auto true true Auto @@ -510,7 +506,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -642,7 +637,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -744,7 +738,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/CommonForms/ОтправкаSMS/Module.bsl b/SSL/src/CommonForms/ОтправкаSMS/Module.bsl index 3c5e113b9..6d551905a 100644 --- a/SSL/src/CommonForms/ОтправкаSMS/Module.bsl +++ b/SSL/src/CommonForms/ОтправкаSMS/Module.bsl @@ -170,7 +170,7 @@ Функция СтатусДоставки(ИдентификаторСообщения) СтатусыДоставки = Новый Соответствие; - СтатусыДоставки.Вставить("Ошибка", НСтр("ru = 'произошла ошибка при подключении к провайдеру SMS'")); + СтатусыДоставки.Вставить("Ошибка", НСтр("ru = 'нет подключения к провайдеру SMS'")); СтатусыДоставки.Вставить("НеОтправлялось", НСтр("ru = 'сообщение не отправлялось провайдером'")); СтатусыДоставки.Вставить("Отправляется", НСтр("ru = 'выполняется отправка провайдером'")); СтатусыДоставки.Вставить("Отправлено", НСтр("ru = 'отправлено провайдером'")); diff --git a/SSL/src/CommonForms/ОтправкаСообщения/Form.form b/SSL/src/CommonForms/ОтправкаСообщения/Form.form index c2a733b78..f4fb0b68c 100644 --- a/SSL/src/CommonForms/ОтправкаСообщения/Form.form +++ b/SSL/src/CommonForms/ОтправкаСообщения/Form.form @@ -847,7 +847,6 @@ UsualGroup Vertical - Auto true true Auto @@ -936,7 +935,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl b/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl index 627ca3f35..03defaadf 100644 --- a/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl +++ b/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl @@ -97,13 +97,25 @@ Для Каждого СтруктураПолучателя Из Параметры.Получатель Цикл ЕстьСвойствоВыбран = СтруктураПолучателя.Свойство("Выбран"); МассивАдресов = СтрРазделить(СтруктураПолучателя.Адрес, ";"); + ВариантОтправки = ?(СтруктураПолучателя.Свойство("ВариантОтправки"), СтруктураПолучателя.ВариантОтправки, "Кому"); + + Если ВариантОтправки = "ОбратныйАдрес" Тогда + АдресОтвета = ?(ПустаяСтрока(АдресОтвета), СтруктураПолучателя.Адрес, + АдресОтвета + ";" + СтруктураПолучателя.Адрес); + Продолжить; + КонецЕсли; + + Если Элементы.ПочтовыйАдресПолучателейВариантОтправки.СписокВыбора.НайтиПоЗначению(ВариантОтправки) = Неопределено Тогда + ВариантОтправки = "Кому"; + КонецЕсли; + Для Каждого Адрес Из МассивАдресов Цикл Если ПустаяСтрока(Адрес) Тогда Продолжить; КонецЕсли; Если (ЕстьСвойствоВыбран И СтруктураПолучателя.Выбран) ИЛИ (НЕ ЕстьСвойствоВыбран) Тогда НовыйПолучатель = ПочтовыеАдресаПолучателей.Добавить(); - НовыйПолучатель.ВариантОтправки = "Кому"; + НовыйПолучатель.ВариантОтправки = ВариантОтправки; НовыйПолучатель.Представление = СтруктураПолучателя.Представление + " <" + СокрЛП(Адрес) + ">"; КонецЕсли; КонецЦикла; @@ -445,7 +457,7 @@ Попытка СообщениеОтправлено = ОтправитьПочтовоеСообщение(ЕстьОшибочныеПолучатели); Исключение - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаголовокОшибки = НСтр("ru = 'Письмо не отправлено'"); РаботаСПочтовымиСообщениямиКлиент.СообщитьОбОшибкеПодключения(УчетнаяЗапись, ЗаголовокОшибки, ТекстОшибки); Возврат; @@ -649,7 +661,7 @@ УдалитьФайлы(ИмяФайла); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Получение табличного документа'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Возврат ТабличныйДокумент; diff --git a/SSL/src/CommonForms/ПанельОтчетов/Form.form b/SSL/src/CommonForms/ПанельОтчетов/Form.form index 285a829ba..27226172f 100644 --- a/SSL/src/CommonForms/ПанельОтчетов/Form.form +++ b/SSL/src/CommonForms/ПанельОтчетов/Form.form @@ -372,7 +372,6 @@ HorizontalIfPossible Right - Auto true true Auto @@ -401,7 +400,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -539,7 +537,6 @@ HorizontalIfPossible Center - Auto NormalSeparation true true @@ -681,7 +678,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -751,7 +747,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -786,7 +781,6 @@ UsualGroup Vertical - Auto true true Auto @@ -818,7 +812,6 @@ UsualGroup Vertical - Auto true true Auto @@ -847,7 +840,6 @@ UsualGroup Vertical - Auto true Equal Auto @@ -913,7 +905,6 @@ UsualGroup Vertical - Auto true Auto Auto @@ -947,7 +938,6 @@ UsualGroup Vertical - Auto true true Auto @@ -979,7 +969,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1008,7 +997,6 @@ UsualGroup HorizontalIfPossible - Auto true Equal Auto @@ -1073,7 +1061,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1105,7 +1092,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1134,7 +1120,6 @@ UsualGroup HorizontalIfPossible - Auto true Equal Auto @@ -1240,7 +1225,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1272,7 +1256,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1301,7 +1284,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true Equal @@ -1361,7 +1343,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1444,7 +1425,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1473,7 +1453,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1654,7 +1633,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true diff --git a/SSL/src/CommonForms/ПанельОтчетов/Module.bsl b/SSL/src/CommonForms/ПанельОтчетов/Module.bsl index e2a3593c3..7f72d2435 100644 --- a/SSL/src/CommonForms/ПанельОтчетов/Module.bsl +++ b/SSL/src/CommonForms/ПанельОтчетов/Module.bsl @@ -420,6 +420,7 @@ Подсистема.ВидимыхВариантов = Подсистема.ВидимыхВариантов + ?(Показать, 1, -1); КонецЦикла; СохранитьПользовательскиеНастройки(Вариант.Ссылка, Вариант.Подсистема, Вариант.Видимость, Вариант.БыстрыйДоступ); + Оповестить("ИзменениеВидимостиВариантаОтчетаВПанелиОтчетов", "Отчет." + Вариант.ИмяОтчета); КонецПроцедуры &НаКлиенте @@ -804,7 +805,7 @@ КонецЕсли; ПодсистемыПрограммы.Очистить(); - ВсеПодсистемы = ВариантыОтчетовПовтИсп.ПодсистемыТекущегоПользователя(); + ВсеПодсистемы = ВариантыОтчетовПовтИсп.ПодсистемыТекущегоПользователя().Дерево; ВсеРазделы = ВсеПодсистемы.Строки[0].Строки; ПодсистемыПоСсылке = Новый Соответствие; diff --git a/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Form.form b/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Form.form index c8c852adf..6e2313e55 100644 --- a/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Form.form +++ b/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Form.form @@ -336,7 +336,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -538,7 +537,6 @@ UsualGroup Vertical - Auto true true Auto @@ -911,7 +909,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -940,7 +937,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/CommonForms/ПараметрыПроксиСервера/Form.form b/SSL/src/CommonForms/ПараметрыПроксиСервера/Form.form index 63b3b69db..e1584aea8 100644 --- a/SSL/src/CommonForms/ПараметрыПроксиСервера/Form.form +++ b/SSL/src/CommonForms/ПараметрыПроксиСервера/Form.form @@ -194,7 +194,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -385,7 +384,6 @@ UsualGroup Vertical - Auto true true Auto @@ -479,7 +477,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -509,7 +506,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/CommonForms/ПечатьДокументов/Form.form b/SSL/src/CommonForms/ПечатьДокументов/Form.form index 34e0c075c..da7420539 100644 --- a/SSL/src/CommonForms/ПечатьДокументов/Form.form +++ b/SSL/src/CommonForms/ПечатьДокументов/Form.form @@ -217,7 +217,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -824,7 +823,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1144,7 +1142,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1251,7 +1248,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1427,17 +1423,75 @@ ГруппаНастройкаКомплектаКоманднаяПанель 121 - - КнопкаУстановитьФлажкиПодменю - 122 + + УправлениеФлажками + 286 + + КнопкаУстановитьФлажкиПодменю + 122 + true + true + + true + + + КнопкаУстановитьФлажкиПодменюExtendedTooltip + 151 + Label + true + true + + Left + + + Form.Command.УстановитьФлажки + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + КнопкаСнятьФлажкиПодменю + 123 + true + true + + true + + + КнопкаСнятьФлажкиПодменюExtendedTooltip + 152 + Label + true + true + + Left + + + Form.Command.СнятьФлажки + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + true true true + + <key>ru</key> + <value>Настройки печатных форм группа1</value> + - КнопкаУстановитьФлажкиПодменюExtendedTooltip - 151 + УправлениеФлажкамиРасширеннаяПодсказка + 287 Label true true @@ -1445,26 +1499,77 @@ Left - Form.Command.УстановитьФлажки - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu + - - КнопкаСнятьФлажкиПодменю - 123 + + УправлениеСтроками + 288 + + КнопкаПереместитьВверхПодменю + 124 + true + true + + true + + + КнопкаПереместитьВверхПодменюExtendedTooltip + 153 + Label + true + true + + Left + + + Form.Item.НастройкиПечатныхФорм.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + КнопкаПереместитьВнизПодменю + 125 + true + true + + true + + + КнопкаПереместитьВнизПодменюExtendedTooltip + 154 + Label + true + true + + Left + + + Form.Item.НастройкиПечатныхФорм.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + true true true + + <key>ru</key> + <value>Настройки печатных форм группа1</value> + - КнопкаСнятьФлажкиПодменюExtendedTooltip - 152 + УправлениеСтрокамиРасширеннаяПодсказка + 289 Label true true @@ -1472,68 +1577,7 @@ Left
        - Form.Command.СнятьФлажки - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu - - - КнопкаПереместитьВверхПодменю - 124 - true - true - - true - - - КнопкаПереместитьВверхПодменюExtendedTooltip - 153 - Label - true - true - - Left - - - Form.Item.НастройкиПечатныхФорм.StandardCommand.MoveUp - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu - - - КнопкаПереместитьВнизПодменю - 125 - true - true - - true - - - КнопкаПереместитьВнизПодменюExtendedTooltip - 154 - Label - true - true - - Left - - - Form.Item.НастройкиПечатныхФорм.StandardCommand.MoveDown - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu + КнопкаСброситьНастройкиПодменю @@ -1581,7 +1625,41 @@ Left
        - + + Compact + + + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 290 + + СтрокаПоискРасширеннаяПодсказка + 292 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 291 + true + + НастройкиПечатныхФорм + + true + Left @@ -2074,7 +2152,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2154,7 +2231,6 @@ UsualGroup HorizontalIfPossible - Auto true true LeftNarrowest @@ -2448,7 +2524,6 @@ UsualGroup AlwaysHorizontal - Auto true true @@ -2513,7 +2588,6 @@ AlwaysHorizontal Right - Auto Button true true @@ -3229,6 +3303,34 @@ true + + ИмяВременногоКаталога + 28 + + String + + + + true + + + true + + + + ИменаМакетов + 30 + + String + + + + true + + + true + + Отправить diff --git a/SSL/src/CommonForms/ПечатьДокументов/Module.bsl b/SSL/src/CommonForms/ПечатьДокументов/Module.bsl index cecf23f06..f693390be 100644 --- a/SSL/src/CommonForms/ПечатьДокументов/Module.bsl +++ b/SSL/src/CommonForms/ПечатьДокументов/Module.bsl @@ -6,6 +6,13 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// +#Область ОписаниеПеременных + +&НаКлиенте +Перем ИмяВременногоКаталогаКлиент; + +#КонецОбласти + #Область ОбработчикиСобытийФормы &НаСервере @@ -46,13 +53,25 @@ КонецЕсли; Если Параметры.КоллекцияПечатныхФорм = Неопределено Тогда - КоллекцияПечатныхФорм = СформироватьПечатныеФормы(Параметры.ИменаМакетов, Отказ); - Если Отказ Тогда - Возврат; - КонецЕсли; + ИменаМакетов = Параметры.ИменаМакетов; + Возврат; Иначе КоллекцияПечатныхФорм = Параметры.КоллекцияПечатныхФорм; + ИсключитьОфисныеДокументыИзКомплектов(КоллекцияПечатныхФорм); ОбъектыПечати = Параметры.ОбъектыПечати; + КонецЕсли; + + СообщенияФоновогоЗадания = Неопределено; + Параметры.Свойство("Сообщения", СообщенияФоновогоЗадания); + Если СообщенияФоновогоЗадания <> Неопределено Тогда + Для Каждого Сообщение Из СообщенияФоновогоЗадания Цикл + ОбщегоНазначения.СообщитьПользователю(Сообщение.Текст); + КонецЦикла; + КонецЕсли; + + ПараметрыВывода = Неопределено; + Параметры.Свойство("ПараметрыВывода", ПараметрыВывода); + Если ПараметрыВывода = Неопределено Тогда ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода(); КонецЕсли; @@ -62,7 +81,6 @@ ЕстьРазрешенныйВывод = ЕстьРазрешенныйВывод(); НастроитьВидимостьЭлементовФормы(ЕстьРазрешенныйВывод); УстановитьПризнакДоступностиВыводаВПредставленияхПечатныхФорм(ЕстьРазрешенныйВывод); - УстановитьЗаголовокФормы(); Если Не ОбщегоНазначения.ЭтоМобильныйКлиент() И ЭтоПечатьКомплекта() Тогда Элементы.Копий.Заголовок = НСтр("ru = 'Копий комплекта'"); КонецЕсли; @@ -73,17 +91,6 @@ МассивСсылок = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(МассивСсылок); КонецЕсли; - // ЭлектронноеВзаимодействие - Если ТипЗнч(МассивСсылок) = Тип("Массив") - И МассивСсылок.Количество() > 0 - И ОбщегоНазначения.ЗначениеСсылочногоТипа(МассивСсылок[0]) Тогда - Если ОбщегоНазначения.ПодсистемаСуществует("ЭлектронноеВзаимодействие") Тогда - МодульЭлектронноеВзаимодействие = ОбщегоНазначения.ОбщийМодуль("ЭлектронноеВзаимодействие"); - МодульЭлектронноеВзаимодействие.ПриВыводеНавигационнойСсылкиВФормеОбъектаИБ(ДополнительнаяИнформация, МассивСсылок); - КонецЕсли; - КонецЕсли; - // Конец ЭлектронноеВзаимодействие - Элементы.ДополнительнаяИнформация.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(ДополнительнаяИнформация.Текст); Элементы.КартинкаИнформации.Картинка = ДополнительнаяИнформация.Картинка; Элементы.ГруппаДополнительнаяИнформация.Видимость = Не ПустаяСтрока(Элементы.ДополнительнаяИнформация.Заголовок); @@ -94,7 +101,7 @@ Элементы.КоманднаяПанельПраваяЧасть.Видимость = Ложь; Элементы.НастройкиПечатныхФорм.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто; Элементы.КнопкаОтправитьВсеДействия.КнопкаПоУмолчанию = Истина; - Элементы.Справка.ТолькоВоВсехДействиях= Истина; + Элементы.Справка.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; Элементы.КнопкаИзменитьМакет.Видимость = Ложь; Элементы.ФлажокПодписьИПечать.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто; Элементы.НастройкаКоличестваКопий.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; @@ -115,6 +122,7 @@ МодульУправлениеПечатьюМультиязычность.ЗаполнитьПодменюЯзык(ЭтотОбъект, , ДоступныеЯзыкиПечатныхФорм()); КонецЕсли; + УстановитьЗаголовокФормы(); КонецПроцедуры &НаСервере @@ -136,12 +144,24 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) + ИмяВременногоКаталогаКлиент = ""; + Если ВладелецФормы = Неопределено Тогда УникальныйИдентификаторХранилища = Новый УникальныйИдентификатор; Иначе УникальныйИдентификаторХранилища = ВладелецФормы.УникальныйИдентификатор; КонецЕсли; + Если НастройкиПечатныхФорм.Количество() = 0 Тогда + ДлительнаяОперация = НачатьФормированиеПечатныхФорм(ИменаМакетов); + Контекст = Новый Структура("ИменаМакетов", ИменаМакетов); + ОповещениеОЗавершении = Новый ОписаниеОповещения("ПриЗавершенииФормированияПечатныхФорм", ЭтотОбъект, Контекст); + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания()); + + Отказ = Истина; + Возврат; + КонецЕсли; + Если ЗначениеЗаполнено(НастройкиФорматаСохранения) Тогда Отказ = Истина; // отказ от открытия формы СохранитьПечатнуюФормуВФайл(); @@ -152,42 +172,40 @@ КонецПроцедуры -&НаКлиенте -Процедура ПослеОткрытия() - - Если Элементы.ФлажокПодписьИПечать.Видимость Тогда - ДобавитьУдалитьПодписьПечать(); - КонецЕсли; - УстановитьТекущуюСтраницу(); - - ОбщегоНазначенияСлужебныйКлиент.УстановитьВидимостьПанелиПоказателей(Элементы, РазвернутьОбластьПоказателей); - ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ТекущаяПечатнаяФорма", ОсновнойПоказатель); - - УстановитьИмяПринтераВПодсказкеКнопкиПечать(); - - ИнтеграцияПодсистемБСПКлиент.ПечатьДокументовПослеОткрытия(ЭтотОбъект); - УправлениеПечатьюКлиентПереопределяемый.ПечатьДокументовПослеОткрытия(ЭтотОбъект); - -КонецПроцедуры - &НаКлиенте Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.СохранениеПечатнойФормы") Тогда Если ВыбранноеЗначение <> Неопределено И ВыбранноеЗначение <> КодВозвратаДиалога.Отмена Тогда - ФайлыВоВременномХранилище = ПоместитьТабличныеДокументыВоВременноеХранилище(ВыбранноеЗначение); Если ВыбранноеЗначение.ВариантСохранения = "СохранитьВПапку" Тогда - СохранитьПечатныеФормыВКаталог(ФайлыВоВременномХранилище, ВыбранноеЗначение.ПапкаДляСохранения); - Иначе - ЗаписанныеОбъекты = ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище, ВыбранноеЗначение.ОбъектДляПрикрепления); - Если ЗаписанныеОбъекты.Количество() > 0 Тогда - ОповеститьОбИзменении(ТипЗнч(ЗаписанныеОбъекты[0])); + Если ВыбранноеЗначение.Подписать Тогда + ПодписатьФайлыДляОтправкиСохранения(ВыбранноеЗначение, "СохранитьВПапку"); + Иначе + ФайлыВоВременномХранилище = ПоместитьТабличныеДокументыВоВременноеХранилище(ВыбранноеЗначение); + ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, ВыбранноеЗначение); + СохранитьПечатныеФормыВКаталог(ФайлыВоВременномХранилище, ВыбранноеЗначение.ПапкаДляСохранения); КонецЕсли; - Для Каждого ЗаписанныйОбъект Из ЗаписанныеОбъекты Цикл - Оповестить("Запись_Файл", Новый Структура, ЗаписанныйОбъект); - КонецЦикла; - ПоказатьОповещениеПользователя(, , НСтр("ru = 'Сохранение завершено'"), БиблиотекаКартинок.Информация32); + Иначе + ФайлыВоВременномХранилище = ПоместитьТабличныеДокументыВоВременноеХранилище(ВыбранноеЗначение); + ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, ВыбранноеЗначение); + Если ВыбранноеЗначение.Подписать Тогда + + ЗаписанныеОбъекты = ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище); + Контекст = Новый Структура("ЗаписанныеОбъекты, ВыбранноеЗначение", ЗаписанныеОбъекты, ВыбранноеЗначение); + ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеПодписанияФайлов", ЭтотОбъект, Контекст); + ПодписатьЗаписанныеОбъекты(ЗаписанныеОбъекты, ОписаниеОповещения); + Иначе + ЗаписанныеОбъекты = ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище); + Если ЗаписанныеОбъекты.Количество() > 0 Тогда + ОповеститьОбИзменении(ТипЗнч(ЗаписанныеОбъекты[0])); + КонецЕсли; + Для Каждого ЗаписанныйОбъект Из ЗаписанныеОбъекты Цикл + Оповестить("Запись_Файл", Новый Структура, ЗаписанныйОбъект); + КонецЦикла; + ПоказатьОповещениеПользователя(, , НСтр("ru = 'Сохранение завершено'"), БиблиотекаКартинок.Информация32); + КонецЕсли; + КонецЕсли; КонецЕсли; @@ -195,16 +213,183 @@ Или ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.ПодготовкаНовогоПисьма") Тогда Если ВыбранноеЗначение <> Неопределено И ВыбранноеЗначение <> КодВозвратаДиалога.Отмена Тогда - ПараметрыОтправки = ПараметрыОтправкиПисьма(ВыбранноеЗначение); + Если ВыбранноеЗначение.Подписать Тогда + ПодписатьФайлыДляОтправкиСохранения(ВыбранноеЗначение, "ОтправкаПисьма"); + Иначе + ПараметрыОтправки = ПараметрыОтправкиПисьма(ВыбранноеЗначение); - МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); - МодульРаботаСПочтовымиСообщениямиКлиент.СоздатьНовоеПисьмо(ПараметрыОтправки); + МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); + МодульРаботаСПочтовымиСообщениямиКлиент.СоздатьНовоеПисьмо(ПараметрыОтправки); + КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура ПодписатьЗаписанныеОбъекты(ЗаписанныеОбъекты, ОповещениеЗавершенияПодписания) + ДополнительныеПараметры = Новый Структура("ОбработкаРезультата", ОповещениеЗавершенияПодписания); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСФайламиКлиент"); + МодульРаботаСФайламиКлиент.ПодписатьФайл(ЗаписанныеОбъекты, УникальныйИдентификатор, ДополнительныеПараметры); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПодписатьФайлыДляОтправкиСохранения(ВыбранноеЗначение, Действие) + ФайлыВоВременномХранилище = ПоместитьТабличныеДокументыВоВременноеХранилище(ВыбранноеЗначение); + Контекст = Новый Структура; + Контекст.Вставить("Действие", Действие); + Контекст.Вставить("ВыбранноеЗначение", ВыбранноеЗначение); + ПодписатьФайлы(ФайлыВоВременномХранилище, Контекст); +КонецПроцедуры + +&НаКлиенте +Процедура ПодписатьФайлы(ФайлыВоВременномХранилище, Контекст) + + Если Контекст.Действие = "СохранитьВПапку" Тогда + ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеПодписанияСохранитьВПапку", ЭтотОбъект, Контекст); + ИначеЕсли Контекст.Действие = "ОтправкаПисьма" Тогда + ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеПодписанияОтправитьПоПочте", ЭтотОбъект, Контекст); + КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + ОписаниеДанных = Новый Структура; + ОписаниеДанных.Вставить("ПоказатьКомментарий", Ложь); + Если ФайлыВоВременномХранилище.Количество() > 1 Тогда + ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файлов'")); + ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файлы'")); + + НаборДанных = Новый Массив; + Для Каждого Файл Из ФайлыВоВременномХранилище Цикл + ОписаниеДанныхФайла = Новый Структура; + ОписаниеДанныхФайла.Вставить("Представление", Файл.Представление); + ОписаниеДанныхФайла.Вставить("Данные", Файл.АдресВоВременномХранилище); + ОписаниеДанныхФайла.Вставить("ОбъектПечати", Файл.ОбъектПечати); + НаборДанных.Добавить(ОписаниеДанныхФайла); + КонецЦикла; + + ОписаниеДанных.Вставить("НаборДанных", НаборДанных); + ОписаниеДанных.Вставить("ПредставлениеНабора", "Файлы (%1)"); + Иначе + Файл = ФайлыВоВременномХранилище[0]; + ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файла'")); + ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); + ОписаниеДанных.Вставить("Представление", Файл.Представление); + ОписаниеДанных.Вставить("Данные", Файл.АдресВоВременномХранилище); + ОписаниеДанных.Вставить("ОбъектПечати", Файл.ОбъектПечати); + КонецЕсли; + + МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); + МодульЭлектроннаяПодписьКлиент.Подписать(ОписаниеДанных,,ОписаниеОповещения); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Функция ПолучитьФайлыПодписей(СтруктураПодписания, ПереводитьИменаФайловВТранслит) + Если СтруктураПодписания.Свойство("НаборДанных") Тогда + НаборДанных = СтруктураПодписания.НаборДанных; + Иначе + НаборДанных = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СтруктураПодписания); + КонецЕсли; + + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + МодульЭлектроннаяПодписьСлужебныйКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебныйКлиентСервер"); + РасширениеДляФайловПодписи = МодульЭлектроннаяПодпись.ПерсональныеНастройки().РасширениеДляФайловПодписи; + КомуВыданСертификат = СтруктураПодписания.ВыбранныйСертификат.Ссылка.КомуВыдан; + Если ПереводитьИменаФайловВТранслит Тогда + КомуВыданСертификат = СтроковыеФункции.СтрокаЛатиницей(КомуВыданСертификат); + КонецЕсли; + + Результат = Новый Массив; + Для Каждого ПодписанныйФайл Из НаборДанных Цикл + СтруктураОписанияФайла = Новый Структура("АдресВоВременномХранилище, Представление, ОбъектПечати"); + СтруктураОписанияФайла.АдресВоВременномХранилище = ПодписанныйФайл.Данные; + СтруктураОписанияФайла.Представление = ПодписанныйФайл.Представление; + СтруктураОписанияФайла.ОбъектПечати = ПодписанныйФайл.ОбъектПечати; + Результат.Добавить(СтруктураОписанияФайла); + + Файл = Новый Файл(ПодписанныйФайл.Представление); + + СвойстваПодписи = ПодписанныйФайл.СвойстваПодписи; + ДанныеПодписи = ПоместитьВоВременноеХранилище(СвойстваПодписи.Подпись, УникальныйИдентификатор); + ИмяФайлаПодписи = МодульЭлектроннаяПодписьСлужебныйКлиентСервер.ИмяФайлаПодписи(Файл.ИмяБезРасширения, + Строка(КомуВыданСертификат), РасширениеДляФайловПодписи); + + СтруктураОписанияФайла = Новый Структура("АдресВоВременномХранилище, Представление, ОбъектПечати"); + СтруктураОписанияФайла.АдресВоВременномХранилище = ДанныеПодписи; + СтруктураОписанияФайла.Представление = ИмяФайлаПодписи; + СтруктураОписанияФайла.ОбъектПечати = ПодписанныйФайл.ОбъектПечати; + Результат.Добавить(СтруктураОписанияФайла); + + ДанныеПоСертификату = ПоместитьВоВременноеХранилище(СвойстваПодписи.Сертификат, УникальныйИдентификатор); + + Если ТипЗнч(СвойстваПодписи.Сертификат) = Тип("Строка") Тогда + РасширениеСертификата = "txt"; + Иначе + РасширениеСертификата = "cer"; + КонецЕсли; + + ИмяФайлаСертификата = МодульЭлектроннаяПодписьСлужебныйКлиентСервер.ИмяФайлаСертификата(Файл.ИмяБезРасширения, + Строка(КомуВыданСертификат), РасширениеСертификата); + + СтруктураОписанияФайла = Новый Структура("АдресВоВременномХранилище, Представление, ОбъектПечати"); + СтруктураОписанияФайла.АдресВоВременномХранилище = ДанныеПоСертификату; + СтруктураОписанияФайла.Представление = ИмяФайлаСертификата; + СтруктураОписанияФайла.ОбъектПечати = ПодписанныйФайл.ОбъектПечати; + Результат.Добавить(СтруктураОписанияФайла); + + КонецЦикла; + + Возврат Результат; +КонецФункции + +&НаКлиенте +Процедура ЗавершениеПодписанияСохранитьВПапку(Результат, Контекст) Экспорт + Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("Успех") И Не Результат.Успех Тогда + Возврат; + КонецЕсли; + + ФайлыВоВременномХранилище = ПолучитьФайлыПодписей(Результат, Контекст.ВыбранноеЗначение.ПереводитьИменаФайловВТранслит); + ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, Контекст.ВыбранноеЗначение); + СохранитьПечатныеФормыВКаталог(ФайлыВоВременномХранилище, Контекст.ВыбранноеЗначение.ПапкаДляСохранения); + ПоказатьОповещениеПользователя(, , НСтр("ru = 'Подписание и сохранение завершено'"), БиблиотекаКартинок.Информация32); +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершениеПодписанияОтправитьПоПочте(Результат, Контекст) Экспорт + Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("Успех") И Не Результат.Успех Тогда + Возврат; + КонецЕсли; + + ФайлыВоВременномХранилище = ПолучитьФайлыПодписей(Результат, Контекст.ВыбранноеЗначение.ПереводитьИменаФайловВТранслит); + ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, Контекст.ВыбранноеЗначение); + + ПараметрыОтправки = ПараметрыОтправкиПисьма(Контекст.ВыбранноеЗначение, ФайлыВоВременномХранилище); + + МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); + МодульРаботаСПочтовымиСообщениямиКлиент.СоздатьНовоеПисьмо(ПараметрыОтправки); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершениеПодписанияФайлов(Результат, Контекст) Экспорт + Если Результат = Ложь Тогда + Возврат; + КонецЕсли; + ЗаписанныеОбъекты = Контекст.ЗаписанныеОбъекты; + + Если ЗаписанныеОбъекты.Количество() > 0 Тогда + ОповеститьОбИзменении(ТипЗнч(ЗаписанныеОбъекты[0])); + КонецЕсли; + Для Каждого ЗаписанныйОбъект Из ЗаписанныеОбъекты Цикл + Оповестить("Запись_Файл", Новый Структура, ЗаписанныйОбъект); + КонецЦикла; + ПоказатьОповещениеПользователя(, , НСтр("ru = 'Сохранение и подписание завершено'"), БиблиотекаКартинок.Информация32); + +КонецПроцедуры + &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) @@ -251,12 +436,6 @@ МассивСсылок = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(МассивСсылок); КонецЕсли; - // ЭлектронноеВзаимодействие - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ЭлектронноеВзаимодействие") Тогда - МодульЭлектронноеВзаимодействиеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектронноеВзаимодействиеКлиент"); - МодульЭлектронноеВзаимодействиеКлиент.ОбработкаНавигационнойСсылкиВФормеПечатиБСП(НавигационнаяСсылкаФорматированнойСтроки, МассивСсылок); - КонецЕсли; - // Конец ЭлектронноеВзаимодействие КонецПроцедуры &НаКлиенте @@ -488,6 +667,7 @@ Процедура Подключаемый_ПриПереключенииЯзыка(КодЯзыка, ДополнительныеПараметры) Экспорт ОбновитьТекущуюПечатнуюФорму(); + УстановитьЗаголовокФормы(); КонецПроцедуры @@ -495,6 +675,37 @@ #Область СлужебныеПроцедурыИФункции +&НаСервере +Процедура ИсключитьОфисныеДокументыИзКомплектов(КоллекцияПечатныхФорм) + ЕстьТабличныеДокументы = Ложь; + ЕстьОфисныеДокументы = Ложь; + Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл + ЕстьТабличныеДокументы = ЕстьТабличныеДокументы Или ПечатнаяФорма.ТабличныйДокумент.ВысотаТаблицы <> 0; + ЕстьОфисныеДокументы = ЕстьОфисныеДокументы Или (ПечатнаяФорма.ОфисныеДокументы <> Неопределено + И ПечатнаяФорма.ОфисныеДокументы.Количество() <> 0); + Если ЕстьТабличныеДокументы И ЕстьОфисныеДокументы Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + Если ЕстьТабличныеДокументы И ЕстьОфисныеДокументы Тогда + Индекс = 0; + Пока Истина Цикл + Если Индекс > КоллекцияПечатныхФорм.ВГраница() Тогда + Прервать; + КонецЕсли; + + ПечатнаяФорма = КоллекцияПечатныхФорм[Индекс]; + Если ПечатнаяФорма.ОфисныеДокументы <> Неопределено И ПечатнаяФорма.ОфисныеДокументы.Количество() <> 0 Тогда + КоллекцияПечатныхФорм.Удалить(Индекс); + Индекс = Индекс - 1; + КонецЕсли; + Индекс = Индекс + 1; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + &НаСервере Процедура УстановитьУсловноеОформление() @@ -516,6 +727,123 @@ КонецПроцедуры +&НаСервере +Функция НачатьФормированиеПечатныхФорм(ИменаМакетов) + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(УникальныйИдентификаторХранилища); + ПараметрыВыполнения.АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификаторХранилища); + ПараметрыВыполнения.ОжидатьЗавершение = 0; + + СтруктураПараметров = Новый Структура("ИсточникДанных,ПараметрыИсточника,ПараметрыПечати,ИмяМенеджераПечати,ПараметрКоманды"); + Для каждого Параметр Из СтруктураПараметров Цикл + СтруктураПараметров.Вставить(Параметр.Ключ, ОбщегоНазначения.СкопироватьРекурсивно(Параметры[Параметр.Ключ])); + КонецЦикла; + + СтруктураПараметров.Вставить("ИменаМакетов", ИменаМакетов); + + Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, "УправлениеПечатью.СформироватьПечатныеФормыВФоне", ИменаМакетов, + СтруктураПараметров, ПараметрыВывода, ТекущийЯзык, ОбъектыПечати); +КонецФункции + +&НаКлиенте +Процедура ПриЗавершенииФормированияПечатныхФорм(Результат, Знач Контекст) Экспорт + Если Результат <> Неопределено Тогда + Если Результат.Статус = "Ошибка" Тогда + ВызватьИсключение Результат.КраткоеПредставлениеОшибки; + КонецЕсли; + СтруктураРезультата = ПолучитьРезультатФоновогоЗадания(Результат); + КоллекцияПечатныхФорм = СтруктураРезультата.КоллекцияПечатныхФорм; + ОбъектыПечати = СтруктураРезультата.ОбъектыПечати; + + МассивИменПараметров = СтрРазделить("ИмяМенеджераПечати,ИсточникДанных,ПараметрКоманды,ПараметрыИсточника,ПараметрыПечати", ","); + Для Каждого ИмяПараметра Из МассивИменПараметров Цикл + Контекст.Вставить(ИмяПараметра, ОбщегоНазначенияКлиент.СкопироватьРекурсивно(Параметры[ИмяПараметра])); + КонецЦикла; + + Контекст.Вставить("ОбъектыПечати", ОбъектыПечати); + Контекст.Вставить("КоллекцияПечатныхФорм", КоллекцияПечатныхФорм); + Контекст.Вставить("ПараметрыВывода", СтруктураРезультата.ПараметрыВывода); + Контекст.Вставить("Сообщения", Результат.Сообщения); + ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", Контекст, ВладелецФормы, Строка(Новый УникальныйИдентификатор)); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПослеОткрытия() + + Если Элементы.ФлажокПодписьИПечать.Видимость Тогда + ДобавитьУдалитьПодписьПечать(); + КонецЕсли; + УстановитьТекущуюСтраницу(); + + ОбщегоНазначенияСлужебныйКлиент.УстановитьВидимостьПанелиПоказателей(Элементы, РазвернутьОбластьПоказателей); + ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ТекущаяПечатнаяФорма", ОсновнойПоказатель); + + УстановитьИмяПринтераВПодсказкеКнопкиПечать(); + + ИнтеграцияПодсистемБСПКлиент.ПечатьДокументовПослеОткрытия(ЭтотОбъект); + УправлениеПечатьюКлиентПереопределяемый.ПечатьДокументовПослеОткрытия(ЭтотОбъект); + +КонецПроцедуры + +&НаСервере +Функция ПолучитьРезультатФоновогоЗадания(Результат) + РезультатФоновойОперации = ПолучитьИзВременногоХранилища(Результат.АдресРезультата); + + ТаблицаПечатныхФорм = РезультатФоновойОперации.КоллекцияПечатныхФорм; + ОфисныеДокументы = РезультатФоновойОперации.ОфисныеДокументы; + ОбъектыПечати = РезультатФоновойОперации.ОбъектыПечати; + + Для Каждого ПечатнаяФорма Из ТаблицаПечатныхФорм Цикл + ОфисныеДокументыНовыеАдреса = Новый Соответствие(); + Если ЗначениеЗаполнено(ПечатнаяФорма.ОфисныеДокументы) Тогда + Для Каждого ОфисныйДокумент Из ПечатнаяФорма.ОфисныеДокументы Цикл + ОфисныеДокументыНовыеАдреса.Вставить(ПоместитьВоВременноеХранилище(ОфисныеДокументы[ОфисныйДокумент.Ключ], УникальныйИдентификаторХранилища), ОфисныйДокумент.Значение); + КонецЦикла; + ПечатнаяФорма.ОфисныеДокументы = ОфисныеДокументыНовыеАдреса; + КонецЕсли; + КонецЦикла; + СтруктураРезультата = Новый Структура("КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода"); + СтруктураРезультата.КоллекцияПечатныхФорм = ОбщегоНазначения.ТаблицаЗначенийВМассив(ТаблицаПечатныхФорм); + СтруктураРезультата.ОбъектыПечати = ОбъектыПечати; + СтруктураРезультата.ПараметрыВывода = РезультатФоновойОперации.ПараметрыВывода; + + Возврат СтруктураРезультата; + +КонецФункции + +&НаКлиенте +Процедура ОповеститьОГотовностиПечатныхФорм(СтруктураЕдиногоДокумента = Неопределено) + + НастройкиСохранения = Новый Структура("ФорматыСохранения", ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве( + НастройкиФорматаСохранения.ТипФайлаТабличногоДокумента)); + + ФайлыВоВременномХранилище = ПоместитьТабличныеДокументыВоВременноеХранилище(НастройкиСохранения); + ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, НастройкиСохранения); + + ПараметрыОткрытия = Новый Структура("ОфисныеДокументы, АдресНастройкиПечатныхФорм, АдресСтруктурыЕдиногоДокумента"); + ПараметрыОткрытия.ОфисныеДокументы = ФайлыВоВременномХранилище; + ПараметрыОткрытия.АдресНастройкиПечатныхФорм = ПолучитьАдресНастройкиПечатныхФорм(); + ПараметрыОткрытия.АдресСтруктурыЕдиногоДокумента = ПоместитьВоВременноеХранилище(СтруктураЕдиногоДокумента, УникальныйИдентификаторХранилища); + + ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьФормуПечатиOfficeOpen", ЭтотОбъект, ПараметрыОткрытия); + Если ФайлыВоВременномХранилище.Количество() = 1 Тогда + ЗаголовокОповещения = НСтр("ru = 'Документ сформирован'"); + ТекстОповещения = ФайлыВоВременномХранилище[0].Представление; + ИначеЕсли ФайлыВоВременномХранилище.Количество() > 1 Тогда + ЗаголовокОповещения = НСтр("ru = 'Документы сформированы'"); + ТекстОповещения = ФайлыВоВременномХранилище[0].Представление+"..."; + Иначе + Возврат; + КонецЕсли; + + ПоказатьОповещениеПользователя(ЗаголовокОповещения, ОписаниеОповещения, ТекстОповещения, , , ); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФормуПечатиOfficeOpen(ПараметрыОткрытия) Экспорт + ОткрытьФорму("ОбщаяФорма.ПечатьДокументовOfficeOpen", ПараметрыОткрытия); +КонецПроцедуры + // Возвращаемое значение: // см. УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм @@ -566,29 +894,31 @@ КонецФункции &НаСервере -Процедура ЗагрузитьНастройкиКоличестваКопий() +Процедура ЗагрузитьНастройкиКоличестваКопий(Знач ИспользуемыеПараметры = Неопределено) СохраненныеНастройкиПечатныхФорм = Новый Массив; + Если ИспользуемыеПараметры = Неопределено Тогда + ИспользуемыеПараметры = Параметры; + КонецЕсли; ИспользоватьСохраненныеНастройки = Истина; - Если ТипЗнч(Параметры.ПараметрыПечати) = Тип("Структура") И Параметры.ПараметрыПечати.Свойство("ПереопределитьПользовательскиеНастройкиКоличества") Тогда - ИспользоватьСохраненныеНастройки = Не Параметры.ПараметрыПечати.ПереопределитьПользовательскиеНастройкиКоличества; + Если ТипЗнч(ИспользуемыеПараметры.ПараметрыПечати) = Тип("Структура") И ИспользуемыеПараметры.ПараметрыПечати.Свойство("ПереопределитьПользовательскиеНастройкиКоличества") Тогда + ИспользоватьСохраненныеНастройки = Не ИспользуемыеПараметры.ПараметрыПечати.ПереопределитьПользовательскиеНастройкиКоличества; КонецЕсли; Если ИспользоватьСохраненныеНастройки Тогда - Если ЗначениеЗаполнено(Параметры.ИсточникДанных) Тогда - КлючНастроек = Строка(Параметры.ИсточникДанных.УникальныйИдентификатор()) + "-" + Параметры.ПараметрыИсточника.ИдентификаторКоманды; + Если ЗначениеЗаполнено(ИспользуемыеПараметры.ИсточникДанных) Тогда + КлючНастроек = Строка(ИспользуемыеПараметры.ИсточникДанных.УникальныйИдентификатор()) + "-" + ИспользуемыеПараметры.ПараметрыИсточника.ИдентификаторКоманды; Иначе - ИменаМакетов = Параметры.ИменаМакетов; + ИменаМакетов = ИспользуемыеПараметры.ИменаМакетов; Если ТипЗнч(ИменаМакетов) = Тип("Массив") Тогда ИменаМакетов = СтрСоединить(ИменаМакетов, ","); КонецЕсли; - КлючНастроек = Параметры.ИмяМенеджераПечати + "-" + ИменаМакетов; + КлючНастроек = ИспользуемыеПараметры.ИмяМенеджераПечати + "-" + ИменаМакетов; КонецЕсли; СохраненныеНастройкиПечатныхФорм = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиПечатныхФорм", КлючНастроек, Новый Массив); КонецЕсли; - ВосстановитьНастройкиПечатныхФорм(СохраненныеНастройкиПечатныхФорм); @@ -632,7 +962,12 @@ НоваяНастройкаПечатнойФормы.ПутьКМакету = ОписаниеПечатнойФормы.ПолныйПутьКМакету; НоваяНастройкаПечатнойФормы.ИмяФайлаПечатнойФормы = ОбщегоНазначения.ЗначениеВСтрокуXML(ОписаниеПечатнойФормы.ИмяФайлаПечатнойФормы); НоваяНастройкаПечатнойФормы.ОфисныеДокументы = ?(ПустаяСтрока(ОписаниеПечатнойФормы.ОфисныеДокументы), "", ОбщегоНазначения.ЗначениеВСтрокуXML(ОписаниеПечатнойФормы.ОфисныеДокументы)); - НоваяНастройкаПечатнойФормы.ПодписьИПечать = ЕстьПодписьИПечать(ОписаниеПечатнойФормы.ТабличныйДокумент); + Если ОписаниеПечатнойФормы.ТабличныйДокумент.ВысотаТаблицы = 0 Тогда + НоваяНастройкаПечатнойФормы.ПодписьИПечать = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПечатьДокументовOfficeOpen", + "ПодписьИПечать", Ложь) + Иначе + НоваяНастройкаПечатнойФормы.ПодписьИПечать = ЕстьПодписьИПечать(ОписаниеПечатнойФормы.ТабличныйДокумент); + КонецЕсли; НоваяНастройкаПечатнойФормы.ДоступенВыводНаДругихЯзыках = ОписаниеПечатнойФормы.ДоступенВыводНаДругихЯзыках; Если ЗначениеЗаполнено(НоваяНастройкаПечатнойФормы.ПутьКМакету) Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда @@ -720,9 +1055,10 @@ Элементы.Копий.Видимость = ЕстьРазрешенныйВывод И ЕстьДанныеДляПечати; Элементы.КнопкаРедактирование.Видимость = ЕстьРазрешенныйВывод И ЕстьДанныеДляПечати И ЕстьРазрешенноеРедактирование; + Элементы.ГруппаПоказатель.Видимость = ЕстьДанныеДляПечати; Если Элементы.Найти("КнопкаПредварительныйПросмотр") <> Неопределено Тогда - Элементы.КнопкаПредварительныйПросмотр.Видимость = ЕстьРазрешенныйВывод; + Элементы.КнопкаПредварительныйПросмотр.Видимость = ЕстьРазрешенныйВывод И ЕстьДанныеДляПечати; КонецЕсли; Если Элементы.Найти("КнопкаПредварительныйПросмотрВсеДействия") <> Неопределено Тогда Элементы.КнопкаПредварительныйПросмотрВсеДействия.Видимость = ЕстьРазрешенныйВывод; @@ -833,6 +1169,11 @@ КонецЕсли; КонецЕсли; + Если ЗначениеЗаполнено(ТекущийЯзык) Тогда + ТекущийЯзыкПредставление = Элементы["Язык_"+ТекущийЯзык].Заголовок; + ЗаголовокФормы = ЗаголовокФормы + " ("+ТекущийЯзыкПредставление+")"; + КонецЕсли; + Заголовок = ЗаголовокФормы; КонецПроцедуры @@ -913,20 +1254,77 @@ КонецПроцедуры &НаСервере -Функция ПоместитьТабличныеДокументыВоВременноеХранилище(ПереданныеНастройки) +Функция ПоместитьФайлыВАрхив(ПечатныеФормыДокументов, ПереданныеНастройки) Перем ЗаписьZipФайла, ИмяАрхива; + Результат = Новый Массив; + + НастройкиСохранения = НастройкиСохранения(); + ЗаполнитьЗначенияСвойств(НастройкиСохранения, ПереданныеНастройки); + + Если Не НастройкиСохранения.УпаковатьВАрхив Тогда + Возврат ПечатныеФормыДокументов; + КонецЕсли; + ВариантСохранения = Неопределено; + ПереданныеНастройки.Свойство("ВариантСохранения", ВариантСохранения); + УстанавливатьОбъектПечати = ВариантСохранения = "Присоединить"; + + ПереводитьИменаФайловВТранслит = НастройкиСохранения.ПереводитьИменаФайловВТранслит; + + ИмяВременногоКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла()); + СоздатьКаталог(ИмяВременногоКаталога); + + СоответствиеДляАрхивов = Новый Соответствие; + + Для Каждого СтруктураФайла Из ПечатныеФормыДокументов Цикл + + ДанныеФайла = ПолучитьИзВременногоХранилища(СтруктураФайла.АдресВоВременномХранилище); + ПолноеИмяФайла = ИмяВременногоКаталога + СтруктураФайла.Представление; + ПолноеИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ПолноеИмяФайла); + ДанныеФайла.Записать(ПолноеИмяФайла); + + ОбъектПечати = ?(УстанавливатьОбъектПечати, СтруктураФайла.ОбъектПечати, Неопределено); + + Если СоответствиеДляАрхивов[ОбъектПечати] = Неопределено Тогда + ИмяАрхива = ПолучитьИмяВременногоФайла("zip"); + ЗаписьZipФайла = Новый ЗаписьZipФайла(ИмяАрхива); + ПараметрыЗаписи = Новый Структура("ЗаписьZipФайла, ИмяАрхива", ЗаписьZipФайла, ИмяАрхива); + СоответствиеДляАрхивов.Вставить(ОбъектПечати, ПараметрыЗаписи); + КонецЕсли; + + СоответствиеДляАрхивов[ОбъектПечати].ЗаписьZipФайла.Добавить(ПолноеИмяФайла); + + КонецЦикла; + + Для Каждого АрхивОбъекта Из СоответствиеДляАрхивов Цикл + ЗаписьZipФайла = АрхивОбъекта.Значение.ЗаписьZipФайла; + ИмяАрхива = АрхивОбъекта.Значение.ИмяАрхива; + ЗаписьZipФайла.Записать(); + ДвоичныеДанные = Новый ДвоичныеДанные(ИмяАрхива); + ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторХранилища); + ОписаниеФайла = Новый Структура; + ОписаниеФайла.Вставить("Представление", ПолучитьИмяФайлаДляАрхива(ПереводитьИменаФайловВТранслит)); + + ОписаниеФайла.Вставить("ОбъектПечати", АрхивОбъекта.Ключ); + ОписаниеФайла.Вставить("АдресВоВременномХранилище", ПутьВоВременномХранилище); + Результат.Добавить(ОписаниеФайла); + УдалитьФайлы(ИмяАрхива); + КонецЦикла; + + УдалитьФайлы(ИмяВременногоКаталога); + + Возврат Результат; + +КонецФункции + +&НаСервере +Функция ПоместитьТабличныеДокументыВоВременноеХранилище(ПереданныеНастройки) + НастройкиСохранения = НастройкиСохранения(); ЗаполнитьЗначенияСвойств(НастройкиСохранения, ПереданныеНастройки); Результат = Новый Массив; - // подготовка архива - Если НастройкиСохранения.УпаковатьВАрхив Тогда - ИмяАрхива = ПолучитьИмяВременногоФайла("zip"); - ЗаписьZipФайла = Новый ЗаписьZipФайла(ИмяАрхива); - КонецЕсли; - ИмяВременногоКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла()); СоздатьКаталог(ИмяВременногоКаталога); @@ -934,6 +1332,11 @@ ПереводитьИменаФайловВТранслит = НастройкиСохранения.ПереводитьИменаФайловВТранслит; ТаблицаФорматов = УправлениеПечатью.НастройкиФорматовСохраненияТабличногоДокумента(); + ОбъектыДляПрикрепления = Неопределено; + Если ПереданныеНастройки.Свойство("ОбъектыДляПрикрепления") Тогда + ОбъектыДляПрикрепления = ОбщегоНазначения.СкопироватьРекурсивно(ПереданныеНастройки.ОбъектыДляПрикрепления); + КонецЕсли; + // сохранение печатных форм ОбработанныеПечатныеФормы = Новый Массив; Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл @@ -944,19 +1347,15 @@ Для Каждого ФайлОфисногоДокумента Из ФайлыОфисныхДокументов Цикл ИмяФайла = УправлениеПечатью.ИмяФайлаОфисногоДокумента(ФайлОфисногоДокумента.Значение); - Если ЗаписьZipФайла <> Неопределено Тогда - ПолноеИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ИмяВременногоКаталога + ИмяФайла); - ДвоичныеДанные = ПолучитьИзВременногоХранилища(ФайлОфисногоДокумента.Ключ); // ДвоичныеДанные - - ДвоичныеДанные.Записать(ПолноеИмяФайла); - ЗаписьZipФайла.Добавить(ПолноеИмяФайла); - Иначе - ОписаниеФайла = Новый Структура; - ОписаниеФайла.Вставить("Представление", ИмяФайла); - ОписаниеФайла.Вставить("АдресВоВременномХранилище", ФайлОфисногоДокумента.Ключ); - ОписаниеФайла.Вставить("ЭтоОфисныйДокумент", Истина); - Результат.Добавить(ОписаниеФайла); + ОписаниеФайла = Новый Структура; + ОписаниеФайла.Вставить("Представление", ИмяФайла); + ОписаниеФайла.Вставить("ОбъектПечати", ?(ТипЗнч(ФайлОфисногоДокумента.Значение) = Тип("Строка"), Неопределено, ФайлОфисногоДокумента.Значение)); + Если ОбъектыДляПрикрепления <> Неопределено И ОбъектыДляПрикрепления[ОписаниеФайла.ОбъектПечати] <> Истина Тогда + Продолжить; КонецЕсли; - + ОписаниеФайла.Вставить("АдресВоВременномХранилище", ФайлОфисногоДокумента.Ключ); + ОписаниеФайла.Вставить("ЭтоОфисныйДокумент", Истина); + Результат.Добавить(ОписаниеФайла); КонецЦикла; Продолжить; @@ -991,6 +1390,10 @@ ОбъектПечати = СоответствиеОбъектаПечатнойФорме.Ключ; ПечатнаяФорма = СоответствиеОбъектаПечатнойФорме.Значение; + Если ОбъектыДляПрикрепления <> Неопределено И ОбъектыДляПрикрепления[ОбъектПечати] <> Истина Тогда + Продолжить; + КонецЕсли; + Для Каждого ВыбранныйФормат Из ВыбранныеФорматыСохранения Цикл ТипФайла = ТипФайлаТабличногоДокумента[ВыбранныйФормат]; НастройкиФормата = ТаблицаФорматов.НайтиСтроки(Новый Структура("ТипФайлаТабличногоДокумента", ТипФайла))[0]; @@ -1024,38 +1427,21 @@ УправлениеПечатью.ВставитьКартинкиВHTML(ПолноеИмяФайла); КонецЕсли; - Если ЗаписьZipФайла <> Неопределено Тогда - ЗаписьZipФайла.Добавить(ПолноеИмяФайла); - Иначе - ДвоичныеДанные = Новый ДвоичныеДанные(ПолноеИмяФайла); - ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторХранилища); - ОписаниеФайла = Новый Структура; - ОписаниеФайла.Вставить("Представление", ИмяФайлаСРасширением); - ОписаниеФайла.Вставить("АдресВоВременномХранилище", ПутьВоВременномХранилище); - Если ТипФайла = ТипФайлаТабличногоДокумента.ANSITXT Тогда - ОписаниеФайла.Вставить("Кодировка", "windows-1251"); - КонецЕсли; - Результат.Добавить(ОписаниеФайла); + ДвоичныеДанные = Новый ДвоичныеДанные(ПолноеИмяФайла); + ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторХранилища); + ОписаниеФайла = Новый Структура; + ОписаниеФайла.Вставить("Представление", ИмяФайлаСРасширением); + ОписаниеФайла.Вставить("АдресВоВременномХранилище", ПутьВоВременномХранилище); + ОписаниеФайла.Вставить("ОбъектПечати", ОбъектПечати); + Если ТипФайла = ТипФайлаТабличногоДокумента.ANSITXT Тогда + ОписаниеФайла.Вставить("Кодировка", "windows-1251"); КонецЕсли; + Результат.Добавить(ОписаниеФайла); КонецЦикла; КонецЦикла; КонецЦикла; - // Если архив подготовлен, записываем и помещаем его во временное хранилище. - Если ЗаписьZipФайла <> Неопределено Тогда - ЗаписьZipФайла.Записать(); - ДвоичныеДанные = Новый ДвоичныеДанные(ИмяАрхива); - ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторХранилища); - ОписаниеФайла = Новый Структура; - ОписаниеФайла.Вставить("Представление", ПолучитьИмяФайлаДляАрхива(ПереводитьИменаФайловВТранслит)); - ОписаниеФайла.Вставить("АдресВоВременномХранилище", ПутьВоВременномХранилище); - Результат.Добавить(ОписаниеФайла); - КонецЕсли; - УдалитьФайлы(ИмяВременногоКаталога); - Если ЗначениеЗаполнено(ИмяАрхива) Тогда - УдалитьФайлы(ИмяАрхива); - КонецЕсли; Возврат Результат; @@ -1101,13 +1487,260 @@ НастройкиФорматаСохранения.ТипФайлаТабличногоДокумента)); ФайлыВоВременномХранилище = ПоместитьТабличныеДокументыВоВременноеХранилище(НастройкиСохранения); + ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, НастройкиСохранения); - Для Каждого ФайлДляЗаписи Из ФайлыВоВременномХранилище Цикл - ФайловаяСистемаКлиент.ОткрытьФайл(ФайлДляЗаписи.АдресВоВременномХранилище, , ФайлДляЗаписи.Представление); - КонецЦикла; + ПечатьСКД = ФайлыВоВременномХранилище[0].ОбъектПечати <> Неопределено; + + Если ПечатьСКД И ИспользоватьДиалогПечатиОфисныхДокументов() Тогда + ПараметрыОткрытия = Новый Структура("ОфисныеДокументы, АдресНастройкиПечатныхФорм,ПараметрыВывода"); + ПараметрыОткрытия.АдресНастройкиПечатныхФорм = ПолучитьАдресНастройкиПечатныхФорм(); + ПараметрыОткрытия.ПараметрыВывода = ПараметрыВывода; + ОткрытьФорму("ОбщаяФорма.ПечатьДокументовOfficeOpen", ПараметрыОткрытия, ВладелецФормы, Строка(Новый УникальныйИдентификатор)); + ИначеЕсли ПечатьСКД И ПечатьОфисныхДокументовОднимФайлом() Тогда + ДлительнаяОперация = НачатьФормированиеЕдиногоДокумента(); + + Оповещение = Новый ОписаниеОповещения("ОткрытьЕдиныйДокумент", ЭтотОбъект); + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Оповещение, ПараметрыОжидания()); + Иначе + Контекст = Новый Структура; + Контекст.Вставить("ФайлыВоВременномХранилище", ФайлыВоВременномХранилище); + Контекст.Вставить("ПечатьСКД", ПечатьСКД); + + Оповещение = Новый ОписаниеОповещения("ОткрытьОфисныеДокументыПослеПодключенияРасширения", ЭтотОбъект, Контекст); + ТекстСообщения = НСтр("ru = 'Для печати документа необходимо установить расширение для работы с 1С:Предприятием.'"); + ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(Оповещение, ТекстСообщения); + + КонецЕсли; КонецПроцедуры +&НаСервере +Функция НачатьФормированиеЕдиногоДокумента() + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); + ПараметрыВыполнения.ЗапуститьВФоне = Истина; + ПараметрыВыполнения.ОжидатьЗавершение = 1; + + ПараметрыФормирования = Новый Структура("ПереформироватьЕдиныйДокумент", Истина); + + СтруктураЕдиногоДокумента = Новый Структура(); + СтруктураЕдиногоДокумента.Вставить("АдресПечатнойФормы", ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификаторХранилища)); + СтруктураЕдиногоДокумента.Вставить("ИмяФайлаПечатнойФормы"); + СтруктураЕдиногоДокумента.Вставить("Представление"); + СтруктураЕдиногоДокумента.Вставить("СоставЕдиногоДокумента", Новый Соответствие()); + + ОфисныеДокументы = Новый Соответствие; + + ТаблицаПечатныхФорм = Новый ТаблицаЗначений; + ТаблицаПечатныхФорм.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); + ТаблицаПечатныхФорм.Колонки.Добавить("ФормироватьЗаново", Новый ОписаниеТипов("Булево")); + ТаблицаПечатныхФорм.Колонки.Добавить("ПодписьИПечать", Новый ОписаниеТипов("Булево")); + ТаблицаПечатныхФорм.Колонки.Добавить("ТекущийЯзык", Новый ОписаниеТипов("Строка")); + ТаблицаПечатныхФорм.Колонки.Добавить("Пометка", Новый ОписаниеТипов("Булево")); + ТаблицаПечатныхФорм.Колонки.Добавить("АдресПечатнойФормы", Новый ОписаниеТипов("Строка")); + + + Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл + ФайлыОфисныхДокументов = ОбщегоНазначения.ЗначениеИзСтрокиXML(НастройкаПечатнойФормы.ОфисныеДокументы); + Для Каждого ФайлОфисногоДокумента Из ФайлыОфисныхДокументов Цикл + ОфисныеДокументы.Вставить(ФайлОфисногоДокумента.Ключ, ПолучитьИзВременногоХранилища(ФайлОфисногоДокумента.Ключ)); + НоваяСтрока = ТаблицаПечатныхФорм.Добавить(); + НоваяСтрока.АдресПечатнойФормы = ФайлОфисногоДокумента.Ключ; + НоваяСтрока.Представление = НастройкаПечатнойФормы.Представление; + КонецЦикла; + КонецЦикла; + ТаблицаПечатныхФорм.ЗаполнитьЗначения(ПодписьИПечать, "ПодписьИПечать"); + ТаблицаПечатныхФорм.ЗаполнитьЗначения(ОбщегоНазначения.КодОсновногоЯзыка(), "ТекущийЯзык"); + ТаблицаПечатныхФорм.ЗаполнитьЗначения(Истина, "Пометка"); + + Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, "УправлениеПечатьюСлужебный.СформироватьПечатныеФормы", + ТаблицаПечатныхФорм, ПараметрыФормирования, ОфисныеДокументы, СтруктураЕдиногоДокумента); +КонецФункции + +&НаКлиенте +Процедура ОткрытьЕдиныйДокумент(Результат, ДополнительныеЗначения) Экспорт + СтруктураЕдиногоДокумента = ПолучитьИзВременногоХранилища(Результат.АдресРезультата); + ОписаниеОповещенияЗавершения = Новый ОписаниеОповещения("ОткрытьЕдиныйДокументЗавершение", ЭтотОбъект, СтруктураЕдиногоДокумента); + + СтруктураФайлаВоВременномХранилище = Новый Структура("АдресВоВременномХранилище,Представление"); + СтруктураФайлаВоВременномХранилище.АдресВоВременномХранилище = СтруктураЕдиногоДокумента.АдресПечатнойФормы; + СтруктураФайлаВоВременномХранилище.Представление = СтруктураЕдиногоДокумента.ИмяФайлаПечатнойФормы; + ФайлыВоВременномХранилище = Новый Массив(); + ФайлыВоВременномХранилище.Добавить(СтруктураФайлаВоВременномХранилище); + Контекст = Новый Структура; + Контекст.Вставить("ФайлыВоВременномХранилище", ФайлыВоВременномХранилище); + Контекст.Вставить("ПечатьСКД", Истина); + Контекст.Вставить("ОбработчикЗавершения", ОписаниеОповещенияЗавершения); + + Оповещение = Новый ОписаниеОповещения("ОткрытьОфисныеДокументыПослеПодключенияРасширения", ЭтотОбъект, Контекст); + ТекстСообщения = НСтр("ru = 'Для печати документа необходимо установить расширение для работы с 1С:Предприятием.'"); + ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(Оповещение, ТекстСообщения); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьЕдиныйДокументЗавершение(Результат, СтруктураЕдиногоДокумента) Экспорт + ОповеститьОГотовностиПечатныхФорм(СтруктураЕдиногоДокумента); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьОфисныеДокументыПослеПодключенияРасширения(РасширениеПодключено, Контекст) Экспорт + Если РасширениеПодключено Тогда + Оповещение = Новый ОписаниеОповещения("ОткрытьОфисныеДокументыПослеПолученияВременногоКаталога", ЭтотОбъект, Контекст); + Если ИмяВременногоКаталогаКлиент = "" Тогда + ФайловаяСистемаКлиент.СоздатьВременныйКаталог(Оповещение); + Иначе + ВыполнитьОбработкуОповещения(Оповещение, ИмяВременногоКаталогаКлиент); + КонецЕсли; + Иначе + ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайлов(); + ПараметрыСохранения.Диалог.Заголовок = НСтр("ru ='Выбор папки для сохранения печатной формы'"); + + МассивПередаваемыхФайлов = Новый Массив; + + Для Каждого ФайлДляЗаписи Из Контекст.ФайлыВоВременномХранилище Цикл + МассивПередаваемыхФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ФайлДляЗаписи.Представление, ФайлДляЗаписи.АдресВоВременномХранилище)); + КонецЦикла; + + Если МассивПередаваемыхФайлов.Количество() > 1 Тогда + ПараметрыСохранения.Диалог.Заголовок = НСтр("ru ='Выбор папки для сохранения печатных форм'"); + КонецЕсли; + + ФайловаяСистемаКлиент.СохранитьФайлы(Новый ОписаниеОповещения, МассивПередаваемыхФайлов, ПараметрыСохранения); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьОфисныеДокументыПослеПолученияВременногоКаталога(ПолученныйВременныйКаталог, Контекст) Экспорт + ИмяВременногоКаталогаКлиент = ПолученныйВременныйКаталог; + ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьОфисныеДокументыПослеПолученияРазрешения", ЭтотОбъект, Контекст); + + Вызовы = Новый Массив(); + + МассивПередаваемыхФайлов = Новый Массив; + + Для Каждого ФайлДляЗаписи Из Контекст.ФайлыВоВременномХранилище Цикл + Вызов = Новый Массив; + Вызов.Добавить("ЗапуститьПриложение"); + Вызов.Добавить(ПолученныйВременныйКаталог+ФайлДляЗаписи.Представление); + Вызов.Добавить(); + Вызов.Добавить(Ложь); + Вызовы.Добавить(Вызов); + + МассивПередаваемыхФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ПолученныйВременныйКаталог+ФайлДляЗаписи.Представление, ФайлДляЗаписи.АдресВоВременномХранилище)); + КонецЦикла; + + Вызов = Новый Массив; + Вызов.Добавить("НачатьПолучениеФайлов"); + Вызов.Добавить(МассивПередаваемыхФайлов); + Вызов.Добавить(ПолученныйВременныйКаталог); + Вызов.Добавить(Ложь); + Вызовы.Добавить(Вызов); + Контекст.Вставить("МассивПередаваемыхФайлов", МассивПередаваемыхФайлов); + + НачатьЗапросРазрешенияПользователя(ОписаниеОповещения, Вызовы); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьОфисныеДокументыПослеПолученияРазрешения(РазрешенияПолучены, Контекст) Экспорт + + Если РазрешенияПолучены Тогда + Оповещение = Новый ОписаниеОповещения("ОткрытьПослеПослеЗаписиФайла", ЭтотОбъект, Контекст); + ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла(); + ПараметрыСохранения.Интерактивно = Ложь; + ПараметрыСохранения.Диалог.Каталог = ИмяВременногоКаталогаКлиент; + + ФайловаяСистемаКлиент.СохранитьФайлы(Оповещение, Контекст.МассивПередаваемыхФайлов, ПараметрыСохранения); + Иначе + ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайлов(); + ПараметрыСохранения.Диалог.Заголовок = НСтр("ru ='Выбор папки для сохранения печатной формы'"); + ПараметрыСохранения.Диалог.Каталог = ИмяВременногоКаталогаКлиент; + Если Контекст.МассивПередаваемыхФайлов.Количество() > 1 Тогда + ПараметрыСохранения.Диалог.Заголовок = НСтр("ru ='Выбор папки для сохранения печатных форм'"); + КонецЕсли; + + ФайловаяСистемаКлиент.СохранитьФайлы(Новый ОписаниеОповещения, Контекст.МассивПередаваемыхФайлов, ПараметрыСохранения); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьПослеПослеЗаписиФайла(ПолученныеФайлы, Контекст) Экспорт + Для Каждого ПолученныйФайл Из ПолученныеФайлы Цикл + ПараметрыЗавершения = Новый Структура; + ПараметрыЗавершения.Вставить("ПутьКФайлу", ПолученныйФайл.ПолноеИмя); + ПараметрыЗавершения.Вставить("ИмяФайла", ПолученныйФайл.Имя); + ОбработчикЗавершения = Неопределено; + Контекст.Свойство("ОбработчикЗавершения", ОбработчикЗавершения); + ПараметрыЗавершения.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); + + ФайлНаДиске = Новый Файл(ПараметрыЗавершения.ПутьКФайлу); + ОписаниеПослеУстановкиТолькоЧтения = Новый ОписаниеОповещения("ОткрытьФайлЗавершение", ЭтотОбъект, ПараметрыЗавершения); + + ФайлНаДиске.НачатьУстановкуТолькоЧтения(ОписаниеПослеУстановкиТолькоЧтения, Не ДоступноРедактированиеПечатнойФормы()); + КонецЦикла; + + Если Контекст.ПечатьСКД Тогда + ОповеститьОГотовностиПечатныхФорм(); + КонецЕсли; + + Если ПолученныеФайлы = Неопределено И ОбработчикЗавершения <> Неопределено Тогда + ВыполнитьОбработкуОповещения(ОбработчикЗавершения); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФайлЗавершение(ПараметрыЗавершения) Экспорт + ОбработчикЗавершения = ПараметрыЗавершения.ОбработчикЗавершения; + ПутьКФайлу = ПараметрыЗавершения.ПутьКФайлу; + ИмяФайла = ПараметрыЗавершения.ИмяФайла; + + ПараметрыОткрытияФайла = ФайловаяСистемаКлиент.ПараметрыОткрытияФайла(); + ФайловаяСистемаКлиент.ОткрытьФайл(ПутьКФайлу, ОбработчикЗавершения, ИмяФайла, ПараметрыОткрытияФайла); +КонецПроцедуры + +&НаСервере +Функция ДоступноРедактированиеПечатнойФормы() + Возврат Пользователи.РолиДоступны("РедактированиеПечатныхФорм"); +КонецФункции + +&НаКлиенте +Функция ПараметрыОжидания() + + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект.ВладелецФормы); + ПараметрыОжидания.ТекстСообщения = НСтр("ru = 'Подготовка печатных форм.'"); + ПараметрыОжидания.ОповещениеПользователя.Показать = Ложь; + ПараметрыОжидания.ВыводитьОкноОжидания = Истина; + ПараметрыОжидания.Интервал = 0; + ПараметрыОжидания.ВыводитьСообщения = Ложь; + Возврат ПараметрыОжидания; + +КонецФункции + +&НаСервере +Функция ПолучитьАдресНастройкиПечатныхФорм() + ТаблицаНастройкиПечатныхФорм = РеквизитФормыВЗначение("НастройкиПечатныхФорм", Тип("ТаблицаЗначений")); + Возврат ПоместитьВоВременноеХранилище(ТаблицаНастройкиПечатныхФорм, УникальныйИдентификаторХранилища); +КонецФункции + +&НаСервере +Функция ИспользоватьДиалогПечатиОфисныхДокументов() + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + Возврат Истина; + Иначе + Возврат Не ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПечатьДокументовOfficeOpen", + "ВыводитьСразу", Истина); + КонецЕсли; +КонецФункции + +&НаСервере +Функция ПечатьОфисныхДокументовОднимФайлом() + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + Возврат Ложь; + Иначе + Возврат ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПечатьДокументовOfficeOpen", + "ОднимДокументом", Ложь); + КонецЕсли; +КонецФункции + &НаКлиенте Процедура СохранитьПечатныеФормыВКаталог(СписокФайловВоВременномХранилище, Знач ИмяКаталога = "") @@ -1119,7 +1752,7 @@ КонецЕсли; ОписаниеОповещения = Новый ОписаниеОповещения("ПриПодготовкеИменФайлов", ЭтотОбъект, ИмяКаталога); - ПараметрыПодготовки = ПараметрыПодготовкиИменФайлов(СписокФайловВоВременномХранилище, ИмяКаталога, ОписаниеОповещения); + ПараметрыПодготовки = УправлениеПечатьюКлиент.ПараметрыПодготовкиИменФайлов(СписокФайловВоВременномХранилище, ИмяКаталога, ОписаниеОповещения); ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки); КонецПроцедуры @@ -1155,16 +1788,18 @@ КонецПроцедуры &НаСервере -Функция ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище, ОбъектДляПрисоединения) +Функция ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище) Результат = Новый Массив; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); Для Каждого Файл Из ФайлыВоВременномХранилище Цикл - ПараметрыФайла = МодульРаботаСФайлами.ПараметрыДобавленияФайла(); - ПараметрыФайла.ВладелецФайлов = ОбъектДляПрисоединения; - ПараметрыФайла.ИмяБезРасширения = Файл.Представление; - Результат.Добавить(МодульРаботаСФайлами.ДобавитьФайл( - ПараметрыФайла, Файл.АдресВоВременномХранилище, , НСтр("ru = 'Печатная форма'"))); + Если МодульРаботаСФайлами.КОбъектуМожноПрисоединятьФайлы(Файл["ОбъектПечати"]) Тогда + ПараметрыФайла = МодульРаботаСФайлами.ПараметрыДобавленияФайла(); + ПараметрыФайла.ВладелецФайлов = Файл["ОбъектПечати"]; + ПараметрыФайла.ИмяБезРасширения = Файл.Представление; + Результат.Добавить(МодульРаботаСФайлами.ДобавитьФайл( + ПараметрыФайла, Файл.АдресВоВременномХранилище, , НСтр("ru = 'Печатная форма'"))); + КонецЕсли; КонецЦикла; КонецЕсли; Возврат Результат; @@ -1425,9 +2060,12 @@ // ВыбранныеПараметры - см. УправлениеПечатью.НастройкиСохранения // &НаСервере -Функция ПараметрыОтправкиПисьма(ВыбранныеПараметры) +Функция ПараметрыОтправкиПисьма(ВыбранныеПараметры, СписокВложений = Неопределено) - СписокВложений = ПоместитьТабличныеДокументыВоВременноеХранилище(ВыбранныеПараметры); + Если СписокВложений = Неопределено Тогда + СписокВложений = ПоместитьТабличныеДокументыВоВременноеХранилище(ВыбранныеПараметры); + СписокВложений = ПоместитьФайлыВАрхив(СписокВложений, ВыбранныеПараметры); + КонецЕсли; // Контроль уникальности имен. ШаблонИмениФайла = "%1%2.%3"; @@ -1761,81 +2399,15 @@ КонецПроцедуры -// Возвращаемое значение: -// Структура: -// * ОписанияФайлов - Массив из Структура -// * ИмяКаталога - Строка -// * ОбработчикЗавершения - ОписаниеОповещения -// * Индекс - Число -// * Счетчик - Число -// * ИмяФайла - Строка -// -&НаКлиенте -Функция ПараметрыПодготовкиИменФайлов(ОписанияФайлов, ИмяКаталога, ОбработчикЗавершения) - - Результат = Новый Структура; - - Результат.Вставить("ОписанияФайлов", ОписанияФайлов); - Результат.Вставить("ИмяКаталога", ИмяКаталога); - Результат.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); - Результат.Вставить("Индекс", Неопределено); - Результат.Вставить("Счетчик", 1); - Результат.Вставить("ИмяФайла", ""); - - Возврат Результат; - -КонецФункции // Параметры: -// ПараметрыПодготовки - см. ПараметрыПодготовкиИменФайлов +// ПараметрыПодготовки - см. УправлениеПечатьюКлиент.ПараметрыПодготовкиИменФайлов // &НаКлиенте Процедура ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки) - ОписанияФайлов = ПараметрыПодготовки.ОписанияФайлов; - - Если ПараметрыПодготовки.Индекс = Неопределено Тогда - Для Каждого ОписаниеФайла Из ОписанияФайлов Цикл - ОписаниеФайла.Представление = ПараметрыПодготовки.ИмяКаталога + ОписаниеФайла.Представление; - КонецЦикла; - ПараметрыПодготовки.Индекс = 0; - КонецЕсли; - - Если ПараметрыПодготовки.Индекс > ОписанияФайлов.ВГраница() Тогда - ВыполнитьОбработкуОповещения(ПараметрыПодготовки.ОбработчикЗавершения, ОписанияФайлов); - Возврат; - КонецЕсли; - - ОписаниеФайла = ОписанияФайлов[ПараметрыПодготовки.Индекс]; - Файл = Новый Файл(ОписаниеФайла.Представление); - Если ПараметрыПодготовки.Счетчик > 1 Тогда - Файл = Новый Файл(Файл.Путь + Файл.ИмяБезРасширения + " (" + ПараметрыПодготовки.Счетчик + ")" + Файл.Расширение); - КонецЕсли; - - ПараметрыПодготовки.ИмяФайла = Файл.Имя; - ОписаниеОповещения = Новый ОписаниеОповещения("ПриПроверкеСуществованияФайла", ЭтотОбъект, ПараметрыПодготовки); - Файл.НачатьПроверкуСуществования(ОписаниеОповещения); - -КонецПроцедуры - -// Параметры: -// Существует - Булево -// ПараметрыПодготовки - см. ПараметрыПодготовкиИменФайлов -// -&НаКлиенте -Процедура ПриПроверкеСуществованияФайла(Существует, ПараметрыПодготовки) Экспорт - - Если Существует Тогда - ПараметрыПодготовки.Счетчик = ПараметрыПодготовки.Счетчик + 1; - Иначе - ОписаниеФайла = ПараметрыПодготовки.ОписанияФайлов[ПараметрыПодготовки.Индекс]; - ОписаниеФайла.Представление = ПараметрыПодготовки.ИмяФайла; - ПараметрыПодготовки.Счетчик = 0; - ПараметрыПодготовки.Индекс = ПараметрыПодготовки.Индекс + 1; - КонецЕсли; - - ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки); - + УправлениеПечатьюКлиент.ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки); + КонецПроцедуры &НаСервере @@ -1846,3 +2418,5 @@ КонецФункции #КонецОбласти + + diff --git a/SSL/src/CommonForms/ПечатьДокументовOfficeOpen/Form.form b/SSL/src/CommonForms/ПечатьДокументовOfficeOpen/Form.form new file mode 100644 index 000000000..ee5085410 --- /dev/null +++ b/SSL/src/CommonForms/ПечатьДокументовOfficeOpen/Form.form @@ -0,0 +1,2422 @@ +<?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"> + <items xsi:type="form:FormGroup"> + <name>ГруппаКоманднаяПанель</name> + <id>36</id> + <displayImportance>VeryHigh</displayImportance> + <items xsi:type="form:FormGroup"> + <name>КоманднаяПанельЛеваяЧасть</name> + <id>30</id> + <items xsi:type="form:Button"> + <name>Печать</name> + <id>117</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ПечатьРасширеннаяПодсказка</name> + <id>118</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Command.Печать</commandName> + <representation>PictureAndText</representation> + <defaultButton>true</defaultButton> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> + <items xsi:type="form:Button"> + <name>Показать</name> + <id>10</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ПоказатьРасширеннаяПодсказка</name> + <id>11</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Command.ПредварительныйПросмотр</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> + <items xsi:type="form:FormGroup"> + <name>ГруппаУправленияСпискомДокументов</name> + <id>128</id> + <items xsi:type="form:FormGroup"> + <name>ГруппаУправлениеФлажками</name> + <id>134</id> + <items xsi:type="form:Button"> + <name>ПечатныеФормыУстановитьФлажки</name> + <id>126</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ПечатныеФормыУстановитьФлажкиРасширеннаяПодсказка</name> + <id>127</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Command.УстановитьФлажки</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> + <items xsi:type="form:Button"> + <name>ПечатныеФормыСнятьФлажки</name> + <id>124</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ПечатныеФормыСнятьФлажкиРасширеннаяПодсказка</name> + <id>125</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Command.СнятьФлажки</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <title> + <key>ru</key> + <value>Группа1</value> + + + ГруппаУправлениеФлажкамиРасширеннаяПодсказка + 135 + Label + true + true + + Left + + + + Compact + + + + ГруппаУправлениеСтроками + 136 + + ПечатныеФормыПереместитьВверх + 130 + true + true + + true + + + ПечатныеФормыПереместитьВверхРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + Form.Item.ПечатныеФормы.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ПечатныеФормыПереместитьВниз + 132 + true + true + + true + + + ПечатныеФормыПереместитьВнизРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + Form.Item.ПечатныеФормы.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + ГруппаУправлениеСтрокамиРасширеннаяПодсказка + 137 + Label + true + true + + Left + + + + Compact + + + true + true + + true + + + <key>ru</key> + <value>Печатные формы группа1</value> + + + ГруппаУправленияСпискомДокументовРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + + Compact + + + true + true + + true + + + <key>ru</key> + <value>Командная панель левая часть</value> + + false + + КоманднаяПанельЛеваяЧастьРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + CommandBar + + Left + + + + НастройкаПодписиИПечати + 38 + VeryHigh + + ФлажокПодписьИПечать + 53 + VeryHigh + true + true + + true + + + ПодписьИПечать + + Right + Button + + OnChange + ФлажокПодписьИПечатьПриИзменении + + + ФлажокПодписьИПечатьРасширеннаяПодсказка + 55 + + <key>ru</key> + <value><fontstyle -31><fontsize 10>Добавить факсимильную подпись и печать в печатную форму</></></value> + + true + Label + true + true + + Left + + + + ФлажокПодписьИПечатьКонтекстноеМеню + 54 + true + + CheckBoxField + Enter + true + Left + true + + + + ФлажокОбъединитьДокументы + 65 + VeryHigh + true + true + + true + + + ОбъединитьДокументы + + Right + Button + + OnChange + ОбъединитьДокументыПриИзменении + + + ФлажокОбъединитьДокументыРасширеннаяПодсказка + 67 + + <key>ru</key> + <value>Вывод всех сформированных документов в одном документе</value> + + Label + true + true + + Left + + + + ФлажокОбъединитьДокументыКонтекстноеМеню + 66 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Настройка подписи и печати</value> + + + НастройкаПодписиИПечатиРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + + КоманднаяПанельПраваяЧасть + 12 + + Язык + 22 + true + true + + true + + + <key>ru</key> + <value>Язык</value> + + + ЯзыкРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + ГруппаСохранитьИОтправить + 24 + + Сохранить + 18 + true + true + + true + + + СохранитьРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.Command.Сохранить + Normal + Picture + true + true + UserCmds + Auto + InCommandBar + + + Отправить + 20 + true + true + + true + + + ОтправитьРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + Form.Command.Отправить + Normal + Picture + true + true + UserCmds + Auto + InCommandBar + + true + true + + true + + + <key>ru</key> + <value>Сохранить и отправить</value> + + + ГруппаСохранитьИОтправитьРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + + true + true + + true + + + <key>ru</key> + <value>Командная панель правая часть</value> + + + КоманднаяПанельПраваяЧастьРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + CommandBar + + Left + + + + КоманднаяПанельЕще + 34 + + ГруппаСохранитьИОтправитьВсеДействия + 45 + + КнопкаСохранитьВсеДействия + 47 + true + true + + true + + + КнопкаСохранитьВсеДействияРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + Form.Command.Сохранить + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + КнопкаОтправитьВсеДействия + 49 + true + true + + true + + + КнопкаОтправитьВсеДействияРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + Form.Command.Отправить + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Группа сохранить и отправить все действия</value> + + + ГруппаСохранитьИОтправитьВсеДействияРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + + + ГруппаРедактированиеМакета + 51 + + КнопкаИзменитьМакет + 95 + true + true + + true + + + КнопкаИзменитьМакетРасширеннаяПодсказка + 96 + Label + true + true + + Left + + + Form.Command.ИзменитьМакет + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ПерейтиКУправлениюМакетами + 16 + true + true + + true + + + ПерейтиКУправлениюМакетамиРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + Form.Command.ПерейтиКУправлениюМакетами + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Редактирование макета</value> + + + ГруппаРедактированиеМакетаРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + + + ГруппаУправлениеСтрокамиЕще + 143 + + ПечатныеФормыПереместитьВверхЕще + 145 + true + true + + true + + + ПечатныеФормыПереместитьВверхЕщеРасширеннаяПодсказка + 146 + Label + true + true + + Left + + + Form.Item.ПечатныеФормы.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ПечатныеФормыПереместитьВнизЕще + 147 + true + true + + true + + + ПечатныеФормыПереместитьВнизЕщеРасширеннаяПодсказка + 148 + Label + true + true + + Left + + + Form.Item.ПечатныеФормы.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ПечатныеФормПереставитьСтрокиЕще + 149 + true + true + + true + + + ПечатныеФормПереставитьСтрокиЕщеРасширеннаяПодсказка + 150 + Label + true + true + + Left + + + Form.Item.ПечатныеФормы.StandardCommand.ShowRowRearrangement + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Управление строками</value> + + + ГруппаУправлениеСтрокамиЕщеРасширеннаяПодсказка + 144 + Label + true + true + + Left + + + + Compact + + + + ИзменитьФорму + 43 + true + true + + true + + + ИзменитьФормуРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 28 + + <key>ru</key> + <value>Справка</value> + + true + true + + true + + + СправкаРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель еще</value> + + + КоманднаяПанельЕщеРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + CommandBar + + Left + + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + ГруппаКоманднаяПанельРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + + ГруппаДополнительнаяИнформация + 100 + + КартинкаИнформации + 102 + + <key>ru</key> + <value>Картинка информации</value> + + true + true + + true + + + КартинкаИнформацииРасширеннаяПодсказка + 104 + Label + true + true + + Left + + + + КартинкаИнформацииКонтекстноеМеню + 103 + true + + true + true + + + StdPicture.Information + + + + + ДополнительнаяИнформация + 105 + + <key>ru</key> + <value>С этим контрагентом возможен электронный документооборот. <link ПерейтиКНастройкамЭлектронногоДокументооборота>Перейти к настройкам</></value> + + true + true + + true + + + ДополнительнаяИнформацияРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + + ДополнительнаяИнформацияКонтекстноеМеню + 106 + true + + true + Label + true + true + + + URLProcessing + ДополнительнаяИнформацияОбработкаНавигационнойСсылки + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Дополнительная информация</value> + + + ГруппаДополнительнаяИнформацияРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + + ГруппаДокументы + 68 + + ПечатныеФормы + 70 + + <key>ru</key> + <value>Печатные формы</value> + + true + true + + true + + + ПечатныеФормы + + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + SelectAll + ShowMultipleSelection + SortListAsc + SortListDesc + + ПечатныеФормыПометка + 121 + true + true + + true + + + ПечатныеФормы.Пометка + + None + + OnChange + ПечатныеФормыПометкаПриИзменении + + + ПечатныеФормыПометкаРасширеннаяПодсказка + 123 + Label + true + true + + Left + + + + ПечатныеФормыПометкаКонтекстноеМеню + 122 + true + + CheckBoxField + Enter + true + + StdPicture.Print + + Left + true + + + + КартинкаПредставление + 141 + + ПечатныеФормыКартинка + 138 + true + true + + true + + + ПечатныеФормы.Картинка + + + ПечатныеФормыКартинкаРасширеннаяПодсказка + 140 + Label + true + true + + Left + + + + ПечатныеФормыКартинкаКонтекстноеМеню + 139 + true + + PictureField + Auto + Left + true + + true + true + true + true + + CommonPicture.ТипыМакетов + + + + 1 + + AsFileRef + + + + ПечатныеФормыПредставление + 92 + + <key>ru</key> + <value>Печатная форма</value> + + true + true + + true + + + ПечатныеФормы.Представление + + Top + + ПечатныеФормыПредставлениеРасширеннаяПодсказка + 94 + Label + true + true + + Left + + + + ПечатныеФормыПредставлениеКонтекстноеМеню + 93 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Печатные формы группа1</value> + + + КартинкаПредставлениеРасширеннаяПодсказка + 142 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + ПечатныеФормыКоманднаяПанель + 71 + Left + + + Selection + ПечатныеФормыВыбор + + + ПечатныеФормыСтрокаПоиска + 74 + + ПечатныеФормыСтрокаПоискаРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + ПечатныеФормыСтрокаПоискаКонтекстноеМеню + 75 + true + + ПечатныеФормы + + true + + + + ПечатныеФормыСостояниеПросмотра + 80 + + ПечатныеФормыСостояниеПросмотраРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + + ПечатныеФормыСостояниеПросмотраКонтекстноеМеню + 81 + true + + ViewStatusAddition + ПечатныеФормы + + true + + + + ПечатныеФормыУправлениеПоиском + 77 + + ПечатныеФормыУправлениеПоискомРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + ПечатныеФормыУправлениеПоискомКонтекстноеМеню + 78 + true + + SearchControlAddition + ПечатныеФормы + + true + + + + ПечатныеФормыРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + ПечатныеФормыКонтекстноеМеню + 72 + true + + Tree + true + true + true + true + MultiRow +
        true
        + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + Auto + Auto + true + true + AsFileRef + Top + true + +
        + + ГруппаИнструкция + 119 + + Инструкция + 7 + true + true + + true + + + Инструкция + + None + + ИнструкцияРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ИнструкцияКонтекстноеМеню + 8 + true + + HTMLDocumentField + Enter + true + Left + true + + + OnClick + ИнструкцияПриНажатии + + 50 + true + 10 + true + true + true + Disable + + + true + true + + true + + + <key>ru</key> + <value>Инструкция</value> + + + ГруппаИнструкцияРасширеннаяПодсказка + 120 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Документы</value> + + + ГруппаДокументыРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + +
        + + Отступ + 56 + + БольшеНеПоказывать + 58 + true + true + + true + + + БольшеНеПоказывать + + Right + 1 + + ru + Форма печати больше не будет открываться при формировании печатных форм. Офисные документы будут открываться сразу. + + + OnChange + БольшеНеПоказыватьПриИзменении + + + БольшеНеПоказыватьРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + БольшеНеПоказыватьКонтекстноеМеню + 59 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Отступ</value> + + Bottom + + ОтступРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + + + ChoiceProcessing + ОбработкаВыбора + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + 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 + + Boolean + + + true + + + true + + + + АдресОбъектовПечати + 4 + + String + + + + true + + + true + + + + ОбъединитьДокументы + + <key>ru</key> + <value>Одним документом</value> + + 5 + + Boolean + + + true + + + true + + + + ПечатныеФормы + + <key>ru</key> + <value>Печатные формы</value> + + 6 + + ValueTable + + + true + + + true + + + ОбъектПечати + 7 + + AnyRef + + + true + + + true + + + + АдресПечатнойФормы + 9 + + String + + + + true + + + true + + + + ИдентификаторПечатнойФормы + 10 + + String + + + + true + + + true + + + + Представление + + <key>ru</key> + <value>Представление</value> + + 11 + + String + + + + true + + + true + + + + ПутьКМакету + 13 + + String + + + + true + + + true + + + + ТекущийЯзык + 14 + + String + + + + true + + + true + + + + ПодписьИПечать + 15 + + Boolean + + + true + + + true + + + + ИмяФайлаПечатнойФормы + 16 + + String + + + + true + + + true + + + + ИмяМакета + 17 + + String + + + + true + + + true + + + + ДоступныеЯзыки + 18 + + String + + + + true + + + true + + + + ДоступенВыводНаДругихЯзыках + 19 + + Boolean + + + true + + + true + + + + Пометка + + <key>ru</key> + <value>Пометка</value> + + 33 + + Boolean + + + true + + + true + + + + Картинка + + <key>ru</key> + <value>Картинка</value> + + 38 + + Number + + 10 + + + + true + + + true + + + + + НастройкиПечатныхФорм + 22 + + ValueTable + + + true + + + true + + + Представление + 1 + + String + + + + true + + + true + + + + Количество + 2 + + Number + + 3 + true + + + + true + + + true + + + + Печатать + 3 + + Boolean + + + true + + + true + + + + ИмяСтраницы + 4 + + String + + + + true + + + true + + + + ИмяРеквизита + 5 + + String + + + + true + + + true + + + + ИмяМакета + 6 + + String + + + + true + + + true + + + + ПозицияПоУмолчанию + 7 + + Number + + 10 + true + + + + true + + + true + + + + Название + 8 + + String + + + + true + + + true + + + + ПутьКМакету + 9 + + String + + + + true + + + true + + + + ИмяФайлаПечатнойФормы + 10 + + String + + + + true + + + true + + + + ОфисныеДокументы + 11 + + String + + + + true + + + true + + + + ПодписьИПечать + 12 + + Boolean + + + true + + + true + + + + ДоступенВыводНаДругихЯзыках + 13 + + Boolean + + + true + + + true + + + + ТекущийЯзык + 14 + + String + + + + true + + + true + + + + ДоступныеЯзыки + 15 + + String + + + + true + + + true + + + + + ТекущийЯзык + 23 + + String + + + + true + + + true + + + + ОбъектыПечати + 24 + + ValueList + + + true + + + true + + + + + + + ТребуетсяПереформирование + 25 + + Boolean + + + true + + + true + + + + ПодготовленнаяПечатнаяФорма + 27 + + String + + + + true + + + true + + + + РасширениеДляРаботыСФайламиПодключено + 28 + + Boolean + + + true + + + true + + + + ПараметрыВывода + 29 + + + true + + + true + + + + УникальныйИдентификаторХранилища + 30 + + UUID + + + true + + + true + + + + СписокФайловДляУдаления + 31 + + ValueList + + + true + + + true + + + + + + + ПредставлениеЕдиногоДокумента + 35 + + String + + + + true + + + true + + + + АдресСтруктурыЕдиногоДокумента + 37 + + String + + + + true + + + true + + + + ПредварительныйПросмотр + + <key>ru</key> + <value>Предварительный просмотр</value> + + 1 + + ru + Предварительный просмотр перед его печатью + + + true + + + CommonPicture.ПредварительныйПросмотрКартинка + + + + ПредварительныйПросмотр + + + Picture + Auto + Auto + + + ПерейтиКУправлениюМакетами + + <key>ru</key> + <value>Перейти к макетам печатных форм</value> + + 3 + + ru + Перейти к управлению макетами + + + true + + + + ПерейтиКУправлениюМакетами + + + Picture + DontUse + Auto + + + Сохранить + + <key>ru</key> + <value>Сохранить...</value> + + 4 + + ru + Сохранить на диске или в качестве присоединенного файла к объекту + + + true + + + StdPicture.SaveFile + + + + Сохранить + + + TextPicture + DontUse + Auto + + + Отправить + + <key>ru</key> + <value>Отправить...</value> + + 5 + + ru + Отправить по почте + + + true + + + CommonPicture.ОтправитьЭлектронноеПисьмо + + + + Отправить + + + TextPicture + DontUse + Auto + + + ИзменитьМакет + + <key>ru</key> + <value>Изменить макет...</value> + + 8 + + ru + Открыть макет для редактирования + + + true + + + CommonPicture.РедактироватьМакет + + + + ИзменитьМакет + + + Picture + DontUse + Auto + + + Печать + + <key>ru</key> + <value>Печать</value> + + 9 + + ru + Напечатать на принтере + + + true + + Ctrl+Shift+P + + StdPicture.PrintImmediately + + + + Печать + + + Auto + Auto + + + СнятьФлажки + + <key>ru</key> + <value>Снять флажки</value> + + 10 + + true + + + StdPicture.UncheckAll + + + + СнятьФлажки + + + Picture + Auto + Auto + + + УстановитьФлажки + + <key>ru</key> + <value>Установить флажки</value> + + 11 + + true + + + StdPicture.CheckAll + + + + УстановитьФлажки + + + Picture + Auto + Auto + + + ОфисныеДокументы + + + + АдресНастройкиПечатныхФорм + + String + + 150 + + + + + ПараметрыВывода + + + + АдресСтруктурыЕдиногоДокумента + + String + + + + + + + + diff --git a/SSL/src/CommonForms/ПечатьДокументовOfficeOpen/Help/ru.html b/SSL/src/CommonForms/ПечатьДокументовOfficeOpen/Help/ru.html new file mode 100644 index 000000000..323672275 --- /dev/null +++ b/SSL/src/CommonForms/ПечатьДокументовOfficeOpen/Help/ru.html @@ -0,0 +1,29 @@ + +

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

        +

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

        +

        Предусмотрены следующие возможности:

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

        Форма печати офисных документов

        +

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

        +

        Форма предоставляет возможности:

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

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

        +

        Сохранение печатных форм

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

        Отправка по электронной почте

        +

        Сформированные печатные формы документа можно Отправить в качестве вложений в электронном письме.

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

        Переход к списку макетов печатных форм

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

        Формирование печатной формы на другом языке

        +
        +
        • Если для печатной формы предусмотрен вывод на других языках, то при просмотре печатной формы появляется меню выбора языка. Выберите необходимый язык, печатная форма переформируется на этом языке. Можно проверить печатную форму и распечатать. Если в печатной форме наблюдаются ошибки, следует проверить корректность перевода макета, элементов списков и валюты.
        \ No newline at end of file diff --git a/SSL/src/CommonForms/ПечатьДокументовOfficeOpen/Module.bsl b/SSL/src/CommonForms/ПечатьДокументовOfficeOpen/Module.bsl new file mode 100644 index 000000000..adf7cc9d1 --- /dev/null +++ b/SSL/src/CommonForms/ПечатьДокументовOfficeOpen/Module.bsl @@ -0,0 +1,1578 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем СтруктураЕдиногоДокумента; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если ЭтоАдресВременногоХранилища(Параметры.АдресНастройкиПечатныхФорм) Тогда + НастройкиПечатныхФормВходящие = ПолучитьИзВременногоХранилища(Параметры.АдресНастройкиПечатныхФорм); + Иначе + НастройкиПечатныхФормВходящие = РеквизитФормыВЗначение("НастройкиПечатныхФорм", Тип("ТаблицаЗначений")); + КонецЕсли; + + ПараметрыВывода = Параметры.ПараметрыВывода; + Если ПараметрыВывода = Неопределено Тогда + ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода(); + КонецЕсли; + + Если ЭтоАдресВременногоХранилища(Параметры.АдресСтруктурыЕдиногоДокумента) Тогда + АдресСтруктурыЕдиногоДокумента = Параметры.АдресСтруктурыЕдиногоДокумента; + КонецЕсли; + + ТаблицаПечатныхФорм = РеквизитФормыВЗначение("ПечатныеФормы", Тип("ТаблицаЗначений")); + + НастройкиСформированныхПечатныхФорм = Новый Соответствие; + + Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФормВходящие Цикл + ПечатныеФормыДокумента = ОбщегоНазначения.ЗначениеИзСтрокиXML(НастройкаПечатнойФормы.ОфисныеДокументы); + Для Каждого ПечатнаяФорма Из ПечатныеФормыДокумента Цикл + Если ЭтоАдресВременногоХранилища(ПечатнаяФорма.Ключ) Тогда + ЗаданныеИменаПечатныхФорм = ОбщегоНазначения.ЗначениеИзСтрокиXML(НастройкаПечатнойФормы.ИмяФайлаПечатнойФормы); + ПредставлениеПечатнойФормы = УправлениеПечатью.ИмяФайлаПечатнойФормыОбъекта(ПечатнаяФорма.Значение, ЗаданныеИменаПечатныхФорм, НастройкаПечатнойФормы.Название); + ДобавитьПечатнуюФорму(ТаблицаПечатныхФорм, НастройкаПечатнойФормы, ПечатнаяФорма, ПредставлениеПечатнойФормы); + СтруктураНастроек = Новый Структура("ПодписьИПечать, Пометка, ТекущийЯзык"); + ЗаполнитьЗначенияСвойств(СтруктураНастроек, НастройкаПечатнойФормы); + НастройкиСформированныхПечатныхФорм.Вставить(ПечатнаяФорма.Ключ, СтруктураНастроек); + НоваяНастройка = НастройкиПечатныхФорм.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяНастройка, НастройкаПечатнойФормы,,"ОфисныеДокументы"); + ОфисныеДокументы = Новый Соответствие; + ОфисныеДокументы.Вставить(ПечатнаяФорма.Ключ, ПечатнаяФорма.Значение); + НоваяНастройка.ОфисныеДокументы = ОбщегоНазначения.ЗначениеВСтрокуXML(ОфисныеДокументы); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + Элементы.Справка.Видимость = Ложь; + ИначеЕсли НастройкиПечатныхФорм.Количество() = 1 Тогда + Инструкция = ПолучитьТекстИнструкции(ТаблицаПечатныхФорм[0].Представление, ТаблицаПечатныхФорм[0].АдресПечатнойФормы); + Иначе + Инструкция = ПолучитьТекстИнструкции(); + КонецЕсли; + + ТаблицаПечатныхФорм.ЗаполнитьЗначения(0, "Картинка"); + + ЗначениеВДанныеФормы(ТаблицаПечатныхФорм, ПечатныеФормы); + НастроитьФорму(НастройкиПечатныхФорм.Количество()); + + ДополнительнаяИнформация = Новый Структура("Картинка, Текст", Новый Картинка, ""); + + ТаблицаОбъектовПечати = ПечатныеФормы.Выгрузить(,"ОбъектПечати"); + МассивСсылок = ТаблицаОбъектовПечати.ВыгрузитьКолонку("ОбъектПечати"); + ОбъектыПечати.ЗагрузитьЗначения(МассивСсылок); + + МассивСсылок = ОбъектыПечати.ВыгрузитьЗначения(); + + // ЭлектронноеВзаимодействие + Если ТипЗнч(МассивСсылок) = Тип("Массив") + И МассивСсылок.Количество() > 0 + И ОбщегоНазначения.ЗначениеСсылочногоТипа(МассивСсылок[0]) Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("ЭлектронноеВзаимодействие") Тогда + МодульЭлектронноеВзаимодействие = ОбщегоНазначения.ОбщийМодуль("ЭлектронноеВзаимодействие"); + МодульЭлектронноеВзаимодействие.ПриВыводеНавигационнойСсылкиВФормеОбъектаИБ(ДополнительнаяИнформация, МассивСсылок); + КонецЕсли; + КонецЕсли; + // Конец ЭлектронноеВзаимодействие + + Элементы.ДополнительнаяИнформация.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(ДополнительнаяИнформация.Текст); + Элементы.КартинкаИнформации.Картинка = ДополнительнаяИнформация.Картинка; + Элементы.ГруппаДополнительнаяИнформация.Видимость = Не ПустаяСтрока(Элементы.ДополнительнаяИнформация.Заголовок); + Элементы.КартинкаИнформации.Видимость = Элементы.КартинкаИнформации.Картинка.Вид <> ВидКартинки.Пустая; + + ИнтеграцияПодсистемБСП.ПечатьДокументовПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка); + УправлениеПечатьюПереопределяемый.ПечатьДокументовПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка); + + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + Элементы.КоманднаяПанельЛеваяЧасть.Видимость = Ложь; + Элементы.КоманднаяПанельПраваяЧасть.Видимость = Ложь; + Элементы.ПечатныеФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто; + Элементы.КнопкаОтправитьВсеДействия.КнопкаПоУмолчанию = Истина; + Элементы.Справка.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; + Элементы.КнопкаИзменитьМакет.Видимость = Ложь; + Элементы.ФлажокПодписьИПечать.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто; + Элементы.ФлажокОбъединитьДокументы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто; + Элементы.ГруппаКоманднаяПанель.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + Элементы.НастройкаПодписиИПечати.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + Элементы.ПечатныеФормы.Шапка = Ложь; + Элементы.БольшеНеПоказывать.Видимость = Ложь; + БольшеНеПоказывать = Ложь; + Элементы.ГруппаИнструкция.Видимость = Ложь; + Элементы.Переместить(Элементы.Показать, Элементы.КоманднаяПанельЕще, Элементы.КнопкаСохранитьВсеДействия); + Элементы.Показать.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; + + Элементы.ПечатныеФормыУстановитьФлажки.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; + Элементы.ПечатныеФормыСнятьФлажки.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; + Элементы.Переместить(Элементы.ПечатныеФормыУстановитьФлажки, Элементы.КоманднаяПанельЕще); + Элементы.Переместить(Элементы.ПечатныеФормыСнятьФлажки, Элементы.КоманднаяПанельЕще); + + Элементы.ПерейтиКУправлениюМакетами.Видимость = Ложь; + + Иначе + БольшеНеПоказывать = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПечатьДокументовOfficeOpen", + "ВыводитьСразу", Истина); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда + МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); + МодульУправлениеПечатьюМультиязычность.ЗаполнитьПодменюЯзык(ЭтотОбъект, , ДоступныеЯзыкиПечатныхФорм()); + КонецЕсли; + + Элементы.ФлажокПодписьИПечать.Видимость = ЕстьПодписиИПечатиДляОбъектовПечати(); + + ОбъединитьДокументы = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПечатьДокументовOfficeOpen", + "ОднимДокументом", Ложь) И Элементы.ФлажокОбъединитьДокументы.Видимость; + + ПодписьИПечать = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПечатьДокументовOfficeOpen", + "ПодписьИПечать", Ложь); + + УстановитьЗаголовокФормы(); +КонецПроцедуры + + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если ЭтоАдресВременногоХранилища(АдресСтруктурыЕдиногоДокумента) Тогда + СтруктураЕдиногоДокумента = ПолучитьИзВременногоХранилища(АдресСтруктурыЕдиногоДокумента); + КонецЕсли; + + Если СтруктураЕдиногоДокумента = Неопределено Тогда + СтруктураЕдиногоДокумента = Новый Структура(); + СтруктураЕдиногоДокумента.Вставить("АдресПечатнойФормы", ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор)); + СтруктураЕдиногоДокумента.Вставить("ИмяФайлаПечатнойФормы"); + СтруктураЕдиногоДокумента.Вставить("Представление"); + СтруктураЕдиногоДокумента.Вставить("СоставЕдиногоДокумента", Новый Соответствие()); + + Если ОбъединитьДокументы Тогда + Оповещение = Новый ОписаниеОповещения("ПриЗавершенииФормированияПечатныхФорм", ЭтотОбъект); + НачатьПолучениеПечатныхФорм(СтруктураЕдиногоДокумента, Оповещение); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + Для Каждого ФайлДляУдаления Из СписокФайловДляУдаления Цикл + НачатьУдалениеФайлов(Новый ОписаниеОповещения, ФайлДляУдаления.Значение); + КонецЦикла; +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) + + ПараметрыВыбора = Новый Структура("ВыбранноеЗначение, ИсточникВыбора", ВыбранноеЗначение, ИсточникВыбора); + ОповещениеПродолжениеВыбора = Новый ОписаниеОповещения("ОбработкаВыбораПродолжение", ЭтотОбъект, ПараметрыВыбора); + Оповещение = Новый ОписаниеОповещения("ПриЗавершенииФормированияПечатныхФорм", ЭтотОбъект, ОповещениеПродолжениеВыбора); + + Если ВыбранноеЗначение.Свойство("Присоединить") И ВыбранноеЗначение.ВариантСохранения = "Присоединить" И ВыбранноеЗначение.Подписать Тогда + ВыполнитьОбработкуОповещения(ОповещениеПродолжениеВыбора); + ИначеЕсли ТребуетсяПереформирование Тогда + НачатьПолучениеПечатныхФорм(СтруктураЕдиногоДокумента, Оповещение) + Иначе + ВыполнитьОбработкуОповещения(ОповещениеПродолжениеВыбора); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "Запись_ПользовательскиеМакетыПечати" + И Источник.ВладелецФормы = ЭтотОбъект Тогда + ТребуетсяПереформирование = Истина; + ИначеЕсли (ИмяСобытия = "ОтказОтИзмененияМакета" + Или ИмяСобытия = "ОтменаРедактированияОфисногоДокумента" + И Источник.ВладелецФормы = ЭтотОбъект) Тогда + ЗаблокироватьФорму(); + ИначеЕсли ИмяСобытия = "Запись_ОфисныйДокумент" И Источник.ВладелецФормы = ЭтотОбъект Тогда + ТребуетсяПереформирование = Истина; + КонецЕсли; + + УправлениеПечатьюКлиентПереопределяемый.ПечатьДокументовОбработкаОповещения(ЭтотОбъект, ИмяСобытия, Параметр, Источник); + +КонецПроцедуры + + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Печать(Команда) + МассивПечатныхФорм = ПечатныеФормыСПометками(); + Если ТребуетсяПереформирование Тогда + Оповещение = Новый ОписаниеОповещения("ПечатьПродолжение", ЭтотОбъект, МассивПечатныхФорм); + НачатьПолучениеПечатныхФорм(СтруктураЕдиногоДокумента, Оповещение); + Иначе + ПечатьЗавершение(МассивПечатныхФорм); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПредварительныйПросмотр(Команда) + ОткрытьОтмеченныеПечатныеФормы(); +КонецПроцедуры + +&НаКлиенте +Процедура СнятьФлажки(Команда) + УстановитьПометкиНаСервере(Ложь); +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьФлажки(Команда) + УстановитьПометкиНаСервере(Истина); +КонецПроцедуры + +&НаСервере +Процедура УстановитьПометкиНаСервере(Пометка) + + ТребуетсяПереформирование = Истина; + + ТаблицаЗначений = ПечатныеФормы.Выгрузить(); + + ТаблицаЗначений.ЗаполнитьЗначения(Пометка, "Пометка"); + + ПечатныеФормы.Загрузить(ТаблицаЗначений); + +КонецПроцедуры + +&НаКлиенте +Процедура ПечатныеФормыПометкаПриИзменении(Элемент) + ТребуетсяПереформирование = Истина; +КонецПроцедуры + + +&НаКлиенте +Процедура ОткрытьМакетДляРедактирования() + + НастройкаПечатнойФормы = НастройкиПечатныхФорм[0]; + + ЗаблокироватьФорму(Истина); + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("ИмяОбъектаМетаданныхМакета", НастройкаПечатнойФормы.ПутьКМакету); + ПараметрыОткрытия.Вставить("Ссылка", СсылкаМакета(НастройкаПечатнойФормы.ПутьКМакету)); + ПараметрыОткрытия.Вставить("РежимОткрытияОкна", РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + ПараметрыОткрытия.Вставить("ИмяДокумента", НастройкаПечатнойФормы.Представление); + ПараметрыОткрытия.Вставить("ТипМакета", "MXL"); + ПараметрыОткрытия.Вставить("Редактирование", Истина); + ПараметрыОткрытия.Вставить("КодЯзыка", СтрРазделить(ТекущийЯзык, "_", Истина)[0]); + + ОткрытьФорму("ОбщаяФорма.РедактированиеДокументаOfficeOpen", ПараметрыОткрытия, ЭтотОбъект, "ПечатьДокументовOfficeOpen"); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьМакет(Команда) + ОткрытьМакетДляРедактирования(); +КонецПроцедуры + +&НаКлиенте +Процедура ПерейтиКУправлениюМакетами(Команда) + ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.МакетыПечатныхФорм"); +КонецПроцедуры + +&НаКлиенте +Процедура Сохранить(Команда) + + Оповещение = Новый ОписаниеОповещения("ПриПодключенииРасширения", ЭтотОбъект); + ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(Оповещение); + +КонецПроцедуры + +&НаКлиенте +Процедура Отправить(Команда) + ОтправитьПечатныеФормыПоПочте(); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПереключитьЯзык(Команда) + + УправлениеПечатьюКлиент.ПереключитьЯзык(ЭтотОбъект, Команда); + УстановитьЗаголовокФормы(); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПриПереключенииЯзыка(КодЯзыка, ДополнительныеПараметры) Экспорт + + ТребуетсяПереформирование = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбъединитьДокументыПриИзменении(Элемент) + ТребуетсяПереформирование = Истина; + ОбъединитьДокументыПриИзмененииНаСервере(ОбъединитьДокументы); +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ОбъединитьДокументыПриИзмененииНаСервере(Значение) + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ПечатьДокументовOfficeOpen", + "ОднимДокументом", Значение); +КонецПроцедуры + +&НаКлиенте +Процедура ФлажокПодписьИПечатьПриИзменении(Элемент) + ТребуетсяПереформирование = Истина; + ФлажокПодписьИПечатьПриИзмененииНаСервере(ПодписьИПечать); +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ФлажокПодписьИПечатьПриИзмененииНаСервере(Значение) + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ПечатьДокументовOfficeOpen", + "ПодписьИПечать", Значение); +КонецПроцедуры + +&НаКлиенте +Процедура ПечатныеФормыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + СтрокаВыбора = ПечатныеФормы.НайтиПоИдентификатору(ВыбраннаяСтрока); + + МассивПечатныхФорм = Новый Массив; + ДобавитьДанныеПечатнойФормы(МассивПечатныхФорм, СтрокаВыбора.АдресПечатнойФормы, + СтрокаВыбора.ИмяФайлаПечатнойФормы); + + ОткрытьПечатныеФормы(МассивПечатныхФорм); +КонецПроцедуры + +&НаКлиенте +Процедура ИнструкцияПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка) + Если ДанныеСобытия.Event.type = "click" И СтрНайти(ДанныеСобытия.Element.href, "ОткрытьЕдинственнуюПечатнуюФорму") Тогда + ОткрытьПечатныеФормы(); + СтандартнаяОбработка = ложь; + КонецЕсли; +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ЗаблокироватьФорму(Заблокировать = Ложь) + + ГруппаОтображенияДокументов = Элементы.ГруппаДокументы; + ГруппаОтображенияДокументов.ТолькоПросмотр = Заблокировать; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьЗаголовокФормы() + Перем ЗаголовокФормы; + + ПараметрыВывода.Свойство("ЗаголовокФормы", ЗаголовокФормы); + + Если Не ЗначениеЗаполнено(ЗаголовокФормы) Тогда + + Если ОбъектыПечати.Количество() > 1 Тогда + ЗаголовокФормы = НСтр("ru = 'Печать документов'"); + ИначеЕсли ОбъектыПечати.Количество() = 1 И ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ОбъектыПечати[0].Значение)) + И ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОбъектыПечати[0].Значение, "Ссылка", Истина) <> Неопределено Тогда + ЗаголовокФормы = Строка(ОбъектыПечати[0].Значение); + Иначе + ЗаголовокФормы = НСтр("ru = 'Печать документа'"); + КонецЕсли; + КонецЕсли; + + Если ЗначениеЗаполнено(ТекущийЯзык) Тогда + ТекущийЯзыкПредставление = Элементы["Язык_"+ТекущийЯзык].Заголовок; + ЗаголовокФормы = ЗаголовокФормы + " ("+ТекущийЯзыкПредставление+")"; + КонецЕсли; + + Заголовок = ЗаголовокФормы; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьОтмеченныеПечатныеФормы(ДополнительныеПараметры = Неопределено) Экспорт + МассивПечатныхФорм = ПечатныеФормыСПометками(); + ОткрытьПечатныеФормы(МассивПечатныхФорм); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьПечатныеФормы(МассивПечатныхФорм = Неопределено) + Если Не ТребуетсяПереформирование Тогда + + Если МассивПечатныхФорм = Неопределено Тогда + МассивПечатныхФорм = ПолучитьПечатныеФормы(СтруктураЕдиногоДокумента); + КонецЕсли; + + ОткрытьПечатныеФормыЗавершение(МассивПечатныхФорм); + + Иначе + Оповещение = Новый ОписаниеОповещения("ОткрытьПечатныеФормыПродолжение", ЭтотОбъект, МассивПечатныхФорм); + НачатьПолучениеПечатныхФорм(СтруктураЕдиногоДокумента, Оповещение); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура НастроитьФорму(КоличествоПечатныхФорм) + РежимМногихПечатныхФорм = КоличествоПечатныхФорм > 1; + + Если Не РежимМногихПечатныхФорм Тогда + Элементы.Показать.Заголовок = НСтр("ru = 'Показать'"); + КонецЕсли; + + Элементы.ФлажокОбъединитьДокументы.Видимость = РежимМногихПечатныхФорм; + Элементы.ПечатныеФормы.Видимость = РежимМногихПечатныхФорм Или ОбщегоНазначения.ЭтоМобильныйКлиент(); + Элементы.ГруппаУправленияСпискомДокументов.Видимость = Элементы.ПечатныеФормы.Видимость; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПолучитьТекстИнструкции(Представление = Неопределено, АдресПечатнойФормы = Неопределено) + + ТекстИнструкции = " + | + | + | + | + | + | + | + |
        + |

        %1

        + |
        + |
        + |

        %2

        + |

        + |
        + | + | + |"; + + + Если Представление = Неопределено Тогда + ТекстИнструкции = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстИнструкции, НСтр("ru = 'Документы сформированы и подготовлены к печати'"), НСтр("ru = 'Можно открыть документ для просмотра или отправить его на печать.'")); + Иначе + ТекстИнструкции = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстИнструкции, НСтр("ru = 'Документ сформирован и подготовлен к печати'"), ""+Представление+""); + КонецЕсли; + + Возврат ТекстИнструкции; +КонецФункции + +&НаКлиенте +Функция ПараметрыОжидания() + + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); + ПараметрыОжидания.ТекстСообщения = НСтр("ru = 'Изменились параметры формирования печатных форм.'"); + ПараметрыОжидания.ОповещениеПользователя.Показать = Ложь; + ПараметрыОжидания.ВыводитьОкноОжидания = Истина; + ПараметрыОжидания.Интервал = 1; + Возврат ПараметрыОжидания; + +КонецФункции + +&НаКлиенте +Процедура ОткрытьПечатныеФормыПродолжение(Результат, МассивПечатныхФорм) Экспорт + Если Результат.Статус = "Ошибка" Тогда + ВызватьИсключение Результат.КраткоеПредставлениеОшибки; + Иначе + СтруктураЕдиногоДокумента = ПолучитьИзВременногоХранилища(Результат.АдресРезультата); + МассивПечатныхФорм = ПолучитьПечатныеФормы(СтруктураЕдиногоДокумента, МассивПечатныхФорм); + ОткрытьПечатныеФормыЗавершение(МассивПечатныхФорм); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьПечатныеФормыЗавершение(МассивПечатныхФорм) + + Если ОбъединитьДокументы И МассивПечатныхФорм.ВГраница() Тогда + ОткрытьОфисныйДокумент(СтруктураЕдиногоДокумента.АдресПечатнойФормы, СтруктураЕдиногоДокумента.ИмяФайлаПечатнойФормы); + Иначе + Для Каждого ПечатнаяФорма Из МассивПечатныхФорм Цикл + ОткрытьОфисныйДокумент(ПечатнаяФорма.АдресПечатнойФормы, ПечатнаяФорма.ИмяФайлаПечатнойФормы); + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьОфисныйДокумент(АдресДокумента, ИмяФайлаДляОткрытия) + ДополнительныеПараметры = Новый Структура("АдресДокумента, ОбработчикЗавершения, ИмяФайлаДляОткрытия"); + ДополнительныеПараметры.АдресДокумента = АдресДокумента; + ДополнительныеПараметры.ОбработчикЗавершения = Неопределено; + ДополнительныеПараметры.ИмяФайлаДляОткрытия = ИмяФайлаДляОткрытия; + + Оповещение = Новый ОписаниеОповещения("ОткрытьОфисныйДокументПослеПолученияВременногоКаталога", ЭтотОбъект, ДополнительныеПараметры); + ФайловаяСистемаКлиент.СоздатьВременныйКаталог(Оповещение); +КонецПроцедуры + +// Продолжение процедуры ОткрытьОфисныйДокумент. +&НаКлиенте +Процедура ОткрытьОфисныйДокументПослеПолученияВременногоКаталога(ИмяКаталога, ДополнительныеПараметры) Экспорт + + Оповещение = Новый ОписаниеОповещения("ОткрытьПослеСохранениеУКлиента", ЭтотОбъект, ДополнительныеПараметры.ОбработчикЗавершения); + ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла(); + ПараметрыСохранения.Интерактивно = Ложь; + + ИмяФайлаДляОткрытия = ИмяКаталога+"\"+ДополнительныеПараметры.ИмяФайлаДляОткрытия; + ФайловаяСистемаКлиент.СохранитьФайл(Оповещение, ДополнительныеПараметры.АдресДокумента, ИмяФайлаДляОткрытия, ПараметрыСохранения); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьПослеСохранениеУКлиента(ПолученныеФайлы, ОбработчикЗавершения) Экспорт + Если ПолученныеФайлы <> Неопределено Тогда + ПутьКФайлу = ПолученныеФайлы[0].ПолноеИмя; + ИмяФайла = ПолученныеФайлы[0].Имя; + + ПараметрыЗавершения = Новый Структура; + ПараметрыЗавершения.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); + ПараметрыЗавершения.Вставить("ПутьКФайлу", ПутьКФайлу); + ПараметрыЗавершения.Вставить("ИмяФайла", ИмяФайла); + + ФайлНаДиске = Новый Файл(ПутьКФайлу); + ОписаниеПослеУстановкиТолькоЧтения = Новый ОписаниеОповещения("ОткрытьФайлЗавершение", ЭтотОбъект, ПараметрыЗавершения); + ФайлНаДиске.НачатьУстановкуТолькоЧтения(ОписаниеПослеУстановкиТолькоЧтения, Не ДоступноРедактированиеПечатнойФормы()); + КонецЕсли; + + ВыполнитьОбработкуОповещения(ОбработчикЗавершения); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФайлЗавершение(ПараметрыЗавершения) Экспорт + ОбработчикЗавершения = ПараметрыЗавершения.ОбработчикЗавершения; + ПутьКФайлу = ПараметрыЗавершения.ПутьКФайлу; + ИмяФайла = ПараметрыЗавершения.ИмяФайла; + + ПараметрыОткрытияФайла = ФайловаяСистемаКлиент.ПараметрыОткрытияФайла(); + ФайловаяСистемаКлиент.ОткрытьФайл(ПутьКФайлу, ОбработчикЗавершения, ИмяФайла, ПараметрыОткрытияФайла); +КонецПроцедуры + +&НаСервере +Функция ДоступноРедактированиеПечатнойФормы() + Возврат Пользователи.РолиДоступны("РедактированиеПечатныхФорм"); +КонецФункции + +&НаСервере +Функция ДлительнаяОперацияПолученияПечатныхФорм(СтруктураЕдиногоДокумента) + + ТребуетсяПереформирование = Ложь; + ТаблицаПечатныхФорм = ПечатныеФормы.Выгрузить(); + ТаблицаПечатныхФорм.Колонки.Добавить("ФормироватьЗаново", Новый ОписаниеТипов("Булево")); + + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); + ПараметрыВыполнения.ЗапуститьВФоне = Истина; + ПараметрыВыполнения.ОжидатьЗавершение = 1; + + ПараметрыФормирования = Новый Структура("ПереформироватьЕдиныйДокумент", Ложь); + + СоставЕдиногоДокумента = СтруктураЕдиногоДокумента.СоставЕдиногоДокумента; + + Для Каждого НастройкаПечатнойФормы Из ТаблицаПечатныхФорм Цикл + + НастройкаПечатнойФормы.ФормироватьЗаново = НастройкаПечатнойФормы.Пометка + И (ПодписьИПечать <> НастройкаПечатнойФормы.ПодписьИПечать + ИЛИ (ТекущийЯзык <> НастройкаПечатнойФормы.ТекущийЯзык И ТекущийЯзык <> "")); + + НастройкаПечатнойФормы.ПодписьИПечать = ПодписьИПечать; + НастройкаПечатнойФормы.ТекущийЯзык = ТекущийЯзык; + + КонецЦикла; + + + Если ПолучитьИзВременногоХранилища(СтруктураЕдиногоДокумента.АдресПечатнойФормы) <> Неопределено Тогда + Для Каждого НастройкаПечатнойФормы Из СоставЕдиногоДокумента Цикл + НастройкаСформированнойПечатнойФормы = ТаблицаПечатныхФорм.Найти(НастройкаПечатнойФормы.Ключ, "АдресПечатнойФормы"); + Если НастройкаСформированнойПечатнойФормы = Неопределено Тогда + ПараметрыФормирования.ПереформироватьЕдиныйДокумент = Истина; + Иначе + + Для Каждого ПараметрНастройки Из НастройкаПечатнойФормы.Значение Цикл + ПараметрыФормирования.ПереформироватьЕдиныйДокумент = ПараметрыФормирования.ПереформироватьЕдиныйДокумент + ИЛИ ПараметрНастройки.Значение <> НастройкаСформированнойПечатнойФормы[ПараметрНастройки.Ключ]; + КонецЦикла; + + ПараметрыФормирования.ПереформироватьЕдиныйДокумент = ПараметрыФормирования.ПереформироватьЕдиныйДокумент + ИЛИ Не НастройкаСформированнойПечатнойФормы.Пометка; + КонецЕсли; + КонецЦикла; + + МассивНайденныхСтрок = ТаблицаПечатныхФорм.НайтиСтроки(Новый Структура("Пометка", Истина)); + Для Каждого НайденнаяСтрока Из МассивНайденныхСтрок Цикл + ПараметрыФормирования.ПереформироватьЕдиныйДокумент = ПараметрыФормирования.ПереформироватьЕдиныйДокумент + ИЛИ СоставЕдиногоДокумента[НайденнаяСтрока.АдресПечатнойФормы] <> Неопределено; + КонецЦикла; + + ПараметрыФормирования.ПереформироватьЕдиныйДокумент = ОбъединитьДокументы И ПараметрыФормирования.ПереформироватьЕдиныйДокумент; + Иначе + ПараметрыФормирования.ПереформироватьЕдиныйДокумент = Истина; + КонецЕсли; + + ОфисныеДокументы = Новый Соответствие(); + Для Каждого СтрокаТаблицыПечатныхФорм Из ТаблицаПечатныхФорм Цикл + ОфисныеДокументы.Вставить(СтрокаТаблицыПечатныхФорм.АдресПечатнойФормы, ПолучитьИзВременногоХранилища(СтрокаТаблицыПечатныхФорм.АдресПечатнойФормы)); + КонецЦикла; + ТаблицаПечатныхФорм.ЗаполнитьЗначения(0, "Картинка"); + ПечатныеФормы.Загрузить(ТаблицаПечатныхФорм); + + Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, "УправлениеПечатьюСлужебный.СформироватьПечатныеФормы", ТаблицаПечатныхФорм, ПараметрыФормирования, ОфисныеДокументы, СтруктураЕдиногоДокумента); + +КонецФункции + +&НаСервере +Функция ПолучитьПечатныеФормы(СтруктураЕдиногоДокумента, МассивПечатныхФормОграничение = Неопределено) + МассивПечатныхФорм = Новый Массив; + + ТаблицаПечатныхФорм = РеквизитФормыВЗначение("ПечатныеФормы", Тип("ТаблицаЗначений")); + + Если ОбъединитьДокументы Тогда + ДобавитьДанныеПечатнойФормы(МассивПечатныхФорм, СтруктураЕдиногоДокумента.АдресПечатнойФормы, СтруктураЕдиногоДокумента.ИмяФайлаПечатнойФормы); + Иначе + Если МассивПечатныхФормОграничение = Неопределено Тогда + Для Каждого СтрокаПечатнойФормы Из ТаблицаПечатныхФорм Цикл + Если СтрокаПечатнойФормы.Пометка Тогда + ДобавитьДанныеПечатнойФормы(МассивПечатныхФорм, СтрокаПечатнойФормы.АдресПечатнойФормы, + СтрокаПечатнойФормы.ИмяФайлаПечатнойФормы); + КонецЕсли; + КонецЦикла; + Иначе + Для Каждого СтрокаПечатнойФормы Из МассивПечатныхФормОграничение Цикл + ДобавитьДанныеПечатнойФормы(МассивПечатныхФорм, СтрокаПечатнойФормы.АдресПечатнойФормы, + СтрокаПечатнойФормы.ИмяФайлаПечатнойФормы); + КонецЦикла; + КонецЕсли; + КонецЕсли; + + Возврат МассивПечатныхФорм; +КонецФункции + +&НаСервере +Функция ПечатныеФормыСПометками() + + ТаблицаПечатныхФорм = ПечатныеФормы.Выгрузить(); + + МассивНайденныхСтрок = ТаблицаПечатныхФорм.НайтиСтроки(Новый Структура("Пометка", Истина)); + Если МассивНайденныхСтрок.Количество() <> 0 Тогда + МассивПечатныхФорм = Новый Массив(); + Для Каждого СтрокаПечатнойФормы Из МассивНайденныхСтрок Цикл + ДобавитьДанныеПечатнойФормы(МассивПечатныхФорм, СтрокаПечатнойФормы.АдресПечатнойФормы, + СтрокаПечатнойФормы.ИмяФайлаПечатнойФормы); + КонецЦикла; + Возврат МассивПечатныхФорм; + Иначе + Возврат Новый Массив + КонецЕсли; +КонецФункции + +&НаСервере +Процедура ДобавитьДанныеПечатнойФормы(МассивПечатныхФорм, Знач АдресПечатнойФормы, Знач ИмяФайлаПечатнойФормы) + ПечатнаяФорма = Новый Структура("АдресПечатнойФормы, Представление, ИмяФайлаПечатнойФормы"); + ПечатнаяФорма.АдресПечатнойФормы = АдресПечатнойФормы; + ПечатнаяФорма.Представление = ИмяФайлаПечатнойФормы; + ПечатнаяФорма.ИмяФайлаПечатнойФормы = ИмяФайлаПечатнойФормы; + МассивПечатныхФорм.Добавить(ПечатнаяФорма); +КонецПроцедуры + +&НаСервере +Функция СсылкаМакета(ИмяОбъектаМетаданныхМакета) + + Возврат Справочники.МакетыПечатныхФорм.СсылкаМакета(ИмяОбъектаМетаданныхМакета); + +КонецФункции + +&НаСервере +Функция ЕстьПодписиИПечатиДляОбъектовПечати() + + Результат = Ложь; + + ПодписиИПечатиОбъектов = УправлениеПечатью.ПодписиИПечатиОбъектов(ОбъектыПечати); + Для Каждого ПодписиИПечатиОбъекта Из ПодписиИПечатиОбъектов Цикл + КоллекцияПодписейИПечатей = ПодписиИПечатиОбъекта.Значение; + Для Каждого ПодписьПечать Из КоллекцияПодписейИПечатей Цикл + Картинка = ПодписьПечать.Значение; // Картинка + Если Картинка.Вид <> ВидКартинки.Пустая Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Процедура ПриЗавершенииФормированияПечатныхФорм(Результат, ОбработкаПродолжения) Экспорт + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Результат.Статус = "Ошибка" Тогда + ВызватьИсключение Результат.КраткоеПредставлениеОшибки; + КонецЕсли; + СтруктураЕдиногоДокумента = ПолучитьИзВременногоХранилища(Результат.АдресРезультата); + + Если ОбработкаПродолжения <> Неопределено Тогда + ВыполнитьОбработкуОповещения(ОбработкаПродолжения); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаВыбораПродолжение(Результат, ПараметрыВыбора) Экспорт + + ВыбранноеЗначение = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(ПараметрыВыбора.ВыбранноеЗначение); + ИсточникВыбора = ПараметрыВыбора.ИсточникВыбора; + + Если Не ВыбранноеЗначение.Свойство("ОбъектПечати") Тогда + ВладелецФормыВыбора = ИсточникВыбора.ВладелецФормы; + СписокОбъектовПечати = ВладелецФормыВыбора.ОбъектыПечати; + ВыбранноеЗначение.Вставить("ОбъектПечати", СписокОбъектовПечати[0].Значение); + КонецЕсли; + + ВариантСохранения = Неопределено; + ВыбранноеЗначение.Свойство("ВариантСохранения", ВариантСохранения); + СписокВложений = Неопределено; + Если ОбъединитьДокументы И ВариантСохранения <> "Присоединить" Тогда + Вложение = Новый Структура("АдресВоВременномХранилище, Название, Печать, Представление, ОбъектПечати"); + Вложение.АдресВоВременномХранилище = СтруктураЕдиногоДокумента.АдресПечатнойФормы; + Вложение.Название = СтруктураЕдиногоДокумента.ИмяФайлаПечатнойФормы; + Вложение.Печать = Истина; + Вложение.Представление = СтруктураЕдиногоДокумента.ИмяФайлаПечатнойФормы; + Вложение.ОбъектПечати = ВыбранноеЗначение.ОбъектПечати; + СписокВложений = Новый Массив; + СписокВложений.Добавить(Вложение); + КонецЕсли; + ВыбранноеЗначение.Вставить("СписокВложений", СписокВложений); + + Если ВыбранноеЗначение.Подписать Тогда + ФайлыВоВременномХранилище = ПоместитьОфисныеДокументыВоВременноеХранилище(ВыбранноеЗначение,,Истина); + + Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.СохранениеПечатнойФормы") Тогда + Если ВыбранноеЗначение.ВариантСохранения = "Присоединить" Тогда + ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, ВыбранноеЗначение); + ЗаписанныеОбъекты = ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище); + ПараметрыВыбора.Вставить("ЗаписанныеОбъекты", ЗаписанныеОбъекты); + ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеОбработкиВыбора", ЭтотОбъект, ПараметрыВыбора); + ПодписатьЗаписанныеОбъекты(ЗаписанныеОбъекты, ОписаниеОповещения); + Возврат; + КонецЕсли; + КонецЕсли; + + ПодписатьФайлы(ФайлыВоВременномХранилище, ПараметрыВыбора); + Иначе + ЗавершениеОбработкиВыбора(Истина, ПараметрыВыбора); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПодписатьЗаписанныеОбъекты(ЗаписанныеОбъекты, ОповещениеЗавершенияПодписания) + ДополнительныеПараметры = Новый Структура("ОбработкаРезультата", ОповещениеЗавершенияПодписания); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСФайламиКлиент"); + МодульРаботаСФайламиКлиент.ПодписатьФайл(ЗаписанныеОбъекты, УникальныйИдентификатор, ДополнительныеПараметры); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПодписатьФайлы(ФайлыВоВременномХранилище, ПараметрыВыбора) + + ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеОбработкиВыбора", ЭтотОбъект, ПараметрыВыбора); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + ОписаниеДанных = Новый Структура; + ОписаниеДанных.Вставить("ПоказатьКомментарий", Ложь); + Если ФайлыВоВременномХранилище.Количество() > 1 Тогда + ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файлов'")); + ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файлы'")); + + НаборДанных = Новый Массив; + Для Каждого Файл Из ФайлыВоВременномХранилище Цикл + ОписаниеДанныхФайла = Новый Структура; + ОписаниеДанныхФайла.Вставить("Представление", Файл.Представление); + ОписаниеДанныхФайла.Вставить("Данные", Файл.АдресВоВременномХранилище); + ОписаниеДанныхФайла.Вставить("ОбъектПечати", Файл.ОбъектПечати); + НаборДанных.Добавить(ОписаниеДанныхФайла); + КонецЦикла; + + ОписаниеДанных.Вставить("НаборДанных", НаборДанных); + ОписаниеДанных.Вставить("ПредставлениеНабора", "Файлы (%1)"); + Иначе + Файл = ФайлыВоВременномХранилище[0]; + ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файла'")); + ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); + ОписаниеДанных.Вставить("Представление", Файл.Представление); + ОписаниеДанных.Вставить("Данные", Файл.АдресВоВременномХранилище); + ОписаниеДанных.Вставить("ОбъектПечати", Файл.ОбъектПечати); + КонецЕсли; + + МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); + МодульЭлектроннаяПодписьКлиент.Подписать(ОписаниеДанных,,ОписаниеОповещения); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершениеОбработкиВыбора(Результат, ПараметрыВыбора) Экспорт + Если Результат = Ложь Тогда + Возврат; + ИначеЕсли ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("Успех") И Не Результат.Успех Тогда + Возврат; + КонецЕсли; + + ВыбранноеЗначение = ПараметрыВыбора.ВыбранноеЗначение; + ИсточникВыбора = ПараметрыВыбора.ИсточникВыбора; + + Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.СохранениеПечатнойФормы") Тогда + + Если ВыбранноеЗначение <> Неопределено И ВыбранноеЗначение <> КодВозвратаДиалога.Отмена Тогда + Если ВыбранноеЗначение.ВариантСохранения = "СохранитьВПапку" Тогда + Если ПараметрыВыбора.ВыбранноеЗначение.Подписать Тогда + ФайлыВоВременномХранилище = ПолучитьФайлыПодписей(Результат, ВыбранноеЗначение.ПереводитьИменаФайловВТранслит); + ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, ВыбранноеЗначение); + СохранитьПечатныеФормыВКаталог(ФайлыВоВременномХранилище, ВыбранноеЗначение.ПапкаДляСохранения); + Иначе + ФайлыВоВременномХранилище = ПоместитьОфисныеДокументыВоВременноеХранилище(ВыбранноеЗначение); + СохранитьПечатныеФормыВКаталог(ФайлыВоВременномХранилище, ВыбранноеЗначение.ПапкаДляСохранения); + КонецЕсли; + + Иначе + Если ВыбранноеЗначение.Подписать Тогда + ЗаписанныеОбъекты = ПараметрыВыбора.ЗаписанныеОбъекты; + Иначе + ФайлыВоВременномХранилище = ПоместитьОфисныеДокументыВоВременноеХранилище(ВыбранноеЗначение, Истина); + ЗаписанныеОбъекты = ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище); + КонецЕсли; + + Если ЗаписанныеОбъекты.Количество() > 0 Тогда + ОповеститьОбИзменении(ТипЗнч(ЗаписанныеОбъекты[0])); + КонецЕсли; + Для Каждого ЗаписанныйОбъект Из ЗаписанныеОбъекты Цикл + Оповестить("Запись_Файл", Новый Структура, ЗаписанныйОбъект); + КонецЦикла; + + ПоказатьОповещениеПользователя(НСтр("ru = 'Сохранение завершено'"), , , БиблиотекаКартинок.Информация32); + КонецЕсли; + КонецЕсли; + + ИначеЕсли ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.ВыборФорматаВложений") + Или ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.ПодготовкаНовогоПисьма") Тогда + + Если ВыбранноеЗначение <> Неопределено И ВыбранноеЗначение <> КодВозвратаДиалога.Отмена Тогда + Если ВыбранноеЗначение.Подписать Тогда + ФайлыВоВременномХранилище = ПолучитьФайлыПодписей(Результат, ВыбранноеЗначение.ПереводитьИменаФайловВТранслит); + ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, ВыбранноеЗначение); + ПараметрыОтправки = ПараметрыОтправкиПисьма(ВыбранноеЗначение, ФайлыВоВременномХранилище); + ОповещениеОЗакрытииФормы = Неопределено; + Иначе + Если ВыбранноеЗначение.Свойство("СписокВложений") Тогда + Вложения = ВыбранноеЗначение.СписокВложений; + Иначе + Вложения = Неопределено; + КонецЕсли; + ПараметрыОтправки = ПараметрыОтправкиПисьма(ВыбранноеЗначение, Вложения); + ОповещениеОЗакрытииФормы = Неопределено; + КонецЕсли; + + МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); + МодульРаботаСПочтовымиСообщениямиКлиент.СоздатьНовоеПисьмо(ПараметрыОтправки, ОповещениеОЗакрытииФормы); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция ПолучитьФайлыПодписей(СтруктураПодписания, ПереводитьИменаФайловВТранслит) + Если СтруктураПодписания.Свойство("НаборДанных") Тогда + НаборДанных = СтруктураПодписания.НаборДанных; + Иначе + НаборДанных = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СтруктураПодписания); + КонецЕсли; + + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + МодульЭлектроннаяПодписьСлужебныйКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебныйКлиентСервер"); + РасширениеДляФайловПодписи = МодульЭлектроннаяПодпись.ПерсональныеНастройки().РасширениеДляФайловПодписи; + КомуВыданСертификат = СтруктураПодписания.ВыбранныйСертификат.Ссылка.КомуВыдан; + Если ПереводитьИменаФайловВТранслит Тогда + КомуВыданСертификат = СтроковыеФункции.СтрокаЛатиницей(КомуВыданСертификат); + КонецЕсли; + + Результат = Новый Массив; + Для Каждого ПодписанныйФайл Из НаборДанных Цикл + СтруктураОписанияФайла = Новый Структура("АдресВоВременномХранилище, Представление, ОбъектПечати"); + СтруктураОписанияФайла.АдресВоВременномХранилище = ПодписанныйФайл.Данные; + СтруктураОписанияФайла.Представление = ПодписанныйФайл.Представление; + СтруктураОписанияФайла.ОбъектПечати = ПодписанныйФайл.ОбъектПечати; + Результат.Добавить(СтруктураОписанияФайла); + + Файл = Новый Файл(ПодписанныйФайл.Представление); + + СвойстваПодписи = ПодписанныйФайл.СвойстваПодписи; + ДанныеПодписи = ПоместитьВоВременноеХранилище(СвойстваПодписи.Подпись, УникальныйИдентификатор); + ИмяФайлаПодписи = МодульЭлектроннаяПодписьСлужебныйКлиентСервер.ИмяФайлаПодписи(Файл.ИмяБезРасширения, + Строка(КомуВыданСертификат), РасширениеДляФайловПодписи); + + СтруктураОписанияФайла = Новый Структура("АдресВоВременномХранилище, Представление, ОбъектПечати"); + СтруктураОписанияФайла.АдресВоВременномХранилище = ДанныеПодписи; + СтруктураОписанияФайла.Представление = ИмяФайлаПодписи; + СтруктураОписанияФайла.ОбъектПечати = ПодписанныйФайл.ОбъектПечати; + Результат.Добавить(СтруктураОписанияФайла); + + ДанныеПоСертификату = ПоместитьВоВременноеХранилище(СвойстваПодписи.Сертификат, УникальныйИдентификатор); + + Если ТипЗнч(СвойстваПодписи.Сертификат) = Тип("Строка") Тогда + РасширениеСертификата = "txt"; + Иначе + РасширениеСертификата = "cer"; + КонецЕсли; + + ИмяФайлаСертификата = МодульЭлектроннаяПодписьСлужебныйКлиентСервер.ИмяФайлаСертификата(Файл.ИмяБезРасширения, + Строка(КомуВыданСертификат), РасширениеСертификата); + + СтруктураОписанияФайла = Новый Структура("АдресВоВременномХранилище, Представление, ОбъектПечати"); + СтруктураОписанияФайла.АдресВоВременномХранилище = ДанныеПоСертификату; + СтруктураОписанияФайла.Представление = ИмяФайлаСертификата; + СтруктураОписанияФайла.ОбъектПечати = ПодписанныйФайл.ОбъектПечати; + Результат.Добавить(СтруктураОписанияФайла); + + КонецЦикла; + + Возврат Результат; +КонецФункции + +&НаСервере +Функция ПоместитьФайлыВоВременноеХранилище(МассивФайлов) + СписокВложений = Новый Массив; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + Для Каждого Файл Из МассивФайлов Цикл + МассивДляФайла = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Файл); + МассивВложенийФайла = МодульРаботаСФайламиСлужебный.ПоместитьФайлыВоВременноеХранилище(МассивДляФайла, УникальныйИдентификаторХранилища); + Для Каждого ВложениеФайла Из МассивВложенийФайла Цикл + ВложениеФайла.Вставить("ОбъектПечати", Файл.ВладелецФайла); + КонецЦикла; + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(СписокВложений, МассивВложенийФайла); + КонецЦикла; + КонецЕсли; + Возврат СписокВложений; +КонецФункции + +&НаСервере +Функция ДоступныеЯзыкиПечатныхФорм() + + Результат = Новый Массив; + + Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл + Если Не НастройкаПечатнойФормы.ДоступенВыводНаДругихЯзыках Тогда + Продолжить; + КонецЕсли; + Для Каждого КодЯзыка Из СтрРазделить(НастройкаПечатнойФормы.ДоступныеЯзыки, ",", Ложь) Цикл + Если Результат.Найти(КодЯзыка) = Неопределено Тогда + Результат.Добавить(КодЯзыка); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Процедура ДополнительнаяИнформацияОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + + ИнтеграцияПодсистемБСПКлиент.ПечатьДокументовОбработкаНавигационнойСсылки(ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка); + УправлениеПечатьюКлиентПереопределяемый.ПечатьДокументовОбработкаНавигационнойСсылки(ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка); +КонецПроцедуры + +// Ветка процедуры, возникающая после установки расширения работы с файлами. +&НаКлиенте +Процедура ПродолжитьПечатьПослеУстановкиРасширенияРаботыСФайлами(РасширениеПодключено, ДополнительныеПараметры) Экспорт + +#Если ВебКлиент Тогда + Текст = НСтр("ru = 'Распечатайте документ при помощи приложения, предназначенного для работы с данным файлом.'"); + ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьОтмеченныеПечатныеФормы", ЭтотОбъект); + ПоказатьПредупреждение(ОписаниеОповещения, Текст,,НСтр("ru = 'Печать документа из веб-клиента'")); + Возврат; +#КонецЕсли + + Если Не РасширениеПодключено Тогда + Возврат; + КонецЕсли; + + РасширениеДляРаботыСФайламиПодключено = РасширениеПодключено; + + МассивПечатныхФорм = ПолучитьПечатныеФормы(СтруктураЕдиногоДокумента, ДополнительныеПараметры); + + +#Если ВебКлиент Тогда + Оповещение = Новый ОписаниеОповещения( + "ПечатьПослеПолученияИмениВременногоКаталога", ЭтотОбъект, МассивПечатныхФорм); + НачатьПолучениеКаталогаВременныхФайлов(Оповещение); +#Иначе + ПечатьПослеПолученияИмениВременногоКаталога("", МассивПечатныхФорм); +#КонецЕсли + + +КонецПроцедуры + +&НаКлиенте +Процедура ПечатьПослеПолученияИмениВременногоКаталога(ИмяКаталогаВременныхФайлов, МассивПечатныхФорм) Экспорт + + Для Каждого ПечатнаяФорма Из МассивПечатныхФорм Цикл + #Если ВебКлиент Тогда + ИмяВременногоФайла = ИмяКаталогаВременныхФайлов + Строка(Новый УникальныйИдентификатор); + #Иначе + ИмяВременногоФайла = ПолучитьИмяВременногоФайла("DOCX"); // АПК:441 Функция для получения имени временного файла. + #КонецЕсли + Оповещение = Новый ОписаниеОповещения("ПослеСохраненияФайла", ЭтотОбъект, ИмяВременногоФайла); + ДанныеДокумента = ПолучитьИзВременногоХранилища(ПечатнаяФорма.АдресПечатнойФормы); // ДвоичныеДанные + ДанныеДокумента.НачатьЗапись(Оповещение, ИмяВременногоФайла); + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеСохраненияФайла(ИмяВременногоФайла) Экспорт + НапечататьФайлПриложением(ИмяВременногоФайла); + СписокФайловДляУдаления.Добавить(ИмяВременногоФайла); +КонецПроцедуры + + + +#Область ПечатьПриложением +// Процедура предназначена для печати файла соответствующим приложением +// +// Параметры: +// ИмяФайлаДляПечати - Строка. +// +&НаКлиенте +Процедура НапечататьФайлПриложением(ИмяФайлаДляПечати) + +#Если МобильныйКлиент Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Печать файлов данного типа возможна только из приложения для Windows или Linux.'")); + Возврат; +#Иначе + + Попытка + + Если ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда + ИмяФайлаДляПечати = СтрЗаменить(ИмяФайлаДляПечати, "/", "\"); + КонецЕсли; + + ФайловаяСистемаКлиент.НапечататьИзПриложенияПоИмениФайла(ИмяФайлаДляПечати); + + Исключение + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось распечатать файл по причине: + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + КонецПопытки; +#КонецЕсли + +КонецПроцедуры + +#КонецОбласти + +// Параметры: +// ВыбранныеПараметры - см. УправлениеПечатью.НастройкиСохранения +// +&НаСервере +Функция ПараметрыОтправкиПисьма(ВыбранныеПараметры, Вложения) + Если Вложения <> Неопределено Тогда + Если ТипЗнч(Вложения[0]) = Тип("Структура") Тогда + СписокВложений = Вложения; + Иначе + СписокВложений = ПоместитьФайлыВоВременноеХранилище(Вложения); + + Для Каждого Вложение Из СписокВложений Цикл + Вложение.Вставить("Печать", Истина); + Вложение.Вставить("Название", Вложение.Представление); + КонецЦикла; + КонецЕсли; + Иначе + СписокВложений = ПоместитьОфисныеДокументыВоВременноеХранилище(ВыбранныеПараметры); + КонецЕсли; + + // Контроль уникальности имен. + ШаблонИмениФайла = "%1%2.%3"; + ИспользованныеИменаФайлов = Новый Соответствие; + Для Каждого Вложение Из СписокВложений Цикл + ИмяФайла = Вложение.Представление; + НомерИспользования = ?(ИспользованныеИменаФайлов[ИмяФайла] <> Неопределено, + ИспользованныеИменаФайлов[ИмяФайла] + 1, 1); + ИспользованныеИменаФайлов.Вставить(ИмяФайла, НомерИспользования); + Если НомерИспользования > 1 Тогда + Файл = Новый Файл(ИмяФайла); + ИмяФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмениФайла, + Файл.ИмяБезРасширения, " (" + НомерИспользования + ")", Файл.Расширение); + КонецЕсли; + Вложение.Представление = ИмяФайла; + КонецЦикла; + + Получатели = ПараметрыВывода.ПараметрыОтправки.Получатель; + Если ВыбранныеПараметры.Свойство("Получатели") Тогда + Получатели = ВыбранныеПараметры.Получатели; + КонецЕсли; + + Результат = Новый Структура; + Результат.Вставить("Получатель", Получатели); + Результат.Вставить("Тема", ПараметрыВывода.ПараметрыОтправки.Тема); + Результат.Вставить("Текст", ПараметрыВывода.ПараметрыОтправки.Текст); + Результат.Вставить("Вложения", СписокВложений); + Результат.Вставить("УдалятьФайлыПослеОтправки", Истина); + + Если ОбъектыПечати.Количество() = 1 И ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ОбъектыПечати[0].Значение)) Тогда + Результат.Вставить("Предмет", ОбъектыПечати[0].Значение); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Процедура ПриПодключенииРасширения(РасширениеПодключено, ДополнительныеПараметры) Экспорт + + РасширениеДляРаботыСФайламиПодключено = РасширениеПодключено; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ОбъектыПечати", ОбъектыПечати); + ПараметрыФормы.Вставить("РасширениеДляРаботыСФайламиПодключено", РасширениеПодключено); + ПараметрыФормы.Вставить("ОграничениеФорматовСохранения", "docx"); + ОткрытьФорму("ОбщаяФорма.СохранениеПечатнойФормы", ПараметрыФормы, ЭтотОбъект, "ПечатьДокументовOfficeOpen"); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтправитьПечатныеФормыПоПочте() + ОписаниеОповещения = Новый ОписаниеОповещения("ОтправитьПечатныеФормыПоПочтеНастройкаУчетнойЗаписиПредложена", ЭтотОбъект); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); + МодульРаботаСПочтовымиСообщениямиКлиент.ПроверитьНаличиеУчетнойЗаписиДляОтправкиПочты(ОписаниеОповещения); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОтправитьПечатныеФормыПоПочтеНастройкаУчетнойЗаписиПредложена(УчетнаяЗаписьНастроена, ДополнительныеПараметры) Экспорт + + Если УчетнаяЗаписьНастроена <> Истина Тогда + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ИмяОткрываемойФормы = "ОбщаяФорма.ВыборФорматаВложений"; + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") + И СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ИспользоватьПочтовыйКлиент Тогда + Если ПолучателейБольшеОдного(ПараметрыВывода.ПараметрыОтправки.Получатель) Тогда + ПараметрыФормы.Вставить("Получатели", ПараметрыВывода.ПараметрыОтправки.Получатель); + ИмяОткрываемойФормы = "ОбщаяФорма.ПодготовкаНовогоПисьма"; + КонецЕсли; + КонецЕсли; + + ПараметрыФормы.Вставить("ОграничениеФорматовСохранения", "docx"); + + ОткрытьФорму(ИмяОткрываемойФормы, ПараметрыФормы, ЭтотОбъект, "ПечатьДокументовOfficeOpen"); + +КонецПроцедуры + +&НаКлиенте +Процедура БольшеНеПоказыватьПриИзменении(Элемент) + БольшеНеПоказыватьПриИзмененииНаСервере(БольшеНеПоказывать); +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура БольшеНеПоказыватьПриИзмененииНаСервере(Значение) + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ПечатьДокументовOfficeOpen", + "ВыводитьСразу", Значение); +КонецПроцедуры + +&НаКлиенте +Функция ПолучателейБольшеОдного(Получатель) + Если ТипЗнч(Получатель) = Тип("Массив") Или ТипЗнч(Получатель) = Тип("СписокЗначений") Тогда + Возврат Получатель.Количество() > 1; + Иначе + Возврат ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(Получатель).Количество() > 1; + КонецЕсли; +КонецФункции + +// Параметры: +// ТаблицаПечатныхФорм - ТаблицаЗначений +// НастройкаПечатнойФормы - СтрокаТаблицыЗначений +// ПечатнаяФорма - см. УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм +// ПредставлениеПечатнойФормы - Строка +// +&НаСервере +Процедура ДобавитьПечатнуюФорму(ТаблицаПечатныхФорм, НастройкаПечатнойФормы, ПечатнаяФорма, ПредставлениеПечатнойФормы) + + ИмяФайлаПечатнойФормы = ПредставлениеПечатнойФормы + ".DOCX"; + + НоваяСтрокаПечатнойФормы = ТаблицаПечатныхФорм.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрокаПечатнойФормы, НастройкаПечатнойФормы); + НоваяСтрокаПечатнойФормы.ОбъектПечати = ПечатнаяФорма.Значение; + НоваяСтрокаПечатнойФормы.АдресПечатнойФормы = ПечатнаяФорма.Ключ; + НоваяСтрокаПечатнойФормы.ИмяФайлаПечатнойФормы = ИмяФайлаПечатнойФормы; + НоваяСтрокаПечатнойФормы.Представление = ПредставлениеПечатнойФормы; + НоваяСтрокаПечатнойФормы.Пометка = Истина; + НоваяСтрокаПечатнойФормы.ТекущийЯзык = ОбщегоНазначения.КодОсновногоЯзыка(); + +КонецПроцедуры + + +&НаСервере +Функция ПоместитьФайлыВАрхив(ПечатныеФормыДокументов, ПереданныеНастройки) + Перем ЗаписьZipФайла, ИмяАрхива; + + Результат = Новый Массив; + + НастройкиСохранения = НастройкиСохранения(); + ЗаполнитьЗначенияСвойств(НастройкиСохранения, ПереданныеНастройки); + + Если Не НастройкиСохранения.УпаковатьВАрхив Тогда + Возврат ПечатныеФормыДокументов; + КонецЕсли; + ВариантСохранения = Неопределено; + ПереданныеНастройки.Свойство("ВариантСохранения", ВариантСохранения); + УстанавливатьОбъектПечати = ВариантСохранения = "Присоединить"; + + ПереводитьИменаФайловВТранслит = НастройкиСохранения.ПереводитьИменаФайловВТранслит; + + ИмяВременногоКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла()); + СоздатьКаталог(ИмяВременногоКаталога); + + СоответствиеДляАрхивов = Новый Соответствие; + + Для Каждого СтруктураФайла Из ПечатныеФормыДокументов Цикл + + ДанныеФайла = ПолучитьИзВременногоХранилища(СтруктураФайла.АдресВоВременномХранилище); + ПолноеИмяФайла = ИмяВременногоКаталога + СтруктураФайла.Представление; + ДанныеФайла.Записать(ПолноеИмяФайла); + + ОбъектПечати = ?(УстанавливатьОбъектПечати, СтруктураФайла.ОбъектПечати, Неопределено); + + Если СоответствиеДляАрхивов[ОбъектПечати] = Неопределено Тогда + ИмяАрхива = ПолучитьИмяВременногоФайла("zip"); + ЗаписьZipФайла = Новый ЗаписьZipФайла(ИмяАрхива); + + Представление = ?(ОбъектПечати = Неопределено, НСтр("ru = 'Документы'"), ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(Строка(ОбъектПечати))); + Если ПереводитьИменаФайловВТранслит Тогда + Представление = СтроковыеФункции.СтрокаЛатиницей(Представление); + КонецЕсли; + ПараметрыЗаписи = Новый Структура("ЗаписьZipФайла, ИмяАрхива, Представление", ЗаписьZipФайла, ИмяАрхива, Представление+".zip"); + СоответствиеДляАрхивов.Вставить(ОбъектПечати, ПараметрыЗаписи); + КонецЕсли; + + СоответствиеДляАрхивов[ОбъектПечати].ЗаписьZipФайла.Добавить(ПолноеИмяФайла); + + КонецЦикла; + + Для Каждого АрхивОбъекта Из СоответствиеДляАрхивов Цикл + ЗаписьZipФайла = АрхивОбъекта.Значение.ЗаписьZipФайла; + ИмяАрхива = АрхивОбъекта.Значение.ИмяАрхива; + ЗаписьZipФайла.Записать(); + ДвоичныеДанные = Новый ДвоичныеДанные(ИмяАрхива); + ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторХранилища); + ОписаниеФайла = Новый Структура; + ОписаниеФайла.Вставить("Представление", АрхивОбъекта.Значение.Представление); + + ОписаниеФайла.Вставить("ОбъектПечати", АрхивОбъекта.Ключ); + ОписаниеФайла.Вставить("АдресВоВременномХранилище", ПутьВоВременномХранилище); + Результат.Добавить(ОписаниеФайла); + УдалитьФайлы(ИмяАрхива); + КонецЦикла; + + УдалитьФайлы(ИмяВременногоКаталога); + + Возврат Результат; + +КонецФункции + +&НаСервере +Функция ПоместитьОфисныеДокументыВоВременноеХранилище(ПереданныеНастройки, ИспользоватьИндивидуальныеПечатныеФормы = Ложь, ЭтоПодписание = Ложь) + Перем ЗаписьZipФайла, ИмяАрхива; + + Если ПереданныеНастройки.Свойство("СписокВложений") И ПереданныеНастройки.СписокВложений <> Неопределено + И Не ИспользоватьИндивидуальныеПечатныеФормы Тогда + НастройкиПечатныхФормВр = ПереданныеНастройки.СписокВложений; // единый документ + Иначе + НастройкиПечатныхФормВр = НастройкиПечатныхФорм; + КонецЕсли; + + НастройкиСохранения = НастройкиСохранения(); + ЗаполнитьЗначенияСвойств(НастройкиСохранения, ПереданныеНастройки); + + Результат = Новый Массив; + + // подготовка архива + Если НастройкиСохранения.УпаковатьВАрхив И НЕ ЭтоПодписание Тогда + ИмяАрхива = ПолучитьИмяВременногоФайла("zip"); + ЗаписьZipФайла = Новый ЗаписьZipФайла(ИмяАрхива); + КонецЕсли; + + ИмяВременногоКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла()); + СоздатьКаталог(ИмяВременногоКаталога); + + ПереводитьИменаФайловВТранслит = НастройкиСохранения.ПереводитьИменаФайловВТранслит; + + ОбъектыДляПрикрепления = Неопределено; + Если ПереданныеНастройки.Свойство("ОбъектыДляПрикрепления") Тогда + ОбъектыДляПрикрепления = ОбщегоНазначения.СкопироватьРекурсивно(ПереданныеНастройки.ОбъектыДляПрикрепления); + КонецЕсли; + + // сохранение печатных форм + Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФормВр Цикл + Если НастройкаПечатнойФормы.Свойство("ОфисныеДокументы") И НЕ ПустаяСтрока(НастройкаПечатнойФормы.ОфисныеДокументы) Тогда + + ФайлыОфисныхДокументов = ОбщегоНазначения.ЗначениеИзСтрокиXML(НастройкаПечатнойФормы.ОфисныеДокументы); + + Для Каждого ФайлОфисногоДокумента Из ФайлыОфисныхДокументов Цикл + ИмяФайла = УправлениеПечатью.ИмяФайлаОфисногоДокумента(ФайлОфисногоДокумента.Значение); + ОбъектПечати = ФайлОфисногоДокумента.Значение; + Если ОбъектыДляПрикрепления <> Неопределено И ОбъектыДляПрикрепления[ОбъектПечати] <> Истина Тогда + Продолжить; + КонецЕсли; + + Если ПереводитьИменаФайловВТранслит Тогда + ИмяФайла = СтроковыеФункции.СтрокаЛатиницей(ИмяФайла); + КонецЕсли; + + Если ЗаписьZipФайла <> Неопределено Тогда + ПолноеИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ИмяВременногоКаталога + ИмяФайла); + ДвоичныеДанные = ПолучитьИзВременногоХранилища(ФайлОфисногоДокумента.Ключ); // ДвоичныеДанные - + ДвоичныеДанные.Записать(ПолноеИмяФайла); + ЗаписьZipФайла.Добавить(ПолноеИмяФайла); + Иначе + ОписаниеФайла = Новый Структура; + ОписаниеФайла.Вставить("Представление", ИмяФайла); + ОписаниеФайла.Вставить("АдресВоВременномХранилище", ФайлОфисногоДокумента.Ключ); + ОписаниеФайла.Вставить("ЭтоОфисныйДокумент", Истина); + ОписаниеФайла.Вставить("ОбъектПечати", ОбъектПечати); + Результат.Добавить(ОписаниеФайла); + КонецЕсли; + + КонецЦикла; + + Продолжить; + ИначеЕсли НастройкаПечатнойФормы.Свойство("АдресВоВременномХранилище") Тогда + + Если ОбъектыДляПрикрепления <> Неопределено И ОбъектыДляПрикрепления[НастройкаПечатнойФормы.ОбъектПечати] <> Истина Тогда + Продолжить; + КонецЕсли; + + ИмяФайла = НастройкаПечатнойФормы.Представление; + + Если ПереводитьИменаФайловВТранслит Тогда + ИмяФайла = СтроковыеФункции.СтрокаЛатиницей(ИмяФайла); + КонецЕсли; + + Если ЗаписьZipФайла <> Неопределено Тогда + ПолноеИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ИмяВременногоКаталога + ИмяФайла); + ДвоичныеДанные = ПолучитьИзВременногоХранилища(НастройкаПечатнойФормы.АдресВоВременномХранилище); // ДвоичныеДанные - + ДвоичныеДанные.Записать(ПолноеИмяФайла); + ЗаписьZipФайла.Добавить(ПолноеИмяФайла); + Иначе + ОписаниеФайла = Новый Структура; + ОписаниеФайла.Вставить("Представление", ИмяФайла); + ОписаниеФайла.Вставить("АдресВоВременномХранилище", НастройкаПечатнойФормы.АдресВоВременномХранилище); + ОписаниеФайла.Вставить("ЭтоОфисныйДокумент", Истина); + ОписаниеФайла.Вставить("ОбъектПечати", НастройкаПечатнойФормы.ОбъектПечати); + Результат.Добавить(ОписаниеФайла); + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + // Если архив подготовлен, записываем и помещаем его во временное хранилище. + Если ЗаписьZipФайла <> Неопределено Тогда + ЗаписьZipФайла.Записать(); + ДвоичныеДанные = Новый ДвоичныеДанные(ИмяАрхива); + ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторХранилища); + ОписаниеФайла = Новый Структура; + ОписаниеФайла.Вставить("Представление", ПолучитьИмяФайлаДляАрхива(ПереводитьИменаФайловВТранслит, НастройкиПечатныхФормВр)); + ОписаниеФайла.Вставить("АдресВоВременномХранилище", ПутьВоВременномХранилище); + Если ПереданныеНастройки.Свойство("ОбъектПечати") Тогда + ОписаниеФайла.Вставить("ОбъектПечати", ПереданныеНастройки.ОбъектПечати); + Иначе + ОписаниеФайла.Вставить("ОбъектПечати", Неопределено); + КонецЕсли; + Результат.Добавить(ОписаниеФайла); + КонецЕсли; + + УдалитьФайлы(ИмяВременногоКаталога); + Если ЗначениеЗаполнено(ИмяАрхива) Тогда + УдалитьФайлы(ИмяАрхива); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервере +Функция ПолучитьИмяФайлаДляАрхива(ПереводитьИменаФайловВТранслит, НастройкиПечатныхФормВр = Неопределено) + + Если НастройкиПечатныхФормВр = Неопределено Тогда + НастройкиПечатныхФормВр = НастройкиПечатныхФорм; + КонецЕсли; + + Результат = ""; + + Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФормВр Цикл + + Если Не ВыводДоступен() Тогда + Продолжить; + КонецЕсли; + + Если ПустаяСтрока(Результат) Тогда + Результат = НастройкаПечатнойФормы.Название; + Иначе + Результат = НСтр("ru = 'Документы'"); + Прервать; + КонецЕсли; + КонецЦикла; + + Если ПереводитьИменаФайловВТранслит Тогда + Результат = СтроковыеФункции.СтрокаЛатиницей(Результат); + КонецЕсли; + + Возврат Результат + ".zip"; + +КонецФункции + +&НаСервереБезКонтекста +Функция НастройкиСохранения() + + Возврат УправлениеПечатью.НастройкиСохранения(); + +КонецФункции + +&НаСервере +Функция ВыводДоступен() + Возврат ПравоДоступа("Вывод", Метаданные); +КонецФункции + +&НаКлиенте +Процедура СохранитьПечатныеФормыВКаталог(СписокФайловВоВременномХранилище, Знач ИмяКаталога = "") + + Если РасширениеДляРаботыСФайламиПодключено И ЗначениеЗаполнено(ИмяКаталога) Тогда + ИмяКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяКаталога); + Иначе + ПриПодготовкеИменФайлов(СписокФайловВоВременномХранилище, ""); + Возврат; + КонецЕсли; + + ОписаниеОповещения = Новый ОписаниеОповещения("ПриПодготовкеИменФайлов", ЭтотОбъект, ИмяКаталога); + ПараметрыПодготовки = УправлениеПечатьюКлиент.ПараметрыПодготовкиИменФайлов(СписокФайловВоВременномХранилище, ИмяКаталога, ОписаниеОповещения); + ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки); + +КонецПроцедуры + +// Параметры: +// ПараметрыПодготовки - см. УправлениеПечатьюКлиент.ПараметрыПодготовкиИменФайлов +// +&НаКлиенте +Процедура ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки) + + УправлениеПечатьюКлиент.ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриПодготовкеИменФайлов(СписокФайловВоВременномХранилище, ИмяКаталога) Экспорт + + СохраняемыеФайлы = Новый Массив; + + Для Каждого ФайлДляЗаписи Из СписокФайловВоВременномХранилище Цикл + ИмяФайла = ФайлДляЗаписи.Представление; + СохраняемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла, ФайлДляЗаписи.АдресВоВременномХранилище)); + КонецЦикла; + + ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайлов(); + ПараметрыСохранения.Диалог.Каталог = ИмяКаталога; + ПараметрыСохранения.Интерактивно = Не ЗначениеЗаполнено(ИмяКаталога); + ФайловаяСистемаКлиент.СохранитьФайлы(Неопределено, СохраняемыеФайлы, ПараметрыСохранения); + +#Если Не ВебКлиент Тогда + Если ЗначениеЗаполнено(ИмяКаталога) Тогда + ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьПапкуСохранения", ЭтотОбъект, ИмяКаталога); + ПоказатьОповещениеПользователя(НСтр("ru = 'Сохранение успешно завершено'"), ОписаниеОповещения, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'в папку %1'"), ИмяКаталога), БиблиотекаКартинок.Информация32); + КонецЕсли; +#КонецЕсли + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьПапкуСохранения(ИмяКаталога) Экспорт + ФайловаяСистемаКлиент.ОткрытьПроводник(ИмяКаталога); +КонецПроцедуры + +&НаСервере +Функция ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище) + Результат = Новый Массив; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); + Для Каждого Файл Из ФайлыВоВременномХранилище Цикл + Если МодульРаботаСФайлами.КОбъектуМожноПрисоединятьФайлы(Файл["ОбъектПечати"]) Тогда + ПараметрыФайла = МодульРаботаСФайлами.ПараметрыДобавленияФайла(); + ПараметрыФайла.ВладелецФайлов = Файл["ОбъектПечати"]; + ПараметрыФайла.ИмяБезРасширения = Файл.Представление; + Результат.Добавить(МодульРаботаСФайлами.ДобавитьФайл( + ПараметрыФайла, Файл.АдресВоВременномХранилище, , НСтр("ru = 'Печатная форма'"))); + КонецЕсли; + КонецЦикла; + КонецЕсли; + Возврат Результат; +КонецФункции + +&НаКлиенте +Процедура ПечатьПродолжение(Результат, МассивПечатныхФорм) Экспорт + Если Результат.Статус = "Ошибка" Тогда + ВызватьИсключение Результат.КраткоеПредставлениеОшибки; + Иначе + СтруктураЕдиногоДокумента = ПолучитьИзВременногоХранилища(Результат.АдресРезультата); + МассивПечатныхФорм = ПолучитьПечатныеФормы(СтруктураЕдиногоДокумента, МассивПечатныхФорм); + ПечатьЗавершение(МассивПечатныхФорм); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПечатьЗавершение(МассивПечатныхФорм) + Обработчик = Новый ОписаниеОповещения("ПродолжитьПечатьПослеУстановкиРасширенияРаботыСФайлами", ЭтотОбъект, МассивПечатныхФорм); + ТекстСообщения = НСтр("ru = 'Для продолжения установите расширение для работы с 1С:Предприятием.'"); + ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(Обработчик, ТекстСообщения); +КонецПроцедуры + +&НаКлиенте +Процедура НачатьПолучениеПечатныхФорм(СтруктураЕдиногоДокумента, Оповещение) + ДлительнаяОперация = ДлительнаяОперацияПолученияПечатныхФорм(СтруктураЕдиногоДокумента); + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Оповещение, ПараметрыОжидания()); +КонецПроцедуры + +#КонецОбласти + + + + + + + + + + diff --git a/SSL/src/CommonForms/НастройкаОнлайнПоддержки/НастройкаОнлайнПоддержки.mdo b/SSL/src/CommonForms/ПечатьДокументовOfficeOpen/ПечатьДокументовOfficeOpen.mdo similarity index 57% rename from SSL/src/CommonForms/НастройкаОнлайнПоддержки/НастройкаОнлайнПоддержки.mdo rename to SSL/src/CommonForms/ПечатьДокументовOfficeOpen/ПечатьДокументовOfficeOpen.mdo index dc6f91933..cdce49f51 100644 --- a/SSL/src/CommonForms/НастройкаОнлайнПоддержки/НастройкаОнлайнПоддержки.mdo +++ b/SSL/src/CommonForms/ПечатьДокументовOfficeOpen/ПечатьДокументовOfficeOpen.mdo @@ -1,9 +1,9 @@ - - НастройкаОнлайнПоддержки + + ПечатьДокументовOfficeOpen ru - Настройка онлайн-поддержки + Печать документов Office Open @@ -12,5 +12,4 @@ PersonalComputer MobileDevice - true diff --git a/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Form.form b/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Form.form index 9aac09bb5..c7d44f1f2 100644 --- a/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Form.form +++ b/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Form.form @@ -491,6 +491,7 @@ true true true + Top true @@ -742,7 +743,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -872,6 +872,40 @@ true + + Подписать + 109 + true + true + + true + + + Подписать + + Right + + ПодписатьРасширеннаяПодсказка + 111 + Label + true + true + + Left + + + + ПодписатьКонтекстноеМеню + 110 + true + + CheckBoxField + Enter + true + Left + true + + true true @@ -894,7 +928,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1212,6 +1245,27 @@ ПереводитьИменаФайловВТранслит + + Подписать + + <key>ru</key> + <value>Подписать</value> + + 8 + + Boolean + + + true + + + true + + FunctionalOption.ИспользоватьЭлектронныеПодписи + + Подписать + + Подготовить @@ -1288,6 +1342,13 @@ <name>Получатели</name> <valueType/> </parameters> + <parameters> + <name>ОграничениеФорматовСохранения</name> + <valueType> + <types>String</types> + <stringQualifiers/> + </valueType> + </parameters> <commandInterface> <navigationPanel/> <commandBar/> diff --git a/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Module.bsl b/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Module.bsl index 082937d12..46febead3 100644 --- a/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Module.bsl +++ b/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Module.bsl @@ -11,11 +11,17 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + МассивОграниченийФорматовСохранения = СтрРазделить(Параметры.ОграничениеФорматовСохранения, ",", Ложь); + Для Каждого ФорматСохранения Из УправлениеПечатью.НастройкиФорматовСохраненияТабличногоДокумента() Цикл - ВыбранныеФорматыСохранения.Добавить(Строка(ФорматСохранения.ТипФайлаТабличногоДокумента), - Строка(ФорматСохранения.Ссылка), Ложь, ФорматСохранения.Картинка); + Если Не МассивОграниченийФорматовСохранения.Количество() + ИЛИ МассивОграниченийФорматовСохранения.Найти(ФорматСохранения.Расширение) <> Неопределено Тогда + ВыбранныеФорматыСохранения.Добавить(Строка(ФорматСохранения.ТипФайлаТабличногоДокумента), Строка(ФорматСохранения.Ссылка), Ложь, ФорматСохранения.Картинка); + КонецЕсли; КонецЦикла; + Элементы.ФорматВложений.Видимость = ВыбранныеФорматыСохранения.Количество() > 1; + СписокПолучателей = Параметры.Получатели; Если ТипЗнч(СписокПолучателей) = Тип("Строка") Тогда ЗаполнитьТаблицуПолучателейИзСтроки(СписокПолучателей); @@ -27,6 +33,7 @@ Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиФормы.Верх; + Элементы.Подписать.Видимость = Ложь; КонецЕсли; КонецПроцедуры @@ -45,6 +52,10 @@ Настройки.Удалить("ВыбранныеФорматыСохранения"); КонецЕсли; + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + Настройки["Подписать"] = Ложь; + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -62,6 +73,7 @@ УстановитьВыборФормата(ВыбранноеЗначение.ФорматыСохранения); УпаковатьВАрхив = ВыбранноеЗначение.УпаковатьВАрхив; ПереводитьИменаФайловВТранслит = ВыбранноеЗначение.ПереводитьИменаФайловВТранслит; + Подписать = ВыбранноеЗначение.Подписать; СформироватьПредставлениеВыбранныхФорматов(); КонецЕсли; @@ -212,7 +224,7 @@ Результат.Вставить("ФорматыСохранения", ФорматыСохранения); Результат.Вставить("Получатели", ВыбранныеПолучатели()); Результат.Вставить("ПереводитьИменаФайловВТранслит", ПереводитьИменаФайловВТранслит); - + Результат.Вставить("Подписать", Подписать); Возврат Результат; КонецФункции diff --git a/SSL/src/CommonForms/ПоддерживаемыеКлиентскиеПриложения/Form.form b/SSL/src/CommonForms/ПоддерживаемыеКлиентскиеПриложения/Form.form index a158b02f3..aa34cc156 100644 --- a/SSL/src/CommonForms/ПоддерживаемыеКлиентскиеПриложения/Form.form +++ b/SSL/src/CommonForms/ПоддерживаемыеКлиентскиеПриложения/Form.form @@ -208,7 +208,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <showTitle>auto</showTitle> @@ -365,7 +364,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <showTitle>auto</showTitle> @@ -523,7 +521,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> <horizontalAlign>Center</horizontalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <showTitle>auto</showTitle> @@ -554,7 +551,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <representation>StrongSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -695,7 +691,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <showTitle>auto</showTitle> @@ -821,7 +816,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <showTitle>auto</showTitle> @@ -948,7 +942,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> <horizontalAlign>Center</horizontalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <showTitle>auto</showTitle> @@ -979,7 +972,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <representation>StrongSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -1152,7 +1144,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <showTitle>auto</showTitle> @@ -1310,7 +1301,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> <horizontalAlign>Center</horizontalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <showTitle>auto</showTitle> @@ -1341,7 +1331,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <representation>StrongSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -1371,7 +1360,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Form.form b/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Form.form deleted file mode 100644 index dc9528285..000000000 --- a/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Form.form +++ /dev/null @@ -1,401 +0,0 @@ -<?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> - - - ПутьКФайлу - 21 - true - true - - true - - - ПутьКФайлу - - Top - - ПутьКФайлуExtendedTooltip - 131 - Label - true - true - - Left - - - - ПутьКФайлуКонтекстноеМеню - 22 - true - - InputField - Left - Enter - true - Left - true - - - StartChoice - ПутьКФайлуНачалоВыбора - - true - true - true - false - true - true - true - Normal - - - - ГруппаИнформация - 90 - - ДекорацияИнформация - 157 - - <key>ru</key> - <value>Декорация информация</value> - - true - true - - true - - - ДекорацияИнформацияРасширеннаяПодсказка - 159 - Label - true - true - - Left - - - - ДекорацияИнформацияКонтекстноеМеню - 158 - true - - true - true - - - CommonPicture.Информация32 - - - - - ГруппаСправочнаяИнформация - 160 - - ИнформацияСкачатьПрограмму - 19 - - <key>ru</key> - <value>Если на компьютере нет файла приложения для связи со специалистом онлайн-поддержки, <link http://distribs.buhphone.com/current>скачайте</> приложение на сайте разработчика.</value> - - true - true - - true - - - ИнформацияСкачатьПрограммуРасширеннаяПодсказка - 136 - Label - true - true - - Left - - - - ИнформацияСкачатьПрограммуКонтекстноеМеню - 20 - true - - true - Label - true - - Left - 3 - - - - ИнформацияПомощьПартнеров - 30 - - <key>ru</key> - <value>За помощью обращайтесь к <link http://its.1c.ru/db/aboutits#content:23:1>партнерам 1С</>.</value> - - true - true - - true - - - ИнформацияПомощьПартнеровРасширеннаяПодсказка - 139 - Label - true - true - - Left - - - - ИнформацияПомощьПартнеровКонтекстноеМеню - 31 - true - - true - Label - true - - Left - - - true - true - - true - - - <key>ru</key> - <value>Справочная информация</value> - - - ГруппаСправочнаяИнформацияРасширеннаяПодсказка - 161 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Информация</value> - - - ГруппаИнформацияРасширеннаяПодсказка - 135 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - NormalSeparation - true - true - Auto - Auto - - - Bottom - true - - ФормаКоманднаяПанель - -1 - - Сохранить - 48 - true - true - - true - - - СохранитьExtendedTooltip - 149 - Label - true - true - - Left - - - Form.Command.Сохранить - PictureAndText - true - true - true - UserCmds - Auto - - - ФормаОтмена - 153 - true - true - - true - - - ФормаОтменаРасширеннаяПодсказка - 154 - Label - true - true - - Left - - - Form.StandardCommand.Cancel - Normal - Auto - true - true - UserCmds - Auto - - Right - true - - - OnOpen - ПриОткрытии - - - OnCreateAtServer - ПриСозданииНаСервере - - Abort - Close - CustomizeForm - Ignore - No - OK - RestoreValues - Retry - SaveValues - Yes - LockOwner - true - true - Vertical - true - true - true - auto - true - - ПутьКФайлу - - <key>ru</key> - <value>Проверьте путь к файлу приложения</value> - - 1 - - String - - - - true - - - true - - true - - - СохранитьЛогинПароль - 2 - - Boolean - - - true - - - true - - - - Логин - 3 - - String - - 10 - - - - true - - - true - - - - Пароль - 4 - - String - - 10 - - - - true - - - true - - - - Сохранить - - <key>ru</key> - <value>Сохранить</value> - - 5 - - ru - Сохранить - - - true - - - - Сохранить - - - DontUse - Auto - - - - - - diff --git a/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Help/ru.html b/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Help/ru.html deleted file mode 100644 index c48ecaf34..000000000 --- a/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Help/ru.html +++ /dev/null @@ -1,3 +0,0 @@ - -

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

        -

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

        \ No newline at end of file diff --git a/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Module.bsl b/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Module.bsl deleted file mode 100644 index e24180c6b..000000000 --- a/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/Module.bsl +++ /dev/null @@ -1,71 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////// -// Copyright (c) 2023, ООО 1С-Софт -// Все права защищены. Эта программа и сопроводительные материалы предоставляются -// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) -// Текст лицензии доступен по ссылке: -// https://creativecommons.org/licenses/by/4.0/legalcode -/////////////////////////////////////////////////////////////////////////////////////////////////////// - -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - СистемнаяИнформация = Новый СистемнаяИнформация; - ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; - ПутьКФайлу = ВызовОнлайнПоддержкиВызовСервера.РасположениеИсполняемогоФайла(ИдентификаторКлиента); -КонецПроцедуры - -&НаКлиенте -Процедура ПриОткрытии(Отказ) - Если НЕ ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда - ПоказатьПредупреждение(,НСтр("ru = 'Для работы с приложением необходима операционная система Microsoft Windows.'")); - Отказ = Истина; - КонецЕсли; -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - Оповещение = Новый ОписаниеОповещения("ПутьКФайлуНачалоВыбораЗавершение", ЭтотОбъект); - ВызовОнлайнПоддержкиКлиент.ВыбратьФайлВызовОнлайнПоддержки(Оповещение, ПутьКФайлу); -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиКомандФормы - -&НаКлиенте -Процедура Сохранить(Команда) - - ИдентификаторКлиента = ВызовОнлайнПоддержкиКлиент.ИдентификаторКлиента(); - // Записывает путь к исполняемому файлу в регистр сведений. - НовыйПутьКИсполняемомуФайлу(ИдентификаторКлиента, ПутьКФайлу); - Закрыть(); - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -&НаКлиенте -Процедура ПутьКФайлуНачалоВыбораЗавершение(НовыйПутьКФайлу, ДополнительныеПараметры) Экспорт - Если НовыйПутьКФайлу <> "" Тогда - ПутьКФайлу = НовыйПутьКФайлу; - КонецЕсли; -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура НовыйПутьКИсполняемомуФайлу(ИдентификаторКлиента, ПутьКФайлу) - ВызовОнлайнПоддержки.СохранитьРасположениеИсполняемогоФайлаВызовОнлайнПоддержки(ИдентификаторКлиента, ПутьКФайлу); -КонецПроцедуры - -#КонецОбласти - - - - - diff --git a/SSL/src/CommonForms/ПользователиСервиса/Form.form b/SSL/src/CommonForms/ПользователиСервиса/Form.form index f471c8c17..73a531a04 100644 --- a/SSL/src/CommonForms/ПользователиСервиса/Form.form +++ b/SSL/src/CommonForms/ПользователиСервиса/Form.form @@ -13,7 +13,7 @@ true
        - ПользователиСервиса + ТаблицаПользователиСервиса None Add @@ -35,7 +35,7 @@ true - ПользователиСервиса.Добавить + ТаблицаПользователиСервиса.Добавить None @@ -69,7 +69,7 @@ true - ПользователиСервиса.Имя + ТаблицаПользователиСервиса.Имя ПользователиСервисаИмяExtendedTooltip @@ -105,7 +105,7 @@ true - ПользователиСервиса.ПолноеИмя + ТаблицаПользователиСервиса.ПолноеИмя ПользователиСервисаПолноеИмяExtendedTooltip @@ -140,7 +140,7 @@ true - ПользователиСервиса.Идентификатор + ТаблицаПользователиСервиса.Идентификатор ПользователиСервисаИдентификаторExtendedTooltip @@ -176,7 +176,7 @@ true - ПользователиСервиса.Доступ + ТаблицаПользователиСервиса.Доступ ПользователиСервисаДоступExtendedTooltip @@ -204,17 +204,73 @@ ПользователиСервисаКоманднаяПанель 3 - - ПользователиСервисаУстановитьВсе - 18 + + ПользователиСервисаГруппаКомандФлажки + 43 + + ПользователиСервисаУстановитьВсе + 18 + true + true + + true + + + ПользователиСервисаУстановитьВсеExtendedTooltip + 23 + Label + true + true + + Left + + + Form.Command.УстановитьВсе + Normal + Auto + true + true + UserCmds + Auto + + + ПользователиСервисаСнятьВсе + 19 + true + true + + true + + + ПользователиСервисаСнятьВсеExtendedTooltip + 24 + Label + true + true + + Left + + + Form.Command.СнятьВсе + Normal + Auto + true + true + UserCmds + Auto + true true true + + <key>ru</key> + <value>Пользователи сервиса группа команд флажки</value> + - ПользователиСервисаУстановитьВсеExtendedTooltip - 23 + ПользователиСервисаГруппаКомандФлажкиРасширеннаяПодсказка + 44 Label true true @@ -222,39 +278,9 @@ Left
        - Form.Command.УстановитьВсе - Normal - Auto - true - true - UserCmds - Auto - - - ПользователиСервисаСнятьВсе - 19 - true - true - - true - - - ПользователиСервисаСнятьВсеExtendedTooltip - 24 - Label - true - true - - Left - - - Form.Command.СнятьВсе - Normal - Auto - true - true - UserCmds - Auto + + Compact + Left true @@ -445,10 +471,10 @@ auto true - ПользователиСервиса + ТаблицаПользователиСервиса <key>ru</key> - <value>Пользователи сервиса</value> + <value>Таблица пользователи сервиса</value> 1 diff --git a/SSL/src/CommonForms/ПользователиСервиса/Module.bsl b/SSL/src/CommonForms/ПользователиСервиса/Module.bsl index 383f37349..5be7626e1 100644 --- a/SSL/src/CommonForms/ПользователиСервиса/Module.bsl +++ b/SSL/src/CommonForms/ПользователиСервиса/Module.bsl @@ -38,7 +38,7 @@ &НаКлиенте Процедура УстановитьВсе(Команда) - Для каждого СтрокаТаблицы Из ПользователиСервиса Цикл + Для каждого СтрокаТаблицы Из ТаблицаПользователиСервиса Цикл Если СтрокаТаблицы.Доступ Тогда Продолжить; КонецЕсли; @@ -50,7 +50,7 @@ &НаКлиенте Процедура СнятьВсе(Команда) - Для каждого СтрокаТаблицы Из ПользователиСервиса Цикл + Для каждого СтрокаТаблицы Из ТаблицаПользователиСервиса Цикл СтрокаТаблицы.Добавить = Ложь; КонецЦикла; @@ -80,7 +80,7 @@ ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПользователиСервисаДобавить.Имя); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПользователиСервиса.Доступ"); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаПользователиСервиса.Доступ"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; @@ -103,7 +103,7 @@ ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПользователиСервисаДоступ.Имя); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПользователиСервиса.Доступ"); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаПользователиСервиса.Доступ"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; @@ -141,7 +141,7 @@ ПарольПользователяСервиса); Для каждого ИнформацияОПользователе Из ТаблицаПользователей Цикл - СтрокаПользователя = ПользователиСервиса.Добавить(); + СтрокаПользователя = ТаблицаПользователиСервиса.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаПользователя, ИнформацияОПользователе); КонецЦикла; @@ -155,9 +155,9 @@ УстановитьПривилегированныйРежим(Истина); Счетчик = 0; - КоличествоСтрок = ПользователиСервиса.Количество(); + КоличествоСтрок = ТаблицаПользователиСервиса.Количество(); Для Счетчик = 1 По КоличествоСтрок Цикл - СтрокаТаблицы = ПользователиСервиса[КоличествоСтрок - Счетчик]; + СтрокаТаблицы = ТаблицаПользователиСервиса[КоличествоСтрок - Счетчик]; Если НЕ СтрокаТаблицы.Добавить Тогда Продолжить; КонецЕсли; @@ -165,7 +165,7 @@ ПользователиСлужебныйВМоделиСервиса.ПредоставитьДоступПользователюСервиса( СтрокаТаблицы.Идентификатор, ПарольПользователяСервиса); - ПользователиСервиса.Удалить(СтрокаТаблицы); + ТаблицаПользователиСервиса.Удалить(СтрокаТаблицы); КонецЦикла; КонецПроцедуры diff --git a/SSL/src/CommonForms/ПраваДоступа/Form.form b/SSL/src/CommonForms/ПраваДоступа/Form.form index abba57f9a..3a45adba3 100644 --- a/SSL/src/CommonForms/ПраваДоступа/Form.form +++ b/SSL/src/CommonForms/ПраваДоступа/Form.form @@ -268,6 +268,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + ГруппыДоступаСтрокаПоиск + 160 + + ГруппыДоступаСтрокаПоискРасширеннаяПодсказка + 162 + Label + true + true + + Left + + + + ГруппыДоступаСтрокаПоискКонтекстноеМеню + 161 + true + + ГруппыДоступа + + true + + Left @@ -587,7 +619,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -783,6 +814,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + РолиСтрокаПоиск + 163 + + РолиСтрокаПоискРасширеннаяПодсказка + 165 + Label + true + true + + Left + + + + РолиСтрокаПоискКонтекстноеМеню + 164 + true + + Роли + + true + + Left diff --git a/SSL/src/CommonForms/ПраваДоступа/Module.bsl b/SSL/src/CommonForms/ПраваДоступа/Module.bsl index 08e3bcb85..84196955d 100644 --- a/SSL/src/CommonForms/ПраваДоступа/Module.bsl +++ b/SSL/src/CommonForms/ПраваДоступа/Module.bsl @@ -251,7 +251,7 @@ ДополнительныеПараметры.Вставить("ГруппаДоступа", ГруппаДоступа); ДополнительныеПараметры.Вставить("ВключитьВГруппуДоступа", ВключитьВГруппуДоступа); - Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено + Если ОбщегоНазначенияКлиент.РазделениеВключено() И ГруппаДоступа = ГруппаДоступаАдминистраторы Тогда ПользователиСлужебныйКлиент.ЗапроситьПарольДляАутентификацииВСервисе( diff --git a/SSL/src/CommonForms/ПраваДоступаУпрощенно/Form.form b/SSL/src/CommonForms/ПраваДоступаУпрощенно/Form.form index fdc2f8ef4..5d6f8f82a 100644 --- a/SSL/src/CommonForms/ПраваДоступаУпрощенно/Form.form +++ b/SSL/src/CommonForms/ПраваДоступаУпрощенно/Form.form @@ -35,195 +35,367 @@ ПраваИОграничения 1 - - Профили - 2 - - <key>ru</key> - <value>Профили</value> - + + ГруппаПрофили + 144 + + ЗаголовокПрофили + 149 + + НадписьПрофили + 146 + + <key>ru</key> + <value>Профили:</value> + + true + true + + true + + + НадписьПрофилиРасширеннаяПодсказка + 148 + Label + true + true + + Left + + + + НадписьПрофилиКонтекстноеМеню + 147 + true + + Label + true + true + + Left + + + + КомандыПрофили + 154 + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + ПрофилиСтрокаПоиск + 151 + + ПрофилиСтрокаПоискРасширеннаяПодсказка + 153 + Label + true + true + + Left + + + + ПрофилиСтрокаПоискКонтекстноеМеню + 152 + true + + Профили + + true + + + true + true + + true + + + <key>ru</key> + <value>Команды профили</value> + + + КомандыПрофилиРасширеннаяПодсказка + 155 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Заголовок профили</value> + + + ЗаголовокПрофилиРасширеннаяПодсказка + 150 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + Профили + 2 + + <key>ru</key> + <value>Профили</value> + + true + true + + true + + + Профили + + None + Add + CancelSearch + Copy + Delete + EndEdit + Find + MoveDown + MoveUp + SelectAll + SortListAsc + SortListDesc + + ПрофилиПометка + 5 + true + true + + true + + + Профили.Пометка + + None + + OnChange + ПрофилиПометкаПриИзменении + + + ПрофилиПометкаExtendedTooltip + 80 + Label + true + true + + Left + + + + ПрофилиПометкаКонтекстноеМеню + 6 + true + + CheckBoxField + true + Left + true + + + + ПрофилиПрофильПредставление + 9 + true + true + + true + + + Профили.ПрофильПредставление + + + ПрофилиПрофильПредставлениеExtendedTooltip + 81 + Label + true + true + + Left + + + + ПрофилиПрофильПредставлениеКонтекстноеМеню + 10 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПрофилиКоманднаяПанель + 4 + Left + + + OnActivateRow + ПрофилиПриАктивизацииСтроки + + + ПрофилиСтрокаПоиска + 112 + + ПрофилиСтрокаПоискаРасширеннаяПодсказка + 114 + Label + true + true + + Left + + + + ПрофилиСтрокаПоискаКонтекстноеМеню + 113 + true + + Профили + + true + + + + ПрофилиСостояниеПросмотра + 115 + + ПрофилиСостояниеПросмотраРасширеннаяПодсказка + 117 + Label + true + true + + Left + + + + ПрофилиСостояниеПросмотраКонтекстноеМеню + 116 + true + + ViewStatusAddition + Профили + + true + + + + ПрофилиУправлениеПоиском + 118 + + ПрофилиУправлениеПоискомРасширеннаяПодсказка + 120 + Label + true + true + + Left + + + + ПрофилиУправлениеПоискомКонтекстноеМеню + 119 + true + + SearchControlAddition + Профили + + true + + + + ПрофилиExtendedTooltip + 79 + Label + true + true + + Left + + + + ПрофилиКонтекстноеМеню + 3 + + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + true + + true true true - - Профили - - Top - Add - CancelSearch - Copy - Delete - EndEdit - Find - MoveDown - MoveUp - SelectAll - SortListAsc - SortListDesc - - ПрофилиПометка - 5 - true - true - - true - - - Профили.Пометка - - None - - OnChange - ПрофилиПометкаПриИзменении - - - ПрофилиПометкаExtendedTooltip - 80 - Label - true - true - - Left - - - - ПрофилиПометкаКонтекстноеМеню - 6 - true - - CheckBoxField - true - Left - true - - - - ПрофилиПрофильПредставление - 9 - true - true - - true - - - Профили.ПрофильПредставление - - - ПрофилиПрофильПредставлениеExtendedTooltip - 81 - Label - true - true - - Left - - - - ПрофилиПрофильПредставлениеКонтекстноеМеню - 10 - true - - InputField - true - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - - - ПрофилиКоманднаяПанель - 4 - Left - - - OnActivateRow - ПрофилиПриАктивизацииСтроки - - - ПрофилиСтрокаПоиска - 112 - - ПрофилиСтрокаПоискаРасширеннаяПодсказка - 114 - Label - true - true - - Left - - - - ПрофилиСтрокаПоискаКонтекстноеМеню - 113 - true - - Профили - - true - - - - ПрофилиСостояниеПросмотра - 115 - - ПрофилиСостояниеПросмотраРасширеннаяПодсказка - 117 - Label - true - true - - Left - - - - ПрофилиСостояниеПросмотраКонтекстноеМеню - 116 - true - - ViewStatusAddition - Профили - - true - - - - ПрофилиУправлениеПоиском - 118 - - ПрофилиУправлениеПоискомРасширеннаяПодсказка - 120 - Label - true - true - - Left - - - - ПрофилиУправлениеПоискомКонтекстноеМеню - 119 - true - - SearchControlAddition - Профили - - true - - + + <key>ru</key> + <value>Группа профили</value> + - ПрофилиExtendedTooltip - 79 + ГруппаПрофилиРасширеннаяПодсказка + 145 Label true true @@ -231,30 +403,15 @@ Left - - ПрофилиКонтекстноеМеню - 3 - - true - true - true - MultiRow - 1 - 1 - AutoUse - AutoUse - true - true - false - true - Auto - Auto - true - true - true - true - true - + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + Доступ @@ -927,7 +1084,6 @@ UsualGroup Vertical - Auto true true @@ -959,7 +1115,6 @@ UsualGroup Vertical - Auto true true @@ -992,7 +1147,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/CommonForms/ПраваДоступаУпрощенно/Module.bsl b/SSL/src/CommonForms/ПраваДоступаУпрощенно/Module.bsl index dedc68219..6d66902de 100644 --- a/SSL/src/CommonForms/ПраваДоступаУпрощенно/Module.bsl +++ b/SSL/src/CommonForms/ПраваДоступаУпрощенно/Module.bsl @@ -432,7 +432,7 @@ &НаКлиенте Процедура ЗаписатьИзменения(ОбработкаПродолжения = Неопределено) - Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено + Если ОбщегоНазначенияКлиент.РазделениеВключено() И ТребуетсяСинхронизацияССервисом Тогда ПользователиСлужебныйКлиент.ЗапроситьПарольДляАутентификацииВСервисе( @@ -466,7 +466,7 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); Если ОтказПриЗаписиИзменений Тогда ОбщегоНазначенияКлиент.СообщитьПользователю( - КраткоеПредставлениеОшибки(ИнформацияОбОшибке),,,, Отказ); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке),,,, Отказ); Иначе ВызватьИсключение; КонецЕсли; diff --git a/SSL/src/CommonForms/ПредупреждениеБезопасности/Form.form b/SSL/src/CommonForms/ПредупреждениеБезопасности/Form.form index 2882a4c4b..c254cac11 100644 --- a/SSL/src/CommonForms/ПредупреждениеБезопасности/Form.form +++ b/SSL/src/CommonForms/ПредупреждениеБезопасности/Form.form @@ -1508,7 +1508,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1773,7 +1772,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -2033,7 +2031,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true diff --git a/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Form.form b/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Form.form index ce487ae3b..1452fc88c 100644 --- a/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Form.form +++ b/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Form.form @@ -68,7 +68,6 @@ UsualGroup Vertical - Auto true true auto @@ -98,7 +97,7 @@ UsualGroup HorizontalIfPossible - Auto + NormalSeparation true true Auto @@ -189,7 +188,7 @@ auto true - МассивСоотношенияЭлементовИПараметров + ЭлементыИПараметры 1 ValueList @@ -205,7 +204,7 @@ - МассивЗадачНаВыполнениеПослеЗакрытия + ЗадачиНаВыполнениеПослеЗакрытия 2 ValueList @@ -264,6 +263,10 @@ DontUse Auto
        + + Предупреждения + + diff --git a/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Module.bsl b/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Module.bsl index 72a2e07ee..a364d1655 100644 --- a/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Module.bsl +++ b/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Module.bsl @@ -33,7 +33,7 @@ Процедура Подключаемый_НажатиеНаГиперссылку(Элемент) ИмяЭлемента = Элемент.Имя; - Для Каждого СтрокаВопроса Из МассивСоотношенияЭлементовИПараметров Цикл + Для Каждого СтрокаВопроса Из ЭлементыИПараметры Цикл ПараметрыВопроса = Новый Структура("Имя, Форма, ПараметрыФормы"); ЗаполнитьЗначенияСвойств(ПараметрыВопроса, СтрокаВопроса.Значение); @@ -72,7 +72,7 @@ Возврат; КонецЕсли; - ЭлементМассива = МассивЗадачНаВыполнениеПослеЗакрытия.НайтиПоИдентификатору(ИдентификаторМассива); + ЭлементМассива = ЗадачиНаВыполнениеПослеЗакрытия.НайтиПоИдентификатору(ИдентификаторМассива); Использование = Неопределено; Если ЭлементМассива.Значение.Свойство("Использование", Использование) Тогда @@ -114,10 +114,7 @@ &НаСервере Процедура ИнициализироватьЭлементыВФорме(Знач Предупреждения) - // Добавляем возможно не указанные значения по умолчанию. - ТаблицаПредупреждений = МассивСтруктурВТаблицуЗначений(Предупреждения); - - Для Каждого ТекущееПредупреждение Из ТаблицаПредупреждений Цикл + Для Каждого ТекущееПредупреждение Из ТаблицаПредупреждений(Предупреждения) Цикл // Элемент на форму добавляем только если указаны или текст для флага, или текст для Гиперссылки, но не одновременно. НужнаСсылка = Не ПустаяСтрока(ТекущееПредупреждение.ТекстГиперссылки); @@ -150,24 +147,22 @@ КонецПроцедуры &НаСервере -Функция МассивСтруктурВТаблицуЗначений(Знач Предупреждения) +Функция ТаблицаПредупреждений(Знач Предупреждения) - // Формируем таблицу, содержащую значения по умолчанию. - ТаблицаПредупреждений = Новый ТаблицаЗначений; - КолонкиПредупреждений = ТаблицаПредупреждений.Колонки; - КолонкиПредупреждений.Добавить("ПоясняющийТекст"); - КолонкиПредупреждений.Добавить("ТекстФлажка"); - КолонкиПредупреждений.Добавить("ДействиеПриУстановленномФлажке"); - КолонкиПредупреждений.Добавить("ТекстГиперссылки"); - КолонкиПредупреждений.Добавить("ДействиеПриНажатииГиперссылки"); - КолонкиПредупреждений.Добавить("Приоритет"); - КолонкиПредупреждений.Добавить("ВывестиОдноПредупреждение"); - КолонкиПредупреждений.Добавить("РасширеннаяПодсказка"); + Результат = Новый ТаблицаЗначений; + Результат.Колонки.Добавить("ПоясняющийТекст"); + Результат.Колонки.Добавить("ТекстФлажка"); + Результат.Колонки.Добавить("ДействиеПриУстановленномФлажке"); + Результат.Колонки.Добавить("ТекстГиперссылки"); + Результат.Колонки.Добавить("ДействиеПриНажатииГиперссылки"); + Результат.Колонки.Добавить("Приоритет"); + Результат.Колонки.Добавить("ВывестиОдноПредупреждение"); + Результат.Колонки.Добавить("РасширеннаяПодсказка"); ОдиночныеПредупреждения = Новый Массив; Для Каждого ЭлементПредупреждения Из Предупреждения Цикл - СтрокаТаблицы = ТаблицаПредупреждений.Добавить(); + СтрокаТаблицы = Результат.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаТаблицы, ЭлементПредупреждения); Если СтрокаТаблицы.ВывестиОдноПредупреждение = Истина Тогда @@ -175,15 +170,15 @@ КонецЕсли; КонецЦикла; - // Если было хоть одно предупреждение, требующее очистки (ВывестиОдноПредупреждение = Истина) то очищаем остальные. + // Если было хоть одно предупреждение, требующее очистки (ВывестиОдноПредупреждение = Истина), то очищаем остальные. Если ОдиночныеПредупреждения.Количество() > 0 Тогда - ТаблицаПредупреждений = ТаблицаПредупреждений.Скопировать(ОдиночныеПредупреждения); + Результат = Результат.Скопировать(ОдиночныеПредупреждения); КонецЕсли; // Чем больше приоритет, тем выше в списке выводится предупреждение. - ТаблицаПредупреждений.Сортировать("Приоритет УБЫВ"); + Результат.Сортировать("Приоритет УБЫВ"); - Возврат ТаблицаПредупреждений; + Возврат Результат; КонецФункции &НаСервере @@ -249,7 +244,7 @@ ПараметрыФормы.Вставить("ЗавершениеРаботыПрограммы", Истина); ПараметрыОткрытияФормы.Вставить("ПараметрыФормы", ПараметрыФормы); - МассивСоотношенияЭлементовИПараметров.Добавить(ПараметрыОткрытияФормы); + ЭлементыИПараметры.Добавить(ПараметрыОткрытияФормы); КонецПроцедуры @@ -318,7 +313,7 @@ ПараметрыФормы.Вставить("ЗавершениеРаботыПрограммы", Истина); ПараметрыОткрытияФормы.Вставить("ПараметрыФормы", ПараметрыФормы); - МассивЗадачНаВыполнениеПослеЗакрытия.Добавить(ПараметрыОткрытияФормы); + ЗадачиНаВыполнениеПослеЗакрытия.Добавить(ПараметрыОткрытияФормы); КонецПроцедуры @@ -366,7 +361,7 @@ &НаКлиенте Функция ИдентификаторМассиваЗадачПоИмени(ИмяЭлемента) - Для Каждого ЭлементМассива Из МассивЗадачНаВыполнениеПослеЗакрытия Цикл + Для Каждого ЭлементМассива Из ЗадачиНаВыполнениеПослеЗакрытия Цикл Наименование = ""; Если ЭлементМассива.Значение.Свойство("Имя", Наименование) Тогда Если Не ПустаяСтрока(Наименование) И Наименование = ИмяЭлемента Тогда @@ -385,9 +380,9 @@ НачальныйНомерЗадачи = 0; КонецЕсли; - Для НомерЗадачи = НачальныйНомерЗадачи По МассивЗадачНаВыполнениеПослеЗакрытия.Количество() - 1 Цикл + Для НомерЗадачи = НачальныйНомерЗадачи По ЗадачиНаВыполнениеПослеЗакрытия.Количество() - 1 Цикл - ЭлементМассива = МассивЗадачНаВыполнениеПослеЗакрытия[НомерЗадачи]; + ЭлементМассива = ЗадачиНаВыполнениеПослеЗакрытия[НомерЗадачи]; Использование = Неопределено; Если Не ЭлементМассива.Значение.Свойство("Использование", Использование) Тогда Продолжить; diff --git a/SSL/src/CommonForms/ПроверкаФайлаОбновления/Form.form b/SSL/src/CommonForms/ПроверкаФайлаОбновления/Form.form index e7a8f7fb7..5b0678db3 100644 --- a/SSL/src/CommonForms/ПроверкаФайлаОбновления/Form.form +++ b/SSL/src/CommonForms/ПроверкаФайлаОбновления/Form.form @@ -91,7 +91,6 @@ AlwaysHorizontal Center - Auto NormalSeparation true true diff --git a/SSL/src/CommonForms/ПроверкаФайлаОбновления/Module.bsl b/SSL/src/CommonForms/ПроверкаФайлаОбновления/Module.bsl index 5a5058946..95b1d353b 100644 --- a/SSL/src/CommonForms/ПроверкаФайлаОбновления/Module.bsl +++ b/SSL/src/CommonForms/ПроверкаФайлаОбновления/Module.bsl @@ -34,7 +34,7 @@ Попытка Результат = ИзменилсяТолькоНомерСборкиОсновнойКонфигурации(); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписатьОшибку(ТекстОшибки); КонецПопытки; #КонецЕсли @@ -175,7 +175,7 @@ ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(Метаданные.Версия) = ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(ОписаниеКонфигурации.Версия); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписатьОшибку(ТекстОшибки); ИзменилсяТолькоНомерСборки = Ложь; КонецПопытки; diff --git a/SSL/src/CommonForms/ПродлениеСрокаДействияЭлектронныхПодписей/Form.form b/SSL/src/CommonForms/ПродлениеСрокаДействияЭлектронныхПодписей/Form.form index 374705211..d0eab029d 100644 --- a/SSL/src/CommonForms/ПродлениеСрокаДействияЭлектронныхПодписей/Form.form +++ b/SSL/src/CommonForms/ПродлениеСрокаДействияЭлектронныхПодписей/Form.form @@ -70,7 +70,6 @@ UsualGroup Vertical - Auto true true Auto @@ -140,7 +139,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -308,7 +306,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -338,7 +335,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -580,6 +576,38 @@ ОшибкиКоманднаяПанель 39 + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 59 + + СтрокаПоискРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 60 + true + + Ошибки + + true + + Left diff --git a/SSL/src/CommonForms/ПустойРабочийСтол/Form.form b/SSL/src/CommonForms/ПустойРабочийСтол/Form.form index 7a75822a2..56110d81f 100644 --- a/SSL/src/CommonForms/ПустойРабочийСтол/Form.form +++ b/SSL/src/CommonForms/ПустойРабочийСтол/Form.form @@ -41,14 +41,6 @@ Надпись 6 - - <key>ru</key> - <value>Вход в информационную базу был выполнен в целях автоматического тестирования -с параметром запуска <b>ОтключитьЛогикуНачалаРаботыСистемы</>. - -Работа пользователей в этом режиме настоятельно не рекомендуется, -так как это приведет к рассогласованию или потере данных.</value> - true true @@ -69,7 +61,6 @@ 7 true - true Label 60 true @@ -99,7 +90,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -117,6 +107,10 @@ OnOpen ПриОткрытии
        + + OnCreateAtServer + ПриСозданииНаСервере + DontBlock true true diff --git a/SSL/src/CommonForms/ПустойРабочийСтол/Module.bsl b/SSL/src/CommonForms/ПустойРабочийСтол/Module.bsl index 2f2ecd769..5c04336f5 100644 --- a/SSL/src/CommonForms/ПустойРабочийСтол/Module.bsl +++ b/SSL/src/CommonForms/ПустойРабочийСтол/Module.bsl @@ -8,6 +8,20 @@ #Область ОбработчикиСобытийФормы +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Элементы.Надпись.Заголовок = СтроковыеФункции.ФорматированнаяСтрока( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Вход в информационную базу был выполнен в целях автоматического тестирования + |с параметром запуска %1. + | + |Работа пользователей в этом режиме настоятельно не рекомендуется, + |так как это приведет к рассогласованию или потере данных.'"), + "ОтключитьЛогикуНачалаРаботыСистемы")); + +КонецПроцедуры + &НаКлиенте Процедура ПриОткрытии(Отказ) diff --git a/SSL/src/CommonForms/РазблокированиеРеквизитов/Form.form b/SSL/src/CommonForms/РазблокированиеРеквизитов/Form.form new file mode 100644 index 000000000..dad9de28d --- /dev/null +++ b/SSL/src/CommonForms/РазблокированиеРеквизитов/Form.form @@ -0,0 +1,563 @@ + + + + Страницы + 33 + + Главное + 35 + + Команды + 47 + + ФормаРазрешитьРедактирование + 1 + true + true + + true + + + ФормаРазрешитьРедактированиеExtendedTooltip + 18 + Label + true + true + + Left + + + UsualButton + Form.Command.РазрешитьРедактирование + Auto + true + true + true + UserCmds + Auto + + + ФормаПроверитьИспользование + 25 + true + true + + true + + + ФормаПроверитьИспользованиеРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + UsualButton + Form.Command.ПроверитьИспользование + Normal + Auto + true + true + UserCmds + Auto + + + ДополнительныеКоманды + 31 + + Флажки + 45 + + ФормаУстановитьФлажки + 27 + true + true + + true + + + ФормаУстановитьФлажкиРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.Command.УстановитьФлажки + Normal + Auto + true + true + UserCmds + Auto + + + ФормаСнятьФлажки + 29 + true + true + + true + + + ФормаСнятьФлажкиРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + Form.Command.СнятьФлажки + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Флажки</value> + + + ФлажкиРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + Compact + + + true + true + + true + + + <key>ru</key> + <value>Дополнительные команды</value> + + + ДополнительныеКомандыРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + CommandBar + + Left + + + 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> + + + ГлавноеРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + ДлительнаяОперация + 37 + + КартинкаДлительнаяОперация + 39 + true + true + + true + + + КартинкаДлительнаяОперацияРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + КартинкаДлительнаяОперацияКонтекстноеМеню + 40 + true + + true + true + + + CommonPicture.ДлительнаяОперация48 + + + + + НадписьПроверкаВыполняется + 42 + + <key>ru</key> + <value>Пожалуйста, подождите. Выполняется проверка использования объектов. +Это может занять от нескольких секунд до часов в зависимости +от размера информационной базы.</value> + + true + true + + true + + + НадписьПроверкаВыполняетсяРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + НадписьПроверкаВыполняетсяКонтекстноеМеню + 43 + true + + Label + true + Center + + Left + + + true + true + + true + + + <key>ru</key> + <value>Длительная операция</value> + + + ДлительнаяОперацияРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + Page + + AlwaysHorizontal + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Страницы</value> + + + СтраницыРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Pages + + Auto + + + + ФормаКоманднаяПанель + -1 + Right + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + ЗаблокированныеРеквизиты + 6 + + + true + + + true + + + + АдресСсылокНаОбъекты + 7 + + String + + + + true + + + true + + + + КоличествоСсылок + 9 + + Number + + 10 + + + + true + + + true + + + + РазблокируемыеРеквизиты + 3 + + + true + + + true + + + + ОтмеченныйРеквизит + 2 + + String + + + + true + + + true + + + + РазрешитьРедактирование + + <key>ru</key> + <value>Разрешить редактирование</value> + + 1 + + true + + + + РазрешитьРедактирование + + + DontUse + Auto + + + ПроверитьИспользование + + <key>ru</key> + <value>Проверить использование</value> + + 2 + + ru + Проверить использование объекта в базе данных и убедится, что не будет рассогласования данных при изменении реквизитов + + + true + + + + Проверить + + + Auto + Auto + + + УстановитьФлажки + + <key>ru</key> + <value>Установить флажки</value> + + 3 + + true + + + StdPicture.CheckAll + + + + УстановитьФлажки + + + Picture + Auto + Auto + + + СнятьФлажки + + <key>ru</key> + <value>Снять флажки</value> + + 4 + + true + + + StdPicture.UncheckAll + + + + СнятьФлажки + + + Auto + Auto + + + ЗаблокированныеРеквизиты + + + + ГрупповоеИзменениеОбъектов + + Boolean + + + + Ссылка + + AnyRef + + + + АдресСсылокНаОбъекты + + String + + + + + ПолноеИмяОбъекта + + String + + + + + ОписаниеБлокируемыхРеквизитов + + + + ОтмеченныйРеквизит + + String + + + + + + + + diff --git a/SSL/src/CommonForms/РазблокированиеРеквизитов/Module.bsl b/SSL/src/CommonForms/РазблокированиеРеквизитов/Module.bsl new file mode 100644 index 000000000..a6db43b0e --- /dev/null +++ b/SSL/src/CommonForms/РазблокированиеРеквизитов/Module.bsl @@ -0,0 +1,377 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если ТипЗнч(Параметры.ЗаблокированныеРеквизиты) = Тип("Массив") Тогда + ЗаблокированныеРеквизиты = Новый ФиксированныйМассив(Параметры.ЗаблокированныеРеквизиты); + + ИначеЕсли ЗначениеЗаполнено(Параметры.ПолноеИмяОбъекта) Тогда + ЗаблокированныеРеквизиты = Новый ФиксированныйМассив( + ЗапретРедактированияРеквизитовОбъектов.БлокируемыеРеквизитыОбъекта( + Параметры.ПолноеИмяОбъекта)); + Иначе + ЗаблокированныеРеквизиты = Новый ФиксированныйМассив(Новый Массив); + КонецЕсли; + + ДобавляемыеЭлементы = Новый Массив; // Массив из см. НовыеСвойстваЭлементаФормы + ДобавитьРеквизитыНаФорму(ДобавляемыеЭлементы); + ДобавитьЭлементыНаФорму(ДобавляемыеЭлементы); + + Если Параметры.ГрупповоеИзменениеОбъектов Тогда + Если ЭтоАдресВременногоХранилища(Параметры.АдресСсылокНаОбъекты) Тогда + АдресСсылокНаОбъекты = Параметры.АдресСсылокНаОбъекты; + КонецЕсли; + ИначеЕсли ЗначениеЗаполнено(Параметры.Ссылка) Тогда + АдресСсылокНаОбъекты = ПоместитьВоВременноеХранилище( + ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Параметры.Ссылка), + УникальныйИдентификатор); + КонецЕсли; + + Если Не ЗначениеЗаполнено(АдресСсылокНаОбъекты) Тогда + Элементы.ФормаПроверитьИспользование.Видимость = Ложь; + КонецЕсли; + + СтандартныеПодсистемыСервер.СброситьРазмерыИПоложениеОкна(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ИзменитьФлажки(Истина, ЗначениеЗаполнено(ОтмеченныйРеквизит)); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура УстановитьФлажки(Команда) + + ИзменитьФлажки(Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура СнятьФлажки(Команда) + + ИзменитьФлажки(Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура Проверить(Команда) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПоискИУдалениеДублей") Тогда + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("Уникальность", УникальныйИдентификатор); + МассивСсылок = ПолучитьИзВременногоХранилища(АдресСсылокНаОбъекты); + МодульПоискИУдалениеДублейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПоискИУдалениеДублейКлиент"); + МодульПоискИУдалениеДублейКлиент.ПоказатьМестаИспользования(МассивСсылок, ПараметрыОткрытия); + Возврат; + КонецЕсли; + + Элементы.Страницы.ТекущаяСтраница = Элементы.ДлительнаяОперация; + + ДлительнаяОперация = ОбъектыИспользуются(); + + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); + ПараметрыОжидания.ВыводитьОкноОжидания = Ложь; + + ОповещениеОЗавершении = Новый ОписаниеОповещения("ПроверитьЗавершение", ЭтотОбъект); + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания); + +КонецПроцедуры + +&НаКлиенте +Процедура РазрешитьРедактирование(Команда) + + Результат = Новый Массив; + + Для Каждого ДобавленныйРеквизит Из РазблокируемыеРеквизиты Цикл + Если Не ЭтотОбъект[ДобавленныйРеквизит.Ключ] Тогда + Продолжить; + КонецЕсли; + Для Каждого ИмяРеквизита Из ДобавленныйРеквизит.Значение Цикл + Результат.Добавить(ИмяРеквизита); + КонецЦикла; + КонецЦикла; + + Если Не ЗначениеЗаполнено(Результат) Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Выберите хотя бы один реквизит'")); + Возврат; + КонецЕсли; + + Закрыть(Результат); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Возвращаемое значение: +// Структура: +// * ЭтоНадпись - Булево +// * Имя - Строка +// * Заголовок - Строка +// * Предупреждение - Строка +// +&НаСервереБезКонтекста +Функция НовыеСвойстваЭлементаФормы() + + НовыеСвойства = Новый Структура; + НовыеСвойства.Вставить("ЭтоНадпись", Ложь); + НовыеСвойства.Вставить("Имя", ""); + НовыеСвойства.Вставить("Заголовок", ""); + НовыеСвойства.Вставить("Предупреждение", ""); + + Возврат НовыеСвойства; + +КонецФункции + +&НаСервере +Процедура ДобавитьРеквизитыНаФорму(ДобавляемыеЭлементы) + + Если ЗначениеЗаполнено(Параметры.ПолноеИмяОбъекта) Тогда + БлокируемыеРеквизиты = Новый ФиксированныйМассив( + ЗапретРедактированияРеквизитовОбъектовСлужебный.БлокируемыеРеквизитыОбъектаИЭлементыФормы( + Параметры.ПолноеИмяОбъекта)); + Иначе + БлокируемыеРеквизиты = Новый ФиксированныйМассив(Новый Массив); + КонецЕсли; + + Описание = Новый ТаблицаЗначений; + Описание.Колонки.Добавить("ИмяРеквизита", Новый ОписаниеТипов("Строка")); + Описание.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); + Описание.Колонки.Добавить("РедактированиеРазрешено", Новый ОписаниеТипов("Булево")); + Описание.Колонки.Добавить("БлокируемыеЭлементы", Новый ОписаниеТипов("Массив")); + Описание.Колонки.Добавить("ПравоРедактирования", Новый ОписаниеТипов("Булево")); + + Если ТипЗнч(Параметры.ОписаниеБлокируемыхРеквизитов) = Тип("Массив") Тогда + Для Каждого ОписаниеРеквизита Из Параметры.ОписаниеБлокируемыхРеквизитов Цикл + ЗаполнитьЗначенияСвойств(Описание.Добавить(), ОписаниеРеквизита); + КонецЦикла; + Иначе + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Параметры.ПолноеИмяОбъекта); + ЗапретРедактированияРеквизитовОбъектовСлужебный.ЗаполнитьОписаниеБлокируемыхРеквизитов(Описание, + МетаданныеОбъекта, БлокируемыеРеквизиты, Ложь); + КонецЕсли; + + ДобавляемыеРеквизиты = Новый Массив; + ДобавленныеРеквизиты = Новый Соответствие; + СвойстваГрупп = Новый Соответствие; + ОбщаяНадписьНастроена = Ложь; + Для Каждого БлокируемыйРеквизит Из БлокируемыеРеквизиты Цикл + Если ЗначениеЗаполнено(БлокируемыйРеквизит.Группа) + Или ЗначениеЗаполнено(БлокируемыйРеквизит.ПредставлениеГруппы) Тогда + СвойстваГруппы = СвойстваГрупп.Получить(БлокируемыйРеквизит.Группа); + Если СвойстваГруппы = Неопределено Тогда + СвойстваГруппы = Новый Структура; + СвойстваГруппы.Вставить("Представление", БлокируемыйРеквизит.ПредставлениеГруппы); + СвойстваГруппы.Вставить("Предупреждение", БлокируемыйРеквизит.Предупреждение); + СвойстваГруппы.Вставить("ПредупреждениеГруппы", БлокируемыйРеквизит.ПредупреждениеГруппы); + СвойстваГрупп.Вставить(БлокируемыйРеквизит.Группа, СвойстваГруппы); + КонецЕсли; + КонецЕсли; + Если Не ОбщаяНадписьНастроена Тогда + ОбщаяНадписьНастроена = Истина; + Если Не ЗначениеЗаполнено(БлокируемыйРеквизит.Имя) + И БлокируемыйРеквизит.Группа = "ОбщаяНадпись" Тогда + Если Не ЗначениеЗаполнено(БлокируемыйРеквизит.ПредставлениеГруппы) Тогда + Продолжить; + КонецЕсли; + ЗаголовокНадписи = БлокируемыйРеквизит.ПредставлениеГруппы; + Иначе + ЗаголовокНадписи = + НСтр("ru = 'Перед изменением реквизитов рекомендуется проверить использование объекта. + |Если объект используется, то необходимо оценить последствия изменений.'"); + КонецЕсли; + СвойстваЭлемента = НовыеСвойстваЭлементаФормы(); + СвойстваЭлемента.ЭтоНадпись = Истина; + СвойстваЭлемента.Имя = "ОбщаяНадпись"; + СвойстваЭлемента.Заголовок = ЗаголовокНадписи; + ДобавляемыеЭлементы.Добавить(СвойстваЭлемента); + КонецЕсли; + Если ЗаблокированныеРеквизиты.Найти(БлокируемыйРеквизит.Имя) = Неопределено Тогда + Продолжить; + КонецЕсли; + ОписаниеРеквизита = Описание.Найти(БлокируемыйРеквизит.Имя, "ИмяРеквизита"); + Если ОписаниеРеквизита = Неопределено + Или Не ОписаниеРеквизита.ПравоРедактирования Тогда + Продолжить; + КонецЕсли; + СвойстваГруппы = СвойстваГрупп.Получить(БлокируемыйРеквизит.Группа); + Если СвойстваГруппы <> Неопределено Тогда + Если Параметры.ГрупповоеИзменениеОбъектов Тогда + ПолноеИмяРеквизита = "РазблокируемыйРеквизит" + БлокируемыйРеквизит.Имя; + ПредставлениеРеквизита = ОписаниеРеквизита.Представление; + Если ЗначениеЗаполнено(БлокируемыйРеквизит.Предупреждение) Тогда + ПредупреждениеРеквизита = БлокируемыйРеквизит.Предупреждение; + Иначе + ПредупреждениеРеквизита = СвойстваГруппы.Предупреждение; + КонецЕсли; + Иначе + ПолноеИмяРеквизита = "РазблокируемыйРеквизит" + БлокируемыйРеквизит.Группа; + ПредставлениеРеквизита = СвойстваГруппы.Представление; + Если ЗначениеЗаполнено(СвойстваГруппы.ПредупреждениеГруппы) Тогда + ПредупреждениеРеквизита = СвойстваГруппы.ПредупреждениеГруппы; + Иначе + ПредупреждениеРеквизита = СвойстваГруппы.Предупреждение; + КонецЕсли; + КонецЕсли; + Иначе + ПолноеИмяРеквизита = "РазблокируемыйРеквизит" + БлокируемыйРеквизит.Имя; + ПредставлениеРеквизита = ОписаниеРеквизита.Представление; + ПредупреждениеРеквизита = БлокируемыйРеквизит.Предупреждение; + КонецЕсли; + Добавленные = ДобавленныеРеквизиты.Получить(ПолноеИмяРеквизита); + Если Добавленные = Неопределено Тогда + Если БлокируемыйРеквизит.Имя = Параметры.ОтмеченныйРеквизит Тогда + ОтмеченныйРеквизит = ПолноеИмяРеквизита; + КонецЕсли; + Добавленные = Новый Массив; + ДобавленныеРеквизиты.Вставить(ПолноеИмяРеквизита, Добавленные); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ПолноеИмяРеквизита, + Новый ОписаниеТипов("Булево"),, ПредставлениеРеквизита)); + СвойстваЭлемента = НовыеСвойстваЭлементаФормы(); + СвойстваЭлемента.ЭтоНадпись = Ложь; + СвойстваЭлемента.Имя = ПолноеИмяРеквизита; + СвойстваЭлемента.Предупреждение = ПредупреждениеРеквизита; + ДобавляемыеЭлементы.Добавить(СвойстваЭлемента); + КонецЕсли; + Добавленные.Добавить(БлокируемыйРеквизит.Имя); + КонецЦикла; + ИзменитьРеквизиты(ДобавляемыеРеквизиты); + + РазблокируемыеРеквизиты = ОбщегоНазначения.ФиксированныеДанные(ДобавленныеРеквизиты); + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьЭлементыНаФорму(ДобавляемыеЭлементы) + + ЭлементРодитель = Элементы.Главное; + ЭлементФлажка = Неопределено; + + Для Каждого ДобавляемыйЭлемент Из ДобавляемыеЭлементы Цикл + Если ДобавляемыйЭлемент.ЭтоНадпись Тогда + ЭлементНадписи = Элементы.Добавить(ДобавляемыйЭлемент.Имя, + Тип("ДекорацияФормы"), ЭлементРодитель); + ЭлементНадписи.Вид = ВидДекорацииФормы.Надпись; + ЭлементНадписи.Заголовок = ДобавляемыйЭлемент.Заголовок; + ЭлементНадписи.ЦветТекста = Метаданные.ЭлементыСтиля.ПросроченныеДанныеЦвет.Значение; + ЭлементНадписи.АвтоМаксимальнаяШирина = Ложь; + Иначе + СОтступом = ЭлементФлажка <> Неопределено + И ЗначениеЗаполнено(ЭлементФлажка.РасширеннаяПодсказка.Заголовок); + Если СОтступом Тогда + ГруппаФлажка = Элементы.Добавить("Группа" + ДобавляемыйЭлемент.Имя, + Тип("ГруппаФормы"), ЭлементРодитель); + ГруппаФлажка.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ГруппаФлажка.ОтображатьЗаголовок = Ложь; + ГруппаФлажка.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение; + Иначе + ГруппаФлажка = ЭлементРодитель; + КонецЕсли; + ЭлементФлажка = Элементы.Добавить(ДобавляемыйЭлемент.Имя, + Тип("ПолеФормы"), ГруппаФлажка); + ЭлементФлажка.Вид = ВидПоляФормы.ПолеФлажка; + ЭлементФлажка.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право; + ЭлементФлажка.ПутьКДанным = ДобавляемыйЭлемент.Имя; + Если ЗначениеЗаполнено(ДобавляемыйЭлемент.Предупреждение) Тогда + ЭлементФлажка.ОтображениеПодсказки = ОтображениеПодсказки.ОтображатьСверху; + ЭлементФлажка.РасширеннаяПодсказка.Заголовок = ДобавляемыйЭлемент.Предупреждение; + ЭлементФлажка.РасширеннаяПодсказка.АвтоМаксимальнаяШирина = Ложь; + КонецЕсли; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьФлажки(Значение, ТолькоОтмеченный = Ложь) + + Для Каждого ТекущийРазблокируемыйРеквизит Из РазблокируемыеРеквизиты Цикл + Если Не ТолькоОтмеченный + Или ТекущийРазблокируемыйРеквизит.Ключ = ОтмеченныйРеквизит Тогда + ЭтотОбъект[ТекущийРазблокируемыйРеквизит.Ключ] = Значение; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Функция ОбъектыИспользуются() + + Ссылки = ПолучитьИзВременногоХранилища(АдресСсылокНаОбъекты); + КоличествоСсылок = Ссылки.Количество(); + + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); + ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Разблокирование реквизитов: Проверка использования ссылок на объекты'"); + ПараметрыВыполнения.ЗапуститьВФоне = Истина; + ПараметрыВыполнения.ОжидатьЗавершение = 0; + + Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, + "ОбщегоНазначения.ЕстьСсылкиНаОбъект", Ссылки); + +КонецФункции + +&НаКлиенте +Процедура ПроверитьЗавершение(Результат, Контекст) Экспорт + + Элементы.Страницы.ТекущаяСтраница = Элементы.Главное; + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Результат.Статус = "Ошибка" Тогда + ПоказатьПредупреждение(, Результат.КраткоеПредставлениеОшибки); + Возврат; + КонецЕсли; + + ОбъектыИспользуются = ПолучитьИзВременногоХранилища(Результат.АдресРезультата); + Если ТипЗнч(ОбъектыИспользуются) <> Тип("Булево") Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Не удалось получить результат проверки, попробуйте еще раз'")); + Возврат; + КонецЕсли; + + Если ОбъектыИспользуются Тогда + Если КоличествоСсылок = 1 Тогда + ТекстСообщения = + НСтр("ru = 'Объект уже используется в других местах в программе. + |Не рекомендуется разрешать редактирование из-за риска рассогласования данных.'"); + Иначе + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выбранные объекты (%1) уже используются в других местах в программе. + |Не рекомендуется разрешать редактирование из-за риска рассогласования данных.'"), + КоличествоСсылок); + КонецЕсли; + Иначе + Если КоличествоСсылок = 1 Тогда + ТекстСообщения = + НСтр("ru = 'Объект еще не используется в других местах в программе. + |Можно разрешать редактирование без риска рассогласования данных.'"); + Иначе + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выбранные объекты (%1) уже используются в других местах в программе. + |Можно разрешать редактирование без риска рассогласования данных.'"), + КоличествоСсылок); + КонецЕсли; + КонецЕсли; + + ПоказатьПредупреждение(, ТекстСообщения); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/CommonForms/РазблокированиеРеквизитов/РазблокированиеРеквизитов.mdo b/SSL/src/CommonForms/РазблокированиеРеквизитов/РазблокированиеРеквизитов.mdo new file mode 100644 index 000000000..a5e94e42b --- /dev/null +++ b/SSL/src/CommonForms/РазблокированиеРеквизитов/РазблокированиеРеквизитов.mdo @@ -0,0 +1,11 @@ + + + РазблокированиеРеквизитов + + ru + Разблокирование реквизитов + + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonForms/РазрешенныеНеаккредитованныеУЦ/Form.form b/SSL/src/CommonForms/РазрешенныеНеаккредитованныеУЦ/Form.form index 88a25902b..afb2af2b4 100644 --- a/SSL/src/CommonForms/РазрешенныеНеаккредитованныеУЦ/Form.form +++ b/SSL/src/CommonForms/РазрешенныеНеаккредитованныеУЦ/Form.form @@ -99,7 +99,7 @@ <key>ru</key> - <value>Группа разрешенные неаккредитованные УЦ</value> + <value>Разрешенные неаккредитованные УЦ</value> ГруппаРазрешенныеНеаккредитованныеУЦРасширеннаяПодсказка @@ -114,7 +114,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true diff --git a/SSL/src/CommonForms/Расширения/Form.form b/SSL/src/CommonForms/Расширения/Form.form index 66cdd79dc..e018a12d8 100644 --- a/SSL/src/CommonForms/Расширения/Form.form +++ b/SSL/src/CommonForms/Расширения/Form.form @@ -294,6 +294,38 @@ Auto InAdditionalSubmenu + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 225 + + СтрокаПоискРасширеннаяПодсказка + 227 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 226 + true + + СписокРасширений + + true + + true true @@ -461,7 +493,6 @@ HorizontalIfPossible Center - Auto true true @@ -1485,7 +1516,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1586,7 +1616,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1687,7 +1716,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1716,7 +1744,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/CommonForms/Расширения/Module.bsl b/SSL/src/CommonForms/Расширения/Module.bsl index ec4e46d21..f816171a5 100644 --- a/SSL/src/CommonForms/Расширения/Module.bsl +++ b/SSL/src/CommonForms/Расширения/Module.bsl @@ -27,7 +27,7 @@ КонецЕсли; Если Не ПравоДоступа("АдминистрированиеРасширенийКонфигурации", Метаданные) Тогда - Элементы.СписокРасширенийОбновить.ТолькоВоВсехДействиях = Ложь; + Элементы.СписокРасширенийОбновить.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели; Элементы.СписокРасширений.ТолькоПросмотр = Истина; Элементы.СписокРасширенийДобавить.Видимость = Ложь; Элементы.СписокРасширенийУдалить.Видимость = Ложь; @@ -551,7 +551,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина); - ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ПоказатьПредупреждение(, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат; КонецПопытки; ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина); @@ -609,7 +609,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина); - ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ПоказатьПредупреждение(, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат; КонецПопытки; ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина); @@ -626,7 +626,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина); - ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ПоказатьПредупреждение(, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат; КонецПопытки; ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина); @@ -727,7 +727,7 @@ ДобавитьЗапросРазрешений(ЗапросыРазрешений, ПомещенныеФайлы, Контекст.ИдентификаторРасширения); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ПоказатьПредупреждение(, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат; КонецПопытки; @@ -833,7 +833,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина); - ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ПоказатьПредупреждение(, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат; КонецПопытки; ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина); @@ -1027,7 +1027,7 @@ Если ИдентификаторыСтрок <> Неопределено Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обновить расширение по причине: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ИначеЕсли ЗначениеЗаполнено(ИмяФайлаДобавляемогоРасширения) Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -1036,11 +1036,11 @@ |%3'"), ОписаниеРасширения.Имя, ИмяФайлаДобавляемогоРасширения, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Иначе ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось добавить по причине: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецЕсли; КонецПопытки; @@ -1051,8 +1051,8 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'После добавления, при подготовке расширений к работе, произошла ошибка: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + НСтр("ru = 'Возникла непредвиденная ситуация при подготовке добавленных расширений к работе: + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; КонецЕсли; @@ -1089,13 +1089,13 @@ Если ИдентификаторыСтрок <> Неопределено Тогда ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При попытке восстановить измененное расширение произошла еще одна ошибка: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибкеВосстановления)); + НСтр("ru = 'Возникла непредвиденная ситуация при попытке восстановить измененное расширение: + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибкеВосстановления)); Иначе ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При попытке удалить добавленные расширения произошла еще одна ошибка: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибкеВосстановления)); + НСтр("ru = 'Возникла непредвиденная ситуация при попытке удалить добавленные расширения: + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибкеВосстановления)); КонецЕсли; КонецПопытки; Если ВосстановлениеВыполнялось @@ -1157,12 +1157,12 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); Если Расширение.БезопасныйРежим Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'После включения безопасного режима, при подготовке расширений к работе, произошла ошибка: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + НСтр("ru = 'Возникла непредвиденная ситуация при подготовке расширений к работе (после включения безопасного режима): + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Иначе ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'После отключения безопасного режима, при подготовке расширений к работе, произошла ошибка: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + НСтр("ru = 'Возникла непредвиденная ситуация при подготовке расширений к работе (после отключения безопасного режима): + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецЕсли; КонецПопытки; @@ -1175,8 +1175,8 @@ ИнформацияОбОшибкеВосстановления = ИнформацияОбОшибке(); ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При попытке отменить изменение флажка безопасного режима расширения произошла еще одна ошибка: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибкеВосстановления)); + НСтр("ru = 'Возникла непредвиденная ситуация при попытке отменить изменение флажка безопасного режима расширения: + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибкеВосстановления)); КонецПопытки; Если ИнформацияОбОшибкеВосстановления = Неопределено Тогда СтрокаСписка.БезопасныйРежимФлаг = Расширение.БезопасныйРежим; @@ -1227,65 +1227,18 @@ Возврат; КонецЕсли; - Расширение = НайтиРасширение(СтрокаСписка.ИдентификаторРасширения); - - Если Расширение = Неопределено - Или Расширение.Активно = СтрокаСписка.Подключать Тогда - - ОбновитьСписок(); - Возврат; - КонецЕсли; - - Расширение.Активно = СтрокаСписка.Подключать; - ОтключитьПредупрежденияБезопасности(Расширение); - ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(Расширение); + ТекущееИспользование = СтрокаСписка.Подключать; Попытка - Расширение.Записать(); + Справочники.ВерсииРасширений.ПереключитьИспользованиеРасширения(СтрокаСписка.ИдентификаторРасширения, ТекущееИспользование); Исключение СтрокаСписка.Подключать = Не СтрокаСписка.Подключать; + ОбновитьСписок(); + ВызватьИсключение; КонецПопытки; - Попытка - РегистрыСведений.ПараметрыРаботыВерсийРасширений.ОбновитьПараметрыРаботыРасширений(); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - Если Расширение.Активно Тогда - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'После включения расширения, при подготовке расширений к работе, произошла ошибка: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - Иначе - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'После отключения расширения, при подготовке расширений к работе, произошла ошибка: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - КонецЕсли; - КонецПопытки; - - Если ЗначениеЗаполнено(ТекстОшибки) Тогда - ИнформацияОбОшибкеВосстановления = Неопределено; - Попытка - Расширение.Активно = Не Расширение.Активно; - Расширение.Записать(); - Исключение - ИнформацияОбОшибкеВосстановления = ИнформацияОбОшибке(); - ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС - + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При попытке отменить изменение флажка подключения расширения произошла еще одна ошибка: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибкеВосстановления)); - КонецПопытки; - Если ИнформацияОбОшибкеВосстановления = Неопределено Тогда - СтрокаСписка.Подключать = Расширение.Активно; - ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС - + НСтр("ru = 'Отменено изменение флажка подключения расширения.'"); - КонецЕсли; - КонецЕсли; - ОбновитьСписок(); - Если ЗначениеЗаполнено(ТекстОшибки) Тогда - ВызватьИсключение ТекстОшибки; - КонецЕсли; - КонецПроцедуры &НаСервере @@ -1338,9 +1291,9 @@ Иначе ВременноеРасширение = НайтиРасширение(ИдентификаторРасширения); Если ВременноеРасширение = Неопределено Тогда - ВызватьИсключение - НСтр("ru = 'Текущее расширение не существует в программе, - |возможно оно было удалено в другом сеансе.'"); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Расширение с идентификатором %1 не существует в программе, возможно оно было удалено в другом сеансе.'"), + ИдентификаторРасширения); КонецЕсли; ДанныеОбновляемогоРасширения = ВременноеРасширение.ПолучитьДанные(); КонецЕсли; @@ -1365,28 +1318,30 @@ ВременноеРасширение.Записать(ДанныеОбновляемогоРасширения); КонецЕсли; ТребуетсяВосстановление = Ложь; + Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля( СвойстваВременногоРасширения.Имя, Base64Строка(СвойстваВременногоРасширения.ХешСумма))); + Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); Если ИдентификаторРасширения = Неопределено Тогда Если ПомещенныеФайлы.Количество() > 1 Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При попытке временно добавить расширение из файла + НСтр("ru = 'При получении разрешений не удалось добавить расширение из файла |""%1"" - |возникла ошибка: + |по причине: |%2'"), ПомещенныйФайл.Имя, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Иначе ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При попытке временно добавить расширение возникла ошибка: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + НСтр("ru = 'При получении разрешений не удалось добавить расширение по причине: + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецЕсли; Иначе ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При попытке временно обновить расширение возникла ошибка: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + НСтр("ru = 'При получении разрешений не удалось обновить расширение по причине: + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецЕсли; Если ТребуетсяВосстановление Тогда Попытка @@ -1407,23 +1362,23 @@ Если ПомещенныеФайлы.Количество() > 1 Тогда ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При попытке удалить временно добавленное расширение из файла + НСтр("ru = 'При получении разрешений добавленное расширение из файла не было удалено |%1 - |возникла еще одна ошибка: + |по причине: |%2'"), ПомещенныйФайл.Имя, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Иначе ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При попытке удалить временно добавленное расширение возникла еще одна ошибка: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + НСтр("ru = 'Возникла непредвиденная ситуация при попытке удалить временно добавленное расширение: + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецЕсли; Иначе ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При попытке восстановить временно измененное расширение возникла еще одна ошибка: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + НСтр("ru = 'Возникла непредвиденная ситуация при попытке восстановить временно измененное расширение: + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецЕсли; КонецПопытки; КонецЕсли; diff --git a/SSL/src/CommonForms/РасширенноеПредставлениеОшибки/Form.form b/SSL/src/CommonForms/РасширенноеПредставлениеОшибки/Form.form index 8f7d4d455..87a0b7375 100644 --- a/SSL/src/CommonForms/РасширенноеПредставлениеОшибки/Form.form +++ b/SSL/src/CommonForms/РасширенноеПредставлениеОшибки/Form.form @@ -101,7 +101,6 @@ AlwaysHorizontal Center - Auto true true Auto @@ -216,7 +215,6 @@ UsualGroup HorizontalIfPossible - Auto true true auto @@ -286,7 +284,6 @@ UsualGroup HorizontalIfPossible - Auto true true auto @@ -316,7 +313,6 @@ UsualGroup Vertical - Auto true true Auto @@ -383,7 +379,6 @@ UsualGroup Vertical - Auto true true Auto @@ -525,7 +520,6 @@ AlwaysHorizontal Center - Auto true true Auto @@ -640,7 +634,6 @@ UsualGroup HorizontalIfPossible - Auto true true auto @@ -710,7 +703,6 @@ UsualGroup HorizontalIfPossible - Auto true true auto @@ -740,7 +732,6 @@ UsualGroup Vertical - Auto true true Auto @@ -807,7 +798,6 @@ UsualGroup Vertical - Auto true true Auto @@ -854,51 +844,14 @@ Инструкция 62 - - ТипичныеПроблемы - 64 - - <key>ru</key> - <value>При возникновении затруднений ознакомьтесь со списком <link ТипичныеПроблемы>типичных проблем при </><link ИнструкцияНажатие>работе</><link ТипичныеПроблемы> с программой электронной подписи и их решений</>.</value> - - true - true - - true - - - ТипичныеПроблемыРасширеннаяПодсказка - 66 - Label - true - true - - Left - - - - ТипичныеПроблемыКонтекстноеМеню - 65 - true - - true - Label - true - true - - - URLProcessing - ТипичныеПроблемыОбработкаНавигационнойСсылки - - Left - - ИнформацияДляПоддержки 67 <key>ru</key> - <value>В иных случаях обратитесь в службу поддержки фирмы "1С", предоставив <link Ссылка>техническую информацию о возникшей проблеме</>.</value> + <value>При возникновении затруднений ознакомьтесь со списком <link %1>типичных проблем при работе с программой электронной подписи и их решений</>. + +В иных случаях обратитесь в службу поддержки фирмы "1С", предоставив <link %2>техническую информацию о возникшей проблеме</>.</value> true true @@ -1094,7 +1047,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto diff --git a/SSL/src/CommonForms/РасширенноеПредставлениеОшибки/Module.bsl b/SSL/src/CommonForms/РасширенноеПредставлениеОшибки/Module.bsl index 9a41c5d3f..cfd40b6b4 100644 --- a/SSL/src/CommonForms/РасширенноеПредставлениеОшибки/Module.bsl +++ b/SSL/src/CommonForms/РасширенноеПредставлениеОшибки/Module.bsl @@ -13,6 +13,8 @@ ДополнительныеДанные = Параметры.ДополнительныеДанные; + Элементы.ИнформацияДляПоддержки.Заголовок = ЭлектроннаяПодписьСлужебный.ЗаголовокИнформацииДляПоддержки(); + ЭлектроннаяПодписьСлужебный.УстановитьЗаголовокОшибки(ЭтотОбъект, Параметры.ЗаголовокПредупреждения); @@ -37,15 +39,23 @@ Элементы.ГруппаПодвал.Видимость = Параметры.ПоказатьТребуетсяПомощь; Элементы.ДекорацияРазделитель2.Видимость = Параметры.ПоказатьТребуетсяПомощь; + ВидимостьСсылкиНаИнструкцию = + ЭлектроннаяПодписьСлужебный.ВидимостьСсылкиНаИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами(); + Если Параметры.ПоказатьТребуетсяПомощь Тогда Элементы.Инструкция.Видимость = Параметры.ПоказатьИнструкцию; + Элементы.ИнформацияДляПоддержки.Заголовок = ЭлектроннаяПодписьСлужебный.ЗаголовокИнформацииДляПоддержки(); Элементы.ФормаПерейтиКНастройкеПрограмм.Видимость = Параметры.ПоказатьПереходКНастройкеПрограмм; Элементы.ФормаУстановитьРасширение.Видимость = Параметры.ПоказатьУстановкуРасширения; - Элементы.ИнструкцияКлиент.Видимость = ЗначениеЗаполнено(ЯкорьОшибкиКлиент); - Элементы.ИнструкцияСервер.Видимость = ЗначениеЗаполнено(ЯкорьОшибкиСервер); + Элементы.ИнструкцияКлиент.Видимость = Элементы.ИнструкцияКлиент.Видимость И ВидимостьСсылкиНаИнструкцию + И ЗначениеЗаполнено(ЯкорьОшибкиКлиент); + Элементы.ИнструкцияСервер.Видимость = ВидимостьСсылкиНаИнструкцию И ЗначениеЗаполнено(ЯкорьОшибкиСервер); ОписаниеОшибки = Параметры.ОписаниеОшибки; + Иначе + Элементы.ИнструкцияКлиент.Видимость = Элементы.ИнструкцияКлиент.Видимость И ВидимостьСсылкиНаИнструкцию; + Элементы.ИнструкцияСервер.Видимость = ВидимостьСсылкиНаИнструкцию; КонецЕсли; - + СтандартныеПодсистемыСервер.СброситьРазмерыИПоложениеОкна(ЭтотОбъект); КонецПроцедуры @@ -72,28 +82,26 @@ КонецПроцедуры -&НаКлиенте -Процедура ТипичныеПроблемыОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - ЭлектроннаяПодписьКлиент.ОткрытьИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами(); - -КонецПроцедуры - &НаКлиенте Процедура ИнформацияДляПоддержкиОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - ТекстОшибок = ""; - ОписаниеФайлов = Новый Массив; - Если ЗначениеЗаполнено(ДополнительныеДанные) Тогда - ЭлектроннаяПодписьСлужебныйВызовСервера.ДобавитьОписаниеДополнительныхДанных( - ДополнительныеДанные, ОписаниеФайлов, ТекстОшибок); - КонецЕсли; + Если НавигационнаяСсылка = "ТипичныеПроблемы" Тогда + ЭлектроннаяПодписьКлиент.ОткрытьИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами(); + Иначе - ТекстОшибок = ТекстОшибок + ОписаниеОшибки; - ЭлектроннаяПодписьСлужебныйКлиент.СформироватьТехническуюИнформацию(ТекстОшибок, , ОписаниеФайлов); + ТекстОшибок = ""; + ОписаниеФайлов = Новый Массив; + Если ЗначениеЗаполнено(ДополнительныеДанные) Тогда + ЭлектроннаяПодписьСлужебныйВызовСервера.ДобавитьОписаниеДополнительныхДанных( + ДополнительныеДанные, ОписаниеФайлов, ТекстОшибок); + КонецЕсли; + + ТекстОшибок = ТекстОшибок + ОписаниеОшибки; + ЭлектроннаяПодписьСлужебныйКлиент.СформироватьТехническуюИнформацию(ТекстОшибок, , ОписаниеФайлов); + + КонецЕсли; КонецПроцедуры @@ -181,7 +189,7 @@ ОшибкаПоКлассификатору.Вставить("Решение", ФорматированнаяСтрока(ЕстьПричинаИРешение.Решение)); ОшибкаПоКлассификатору.Вставить("СпособУстранения", ""); Иначе - ОшибкаПоКлассификатору = ЭлектроннаяПодписьСлужебный.ОшибкаПоКлассификатору(ТекстОшибки); + ОшибкаПоКлассификатору = ЭлектроннаяПодписьСлужебный.ОшибкаПоКлассификатору(ТекстОшибки, ОшибкаНаСервере); КонецЕсли; ЭтоИзвестнаяОшибка = ОшибкаПоКлассификатору <> Неопределено; @@ -190,7 +198,7 @@ Если ЭтоИзвестнаяОшибка Тогда ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, - ЭлементИнструкция.Имя, "Заголовок", НСтр("ru = 'Подробнее'")); + ЭлементИнструкция.Имя, "Заголовок", НСтр("ru = 'Подробнее'")); Если ЗначениеЗаполнено(ОшибкаПоКлассификатору.Причина) Тогда ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, @@ -243,19 +251,26 @@ Возврат Неопределено; КонецЕсли; + ДополнительныеДанныеДляКлассификатораОшибок = ЭлектроннаяПодписьСлужебныйКлиент.ДополнительныеДанныеДляКлассификатораОшибок(); Сертификат = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеДанные, "Сертификат", Неопределено); - Если Сертификат = Неопределено Тогда - Возврат Неопределено; + Если ЗначениеЗаполнено(Сертификат) Тогда + Если ТипЗнч(Сертификат) = Тип("СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования") Тогда + ДополнительныеДанныеДляКлассификатораОшибок.Сертификат = Сертификат; + ДополнительныеДанныеДляКлассификатораОшибок.ДанныеСертификата = ДанныеСертификата(Сертификат, УникальныйИдентификатор); + ИначеЕсли ТипЗнч(Сертификат) = Тип("ДвоичныеДанные") Тогда + ДополнительныеДанныеДляКлассификатораОшибок.ДанныеСертификата = ПоместитьВоВременноеХранилище(Сертификат, УникальныйИдентификатор); + Иначе + ДополнительныеДанныеДляКлассификатораОшибок.ДанныеСертификата = Сертификат; + КонецЕсли; КонецЕсли; - Если ТипЗнч(Сертификат) = Тип("СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования") - И ЗначениеЗаполнено(Сертификат) Тогда - ДополнительныеДанные = ЭлектроннаяПодписьСлужебныйКлиент.ДополнительныеДанныеДляКлассификатораОшибок(); - ДополнительныеДанные.Сертификат = Сертификат; - Возврат ДополнительныеДанные; + ДанныеСертификата = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеДанные, "ДанныеСертификата", Неопределено); + Если ЗначениеЗаполнено(ДанныеСертификата) Тогда + ДополнительныеДанныеДляКлассификатораОшибок.ДанныеСертификата = ДанныеСертификата; КонецЕсли; - Возврат Неопределено; + Возврат ДополнительныеДанныеДляКлассификатораОшибок; + КонецФункции &НаСервере @@ -269,4 +284,16 @@ КонецФункции +&НаСервереБезКонтекста +Функция ДанныеСертификата(Сертификат, УникальныйИдентификатор) + + ДанныеСертификата = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Сертификат, "ДанныеСертификата").Получить(); + Если ЗначениеЗаполнено(ДанныеСертификата) Тогда + Возврат ПоместитьВоВременноеХранилище(ДанныеСертификата, УникальныйИдентификатор); + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonForms/РегиональныеНастройки/Form.form b/SSL/src/CommonForms/РегиональныеНастройки/Form.form index a4ffe9e55..f719a5d1c 100644 --- a/SSL/src/CommonForms/РегиональныеНастройки/Form.form +++ b/SSL/src/CommonForms/РегиональныеНастройки/Form.form @@ -109,7 +109,6 @@ UsualGroup AlwaysHorizontal - Auto WeakSeparation true Auto @@ -179,7 +178,6 @@ UsualGroup Vertical - Auto true Auto Auto @@ -264,7 +262,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -387,7 +384,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -507,7 +503,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -542,7 +537,6 @@ UsualGroup Vertical - Auto true true auto @@ -669,7 +663,6 @@ UsualGroup - Auto true true Auto @@ -800,7 +793,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto diff --git a/SSL/src/CommonForms/РегиональныеНастройки/Module.bsl b/SSL/src/CommonForms/РегиональныеНастройки/Module.bsl index f1b64acce..f924f2f51 100644 --- a/SSL/src/CommonForms/РегиональныеНастройки/Module.bsl +++ b/SSL/src/CommonForms/РегиональныеНастройки/Module.bsl @@ -416,6 +416,15 @@ КодЯзыка1 = ?(ИспользоватьДополнительныйЯзык1, ДополнительныйЯзык1, ""); КодЯзыка2 = ?(ИспользоватьДополнительныйЯзык2, ДополнительныйЯзык2, ""); + КодыЯзыков = Новый Массив; + КодыЯзыков.Добавить(ОсновнойЯзык); + Если ИспользоватьДополнительныйЯзык1 Тогда + КодыЯзыков.Добавить(ДополнительныйЯзык1); + КонецЕсли; + Если ИспользоватьДополнительныйЯзык2 Тогда + КодыЯзыков.Добавить(ДополнительныйЯзык2); + КонецЕсли; + НачатьТранзакцию(); Попытка @@ -431,6 +440,13 @@ Константы.ДанныеДляИзмененияМультиязычныхРеквизитов.Установить(СписокМетаданныхДляОбработки); + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ДобавитьЯзыкиПечатныхФорм(КодыЯзыков); + КонецЕсли; + КонецЕсли; + ЗафиксироватьТранзакцию(); Исключение diff --git a/SSL/src/CommonForms/РедактированиеДокументаOfficeOpen/Form.form b/SSL/src/CommonForms/РедактированиеДокументаOfficeOpen/Form.form new file mode 100644 index 000000000..c3b847af4 --- /dev/null +++ b/SSL/src/CommonForms/РедактированиеДокументаOfficeOpen/Form.form @@ -0,0 +1,2317 @@ + + + + <key>ru</key> + <value>Документ Office Open (Создание)</value> + + + ГруппаВертикальная + 42 + + ГруппаЛевая + 44 + + ПолеДокументаИнструкции + 48 + true + true + + true + + + ПолеДокументаИнструкции + + None + + ПолеДокументаИнструкцииРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + ПолеДокументаИнструкцииКонтекстноеМеню + 49 + true + + HTMLDocumentField + Enter + true + Left + true + + + OnClick + ПолеДокументаИнструкцииПриНажатии + + 50 + true + 10 + true + true + true + + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + ГруппаЛеваяРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + + ГруппаПравая + 46 + + ГруппаИнструкцияРедактор + 21 + + ДействияСМакетом + 118 + + Закрыть + 142 + + <key>ru</key> + <value>Закрыть</value> + + true + true + + true + + + ЗакрытьРасширеннаяПодсказка + 143 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + Auto + true + true + UserCmds + Auto + + + ЗаписатьИЗакрыть + 25 + true + true + + true + + + ЗаписатьИЗакрытьРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + Normal + true + true + UserCmds + Auto + + + Записать + 130 + true + true + + true + + + ЗаписатьРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + Form.Command.Записать + Normal + Auto + true + true + UserCmds + Auto + + + ОткрытьРедактор + 23 + true + true + + true + + + ОткрытьРедакторРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + Form.Command.ОткрытьРедактор + true + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + false + + ДействияСМакетомРасширеннаяПодсказка + 119 + Label + true + true + + Left + + + CommandBar + + Left + + + + Перевод + 100 + + Язык + 102 + + ДобавляемыеЯзыки + 128 + true + true + + true + + + <key>ru</key> + <value>Группа8</value> + + + ДобавляемыеЯзыкиРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + + + true + true + + true + + + <key>ru</key> + <value>Язык</value> + + + ЯзыкРасширеннаяПодсказка + 103 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + Перевести + 112 + true + true + + true + + + ПеревестиРасширеннаяПодсказка + 113 + 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 + + StdPicture.Document + + Auto + + true + true + + true + + + <key>ru</key> + <value>Перевод</value> + + false + + ПереводРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + CommandBar + + Left + + + + ПосмотретьПечатнуюФорму + 132 + true + true + + true + + + ПосмотретьПечатнуюФормуРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + UsualButton + Form.Command.ПосмотретьПечатнуюФорму + Normal + Picture + true + true + UserCmds + Auto + + + КомандыРедактирования + 17 + + Переименовать + 19 + true + true + + true + + + ПереименоватьРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + Form.Command.Переименовать + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ПоместитьВБуферОбмена + 94 + true + true + + true + + + ПоместитьВБуферОбменаРасширеннаяПодсказка + 95 + Label + true + true + + Left + + + Form.Command.ПоместитьВБуферОбмена + Normal + Auto + true + true + UserCmds + Auto + + + УдалитьЯзыкМакета + 114 + true + true + + true + + + УдалитьЯзыкМакетаРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + Form.Command.УдалитьЯзыкМакета + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ИмпортЭкспорт + 126 + + СохранитьВФайл + 122 + true + true + + true + + + СохранитьВФайлРасширеннаяПодсказка + 123 + Label + true + true + + Left + + + Form.Command.СохранитьВФайл + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ЗагрузитьИзФайла + 98 + true + true + + true + + + ЗагрузитьИзФайлаРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + Form.Command.ЗагрузитьИзФайла + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + ИмпортЭкспортРасширеннаяПодсказка + 127 + Label + true + true + + Left + + + + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + КомандыРедактированияРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + CommandBar + + Left + Item.ДоступныеПоля + + + + КомандаСправки + 96 + + ОтобразитьИнструкцию + 51 + true + true + + true + + + ОтобразитьИнструкциюРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + Form.Command.ОтобразитьИнструкцию + Normal + Picture + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + 3 + false + Right + + КомандаСправкиРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + CommandBar + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + ГруппаИнструкцияРедакторРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + + ГруппаНазначениеМакета + 134 + + ЗаголовокНазначение + 136 + + <key>ru</key> + <value>Назначение:</value> + + true + true + + true + + + ЗаголовокНазначениеРасширеннаяПодсказка + 138 + Label + true + true + + Left + + + + ЗаголовокНазначениеКонтекстноеМеню + 137 + true + + Label + true + true + + Left + + + + ТекстНазначение + 139 + + <key>ru</key> + <value>Текст назначение</value> + + true + true + + true + + + ТекстНазначениеРасширеннаяПодсказка + 141 + Label + true + true + + Left + + + + ТекстНазначениеКонтекстноеМеню + 140 + true + + Label + true + true + + + Click + НазначениеМакетаНажатие + + true + Left + + + true + true + + true + + + <key>ru</key> + <value>Назначение макета</value> + + + ГруппаНазначениеМакетаРасширеннаяПодсказка + 135 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + + ГруппаПоляИОператоры + 6 + + ГруппаДоступныеПоля + 8 + + ДоступныеПоля + 62 + + <key>ru</key> + <value>Доступные поля</value> + + true + true + + true + + + ДоступныеПоля + + None + Add + CancelSearch + Change + Copy + CopyToClipboard + Delete + EndEdit + FindByCurrentValue + HierarchicalList + List + MoveDown + MoveUp + OutputList + SearchEverywhere + SelectAll + ShowMultipleSelection + ShowRowRearrangement + SortListAsc + SortListDesc + Tree + + ДоступныеПоляКоманднаяПанель + 63 + Left + true + + + ДоступныеПоляСтрокаПоиска + 66 + + ДоступныеПоляСтрокаПоискаРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + ДоступныеПоляСтрокаПоискаКонтекстноеМеню + 67 + true + + ДоступныеПоля + + true + + + + ДоступныеПоляСостояниеПросмотра + 72 + + ДоступныеПоляСостояниеПросмотраРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + ДоступныеПоляСостояниеПросмотраКонтекстноеМеню + 73 + true + + ViewStatusAddition + ДоступныеПоля + + true + + + + ДоступныеПоляУправлениеПоиском + 69 + + ДоступныеПоляУправлениеПоискомРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + + ДоступныеПоляУправлениеПоискомКонтекстноеМеню + 70 + true + + SearchControlAddition + ДоступныеПоля + + true + + + + ДоступныеПоляРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + + ДоступныеПоляКонтекстноеМеню + 64 + true + + Tree + true + true + true + true + true + MultiRow +
        true
        + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + true + AsFileRef + true +
        + true + true + + true + + + <key>ru</key> + <value>Доступные поля</value> + + + ГруппаДоступныеПоляРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + +
        + + ГруппаОператорыИФункции + 10 + + СписокОператоров + 78 + + <key>ru</key> + <value>Операторов</value> + + true + true + + true + + + СписокОператоров + + None + Add + CancelSearch + Change + Copy + CopyToClipboard + Delete + EndEdit + FindByCurrentValue + HierarchicalList + List + MoveDown + MoveUp + OutputList + SearchEverywhere + SelectAll + ShowMultipleSelection + ShowRowRearrangement + SortListAsc + SortListDesc + Tree + + СписокОператоровКоманднаяПанель + 79 + Left + true + + + СписокОператоровСтрокаПоиска + 82 + + СписокОператоровСтрокаПоискаРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + + СписокОператоровСтрокаПоискаКонтекстноеМеню + 83 + true + + СписокОператоров + + true + + + + СписокОператоровСостояниеПросмотра + 88 + + СписокОператоровСостояниеПросмотраРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + СписокОператоровСостояниеПросмотраКонтекстноеМеню + 89 + true + + ViewStatusAddition + СписокОператоров + + true + + + + СписокОператоровУправлениеПоиском + 85 + + СписокОператоровУправлениеПоискомРасширеннаяПодсказка + 87 + Label + true + true + + Left + + + + СписокОператоровУправлениеПоискомКонтекстноеМеню + 86 + true + + SearchControlAddition + СписокОператоров + + true + + + + СписокОператоровРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + СписокОператоровКонтекстноеМеню + 80 + true + + Tree + true + true + true + true + true + MultiRow +
        true
        + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + true + AsFileRef + true +
        + true + true + + true + + + <key>ru</key> + <value>Операторы и функции</value> + + + ГруппаОператорыИФункцииРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + +
        + + ГруппаТекстДляКопирования + 12 + + ТекстДляКопирования + 14 + true + + true + + + ТекстДляКопирования + + None + + ТекстДляКопированияРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ТекстДляКопированияКонтекстноеМеню + 15 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + ru + Текст для копирования и вставки в макет + + + + true + true + + true + + + <key>ru</key> + <value>Текст для копирования</value> + + + ГруппаТекстДляКопированияРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + + ГруппаСтраницыHTML + 56 + + СтраницаТонкийКлиент + 58 + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + СтраницаТонкийКлиентРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаWebКлиент + 60 + + ПолеHTML + 39 + + <key>ru</key> + <value>Поле HTML</value> + + true + true + + true + + + ПолеHTML + + None + + ПолеHTMLРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ПолеHTMLКонтекстноеМеню + 40 + true + + HTMLDocumentField + Enter + true + Left + true + + 45 + true + 45 + 3 + true + 3 + true + true + + 255 + 255 + 255 + + + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + СтраницаWebКлиентРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + ГруппаСтраницыHTMLРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Доступные поля</value> + + + ГруппаПоляИОператорыРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + UsualGroup + + Vertical + Center + + ru + Доступные поля + + Button + true + Auto + Auto + +
        + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + ГруппаПраваяРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + +
        + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + ГруппаВертикальнаяРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + +
        + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + + OnClose + ПриЗакрытии + + DontBlock + Use + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ВладелецМакета + 13 + + CatalogRef.ИдентификаторыОбъектовРасширений + CatalogRef.ИдентификаторыОбъектовМетаданных + + + true + + + true + + + + ИдентификаторМакета + 14 + + String + + + + true + + + true + + + + ИмяДокумента + 15 + + String + + + + true + + + true + + + + РедактированиеЗапрещено + 16 + + Boolean + + + true + + + true + + + + ЭтоПечатнаяФорма + 17 + + Boolean + + + true + + + true + + + + ДоступенАвтоматическийПеревод + 18 + + Boolean + + + true + + + true + + + + ТекущийЯзык + 19 + + String + + + + true + + + true + + + + Образец + 20 + + + true + + + true + + + + ТекстДляКопирования + + <key>ru</key> + <value>Текст для копирования</value> + + 21 + + String + + + + true + + + true + + + + ИмяФайлаМакета + 26 + + String + + + + true + + + true + + + + АдресФайлаМакета + 28 + + String + + + + true + + + true + + + + МакетЗагружен + 29 + + Boolean + + + true + + + true + + + + ТипМакета + 30 + + String + + + + true + + + true + + + + ПутьКФайлуМакета + 31 + + String + + + + true + + + true + + + + АдресНастройкиПанелей + 32 + + String + + + + true + + + true + + + + ПолеHTML + + <key>ru</key> + <value>Поле HTML</value> + + 33 + + String + + + + true + + + true + + + + ТекущееЗначение + 35 + + String + + + + true + + + true + + + + ПолеДокументаИнструкции + + <key>ru</key> + <value>Поле документа инструкции</value> + + 36 + + String + + + + true + + + true + + + + ЗаписьВыполнена + 37 + + Boolean + + + true + + + true + + + + ДоступныеПоля + + <key>ru</key> + <value>Доступные поля</value> + + 38 + + ValueTree + + + true + + + true + + + + СписокОператоров + + <key>ru</key> + <value>Список операторов</value> + + 44 + + ValueTree + + + true + + + true + + + + СпрятатьЗонуПеретаскивания + 46 + + Boolean + + + true + + + true + + + + ЭтоLinuxКлиент + 47 + + Boolean + + + true + + + true + + + + СсылкаМакета + 48 + + + true + + + true + + + + ХешРедактируемогоМакета + 49 + + Number + + 32 + + + + true + + + true + + + + ВремяПроверкиМодифицированностиМакета + 50 + + Number + + 20 + + + + true + + + true + + + + ТребуетсяПеревод + 51 + + Boolean + + + true + + + true + + + + КодЯзыка + 53 + + String + + + + true + + + true + + + + АдресПоставляемогоМакета + 54 + + String + + + + true + + + true + + + + ОтказСохраненияИзменений + 56 + + Boolean + + + true + + + true + + + + КлючОбъектаРедактирования + 57 + + + true + + + true + + + + ИдентификаторКопируемогоМакета + 58 + + String + + + + true + + + true + + + + ВременныйКаталог + 59 + + String + + + + true + + + true + + + + СохраненныеЯзыкиМакета + 60 + + ValueList + + + true + + + true + + + + + + + ИсточникиДанных + 61 + + ValueList + + + true + + + true + + + + + + + ЭтоМакет + 62 + + Boolean + + + true + + + true + + + + Переименовать + + <key>ru</key> + <value>Переименовать макет...</value> + + 2 + + true + + + + Переименовать + + + Auto + Auto + + + ОткрытьРедактор + + <key>ru</key> + <value>Открыть редактор</value> + + 3 + + true + + + + ОткрытьРедактор + + + Auto + Auto + + + ЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 4 + + true + + + StdPicture.SaveFile + + + + ЗавершитьИзменение + + + Auto + Auto + + + ПоместитьВБуферОбмена + + <key>ru</key> + <value>Копировать</value> + + 5 + + true + + Ctrl+C + + CommonPicture.СкопироватьВБуферОбмена + + + + ПоместитьВБуферОбмена + + + Picture + Auto + Auto + + + ОтобразитьИнструкцию + + <key>ru</key> + <value>Отобразить инструкцию</value> + + 6 + + true + + F1 + + StdPicture.FormHelp + + + + ПоказатьИнструкцию + + + Picture + Auto + Auto + + + ЗагрузитьИзФайла + + <key>ru</key> + <value>Загрузить из файла...</value> + + 7 + + true + + + + ЗагрузитьИзФайла + + + Auto + Auto + + + Перевести + + <key>ru</key> + <value>Перевести</value> + + 8 + + ru + Перевести + + + true + + + + Перевести + + + Auto + Auto + + + ПоказатьОригинал + + <key>ru</key> + <value>Показывать поставляемый макет</value> + + 9 + + ru + Показать оригинал + + + true + + + + ПоказатьОригинал + + + Auto + Auto + + + УдалитьЯзыкМакета + + <key>ru</key> + <value>Удалить язык макета</value> + + 10 + + true + + + StdPicture.Delete + + + + УдалитьЯзыкМакета + + + Auto + Auto + + + СохранитьВФайл + + <key>ru</key> + <value>Сохранить в файл...</value> + + 11 + + true + + + + СохранитьВФайл + + + Auto + Auto + + + Записать + + <key>ru</key> + <value>Записать</value> + + 12 + + true + + + + Записать + + + Auto + Auto + + + ПосмотретьПечатнуюФорму + + <key>ru</key> + <value>Посмотреть печатную форму</value> + + 13 + + true + + + StdPicture.ShowData + + + + ПосмотретьПечатнуюФорму + + + Auto + Auto + + + КодЯзыка + + String + + + + + Ссылка + + true + + + ИмяОбъектаМетаданныхМакета + + String + + + true + + + Владелец + + CatalogRef.ИдентификаторыОбъектовРасширений + CatalogRef.ИдентификаторыОбъектовМетаданных + + true + + + Копирование + + Boolean + + + + ПрисоединенныйФайл + + true + + + ПутьКФайлу + + String + + + true + + + Редактирование + + Boolean + + + + РежимОткрытияОкна + + + + ТипМакета + + String + + + + + ИмяДокумента + + String + + + + + ЭтоПечатнаяФорма + + Boolean + + + + ИсточникДанных + + CatalogRef.ИдентификаторыОбъектовРасширений + CatalogRef.ИдентификаторыОбъектовМетаданных + + + + ДоступноНазначение + + Boolean + + + + + + +
        diff --git a/SSL/src/CommonForms/РедактированиеДокументаOfficeOpen/Help/ru.html b/SSL/src/CommonForms/РедактированиеДокументаOfficeOpen/Help/ru.html new file mode 100644 index 000000000..aa3608524 --- /dev/null +++ b/SSL/src/CommonForms/РедактированиеДокументаOfficeOpen/Help/ru.html @@ -0,0 +1,45 @@ + +

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

        +

        Для редактирования макета нажмите Открыть редактор.

        +

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

        +

        Редактирование

        +
        • Для редактирования макета офисного документа можно использовать любое приложение для работы с форматом DOCX: Microsoft Word, OpenOffice.org Writer, Р7-Офис, МойОфис и др. Приложение должно быть предварительно установлено на компьютере.
        • +
        • Рекомендуется расположить окна программы и редактора рядом с помощью клавиш Win и стрелок.
        • +
        • Вставка полей в макет осуществляется с помощью переноса из одного окна в другое. Также предусмотрена кнопка  Копировать.

        Создание или редактирование пользовательской печатной формы

        +
        В списке макетов нажмите кнопку Создать или Копировать.
        +

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

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

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

        Перевод макета на другой язык

        +

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

        +

        Для этого необходимо:

        +

        +
          +
        • выбрать дополнительные языки печатных форм.
        • +
        • Ввести на дополнительном языке наименования, выводимые в печатной форме - элементы различных списков программы. После специальных настроек можно использовать автоматический перевод.
        • +
        • добавить перевод макета печатной формы на дополнительный язык. Для упрощения перевода макетов в программе предусмотрена возможность использования онлайн-сервисов перевода текста (например, Яндекс. Переводчик и Google Переводчик). Онлайн-сервис можно включить в разделе Администрирование - Печатные формы, отчеты и обработки - Перевод текста с помощью внешнего сервиса. Далее выбрать из списка нужный сервис и следовать инструкции по настройке. После становится возможным автоматический перевод текста.
        • +
          • После добавления других языков при редактировании макета появляется кнопка выбора языка.
          • +
          • Откройте на редактирование нужный макет, переключите на дополнительный язык и выполните перевод.
          • +
          • В макете следует переводить только статический текст, например заголовки, подписи и т.д.
          • +
          • Не нужно переводить параметры. Параметры в печатной форме находятся внутри текста и отображаются в квадратных скобках, например Покупатель: [Контрагент.Наименование полное], переводить следует только текст за скобками.
          • +
        После сохранения макета в колонке Дополнительные языки добавляется язык, на который был выполнен перевод.

        См. также:

        + \ No newline at end of file diff --git a/SSL/src/CommonForms/РедактированиеДокументаOfficeOpen/Module.bsl b/SSL/src/CommonForms/РедактированиеДокументаOfficeOpen/Module.bsl new file mode 100644 index 000000000..23b26e6dc --- /dev/null +++ b/SSL/src/CommonForms/РедактированиеДокументаOfficeOpen/Module.bsl @@ -0,0 +1,2497 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПовторноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + ВызватьИсключение НСтр("ru = 'Редактирование офисного документа недоступно в мобильном клиенте. + |Используйте тонкий клиент или веб-клиент.'"); + КонецЕсли; + + ЭтоLinuxКлиент = ОбщегоНазначения.ЭтоLinuxКлиент(); + + Если ЭтоLinuxКлиент Тогда + Команды.ПоместитьВБуферОбмена.СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша.Нет, Ложь, Ложь, Ложь); + Элементы.ПоместитьВБуферОбмена.Видимость = Ложь; + КонецЕсли; + + ОтобразитьИнструкцию(); + Элементы.ПолеДокументаИнструкции.Видимость = Истина; + Элементы.ОтобразитьИнструкцию.Пометка = Элементы.ПолеДокументаИнструкции.Видимость; + + Если Параметры.РежимОткрытияОкна <> Неопределено Тогда + РежимОткрытияОкна = Параметры.РежимОткрытияОкна; + КонецЕсли; + + КодЯзыка = ОбщегоНазначения.КодОсновногоЯзыка(); + ИдентификаторМакета = Параметры.ИмяОбъектаМетаданныхМакета; + СсылкаМакета = Параметры.Ссылка; + + Если ЗначениеЗаполнено(СсылкаМакета) Тогда + КлючОбъектаРедактирования = СсылкаМакета; + ЗаблокироватьДанныеДляРедактирования(КлючОбъектаРедактирования,,УникальныйИдентификатор); + ИначеЕсли ЗначениеЗаполнено(ИдентификаторМакета) Тогда + КлючОбъектаРедактирования = РегистрыСведений.ПользовательскиеМакетыПечати.ПолучитьКлючЗаписиМакета(ИдентификаторМакета); + Если КлючОбъектаРедактирования <> Неопределено Тогда + ЗаблокироватьДанныеДляРедактирования(КлючОбъектаРедактирования,,УникальныйИдентификатор); + КонецЕсли; + КонецЕсли; + + ЭтоПечатнаяФорма = Параметры.ЭтоПечатнаяФорма; + РедактированиеЗапрещено = Не Параметры.Редактирование; + ЭтоМакет = Не ПустаяСтрока(ИдентификаторМакета) Или ЭтоПечатнаяФорма; + + Если ЭтоМакет Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + ИсточникиДанныхМакета = МодульУправлениеПечатью.ИсточникиДанныхМакета(ИдентификаторМакета); + Для Каждого ИсточникДанных Из ИсточникиДанныхМакета Цикл + ИсточникиДанных.Добавить(ИсточникДанных); + КонецЦикла; + КонецЕсли; + КонецЕсли; + + Если ЗначениеЗаполнено(Параметры.ИсточникДанных) Тогда + Если Не ЗначениеЗаполнено(ИсточникиДанных) Тогда + ИсточникиДанных.Добавить(Параметры.ИсточникДанных); + КонецЕсли; + КонецЕсли; + Элементы.ТекстНазначение.Заголовок = ПредставлениеИсточниковДанных(ИсточникиДанных); + + ТипМакета = Параметры.ТипМакета; + ПредставлениеМакета = Параметры.ИмяДокумента; + ИмяФайлаМакета = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ПредставлениеМакета) + "." + НРег(ТипМакета); + + ИмяДокумента = Параметры.ИмяДокумента; + Элементы.Переименовать.Видимость = ЗначениеЗаполнено(Параметры.Ссылка) + Или ПустаяСтрока(ИдентификаторМакета) И ПустаяСтрока(Параметры.ПутьКФайлу); + + ЗагрузитьОфисныйДокументИзМетаданных(Параметры.КодЯзыка); + Если Параметры.Копирование Тогда + ИдентификаторКопируемогоМакета = ИдентификаторМакета; + ИдентификаторМакета = ""; + КонецЕсли; + + ПодготовленныйМакет = ПолучитьИзВременногоХранилища(АдресФайлаМакета); + + ДоступенПереводМакета = Ложь; + Если ЭтоМакет Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда + МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); + ДоступенПереводМакета = МодульУправлениеПечатьюМультиязычность.ДоступенПереводМакета(ИдентификаторМакета); + Если ЭтоПечатнаяФорма Или ДоступенПереводМакета Тогда + МодульУправлениеПечатьюМультиязычность.ЗаполнитьПодменюЯзык(ЭтотОбъект, Параметры.КодЯзыка); + ДоступенАвтоматическийПеревод = МодульУправлениеПечатьюМультиязычность.ДоступенАвтоматическийПеревод(ТекущийЯзык); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Элементы.Язык.Доступность = (ЭтоПечатнаяФорма Или ДоступенПереводМакета) И ЗначениеЗаполнено(ИдентификаторМакета); + + Элементы.Перевести.Видимость = ДоступенАвтоматическийПеревод; + Элементы.КнопкаПоказатьОригинал.Видимость = Элементы.Перевести.Видимость; + Элементы.КнопкаПоказатьОригинал.Доступность = ТекущийЯзык <> ОбщегоНазначения.КодОсновногоЯзыка(); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда + МодульКонструкторФормул = ОбщегоНазначения.ОбщийМодуль("КонструкторФормул"); + + ИсточникДанных = Параметры.ИсточникДанных; + Если Не ЗначениеЗаполнено(Параметры.ИсточникДанных) Тогда + ИсточникДанных = ИсточникиДанных[0].Значение; + КонецЕсли; + + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ИсточникДанных); + ПодобратьОбразец(ОбъектМетаданных); + + ПараметрыДобавления = МодульКонструкторФормул.ПараметрыДобавленияСпискаПолей(); + ПараметрыДобавления.ИмяСписка = ИмяСпискаПолей(); + ПараметрыДобавления.МестоРазмещенияСписка = Элементы.ГруппаДоступныеПоля; + ПараметрыДобавления.КоллекцииПолей = КоллекцииПолей(ИсточникиДанных.ВыгрузитьЗначения()); + ПараметрыДобавления.ПодсказкаВводаСтрокиПоиска = ПодсказкаВводаСтрокиПоискаСпискаПолей(); + ПараметрыДобавления.ПриОпределенииИсточниковДоступныхПолей = "УправлениеПечатью"; + ПараметрыДобавления.ОбработчикиСписка.Вставить("Выбор", "Подключаемый_СписокПолейВыбор"); + ПараметрыДобавления.ОбработчикиСписка.Вставить("ПередНачаломИзменения", "Подключаемый_ДоступныеПоляПередНачаломИзменения"); + ПараметрыДобавления.ОбработчикиСписка.Вставить("ПриОкончанииРедактирования", "Подключаемый_ДоступныеПоляПриОкончанииРедактирования"); + ПараметрыДобавления.ИспользоватьФоновыйПоиск = Истина; + + Если Не ЭтоLinuxКлиент Тогда + ПараметрыДобавления.КонтекстноеМеню.Вставить("Копировать", "ПоместитьВБуферОбмена"); + КонецЕсли; + + МодульКонструкторФормул.ДобавитьСписокПолейНаФорму(ЭтотОбъект, ПараметрыДобавления); + + ПараметрыДобавления = МодульКонструкторФормул.ПараметрыДобавленияСпискаПолей(); + ПараметрыДобавления.ИмяСписка = ИмяСпискаОператоров(); + ПараметрыДобавления.МестоРазмещенияСписка = Элементы.ГруппаОператорыИФункции; + ПараметрыДобавления.КоллекцииПолей.Добавить(СписокОператоров()); + ПараметрыДобавления.ПодсказкаВводаСтрокиПоиска = НСтр("ru = 'Найти оператор или функцию...'"); + ПараметрыДобавления.СкобкиПредставлений = Ложь; + ПараметрыДобавления.ОбработчикиСписка.Вставить("Выбор", "Подключаемый_СписокПолейВыбор"); + ПараметрыДобавления.ОбработчикиСписка.Вставить("ПриАктивизацииСтроки", "Подключаемый_СписокПолейАктивизацияСтроки"); + ПараметрыДобавления.ОбработчикиСписка.Вставить("НачалоПеретаскивания", "Подключаемый_ОператорыНачалоПеретаскивания"); + + Если Не ЭтоLinuxКлиент Тогда + ПараметрыДобавления.КонтекстноеМеню.Вставить("Копировать", "ПоместитьВБуферОбмена"); + КонецЕсли; + + МодульКонструкторФормул.ДобавитьСписокПолейНаФорму(ЭтотОбъект, ПараметрыДобавления); + + РасширитьСписокПолей(); + + КонецЕсли; + + ПодготовитьМакетКОткрытию(ПодготовленныйМакет); + ПоместитьВоВременноеХранилище(ПодготовленныйМакет, АдресФайлаМакета); + ХешРедактируемогоМакета = ПолучитьХешМакета(АдресФайлаМакета); + ВремяПроверкиМодифицированностиМакета = ТекущаяУниверсальнаяДатаВМиллисекундах(); + Элементы.ГруппаНазначениеМакета.Доступность = Параметры.ДоступноНазначение; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + #Если ВебКлиент Тогда + СпрятатьЗонуПеретаскивания = Ложь; + #Иначе + СпрятатьЗонуПеретаскивания = Истина; + #КонецЕсли + + Если ЭтоLinuxКлиент Тогда + СпрятатьЗонуПеретаскивания = Ложь; + КонецЕсли; + + Если Не СпрятатьЗонуПеретаскивания Тогда + Элементы.ГруппаСтраницыHTML.ТекущаяСтраница = Элементы.СтраницаWebКлиент; + Иначе + Элементы.ГруппаСтраницыHTML.ТекущаяСтраница = Элементы.СтраницаТонкийКлиент; + ПереместитьГруппуОператоровИФункций(); + КонецЕсли; + + ПодготовитьИнструкцию(); + МинимизироватьИнтерфейс(); + УстановитьНачальныеНастройкиФормы(); + +КонецПроцедуры + + +&НаКлиенте +Процедура ПриЗакрытии(ЗавершениеРаботы) + Если Не ЗавершениеРаботы Тогда + ВернутьИнтерфейс(); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + Если ИмяСобытия = "ЗапросИменРедактируемыхТабличныхДокументов" И Источник <> ЭтотОбъект Тогда + ИменаДокументов = Параметр; // Массив - + ИменаДокументов.Добавить(ИмяДокумента); + ИначеЕсли ИмяСобытия = "ЗакрытиеФормыВладельца" И Источник = ВладелецФормы Тогда + Если Открыта() Тогда + Закрыть(); + Параметр.Отказ = Истина; + КонецЕсли; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если ОтказСохраненияИзменений Тогда + + ИначеЕсли Не ЗаписьВыполнена Тогда + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("Отказ", Отказ); + ДополнительныеПараметры.Вставить("ЗавершениеРаботы", ЗавершениеРаботы); + ДополнительныеПараметры.Вставить("ТекстПредупреждения", ТекстПредупреждения); + ДополнительныеПараметры.Вставить("СтандартнаяОбработка", СтандартнаяОбработка); + + Оповещение = Новый ОписаниеОповещения("ПередЗакрытиемОкончание", ЭтотОбъект, ДополнительныеПараметры); + ОповещениеОшибки = Новый ОписаниеОповещения("ОшибкаПриЧтенииФайла", ЭтотОбъект); + ПрочитатьРедактируемыйФайлМакета(Оповещение, ОповещениеОшибки); + Отказ = Истина; + + Иначе + ПередЗакрытиемЗавершение(Ложь, Неопределено); + КонецЕсли; + + Если Не Отказ И Не ЗавершениеРаботы И ЗначениеЗаполнено(КлючОбъектаРедактирования) Тогда + РазблокироватьНаСервере(); + КонецЕсли; + +КонецПроцедуры + + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ПолеДокументаИнструкцииПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка) + Если ДанныеСобытия.Event.type = "click" И СтрНайти(ДанныеСобытия.Element.href, "ВызватьСправку")<> 0 Тогда + ОткрытьСправку("ОбщаяФорма.РедактированиеДокументаOfficeOpen"); + СтандартнаяОбработка = ложь; + КонецЕсли; +КонецПроцедуры + +#КонецОбласти + + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ПоказатьИнструкцию(Команда) + Элементы.ПолеДокументаИнструкции.Видимость = Не Элементы.ПолеДокументаИнструкции.Видимость; + Элементы.ОтобразитьИнструкцию.Пометка = Элементы.ПолеДокументаИнструкции.Видимость; +КонецПроцедуры + +&НаКлиенте +Процедура Записать(Команда) + Оповещение = Новый ОписаниеОповещения("ЗаписатьПродолжение", ЭтотОбъект); + ОповещениеОшибки = Новый ОписаниеОповещения("ОшибкаПриЧтенииФайла", ЭтотОбъект); + ПрочитатьРедактируемыйФайлМакета(Оповещение, ОповещениеОшибки); +КонецПроцедуры + +&НаКлиенте +Процедура Переименовать(Команда) + + ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореИмениМакета", ЭтотОбъект); + ПоказатьВводСтроки(ОписаниеОповещения, ИмяДокумента, НСтр("ru = 'Введите наименование макета'"), 100, Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура Перевести(Команда) + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполнить автоматический перевод на %1 язык?'"), Элементы.Язык.Заголовок); + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Выполнить перевод'")); + Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Не выполнять'")); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПриОтветеНаВопросОПереводеМакета", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки); +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьОригинал(Команда) + ПараметрыОткрытияМакета = ПолучитьПараметрыОткрытияМакета(АдресФайлаМакета); + ПараметрыОткрытияМакета.ИмяФайлаДляОткрытия = "Оригинал.docx"; + ПараметрыОткрытияМакета.ТолькоПросмотр = Истина; + + ОткрытьМакет(ПараметрыОткрытияМакета); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьРедактор(Команда) + Оповещение = Новый ОписаниеОповещения("ОткрытьРедакторПродолжение", ЭтотОбъект); + ОповещениеОшибки = Новый ОписаниеОповещения("ОшибкаПриОткрытииФайла", ЭтотОбъект); + ПрочитатьРедактируемыйФайлМакета(Оповещение, ОповещениеОшибки); +КонецПроцедуры + +&НаКлиенте +Процедура ЗагрузитьИзФайла(Команда) + ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла(); + ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор; + ПараметрыЗагрузки.Диалог.Заголовок = НСтр("ru = 'Выберите офисный документ'"); + ПараметрыЗагрузки.Диалог.Фильтр = НСтр("ru = 'Офисный документ'") + " (*.docx)|*.docx"; + + ОписаниеОповещения = Новый ОписаниеОповещения("ПродолжитьЗагрузкуИзФайла", ЭтотОбъект); + ФайловаяСистемаКлиент.ЗагрузитьФайл(ОписаниеОповещения, ПараметрыЗагрузки,, АдресФайлаМакета); +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьВФайл(Команда) + Оповещение = Новый ОписаниеОповещения("СохранитьВФайлПродолжение", ЭтотОбъект); + ОповещениеОшибки = Новый ОписаниеОповещения("ОшибкаПриЧтенииФайла", ЭтотОбъект); + ПрочитатьРедактируемыйФайлМакета(Оповещение, ОповещениеОшибки); +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершитьИзменение(Команда) + Оповещение = Новый ОписаниеОповещения("ЗавершитьИзменениеЗавершение", ЭтотОбъект); + ОповещениеОшибки = Новый ОписаниеОповещения("ОшибкаПриЧтенииФайла", ЭтотОбъект); + ПрочитатьРедактируемыйФайлМакета(Оповещение, ОповещениеОшибки); +КонецПроцедуры + +&НаКлиенте +Процедура ПоместитьВБуферОбмена(Команда) + + ДокументHTML = Элементы.ПолеHTML.Документ; + Кнопка = ДокументHTML.getElementById("myb"); + Если Кнопка = Неопределено Тогда + ПоказатьПредупреждение(,НСтр("ru = 'Выберите поле объекта, оператор или функцию.'")); + Иначе + Кнопка.onclick(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПосмотретьПечатнуюФорму(Команда) + Оповещение = Новый ОписаниеОповещения("ПосмотретьПечатнуюФормуПродолжение", ЭтотОбъект); + ОповещениеОшибки = Новый ОписаниеОповещения("ОшибкаПриЧтенииФайла", ЭтотОбъект); + ПрочитатьРедактируемыйФайлМакета(Оповещение, ОповещениеОшибки); +КонецПроцедуры + +&НаКлиенте +Процедура ПосмотретьПечатнуюФормуПродолжение(Результат, Контекст) Экспорт + ПечатнаяФорма = ПолучитьПечатнуюФорму(); + АдресОбразца = ПечатнаяФорма.Ключ; + Если АдресОбразца <> Неопределено Тогда + ПараметрыОткрытияМакета = ПолучитьПараметрыОткрытияМакета(АдресОбразца); + ПараметрыОткрытияМакета.ПроизводитьПодготовкуМакета = Ложь; + ПараметрыОткрытияМакета.СчитыватьХеш = Ложь; + ТекущаяДата = ОбщегоНазначенияКлиент.ДатаСеанса(); + ПараметрыОткрытияМакета.ИмяФайлаДляОткрытия = НСтр("ru = 'Образец'")+" "+ СтрЗаменить(ТекущаяДата, ":", "_")+".docx"; + ОткрытьМакет(ПараметрыОткрытияМакета); + КонецЕсли; +КонецПроцедуры + + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура ПереместитьГруппуОператоровИФункций() + Элементы.Переместить(Элементы.ГруппаОператорыИФункции, Элементы.СтраницаТонкийКлиент); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьРедакторПродолжение(Результат, ДополнительныеПараметры) Экспорт + ПараметрыОткрытияМакета = ПолучитьПараметрыОткрытияМакета(АдресФайлаМакета); + ПараметрыОткрытияМакета.ПроизводитьПодготовкуМакета = Ложь; + ПараметрыОткрытияМакета.СчитыватьХеш = Истина; + ПараметрыОткрытияМакета.ИмяФайлаДляОткрытия = ИмяФайлаМакета; + ОткрытьМакет(ПараметрыОткрытияМакета); +КонецПроцедуры + +&НаКлиенте +Процедура ПрочитатьРедактируемыйФайлМакета(ОповещениеПродолжения, ОповещениеОшибки) + Если ПутьКФайлуМакета = "" Тогда + ВыполнитьОбработкуОповещения(ОповещениеПродолжения, Неопределено); + Возврат; + КонецЕсли; + + ПараметрыОповещения = Новый Структура("ОповещениеПродолжения, ОповещениеОшибки"); + ПараметрыОповещения.ОповещениеПродолжения = ОповещениеПродолжения; + ПараметрыОповещения.ОповещениеОшибки = ОповещениеОшибки; + + ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗагрузкеФайлаВХранилище", ЭтотОбъект, ПараметрыОповещения); +#Если ВебКлиент Тогда + ЗапроситьРазрешенияДляПроверкиИЗагрузитьФайл(ОписаниеОповещения); +#Иначе + ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла(); + ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор; + ПараметрыЗагрузки.Интерактивно = Ложь; + ФайловаяСистемаКлиент.ЗагрузитьФайл(ОписаниеОповещения, ПараметрыЗагрузки, ПутьКФайлуМакета, АдресФайлаМакета); +#КонецЕсли + +КонецПроцедуры + +&НаКлиенте +Процедура ЗапроситьРазрешенияДляПроверкиИЗагрузитьФайл(ОписаниеОповещенияПродолжения) + + ОбработчикПослеРазрешений = Новый ОписаниеОповещения("ПослеЗапросаРазрешенийДляПроверкиФайла", ЭтотОбъект, ОписаниеОповещенияПродолжения); + + МассивПомещаемыхФайлов = Новый Массив; + МассивПомещаемыхФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ПутьКФайлуМакета, АдресФайлаМакета)); + + МассивВызовов = Новый Массив; + Вызов = Новый Массив; + Вызов.Добавить("НачатьПомещениеФайлов"); + Вызов.Добавить(МассивПомещаемыхФайлов); + Вызов.Добавить(Неопределено); + Вызов.Добавить(Ложь); + Вызов.Добавить(УникальныйИдентификатор); + МассивВызовов.Добавить(Вызов); + + Вызов = Новый Массив; + Вызов.Добавить("НачатьУдалениеФайлов"); + Вызов.Добавить(ПутьКФайлуМакета); + Вызов.Добавить(""); + Вызов.Добавить(); + МассивВызовов.Добавить(Вызов); + + НачатьЗапросРазрешенияПользователя(ОбработчикПослеРазрешений, МассивВызовов); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗапросаРазрешенийДляПроверкиФайла(РазрешенияПолучены, ОписаниеОповещенияПродолжения) Экспорт + Если Не РазрешенияПолучены Тогда + Возврат; + КонецЕсли; + ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗагрузкеФайлаВХранилищеПроверкаЧтения", ЭтотОбъект, ОписаниеОповещенияПродолжения); + ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла(); + ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор; + ПараметрыЗагрузки.Интерактивно = Ложь; + ФайловаяСистемаКлиент.ЗагрузитьФайл(ОписаниеОповещения, ПараметрыЗагрузки, ПутьКФайлуМакета, АдресФайлаМакета); +КонецПроцедуры + +// +// Параметры: +// ПомещенныйФайл - Неопределено +// - Структура: +// * Хранение - Строка +// * Имя - Строка +// +&НаКлиенте +Процедура ПриЗагрузкеФайлаВХранилищеПроверкаЧтения(ПомещенныйФайл, ОписаниеОповещенияПродолжения) Экспорт + Контекст = Новый Структура("ОписаниеОповещенияОкончания", ОписаниеОповещенияПродолжения); + Контекст.Вставить("ЗагружаемыеФайлы", ПомещенныйФайл); + ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПроверкиСуществования", ЭтотОбъект, Контекст); + Файл = Новый Файл(ПомещенныйФайл.Имя); + Файл.НачатьПроверкуСуществования(ОписаниеОповещения); +КонецПроцедуры + + +// Параметры: +// Результат - Булево +// Контекст - Структура: +// * ОписаниеОповещенияОкончания - ОписаниеОповещения +// * ЗагружаемыеФайлы - см. ПриЗагрузкеФайлаВХранилищеПроверкаЧтения.ПомещенныйФайл +// +&НаКлиенте +Процедура ПослеПроверкиСуществования(Результат, Контекст) Экспорт + ОписаниеНачатьПеремещениеФайла = Новый ОписаниеОповещения("ПослеПопыткиУдаления", ЭтотОбъект, Контекст, "ОшибкаУдаленияФайла", ЭтотОбъект); + Если Результат Тогда + НачатьУдалениеФайлов(ОписаниеНачатьПеремещениеФайла, Контекст.ЗагружаемыеФайлы.Имя); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПослеПопыткиУдаления(Контекст) Экспорт + ПутьКФайлуМакета = ""; + СтруктураХраненияФайла = Новый Структура("Хранение", АдресФайлаМакета); + ВыполнитьОбработкуОповещения(Контекст.ОписаниеОповещенияОкончания, СтруктураХраненияФайла); +КонецПроцедуры + +&НаКлиенте +Процедура ОшибкаУдаленияФайла(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт + СтандартнаяОбработка = Ложь; + ПредупредитьОБлокировкеИОткрытьПриложение(); +КонецПроцедуры + +&НаКлиенте +Процедура ОшибкаПриОткрытииФайла(Результат, Контекст) Экспорт + ОткрытьФайлЗавершение(ПутьКФайлуМакета); +КонецПроцедуры + +&НаКлиенте +Процедура ОшибкаПриЧтенииФайла(Результат, Контекст) Экспорт + ОткрытьФайлЗавершение(ПутьКФайлуМакета); +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗагрузкеФайлаВХранилище(Файл, ПараметрыОповещения) Экспорт + + Если Файл <> Неопределено Тогда + АдресФайлаМакета = Файл.Хранение; + ВыполнитьОбработкуОповещения(ПараметрыОповещения.ОповещениеПродолжения, Неопределено); + Иначе + ВыполнитьОбработкуОповещения(ПараметрыОповещения.ОповещениеОшибки); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьВФайлПродолжение(Результат, ДополнительныеПараметры) Экспорт + ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла(); + ПараметрыСохранения.Диалог.Заголовок = НСтр("ru = 'Выберите офисный документ'"); + ПараметрыСохранения.Диалог.Фильтр = НСтр("ru = 'Офисный документ'") + " (*.docx)|*.docx"; + ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, АдресФайлаМакета,,ПараметрыСохранения); +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершитьИзменениеЗавершение(Результат, ДополнительныеПараметры) Экспорт + ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗагрузкеФайла", ЭтотОбъект); + ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла(); + ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор; + ПараметрыЗагрузки.Интерактивно = Не ЗначениеЗаполнено(ПутьКФайлуМакета); + ФайловаяСистемаКлиент.ЗагрузитьФайл(ОписаниеОповещения, ПараметрыЗагрузки, ПутьКФайлуМакета); +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьПродолжение(Результат, ДополнительныеПараметры) Экспорт + + Если ЭтоАдресВременногоХранилища(АдресФайлаМакета) Тогда + Макет = МакетИзВременногоХранилища(); + ХешРедактируемогоМакета = ПолучитьХешМакета(Макет); + ЗаписатьМакет(Макет); + ОповеститьОЗаписиОфисногоДокумента(); + КонецЕсли; + УстановитьЗаголовок(); + +КонецПроцедуры + +// Параметры: +// ПомещенныйФайл - см. ПриЗагрузкеФайлаВХранилищеПроверкаЧтения.ПомещенныйФайл +// +&НаКлиенте +Процедура ПродолжитьЗагрузкуИзФайла(ПомещенныйФайл, ДополнительныеПараметры) Экспорт + + Если ПомещенныйФайл = Неопределено Тогда + Возврат; + КонецЕсли; + + МассивИмени = СтрРазделить(ПомещенныйФайл.Имя, "\/"); + + ПараметрыОткрытияМакета = ПолучитьПараметрыОткрытияМакета(АдресФайлаМакета); + ПараметрыОткрытияМакета.ПроизводитьПодготовкуМакета = СодержитПараметры(АдресФайлаМакета); + ПараметрыОткрытияМакета.ИмяФайлаДляОткрытия = МассивИмени[МассивИмени.ВГраница()]; + + Модифицированность = МакетИзменен(); + ОткрытьМакет(ПараметрыОткрытияМакета); + +КонецПроцедуры + +&НаСервере +Функция СодержитПараметры(АдресМакета) + Макет = ПолучитьИзВременногоХранилища(АдресМакета); + ДеревоМакета = УправлениеПечатью.ИнициализироватьМакетОфисногоДокументаСКД(Макет); + СтруктураДокумента = ДеревоМакета.СтруктураДокумента; + ДеревоДокумента = СтруктураДокумента.ДеревоДокумента; + УзелПараметра = УправлениеПечатьюСлужебный.НайтиУзелПоСодержимому(ДеревоДокумента, "w:textInput"); + Возврат УзелПараметра <> Неопределено; +КонецФункции + +&НаСервере +Процедура ЗагрузитьОфисныйДокументИзМетаданных(Знач КодЯзыка = Неопределено) + + ТребуетсяПеревод = Ложь; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + + Если ИдентификаторМакета = "" Тогда + АдресФайлаМакета = ПоместитьВоВременноеХранилище(ПолучитьОбщийМакет("ПустойМакетDOCX"), УникальныйИдентификатор); + Иначе + АдресФайлаМакета = ПоместитьВоВременноеХранилище(МодульУправлениеПечатью.МакетПечатнойФормы(ИдентификаторМакета, КодЯзыка), УникальныйИдентификатор); + КонецЕсли; + + Если ИдентификаторМакета <> "" И Не ЗначениеЗаполнено(СсылкаМакета) Тогда + АдресПоставляемогоМакета = ПоместитьВоВременноеХранилище(МодульУправлениеПечатью.ПоставляемыйМакет(ИдентификаторМакета, КодЯзыка), УникальныйИдентификатор); + КонецЕсли; + КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда + МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); + Если ЗначениеЗаполнено(КодЯзыка) Тогда + ДоступныеЯзыкиТабличногоДокумента = МодульУправлениеПечатьюМультиязычность.ЯзыкиМакета(ИдентификаторМакета); + ТребуетсяПеревод = ДоступныеЯзыкиТабличногоДокумента.Найти(КодЯзыка) = Неопределено; + КонецЕсли; + + Если КодЯзыка <> "" Тогда + ЯзыкиМакета = МодульУправлениеПечатьюМультиязычность.ЯзыкиМакета(ИдентификаторМакета); + Модифицированность = Модифицированность Или (ЯзыкиМакета.Найти(КодЯзыка) = Неопределено); + КонецЕсли; + + ДоступенАвтоматическийПеревод = МодульУправлениеПечатьюМультиязычность.ДоступенАвтоматическийПеревод(ТекущийЯзык); + Элементы.Перевести.Видимость = ДоступенАвтоматическийПеревод; + Элементы.КнопкаПоказатьОригинал.Видимость = Элементы.Перевести.Видимость; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОповеститьОЗаписиОфисногоДокумента() + + ПараметрыОповещения = Новый Структура; + ПараметрыОповещения.Вставить("ПутьКФайлу", ПутьКФайлуМакета); + ПараметрыОповещения.Вставить("ИмяОбъектаМетаданныхМакета", ИдентификаторМакета); + ПараметрыОповещения.Вставить("КодЯзыка", ТекущийЯзык); + ПараметрыОповещения.Вставить("Представление", ИмяДокумента); + ПараметрыОповещения.Вставить("ИсточникиДанных", ИсточникиДанных.ВыгрузитьЗначения()); + + Если ЗаписьВыполнена Тогда + ИмяСобытия = "Запись_ОфисныйДокумент"; + Иначе + ИмяСобытия = "ОтменаРедактированияОфисногоДокумента"; + КонецЕсли; + Оповестить(ИмяСобытия, ПараметрыОповещения, ЭтотОбъект); + + ЗаписьВыполнена = Ложь; + +КонецПроцедуры + + +&НаСервере +Процедура РазблокироватьНаСервере() + РазблокироватьДанныеДляРедактирования(КлючОбъектаРедактирования, УникальныйИдентификатор); +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытиемОкончание(Результат, ДополнительныеПараметры) Экспорт + + Отказ = ДополнительныеПараметры.Отказ; + ЗавершениеРаботы = ДополнительныеПараметры.ЗавершениеРаботы; + + Если Не ЗавершениеРаботы И Не ПовторноеЗакрытие = Истина Тогда + Модифицированность = Модифицированность ИЛИ МакетИзменен(); + КонецЕсли; + ПовторноеЗакрытие = Истина; + + ОписаниеОповещения = Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтотОбъект); + ОписаниеЯзыка = ?(ЗначениеЗаполнено(ТекущийЯзык), " ("+ТекущийЯзык+")", ""); + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Сохранить изменения в %1%2?'"), ИмяДокумента, ОписаниеЯзыка); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(ОписаниеОповещения, Отказ, ЗавершениеРаботы, ТекстВопроса); + + Если Модифицированность Или ЗавершениеРаботы Тогда + Возврат; + КонецЕсли; + + Если Не Отказ Тогда + ОтказСохраненияИзменений = Истина; + Закрыть(); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Функция МакетИзменен() + + Макет = ПолучитьИзВременногоХранилища(АдресФайлаМакета); + Если Макет <> Неопределено Тогда + Хеширование = Новый ХешированиеДанных(ХешФункция.CRC32); + Хеширование.Добавить(Макет); + ХешТекущегоМакета = Хеширование.ХешСумма; + ВремяПроверкиМодифицированностиМакета = ТекущаяУниверсальнаяДатаВМиллисекундах(); + Иначе + ХешТекущегоМакета = ХешРедактируемогоМакета; + КонецЕсли; + + Возврат ХешТекущегоМакета <> ХешРедактируемогоМакета; +КонецФункции + +&НаКлиенте +Процедура ПередЗакрытиемЗавершение(Результат, ДополнительныеПараметры) Экспорт + + Если Не ОтказСохраненияИзменений И Не ЗаписьВыполнена Тогда + МакетЗагружен = Истина; + Макет = МакетИзВременногоХранилища(); + ЗаписатьМакет(Макет); + КонецЕсли; + Закрыть(Макет); + + Если Не ЭтоНовый() Тогда + ОповеститьОЗаписиОфисногоДокумента(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОтобразитьИнструкцию() + + Макет = ПолучитьОбщийМакет("ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen"); + ПолеДокументаИнструкции = Макет.ПолучитьТекст(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПодготовитьИнструкцию() + + Если Не СпрятатьЗонуПеретаскивания Тогда + ПолеДокументаИнструкции = СтрЗаменить(ПолеДокументаИнструкции, ".thinclient{", ".webclient{"); + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура УстановитьВHTMLПоле(Значение) + + Если ЗначениеЗаполнено(Значение) Тогда + Если ЭтоLinuxКлиент Тогда + ТекстHTML = " + | + | + | + | + | %2 + | + | + | + | + |
        + |
        + |

        + | + |
        + | %3 + |
        + |
        + |

        + |

        %1
        + |

        + |
        + | + | + | + | + |"; + Иначе + ТекстHTML = " + | + | + | + | %2 + | + | + | + | + |
        + |
        + |
        + | %3 + |
        + |
        + |

        %1

        + |
        + | + | + | + | + |"; + КонецЕсли; + + Иначе + + ТекстHTML = " + | + | + | + | + | %2 + | + | + | + | + |
        + |

        %5

        + |
        + | + | + | + |"; + КонецЕсли; + + ПолеHTML = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстHTML, + СтрЗаменить(Значение, """", """), + НСтр("ru='Перенос текста'"), + НСтр("ru='Перетащите
        в редактор'"), + НСтр("ru='Скопировать'"), + НСтр("ru='Выберите поле'")); + ПолеHTML = СтрЗаменить(ПолеHTML, "%%", "%"); +КонецПроцедуры + + +&НаКлиенте +Процедура ПриЗагрузкеФайла(Файл, ДополнительныеПараметры) Экспорт + + МакетЗагружен = Файл <> Неопределено; + Если МакетЗагружен Тогда + АдресФайлаМакета = Файл.Хранение; + ИмяФайлаМакета = Файл.Имя; + КонецЕсли; + + ЗаписатьМакетИЗакрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьМакетИЗакрыть() + Макет = Неопределено; + Если МакетЗагружен Тогда + Макет = МакетИзВременногоХранилища(); + ЗаписатьМакет(Макет); + ЗаписьВыполнена = Истина; + КонецЕсли; + + Закрыть(Макет); +КонецПроцедуры + + +&НаСервере +Функция МакетИзВременногоХранилища() + Макет = ПолучитьИзВременногоХранилища(АдресФайлаМакета); + Возврат Макет; +КонецФункции + +&НаСервере +Процедура ЗаписатьМакет(Макет) + + ПодготовитьМакетКСохранению(Макет); + + + АдресМакетаВоВременномХранилище = ПоместитьВоВременноеХранилище(Макет, УникальныйИдентификатор); + ОписаниеМакета = УправлениеПечатью.ОписаниеМакета(); + ОписаниеМакета.ИмяОбъектаМетаданныхМакета = ИдентификаторМакета; + ОписаниеМакета.АдресМакетаВоВременномХранилище = АдресМакетаВоВременномХранилище; + ОписаниеМакета.КодЯзыка = ТекущийЯзык; + ОписаниеМакета.Наименование = ИмяДокумента; + ОписаниеМакета.Ссылка = СсылкаМакета; + ОписаниеМакета.ТипМакета = "DOCX"; + ОписаниеМакета.ИсточникиДанных = ИсточникиДанных.ВыгрузитьЗначения(); + + ИдентификаторМакета = УправлениеПечатью.ЗаписатьМакет(ОписаниеМакета); + Если Не ЗначениеЗаполнено(СсылкаМакета) Тогда + СсылкаМакета = УправлениеПечатью.СсылкаМакета(ИдентификаторМакета); + КонецЕсли; + + ЗаписатьМакетыНаДополнительныхЯзыках(); + + Если Не Элементы.Язык.Доступность Тогда + Элементы.Язык.Доступность = Истина; + КонецЕсли; + + СохраненныеЯзыкиМакета.Добавить(ТекущийЯзык); + ЗаписьВыполнена = Истина; + Модифицированность = Ложь; + +КонецПроцедуры + +&НаСервере +Процедура ЗаписатьМакетыНаДополнительныхЯзыках() + + ПараметрыМакета = Новый Структура; + ПараметрыМакета.Вставить("ИдентификаторКопируемогоМакета", ИдентификаторКопируемогоМакета); + ПараметрыМакета.Вставить("ТекущийЯзык", ТекущийЯзык); + ПараметрыМакета.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); + ПараметрыМакета.Вставить("ИдентификаторМакета", ИдентификаторМакета); + ПараметрыМакета.Вставить("ВладелецМакета", ВладелецМакета); + ПараметрыМакета.Вставить("ИмяДокумента", ИмяДокумента); + ПараметрыМакета.Вставить("СсылкаМакета", СсылкаМакета); + ПараметрыМакета.Вставить("ТипМакета", "DOCX"); + + УправлениеПечатью.ЗаписатьМакетыНаДополнительныхЯзыках(ПараметрыМакета); + +КонецПроцедуры + +&НаСервере +Процедура ПодготовитьМакетКСохранению(Макет) + ДеревоМакета = УправлениеПечатью.ИнициализироватьМакетОфисногоДокументаСКД(Макет); + СоответствиеЗамен = Новый Соответствие(); + Для Каждого ПараметрТекста Из ДеревоМакета.СтруктураДокумента.ПараметрыТекста Цикл + ПараметрТекстаКлюч = ПараметрТекста; + ЗаменитьПредставленияПараметров(ПараметрТекста); + СоответствиеЗамен.Вставить(ПараметрТекстаКлюч, ПараметрТекста); + КонецЦикла; + ПараметрыЗаполненияОбласти = УправлениеПечатью.ПараметрыЗаполненияОбласти(); + ПараметрыЗаполненияОбласти.ДобавлятьСвязи = Ложь; + УправлениеПечатью.УстановитьПараметры(ДеревоМакета, СоответствиеЗамен, ПараметрыЗаполненияОбласти); + Адрес = УправлениеПечатьюСлужебный.ПолучитьПечатнуюФорму(ДеревоМакета); + Макет = ПолучитьИзВременногоХранилища(Адрес); + +КонецПроцедуры + +&НаСервере +Процедура ПодготовитьМакетКОткрытию(Макет, ЗаполнитьАдресФайлаМакета = Ложь) + ДеревоМакета = УправлениеПечатью.ИнициализироватьМакетОфисногоДокументаСКД(Макет); + СтруктураДокумента = ДеревоМакета.СтруктураДокумента; + ДеревоДокумента = СтруктураДокумента.ДеревоДокумента; + УправлениеПечатью.КонвертироватьПараметры(ДеревоДокумента); + Для Каждого Колонтитул Из СтруктураДокумента.Колонтитулы Цикл + УправлениеПечатью.КонвертироватьПараметры(Колонтитул.Значение); + КонецЦикла; + + СоответствиеЗамен = Новый Соответствие(); + Для Каждого ПараметрТекста Из ДеревоМакета.СтруктураДокумента.ПараметрыТекста Цикл + ПараметрТекстаКлюч = ПараметрТекста; + ЗаменитьПараметрыПредставлениями(ПараметрТекста); + СоответствиеЗамен.Вставить(ПараметрТекстаКлюч, ПараметрТекста); + КонецЦикла; + + ПараметрыЗаполненияОбласти = УправлениеПечатью.ПараметрыЗаполненияОбласти(); + ПараметрыЗаполненияОбласти.ДобавлятьСвязи = Ложь; + УправлениеПечатью.УстановитьПараметры(ДеревоМакета, СоответствиеЗамен, ПараметрыЗаполненияОбласти); + Если ЗаполнитьАдресФайлаМакета Тогда + Адрес = УправлениеПечатьюСлужебный.ПолучитьПечатнуюФорму(ДеревоМакета, АдресФайлаМакета); + Иначе + Адрес = УправлениеПечатьюСлужебный.ПолучитьПечатнуюФорму(ДеревоМакета); + КонецЕсли; + + Макет = ПолучитьИзВременногоХранилища(Адрес); +КонецПроцедуры + +&НаСервере +Процедура ЗаменитьПараметрыПредставлениями(Строка) + + ПараметрыЗамены = ПредставленияПараметровТекста(Строка(Строка)); + + Строка = ЗаменитьВСтроке(Строка, ПараметрыЗамены); + +КонецПроцедуры + +&НаСервере +Функция ПредставленияПараметровТекста(Знач Текст) + + Результат = Новый Соответствие(); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + Возврат МодульУправлениеПечатью.ПредставленияПараметровТекста(Текст, ЭтотОбъект); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервере +Процедура ЗаменитьПредставленияПараметров(Строка) + + ПараметрыЗамены = ФормулыИзТекста(Строка(Строка)); + + Для Каждого Параметр Из ПараметрыЗамены Цикл + Формула = Параметр.Ключ; + Если СтрЧислоВхождений(Формула, "[") > 1 Тогда + Формула = Сред(Формула, 2, СтрДлина(Формула) - 2); + КонецЕсли; + + ТекстОшибки = КонструкторФормулСлужебный.ПроверитьФормулу(ЭтотОбъект, Формула); + + Если ЗначениеЗаполнено(ТекстОшибки) Тогда + ОбщегоНазначения.СообщитьПользователю(ТекстОшибки); + КонецЕсли; + КонецЦикла; + + Строка = ЗаменитьВСтроке(Строка, ПараметрыЗамены); + +КонецПроцедуры + +&НаСервере +Функция ЗаменитьВСтроке(Знач Строка, ПараметрыЗамены) + + Для Каждого Элемент Из ПараметрыЗамены Цикл + ПодстрокаПоиска = Элемент.Ключ; + ПодстрокаЗамены = Элемент.Значение; + Строка = СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены); + КонецЦикла; + + Возврат Строка; + +КонецФункции + +&НаСервере +Функция ФормулыИзТекста(Знач Текст) + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + Возврат МодульУправлениеПечатью.ФормулыИзТекста(Текст, ЭтотОбъект); + КонецЕсли; + +КонецФункции + +&НаКлиенте +Процедура УстановитьНачальныеНастройкиФормы() + + УстановитьИмяДокумента(); + УстановитьЗаголовок(); + НастроитьПредставлениеКоманд(); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьИмяДокумента() + + Если ПустаяСтрока(ИмяДокумента) Тогда + ИспользованныеИмена = Новый Массив; + Оповестить("ЗапросИменРедактируемыхТабличныхДокументов", ИспользованныеИмена, ЭтотОбъект); + + Индекс = 1; + Пока ИспользованныеИмена.Найти(ИмяНовогоДокумента() + Индекс) <> Неопределено Цикл + Индекс = Индекс + 1; + КонецЦикла; + + ИмяДокумента = ИмяНовогоДокумента() + Индекс; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ИмяНовогоДокумента() + Возврат НСтр("ru = 'Новый'"); +КонецФункции + +&НаКлиенте +Функция ПолучитьПараметрыОткрытияМакета(АдресДокумента) + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("АдресДокумента", АдресДокумента); + ПараметрыОткрытия.Вставить("ПроизводитьПодготовкуМакета", Истина); + ПараметрыОткрытия.Вставить("СчитыватьХеш", Ложь); + ПараметрыОткрытия.Вставить("ИмяФайлаДляОткрытия", ""); + ПараметрыОткрытия.Вставить("ТолькоПросмотр", РедактированиеЗапрещено); + Возврат ПараметрыОткрытия; +КонецФункции + +&НаКлиенте +Процедура ОткрытьМакет(ПараметрыОткрытия) + + ОбработчикЗавершения = Новый ОписаниеОповещения("ОткрытьПослеСохранениеУКлиента", ЭтотОбъект, ПараметрыОткрытия); + + Макет = ПолучитьИзВременногоХранилища(ПараметрыОткрытия.АдресДокумента); + + Если ПараметрыОткрытия.ПроизводитьПодготовкуМакета Тогда + ПодготовитьМакетКОткрытию(Макет, ПараметрыОткрытия.АдресДокумента = АдресФайлаМакета); + КонецЕсли; + + Если ПараметрыОткрытия.СчитыватьХеш Тогда + ХешРедактируемогоМакета = ПолучитьХешМакета(Макет); + КонецЕсли; + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); + ДополнительныеПараметры.Вставить("ВременныйКаталог", ВременныйКаталог); + ПослеПодключенияРасширения = Новый ОписаниеОповещения("ПослеПодключенияРасширения", ЭтотОбъект, ДополнительныеПараметры); + ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(ПослеПодключенияРасширения); + + Элементы.ПолеДокументаИнструкции.Видимость = Ложь; + Элементы.ОткрытьРедактор.КнопкаПоУмолчанию = Ложь; + Элементы.ЗаписатьИЗакрыть.КнопкаПоУмолчанию = Истина; + + Элементы.ПолеДокументаИнструкции.Видимость = Ложь; + Элементы.ОтобразитьИнструкцию.Пометка = Элементы.ПолеДокументаИнструкции.Видимость; +КонецПроцедуры + +&НаКлиенте +Процедура ПослеПодключенияРасширения(Подключено, ДополнительныеПараметры) Экспорт + Если Подключено Тогда + Обработчик = Новый ОписаниеОповещения("ОткрытьМакетПослеПолученияВременногоКаталога", ЭтотОбъект, ДополнительныеПараметры.ОбработчикЗавершения); + Если ВременныйКаталог = "" Тогда +#Если ВебКлиент Тогда + ФайловаяСистемаКлиент.ВыбратьКаталог(Обработчик); +#Иначе + ФайловаяСистемаКлиент.СоздатьВременныйКаталог(Обработчик); +#КонецЕсли + Иначе + ВыполнитьОбработкуОповещения(Обработчик, ВременныйКаталог); + КонецЕсли; + Иначе + Обработчик = Новый ОписаниеОповещения("ПослеЗапросаРазрешенийНаОткрытиеМакета", ЭтотОбъект, ДополнительныеПараметры); + ВыполнитьОбработкуОповещения(Обработчик); + КонецЕсли; +КонецПроцедуры + +// Параметры: +// СозданныйВременныйКаталог - Строка. +// ОбработчикЗавершения - ОписаниеОповещения. +// +&НаКлиенте +Процедура ОткрытьМакетПослеПолученияВременногоКаталога(СозданныйВременныйКаталог, ОбработчикЗавершения) Экспорт + ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути( + СозданныйВременныйКаталог); + + ПараметрыОткрытия = ОбработчикЗавершения.ДополнительныеПараметры; + + Контекст = Новый Структура; + Контекст.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); + Контекст.Вставить("ВременныйКаталог", ВременныйКаталог); + + ОбработчикПослеРазрешений = Новый ОписаниеОповещения("ПослеЗапросаРазрешенийНаОткрытиеМакета", ЭтотОбъект, Контекст); + + МассивПолучаемыхФайлов = Новый Массив; + МассивПолучаемыхФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ВременныйКаталог+ПараметрыОткрытия.ИмяФайлаДляОткрытия,ПараметрыОткрытия.АдресДокумента)); + + МассивВызовов = Новый Массив; + Вызов = Новый Массив; + Вызов.Добавить("НачатьПолучениеФайлов"); + Вызов.Добавить(МассивПолучаемыхФайлов); + Вызов.Добавить(ВременныйКаталог); + Вызов.Добавить(Ложь); + МассивВызовов.Добавить(Вызов); + + Вызов = Новый Массив; + Вызов.Добавить("НачатьЗапускПриложения"); + Вызов.Добавить(ВременныйКаталог+ПараметрыОткрытия.ИмяФайлаДляОткрытия); + Вызов.Добавить(); + Вызов.Добавить(Ложь); + МассивВызовов.Добавить(Вызов); + + НачатьЗапросРазрешенияПользователя(ОбработчикПослеРазрешений, МассивВызовов); +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗапросаРазрешенийНаОткрытиеМакета(РазрешенияПолучены, Контекст) Экспорт + + Если РазрешенияПолучены = Ложь Тогда + Возврат; + КонецЕсли; + + ОбработчикПослеРазрешений = Контекст.ОбработчикЗавершения; // ОписаниеОповещения + ВременныйКаталог = Контекст.ВременныйКаталог; + + ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла(); + + #Если ВебКлиент Тогда + ПараметрыСохранения.Интерактивно = Истина; + #Иначе + ПараметрыСохранения.Интерактивно = Ложь; + #КонецЕсли + + ПараметрыОткрытия = ОбработчикПослеРазрешений.ДополнительныеПараметры; + ФайловаяСистемаКлиент.СохранитьФайл(ОбработчикПослеРазрешений, ПараметрыОткрытия.АдресДокумента, ВременныйКаталог+ПараметрыОткрытия.ИмяФайлаДляОткрытия, ПараметрыСохранения); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьПослеСохранениеУКлиента(ПолученныеФайлы, ПараметрыОткрытия) Экспорт + + Если ПолученныеФайлы <> Неопределено Тогда + ПутьКФайлу = ПолученныеФайлы[0].ПолноеИмя; + + Если ПараметрыОткрытия.АдресДокумента = АдресФайлаМакета Тогда + ПутьКФайлуМакета = ПутьКФайлу; + КонецЕсли; + + ФайлНаДиске = Новый Файл(ПутьКФайлу); + ОписаниеПослеУстановкиТолькоЧтения = Новый ОписаниеОповещения("ОткрытьФайлЗавершение", ЭтотОбъект, ПутьКФайлу); + ФайлНаДиске.НачатьУстановкуТолькоЧтения(ОписаниеПослеУстановкиТолькоЧтения, ПараметрыОткрытия.ТолькоПросмотр); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФайлЗавершение(ПутьКФайлу) Экспорт + ПараметрыОткрытияФайла = ФайловаяСистемаКлиент.ПараметрыОткрытияФайла(); + ФайловаяСистемаКлиент.ОткрытьФайл(ПутьКФайлу,,,ПараметрыОткрытияФайла); +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПолучитьХешМакета(АдресИлиДанные) + Хеширование = Новый ХешированиеДанных(ХешФункция.CRC32); + Если ТипЗнч(АдресИлиДанные) = Тип("Строка") + И ЭтоАдресВременногоХранилища(АдресИлиДанные) Тогда + + Хеширование.Добавить(ПолучитьИзВременногоХранилища(АдресИлиДанные)); + Иначе + Хеширование.Добавить(АдресИлиДанные); + КонецЕсли; + Возврат Хеширование.ХешСумма; +КонецФункции + +&НаКлиенте +Процедура МинимизироватьИнтерфейс() + + МинимизироватьИнтерфейсНаСервере(); + ОбновитьИнтерфейс(); + ВернутьИнтерфейсНаСервере(); + +КонецПроцедуры + +&НаСервере +Процедура МинимизироватьИнтерфейсНаСервере() + ТекущиеНастройкиИнтерфейса = ХранилищеСистемныхНастроек.Загрузить("Общее/НастройкиИнтерфейсаКлиентскогоПриложения"); + АдресНастройкиПанелей = ПоместитьВоВременноеХранилище(ТекущиеНастройкиИнтерфейса, УникальныйИдентификатор); + + НастройкиСостава = Новый НастройкиСоставаИнтерфейсаКлиентскогоПриложения; + НастройкиИнтерфейса = Новый НастройкиИнтерфейсаКлиентскогоПриложения; + НастройкиИнтерфейса.УстановитьСостав(НастройкиСостава); + ХранилищеСистемныхНастроек.Сохранить("Общее/НастройкиИнтерфейсаКлиентскогоПриложения", , НастройкиИнтерфейса); + +КонецПроцедуры + +&НаКлиенте +Процедура ВернутьИнтерфейс() + + ОбновитьИнтерфейс(); + +КонецПроцедуры + +&НаСервере +Процедура ВернутьИнтерфейсНаСервере() + + Если ЭтоАдресВременногоХранилища(АдресНастройкиПанелей) Тогда + НастройкиИнтерфейса = ПолучитьИзВременногоХранилища(АдресНастройкиПанелей); + ХранилищеСистемныхНастроек.Сохранить("Общее/НастройкиИнтерфейсаКлиентскогоПриложения", , НастройкиИнтерфейса); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьЗаголовок() + + Заголовок = ИмяДокумента; + + Если ЗначениеЗаполнено(ТекущийЯзык) Тогда + ТекущийЯзыкПредставление = Элементы["Язык_"+ТекущийЯзык].Заголовок; + Заголовок = Заголовок + " ("+ТекущийЯзыкПредставление+")"; + КонецЕсли; + + Если ЭтоНовый() Тогда + Заголовок = Заголовок + " (" + НСтр("ru = 'создание'") + ")"; + ИначеЕсли РедактированиеЗапрещено Тогда + Заголовок = Заголовок + " (" + НСтр("ru = 'только просмотр'") + ")"; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ЭтоНовый() + Возврат Не ЗначениеЗаполнено(Параметры.Ссылка) И ПустаяСтрока(ИдентификаторМакета) И ПустаяСтрока(Параметры.ПутьКФайлу); +КонецФункции + +&НаКлиенте +Процедура ПриВыбореФорматаПоля(Формат, ДополнительныеПараметры) Экспорт + + Если Формат = Неопределено Тогда + Возврат; + КонецЕсли; + + ТекущиеДанные = Элементы[ИмяСпискаПолей()].ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + ТекущиеДанные.Формат = Формат; + ТекущиеДанные.Образец = Формат(ТекущиеДанные.Значение, ТекущиеДанные.Формат); + + ЗаполнитьПолеHTMLПоТекущемуПолю(); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПереключитьЯзык(Команда) + + Если ЭтоНовый() Тогда + Возврат; + КонецЕсли; + + ПараметрыДляПродолжения = Новый Структура("Команда", Команда); + Оповещение = Новый ОписаниеОповещения("ПереключитьЯзыкПослеЗагрузкиФайлаПродолжение", ЭтотОбъект, ПараметрыДляПродолжения); + ОповещениеОшибки = Новый ОписаниеОповещения("ОшибкаПриЧтенииФайла", ЭтотОбъект); + ПрочитатьРедактируемыйФайлМакета(Оповещение, ОповещениеОшибки); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПриПереключенииЯзыка(КодЯзыка, ДополнительныеПараметры) Экспорт + + ЗагрузитьОфисныйДокументИзМетаданных(КодЯзыка); + Если ТребуетсяПеревод И ДоступенАвтоматическийПеревод Тогда + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Макет еще не переведен на %1 язык. + |Выполнить автоматический перевод?'"), Элементы.Язык.Заголовок); + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Выполнить перевод'")); + Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Не выполнять'")); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПриОтветеНаВопросОПереводеМакета", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки); + Иначе + ПараметрыОткрытияМакета = ПолучитьПараметрыОткрытияМакета(АдресФайлаМакета); + ПараметрыОткрытияМакета.СчитыватьХеш = Истина; + ПараметрыОткрытияМакета.ИмяФайлаДляОткрытия = ИмяФайлаМакета; + ОткрытьМакет(ПараметрыОткрытияМакета); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПереключитьЯзыкПослеЗагрузкиФайлаПродолжение(Результат, ДополнительныеПараметры) Экспорт + + Модифицированность = Модифицированность ИЛИ МакетИзменен(); + + ПараметрыДляПродолжения = Новый Структура("Команда", ДополнительныеПараметры.Команда); + ОписаниеОповещения = Новый ОписаниеОповещения("ПереключитьЯзыкПродолжение", ЭтотОбъект, ПараметрыДляПродолжения); + + Если Модифицированность Тогда + ОписаниеЯзыка = ?(ЗначениеЗаполнено(ТекущийЯзык), " ("+ТекущийЯзык+")", ""); + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Сохранить изменения в %1%2?'"), ИмяДокумента, ОписаниеЯзыка); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена, , + КодВозвратаДиалога.Да); + Иначе + ВыполнитьОбработкуОповещения(ОписаниеОповещения, КодВозвратаДиалога.Нет); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПереключитьЯзыкПродолжение(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Отмена Тогда + Возврат; + ИначеЕсли Ответ = КодВозвратаДиалога.Да Тогда + + Макет = МакетИзВременногоХранилища(); + ЗаписатьМакет(Макет); + + Модифицированность = Ложь; + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда + Модифицированность = Ложь; + КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатьюКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюКлиент"); + МодульУправлениеПечатьюКлиент.ПереключитьЯзык(ЭтотОбъект, ДополнительныеПараметры.Команда); + УстановитьЗаголовок(); + Элементы.УдалитьЯзыкМакета.Видимость = ТекущийЯзык <> ОбщегоНазначенияКлиент.КодОсновногоЯзыка(); + Элементы.КнопкаПоказатьОригинал.Доступность = ТекущийЯзык <> ОбщегоНазначенияКлиент.КодОсновногоЯзыка(); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура УдалитьЯзыкМакета(Команда) + + Если ТекущийЯзык = ОбщегоНазначенияКлиент.КодОсновногоЯзыка() Тогда + Возврат; + КонецЕсли; + + ОписаниеОповещения = Новый ОписаниеОповещения("УдалитьЯзыкМакетаПродолжение", ЭтотОбъект, , "ОшибкаПеремещенияУдаленияФайла", ЭтотОбъект); + НачатьУдалениеФайлов(ОписаниеОповещения, ПутьКФайлуМакета); + +КонецПроцедуры + +&НаКлиенте +Процедура ОшибкаПеремещенияУдаленияФайла(ИнформацияОбОшибке, СтандартнаяОбработка, ДополнительныеПараметры) Экспорт + СтандартнаяОбработка = Ложь; + ПредупредитьОБлокировкеИОткрытьПриложение(); +КонецПроцедуры + +&НаКлиенте +Процедура ПредупредитьОБлокировкеИОткрытьПриложение() + ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьФайлЗавершение", ЭтотОбъект, ПутьКФайлуМакета); + ПоказатьПредупреждение(ОписаниеОповещения, НСтр("ru = 'Завершите работу с файлом в другом приложении.'"), , НСтр("ru = 'Файл открыт в другом приложении'")); +КонецПроцедуры + +&НаСервере +Процедура УдалитьМакетНаТекущемЯзыке() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.УдалитьМакет(ИдентификаторМакета, ТекущийЯзык); + КонецЕсли; + + МенюЯзык = Элементы.Язык; + ДобавляемыеЯзыки = Элементы.ДобавляемыеЯзыки; + ЯзыкУдаляемойФормы = ТекущийЯзык; + ТекущийЯзык = ОбщегоНазначения.КодОсновногоЯзыка(); + Для Каждого КнопкаЯзыка Из МенюЯзык.ПодчиненныеЭлементы Цикл + Если СтрЗаканчиваетсяНа(КнопкаЯзыка.Имя, ЯзыкУдаляемойФормы) Тогда + КнопкаЯзыка.Пометка = Ложь; + КнопкаЯзыка.Видимость = Ложь; + КонецЕсли; + + Если СтрЗаканчиваетсяНа(КнопкаЯзыка.Имя, ТекущийЯзык) Тогда + КнопкаЯзыка.Пометка = Истина; + КонецЕсли; + КонецЦикла; + + Для Каждого КнопкаДобавляемогоЯзыка Из ДобавляемыеЯзыки.ПодчиненныеЭлементы Цикл + Если СтрЗаканчиваетсяНа(КнопкаДобавляемогоЯзыка.Имя, ЯзыкУдаляемойФормы) Тогда + КнопкаДобавляемогоЯзыка.Видимость = Истина; + КонецЕсли; + КонецЦикла; + + Элементы.Язык.Заголовок = Элементы["Язык_"+ТекущийЯзык].Заголовок; + + ЗагрузитьОфисныйДокументИзМетаданных(ТекущийЯзык); + ПодготовленныйМакет = ПолучитьИзВременногоХранилища(АдресФайлаМакета); + + ПодготовитьМакетКОткрытию(ПодготовленныйМакет); + ПоместитьВоВременноеХранилище(ПодготовленныйМакет, АдресФайлаМакета); + ХешРедактируемогоМакета = ПолучитьХешМакета(АдресФайлаМакета); + ВремяПроверкиМодифицированностиМакета = ТекущаяУниверсальнаяДатаВМиллисекундах(); + + + Модифицированность = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура УдалитьЯзыкМакетаПродолжение(ДополнительныеПараметры) Экспорт + ПутьКФайлуМакета = ""; + УдалитьМакетНаТекущемЯзыке(); + + ЗаписьВыполнена = Истина; + ОповеститьОЗаписиОфисногоДокумента(); + + Элементы.УдалитьЯзыкМакета.Видимость = ТекущийЯзык <> ОбщегоНазначенияКлиент.КодОсновногоЯзыка(); + Элементы.КнопкаПоказатьОригинал.Доступность = Ложь; + УстановитьЗаголовок(); +КонецПроцедуры + +&НаКлиенте +Процедура ПриОтветеНаВопросОПереводеМакета(Ответ, ДополнительныеПараметры) Экспорт + + ПараметрыОткрытияМакета = ПолучитьПараметрыОткрытияМакета(АдресФайлаМакета); + ПараметрыОткрытияМакета.СчитыватьХеш = Истина; + ПараметрыОткрытияМакета.ИмяФайлаДляОткрытия = ИмяФайлаМакета; + + Если Ответ <> КодВозвратаДиалога.Да Тогда + ОткрытьМакет(ПараметрыОткрытияМакета); + Возврат; + КонецЕсли; + + ПеревестиТекстыМакета(); + ОткрытьМакет(ПараметрыОткрытияМакета); +КонецПроцедуры + +&НаСервере +Процедура ПеревестиТекстыМакета() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда + МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); + МодульУправлениеПечатьюМультиязычность.ПеревестиТекстыОфисногоДокумента(АдресФайлаМакета, ТекущийЯзык, ОбщегоНазначения.КодОсновногоЯзыка()); + + Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры + + +#Область КонструкторПечатныхФорм + +&НаСервере +Процедура ПодобратьОбразец(ОбъектМетаданных) + + ТекстЗапроса = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ПсевдонимЗаданнойТаблицы.Ссылка КАК Ссылка + |ИЗ + | &Таблица КАК ПсевдонимЗаданнойТаблицы + |УПОРЯДОЧИТЬ ПО + | Ссылка УБЫВ"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Таблица", ОбъектМетаданных.ПолноеИмя()); + Запрос = Новый Запрос(ТекстЗапроса);; + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + Образец = Выборка.Ссылка; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура РасширитьСписокПолей() + + ДобавляемыеРеквизиты = Новый Массив; + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Образец", Новый ОписаниеТипов, ИмяСпискаПолей())); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Формат", Новый ОписаниеТипов("Строка"), ИмяСпискаПолей())); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ФорматПоУмолчанию", Новый ОписаниеТипов("Строка"), ИмяСпискаПолей())); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("КнопкаНастройкиФормата", Новый ОписаниеТипов("Число"), ИмяСпискаПолей())); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Значение", Новый ОписаниеТипов, ИмяСпискаПолей())); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Общее", Новый ОписаниеТипов("Булево"), ИмяСпискаПолей())); + + ИзменитьРеквизиты(ДобавляемыеРеквизиты); + + СписокПолей = Элементы[ИмяСпискаПолей()]; + СписокПолей.Шапка = Истина; + СписокПолей.УстановитьДействие("ПриАктивизацииСтроки", "Подключаемый_ДоступныеПоляПриАктивизацииСтроки"); + + ИмяКолонкиПредставление = ИмяСпискаПолей() + "Представление"; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда + МодульКонструкторФормулСлужебный = ОбщегоНазначения.ОбщийМодуль("КонструкторФормулСлужебный"); + ИмяКолонкиПредставление = МодульКонструкторФормулСлужебный.ИмяКолонкиПредставление(ИмяСпискаПолей()); + КонецЕсли; + + КолонкаПредставление = Элементы[ИмяКолонкиПредставление]; + КолонкаПредставление.Заголовок = НСтр("ru = 'Поле'"); + + КолонкаОбразец = Элементы.Добавить(ИмяСпискаПолей() + "Образец", Тип("ПолеФормы"), СписокПолей); + КолонкаОбразец.ПутьКДанным = ИмяСпискаПолей() + "." + "Образец"; + КолонкаОбразец.Вид = ВидПоляФормы.ПолеВвода; + КолонкаОбразец.Заголовок = НСтр("ru = 'Образец'"); + КолонкаОбразец.УстановитьДействие("ПриИзменении", "Подключаемый_ОбразецПриИзменении"); + КолонкаОбразец.ОтображатьВПодвале = Ложь; + + КнопкаНастройкиФормата = Элементы.Добавить(ИмяСпискаПолей() + "КнопкаНастройкиФормата", Тип("ПолеФормы"), СписокПолей); + КнопкаНастройкиФормата.ПутьКДанным = ИмяСпискаПолей() + "." + "КнопкаНастройкиФормата"; + КнопкаНастройкиФормата.Вид = ВидПоляФормы.ПолеКартинки; + КнопкаНастройкиФормата.ОтображатьВШапке = Истина; + КнопкаНастройкиФормата.КартинкаШапки = БиблиотекаКартинок.ПараметрыВыводаКомпоновкиДанных; + КнопкаНастройкиФормата.КартинкаЗначений = БиблиотекаКартинок.ПараметрыВыводаКомпоновкиДанных; + КнопкаНастройкиФормата.Заголовок = НСтр("ru = 'Настройка формата'"); + КнопкаНастройкиФормата.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + КнопкаНастройкиФормата.ГиперссылкаЯчейки = Истина; + КнопкаНастройкиФормата.ОтображатьВПодвале = Ложь; + + УстановитьПримерыЗначений(); + УстановитьФорматЗначенийПоУмолчанию(); + НастроитьПолеОбразец(); + ОтметитьОбщиеПоля(); + + Для Каждого ЭлементОформления Из УсловноеОформление.Элементы Цикл + Для Каждого ОформляемоеПоле Из ЭлементОформления.Поля.Элементы Цикл + Если ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей() + "Представление") Тогда + ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); + ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей() + "Образец"); + ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); + ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей() + "КнопкаНастройкиФормата"); + Прервать; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + // Цвет полей, не являющихся общими для выбранных объектов + + ЭлементОформления = УсловноеОформление.Элементы.Добавить(); + + ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); + ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей()); + + ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей() + ".Общее"); + ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбора.ПравоеЗначение = Ложь; + + ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); + +КонецПроцедуры + +&НаСервере +Функция ЗаполнитьСписокОтображаемыхПолей(КоллекцияПолей, Результат = Неопределено) + + Если Результат = Неопределено Тогда + Результат = Новый Массив; + КонецЕсли; + + Для Каждого Элемент Из КоллекцияПолей.ПолучитьЭлементы() Цикл + Если Не ЗначениеЗаполнено(Элемент.ПутьКДанным) Тогда + Продолжить; + КонецЕсли; + Результат.Добавить(Элемент.ПутьКДанным); + ЗаполнитьСписокОтображаемыхПолей(Элемент, Результат); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +&НаСервере +Процедура УстановитьПримерыЗначений(КоллекцияПолей = Неопределено, ДанныеПечати = Неопределено) + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + Возврат; + КонецЕсли; + + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + + Если КоллекцияПолей = Неопределено Тогда + КоллекцияПолей = ЭтотОбъект[ИмяСпискаПолей()]; + КонецЕсли; + + Если ДанныеПечати = Неопределено Тогда + Если Не ЗначениеЗаполнено(Образец) Тогда + Возврат; + КонецЕсли; + Объекты = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Образец); + ОтображаемыеПоля = ЗаполнитьСписокОтображаемыхПолей(КоллекцияПолей); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + ДанныеПечати = МодульУправлениеПечатью.ДанныеПечати(Объекты, ОтображаемыеПоля, ТекущийЯзык); + ПолучитьСообщенияПользователю(Истина); + Иначе + Возврат; + КонецЕсли; + КонецЕсли; + + МодульУправлениеПечатью.УстановитьПримерыЗначений(КоллекцияПолей, ДанныеПечати, Образец); + +КонецПроцедуры + +&НаСервере +Процедура УстановитьФорматЗначенийПоУмолчанию(КоллекцияПолей = Неопределено) + + Если КоллекцияПолей = Неопределено Тогда + КоллекцияПолей = ЭтотОбъект[ИмяСпискаПолей()]; + КонецЕсли; + + Для Каждого Элемент Из КоллекцияПолей.ПолучитьЭлементы() Цикл + Если Не ЗначениеЗаполнено(Элемент.ПутьКДанным) Тогда + Продолжить; + КонецЕсли; + + Если Не ЗначениеЗаполнено(Элемент.ФорматПоУмолчанию) Тогда + Элемент.ФорматПоУмолчанию = ФорматПоУмолчанию(Элемент.Тип); + КонецЕсли; + + Элемент.Формат = Элемент.ФорматПоУмолчанию; + + Если ЗначениеЗаполнено(Элемент.Формат) Тогда + Элемент.Образец = Формат(Элемент.Образец, Элемент.Формат); + Иначе + Элемент.КнопкаНастройкиФормата = -1; + КонецЕсли; + + УстановитьФорматЗначенийПоУмолчанию(Элемент); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Функция ФорматПоУмолчанию(ОписаниеТипов) + + Формат = ""; + Если ОписаниеТипов.Типы().Количество() <> 1 Тогда + Возврат Формат; + КонецЕсли; + + Тип = ОписаниеТипов.Типы()[0]; + + Если Тип = Тип("Число") Тогда + Формат = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'ЧЦ=%1; ЧДЦ=%2'"), + ОписаниеТипов.КвалификаторыЧисла.Разрядность, + ОписаниеТипов.КвалификаторыЧисла.РазрядностьДробнойЧасти); + ИначеЕсли Тип = Тип("Дата") Тогда + Если ОписаниеТипов.КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Дата Тогда + Формат = НСтр("ru = 'ДЛФ=D'"); + Иначе + Формат = НСтр("ru = 'ДЛФ=DT'"); + КонецЕсли; + ИначеЕсли Тип = Тип("Булево") Тогда + Формат = НСтр("ru = 'БЛ=Нет; БИ=Да'"); + КонецЕсли; + + Возврат Формат; + +КонецФункции + +&НаСервере +Функция ВладелецМакета() + + Если ЗначениеЗаполнено(ВладелецМакета) Тогда + Возврат ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ВладелецМакета); + КонецЕсли; + + ПутьКМакету = ИдентификаторМакета; + + ЧастиПути = СтрРазделить(ПутьКМакету, ".", Истина); + Если ЧастиПути.Количество() <> 2 И ЧастиПути.Количество() <> 3 Тогда + Возврат Неопределено; + КонецЕсли; + + Если ЧастиПути.Количество() <> 3 Тогда + Возврат Неопределено; + КонецЕсли; + + ЧастиПути.Удалить(ЧастиПути.ВГраница()); + ИмяОбъекта = СтрСоединить(ЧастиПути, "."); + + Если ПустаяСтрока(ИмяОбъекта) Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъекта); + +КонецФункции + +&НаСервереБезКонтекста +Функция КоллекцииПолей(ИсточникиДанных) + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + Возврат МодульУправлениеПечатью.КоллекцииПолейИсточниковДанных(ИсточникиДанных); + КонецЕсли; + + Возврат Новый Массив; + +КонецФункции + +&НаКлиенте +Процедура ПриВыбореИмениМакета(НовоеИмяМакета, ДополнительныеПараметры) Экспорт + + Если НовоеИмяМакета = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ИмяДокумента <> НовоеИмяМакета Тогда + Модифицированность = Истина; + ИмяДокумента = НовоеИмяМакета; + УстановитьЗаголовок(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция СписокОператоров() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + + ДополнительныеПоля = Новый Структура; + + ОписаниеДополнительногоПоля = Новый Структура("Представление, Тип"); + ОписаниеДополнительногоПоля.Представление = НСтр("ru = 'Начало условия'"); + ОписаниеДополнительногоПоля.Тип = Новый ОписаниеТипов("Булево"); + ДополнительныеПоля.Вставить("НачалоОбласти", ОписаниеДополнительногоПоля); + + ОписаниеДополнительногоПоля = Новый Структура("Представление, Тип"); + ОписаниеДополнительногоПоля.Представление = НСтр("ru = 'Окончание условия'"); + ОписаниеДополнительногоПоля.Тип = Новый ОписаниеТипов("Булево"); + ДополнительныеПоля.Вставить("ОкончаниеОбласти", ОписаниеДополнительногоПоля); + + + ОписаниеГруппыДополнительныхПолей = Новый Структура("Представление, Порядок, Картинка"); + ОписаниеГруппыДополнительныхПолей.Вставить("Элементы", ДополнительныеПоля); + ОписаниеГруппыДополнительныхПолей.Представление = НСтр("ru = 'Условный вывод'"); + ОписаниеГруппыДополнительныхПолей.Порядок = 7; + + ГруппыДополнительныхПолей = Новый Структура; + ГруппыДополнительныхПолей.Вставить("УсловныйВывод", ОписаниеГруппыДополнительныхПолей); + + Возврат МодульУправлениеПечатью.СписокОператоров(ГруппыДополнительныхПолей); + КонецЕсли; + +КонецФункции + +&НаКлиенте +Функция ИмяТегаУсловие() + Возврат УправлениеПечатьюКлиентСервер.ИмяТегаУсловие(); +КонецФункции + +#Область ПодключаемыйСписокПолей + +&НаКлиенте +Процедура Подключаемый_СписокПолейПередРазворачиванием(Элемент, Строка, Отказ) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда + МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент"); + МодульКонструкторФормулКлиент.СписокПолейПередРазворачиванием(ЭтотОбъект, Элемент, Строка, Отказ); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_РазвернутьТекущийЭлементСпискаПолей() + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда + МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент"); + МодульКонструкторФормулКлиент.РазвернутьТекущийЭлементСпискаПолей(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ЗаполнитьСписокДоступныхПолей(ПараметрыЗаполнения) Экспорт // АПК:78 - вызывается из КонструкторФормулКлиент + + ЗаполнитьСписокДоступныхПолей(ПараметрыЗаполнения); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСписокДоступныхПолей(ПараметрыЗаполнения) + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда + МодульКонструкторФормул = ОбщегоНазначения.ОбщийМодуль("КонструкторФормул"); + МодульКонструкторФормул.ЗаполнитьСписокДоступныхПолей(ЭтотОбъект, ПараметрыЗаполнения); + + ТекущиеДанные = ЭтотОбъект[ИмяСпискаПолей()].НайтиПоИдентификатору(ПараметрыЗаполнения.ИдентификаторСтроки); + УстановитьПримерыЗначений(ТекущиеДанные); + УстановитьФорматЗначенийПоУмолчанию(ТекущиеДанные); + Если ТекущиеДанные.Папка Или ТекущиеДанные.Таблица И ТекущиеДанные.ПолучитьРодителя() = Неопределено Тогда + ОтметитьОбщиеПоля(ТекущиеДанные); + Иначе + УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(ТекущиеДанные); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_СписокПолейНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение) + + Реквизит = ЭтотОбъект[ИмяСпискаПолей()].НайтиПоИдентификатору(ПараметрыПеретаскивания.Значение); + + Если Реквизит.Папка Или Реквизит.Таблица + И Не СтрНачинаетсяС(Реквизит.ПутьКДанным, "ОбщиеРеквизиты.") Тогда + Выполнение = Ложь; + Возврат; + КонецЕсли; + + ПараметрыПеретаскивания.Значение = "[" + Реквизит.ПредставлениеПутиКДанным + "]"; + + Если Элемент = Элементы[ИмяСпискаПолей()] + И ЗначениеЗаполнено(Реквизит.Формат) И Реквизит.Формат <> Реквизит.ФорматПоУмолчанию Тогда + + ПараметрыПеретаскивания.Значение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + "[Формат(%1, %2)]", ПараметрыПеретаскивания.Значение, """" + Реквизит.Формат + """"); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_СтрокаПоискаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда + МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент"); + МодульКонструкторФормулКлиент.СтрокаПоискаИзменениеТекстаРедактирования(ЭтотОбъект, Элемент, Текст, СтандартнаяОбработка); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ВыполнитьПоискВСпискеПолей() + + ВыполнитьПоискВСпискеПолей(); + +КонецПроцедуры + +&НаСервере +Процедура ВыполнитьПоискВСпискеПолей() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда + МодульКонструкторФормул = ОбщегоНазначения.ОбщийМодуль("КонструкторФормул"); + МодульКонструкторФормул.ВыполнитьПоискВСпискеПолей(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_СтрокаПоискаОчистка(Элемент, СтандартнаяОбработка) + + КонструкторФормулКлиент.СтрокаПоискаОчистка(ЭтотОбъект, Элемент, СтандартнаяОбработка); + +КонецПроцедуры + +&НаСервере +Процедура Подключаемый_ОбработчикКонструктораФормулСервер(Параметр, ДополнительныеПараметры) + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда + МодульКонструкторФормул = ОбщегоНазначения.ОбщийМодуль("КонструкторФормул"); + МодульКонструкторФормул.ОбработчикКонструктораФормул(ЭтотОбъект, Параметр, ДополнительныеПараметры); + КонецЕсли; + + Если ДополнительныеПараметры.КлючОперации = "ОбработатьСообщениеПоиска" Тогда + ОтметитьОбщиеПоля(); + УстановитьФорматЗначенийПоУмолчанию(); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ОбработчикКонструктораФормулКлиент(Параметр, ДополнительныеПараметры = Неопределено) Экспорт // АПК:78 Процедура вызывается из КонструкторФормулКлиент.НачатьПоискВСпискеПолей + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда + МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент"); + МодульКонструкторФормулКлиент.ОбработчикКонструктораФормул(ЭтотОбъект, Параметр, ДополнительныеПараметры); + Если ДополнительныеПараметры <> Неопределено И ДополнительныеПараметры.ВыполнитьНаСервере Тогда + Подключаемый_ОбработчикКонструктораФормулСервер(Параметр, ДополнительныеПараметры); + КонецЕсли; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_НачатьПоискВСпискеПолей() + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда + МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент"); + МодульКонструкторФормулКлиент.НачатьПоискВСпискеПолей(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Функция ИмяСпискаПолей() + + Возврат "ДоступныеПоля"; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ИмяСпискаОператоров() + + Возврат "СписокОператоров"; + +КонецФункции + +#КонецОбласти + + +#Область ДополнительныеОбработчикиПодключаемыхСписков + +&НаКлиенте +Процедура Подключаемый_ДоступныеПоляПриАктивизацииСтроки(Элемент) + + ТекущиеДанные = Элементы[ИмяСпискаПолей()].ТекущиеДанные; + + Если ТекущиеДанные.ПолучитьРодителя() = Неопределено Тогда + Элементы["СтрокаПоиска" + ИмяСпискаПолей()].ПодсказкаВвода = ПодсказкаВводаСтрокиПоискаСпискаПолей(); + Иначе + Элементы["СтрокаПоиска" + ИмяСпискаПолей()].ПодсказкаВвода = ТекущиеДанные.ПредставлениеПутиКДанным; + КонецЕсли; + + ЗаполнитьПолеHTMLПоТекущемуПолю(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьПолеHTMLПоТекущемуПолю() + + ТекущаяСтрока = Элементы[ИмяСпискаПолей()].ТекущаяСтрока; + Реквизит = ЭтотОбъект[ИмяСпискаПолей()].НайтиПоИдентификатору(ТекущаяСтрока); + + Если Реквизит.Папка Или Реквизит.Таблица + И Не СтрНачинаетсяС(Реквизит.ПутьКДанным, "ОбщиеРеквизиты.") Тогда + Возврат; + КонецЕсли; + + Значение = "[" + Реквизит.ПредставлениеПутиКДанным + "]"; + + Если ТекущийЭлемент = Элементы[ИмяСпискаПолей()] + И ЗначениеЗаполнено(Реквизит.Формат) И Реквизит.Формат <> Реквизит.ФорматПоУмолчанию Тогда + + Значение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + "[Формат(%1, %2)]", Значение, """" + Реквизит.Формат + """"); + КонецЕсли; + + УстановитьВHTMLПоле(Значение); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ДоступныеПоляПередНачаломИзменения(Элемент, Отказ) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда + МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент"); + + ТекущиеДанные = Элементы[ИмяСпискаПолей()].ТекущиеДанные; + ТекущиеДанные.Образец = ТекущиеДанные.Значение; + ПолеВвода = Элементы[ИмяСпискаПолей() + "Образец"]; + ВыбранноеПоле = МодульКонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект, ИмяСпискаПолей()); + ПолеВвода.ОграничениеТипа = ВыбранноеПоле.Тип; + + КонецЕсли; + +КонецПроцедуры + +// Параметры: +// Элемент - ТаблицаФормы +// ВыбраннаяСтрока - Число +// Поле - ПолеФормы +// СтандартнаяОбработка - Булево +// +&НаКлиенте +Процедура Подключаемый_СписокПолейВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + МодульКонструкторФормулКлиент = Неопределено; + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда + МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент"); + Иначе + Возврат; + КонецЕсли; + + Если Поле.Имя = Элемент.Имя + "Представление" Тогда + СтандартнаяОбработка = Ложь; + ВыбранноеПоле = МодульКонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект); + Если ЗначениеЗаполнено(ТекущееЗначение) Тогда + ТекущееЗначение = СокрП(ТекущееЗначение) + " "; + Иначе + ТекущееЗначение = ""; + КонецЕсли; + Если Элемент.Имя = ИмяСпискаПолей() Тогда + ТекущееЗначение = ТекущееЗначение + "[" + ВыбранноеПоле.ПредставлениеПутиКДанным + "]"; + Иначе + ТекущееЗначение = ТекущееЗначение + МодульКонструкторФормулКлиент.ВыражениеДляВставки(ВыбранноеПоле); + КонецЕсли; + КонецЕсли; + + Если Поле = Элементы[ИмяСпискаПолей() + "КнопкаНастройкиФормата"] Тогда + СтандартнаяОбработка = Ложь; + Конструктор = Новый КонструкторФорматнойСтроки(Элементы[ИмяСпискаПолей()].ТекущиеДанные.Формат); + Конструктор.ДоступныеТипы = Элементы[ИмяСпискаПолей()].ТекущиеДанные.Тип; + ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореФорматаПоля", ЭтотОбъект); + Конструктор.Показать(ОписаниеОповещения); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_СписокПолейАктивизацияСтроки(Элемент) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда + МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент"); + + Оператор = МодульКонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект, ИмяСпискаОператоров()); + + Если ЗначениеЗаполнено(Оператор.Родитель) Тогда + ГруппаОператоров = Оператор.Родитель; // см. КонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей + ИмяГруппыОператоров = ГруппаОператоров.Имя; + + Если ИмяГруппыОператоров = "УсловныйВывод" Тогда + Если Оператор.Имя = "НачалоОбласти" Тогда + УстановитьВHTMLПоле(СтрШаблон("{%1 *текст условия*}", ИмяТегаУсловие())); + ИначеЕсли Оператор.Имя = "ОкончаниеОбласти" Тогда + УстановитьВHTMLПоле(СтрШаблон("{/%1}", ИмяТегаУсловие())); + КонецЕсли; + Возврат; + КонецЕсли; + КонецЕсли; + + УстановитьВHTMLПоле(МодульКонструкторФормулКлиент.ВыражениеДляВставки(Оператор)); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ОператорыНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда + МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент"); + + Оператор = МодульКонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект, ИмяСпискаОператоров()); + + Если ЗначениеЗаполнено(Оператор.Родитель) Тогда + ГруппаОператоров = Оператор.Родитель; // см. КонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей + ИмяГруппыОператоров = ГруппаОператоров.Имя; + + Если ИмяГруппыОператоров = "УсловныйВывод" Тогда + Если Оператор.Имя = "НачалоОбласти" Тогда + ПараметрыПеретаскивания.Значение = "{v8 Условие *текст условия*}"; + ИначеЕсли Оператор.Имя = "ОкончаниеОбласти" Тогда + ПараметрыПеретаскивания.Значение = "{/v8 Условие}"; + КонецЕсли; + Возврат; + КонецЕсли; + КонецЕсли; + + ПараметрыПеретаскивания.Значение = МодульКонструкторФормулКлиент.ВыражениеДляВставки(Оператор); + + Если Оператор.ПутьКДанным = "УправлениеПечатью_КоличествоСтрок" Тогда + ИмяТекущейТаблицы = ПолучитьИмяТекущейТаблицы(); + Выполнение = ИмяТекущейТаблицы <> Неопределено; + ПараметрыПеретаскивания.Значение = СтрЗаменить(ПараметрыПеретаскивания.Значение, "()", "(["+ИмяТекущейТаблицы+"])"); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ДоступныеПоляПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) + + ТекущиеДанные = Элементы[ИмяСпискаПолей()].ТекущиеДанные; + Если ЗначениеЗаполнено(ТекущиеДанные.Формат) Тогда + ТекущиеДанные.Образец = Формат(ТекущиеДанные.Значение, ТекущиеДанные.Формат); + КонецЕсли; + + Если ТекущиеДанные.ПутьКДанным = "Ссылка" Тогда + Образец = ТекущиеДанные.Образец; + КонецЕсли; + ПодключитьОбработчикОжидания("ПриИзмененииОбразца", 0.1, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ОбразецПриИзменении(Элемент) + + ТекущиеДанные = Элементы[ИмяСпискаПолей()].ТекущиеДанные; + ТекущиеДанные.Значение = ТекущиеДанные.Образец; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриИзмененииОбразца() + + ПриИзмененииОбразцаНаСервере(); + +КонецПроцедуры + +&НаСервере +Процедура ПриИзмененииОбразцаНаСервере() + + УстановитьПримерыЗначений(); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + + +&НаКлиентеНаСервереБезКонтекста +Функция ПодсказкаВводаСтрокиПоискаСпискаПолей() + + Возврат НСтр("ru = 'Найти поле...'"); + +КонецФункции + +&НаСервере +Функция ПолучитьПечатнуюФорму() + + Ссылки = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Образец); + ОбъектыПечати = Новый СписокЗначений; + Макет = ПолучитьИзВременногоХранилища(АдресФайлаМакета); + ПодготовитьМакетКСохранению(Макет); + ПараметрыПечати = Новый Структура; + + ОфисныеДокументы = УправлениеПечатью.СформироватьОфисныйДокумент(Макет, Ссылки, ОбъектыПечати, КодЯзыка, ПараметрыПечати); + Если ОфисныеДокументы.Количество() > 0 Тогда + Для Каждого ОфисныйДокумент Из ОфисныеДокументы Цикл + Возврат ОфисныйДокумент; + КонецЦикла; + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции + +&НаКлиенте +Функция ПолучитьИмяТекущейТаблицы() + Для Каждого ПодключенныйСписокПолей Из ЭтотОбъект.ПодключенныеСпискиПолей Цикл + Если ПодключенныйСписокПолей.ИмяСпискаПолей <> ИмяСпискаОператоров() Тогда + Если Элементы[ПодключенныйСписокПолей.ИмяСпискаПолей].ТекущиеДанные <> Неопределено + И Элементы[ПодключенныйСписокПолей.ИмяСпискаПолей].ТекущиеДанные.Таблица Тогда + Возврат Элементы[ПодключенныйСписокПолей.ИмяСпискаПолей].ТекущиеДанные.ПутьКДанным; + КонецЕсли; + КонецЕсли; + КонецЦикла; + Возврат Неопределено; +КонецФункции + +&НаКлиенте +Процедура НазначениеМакетаНажатие(Элемент) + + ПараметрыПодбора = Новый Структура; + ПараметрыПодбора.Вставить("ВыбранныеОбъектыМетаданных", ОбщегоНазначенияКлиент.СкопироватьРекурсивно(ИсточникиДанных)); + ПараметрыПодбора.Вставить("ВыбиратьСсылки", Истина); + ПараметрыПодбора.Вставить("Заголовок", НСтр("ru = 'Назначение макета'")); + ПараметрыПодбора.Вставить("ФильтрПоОбъектамМетаданных", ОбъектыСКомандамиПечати()); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореВладельцевМакета", ЭтотОбъект); + ОткрытьФорму("ОбщаяФорма.ВыборОбъектовМетаданных", ПараметрыПодбора, , , , , ОписаниеОповещения); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриВыбореВладельцевМакета(Результат, ДополнительныеПараметры) Экспорт + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + ИсточникиДанных.ЗагрузитьЗначения(Результат.ВыгрузитьЗначения()); + Элементы.ТекстНазначение.Заголовок = ПредставлениеИсточниковДанных(ИсточникиДанных); + ОбновитьСписокДоступныхПолей(); + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Функция ПредставлениеИсточниковДанных(ИсточникиДанных) + + Значения = Новый Массив; + Для Каждого Элемент Из ИсточникиДанных Цикл + Значения.Добавить(Элемент.Значение); + КонецЦикла; + + Результат = СтрСоединить(Значения, ", "); + Если Не ЗначениеЗаполнено(Результат) Тогда + Результат = "<" + НСтр("ru = 'не выбрано'") + ">"; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Функция ОбъектыСКомандамиПечати() + + ОбъектыСКомандамиПечати = Новый СписокЗначений; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + Для Каждого ОбъектМетаданных Из МодульУправлениеПечатью.ИсточникиКомандПечати() Цикл + ОбъектыСКомандамиПечати.Добавить(ОбъектМетаданных.ПолноеИмя()); + КонецЦикла; + КонецЕсли; + + Возврат ОбъектыСКомандамиПечати; + +КонецФункции + +&НаСервере +Процедура ОбновитьСписокДоступныхПолей() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ОбновитьСписокДоступныхПолей(ЭтотОбъект, + КоллекцииПолей(ИсточникиДанных.ВыгрузитьЗначения()), ИмяСпискаПолей()); + + НастроитьПолеОбразец(); + ОтметитьОбщиеПоля(); + УстановитьФорматЗначенийПоУмолчанию(); + + Если ИсточникиДанных.Количество() > 0 Тогда + ИсточникДанных = ИсточникиДанных[0].Значение; + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ИсточникДанных); + ПодобратьОбразец(ОбъектМетаданных); + УстановитьПримерыЗначений(); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура НастроитьПолеОбразец() + + КоллекцияПолей = ЭтотОбъект[ИмяСпискаПолей()].ПолучитьЭлементы(); // ДанныеФормыКоллекцияЭлементовДерева + Смещение = 0; + Для Каждого ОписаниеПоля Из КоллекцияПолей Цикл + Если ОписаниеПоля.ПутьКДанным = "Ссылка" Тогда + ОписаниеПоля.Заголовок = НСтр("ru = 'Образец'"); + Если Смещение <> 0 Тогда + Индекс = КоллекцияПолей.Индекс(ОписаниеПоля); + КоллекцияПолей.Сдвинуть(Индекс, Смещение); + КонецЕсли; + Прервать; + КонецЕсли; + Смещение = Смещение - 1; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Функция ОбщиеПоляИсточниковДанных() + + ОбщиеПоляИсточниковДанных = Новый Массив; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + ОбщиеПоляИсточниковДанных = МодульУправлениеПечатью.ОбщиеПоляИсточниковДанных(ИсточникиДанных.ВыгрузитьЗначения()); + КонецЕсли; + + Возврат ОбщиеПоляИсточниковДанных; + +КонецФункции + +&НаСервере +Процедура ОтметитьОбщиеПоля(Знач КоллекцияПолей = Неопределено, Знач ОбщиеПоля = Неопределено) + + Если КоллекцияПолей = Неопределено Тогда + КоллекцияПолей = ЭтотОбъект[ИмяСпискаПолей()]; + КонецЕсли; + + Если ОбщиеПоля = Неопределено Тогда + ОбщиеПоля = ОбщиеПоляИсточниковДанных(); + КонецЕсли; + + Для Каждого ОписаниеПоля Из КоллекцияПолей.ПолучитьЭлементы() Цикл + Если ОписаниеПоля.Папка И ОписаниеПоля.Поле = Новый ПолеКомпоновкиДанных("ОбщиеРеквизиты") + Или ОписаниеПоля.ПолучитьРодителя() <> Неопределено И ОписаниеПоля.ПолучитьРодителя().Поле = Новый ПолеКомпоновкиДанных("ОбщиеРеквизиты") Тогда + ОписаниеПоля.Общее = Истина; + УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(ОписаниеПоля); + Продолжить; + КонецЕсли; + + Если ОбщиеПоля.Найти(ОписаниеПоля.Поле) <> Неопределено Тогда + ОписаниеПоля.Общее = Истина; + Если Не ОписаниеПоля.Папка И Не ОписаниеПоля.Таблица Тогда + УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(ОписаниеПоля); + КонецЕсли; + КонецЕсли; + Если ОписаниеПоля.Общее И (ОписаниеПоля.Папка Или ОписаниеПоля.Таблица) Тогда + ОтметитьОбщиеПоля(ОписаниеПоля, ОбщиеПоля); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(КоллекцияПолей) + + Для Каждого ОписаниеПоля Из КоллекцияПолей.ПолучитьЭлементы() Цикл + ОписаниеПоля.Общее = КоллекцияПолей.Общее; + УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(ОписаниеПоля); + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура НастроитьПредставлениеКоманд() + + Элементы.ЗаписатьИЗакрыть.Видимость = Не РедактированиеЗапрещено; + Элементы.Закрыть.Видимость = РедактированиеЗапрещено; + Элементы.Записать.Доступность = Не РедактированиеЗапрещено; + Элементы.Перевести.Доступность = Не РедактированиеЗапрещено; + Элементы.Переименовать.Доступность = Не РедактированиеЗапрещено; + Элементы.УдалитьЯзыкМакета.Доступность = Не РедактированиеЗапрещено; + Элементы.ЗагрузитьИзФайла.Доступность = Не РедактированиеЗапрещено; + УстановитьДоступностьРекурсивно(Элементы.ДобавляемыеЯзыки, Не РедактированиеЗапрещено); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьДоступностьРекурсивно(Элемент, Доступность = Неопределено) + Если Доступность = Неопределено Тогда + Доступность = Элемент.Доступность; + КонецЕсли; + + Для Каждого ПодчиненныйЭлемент Из Элемент.ПодчиненныеЭлементы Цикл + Если ТипЗнч(ПодчиненныйЭлемент) = Тип("КнопкаФормы") И ПодчиненныйЭлемент.ИмяКоманды <> "" Тогда + ПодчиненныйЭлемент.Доступность = Доступность; + КонецЕсли; + + Если ТипЗнч(ПодчиненныйЭлемент) = Тип("ГруппаФормы") Тогда + УстановитьДоступностьРекурсивно(ПодчиненныйЭлемент, Доступность); + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +#КонецОбласти + + + diff --git a/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/ПоискИсполняемогоФайлаОнлайнПоддержки.mdo b/SSL/src/CommonForms/РедактированиеДокументаOfficeOpen/РедактированиеДокументаOfficeOpen.mdo similarity index 55% rename from SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/ПоискИсполняемогоФайлаОнлайнПоддержки.mdo rename to SSL/src/CommonForms/РедактированиеДокументаOfficeOpen/РедактированиеДокументаOfficeOpen.mdo index ec1082f33..eead60d83 100644 --- a/SSL/src/CommonForms/ПоискИсполняемогоФайлаОнлайнПоддержки/ПоискИсполняемогоФайлаОнлайнПоддержки.mdo +++ b/SSL/src/CommonForms/РедактированиеДокументаOfficeOpen/РедактированиеДокументаOfficeOpen.mdo @@ -1,10 +1,11 @@ - - ПоискИсполняемогоФайлаОнлайнПоддержки + + РедактированиеДокументаOfficeOpen ru - Поиск исполняемого файла онлайн-поддержки + Редактирование документа office open + true ru diff --git a/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Module.bsl b/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Module.bsl index 14d9a0a2a..c2cf3785b 100644 --- a/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Module.bsl +++ b/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Module.bsl @@ -273,7 +273,7 @@ ОтменитьТранзакцию(); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); ОтменитьТранзакцию(); КонецПопытки; КонецЕсли; diff --git a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Attributes/ПоставляемыйМакет/ExtInfo/SpreadsheetData.mxlx b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Attributes/ПоставляемыйМакет/ExtInfo/SpreadsheetData.mxlx new file mode 100644 index 000000000..673527882 --- /dev/null +++ b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Attributes/ПоставляемыйМакет/ExtInfo/SpreadsheetData.mxlx @@ -0,0 +1,23 @@ + + + + ru + ru + + ru + Русский + Русский + + + + 0 + + + 0 + + true + + + true + 0 + \ No newline at end of file diff --git a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Attributes/ТабличныйДокумент/ExtInfo/SpreadsheetData.mxlx b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Attributes/ТабличныйДокумент/ExtInfo/SpreadsheetData.mxlx new file mode 100644 index 000000000..673527882 --- /dev/null +++ b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Attributes/ТабличныйДокумент/ExtInfo/SpreadsheetData.mxlx @@ -0,0 +1,23 @@ + + + + ru + ru + + ru + Русский + Русский + + + + 0 + + + 0 + + true + + + true + 0 + \ No newline at end of file diff --git a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Form.form b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Form.form index c3783721f..0b636ab2c 100644 --- a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Form.form +++ b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Form.form @@ -5,7 +5,7 @@ Табличный документ (Создание) - Группа3 + ГруппаКоманднаяПанель 487 КоманднаяПанель @@ -116,7 +116,7 @@ - Группа5 + ГруппаОтменитьВернуть 470 Отменить @@ -177,8 +177,12 @@ true + + <key>ru</key> + <value>Группа отменить вернуть</value> + - Группа5РасширеннаяПодсказка + ГруппаОтменитьВернутьРасширеннаяПодсказка 471 Label true @@ -359,6 +363,30 @@ Язык 265 + + ДобавляемыеЯзыки + 687 + true + true + + true + + + <key>ru</key> + <value>Группа8</value> + + + ДобавляемыеЯзыкиРасширеннаяПодсказка + 688 + Label + true + true + + Left + + + + true true @@ -488,17 +516,52 @@ Left
        - - КнопкаДоступныеПоля - 480 + + ГруппаКоманднаяПанельКнопкиСправа + 685 + + КнопкаДоступныеПоля + 480 + true + true + + true + + + КнопкаДоступныеПоляРасширеннаяПодсказка + 481 + Label + true + true + + Left + + + Form.Command.ДоступныеПоля + Normal + Auto + true + true + Right + UserCmds + true + Auto + InCommandBarAndInAdditionalSubmenu + true true true + + <key>ru</key> + <value>Командная панель кнопки справа</value> + + false + Right - КнопкаДоступныеПоляРасширеннаяПодсказка - 481 + ГруппаКоманднаяПанельКнопкиСправаРасширеннаяПодсказка + 686 Label true true @@ -506,26 +569,23 @@ Left
        - UsualButton - Form.Command.ДоступныеПоля - Normal - Auto - true - true - Right - UserCmds - true - Auto - InCommandBarAndInAdditionalSubmenu + CommandBar + + Right + true true true + + <key>ru</key> + <value>Командная панель</value> + true - Группа3РасширеннаяПодсказка + ГруппаКоманднаяПанельРасширеннаяПодсказка 488 Label true @@ -537,7 +597,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -763,14 +822,14 @@ Left - Form.Item.ТабличныйДокумент.StandardCommand.Font + Form.Command.ИзменитьШрифт Normal Auto true true UserCmds Auto - InCommandBarAndInAdditionalSubmenu + InCommandBar УменьшитьРазмерШрифта @@ -797,7 +856,7 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu + InCommandBar УвеличитьРазмерШрифта @@ -824,7 +883,7 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu + InCommandBar true true @@ -877,7 +936,7 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu + InCommandBar ТабличныйДокументНаклонный @@ -904,7 +963,7 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu + InCommandBar ТабличныйДокументПодчеркивание @@ -931,34 +990,7 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu - - - Зачеркивание - 86 - true - true - - true - - - ЗачеркиваниеExtendedTooltip - 109 - Label - true - true - - Left - - - Form.Command.Зачеркивание - Normal - Picture - true - true - UserCmds - Auto - InAdditionalSubmenu + InCommandBar true true @@ -1011,7 +1043,7 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu + InCommandBar ТабличныйДокументВыровнятьПоЦентру @@ -1038,7 +1070,7 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu + InCommandBar ТабличныйДокументВыровнятьВправо @@ -1065,7 +1097,7 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu + InCommandBar ТабличныйДокументВыровнятьПоШирине @@ -1092,7 +1124,7 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu + InCommandBar true true @@ -1145,6 +1177,7 @@ true UserCmds Auto + InCommandBar ВыровнятьПоСередине @@ -1171,6 +1204,7 @@ true UserCmds Auto + InCommandBar ВыровнятьПоНижнемуКраю @@ -1197,6 +1231,7 @@ true UserCmds Auto + InCommandBar true true @@ -1242,14 +1277,14 @@ Left
        - Form.Item.ТабличныйДокумент.StandardCommand.BackColor + Form.Command.ИзменитьЦветФона Normal Auto true true UserCmds Auto - InCommandBarAndInAdditionalSubmenu + InCommandBar ТабличныйДокументЦветТекста @@ -1269,14 +1304,14 @@ Left - Form.Item.ТабличныйДокумент.StandardCommand.TextColor + Form.Command.ИзменитьЦветТекста Normal Auto true true UserCmds Auto - InCommandBarAndInAdditionalSubmenu + InCommandBar ТабличныйДокументЦветГраницы @@ -1296,14 +1331,14 @@ Left - Form.Item.ТабличныйДокумент.StandardCommand.BorderColor + Form.Command.ИзменитьЦветГраницы Normal Auto true true UserCmds Auto - InCommandBarAndInAdditionalSubmenu + InCommandBar ТабличныйДокументОчиститьФормат @@ -1333,7 +1368,7 @@ StdPicture.QueryWizardCreateTempTableDropQuery Auto - InCommandBarAndInAdditionalSubmenu + InCommandBar true true @@ -1381,6 +1416,656 @@ Compact + + ФорматированиеТекстаВсеДействия + 635 + + ШрифтВсеДействия + 637 + + ТабличныйДокументШрифтВсеДействия + 639 + true + true + + true + + + ТабличныйДокументШрифтВсеДействияРасширеннаяПодсказка + 640 + Label + true + true + + Left + + + Form.Command.ИзменитьШрифт + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + УменьшитьРазмерШрифтаВсеДействия + 641 + true + true + + true + + + УменьшитьРазмерШрифтаВсеДействияРасширеннаяПодсказка + 642 + Label + true + true + + Left + + + Form.Command.УменьшитьРазмерШрифта + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + УвеличитьРазмерШрифтаВсеДействия + 643 + true + true + + true + + + УвеличитьРазмерШрифтаВсеДействияРасширеннаяПодсказка + 644 + Label + true + true + + Left + + + Form.Command.УвеличитьРазмерШрифта + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Шрифт</value> + + + ШрифтВсеДействияРасширеннаяПодсказка + 638 + Label + true + true + + Left + + + + Compact + + + + НачертаниеВсеДействия + 645 + + ТабличныйДокументЖирныйВсеДействия + 647 + true + true + + true + + + ТабличныйДокументЖирныйВсеДействияРасширеннаяПодсказка + 648 + Label + true + true + + Left + + + Form.Item.ТабличныйДокумент.StandardCommand.Bold + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ТабличныйДокументНаклонныйВсеДействия + 649 + true + true + + true + + + ТабличныйДокументНаклонныйВсеДействияРасширеннаяПодсказка + 650 + Label + true + true + + Left + + + Form.Item.ТабличныйДокумент.StandardCommand.Italic + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ТабличныйДокументПодчеркиваниеВсеДействия + 651 + true + true + + true + + + ТабличныйДокументПодчеркиваниеВсеДействияРасширеннаяПодсказка + 652 + Label + true + true + + Left + + + Form.Item.ТабличныйДокумент.StandardCommand.Underline + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ЗачеркиваниеВсеДействия + 653 + true + true + + true + + + ЗачеркиваниеВсеДействияРасширеннаяПодсказка + 654 + Label + true + true + + Left + + + Form.Command.Зачеркивание + Normal + Picture + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Начертание</value> + + + НачертаниеВсеДействияРасширеннаяПодсказка + 646 + Label + true + true + + Left + + + + Compact + + + + ВыравниваниеВсеДействия + 655 + + ТабличныйДокументВыровнятьВлевоВсеДействия + 657 + true + true + + true + + + ТабличныйДокументВыровнятьВлевоВсеДействияРасширеннаяПодсказка + 658 + Label + true + true + + Left + + + Form.Item.ТабличныйДокумент.StandardCommand.AlignLeft + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ТабличныйДокументВыровнятьПоЦентруВсеДействия + 659 + true + true + + true + + + ТабличныйДокументВыровнятьПоЦентруВсеДействияРасширеннаяПодсказка + 660 + Label + true + true + + Left + + + Form.Item.ТабличныйДокумент.StandardCommand.AlignCenter + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ТабличныйДокументВыровнятьВправоВсеДействия + 661 + true + true + + true + + + ТабличныйДокументВыровнятьВправоВсеДействияРасширеннаяПодсказка + 662 + Label + true + true + + Left + + + Form.Item.ТабличныйДокумент.StandardCommand.AlignRight + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ТабличныйДокументВыровнятьПоШиринеВсеДействия + 663 + true + true + + true + + + ТабличныйДокументВыровнятьПоШиринеВсеДействияРасширеннаяПодсказка + 664 + Label + true + true + + Left + + + Form.Item.ТабличныйДокумент.StandardCommand.AlignJustify + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Выравнивание</value> + + + ВыравниваниеВсеДействияРасширеннаяПодсказка + 656 + Label + true + true + + Left + + + + Compact + + + + ВертикальноеВыравниваниеВсеДействия + 665 + + ВыровнятьПоВерхнемуКраюВсеДействия + 667 + true + true + + true + + + ВыровнятьПоВерхнемуКраюВсеДействияРасширеннаяПодсказка + 668 + Label + true + true + + Left + + + Form.Command.ВыровнятьПоВерхнемуКраю + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ВыровнятьПоСерединеВсеДействия + 669 + true + true + + true + + + ВыровнятьПоСерединеВсеДействияРасширеннаяПодсказка + 670 + Label + true + true + + Left + + + Form.Command.ВыровнятьПоСередине + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ВыровнятьПоНижнемуКраюВсеДействия + 671 + true + true + + true + + + ВыровнятьПоНижнемуКраюВсеДействияРасширеннаяПодсказка + 672 + Label + true + true + + Left + + + Form.Command.ВыровнятьПоНижнемуКраю + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Группа7</value> + + + ВертикальноеВыравниваниеВсеДействияРасширеннаяПодсказка + 666 + Label + true + true + + Left + + + + Compact + + + + ЦветВсеДействия + 673 + + ТабличныйДокументЦветФонаВсеДействия + 675 + true + true + + true + + + ТабличныйДокументЦветФонаВсеДействияРасширеннаяПодсказка + 676 + Label + true + true + + Left + + + Form.Command.ИзменитьЦветФона + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ТабличныйДокументЦветТекстаВсеДействия + 677 + true + true + + true + + + ТабличныйДокументЦветТекстаВсеДействияРасширеннаяПодсказка + 678 + Label + true + true + + Left + + + Form.Command.ИзменитьЦветТекста + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ТабличныйДокументЦветГраницыВсеДействия + 679 + true + true + + true + + + ТабличныйДокументЦветГраницыВсеДействияРасширеннаяПодсказка + 680 + Label + true + true + + Left + + + Form.Command.ИзменитьЦветГраницы + Normal + Auto + true + true + UserCmds + + CommonPicture.ЦветГраницы + + Auto + InAdditionalSubmenu + + + ТабличныйДокументОчиститьФорматВсеДействия + 681 + true + true + + true + + + ТабличныйДокументОчиститьФорматВсеДействияРасширеннаяПодсказка + 682 + Label + true + true + + Left + + + Form.Command.ОчиститьФормат + Normal + Auto + true + true + UserCmds + + StdPicture.QueryWizardCreateTempTableDropQuery + + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Цвет</value> + + + ЦветВсеДействияРасширеннаяПодсказка + 674 + Label + true + true + + Left + + + + Compact + + + true + true + + true + + + <key>ru</key> + <value>Текст</value> + + + ФорматированиеТекстаВсеДействияРасширеннаяПодсказка + 636 + Label + true + true + + Left + + + Popup + + Auto + Normal + + Границы 70 @@ -1774,6 +2459,10 @@ true + + <key>ru</key> + <value>Объединение ячеек</value> + ТабличныйДокументГруппа1РасширеннаяПодсказка 425 @@ -1848,6 +2537,10 @@ true + + <key>ru</key> + <value>Раздвинуть/разбить ячейку</value> + ТабличныйДокументГруппа3РасширеннаяПодсказка 429 @@ -1955,6 +2648,10 @@ true + + <key>ru</key> + <value>Вставка строк</value> + ТабличныйДокументГруппа2РасширеннаяПодсказка 427 @@ -2062,6 +2759,10 @@ true + + <key>ru</key> + <value>Вставка колонок</value> + ТабличныйДокументГруппа4РасширеннаяПодсказка 431 @@ -2138,7 +2839,7 @@ <key>ru</key> - <value>Очистить</value> + <value>Очистка ячеек</value> ТабличныйДокументГруппа5РасширеннаяПодсказка @@ -2218,6 +2919,10 @@ true + + <key>ru</key> + <value>Скрытие/отображение ячеек</value> + ТабличныйДокументГруппа6РасширеннаяПодсказка 435 @@ -2298,6 +3003,10 @@ true + + <key>ru</key> + <value>Высота строк и ширина колонок</value> + ТабличныйДокументГруппа7РасширеннаяПодсказка 437 @@ -2477,7 +3186,7 @@ InCommandBarAndInAdditionalSubmenu - Группа6 + ГруппаКомандыГруппировки 454 Сгруппировать @@ -2538,8 +3247,12 @@ true + + <key>ru</key> + <value>Группа команды группировки</value> + - Группа6РасширеннаяПодсказка + ГруппаКомандыГруппировкиРасширеннаяПодсказка 455 Label true @@ -2875,7 +3588,11 @@ Left - + Popup + + Auto + Normal + ИзменитьФорму @@ -3172,7 +3889,7 @@ <key>ru</key> - <value>Командная панель 2</value> + <value>Командная панель редактирование</value> КоманднаяПанель2РасширеннаяПодсказка @@ -3189,6 +3906,110 @@ Left + + ГруппаНазначениеМакета + 735 + + ЗаголовокНазначение + 737 + + <key>ru</key> + <value>Назначение:</value> + + true + true + + true + + + ЗаголовокНазначениеРасширеннаяПодсказка + 739 + Label + true + true + + Left + + + + ЗаголовокНазначениеКонтекстноеМеню + 738 + true + + Label + true + true + + Left + + + + ТекстНазначение + 740 + + <key>ru</key> + <value>Текст назначение</value> + + true + true + + true + + + ТекстНазначениеРасширеннаяПодсказка + 742 + Label + true + true + + Left + + + + ТекстНазначениеКонтекстноеМеню + 741 + true + + Label + true + true + + + Click + ВладельцыМакетаНажатие + + true + Left + + + true + true + + true + + + <key>ru</key> + <value>Назначение макета</value> + + + ГруппаНазначениеМакетаРасширеннаяПодсказка + 736 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + Предупреждение 91 @@ -3284,7 +4105,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -3296,7 +4116,7 @@ Макеты 272 - Группа2 + ГруппаРедактированиеМакета 294 ВерхнийКолонтитул @@ -3457,7 +4277,6 @@ UsualGroup - Auto true Button true @@ -3748,7 +4567,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3914,7 +4732,6 @@ UsualGroup - Auto true Button true @@ -3972,7 +4789,7 @@ Style.AccentColor - Windows.WindowBackground + Style.FormBackColor Normal @@ -4055,7 +4872,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -4131,7 +4947,6 @@ UsualGroup HorizontalIfPossible - Auto true true true @@ -4162,7 +4977,6 @@ UsualGroup Vertical - Auto true true Auto @@ -4379,8 +5193,12 @@ true + + <key>ru</key> + <value>Редактирование макета</value> + - Группа2РасширеннаяПодсказка + ГруппаРедактированиеМакетаРасширеннаяПодсказка 295 Label true @@ -4392,7 +5210,6 @@ UsualGroup Vertical - Auto true true Auto @@ -4427,7 +5244,6 @@ UsualGroup Vertical - Auto true true Auto @@ -4459,7 +5275,6 @@ UsualGroup Vertical - Auto true true Auto @@ -4535,7 +5350,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -4565,7 +5379,6 @@ Vertical Center - Auto ru Доступные поля @@ -4598,7 +5411,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -5107,6 +5919,76 @@ true + + КлючОбъектаРедактирования + 40 + + + true + + + true + + + + ИдентификаторКопируемогоМакета + 41 + + String + + + + true + + + true + + + + СохраненныеЯзыкиМакета + 42 + + ValueList + + + true + + + true + + + + + + + ИсточникиДанных + 50 + + ValueList + + + true + + + true + + + + + + + ЭтоМакет + 51 + + Boolean + + + true + + + true + + ЗаписатьИЗакрыть @@ -5638,7 +6520,7 @@ <name>Переименовать</name> <title> <key>ru</key> - <value>Переименовать...</value> + <value>Переименовать макет...</value> 42 @@ -5652,6 +6534,106 @@ Auto Auto + + ИзменитьШрифт + + <key>ru</key> + <value>Изменить шрифт</value> + + 7 + + ru + Изменить шрифт + + + true + + + CommonPicture.ИзменитьШрифт + + + + ИзменитьШрифт + + + DontUse + Auto + + + ИзменитьЦветТекста + + <key>ru</key> + <value>Изменить цвет текста</value> + + 8 + + ru + Изменить цвет текста + + + true + + + CommonPicture.ЦветТекста + + + + ИзменитьЦветТекста + + + DontUse + Auto + + + ИзменитьЦветФона + + <key>ru</key> + <value>Изменить цвет фона</value> + + 9 + + ru + Изменить цвет фона + + + true + + + CommonPicture.ЦветФона + + + + ИзменитьЦветФона + + + DontUse + Auto + + + ИзменитьЦветГраницы + + <key>ru</key> + <value>Изменить цвет границы</value> + + 12 + + ru + Изменить цвет границы + + + true + + + CommonPicture.ЦветГраницы + + + + ИзменитьЦветГраницы + + + Auto + Auto + ТабличныйДокумент @@ -5709,7 +6691,9 @@ Владелец CatalogRef.ИдентификаторыОбъектовРасширений + String CatalogRef.ИдентификаторыОбъектовМетаданных + true @@ -5724,6 +6708,25 @@ Boolean + + ИсточникДанных + + CatalogRef.ИдентификаторыОбъектовРасширений + CatalogRef.ИдентификаторыОбъектовМетаданных + + + + ЭтоПечатнаяФорма + + Boolean + + + + ДоступноНазначение + + Boolean + + diff --git a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Help/ru.html b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Help/ru.html index 423f30954..94b5666ab 100644 --- a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Help/ru.html +++ b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Help/ru.html @@ -28,8 +28,7 @@
        • Список доступных полей содержит следующие колонки:
          • Поле - доступное поле элемента-владельца макета. Поле можно перетаскивать в макет. Можно вставить поля табличной части документа.
          • Образец - показывает, как будет выглядеть поле при выводе на печать. В качестве образца для заполнения полей берется случайный элемент списка. 
          • -
          •  Формат поля - предусмотрена настройка формата поля. Например, можно выбрать формат даты, отличный от стандартного.
      • В правой нижней части находится список операторов и функций для создания выражений;
      • -
      С помощью кнопки Доступные поля панели навигации можно убрать правую часть для просмотра всего макета. +
    •  Формат поля - предусмотрена настройка формата поля. Например, можно выбрать формат даты, отличный от стандартного.
  • В правой нижней части находится список операторов и функций для создания выражений. Подробное описание операторов и функций можно найти в Инструкции по созданию макетов печатных форм;
  • С помощью кнопки Доступные поля панели навигации можно убрать правую часть для просмотра всего макета.
    Для сохранения новой печатной формы нажмите Записать и закрыть.

    Перевод макета на другой язык

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

    diff --git a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl index d1c0aef27..f286c0065 100644 --- a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl +++ b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl @@ -6,6 +6,13 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПолучательПеретаскиваемогоЗначения, АдресПараметровДляОбработкиОжидания; + +#КонецОбласти + #Область ОбработчикиСобытийФормы &НаСервере @@ -25,36 +32,54 @@ ИдентификаторМакета = Параметры.ИмяОбъектаМетаданныхМакета; СсылкаМакета = Параметры.Ссылка; - - ВладелецМакета = Параметры.Владелец; - Если Не ЗначениеЗаполнено(ВладелецМакета) И ЗначениеЗаполнено(ИдентификаторМакета) Тогда + Если ЗначениеЗаполнено(СсылкаМакета) Тогда + КлючОбъектаРедактирования = СсылкаМакета; + ЗаблокироватьДанныеДляРедактирования(КлючОбъектаРедактирования,,УникальныйИдентификатор); + ИначеЕсли ЗначениеЗаполнено(ИдентификаторМакета) Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); - ВладелецМакета = МодульУправлениеПечатью.ВладелецМакета(ИдентификаторМакета); + КлючОбъектаРедактирования = МодульУправлениеПечатью.ПолучитьКлючЗаписиМакета(ИдентификаторМакета); + Если КлючОбъектаРедактирования <> Неопределено Тогда + ЗаблокироватьДанныеДляРедактирования(КлючОбъектаРедактирования,,УникальныйИдентификатор); + КонецЕсли; КонецЕсли; КонецЕсли; + ЭтоПечатнаяФорма = Параметры.ЭтоПечатнаяФорма; + ЭтоМакет = Не ПустаяСтрока(ИдентификаторМакета) Или ЭтоПечатнаяФорма; + + Если ЭтоМакет Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + ИсточникиДанныхМакета = МодульУправлениеПечатью.ИсточникиДанныхМакета(ИдентификаторМакета); + Для Каждого ИсточникДанных Из ИсточникиДанныхМакета Цикл + ИсточникиДанных.Добавить(ИсточникДанных); + КонецЦикла; + КонецЕсли; + КонецЕсли; + + Если ЗначениеЗаполнено(Параметры.ИсточникДанных) Тогда + Если Не ЗначениеЗаполнено(ИсточникиДанных) Тогда + ИсточникиДанных.Добавить(Параметры.ИсточникДанных); + КонецЕсли; + КонецЕсли; + Элементы.ТекстНазначение.Заголовок = ПредставлениеИсточниковДанных(ИсточникиДанных); + ИмяДокумента = Параметры.ИмяДокумента; Элементы.Переименовать.Видимость = ЗначениеЗаполнено(Параметры.Ссылка) Или ПустаяСтрока(ИдентификаторМакета) И ПустаяСтрока(Параметры.ПутьКФайлу); - ЭтоМакет = Не ПустаяСтрока(ИдентификаторМакета) Или ЗначениеЗаполнено(ВладелецМакета); - ЭтоПечатнаяФорма = Ложь; // Макет для автоматической компоновки печатной формы. - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда - МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); - ЭтоПечатнаяФорма = МодульУправлениеПечатью.ЭтоПечатнаяФорма(ИдентификаторМакета, ВладелецМакета); - КонецЕсли; - Если Параметры.ТабличныйДокумент = Неопределено Тогда Если Не ПустаяСтрока(ИдентификаторМакета) Тогда РедактированиеЗапрещено = Не Параметры.Редактирование; ЗагрузитьТабличныйДокументИзМетаданных(Параметры.КодЯзыка); Если Параметры.Копирование Тогда + ИдентификаторКопируемогоМакета = ИдентификаторМакета; ИдентификаторМакета = ""; КонецЕсли; КонецЕсли; ИначеЕсли ТипЗнч(Параметры.ТабличныйДокумент) = Тип("ТабличныйДокумент") Тогда - ТабличныйДокумент = Параметры.ТабличныйДокумент; + ЗаполнитьТабличныйДокумент(ТабличныйДокумент, Параметры.ТабличныйДокумент); Иначе ТабличныйДокумент.КодЯзыка = Неопределено; ДвоичныеДанные = ПолучитьИзВременногоХранилища(Параметры.ТабличныйДокумент); // ДвоичныеДанные - @@ -99,7 +124,14 @@ Если ЭтоПечатнаяФорма И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда МодульКонструкторФормул = ОбщегоНазначения.ОбщийМодуль("КонструкторФормул"); - ПодобратьОбразец(); + ИсточникДанных = Параметры.ИсточникДанных; + Если Не ЗначениеЗаполнено(Параметры.ИсточникДанных) Тогда + ИсточникДанных = ИсточникиДанных[0].Значение; + КонецЕсли; + + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ИсточникДанных); + ПодобратьОбразец(ОбъектМетаданных); + Элементы.Редактирование.Видимость = Ложь; ЦветФонаВыделенияПоля = ЦветаСтиля.ЦветНавигации; @@ -108,19 +140,16 @@ ПараметрыДобавления = МодульКонструкторФормул.ПараметрыДобавленияСпискаПолей(); ПараметрыДобавления.ИмяСписка = ИмяСпискаПолей(); ПараметрыДобавления.МестоРазмещенияСписка = Элементы.ГруппаДоступныеПоля; - ПараметрыДобавления.КоллекцииПолей = ДоступныеПоляОбъекта(); - Если ЗначениеЗаполнено(ВладелецМакета) Тогда - ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ВладелецМакета); - ПараметрыДобавления.ИмяОсновногоИсточника = ОбъектМетаданных.ПолноеИмя(); - КонецЕсли; + ПараметрыДобавления.КоллекцииПолей = КоллекцииПолей(ИсточникиДанных.ВыгрузитьЗначения()); ПараметрыДобавления.ПодсказкаВводаСтрокиПоиска = ПодсказкаВводаСтрокиПоискаСпискаПолей(); ПараметрыДобавления.ПриОпределенииИсточниковДоступныхПолей = "УправлениеПечатью"; ПараметрыДобавления.ОбработчикиСписка.Вставить("Выбор", "Подключаемый_СписокПолейВыбор"); ПараметрыДобавления.ОбработчикиСписка.Вставить("ПередНачаломИзменения", "Подключаемый_ДоступныеПоляПередНачаломИзменения"); ПараметрыДобавления.ОбработчикиСписка.Вставить("ПриОкончанииРедактирования", "Подключаемый_ДоступныеПоляПриОкончанииРедактирования"); + ПараметрыДобавления.ИспользоватьФоновыйПоиск = Истина; МодульКонструкторФормул.ДобавитьСписокПолейНаФорму(ЭтотОбъект, ПараметрыДобавления); - + ПараметрыДобавления = МодульКонструкторФормул.ПараметрыДобавленияСпискаПолей(); ПараметрыДобавления.ИмяСписка = ИмяСпискаОператоров(); ПараметрыДобавления.МестоРазмещенияСписка = Элементы.ГруппаОператорыИФункции; @@ -133,7 +162,7 @@ МодульКонструкторФормул.ДобавитьСписокПолейНаФорму(ЭтотОбъект, ПараметрыДобавления); - ТабличныйДокумент = ПрочитатьМакет(); + ЗаполнитьТабличныйДокумент(ТабличныйДокумент, ПрочитатьМакет()); ПрочитатьТекстВПолеКолонтитула(ТабличныйДокумент.ВерхнийКолонтитул.ТекстСлева, ТекстСлеваСверху); ПрочитатьТекстВПолеКолонтитула(ТабличныйДокумент.ВерхнийКолонтитул.ТекстВЦентре, ТекстВЦентреСверху); ПрочитатьТекстВПолеКолонтитула(ТабличныйДокумент.ВерхнийКолонтитул.ТекстСправа, ТекстСправаСверху); @@ -159,11 +188,13 @@ Элементы.ПовторятьВНачалеСтраницы.Видимость = Ложь; Элементы.ПовторятьВКонцеСтраницы.Видимость = Ложь; КонецЕсли; - + Элементы.ВерхнийКолонтитул.Видимость = Ложь; Элементы.НижнийКолонтитул.Видимость = Ложь; Элементы.УдалитьЯзыкМакета.Видимость = Ложь; - + + Элементы.ГруппаНазначениеМакета.Видимость = ЭтоПечатнаяФорма; + Элементы.ГруппаНазначениеМакета.Доступность = Параметры.ДоступноНазначение; КонецПроцедуры &НаКлиенте @@ -203,6 +234,10 @@ ОповеститьОЗаписиТабличногоДокумента(); КонецЕсли; + Если Не Отказ И Не ЗавершениеРаботы И ЗначениеЗаполнено(КлючОбъектаРедактирования) Тогда + РазблокироватьНаСервере(); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -243,6 +278,20 @@ КонецПроцедуры +&НаКлиенте +Процедура ВладельцыМакетаНажатие(Элемент) + + ПараметрыПодбора = Новый Структура; + ПараметрыПодбора.Вставить("ВыбранныеОбъектыМетаданных", ОбщегоНазначенияКлиент.СкопироватьРекурсивно(ИсточникиДанных)); + ПараметрыПодбора.Вставить("ВыбиратьСсылки", Истина); + ПараметрыПодбора.Вставить("Заголовок", НСтр("ru = 'Назначение макета'")); + ПараметрыПодбора.Вставить("ФильтрПоОбъектамМетаданных", ОбъектыСКомандамиПечати()); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореВладельцевМакета", ЭтотОбъект); + ОткрытьФорму("ОбщаяФорма.ВыборОбъектовМетаданных", ПараметрыПодбора, , , , , ОписаниеОповещения); + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы @@ -308,6 +357,17 @@ КонецПроцедуры +&НаКлиенте +Процедура ИзменитьШрифт(Команда) + + Если Элементы.ТабличныйДокумент.ТекущаяОбласть = Неопределено Тогда + Возврат; + КонецЕсли; + + ОписаниеОповещения = Новый ОписаниеОповещения("ИзменитьШрифтПродолжение", ЭтотОбъект); + ОткрытьФорму("ОбщаяФорма.ФормаВыбораШрифта",, ЭтотОбъект,,,, ОписаниеОповещения); + +КонецПроцедуры // Форматирование @@ -371,6 +431,7 @@ ТабличныйДокумент.ВерхнийКолонтитул.ТекстСлева = ТекстСлеваСверху.ПолучитьФорматированнуюСтроку(); УстановитьВыводКолонтитула(ТабличныйДокумент.ВерхнийКолонтитул); Модифицированность = Истина; + ПолучательПеретаскиваемогоЗначения = Элемент; КонецПроцедуры @@ -380,6 +441,7 @@ ТабличныйДокумент.ВерхнийКолонтитул.ТекстВЦентре = ТекстВЦентреСверху.ПолучитьФорматированнуюСтроку(); УстановитьВыводКолонтитула(ТабличныйДокумент.ВерхнийКолонтитул); Модифицированность = Истина; + ПолучательПеретаскиваемогоЗначения = Элемент; КонецПроцедуры @@ -389,6 +451,7 @@ ТабличныйДокумент.ВерхнийКолонтитул.ТекстСправа = ТекстСправаСверху.ПолучитьФорматированнуюСтроку(); УстановитьВыводКолонтитула(ТабличныйДокумент.ВерхнийКолонтитул); Модифицированность = Истина; + ПолучательПеретаскиваемогоЗначения = Элемент; КонецПроцедуры @@ -398,6 +461,7 @@ ТабличныйДокумент.НижнийКолонтитул.ТекстСлева = ТекстСлеваСнизу.ПолучитьФорматированнуюСтроку(); УстановитьВыводКолонтитула(ТабличныйДокумент.НижнийКолонтитул); Модифицированность = Истина; + ПолучательПеретаскиваемогоЗначения = Элемент; КонецПроцедуры @@ -407,6 +471,7 @@ ТабличныйДокумент.НижнийКолонтитул.ТекстВЦентре = ТекстВЦентреСнизу.ПолучитьФорматированнуюСтроку(); УстановитьВыводКолонтитула(ТабличныйДокумент.НижнийКолонтитул); Модифицированность = Истина; + ПолучательПеретаскиваемогоЗначения = Элемент; КонецПроцедуры @@ -416,6 +481,7 @@ ТабличныйДокумент.НижнийКолонтитул.ТекстСправа = ТекстСправаСнизу.ПолучитьФорматированнуюСтроку(); УстановитьВыводКолонтитула(ТабличныйДокумент.НижнийКолонтитул); Модифицированность = Истина; + ПолучательПеретаскиваемогоЗначения = Элемент; КонецПроцедуры @@ -460,6 +526,30 @@ КонецПроцедуры +&НаКлиенте +Процедура ИзменитьЦветГраницы(Команда) + + ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеИзменитьЦветГраницы", ЭтотОбъект); + ОткрытьФорму("ОбщаяФорма.ФормаВыбораЦвета",, ЭтотОбъект,,,, ОписаниеОповещения); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьЦветТекста(Команда) + + ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеИзменитьЦветТекста", ЭтотОбъект); + ОткрытьФорму("ОбщаяФорма.ФормаВыбораЦвета",, ЭтотОбъект,,,, ОписаниеОповещения); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьЦветФона(Команда) + + ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеИзменитьЦветФона", ЭтотОбъект); + ОткрытьФорму("ОбщаяФорма.ФормаВыбораЦвета",, ЭтотОбъект,,,, ОписаниеОповещения); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -471,7 +561,8 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); - ТабличныйДокумент = МодульУправлениеПечатью.МакетПечатнойФормы(ИдентификаторМакета, КодЯзыка); + МакетПечатнойФормы = МодульУправлениеПечатью.МакетПечатнойФормы(ИдентификаторМакета, КодЯзыка); + ЗаполнитьТабличныйДокумент(ТабличныйДокумент, МакетПечатнойФормы); Если Не ЗначениеЗаполнено(СсылкаМакета) Тогда ПоставляемыйМакет = МодульУправлениеПечатью.ПоставляемыйМакет(ИдентификаторМакета, КодЯзыка); КонецЕсли; @@ -483,6 +574,11 @@ ТребуетсяПеревод = ДоступныеЯзыкиТабличногоДокумента.Найти(КодЯзыка) = Неопределено; КонецЕсли; + Если КодЯзыка <> "" Тогда + ЯзыкиМакета = МодульУправлениеПечатьюМультиязычность.ЯзыкиМакета(ИдентификаторМакета); + Модифицированность = Модифицированность Или (ЯзыкиМакета.Найти(КодЯзыка) = Неопределено); + КонецЕсли; + ДоступенАвтоматическийПеревод = МодульУправлениеПечатьюМультиязычность.ДоступенАвтоматическийПеревод(ТекущийЯзык); Элементы.Перевести.Видимость = ДоступенАвтоматическийПеревод; Элементы.КнопкаПоказатьСкрытьОригинал.Видимость = Элементы.Перевести.Видимость; @@ -516,7 +612,11 @@ Элементы.ТабличныйДокументЖирный.Пометка = Шрифт <> Неопределено И Шрифт.Полужирный = Истина; Элементы.ТабличныйДокументНаклонный.Пометка = Шрифт <> Неопределено И Шрифт.Наклонный = Истина; Элементы.ТабличныйДокументПодчеркивание.Пометка = Шрифт <> Неопределено И Шрифт.Подчеркивание = Истина; - Элементы.Зачеркивание.Пометка = Шрифт <> Неопределено И Шрифт.Зачеркивание = Истина; + + Элементы.ТабличныйДокументПодчеркиваниеВсеДействия.Пометка = Элементы.ТабличныйДокументЖирный.Пометка; + Элементы.ТабличныйДокументНаклонныйВсеДействия.Пометка = Элементы.ТабличныйДокументНаклонный.Пометка; + Элементы.ТабличныйДокументПодчеркиваниеВсеДействия.Пометка = Элементы.ТабличныйДокументПодчеркивание.Пометка; + Элементы.ЗачеркиваниеВсеДействия.Пометка = Шрифт <> Неопределено И Шрифт.Зачеркивание = Истина; // Горизонтальное положение Элементы.ТабличныйДокументВыровнятьВлево.Пометка = Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Лево; @@ -524,11 +624,20 @@ Элементы.ТабличныйДокументВыровнятьВправо.Пометка = Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Право; Элементы.ТабличныйДокументВыровнятьПоШирине.Пометка = Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.ПоШирине; + Элементы.ТабличныйДокументВыровнятьВлевоВсеДействия.Пометка = Элементы.ТабличныйДокументВыровнятьВлево.Пометка; + Элементы.ТабличныйДокументВыровнятьПоЦентруВсеДействия.Пометка = Элементы.ТабличныйДокументВыровнятьПоЦентру.Пометка; + Элементы.ТабличныйДокументВыровнятьВправоВсеДействия.Пометка = Элементы.ТабличныйДокументВыровнятьВправо.Пометка; + Элементы.ТабличныйДокументВыровнятьПоШиринеВсеДействия.Пометка = Элементы.ТабличныйДокументВыровнятьПоШирине.Пометка; + // Вертикальное положение Элементы.ВыровнятьПоВерхнемуКраю.Пометка = Область.ВертикальноеПоложение = ВертикальноеПоложение.Верх; Элементы.ВыровнятьПоСередине.Пометка = Область.ВертикальноеПоложение = ВертикальноеПоложение.Центр; Элементы.ВыровнятьПоНижнемуКраю.Пометка = Область.ВертикальноеПоложение = ВертикальноеПоложение.Низ; + Элементы.ВыровнятьПоВерхнемуКраюВсеДействия.Пометка = Элементы.ВыровнятьПоВерхнемуКраю.Пометка; + Элементы.ВыровнятьПоСерединеВсеДействия.Пометка = Элементы.ВыровнятьПоСередине.Пометка; + Элементы.ВыровнятьПоНижнемуКраюВсеДействия.Пометка = Элементы.ВыровнятьПоНижнемуКраю.Пометка; + #КонецЕсли КонецПроцедуры @@ -647,12 +756,11 @@ &НаКлиенте Процедура ЗаписатьТабличныйДокумент(ОбработчикЗавершения = Неопределено) - + ОчиститьПодсветку(); - ЕстьВладелец = ЗначениеЗаполнено(ВладелецМакета); ЕстьСсылка = ЗначениеЗаполнено(Параметры.Ссылка); - Если ЭтоНовый() И Не ЕстьВладелец И Не ЕстьСсылка Или РедактированиеЗапрещено Тогда + Если ЭтоНовый() И Не ЭтоМакет И Не ЕстьСсылка Или РедактированиеЗапрещено Тогда НачатьДиалогСохраненияФайла(ОбработчикЗавершения); Возврат; КонецЕсли; @@ -712,6 +820,7 @@ ЗаписьВыполнена = Истина; Модифицированность = Ложь; УстановитьЗаголовок(); + СохраненныеЯзыкиМакета.Добавить(ТекущийЯзык); Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда Если ЗначениеЗаполнено(Параметры.ПрисоединенныйФайл) Тогда @@ -791,6 +900,11 @@ Процедура УстановитьЗаголовок() Заголовок = ИмяДокумента; + Если ЗначениеЗаполнено(ТекущийЯзык) Тогда + ТекущийЯзыкПредставление = Элементы["Язык_"+ТекущийЯзык].Заголовок; + Заголовок = Заголовок + " ("+ТекущийЯзыкПредставление+")"; + КонецЕсли; + Если ЭтоНовый() Тогда Заголовок = Заголовок + " (" + НСтр("ru = 'создание'") + ")"; ИначеЕсли РедактированиеЗапрещено Тогда @@ -808,10 +922,19 @@ Элементы.ЗаписатьИЗакрыть.Доступность = ДокументРедактируется Или Модифицированность; Элементы.Записать.Доступность = ДокументРедактируется Или Модифицированность; - Если ДокументРедактируется И Не ПустаяСтрока(ИдентификаторМакета) И Не ЗначениеЗаполнено(ВладелецМакета) Тогда + Если ДокументРедактируется И ЭтоМакет И Не ЭтоПечатнаяФорма Тогда Элементы.Предупреждение.Видимость = Истина; КонецЕсли; + Элементы.Редактирование.Доступность = ДокументРедактируется Или Не ЭтоМакет; + Элементы.ЗагрузитьИзФайла.Доступность = ДокументРедактируется Или Не ЭтоМакет; + Элементы.ЗачеркиваниеВсеДействия.Доступность = ДокументРедактируется Или Не ЭтоМакет; + Элементы.ТекущееЗначение.Доступность = ДокументРедактируется; + Элементы.ПоказыватьКолонтитулы.Доступность = ДокументРедактируется; + Элементы.Перевести.Доступность = ДокументРедактируется; + УстановитьДоступностьРекурсивно(Элементы.КомандыРедактирования); + УстановитьДоступностьРекурсивно(Элементы.ДобавляемыеЯзыки, ДокументРедактируется); + КонецПроцедуры &НаКлиенте @@ -831,9 +954,45 @@ &НаСервере Процедура ОбновитьТабличныйДокумент(ЗагруженныйТабличныйДокумент) - ТабличныйДокумент = ЗагруженныйТабличныйДокумент; + ЗаполнитьТабличныйДокумент(ТабличныйДокумент, ЗагруженныйТабличныйДокумент); КонецПроцедуры +&НаСервереБезКонтекста +Процедура ЗаполнитьТабличныйДокумент(ТабличныйДокумент, ЗагруженныйТабличныйДокумент) + Для НомерСтроки = 1 По ЗагруженныйТабличныйДокумент.ВысотаТаблицы Цикл + Для НомерКолонки = 1 По ЗагруженныйТабличныйДокумент.ШиринаТаблицы Цикл + ИсходнаяЯчейка = ЗагруженныйТабличныйДокумент.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки); + Если ИсходнаяЯчейка.Заполнение <> ТипЗаполненияОбластиТабличногоДокумента.Текст Тогда + ТабличныйДокумент = ЗагруженныйТабличныйДокумент; + Возврат; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + ТабличныйДокумент.Очистить(); + ТабличныйДокумент.Вывести(ЗагруженныйТабличныйДокумент); + + + ТабличныйДокумент.ВерхнийКолонтитул.ТекстСлева = ЗагруженныйТабличныйДокумент.ВерхнийКолонтитул.ТекстСлева; + ТабличныйДокумент.ВерхнийКолонтитул.ТекстВЦентре = ЗагруженныйТабличныйДокумент.ВерхнийКолонтитул.ТекстВЦентре; + ТабличныйДокумент.ВерхнийКолонтитул.ТекстСправа = ЗагруженныйТабличныйДокумент.ВерхнийКолонтитул.ТекстСправа; + ТабличныйДокумент.НижнийКолонтитул.ТекстСлева = ЗагруженныйТабличныйДокумент.НижнийКолонтитул.ТекстСлева; + ТабличныйДокумент.НижнийКолонтитул.ТекстВЦентре = ЗагруженныйТабличныйДокумент.НижнийКолонтитул.ТекстВЦентре; + ТабличныйДокумент.НижнийКолонтитул.ТекстСправа = ЗагруженныйТабличныйДокумент.НижнийКолонтитул.ТекстСправа; + + Для Каждого Область Из ТабличныйДокумент.Области Цикл + Если ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента") + И Область.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Строки + Или ТипЗнч(Область) = Тип("РисунокТабличногоДокумента") Тогда + КопируемаяОбласть = ЗагруженныйТабличныйДокумент.Области.Найти(Область.Имя); + Если КопируемаяОбласть = Неопределено Тогда + Продолжить; + КонецЕсли; + Область.ПараметрРасшифровки = КопируемаяОбласть.ПараметрРасшифровки; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры &НаКлиенте Процедура УстановитьНачальныеНастройкиФормы() @@ -888,7 +1047,7 @@ Элементы.КнопкаПоказатьСкрытьОригинал.Доступность = ТекущийЯзык <> ОбщегоНазначенияКлиент.КодОсновногоЯзыка() И ПоставляемыйМакет.ВысотаТаблицы > 0; Если ЭтоПечатнаяФорма Тогда - ТабличныйДокумент = ПрочитатьМакет(); + ЗаполнитьТабличныйДокумент(ТабличныйДокумент, ПрочитатьМакет()); КонецЕсли; КонецЕсли; @@ -908,12 +1067,13 @@ Элементы.УдалитьЯзыкМакета.Видимость = ТекущийЯзык <> ОбщегоНазначенияКлиент.КодОсновногоЯзыка(); Элементы.КнопкаПоказатьСкрытьОригинал.Доступность = Ложь; - + УстановитьЗаголовок(); КонецПроцедуры &НаКлиенте Процедура Подключаемый_ПриПереключенииЯзыка(КодЯзыка, ДополнительныеПараметры) Экспорт + УстановитьЗаголовок(); ЗагрузитьТабличныйДокументИзМетаданных(КодЯзыка); Если ТребуетсяПеревод И ДоступенАвтоматическийПеревод Тогда ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -995,8 +1155,8 @@ ПараметрыОповещения.Вставить("ПутьКФайлу", Параметры.ПутьКФайлу); ПараметрыОповещения.Вставить("ИмяОбъектаМетаданныхМакета", ИдентификаторМакета); ПараметрыОповещения.Вставить("КодЯзыка", ТекущийЯзык); - ПараметрыОповещения.Вставить("Владелец", ВладелецМакета); ПараметрыОповещения.Вставить("Представление", ИмяДокумента); + ПараметрыОповещения.Вставить("ИсточникиДанных", ИсточникиДанных.ВыгрузитьЗначения()); Если ЗаписьВыполнена Тогда ИмяСобытия = "Запись_ТабличныйДокумент"; @@ -1009,6 +1169,83 @@ КонецПроцедуры +&НаСервере +Процедура РазблокироватьНаСервере() + РазблокироватьДанныеДляРедактирования(КлючОбъектаРедактирования, УникальныйИдентификатор); +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьШрифтПродолжение(Результат, Параметры) Экспорт + + ТекущаяОбласть = Элементы.ТабличныйДокумент.ТекущаяОбласть; + + Если Результат = Неопределено Тогда + Возврат; + ИначеЕсли Результат = -1 Тогда + ДиалогВыбораШрифта = Новый ДиалогВыбораШрифта; + ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеИзменитьШрифт", ЭтотОбъект); + ДиалогВыбораШрифта.Шрифт = ТекущаяОбласть.Шрифт; + ДиалогВыбораШрифта.Показать(ОписаниеОповещения); + Иначе + ТекущаяОбласть.Шрифт = Новый Шрифт(ТекущаяОбласть.Шрифт, Результат); + Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершениеИзменитьШрифт(Шрифт, Параметры) Экспорт + + Если Шрифт = Неопределено Тогда + Возврат; + КонецЕсли; + + ТекущаяОбласть = Элементы.ТабличныйДокумент.ТекущаяОбласть; + ТекущаяОбласть.Шрифт = Шрифт; + Модифицированность = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершениеИзменитьЦветГраницы(Цвет, Параметры) Экспорт + + УстановитьЦвет("ЦветРамки", Цвет); + +КонецПроцедуры + + +&НаКлиенте +Процедура ЗавершениеИзменитьЦветТекста(Цвет, Параметры) Экспорт + + УстановитьЦвет("ЦветТекста", Цвет); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершениеИзменитьЦветФона(Цвет, Параметры) Экспорт + + УстановитьЦвет("ЦветФона", Цвет); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьЦвет(ИмяПоля, Цвет) + ТекущаяОбласть = Элементы.ТабличныйДокумент.ТекущаяОбласть; + Если ТипЗнч(Цвет) = Тип("Цвет")Тогда + ТекущаяОбласть[ИмяПоля] = Цвет; + Модифицированность = Истина; + ИначеЕсли Цвет = "ДругиеЦвета" Тогда + ДиалогВыбораЦвета = Новый ДиалогВыбораЦвета(); + ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораЦвета", ЭтотОбъект, ИмяПоля); + ДиалогВыбораЦвета.Показать(ОписаниеОповещения); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПослеВыбораЦвета(Цвет, ИмяПоля) Экспорт + УстановитьЦвет(ИмяПоля, Цвет); +КонецПроцедуры + #Область КонструкторПечатныхФорм &НаСервере @@ -1036,7 +1273,7 @@ Возврат Неопределено; КонецЕсли; - Возврат Метаданные.НайтиПоПолномуИмени(ИмяОбъекта); + Возврат ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъекта); КонецФункции @@ -1057,6 +1294,7 @@ РазместитьРисунокВТабличномДокументе(ВыбранноеПоле, СтандартнаяОбработка, Область.Лево, Область.Верх); КонецЕсли; + ПолучательПеретаскиваемогоЗначения = Элемент; КонецПроцедуры @@ -1076,7 +1314,7 @@ Рисунок.Высота = 40; Рисунок.Ширина = 40; Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии); - Рисунок.ЦветФона = Новый Цвет; + Рисунок.ЦветФона = ЦветПоУмолчанию(); Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально; Элементы.ТабличныйДокумент.ТекущаяОбласть = Область; @@ -1093,7 +1331,7 @@ Рисунок.Высота = 10; Рисунок.Ширина = 30; Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии); - Рисунок.ЦветФона = Новый Цвет; + Рисунок.ЦветФона = ЦветПоУмолчанию(); Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально; Элементы.ТабличныйДокумент.ТекущаяОбласть = Область; @@ -1118,6 +1356,42 @@ Возврат; КонецЕсли; + Если ВыбранноеПоле.Имя = "QRКод" Тогда + СтандартнаяОбработка = Ложь; + + Рисунок = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка); + Рисунок.Имя = ПодобратьИмяОбласти(ВыбранноеПоле.Имя); + Рисунок.ПараметрРасшифровки = "[" + ВыбранноеПоле.ПутьКДанным + "]"; + Рисунок.Расположить(Область); + Рисунок.Высота = 40; + Рисунок.Ширина = 40; + Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии); + Рисунок.ЦветФона = ЦветПоУмолчанию(); + Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально; + Рисунок.Картинка = БиблиотекаКартинок["МестоДляQRКода"]; + + Элементы.ТабличныйДокумент.ТекущаяОбласть = Область; + Возврат; + КонецЕсли; + + Если ВыбранноеПоле.Имя = "КартинкаШтрихкода" Тогда + СтандартнаяОбработка = Ложь; + + Рисунок = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка); + Рисунок.Имя = ПодобратьИмяОбласти(ВыбранноеПоле.Имя); + Рисунок.ПараметрРасшифровки = "[" + ВыбранноеПоле.ПутьКДанным + "]"; + Рисунок.Расположить(Область); + Рисунок.Высота = 25.93; + Рисунок.Ширина = 37.29; + Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии); + Рисунок.ЦветФона = ЦветПоУмолчанию(); + Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально; + Рисунок.Картинка = БиблиотекаКартинок["МестоДляШтрихкода"]; + + Элементы.ТабличныйДокумент.ТекущаяОбласть = Область; + Возврат; + КонецЕсли; + ЭтоПрисоединенныйФайл = ВыбранноеПоле.Тип.Типы().Количество() = 1 И ТипыПрисоединенныхФайлов.СодержитТип(ВыбранноеПоле.Тип.Типы()[0]); @@ -1132,7 +1406,7 @@ Рисунок.Высота = 20; Рисунок.Ширина = 20; Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии); - Рисунок.ЦветФона = Новый Цвет; + Рисунок.ЦветФона = ЦветПоУмолчанию(); Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально; Элементы.ТабличныйДокумент.ТекущаяОбласть = Область; @@ -1168,7 +1442,7 @@ Процедура ОбновитьПолеВводаЗначенияТекущейЯчейки() ТекущаяОбласть = ТабличныйДокумент.ТекущаяОбласть; - ДоступноРедактирование = ТекущаяОбласть <> Неопределено И ТипЗнч(ТекущаяОбласть) = Тип("ОбластьЯчеекТабличногоДокумента"); + ДоступноРедактирование = Элементы.ТабличныйДокумент.Редактирование И ТекущаяОбласть <> Неопределено И ТипЗнч(ТекущаяОбласть) = Тип("ОбластьЯчеекТабличногоДокумента"); Элементы.ТекущееЗначение.Доступность = ДоступноРедактирование; Если ДоступноРедактирование Тогда ТекущееЗначение = ТекущаяОбласть.Текст; @@ -1236,22 +1510,18 @@ КонецПроцедуры &НаСервере -Процедура ПодобратьОбразец() - - ОбъектМетаданных = ВладелецМакета(); - Если ОбъектМетаданных = Неопределено Тогда - Возврат; - КонецЕсли; +Процедура ПодобратьОбразец(ОбъектМетаданных) ТекстЗапроса = - "ВЫБРАТЬ ПЕРВЫЕ 1 + "ВЫБРАТЬ ПЕРВЫЕ 1 РАЗРЕШЕННЫЕ | ПсевдонимЗаданнойТаблицы.Ссылка КАК Ссылка |ИЗ | &Таблица КАК ПсевдонимЗаданнойТаблицы + | |УПОРЯДОЧИТЬ ПО | Ссылка УБЫВ"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Таблица", ВладелецМакета().ПолноеИмя()); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Таблица", ОбъектМетаданных.ПолноеИмя()); Запрос = Новый Запрос(ТекстЗапроса);; Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда @@ -1271,7 +1541,7 @@ Элементы.ТекущееЗначение.Видимость = Не Элементы.ПоказыватьКолонтитулы.Пометка; Элементы.НастройкиТекущейОбласти.Видимость = Не Элементы.ПоказыватьКолонтитулы.Пометка; Элементы.ТабличныйДокумент.ТолькоПросмотр = Элементы.ПоказыватьКолонтитулы.Пометка; - + ТекстСостояния = ?(Элементы.ПоказыватьКолонтитулы.Пометка, НСтр("ru = 'Редактирование колонтитулов'"), ""); ОтобразитьСостояниеТекущейПечатнойФормы(ТекстСостояния); @@ -1287,10 +1557,10 @@ Процедура ОчиститьФормат(Команда) ТекущаяОбласть = Элементы.ТабличныйДокумент.ТекущаяОбласть; ТекущаяОбласть.Шрифт = Неопределено; - ТекущаяОбласть.ЦветРамки = Новый Цвет(); - ТекущаяОбласть.ЦветТекста = Новый Цвет(); - ТекущаяОбласть.ЦветУзора = Новый Цвет(); - ТекущаяОбласть.ЦветФона = Новый Цвет(); + ТекущаяОбласть.ЦветРамки = ЦветПоУмолчанию(); + ТекущаяОбласть.ЦветТекста = ЦветПоУмолчанию(); + ТекущаяОбласть.ЦветУзора = ЦветПоУмолчанию(); + ТекущаяОбласть.ЦветФона = ЦветПоУмолчанию(); ТекущаяОбласть.ВертикальноеПоложение = Неопределено; ТекущаяОбласть.ВертикальноеПоложениеКартинки = Неопределено; ТекущаяОбласть.ГоризонтальноеПоложение = Неопределено; @@ -1298,6 +1568,11 @@ Модифицированность = Истина; КонецПроцедуры +&НаКлиентеНаСервереБезКонтекста +Функция ЦветПоУмолчанию() + Возврат Новый Цвет; +КонецФункции + &НаСервере Процедура УстановитьПримерыЗначений(КоллекцияПолей = Неопределено, ДанныеПечати = Неопределено) @@ -1319,6 +1594,7 @@ ОтображаемыеПоля = ЗаполнитьСписокОтображаемыхПолей(КоллекцияПолей); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда ДанныеПечати = МодульУправлениеПечатью.ДанныеПечати(Объекты, ОтображаемыеПоля, ТекущийЯзык); + ПолучитьСообщенияПользователю(Истина); Иначе Возврат; КонецЕсли; @@ -1502,19 +1778,18 @@ Процедура ТекущееЗначениеПриИзменении(Элемент) ОбновитьТекстВОбластиЯчеек(); + ПолучательПеретаскиваемогоЗначения = Элемент; КонецПроцедуры -&НаСервере -Функция ДоступныеПоляОбъекта() - - ОбъектМетаданных = ВладелецМакета(); +&НаСервереБезКонтекста +Функция КоллекцииПолей(ИсточникиДанных) Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); - Возврат МодульУправлениеПечатью.ДоступныеПоляОбъекта(ОбъектМетаданных.ПолноеИмя()); + Возврат МодульУправлениеПечатью.КоллекцииПолейИсточниковДанных(ИсточникиДанных); КонецЕсли; - + Возврат Новый Массив; КонецФункции @@ -1564,10 +1839,17 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда МодульКонструкторФормул = ОбщегоНазначения.ОбщийМодуль("КонструкторФормул"); МодульКонструкторФормул.ЗаполнитьСписокДоступныхПолей(ЭтотОбъект, ПараметрыЗаполнения); - - ТекущиеДанные = ЭтотОбъект[ИмяСпискаПолей()].НайтиПоИдентификатору(ПараметрыЗаполнения.ИдентификаторСтроки); - УстановитьПримерыЗначений(ТекущиеДанные); - УстановитьФорматЗначенийПоУмолчанию(ТекущиеДанные); + + Если ПараметрыЗаполнения.ИмяСписка = ИмяСпискаПолей() Тогда + ТекущиеДанные = ЭтотОбъект[ПараметрыЗаполнения.ИмяСписка].НайтиПоИдентификатору(ПараметрыЗаполнения.ИдентификаторСтроки); + УстановитьПримерыЗначений(ТекущиеДанные); + УстановитьФорматЗначенийПоУмолчанию(ТекущиеДанные); + Если ТекущиеДанные.Папка Или ТекущиеДанные.Таблица И ТекущиеДанные.ПолучитьРодителя() = Неопределено Тогда + ОтметитьОбщиеПоля(ТекущиеДанные); + Иначе + УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(ТекущиеДанные); + КонецЕсли; + КонецЕсли КонецЕсли; КонецПроцедуры @@ -1632,6 +1914,40 @@ КонецПроцедуры +&НаСервере +Процедура Подключаемый_ОбработчикКонструктораФормулСервер(Параметр, ДополнительныеПараметры) + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда + МодульКонструкторФормул = ОбщегоНазначения.ОбщийМодуль("КонструкторФормул"); + МодульКонструкторФормул.ОбработчикКонструктораФормул(ЭтотОбъект, Параметр, ДополнительныеПараметры); + КонецЕсли; + + Если ДополнительныеПараметры.КлючОперации = "ОбработатьСообщениеПоиска" Тогда + ОтметитьОбщиеПоля(); + УстановитьФорматЗначенийПоУмолчанию(); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ОбработчикКонструктораФормулКлиент(Параметр, ДополнительныеПараметры = Неопределено) Экспорт // АПК:78 Процедура вызывается из КонструкторФормулКлиент.НачатьПоискВСпискеПолей + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда + МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент"); + МодульКонструкторФормулКлиент.ОбработчикКонструктораФормул(ЭтотОбъект, Параметр, ДополнительныеПараметры); + Если ДополнительныеПараметры <> Неопределено И ДополнительныеПараметры.ВыполнитьНаСервере Тогда + Подключаемый_ОбработчикКонструктораФормулСервер(Параметр, ДополнительныеПараметры); + КонецЕсли; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_НачатьПоискВСпискеПолей() + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда + МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент"); + МодульКонструкторФормулКлиент.НачатьПоискВСпискеПолей(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + &НаКлиентеНаСервереБезКонтекста Функция ИмяСпискаПолей() @@ -1683,7 +1999,7 @@ ОбновитьТекстВОбластиЯчеек(); КонецЕсли; - Если Поле = Элементы[ИмяСпискаПолей() + "КнопкаНастройкиФормата"] Тогда + Если Поле = Элементы[ИмяСпискаПолей() + "КнопкаНастройкиФормата"] И ЗначениеЗаполнено(Элементы[ИмяСпискаПолей()].ТекущиеДанные.Формат) Тогда СтандартнаяОбработка = Ложь; Конструктор = Новый КонструкторФорматнойСтроки(Элементы[ИмяСпискаПолей()].ТекущиеДанные.Формат); Конструктор.ДоступныеТипы = Элементы[ИмяСпискаПолей()].ТекущиеДанные.Тип; @@ -1701,6 +2017,11 @@ Оператор = МодульКонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект, ИмяСпискаОператоров()); ПараметрыПеретаскивания.Значение = МодульКонструкторФормулКлиент.ВыражениеДляВставки(Оператор); + Если Оператор.ПутьКДанным = "УправлениеПечатью_КоличествоСтрок" Тогда + ИмяТекущейТаблицы = ПолучитьИмяТекущейТаблицы(); + Выполнение = ИмяТекущейТаблицы <> Неопределено; + ПараметрыПеретаскивания.Значение = СтрЗаменить(ПараметрыПеретаскивания.Значение, "()", "(["+ИмяТекущейТаблицы+"])"); + КонецЕсли; КонецЕсли; КонецПроцедуры @@ -1710,29 +2031,101 @@ Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент"); - - Если МодульКонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект, ИмяСпискаОператоров()).ПутьКДанным = "Формат" Тогда + ВыбранноеПоле = МодульКонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект, ИмяСпискаОператоров()); + Контекст = Новый Структура("ПутьКДанным, Заголовок"); + ЗаполнитьЗначенияСвойств(Контекст, ВыбранноеПоле); + + Если Контекст.ПутьКДанным = "Формат" Тогда ФорматСтроки = Новый КонструкторФорматнойСтроки; - ФорматСтроки.Показать(Новый ОписаниеОповещения("ОператорыОкончаниеПеретаскиванияЗавершение", ЭтотОбъект, Новый Структура("ФорматСтроки", ФорматСтроки))); + Контекст.Вставить("ФорматСтроки", ФорматСтроки); + ОповещениеОкончанияПеретаскиванияЗавершение = Новый ОписаниеОповещения("ОператорыОкончаниеПеретаскиванияЗавершение", ЭтотОбъект, Контекст); + ФорматСтроки.Показать(ОповещениеОкончанияПеретаскиванияЗавершение); КонецЕсли; КонецЕсли; КонецПроцедуры &НаКлиенте -Процедура ОператорыОкончаниеПеретаскиванияЗавершение(Текст, ДополнительныеПараметры) Экспорт +Процедура ОператорыОкончаниеПеретаскиванияЗавершение(Текст, Контекст) Экспорт - ФорматСтроки = ДополнительныеПараметры.ФорматСтроки; - - Если ЗначениеЗаполнено(ФорматСтроки.Текст) Тогда - ТекстДляВставки = "Формат( , """ + ФорматСтроки.Текст + """)"; - Элементы.ТекущееЗначение.ВыделенныйТекст = ТекстДляВставки; + Если Текст = Неопределено Тогда + Возврат; КонецЕсли; + ТекстыДляЗамены = Новый Структура("ДляПоиска, ДляЗамены", "", ""); + + Если Контекст.ПутьКДанным = "Формат" Тогда + ФорматСтроки = Контекст.ФорматСтроки; + Если ЗначениеЗаполнено(ФорматСтроки.Текст) Тогда + ТекстыДляЗамены.ДляЗамены = Контекст.Заголовок + "( , """ + ФорматСтроки.Текст + """)"; + ТекстыДляЗамены.ДляПоиска = Контекст.Заголовок + "(,,)"; + КонецЕсли; + КонецЕсли; + + АдресПараметровДляОбработкиОжидания = ПоместитьВоВременноеХранилище(ТекстыДляЗамены, УникальныйИдентификатор); + + ПодключитьОбработчикОжидания("УстановитьЗначениеПослеПеретаскивания", 0.1, Истина); + КонецПроцедуры #КонецОбласти +&НаКлиенте +Процедура УстановитьЗначениеПослеПеретаскивания() + + ТекстыДляЗамены = ПолучитьИзВременногоХранилища(АдресПараметровДляОбработкиОжидания); + + Если ПолучательПеретаскиваемогоЗначения = Элементы.ТекущееЗначение ИЛИ ПолучательПеретаскиваемогоЗначения = Неопределено Тогда + Элементы.ТекущееЗначение.ВыделенныйТекст = ТекстыДляЗамены.ДляЗамены; + Иначе + ТекущийРеквизит = ЭтотОбъект[ПолучательПеретаскиваемогоЗначения.Имя]; + Если ТипЗнч(ТекущийРеквизит) = Тип("ФорматированныйДокумент") Тогда + ТекстДляРазмещения = СтрЗаменить(ТекущийРеквизит.ПолучитьТекст(), ТекстыДляЗамены.ДляПоиска, ТекстыДляЗамены.ДляЗамены); + ФорматированныйТекст = Новый ФорматированнаяСтрока(ТекстДляРазмещения); + ТекущийРеквизит.Удалить(); + ТекущийРеквизит.УстановитьФорматированнуюСтроку(ФорматированныйТекст); + ИначеЕсли ТипЗнч(ТекущийРеквизит) = Тип("ТабличныйДокумент") Тогда + ТекущийРеквизит.ТекущаяОбласть.Текст = СтрЗаменить(ТекущийРеквизит.ТекущаяОбласть.Текст, ТекстыДляЗамены.ДляПоиска, ТекстыДляЗамены.ДляЗамены); + Иначе + ТекущийРеквизит = СтрЗаменить(ТекущийРеквизит, ТекстыДляЗамены.ДляПоиска, ТекстыДляЗамены.ДляЗамены); + КонецЕсли; + КонецЕсли; + ПолучательПеретаскиваемогоЗначения = Неопределено; +КонецПроцедуры + +&НаКлиенте +Функция ПолучитьИмяТекущейТаблицы() + Для Каждого ПодключенныйСписокПолей Из ЭтотОбъект.ПодключенныеСпискиПолей Цикл + Если ПодключенныйСписокПолей.ИмяСпискаПолей <> ИмяСпискаОператоров() Тогда + Если Элементы[ПодключенныйСписокПолей.ИмяСпискаПолей].ТекущиеДанные <> Неопределено + И Элементы[ПодключенныйСписокПолей.ИмяСпискаПолей].ТекущиеДанные.Таблица Тогда + Возврат Элементы[ПодключенныйСписокПолей.ИмяСпискаПолей].ТекущиеДанные.ПутьКДанным; + КонецЕсли; + КонецЕсли; + КонецЦикла; + Возврат Неопределено; +КонецФункции + +&НаСервере +Процедура ЗаписатьМакетыНаДополнительныхЯзыках() + + ПараметрыМакета = Новый Структура; + ПараметрыМакета.Вставить("ИдентификаторКопируемогоМакета", ИдентификаторКопируемогоМакета); + ПараметрыМакета.Вставить("ТекущийЯзык", ТекущийЯзык); + ПараметрыМакета.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); + ПараметрыМакета.Вставить("ИдентификаторМакета", ИдентификаторМакета); + ПараметрыМакета.Вставить("ВладелецМакета", ВладелецМакета); + ПараметрыМакета.Вставить("ИмяДокумента", ИмяДокумента); + ПараметрыМакета.Вставить("СсылкаМакета", СсылкаМакета); + ПараметрыМакета.Вставить("ТипМакета", "MXL"); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ЗаписатьМакетыНаДополнительныхЯзыках(ПараметрыМакета); + КонецЕсли; + +КонецПроцедуры + &НаСервере Функция ПодготовитьМакетДляЗаписи(УстановитьКодЯзыка = Истина, Отказ = Ложь) @@ -2087,15 +2480,18 @@ ОписаниеМакета.ИмяОбъектаМетаданныхМакета = ИдентификаторМакета; ОписаниеМакета.АдресМакетаВоВременномХранилище = АдресМакетаВоВременномХранилище; ОписаниеМакета.КодЯзыка = ТекущийЯзык; - ОписаниеМакета.Владелец = ВладелецМакета; ОписаниеМакета.Наименование = ИмяДокумента; ОписаниеМакета.Ссылка = СсылкаМакета; ОписаниеМакета.ТипМакета = "MXL"; + ОписаниеМакета.ИсточникиДанных = ИсточникиДанных.ВыгрузитьЗначения(); ИдентификаторМакета = МодульУправлениеПечатью.ЗаписатьМакет(ОписаниеМакета); Если Не ЗначениеЗаполнено(СсылкаМакета) Тогда СсылкаМакета = МодульУправлениеПечатью.СсылкаМакета(ИдентификаторМакета); КонецЕсли; + + ЗаписатьМакетыНаДополнительныхЯзыках(); + Если Не Элементы.Язык.Доступность Тогда Элементы.Язык.Доступность = Истина; КонецЕсли; @@ -2114,6 +2510,7 @@ ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ФорматПоУмолчанию", Новый ОписаниеТипов("Строка"), ИмяСпискаПолей())); ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("КнопкаНастройкиФормата", Новый ОписаниеТипов("Число"), ИмяСпискаПолей())); ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Значение", Новый ОписаниеТипов, ИмяСпискаПолей())); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Общее", Новый ОписаниеТипов("Булево"), ИмяСпискаПолей())); ИзменитьРеквизиты(ДобавляемыеРеквизиты); @@ -2136,6 +2533,7 @@ КолонкаОбразец.Заголовок = НСтр("ru = 'Образец'"); КолонкаОбразец.УстановитьДействие("ПриИзменении", "Подключаемый_ОбразецПриИзменении"); КолонкаОбразец.ОтображатьВПодвале = Ложь; + КолонкаОбразец.КнопкаОчистки = Истина; КнопкаНастройкиФормата = Элементы.Добавить(ИмяСпискаПолей() + "КнопкаНастройкиФормата", Тип("ПолеФормы"), СписокПолей); КнопкаНастройкиФормата.ПутьКДанным = ИмяСпискаПолей() + "." + "КнопкаНастройкиФормата"; @@ -2147,24 +2545,11 @@ КнопкаНастройкиФормата.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; КнопкаНастройкиФормата.ГиперссылкаЯчейки = Истина; КнопкаНастройкиФормата.ОтображатьВПодвале = Ложь; - + УстановитьПримерыЗначений(); УстановитьФорматЗначенийПоУмолчанию(); - - КоллекцияПолей = ЭтотОбъект[ИмяСпискаПолей()].ПолучитьЭлементы(); // ДанныеФормыКоллекцияЭлементовДерева - Смещение = 0; - Для Каждого ОписаниеПоля Из КоллекцияПолей Цикл - Если ОписаниеПоля.ПутьКДанным = "Ссылка" Тогда - ОписаниеПоля.ПолучитьЭлементы().Очистить(); - ОписаниеПоля.Заголовок = НСтр("ru = 'Образец'"); - Если Смещение <> 0 Тогда - Индекс = КоллекцияПолей.Индекс(ОписаниеПоля); - КоллекцияПолей.Сдвинуть(Индекс, Смещение); - КонецЕсли; - Прервать; - КонецЕсли; - Смещение = Смещение - 1; - КонецЦикла; + НастроитьПолеОбразец(); + ОтметитьОбщиеПоля(); Для Каждого ЭлементОформления Из УсловноеОформление.Элементы Цикл Для Каждого ОформляемоеПоле Из ЭлементОформления.Поля.Элементы Цикл @@ -2178,22 +2563,46 @@ КонецЦикла; КонецЦикла; + // Цвет полей, не являющихся общими для выбранных объектов + + ЭлементОформления = УсловноеОформление.Элементы.Добавить(); + + ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); + ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей()); + + ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей() + ".Общее"); + ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбора.ПравоеЗначение = Ложь; + + ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); + КонецПроцедуры &НаКлиенте Процедура Подключаемый_ДоступныеПоляПриАктивизацииСтроки(Элемент) ТекущиеДанные = Элементы[ИмяСпискаПолей()].ТекущиеДанные; - + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + Если ТекущиеДанные.ПолучитьРодителя() = Неопределено Тогда Элементы["СтрокаПоиска" + ИмяСпискаПолей()].ПодсказкаВвода = ПодсказкаВводаСтрокиПоискаСпискаПолей(); Иначе Элементы["СтрокаПоиска" + ИмяСпискаПолей()].ПодсказкаВвода = ТекущиеДанные.ПредставлениеПутиКДанным; КонецЕсли; -#Если Не ВебКлиент Тогда - ПодключитьОбработчикОжидания("ПодсветитьЯчейкиСВыбраннымПолем", 0.1, Истина); -#КонецЕсли + СистемнаяИнформация = Новый СистемнаяИнформация; + ВерсияПлатформы = СистемнаяИнформация.ВерсияПриложения; + + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияПлатформы, "8.3.23.838") >= 0 Тогда + ПодключитьОбработчикОжидания("ПодсветитьЯчейкиСВыбраннымПолем", 0.1, Истина); + Иначе + #Если Не ВебКлиент Тогда + ПодключитьОбработчикОжидания("ПодсветитьЯчейкиСВыбраннымПолем", 0.1, Истина); + #КонецЕсли + КонецЕсли; КонецПроцедуры @@ -2208,7 +2617,6 @@ ПолеВвода = Элементы[ИмяСпискаПолей() + "Образец"]; ВыбранноеПоле = МодульКонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект, ИмяСпискаПолей()); ПолеВвода.ОграничениеТипа = ВыбранноеПоле.Тип; - КонецЕсли; КонецПроцедуры @@ -2384,13 +2792,34 @@ МодульУправлениеПечатью.УдалитьМакет(ИдентификаторМакета, ТекущийЯзык); КонецЕсли; + МенюЯзык = Элементы.Язык; + ДобавляемыеЯзыки = Элементы.ДобавляемыеЯзыки; + ЯзыкУдаляемойФормы = ТекущийЯзык; ТекущийЯзык = ОбщегоНазначения.КодОсновногоЯзыка(); + Для Каждого КнопкаЯзыка Из МенюЯзык.ПодчиненныеЭлементы Цикл + Если СтрЗаканчиваетсяНа(КнопкаЯзыка.Имя, ЯзыкУдаляемойФормы) Тогда + КнопкаЯзыка.Пометка = Ложь; + КнопкаЯзыка.Видимость = Ложь; + КонецЕсли; + + Если СтрЗаканчиваетсяНа(КнопкаЯзыка.Имя, ТекущийЯзык) Тогда + КнопкаЯзыка.Пометка = Истина; + КонецЕсли; + КонецЦикла; + + Для Каждого КнопкаДобавляемогоЯзыка Из ДобавляемыеЯзыки.ПодчиненныеЭлементы Цикл + Если СтрЗаканчиваетсяНа(КнопкаДобавляемогоЯзыка.Имя, ЯзыкУдаляемойФормы) Тогда + КнопкаДобавляемогоЯзыка.Видимость = Истина; + КонецЕсли; + КонецЦикла; + + Элементы.Язык.Заголовок = Элементы["Язык_"+ТекущийЯзык].Заголовок; + ЗагрузитьТабличныйДокументИзМетаданных(ТекущийЯзык); - Если ЗначениеЗаполнено(ВладелецМакета) Тогда - ТабличныйДокумент = ПрочитатьМакет(); + Если ЭтоПечатнаяФорма Тогда + ЗаполнитьТабличныйДокумент(ТабличныйДокумент, ПрочитатьМакет()); КонецЕсли; - Элементы.Язык.Заголовок = Элементы["Язык_" + ТекущийЯзык].Заголовок; Модифицированность = Ложь; КонецПроцедуры @@ -2419,8 +2848,14 @@ ПолноеИмяФайла = ВыбранныеФайлы[0]; - ДвоичныеДанные = Новый ДвоичныеДанные(ПолноеИмяФайла); - ТабличныйДокумент = ПрочитатьМакет(ДвоичныеДанные); + ОписаниеОповещения = Новый ОписаниеОповещения("ПродолжитьЗагрузкуИзФайлаПослеПолученияДанных", ЭтотОбъект); + НачатьСозданиеДвоичныхДанныхИзФайла(ОписаниеОповещения, ПолноеИмяФайла); +КонецПроцедуры + +&НаКлиенте +Процедура ПродолжитьЗагрузкуИзФайлаПослеПолученияДанных(ДвоичныеДанные, ДополнительныеПараметры) Экспорт + + ЗаполнитьТабличныйДокумент(ТабличныйДокумент, ПрочитатьМакет(ДвоичныеДанные)); Модифицированность = Истина; КонецПроцедуры @@ -2472,5 +2907,165 @@ #КонецОбласти +&НаКлиенте +Процедура ПриВыбореВладельцевМакета(Результат, ДополнительныеПараметры) Экспорт + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + ИсточникиДанных.ЗагрузитьЗначения(Результат.ВыгрузитьЗначения()); + Элементы.ТекстНазначение.Заголовок = ПредставлениеИсточниковДанных(ИсточникиДанных); + ОбновитьСписокДоступныхПолей(); + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Функция ПредставлениеИсточниковДанных(ИсточникиДанных) + + Значения = Новый Массив; + Для Каждого Элемент Из ИсточникиДанных Цикл + Значения.Добавить(Элемент.Значение); + КонецЦикла; + + Результат = СтрСоединить(Значения, ", "); + Если Не ЗначениеЗаполнено(Результат) Тогда + Результат = "<" + НСтр("ru = 'не выбрано'") + ">"; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Функция ОбъектыСКомандамиПечати() + + ОбъектыСКомандамиПечати = Новый СписокЗначений; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + Для Каждого ОбъектМетаданных Из МодульУправлениеПечатью.ИсточникиКомандПечати() Цикл + ОбъектыСКомандамиПечати.Добавить(ОбъектМетаданных.ПолноеИмя()); + КонецЦикла; + КонецЕсли; + + Возврат ОбъектыСКомандамиПечати; + +КонецФункции + +&НаСервере +Процедура ОбновитьСписокДоступныхПолей() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ОбновитьСписокДоступныхПолей(ЭтотОбъект, + КоллекцииПолей(ИсточникиДанных.ВыгрузитьЗначения()), ИмяСпискаПолей()); + + НастроитьПолеОбразец(); + ОтметитьОбщиеПоля(); + УстановитьФорматЗначенийПоУмолчанию(); + + Если ИсточникиДанных.Количество() > 0 Тогда + ИсточникДанных = ИсточникиДанных[0].Значение; + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ИсточникДанных); + ПодобратьОбразец(ОбъектМетаданных); + УстановитьПримерыЗначений(); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура НастроитьПолеОбразец() + + КоллекцияПолей = ЭтотОбъект[ИмяСпискаПолей()].ПолучитьЭлементы(); // ДанныеФормыКоллекцияЭлементовДерева + Смещение = 0; + Для Каждого ОписаниеПоля Из КоллекцияПолей Цикл + Если ОписаниеПоля.ПутьКДанным = "Ссылка" Тогда + ОписаниеПоля.Заголовок = НСтр("ru = 'Образец'"); + Если Смещение <> 0 Тогда + Индекс = КоллекцияПолей.Индекс(ОписаниеПоля); + КоллекцияПолей.Сдвинуть(Индекс, Смещение); + КонецЕсли; + Прервать; + КонецЕсли; + Смещение = Смещение - 1; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Функция ОбщиеПоляИсточниковДанных() + + ОбщиеПоляИсточниковДанных = Новый Массив; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + ОбщиеПоляИсточниковДанных = МодульУправлениеПечатью.ОбщиеПоляИсточниковДанных(ИсточникиДанных.ВыгрузитьЗначения()); + КонецЕсли; + + Возврат ОбщиеПоляИсточниковДанных; + +КонецФункции + +&НаСервере +Процедура ОтметитьОбщиеПоля(Знач КоллекцияПолей = Неопределено, Знач ОбщиеПоля = Неопределено) + + Если КоллекцияПолей = Неопределено Тогда + КоллекцияПолей = ЭтотОбъект[ИмяСпискаПолей()]; + КонецЕсли; + + Если ОбщиеПоля = Неопределено Тогда + ОбщиеПоля = ОбщиеПоляИсточниковДанных(); + КонецЕсли; + + Для Каждого ОписаниеПоля Из КоллекцияПолей.ПолучитьЭлементы() Цикл + Если ОписаниеПоля.Папка И ОписаниеПоля.Поле = Новый ПолеКомпоновкиДанных("ОбщиеРеквизиты") + Или ОписаниеПоля.ПолучитьРодителя() <> Неопределено И ОписаниеПоля.ПолучитьРодителя().Поле = Новый ПолеКомпоновкиДанных("ОбщиеРеквизиты") Тогда + ОписаниеПоля.Общее = Истина; + УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(ОписаниеПоля); + Продолжить; + КонецЕсли; + + Если ОбщиеПоля.Найти(ОписаниеПоля.Поле) <> Неопределено Тогда + ОписаниеПоля.Общее = Истина; + Если Не ОписаниеПоля.Папка И Не ОписаниеПоля.Таблица Тогда + УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(ОписаниеПоля); + КонецЕсли; + КонецЕсли; + Если ОписаниеПоля.Общее И (ОписаниеПоля.Папка Или ОписаниеПоля.Таблица) Тогда + ОтметитьОбщиеПоля(ОписаниеПоля, ОбщиеПоля); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(КоллекцияПолей) + + Для Каждого ОписаниеПоля Из КоллекцияПолей.ПолучитьЭлементы() Цикл + ОписаниеПоля.Общее = КоллекцияПолей.Общее; + УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(ОписаниеПоля); + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьДоступностьРекурсивно(Элемент, Доступность = Неопределено) + Если Доступность = Неопределено Тогда + Доступность = Элемент.Доступность; + КонецЕсли; + + Для Каждого ПодчиненныйЭлемент Из Элемент.ПодчиненныеЭлементы Цикл + Если ТипЗнч(ПодчиненныйЭлемент) = Тип("КнопкаФормы") И ПодчиненныйЭлемент.ИмяКоманды <> "" Тогда + ПодчиненныйЭлемент.Доступность = Доступность; + КонецЕсли; + + Если ТипЗнч(ПодчиненныйЭлемент) = Тип("ГруппаФормы") Тогда + УстановитьДоступностьРекурсивно(ПодчиненныйЭлемент, Доступность); + КонецЕсли; + КонецЦикла; +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonForms/РезультатПроверки/Module.bsl b/SSL/src/CommonForms/РезультатПроверки/Module.bsl index c99eff819..1905aad3c 100644 --- a/SSL/src/CommonForms/РезультатПроверки/Module.bsl +++ b/SSL/src/CommonForms/РезультатПроверки/Module.bsl @@ -10,6 +10,8 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Элементы.Инструкция.Видимость = + ЭлектроннаяПодписьСлужебный.ВидимостьСсылкиНаИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами(); Элементы.ЗаголовокПредупреждения.Заголовок = Параметры.ЗаголовокПредупреждения; ТекстПредупреждения = Параметры.ТекстПредупреждения; КонецПроцедуры diff --git a/SSL/src/CommonForms/СвязанныеДокументы/Form.form b/SSL/src/CommonForms/СвязанныеДокументы/Form.form index 653a1bc1f..9b5244b6a 100644 --- a/SSL/src/CommonForms/СвязанныеДокументы/Form.form +++ b/SSL/src/CommonForms/СвязанныеДокументы/Form.form @@ -76,7 +76,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/CommonForms/СвязанныеДокументы/Module.bsl b/SSL/src/CommonForms/СвязанныеДокументы/Module.bsl index b10ca8783..0d2a19c62 100644 --- a/SSL/src/CommonForms/СвязанныеДокументы/Module.bsl +++ b/SSL/src/CommonForms/СвязанныеДокументы/Module.bsl @@ -90,7 +90,6 @@ ////////////////////////////////////////////////////////////////////////////////////////////// // Процедуры вывода в табличный документ. -// Выводит дерево подчиненности в табличный документ. &НаСервере Процедура ВывестиТабличныйДокумент() @@ -107,9 +106,9 @@ // Выводит строки дерева родительских объектов. // // Параметры: -// СтрокиДерева - ДанныеФормыКоллекцияЭлементовДерева - строки дерева которые выводятся в табличный документ. -// Макет - ТабличныйДокумент - макет, на основании которого происходит вывод в табличный документ. -// УровниРекурсии - Число - уровень рекурсии процедуры. +// СтрокиДерева - ДанныеФормыКоллекцияЭлементовДерева +// Макет - ТабличныйДокумент +// УровниРекурсии - Число // &НаСервере Процедура ВывестиРодительскиеЭлементыДерева(СтрокиДерева, Макет, УровниРекурсии = 1) @@ -150,8 +149,7 @@ КонецЦикла; - ВывестиПредставлениеИКартинку(ТекущаяСтрокаДерева, Макет, Ложь, Ложь); - + ВывестиПредставлениеИКартинку(ТекущаяСтрокаДерева, Макет, Ложь, Ложь); Счетчик = Счетчик - 1; КонецЦикла; @@ -311,12 +309,12 @@ // Выводит в табличный документ строку с документом, для которого формируется структура подчиненности. // // Параметры: -// Макет - ТабличныйДокумент - макет, на основании которого формируется табличный документ. +// Макет - ТабличныйДокумент // &НаСервере Процедура ВывестиТекущийОбъект(Макет) - Выборка = ПолучитьВыборкуПоРеквизитамОбъекта(ОсновнойОбъект); + Выборка = ЗапросПоРеквизитамОбъектов(ОсновнойОбъект).Выполнить().Выбрать(); Если Выборка.Следующий() Тогда ПереопределяемоеПредставление = ПредставлениеОбъектаДляВывода(Выборка); @@ -364,12 +362,10 @@ КонецФункции -// Выводит строки дерева подчиненных документов. -// // Параметры: -// СтрокиДерева - ДанныеФормыКоллекцияЭлементовДерева - строки дерева которые выводятся в табличный документ. -// Макет - ТабличныйДокумент - макет, на основании которого происходит вывод в табличный документ. -// УровниРекурсии - Число - уровень рекурсии процедуры. +// СтрокиДерева - ДанныеФормыКоллекцияЭлементовДерева +// Макет - ТабличныйДокумент +// УровниРекурсии - Число // &НаСервере Процедура ВывестиПодчиненныеЭлементыДерева(СтрокиДерева, Макет, УровниРекурсии = 1) @@ -410,8 +406,7 @@ КонецЦикла; - ВывестиПредставлениеИКартинку(СтрокаДерева, Макет, Ложь, Истина); - + ВывестиПредставлениеИКартинку(СтрокаДерева, Макет, Ложь, Истина); ВывестиПодчиненныеЭлементыДерева(ПодчиненныеЭлементыДерева, Макет, УровниРекурсии + 1); КонецЦикла; @@ -478,56 +473,94 @@ КонецФункции -// Получает выборку по реквизитам документа. -// // Параметры: -// ТекущийОбъект - ДокументСсылка -// - СправочникСсылка -// - ПланВидовХарактеристикСсылка - ссылка на объект, значения реквизитов которого получаются запросом. +// СписокОбъектов - Массив +// - ДокументСсылка +// - СправочникСсылка +// - ПланВидовХарактеристикСсылка // // Возвращаемое значение: -// ВыборкаИзРезультатаЗапроса +// Запрос // &НаСервере -Функция ПолучитьВыборкуПоРеквизитамОбъекта(ТекущийОбъект) +Функция ЗапросПоРеквизитамОбъектов(СписокОбъектов) - МетаданныеОбъекта = ТекущийОбъект.Метаданные(); - - ТекстЗапроса = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | Ссылка, - | &Проведен КАК Проведен, - | ПометкаУдаления, - | &Сумма КАК СуммаДокумента, - | &Валюта КАК Валюта, - | &Представление - |ИЗ - | &ИмяТаблицы - |ГДЕ - | Ссылка = &Ссылка - |"; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", МетаданныеОбъекта.ПолноеИмя()); - Если ОбщегоНазначения.ЭтоДокумент(МетаданныеОбъекта) Тогда - ИмяРеквизитаСумма = ИмяРеквизитаДокумента(МетаданныеОбъекта, "СуммаДокумента"); - ИмяРеквизитаВалюта = ИмяРеквизитаДокумента(МетаданныеОбъекта, "Валюта"); - ИмяРеквизитаПроведен = "Проведен"; + ОбъектыПоТипу = Новый Соответствие; + Если ТипЗнч(СписокОбъектов) = Тип("Массив") Тогда + Для каждого ТекущийОбъект Из СписокОбъектов Цикл + Объекты = ОбъектыПоТипу[ТекущийОбъект.Метаданные()]; + Если Объекты = Неопределено Тогда + Объекты = Новый Массив; + ОбъектыПоТипу[ТекущийОбъект.Метаданные()] = Объекты; + КонецЕсли; + Объекты.Добавить(ТекущийОбъект); + КонецЦикла; Иначе - ИмяРеквизитаСумма = Неопределено; - ИмяРеквизитаВалюта = Неопределено; - ИмяРеквизитаПроведен = "Ложь"; + ОбъектыПоТипу[СписокОбъектов.Метаданные()] = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СписокОбъектов); КонецЕсли; - ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеОбъекта, "&Проведен", ИмяРеквизитаПроведен, Истина); - ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеОбъекта, "&Сумма", ИмяРеквизитаСумма); - ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеОбъекта, "&Валюта", ИмяРеквизитаВалюта); + Запрос = Новый Запрос; + ТекстыЗапросов = Новый Массив; - МассивДопРеквизитов = РеквизитыДляПредставления(МетаданныеОбъекта.ПолноеИмя(), МетаданныеОбъекта.Имя); - ДополнитьТекстЗапросаПоРеквизитамОбъекта(ТекстЗапроса, МассивДопРеквизитов); + Для каждого ТипОбъекта Из ОбъектыПоТипу Цикл + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | &Дата КАК Дата, + | Ссылка, + | &Проведен КАК Проведен, + | ПометкаУдаления, + | &Сумма КАК СуммаДокумента, + | &Валюта КАК Валюта, + | &Представление + |ИЗ + | &ИмяТаблицы + |ГДЕ + | Ссылка В (&Ссылка) + |"; + + МетаданныеОбъекта = ТипОбъекта.Ключ; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", МетаданныеОбъекта.ПолноеИмя()); + Если ОбщегоНазначения.ЭтоДокумент(МетаданныеОбъекта) Тогда + ИмяРеквизитаСумма = ИмяРеквизитаДокумента(МетаданныеОбъекта, "СуммаДокумента"); + ИмяРеквизитаВалюта = ИмяРеквизитаДокумента(МетаданныеОбъекта, "Валюта"); + ИмяРеквизитаПроведен = "Проведен"; + ИмяРеквизитаДата = "Дата"; + Иначе + ИмяРеквизитаСумма = Неопределено; + ИмяРеквизитаВалюта = Неопределено; + ИмяРеквизитаПроведен = "Ложь"; + ИмяРеквизитаДата = "Ложь"; + КонецЕсли; + + ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеОбъекта, "&Дата", ИмяРеквизитаДата, Истина); + ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеОбъекта, "&Проведен", ИмяРеквизитаПроведен, Истина); + ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеОбъекта, "&Сумма", ИмяРеквизитаСумма); + ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеОбъекта, "&Валюта", ИмяРеквизитаВалюта); + + ДопРеквизиты = РеквизитыДляПредставления(МетаданныеОбъекта.ПолноеИмя(), МетаданныеОбъекта.Имя); + ТекстПредставление = "Представление КАК Представление"; // @query-part + Для Индекс = 1 По 3 Цикл + ТекстПредставление = ТекстПредставление + ", + | " + ?(ДопРеквизиты.Количество() >= Индекс, ДопРеквизиты[Индекс - 1], "NULL") + + " КАК ДополнительныйРеквизит" + Индекс; // @query-part + КонецЦикла; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Представление", ТекстПредставление); + + ИмяПараметра = "Ссылка" + СтрЗаменить(МетаданныеОбъекта.ПолноеИмя(), ".", "_"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Ссылка", "&" + ИмяПараметра); + Запрос.УстановитьПараметр(ИмяПараметра, ТипОбъекта.Значение); + + Если ТекстыЗапросов.Количество() > 0 Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); // @query-part-1, @query-part-2 + КонецЕсли; + + ТекстыЗапросов.Добавить(ТекстЗапроса); + + КонецЦикла; - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("Ссылка", ТекущийОбъект); - Возврат Запрос.Выполнить().Выбрать(); + Запрос.Текст = СтрСоединить(ТекстыЗапросов, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС); // @query-part + Возврат Запрос; КонецФункции @@ -536,7 +569,7 @@ СлужебныеОбъекты = Неопределено, ИндексСвязейОбъектов = Неопределено) МетаданныеОбъекта = ТекущийОбъект.Метаданные(); - СписокРеквизитов = Новый СписокЗначений; + СписокРеквизитов = Новый Массив; Если СлужебныеОбъекты = Неопределено Тогда СлужебныеОбъекты = Новый Соответствие; @@ -554,19 +587,8 @@ Для Каждого ТекущийТип Из Реквизит.Тип.Типы() Цикл - МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип); - Если МетаданныеРеквизита = Неопределено Тогда - Продолжить; - КонецЕсли; - - Если Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(МетаданныеРеквизита) - Или Не ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда - Продолжить; - КонецЕсли; - - Если Не Метаданные.Документы.Содержит(МетаданныеРеквизита) - И Не Метаданные.Справочники.Содержит(МетаданныеРеквизита) - И Не Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеРеквизита) Тогда + МетаданныеРеквизита = МетаданныеТипаРеквизита(ТекущийТип); + Если МетаданныеРеквизита.Метаданные = Неопределено Тогда Продолжить; КонецЕсли; @@ -574,53 +596,32 @@ Если ЗначениеЗаполнено(ЗначениеРеквизита) И ТипЗнч(ЗначениеРеквизита) = ТекущийТип И ЗначениеРеквизита <> ТекущийОбъект - И СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда - - ЯвляетсяДокументом = ОбщегоНазначения.ЭтоДокумент(МетаданныеРеквизита); - - Если ЯвляетсяДокументом Тогда - ДатаДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЗначениеРеквизита, "Дата", Истина); - СписокРеквизитов.Добавить(ЗначениеРеквизита, Формат(ДатаДокумента, "ДЛФ=DT")); - Иначе - СписокРеквизитов.Добавить(ЗначениеРеквизита, Дата(1,1,1)); - КонецЕсли; + И СписокРеквизитов.Найти(ЗначениеРеквизита) = Неопределено Тогда + СписокРеквизитов.Добавить(ЗначениеРеквизита); КонецЕсли; КонецЦикла; КонецЦикла; - Для Каждого ТЧ Из МетаданныеОбъекта.ТабличныеЧасти Цикл + Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.ТабличныеЧасти Цикл ИменаРеквизитов = ""; - СодержимоеТЧ = ТекущийОбъект[ТЧ.Имя].Выгрузить(); // ТаблицаЗначений - Для Каждого Реквизит Из ТЧ.Реквизиты Цикл + СодержимоеТЧ = ТекущийОбъект[ТабличнаяЧасть.Имя].Выгрузить(); // ТаблицаЗначений + Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл Если Не Метаданные.КритерииОтбора.СвязанныеДокументы.Состав.Содержит(Реквизит) Тогда Продолжить; КонецЕсли; Для Каждого ТекущийТип Из Реквизит.Тип.Типы() Цикл - - МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип); - Если МетаданныеРеквизита = Неопределено Тогда + МетаданныеРеквизита = МетаданныеТипаРеквизита(ТекущийТип); + Если МетаданныеРеквизита.Метаданные = Неопределено Тогда Продолжить; КонецЕсли; - - Если Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(МетаданныеРеквизита) - Или Не ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда - Продолжить; - КонецЕсли; - - Если Не Метаданные.Документы.Содержит(МетаданныеРеквизита) - И Не Метаданные.Справочники.Содержит(МетаданныеРеквизита) - И Не Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеРеквизита) Тогда - Продолжить; - КонецЕсли; - + ИменаРеквизитов = ИменаРеквизитов + ?(ИменаРеквизитов = "", "", ", ") + Реквизит.Имя; Прервать; - КонецЦикла; КонецЦикла; @@ -631,83 +632,96 @@ Для Каждого СтрокаТЧ Из СодержимоеТЧ Цикл ЗначениеРеквизита = СтрокаТЧ[КолонкаТЧ.Имя]; - МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеРеквизита)); - Если МетаданныеЗначения = Неопределено Тогда - Продолжить; - КонецЕсли; - - Если Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(МетаданныеЗначения) - Или Не ПравоДоступа("Чтение", МетаданныеЗначения) Тогда + МетаданныеЗначения = МетаданныеТипаРеквизита(ТипЗнч(ЗначениеРеквизита)); + Если МетаданныеЗначения.Метаданные = Неопределено Тогда Продолжить; КонецЕсли; Если ЗначениеРеквизита = ТекущийОбъект - Или СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) <> Неопределено Тогда + Или СписокРеквизитов.Найти(ЗначениеРеквизита) <> Неопределено Тогда Продолжить; КонецЕсли; - ЯвляетсяДокументом = ОбщегоНазначения.ЭтоДокумент(МетаданныеЗначения); - Если Не ЯвляетсяДокументом И Не Метаданные.Справочники.Содержит(МетаданныеЗначения) - И Не Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеЗначения) Тогда - Продолжить; - КонецЕсли; - - Если ЯвляетсяДокументом Тогда - ДатаДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЗначениеРеквизита, "Дата", Истина); - СписокРеквизитов.Добавить(ЗначениеРеквизита, Формат(ДатаДокумента, "ДЛФ=DT")); - Иначе - СписокРеквизитов.Добавить(ЗначениеРеквизита, Дата(1, 1, 1)); - КонецЕсли; - + СписокРеквизитов.Добавить(ЗначениеРеквизита); КонецЦикла; КонецЦикла; КонецЦикла; - СписокРеквизитов.СортироватьПоПредставлению(); - - Для каждого ЭлементСписка Из СписокРеквизитов Цикл - - Выборка = ПолучитьВыборкуПоРеквизитамОбъекта(ЭлементСписка.Значение); - - Если Выборка.Следующий() Тогда + Если СписокРеквизитов.Количество() > 0 Тогда + ВыводимыеОбъекты = ЗапросПоРеквизитамОбъектов(СписокРеквизитов).Выполнить().Выгрузить(); + ВыводимыеОбъекты.Сортировать("Дата"); + Для каждого ВыводимыйОбъект Из ВыводимыеОбъекты Цикл - Если ИндексСвязейОбъектов[ТекущийОбъект] = Выборка.Ссылка Тогда + Если ИндексСвязейОбъектов[ТекущийОбъект] = ВыводимыйОбъект.Ссылка Тогда Продолжить; КонецЕсли; - ИндексСвязейОбъектов.Вставить(ТекущийОбъект, Выборка.Ссылка); - - НоваяСтрока = ДобавитьСтрокуВДерево(ДеревоРодитель, Выборка, ВыведенныеОбъекты); + ИндексСвязейОбъектов[ТекущийОбъект] = ВыводимыйОбъект.Ссылка; + НоваяСтрока = ДобавитьСтрокуВДерево(ДеревоРодитель, ВыводимыйОбъект, ВыведенныеОбъекты); Если НоваяСтрока <> Неопределено - И Не ДобавляемыйОбъектИмеетсяСредиРодителей(ДеревоРодитель, ЭлементСписка.Значение) Тогда + И Не ДобавляемыйОбъектИмеетсяСредиРодителей(ДеревоРодитель, ВыводимыйОбъект.Ссылка) Тогда - ВывестиРодительскиеОбъекты(ЭлементСписка.Значение, НоваяСтрока, ВыведенныеОбъекты, + // @skip-check query-in-loop - Рекурсивный алгоритм обработки дерева. + ВывестиРодительскиеОбъекты(ВыводимыйОбъект.Ссылка, НоваяСтрока, ВыведенныеОбъекты, СлужебныеОбъекты, ИндексСвязейОбъектов); - ИначеЕсли СлужебныеОбъекты[ЭлементСписка.Значение] = Неопределено Тогда + ИначеЕсли СлужебныеОбъекты[ВыводимыйОбъект.Ссылка] = Неопределено Тогда - СлужебныеОбъекты.Вставить(ЭлементСписка.Значение, Истина); - ВывестиРодительскиеОбъекты(ЭлементСписка.Значение, ДеревоРодитель, ВыведенныеОбъекты, + СлужебныеОбъекты[ВыводимыйОбъект.Ссылка] = Истина; + // @skip-check query-in-loop - Рекурсивный алгоритм обработки дерева. + ВывестиРодительскиеОбъекты(ВыводимыйОбъект.Ссылка, ДеревоРодитель, ВыведенныеОбъекты, СлужебныеОбъекты, ИндексСвязейОбъектов); КонецЕсли; - КонецЕсли; - - КонецЦикла; + КонецЦикла; + КонецЕсли; КонецПроцедуры -// Определяет наличие документа среди родителей строки дерева, которая возможно будет добавлена. +// Параметры: +// ТипРеквизита - Тип +// +// Возвращаемое значение: +// Структура: +// * Метаданные - ОбъектМетаданных +// * ЭтоДокумент - Булево +// +&НаСервереБезКонтекста +Функция МетаданныеТипаРеквизита(ТипРеквизита) + + Результат = Новый Структура("Метаданные, ЭтоДокумент", Неопределено, Ложь); + + МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТипРеквизита); + Если МетаданныеРеквизита = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + Если Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(МетаданныеРеквизита) + Или Не ПравоДоступа("Просмотр", МетаданныеРеквизита) Тогда + Возврат Результат; + КонецЕсли; + + Результат.ЭтоДокумент = Метаданные.Документы.Содержит(МетаданныеРеквизита); + Если Не Результат.ЭтоДокумент + И Не Метаданные.Справочники.Содержит(МетаданныеРеквизита) + И Не Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеРеквизита) Тогда + Возврат Результат; + КонецЕсли; + Результат.Метаданные = МетаданныеРеквизита; + Возврат Результат; + +КонецФункции + +// Определяет наличие документа среди родителей строки дерева. // // Параметры: // СтрокаРодитель - ДанныеФормыДерево -// - ДанныеФормыЭлементДерева - родитель, для -// которого предполагается добавить строку дерева. -// ИскомыйОбъект - ЛюбаяСсылка - ссылка на объект метаданных, на наличие которого выполняется проверка. +// - ДанныеФормыЭлементДерева +// ИскомыйОбъект - ЛюбаяСсылка // // Возвращаемое значение: -// Булево - Истина если найден, Ложь в обратном случае. +// Булево // &НаСервере Функция ДобавляемыйОбъектИмеетсяСредиРодителей(СтрокаРодитель, ИскомыйОбъект) @@ -721,15 +735,11 @@ КонецЕсли; ТекущийРодитель = СтрокаРодитель; - Пока ТекущийРодитель <> Неопределено Цикл - Если ТекущийРодитель.Ссылка = ИскомыйОбъект Тогда Возврат Истина; КонецЕсли; - ТекущийРодитель = ТекущийРодитель.ПолучитьРодителя(); - КонецЦикла; Возврат Ложь; @@ -744,65 +754,6 @@ КонецПроцедуры -&НаСервере -Процедура ДополнитьКэшМетаданных(МетаданныеОбъекта, ИмяОбъекта, КэшРеквизитовОбъекта) - - РеквизитыДокумента = КэшРеквизитовОбъекта[ИмяОбъекта]; - Если РеквизитыДокумента = Неопределено Тогда - - РеквизитыДокумента = Новый Соответствие; - ЯвляетсяДокументом = ОбщегоНазначения.ЭтоДокумент(МетаданныеОбъекта); - - Если ЯвляетсяДокументом Тогда - - ИмяРеквизитаСуммаДокумента = ИмяРеквизитаДокумента(МетаданныеОбъекта, "СуммаДокумента"); - - Если МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизитаСуммаДокумента) <> Неопределено Тогда - РеквизитыДокумента.Вставить("СуммаДокумента", ИмяРеквизитаСуммаДокумента); - Иначе - РеквизитыДокумента.Вставить("СуммаДокумента", "NULL"); - КонецЕсли; - - Иначе - - РеквизитыДокумента.Вставить("СуммаДокумента", "NULL"); - - КонецЕсли; - - Если ЯвляетсяДокументом Тогда - - ИмяРеквизитаВалюта = ИмяРеквизитаДокумента(МетаданныеОбъекта, "Валюта"); - - Если МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизитаВалюта) <> Неопределено Тогда - РеквизитыДокумента.Вставить("Валюта", ИмяРеквизитаВалюта); - Иначе - РеквизитыДокумента.Вставить("Валюта", "NULL"); - КонецЕсли; - - Иначе - - РеквизитыДокумента.Вставить("Валюта", "NULL"); - - КонецЕсли; - - Если ЯвляетсяДокументом Тогда - РеквизитыДокумента.Вставить("Проведен", "Проведен"); - Иначе - РеквизитыДокумента.Вставить("Проведен", "Ложь"); - КонецЕсли; - - Если ЯвляетсяДокументом Тогда - РеквизитыДокумента.Вставить("Дата", "Дата"); - Иначе - РеквизитыДокумента.Вставить("Дата", "NULL"); - КонецЕсли; - - КэшРеквизитовОбъекта.Вставить(ИмяОбъекта, РеквизитыДокумента); - - КонецЕсли; - -КонецПроцедуры - // Возвращает ссылки на связанные объекты. // // Возвращаемое значение: @@ -812,22 +763,70 @@ // &НаСервере Функция ОбъектыПоКритериюОтбора(ЗначениеКритерияОтбора) - - Если Не Метаданные.КритерииОтбора.СвязанныеДокументы.Тип.СодержитТип(ТипЗнч(ЗначениеКритерияОтбора)) Тогда - Возврат Неопределено; - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - - Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ - | СвязанныеДокументы.Ссылка + + ШаблонЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ПредставлениеТаблицы.Ссылка КАК Ссылка |ИЗ - | КритерийОтбора.СвязанныеДокументы(&ЗначениеКритерияОтбора) КАК СвязанныеДокументы"; - - Запрос.УстановитьПараметр("ЗначениеКритерияОтбора", ЗначениеКритерияОтбора); - Возврат Запрос.Выполнить().Выгрузить(); - + | ИмяТаблицы КАК ПредставлениеТаблицы + |ГДЕ + | ПредставлениеТаблицы.ИмяРеквизита = &ЗначениеКритерияОтбора"; + + ШаблонЗапросаОбъединения = "ВЫБРАТЬ + | ПредставлениеТаблицы.Ссылка КАК Ссылка + |ИЗ + | ИмяТаблицы КАК ПредставлениеТаблицы + |ГДЕ + | ПредставлениеТаблицы.ИмяРеквизита = &ЗначениеКритерияОтбора"; + + ЧастиЗапроса = Новый Массив; + ТекстЧастиЗапроса = ""; + + Для Каждого ЭлементСостава Из Метаданные.КритерииОтбора.СвязанныеДокументы.Состав Цикл + + Если НЕ ЭлементСостава.Тип.СодержитТип(ТипЗнч(ЗначениеКритерияОтбора)) Тогда + Продолжить; + КонецЕсли; + + ПутьКДанным = ЭлементСостава.ПолноеИмя(); + + Если СтрНайти(ПутьКДанным, "ТабличнаяЧасть") Тогда + ОбъектМетаданных = ЭлементСостава.Родитель().Родитель(); + Иначе + ОбъектМетаданных = ЭлементСостава.Родитель(); + КонецЕсли; + + Если НЕ ПравоДоступа("Чтение", ОбъектМетаданных) Тогда + Продолжить; + КонецЕсли; + + Точка = СтрНайти(ПутьКДанным, ".", НаправлениеПоиска.СКонца); + ИмяРеквизита = Сред(ПутьКДанным, Точка + 1); + + ИмяТаблицы = ЭлементСостава.Родитель().ПолноеИмя(); + ИмяТаблицы = СтрЗаменить(ИмяТаблицы, "ТабличнаяЧасть.", ""); + + Точка = СтрНайти(ИмяТаблицы, ".", НаправлениеПоиска.СКонца); + ПредставлениеТаблицы = Сред(ИмяТаблицы, Точка + 1); + + ТекстЧастиЗапроса = ?(ТекстЧастиЗапроса = "", ШаблонЗапроса, ШаблонЗапросаОбъединения); + ТекстЧастиЗапроса = СтрЗаменить(ТекстЧастиЗапроса, "ИмяТаблицы", ИмяТаблицы); + ТекстЧастиЗапроса = СтрЗаменить(ТекстЧастиЗапроса, "ПредставлениеТаблицы", ПредставлениеТаблицы); + ТекстЧастиЗапроса = СтрЗаменить(ТекстЧастиЗапроса, "ИмяРеквизита", ИмяРеквизита); + + ЧастиЗапроса.Добавить(ТекстЧастиЗапроса); + + КонецЦикла; + + Если ЧастиЗапроса.Количество() > 0 Тогда + Запрос = Новый Запрос; + Разделитель = Символы.ПС + "ОБЪЕДИНИТЬ" + Символы.ПС; + Запрос.Текст = СтрСоединить(ЧастиЗапроса, Разделитель); + Запрос.УстановитьПараметр("ЗначениеКритерияОтбора", ЗначениеКритерияОтбора); + Возврат Запрос.Выполнить().Выгрузить(); + Иначе + Возврат Новый ТаблицаЗначений; + КонецЕсли; + КонецФункции &НаСервере @@ -847,111 +846,46 @@ ИндексСвязейОбъектов = Новый Соответствие; КонецЕсли; - КэшПоТипамОбъектов = Новый Соответствие; - КэшРеквизитовОбъекта = Новый Соответствие; - + СписокОбъектов = Новый Массив; Для Каждого СтрокаТаблицы Из Таблица Цикл - ТекущаяСсылка = СтрокаТаблицы.Ссылка; // СправочникСсылка, ДокументСсылка - + ТекущаяСсылка = СтрокаТаблицы.Ссылка; // СправочникСсылка, ДокументСсылка МетаданныеОбъекта = ТекущаяСсылка.Метаданные(); - Если Не ПравоДоступа("Чтение", МетаданныеОбъекта) Тогда + Если Не ПравоДоступа("Просмотр", МетаданныеОбъекта) Тогда Продолжить; КонецЕсли; - ПолноеИмяОбъекта = МетаданныеОбъекта.ПолноеИмя(); - ДополнитьКэшМетаданных(МетаданныеОбъекта, ПолноеИмяОбъекта, КэшРеквизитовОбъекта); - - МассивСсылок = КэшПоТипамОбъектов[ПолноеИмяОбъекта]; - Если МассивСсылок = Неопределено Тогда - - МассивСсылок = Новый Массив; - КэшПоТипамОбъектов.Вставить(ПолноеИмяОбъекта, МассивСсылок); - - КонецЕсли; - - МассивСсылок.Добавить(ТекущаяСсылка); - + СписокОбъектов.Добавить(ТекущаяСсылка); КонецЦикла; - Если КэшПоТипамОбъектов.Количество() = 0 Тогда + Если СписокОбъектов.Количество() = 0 Тогда Возврат; КонецЕсли; + + ВыводимыеОбъекты = ЗапросПоРеквизитамОбъектов(СписокОбъектов).Выполнить().Выгрузить(); + ВыводимыеОбъекты.Сортировать("Дата"); - ШаблонПодзапроса = "ВЫБРАТЬ - | &Дата КАК Дата, - | Ссылка, - | &Проведен КАК Проведен, - | ПометкаУдаления, - | &СуммаДокумента КАК СуммаДокумента, - | &Валюта КАК Валюта, - | &Представление - |ИЗ - | &ИмяТаблицы - |ГДЕ - | Ссылка В (&ИмяОбъекта)"; - - Запрос = Новый Запрос; - ТекстЗапроса = ""; - Для Каждого КлючИЗначение Из КэшПоТипамОбъектов Цикл + Для каждого ВыводимыйОбъект Из ВыводимыеОбъекты Цикл - МассивИмениОбъекта = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(КлючИЗначение.Ключ, "."); - Если МассивИмениОбъекта.Количество() = 2 Тогда - ИмяОбъекта = МассивИмениОбъекта[1]; - Иначе - Продолжить; - КонецЕсли; - - ТекстПоТипуОбъекта = СтрЗаменить(ШаблонПодзапроса, "&Дата", КэшРеквизитовОбъекта[КлючИЗначение.Ключ]["Дата"]); - ТекстПоТипуОбъекта = СтрЗаменить(ТекстПоТипуОбъекта, "&Проведен", КэшРеквизитовОбъекта[КлючИЗначение.Ключ]["Проведен"]); - ТекстПоТипуОбъекта = СтрЗаменить(ТекстПоТипуОбъекта, "&СуммаДокумента", КэшРеквизитовОбъекта[КлючИЗначение.Ключ]["СуммаДокумента"]); - ТекстПоТипуОбъекта = СтрЗаменить(ТекстПоТипуОбъекта, "&Валюта", КэшРеквизитовОбъекта[КлючИЗначение.Ключ]["Валюта"]); - ТекстПоТипуОбъекта = СтрЗаменить(ТекстПоТипуОбъекта, "&ИмяТаблицы", КлючИЗначение.Ключ); - ТекстПоТипуОбъекта = СтрЗаменить(ТекстПоТипуОбъекта, "&ИмяОбъекта", "&" + ИмяОбъекта); - Запрос.УстановитьПараметр(ИмяОбъекта, КлючИЗначение.Значение); - - МассивДопРеквизитов = РеквизитыДляПредставления(КлючИЗначение.Ключ, ИмяОбъекта); - ДополнитьТекстЗапросаПоРеквизитамОбъекта(ТекстПоТипуОбъекта, МассивДопРеквизитов); - - Если Не ПустаяСтрока(ТекстЗапроса) Тогда - ТекстЗапроса = ТекстЗапроса + " - | ОБЪЕДИНИТЬ ВСЕ - |"; - КонецЕсли; - ТекстЗапроса = ТекстЗапроса + ТекстПоТипуОбъекта; - - КонецЦикла; - - ШаблонЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | * - |ИЗ - | (ВЫБРАТЬ 1 ИЗ #Подзапрос) КАК ПодчиненныеОбъекты - |УПОРЯДОЧИТЬ ПО - | ПодчиненныеОбъекты.Дата"; - - Запрос.Текст = СтрЗаменить(ШаблонЗапроса, "ВЫБРАТЬ 1 ИЗ #Подзапрос", ТекстЗапроса); - Выборка = Запрос.Выполнить().Выбрать(); - - Пока Выборка.Следующий() Цикл - - Если ИндексСвязейОбъектов[ТекущийОбъект] = Выборка.Ссылка Тогда + Если ИндексСвязейОбъектов[ТекущийОбъект] = ВыводимыйОбъект.Ссылка Тогда Продолжить; КонецЕсли; - ИндексСвязейОбъектов.Вставить(ТекущийОбъект, Выборка.Ссылка); - - НоваяСтрока = ДобавитьСтрокуВДерево(ДеревоРодитель, Выборка, ВыведенныеОбъекты, Истина); + ИндексСвязейОбъектов[ТекущийОбъект] = ВыводимыйОбъект.Ссылка; + НоваяСтрока = ДобавитьСтрокуВДерево(ДеревоРодитель, ВыводимыйОбъект, ВыведенныеОбъекты, Истина); Если НоваяСтрока <> Неопределено - И Не ДобавляемыйОбъектИмеетсяСредиРодителей(ДеревоРодитель, Выборка.Ссылка) Тогда + И Не ДобавляемыйОбъектИмеетсяСредиРодителей(ДеревоРодитель, ВыводимыйОбъект.Ссылка) Тогда - ВывестиПодчиненныеОбъекты(Выборка.Ссылка, НоваяСтрока, ВыведенныеОбъекты, + // @skip-check query-in-loop - Рекурсивный алгоритм обработки дерева. + ВывестиПодчиненныеОбъекты(ВыводимыйОбъект.Ссылка, НоваяСтрока, ВыведенныеОбъекты, СлужебныеОбъекты, ИндексСвязейОбъектов); - ИначеЕсли СлужебныеОбъекты[Выборка.Ссылка] = Неопределено Тогда + ИначеЕсли СлужебныеОбъекты[ВыводимыйОбъект.Ссылка] = Неопределено Тогда - СлужебныеОбъекты.Вставить(Выборка.Ссылка, Истина); - ВывестиПодчиненныеОбъекты(Выборка.Ссылка, ДеревоРодитель, ВыведенныеОбъекты, + СлужебныеОбъекты.Вставить(ВыводимыйОбъект.Ссылка, Истина); + // @skip-check query-in-loop - Рекурсивный алгоритм обработки дерева. + ВывестиПодчиненныеОбъекты(ВыводимыйОбъект.Ссылка, ДеревоРодитель, ВыведенныеОбъекты, СлужебныеОбъекты, ИндексСвязейОбъектов); КонецЕсли; @@ -963,8 +897,7 @@ &НаСервере Функция ДобавитьСтрокуВДерево(Родитель, Данные, ВыведенныеОбъекты, ЭтоПодчиненный = Ложь) - УстановитьЧастотуВыводаОбъекта(Данные.Ссылка, ВыведенныеОбъекты, ЭтоПодчиненный); - + УстановитьЧастотуВыводаОбъекта(Данные.Ссылка, ВыведенныеОбъекты, ЭтоПодчиненный); Если Не ВыводитьТекущийОбъект(Родитель, Данные.Ссылка, ВыведенныеОбъекты, ЭтоПодчиненный) Тогда Возврат Неопределено; КонецЕсли; @@ -1078,28 +1011,11 @@ СвойстваЧастотыВывода = Новый Структура; СвойстваЧастотыВывода.Вставить("Итого", 0); - СвойстваЧастотыВывода.Вставить("ВПодчиненных", 0); - + СвойстваЧастотыВывода.Вставить("ВПодчиненных", 0); Возврат СвойстваЧастотыВывода; КонецФункции -&НаСервере -Процедура ДополнитьТекстЗапросаПоРеквизитамОбъекта(ТекстЗапроса, МассивРеквизитов) - - ТекстПредставление = "Представление КАК Представление"; - - Для Инд = 1 По 3 Цикл - - ТекстПредставление = ТекстПредставление + ", - | " + ?(МассивРеквизитов.Количество() >= Инд,МассивРеквизитов[инд - 1],"NULL") + " Как ДополнительныйРеквизит" + Инд; - - КонецЦикла; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Представление", ТекстПредставление); - -КонецПроцедуры - &НаСервере Функция ИмяРеквизитаДокумента(Знач МетаданныеОбъекта, Знач ИмяРеквизита) @@ -1384,8 +1300,8 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Связанные документы.Изменение пометки удаления'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,, Элемент, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - Ошибки.Добавить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Ошибки.Добавить(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; @@ -1496,8 +1412,8 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Связанные документы.Проведение документа'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,, Документ, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - Ошибки.Добавить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Ошибки.Добавить(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; diff --git a/SSL/src/CommonForms/Сертификат/Form.form b/SSL/src/CommonForms/Сертификат/Form.form index 10dd4bda5..ee45acb68 100644 --- a/SSL/src/CommonForms/Сертификат/Form.form +++ b/SSL/src/CommonForms/Сертификат/Form.form @@ -274,7 +274,6 @@ UsualGroup Vertical - Auto true true Auto @@ -351,7 +350,6 @@ UsualGroup AlwaysHorizontal - Auto true true auto @@ -459,7 +457,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -1393,6 +1390,605 @@ false
    + + СтраницаКорневыеСертификаты + 240 + + ГруппаОшибкаПолученияЦепочкиСертификатов + 267 + + КартинкаОшибкаПолученияЦепочкиСертификатов + 269 + + <key>ru</key> + <value>Картинка ошибка получения цепочки сертификатов</value> + + true + true + + true + + + КартинкаОшибкаПолученияЦепочкиСертификатовРасширеннаяПодсказка + 271 + Label + true + true + + Left + + + + КартинкаОшибкаПолученияЦепочкиСертификатовКонтекстноеМеню + 270 + true + + true + true + + + CommonPicture.Предупреждение + + + + + ДекорацияОшибкаПолученияЦепочкиСертификатов + 264 + + <key>ru</key> + <value>Не удалось получить цепочку сертификатов</value> + + true + true + + true + + + ДекорацияОшибкаПолученияЦепочкиСертификатовРасширеннаяПодсказка + 266 + Label + true + true + + Left + + + + ДекорацияОшибкаПолученияЦепочкиСертификатовКонтекстноеМеню + 265 + true + + Label + true + true + + + Click + ДекорацияОшибкаПолученияЦепочкиСертификатовНажатие + + true + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа ошибка</value> + + + ГруппаОшибкаПолученияЦепочкиСертификатовРасширеннаяПодсказка + 268 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + WeakSeparation + true + true + Auto + Auto + + + + ПутьСертификации + 200 + + <key>ru</key> + <value>Корневые сертификаты</value> + + true + true + + true + + + ПутьСертификации + + None + + ПутьСертификацииПредставление + 242 + true + true + + true + + + ПутьСертификации.Представление + + + ПутьСертификацииПредставлениеРасширеннаяПодсказка + 244 + Label + true + true + + Left + + + + ПутьСертификацииПредставлениеКонтекстноеМеню + 243 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПутьСертификацииКоманднаяПанель + 201 + + ПутьСертификацииУстановитьСертификат + 259 + true + true + + true + + + ПутьСертификацииУстановитьСертификатРасширеннаяПодсказка + 260 + Label + true + true + + Left + + + Form.Command.УстановитьСертификат + Normal + Auto + true + true + UserCmds + Auto + + Left + + + Selection + КорневыеСертификатыВыбор + + + ПутьСертификацииСтрокаПоиска + 204 + + ПутьСертификацииСтрокаПоискаРасширеннаяПодсказка + 206 + Label + true + true + + Left + + + + ПутьСертификацииСтрокаПоискаКонтекстноеМеню + 205 + true + + ПутьСертификации + + true + + + + ПутьСертификацииСостояниеПросмотра + 210 + + ПутьСертификацииСостояниеПросмотраРасширеннаяПодсказка + 212 + Label + true + true + + Left + + + + ПутьСертификацииСостояниеПросмотраКонтекстноеМеню + 211 + true + + ViewStatusAddition + ПутьСертификации + + true + + + + ПутьСертификацииУправлениеПоиском + 207 + + ПутьСертификацииУправлениеПоискомРасширеннаяПодсказка + 209 + Label + true + true + + Left + + + + ПутьСертификацииУправлениеПоискомКонтекстноеМеню + 208 + true + + SearchControlAddition + ПутьСертификации + + true + + + + ПутьСертификацииРасширеннаяПодсказка + 203 + Label + true + true + + Left + + + + ПутьСертификацииКонтекстноеМеню + 202 + true + + 40 + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + AsFileRef + true + +
    + true + true + + true + + + <key>ru</key> + <value>Путь сертификации</value> + + + СтраницаКорневыеСертификатыРасширеннаяПодсказка + 241 + Label + true + true + + Left + + + Page + + Vertical + auto + false + +
    + + СтраницаСпискиОтзыва + 238 + + СпискиОтзыва + 219 + + <key>ru</key> + <value>Списки отзыва</value> + + true + true + + true + + + СпискиОтзыва + + None + + СпискиОтзываАдрес + 232 + true + true + + true + + + СпискиОтзыва.Адрес + + + СпискиОтзываАдресРасширеннаяПодсказка + 234 + Label + true + true + + Left + + + + СпискиОтзываАдресКонтекстноеМеню + 233 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + СпискиОтзываКоманднаяПанель + 220 + + УстановитьСписокОтзыва + 257 + true + true + + true + + + УстановитьСписокОтзываРасширеннаяПодсказка + 258 + Label + true + true + + Left + + + Form.Command.УстановитьСписокОтзыва + Normal + Auto + true + true + UserCmds + Auto + + Left + + + Selection + СпискиОтзываВыбор + + + СпискиОтзываСтрокаПоиска + 223 + + СпискиОтзываСтрокаПоискаРасширеннаяПодсказка + 225 + Label + true + true + + Left + + + + СпискиОтзываСтрокаПоискаКонтекстноеМеню + 224 + true + + СпискиОтзыва + + true + + + + СпискиОтзываСостояниеПросмотра + 229 + + СпискиОтзываСостояниеПросмотраРасширеннаяПодсказка + 231 + Label + true + true + + Left + + + + СпискиОтзываСостояниеПросмотраКонтекстноеМеню + 230 + true + + ViewStatusAddition + СпискиОтзыва + + true + + + + СпискиОтзываУправлениеПоиском + 226 + + СпискиОтзываУправлениеПоискомРасширеннаяПодсказка + 228 + Label + true + true + + Left + + + + СпискиОтзываУправлениеПоискомКонтекстноеМеню + 227 + true + + SearchControlAddition + СпискиОтзыва + + true + + + + СпискиОтзываРасширеннаяПодсказка + 222 + Label + true + true + + Left + + + + СпискиОтзываКонтекстноеМеню + 221 + true + + 40 + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + AsFileRef + true + +
    + + ОшибкаПриПолученииАдресовСписковОтзыва + 254 + true + true + + true + + + ОшибкаПриПолученииАдресовСписковОтзыва + + + ОшибкаПриПолученииАдресовСписковОтзываРасширеннаяПодсказка + 256 + Label + true + true + + Left + + + + ОшибкаПриПолученииАдресовСписковОтзываКонтекстноеМеню + 255 + true + + LabelField + Enter + true + Left + true + + true + true + true + + + true + true + + true + + + <key>ru</key> + <value>Списки отзыва</value> + + + СтраницаСпискиОтзываРасширеннаяПодсказка + 239 + Label + true + true + + Left + + + Page + + Vertical + auto + false + +
    true true @@ -1414,6 +2010,10 @@ Pages + + OnCurrentPageChange + СтраницыПриСменеСтраницы + TabsOnTop Auto @@ -1902,6 +2502,163 @@ true + + ПутьСертификации + + <key>ru</key> + <value>Путь сертификации</value> + + 30 + + ValueTable + + + true + + + true + + + Представление + + <key>ru</key> + <value>Сертификат</value> + + 31 + + String + + + + true + + + true + + + + ДанныеСертификата + 32 + + String + + + + true + + + true + + + + УстановленНаКлиенте + 41 + + Boolean + + + true + + + true + + + + + СпискиОтзыва + + <key>ru</key> + <value>Списки отзыва</value> + + 35 + + ValueTable + + + true + + + true + + + Адрес + + <key>ru</key> + <value>Адрес</value> + + 36 + + String + + + + true + + + true + + + + ДанныеСпискаОтзыва + 37 + + String + + + + true + + + true + + + + + ОшибкаПриПолученииПутиСертификации + 38 + + String + + + + true + + + true + + + + ОшибкаПриПолученииАдресовСписковОтзыва + + <key>ru</key> + <value>Не удалось получить адреса списков отзыва</value> + + 39 + + String + + + + true + + + true + + + + ОшибкаПриПолученииПутиСертификацииНаСервере + 42 + + String + + + + true + + + true + + СохранитьВФайл @@ -1942,6 +2699,42 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>УстановитьСписокОтзыва</name> + <title> + <key>ru</key> + <value>Установить список отзыва</value> + + 3 + + true + + + + УстановитьСписокОтзыва + + + Auto + Auto + + + УстановитьСертификат + + <key>ru</key> + <value>Установить сертификат</value> + + 4 + + true + + + + УстановитьСертификат + + + Auto + Auto + АдресСертификата diff --git a/SSL/src/CommonForms/Сертификат/Help/ru.html b/SSL/src/CommonForms/Сертификат/Help/ru.html index 8dc093527..b1a6b4827 100644 --- a/SSL/src/CommonForms/Сертификат/Help/ru.html +++ b/SSL/src/CommonForms/Сертификат/Help/ru.html @@ -2,13 +2,23 @@

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

    Основные сведения о сертификате

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

    Выгрузка сертификата

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

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

    Проверка сертификата

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

    См. также:

    \ No newline at end of file diff --git a/SSL/src/CommonForms/Сертификат/Module.bsl b/SSL/src/CommonForms/Сертификат/Module.bsl index 9680a475f..fc24a2f2d 100644 --- a/SSL/src/CommonForms/Сертификат/Module.bsl +++ b/SSL/src/CommonForms/Сертификат/Module.bsl @@ -14,7 +14,11 @@ ОшибкаНаКлиенте = Параметры.ОшибкаНаКлиенте; Если ЗначениеЗаполнено(Параметры.АдресСертификата) Тогда + ДанныеСертификата = ПолучитьИзВременногоХранилища(Параметры.АдресСертификата); + Если ТипЗнч(ДанныеСертификата) = Тип("Строка") Тогда + ДанныеСертификата = Base64Значение(ДанныеСертификата); + КонецЕсли; Сертификат = Новый СертификатКриптографии(ДанныеСертификата); АдресСертификата = ПоместитьВоВременноеХранилище(ДанныеСертификата, УникальныйИдентификатор); @@ -71,6 +75,43 @@ ГруппаВнутреннихПолей = "Общие"; ЗаполнитьВнутренниеПоляСертификата(); + ОбъектКомпоненты = Неопределено; + + Если ЭлектроннаяПодпись.ОбщиеНастройки().ПроверятьЭлектронныеПодписиНаСервере + Или ЭлектроннаяПодпись.ОбщиеНастройки().СоздаватьЭлектронныеПодписиНаСервере Тогда + + РезультатЦепочкаСертификатов = ЭлектроннаяПодписьСлужебный.ЦепочкаСертификатов( + ДанныеСертификата, УникальныйИдентификатор, ОбъектКомпоненты); + + Если Не ЗначениеЗаполнено(РезультатЦепочкаСертификатов.Ошибка) Тогда + Для Каждого ТекущийСертификат Из РезультатЦепочкаСертификатов.Сертификаты Цикл + СертификатКриптографии = Новый СертификатКриптографии( + Base64Значение(ПолучитьИзВременногоХранилища(ТекущийСертификат.ДанныеСертификата))); + НоваяСтрока = ПутьСертификации.Вставить(0); + НоваяСтрока.Представление = ЭлектроннаяПодпись.ПредставлениеСертификата(СертификатКриптографии); + НоваяСтрока.ДанныеСертификата = ТекущийСертификат.ДанныеСертификата; + КонецЦикла; + Элементы.ГруппаОшибкаПолученияЦепочкиСертификатов.Видимость = Ложь; + Иначе + ОшибкаПриПолученииПутиСертификацииНаСервере = РезультатЦепочкаСертификатов.Ошибка; + Элементы.ГруппаОшибкаПолученияЦепочкиСертификатов.Видимость = Истина; + КонецЕсли; + + КонецЕсли; + + СвойстваСертификатаРасширенные = ЭлектроннаяПодписьСлужебный.СвойстваСертификатаРасширенные( + ДанныеСертификата, УникальныйИдентификатор, ОбъектКомпоненты); + ОшибкаПриПолученииАдресовСписковОтзыва = СвойстваСертификатаРасширенные.Ошибка; + ЕстьОшибка = ЗначениеЗаполнено(СвойстваСертификатаРасширенные.Ошибка); + Элементы.ОшибкаПриПолученииАдресовСписковОтзыва.Видимость = ЕстьОшибка; + Элементы.СпискиОтзыва.Видимость = Не ЕстьОшибка; + Если Не ЕстьОшибка Тогда + Для Каждого ТекущийАдрес Из СвойстваСертификатаРасширенные.СвойстваСертификата.АдресаСписковОтзыва Цикл + НоваяСтрока = СпискиОтзыва.Добавить(); + НоваяСтрока.Адрес = ТекущийАдрес; + КонецЦикла; + КонецЕсли; + Если Параметры.Свойство("ОткрытиеИзФормыЭлементаСертификата") Тогда Элементы.ФормаСохранитьВФайл.Видимость = Ложь; Элементы.ФормаПроверить.Видимость = Ложь; @@ -108,6 +149,61 @@ КонецПроцедуры +&НаКлиенте +Процедура СтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница) + + Если ТекущаяСтраница = Элементы.СтраницаКорневыеСертификаты + И (ЗначениеЗаполнено(ОшибкаПриПолученииПутиСертификацииНаСервере) Или ПутьСертификации.Количество() = 0) Тогда + + ЗаполнитьКорневыеСертификаты(); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ДекорацияОшибкаПолученияЦепочкиСертификатовНажатие(Элемент) + + ЭлектроннаяПодписьСлужебныйКлиент.ПоказатьОшибкуОбращенияКПрограмме( + НСтр("ru = 'Не удалось получить путь сертификации'"), "", + Новый Структура("ОписаниеОшибки", ОшибкаПриПолученииПутиСертификации), + Новый Структура("ОписаниеОшибки", ОшибкаПриПолученииПутиСертификацииНаСервере)); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыСпискиОтзыва + +&НаКлиенте +Процедура СпискиОтзываВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыКорневыеСертификаты + +&НаКлиенте +Процедура КорневыеСертификатыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ТекущиеДанные = Элементы.ПутьСертификации.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("АдресСертификата", ТекущиеДанные.ДанныеСертификата); + + ОткрытьФорму("ОбщаяФорма.Сертификат", ПараметрыФормы); + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы @@ -130,6 +226,50 @@ КонецПроцедуры +&НаКлиенте +Процедура УстановитьСписокОтзыва(Команда) + + ПараметрыУстановкиСпискаОтзыва = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыУстановкиСпискаОтзыва(АдресСертификата); + ЭлектроннаяПодписьСлужебныйКлиент.УстановитьСписокОтзываСертификата(ПараметрыУстановкиСпискаОтзыва); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьСертификат(Команда) + + ТекущиеДанные = Элементы.ПутьСертификации.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ДвоичныеДанные = Base64Значение(ПолучитьИзВременногоХранилища(ТекущиеДанные.ДанныеСертификата)); + ПараметрыУстановкиСертификата = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыУстановкиСертификата( + ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор)); + + Если ПутьСертификации.Количество() > 1 Тогда + + Если ТекущиеДанные.ПолучитьИдентификатор() = ПутьСертификации[0].ПолучитьИдентификатор() Тогда + ВариантыУстановки = Новый СписокЗначений; + ВариантыУстановки.Добавить("ROOT", НСтр("ru = 'Доверенные корневые сертификаты'")); + ВариантыУстановки.Добавить("CA", НСтр("ru = 'Промежуточные сертификаты'")); + ВариантыУстановки.Добавить("MY", НСтр("ru = 'Личное хранилище сертификатов'")); + ВариантыУстановки.Добавить("Контейнер", НСтр("ru = 'Контейнер и личное хранилище'")); + ПараметрыУстановкиСертификата.ВариантыУстановки = ВариантыУстановки; + ИначеЕсли ТекущиеДанные.ПолучитьИдентификатор() <> ПутьСертификации[ПутьСертификации.Количество() - 1].ПолучитьИдентификатор() Тогда + ВариантыУстановки = Новый СписокЗначений; + ВариантыУстановки.Добавить("CA", НСтр("ru = 'Промежуточные сертификаты'")); + ВариантыУстановки.Добавить("ROOT", НСтр("ru = 'Доверенные корневые сертификаты'")); + ВариантыУстановки.Добавить("MY", НСтр("ru = 'Личное хранилище сертификатов'")); + ВариантыУстановки.Добавить("Контейнер", НСтр("ru = 'Контейнер и личное хранилище'")); + ПараметрыУстановкиСертификата.ВариантыУстановки = ВариантыУстановки; + КонецЕсли; + КонецЕсли; + + ЭлектроннаяПодписьСлужебныйКлиент.УстановитьСертификат(ПараметрыУстановкиСертификата); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -141,7 +281,13 @@ Если Результат = Истина Тогда ПоказатьПредупреждение(, НСтр("ru = 'Сертификат действителен.'")); ИначеЕсли Результат <> Неопределено Тогда + + ДополнительныеДанные = ЭлектроннаяПодписьСлужебныйКлиент.ДополнительныеДанныеДляКлассификатораОшибок(); + ДополнительныеДанные.ДанныеСертификата = АдресСертификата; + ПараметрыПредупреждения = Новый Структура; + ПараметрыПредупреждения.Вставить("ДополнительныеДанные", ДополнительныеДанные); + ПараметрыПредупреждения.Вставить("ЗаголовокПредупреждения", НСтр("ru = 'Сертификат недействителен по причине:'")); @@ -156,6 +302,7 @@ КонецЕсли; ОткрытьФорму("ОбщаяФорма.РасширенноеПредставлениеОшибки", ПараметрыПредупреждения, ЭтотОбъект); + КонецЕсли; Элементы.ФормаПроверить.Доступность = Истина; @@ -363,6 +510,34 @@ КонецПроцедуры +&НаКлиенте +Процедура ЗаполнитьКорневыеСертификаты() + + ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьЦепочкуСертификатов(Новый ОписаниеОповещения("ПослеПолученияЦепочкиСертификатов", ЭтотОбъект), + АдресСертификата, УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Асинх Процедура ПослеПолученияЦепочкиСертификатов(Результат, ДополнительныеПараметры) Экспорт + + Если Не ЗначениеЗаполнено(Результат.Ошибка) Тогда + Для Каждого ТекущийСертификат Из Результат.Сертификаты Цикл + СертификатКриптографии = Новый СертификатКриптографии(); + СертификатКриптографии.ИнициализироватьАсинх( + Base64Значение(ПолучитьИзВременногоХранилища(ТекущийСертификат.ДанныеСертификата))); + НоваяСтрока = ПутьСертификации.Вставить(0); + НоваяСтрока.Представление = ЭлектроннаяПодписьКлиент.ПредставлениеСертификата(СертификатКриптографии); + НоваяСтрока.ДанныеСертификата = ТекущийСертификат.ДанныеСертификата; + КонецЦикла; + Элементы.ГруппаОшибкаПолученияЦепочкиСертификатов.Видимость = Ложь; + Иначе + ОшибкаПриПолученииПутиСертификации = Результат.Ошибка; + Элементы.ГруппаОшибкаПолученияЦепочкиСертификатов.Видимость = Истина; + КонецЕсли; + +КонецПроцедуры + &НаСервере Функция АдресСертификата(СсылкаОтпечаток, ИдентификаторФормы = Неопределено) diff --git a/SSL/src/CommonForms/Склонения/Form.form b/SSL/src/CommonForms/Склонения/Form.form index 04302f6bb..29ec70cee 100644 --- a/SSL/src/CommonForms/Склонения/Form.form +++ b/SSL/src/CommonForms/Склонения/Form.form @@ -333,7 +333,6 @@ UsualGroup Vertical - Auto true true Auto @@ -433,7 +432,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true diff --git a/SSL/src/CommonForms/СменаПароля/Form.form b/SSL/src/CommonForms/СменаПароля/Form.form index 748f40e61..4ec72443b 100644 --- a/SSL/src/CommonForms/СменаПароля/Form.form +++ b/SSL/src/CommonForms/СменаПароля/Form.form @@ -237,7 +237,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -359,7 +358,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -429,7 +427,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -459,7 +456,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -727,6 +723,19 @@ true + + ПарольУстановлен + 10 + + Boolean + + + true + + + true + + УстановитьПароль diff --git a/SSL/src/CommonForms/СменаПароля/Module.bsl b/SSL/src/CommonForms/СменаПароля/Module.bsl index 07c0ae989..f869eb172 100644 --- a/SSL/src/CommonForms/СменаПароля/Module.bsl +++ b/SSL/src/CommonForms/СменаПароля/Module.bsl @@ -32,6 +32,7 @@ Возврат; КонецЕсли; ЭтоТекущийПользовательИБ = ДополнительныеПараметры.ЭтоТекущийПользовательИБ; + ПарольУстановлен = ДополнительныеПараметры.ПарольУстановлен; Если Не ЗначениеЗаполнено(ИмяДляВхода) Тогда ИмяДляВхода = ДополнительныеПараметры.ИмяДляВхода; КонецЕсли; @@ -46,34 +47,25 @@ НСтр("ru = 'Не удалось открыть форму смены пароля по причине: | |%1'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат; КонецЕсли; КонецПопытки; КонецЕсли; - Если ПриВходеВПрограмму Тогда - Если ДополнительныеПараметры.ПарольУстановлен Тогда - КлючНазначенияФормы = "СменаПароляПриВходеВПрограмму"; - Иначе - КлючНазначенияФормы = "УстановкаПароляПриВходеВПрограмму"; - Элементы.ПояснениеПриВходе.Заголовок = - НСтр("ru = 'Для входа в программу установите пароль.'") - КонецЕсли; - Иначе - Если Не ДополнительныеПараметры.ЭтоТекущийПользовательИБ - Или Не ДополнительныеПараметры.ПарольУстановлен Тогда - - КлючНазначенияФормы = "УстановкаПароля"; - КонецЕсли; + Если Не ПриВходеВПрограмму Тогда Элементы.ПояснениеПриВходе.Видимость = Ложь; Элементы.ФормаЗакрытьФорму.Заголовок = НСтр("ru = 'Отмена'"); + + ИначеЕсли Не ПарольУстановлен Тогда + Элементы.ПояснениеПриВходе.Заголовок = + НСтр("ru = 'Для входа в программу установите пароль.'") КонецЕсли; - СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, КлючНазначенияФормы, , Ложь); + СтандартныеПодсистемыСервер.СброситьРазмерыИПоложениеОкна(ЭтотОбъект); - Если Не ДополнительныеПараметры.ЭтоТекущийПользовательИБ - Или Не ДополнительныеПараметры.ПарольУстановлен Тогда + Если Не ЭтоТекущийПользовательИБ + Или Не ПарольУстановлен Тогда Элементы.СтарыйПароль.Видимость = Ложь; АвтоЗаголовок = Ложь; @@ -81,6 +73,12 @@ ИначеЕсли Параметры.СтарыйПароль <> Неопределено Тогда ТекущийЭлемент = Элементы.НовыйПароль; + + ИначеЕсли ПриВходеВПрограмму + И ЭтоТекущийПользовательИБ + И Не ОбщегоНазначения.РазделениеВключено() Тогда + + Элементы.СтарыйПароль.Видимость = Ложь; КонецЕсли; Элементы.НовыйПароль.Подсказка = ПользователиСлужебный.ПодсказкаДляНовогоПароля(); @@ -101,6 +99,7 @@ ПодключитьОбработчикОжидания("ПоказатьТекстОшибкиИСообщитьОЗакрытии", 0.1, Истина); Иначе ПроверитьПодтверждениеПароля(); + ОбновитьОбработчикОжиданияПоказатьСтарыйПароль(); КонецЕсли; КонецПроцедуры @@ -120,6 +119,7 @@ Процедура ПарольИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка) ПроверитьПодтверждениеПароля(Элемент); + ОбновитьОбработчикОжиданияПоказатьСтарыйПароль(); КонецПроцедуры @@ -158,7 +158,7 @@ Если Не ВернутьПарольБезУстановки И Не ЭтоТекущийПользовательИБ - И СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено + И ОбщегоНазначенияКлиент.РазделениеВключено() И ПарольПользователяСервиса = Неопределено Тогда ПользователиСлужебныйКлиент.ЗапроситьПарольДляАутентификацииВСервисе( @@ -182,6 +182,27 @@ #Область СлужебныеПроцедурыИФункции +&НаКлиенте +Процедура ОбновитьОбработчикОжиданияПоказатьСтарыйПароль() + + Если ПриВходеВПрограмму + И ЭтоТекущийПользовательИБ + И ПарольУстановлен + И Не Элементы.СтарыйПароль.Видимость Тогда + + ОтключитьОбработчикОжидания("ПоказатьСтарыйПарольОбработчикОжидания"); + ПодключитьОбработчикОжидания("ПоказатьСтарыйПарольОбработчикОжидания", 60, Истина); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьСтарыйПарольОбработчикОжидания() + + Элементы.СтарыйПароль.Видимость = Истина; + +КонецПроцедуры + &НаКлиенте Процедура ПоказатьТекстОшибкиИСообщитьОЗакрытии() @@ -271,12 +292,17 @@ ПараметрыВыполнения.Вставить("ПарольПользователяСервиса", ПарольПользователяСервиса); ПараметрыВыполнения.Вставить("ТолькоПроверить", ВернутьПарольБезУстановки); + Если Не ОбщегоНазначения.РазделениеВключено() + И Не Элементы.СтарыйПароль.Видимость Тогда + ПараметрыВыполнения.СтарыйПароль = Неопределено; + КонецЕсли; + Попытка ТекстОшибки = ПользователиСлужебный.ОбработатьНовыйПароль(ПараметрыВыполнения); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); Если ПараметрыВыполнения.Свойство("ОшибкаЗаписанаВЖурналРегистрации") Тогда - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); Иначе ВызватьИсключение; КонецЕсли; diff --git a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Form.form b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Form.form index 83d0bdd49..0c823e80e 100644 --- a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Form.form +++ b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Form.form @@ -245,7 +245,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -534,7 +533,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -864,7 +862,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -943,7 +940,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -1074,7 +1070,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl index b7e07628d..3ad0fbdb7 100644 --- a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl +++ b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl @@ -313,7 +313,7 @@ Исключение Отказ = Истина; ЗаписьЖурналаРегистрации(НСтр("ru = 'Обмен данными'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Если Отказ Тогда diff --git a/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Form.form b/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Form.form index 96f194005..01f6b706c 100644 --- a/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Form.form +++ b/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Form.form @@ -69,7 +69,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -403,7 +402,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/CommonForms/СохранениеПечатнойФормы/Form.form b/SSL/src/CommonForms/СохранениеПечатнойФормы/Form.form index 138f4f6e4..c551d1cc3 100644 --- a/SSL/src/CommonForms/СохранениеПечатнойФормы/Form.form +++ b/SSL/src/CommonForms/СохранениеПечатнойФормы/Form.form @@ -64,177 +64,21 @@ <orientation>Vertical</orientation> </extInfo> </items> - <items xsi:type="form:FormGroup"> - <name>ГруппаМестаСохранения</name> - <id>69</id> - <displayImportance>VeryHigh</displayImportance> - <items xsi:type="form:FormGroup"> - <name>СтраницаСохранениеВПапку</name> - <id>70</id> - <items xsi:type="form:FormField"> - <name>ПапкаДляСохраненияФайлов</name> - <id>42</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <dataPath xsi:type="form:DataPath"> - <segments>ВыбраннаяПапка</segments> - </dataPath> - <titleLocation>None</titleLocation> - <extendedTooltip> - <name>ПапкаДляСохраненияФайловExtendedTooltip</name> - <id>86</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>ПапкаДляСохраненияФайловКонтекстноеМеню</name> - <id>43</id> - <autoFill>true</autoFill> - </contextMenu> - <type>InputField</type> - <markRequiredComplete>true</markRequiredComplete> - <editMode>Enter</editMode> - <showInHeader>true</showInHeader> - <headerHorizontalAlign>Left</headerHorizontalAlign> - <showInFooter>true</showInFooter> - <extInfo xsi:type="form:InputFieldExtInfo"> - <handlers> - <event>StartChoice</event> - <name>ПапкаДляСохраненияФайловНачалоВыбора</name> - </handlers> - <width>40</width> - <autoMaxHeight>true</autoMaxHeight> - <wrap>true</wrap> - <choiceButton>true</choiceButton> - <autoMarkIncomplete>true</autoMarkIncomplete> - <chooseType>true</chooseType> - <typeDomainEnabled>true</typeDomainEnabled> - <textEdit>true</textEdit> - <textSize>Normal</textSize> - </extInfo> - </items> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <title> - <key>ru</key> - <value>Страница сохранение в папку</value> - - - СтраницаСохранениеВПапкуExtendedTooltip - 85 - Label - true - true - - Left - - - Page - - Vertical - auto - false - -
    - - СтраницаПрисоединениеКОбъекту - 71 - - ВыбранныйОбъект - 48 - true - true - - true - - - ВыбранныйОбъект - - None - - ВыбранныйОбъектExtendedTooltip - 88 - Label - true - true - - Left - - - - ВыбранныйОбъектКонтекстноеМеню - 49 - true - - InputField - Enter - true - Left - true - - - Clearing - ВыбранныйОбъектОчистка - - true - true - true - false - false - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Страница присоединение к объекту</value> - - - СтраницаПрисоединениеКОбъектуExtendedTooltip - 87 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - + + ПапкаДляСохраненияФайлов + 42 true true true - - <key>ru</key> - <value>Места сохранения</value> - + + ВыбраннаяПапка + + None - ГруппаМестаСохраненияExtendedTooltip - 84 + ПапкаДляСохраненияФайловExtendedTooltip + 86 Label true true @@ -242,9 +86,31 @@ Left
    - Pages - - Auto + + ПапкаДляСохраненияФайловКонтекстноеМеню + 43 + true + + InputField + true + Enter + true + Left + true + + + StartChoice + ПапкаДляСохраненияФайловНачалоВыбора + + 40 + true + true + true + true + true + true + true + Normal
    true @@ -269,7 +135,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -502,6 +367,7 @@ ВыбранныеФорматыСохранения.Picture + Top true true @@ -526,7 +392,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -616,6 +481,40 @@ true + + Подписать + 107 + true + true + + true + + + Подписать + + Right + + ПодписатьРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + + ПодписатьКонтекстноеМеню + 108 + true + + CheckBoxField + Enter + true + Left + true + + true true @@ -638,7 +537,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -713,6 +611,10 @@ Right true
    + + OnSaveDataInSettingsAtServer + ПриСохраненииДанныхВНастройкахНаСервере + OnOpen ПриОткрытии @@ -813,23 +715,6 @@ ВариантСохранения - - ВыбранныйОбъект - - <key>ru</key> - <value>Выбранный объект</value> - - 9 - - AnyRef - - - true - - - true - - ВыбранныеФорматыСохранения @@ -873,6 +758,43 @@ <segments>ПереводитьИменаФайловВТранслит</segments> </settingsSavedData> </attributes> + <attributes> + <name>Подписать</name> + <title> + <key>ru</key> + <value>Подписать</value> + + 13 + + Boolean + + + true + + + true + + FunctionalOption.ИспользоватьЭлектронныеПодписи + + Подписать + + + + ОбъектыПрикрепления + 14 + + ValueList + + + true + + + true + + + + + Сохранить @@ -907,6 +829,13 @@ <types>Boolean</types> </valueType> </parameters> + <parameters> + <name>ОграничениеФорматовСохранения</name> + <valueType> + <types>String</types> + <stringQualifiers/> + </valueType> + </parameters> <commandInterface> <navigationPanel/> <commandBar/> diff --git a/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl b/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl index 929ac5282..2e74ac9f8 100644 --- a/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl +++ b/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl @@ -11,42 +11,66 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + МассивОграниченийФорматовСохранения = СтрРазделить(Параметры.ОграничениеФорматовСохранения, ",", Ложь); + // заполнение списка форматов Для Каждого ФорматСохранения Из УправлениеПечатью.НастройкиФорматовСохраненияТабличногоДокумента() Цикл - ВыбранныеФорматыСохранения.Добавить(Строка(ФорматСохранения.ТипФайлаТабличногоДокумента), - ФорматСохранения.Представление, Ложь, ФорматСохранения.Картинка); + Если Не МассивОграниченийФорматовСохранения.Количество() + ИЛИ МассивОграниченийФорматовСохранения.Найти(ФорматСохранения.Расширение) <> Неопределено Тогда + + ВыбранныеФорматыСохранения.Добавить(Строка(ФорматСохранения.ТипФайлаТабличногоДокумента), ФорматСохранения.Представление, Ложь, ФорматСохранения.Картинка); + КонецЕсли; КонецЦикла; ВыбранныеФорматыСохранения[0].Пометка = Истина; // По умолчанию выбран только первый формат из списка. - // Заполнение списка выбора для присоединения файлов к объекту. - Для Каждого ОбъектПечати Из Параметры.ОбъектыПечати Цикл - Если КОбъектуМожноПрисоединятьФайлы(ОбъектПечати.Значение) Тогда - Элементы.ВыбранныйОбъект.СписокВыбора.Добавить(ОбъектПечати.Значение); - КонецЕсли; - КонецЦикла; + Если ВыбранныеФорматыСохранения.Количество() = 1 Тогда + Элементы.ГруппаВыборФорматов.Видимость = Ложь; + СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, "БезВыбораФормата"); + ИначеЕсли ВыбранныеФорматыСохранения.Количество() > 1 Тогда + СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, ""); + КонецЕсли; // Место сохранения по умолчанию. ВариантСохранения = "СохранитьВПапку"; // настройка видимости - ЕстьВозможностьПрисоединения = Элементы.ВыбранныйОбъект.СписокВыбора.Количество() > 0; - Элементы.ВыборМестаСохраненияФайла.Видимость = Параметры.РасширениеДляРаботыСФайламиПодключено - Или ЕстьВозможностьПрисоединения; - Элементы.ВариантСохранения.Видимость = ЕстьВозможностьПрисоединения; + ЕстьВозможностьСохранения = Параметры.ОбъектыПечати.Количество() > 0; + + ОбъектыПрикрепления = ПолучитьОбъектыДляПрикрепления(Параметры.ОбъектыПечати); + Если Параметры.ОбъектыПечати.Количество() = 1 Тогда + ЕстьВозможностьПрисоединения = ОбъектыПрикрепления[0].Пометка; + ИначеЕсли ЕстьВозможностьСохранения Тогда + ЕстьВозможностьПрисоединения = Ложь; + Для Каждого ОбъектДляПрикрепления Из ОбъектыПрикрепления Цикл + ЕстьВозможностьПрисоединения = ЕстьВозможностьПрисоединения Или ОбъектДляПрикрепления.Пометка; + КонецЦикла; + Иначе + ЕстьВозможностьПрисоединения = Ложь; + КонецЕсли; + Если Не ЕстьВозможностьПрисоединения Тогда + Элементы.ВариантСохранения.СписокВыбора.Удалить(1); + ВариантСохранения = "СохранитьВПапку"; + Элементы.ВариантСохранения.ТолькоПросмотр = Истина; + КонецЕсли; + + Элементы.ВыборМестаСохраненияФайла.Видимость = Параметры.РасширениеДляРаботыСФайламиПодключено + Или ЕстьВозможностьСохранения; + Элементы.ВариантСохранения.Видимость = ЕстьВозможностьСохранения; + Если Не ЕстьВозможностьСохранения Тогда Элементы.ПапкаДляСохраненияФайлов.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; КонецЕсли; Элементы.ПапкаДляСохраненияФайлов.Видимость = Параметры.РасширениеДляРаботыСФайламиПодключено; - // Объект для присоединения по умолчанию. - Если ЕстьВозможностьПрисоединения Тогда - ВыбранныйОбъект = Элементы.ВыбранныйОбъект.СписокВыбора[0].Значение; + Если Параметры.ОбъектыПечати.Количество() > 1 Тогда + Элементы.ВариантСохранения.СписокВыбора[1].Представление = НСтр("ru='Присоединить к документам'") + + " (" + Формат(Параметры.ОбъектыПечати.Количество(), "ЧДЦ=0;") + ")"; КонецЕсли; - Элементы.ВыбранныйОбъект.ТолькоПросмотр = Элементы.ВыбранныйОбъект.СписокВыбора.Количество() = 1; Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиФормы.Авто; Элементы.КнопкаСохранить.Отображение = ОтображениеКнопки.Картинка; + Элементы.Подписать.Видимость = Ложь; КонецЕсли; КонецПроцедуры @@ -54,24 +78,36 @@ &НаСервере Процедура ПередЗагрузкойДанныхИзНастроекНаСервере(Настройки) - ФорматыСохраненияИзНастроек = Настройки["ВыбранныеФорматыСохранения"]; - Если ФорматыСохраненияИзНастроек <> Неопределено Тогда - Для Каждого ВыбранныйФормат Из ВыбранныеФорматыСохранения Цикл - ФорматИзНастроек = ФорматыСохраненияИзНастроек.НайтиПоЗначению(ВыбранныйФормат.Значение); - Если ФорматИзНастроек <> Неопределено Тогда - ВыбранныйФормат.Пометка = ФорматИзНастроек.Пометка; - КонецЕсли; - КонецЦикла; + Если ВыбранныеФорматыСохранения.Количество() <> 1 Тогда + ФорматыСохраненияИзНастроек = Настройки["ВыбранныеФорматыСохранения"]; + Если ФорматыСохраненияИзНастроек <> Неопределено Тогда + Для Каждого ВыбранныйФормат Из ВыбранныеФорматыСохранения Цикл + ФорматИзНастроек = ФорматыСохраненияИзНастроек.НайтиПоЗначению(ВыбранныйФормат.Значение); + Если ФорматИзНастроек <> Неопределено Тогда + ВыбранныйФормат.Пометка = ФорматИзНастроек.Пометка; + КонецЕсли; + КонецЦикла; + Настройки.Удалить("ВыбранныеФорматыСохранения"); + КонецЕсли; + Иначе Настройки.Удалить("ВыбранныеФорматыСохранения"); КонецЕсли; - Если Элементы.ВыбранныйОбъект.СписокВыбора.Количество() = 0 Тогда - НастройкаВариантСохранения = Настройки["ВариантСохранения"]; - Если НастройкаВариантСохранения <> Неопределено Тогда - Настройки.Удалить("ВариантСохранения"); - КонецЕсли; + Если Элементы.ВариантСохранения.ТолькоПросмотр Тогда + Настройки["ВариантСохранения"] = "СохранитьВПапку"; КонецЕсли; + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + Настройки["Подписать"] = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки) + Если ВыбранныеФорматыСохранения.Количество() = 1 Тогда + Настройки.Удалить("ВыбранныеФорматыСохранения"); + КонецЕсли; КонецПроцедуры &НаКлиенте @@ -108,11 +144,6 @@ КонецЕсли; КонецПроцедуры -&НаКлиенте -Процедура ВыбранныйОбъектОчистка(Элемент, СтандартнаяОбработка) - СтандартнаяОбработка = Ложь; -КонецПроцедуры - #КонецОбласти #Область ОбработчикиКомандФормы @@ -145,10 +176,44 @@ РезультатВыбора.Вставить("ФорматыСохранения", ФорматыСохранения); РезультатВыбора.Вставить("ВариантСохранения", ВариантСохранения); РезультатВыбора.Вставить("ПапкаДляСохранения", ВыбраннаяПапка); - РезультатВыбора.Вставить("ОбъектДляПрикрепления", ВыбранныйОбъект); РезультатВыбора.Вставить("ПереводитьИменаФайловВТранслит", ПереводитьИменаФайловВТранслит); - - ОповеститьОВыборе(РезультатВыбора); + РезультатВыбора.Вставить("Подписать", Подписать); + + Если ВариантСохранения = "Присоединить" Тогда + СтрокаОшибки = ""; + ОбъектыДляПрикрепления = Новый Соответствие; + Для Каждого ОбъектПрикрепления Из ОбъектыПрикрепления Цикл + Если Не ОбъектПрикрепления.Пометка Тогда + СтрокаОшибки = СтрокаОшибки + ОбъектПрикрепления.Значение; + Иначе + ОбъектыДляПрикрепления.Вставить(ОбъектПрикрепления.Значение, Истина); + КонецЕсли; + КонецЦикла; + + РезультатВыбора.Вставить("ОбъектыДляПрикрепления", ОбъектыДляПрикрепления); + + Если СтрокаОшибки <> "" Тогда + ОписаниеОповещенияПродолжениеСохранения = Новый ОписаниеОповещения("ПродолжениеСохранения", ЭтотОбъект, РезультатВыбора); + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Прикрепление не будет выполнено для объектов: + | %1'"), СтрокаОшибки); + + Кнопки = Новый СписокЗначений; + Кнопки.Добавить("Отменить", НСтр("ru = 'Отменить'")); + Кнопки.Добавить("Продолжить", НСтр("ru = 'Продолжить'")); + + ПараметрыВопроса = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю(); + ПараметрыВопроса.Заголовок = НСтр("ru = 'Недостаточно прав для прикрепления'"); + ПараметрыВопроса.БлокироватьВесьИнтерфейс = Истина; + ПараметрыВопроса.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь; + + СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(ОписаниеОповещенияПродолжениеСохранения, ТекстВопроса, Кнопки, ПараметрыВопроса); + Иначе + ОповеститьОВыборе(РезультатВыбора); + КонецЕсли; + Иначе + ОповеститьОВыборе(РезультатВыбора); + КонецЕсли; КонецПроцедуры @@ -160,31 +225,27 @@ Процедура УстановитьСтраницуМестаСохранения() Если Элементы.ПапкаДляСохраненияФайлов.Видимость Тогда - Если ВариантСохранения = "Присоединить" Тогда - Элементы.ГруппаМестаСохранения.ТекущаяСтраница = Элементы.СтраницаПрисоединениеКОбъекту; - Иначе - Элементы.ГруппаМестаСохранения.ТекущаяСтраница = Элементы.СтраницаСохранениеВПапку; - КонецЕсли; - Иначе - Элементы.ВыбранныйОбъект.Доступность = ВариантСохранения = "Присоединить"; + Элементы.ПапкаДляСохраненияФайлов.Доступность = Не ВариантСохранения = "Присоединить"; КонецЕсли КонецПроцедуры -&НаСервере -Функция КОбъектуМожноПрисоединятьФайлы(СсылкаНаОбъект) - МожноПрисоединять = Неопределено; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); - МожноПрисоединять = МодульРаботаСФайлами.КОбъектуМожноПрисоединятьФайлы(СсылкаНаОбъект); +&НаКлиенте +Процедура ПродолжениеСохранения(РезультатВопроса, РезультатВыбора) Экспорт + Если РезультатВопроса.Значение = "Отменить" Тогда + Закрыть(); + Иначе + ОповеститьОВыборе(РезультатВыбора); КонецЕсли; - - Если МожноПрисоединять = Неопределено Тогда - МожноПрисоединять = Ложь; - КонецЕсли; - - Возврат МожноПрисоединять; +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПолучитьОбъектыДляПрикрепления(ОбъектыПечати) + Результат = Новый СписокЗначений; + Для Каждого ОбъектПечати Из ОбъектыПечати Цикл + Результат.Добавить(ОбъектПечати.Значение,,УправлениеДоступом.ИзменениеРазрешено(ОбъектПечати.Значение)); + КонецЦикла; + Возврат Результат; КонецФункции #КонецОбласти diff --git a/SSL/src/CommonForms/СравнениеТабличныхДокументов/Form.form b/SSL/src/CommonForms/СравнениеТабличныхДокументов/Form.form index 58e876450..a60a7a8b8 100644 --- a/SSL/src/CommonForms/СравнениеТабличныхДокументов/Form.form +++ b/SSL/src/CommonForms/СравнениеТабличныхДокументов/Form.form @@ -169,7 +169,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -343,7 +342,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -374,7 +372,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/CommonForms/СравнениеТабличныхДокументов/Module.bsl b/SSL/src/CommonForms/СравнениеТабличныхДокументов/Module.bsl index 41cac2501..9463febdc 100644 --- a/SSL/src/CommonForms/СравнениеТабличныхДокументов/Module.bsl +++ b/SSL/src/CommonForms/СравнениеТабличныхДокументов/Module.bsl @@ -671,11 +671,11 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | ЕстьNULL(МАКСИМУМ(СоответствияСКонфликтами.КоличествоКонфликтов), 0) КАК КоличествоКонфликтов + | ЕСТЬNULL(МАКСИМУМ(СоответствияСКонфликтами.КоличествоКонфликтов), 0) КАК КоличествоКонфликтов |ИЗ | СоответствияСКонфликтами КАК СоответствияСКонфликтами"; - Выборка = Запрос.Выполнить().Выбрать(); //@skip-check query-in-loop Итерационная обработка таблицы + Выборка = Запрос.Выполнить().Выбрать(); //@skip-check query-in-loop - Итерационная обработка таблицы Выборка.Следующий(); УровеньКонфликтов = Выборка.КоличествоКонфликтов; @@ -689,7 +689,7 @@ ВременныеТаблицыКУдалению.Добавить("МаксимальныйВесЗамены"); ВременныеТаблицыКУдалению.Добавить("НайденныеКонфликтыВариантов"); - УдалитьВременныеТаблицы(Запрос, ВременныеТаблицыКУдалению); + УдалитьВременныеТаблицы(Запрос, ВременныеТаблицыКУдалению); //@skip-check query-in-loop - Итерационная обработка таблицы КонецЦикла; @@ -894,7 +894,7 @@ &НаСервере Процедура УдалитьВременныеТаблицы(Запрос, Таблицы) Запрос.Текст = "УНИЧТОЖИТЬ " + СтрСоединить(Таблицы, "; УНИЧТОЖИТЬ "); - Запрос.Выполнить(); //@skip-check query-in-loop Итерационная обработка таблицы + Запрос.Выполнить(); КонецПроцедуры #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonForms/УстановкаВнешнейКомпонентыНевозможна/Form.form b/SSL/src/CommonForms/УстановкаВнешнейКомпонентыНевозможна/Form.form index f84814d16..67d1672cb 100644 --- a/SSL/src/CommonForms/УстановкаВнешнейКомпонентыНевозможна/Form.form +++ b/SSL/src/CommonForms/УстановкаВнешнейКомпонентыНевозможна/Form.form @@ -111,7 +111,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/CommonForms/УстановкаВнешнейКомпонентыНевозможна/Module.bsl b/SSL/src/CommonForms/УстановкаВнешнейКомпонентыНевозможна/Module.bsl index 5eb7b85c6..b1fdbfc9d 100644 --- a/SSL/src/CommonForms/УстановкаВнешнейКомпонентыНевозможна/Module.bsl +++ b/SSL/src/CommonForms/УстановкаВнешнейКомпонентыНевозможна/Module.bsl @@ -11,19 +11,8 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) - ТекстПояснения = Параметры.ТекстПояснения; - - Если ПустаяСтрока(ТекстПояснения) Тогда - ТекстПояснения = НСтр("ru = 'Установка внешней компоненты невозможна.'"); - КонецЕсли; - - Элементы.ДекорацияПояснение.Заголовок = СтроковыеФункцииКлиент.ФорматированнаяСтрока(НСтр("ru = '%1 - | - |Не предусмотрена работа внешней компоненты - |в клиентском приложении <b>%2</b>. - |Используйте <a href = about:blank>поддерживаемое клиентское приложение</a> или обратитесь к разработчику внешней компоненты.'"), - ТекстПояснения, - ПредставлениеТекущегоКлиента()); + Элементы.ДекорацияПояснение.Заголовок = ВнешниеКомпонентыСлужебныйКлиент.ТекстУстановкаВнешнейКомпонентыНевозможна( + Параметры.ТекстПояснения); КонецПроцедуры @@ -44,59 +33,3 @@ КонецПроцедуры #КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -&НаКлиенте -Функция ПредставлениеТекущегоКлиента() - - СистемнаяИнформация = Новый СистемнаяИнформация; - -#Если ВебКлиент Тогда - Строка = СистемнаяИнформация.ИнформацияПрограммыПросмотра; - - Если СтрНайти(Строка, "Chrome/") > 0 Тогда - Браузер = НСтр("ru = 'Chrome'"); - ИначеЕсли СтрНайти(Строка, "MSIE") > 0 Тогда - Браузер = НСтр("ru = 'Internet Explorer'"); - ИначеЕсли СтрНайти(Строка, "Safari/") > 0 Тогда - Браузер = НСтр("ru = 'Safari'"); - ИначеЕсли СтрНайти(Строка, "Firefox/") > 0 Тогда - Браузер = НСтр("ru = 'Firefox'"); - КонецЕсли; - - Приложение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'веб-клиент %1'"), Браузер); -#ИначеЕсли МобильноеПриложениеКлиент Тогда - Приложение = НСтр("ru = 'мобильное приложение'"); -#ИначеЕсли МобильныйКлиент Тогда - Приложение = НСтр("ru = 'мобильный клиент'"); -#ИначеЕсли ТонкийКлиент Тогда - Приложение = НСтр("ru = 'тонкий клиент'"); -#ИначеЕсли ТолстыйКлиентОбычноеПриложение Тогда - Приложение = НСтр("ru = 'толстый клиент (обычное приложение)'"); -#ИначеЕсли ТолстыйКлиентУправляемоеПриложение Тогда - Приложение = НСтр("ru = 'толстый клиент'"); -#КонецЕсли - - Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда - Платформа = НСтр("ru = 'Windows x86'"); - ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда - Платформа = НСтр("ru = 'Windows x86-64'"); - ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 Тогда - Платформа = НСтр("ru = 'Linux x86'"); - ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда - Платформа = НСтр("ru = 'Linux x86-64'"); - ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86 Тогда - Платформа = НСтр("ru = 'macOS x86'"); - ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86_64 Тогда - Платформа = НСтр("ru = 'macOS x86-64'"); - КонецЕсли; - - // Например: - // веб-клиент Firefox Windows x86 - // тонкий клиент Windows x86-64 - Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 %2'"), Приложение, Платформа); - -КонецФункции - -#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonForms/УстановленныеИсправления/Form.form b/SSL/src/CommonForms/УстановленныеИсправления/Form.form index f24af796f..0b76a83d2 100644 --- a/SSL/src/CommonForms/УстановленныеИсправления/Form.form +++ b/SSL/src/CommonForms/УстановленныеИсправления/Form.form @@ -1,23 +1,93 @@ <?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"> <items xsi:type="form:FormGroup"> - <name>ГруппаИнформация</name> - <id>76</id> - <items xsi:type="form:Decoration"> - <name>ИнформацияКартинка</name> - <id>62</id> - <title> - <key>ru</key> - <value>Информация картинка</value> - + СтраницыИнформация + 115 + + СтраницаИнформация + 76 + + ИнформацияКартинка + 62 + + <key>ru</key> + <value>Информация картинка</value> + + true + true + + true + + + ИнформацияКартинкаРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + ИнформацияКартинкаКонтекстноеМеню + 63 + true + + true + true + + + CommonPicture.Информация32 + + + + + ИнформацияОписание + 67 + + <key>ru</key> + <value>Изменения, которые будут сделаны, вступят в силу при следующем входе в программу.</value> + + true + true + + true + + + ИнформацияОписаниеРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + + ИнформацияОписаниеКонтекстноеМеню + 68 + true + + Label + true + + Left + Center + 2 + + true true true + + <key>ru</key> + <value>Информация</value> + - ИнформацияКартинкаРасширеннаяПодсказка - 64 + СтраницаИнформацияРасширеннаяПодсказка + 77 Label true true @@ -25,34 +95,94 @@ Left
    - - ИнформацияКартинкаКонтекстноеМеню - 63 - true - - true - true - - - CommonPicture.Информация32 - + Page + + HorizontalIfPossible + auto + false - - ИнформацияОписание - 67 - - <key>ru</key> - <value>Изменения, которые будут сделаны, вступят в силу при следующем входе в программу.</value> - + + СтраницаДлительнаяОперация + 117 + + ДлительнаяОперация + 119 + true + true + + true + + + ДлительнаяОперацияРасширеннаяПодсказка + 121 + Label + true + true + + Left + + + + ДлительнаяОперацияКонтекстноеМеню + 120 + true + + true + true + + + CommonPicture.ДлительнаяОперация48 + + + + + ПожалуйстаПодождите + 122 + + <key>ru</key> + <value>Выполняется подготовка исправлений к использованию. Пожалуйста, подождите...</value> + + true + true + + true + + + ПожалуйстаПодождитеРасширеннаяПодсказка + 124 + Label + true + true + + Left + + + + ПожалуйстаПодождитеКонтекстноеМеню + 123 + true + + Label + 3 + true + + Left + Center + + true true true + + <key>ru</key> + <value>Страница длительная операция</value> + - ИнформацияОписаниеРасширеннаяПодсказка - 69 + СтраницаДлительнаяОперацияРасширеннаяПодсказка + 118 Label true true @@ -60,17 +190,10 @@ Left - - ИнформацияОписаниеКонтекстноеМеню - 68 - true - - Label - true - - Left - Center - 2 + Page + + AlwaysHorizontal + false true @@ -80,11 +203,11 @@
    <key>ru</key> - <value>Информация</value> + <value>Страницы информация</value> - ГруппаИнформацияРасширеннаяПодсказка - 77 + СтраницыИнформацияРасширеннаяПодсказка + 116 Label true true @@ -92,13 +215,8 @@ Left
    - UsualGroup - - HorizontalIfPossible - Auto - true - true - Auto + Pages + Auto @@ -127,6 +245,51 @@ ShowRowRearrangement SortListAsc SortListDesc + + УстановленныеИсправленияПодключать + 112 + true + true + + true + + + УстановленныеИсправления.Подключать + + None + + ru + Подключать исправление при входе в программу + + + OnChange + УстановленныеИсправленияПодключатьПриИзменении + + + УстановленныеИсправленияПодключатьРасширеннаяПодсказка + 114 + Label + true + true + + Left + + + + УстановленныеИсправленияПодключатьКонтекстноеМеню + 113 + true + + CheckBoxField + Enter + true + + StdPicture.CheckAll + + Left + true + + УстановленныеИсправленияГруппаКартинки 32 @@ -406,6 +569,32 @@ Auto InCommandBarAndInAdditionalSubmenu + + УстановленныеИсправленияВыгрузитьПодключенныеИсправления + 125 + true + true + + true + + + УстановленныеИсправленияВыгрузитьПодключенныеИсправленияРасширеннаяПодсказка + 126 + Label + true + true + + Left + + + Form.Command.ВыгрузитьПодключенныеИсправления + Normal + Auto + true + true + UserCmds + Auto + УстановленныеИсправленияЗакрыть 110 @@ -537,6 +726,38 @@ Auto InAdditionalSubmenu + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 127 + + СтрокаПоискаРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 128 + true + + УстановленныеИсправления + + true + + Left @@ -812,7 +1033,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -913,7 +1133,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1014,7 +1233,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1043,7 +1261,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1114,7 +1331,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1289,6 +1505,23 @@ true + + Подключать + + <key>ru</key> + <value>Подключать</value> + + 12 + + Boolean + + + true + + + true + + Фильтр @@ -1345,6 +1578,17 @@ true + + Контекст + 13 + + + true + + + true + + СохранитьКак @@ -1370,6 +1614,24 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>ВыгрузитьПодключенныеИсправления</name> + <title> + <key>ru</key> + <value>Выгрузить подключенные исправления</value> + + 2 + + true + + + + ВыгрузитьПодключенныеИсправления + + + Auto + Auto + Исправления diff --git a/SSL/src/CommonForms/УстановленныеИсправления/Module.bsl b/SSL/src/CommonForms/УстановленныеИсправления/Module.bsl index 0bfc00188..645137e80 100644 --- a/SSL/src/CommonForms/УстановленныеИсправления/Module.bsl +++ b/SSL/src/CommonForms/УстановленныеИсправления/Module.bsl @@ -28,7 +28,7 @@ ИначеЕсли Параметры.ПриОбновлении Тогда Элементы.ИнформацияОписание.Заголовок = НСтр("ru = 'Установленные исправления вступят в силу после перезапуска программы.'"); ИначеЕсли Не ОбщегоНазначения.ЭтоWindowsКлиент() Тогда - Элементы.ГруппаИнформация.Видимость = Ложь; + Элементы.СтраницыИнформация.Видимость = Ложь; КонецЕсли; Если ЗначениеЗаполнено(Параметры.Исправления) Тогда @@ -48,8 +48,10 @@ Или Параметры.ПриОбновлении Тогда Элементы.ФормаУстановитьИсправление.Видимость = Ложь; Элементы.ФормаУдалитьИсправление.Видимость = Ложь; + Элементы.УстановленныеИсправленияВыгрузитьПодключенныеИсправления.Видимость = Ложь; Элементы.УстановленныеИсправленияКонтекстноеМенюДобавить.Видимость = Ложь; Элементы.УстановленныеИсправленияКонтекстноеМенюУдалить.Видимость = Ложь; + Элементы.УстановленныеИсправленияПодключать.Видимость = Ложь; КонецЕсли; ОбновитьСписокИсправлений(); @@ -93,36 +95,84 @@ КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура УстановленныеИсправленияПодключатьПриИзменении(Элемент) + ТекущиеДанные = Элементы.УстановленныеИсправления.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Контекст = Новый Структура; + Контекст.Вставить("ИдентификаторСтроки", ТекущиеДанные.ПолучитьИдентификатор()); + + ПоказатьДлительнуюОперацию(); + ПодключитьОбработчикОжидания("УстановленныеИсправленияПодключатьПриИзмененииЗавершение", 0.1, Истина); +КонецПроцедуры + +&НаКлиенте +Процедура УстановленныеИсправленияПодключатьПриИзмененииЗавершение() + + Попытка + УстановленныеИсправленияПодключатьПриИзмененииНаСервере(Контекст.ИдентификаторСтроки); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ПоказатьПредупреждение(, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + КонецПопытки; + + СкрытьДлительнуюОперацию(); + +КонецПроцедуры + +&НаСервере +Процедура УстановленныеИсправленияПодключатьПриИзмененииНаСервере(ИдентификаторСтроки) + + СтрокаСписка = УстановленныеИсправления.НайтиПоИдентификатору(ИдентификаторСтроки); + Если СтрокаСписка = Неопределено Тогда + Возврат; + КонецЕсли; + + ТекущееИспользование = СтрокаСписка.Подключать; + Попытка + Справочники.ВерсииРасширений.ПереключитьИспользованиеРасширения(СтрокаСписка.ИдентификаторРасширения, ТекущееИспользование); + Исключение + СтрокаСписка.Подключать = Не СтрокаСписка.Подключать; + ОбновитьСписокИсправлений(); + + ВызватьИсключение; + КонецПопытки; + + ОбновитьСписокИсправлений(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьДлительнуюОперацию() + + Элементы.СтраницыИнформация.ТекущаяСтраница= Элементы.СтраницаДлительнаяОперация; + ТолькоПросмотр = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура СкрытьДлительнуюОперацию() + + Элементы.СтраницыИнформация.ТекущаяСтраница = Элементы.СтраницаИнформация; + ТолькоПросмотр = Ложь; + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы &НаКлиенте Процедура СохранитьКак(Команда) - - ВыделенныеСтроки = Элементы.УстановленныеИсправления.ВыделенныеСтроки; - ОписаниеОповещения = Новый ОписаниеОповещения("СохранитьКакЗавершение", ЭтотОбъект, ВыделенныеСтроки); - - Если ВыделенныеСтроки.Количество() = 0 Тогда - Возврат; - ИначеЕсли ВыделенныеСтроки.Количество() = 1 Тогда - СохраняемыеФайлы = СохранитьНаСервере(ВыделенныеСтроки); - Иначе - Заголовок = НСтр("ru = 'Выберите каталог для сохранения исправлений конфигурации'"); - ФайловаяСистемаКлиент.ВыбратьКаталог(ОписаниеОповещения, Заголовок); - Возврат; - КонецЕсли; - - Если СохраняемыеФайлы.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла(); - ПараметрыСохранения.Диалог.Заголовок = НСтр("ru = 'Выберите файл для сохранения исправления конфигурации'"); - ПараметрыСохранения.Диалог.Фильтр = НСтр("ru = 'Файлы исправлений конфигурации (*.cfe)|*.cfe|Все файлы (*.*)|*.*'"); - - ФайловаяСистемаКлиент.СохранитьФайлы(Неопределено, СохраняемыеФайлы, ПараметрыСохранения); - + СохранитьИсправления(); +КонецПроцедуры + +&НаКлиенте +Процедура ВыгрузитьПодключенныеИсправления(Команда) + СохранитьИсправления(Истина); КонецПроцедуры #КонецОбласти @@ -157,6 +207,7 @@ НоваяСтрока.Имя = Расширение.Имя; НоваяСтрока.КонтрольнаяСумма = Base64Строка(Расширение.ХешСумма); НоваяСтрока.ИдентификаторРасширения = Расширение.УникальныйИдентификатор; + НоваяСтрока.Подключать = Расширение.Активно; НоваяСтрока.Версия = Расширение.Версия; Если СвойстваИсправления = "ОшибкаЧтения" Тогда НоваяСтрока.Статус = 0; @@ -276,8 +327,7 @@ УдалитьРасширенияНаСервере(Контекст.ИдентификаторыРасширений); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - Возврат; + ОбработкаОшибок.ПоказатьИнформациюОбОшибке(ИнформацияОбОшибке); КонецПопытки; КонецПроцедуры @@ -324,6 +374,57 @@ КонецПроцедуры +&НаКлиенте +Процедура СохранитьИсправления(ТолькоПодключенные = Ложь) + + Если ТолькоПодключенные Тогда + ВыделенныеСтроки = ИдентификаторыПодключенныхИсправлений(); + Иначе + ВыделенныеСтроки = Элементы.УстановленныеИсправления.ВыделенныеСтроки; + КонецЕсли; + + ОписаниеОповещения = Новый ОписаниеОповещения("СохранитьКакЗавершение", ЭтотОбъект, ВыделенныеСтроки); + + Если ВыделенныеСтроки.Количество() = 0 Тогда + Если ТолькоПодключенные Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Нет подключенных исправлений.'")); + КонецЕсли; + Возврат; + ИначеЕсли Не ТолькоПодключенные И ВыделенныеСтроки.Количество() = 1 Тогда + СохраняемыеФайлы = СохранитьНаСервере(ВыделенныеСтроки); + Иначе + Заголовок = НСтр("ru = 'Выберите каталог для сохранения исправлений конфигурации'"); + ФайловаяСистемаКлиент.ВыбратьКаталог(ОписаниеОповещения, Заголовок); + Возврат; + КонецЕсли; + + Если СохраняемыеФайлы.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла(); + ПараметрыСохранения.Диалог.Заголовок = НСтр("ru = 'Выберите файл для сохранения исправления конфигурации'"); + ПараметрыСохранения.Диалог.Фильтр = НСтр("ru = 'Файлы исправлений конфигурации (*.cfe)|*.cfe|Все файлы (*.*)|*.*'"); + + ФайловаяСистемаКлиент.СохранитьФайлы(Неопределено, СохраняемыеФайлы, ПараметрыСохранения); + +КонецПроцедуры + +&НаКлиенте +Функция ИдентификаторыПодключенныхИсправлений() + + Подключенные = Новый Массив; + Для Каждого Строка Из УстановленныеИсправления Цикл + Если Не Строка.Подключать Тогда + Продолжить; + КонецЕсли; + + Подключенные.Добавить(Строка.ПолучитьИдентификатор()); + КонецЦикла; + + Возврат Подключенные; +КонецФункции + &НаСервере Функция СохранитьНаСервере(ИдентификаторыСтрок, ПутьККаталогу = "") diff --git a/SSL/src/CommonForms/УточнениеКонтактов/Module.bsl b/SSL/src/CommonForms/УточнениеКонтактов/Module.bsl index fef8c72f9..f2be18fde 100644 --- a/SSL/src/CommonForms/УточнениеКонтактов/Module.bsl +++ b/SSL/src/CommonForms/УточнениеКонтактов/Module.bsl @@ -447,15 +447,15 @@ |ВЫБРАТЬ | ВидыКонтактнойИнформации.Ссылка КАК Вид, | ВидыКонтактнойИнформации.Наименование КАК ВидНаименование, - | ТаблицаКонтакты.Ссылка КАК Контакт + | ТаблицаКонтактов.Ссылка КАК Контакт |ПОМЕСТИТЬ ПользователиВидыКИ |ИЗ | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации, - | Справочник.Пользователи КАК ТаблицаКонтакты + | Справочник.Пользователи КАК ТаблицаКонтактов |ГДЕ | ВидыКонтактнойИнформации.Родитель = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.СправочникПользователи) | И ВидыКонтактнойИнформации.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты) - | И ТаблицаКонтакты.Ссылка В + | И ТаблицаКонтактов.Ссылка В | (ВЫБРАТЬ | Контакты.Контакт | ИЗ @@ -481,15 +481,15 @@ |ВЫБРАТЬ | ВидыКонтактнойИнформации.Ссылка КАК Вид, | ВидыКонтактнойИнформации.Наименование КАК ВидНаименование, - | ТаблицаКонтакты.Ссылка КАК Контакт + | ТаблицаКонтактов.Ссылка КАК Контакт |ПОМЕСТИТЬ ВременнаяТаблицаВидыКИ |ИЗ | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации, - | &ИмяСправочника КАК ТаблицаКонтакты + | &ИмяСправочника КАК ТаблицаКонтактов |ГДЕ | ВидыКонтактнойИнформации.ИмяГруппы = &ВариантОтбора | И ВидыКонтактнойИнформации.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты) - | И ТаблицаКонтакты.Ссылка В + | И ТаблицаКонтактов.Ссылка В | (ВЫБРАТЬ | Контакты.Контакт | ИЗ @@ -500,7 +500,8 @@ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВременнаяТаблицаВидыКИ", ЭлементМассиваОписания.Имя + "ВидыКИ"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", "Справочник." + ЭлементМассиваОписания.Имя); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВариантОтбора", ВариантОтбора); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеПоГруппе", ?(ЭлементМассиваОписания.Иерархический,"И (НЕ ТаблицаКонтакты.ЭтоГруппа)","")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеПоГруппе", + ?(ЭлементМассиваОписания.Иерархический,"И (НЕ ТаблицаКонтактов.ЭтоГруппа)","")); КонецЦикла; @@ -538,7 +539,7 @@ | &ИмяТаблицыВидыКИ КАК КонтактыВидыКИ | ЛЕВОЕ СОЕДИНЕНИЕ &ИмяТаблицыКонтактнаяИнформация КАК КонтактнаяИнформация | ПО КонтактыВидыКИ.ВИД = КонтактнаяИнформация.Вид - | И КонтактыВидыКИ.Контакт = КонтактнаяИнформация.Ссылка"; // @query-part1 + | И КонтактыВидыКИ.Контакт = КонтактнаяИнформация.Ссылка"; // @query-part-1 ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицыВидыКИ", ЭлементМассиваОписания.Имя + "ВидыКИ"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицыКонтактнаяИнформация", "Справочник." + ЭлементМассиваОписания.Имя + ".КонтактнаяИнформация"); @@ -634,13 +635,13 @@ Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ - | ТаблицаКонтакты.Контакт, - | ТаблицаКонтакты.Адрес, - | ТаблицаКонтакты.ТекущийВидКонтактнойИнформации, - | ТаблицаКонтакты.Изменять + | ТаблицаКонтактов.Контакт, + | ТаблицаКонтактов.Адрес, + | ТаблицаКонтактов.ТекущийВидКонтактнойИнформации, + | ТаблицаКонтактов.Изменять |ПОМЕСТИТЬ ВсеКонтакты |ИЗ - | &ТаблицаКонтакты КАК ТаблицаКонтакты + | &ТаблицаКонтактов КАК ТаблицаКонтактов |; | |//////////////////////////////////////////////////////////////////////////////// @@ -653,7 +654,7 @@ |ГДЕ | ВсеКонтакты.Изменять"; - Запрос.УстановитьПараметр("ТаблицаКонтакты", ТаблицаКонтактов.Выгрузить()); + Запрос.УстановитьПараметр("ТаблицаКонтактов", ТаблицаКонтактов.Выгрузить()); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл @@ -667,8 +668,6 @@ ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Контакт); Блокировка.Заблокировать(); - КонтактОбъект = Выборка.Контакт.ПолучитьОбъект(); // ОпределяемыйТип.КонтактВзаимодействия - УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию(Выборка.Контакт, Выборка.Адрес, Выборка.Вид, , Истина); Запрос = Новый Запрос; @@ -757,9 +756,10 @@ |ИТОГИ ПО | Ссылка"; - Запрос.УстановитьПараметр("Адрес",Выборка.Адрес); - Запрос.УстановитьПараметр("Письмо",Письмо); + Запрос.УстановитьПараметр("Адрес", Выборка.Адрес); + Запрос.УстановитьПараметр("Письмо", Письмо); + // @skip-check query-in-loop - Порционная обработка большого объема писем по контактам. Результат = Запрос.Выполнить(); МассивИсходящихПисем = Новый Массив; МассивВходящихПисем = Новый Массив; @@ -816,13 +816,13 @@ ВыборкаДеталиПисьма = ВыборкаПисьма.Выбрать(); Пока ВыборкаДеталиПисьма.Следующий() Цикл Если ВыборкаДеталиПисьма.ИмяТабличнойЧасти = "Отправитель" Тогда - ПисьмоОбъект.ОтправительКонтакт = КонтактОбъект.Ссылка; + ПисьмоОбъект.ОтправительКонтакт = Выборка.Контакт; Иначе НайденныеСтроки = ПисьмоОбъект[ВыборкаДеталиПисьма.ИмяТабличнойЧасти].НайтиСтроки(Новый Структура("Адрес", Выборка.Адрес)); Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл Если Не ЗначениеЗаполнено(НайденнаяСтрока.Контакт) Тогда - НайденнаяСтрока.Контакт = КонтактОбъект.Ссылка; + НайденнаяСтрока.Контакт = Выборка.Контакт; КонецЕсли; КонецЦикла; КонецЕсли; @@ -839,9 +839,9 @@ ОтменитьТранзакцию(); ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Во время обновления контактной информации %1 произошла ошибка + НСтр("ru = 'Не удалось обновить контактную информацию %1 по причине: |%2'", ОбщегоНазначения.КодОсновногоЯзыка()), - Выборка.Контакт, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Выборка.Контакт, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, , , ТекстСообщенияОбОшибке); diff --git a/SSL/src/CommonForms/ФайлыВТоме/Form.form b/SSL/src/CommonForms/ФайлыВТоме/Form.form index 29662c8d6..903838f58 100644 --- a/SSL/src/CommonForms/ФайлыВТоме/Form.form +++ b/SSL/src/CommonForms/ФайлыВТоме/Form.form @@ -74,7 +74,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/CommonForms/ФормаВыбораЦвета/Form.form b/SSL/src/CommonForms/ФормаВыбораЦвета/Form.form new file mode 100644 index 000000000..f1eb645df --- /dev/null +++ b/SSL/src/CommonForms/ФормаВыбораЦвета/Form.form @@ -0,0 +1,158 @@ + + + + <key>ru</key> + <value>Выберите цвет текста</value> + + + ГруппаДополнительныеДействия + 1 + + ОчиститьЦвет + 9 + true + true + + true + + + ОчиститьЦветРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + UsualButton + Form.Command.ОчиститьЦвет + Normal + Auto + true + true + UserCmds + Auto + + + ДругиеЦвета + 6 + + <key>ru</key> + <value>Другие цвета</value> + + true + true + + true + + + ДругиеЦветаРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + + ДругиеЦветаКонтекстноеМеню + 7 + true + + Label + true + true + + + Click + ДругиеЦветаНажатие + + true + + + true + true + + true + + + <key>ru</key> + <value>Дополнительные действия</value> + + true + + ГруппаДополнительныеДействияРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + 30 + 17 + LockOwner + true + true + Vertical + true + true + auto + true + + СтрокаЦвета + 3 + + FormattedString + + + true + + + true + + + + ОчиститьЦвет + + <key>ru</key> + <value>Очистить цвет</value> + + 1 + + true + + + + ОчиститьЦвет + + + Auto + Auto + + + + + + diff --git a/SSL/src/CommonForms/ФормаВыбораЦвета/Module.bsl b/SSL/src/CommonForms/ФормаВыбораЦвета/Module.bsl new file mode 100644 index 000000000..31c8f89c6 --- /dev/null +++ b/SSL/src/CommonForms/ФормаВыбораЦвета/Module.bsl @@ -0,0 +1,93 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ДобавитьЦвета("ЧерноБелые", "000000,444444,666666,999999,CCCCCC,EEEEEE,F3F3F3,FFFFFF"); + ДобавитьЦвета("Основные", "EB3541,EB9635,EBDE35,41EB35,35EBDE,3541EB,9635EB,DE35EB"); + ДобавитьЦвета("Остальные", "E5717C,F9AC75,FFCE73,A1CA86,81B3B7,79BAE1,9085C9,C884AE"); + ДобавитьЦвета("Остальные", "D31225,EB8A46,F5B640,7EB15C,539399,4B9CCD,6B5BB0,AF5A8D"); + ДобавитьЦвета("Остальные", "B10E1E,CB5B11,D78F0A,518B2B,246B72,1871AA,3B2B8A,892A61"); + ДобавитьЦвета("Остальные", "680910,7B310B,845008,2E4D17,133B3F,0E3D63,1D164C,4B1635"); +КонецПроцедуры + +&НаСервере +Процедура ДобавитьЦвета(ИмяГруппы, СтрокаЦветов) + + Размещение = Элементы.Найти(ИмяГруппы); + + Если Размещение = Неопределено Тогда + Размещение = Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы")); + Размещение.Вид = ВидГруппыФормы.ОбычнаяГруппа; + Размещение.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + Размещение.ОтображатьЗаголовок = Ложь; + Элементы.Переместить(Размещение, ЭтотОбъект, Элементы.ГруппаДополнительныеДействия); + Размещение.ВертикальныйИнтервал = ИнтервалМеждуЭлементамиФормы.Нет; + КонецЕсли; + + Счетчик = 0; + + Пока Элементы.Найти("Группа"+Формат(Счетчик, "ЧГ=0;")) <> Неопределено Цикл + Счетчик = Счетчик + 1; + КонецЦикла; + + ГруппаЦветов = Элементы.Добавить("Группа"+Формат(Счетчик, "ЧГ=0;"), Тип("ГруппаФормы"), Размещение); + ГруппаЦветов.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ГруппаЦветов.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда; + ГруппаЦветов.ОтображатьЗаголовок = Ложь; + ГруппаЦветов.ГоризонтальныйИнтервал = ИнтервалМеждуЭлементамиФормы.Нет; + ГруппаЦветов.ВертикальныйИнтервал = ИнтервалМеждуЭлементамиФормы.Нет; + + МассивЦветов = СтрРазделить(СтрокаЦветов, ","); + + Для Каждого Цвет Из МассивЦветов Цикл + ДекорацияЦвета = Элементы.Добавить("Цвет_"+Цвет, Тип("ДекорацияФормы"), ГруппаЦветов); + ДекорацияЦвета.Вид = ВидДекорацииФормы.Надпись; + Красный = ЧислоИзШестнадцатеричнойСтроки("0x" + Сред(Цвет, 1, 2)); + Зеленый = ЧислоИзШестнадцатеричнойСтроки("0x" + Сред(Цвет, 3, 2)); + Синий = ЧислоИзШестнадцатеричнойСтроки("0x" + Сред(Цвет, 5, 2)); + // @skip-check new-color - алгоритмическое создание цветов для палитры + ДекорацияЦвета.ЦветФона = Новый Цвет(Красный, Зеленый, Синий); + ДекорацияЦвета.Заголовок = " "; + ДекорацияЦвета.Ширина = 4; + ДекорацияЦвета.Высота = 2; + ДекорацияЦвета.Рамка = Новый Рамка(ТипРамкиЭлементаУправления.Одинарная); + ДекорацияЦвета.ЦветРамки = ЦветаСтиля.ЦветФонаФормы; + ДекорацияЦвета.УстановитьДействие("Нажатие", "Подключаемый_ЦветНажатие"); + ДекорацияЦвета.Гиперссылка = Истина; + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКоманд + +&НаКлиенте +Процедура ОчиститьЦвет(Команда) + Закрыть(Новый Цвет()); +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура Подключаемый_ЦветНажатие(Элемент) + Закрыть(Элемент.ЦветФона); +КонецПроцедуры + +&НаКлиенте +Процедура ДругиеЦветаНажатие(Элемент) + Закрыть("ДругиеЦвета"); +КонецПроцедуры + + +#КонецОбласти diff --git a/SSL/src/CommonForms/ФормаВыбораЦвета/ФормаВыбораЦвета.mdo b/SSL/src/CommonForms/ФормаВыбораЦвета/ФормаВыбораЦвета.mdo new file mode 100644 index 000000000..f78105e8a --- /dev/null +++ b/SSL/src/CommonForms/ФормаВыбораЦвета/ФормаВыбораЦвета.mdo @@ -0,0 +1,11 @@ + + + ФормаВыбораЦвета + + ru + Форма выбора цвета + + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonForms/ФормаВыбораШрифта/Form.form b/SSL/src/CommonForms/ФормаВыбораШрифта/Form.form new file mode 100644 index 000000000..9cff7cb56 --- /dev/null +++ b/SSL/src/CommonForms/ФормаВыбораШрифта/Form.form @@ -0,0 +1,492 @@ + + + + ГруппаКоманды + 8 + + ДекорацияОтступ + 24 + true + true + + true + + + ДекорацияОтступРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ДекорацияОтступКонтекстноеМеню + 25 + true + + Label + 4 + true + true + true + + Left + + + + Команды + 22 + + Заголовок + 19 + + <key>ru</key> + <value>Выберите шрифт</value> + + true + true + + true + + + ЗаголовокРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + ЗаголовокКонтекстноеМеню + 20 + true + + Label + true + true + + Style.NormalTextFont + 12.0 + true + false + false + false + + + Left + + + + ФормаArial + 4 + true + true + + true + + + ФормаArialРасширеннаяПодсказка + 5 + Label + true + true + + Left + + + UsualButton + Form.Command.Arial + Normal + Auto + true + true + UserCmds + + Style.NormalTextFont + + Auto + + + TimesNewRoman + 10 + true + true + + true + + + TimesNewRomanРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + UsualButton + Form.Command.TimesNewRoman + Normal + Auto + true + true + UserCmds + + Style.NormalTextFont + Times New Roman + 11.0 + + Auto + + + ФормаVerdana + 6 + true + true + + true + + + ФормаVerdanaРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + UsualButton + Form.Command.Verdana + Normal + Auto + true + true + UserCmds + + Style.NormalTextFont + Verdana + 11.0 + + Auto + + + Декорация1 + 16 + true + true + + true + + + Декорация1РасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + Декорация1КонтекстноеМеню + 17 + true + + Label + true + true + false + + Left + + + + ШрифтПоУмолчанию + 12 + true + true + + true + + + ШрифтПоУмолчаниюРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + UsualButton + Form.Command.ШрифтПоУмолчанию + Normal + Auto + true + true + UserCmds + Auto + + + ДругиеШрифты + 30 + + <key>ru</key> + <value>Другие шрифты</value> + + true + true + + true + + + ДругиеШрифтыРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ДругиеШрифтыКонтекстноеМеню + 31 + true + + Label + true + true + true + + + Click + Другой + + true + Center + + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + false + + КомандыРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + + + + ДекорацияОтступ1 + 27 + true + true + + true + + + ДекорацияОтступ1РасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + ДекорацияОтступ1КонтекстноеМеню + 28 + true + + Label + 2 + true + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + true + + ГруппаКомандыРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + UsualGroup + + true + true + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Left + + LockOwner + true + true + true + UseIfNecessary + auto + true + + Arial + + <key>ru</key> + <value>Arial</value> + + 1 + + ru + Arial + + + true + + + + Шрифт_Arial + + + DontUse + Auto + + + Verdana + + <key>ru</key> + <value>Verdana</value> + + 2 + + ru + Calibri + + + true + + + + Шрифт_Verdana + + + DontUse + Auto + + + TimesNewRoman + + <key>ru</key> + <value>Times New Roman</value> + + 3 + + ru + Times new roman + + + true + + + + Шрифт_TimesNewRoman + + + DontUse + Auto + + + ШрифтПоУмолчанию + + <key>ru</key> + <value>Авто</value> + + 4 + + ru + Шрифт по умолчанию + + + true + + + + ШрифтПоУмолчанию + + + DontUse + Auto + + + Другой + + <key>ru</key> + <value>Другие шрифты...</value> + + 5 + + ru + Другой + + + true + + + + Другой + + + DontUse + Auto + + + + + + diff --git a/SSL/src/CommonForms/ФормаВыбораШрифта/Module.bsl b/SSL/src/CommonForms/ФормаВыбораШрифта/Module.bsl new file mode 100644 index 000000000..df3947455 --- /dev/null +++ b/SSL/src/CommonForms/ФормаВыбораШрифта/Module.bsl @@ -0,0 +1,48 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Шрифт_Arial(Команда) + + Закрыть("Arial"); + +КонецПроцедуры + +&НаКлиенте +Процедура Шрифт_Verdana(Команда) + + Закрыть("Verdana"); + +КонецПроцедуры + +&НаКлиенте +Процедура Шрифт_TimesNewRoman(Команда) + + Закрыть("Times New Roman"); + +КонецПроцедуры + +&НаКлиенте +Процедура Другой(Команда) + + Закрыть(-1); + +КонецПроцедуры + +&НаКлиенте +Процедура ШрифтПоУмолчанию(Команда) + + НовыйТабличныйДокумент = Новый ТабличныйДокумент; + Шрифт = НовыйТабличныйДокумент.Область(1,1,1,1).Шрифт; + Закрыть(Шрифт.Имя); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/CommonForms/ФормаВыбораШрифта/ФормаВыбораШрифта.mdo b/SSL/src/CommonForms/ФормаВыбораШрифта/ФормаВыбораШрифта.mdo new file mode 100644 index 000000000..709c03342 --- /dev/null +++ b/SSL/src/CommonForms/ФормаВыбораШрифта/ФормаВыбораШрифта.mdo @@ -0,0 +1,12 @@ + + + ФормаВыбораШрифта + + ru + Форма выбора шрифта + + АПК:1332 - используются самые частотные шрифты + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form b/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form index be4e55985..ed5dc4b6a 100644 --- a/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form +++ b/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form @@ -218,6 +218,38 @@ Compact + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска_СоставГруппировки + 1431 + + СтрокаПоиска_СоставГруппировкиРасширеннаяПодсказка + 1433 + Label + true + true + + Left + + + + СтрокаПоиска_СоставГруппировкиКонтекстноеМеню + 1432 + true + + СоставГруппировки + + true + + true true @@ -854,7 +886,6 @@ UsualGroup Vertical - Auto true true Auto @@ -972,7 +1003,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1002,7 +1032,6 @@ UsualGroup AlwaysHorizontal - Auto NormalSeparation true true @@ -1066,7 +1095,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1807,6 +1835,115 @@ Auto InAdditionalSubmenu + + Отборы_ТипГруппы + 1415 + + ОтборыВыбранныеПоля_ГруппаИ + 1417 + true + true + + true + + + ОтборыВыбранныеПоля_ГруппаИРасширеннаяПодсказка + 1418 + Label + true + true + + Left + + + Form.Command.ВыбранныеПоля_ГруппаИ + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ОтборыВыбранныеПоля_ГруппаИли + 1419 + true + true + + true + + + ОтборыВыбранныеПоля_ГруппаИлиРасширеннаяПодсказка + 1420 + Label + true + true + + Left + + + Form.Command.ВыбранныеПоля_ГруппаИли + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ОтборыВыбранныеПоля_ГруппаНе + 1421 + true + true + + true + + + ОтборыВыбранныеПоля_ГруппаНеРасширеннаяПодсказка + 1422 + Label + true + true + + Left + + + Form.Command.ВыбранныеПоля_ГруппаНе + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Тип группы</value> + + + Отборы_ТипГруппыРасширеннаяПодсказка + 1416 + Label + true + true + + Left + + + Popup + + Auto + Normal + + true true @@ -2064,6 +2201,38 @@ Normal + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска_Отборы + 1434 + + СтрокаПоиска_ОтборыРасширеннаяПодсказка + 1436 + Label + true + true + + Left + + + + СтрокаПоиска_ОтборыКонтекстноеМеню + 1435 + true + + Отборы + + true + + КомандыОтборов_Общее 1389 @@ -2435,6 +2604,115 @@ UserCmds Auto + + Отборы_ТипГруппы1 + 1423 + + ОтборыВыбранныеПоля_ГруппаИ1 + 1425 + true + true + + true + + + ОтборыВыбранныеПоля_ГруппаИ1РасширеннаяПодсказка + 1426 + Label + true + true + + Left + + + Form.Command.ВыбранныеПоля_ГруппаИ + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ОтборыВыбранныеПоля_ГруппаИли1 + 1427 + true + true + + true + + + ОтборыВыбранныеПоля_ГруппаИли1РасширеннаяПодсказка + 1428 + Label + true + true + + Left + + + Form.Command.ВыбранныеПоля_ГруппаИли + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ОтборыВыбранныеПоля_ГруппаНе1 + 1429 + true + true + + true + + + ОтборыВыбранныеПоля_ГруппаНе1РасширеннаяПодсказка + 1430 + Label + true + true + + Left + + + Form.Command.ВыбранныеПоля_ГруппаНе + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Тип группы</value> + + + Отборы_ТипГруппы1РасширеннаяПодсказка + 1424 + Label + true + true + + Left + + + Popup + + Auto + Normal + + true true @@ -2774,7 +3052,7 @@ 811 <key>ru</key> - <value><color #9D5600><bgcolor #FFEC9D>В отчете установлены фильтры для группировок, которые можно настроить на странице </></><b><color #9D5600>Структура</></><color #9D5600><bgcolor #FFEC9D>.</></></value> + <value><bgcolor #ffec9d><color #9d5600>В отчете установлены фильтры для группировок, которые можно настроить на странице </></><b><color #9d5600>Структура</></><bgcolor #ffec9d><color #9d5600>.</></></value> true true @@ -2835,7 +3113,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3412,6 +3689,38 @@ + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска_ВыбранныеПоля + 1437 + + СтрокаПоиска_ВыбранныеПоляРасширеннаяПодсказка + 1439 + Label + true + true + + Left + + + + СтрокаПоиска_ВыбранныеПоляКонтекстноеМеню + 1438 + true + + ВыбранныеПоля + + true + + ВыбранныеПоляПерейтиКНастройкамДляТехническогоСпециалиста 1391 @@ -4013,7 +4322,6 @@ UsualGroup Vertical - Auto true true Auto @@ -4513,6 +4821,38 @@ Compact + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска_Сортировка + 1446 + + СтрокаПоиска_СортировкаРасширеннаяПодсказка + 1448 + Label + true + true + + Left + + + + СтрокаПоиска_СортировкаКонтекстноеМеню + 1447 + true + + Сортировка + + true + + Left @@ -4985,7 +5325,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -5014,7 +5353,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -5064,7 +5402,7 @@ 1007 <key>ru</key> - <value><color #9D5600><bgcolor #FFEC9D>В отчете выбраны поля и сортировки для группировок, которые можно настроить на странице </></><b><color #9D5600>Структура</></><color #9D5600><bgcolor #FFEC9D>.</></></value> + <value><bgcolor #ffec9d><color #9d5600>В отчете выбраны поля и сортировки для группировок, которые можно настроить на странице </></><b><color #9d5600>Структура</></><bgcolor #ffec9d><color #9d5600>.</></></value> true true @@ -5125,7 +5463,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -5623,6 +5960,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска_Оформление + 1440 + + СтрокаПоиска_ОформлениеРасширеннаяПодсказка + 1442 + Label + true + true + + Left + + + + СтрокаПоиска_ОформлениеКонтекстноеМеню + 1441 + true + + Оформление + + true + + КомандыОформления_Общее 1401 @@ -5852,7 +6221,7 @@ 931 <key>ru</key> - <value><color #9D5600><bgcolor #FFEC9D>В отчете установлено оформление для группировок, которое можно настроить на странице </></><b><color #9D5600>Структура</></><color #9D5600><bgcolor #FFEC9D>.</></></value> + <value><bgcolor #ffec9d><color #9d5600>В отчете установлено оформление для группировок, которое можно настроить на странице </></><b><color #9d5600>Структура</></><bgcolor #ffec9d><color #9d5600>.</></></value> true true @@ -5913,7 +6282,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -6867,6 +7235,38 @@ Auto InAdditionalSubmenu + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска_СтруктураВарианта + 1443 + + СтрокаПоиска_СтруктураВариантаРасширеннаяПодсказка + 1445 + Label + true + true + + Left + + + + СтрокаПоиска_СтруктураВариантаКонтекстноеМеню + 1444 + true + + СтруктураВарианта + + true + + КомандыСтруктурыВарианта_Общее 1395 @@ -7858,7 +8258,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -7997,7 +8396,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -8192,6 +8590,10 @@ true + + <key>ru</key> + <value>Настройки</value> + ГруппаНастройкаРасширеннаяПодсказка 1414 @@ -8310,7 +8712,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -8549,7 +8950,6 @@ HorizontalIfPossible Center - Auto true true Auto @@ -8610,7 +9010,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -8845,7 +9244,6 @@ HorizontalIfPossible Center - Auto true true Auto @@ -8906,7 +9304,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -10104,7 +10501,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -13784,6 +14180,60 @@ Auto Auto + + ВыбранныеПоля_ГруппаНе + + <key>ru</key> + <value>Группа Не</value> + + 67 + + true + + + + ВыбранныеПоля_ГруппаНе + + + Auto + Auto + + + ВыбранныеПоля_ГруппаИ + + <key>ru</key> + <value>Группа И</value> + + 68 + + true + + + + ВыбранныеПоля_ГруппаИ + + + DontUse + Auto + + + ВыбранныеПоля_ГруппаИли + + <key>ru</key> + <value>Группа Или</value> + + 70 + + true + + + + ВыбранныеПоля_ГруппаИли + + + Auto + Auto + НастройкиОтчета diff --git a/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl b/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl index ea43edfe1..12fcf1d21 100644 --- a/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl +++ b/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl @@ -475,6 +475,12 @@ &НаКлиенте Процедура СортировкаПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; + + Если Копирование Тогда + СкопироватьНастройки(Элемент); + Возврат; + КонецЕсли; + ВыбратьПоле("Сортировка", Новый ОписаниеОповещения("СортировкаПослеВыбораПоля", ЭтотОбъект)); КонецПроцедуры @@ -588,6 +594,30 @@ ПеретащитьПоляСортировкиВВыбранныеПоля(Сортировка.ПолучитьЭлементы()[0].ПолучитьЭлементы()); КонецПроцедуры +&НаКлиенте +Процедура ВыбранныеПоля_ГруппаИ(Команда) + ИдентификаторСтроки = Элементы.Отборы.ТекущаяСтрока; + Если ИдентификаторСтроки <> Неопределено Тогда + ОтборыПослеВыбораГруппы(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ, ИдентификаторСтроки); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ВыбранныеПоля_ГруппаИли(Команда) + ИдентификаторСтроки = Элементы.Отборы.ТекущаяСтрока; + Если ИдентификаторСтроки <> Неопределено Тогда + ОтборыПослеВыбораГруппы(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли, ИдентификаторСтроки); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ВыбранныеПоля_ГруппаНе(Команда) + ИдентификаторСтроки = Элементы.Отборы.ТекущаяСтрока; + Если ИдентификаторСтроки <> Неопределено Тогда + ОтборыПослеВыбораГруппы(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаНе, ИдентификаторСтроки); + КонецЕсли; +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыВыбранныеПоля @@ -965,6 +995,12 @@ &НаКлиенте Процедура ОтборыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; + + Если Копирование Тогда + СкопироватьНастройки(Элемент); + Возврат; + КонецЕсли; + ОтборыПередВыборомПоля(); КонецПроцедуры @@ -1073,7 +1109,9 @@ УстановитьПредставлениеЗначения(Строка); Если НастройкиОтчета.ЗагрузитьНастройкиПриИзмененииПараметров.Найти(ЭлементНастройки.Параметр) <> Неопределено Тогда + ВариантБылМодифицирован = ВариантМодифицирован; Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ОтчетИнициализирован", Ложь); + ВариантМодифицирован = ВариантБылМодифицирован; ПараметрыОбновления = Новый Структура; ПараметрыОбновления.Вставить("КомпоновщикНастроекКД", Отчет.КомпоновщикНастроек); @@ -1279,8 +1317,12 @@ Процедура СтруктураВариантаПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; - Если Копирование - Или Не Элементы.СтруктураВарианта_Добавить.Доступность Тогда + Если Не Элементы.СтруктураВарианта_Добавить.Доступность Тогда + Возврат; + КонецЕсли; + + Если Копирование Тогда + СкопироватьНастройки(Элемент); Возврат; КонецЕсли; @@ -1676,6 +1718,12 @@ &НаКлиенте Процедура СоставГруппировкиПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; + + Если Копирование Тогда + СкопироватьНастройки(Элемент); + Возврат; + КонецЕсли; + ВыбратьПоле("СоставГруппировки", Новый ОписаниеОповещения("СоставГруппировкиПослеВыбораПоля", ЭтотОбъект)); КонецПроцедуры @@ -1733,6 +1781,12 @@ &НаКлиенте Процедура ОформлениеПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; + + Если Копирование Тогда + СкопироватьНастройки(Элемент); + Возврат; + КонецЕсли; + ОформлениеИзменитьЭлемент(); КонецПроцедуры @@ -2223,8 +2277,12 @@ Строка.Поле = Строка.Заголовок; Строка.ОтображатьИспользование = Истина; Строка.ЭтоПериод = (ТипЗнч(Строка.ПравоеЗначение) = Тип("СтандартныйПериод")); - Строка.ЭтоУникальныйИдентификатор = (ТипЗнч(Строка.ПравоеЗначение) = Тип("УникальныйИдентификатор")); - + Строка.ЭтоУникальныйИдентификатор = (ТипЗнч(Строка.ПравоеЗначение) = Тип("УникальныйИдентификатор")); + + Если Строка.ТипЗначения = Новый ОписаниеТипов("Дата") Тогда + Строка.ТипЗначения = Новый ОписаниеТипов("СтандартнаяДатаНачала"); + КонецЕсли; + Строка.ЭтоГруппа = ЭтоГруппа; Строка.КартинкаРежимаОтображения = КартинкаРежимаОтображенияЭлементаНастройки(ЭлементНастройки); Строка.Картинка = -1; @@ -2271,7 +2329,15 @@ КонецЕсли; Строка = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки); - Строка.ТипГруппы = ТипГруппы.Значение; + Если Строка = Неопределено Тогда + Возврат; + КонецЕсли; + Если Не Строка.ЭтоГруппа Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Выберите группу.'")); + Возврат; + КонецЕсли; + + Строка.ТипГруппы = ?(ТипЗнч(ТипГруппы) = Тип("ТипГруппыЭлементовОтбораКомпоновкиДанных"), ТипГруппы, ТипГруппы.Значение); Строка.Заголовок = Строка.ТипГруппы; Строка.ПредставлениеПользовательскойНастройки = Строка.ТипГруппы; @@ -2279,7 +2345,7 @@ Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); - ЭлементНастройки.ТипГруппы = ТипГруппы.Значение; + ЭлементНастройки.ТипГруппы = Строка.ТипГруппы; УстановитьМодифицированность(); КонецПроцедуры @@ -2890,6 +2956,11 @@ Процедура ВыбранныеПоляПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; + Если Копирование Тогда + СкопироватьНастройки(Элемент); + Возврат; + КонецЕсли; + Обработчик = Новый ОписаниеОповещения("ВыбранныеПоляПослеВыбораПоля", ЭтотОбъект); ВыбратьПоле("ВыбранныеПоля", Обработчик); КонецПроцедуры @@ -3641,6 +3712,24 @@ ЭлементНастройкиИсточник = ВыбранныеПоляЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор); Если ТипЗнч(ЭлементНастройкиИсточник) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда ПеретащитьВыбранныеПоляВСортировку(СтрокаИсточник.ПолучитьЭлементы()); + ИначеЕсли ТипЗнч(ЭлементНастройкиИсточник) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") Тогда + Найден = Ложь; + Для Каждого ЭлементНастройкиПриемник Из СортировкаЭлементаСтруктуры.Элементы Цикл + Если ТипЗнч(ЭлементНастройкиПриемник) = Тип("АвтоЭлементПорядкаКомпоновкиДанных") Тогда + Найден = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + Если Не Найден Тогда + ЭлементНастройкиПриемник = СортировкаЭлементаСтруктуры.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных")); + ЭлементНастройкиПриемник.Использование = Истина; + СтрокаПриемник = Раздел.ПолучитьЭлементы().Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаПриемник, ЭлементНастройкиПриемник); + СтрокаПриемник.Идентификатор = СортировкаЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник); + СтрокаПриемник.Картинка = 18; + СтрокаПриемник.Заголовок = НСтр("ru = 'Авто (сортировки родителя)'"); + СтрокаПриемник.ЭтоАвтоПоле = Истина; + КонецЕсли; Иначе Если НайтиПолеПорядка(СортировкаЭлементаСтруктуры, ЭлементНастройкиИсточник.Поле) <> Неопределено Тогда Продолжить; @@ -3698,7 +3787,24 @@ СтрокаИсточник = Строки[Индекс]; ЭлементНастройкиИсточник = СортировкаЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(СтрокаИсточник.Идентификатор); - Если НайтиВыбранноеПоле(ВыбранныеПоляЭлементаСтруктуры, ЭлементНастройкиИсточник.Поле) = Неопределено Тогда + Если ТипЗнч(ЭлементНастройкиИсточник) = Тип("АвтоЭлементПорядкаКомпоновкиДанных") Тогда + Найден = Ложь; + Для Каждого ЭлементНастройкиПриемник Из ВыбранныеПоляЭлементаСтруктуры.Элементы Цикл + Если ТипЗнч(ЭлементНастройкиПриемник) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") Тогда + Найден = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + Если Не Найден Тогда + ЭлементНастройкиПриемник = ВыбранныеПоляЭлементаСтруктуры.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); + СтрокаПриемник = РазделВыбранныхПолей.ПолучитьЭлементы().Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаПриемник, ЭлементНастройкиПриемник); + СтрокаПриемник.Идентификатор = ВыбранныеПоляЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник); + СтрокаПриемник.Картинка = 18; + СтрокаПриемник.Заголовок = НСтр("ru = 'Авто (поля родителя)'"); + КонецЕсли; + + ИначеЕсли НайтиВыбранноеПоле(ВыбранныеПоляЭлементаСтруктуры, ЭлементНастройкиИсточник.Поле) = Неопределено Тогда ЭлементНастройкиПриемник = ВыбранныеПоляЭлементаСтруктуры.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ЗаполнитьЗначенияСвойств(ЭлементНастройкиПриемник, ЭлементНастройкиИсточник); @@ -5201,6 +5307,49 @@ УстановитьМодифицированность(); КонецПроцедуры +&НаКлиенте +Процедура СкопироватьНастройки(Элемент) + + СтрокаКопирования = Элемент.ТекущиеДанные; + + Если ТипЗнч(СтрокаКопирования.Идентификатор) <> Тип("ИдентификаторКомпоновкиДанных") + Или (СтрокаКопирования.Свойство("ЭтоРаздел") И СтрокаКопирования.ЭтоРаздел) + Или (СтрокаКопирования.Свойство("ЭтоПараметр") И СтрокаКопирования.ЭтоПараметр) + Или (СтрокаКопирования.Свойство("ЭтоПараметрВывода") И СтрокаКопирования.ЭтоПараметрВывода) Тогда + Возврат; + КонецЕсли; + + Родитель = СтрокаКопирования.ПолучитьРодителя(); + + КлючСвойства = КлючСвойстваЭлементаСтруктурыНастроек(Элемент.Имя, СтрокаКопирования); + УзелКД = СвойствоЭлементаСтруктурыНастроек( + Отчет.КомпоновщикНастроек, КлючСвойства, ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); + + КудаВставить = ПолучитьЭлементы(ЭтотОбъект[Элемент.Имя], Родитель); + + ЭлементКД = ЭлементНастройки(УзелКД, СтрокаКопирования); + РодительКД = ЭлементНастройки(УзелКД, Родитель); + КудаВставитьКД = ЭлементыНастроек(УзелКД, РодительКД); + + Индекс = КудаВставить.Количество(); + ИндексЭлементаНастройки = КудаВставитьКД.Количество(); + + ПоискЭлементовКД = Новый Соответствие; + ОтчетыКлиентСервер.СкопироватьРекурсивно(УзелКД, ЭлементКД, КудаВставитьКД, ИндексЭлементаНастройки, ПоискЭлементовКД); + + ПоискСтрокТаблицы = Новый Соответствие; + ОтчетыКлиентСервер.СкопироватьРекурсивно(Неопределено, СтрокаКопирования, КудаВставить, Индекс, ПоискСтрокТаблицы); + + Для Каждого КлючИЗначение Из ПоискСтрокТаблицы Цикл + СтараяСтрока = КлючИЗначение.Ключ; + НоваяСтрока = КлючИЗначение.Значение; + НоваяСтрока.Идентификатор = ПоискЭлементовКД.Получить(СтараяСтрока.Идентификатор); + КонецЦикла; + + УстановитьМодифицированность(); + +КонецПроцедуры + &НаКлиенте Процедура ИзменитьИспользование(ИмяКоллекции, Использование = Истина, Строки = Неопределено) Если Строки = Неопределено Тогда diff --git a/SSL/src/CommonForms/ФормаОтчета/Form.form b/SSL/src/CommonForms/ФормаОтчета/Form.form index a2ceeafef..f8889c19d 100644 --- a/SSL/src/CommonForms/ФормаОтчета/Form.form +++ b/SSL/src/CommonForms/ФормаОтчета/Form.form @@ -30,7 +30,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -116,7 +115,6 @@ UsualGroup AlwaysHorizontal - Auto true true @@ -1459,7 +1457,6 @@ AlwaysHorizontal Right - Auto true true Auto @@ -3063,7 +3060,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -3095,7 +3091,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3899,1308 +3894,6 @@ КонтекстноеМенюОбластиДанных 882 - - КонтекстноеМенюОбластиДанныхОткрыть - 884 - true - - true - - - КонтекстноеМенюОбластиДанныхОткрытьРасширеннаяПодсказка - 885 - Label - true - true - - Left - - - Form.Command.Открыть - Normal - Auto - true - true - UserCmds - Auto - - - КонтекстноеМенюОбластиДанныхМенюФильтровать - 886 - - КонтекстноеМенюОбластиДанныхФильтроватьРавноСнятьФильтр - 984 - true - true - - true - - - КонтекстноеМенюОбластиДанныхФильтроватьРавноСнятьФильтрРасширеннаяПодсказка - 985 - Label - true - true - - Left - - - Form.Command.СнятьФильтр - Normal - Auto - true - true - 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 - - - <key>ru</key> - <value>Фильтровать</value> - - - КонтекстноеМенюОбластиДанныхМенюФильтроватьРасширеннаяПодсказка - 887 - Label - true - true - - Left - - - Popup - - - StdPicture.DataCompositionFilter - - Auto - Normal - - - - КонтекстноеМенюОбластиДанныхСортировать - 948 - - КонтекстноеМенюОбластиДанныхСортироватьПоВозрастанию - 950 - true - true - - true - - - КонтекстноеМенюОбластиДанныхСортироватьПоВозрастаниюРасширеннаяПодсказка - 951 - Label - true - true - - Left - - - Form.Command.СортироватьПоВозрастанию - Normal - Auto - true - true - UserCmds - Auto - - - КонтекстноеМенюОбластиДанныхСортироватьПоУбыванию - 952 - true - true - - true - - - КонтекстноеМенюОбластиДанныхСортироватьПоУбываниюРасширеннаяПодсказка - 953 - Label - true - true - - Left - - - Form.Command.СортироватьПоУбыванию - Normal - Auto - true - true - UserCmds - Auto - - true - - true - - - <key>ru</key> - <value>Сортировать</value> - - - КонтекстноеМенюОбластиДанныхСортироватьРасширеннаяПодсказка - 949 - Label - true - true - - Left - - - - - - КонтекстноеМенюОбластиДанныхМенюОформить - 954 - - КонтекстноеМенюОбластиДанныхОчиститьОформление - 1093 - true - true - - true - - - КонтекстноеМенюОбластиДанныхОчиститьОформлениеРасширеннаяПодсказка - 1094 - Label - true - true - - Left - - - Form.Command.ОчиститьОформление - Normal - Auto - true - true - UserCmds - Auto - - - КонтекстноеМенюОбластиДанныхОформитьКраснымЖелтымЗеленым - 956 - - КонтекстноеМенюОбластиДанныхОформитьКрасным - 958 - true - true - - true - - - КонтекстноеМенюОбластиДанныхОформитьКраснымРасширеннаяПодсказка - 959 - Label - true - true - - Left - - - Form.Command.ОформитьКрасным - Normal - Auto - true - true - UserCmds - Auto - - - КонтекстноеМенюОбластиДанныхОформитьЖелтым - 960 - true - true - - true - - - КонтекстноеМенюОбластиДанныхОформитьЖелтымРасширеннаяПодсказка - 961 - Label - true - true - - Left - - - Form.Command.ОформитьЖелтым - Normal - Auto - true - true - UserCmds - Auto - - - КонтекстноеМенюОбластиДанныхОформитьЗеленым - 962 - true - true - - true - - - КонтекстноеМенюОбластиДанныхОформитьЗеленымРасширеннаяПодсказка - 963 - Label - true - true - - Left - - - Form.Command.ОформитьЗеленым - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Оформить красным, желтым, зеленым</value> - - - КонтекстноеМенюОбластиДанныхОформитьКраснымЖелтымЗеленымРасширеннаяПодсказка - 957 - Label - true - true - - Left - - - - - - КонтекстноеМенюОбластиДанныхОформитьОтрицательныеПоложительные - 964 - - КонтекстноеМенюОбластиДанныхОформитьОтрицательные - 966 - true - true - - true - - - КонтекстноеМенюОбластиДанныхОформитьОтрицательныеРасширеннаяПодсказка - 967 - Label - true - true - - Left - - - Form.Command.ОформитьОтрицательные - Normal - Auto - true - true - UserCmds - Auto - - - КонтекстноеМенюОбластиДанныхОформитьПоложительные - 968 - true - true - - true - - - КонтекстноеМенюОбластиДанныхОформитьПоложительныеРасширеннаяПодсказка - 969 - Label - true - true - - Left - - - Form.Command.ОформитьПоложительные - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Оформить отрицательные, положительные</value> - - - КонтекстноеМенюОбластиДанныхОформитьОтрицательныеПоложительныеРасширеннаяПодсказка - 965 - Label - true - true - - Left - - - - - - КонтекстноеМенюОбластиДанныхУстановитьВысотуШирину - 970 - - КонтекстноеМенюОбластиДанныхУстановитьВысотуСтроки - 972 - true - true - - true - - - КонтекстноеМенюОбластиДанныхУстановитьВысотуСтрокиРасширеннаяПодсказка - 973 - Label - true - true - - Left - - - Form.Command.УстановитьВысотуСтроки - Normal - Auto - true - true - UserCmds - Auto - - - КонтекстноеМенюОбластиДанныхУстановитьШиринуКолонки - 974 - true - true - - true - - - КонтекстноеМенюОбластиДанныхУстановитьШиринуКолонкиРасширеннаяПодсказка - 975 - Label - true - true - - Left - - - Form.Command.УстановитьШиринуКолонки - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Установить высоту, ширину</value> - - - КонтекстноеМенюОбластиДанныхУстановитьВысотуШиринуРасширеннаяПодсказка - 971 - Label - true - true - - Left - - - - - - КонтекстноеМенюОбластиДанныхОформитьЕще - 976 - true - true - - true - - - КонтекстноеМенюОбластиДанныхОформитьЕщеРасширеннаяПодсказка - 977 - Label - true - true - - Left - - - Form.Command.ОформитьЕще - Normal - Auto - true - true - UserCmds - Auto - - true - - true - - - <key>ru</key> - <value>Оформить</value> - - - КонтекстноеМенюОбластиДанныхМенюОформитьРасширеннаяПодсказка - 955 - Label - true - true - - Left - - - Popup - - - StdPicture.DataCompositionConditionalAppearance - - Auto - Normal - - - - КонтекстноеМенюОбластиДанныхРасшифроватьПоДетальнымЗаписям - 1105 - true - - true - - - КонтекстноеМенюОбластиДанныхРасшифроватьПоДетальнымЗаписямРасширеннаяПодсказка - 1106 - Label - true - true - - Left - - - Form.Command.РасшифроватьПоДетальнымЗаписям - Normal - Auto - true - true - UserCmds - Auto - - - КонтекстноеМенюОбластиДанныхРасшифровать - 978 - true - - true - - - КонтекстноеМенюОбластиДанныхРасшифроватьРасширеннаяПодсказка - 979 - Label - true - true - - Left - - - Form.Command.Расшифровать - Normal - Auto - true - true - UserCmds - Auto - КонтекстноеМенюОбластиДанныхБуферОбмена 1095 @@ -6294,7 +4987,6 @@ UsualGroup AlwaysHorizontal - Auto true true @@ -6359,7 +5051,6 @@ AlwaysHorizontal Right - Auto Button true true @@ -6598,7 +5289,6 @@ HorizontalIfPossible Center - Auto true true Auto @@ -6659,7 +5349,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -6894,7 +5583,6 @@ HorizontalIfPossible Center - Auto true true Auto @@ -6955,7 +5643,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -7057,7 +5744,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -7877,6 +6563,19 @@ true + + ПараметрыИзменены + 50 + + Boolean + + + true + + + true + + ВсеНастройки @@ -8024,23 +6723,6 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> - <formCommands> - <name>ИзменитьВидСравнения</name> - <title> - <key>ru</key> - <value>Изменить вид сравнения</value> - - 9 - - ru - Изменить вид сравнения - - - true - - DontUse - Auto - РассчитатьСумму @@ -8632,60 +7314,6 @@ <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> - <formCommands> - <name>ОформитьЖелтым</name> - <title> - <key>ru</key> - <value>Желтым</value> - - 37 - - ru - Оформить желтым - - - true - - TextPicture - Auto - Auto - - - ОформитьЗеленым - - <key>ru</key> - <value>Зеленым</value> - - 38 - - ru - Оформить зеленым - - - true - - TextPicture - Auto - Auto - - - ОформитьКрасным - - <key>ru</key> - <value>Красным</value> - - 39 - - ru - Оформить красным - - - true - - TextPicture - Auto - Auto - ОформитьОтрицательные @@ -8800,32 +7428,6 @@ <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> - <formCommands> - <name>Открыть</name> - <title> - <key>ru</key> - <value>Открыть</value> - - 45 - - true - - Auto - Auto - - - Расшифровать - - <key>ru</key> - <value>Расшифровать...</value> - - 46 - - true - - Auto - Auto - СнятьФильтр @@ -9071,19 +7673,6 @@ <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> - <formCommands> - <name>РасшифроватьПоДетальнымЗаписям</name> - <title> - <key>ru</key> - <value>Расшифровать по детальным записям</value> - - 56 - - true - - Auto - Auto - ВставитьПолеСлева diff --git a/SSL/src/CommonForms/ФормаОтчета/Module.bsl b/SSL/src/CommonForms/ФормаОтчета/Module.bsl index d371d11c7..d9ce531c3 100644 --- a/SSL/src/CommonForms/ФормаОтчета/Module.bsl +++ b/SSL/src/CommonForms/ФормаОтчета/Module.bsl @@ -132,7 +132,7 @@ ВариантыОтчетов.ПроверитьИспользуемыеТаблицы(ИспользуемыеТаблицы); Исключение ТекстОшибки = НСтр("ru = 'Не удалось определить используемые таблицы:'"); - ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ТекстОшибки + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ВариантыОтчетов.ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, НастройкиОтчета.ВариантСсылка); КонецПопытки; КонецЕсли; @@ -242,11 +242,23 @@ ВариантыПанелиКлючТекущегоВарианта = ПустойКлючВарианта(); КонецЕсли; + ОтключитьОбработчикОжидания("ОбновитьКомандыВыбораВариантовОбработчикОжидания"); + ПодключитьОбработчикОжидания("ОбновитьКомандыВыбораВариантовОбработчикОжидания", 2, Истина); + ИначеЕсли ИмяСобытия = ВариантыОтчетовКлиентСервер.ИмяДействияПрименитьПереданныеНастройки() Тогда ОповещениеОбработано = Истина; ПрименитьПереданныеНастройки(Параметр); + ИначеЕсли ИмяСобытия = "ИзменениеВидимостиВариантаОтчетаВПанелиОтчетов" + И Параметр = НастройкиОтчета.ПолноеИмя + И ВариантыОтчетовСлужебныйКлиентСервер.РежимВариантаОтчета(КлючТекущегоВарианта) + И НастройкиОтчета.РазрешеноВыбиратьВарианты Тогда + + ОтключитьОбработчикОжидания("ОбновитьКомандыВыбораВариантовОбработчикОжидания"); + ПодключитьОбработчикОжидания("ОбновитьКомандыВыбораВариантовОбработчикОжидания", 2, Истина); + Возврат; + КонецЕсли; ПрименитьНастройкиИзКонтекстногоМеню(Параметр); @@ -469,6 +481,7 @@ ВариантыПанелиКлючТекущегоВарианта = ПустойКлючВарианта(); ОбновитьИнформациюОВариантеОтчета(); УстановитьВидимостьДоступность(); + ОбновитьДополнительныеСвойстваДанныхРасшифровки(); Если ОбщегоНазначения.ЭтоВебКлиент() Тогда СохранитьДанныеВНастройкахНаСервере(); @@ -510,7 +523,11 @@ Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") И НастройкиОтчета.ЗагрузитьНастройкиПриИзмененииПараметров.Найти(ЭлементНастройки.Параметр) <> Неопределено Тогда + ВариантБылМодифицирован = ВариантМодифицирован; КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ОтчетИнициализирован", Ложь); + ВариантМодифицирован = ВариантБылМодифицирован; + ПараметрыИзменены = Истина; + ФормаПараметры.Вставить("СброситьНастройки", Ложь); ПараметрыОбновления = Новый Структура; ПараметрыОбновления.Вставить("КомпоновщикНастроекКД", КомпоновщикНастроек); @@ -524,26 +541,31 @@ &НаКлиенте Процедура Подключаемый_ЭлементНастройки_НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + ПараметрыИзменены = Истина; ПоказатьСписокВыбора(Элемент, СтандартнаяОбработка) КонецПроцедуры &НаКлиенте Процедура Подключаемый_Период_ПриИзменении(Элемент) + ПараметрыИзменены = Истина; ОтчетыКлиент.УстановитьПериод(ЭтотОбъект, Элемент.Имя); КонецПроцедуры &НаКлиенте Процедура Подключаемый_ВыбратьПериод(Команда) + ПараметрыИзменены = Истина; ОтчетыКлиент.ВыбратьПериод(ЭтотОбъект, Команда.Имя); КонецПроцедуры &НаКлиенте Процедура Подключаемый_СдвинутьПериодНазад(Команда) + ПараметрыИзменены = Истина; ОтчетыКлиент.СдвинутьПериод(ЭтотОбъект, Команда.Имя); КонецПроцедуры &НаКлиенте Процедура Подключаемый_СдвинутьПериодВперед(Команда) + ПараметрыИзменены = Истина; ОтчетыКлиент.СдвинутьПериод(ЭтотОбъект, Команда.Имя); КонецПроцедуры @@ -692,7 +714,6 @@ Процедура ОтчетТабличныйДокументПриАктивизации(Элемент) ВариантыОтчетовСлужебныйКлиент.ПриАктивизацииРезультатаОтчета(ЭтотОбъект, Элементы.ОтчетТабличныйДокумент); - ПодключитьОбработчикОжидания("РассчитатьПоказателиДинамически", 0.2, Истина); КонецПроцедуры @@ -744,18 +765,18 @@ ПараметрыЗаполнения = Новый Структура; ПараметрыЗаполнения.Вставить("ИмяСобытия", ОтчетыКлиентСервер.ИмяСобытияНастройкиПоУмолчанию()); - Если ВариантМодифицирован Тогда - ПараметрыЗаполнения.Вставить("СброситьНастройкиВарианта", Истина); - ПараметрыЗаполнения.Вставить("ВариантМодифицирован", Ложь); - КонецЕсли; + ПараметрыЗаполнения.Вставить("СброситьНастройкиВарианта", Истина); + ПараметрыЗаполнения.Вставить("ВариантМодифицирован", Ложь); + ПараметрыЗаполнения.Вставить("СброситьПользовательскиеНастройки", Истина); ПараметрыЗаполнения.Вставить("ПользовательскиеНастройкиМодифицированы", Истина); ОтчетСформирован = Ложь; + ФормаПараметры.Вставить("СброситьНастройки", Истина); СброситьВыбранныйУровеньГруппировок(); ВариантыОтчетовСлужебныйКлиент.СброситьПометкиСтекаНастроек(СтекНастроек); - ОбновитьЭлементыФормыНастроек(ПараметрыЗаполнения); + ОбновитьЭлементыФормыНастроек(ПараметрыЗаполнения); КонецПроцедуры &НаКлиенте @@ -765,8 +786,7 @@ Возврат; КонецЕсли; - СохранитьТекущийВариантОтчета(); - ПоказатьОповещениеПользователя(НСтр("ru = 'Вариант отчета сохранен'"), Окно.ПолучитьНавигационнуюСсылку(), Заголовок); + СохранитьВариантОтчета(); КонецПроцедуры @@ -787,6 +807,7 @@ Процедура ОтчетСкомпоноватьРезультат(Команда) ОчиститьСообщения(); Сформировать(); + ПараметрыИзменены = Ложь; КонецПроцедуры &НаКлиенте @@ -807,12 +828,17 @@ Процедура ДругиеОтчеты(Команда) ОписаниеНастроекОтчета = ОписаниеНастроекОтчета(НастройкиОтчета); + ВидимыеВарианты = Новый Массив; + Для Каждого Строка Из ДобавленныеВарианты Цикл + ВидимыеВарианты.Добавить(Строка.Ссылка); + КонецЦикла; + ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ВариантСсылка", НастройкиОтчета.ВариантСсылка); ПараметрыФормы.Вставить("ОтчетСсылка", НастройкиОтчета.ОтчетСсылка); ПараметрыФормы.Вставить("ПодсистемаСсылка", ФормаПараметры.Подсистема); ПараметрыФормы.Вставить("ОтчетНаименование", ОписаниеНастроекОтчета.Наименование); - + ПараметрыФормы.Вставить("ВидимыеВарианты", Новый ФиксированныйМассив(ВидимыеВарианты)); Блокировать = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца; ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.ПанельДругихОтчетов", ПараметрыФормы, ЭтотОбъект, Истина, , , , Блокировать); @@ -899,19 +925,13 @@ &НаКлиенте Процедура ОбновитьВариантОтчетаИзФайла(Команда) + СвойстваВариантаОтчета = ВариантыОтчетовКлиент.СвойстваВариантаОтчетаОснования(); СвойстваВариантаОтчета.Ссылка = НастройкиОтчета.ВариантСсылка; СвойстваВариантаОтчета.ИмяОтчета = НастройкиОтчета.ПолноеИмя; СвойстваВариантаОтчета.ПредставлениеВарианта = ПредставлениеТекущегоВарианта; - - Обработчик = Новый ОписаниеОповещения( - "ОбновитьВариантОтчетаИзФайла", ВариантыОтчетовКлиент, СвойстваВариантаОтчета); - - ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла(); - ПараметрыЗагрузки.Диалог.Фильтр = НСтр("ru = 'Архив ZIP (*.zip)|*.zip'"); - ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор; - - ФайловаяСистемаКлиент.ЗагрузитьФайл(Обработчик, ПараметрыЗагрузки); + ВариантыОтчетовКлиент.ОбновитьВариантОтчетаИзФайлов(СвойстваВариантаОтчета, УникальныйИдентификатор); + КонецПроцедуры &НаКлиенте @@ -936,7 +956,7 @@ ТекстПредложения = НСтр("ru = 'Для сохранения результата отчета в файл рекомендуется |установить расширение для работы с файлами.'"); - Обработчик = Новый ОписаниеОповещения("ПослеУстановкиРасширенияРаботыСФайлами", ЭтотОбъект); + Обработчик = Новый ОписаниеОповещения("СохранитьОтчетЗавершение", ЭтотОбъект); ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(Обработчик, ТекстПредложения); КонецПроцедуры @@ -1148,6 +1168,13 @@ // &НаКлиенте Процедура Подключаемый_Команда(Команда) + + ПрефиксИмени = ОтчетыКлиентСервер.ПрефиксИмениКомандыСПредварительнымСохранениемВариантаОтчета(); + Если СтрНачинаетсяС(Команда.Имя, ПрефиксИмени) И ТребуетсяСохранитьВариант() Тогда + СохранитьНовыйИлиСуществующийВариантОтчетаИПродолжить(Команда); + Возврат; + КонецЕсли; + ПостояннаяКоманда = ПостоянныеКоманды.НайтиПоЗначению(Команда.Имя); Если ПостояннаяКоманда <> Неопределено И ЗначениеЗаполнено(ПостояннаяКоманда.Представление) Тогда МассивПодстрок = СтрРазделить(ПостояннаяКоманда.Представление, "."); @@ -1172,9 +1199,10 @@ КонецЕсли; ВариантФормы = Найденные[0]; - НастройкиОтчета.ФормаНастроекРасширенныйРежим = 0; - - ЗагрузитьВариант(ВариантФормы.КлючВарианта); + НастройкиОтчета.ФормаНастроекРасширенныйРежим = 0; + + ФормаПараметры.Вставить("СброситьНастройки", Истина); + ЗагрузитьВариант(ВариантФормы.КлючВарианта, Ложь); КлючУникальности = ОтчетыКлиентСервер.КлючУникальности(НастройкиОтчета.ПолноеИмя, ВариантФормы.КлючВарианта); @@ -1564,6 +1592,7 @@ ПараметрыФормированияОтчета.Вставить("ИмяКлючевойОперации"); ПараметрыФормированияОтчета.Вставить("КомментарийКлючевойОперации"); ПараметрыФормированияОтчета.Вставить("ИспользуемыеТаблицы", НастройкиОтчета.ИспользуемыеТаблицы); + ПараметрыФормированияОтчета.Вставить("ПараметрыИзменены", ПараметрыИзменены); ЗаполнитьЗначенияСвойств(ПараметрыФормированияОтчета, ПараметрыЗамеровФормированияОтчета(ИмяОтчета)); @@ -2370,17 +2399,15 @@ Для Каждого Поле Из Поля Цикл ТипРеквизита = ТипРеквизитаПоиска(Объект, Поле); - Если Не ТипРеквизита.СодержитТип(Тип("Строка")) Тогда Продолжить; КонецЕсли; ПолеПоУсловию = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - "КОГДА ВЫРАЗИТЬ(%1 КАК СТРОКА(150)) ПОДОБНО %2 ТОГДА ""%3""", + "КОГДА ВЫРАЗИТЬ(%1 КАК СТРОКА(150)) ПОДОБНО %2 СПЕЦСИМВОЛ ""~"" ТОГДА ""%3""", Поле.Имя, - """%" + ПараметрыПоиска.СтрокаПоискаНормализованная + "%""", + """%" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(ПараметрыПоиска.СтрокаПоискаНормализованная) + "%""", Поле.Имя); - ОписаниеПоляПоУсловию.Добавить(ПолеПоУсловию); КонецЦикла; @@ -2389,9 +2416,9 @@ Возврат """"""; КонецЕсли; - ОписаниеПоляПоУсловию.Вставить(0, "ВЫБОР");//@query-part - ОписаниеПоляПоУсловию.Добавить("ИНАЧЕ """"");//@query-part - ОписаниеПоляПоУсловию.Добавить("КОНЕЦ");//@query-part + ОписаниеПоляПоУсловию.Вставить(0, "ВЫБОР"); //@query-part + ОписаниеПоляПоУсловию.Добавить("ИНАЧЕ """""); //@query-part + ОписаниеПоляПоУсловию.Добавить("КОНЕЦ"); //@query-part Возврат СтрСоединить(ОписаниеПоляПоУсловию, " "); @@ -2413,20 +2440,19 @@ Для Каждого Поле Из Поля Цикл - ТипРеквизита = ТипРеквизитаПоиска(Объект, Поле); - + ТипРеквизита = ТипРеквизитаПоиска(Объект, Поле); Если ТипРеквизита.СодержитТип(Тип("Строка")) Тогда Условие = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - "ВЫРАЗИТЬ(%1 КАК СТРОКА(150)) ПОДОБНО %2", + "ВЫРАЗИТЬ(%1 КАК СТРОКА(150)) ПОДОБНО %2 СПЕЦСИМВОЛ ""~""", Поле.Имя, - """%" + ПараметрыПоиска.СтрокаПоискаНормализованная + "%"""); + """%" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(ПараметрыПоиска.СтрокаПоискаНормализованная) + "%"""); ИначеЕсли ТипРеквизита.СодержитТип(Тип("Число")) И ПараметрыПоиска.ЧислоПоиска <> Неопределено Тогда Условие = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - "ВЫРАЗИТЬ(%1 КАК ЧИСЛО) = &ЧислоПоиска", Поле.Имя);//@query-part + "ВЫРАЗИТЬ(%1 КАК ЧИСЛО) = &ЧислоПоиска", Поле.Имя); //@query-part Иначе Продолжить; @@ -2440,7 +2466,7 @@ Возврат "ЛОЖЬ"; КонецЕсли; - Возврат СтрСоединить(Условия, " ИЛИ ");//@query-part + Возврат СтрСоединить(Условия, " ИЛИ "); //@query-part КонецФункции @@ -2651,7 +2677,7 @@ ИначеЕсли УправляющиеСимволы = "<=" Тогда - Условие = ВидСравненияКомпоновкиДанных.Меньше; + Условие = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно; Иначе @@ -2689,10 +2715,15 @@ ОтчетыСервер.ИнициализироватьКомпоновщикНастроек(КомпоновщикНастроек, АдресСхемы); КомпоновщикНастроек.ЗагрузитьНастройки(Настройки); + КомпоновщикНастроек2 = Новый КомпоновщикНастроекКомпоновкиДанных; + ОтчетыСервер.ИнициализироватьКомпоновщикНастроек(КомпоновщикНастроек2, АдресСхемы); + КомпоновщикНастроек2.ЗагрузитьНастройки(Настройки); + КомпоновщикНастроек2.РазвернутьАвтоПоля(); + Коллекции = Новый Массив; Коллекции.Добавить(ОписаниеПараметровОтчета(КомпоновщикНастроек)); Коллекции.Добавить(ОписаниеОтборовОтчета(КомпоновщикНастроек)); - Коллекции.Добавить(ОписаниеПолейОтчета(КомпоновщикНастроек)); + Коллекции.Добавить(ОписаниеПолейОтчета(КомпоновщикНастроек.Настройки, КомпоновщикНастроек2.Настройки)); Для Каждого Коллекция Из Коллекции Цикл @@ -2800,17 +2831,16 @@ КонецФункции &НаСервереБезКонтекста -Функция ОписаниеПолейОтчета(КомпоновщикНастроек) +Функция ОписаниеПолейОтчета(Настройки, Настройки2) ОписаниеПолей = Новый Массив; - ИндексСтруктурыОтчета = ВариантыОтчетовСлужебный.ИндексСтруктурыОтчетаБезКонтекста(КомпоновщикНастроек); + ИндексСтруктурыОтчета = ВариантыОтчетовСлужебный.ИндексСтруктурыОтчетаБезКонтекста(Настройки, Настройки2); ИндексПолейОтчета = ИндексСтруктурыОтчета.Скопировать(, "Поле"); ИндексПолейОтчета.Свернуть("Поле"); ПоляОтчета = ИндексПолейОтчета.ВыгрузитьКолонку("Поле"); - Настройки = КомпоновщикНастроек.Настройки; Для Каждого ПолеОтчета Из ПоляОтчета Цикл @@ -2842,7 +2872,9 @@ КомпоновщикНастроек = Отчет.КомпоновщикНастроек; Если Не ЭтоПользовательскийПоиск Тогда + ВариантБылМодифицирован = ВариантМодифицирован; КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ОтчетИнициализирован", Ложь); + ВариантМодифицирован = ВариантБылМодифицирован; РезультатНастройки = Новый Структура; РезультатНастройки.Вставить("КомпоновщикНастроекКД", КомпоновщикНастроек); @@ -3124,15 +3156,15 @@ Кнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; Кнопка.ИмяКоманды = Свойства.ИмяКоманды; Кнопка.Заголовок = Свойства.ПредставлениеУровняГруппировки; - Кнопка.ТолькоВоВсехДействиях = Ложь; + Кнопка.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели; - // Подменю Еще (Все действия). - ДополнительнаяКнопка = Элементы.Добавить(Свойства.ИмяКоманды + "Еще", Тип("КнопкаФормы"), + // Подменю Еще. + Кнопка = Элементы.Добавить(Свойства.ИмяКоманды + "Еще", Тип("КнопкаФормы"), Элементы.ГруппаУровниГруппировокЕще); - ДополнительнаяКнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; - ДополнительнаяКнопка.ИмяКоманды = Свойства.ИмяКоманды; - ДополнительнаяКнопка.Заголовок = Свойства.ПредставлениеУровняГруппировки; - ДополнительнаяКнопка.ТолькоВоВсехДействиях = Истина; + Кнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; + Кнопка.ИмяКоманды = Свойства.ИмяКоманды; + Кнопка.Заголовок = Свойства.ПредставлениеУровняГруппировки; + Кнопка.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; // Контекстное меню отчета. КнопкаКонтекстногоМеню = Элементы.Добавить(Свойства.ИмяКоманды + "КонтекстноеМеню", Тип("КнопкаФормы"), @@ -3474,7 +3506,7 @@ #Область СохранениеРезультатаОтчета &НаКлиенте -Процедура ПослеУстановкиРасширенияРаботыСФайлами(РасширениеПодключено, ДополнительныеПараметры) Экспорт +Процедура СохранитьОтчетЗавершение(РасширениеПодключено, ДополнительныеПараметры) Экспорт Контекст = Новый Структура; Контекст.Вставить("ИндексФорматовСохраненияОтчета", Новый Соответствие); @@ -3484,21 +3516,17 @@ Диалог.МножественныйВыбор = Ложь; Диалог.Заголовок = НСтр("ru = 'Сохранение результата отчета'"); - Обработчик = Новый ОписаниеОповещения("ПослеВыбораИмениФайла", ЭтотОбъект, Контекст); + Обработчик = Новый ОписаниеОповещения("СохранитьОтчетПослеВыбораИмениФайла", ЭтотОбъект, Контекст); ФайловаяСистемаКлиент.ПоказатьДиалогВыбора(Обработчик, Диалог); КонецПроцедуры &НаКлиенте -Процедура ПослеВыбораИмениФайла(Результат, Контекст) Экспорт +Процедура СохранитьОтчетПослеВыбораИмениФайла(Результат, Контекст) Экспорт - Если ТипЗнч(Результат) = Тип("Массив") - И Результат.Количество() > 0 Тогда - + Если ТипЗнч(Результат) = Тип("Массив") И Результат.Количество() > 0 Тогда ПолноеИмяФайлаОтчета = Результат[0]; - ИначеЕсли ТипЗнч(Результат) = Тип("Строка") Тогда - ПолноеИмяФайлаОтчета = Результат; Иначе Возврат; @@ -3530,7 +3558,7 @@ ПолноеИмяФайлаОтчета = ПолноеИмяФайлаОтчета + "." + ВыбранныйЭлемент.Значение; КонецЕсли; - Обработчик = Новый ОписаниеОповещения("ПослеСохраненияРезультатаОтчета", ЭтотОбъект, ПолноеИмяФайлаОтчета); + Обработчик = Новый ОписаниеОповещения("СохранитьОтчетПослеСохраненияРезультатаОтчета", ЭтотОбъект, ПолноеИмяФайлаОтчета); ФорматыСохранения = ФорматыСохраненияОтчета(ПолноеИмяФайлаОтчета, Контекст.ИндексФорматовСохраненияОтчета); @@ -3541,19 +3569,19 @@ КонецПроцедуры &НаКлиенте -Процедура ПослеСохраненияРезультатаОтчета(Результат, ПолноеИмяФайлаОтчета) Экспорт +Процедура СохранитьОтчетПослеСохраненияРезультатаОтчета(Результат, ПолноеИмяФайлаОтчета) Экспорт Если Результат <> Истина Тогда Возврат; КонецЕсли; - Обработчик = Новый ОписаниеОповещения("ПриВыбореИмениФайлаОтчета", ЭтотОбъект, ПолноеИмяФайлаОтчета); + Обработчик = Новый ОписаниеОповещения("СохранитьОтчетПриВыбореИмениФайлаОтчета", ЭтотОбъект, ПолноеИмяФайлаОтчета); ПоказатьОповещениеПользователя(НСтр("ru = 'Отчет сохранен в файл'"), Обработчик, ПолноеИмяФайлаОтчета); КонецПроцедуры &НаКлиенте -Процедура ПриВыбореИмениФайлаОтчета(ПолноеИмяФайлаОтчета) Экспорт +Процедура СохранитьОтчетПриВыбореИмениФайлаОтчета(ПолноеИмяФайлаОтчета) Экспорт ФайловаяСистемаКлиент.ОткрытьФайл(ПолноеИмяФайлаОтчета); @@ -3592,12 +3620,9 @@ Для Каждого ФорматСохранения Из ФорматыСохранения Цикл - РасширениеФорматаСохранения = "*." + ФорматСохранения.Расширение; - - ПредставлениеФорматаСохранения = СтрЗаменить( - ФорматСохранения.Представление, - "." + ФорматСохранения.Расширение, - РасширениеФорматаСохранения); + РасширениеФорматаСохранения = "*." + ФорматСохранения.Расширение; + ПредставлениеФорматаСохранения = СтрЗаменить(ФорматСохранения.Представление, + "." + ФорматСохранения.Расширение, РасширениеФорматаСохранения); ТекущийФорматСохранения.Добавить(ПредставлениеФорматаСохранения); ТекущийФорматСохранения.Добавить(РасширениеФорматаСохранения); @@ -3615,22 +3640,6 @@ КонецФункции -&НаСервереБезКонтекста -Функция СписокДоступныхФорматовСохраненияОтчета(ИндексФорматовСохраненияОтчета) - - ДоступныеФорматы = Новый СписокЗначений; - - ФорматыСохранения = СтандартныеПодсистемыСервер.НастройкиФорматовСохраненияТабличногоДокумента(); - - Для Каждого ФорматСохранения Из ИндексФорматовСохраненияОтчета Цикл - НайденноеОписание = ФорматыСохранения.Найти(ФорматСохранения.Ключ, "Расширение"); - ДоступныеФорматы.Добавить(НайденноеОписание.Расширение, НайденноеОписание.Представление, , НайденноеОписание.Картинка); - КонецЦикла; - - Возврат ДоступныеФорматы; - -КонецФункции - &НаСервереБезКонтекста Функция РезультатОтчетаДляСохранения(ОтчетТабличныйДокумент, Заголовки) @@ -3674,6 +3683,7 @@ &НаСервере Процедура УстановитьВидимостьДоступность() + ПоказыватьКомандыВыбораВариантов = ВариантыОтчетовСлужебныйКлиентСервер.РежимВариантаОтчета(КлючТекущегоВарианта) И НастройкиОтчета.РазрешеноВыбиратьВарианты; @@ -3710,20 +3720,16 @@ КонецЕсли; ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( - Элементы, "СохранитьВариант", "Доступность", ДоступноСохранятьТекущийВариант); + Элементы, "СохранитьВариант", "Видимость", РазрешеноСохранятьВариант И ДоступноСохранятьТекущийВариант); ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( - Элементы, "СохранитьВариантЕще", "Доступность", ДоступноСохранятьТекущийВариант); - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( - Элементы, "СохранитьВариант", "Видимость", РазрешеноСохранятьВариант); - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( - Элементы, "СохранитьВариантЕще", "Видимость", РазрешеноСохранятьВариант); + Элементы, "СохранитьВариантЕще", "Видимость", РазрешеноСохранятьВариант И ДоступноСохранятьТекущийВариант); ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( Элементы, "СохранитьВариантКак", "Видимость", РазрешеноСохранятьВариант); ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( Элементы, "СохранитьВариантКакЕще", "Видимость", РазрешеноСохранятьВариант); - Элементы.ДругиеОтчеты.Видимость = НастройкиОтчета.Подсистема <> Неопределено - И НастройкиОтчета.РазрешеноВыбиратьВарианты; + Элементы.ДругиеОтчеты.Видимость = НастройкиОтчета.РазрешеноВыбиратьВарианты + И Не ЗначениеЗаполнено(КонтекстВарианта); Элементы.ДругиеОтчетыЕще.Видимость = Элементы.ДругиеОтчеты.Видимость; Элементы.ВыбратьВариант.Видимость = ПоказыватьКомандыВыбораВариантов; @@ -3738,7 +3744,12 @@ ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( Элементы, "СохранитьНастройки", "Видимость", РазрешеноИспользоватьНастройки); ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( - Элементы, "ПоделитьсяНастройками", "Видимость", РазрешеноИспользоватьНастройки); + Элементы, "ПоделитьсяНастройками", "Видимость", РазрешеноИспользоватьНастройки + И (ЭтоПредопределенныйВариант + Или ВариантыОтчетов.ПолныеПраваНаВарианты() + Или ЗначениеЗаполнено(НастройкиОтчета.ВариантСсылка) + И ОбщегоНазначения.ЗначениеРеквизитаОбъекта(НастройкиОтчета.ВариантСсылка, + "ТолькоДляАвтора") <> Истина)); Если НастройкиОтчета.РазрешеноВыбиратьИНастраиватьВариантыБезСохранения Тогда ВариантМодифицирован = Ложь; @@ -3771,12 +3782,12 @@ // Команды модификации Схемы. Элементы.ВосстановитьСтандартнуюСхему.Видимость = НастройкиОтчета.РазрешеноВосстанавливатьСтандартнуюСхему; - + // В модели сервиса редактирование СКД недоступна с точки зрения безопасности. Элементы.РедактироватьСхему.Видимость = НастройкиОтчета.РазрешеноРедактироватьСхему - И Не ОбщегоНазначения.РазделениеВключено(); // В модели сервиса редактирование СКД недоступна с точки зрения безопасности. - + И Не ОбщегоНазначения.РазделениеВключено(); + // В модели сервиса загрузка произвольной СКД недоступна с точки зрения безопасности. Элементы.ЗагрузитьСхему.Видимость = НастройкиОтчета.РазрешеноЗагружатьСхему - И Не ОбщегоНазначения.РазделениеВключено(); // В модели сервиса загрузка произвольной СКД недоступна с точки зрения безопасности. + И Не ОбщегоНазначения.РазделениеВключено(); УстановитьДоступностьМенюУровнейГруппировок(); @@ -4243,22 +4254,29 @@ ЗагрузитьВариант(КлючТекущегоВарианта, Ложь); КонецЕсли; - ОтчетыСервер.СброситьПользовательскиеНастройки(ДоступныеНастройки, ПараметрыЗагрузки); - + ОтчетыСервер.СброситьПользовательскиеНастройки(ДоступныеНастройки, ПараметрыЗагрузки); + ОтчетыСервер.ЗаполнитьДополнительныеСвойства(ОтчетОбъект, ДоступныеНастройки.Настройки, КлючТекущегоВарианта, НастройкиОтчета.КлючПредопределенногоВарианта, ?(ФормаПараметры.НачальныйКлючВарианта = КлючТекущегоВарианта, КонтекстВарианта, ""), ?(ФормаПараметры.НачальныйКлючВарианта = КлючТекущегоВарианта, ФормаПараметры.Отбор, Неопределено)); - - Если ДоступныеНастройки.Настройки <> Неопределено И НастройкиОтчета.События.ПередЗагрузкойНастроекВКомпоновщик Тогда + + Если ДоступныеНастройки.Настройки <> Неопределено И НастройкиОтчета.События.ПередЗагрузкойНастроекВКомпоновщик Тогда + Если ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ФормаПараметры, "СброситьНастройки", Ложь) Тогда + ДоступныеНастройки.Настройки.ДополнительныеСвойства.Вставить("СброситьНастройки", Истина); + КонецЕсли; + ОтчетОбъект.ПередЗагрузкойНастроекВКомпоновщик( ЭтотОбъект, НастройкиОтчета.КлючСхемы, КлючТекущегоВарианта, ДоступныеНастройки.Настройки, - ДоступныеНастройки.ПользовательскиеНастройки); + ДоступныеНастройки.ПользовательскиеНастройки); + + ФормаПараметры.Вставить("СброситьНастройки", Ложь); + ДоступныеНастройки.Настройки.ДополнительныеСвойства.Вставить("СброситьНастройки", Ложь); КонецЕсли; НастройкиЗагружены = ОтчетыКлиентСервер.ЗагрузитьНастройки( @@ -4362,8 +4380,9 @@ &НаСервере Процедура ПоказатьОшибкиФормирования(ИнформацияОбОшибке) Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - ПодробноеПредставлениеОшибки = НСтр("ru = 'Ошибка при формировании:'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПодробноеПредставлениеОшибки = НСтр("ru = 'Отчет не сформирован по причине:'") + + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); Если ПустаяСтрока(ОписаниеОшибки) Тогда ОписаниеОшибки = ПодробноеПредставлениеОшибки; КонецЕсли; @@ -4379,22 +4398,133 @@ КонецЕсли; КонецПроцедуры +&НаКлиенте +Функция ТребуетсяСохранитьВариант() + + Если ВариантМодифицирован Тогда + Возврат Истина; + КонецЕсли; + + Если НастройкиОтчета.КлючПредопределенногоВарианта <> КлючТекущегоВарианта Тогда + Возврат Ложь; + КонецЕсли; + + ДополнительныеСвойства = Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства; + + Если ДополнительныеСвойства.Свойство("ФормаПараметрыОтбор") + И ЗначениеЗаполнено(ДополнительныеСвойства.ФормаПараметрыОтбор) + Или РежимРасшифровки Тогда + + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +&НаКлиенте +Процедура СохранитьНовыйИлиСуществующийВариантОтчетаИПродолжить(Команда) + + Если Не Элементы.СохранитьВариантКак.Видимость Тогда + ПоказатьПредупреждение(, + НСтр("ru = 'Невозможно выполнить действие, так как недоступно сохранение вариантов отчетов.'")); + Возврат; + КонецЕсли; + + Если Элементы.СохранитьВариант.Видимость Тогда + Кнопки = Новый СписокЗначений; + Кнопки.Добавить("СохранитьИПродолжить", НСтр("ru = 'Сохранить и продолжить'")); + Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'")); + ПараметрыВопроса = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю(); + ПараметрыВопроса.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь; + ПараметрыВопроса.КнопкаПоУмолчанию = "СохранитьИПродолжить"; + ПараметрыВопроса.Заголовок = ЭтотОбъект.ОтчетНаименованиеТекущегоВарианта; + СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю( + Новый ОписаниеОповещения("Подключаемый_КомандаПослеОтветаНаВопросСохранитьВариант", ЭтотОбъект, Команда), + НСтр("ru = 'Сохранить вариант отчета?'"), + Кнопки, + ПараметрыВопроса); + Возврат; + Иначе + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("КлючОбъекта", НастройкиОтчета.ПолноеИмя); + ПараметрыФормы.Вставить("КлючТекущихНастроек", КлючТекущегоВарианта); + + ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.ФормаСохранения", + ПараметрыФормы, ЭтотОбъект,,,, Новый ОписаниеОповещения( + "Подключаемый_КомандаПослеСохраненияВарианта", ЭтотОбъект, Команда)); + Возврат; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_КомандаПослеОтветаНаВопросСохранитьВариант(Ответ, Команда) Экспорт + + Если Ответ = Неопределено + Или Ответ.Значение <> "СохранитьИПродолжить" Тогда + Возврат; + КонецЕсли; + + СохранитьВариантОтчета(); + Подключаемый_Команда(Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_КомандаПослеСохраненияВарианта(Результат, Команда) Экспорт + + Если ТипЗнч(Результат) <> Тип("ВыборНастроек") Тогда + Возврат; + КонецЕсли; + + КлючТекущегоВарианта = Результат.КлючНастроек; + + СохранитьВариантОтчета(Истина); + Подключаемый_Команда(Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьВариантОтчета(ПослеДобавленияНового = Ложь) + + СохранитьВариантОтчетаНаСервере(ПослеДобавленияНового); + ПоказатьОповещениеПользователя(НСтр("ru = 'Вариант отчета сохранен'"), Окно.ПолучитьНавигационнуюСсылку(), Заголовок); + +КонецПроцедуры + &НаСервере -Процедура СохранитьТекущийВариантОтчета() +Процедура СохранитьВариантОтчетаНаСервере(ПослеДобавленияНового = Ложь) КлючОтчета = НастройкиОтчета.ПолноеИмя; ОписаниеНастроек = ХранилищаНастроек.ХранилищеВариантовОтчетов.ПолучитьОписание(КлючОтчета, КлючТекущегоВарианта); + Если ПослеДобавленияНового Тогда + ОтчетНаименованиеТекущегоВарианта = ОписаниеНастроек.Представление; + НовыйКомпоновщик = Новый КомпоновщикНастроекКомпоновкиДанных; + НастройкиКД = НовыйКомпоновщик.ПолучитьНастройки(); + ПриСохраненииВариантаНаСервере(НастройкиКД); + Иначе + НастройкиКД = Отчет.КомпоновщикНастроек.Настройки; + КонецЕсли; + ХранилищаНастроек.ХранилищеВариантовОтчетов.Сохранить( КлючОтчета, КлючТекущегоВарианта, - Отчет.КомпоновщикНастроек.Настройки, + НастройкиКД, ОписаниеНастроек); ВариантМодифицирован = Ложь; КонецПроцедуры +&НаКлиенте +Процедура ОбновитьКомандыВыбораВариантовОбработчикОжидания() + + ОбновитьКомандыВыбораВариантов(); + +КонецПроцедуры + &НаСервере Процедура ОбновитьКомандыВыбораВариантов() Если ОбщегоНазначения.РазделениеВключено() @@ -4408,10 +4538,21 @@ ПараметрыПоиска = Новый Структура; ПараметрыПоиска.Вставить("Отчеты", ОтчетыСервер.ЗначениеВМассив(НастройкиОтчета.ОтчетСсылка)); - ПараметрыПоиска.Вставить("ТолькоЛичные", Истина); - ПараметрыПоиска.Вставить("Контекст", КонтекстВарианта); + + Если НастройкиОтчета.Контекстный Тогда + ПараметрыПоиска.Вставить("Контекст", КонтекстВарианта); + ПараметрыПоиска.Вставить("ТолькоЛичные", Истина); + Иначе + ДоступныеПодсистемы = ВариантыОтчетовПовтИсп.ПодсистемыТекущегоПользователя().Список; + ПараметрыПоиска.Вставить("Подсистемы", ДоступныеПодсистемы); + ПараметрыПоиска.Вставить("ТолькоВидимыеВПанелиОтчетов", Истина); + КонецЕсли; ТаблицаВариантов = ВариантыОтчетов.ТаблицаВариантовОтчетов(ПараметрыПоиска); + Если ТаблицаВариантов.Колонки.Найти("Наименование") = Неопределено Тогда + ТаблицаВариантов.Колонки.НаименованиеВарианта.Имя = "Наименование"; + КонецЕсли; + Если НастройкиОтчета.Внешний Тогда // Добавить предопределенные варианты внешнего отчета в таблицу вариантов. Для Каждого ЭлементСписка Из НастройкиОтчета.ПредопределенныеВарианты Цикл СтрокаТаблицы = ТаблицаВариантов.Добавить(); @@ -4419,6 +4560,7 @@ СтрокаТаблицы.КлючВарианта = ЭлементСписка.Значение; КонецЦикла; КонецЕсли; + ТаблицаВариантов.Свернуть("Ссылка, КлючВарианта, Наименование, Автор, ТолькоДляАвтора"); ТаблицаВариантов.Сортировать("Наименование Возр, КлючВарианта Возр"); @@ -4426,10 +4568,6 @@ ГраницаМеню = ВариантыФормы.Количество() - 1; Для Каждого СтрокаТаблицы Из ТаблицаВариантов Цикл - Если СтрокаТаблицы.ТолькоДляАвтора = Истина - И СтрокаТаблицы.Автор <> АвторизованныйПользователь Тогда - Продолжить; - КонецЕсли; Найденные = ВариантыФормы.НайтиСтроки(Новый Структура("КлючВарианта, Найден", СтрокаТаблицы.КлючВарианта, Ложь)); Если Найденные.Количество() = 1 Тогда ВариантФормы = Найденные[0]; @@ -4460,7 +4598,7 @@ Кнопка.ИмяКоманды = ВариантФормы.ИмяКоманды; Кнопка.Заголовок = СтрокаТаблицы.Наименование; - // Подменю Еще (Все действия). + // Подменю Еще. КнопкаЕще = Элементы.Добавить(ВариантФормы.ИмяКоманды + "Еще", Тип("КнопкаФормы"), Элементы.ГруппаВариантыОтчетаЕще); КнопкаЕще.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; КнопкаЕще.ИмяКоманды = ВариантФормы.ИмяКоманды; @@ -4470,10 +4608,10 @@ КонецЕсли; Кнопка.Пометка = (КлючТекущегоВарианта = СтрокаТаблицы.КлючВарианта); - Кнопка.ТолькоВоВсехДействиях = Ложь; + Кнопка.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели; КнопкаЕще.Пометка = (КлючТекущегоВарианта = СтрокаТаблицы.КлючВарианта); - КнопкаЕще.ТолькоВоВсехДействиях = Истина; + КнопкаЕще.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; КонецЦикла; Найденные = ВариантыФормы.НайтиСтроки(Новый Структура("Найден", Ложь)); @@ -4967,4 +5105,37 @@ КонецПроцедуры +&НаСервереБезКонтекста +Функция СписокДоступныхФорматовСохраненияОтчета(ИндексФорматовСохраненияОтчета) + + ДоступныеФорматы = Новый СписокЗначений; + + ФорматыСохранения = СтандартныеПодсистемыСервер.НастройкиФорматовСохраненияТабличногоДокумента(); + + Для Каждого ФорматСохранения Из ИндексФорматовСохраненияОтчета Цикл + НайденноеОписание = ФорматыСохранения.Найти(ФорматСохранения.Ключ, "Расширение"); + ДоступныеФорматы.Добавить(НайденноеОписание.Расширение, НайденноеОписание.Представление, , НайденноеОписание.Картинка); + КонецЦикла; + + Возврат ДоступныеФорматы; + +КонецФункции + +&НаСервере +Процедура ОбновитьДополнительныеСвойстваДанныхРасшифровки() + + Если ЗначениеЗаполнено(ОтчетДанныеРасшифровки) И ЭтоАдресВременногоХранилища(ОтчетДанныеРасшифровки) Тогда + ДанныеРасшифровки = ПолучитьИзВременногоХранилища(ОтчетДанныеРасшифровки); + Если ТипЗнч(ДанныеРасшифровки) = Тип("ДанныеРасшифровкиКомпоновкиДанных") Тогда + ДополнительныеСвойства = ДанныеРасшифровки.Настройки.ДополнительныеСвойства; + ДополнительныеСвойства.Вставить("ВариантНаименование", ОтчетНаименованиеТекущегоВарианта); + ДополнительныеСвойства.Вставить("КлючВарианта", КлючТекущегоВарианта); + ДополнительныеСвойства.Вставить("КонтекстВарианта", КонтекстВарианта); + УдалитьИзВременногоХранилища(ОтчетДанныеРасшифровки); + ОтчетДанныеРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, УникальныйИдентификатор); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonForms/ФормаПоиска/Form.form b/SSL/src/CommonForms/ФормаПоиска/Form.form index b202e9561..44f8d8715 100644 --- a/SSL/src/CommonForms/ФормаПоиска/Form.form +++ b/SSL/src/CommonForms/ФормаПоиска/Form.form @@ -103,7 +103,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <backColor xsi:type="core:ColorRef"> @@ -273,7 +272,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -349,7 +347,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -517,7 +514,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/CommonForms/ЭлектроннаяПодпись/Module.bsl b/SSL/src/CommonForms/ЭлектроннаяПодпись/Module.bsl index 35f34cc06..5af2aa923 100644 --- a/SSL/src/CommonForms/ЭлектроннаяПодпись/Module.bsl +++ b/SSL/src/CommonForms/ЭлектроннаяПодпись/Module.bsl @@ -23,6 +23,8 @@ Элементы.ОписаниеОшибки.Видимость = Ложь; Иначе СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, "ОписаниеОшибки"); + Элементы.Инструкция.Видимость = + ЭлектроннаяПодписьСлужебный.ВидимостьСсылкиНаИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами(); КонецЕсли; Если Не ЭтоАдресВременногоХранилища(АдресПодписи) Тогда diff --git a/SSL/src/CommonModules/GoogleПереводчик/Module.bsl b/SSL/src/CommonModules/GoogleПереводчик/Module.bsl index 5b3dc4d0f..9dd4f5749 100644 --- a/SSL/src/CommonModules/GoogleПереводчик/Module.bsl +++ b/SSL/src/CommonModules/GoogleПереводчик/Module.bsl @@ -105,7 +105,7 @@ Исключение ЗаписатьОшибкуВЖурналРегистрации(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось установить соединение с сервером %1 по причине: - |%2'"), ИмяХоста, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + |%2'"), ИмяХоста, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); ВызватьИсключение; КонецПопытки; diff --git a/SSL/src/CommonModules/АвтономнаяРабота/Module.bsl b/SSL/src/CommonModules/АвтономнаяРабота/Module.bsl index 3c4b189e0..d16a779a2 100644 --- a/SSL/src/CommonModules/АвтономнаяРабота/Module.bsl +++ b/SSL/src/CommonModules/АвтономнаяРабота/Module.bsl @@ -99,10 +99,10 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); ЗаписьЖурналаРегистрации(АвтономнаяРаботаСлужебный.СобытиеЖурналаРегистрацииСозданиеАвтономногоРабочегоМеста(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); Параметры.Вставить("ОшибкаПриНастройкеАвтономногоРабочегоМеста", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; Возврат Истина; diff --git a/SSL/src/CommonModules/АвтономнаяРаботаСлужебный/Module.bsl b/SSL/src/CommonModules/АвтономнаяРаботаСлужебный/Module.bsl index 7f38efd67..c72b8cf4b 100644 --- a/SSL/src/CommonModules/АвтономнаяРаботаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/АвтономнаяРаботаСлужебный/Module.bsl @@ -516,6 +516,8 @@ ОбменДаннымиСервер.ВыполнитьОбновлениеПравилДляОбменаДанными(); КонецЕсли; + НастроитьАрхивированиеСообщений(); + УстановитьПривилегированныйРежим(Ложь); Если Не ЗагрузкаДанных Тогда @@ -723,7 +725,7 @@ УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; @@ -871,7 +873,7 @@ УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; @@ -967,7 +969,7 @@ ПланыОбмена.УстановитьГлавныйУзел(Неопределено); Исключение ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииСозданиеАвтономногоРабочегоМеста(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение НСтр("ru = 'Возможно, информационная база открыта в режиме конфигуратора. |Завершите работу конфигуратора и повторите запуск программы.'"); КонецПопытки; @@ -1002,7 +1004,7 @@ Исключение ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииСозданиеАвтономногоРабочегоМеста(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -1103,12 +1105,25 @@ Исключение ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииСозданиеАвтономногоРабочегоМеста(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; КонецПроцедуры +// Для внутреннего использования +// +Процедура НастроитьАрхивированиеСообщений() + + Настройки = РегистрыСведений.НастройкиАрхиваСообщенийОбменов.СоздатьМенеджерЗаписи(); + Настройки.УзелИнформационнойБазы = ПриложениеВСервисе(); + Настройки.КоличествоФайлов = 1; + Настройки.ХранитьНаДиске = Ложь; + Настройки.СжиматьФайлы = Истина; + Настройки.Записать(); + +КонецПроцедуры + Функция ИзменитьИспользованиеРазделения(Использование, ОбластьДанных = 0) Если Не Использование Тогда @@ -1181,7 +1196,7 @@ ОбменДаннымиСлужебный.ОтключитьОбновлениеКлючейДоступа(Ложь, Ложь); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииСозданиеАвтономногоРабочегоМеста(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ДанныеНачальногоОбраза = Неопределено; ВызватьИсключение; @@ -1193,7 +1208,7 @@ УдалитьФайлы(ИмяФайлаДанных); Исключение ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииСозданиеАвтономногоРабочегоМеста(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЦикла; @@ -1246,7 +1261,7 @@ УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЦикла; diff --git a/SSL/src/CommonModules/АдминистрированиеКластераCOM/Module.bsl b/SSL/src/CommonModules/АдминистрированиеКластераCOM/Module.bsl index 46775c3cc..551c0085d 100644 --- a/SSL/src/CommonModules/АдминистрированиеКластераCOM/Module.bsl +++ b/SSL/src/CommonModules/АдминистрированиеКластераCOM/Module.bsl @@ -150,12 +150,12 @@ | |Если в тексте ошибки указано, что ""класс не зарегистрирован"" или не совпадает версия компоненты ""comcntr"" с требуемой, |то следует зарегистрировать ее на компьютере %1, для этого обратитесь к администратору.'"), - ИмяКомпьютера(), КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ИмяКомпьютера(), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Иначе ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось подключиться с компьютера %1 к кластеру серверов по причине: |%2.'"), - ИмяКомпьютера(), КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ИмяКомпьютера(), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецЕсли; ВызватьИсключение ТекстИсключения diff --git a/SSL/src/CommonModules/АдминистрированиеКластераCOMКлиентСервер/Module.bsl b/SSL/src/CommonModules/АдминистрированиеКластераCOMКлиентСервер/Module.bsl index efdaaa200..410042409 100644 --- a/SSL/src/CommonModules/АдминистрированиеКластераCOMКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/АдминистрированиеКластераCOMКлиентСервер/Module.bsl @@ -162,7 +162,7 @@ #Если ВебКлиент ИЛИ МобильныйКлиент Тогда ВызватьИсключение; #Иначе - ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + Символы.ПС + Символы.ПС + ВызватьИсключение ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + Символы.ПС + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В случае ошибки о несоответствии версии компоненты ""comcntr"" зарегистрируйте ее на компьютере %1 |для учетной записи ОС Windows, от имени которой выполняется 1С:Предприятие. Например: |regsvr32.exe ""%2\comcntr.dll""'"), ИмяКомпьютера(), КаталогПрограммы()); diff --git a/SSL/src/CommonModules/АдминистрированиеКластераRAS/Module.bsl b/SSL/src/CommonModules/АдминистрированиеКластераRAS/Module.bsl index 97a166074..e84a8eb25 100644 --- a/SSL/src/CommonModules/АдминистрированиеКластераRAS/Module.bsl +++ b/SSL/src/CommonModules/АдминистрированиеКластераRAS/Module.bsl @@ -92,7 +92,7 @@ |""%3"" cluster --port=%4 %5:%6 | |Также рекомендуется проверить параметры подключения и сетевого экрана.'"), - ИмяКомпьютера(), КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), + ИмяКомпьютера(), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), КаталогПрограммы() + ?(ОбщегоНазначения.ЭтоWindowsСервер(), "ras.exe", "ras"), XMLСтрока(ПараметрыАдминистрированияКластера.ПортСервераАдминистрирования), ПараметрыАдминистрированияКластера.АдресАгентаСервера, diff --git a/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl index 9261c0140..022e9ca76 100644 --- a/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl @@ -224,10 +224,6 @@ // * Адрес - проверяемый адрес во внутреннем формате JSON или в XML, // соответствующем XDTO-пакету Адрес (http://www.v8.1c.ru/ssl/contactinfo), // или его XML-сериализация, соответствующая структуре XDTO-пакета. -// * ФорматАдреса - Строка - устарело. Формат адреса. Варианты: -// * ФИАС адрес проверяется по всем уровням адреса; -// * КЛАДР - у адреса не проверяются на соответствие номера домов, округа, -// внутригородские районы, доп. территории и элементы доп. территорий. // // Возвращаемое значение: // Массив - результаты анализа. Каждый элемент массива содержит структуры с полями: @@ -247,7 +243,7 @@ // ** КодУчасткаИФНСЮЛ - Строка - код территориального участка инспекции ФНС обслуживающей юридические лица. // // Пример: -// СтруктураПроверки = Новый Структура("Адрес, ФорматАдреса", Адрес, "ФИАС"); +// СтруктураПроверки = Новый Структура("Адрес", Адрес); // РезультатыПроверки = АдресныйКлассификатор.ПроверитьАдреса(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СтруктураПроверки)); // // Если РезультатыПроверки.Количество() > 0 И РезультатыПроверки.Варианты.Количество() > 0 Тогда diff --git a/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl index 05c0e52c4..2a98c2fc6 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl @@ -87,6 +87,26 @@ КонецПроцедуры +Процедура ПоказатьОчисткуАдресногоКлассификатора( + ПараметрыФормы = Неопределено, + ПараметрыОткрытия = Неопределено) Экспорт + + КлючиФормы = "Уникальность, Окно, НавигационнаяСсылка, Источник"; + ПараметрыОткрытияФормы = Новый Структура(КлючиФормы, Ложь); + Если ПараметрыОткрытия <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(ПараметрыОткрытияФормы, ПараметрыОткрытия); + КонецЕсли; + + ОткрытьФорму( + "РегистрСведений.АдресныеОбъекты.Форма.ОчисткаАдресногоКлассификатора", + ПараметрыФормы, + ПараметрыОткрытияФормы.Источник, + ПараметрыОткрытияФормы.Уникальность, + ПараметрыОткрытияФормы.Окно, + ПараметрыОткрытияФормы.НавигационнаяСсылка); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции diff --git a/SSL/src/CommonModules/АдресныйКлассификаторПовтИсп/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторПовтИсп/Module.bsl index f46e46e3a..d9a23d96e 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторПовтИсп/Module.bsl @@ -12,10 +12,10 @@ Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ - | УровниСокращенийАдресныхСведений.Сокращение КАК Сокращение - |ИЗ - | РегистрСведений.УровниСокращенийАдресныхСведений КАК УровниСокращенийАдресныхСведений"; + "ВЫБРАТЬ + | УровниСокращенийАдресныхСведений.Сокращение КАК Сокращение + |ИЗ + | РегистрСведений.УровниСокращенийАдресныхСведений КАК УровниСокращенийАдресныхСведений"; РезультатЗапроса = Запрос.Выполнить(); @@ -52,18 +52,18 @@ Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ - | СлужебныеАдресныеСведения.Тип КАК Тип, - | СлужебныеАдресныеСведения.Идентификатор КАК Идентификатор, - | СлужебныеАдресныеСведения.Значение КАК Значение - |ИЗ - | РегистрСведений.СлужебныеАдресныеСведения КАК СлужебныеАдресныеСведения - |ГДЕ - | СлужебныеАдресныеСведения.Тип = ""ТипыВладений"" - | ИЛИ СлужебныеАдресныеСведения.Тип = ""ТипыСтроений"" - | - |УПОРЯДОЧИТЬ ПО - | Значение"; + "ВЫБРАТЬ + | СлужебныеАдресныеСведения.Тип КАК Тип, + | СлужебныеАдресныеСведения.Идентификатор КАК Идентификатор, + | СлужебныеАдресныеСведения.Значение КАК Значение + |ИЗ + | РегистрСведений.СлужебныеАдресныеСведения КАК СлужебныеАдресныеСведения + |ГДЕ + | СлужебныеАдресныеСведения.Тип = ""ТипыВладений"" + | ИЛИ СлужебныеАдресныеСведения.Тип = ""ТипыСтроений"" + | + |УПОРЯДОЧИТЬ ПО + | Значение"; РезультатЗапроса = Запрос.Выполнить().Выбрать(); @@ -85,18 +85,18 @@ Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ - | СлужебныеАдресныеСведения.Тип КАК Тип, - | СлужебныеАдресныеСведения.Идентификатор КАК Идентификатор, - | СлужебныеАдресныеСведения.Ключ КАК Ключ, - | СлужебныеАдресныеСведения.Значение КАК Значение - |ИЗ - | РегистрСведений.СлужебныеАдресныеСведения КАК СлужебныеАдресныеСведения - |ГДЕ - | СлужебныеАдресныеСведения.Тип = ""ТипыПомещений"" - | - |УПОРЯДОЧИТЬ ПО - | Значение"; + "ВЫБРАТЬ + | СлужебныеАдресныеСведения.Тип КАК Тип, + | СлужебныеАдресныеСведения.Идентификатор КАК Идентификатор, + | СлужебныеАдресныеСведения.Ключ КАК Ключ, + | СлужебныеАдресныеСведения.Значение КАК Значение + |ИЗ + | РегистрСведений.СлужебныеАдресныеСведения КАК СлужебныеАдресныеСведения + |ГДЕ + | СлужебныеАдресныеСведения.Тип = ""ТипыПомещений"" + | + |УПОРЯДОЧИТЬ ПО + | Значение"; РезультатЗапроса = Запрос.Выполнить().Выбрать(); @@ -188,7 +188,7 @@ |по причине: |%3'"), Сервер, Формат(Порт, "ЧГ="), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета"); @@ -271,18 +271,18 @@ Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ - | СлужебныеАдресныеСведения.Тип КАК Тип, - | СлужебныеАдресныеСведения.Ключ КАК Ключ, - | СлужебныеАдресныеСведения.Значение КАК Значение - |ИЗ - | РегистрСведений.СлужебныеАдресныеСведения КАК СлужебныеАдресныеСведения - |ГДЕ - | СлужебныеАдресныеСведения.Тип = ""ТипыВладений"" - | ИЛИ СлужебныеАдресныеСведения.Тип = ""ТипыСтроений"" - | - |УПОРЯДОЧИТЬ ПО - | Значение"; + "ВЫБРАТЬ + | СлужебныеАдресныеСведения.Тип КАК Тип, + | СлужебныеАдресныеСведения.Ключ КАК Ключ, + | СлужебныеАдресныеСведения.Значение КАК Значение + |ИЗ + | РегистрСведений.СлужебныеАдресныеСведения КАК СлужебныеАдресныеСведения + |ГДЕ + | СлужебныеАдресныеСведения.Тип = ""ТипыВладений"" + | ИЛИ СлужебныеАдресныеСведения.Тип = ""ТипыСтроений"" + | + |УПОРЯДОЧИТЬ ПО + | Значение"; РезультатЗапроса = Запрос.Выполнить().Выбрать(); @@ -300,17 +300,17 @@ Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ - | СлужебныеАдресныеСведения.Тип КАК Тип, - | СлужебныеАдресныеСведения.Ключ КАК Ключ, - | СлужебныеАдресныеСведения.Значение КАК Значение - |ИЗ - | РегистрСведений.СлужебныеАдресныеСведения КАК СлужебныеАдресныеСведения - |ГДЕ - | СлужебныеАдресныеСведения.Тип = ""ТипыПомещений"" - | - |УПОРЯДОЧИТЬ ПО - | Значение"; + "ВЫБРАТЬ + | СлужебныеАдресныеСведения.Тип КАК Тип, + | СлужебныеАдресныеСведения.Ключ КАК Ключ, + | СлужебныеАдресныеСведения.Значение КАК Значение + |ИЗ + | РегистрСведений.СлужебныеАдресныеСведения КАК СлужебныеАдресныеСведения + |ГДЕ + | СлужебныеАдресныеСведения.Тип = ""ТипыПомещений"" + | + |УПОРЯДОЧИТЬ ПО + | Значение"; РезультатЗапроса = Запрос.Выполнить().Выбрать(); @@ -338,10 +338,10 @@ Результат = АдресныйКлассификаторСлужебный.СведенияОЗагруженномРегионе(); Если ПустаяСтрока(ТипОбъекта) Тогда - НаименованиеИСокращение = АдресныйКлассификаторСлужебный.НаименованиеИТипОбъекта(Наименование, Истина); + НаименованиеИТипОбъекта = АдресныйКлассификаторСлужебный.НаименованиеИТипОбъекта(Наименование, Истина); - Наименование = НаименованиеИСокращение.Наименование; - ТипОбъекта = НаименованиеИСокращение.ТипОбъекта; + Наименование = НаименованиеИТипОбъекта.Наименование; + ТипОбъекта = НаименованиеИТипОбъекта.ТипОбъекта; КонецЕсли; РезультатЗапроса = АдресныйКлассификаторСлужебный.АктуальныеДанныеОРегионе(Наименование, ТипОбъекта); @@ -390,48 +390,49 @@ Результат = Новый Соответствие(); Запрос = Новый Запрос; - Запрос.Текст ="ВЫБРАТЬ - | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ, - | АдресныеОбъекты.Наименование + "" "" + АдресныеОбъекты.ТипОбъекта КАК Наименование - |ПОМЕСТИТЬ АдресныеОбъекты - |ИЗ - | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - |ГДЕ - | АдресныеОбъекты.Уровень = 1 - | - |ИНДЕКСИРОВАТЬ ПО - | КодСубъектаРФ - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ЕСТЬNULL(ВЫРАЗИТЬ(СлужебныеАдресныеСведения.Идентификатор КАК ЧИСЛО(2, 0)), АдресныеОбъекты.КодСубъектаРФ) КАК КодСубъектаРФ, - | СлужебныеАдресныеСведения.Значение КАК ПолноеНаименование, - | АдресныеОбъекты.Наименование КАК Наименование - |ИЗ - | АдресныеОбъекты КАК АдресныеОбъекты - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СлужебныеАдресныеСведения КАК СлужебныеАдресныеСведения - | ПО ((ВЫРАЗИТЬ(СлужебныеАдресныеСведения.Идентификатор КАК ЧИСЛО(2, 0))) = АдресныеОбъекты.КодСубъектаРФ) - | И (СлужебныеАдресныеСведения.Тип = &Тип)"; + Запрос.Текст = + "ВЫБРАТЬ + | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ, + | АдресныеОбъекты.Наименование + "" "" + АдресныеОбъекты.ТипОбъекта КАК Наименование + |ПОМЕСТИТЬ АдресныеОбъекты + |ИЗ + | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + |ГДЕ + | АдресныеОбъекты.Уровень = 1 + | + |ИНДЕКСИРОВАТЬ ПО + | КодСубъектаРФ + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ЕСТЬNULL(ВЫРАЗИТЬ(СлужебныеАдресныеСведения.Идентификатор КАК ЧИСЛО(2, 0)), АдресныеОбъекты.КодСубъектаРФ) КАК КодСубъектаРФ, + | СлужебныеАдресныеСведения.Значение КАК ПолноеНаименование, + | АдресныеОбъекты.Наименование КАК Наименование + |ИЗ + | АдресныеОбъекты КАК АдресныеОбъекты + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СлужебныеАдресныеСведения КАК СлужебныеАдресныеСведения + | ПО ((ВЫРАЗИТЬ(СлужебныеАдресныеСведения.Идентификатор КАК ЧИСЛО(2, 0))) = АдресныеОбъекты.КодСубъектаРФ) + | И (СлужебныеАдресныеСведения.Тип = &Тип)"; Запрос.УстановитьПараметр("Тип", "СубъектыРФ"); - РезультатЗапроса = Запрос.Выполнить().Выбрать(); + Выборка = Запрос.Выполнить().Выбрать(); Классификатор = РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ(); - Пока РезультатЗапроса.Следующий() Цикл + Пока Выборка.Следующий() Цикл - РегионИзКлассификатора = Классификатор.Найти(РезультатЗапроса.КодСубъектаРФ, "КодСубъектаРФ"); + РегионИзКлассификатора = Классификатор.Найти(Выборка.КодСубъектаРФ, "КодСубъектаРФ"); - Если ЗначениеЗаполнено(РезультатЗапроса.ПолноеНаименование) Тогда - Результат.Вставить(РезультатЗапроса.КодСубъектаРФ, РезультатЗапроса.ПолноеНаименование); + Если ЗначениеЗаполнено(Выборка.ПолноеНаименование) Тогда + Результат.Вставить(Выборка.КодСубъектаРФ, Выборка.ПолноеНаименование); Иначе Если РегионИзКлассификатора <> Неопределено Тогда Результат.Вставить(РегионИзКлассификатора.КодСубъектаРФ, РегионИзКлассификатора.ПолноеНаименование); Иначе - Результат.Вставить(РезультатЗапроса.КодСубъектаРФ, РезультатЗапроса.Наименование); + Результат.Вставить(Выборка.КодСубъектаРФ, Выборка.Наименование); КонецЕсли; КонецЕсли; @@ -450,19 +451,21 @@ КонецФункции Функция СписокРегионов() Экспорт - + + Классификатор = РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ(); + Результат = Новый Соответствие; Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ - | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ, - | АдресныеОбъекты.Наименование КАК Наименование, - | АдресныеОбъекты.Наименование + "" "" + АдресныеОбъекты.ТипОбъекта КАК ПолноеНаименование - |ИЗ - | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - |ГДЕ - | АдресныеОбъекты.Уровень = 1"; + "ВЫБРАТЬ + | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ, + | АдресныеОбъекты.Наименование КАК Наименование, + | АдресныеОбъекты.Наименование + "" "" + АдресныеОбъекты.ТипОбъекта КАК ПолноеНаименование + |ИЗ + | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + |ГДЕ + | АдресныеОбъекты.Уровень = 1"; РезультатЗапроса = Запрос.Выполнить(); @@ -499,13 +502,13 @@ Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ - | АдресныеОбъекты.Идентификатор КАК Идентификатор - |ИЗ - | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - |ГДЕ - | АдресныеОбъекты.КодСубъектаРФ В (&КодыСубъектовРФ) - | И АдресныеОбъекты.Уровень = 1"; + "ВЫБРАТЬ + | АдресныеОбъекты.Идентификатор КАК Идентификатор + |ИЗ + | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + |ГДЕ + | АдресныеОбъекты.КодСубъектаРФ В (&КодыСубъектовРФ) + | И АдресныеОбъекты.Уровень = 1"; Запрос.УстановитьПараметр("КодыСубъектовРФ", КодыСубъектовРФ); @@ -525,12 +528,12 @@ Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ - | УровниСокращенийАдресныхСведений.Сокращение КАК Сокращение, - | УровниСокращенийАдресныхСведений.Уровень КАК Уровень, - | УровниСокращенийАдресныхСведений.Значение КАК Значение - |ИЗ - | РегистрСведений.УровниСокращенийАдресныхСведений КАК УровниСокращенийАдресныхСведений"; + "ВЫБРАТЬ + | УровниСокращенийАдресныхСведений.Сокращение КАК Сокращение, + | УровниСокращенийАдресныхСведений.Уровень КАК Уровень, + | УровниСокращенийАдресныхСведений.Значение КАК Значение + |ИЗ + | РегистрСведений.УровниСокращенийАдресныхСведений КАК УровниСокращенийАдресныхСведений"; РезультатЗапроса = Запрос.Выполнить(); @@ -619,4 +622,4 @@ КонецФункции -#КонецОбласти +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl index 6e9a24c41..557eba4be 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl @@ -71,25 +71,27 @@ // Определяем дату последней загрузки. Если ЗначениеЗаполнено(ИдентификаторРегиона) Тогда - ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1 - | ЕСТЬNULL(ЗагруженныеВерсииАдресныхСведений.ДатаВерсии, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК ДатаЗагрузки - |ИЗ - | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - | ПРАВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК ЗагруженныеВерсииАдресныхСведений - | ПО АдресныеОбъекты.КодСубъектаРФ = ЗагруженныеВерсииАдресныхСведений.КодСубъектаРФ - | ГДЕ АдресныеОбъекты.Идентификатор = &ИдентификаторРегиона - | - |УПОРЯДОЧИТЬ ПО - | ДатаВерсии"; + ТекстЗапроса = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ЕСТЬNULL(ЗагруженныеВерсииАдресныхСведений.ДатаВерсии, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК ДатаЗагрузки + |ИЗ + | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + | ПРАВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК ЗагруженныеВерсииАдресныхСведений + | ПО АдресныеОбъекты.КодСубъектаРФ = ЗагруженныеВерсииАдресныхСведений.КодСубъектаРФ + | ГДЕ АдресныеОбъекты.Идентификатор = &ИдентификаторРегиона + | + |УПОРЯДОЧИТЬ ПО + | ДатаВерсии"; Запрос.УстановитьПараметр("ИдентификаторРегиона", Новый УникальныйИдентификатор(ИдентификаторРегиона)); Иначе - ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1 - | ЕСТЬNULL(ЗагруженныеВерсииАдресныхСведений.ДатаВерсии, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК ДатаЗагрузки - |ИЗ - | РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК ЗагруженныеВерсииАдресныхСведений - |УПОРЯДОЧИТЬ ПО - | ДатаЗагрузки УБЫВ"; + ТекстЗапроса = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ЕСТЬNULL(ЗагруженныеВерсииАдресныхСведений.ДатаВерсии, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК ДатаЗагрузки + |ИЗ + | РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК ЗагруженныеВерсииАдресныхСведений + |УПОРЯДОЧИТЬ ПО + | ДатаЗагрузки УБЫВ"; КонецЕсли; Запрос.Текст = ТекстЗапроса; Выборка = Запрос.Выполнить().Выбрать(); @@ -340,16 +342,20 @@ КодРегиона = ОпределитьКодРегионаПоЧастямАдреса(ЧастиАдреса); - Если ЗагруженныеАдресныеСведения.Получить("ИспользоватьЗагруженные") = Истина И ТипЗнч( - ЗагруженныеАдресныеСведения.Получить(КодРегиона)) = Тип("Структура") И ЗагруженныеАдресныеСведения.Получить( - КодРегиона).ИспользоватьЗагруженные Тогда + Если ЗагруженныеАдресныеСведения.Получить("ИспользоватьЗагруженные") = Истина + И ТипЗнч(ЗагруженныеАдресныеСведения.Получить(КодРегиона)) = Тип("Структура") + И ЗагруженныеАдресныеСведения.Получить(КодРегиона).ИспользоватьЗагруженные Тогда + Адрес = РаспознатьАдресЗагруженныеДанные(ЧастиАдреса, КодРегиона); Если СтрСравнить(Адрес.addressType, АдресВСвободнойФорме()) <> 0 Тогда Возврат Адрес; КонецЕсли; + ИначеЕсли ЗагруженныеАдресныеСведения.Получить("КлассификаторДоступен") = Истина Тогда + Адрес = РаспознатьАдресВебСервис(ЧастиАдреса, Представление, ВСтруктуру); Возврат Адрес; + КонецЕсли; Возврат Неопределено; @@ -446,9 +452,9 @@ ПараметрыПоиска.Добавить("text=" + ДополнительныеПараметры.СтрокаПоиска); КонецЕсли; - ШаблонаЗапроса = СтрСоединить(ПараметрыПоиска, "&"); + ШаблонЗапроса = СтрСоединить(ПараметрыПоиска, "&"); - ТекстGETЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонаЗапроса, Строка(Уровень), + ТекстGETЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗапроса, Строка(Уровень), ТипАдресаДляВебСервиса(ТипАдреса), КоличествоЗаписей); РезультатВебСервис = ВыполнитьЗапросЧерезВебСервис(ТекстGETЗапроса); @@ -556,10 +562,10 @@ АдресныйОбъект.ЗагруженныеДанные = Истина; Если ПредлагатьЗагрузкуСведений Тогда - АдресныйОбъект.Вставить("ПредлагатьЗагрузкуКлассификатора", Не СведенияОбАдресе.РегионЗагружен); + АдресныйОбъект.ПредлагатьЗагрузкуКлассификатора = Не СведенияОбАдресе.РегионЗагружен; КонецЕсли; - Представление = НайтиИВыделитьОформлением(СведенияОбАдресе.Представление, СтрокаПоиска); + Представление = СтрНайтиИВыделитьОформлением(СведенияОбАдресе.Представление, СтрокаПоиска); Если Представление = Неопределено Тогда Представление = СведенияОбАдресе.Представление; @@ -627,7 +633,7 @@ ДобавленныеПредставленияАдресногоОбъекта.Вставить(АдресныйОбъект.Представление, Истина); - Представление = НайтиИВыделитьОформлением(АдресныйОбъект.Представление, СтрокаПоиска); + Представление = СтрНайтиИВыделитьОформлением(АдресныйОбъект.Представление, СтрокаПоиска); Если Представление = Неопределено Тогда Представление = АдресныйОбъект.Представление; @@ -654,7 +660,6 @@ Возврат ДанныеАдресныхОбъектов; КонецФункции - // Возвращает список для автоподбора элемента адреса, поиск по подобию. // // Параметры: @@ -687,11 +692,14 @@ ЗагруженныеАдресныеСведения = АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ(); Если Не ТолькоВебСервис Тогда - ЗаполнитьСписокАвтоподбораПоЗагруженнымДанным(Результат, СписокПредставлений, Текст, ДополнительныеПараметры, - ЗагруженныеАдресныеСведения); + + ЗаполнитьСписокАвтоподбораПоЗагруженнымДанным(Результат, + СписокПредставлений, Текст, ДополнительныеПараметры, ЗагруженныеАдресныеСведения); + Если Результат.Количество() >= 20 Тогда Возврат Результат; КонецЕсли; + КонецЕсли; // Веб сервис 1С @@ -710,11 +718,12 @@ Если СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(СокрЛП(ЧастиАдреса[0])) Тогда ЧастиАдреса.Удалить(0); КонецЕсли; - + ТекстПоиска = СокрЛП(СтрСоединить(ЧастиАдреса, ",")); - - ЗаполнитьСписокАвтоподбораЧастиАдресаСервис1С(Результат, СписокПредставлений, ТекстПоиска, Родитель, 20, - ДополнительныеПараметры); + + ЗаполнитьСписокАвтоподбораЧастиАдресаСервис1С(Результат, + СписокПредставлений, ТекстПоиска, Родитель, 20, ДополнительныеПараметры); + КонецЕсли; КонецЕсли; @@ -899,8 +908,8 @@ ЗагруженныеАдресныеСведения = АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ(); КлассификаторДоступен = ЗагруженныеАдресныеСведения.Получить("КлассификаторДоступен"); - Если СведенияОбАдресномОбъекте.Свойство("ЗагруженныеДанные") И ТипЗнч(СведенияОбАдресномОбъекте.ЗагруженныеДанные) - = Тип("Булево") Тогда + Если СведенияОбАдресномОбъекте.Свойство("ЗагруженныеДанные") + И ТипЗнч(СведенияОбАдресномОбъекте.ЗагруженныеДанные) = Тип("Булево") Тогда ЗагруженныеДанные = СведенияОбАдресномОбъекте.ЗагруженныеДанные; Иначе ЗагруженныеДанные = ЗагруженныеАдресныеСведения["ИспользоватьЗагруженные"]; // Если неизвестен источник, то сначала ищем в загруженные данных. @@ -946,7 +955,7 @@ // - Строка - проверяемый адрес // ((http://www.v8.1c.ru/ssl/AddressSystem) АдресРФ) или его // XML-сериализация. -// * ФорматАдреса - Строка - тип используемого классификатора для проверки. +// * ФорматАдреса - Строка - устарело. тип используемого классификатора для проверки. // // Возвращаемое значение: // Структура - найденные варианты. Содержит поля: @@ -1145,8 +1154,8 @@ Если XDTOАдрес.Свойства().Получить("Представление") <> Неопределено Тогда Результат.Value = XDTOАдрес.Представление; КонецЕсли; - Если XDTOАдрес.Свойства().Получить("Комментарий") <> Неопределено И ТипЗнч(XDTOАдрес.Комментарий) = Тип( - "Строка") Тогда + Если XDTOАдрес.Свойства().Получить("Комментарий") <> Неопределено + И ТипЗнч(XDTOАдрес.Комментарий) = Тип("Строка") Тогда Результат.Comment = XDTOАдрес.Комментарий; КонецЕсли; ИначеЕсли ЭтоКонтактнаяИнформацияВJSON(КонтактнаяИнформация) Тогда @@ -1170,8 +1179,8 @@ XDTOТип = Состав.Тип(); - Если XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Или XDTOТип = ФабрикаXDTO.Тип( - "http://www.v8.1c.ru/ssl/contactinfo", "Адрес") Тогда + Если XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") + Или XDTOТип = ФабрикаXDTO.Тип("http://www.v8.1c.ru/ssl/contactinfo", "Адрес") Тогда Если Состав.Свойства().Получить("Страна") <> Неопределено И ЗначениеЗаполнено(Состав.Страна) Тогда НаименованиеСтраны = Состав.Страна; @@ -1355,7 +1364,7 @@ АдресаЗагруженныеДанные = Новый Соответствие; РезультатыВебСервис = Новый Соответствие; - РезультатЗагруженныеДанные = Новый Соответствие; + РезультатПроверки = Новый Соответствие; ПервичнаяПроверка = ПервичнаяПроверкаАдресов(НаборАдресов); @@ -1365,7 +1374,7 @@ Адрес = НаборАдресов[УникальныйКлюч]; Если СведенияОАдресе.АдресПроверен Тогда - РезультатЗагруженныеДанные.Вставить(УникальныйКлюч, СведенияОАдресе); + РезультатПроверки.Вставить(УникальныйКлюч, СведенияОАдресе); Продолжить; КонецЕсли; @@ -1381,10 +1390,14 @@ ЗагруженныеАдресныеСведения = АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ(); Если ЗагруженныеАдресныеСведения["ИспользоватьЗагруженные"] И АдресаЗагруженныеДанные.Количество() > 0 Тогда - РезультатЗагруженныеДанные = ПроверитьАдресаПоКлассификатору(АдресаЗагруженныеДанные, - ПроверятьУстареваниеАдресов); + + РезультатыПоКлассификатору = ПроверитьАдресаПоКлассификатору(АдресаЗагруженныеДанные, ПроверятьУстареваниеАдресов); + Для каждого РезультатПоКлассификатору Из РезультатыПоКлассификатору Цикл + РезультатПроверки.Вставить(РезультатПоКлассификатору.Ключ, РезультатПоКлассификатору.Значение); + КонецЦикла; + КонецЕсли; - + Если ЗагруженныеАдресныеСведения["КлассификаторДоступен"] = Истина И АдресаВебСервис.Количество() > 0 Тогда ДанныеИзВебСервиса = ЗаполнитьРезультатПроверкиАдресаПоКлассификаторуСервис1С(АдресаВебСервис, Ложь); Если Не ДанныеИзВебСервиса.Отказ Тогда @@ -1393,10 +1406,10 @@ КонецЕсли; Для Каждого РезультатВебСервис Из РезультатыВебСервис Цикл - РезультатЗагруженныеДанные.Вставить(РезультатВебСервис.Ключ, РезультатВебСервис.Значение); + РезультатПроверки.Вставить(РезультатВебСервис.Ключ, РезультатВебСервис.Значение); КонецЦикла; - Возврат РезультатЗагруженныеДанные; + Возврат РезультатПроверки; КонецФункции @@ -1521,8 +1534,8 @@ КонецЕсли; ИдентификаторАдресногоОбъекта = ""; - Если ТипЗнч(АдресСтруктура) = Тип("Структура") И АдресСтруктура.Свойство("ID") И ЗначениеЗаполнено( - АдресСтруктура.ID) Тогда + Если ТипЗнч(АдресСтруктура) = Тип("Структура") + И АдресСтруктура.Свойство("ID") И ЗначениеЗаполнено(АдресСтруктура.ID) Тогда ИдентификаторАдресногоОбъекта = АдресСтруктура.ID; КонецЕсли; @@ -1572,15 +1585,17 @@ КодКЛАДРЗаполнены = Ложь; Если ЗаполненыВсеИдентификаторыОбъекта(Адрес) И ЗначениеЗаполнено(ИдентификаторАдресногоОбъекта) Тогда // Код КЛАДР - Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 - | АдресныеОбъекты.КодКЛАДР КАК КодКЛАДР - |ИЗ - | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - |ГДЕ - | АдресныеОбъекты.Идентификатор = &Идентификатор"); - + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | АдресныеОбъекты.КодКЛАДР КАК КодКЛАДР + |ИЗ + | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + |ГДЕ + | АдресныеОбъекты.Идентификатор = &Идентификатор"; + Запрос.УстановитьПараметр("Идентификатор", ИдентификаторАдресногоОбъекта); - + РезультатЗапроса = Запрос.Выполнить(); Если Не РезультатЗапроса.Пустой() Тогда @@ -1736,44 +1751,45 @@ Классификатор = РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ(); - ТекстЗапроса = "ВЫБРАТЬ - | Параметр.Наименование КАК Наименование, - | Параметр.ТипОбъекта КАК ТипОбъекта, - | Параметр.ПолноеНаименование КАК ПолноеНаименование, - | Параметр.ОКТМО КАК ОКТМО, - | Параметр.КодСубъектаРФ КАК КодСубъектаРФ - |ПОМЕСТИТЬ Классификатор - |ИЗ - | &Классификатор КАК Параметр - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | Классификатор.Наименование КАК Наименование, - | ЕСТЬNULL(СлужебныеАдресныеСведения.Значение, Классификатор.ПолноеНаименование) КАК Представление, - | Классификатор.ТипОбъекта КАК ТипОбъекта, - | Классификатор.КодСубъектаРФ КАК КодСубъектаРФ, - | Классификатор.ОКТМО КАК ОКТМО, - | ЗагруженныеВерсииАдресныхСведений.Версия КАК Версия, - | ЕСТЬNULL(ЗагруженныеВерсииАдресныхСведений.ДатаВерсии, ДАТАВРЕМЯ(1, 1, 1, 1, 1, 1)) КАК ДатаВерсии, - | ЕСТЬNULL(ЗагруженныеВерсииАдресныхСведений.ДатаЗагрузки, ДАТАВРЕМЯ(1, 1, 1, 1, 1, 1)) КАК ДатаЗагрузки, - | АдресныеОбъекты.Идентификатор КАК Идентификатор, - | НЕ ЗагруженныеВерсииАдресныхСведений.Версия ЕСТЬ NULL КАК Загружено, - | ДОБАВИТЬКДАТЕ(ЗагруженныеВерсииАдресныхСведений.ДатаЗагрузки, МЕСЯЦ, 1) < &ТекущаяДата КАК Устарело - | ИЗ - | Классификатор КАК Классификатор - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - | ПО (АдресныеОбъекты.КодСубъектаРФ = Классификатор.КодСубъектаРФ) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК ЗагруженныеВерсииАдресныхСведений - | ПО (Классификатор.КодСубъектаРФ = ЗагруженныеВерсииАдресныхСведений.КодСубъектаРФ) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СлужебныеАдресныеСведения КАК СлужебныеАдресныеСведения - | ПО (Классификатор.КодСубъектаРФ = (ВЫРАЗИТЬ(СлужебныеАдресныеСведения.Идентификатор КАК ЧИСЛО(2, 0)))) - | И СлужебныеАдресныеСведения.Тип = &ТипСведений - |ГДЕ - | АдресныеОбъекты.Уровень = 1 - | - |УПОРЯДОЧИТЬ ПО - | КодСубъектаРФ"; + ТекстЗапроса = + "ВЫБРАТЬ + | Параметр.Наименование КАК Наименование, + | Параметр.ТипОбъекта КАК ТипОбъекта, + | Параметр.ПолноеНаименование КАК ПолноеНаименование, + | Параметр.ОКТМО КАК ОКТМО, + | Параметр.КодСубъектаРФ КАК КодСубъектаРФ + |ПОМЕСТИТЬ Классификатор + |ИЗ + | &Классификатор КАК Параметр + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Классификатор.Наименование КАК Наименование, + | ЕСТЬNULL(СлужебныеАдресныеСведения.Значение, Классификатор.ПолноеНаименование) КАК Представление, + | Классификатор.ТипОбъекта КАК ТипОбъекта, + | Классификатор.КодСубъектаРФ КАК КодСубъектаРФ, + | Классификатор.ОКТМО КАК ОКТМО, + | ЗагруженныеВерсииАдресныхСведений.Версия КАК Версия, + | ЕСТЬNULL(ЗагруженныеВерсииАдресныхСведений.ДатаВерсии, ДАТАВРЕМЯ(1, 1, 1, 1, 1, 1)) КАК ДатаВерсии, + | ЕСТЬNULL(ЗагруженныеВерсииАдресныхСведений.ДатаЗагрузки, ДАТАВРЕМЯ(1, 1, 1, 1, 1, 1)) КАК ДатаЗагрузки, + | АдресныеОбъекты.Идентификатор КАК Идентификатор, + | НЕ ЗагруженныеВерсииАдресныхСведений.Версия ЕСТЬ NULL КАК Загружено, + | ДОБАВИТЬКДАТЕ(ЗагруженныеВерсииАдресныхСведений.ДатаЗагрузки, МЕСЯЦ, 1) < &ТекущаяДата КАК Устарело + | ИЗ + | Классификатор КАК Классификатор + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + | ПО (АдресныеОбъекты.КодСубъектаРФ = Классификатор.КодСубъектаРФ) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК ЗагруженныеВерсииАдресныхСведений + | ПО (Классификатор.КодСубъектаРФ = ЗагруженныеВерсииАдресныхСведений.КодСубъектаРФ) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СлужебныеАдресныеСведения КАК СлужебныеАдресныеСведения + | ПО (Классификатор.КодСубъектаРФ = (ВЫРАЗИТЬ(СлужебныеАдресныеСведения.Идентификатор КАК ЧИСЛО(2, 0)))) + | И СлужебныеАдресныеСведения.Тип = &ТипСведений + |ГДЕ + | АдресныеОбъекты.Уровень = 1 + | + |УПОРЯДОЧИТЬ ПО + | КодСубъектаРФ"; Запрос = Новый Запрос(ТекстЗапроса); @@ -1903,7 +1919,7 @@ // Заполнение начальных данных. Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "3.1.7.315"; + Обработчик.Версия = "3.1.8.219"; Обработчик.Процедура = "АдресныйКлассификаторСлужебный.ВыполнитьНачальноеЗаполнение"; Обработчик.НачальноеЗаполнение = Истина; Обработчик.ОбщиеДанные = Истина; @@ -2061,8 +2077,9 @@ Функция АдаптацияНазванияРегиона(Название) Экспорт // АПК: 1297-выкл Данные адресного классификатора, не локализуются - Если СтрСравнить(Название, "Кемеровская область - Кузбасс обл") = 0 Или СтрСравнить(Название, - "Кемеровская область - Кузбасс область") = 0 Или СтрСравнить(Название, "Кемеровская область") = 0 Тогда + Если СтрСравнить(Название, "Кемеровская область - Кузбасс обл") = 0 + Или СтрСравнить(Название, "Кемеровская область - Кузбасс область") = 0 + Или СтрСравнить(Название, "Кемеровская область") = 0 Тогда Возврат ДействующиеНаименованиеКемеровскойОбласти(); КонецЕсли; // АПК: 1297-вкл @@ -2082,35 +2099,6 @@ // АПК: 1297-вкл КонецФункции -Функция НайтиИВыделитьОформлением(Строка, Знач Подстрока) - - Если СтрНайти(ВРег(Строка), ВРег(Подстрока)) = 0 Тогда - Возврат Строка; - КонецЕсли; - - Представление = Строка; - ФрагментыТекстаПоиска = СтрРазделить(Подстрока, " "); - - Для каждого ФрагментТекстаПоиска Из ФрагментыТекстаПоиска Цикл - Позиция = СтрНайти(ВРег(Представление), ВРег(ФрагментТекстаПоиска)); - Если Позиция > 0 Тогда - Представление = Лев(Представление, Позиция - 1) + Символы.ПС + Символы.ВТаб - + Сред(Представление, Позиция, СтрДлина(ФрагментТекстаПоиска)) - + Символы.ПС + Сред(Представление, Позиция + СтрДлина(ФрагментТекстаПоиска)); - КонецЕсли; - КонецЦикла; - - Набор = СтрРазделить(Представление, Символы.ПС); - Для Счетчик = 0 По Набор.Количество() - 1 Цикл - Если СтрНачинаетсяС(Набор[Счетчик], Символы.ВТаб) Тогда - Набор[Счетчик] = Новый ФорматированнаяСтрока(СокрЛП(Набор[Счетчик]), ШрифтыСтиля.ВажнаяНадписьШрифт, ЦветаСтиля.РезультатУспехЦвет); - КонецЕсли; - КонецЦикла; - - Возврат Новый ФорматированнаяСтрока(Набор); - -КонецФункции - Процедура ОбновитьСписокУровней(Адрес, ИмяУровня, ЕстьЗначение) Если ИмяУровня <> "district" Тогда @@ -2144,7 +2132,7 @@ КонецПроцедуры // Параметры: -// НаименованияАдресныхОбъектов - Массив +// НаименованияАдресныхОбъектов - Массив // Возвращаемое значение: // ТаблицаЗначений: // * Наименование - Строка @@ -2152,29 +2140,30 @@ // Функция ТаблицаАдресныхСокращений(НаименованияАдресныхОбъектов) - СтрокаЗапросГде = ""; - Если ТипЗнч(НаименованияАдресныхОбъектов) = Тип("Массив") И НаименованияАдресныхОбъектов.Количество() > 0 Тогда - СтрокаЗапросГде = " ГДЕ УровниСокращенийАдресныхСведений.Значение В(&АдресныеСокращения) "; - КонецЕсли; - Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ - | УровниСокращенийАдресныхСведений.Значение КАК Наименование, - | УровниСокращенийАдресныхСведений.Сокращение КАК Сокращение - |ИЗ - | РегистрСведений.УровниСокращенийАдресныхСведений КАК УровниСокращенийАдресныхСведений - | " + СтрокаЗапросГде + " - | - |СГРУППИРОВАТЬ ПО - | УровниСокращенийАдресныхСведений.Значение, - | УровниСокращенийАдресныхСведений.Сокращение - | - |УПОРЯДОЧИТЬ ПО - | Наименование"; - - Если Не ПустаяСтрока(СтрокаЗапросГде) Тогда + Запрос.Текст = + "ВЫБРАТЬ + | УровниСокращенийАдресныхСведений.Значение КАК Наименование, + | УровниСокращенийАдресныхСведений.Сокращение КАК Сокращение + |ИЗ + | РегистрСведений.УровниСокращенийАдресныхСведений КАК УровниСокращенийАдресныхСведений + |ГДЕ + | &Условие + | + |СГРУППИРОВАТЬ ПО + | УровниСокращенийАдресныхСведений.Значение, + | УровниСокращенийАдресныхСведений.Сокращение + | + |УПОРЯДОЧИТЬ ПО + | Наименование"; + + Если ТипЗнч(НаименованияАдресныхОбъектов) = Тип("Массив") И НаименованияАдресныхОбъектов.Количество() > 0 Тогда + Условие = "ИСТИНА"; + Иначе + Условие = "УровниСокращенийАдресныхСведений.Значение В(&АдресныеСокращения)"; Запрос.УстановитьПараметр("АдресныеСокращения", НаименованияАдресныхОбъектов); КонецЕсли; + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", Условие); Возврат Запрос.Выполнить().Выгрузить(); @@ -2335,14 +2324,14 @@ Если КодРегиона <> Неопределено Тогда Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | АдресныеОбъекты.Наименование КАК Наименование, - | АдресныеОбъекты.ТипОбъекта КАК ТипОбъекта - |ИЗ - | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - |ГДЕ - | АдресныеОбъекты.Уровень = 1 - | И АдресныеОбъекты.КодСубъектаРФ = &КодСубъектаРФ"; + "ВЫБРАТЬ ПЕРВЫЕ 1 + | АдресныеОбъекты.Наименование КАК Наименование, + | АдресныеОбъекты.ТипОбъекта КАК ТипОбъекта + |ИЗ + | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + |ГДЕ + | АдресныеОбъекты.Уровень = 1 + | И АдресныеОбъекты.КодСубъектаРФ = &КодСубъектаРФ"; Запрос.УстановитьПараметр("КодСубъектаРФ", КодРегиона); @@ -2365,63 +2354,64 @@ Адрес = ОписаниеНовойКонтактнойИнформации(); Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ - | ДанныеАдреса.Уровень КАК Уровень, - | ДанныеАдреса.Позиция КАК Позиция, - | ДанныеАдреса.Значение КАК Значение, - | ДанныеАдреса.Наименование КАК Наименование, - | ДанныеАдреса.ТипОбъекта КАК ТипОбъекта - |ПОМЕСТИТЬ ДанныеАдреса - |ИЗ - | &ДанныеАдреса КАК ДанныеАдреса - |ГДЕ ДанныеАдреса.Уровень >= 0 - | - |ИНДЕКСИРОВАТЬ ПО - | Уровень, - | Позиция, - | Наименование, - | ТипОбъекта - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 10 - | МАКСИМУМ(АдресныеОбъекты.Уровень) КАК Уровень, - | ДанныеАдреса.Позиция КАК Позиция, - | ДанныеАдреса.Наименование КАК Наименование, - | ДанныеАдреса.ТипОбъекта КАК ТипОбъекта - |ИЗ - | ДанныеАдреса КАК ДанныеАдреса - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - | ПО (ДанныеАдреса.Наименование = АдресныеОбъекты.Наименование) - | И (ДанныеАдреса.ТипОбъекта = АдресныеОбъекты.ТипОбъекта) - |ГДЕ - | НЕ АдресныеОбъекты.Идентификатор ЕСТЬ NULL - | - |СГРУППИРОВАТЬ ПО - | ДанныеАдреса.Наименование, - | ДанныеАдреса.ТипОбъекта, - | ДанныеАдреса.Позиция - | - |УПОРЯДОЧИТЬ ПО ДанныеАдреса.Позиция - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ДанныеАдреса.Позиция КАК Позиция, - | ДанныеАдреса.Значение КАК Значение, - | ДанныеАдреса.Наименование КАК Наименование, - | ДанныеАдреса.ТипОбъекта КАК ТипОбъекта - | - |ИЗ - | ДанныеАдреса КАК ДанныеАдреса - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - | ПО ДанныеАдреса.Наименование = АдресныеОбъекты.Наименование - | И ДанныеАдреса.ТипОбъекта = АдресныеОбъекты.ТипОбъекта - |ГДЕ - | АдресныеОбъекты.Идентификатор ЕСТЬ NULL - | - |УПОРЯДОЧИТЬ ПО ДанныеАдреса.Позиция - |"; + Запрос.Текст = + "ВЫБРАТЬ + | ДанныеАдреса.Уровень КАК Уровень, + | ДанныеАдреса.Позиция КАК Позиция, + | ДанныеАдреса.Значение КАК Значение, + | ДанныеАдреса.Наименование КАК Наименование, + | ДанныеАдреса.ТипОбъекта КАК ТипОбъекта + |ПОМЕСТИТЬ ДанныеАдреса + |ИЗ + | &ДанныеАдреса КАК ДанныеАдреса + |ГДЕ ДанныеАдреса.Уровень >= 0 + | + |ИНДЕКСИРОВАТЬ ПО + | Уровень, + | Позиция, + | Наименование, + | ТипОбъекта + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 10 + | МАКСИМУМ(АдресныеОбъекты.Уровень) КАК Уровень, + | ДанныеАдреса.Позиция КАК Позиция, + | ДанныеАдреса.Наименование КАК Наименование, + | ДанныеАдреса.ТипОбъекта КАК ТипОбъекта + |ИЗ + | ДанныеАдреса КАК ДанныеАдреса + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + | ПО (ДанныеАдреса.Наименование = АдресныеОбъекты.Наименование) + | И (ДанныеАдреса.ТипОбъекта = АдресныеОбъекты.ТипОбъекта) + |ГДЕ + | НЕ АдресныеОбъекты.Идентификатор ЕСТЬ NULL + | + |СГРУППИРОВАТЬ ПО + | ДанныеАдреса.Наименование, + | ДанныеАдреса.ТипОбъекта, + | ДанныеАдреса.Позиция + | + |УПОРЯДОЧИТЬ ПО ДанныеАдреса.Позиция + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ДанныеАдреса.Позиция КАК Позиция, + | ДанныеАдреса.Значение КАК Значение, + | ДанныеАдреса.Наименование КАК Наименование, + | ДанныеАдреса.ТипОбъекта КАК ТипОбъекта + | + |ИЗ + | ДанныеАдреса КАК ДанныеАдреса + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + | ПО ДанныеАдреса.Наименование = АдресныеОбъекты.Наименование + | И ДанныеАдреса.ТипОбъекта = АдресныеОбъекты.ТипОбъекта + |ГДЕ + | АдресныеОбъекты.Идентификатор ЕСТЬ NULL + | + |УПОРЯДОЧИТЬ ПО ДанныеАдреса.Позиция + |"; Запрос.УстановитьПараметр("ДанныеАдреса", ЧастиАдреса); РезультатЗапроса = Запрос.ВыполнитьПакет(); @@ -2816,136 +2806,137 @@ Запрос = Новый Запрос; - ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1 - | &ПредставлениеМуниципальный КАК ТипАдреса, - | АдресныеОбъекты5.Наименование КАК Наименование5, - | АдресныеОбъекты5.ТипОбъекта КАК ТипОбъекта5, - | АдресныеОбъекты5.Идентификатор КАК Идентификатор5, - | АдресныеОбъекты5.Уровень КАК Уровень5, - | АдресныеОбъекты4.Наименование КАК Наименование4, - | АдресныеОбъекты4.ТипОбъекта КАК ТипОбъекта4, - | АдресныеОбъекты4.Идентификатор КАК Идентификатор4, - | АдресныеОбъекты4.Уровень КАК Уровень4, - | АдресныеОбъекты3.Наименование КАК Наименование3, - | АдресныеОбъекты3.ТипОбъекта КАК ТипОбъекта3, - | АдресныеОбъекты3.Идентификатор КАК Идентификатор3, - | АдресныеОбъекты3.Уровень КАК Уровень3, - | АдресныеОбъекты2.Наименование КАК Наименование2, - | АдресныеОбъекты2.ТипОбъекта КАК ТипОбъекта2, - | АдресныеОбъекты2.Идентификатор КАК Идентификатор2, - | АдресныеОбъекты2.Уровень КАК Уровень2, - | АдресныеОбъекты1.Наименование КАК Наименование1, - | АдресныеОбъекты1.ТипОбъекта КАК ТипОбъекта1, - | АдресныеОбъекты1.Идентификатор КАК Идентификатор1, - | АдресныеОбъекты1.Уровень КАК Уровень1, - | АдресныеОбъекты0.Наименование КАК Наименование0, - | АдресныеОбъекты0.ТипОбъекта КАК ТипОбъекта0, - | АдресныеОбъекты0.Идентификатор КАК Идентификатор0, - | АдресныеОбъекты0.Уровень КАК Уровень0, - | АдресныеОбъекты0.КодКЛАДР КАК КодКЛАДР, - | АдресныеОбъекты0.КодСубъектаРФ КАК КодСубъектаРФ, - | ЕСТЬNULL(ДополнительныеСведения.ПочтовыйИндекс, """") КАК ПочтовыйИндекс, - | ЕСТЬNULL(ДополнительныеСведения.ОКТМО, """") КАК ОКТМО, - | ЕСТЬNULL(ДополнительныеСведения.OKATO, """") КАК OKATO, - | ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСЮЛ, """") КАК КодУчасткаИФНСЮЛ, - | ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСФЛ, """") КАК КодУчасткаИФНСФЛ, - | ЕСТЬNULL(ДополнительныеСведения.КодИФНСЮЛ, """") КАК КодИФНСЮЛ, - | ЕСТЬNULL(ДополнительныеСведения.КодИФНСФЛ, """") КАК КодИФНСФЛ - |ИЗ - | РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия0 - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия1 - | ПО (МуниципальнаяИерархия0.РодительскийИдентификатор = МуниципальнаяИерархия1.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия2 - | ПО (МуниципальнаяИерархия1.РодительскийИдентификатор = МуниципальнаяИерархия2.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия3 - | ПО (МуниципальнаяИерархия2.РодительскийИдентификатор = МуниципальнаяИерархия3.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия4 - | ПО (МуниципальнаяИерархия3.РодительскийИдентификатор = МуниципальнаяИерархия4.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия5 - | ПО (МуниципальнаяИерархия4.РодительскийИдентификатор = МуниципальнаяИерархия5.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты0 - | ПО (АдресныеОбъекты0.Идентификатор = МуниципальнаяИерархия0.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты1 - | ПО (АдресныеОбъекты1.Идентификатор = МуниципальнаяИерархия1.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты2 - | ПО (АдресныеОбъекты2.Идентификатор = МуниципальнаяИерархия2.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты3 - | ПО (АдресныеОбъекты3.Идентификатор = МуниципальнаяИерархия3.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты4 - | ПО (АдресныеОбъекты4.Идентификатор = МуниципальнаяИерархия4.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты5 - | ПО (АдресныеОбъекты5.Идентификатор = МуниципальнаяИерархия5.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения - | ПО (ДополнительныеСведения.Идентификатор = АдресныеОбъекты0.ДополнительныеАдресныеСведения) - |ГДЕ - | МуниципальнаяИерархия0.Идентификатор = &Идентификатор - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ ПЕРВЫЕ 1 - | &ПредставлениеАдминистративный КАК ТипАдреса, - | АдресныеОбъекты5.Наименование КАК Наименование5, - | АдресныеОбъекты5.ТипОбъекта КАК ТипОбъекта5, - | АдресныеОбъекты5.Идентификатор КАК Идентификатор5, - | АдресныеОбъекты5.Уровень КАК Уровень5, - | АдресныеОбъекты4.Наименование КАК Наименование4, - | АдресныеОбъекты4.ТипОбъекта КАК ТипОбъекта4, - | АдресныеОбъекты4.Идентификатор КАК Идентификатор4, - | АдресныеОбъекты4.Уровень КАК Уровень4, - | АдресныеОбъекты3.Наименование КАК Наименование3, - | АдресныеОбъекты3.ТипОбъекта КАК ТипОбъекта3, - | АдресныеОбъекты3.Идентификатор КАК Идентификатор3, - | АдресныеОбъекты3.Уровень КАК Уровень3, - | АдресныеОбъекты2.Наименование КАК Наименование2, - | АдресныеОбъекты2.ТипОбъекта КАК ТипОбъекта2, - | АдресныеОбъекты2.Идентификатор КАК Идентификатор2, - | АдресныеОбъекты2.Уровень КАК Уровень2, - | АдресныеОбъекты1.Наименование КАК Наименование1, - | АдресныеОбъекты1.ТипОбъекта КАК ТипОбъекта1, - | АдресныеОбъекты1.Идентификатор КАК Идентификатор1, - | АдресныеОбъекты1.Уровень КАК Уровень1, - | АдресныеОбъекты0.Наименование КАК Наименование0, - | АдресныеОбъекты0.ТипОбъекта КАК ТипОбъекта0, - | АдресныеОбъекты0.Идентификатор КАК Идентификатор0, - | АдресныеОбъекты0.Уровень КАК Уровень0, - | АдресныеОбъекты0.КодКЛАДР КАК КодКЛАДР, - | АдресныеОбъекты0.КодСубъектаРФ КАК КодСубъектаРФ, - | ЕСТЬNULL(ДополнительныеСведения.ПочтовыйИндекс, """") КАК ПочтовыйИндекс, - | ЕСТЬNULL(ДополнительныеСведения.ОКТМО, """") КАК ОКТМО, - | ЕСТЬNULL(ДополнительныеСведения.OKATO, """") КАК OKATO, - | ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСЮЛ, """") КАК КодУчасткаИФНСЮЛ, - | ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСФЛ, """") КАК КодУчасткаИФНСФЛ, - | ЕСТЬNULL(ДополнительныеСведения.КодИФНСЮЛ, """") КАК КодИФНСЮЛ, - | ЕСТЬNULL(ДополнительныеСведения.КодИФНСФЛ, """") КАК КодИФНСФЛ - |ИЗ - | РегистрСведений.АдминистративнаяИерархия КАК АдминистративнаяИерархия0 - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК АдминистративнаяИерархия1 - | ПО (АдминистративнаяИерархия0.РодительскийИдентификатор = АдминистративнаяИерархия1.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК АдминистративнаяИерархия2 - | ПО (АдминистративнаяИерархия1.РодительскийИдентификатор = АдминистративнаяИерархия2.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК АдминистративнаяИерархия3 - | ПО (АдминистративнаяИерархия2.РодительскийИдентификатор = АдминистративнаяИерархия3.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК АдминистративнаяИерархия4 - | ПО (АдминистративнаяИерархия3.РодительскийИдентификатор = АдминистративнаяИерархия4.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК АдминистративнаяИерархия5 - | ПО (АдминистративнаяИерархия4.РодительскийИдентификатор = АдминистративнаяИерархия5.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты0 - | ПО (АдресныеОбъекты0.Идентификатор = АдминистративнаяИерархия0.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты1 - | ПО (АдресныеОбъекты1.Идентификатор = АдминистративнаяИерархия1.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты2 - | ПО (АдресныеОбъекты2.Идентификатор = АдминистративнаяИерархия2.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты3 - | ПО (АдресныеОбъекты3.Идентификатор = АдминистративнаяИерархия3.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты4 - | ПО (АдресныеОбъекты4.Идентификатор = АдминистративнаяИерархия4.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты5 - | ПО (АдресныеОбъекты5.Идентификатор = АдминистративнаяИерархия5.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения - | ПО (ДополнительныеСведения.Идентификатор = АдресныеОбъекты0.ДополнительныеАдресныеСведения) - |ГДЕ - | АдминистративнаяИерархия0.Идентификатор = &Идентификатор - |"; + ТекстЗапроса = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | &ПредставлениеМуниципальный КАК ТипАдреса, + | АдресныеОбъекты5.Наименование КАК Наименование5, + | АдресныеОбъекты5.ТипОбъекта КАК ТипОбъекта5, + | АдресныеОбъекты5.Идентификатор КАК Идентификатор5, + | АдресныеОбъекты5.Уровень КАК Уровень5, + | АдресныеОбъекты4.Наименование КАК Наименование4, + | АдресныеОбъекты4.ТипОбъекта КАК ТипОбъекта4, + | АдресныеОбъекты4.Идентификатор КАК Идентификатор4, + | АдресныеОбъекты4.Уровень КАК Уровень4, + | АдресныеОбъекты3.Наименование КАК Наименование3, + | АдресныеОбъекты3.ТипОбъекта КАК ТипОбъекта3, + | АдресныеОбъекты3.Идентификатор КАК Идентификатор3, + | АдресныеОбъекты3.Уровень КАК Уровень3, + | АдресныеОбъекты2.Наименование КАК Наименование2, + | АдресныеОбъекты2.ТипОбъекта КАК ТипОбъекта2, + | АдресныеОбъекты2.Идентификатор КАК Идентификатор2, + | АдресныеОбъекты2.Уровень КАК Уровень2, + | АдресныеОбъекты1.Наименование КАК Наименование1, + | АдресныеОбъекты1.ТипОбъекта КАК ТипОбъекта1, + | АдресныеОбъекты1.Идентификатор КАК Идентификатор1, + | АдресныеОбъекты1.Уровень КАК Уровень1, + | АдресныеОбъекты0.Наименование КАК Наименование0, + | АдресныеОбъекты0.ТипОбъекта КАК ТипОбъекта0, + | АдресныеОбъекты0.Идентификатор КАК Идентификатор0, + | АдресныеОбъекты0.Уровень КАК Уровень0, + | АдресныеОбъекты0.КодКЛАДР КАК КодКЛАДР, + | АдресныеОбъекты0.КодСубъектаРФ КАК КодСубъектаРФ, + | ЕСТЬNULL(ДополнительныеСведения.ПочтовыйИндекс, """") КАК ПочтовыйИндекс, + | ЕСТЬNULL(ДополнительныеСведения.ОКТМО, """") КАК ОКТМО, + | ЕСТЬNULL(ДополнительныеСведения.OKATO, """") КАК OKATO, + | ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСЮЛ, """") КАК КодУчасткаИФНСЮЛ, + | ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСФЛ, """") КАК КодУчасткаИФНСФЛ, + | ЕСТЬNULL(ДополнительныеСведения.КодИФНСЮЛ, """") КАК КодИФНСЮЛ, + | ЕСТЬNULL(ДополнительныеСведения.КодИФНСФЛ, """") КАК КодИФНСФЛ + |ИЗ + | РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия0 + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия1 + | ПО (МуниципальнаяИерархия0.РодительскийИдентификатор = МуниципальнаяИерархия1.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия2 + | ПО (МуниципальнаяИерархия1.РодительскийИдентификатор = МуниципальнаяИерархия2.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия3 + | ПО (МуниципальнаяИерархия2.РодительскийИдентификатор = МуниципальнаяИерархия3.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия4 + | ПО (МуниципальнаяИерархия3.РодительскийИдентификатор = МуниципальнаяИерархия4.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия5 + | ПО (МуниципальнаяИерархия4.РодительскийИдентификатор = МуниципальнаяИерархия5.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты0 + | ПО (АдресныеОбъекты0.Идентификатор = МуниципальнаяИерархия0.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты1 + | ПО (АдресныеОбъекты1.Идентификатор = МуниципальнаяИерархия1.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты2 + | ПО (АдресныеОбъекты2.Идентификатор = МуниципальнаяИерархия2.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты3 + | ПО (АдресныеОбъекты3.Идентификатор = МуниципальнаяИерархия3.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты4 + | ПО (АдресныеОбъекты4.Идентификатор = МуниципальнаяИерархия4.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты5 + | ПО (АдресныеОбъекты5.Идентификатор = МуниципальнаяИерархия5.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения + | ПО (ДополнительныеСведения.Идентификатор = АдресныеОбъекты0.ДополнительныеАдресныеСведения) + |ГДЕ + | МуниципальнаяИерархия0.Идентификатор = &Идентификатор + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ ПЕРВЫЕ 1 + | &ПредставлениеАдминистративный КАК ТипАдреса, + | АдресныеОбъекты5.Наименование КАК Наименование5, + | АдресныеОбъекты5.ТипОбъекта КАК ТипОбъекта5, + | АдресныеОбъекты5.Идентификатор КАК Идентификатор5, + | АдресныеОбъекты5.Уровень КАК Уровень5, + | АдресныеОбъекты4.Наименование КАК Наименование4, + | АдресныеОбъекты4.ТипОбъекта КАК ТипОбъекта4, + | АдресныеОбъекты4.Идентификатор КАК Идентификатор4, + | АдресныеОбъекты4.Уровень КАК Уровень4, + | АдресныеОбъекты3.Наименование КАК Наименование3, + | АдресныеОбъекты3.ТипОбъекта КАК ТипОбъекта3, + | АдресныеОбъекты3.Идентификатор КАК Идентификатор3, + | АдресныеОбъекты3.Уровень КАК Уровень3, + | АдресныеОбъекты2.Наименование КАК Наименование2, + | АдресныеОбъекты2.ТипОбъекта КАК ТипОбъекта2, + | АдресныеОбъекты2.Идентификатор КАК Идентификатор2, + | АдресныеОбъекты2.Уровень КАК Уровень2, + | АдресныеОбъекты1.Наименование КАК Наименование1, + | АдресныеОбъекты1.ТипОбъекта КАК ТипОбъекта1, + | АдресныеОбъекты1.Идентификатор КАК Идентификатор1, + | АдресныеОбъекты1.Уровень КАК Уровень1, + | АдресныеОбъекты0.Наименование КАК Наименование0, + | АдресныеОбъекты0.ТипОбъекта КАК ТипОбъекта0, + | АдресныеОбъекты0.Идентификатор КАК Идентификатор0, + | АдресныеОбъекты0.Уровень КАК Уровень0, + | АдресныеОбъекты0.КодКЛАДР КАК КодКЛАДР, + | АдресныеОбъекты0.КодСубъектаРФ КАК КодСубъектаРФ, + | ЕСТЬNULL(ДополнительныеСведения.ПочтовыйИндекс, """") КАК ПочтовыйИндекс, + | ЕСТЬNULL(ДополнительныеСведения.ОКТМО, """") КАК ОКТМО, + | ЕСТЬNULL(ДополнительныеСведения.OKATO, """") КАК OKATO, + | ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСЮЛ, """") КАК КодУчасткаИФНСЮЛ, + | ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСФЛ, """") КАК КодУчасткаИФНСФЛ, + | ЕСТЬNULL(ДополнительныеСведения.КодИФНСЮЛ, """") КАК КодИФНСЮЛ, + | ЕСТЬNULL(ДополнительныеСведения.КодИФНСФЛ, """") КАК КодИФНСФЛ + |ИЗ + | РегистрСведений.АдминистративнаяИерархия КАК АдминистративнаяИерархия0 + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК АдминистративнаяИерархия1 + | ПО (АдминистративнаяИерархия0.РодительскийИдентификатор = АдминистративнаяИерархия1.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК АдминистративнаяИерархия2 + | ПО (АдминистративнаяИерархия1.РодительскийИдентификатор = АдминистративнаяИерархия2.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК АдминистративнаяИерархия3 + | ПО (АдминистративнаяИерархия2.РодительскийИдентификатор = АдминистративнаяИерархия3.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК АдминистративнаяИерархия4 + | ПО (АдминистративнаяИерархия3.РодительскийИдентификатор = АдминистративнаяИерархия4.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК АдминистративнаяИерархия5 + | ПО (АдминистративнаяИерархия4.РодительскийИдентификатор = АдминистративнаяИерархия5.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты0 + | ПО (АдресныеОбъекты0.Идентификатор = АдминистративнаяИерархия0.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты1 + | ПО (АдресныеОбъекты1.Идентификатор = АдминистративнаяИерархия1.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты2 + | ПО (АдресныеОбъекты2.Идентификатор = АдминистративнаяИерархия2.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты3 + | ПО (АдресныеОбъекты3.Идентификатор = АдминистративнаяИерархия3.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты4 + | ПО (АдресныеОбъекты4.Идентификатор = АдминистративнаяИерархия4.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты5 + | ПО (АдресныеОбъекты5.Идентификатор = АдминистративнаяИерархия5.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения + | ПО (ДополнительныеСведения.Идентификатор = АдресныеОбъекты0.ДополнительныеАдресныеСведения) + |ГДЕ + | АдминистративнаяИерархия0.Идентификатор = &Идентификатор + |"; Запрос.Текст = ТекстЗапроса; Запрос.УстановитьПараметр("ПредставлениеМуниципальный", МуниципальныйАдрес()); @@ -3091,16 +3082,16 @@ Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ, - | АдресныеОбъекты.Наименование КАК Наименование, - | АдресныеОбъекты.ТипОбъекта КАК ТипОбъекта, - | АдресныеОбъекты.КодКЛАДР КАК КодКЛАДР - |ИЗ - | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - |ГДЕ - | АдресныеОбъекты.Идентификатор = &Идентификатор - | И АдресныеОбъекты.Уровень = 1"; + "ВЫБРАТЬ ПЕРВЫЕ 1 + | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ, + | АдресныеОбъекты.Наименование КАК Наименование, + | АдресныеОбъекты.ТипОбъекта КАК ТипОбъекта, + | АдресныеОбъекты.КодКЛАДР КАК КодКЛАДР + |ИЗ + | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + |ГДЕ + | АдресныеОбъекты.Идентификатор = &Идентификатор + | И АдресныеОбъекты.Уровень = 1"; Запрос.УстановитьПараметр("Идентификатор", Новый УникальныйИдентификатор(СведенияОбАдресномОбъекте.Идентификатор)); @@ -3141,7 +3132,7 @@ КонецФункции -Функция АктуальныеАдресДляИсторического(Адрес) +Функция АктуальныйАдресДляИсторического(Адрес) РезультатПоиска = Новый Структура; РезультатПоиска.Вставить("АдресНайден", Ложь); @@ -3149,7 +3140,8 @@ РезультатПоиска.Вставить("Представление", ""); Запрос = Новый Запрос; - ШаблонТекстаСоединения = "ВЫБРАТЬ ПЕРВЫЕ 1 + ШаблонТекстаСоединения = + "ВЫБРАТЬ ПЕРВЫЕ 1 | ИсторияАдресныхОбъектов.Идентификатор КАК Идентификатор, | ИсторияАдресныхОбъектов.АдресныйОбъект КАК АдресныйОбъект, | ИсторияАдресныхОбъектов.Уровень КАК Уровень, @@ -3211,36 +3203,57 @@ КонецЦикла; Если ЗначениеЗаполнено(ИдентификаторАдресногоОбъекта) Тогда + СведенияОбАдресномОбъекта = СведенияОбАдресномОбъекта(); СведенияОбАдресномОбъекта.Адрес = Адрес; СведенияОбАдресномОбъекта.ЗагруженныеДанные = Истина; СведенияОбАдресномОбъекта.Идентификатор = ИдентификаторАдресногоОбъекта; СведенияОбАдресномОбъекта.Муниципальный = ЭтоМуниципальныйАдрес(Адрес.AddressType); - НайденныйАдрес = АктуальныеАдресныеСведения(СведенияОбАдресномОбъекта); Если НайденныйАдрес.Отказ Тогда Возврат РезультатПоиска; КонецЕсли; - РезультатПоиска.АдресНайден = Истина; АктуальныйАдрес = НайденныйАдрес.Данные; НовыйАдрес = ОбщегоНазначения.СкопироватьРекурсивно(Адрес); ИменаУровней = ИменаУровнейАдресаПоКоду(); - Для Каждого ИмяУровня Из ИменаУровней Цикл + + ИмяУровнейНаселенногоПункта = ИмяУровнейНаселенногоПункта(); + ОтсутствуютПоляНаселенногоПункта = Истина; + Для Каждого ИмяУровня Из ИменаУровней Цикл + + Если ОтсутствуютПоляНаселенногоПункта = Истина + И ИмяУровнейНаселенногоПункта[ИмяУровня.Значение] <> Неопределено + И ЗначениеЗаполнено(АктуальныйАдрес[ИмяУровня.Значение]) Тогда + ОтсутствуютПоляНаселенногоПункта = Ложь; + КонецЕсли; + НовыйАдрес[ИмяУровня.Значение] = АктуальныйАдрес[ИмяУровня.Значение]; НовыйАдрес[ИмяУровня.Значение + "Type"] = АктуальныйАдрес[ИмяУровня.Значение + "Type"]; НовыйАдрес[ИмяУровня.Значение + "Id"] = АктуальныйАдрес[ИмяУровня.Значение + "Id"]; КонецЦикла; + + Если ОтсутствуютПоляНаселенногоПункта = Истина Тогда + Если ЭтоМуниципальныйАдрес(Адрес.AddressType) Тогда + Возврат РезультатПоиска; + Иначе + Регион = СоединитьНаименованиеИТипАдресногоОбъекта(НовыйАдрес.area, НовыйАдрес.areaType, Истина); + Если Не ЭтоГородФедеральногоЗначения(Регион) Тогда + Возврат РезультатПоиска; + КонецЕсли; + КонецЕсли; + КонецЕсли; + НовыйАдрес.value = ""; ЗаполнитьЗначенияСвойств(НовыйАдрес, АктуальныйАдрес, "munLevels,admLevels,areaValue"); РезультатПоиска.Варианты.Добавить(НовыйАдрес); - ПредставлениеАдреса = ПредставлениеАдреса(Адрес); - + ПредставлениеАдреса = ПредставлениеАдреса(НовыйАдрес); РезультатПоиска.Представление = ПредставлениеАдреса; + РезультатПоиска.АдресНайден = Истина; КонецЕсли; @@ -3877,24 +3890,25 @@ Функция ОдноуровневыйАвтоподборНаселенногоПункта(ТипаАдреса, Уровень) - ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 20 - | &Представление КАК Представление, - | АдресныеОбъекты.Идентификатор КАК Идентификатор, - | АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеАдресныеСведения, - | ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс, - | &Муниципальный КАК Муниципальный - |ИЗ - | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения - | ПО АдресныеОбъекты.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор - |ГДЕ - | (АдресныеОбъекты.Наименование ПОДОБНО &НачалоФразы СПЕЦСИМВОЛ ""~"" - | ИЛИ АдресныеОбъекты.Наименование ПОДОБНО &НачалоФразыСПробелом СПЕЦСИМВОЛ ""~"") - | И АдресныеОбъекты.Уровень = &Уровень - | И &ОтборПоИдентификатору - | - |УПОРЯДОЧИТЬ ПО - | Представление"; + ТекстЗапроса = + "ВЫБРАТЬ ПЕРВЫЕ 20 + | &Представление КАК Представление, + | АдресныеОбъекты.Идентификатор КАК Идентификатор, + | АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеАдресныеСведения, + | ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс, + | &Муниципальный КАК Муниципальный + |ИЗ + | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения + | ПО АдресныеОбъекты.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор + |ГДЕ + | (АдресныеОбъекты.Наименование ПОДОБНО &НачалоФразы СПЕЦСИМВОЛ ""~"" + | ИЛИ АдресныеОбъекты.Наименование ПОДОБНО &НачалоФразыСПробелом СПЕЦСИМВОЛ ""~"") + | И АдресныеОбъекты.Уровень = &Уровень + | И &ОтборПоИдентификатору + | + |УПОРЯДОЧИТЬ ПО + | Представление"; Если Уровень > 1 Тогда ОтборПоИдентификатору = "АдресныеОбъекты.МуниципальныйРодительскийИдентификатор = &Идентификатор"; @@ -3920,146 +3934,148 @@ Функция КаскадныйСписокАвтоподбораНаселенногоПункта(ТипАдреса) - ТекстЗапроса = "ВЫБРАТЬ - | Приоритеты.Уровень КАК Уровень, - | Приоритеты.Порядок КАК Порядок - |ПОМЕСТИТЬ Приоритеты - |ИЗ - | &Приоритеты КАК Приоритеты - |ИНДЕКСИРОВАТЬ ПО - | Уровень, - | Порядок - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ ПЕРВЫЕ 10 - | Приоритеты.Порядок КАК Порядок, - | АдресныеОбъекты.ТипОбъекта КАК ТипОбъекта, - | АдресныеОбъекты.Наименование КАК Наименование, - | АдресныеОбъекты.Идентификатор КАК Идентификатор, - | АдресныеОбъекты.Уровень КАК Уровень, - | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ, - | ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс - |ПОМЕСТИТЬ АдресныйОбъект - |ИЗ - | Приоритеты КАК Приоритеты - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - | ПО (Приоритеты.Уровень = АдресныеОбъекты.Уровень) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения - | ПО (АдресныеОбъекты.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор) - |ГДЕ - | АдресныеОбъекты.Уровень < 8 - | И (АдресныеОбъекты.Наименование ПОДОБНО &НачалоФразы СПЕЦСИМВОЛ ""~"" - | ИЛИ АдресныеОбъекты.Наименование ПОДОБНО &НачалоФразыСПробелом СПЕЦСИМВОЛ ""~"") - | - |УПОРЯДОЧИТЬ ПО - | Порядок - |" + ОбщегоНазначения.РазделительПакетаЗапросов(); + ТекстЗапроса = + "ВЫБРАТЬ + | Приоритеты.Уровень КАК Уровень, + | Приоритеты.Порядок КАК Порядок + |ПОМЕСТИТЬ Приоритеты + |ИЗ + | &Приоритеты КАК Приоритеты + |ИНДЕКСИРОВАТЬ ПО + | Уровень, + | Порядок + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ ПЕРВЫЕ 10 + | Приоритеты.Порядок КАК Порядок, + | АдресныеОбъекты.ТипОбъекта КАК ТипОбъекта, + | АдресныеОбъекты.Наименование КАК Наименование, + | АдресныеОбъекты.Идентификатор КАК Идентификатор, + | АдресныеОбъекты.Уровень КАК Уровень, + | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ, + | ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс + |ПОМЕСТИТЬ АдресныйОбъект + |ИЗ + | Приоритеты КАК Приоритеты + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + | ПО (Приоритеты.Уровень = АдресныеОбъекты.Уровень) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения + | ПО (АдресныеОбъекты.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор) + |ГДЕ + | АдресныеОбъекты.Уровень < 8 + | И (АдресныеОбъекты.Наименование ПОДОБНО &НачалоФразы СПЕЦСИМВОЛ ""~"" + | ИЛИ АдресныеОбъекты.Наименование ПОДОБНО &НачалоФразыСПробелом СПЕЦСИМВОЛ ""~"") + | + |УПОРЯДОЧИТЬ ПО + | Порядок + |" + ОбщегоНазначения.РазделительПакетаЗапросов(); ТекстЗапросаМуниципальный = " - |ВЫБРАТЬ ПЕРВЫЕ 10 - | АдресныйОбъект.Наименование КАК Наименование0, - | АдресныйОбъект.ТипОбъекта КАК ТипОбъекта0, - | АдресныйОбъект.Уровень КАК Уровень0, - | АдресныйОбъект.Идентификатор КАК Идентификатор0, - | АдресныйОбъект.ПочтовыйИндекс КАК ПочтовыйИндекс, - | АдресныйОбъект.КодСубъектаРФ КАК КодСубъектаРФ, - | АдресныйОбъект1.Наименование КАК Наименование1, - | АдресныйОбъект1.ТипОбъекта КАК ТипОбъекта1, - | АдресныйОбъект1.Уровень КАК Уровень1, - | АдресныйОбъект1.Идентификатор КАК Идентификатор1, - | АдресныйОбъект2.Наименование КАК Наименование2, - | АдресныйОбъект2.ТипОбъекта КАК ТипОбъекта2, - | АдресныйОбъект2.Уровень КАК Уровень2, - | АдресныйОбъект2.Идентификатор КАК Идентификатор2, - | АдресныйОбъект3.Наименование КАК Наименование3, - | АдресныйОбъект3.ТипОбъекта КАК ТипОбъекта3, - | АдресныйОбъект3.Уровень КАК Уровень3, - | АдресныйОбъект3.Идентификатор КАК Идентификатор3, - | АдресныйОбъект4.Наименование КАК Наименование4, - | АдресныйОбъект4.ТипОбъекта КАК ТипОбъекта4, - | АдресныйОбъект4.Уровень КАК Уровень4, - | АдресныйОбъект4.Идентификатор КАК Идентификатор4, - | АдресныйОбъект5.Наименование КАК Наименование5, - | АдресныйОбъект5.ТипОбъекта КАК ТипОбъекта5, - | АдресныйОбъект5.Уровень КАК Уровень5, - | АдресныйОбъект5.Идентификатор КАК Идентификатор5, - | ИСТИНА КАК Муниципальный, - | АдресныйОбъект.Порядок КАК Порядок - |ИЗ - | АдресныйОбъект КАК АдресныйОбъект - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК Иерархия1 - | ПО АдресныйОбъект.Идентификатор = Иерархия1.Идентификатор - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК Иерархия2 - | ПО (Иерархия1.РодительскийИдентификатор = Иерархия2.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК Иерархия3 - | ПО (Иерархия2.РодительскийИдентификатор = Иерархия3.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК Иерархия4 - | ПО (Иерархия3.РодительскийИдентификатор = Иерархия4.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК Иерархия5 - | ПО (Иерархия4.РодительскийИдентификатор = Иерархия5.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект1 - | ПО (Иерархия1.РодительскийИдентификатор = АдресныйОбъект1.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект2 - | ПО (Иерархия2.РодительскийИдентификатор = АдресныйОбъект2.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект3 - | ПО (Иерархия3.РодительскийИдентификатор = АдресныйОбъект3.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект4 - | ПО (Иерархия4.РодительскийИдентификатор = АдресныйОбъект4.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект5 - | ПО (Иерархия5.РодительскийИдентификатор = АдресныйОбъект5.Идентификатор)"; + |ВЫБРАТЬ ПЕРВЫЕ 10 + | АдресныйОбъект.Наименование КАК Наименование0, + | АдресныйОбъект.ТипОбъекта КАК ТипОбъекта0, + | АдресныйОбъект.Уровень КАК Уровень0, + | АдресныйОбъект.Идентификатор КАК Идентификатор0, + | АдресныйОбъект.ПочтовыйИндекс КАК ПочтовыйИндекс, + | АдресныйОбъект.КодСубъектаРФ КАК КодСубъектаРФ, + | АдресныйОбъект1.Наименование КАК Наименование1, + | АдресныйОбъект1.ТипОбъекта КАК ТипОбъекта1, + | АдресныйОбъект1.Уровень КАК Уровень1, + | АдресныйОбъект1.Идентификатор КАК Идентификатор1, + | АдресныйОбъект2.Наименование КАК Наименование2, + | АдресныйОбъект2.ТипОбъекта КАК ТипОбъекта2, + | АдресныйОбъект2.Уровень КАК Уровень2, + | АдресныйОбъект2.Идентификатор КАК Идентификатор2, + | АдресныйОбъект3.Наименование КАК Наименование3, + | АдресныйОбъект3.ТипОбъекта КАК ТипОбъекта3, + | АдресныйОбъект3.Уровень КАК Уровень3, + | АдресныйОбъект3.Идентификатор КАК Идентификатор3, + | АдресныйОбъект4.Наименование КАК Наименование4, + | АдресныйОбъект4.ТипОбъекта КАК ТипОбъекта4, + | АдресныйОбъект4.Уровень КАК Уровень4, + | АдресныйОбъект4.Идентификатор КАК Идентификатор4, + | АдресныйОбъект5.Наименование КАК Наименование5, + | АдресныйОбъект5.ТипОбъекта КАК ТипОбъекта5, + | АдресныйОбъект5.Уровень КАК Уровень5, + | АдресныйОбъект5.Идентификатор КАК Идентификатор5, + | ИСТИНА КАК Муниципальный, + | АдресныйОбъект.Порядок КАК Порядок + |ИЗ + | АдресныйОбъект КАК АдресныйОбъект + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК Иерархия1 + | ПО АдресныйОбъект.Идентификатор = Иерархия1.Идентификатор + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК Иерархия2 + | ПО (Иерархия1.РодительскийИдентификатор = Иерархия2.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК Иерархия3 + | ПО (Иерархия2.РодительскийИдентификатор = Иерархия3.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК Иерархия4 + | ПО (Иерархия3.РодительскийИдентификатор = Иерархия4.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК Иерархия5 + | ПО (Иерархия4.РодительскийИдентификатор = Иерархия5.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект1 + | ПО (Иерархия1.РодительскийИдентификатор = АдресныйОбъект1.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект2 + | ПО (Иерархия2.РодительскийИдентификатор = АдресныйОбъект2.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект3 + | ПО (Иерархия3.РодительскийИдентификатор = АдресныйОбъект3.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект4 + | ПО (Иерархия4.РодительскийИдентификатор = АдресныйОбъект4.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект5 + | ПО (Иерархия5.РодительскийИдентификатор = АдресныйОбъект5.Идентификатор)"; - ТекстЗапросаАдминистративный = "ВЫБРАТЬ ПЕРВЫЕ 10 - | АдресныйОбъект.Наименование КАК Наименование0, - | АдресныйОбъект.ТипОбъекта КАК ТипОбъекта0, - | АдресныйОбъект.Уровень КАК Уровень0, - | АдресныйОбъект.Идентификатор КАК Идентификатор0, - | АдресныйОбъект.ПочтовыйИндекс, - | АдресныйОбъект.КодСубъектаРФ КАК КодСубъектаРФ, - | АдресныйОбъект1.Наименование КАК Наименование1, - | АдресныйОбъект1.ТипОбъекта КАК ТипОбъекта1, - | АдресныйОбъект1.Уровень КАК Уровень1, - | АдресныйОбъект1.Идентификатор КАК Идентификатор1, - | АдресныйОбъект2.Наименование КАК Наименование2, - | АдресныйОбъект2.ТипОбъекта КАК ТипОбъекта2, - | АдресныйОбъект2.Уровень КАК Уровень2, - | АдресныйОбъект2.Идентификатор КАК Идентификатор2, - | АдресныйОбъект3.Наименование КАК Наименование3, - | АдресныйОбъект3.ТипОбъекта КАК ТипОбъекта3, - | АдресныйОбъект3.Уровень КАК Уровень3, - | АдресныйОбъект3.Идентификатор КАК Идентификатор3, - | АдресныйОбъект4.Наименование КАК Наименование4, - | АдресныйОбъект4.ТипОбъекта КАК ТипОбъекта4, - | АдресныйОбъект4.Уровень КАК Уровень4, - | АдресныйОбъект4.Идентификатор КАК Идентификатор4, - | АдресныйОбъект5.Наименование КАК Наименование5, - | АдресныйОбъект5.ТипОбъекта КАК ТипОбъекта5, - | АдресныйОбъект5.Уровень КАК Уровень5, - | АдресныйОбъект5.Идентификатор КАК Идентификатор5, - | ЛОЖЬ КАК Муниципальный, - | АдресныйОбъект.Порядок - |ИЗ - | АдресныйОбъект КАК АдресныйОбъект - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК Иерархия1 - | ПО АдресныйОбъект.Идентификатор = Иерархия1.Идентификатор - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК Иерархия2 - | ПО (Иерархия1.РодительскийИдентификатор = Иерархия2.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК Иерархия3 - | ПО (Иерархия2.РодительскийИдентификатор = Иерархия3.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК Иерархия4 - | ПО (Иерархия3.РодительскийИдентификатор = Иерархия4.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК Иерархия5 - | ПО (Иерархия4.РодительскийИдентификатор = Иерархия5.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект1 - | ПО (Иерархия1.РодительскийИдентификатор = АдресныйОбъект1.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект2 - | ПО (Иерархия2.РодительскийИдентификатор = АдресныйОбъект2.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект3 - | ПО (Иерархия3.РодительскийИдентификатор = АдресныйОбъект3.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект4 - | ПО (Иерархия4.РодительскийИдентификатор = АдресныйОбъект4.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект5 - | ПО (Иерархия5.РодительскийИдентификатор = АдресныйОбъект5.Идентификатор)"; + ТекстЗапросаАдминистративный = " + |ВЫБРАТЬ ПЕРВЫЕ 10 + | АдресныйОбъект.Наименование КАК Наименование0, + | АдресныйОбъект.ТипОбъекта КАК ТипОбъекта0, + | АдресныйОбъект.Уровень КАК Уровень0, + | АдресныйОбъект.Идентификатор КАК Идентификатор0, + | АдресныйОбъект.ПочтовыйИндекс, + | АдресныйОбъект.КодСубъектаРФ КАК КодСубъектаРФ, + | АдресныйОбъект1.Наименование КАК Наименование1, + | АдресныйОбъект1.ТипОбъекта КАК ТипОбъекта1, + | АдресныйОбъект1.Уровень КАК Уровень1, + | АдресныйОбъект1.Идентификатор КАК Идентификатор1, + | АдресныйОбъект2.Наименование КАК Наименование2, + | АдресныйОбъект2.ТипОбъекта КАК ТипОбъекта2, + | АдресныйОбъект2.Уровень КАК Уровень2, + | АдресныйОбъект2.Идентификатор КАК Идентификатор2, + | АдресныйОбъект3.Наименование КАК Наименование3, + | АдресныйОбъект3.ТипОбъекта КАК ТипОбъекта3, + | АдресныйОбъект3.Уровень КАК Уровень3, + | АдресныйОбъект3.Идентификатор КАК Идентификатор3, + | АдресныйОбъект4.Наименование КАК Наименование4, + | АдресныйОбъект4.ТипОбъекта КАК ТипОбъекта4, + | АдресныйОбъект4.Уровень КАК Уровень4, + | АдресныйОбъект4.Идентификатор КАК Идентификатор4, + | АдресныйОбъект5.Наименование КАК Наименование5, + | АдресныйОбъект5.ТипОбъекта КАК ТипОбъекта5, + | АдресныйОбъект5.Уровень КАК Уровень5, + | АдресныйОбъект5.Идентификатор КАК Идентификатор5, + | ЛОЖЬ КАК Муниципальный, + | АдресныйОбъект.Порядок + |ИЗ + | АдресныйОбъект КАК АдресныйОбъект + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК Иерархия1 + | ПО АдресныйОбъект.Идентификатор = Иерархия1.Идентификатор + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК Иерархия2 + | ПО (Иерархия1.РодительскийИдентификатор = Иерархия2.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК Иерархия3 + | ПО (Иерархия2.РодительскийИдентификатор = Иерархия3.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК Иерархия4 + | ПО (Иерархия3.РодительскийИдентификатор = Иерархия4.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдминистративнаяИерархия КАК Иерархия5 + | ПО (Иерархия4.РодительскийИдентификатор = Иерархия5.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект1 + | ПО (Иерархия1.РодительскийИдентификатор = АдресныйОбъект1.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект2 + | ПО (Иерархия2.РодительскийИдентификатор = АдресныйОбъект2.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект3 + | ПО (Иерархия3.РодительскийИдентификатор = АдресныйОбъект3.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект4 + | ПО (Иерархия4.РодительскийИдентификатор = АдресныйОбъект4.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект5 + | ПО (Иерархия5.РодительскийИдентификатор = АдресныйОбъект5.Идентификатор)"; Если ЭтоАдминистративноТерриториальныйАдрес(ТипАдреса) Тогда ТекстЗапроса = ТекстЗапроса + ТекстЗапросаАдминистративный; @@ -4098,7 +4114,8 @@ ВключатьАдминистративноТерриториальныеАдреса = Истина; КонецЕсли; - ТекстЗапроса = "ВЫБРАТЬ + ТекстЗапроса = + "ВЫБРАТЬ | ДомаЗданияСтроения.АдресныйОбъект КАК Идентификатор, | МуниципальнаяИерархия.РодительскийИдентификатор КАК МуниципальнаяИерархияРодительскийИдентификатор, | АдминистративнаяИерархия.РодительскийИдентификатор КАК АдминистративнаяИерархияРодительскийИдентификатор @@ -4160,7 +4177,8 @@ Если ВключатьМуниципальныеАдреса Тогда - ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ ПЕРВЫЕ 500 + ТекстЗапроса = ТекстЗапроса + + "ВЫБРАТЬ ПЕРВЫЕ 500 | ИСТИНА КАК Муниципальный, | АдресныеОбъекты0.Идентификатор КАК Идентификатор, | АдресныеОбъекты0.КодСубъектаРФ КАК КодСубъектаРФ, @@ -4208,6 +4226,7 @@ | ПО (АдресныеОбъекты5.Идентификатор = МуниципальнаяИерархия5.Идентификатор) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения | ПО (ДополнительныеСведения.Идентификатор = АдресныеОбъекты0.ДополнительныеАдресныеСведения)"; + КонецЕсли; Если ВключатьАдминистративноТерриториальныеАдреса Тогда @@ -4220,7 +4239,8 @@ КонецЕсли; - ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ ПЕРВЫЕ 500 + ТекстЗапроса = ТекстЗапроса + + "ВЫБРАТЬ ПЕРВЫЕ 500 | ЛОЖЬ КАК Муниципальный, | АдресныеОбъекты0.Идентификатор КАК Идентификатор, | АдресныеОбъекты0.КодСубъектаРФ КАК КодСубъектаРФ, @@ -4318,66 +4338,68 @@ // Заполнение данных для выбора адреса из загруженных данных. // Процедура ЗаполнитьАдресаДляВыбораПоЗагруженнымДанным(Результат, Родитель, Уровень, ТипАдреса, ДополнительныеПараметры) - + Запрос = Новый Запрос; - + Если ЭтоУровеньРегиона(Уровень) Тогда - - ТекстЗапроса = "ВЫБРАТЬ - | ЕСТЬNULL(ВЫРАЗИТЬ(СлужебныеАдресныеСведения.Идентификатор КАК ЧИСЛО(2, 0)), АдресныеОбъекты.КодСубъектаРФ) КАК КодСубъектаРФ, - | ЕСТЬNULL(СлужебныеАдресныеСведения.Значение, АдресныеОбъекты.Наименование + "" "" + АдресныеОбъекты.ТипОбъекта) КАК Представление, - | АдресныеОбъекты.Наименование КАК Наименование, - | АдресныеОбъекты.ТипОбъекта КАК ТипОбъекта, - | АдресныеОбъекты.Уровень КАК Уровень, - | АдресныеОбъекты.Идентификатор КАК Идентификатор, - | АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныйИдентификатор, - | ИСТИНА КАК Муниципальный, - | ИСТИНА КАК РегионЗагружен, - | ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс - |ИЗ - | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СлужебныеАдресныеСведения КАК СлужебныеАдресныеСведения - | ПО ((ВЫРАЗИТЬ(СлужебныеАдресныеСведения.Идентификатор КАК ЧИСЛО(2, 0))) = АдресныеОбъекты.КодСубъектаРФ) - | И (СлужебныеАдресныеСведения.Тип = &Тип) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения - | ПО ДополнительныеСведения.Идентификатор = АдресныеОбъекты.ДополнительныеАдресныеСведения - | - |ГДЕ - | АдресныеОбъекты.Уровень = 1 - | И &ОтборПоСтроке - | - |УПОРЯДОЧИТЬ ПО - | КодСубъектаРФ"; + + ТекстЗапроса = + "ВЫБРАТЬ + | ЕСТЬNULL(ВЫРАЗИТЬ(СлужебныеАдресныеСведения.Идентификатор КАК ЧИСЛО(2, 0)), АдресныеОбъекты.КодСубъектаРФ) КАК КодСубъектаРФ, + | ЕСТЬNULL(СлужебныеАдресныеСведения.Значение, АдресныеОбъекты.Наименование + "" "" + АдресныеОбъекты.ТипОбъекта) КАК Представление, + | АдресныеОбъекты.Наименование КАК Наименование, + | АдресныеОбъекты.ТипОбъекта КАК ТипОбъекта, + | АдресныеОбъекты.Уровень КАК Уровень, + | АдресныеОбъекты.Идентификатор КАК Идентификатор, + | АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныйИдентификатор, + | ИСТИНА КАК Муниципальный, + | ИСТИНА КАК РегионЗагружен, + | ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс + |ИЗ + | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СлужебныеАдресныеСведения КАК СлужебныеАдресныеСведения + | ПО ((ВЫРАЗИТЬ(СлужебныеАдресныеСведения.Идентификатор КАК ЧИСЛО(2, 0))) = АдресныеОбъекты.КодСубъектаРФ) + | И (СлужебныеАдресныеСведения.Тип = &Тип) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения + | ПО ДополнительныеСведения.Идентификатор = АдресныеОбъекты.ДополнительныеАдресныеСведения + | + |ГДЕ + | АдресныеОбъекты.Уровень = 1 + | И &ОтборПоСтроке + | + |УПОРЯДОЧИТЬ ПО + | КодСубъектаРФ"; Запрос.УстановитьПараметр("Тип", "СубъектыРФ"); Иначе - ТекстЗапроса = "ВЫБРАТЬ - | АдресныеОбъекты.ТипОбъекта + "" "" + АдресныеОбъекты.Наименование КАК Представление, - | АдресныеОбъекты.Наименование КАК Наименование, - | АдресныеОбъекты.ТипОбъекта КАК ТипОбъекта, - | АдресныеОбъекты.Уровень КАК Уровень, - | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ, - | АдресныеОбъекты.Идентификатор КАК Идентификатор, - | АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныйИдентификатор, - | ИСТИНА КАК РегионЗагружен, - | ИСТИНА КАК Муниципальный, - | ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс - |ИЗ - | РегистрСведений.МуниципальнаяИерархия КАК ИерархияАдресов - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - | ПО (ИерархияАдресов.Идентификатор = АдресныеОбъекты.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения - | ПО ДополнительныеСведения.Идентификатор = АдресныеОбъекты.ДополнительныеАдресныеСведения - |ГДЕ - | ИерархияАдресов.РодительскийИдентификатор = &Идентификатор - | И АдресныеОбъекты.Уровень = &Уровень - | И &ОтборПоСтроке - | - |УПОРЯДОЧИТЬ ПО - | Наименование, - | ТипОбъекта"; + ТекстЗапроса = + "ВЫБРАТЬ + | АдресныеОбъекты.ТипОбъекта + "" "" + АдресныеОбъекты.Наименование КАК Представление, + | АдресныеОбъекты.Наименование КАК Наименование, + | АдресныеОбъекты.ТипОбъекта КАК ТипОбъекта, + | АдресныеОбъекты.Уровень КАК Уровень, + | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ, + | АдресныеОбъекты.Идентификатор КАК Идентификатор, + | АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныйИдентификатор, + | ИСТИНА КАК РегионЗагружен, + | ИСТИНА КАК Муниципальный, + | ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс + |ИЗ + | РегистрСведений.МуниципальнаяИерархия КАК ИерархияАдресов + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + | ПО (ИерархияАдресов.Идентификатор = АдресныеОбъекты.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения + | ПО ДополнительныеСведения.Идентификатор = АдресныеОбъекты.ДополнительныеАдресныеСведения + |ГДЕ + | ИерархияАдресов.РодительскийИдентификатор = &Идентификатор + | И АдресныеОбъекты.Уровень = &Уровень + | И &ОтборПоСтроке + | + |УПОРЯДОЧИТЬ ПО + | Наименование, + | ТипОбъекта"; Запрос.УстановитьПараметр("Идентификатор", Родитель); Запрос.УстановитьПараметр("Уровень", Уровень); @@ -4399,12 +4421,13 @@ Если ЭтоУровеньУлицы(Уровень) Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоСтроке", - " АдресныеОбъекты.Наименование ПОДОБНО ""%"" + &СтрокаПоиска + ""%"""); + " АдресныеОбъекты.Наименование ПОДОБНО ""%"" + &СтрокаПоиска + ""%"" СПЕЦСИМВОЛ ""~"""); Иначе - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоСтроке", " (АдресныеОбъекты.Наименование ПОДОБНО &СтрокаПоиска + ""%"" - | ИЛИ АдресныеОбъекты.Наименование ПОДОБНО "" "" + &СтрокаПоиска + ""%"")"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоСтроке", " (АдресныеОбъекты.Наименование ПОДОБНО &СтрокаПоиска + ""%"" СПЕЦСИМВОЛ ""~"" + | ИЛИ АдресныеОбъекты.Наименование ПОДОБНО "" "" + &СтрокаПоиска + ""%"" СПЕЦСИМВОЛ ""~"")"); КонецЕсли; - Запрос.УстановитьПараметр("СтрокаПоиска", ДополнительныеПараметры.СтрокаПоиска); + Запрос.УстановитьПараметр("СтрокаПоиска", + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(ДополнительныеПараметры.СтрокаПоиска)); Иначе ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоСтроке", "ИСТИНА"); @@ -4441,7 +4464,6 @@ КонецПроцедуры - // Конструктор таблицы - результата выбора. // // Возвращаемое значение: @@ -4551,6 +4573,7 @@ Архив = Новый ЧтениеZipФайла(ПолноеИмяФайла); + ЕстьФайлВерсииСАдминистративнымиДанными = Ложь; ЕстьФайлВерсииСМуниципальнымиДанными = Ложь; Для Каждого ЭлементАрхива Из Архив.Элементы Цикл @@ -4560,12 +4583,16 @@ Прервать; КонецЕсли; + Если СтрНайти(ЭлементАрхива.Имя, "EXTRAINFO.FI") > 0 Тогда + ЕстьФайлВерсииСАдминистративнымиДанными = Истина; + КонецЕсли; + КонецЦикла; Если Не ЕстьФайлВерсииСМуниципальнымиДанными Тогда - + Архив.Закрыть(); - + ТекстПричины = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Допускается загрузка адресных сведений только в формате государственного адресного реестра. |Используйте адресные сведения, расположенные по адресу %1'"), "https://its.1c.ru/download/gar"); @@ -4685,11 +4712,8 @@ АдресныеСведенияРегиона = СведенияОРегионе(Адрес.area, Адрес.areaType); Если АдресныеСведенияРегиона.Устарел Тогда - АктуализироватьДанныеОРегионе(Адрес, АдресныеСведенияРегиона.КодСубъектаРФ, Результат); - ИначеЕсли АдресныеСведенияРегиона.КодСубъектаРФ = Неопределено Тогда - ДобавитьОшибкуПроверкиАдресаПоКлассификатору(Результат.Ошибки, "СубъектРФ", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Указан несуществующий регион ""%1""'"), АдресныеСведенияРегиона.ПолноеНаименование)); - Результат.АдресПроверен = Истина; + //@skip-check query-in-loop + АктуализироватьДанныеОРегионе(Адрес, АдресныеСведенияРегиона.КодСубъектаРФ, Результат); // Вызывается, только если адрес устарел. ИначеЕсли Не АдресныеСведенияРегиона.Загружен Тогда ДобавитьОшибкуПроверкиАдресаПоКлассификатору(Результат.Ошибки, "СубъектРФ", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( @@ -4803,6 +4827,21 @@ КонецФункции +Функция ИмяУровнейНаселенногоПункта() + + Уровни = Новый Соответствие; + + Уровни.Вставить("district", Истина); + Уровни.Вставить("munDistrict", Истина); + Уровни.Вставить("settlement", Истина); + Уровни.Вставить("city", Истина); + Уровни.Вставить("locality", Истина); + Уровни.Вставить("territory", Истина); + + Возврат Уровни; + +КонецФункции + Функция СформироватьДанныеДляПроверкиАдресов(Знач Адреса, Знач Результаты) ПроверяемыеУровни = Новый Соответствие; @@ -4866,7 +4905,8 @@ Функция ТекстЗапросаПроверкиАдресов() - ТекстЗапроса = "ВЫБРАТЬ + ТекстЗапроса = + "ВЫБРАТЬ | АдресаПоПолям.Ключ КАК Ключ, | АдресаПоПолям.ЭтоМуниципальныйАдрес КАК ЭтоМуниципальныйАдрес, | АдресаПоПолям.Наименование0 КАК Наименование0, @@ -5362,19 +5402,20 @@ Результат.АдресКорректный = Ложь; Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 - | АдресныеОбъекты.Наименование КАК Наименование, - | АдресныеОбъекты.ТипОбъекта КАК ТипОбъекта, - | АдресныеОбъекты.РодительскийИдентификатор КАК Идентификатор - |ИЗ - | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - |ГДЕ - | АдресныеОбъекты.КодСубъектаРФ = &КодСубъектаРФ - | И АдресныеОбъекты.Уровень = &Уровень"; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | АдресныеОбъекты.Наименование КАК Наименование, + | АдресныеОбъекты.ТипОбъекта КАК ТипОбъекта, + | АдресныеОбъекты.РодительскийИдентификатор КАК Идентификатор + |ИЗ + | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + |ГДЕ + | АдресныеОбъекты.КодСубъектаРФ = &КодСубъектаРФ + | И АдресныеОбъекты.Уровень = &Уровень"; Запрос.УстановитьПараметр("КодСубъектаРФ", КодСубъектаРФ); Запрос.УстановитьПараметр("Уровень", 1); - + РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); @@ -5393,11 +5434,11 @@ КонецЦикла; Если ПустаяСтрока(НовоеНаименование) Тогда - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Регион ""%1"" устарел'"), - СтароеНаименование); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Регион ""%1"" устарел'"), СтароеНаименование); Иначе - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = 'Регион ""%1"" был переименован в ""%2""'"), СтароеНаименование, НовоеНаименование); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Регион ""%1"" был переименован в ""%2""'"), СтароеНаименование, НовоеНаименование); КонецЕсли; ДобавитьОшибкуПроверкиАдресаПоКлассификатору(Результат.Ошибки, "СубъектРФ", ТекстОшибки); @@ -5431,14 +5472,15 @@ Результат.АдресКорректный = Ложь; Результат.АдресПроверен = Истина; Если ПроверятьУстареваниеАдресов Тогда - НовыеАдреса = АктуальныеАдресДляИсторического(Адрес); + //@skip-check query-in-loop + НовыеАдреса = АктуальныйАдресДляИсторического(Адрес); // Вызывается, только если адрес устарел. Если НовыеАдреса.АдресНайден Тогда Результат.Варианты = НовыеАдреса.Варианты; ОшибкиПроверки.Очистить(); ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "Представление", - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Адрес некорректный, т.к. он устарел - |Актуальный: %1'"), - НовыеАдреса.Представление)); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Адрес некорректный, т.к. он устарел + |Актуальный: %1'"), НовыеАдреса.Представление)); КонецЕсли; КонецЕсли; Иначе @@ -5459,9 +5501,9 @@ + КакиеУровниПроверять["Distict"]] = Null Тогда ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "СвРайМО/Район", - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = 'Район ""%1"" отсутствует в адресном классификаторе'"), СоединитьНаименованиеИТипАдресногоОбъекта( - Адрес.District, Адрес.DistrictType))); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Район ""%1"" отсутствует в адресном классификаторе'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.District, Адрес.DistrictType))); Продолжить; КонецЕсли; @@ -5469,9 +5511,9 @@ Если Не ДанныеУровняКорректные("area", АдресСтрока, КакиеУровниПроверять) Тогда ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Субъект РФ'"), - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = 'Субъект РФ ""%1"" отсутствует в адресном классификаторе'"), - СоединитьНаименованиеИТипАдресногоОбъекта(Адрес["Area"], Адрес["AreaType"], Истина))); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Субъект РФ ""%1"" отсутствует в адресном классификаторе'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес["Area"], Адрес["AreaType"], Истина))); Продолжить; КонецЕсли; @@ -5479,9 +5521,9 @@ Если Не ДанныеУровняКорректные("munDistrict", АдресСтрока, КакиеУровниПроверять) Тогда ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Муниципальный район'"), - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = 'Муниципальный район ""%1"" отсутствует в адресном классификаторе'"), - СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.MunDistrict, Адрес.MunDistrictType))); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Муниципальный район ""%1"" отсутствует в адресном классификаторе'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.MunDistrict, Адрес.MunDistrictType))); Продолжить; КонецЕсли; @@ -5489,9 +5531,9 @@ Если Не ДанныеУровняКорректные("distict", АдресСтрока, КакиеУровниПроверять) Тогда ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Район'"), - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = 'Район ""%1"" отсутствует в адресном классификаторе'"), СоединитьНаименованиеИТипАдресногоОбъекта( - Адрес.District, Адрес.DistrictType))); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Район ""%1"" отсутствует в адресном классификаторе'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.District, Адрес.DistrictType))); Продолжить; КонецЕсли; @@ -5499,9 +5541,9 @@ Если Не ДанныеУровняКорректные("settlement", АдресСтрока, КакиеУровниПроверять) Тогда ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Поселение'"), - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = 'Поселение ""%1"" отсутствует в адресном классификаторе'"), - СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.Settlement, Адрес.SettlementType))); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Поселение ""%1"" отсутствует в адресном классификаторе'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.Settlement, Адрес.SettlementType))); Продолжить; КонецЕсли; @@ -5509,9 +5551,9 @@ Если Не ДанныеУровняКорректные("city", АдресСтрока, КакиеУровниПроверять) Тогда ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Город'"), - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = 'Город ""%1"" отсутствует в адресном классификаторе'"), СоединитьНаименованиеИТипАдресногоОбъекта( - Адрес.City, Адрес.CityType))); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Город ""%1"" отсутствует в адресном классификаторе'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.City, Адрес.CityType))); Продолжить; КонецЕсли; @@ -5519,9 +5561,9 @@ Если Не ДанныеУровняКорректные("territory", АдресСтрока, КакиеУровниПроверять) Тогда ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Территория'"), - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = 'Территория ""%1"" отсутствует в адресном классификаторе'"), - СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.Territory, Адрес.TerritoryType))); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Территория ""%1"" отсутствует в адресном классификаторе'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.Territory, Адрес.TerritoryType))); Продолжить; КонецЕсли; @@ -5529,9 +5571,9 @@ Если Не ДанныеУровняКорректные("locality", АдресСтрока, КакиеУровниПроверять) Тогда ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Населенный пункт'"), - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = 'Населенный пункт ""%1"" отсутствует в адресном классификаторе'"), - СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.Locality, Адрес.LocalityType))); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Населенный пункт ""%1"" отсутствует в адресном классификаторе'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.Locality, Адрес.LocalityType))); Продолжить; КонецЕсли; @@ -5539,9 +5581,9 @@ Если Не ДанныеУровняКорректные("street", АдресСтрока, КакиеУровниПроверять) Тогда ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Улица'"), - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = 'Улица ""%1"" отсутствует в адресном классификаторе'"), СоединитьНаименованиеИТипАдресногоОбъекта( - Адрес.Street, Адрес.StreetType))); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Улица ""%1"" отсутствует в адресном классификаторе'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.Street, Адрес.StreetType))); Продолжить; КонецЕсли; @@ -5609,12 +5651,13 @@ Если СтрСравнить(ДомВАдресе.НаименованиеДома, ОписаниеДома.НаименованиеДома) = 0 Тогда Если СтрСравнить(ДомВАдресе.ДополнительныйНомерДома1, - ОписаниеДома.ДополнительныйНомерДома1) = 0 И СтрСравнить( - ДомВАдресе.НаименованиеДополнительногоДома1, - ОписаниеДома.НаименованиеДополнительногоДома1) = 0 И СтрСравнить( - ДомВАдресе.ДополнительныйНомерДома2, ОписаниеДома.ДополнительныйНомерДома2) = 0 - И СтрСравнить(ДомВАдресе.НаименованиеДополнительногоДома2, - ОписаниеДома.НаименованиеДополнительногоДома2) = 0 Тогда + ОписаниеДома.ДополнительныйНомерДома1) = 0 + И СтрСравнить(ДомВАдресе.НаименованиеДополнительногоДома1, + ОписаниеДома.НаименованиеДополнительногоДома1) = 0 + И СтрСравнить(ДомВАдресе.ДополнительныйНомерДома2, + ОписаниеДома.ДополнительныйНомерДома2) = 0 + И СтрСравнить(ДомВАдресе.НаименованиеДополнительногоДома2, + ОписаниеДома.НаименованиеДополнительногоДома2) = 0 Тогда ДомКорректный = Истина; ПочтовыйИндекс = ИнформацияОДомах.ПочтовыйИндекс; Прервать; @@ -5692,24 +5735,30 @@ КонецЕсли; ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, ПолеСОшибкой, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = '%1 отсутствует в адресном классификаторе%2'"), ПредставлениеДома, ТекстПодсказки)); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 отсутствует в адресном классификаторе%2'"), ПредставлениеДома, ТекстПодсказки)); Результат.АдресКорректный = Ложь; Результат.АдресПроверен = Истина; Продолжить; - + КонецЕсли; - + ПочтовыйИндекс = Формат(ПочтовыйИндекс, "ЧГ=0"); Если СтрСравнить(ПочтовыйИндекс, Адрес.ZipCode) <> 0 Тогда Результат.АдресКорректный = Ложь; + + НовыйАдрес = ОбщегоНазначения.СкопироватьРекурсивно(Адрес); + НовыйАдрес.ZipCode = ПочтовыйИндекс; + Результат.Варианты.Добавить(НовыйАдрес); + ДополнительныйТекст = ?(ЗначениеЗаполнено(ПочтовыйИндекс), " " + НСтр("ru = 'Возможно, правильный индекс'") + " " + ПочтовыйИндекс, ""); ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "Индекс", - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = 'Индекс ""%1"" не соответствует адресу.%2'"), Адрес.ZipCode, ДополнительныйТекст)); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Индекс %1 не соответствует адресу.%2'"), Адрес.ZipCode, ДополнительныйТекст)); + КонецЕсли; Результат.АдресПроверен = Истина; @@ -5860,8 +5909,8 @@ КонецЦикла; ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "Дом", - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = 'Земельный участок %1 отсутствует в адресном классификаторе'"), Участок)); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Земельный участок %1 отсутствует в адресном классификаторе'"), Участок)); Результат.АдресКорректный = Ложь; Результат.АдресПроверен = Истина; @@ -5875,7 +5924,7 @@ Результат = НовыйАдресДляДляПередачиВСервис(); ЗаполнитьЗначенияСвойств(Результат, Адрес,, "apartments,buildings,munLevels,admLevels"); - + Результат.Вставить("ifnsFlAreaCode", Адрес.ifnsFLAreaCode); Результат.Вставить("ifnsFlCode", Адрес.ifnsFLCode); Результат.Вставить("ifnsUlAreaCode", Адрес.ifnsULAreaCode); @@ -5912,19 +5961,6 @@ КонецФункции -Функция ВерсияJSON(Адрес) - - ИмяСвойства = ?(ЭтоМуниципальныйАдрес(Адрес.AddressType), "munLevels", "admLevels"); - - Если Адрес.Свойство(ИмяСвойства) И Адрес[ИмяСвойства].Количество() > 0 Тогда - Возврат 4; - КонецЕсли; - - Возврат 3; - -КонецФункции - - Функция ТипАдресногоОбъектаУчасток() Возврат "участок"; @@ -6107,7 +6143,8 @@ Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ + Запрос.Текст = + "ВЫБРАТЬ | СписокОКТМО.ОКТМО КАК ОКТМО, | СписокОКТМО.КлючЗаписиОКТМО КАК КлючЗаписиОКТМО |ПОМЕСТИТЬ СписокОКТМО @@ -6147,64 +6184,64 @@ |; | |ВЫБРАТЬ - | АдресныеОбъекты0.КлючЗаписиОКТМО КАК КлючЗаписиОКТМО, - | АдресныеОбъекты5.Наименование КАК Наименование5, - | АдресныеОбъекты5.ТипОбъекта КАК ТипОбъекта5, - | АдресныеОбъекты5.Идентификатор КАК Идентификатор5, - | АдресныеОбъекты5.Уровень КАК Уровень5, - | АдресныеОбъекты4.Наименование КАК Наименование4, - | АдресныеОбъекты4.ТипОбъекта КАК ТипОбъекта4, - | АдресныеОбъекты4.Идентификатор КАК Идентификатор4, - | АдресныеОбъекты4.Уровень КАК Уровень4, - | АдресныеОбъекты3.Наименование КАК Наименование3, - | АдресныеОбъекты3.ТипОбъекта КАК ТипОбъекта3, - | АдресныеОбъекты3.Идентификатор КАК Идентификатор3, - | АдресныеОбъекты3.Уровень КАК Уровень3, - | АдресныеОбъекты2.Наименование КАК Наименование2, - | АдресныеОбъекты2.ТипОбъекта КАК ТипОбъекта2, - | АдресныеОбъекты2.Идентификатор КАК Идентификатор2, - | АдресныеОбъекты2.Уровень КАК Уровень2, - | АдресныеОбъекты1.Наименование КАК Наименование1, - | АдресныеОбъекты1.ТипОбъекта КАК ТипОбъекта1, - | АдресныеОбъекты1.Идентификатор КАК Идентификатор1, - | АдресныеОбъекты1.Уровень КАК Уровень1, - | АдресныеОбъекты0.Наименование КАК Наименование0, - | АдресныеОбъекты0.ТипОбъекта КАК ТипОбъекта0, - | АдресныеОбъекты0.Идентификатор КАК Идентификатор0, - | АдресныеОбъекты0.Уровень КАК Уровень0, - | АдресныеОбъекты0.КодКЛАДР КАК КодКЛАДР, - | АдресныеОбъекты0.КодСубъектаРФ КАК КодРегиона, - | ЕСТЬNULL(АдресныеОбъекты0.ПочтовыйИндекс, """""""""""""""") КАК ПочтовыйИндекс, - | ЕСТЬNULL(АдресныеОбъекты0.ОКТМО, """""""""""""""") КАК ОКТМО, - | ЕСТЬNULL(АдресныеОбъекты0.OKATO, """""""""""""""") КАК OKATO, - | ЕСТЬNULL(АдресныеОбъекты0.КодУчасткаИФНСЮЛ, """""""""""""""") КАК КодУчасткаИФНСЮЛ, - | ЕСТЬNULL(АдресныеОбъекты0.КодУчасткаИФНСФЛ, """""""""""""""") КАК КодУчасткаИФНСФЛ, - | ЕСТЬNULL(АдресныеОбъекты0.КодИФНСЮЛ, """""""""""""""") КАК КодИФНСЮЛ, - | ЕСТЬNULL(АдресныеОбъекты0.КодИФНСФЛ, """""""""""""""") КАК КодИФНСФЛ - | ИЗ - | АдресныеОбъекты0 КАК АдресныеОбъекты0 - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия1 - | ПО (АдресныеОбъекты0.РодительскийИдентификатор = МуниципальнаяИерархия1.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия2 - | ПО (МуниципальнаяИерархия1.РодительскийИдентификатор = МуниципальнаяИерархия2.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия3 - | ПО (МуниципальнаяИерархия2.РодительскийИдентификатор = МуниципальнаяИерархия3.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия4 - | ПО (МуниципальнаяИерархия3.РодительскийИдентификатор = МуниципальнаяИерархия4.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия5 - | ПО (МуниципальнаяИерархия4.РодительскийИдентификатор = МуниципальнаяИерархия5.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты1 - | ПО (АдресныеОбъекты1.Идентификатор = МуниципальнаяИерархия1.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты2 - | ПО (АдресныеОбъекты2.Идентификатор = МуниципальнаяИерархия2.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты3 - | ПО (АдресныеОбъекты3.Идентификатор = МуниципальнаяИерархия3.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты4 - | ПО (АдресныеОбъекты4.Идентификатор = МуниципальнаяИерархия4.Идентификатор) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты5 - | ПО (АдресныеОбъекты5.Идентификатор = МуниципальнаяИерархия5.Идентификатор) - | ГДЕ - | АдресныеОбъекты0.Уровень < &УровеньУлицы"; + | АдресныеОбъекты0.КлючЗаписиОКТМО КАК КлючЗаписиОКТМО, + | АдресныеОбъекты5.Наименование КАК Наименование5, + | АдресныеОбъекты5.ТипОбъекта КАК ТипОбъекта5, + | АдресныеОбъекты5.Идентификатор КАК Идентификатор5, + | АдресныеОбъекты5.Уровень КАК Уровень5, + | АдресныеОбъекты4.Наименование КАК Наименование4, + | АдресныеОбъекты4.ТипОбъекта КАК ТипОбъекта4, + | АдресныеОбъекты4.Идентификатор КАК Идентификатор4, + | АдресныеОбъекты4.Уровень КАК Уровень4, + | АдресныеОбъекты3.Наименование КАК Наименование3, + | АдресныеОбъекты3.ТипОбъекта КАК ТипОбъекта3, + | АдресныеОбъекты3.Идентификатор КАК Идентификатор3, + | АдресныеОбъекты3.Уровень КАК Уровень3, + | АдресныеОбъекты2.Наименование КАК Наименование2, + | АдресныеОбъекты2.ТипОбъекта КАК ТипОбъекта2, + | АдресныеОбъекты2.Идентификатор КАК Идентификатор2, + | АдресныеОбъекты2.Уровень КАК Уровень2, + | АдресныеОбъекты1.Наименование КАК Наименование1, + | АдресныеОбъекты1.ТипОбъекта КАК ТипОбъекта1, + | АдресныеОбъекты1.Идентификатор КАК Идентификатор1, + | АдресныеОбъекты1.Уровень КАК Уровень1, + | АдресныеОбъекты0.Наименование КАК Наименование0, + | АдресныеОбъекты0.ТипОбъекта КАК ТипОбъекта0, + | АдресныеОбъекты0.Идентификатор КАК Идентификатор0, + | АдресныеОбъекты0.Уровень КАК Уровень0, + | АдресныеОбъекты0.КодКЛАДР КАК КодКЛАДР, + | АдресныеОбъекты0.КодСубъектаРФ КАК КодРегиона, + | ЕСТЬNULL(АдресныеОбъекты0.ПочтовыйИндекс, """""""""""""""") КАК ПочтовыйИндекс, + | ЕСТЬNULL(АдресныеОбъекты0.ОКТМО, """""""""""""""") КАК ОКТМО, + | ЕСТЬNULL(АдресныеОбъекты0.OKATO, """""""""""""""") КАК OKATO, + | ЕСТЬNULL(АдресныеОбъекты0.КодУчасткаИФНСЮЛ, """""""""""""""") КАК КодУчасткаИФНСЮЛ, + | ЕСТЬNULL(АдресныеОбъекты0.КодУчасткаИФНСФЛ, """""""""""""""") КАК КодУчасткаИФНСФЛ, + | ЕСТЬNULL(АдресныеОбъекты0.КодИФНСЮЛ, """""""""""""""") КАК КодИФНСЮЛ, + | ЕСТЬNULL(АдресныеОбъекты0.КодИФНСФЛ, """""""""""""""") КАК КодИФНСФЛ + |ИЗ + | АдресныеОбъекты0 КАК АдресныеОбъекты0 + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия1 + | ПО (АдресныеОбъекты0.РодительскийИдентификатор = МуниципальнаяИерархия1.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия2 + | ПО (МуниципальнаяИерархия1.РодительскийИдентификатор = МуниципальнаяИерархия2.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия3 + | ПО (МуниципальнаяИерархия2.РодительскийИдентификатор = МуниципальнаяИерархия3.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия4 + | ПО (МуниципальнаяИерархия3.РодительскийИдентификатор = МуниципальнаяИерархия4.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МуниципальнаяИерархия КАК МуниципальнаяИерархия5 + | ПО (МуниципальнаяИерархия4.РодительскийИдентификатор = МуниципальнаяИерархия5.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты1 + | ПО (АдресныеОбъекты1.Идентификатор = МуниципальнаяИерархия1.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты2 + | ПО (АдресныеОбъекты2.Идентификатор = МуниципальнаяИерархия2.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты3 + | ПО (АдресныеОбъекты3.Идентификатор = МуниципальнаяИерархия3.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты4 + | ПО (АдресныеОбъекты4.Идентификатор = МуниципальнаяИерархия4.Идентификатор) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты5 + | ПО (АдресныеОбъекты5.Идентификатор = МуниципальнаяИерархия5.Идентификатор) + |ГДЕ + | АдресныеОбъекты0.Уровень < &УровеньУлицы"; Запрос.Параметры.Вставить("СписокОКТМО", ТаблицаОКТМО); Запрос.УстановитьПараметр("УровеньУлицы", 8); @@ -6218,8 +6255,8 @@ СведенияПоОКТМО = НовыйСведенияПоОКТМО(); - ЗаполнитьЗначенияСвойств(СведенияПоОКТМО, ВыборкаДетальныеЗаписи, "КодУчасткаИФНСЮЛ, - |КодУчасткаИФНСФЛ, КодИФНСЮЛ, КодИФНСФЛ, ПочтовыйИндекс, КодРегиона"); + ЗаполнитьЗначенияСвойств(СведенияПоОКТМО, ВыборкаДетальныеЗаписи, + "КодУчасткаИФНСЮЛ, КодУчасткаИФНСФЛ, КодИФНСЮЛ, КодИФНСФЛ, ПочтовыйИндекс, КодРегиона"); СведенияПоОКТМО.ОКТМО = ОКТМОИлиОКАТОСтрокой(ВыборкаДетальныеЗаписи.ОКТМО); СведенияПоОКТМО.OKATO = ОКТМОИлиОКАТОСтрокой(ВыборкаДетальныеЗаписи.OKATO); СведенияПоОКТМО.КодКЛАДР = КодКЛАДРСтрокой(ВыборкаДетальныеЗаписи.КодКЛАДР); @@ -6246,9 +6283,12 @@ КонецЦикла; НаименованиеРегиона = ПолноеНаименованиеРегиона(СведенияПоОКТМО["Регион"], СведенияПоОКТМО["РегионТипКраткий"]); + СведенияПоОКТМО.КодМуниципальногоРайона = КодМуниципальногоРайона( - СведенияПоОКТМО["МуниципальныйРайонТипКраткий"], СведенияПоОКТМО.ОКТМО, ЭтоГородФедеральногоЗначения( - НаименованиеРегиона)); + СведенияПоОКТМО["МуниципальныйРайонТипКраткий"], + СведенияПоОКТМО.ОКТМО, + ЭтоГородФедеральногоЗначения(НаименованиеРегиона)); + СведенияПоОКТМО.КодПоселения = КодПоселения(СведенияПоОКТМО["ПоселениеТипКраткий"]); Результат.Вставить(ВыборкаДетальныеЗаписи.КлючЗаписиОКТМО, СведенияПоОКТМО); @@ -6482,9 +6522,9 @@ КодМуниципальногоРайона = "1"; ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, "г.о.") = 0 Тогда КодМуниципальногоРайона = "2"; - ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, "вн.тер.") = 0 Или СтрСравнить(ТипМуниципальногоРайона, - "вн.тер. г.") = 0 Тогда // @Non-NLS-1 - КодМуниципальногоРайона = "3"; + ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, "вн.тер.") = 0 + Или СтрСравнить(ТипМуниципальногоРайона, "вн.тер. г.") = 0 Тогда // @Non-NLS-1 + КодМуниципальногоРайона = "3"; ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, "мун. окр.") = 0 Тогда КодМуниципальногоРайона = "4"; КонецЕсли; @@ -6540,8 +6580,8 @@ НоваяСтрока.Идентификатор = СтрокаДанных.id; КонецЕсли; - Если ПредставлениеТерриториальное <> ПредставлениеМуниципальное И ЗначениеЗаполнено( - ПредставлениеТерриториальное) Тогда + Если ПредставлениеТерриториальное <> ПредставлениеМуниципальное + И ЗначениеЗаполнено(ПредставлениеТерриториальное) Тогда НоваяСтрока = Результат.Данные.Добавить(); НоваяСтрока.Представление = ПредставлениеТерриториальное; НоваяСтрока.Муниципальный = Ложь; @@ -6684,13 +6724,13 @@ КонецПроцедуры Функция АдресныеСведенияСервис1СПоКоду(Результат, Знач Идентификатор, Знач ИмяКода) - + ШаблонЗапроса = "selectByCode?code=%1&codeType=%2"; - ТекстGETЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗапроса, Строка(Идентификатор), - ИмяКода); - + ТекстGETЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗапроса, + Строка(Идентификатор), ИмяКода); + Возврат ВыполнитьЗапросЧерезВебСервис(ТекстGETЗапроса); - + КонецФункции // Получает идентификаторы адреса через веб-сервис. @@ -6781,7 +6821,7 @@ Исключение Результат.Отказ = Истина; - Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Результат.ПодробноеПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); Результат.КраткоеПредставлениеОшибки = НСтр("ru = 'При получении данных из веб-сервиса возникли проблемы.'"); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, , , Результат.ПодробноеПредставлениеОшибки); @@ -6800,8 +6840,8 @@ Если РезультатПроверки.КодСостояния = 400 Тогда - ПредставлениеОшибки = НСтр( - "ru = 'Проверка адреса не выполнена. Некоторые поля адреса содержат некорректные сведения.'"); + ПредставлениеОшибки = + НСтр("ru = 'Проверка адреса не выполнена. Некоторые поля адреса содержат некорректные сведения.'"); Иначе @@ -6882,6 +6922,18 @@ КонецФункции +Функция ВерсияJSON(Адрес) + + ИмяСвойства = ?(ЭтоМуниципальныйАдрес(Адрес.AddressType), "munLevels", "admLevels"); + + Если Адрес.Свойство(ИмяСвойства) И Адрес[ИмяСвойства].Количество() > 0 Тогда + Возврат 4; + КонецЕсли; + + Возврат 3; + +КонецФункции + Функция НовоеОписаниеОшибки() ОписаниеОшибки = Новый Структура; @@ -6925,18 +6977,18 @@ Шаблон = "%1 ""%2"""; Если ЗначениеЗаполнено(ОписаниеДома.НомерДома) Тогда - СписокСтроений.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, НРег( - ОписаниеДома.НаименованиеДома), ОписаниеДома.НомерДома)); + СписокСтроений.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, + НРег(ОписаниеДома.НаименованиеДома), ОписаниеДома.НомерДома)); КонецЕсли; Если ЗначениеЗаполнено(ОписаниеДома.ДополнительныйНомерДома1) Тогда - СписокСтроений.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, НРег( - ОписаниеДома.НаименованиеДополнительногоДома1), ОписаниеДома.ДополнительныйНомерДома1)); + СписокСтроений.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, + НРег(ОписаниеДома.НаименованиеДополнительногоДома1), ОписаниеДома.ДополнительныйНомерДома1)); КонецЕсли; Если ЗначениеЗаполнено(ОписаниеДома.ДополнительныйНомерДома2) Тогда - СписокСтроений.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, НРег( - ОписаниеДома.НаименованиеДополнительногоДома2), ОписаниеДома.ДополнительныйНомерДома2)); + СписокСтроений.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, + НРег(ОписаниеДома.НаименованиеДополнительногоДома2), ОписаниеДома.ДополнительныйНомерДома2)); КонецЕсли; Возврат СтрСоединить(СписокСтроений, ", "); @@ -6944,14 +6996,14 @@ КонецФункции Функция ДанныеУровняКорректные(Знач ИмяУровня, Знач АдресСтрока, Знач КакиеУровниПроверять) - - Если КакиеУровниПроверять[ИмяУровня] <> Неопределено И ПустаяСтрока(АдресСтрока["Наименование" - + КакиеУровниПроверять[ИмяУровня]]) Тогда + + Если КакиеУровниПроверять[ИмяУровня] <> Неопределено + И ПустаяСтрока(АдресСтрока["Наименование" + КакиеУровниПроверять[ИмяУровня]]) Тогда Возврат Ложь; КонецЕсли; - + Возврат Истина; - + КонецФункции Функция КонструкторКодовАдреса() @@ -7109,13 +7161,13 @@ КонецФункции -Процедура ЗаполнитьПоляВСоответствииСУровнемАдреса(Адрес, Выборка, Суффикс, СловарьИменПолей, Муниципальный, - ПорядокПолей) +Процедура ЗаполнитьПоляВСоответствииСУровнемАдреса(Адрес, Выборка, Суффикс, + СловарьИменПолей, Муниципальный,ПорядокПолей) Если ЗначениеЗаполнено(Выборка["Наименование" + Суффикс]) Тогда Идентификатор = Выборка["Идентификатор" + Суффикс]; - ИмяУровня = СловарьИменПолей[Выборка["Уровень" + Суффикс]]; + ИмяУровня = СловарьИменПолей[Выборка["Уровень" + Суффикс]]; Если ИмяУровня = Неопределено Тогда Возврат; @@ -7125,7 +7177,7 @@ Адрес[ИмяУровня] = Выборка["Наименование" + Суффикс]; Адрес[ИмяУровня + "Type"] = Выборка["ТипОбъекта" + Суффикс]; - Адрес[ИмяУровня + "Id"] = ?(ЗначениеЗаполнено(Идентификатор), + Адрес[ИмяУровня + "Id"] = ?(ЗначениеЗаполнено(Идентификатор), Новый УникальныйИдентификатор(Идентификатор), ""); Адрес.ID = Адрес[ИмяУровня + "Id"]; @@ -7150,8 +7202,8 @@ Возврат Описание; КонецЕсли; - Описание.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); - Текст = СокрЛП(КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + Описание.ПодробноеПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + Текст = СокрЛП(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Если ТипЗнч(ИнформацияОбОшибке.Причина) = Тип("ИнформацияОбОшибке") Тогда Если ИнформацияОбОшибке.Причина.Причина <> Неопределено Тогда @@ -7159,8 +7211,8 @@ ПозицияНачало = СтрНайти(ОписаниеОшибкиДляПоиска, "<FAULTSTRING>"); Если ПозицияНачало > 0 Тогда ПозицияОкончание = СтрНайти(ОписаниеОшибкиДляПоиска, "</FAULTSTRING>"); - Текст = Сред(ИнформацияОбОшибке.Причина.Причина.Описание, ПозицияНачало + 13, ПозицияОкончание - - ПозицияНачало - 13); + Текст = Сред(ИнформацияОбОшибке.Причина.Причина.Описание, + ПозицияНачало + 13, ПозицияОкончание - ПозицияНачало - 13); КонецЕсли; КонецЕсли; КонецЕсли; @@ -7204,11 +7256,14 @@ Фильтр = Новый Структура("Уровень", 0); НераспознанныеСтроки = ДоступныеУровни.НайтиСтроки(Фильтр); Для Каждого НераспознаннаяЧастьАдреса Из НераспознанныеСтроки Цикл - Если (ВРЕГ(НераспознаннаяЧастьАдреса.Наименование) = "МОСКВА" Или ВРЕГ(НераспознаннаяЧастьАдреса.Наименование) - = "САНКТ-ПЕТЕРБУРГ") И ПустаяСтрока(НераспознаннаяЧастьАдреса.ТипОбъекта) Тогда + Если (ВРЕГ(НераспознаннаяЧастьАдреса.Наименование) = "МОСКВА" + Или ВРЕГ(НераспознаннаяЧастьАдреса.Наименование) = "САНКТ-ПЕТЕРБУРГ") + И ПустаяСтрока(НераспознаннаяЧастьАдреса.ТипОбъекта) Тогда + НераспознаннаяЧастьАдреса.ТипОбъекта = "г"; - НераспознаннаяЧастьАдреса.Значение = СоединитьНаименованиеИТипАдресногоОбъекта( + НераспознаннаяЧастьАдреса.Значение = СоединитьНаименованиеИТипАдресногоОбъекта( НераспознаннаяЧастьАдреса.Наименование, НераспознаннаяЧастьАдреса.ТипОбъекта, Истина); + Иначе ТипОбъекта = ОбщепринятыеСокращения[ВРЕГ(НераспознаннаяЧастьАдреса.ТипОбъекта)]; @@ -7244,8 +7299,9 @@ // hex -> UUID СтрокаУИД = ЗначениеHEX.ЛексическоеЗначение; - Возврат Новый УникальныйИдентификатор(Сред(СтрокаУИД, 1, 8) + "-" + Сред(СтрокаУИД, 9, 4) + "-" + Сред(СтрокаУИД, - 13, 4) + "-" + Сред(СтрокаУИД, 17, 4) + "-" + Сред(СтрокаУИД, 21)); + Возврат Новый УникальныйИдентификатор(Сред(СтрокаУИД, 1, 8) + "-" + Сред(СтрокаУИД, 9, 4) + "-" + + Сред(СтрокаУИД, 13, 4) + "-" + Сред(СтрокаУИД, 17, 4) + "-" + Сред(СтрокаУИД, 21)); + КонецФункции // Преобразует строку base64 в УникальныйИдентификатор. @@ -7288,12 +7344,12 @@ Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | ЗагруженныеВерсииАдресныхСведений.КодСубъектаРФ КАК КодСубъектаРФ - |ИЗ - | РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК ЗагруженныеВерсииАдресныхСведений - |ГДЕ - | ЗагруженныеВерсииАдресныхСведений.Версия < 1000"; + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ЗагруженныеВерсииАдресныхСведений.КодСубъектаРФ КАК КодСубъектаРФ + |ИЗ + | РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК ЗагруженныеВерсииАдресныхСведений + |ГДЕ + | ЗагруженныеВерсииАдресныхСведений.Версия < 1000"; РезультатЗапроса = Запрос.Выполнить(); @@ -7432,14 +7488,14 @@ Функция ИменаУровнейАдреса(Адрес, ВключатьУлицу, ИсключатьУровеньДома = Ложь) - Уровни = Новый Массив; - ТипАдреса = Адрес.AddressType; ЭтоМуниципальныйАдрес = ЭтоМуниципальныйАдрес(ТипАдреса); - Уровни = ?(ЭтоМуниципальныйАдрес, Адрес.munLevels, Адрес.admLevels); + УровниИзАдреса = ?(ЭтоМуниципальныйАдрес, Адрес.munLevels, Адрес.admLevels); - Если Уровни.Количество() > 0 Тогда + Если ТипЗнч(УровниИзАдреса) = Тип("Массив") И УровниИзАдреса.Количество() > 0 Тогда + + Уровни = Новый Массив(Новый ФиксированныйМассив(УровниИзАдреса)); Если Не ВключатьУлицу Тогда Позиция = Уровни.Найти("street"); @@ -7475,6 +7531,8 @@ КонецЕсли; + Уровни = Новый Массив; + Уровни.Добавить("area"); Если ТипАдреса = "ЕАЭС" Тогда @@ -7615,15 +7673,15 @@ Если ЗначениеЗаполнено(СтрокаПоиска) Тогда Если ТочноеСовпадение Тогда - Если СтрСравнить(ОписаниеДома.НомерДома, СтрокаПоиска) = 0 Или СтрСравнить( - ОписаниеДома.ДополнительныйНомерДома1, СтрокаПоиска) = 0 Или СтрСравнить( - ОписаниеДома.ДополнительныйНомерДома2, СтрокаПоиска) = 0 Тогда + Если СтрСравнить(ОписаниеДома.НомерДома, СтрокаПоиска) = 0 + Или СтрСравнить(ОписаниеДома.ДополнительныйНомерДома1, СтрокаПоиска) = 0 + Или СтрСравнить(ОписаниеДома.ДополнительныйНомерДома2, СтрокаПоиска) = 0 Тогда ДобавитьИнформациюОДоме(ВариантыДомов, ОписаниеДома, НаименованиеДомов, СтрокаПоиска); КонецЕсли; Иначе - Если СтрНачинаетсяС(ОписаниеДома.НомерДома, СтрокаПоиска) Или СтрНачинаетсяС( - ОписаниеДома.ДополнительныйНомерДома1, СтрокаПоиска) Или СтрНачинаетсяС( - ОписаниеДома.ДополнительныйНомерДома2, СтрокаПоиска) Тогда + Если СтрНачинаетсяС(ОписаниеДома.НомерДома, СтрокаПоиска) + Или СтрНачинаетсяС(ОписаниеДома.ДополнительныйНомерДома1, СтрокаПоиска) + Или СтрНачинаетсяС(ОписаниеДома.ДополнительныйНомерДома2, СтрокаПоиска) Тогда ДобавитьИнформациюОДоме(ВариантыДомов, ОписаниеДома, НаименованиеДомов, СтрокаПоиска); КонецЕсли; КонецЕсли; @@ -7722,7 +7780,7 @@ Представление = СтрСоединить(Набор, ", "); Если ЗначениеЗаполнено(СтрокаПоиска) Тогда - ПредставлениеСВыделением = НайтиИВыделитьОформлением(Представление, СтрокаПоиска); + ПредставлениеСВыделением = СтрНайтиИВыделитьОформлением(Представление, СтрокаПоиска); Если ПредставлениеСВыделением <> Неопределено Тогда Представление = ПредставлениеСВыделением; КонецЕсли; @@ -7739,37 +7797,6 @@ КонецПроцедуры -// Возвращаемое значение: -// Структура: -// * КодКЛАДР - Строка -// * КодУчасткаИФНСЮЛ - Строка -// * КодУчасткаИФНСФЛ - Строка -// * КодИФНСЮЛ - Строка -// * КодИФНСФЛ - Строка -// * ОКАТО - Строка -// * ОКТМО - Строка -// * Индекс - Строка -// * Идентификатор - Строка -// * Дом - Структура -// -Функция ОписаниеДомаИСтроения() Экспорт - - НомерДомаИСтроения = Новый Структура; - НомерДомаИСтроения.Вставить("Идентификатор", ""); - НомерДомаИСтроения.Вставить("Индекс", ""); - НомерДомаИСтроения.Вставить("ОКТМО", ""); - НомерДомаИСтроения.Вставить("ОКАТО", ""); - НомерДомаИСтроения.Вставить("КодИФНСФЛ", ""); - НомерДомаИСтроения.Вставить("КодИФНСЮЛ", ""); - НомерДомаИСтроения.Вставить("КодУчасткаИФНСФЛ", ""); - НомерДомаИСтроения.Вставить("КодУчасткаИФНСЮЛ", ""); - НомерДомаИСтроения.Вставить("КодКЛАДР", ""); - НомерДомаИСтроения.Вставить("Дом", Новый Структура); - - Возврат НомерДомаИСтроения; - -КонецФункции - Функция НомерДомаЧислом(ИсходнаяСтрока) ИтоговоеЧисло = "0"; @@ -7943,9 +7970,9 @@ ОписаниеФайла.ФайлЧтения = Неопределено; Если ОписаниеФайла.УдалитьПутьПриЗакрытии Тогда - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Примечание, , , + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Примечание,,, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Удаление файла региона %1'"), - ОписаниеФайла.Путь)); + ОписаниеФайла.Путь)); ФайловаяСистема.УдалитьВременныйФайл(ОписаниеФайла.Путь); КонецЕсли; @@ -8022,15 +8049,16 @@ Для Каждого КлючЗначение Из Результат Цикл Если СтрСравнить(КлючЗначение.Ключ, "Идентификатор") <> 0 Тогда Результат[КлючЗначение.Ключ] = Формат(КлючЗначение.Значение, "ЧГ=0"); - Если СтрСравнить(КлючЗначение.Ключ, "ОКТМО") = 0 И СтрДлина(Результат[КлючЗначение.Ключ]) <> 8 - И СтрДлина(Результат[КлючЗначение.Ключ]) <> 11 Тогда + Если СтрСравнить(КлючЗначение.Ключ, "ОКТМО") = 0 + И СтрДлина(Результат[КлючЗначение.Ключ]) <> 8 + И СтрДлина(Результат[КлючЗначение.Ключ]) <> 11 Тогда Результат[КлючЗначение.Ключ] = "0" + Результат[КлючЗначение.Ключ]; КонецЕсли; КонецЕсли; КонецЦикла; - Результат.Вставить("ИдентификаторДома", ?(ЗначениеЗаполнено(Коды.ИдентификаторДома), Коды.ИдентификаторДома, - "")); + Результат.Вставить("ИдентификаторДома", + ?(ЗначениеЗаполнено(Коды.ИдентификаторДома), Коды.ИдентификаторДома, "")); Возврат Истина; КонецЕсли; @@ -8105,7 +8133,7 @@ Возврат; КонецЕсли; - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); Если ПустаяСтрока(ПредставлениеОшибки) Тогда ПредставлениеОшибки = НСтр("ru = 'Веб-сервис для работы с адресами не доступен по причине: |- не подключена интернет-поддержка пользователей; @@ -8130,7 +8158,7 @@ ВызватьИсключение ПредставлениеОшибки; Исключение ДанныеОбОшибке = ИнформацияОбОшибке(); - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ДанныеОбОшибке); + ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ДанныеОбОшибке); КонецПопытки; КонецПроцедуры @@ -8181,8 +8209,8 @@ КонтактнаяИнформация = СтрокуJSONВСтруктуру(Значение); ЗаполнитьЗначенияСвойств(Результат, КонтактнаяИнформация); - УстановкаТипаКузбассКемеровскойОбласти(Результат); - + УстановкаТипаКузбассКемеровскойОбластиКакВГАР(Результат); + Возврат Результат; КонецФункции @@ -8217,12 +8245,14 @@ Возврат Новый Массив; КонецЕсли; - Если (СтрСравнить(Свойство, "buildings") = 0 Или СтрСравнить(Свойство, "apartments") = 0) И ТипЗнч(Значение) = Тип( - "Массив") Тогда + Если (СтрСравнить(Свойство, "buildings") = 0 + Или СтрСравнить(Свойство, "apartments") = 0) + И ТипЗнч(Значение) = Тип("Массив") Тогда + Для Каждого ЗначениеМассива Из Значение Цикл ЗначениеМассива.type = ТРег(ЗначениеМассива.type); КонецЦикла; - + Возврат Значение; КонецЕсли; @@ -8344,24 +8374,25 @@ Знач ТочноеСовпадение) Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ - | ДомаЗданияСтроения.Строения КАК Строения, - | ЕСТЬNULL(ДополнительныеСведения.ОКТМО, """") КАК ОКТМО, - | ЕСТЬNULL(ДополнительныеСведения.ПочтовыйИндекс, """") КАК ПочтовыйИндекс, - | ЕСТЬNULL(ДополнительныеСведения.КодИФНСФЛ, """") КАК КодИФНСФЛ, - | ЕСТЬNULL(ДополнительныеСведения.КодИФНСЮЛ, """") КАК КодИФНСЮЛ, - | ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСФЛ, """") КАК КодУчасткаИФНСФЛ, - | ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСЮЛ, """") КАК КодУчасткаИФНСЮЛ, - | ЕСТЬNULL(ДополнительныеСведения.OKATO, """") КАК ОКАТО, - | ЕСТЬNULL(АдресныеОбъекты.КодКЛАДР, """") КАК КодКЛАДР - |ИЗ - | РегистрСведений.ДомаЗданияСтроения КАК ДомаЗданияСтроения - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения - | ПО (ДополнительныеСведения.Идентификатор = ДомаЗданияСтроения.ДополнительныеАдресныеСведения) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - | ПО (АдресныеОбъекты.Идентификатор = ДомаЗданияСтроения.АдресныйОбъект) - |ГДЕ - | ДомаЗданияСтроения.АдресныйОбъект = &АдресныйОбъект"; + Запрос.Текст = + "ВЫБРАТЬ + | ДомаЗданияСтроения.Строения КАК Строения, + | ЕСТЬNULL(ДополнительныеСведения.ОКТМО, """") КАК ОКТМО, + | ЕСТЬNULL(ДополнительныеСведения.ПочтовыйИндекс, """") КАК ПочтовыйИндекс, + | ЕСТЬNULL(ДополнительныеСведения.КодИФНСФЛ, """") КАК КодИФНСФЛ, + | ЕСТЬNULL(ДополнительныеСведения.КодИФНСЮЛ, """") КАК КодИФНСЮЛ, + | ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСФЛ, """") КАК КодУчасткаИФНСФЛ, + | ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСЮЛ, """") КАК КодУчасткаИФНСЮЛ, + | ЕСТЬNULL(ДополнительныеСведения.OKATO, """") КАК ОКАТО, + | ЕСТЬNULL(АдресныеОбъекты.КодКЛАДР, """") КАК КодКЛАДР + |ИЗ + | РегистрСведений.ДомаЗданияСтроения КАК ДомаЗданияСтроения + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения + | ПО (ДополнительныеСведения.Идентификатор = ДомаЗданияСтроения.ДополнительныеАдресныеСведения) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + | ПО (АдресныеОбъекты.Идентификатор = ДомаЗданияСтроения.АдресныйОбъект) + |ГДЕ + | ДомаЗданияСтроения.АдресныйОбъект = &АдресныйОбъект"; Запрос.УстановитьПараметр("АдресныйОбъект", ИдентификаторАдресногоОбъекта); Запись = Запрос.Выполнить().Выбрать(); @@ -8383,7 +8414,7 @@ // * Дом - Строка // * ДополнительныйДом1 - Строка // * ДополнительныйДом2 - Строка -// * Значение - см. ОписаниеДомаИСтроения +// * Значение - Структура // * Представление - Строка // * Идентификатор - Строка // @@ -8523,9 +8554,10 @@ // Функция ЗданияИПомещенияАдреса(XDTOАдрес, НовоеЗначение = Неопределено) - Результат = Новый Структура("Здания, Помещения", ТаблицаЗначений("Тип, Значение, Сокращение, ПутьXPath, Вид", - "Тип, Вид"), ТаблицаЗначений("Тип, Значение, Сокращение, ПутьXPath, Вид", "Тип, Вид")); - + Результат = Новый Структура("Здания, Помещения", + ТаблицаЗначений("Тип, Значение, Сокращение, ПутьXPath, Вид", "Тип, Вид"), + ТаблицаЗначений("Тип, Значение, Сокращение, ПутьXPath, Вид", "Тип, Вид")); + АдресРФ = НациональныйАдрес(XDTOАдрес); Если АдресРФ = Неопределено Тогда Возврат Результат; @@ -8708,23 +8740,23 @@ // Массив из см. СтрокаОбъектаАдресации // Функция ТипыОбъектовАдресацииАдресаРФ() - + Результат = Новый Массив; // Код, Наименование, Тип, Порядок, КодАдресногоКлассификатора // Тип: 1 - владение, 2 - здание, 3 - помещение. - + Результат.Добавить(СтрокаОбъектаАдресации("1010", "Дом", 1, 1, 2)); // не локализуется Результат.Добавить(СтрокаОбъектаАдресации("1020", "Владение", 1, 2, 1)); // не локализуется Результат.Добавить(СтрокаОбъектаАдресации("1030", "Домовладение", 1, 3, 3)); // не локализуется - + Результат.Добавить(СтрокаОбъектаАдресации("1050", "Корпус", 2, 1)); // не локализуется Результат.Добавить(СтрокаОбъектаАдресации("1060", "Строение", 2, 2, 1)); // не локализуется Результат.Добавить(СтрокаОбъектаАдресации("1080", "Литера", 2, 3, 3)); // не локализуется Результат.Добавить(СтрокаОбъектаАдресации("1090", "Литер", 2, 6, 3)); // не локализуется Результат.Добавить(СтрокаОбъектаАдресации("1070", "Сооружение", 2, 4, 2)); // не локализуется Результат.Добавить(СтрокаОбъектаАдресации("1040", "Участок", 2, 5)); // не локализуется - + Результат.Добавить(СтрокаОбъектаАдресации("2010", "Квартира", 3, 1)); // не локализуется Результат.Добавить(СтрокаОбъектаАдресации("2030", "Офис", 3, 2)); // не локализуется Результат.Добавить(СтрокаОбъектаАдресации("2040", "Бокс", 3, 3)); // не локализуется @@ -8744,13 +8776,14 @@ Результат.Добавить(СтрокаОбъектаАдресации("10100000", НСтр("ru = 'Почтовый индекс'"))); Результат.Добавить(СтрокаОбъектаАдресации("10200000", НСтр("ru = 'Адресная точка'"))); Результат.Добавить(СтрокаОбъектаАдресации("10300000", НСтр("ru = 'Садовое товарищество'"))); - Результат.Добавить(СтрокаОбъектаАдресации("10400000", НСтр( - "ru = 'Элемент улично-дорожной сети, планировочной структуры дополнительного адресного элемента'"))); + Результат.Добавить(СтрокаОбъектаАдресации("10400000", + НСтр("ru = 'Элемент улично-дорожной сети, планировочной структуры дополнительного адресного элемента'"))); Результат.Добавить(СтрокаОбъектаАдресации("10500000", НСтр("ru = 'Промышленная зона'"))); Результат.Добавить(СтрокаОбъектаАдресации("10600000", НСтр("ru = 'Гаражно-строительный кооператив'"))); Результат.Добавить(СтрокаОбъектаАдресации("10700000", НСтр("ru = 'Территория'"))); - + Возврат Результат; + КонецФункции // Параметры: @@ -8809,8 +8842,8 @@ // Чтение XDTOТип = XDTOАдрес.Тип(); - Если XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен(), "АдресРФ") Или XDTOТип = ФабрикаXDTO.Тип( - "http://www.v8.1c.ru/ssl/contactinfo_ru", "АдресРФ") Тогда + Если XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен(), "АдресРФ") + Или XDTOТип = ФабрикаXDTO.Тип("http://www.v8.1c.ru/ssl/contactinfo_ru", "АдресРФ") Тогда АдресРФ = XDTOАдрес; Иначе АдресРФ = XDTOАдрес.Состав; @@ -9174,24 +9207,25 @@ Знач ИдентификаторАдресногоОбъекта, Знач СтрокаПоиска, Знач ТочноеСовпадение) Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ - | ЗемельныеУчастки.Участки КАК Участки, - | ЕСТЬNULL(ДополнительныеСведения.ОКТМО, """") КАК ОКТМО, - | ЕСТЬNULL(ДополнительныеСведения.ПочтовыйИндекс, """") КАК ПочтовыйИндекс, - | ЕСТЬNULL(ДополнительныеСведения.КодИФНСФЛ, """") КАК КодИФНСФЛ, - | ЕСТЬNULL(ДополнительныеСведения.КодИФНСЮЛ, """") КАК КодИФНСЮЛ, - | ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСФЛ, """") КАК КодУчасткаИФНСФЛ, - | ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСЮЛ, """") КАК КодУчасткаИФНСЮЛ, - | ЕСТЬNULL(ДополнительныеСведения.OKATO, """") КАК ОКАТО, - | ЕСТЬNULL(АдресныеОбъекты.КодКЛАДР, """") КАК КодКЛАДР - |ИЗ - | РегистрСведений.ЗемельныеУчастки КАК ЗемельныеУчастки - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения - | ПО (ДополнительныеСведения.Идентификатор = ЗемельныеУчастки.ДополнительныеАдресныеСведения) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты - | ПО (АдресныеОбъекты.Идентификатор = ЗемельныеУчастки.АдресныйОбъект) - |ГДЕ - | ЗемельныеУчастки.АдресныйОбъект = &АдресныйОбъект"; + Запрос.Текст = + "ВЫБРАТЬ + | ЗемельныеУчастки.Участки КАК Участки, + | ЕСТЬNULL(ДополнительныеСведения.ОКТМО, """") КАК ОКТМО, + | ЕСТЬNULL(ДополнительныеСведения.ПочтовыйИндекс, """") КАК ПочтовыйИндекс, + | ЕСТЬNULL(ДополнительныеСведения.КодИФНСФЛ, """") КАК КодИФНСФЛ, + | ЕСТЬNULL(ДополнительныеСведения.КодИФНСЮЛ, """") КАК КодИФНСЮЛ, + | ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСФЛ, """") КАК КодУчасткаИФНСФЛ, + | ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСЮЛ, """") КАК КодУчасткаИФНСЮЛ, + | ЕСТЬNULL(ДополнительныеСведения.OKATO, """") КАК ОКАТО, + | ЕСТЬNULL(АдресныеОбъекты.КодКЛАДР, """") КАК КодКЛАДР + |ИЗ + | РегистрСведений.ЗемельныеУчастки КАК ЗемельныеУчастки + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения + | ПО (ДополнительныеСведения.Идентификатор = ЗемельныеУчастки.ДополнительныеАдресныеСведения) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты + | ПО (АдресныеОбъекты.Идентификатор = ЗемельныеУчастки.АдресныйОбъект) + |ГДЕ + | ЗемельныеУчастки.АдресныйОбъект = &АдресныйОбъект"; Запрос.УстановитьПараметр("АдресныйОбъект", ИдентификаторАдресногоОбъекта); Запись = Запрос.Выполнить().Выбрать(); @@ -9217,8 +9251,8 @@ ОбрезаннаяСтрока = ИсходноеНазвание; Если ПозицияВырезки > 0 Тогда - ОбрезаннаяСтрока = Лев(ИсходноеНазвание, ПозицияВырезки - 1) + Сред(ИсходноеНазвание, ПозицияВырезки + СтрДлина( - ВырезаемаяПодстрока)); + ОбрезаннаяСтрока = Лев(ИсходноеНазвание, ПозицияВырезки - 1) + + Сред(ИсходноеНазвание, ПозицияВырезки + СтрДлина(ВырезаемаяПодстрока)); КонецЕсли; Возврат СокрЛП(ОбрезаннаяСтрока); @@ -9358,15 +9392,6 @@ КонецПроцедуры -Процедура УстановкаТипаКузбассКемеровскойОбласти(КонтактнаяИнформацияПоПолям) - // АПК: 1297-выкл Данные адресного классификатора, не локализуются - Если СтрСравнить(КонтактнаяИнформацияПоПолям.area, ДействующиеНаименованиеКемеровскойОбласти()) = 0 Тогда - КонтактнаяИнформацияПоПолям.area = "Кемеровская область -"; - КонтактнаяИнформацияПоПолям.areaType= "Кузбасс"; - КонецЕсли; - // АПК: 1297-вкл -КонецПроцедуры - Процедура УстановкаТипаКузбассКемеровскойОбластиКакВГАР(КонтактнаяИнформацияПоПолям) // АПК: 1297-выкл Данные адресного классификатора, не локализуются Если СтрНайти(ВРег(КонтактнаяИнформацияПоПолям.area), ВРег("Кемеровская область")) > 0 Тогда @@ -9425,7 +9450,10 @@ ФайлПолучен = ПолучитьФайлИзИнтернета(ОписаниеРегиона, ВременныйКаталог, ПараметрыПолучения, ФайлРегиона.ИмяФайла); Если Не ФайлПолучен.Статус Тогда - // 2 попытка получения файла + // 2 попытка получения файла + Если Не ФайлСуществует(ВременныйКаталог) Тогда + СоздатьКаталог(ВременныйКаталог); + КонецЕсли; ФайлПолучен = ПолучитьФайлИзИнтернета(ОписаниеРегиона, ВременныйКаталог, ПараметрыПолучения, ФайлРегиона.ИмяФайла); Если Не ФайлПолучен.Статус Тогда @@ -9456,7 +9484,7 @@ Если Не ФайлСуществует(ПутьДляСохранения) Тогда Результат.СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось загрузить файл %1. Загрузка адресных сведений перервана. + НСтр("ru = 'Не удалось загрузить файл %1. Загрузка адресных сведений прервана. |Техническая информация: %2'"), ИмяФайла, ПутьДляСохранения); Иначе Результат.Статус = Истина; @@ -9494,9 +9522,9 @@ КаталогФайлов = КаталогФайлов + Формат(СубъектРФ, "ЧЦ=2; ЧВН=") + ПолучитьРазделительПутиСервера(); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Примечание, , , - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Загрузка региона %1 из %2'"), СубъектРФ, - КаталогФайлов)); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Примечание,,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Загрузка региона %1 из %2'"), СубъектРФ, КаталогФайлов)); Попытка @@ -9522,11 +9550,17 @@ КодыСубъектаРФ = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СубъектРФ); ОчиститьКлассификаторАдресов(КодыСубъектаРФ); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, , , - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось загрузить адресные сведения субъекта РФ: %1 %2 - |по причине: %3'"), СубъектРФ, - НаименованиеРегиона, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось загрузить адресные сведения субъекта РФ: %1 %2 + |по причине: %3'"), + СубъектРФ, + НаименованиеРегиона, + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ВызватьИсключение; + КонецПопытки; // 4. Загружаем сокращения адресов. @@ -9574,7 +9608,8 @@ Иначе КаталогФайлов = ИзвлечьФайлыВКаталог(ОписаниеФайлов); Если ТипЗнч(КодыСубъектовРФ) = Тип("Массив") И КодыСубъектовРФ.Количество() > 0 Тогда - КаталогОбщихАдресныхСведений = КаталогФайлов + Формат(КодыСубъектовРФ[0], "ЧЦ=2; ЧВН=") + КаталогОбщихАдресныхСведений = КаталогФайлов + + Формат(КодыСубъектовРФ[0], "ЧЦ=2; ЧВН=") + ПолучитьРазделительПутиСервера(); Иначе Возврат; @@ -9617,14 +9652,19 @@ // Во время загрузки возникла ошибка, очищаем частично загруженные данные. КодыСубъектаРФ = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СубъектРФ); - //@skip-check query-in-loop Очистка только если во время загрузки адресных сведений возникла ошибка. - ОчиститьКлассификаторАдресов(КодыСубъектаРФ); + //@skip-check query-in-loop + ОчиститьКлассификаторАдресов(КодыСубъектаРФ); // Очистка только если во время загрузки адресных сведений возникла ошибка. + + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось загрузить адресные сведения субъекта РФ: %1 %2 + |по причине: %3'"), + СубъектРФ, + НаименованиеРегиона, + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, , , - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось загрузить адресные сведения субъекта РФ: %1 %2 - |по причине: %3'"), СубъектРФ, - НаименованиеРегиона, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); ВызватьИсключение; + КонецПопытки; КонецЦикла; @@ -9861,9 +9901,10 @@ ОперативнаяПамять = СистемнаяИнформация.ОперативнаяПамять / 1024; // Гб ЗагружатьПорциями = Ложь; - Если ОперативнаяПамять < 4 Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 - Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 Или СистемнаяИнформация.ТипПлатформы - = ТипПлатформы.MacOS_x86 Тогда + Если ОперативнаяПамять < 4 + Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 + Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 + Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86 Тогда ЗагружатьПорциями = Истина; КонецЕсли; Результат.Вставить("ЗагружатьПорциями", ЗагружатьПорциями); @@ -9897,8 +9938,11 @@ ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "ADDROBJ", "AddressObjects"); Если ФайлЗагрузки = Неопределено Тогда - ВызватьИсключение НСтр( - "ru = 'Загрузка адресных сведений прервана. В загружаемых файлах не найден файл с адресными сведениями.'"); + + ВызватьИсключение + НСтр("ru = 'Загрузка адресных сведений прервана. + |В загружаемых файлах не найден файл с адресными сведениями.'"); + КонецЕсли; ТекущаяЗапись = ФайлЗагрузки.ФайлЧтения; @@ -9925,8 +9969,8 @@ Запись.Наименование = ТекущаяЗапись.ЗначениеАтрибута("NAME"); Запись.ТипОбъекта = ТекущаяЗапись.ЗначениеАтрибута("TYPENAME"); - Запись.ДополнительныеАдресныеСведения = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута( - "EXTRAGUID")); + Запись.ДополнительныеАдресныеСведения = УникальныйИдентификаторИзСтроки64( + ТекущаяЗапись.ЗначениеАтрибута("EXTRAGUID")); Запись.КодКЛАДР = ТекущаяЗапись.ЗначениеАтрибута("CODE"); Если ЗагружатьОднимНабором Тогда @@ -9972,8 +10016,11 @@ КонецЕсли; Если ФайлЗагрузки = Неопределено Тогда - ВызватьИсключение НСтр( - "ru = 'Загрузка адресных сведений прервана. В загружаемых файлах не найден файл с адресными сведениями.'"); + + ВызватьИсключение + НСтр("ru = 'Загрузка адресных сведений прервана. + |В загружаемых файлах не найден файл с адресными сведениями.'"); + КонецЕсли; ТекущаяЗапись = ФайлЗагрузки.ФайлЧтения; @@ -9998,8 +10045,8 @@ Запись.КодСубъектаРФ = КодСубъектаРФ; Запись.Идентификатор = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("OBJECTGUID")); - Запись.РодительскийИдентификатор = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута( - "PARENTOBJECTGUID")); + Запись.РодительскийИдентификатор = УникальныйИдентификаторИзСтроки64( + ТекущаяЗапись.ЗначениеАтрибута("PARENTOBJECTGUID")); Если ЭтоИстория Тогда Запись.ИдентификаторЗаписи = ТекущаяЗапись.ЗначениеАтрибута("AOID"); @@ -10051,18 +10098,18 @@ Пока ТекущаяЗапись.Прочитать() Цикл - Если ТекущаяЗапись.ТипУзла <> ТипУзлаXML.НачалоЭлемента Или ПустаяСтрока(ТекущаяЗапись.ЗначениеАтрибута( - "PARENTOBJECTGUID")) Тогда + Если ТекущаяЗапись.ТипУзла <> ТипУзлаXML.НачалоЭлемента + Или ПустаяСтрока(ТекущаяЗапись.ЗначениеАтрибута("PARENTOBJECTGUID")) Тогда Продолжить; КонецЕсли; Запись = Набор.Добавить(); Запись.КодСубъектаРФ = КодСубъектаРФ; - Запись.АдресныйОбъект = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута( - "PARENTOBJECTGUID")); - Запись.ДополнительныеАдресныеСведения = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута( - "EXTRAGUID")); + Запись.АдресныйОбъект = УникальныйИдентификаторИзСтроки64( + ТекущаяЗапись.ЗначениеАтрибута("PARENTOBJECTGUID")); + Запись.ДополнительныеАдресныеСведения = УникальныйИдентификаторИзСтроки64( + ТекущаяЗапись.ЗначениеАтрибута("EXTRAGUID")); Запись.Строения = Новый ХранилищеЗначения(ТекущаяЗапись.ЗначениеАтрибута("BUILDINGS"), Сжатие); Если ЗагружатьОднимНабором Тогда @@ -10211,8 +10258,11 @@ ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "ARCHOBJ", "ArchiveObjects"); Если ФайлЗагрузки = Неопределено Тогда - ВызватьИсключение НСтр( - "ru = 'Загрузка адресных сведений прервана. В загружаемых файлах не найден файл с адресными сведениями.'"); + + ВызватьИсключение + НСтр("ru = 'Загрузка адресных сведений прервана. + |В загружаемых файлах не найден файл с адресными сведениями.'"); + КонецЕсли; ТекущаяЗапись = ФайлЗагрузки.ФайлЧтения; @@ -10239,8 +10289,8 @@ Запись.Идентификатор = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("AOID")); Запись.АдресныйОбъект = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("OBJECTGUID")); - Запись.ДополнительныеАдресныеСведения = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута( - "EXTRAGUID")); + Запись.ДополнительныеАдресныеСведения = УникальныйИдентификаторИзСтроки64( + ТекущаяЗапись.ЗначениеАтрибута("EXTRAGUID")); Запись.Наименование = ТекущаяЗапись.ЗначениеАтрибута("NAME"); Запись.ТипОбъекта = ТекущаяЗапись.ЗначениеАтрибута("TYPENAME"); @@ -10342,9 +10392,9 @@ Процедура УдалитьФайлыРегиона(КаталогФайлов) - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Примечание, , , - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Удаление файла региона: %1'"), - КаталогФайлов)); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Примечание,,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Удаление файла региона: %1'"), КаталогФайлов)); УдалитьФайлы(КаталогФайлов); КонецПроцедуры @@ -10398,9 +10448,11 @@ Для Каждого СубъектРФ Из КодыСубъектовРФ Цикл НомерПоПорядку = НомерПоПорядку + 1; - ДлительныеОперации.СообщитьПрогресс( , СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = 'Очистка региона ""%1 - %2"" (осталось %3) ...'"), СубъектРФ, - АдресныйКлассификатор.НаименованиеРегионаПоКоду(СубъектРФ), Формат(ВсегоСубъектов - НомерПоПорядку, "ЧН="))); + ДлительныеОперации.СообщитьПрогресс( , СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Очистка региона ""%1 - %2"" (осталось %3) ...'"), + СубъектРФ, + АдресныйКлассификатор.НаименованиеРегионаПоКоду(СубъектРФ), + Формат(ВсегоСубъектов - НомерПоПорядку, "ЧН="))); НачатьТранзакцию(); Попытка @@ -10432,9 +10484,16 @@ Процедура ОчиститьАдресныеОбъекты(КодСубъектаРФ, СведенияОбРегионе) + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.АдресныеОбъекты"); + ЭлементБлокировки.УстановитьЗначение("КодСубъектаРФ", КодСубъектаРФ); + НачатьТранзакцию(); Попытка + Блокировка.Заблокировать(); + УстановитьПривилегированныйРежим(Истина); + Набор = РегистрыСведений.АдресныеОбъекты.СоздатьНаборЗаписей(); Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ); ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); @@ -10558,11 +10617,15 @@ ЗафиксироватьТранзакцию(); Исключение + ОтменитьТранзакцию(); - ЗаписьЖурналаРегистрации(НСтр( - "ru = 'Не удалось очистить регистр сведений Уровни сокращений адресных сведений.'", - ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки( + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Не удалось очистить регистр сведений Уровни сокращений адресных сведений.'", + ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, + ОбработкаОшибок.ПодробноеПредставлениеОшибки( ИнформацияОбОшибке())); + ВызватьИсключение; КонецПопытки; @@ -10644,9 +10707,9 @@ Результат.Вставить("ПолноеИмя", КаталогФайлов + ИмяИсходногоФайла + ".FI"); КонецЕсли; - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Примечание, , , - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Чтение файла региона %1 из %2'"), - КодСубъектаРФ, Результат.ПолноеИмя)); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Примечание,,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Чтение файла региона %1 из %2'"), КодСубъектаРФ, Результат.ПолноеИмя)); Результат.Вставить("Версия", Неопределено); Результат.Вставить("ДатаВерсии", Неопределено); @@ -10655,8 +10718,8 @@ Если Не ФайлСуществует(Результат.ПолноеИмя) Тогда СписокИзвлеченныхФайлов(КаталогФайлов); ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось загрузить файл %1. Загрузка адресных сведений перервана. - |Техническая информация: %2'"), ИмяИсходногоФайла, Результат.ПолноеИмя); + НСтр("ru = 'Не удалось загрузить файл %1. + |Техническая информация: %2'"), ИмяИсходногоФайла, Результат.ПолноеИмя); КонецЕсли; ФайлЧтения = Результат.ФайлЧтения; @@ -10665,7 +10728,8 @@ // Встаем на первый узел с данными. КореньНайден = ФайлЧтения.ПерейтиКСодержимому() <> ТипУзлаXML.Ничего; Пока КореньНайден Цикл - Если ФайлЧтения.ТипУзла = ТипУзлаXML.НачалоЭлемента И ФайлЧтения.ЛокальноеИмя = ИмяОписывающегоУзла Тогда + Если ФайлЧтения.ТипУзла = ТипУзлаXML.НачалоЭлемента + И ФайлЧтения.ЛокальноеИмя = ИмяОписывающегоУзла Тогда Результат.Версия = ФайлЧтения.ЗначениеАтрибута("Version"); Результат.ДатаВерсии = ФайлЧтения.ЗначениеАтрибута("UpdateDate"); Прервать; @@ -10674,8 +10738,8 @@ КонецЦикла; Если Не КореньНайден Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = 'В файле ""%1"" отсутствуют данные по %2'"), Результат.ПолноеИмя, ИмяОписывающегоУзла); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В файле ""%1"" отсутствуют данные по %2'"), Результат.ПолноеИмя, ИмяОписывающегоУзла); КонецЕсли; Результат.Вставить("КодСубъектаРФ", КодСубъектаРФ); @@ -10689,7 +10753,7 @@ Функция КаталогВременногоХранилищаФайлов() Экспорт - КаталогФайлов = ФайловаяСистема.КаталогОбщегоВременногоХранилищаФайлов("AdrCls"); + КаталогФайлов = ФайловаяСистема.ОбщийКаталогВременныхФайлов("AdrCls"); Если Не СтрЗаканчиваетсяНа(КаталогФайлов, ПолучитьРазделительПутиСервера()) Тогда КаталогФайлов = КаталогФайлов + ПолучитьРазделительПутиСервера(); КонецЕсли; @@ -10731,5 +10795,4 @@ #КонецОбласти -#КонецОбласти - +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/Анкетирование/Module.bsl b/SSL/src/CommonModules/Анкетирование/Module.bsl index 609784c0c..149f8f6cb 100644 --- a/SSL/src/CommonModules/Анкетирование/Module.bsl +++ b/SSL/src/CommonModules/Анкетирование/Module.bsl @@ -621,7 +621,7 @@ ИначеЕсли СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда - ВариантыОтветовНаВопрос = ПолучитьВариантыОтветовНаВопрос(СтрокаДерева.ЭлементарныйВопрос,Форма); + ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(СтрокаДерева.ЭлементарныйВопрос,Форма); ОписаниеТипаСтроки = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(150)); ОписаниеТипаБулево = Новый ОписаниеТипов("Булево"); @@ -753,7 +753,7 @@ Если ПредставлениеТипВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда - ВариантыОтветовНаВопрос = ПолучитьВариантыОтветовНаВопрос(СтрокаКомплексногоВопроса.ЭлементарныйВопрос,Форма); + ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(СтрокаКомплексногоВопроса.ЭлементарныйВопрос,Форма); ОписаниеТипаСтроки = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(150)); ОписаниеТипаБулево = Новый ОписаниеТипов("Булево"); @@ -1027,7 +1027,7 @@ ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ОдинВариантИз Тогда - ВариантыОтветовНаВопрос = ПолучитьВариантыОтветовНаВопрос(СтрокаТаблицы.ЭлементарныйВопрос,Форма); + ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(СтрокаТаблицы.ЭлементарныйВопрос,Форма); Элемент = Форма.Элементы.Добавить(ИмяВопроса,Тип("ПолеФормы"),ЭлементГруппаВопросКомментарий); Элемент.Вид = ВидПоляФормы.ПолеПереключателя; @@ -1053,7 +1053,7 @@ ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда - ВариантыОтветовНаВопрос = ПолучитьВариантыОтветовНаВопрос(СтрокаТаблицы.ЭлементарныйВопрос,Форма); + ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(СтрокаТаблицы.ЭлементарныйВопрос,Форма); Счетчик = 0; ЭлементГруппаВариантыОтветов = Форма.Элементы.Добавить(ИмяВопроса + "_Группа_Варианты",Тип("ГруппаФормы"),ЭлементГруппаВопросКомментарий); @@ -1186,7 +1186,7 @@ Если ТаблицаВопроса.Колонки[ИмяКолонки].ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.ВариантыОтветовАнкет") Тогда Элемент.РежимВыбораИзСписка = Истина; - ВариантыОтветовНаВопрос = ПолучитьВариантыОтветовНаВопрос(СтрокаТаблицы.СоставТабличногоВопроса[инд-1].ЭлементарныйВопрос,Форма); + ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(СтрокаТаблицы.СоставТабличногоВопроса[инд-1].ЭлементарныйВопрос,Форма); Для каждого ВариантОтветаНаВопрос Из ВариантыОтветовНаВопрос Цикл СписокВыбораЭлемента = Элемент.СписокВыбора; // СписокЗначений СписокВыбораЭлемента.Добавить(ВариантОтветаНаВопрос.Ответ); @@ -1210,7 +1210,7 @@ Если СтрокаТаблицы.СоставТабличногоВопроса[2].ЭлементарныйВопрос.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.ВариантыОтветовАнкет")Тогда Элемент.РежимВыбораИзСписка = Истина; - ВариантыОтветовНаВопрос = ПолучитьВариантыОтветовНаВопрос(СтрокаТаблицы.СоставТабличногоВопроса[2].ЭлементарныйВопрос,Форма); + ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(СтрокаТаблицы.СоставТабличногоВопроса[2].ЭлементарныйВопрос,Форма); Для каждого ВариантОтветаНаВопрос Из ВариантыОтветовНаВопрос Цикл СписокВыбораЭлемента = Элемент.СписокВыбора; // СписокЗначений СписокВыбораЭлемента.Добавить(ВариантОтветаНаВопрос.Ответ); @@ -1423,7 +1423,7 @@ ИначеЕсли РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ОдинВариантИз Тогда - ВариантыОтветовНаВопрос = ПолучитьВариантыОтветовНаВопрос(СтрокаКомплексногоВопроса.ЭлементарныйВопрос,Форма); + ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(СтрокаКомплексногоВопроса.ЭлементарныйВопрос,Форма); Элемент = Форма.Элементы.Добавить(ИмяВопроса + "_Ответ_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки, "ЧГ="),Тип("ПолеФормы"),ЭлементГруппа); Элемент.Вид = ВидПоляФормы.ПолеПереключателя; @@ -1447,7 +1447,7 @@ ИначеЕсли РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда - ВариантыОтветовНаВопрос = ПолучитьВариантыОтветовНаВопрос(СтрокаКомплексногоВопроса.ЭлементарныйВопрос,Форма); + ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(СтрокаКомплексногоВопроса.ЭлементарныйВопрос,Форма); Счетчик = 0; ЭлементГруппаВариантыОтветов = Форма.Элементы.Добавить(ИмяВопроса + "_Ответ_" @@ -1514,13 +1514,13 @@ // Получает возможные варианты ответа на вопрос. // // Параметры: -// ЭлементарныйВопрос - ПланВидовХарактеристикСсылка.ВопросыДляАнкетирования - вопрос для которого получаются ответы. +// ЭлементарныйВопрос - ПланВидовХарактеристикСсылка.ВопросыДляАнкетирования - вопрос, для которого получаются ответы. // Форма - ФормаКлиентскогоПриложения - форма, из которой происходит вызов. // // Возвращаемое значение: -// Массив - строки таблицы значений, в которых содержатся варианты ответов на вопрос. +// Массив из СтрокаТаблицыЗначений // -Функция ПолучитьВариантыОтветовНаВопрос(ЭлементарныйВопрос, Форма) Экспорт +Функция ВариантыОтветовНаВопрос(ЭлементарныйВопрос, Форма) Экспорт Возврат (Форма.ВариантыОтветовНаВопросы.НайтиСтроки(Новый Структура("Вопрос", ЭлементарныйВопрос))); @@ -1533,7 +1533,7 @@ // * Наименование - Строка // // Возвращаемое значение: -// Строка - строка содержащая полный код и формулировку. +// Строка // Функция ПолныйКодНаименование(СтрокаТаблицы) @@ -1604,7 +1604,7 @@ // Процедура ЗаполнитьДеревоРазделов(Форма, ДеревоРазделов) Экспорт - ВыборкаРазделы = ПолучитьВыборкуРазделовПоШаблонуАнкеты(Форма.ШаблонАнкеты); + ВыборкаРазделы = ВыборкаРазделовПоШаблонуАнкеты(Форма.ШаблонАнкеты); ДобавитьСтрокиВДеревоРазделов(ВыборкаРазделы, ДеревоРазделов); КонецПроцедуры @@ -1612,12 +1612,12 @@ // Получает иерархическую выборку по шаблону анкеты. // // Параметры: -// ШаблонАнкеты - СправочникСсылка.ШаблоныАнкет - шаблон анкеты по которому получается выборка. +// ШаблонАнкеты - СправочникСсылка.ШаблоныАнкет - шаблон анкеты, по которому получается выборка. // // Возвращаемое значение: -// ВыборкаИзРезультатаЗапроса - иерархическая выборка по разделам шаблона анкеты. +// ВыборкаИзРезультатаЗапроса // -Функция ПолучитьВыборкуРазделовПоШаблонуАнкеты(ШаблонАнкеты) +Функция ВыборкаРазделовПоШаблонуАнкеты(ШаблонАнкеты) Запрос = Новый Запрос; Запрос.Текст = " @@ -1975,7 +1975,7 @@ Если ВыборкаДетали.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда - ВариантыОтветовНаВопрос = ПолучитьВариантыОтветовНаВопрос(ВыборкаДетали.ЭлементарныйВопрос,Форма); + ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(ВыборкаДетали.ЭлементарныйВопрос,Форма); Счетчик = 0; Для каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл @@ -2078,7 +2078,7 @@ // ** Формулировка - Строка // ** АгрегироватьСуммуВОтчетах - Булево // -Функция ПолучитьПредставленияЭлементарныхВопросовТабличногоВопроса(ШаблонАнкеты) Экспорт +Функция ПредставленияЭлементарныхВопросовТабличногоВопроса(ШаблонАнкеты) Экспорт ПредставленияВопросов = Новый Соответствие; diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl index e26a4f80b..7ccd0b948 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl @@ -71,23 +71,26 @@ // ОбработкаВыполненияПоУмолчанию у бизнес-процесса задачи. // Процедура ВыполнитьЗадачу(ЗадачаСсылка, ДействиеПоУмолчанию = Ложь) Экспорт - + НачатьТранзакцию(); Попытка БизнесПроцессыИЗадачиСервер.ЗаблокироватьЗадачи(ЗадачаСсылка); - ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект(); - Если ЗадачаОбъект.Выполнена Тогда + СведенияЗадачи = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЗадачаСсылка, "Выполнена, БизнесПроцесс, ТочкаМаршрута"); + + Если СведенияЗадачи.Выполнена Тогда ВызватьИсключение НСтр("ru = 'Задача уже была выполнена ранее.'"); КонецЕсли; - Если ДействиеПоУмолчанию И ЗадачаОбъект.БизнесПроцесс <> Неопределено - И НЕ ЗадачаОбъект.БизнесПроцесс.Пустая() Тогда - ТипБизнесПроцесса = ЗадачаОбъект.БизнесПроцесс.Метаданные(); // ОбъектМетаданныхБизнесПроцесс - БизнесПроцессы[ТипБизнесПроцесса.Имя].ОбработкаВыполненияПоУмолчанию(ЗадачаСсылка, - ЗадачаОбъект.БизнесПроцесс, ЗадачаОбъект.ТочкаМаршрута); + Если ДействиеПоУмолчанию + И СведенияЗадачи.БизнесПроцесс <> Неопределено + И Не СведенияЗадачи.БизнесПроцесс.Пустая() Тогда + ТипБизнесПроцесса = СведенияЗадачи.БизнесПроцесс.Метаданные(); // ОбъектМетаданныхБизнесПроцесс + БизнесПроцессы[ТипБизнесПроцесса.Имя].ОбработкаВыполненияПоУмолчанию(ЗадачаСсылка, + СведенияЗадачи.БизнесПроцесс, СведенияЗадачи.ТочкаМаршрута); КонецЕсли; - + + ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект(); ЗадачаОбъект.Выполнена = Ложь; ЗадачаОбъект.ВыполнитьЗадачу(); ЗафиксироватьТранзакцию(); @@ -95,7 +98,7 @@ ОтменитьТранзакцию(); ВызватьИсключение; КонецПопытки; - + КонецПроцедуры // Перенаправить задачи МассивЗадач новому исполнителю, указанному в структуре ИнфоОПеренаправлении. @@ -290,7 +293,7 @@ Исключение ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(БизнесПроцессыИЗадачиСервер.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -432,7 +435,7 @@ // ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя // // Возвращаемое значение: -// Булево - если Истина, то задача является ведущей. +// Булево // Функция ЭтоВедущаяЗадача(ЗадачаСсылка) Экспорт @@ -442,11 +445,10 @@ КонецФункции -// Формирует список подбора для указания исполнителя в полях -// ввода составного типа (Пользователь и Роль). +// Формирует список подбора для указания исполнителя в полях ввода составного типа (Пользователь и Роль). // // Параметры: -// Текст - Строка - фрагмент текста для поиска возможных исполнителей. +// Текст - Строка - фрагмент текста для поиска возможных исполнителей. // // Возвращаемое значение: // СписокЗначений - список подбора, содержащий возможных исполнителей. @@ -462,7 +464,7 @@ |ИЗ | Справочник.Пользователи КАК Пользователи |ГДЕ - | Пользователи.Наименование ПОДОБНО &Текст + | Пользователи.Наименование ПОДОБНО &Текст СПЕЦСИМВОЛ ""~"" | И Пользователи.Недействителен = ЛОЖЬ | И Пользователи.Служебный = ЛОЖЬ | И Пользователи.ПометкаУдаления = ЛОЖЬ @@ -474,9 +476,9 @@ |ИЗ | Справочник.РолиИсполнителей КАК РолиИсполнителей |ГДЕ - | РолиИсполнителей.Наименование ПОДОБНО &Текст + | РолиИсполнителей.Наименование ПОДОБНО &Текст СПЕЦСИМВОЛ ""~"" | И НЕ РолиИсполнителей.ПометкаУдаления"; - Запрос.УстановитьПараметр("Текст", Текст + "%"); + Запрос.УстановитьПараметр("Текст", ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(Текст) + "%"); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл @@ -489,69 +491,51 @@ #КонецОбласти - #Область СлужебныеПроцедурыИФункции -//////////////////////////////////////////////////////////////////////////////// -// Прочие служебные процедуры и функции. - -// Возвращает число невыполненных задач по указанным бизнес-процессам. -// // Возвращаемое значение: // Число // Функция КоличествоНевыполненныхЗадачБизнесПроцессов(БизнесПроцессы) Экспорт - КоличествоЗадач = 0; - + МассивБизнесПроцессов = Новый Массив; Для каждого БизнесПроцесс Из БизнесПроцессы Цикл - Если ТипЗнч(БизнесПроцесс) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда Продолжить; КонецЕсли; - - КоличествоЗадач = КоличествоЗадач + КоличествоНевыполненныхЗадачБизнесПроцесса(БизнесПроцесс); - + МассивБизнесПроцессов.Добавить(БизнесПроцесс); КонецЦикла; - Возврат КоличествоЗадач; + Если МассивБизнесПроцессов.Количество() = 0 Тогда + Возврат 0; + КонецЕсли; + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | КОЛИЧЕСТВО(*) КАК Количество + |ИЗ + | Задача.ЗадачаИсполнителя КАК Задачи + |ГДЕ + | Задачи.БизнесПроцесс В (&БизнесПроцессы) + | И Задачи.Выполнена = ЛОЖЬ"); + + Запрос.УстановитьПараметр("БизнесПроцессы", МассивБизнесПроцессов); + Возврат Запрос.Выполнить().Выбрать().Следующий().Количество; КонецФункции -// Возвращает число невыполненных задач по указанному бизнес-процессу. -// // Возвращаемое значение: // Число // Функция КоличествоНевыполненныхЗадачБизнесПроцесса(БизнесПроцесс) Экспорт - Если ТипЗнч(БизнесПроцесс) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Возврат 0; - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ - | КОЛИЧЕСТВО(*) КАК Количество - |ИЗ - | Задача.ЗадачаИсполнителя КАК Задачи - |ГДЕ - | Задачи.БизнесПроцесс = &БизнесПроцесс - | И Задачи.Выполнена = ЛОЖЬ"; - - Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцесс); - - Выборка = Запрос.Выполнить().Выбрать(); - Выборка.Следующий(); - - Возврат Выборка.Количество; + Возврат КоличествоНевыполненныхЗадачБизнесПроцессов(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(БизнесПроцесс)); КонецФункции -// Помечает на удаление указанные бизнес-процессы. -// // Возвращаемое значение: -// БизнесПроцессСсылка -// Неопределено +// - БизнесПроцессСсылка +// - Неопределено // Функция ПометитьНаУдалениеБизнесПроцессы(ВыделенныеСтроки) Экспорт diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl index 67bf626ad..603751cb3 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl @@ -328,7 +328,7 @@ Исключение ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, - БизнесПроцессСсылка.Метаданные(), ПредставлениеСсылки, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + БизнесПроцессСсылка.Метаданные(), ПредставлениеСсылки, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -404,7 +404,7 @@ КонецФункции -// Возвращает массив подчиненных указанной задаче бизнес-процессов. +// Возвращает бизнес-процессы, подчиненные указанной задаче. // // Параметры: // ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя @@ -438,39 +438,44 @@ Блокировка.Заблокировать(); КонецЕсли; + ШаблонЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | #Таблица КАК Таблица + |ГДЕ + | Таблица.ГлавнаяЗадача = &ГлавнаяЗадача"; + + ТекстыЗапросов = Новый Массив; Для Каждого ТипБизнесПроцесса Из Метаданные.ОпределяемыеТипы.БизнесПроцесс.Тип.Типы() Цикл МетаданныеБизнесПроцесса = Метаданные.НайтиПоТипу(ТипБизнесПроцесса); - // У бизнес-процесса может и не быть главной задачи. + // У бизнес-процесса может не быть главной задачи. РеквизитГлавнаяЗадача = МетаданныеБизнесПроцесса.Реквизиты.Найти("ГлавнаяЗадача"); Если РеквизитГлавнаяЗадача = Неопределено Тогда Продолжить; КонецЕсли; - ТекстЗапроса = " - |ВЫБРАТЬ РАЗРЕШЕННЫЕ - | Таблица.Ссылка КАК Ссылка - |ИЗ - | #Таблица КАК Таблица - |ГДЕ - | Таблица.ГлавнаяЗадача = &ГлавнаяЗадача"; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, - "#Таблица", - МетаданныеБизнесПроцесса.ПолноеИмя()); - - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("ГлавнаяЗадача", ЗадачаСсылка); - - РезультатЗапроса = Запрос.Выполнить(); - Выборка = РезультатЗапроса.Выбрать(); - Пока Выборка.Следующий() Цикл - Результат.Добавить(Выборка.Ссылка); - КонецЦикла; + ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "#Таблица", МетаданныеБизнесПроцесса.ПолноеИмя()); + Если ТекстыЗапросов.Количество() > 0 Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); // @query-part-1, @query-part-2 + КонецЕсли; + ТекстыЗапросов.Добавить(ТекстЗапроса); КонецЦикла; + Если ТекстыЗапросов.Количество() = 0 Тогда + Возврат Результат; + КонецЕсли; + + Запрос = Новый Запрос(СтрСоединить(ТекстыЗапросов, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС)); + Запрос.УстановитьПараметр("ГлавнаяЗадача", ЗадачаСсылка); + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Результат.Добавить(Выборка.Ссылка); + КонецЦикла; + Возврат Результат; КонецФункции @@ -760,13 +765,11 @@ Исключение ОтменитьТранзакцию(); - ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ТекстОшибки = НСтр("ru = 'Во время отложенного старта этого процесса произошла ошибка: - |%1 - |Попробуйте запустить процесс вручную, а не отложенно.'"); Описание = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ТекстОшибки, - ОписаниеОшибки); + НСтр("ru = 'Не удалось отложенно запустить процесс по причине: + |%1 + |Попробуйте запустить процесс вручную, а не отложенно.'"), + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); РегистрыСведений.ПроцессыДляЗапуска.ЗарегистрироватьОтменуСтарта(БизнесПроцесс, Описание); КонецПопытки; @@ -882,8 +885,10 @@ ДатаПоследнегоУведомления, ДатаУведомления)); ЗадачиПоИсполнителям = ВыбратьНовыеЗадачиПоИсполнителям(ДатаПоследнегоУведомления, ДатаУведомления); + Получатели = ОбщегоНазначенияКлиентСервер.СвернутьМассив(ЗадачиПоИсполнителям.ВыгрузитьКолонку("Исполнитель")); + АдресаПолучателей = АдресаЭлектроннойПочты(Получатели); Для Каждого СтрокаИсполнителя Из ЗадачиПоИсполнителям.Строки Цикл - ОтправитьУведомлениеОНовыхЗадачах(СтрокаИсполнителя.Исполнитель, СтрокаИсполнителя); + ОтправитьУведомлениеОНовыхЗадачах(СтрокаИсполнителя.Исполнитель, СтрокаИсполнителя, АдресаПолучателей); КонецЦикла; УстановитьПривилегированныйРежим(Истина); @@ -920,9 +925,9 @@ Возврат; КонецЕсли; - НаборПисемПоАдресатам = ВыбратьИсполнителейПросроченныхЗадач(ПросроченныеЗадачи); - Для Каждого ПисьмоИзНабора Из НаборПисемПоАдресатам Цикл - ОтправитьУведомлениеОПросроченныхЗадачах(ПисьмоИзНабора); + ПисьмаОПросроченныхЗадачах = ПисьмаОПросроченныхЗадачах(ПросроченныеЗадачи); + Для Каждого Письмо Из ПисьмаОПросроченныхЗадачах Цикл + ОтправитьУведомлениеОПросроченноеЗадаче(Письмо); КонецЦикла; КонецПроцедуры @@ -1369,7 +1374,8 @@ //////////////////////////////////////////////////////////////////////////////// // Мониторинг и контроль исполнения. -Функция ВыгрузитьИсполнителей(ТекстЗапроса, ОсновнойОбъектАдресацииСсылка, ДопОбъектАдресацииСсылка) +Функция ВыгрузитьИсполнителей(ТекстЗапроса, ОсновнойОбъектАдресацииСсылка = Неопределено, + ДопОбъектАдресацииСсылка = Неопределено) Запрос = Новый Запрос(ТекстЗапроса); @@ -1381,107 +1387,112 @@ Запрос.УстановитьПараметр("ООА", ОсновнойОбъектАдресацииСсылка); КонецЕсли; - Возврат Запрос.Выполнить().Выгрузить(); + Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Исполнитель"); КонецФункции -Функция НайтиИсполнителейПоРолям(Знач Задача, Знач БазовыйТекстЗапроса) +Функция НайтиОтветственныхЗаНазначениеРолей(ОсновнойОбъектАдресации, ДополнительныйОбъектАдресации) - СписокПользователей = Новый Массив; + ШаблонЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ + | ИсполнителиЗадач.Исполнитель + |ИЗ + | РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.РолиИсполнителей КАК РолиИсполнителей + | ПО ИсполнителиЗадач.РольИсполнителя = РолиИсполнителей.Ссылка + |ГДЕ + | РолиИсполнителей.Ссылка = ЗНАЧЕНИЕ(Справочник.РолиИсполнителей.ОтветственныйЗаКонтрольИсполнения) + | И &УсловиеПоОбъектамАдресации"; - ООА = Задача.ОсновнойОбъектАдресации; - ДОА = Задача.ДополнительныйОбъектАдресации; - - Если ЗначениеЗаполнено(ДОА) Тогда - ТекстЗапроса = БазовыйТекстЗапроса + " И ИсполнителиЗадач.ОсновнойОбъектАдресации = &ООА - |И ИсполнителиЗадач.ДополнительныйОбъектАдресации = &ДОА"; - ИначеЕсли ЗначениеЗаполнено(ООА) Тогда - ТекстЗапроса = БазовыйТекстЗапроса - + " И ИсполнителиЗадач.ОсновнойОбъектАдресации = &ООА - |И (ИсполнителиЗадач.ДополнительныйОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка) - | ИЛИ ИсполнителиЗадач.ДополнительныйОбъектАдресации = Неопределено)"; + Если ЗначениеЗаполнено(ДополнительныйОбъектАдресации) Тогда + УсловиеПоОбъектамАдресации = "ИсполнителиЗадач.ОсновнойОбъектАдресации = &ООА + | И ИсполнителиЗадач.ДополнительныйОбъектАдресации = &ДОА"; // @Query-part + ИначеЕсли ЗначениеЗаполнено(ОсновнойОбъектАдресации) Тогда + УсловиеПоОбъектамАдресации = + "ИсполнителиЗадач.ОсновнойОбъектАдресации = &ООА + | И (ИсполнителиЗадач.ДополнительныйОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка) + | ИЛИ ИсполнителиЗадач.ДополнительныйОбъектАдресации = Неопределено)"; // @Query-part Иначе - ТекстЗапроса = БазовыйТекстЗапроса - + " И (ИсполнителиЗадач.ОсновнойОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка) - | ИЛИ ИсполнителиЗадач.ОсновнойОбъектАдресации = Неопределено) - |И (ИсполнителиЗадач.ДополнительныйОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка) - | ИЛИ ИсполнителиЗадач.ДополнительныйОбъектАдресации = Неопределено)"; + УсловиеПоОбъектамАдресации = + "(ИсполнителиЗадач.ОсновнойОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка) + | ИЛИ ИсполнителиЗадач.ОсновнойОбъектАдресации = Неопределено) + | И (ИсполнителиЗадач.ДополнительныйОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка) + | ИЛИ ИсполнителиЗадач.ДополнительныйОбъектАдресации = Неопределено)"; // @Query-part КонецЕсли; - - ВыгрузкаИсполнителей = ВыгрузитьИсполнителей(ТекстЗапроса, ООА, ДОА); + + ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "&УсловиеПоОбъектамАдресации", УсловиеПоОбъектамАдресации); + Исполнители = ВыгрузитьИсполнителей(ТекстЗапроса, ОсновнойОбъектАдресации, ДополнительныйОбъектАдресации); // Если в задаче не заполнены основной и дополнительный объекты адресации. - Если Не ЗначениеЗаполнено(ДОА) И Не ЗначениеЗаполнено(ООА) Тогда - Для Каждого ЭлементВыгрузки Из ВыгрузкаИсполнителей Цикл - СписокПользователей.Добавить(ЭлементВыгрузки.Исполнитель); - КонецЦикла; - - Возврат СписокПользователей; + Если Не ЗначениеЗаполнено(ДополнительныйОбъектАдресации) И Не ЗначениеЗаполнено(ОсновнойОбъектАдресации) Тогда + Возврат Исполнители; КонецЕсли; - Если ВыгрузкаИсполнителей.Количество() = 0 И ЗначениеЗаполнено(ДОА) Тогда - ТекстЗапроса = БазовыйТекстЗапроса + " И ИсполнителиЗадач.ОсновнойОбъектАдресации = &ООА - |И (ИсполнителиЗадач.ДополнительныйОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка) - | ИЛИ ИсполнителиЗадач.ДополнительныйОбъектАдресации = Неопределено)"; - ВыгрузкаИсполнителей = ВыгрузитьИсполнителей(ТекстЗапроса, ООА, Неопределено); + Если Исполнители.Количество() = 0 И ЗначениеЗаполнено(ДополнительныйОбъектАдресации) Тогда + УсловиеПоОбъектамАдресации = + "ИсполнителиЗадач.ОсновнойОбъектАдресации = &ООА + | И (ИсполнителиЗадач.ДополнительныйОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка) + | ИЛИ ИсполнителиЗадач.ДополнительныйОбъектАдресации = Неопределено)"; // @Query-part + ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "&УсловиеПоОбъектамАдресации", УсловиеПоОбъектамАдресации); + Исполнители = ВыгрузитьИсполнителей(ТекстЗапроса, ОсновнойОбъектАдресации); КонецЕсли; - Если ВыгрузкаИсполнителей.Количество() = 0 Тогда - ТекстЗапроса = БазовыйТекстЗапроса + " И (ИсполнителиЗадач.ОсновнойОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка) - | ИЛИ ИсполнителиЗадач.ОсновнойОбъектАдресации = Неопределено) - |И (ИсполнителиЗадач.ДополнительныйОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка) - | ИЛИ ИсполнителиЗадач.ДополнительныйОбъектАдресации = Неопределено)"; - ВыгрузкаИсполнителей = ВыгрузитьИсполнителей(ТекстЗапроса, Неопределено, Неопределено); + Если Исполнители.Количество() = 0 Тогда + УсловиеПоОбъектамАдресации = + "(ИсполнителиЗадач.ОсновнойОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка) + | ИЛИ ИсполнителиЗадач.ОсновнойОбъектАдресации = Неопределено) + | И (ИсполнителиЗадач.ДополнительныйОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка) + | ИЛИ ИсполнителиЗадач.ДополнительныйОбъектАдресации = Неопределено)"; // @Query-part + ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "&УсловиеПоОбъектамАдресации", УсловиеПоОбъектамАдресации); + Исполнители = ВыгрузитьИсполнителей(ТекстЗапроса); КонецЕсли; - Для Каждого ЭлементВыгрузки Из ВыгрузкаИсполнителей Цикл - СписокПользователей.Добавить(ЭлементВыгрузки.Исполнитель); - КонецЦикла; - - Возврат СписокПользователей; - -КонецФункции - -Функция НайтиОтветственныхЗаНазначениеРолей(Знач Задача) - - БазовыйТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ ИсполнителиЗадач.Исполнитель - |ИЗ - | РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач, Справочник.РолиИсполнителей КАК РолиИсполнителей - |ГДЕ - | ИсполнителиЗадач.РольИсполнителя = РолиИсполнителей.Ссылка - |И - | РолиИсполнителей.Ссылка = ЗНАЧЕНИЕ(Справочник.РолиИсполнителей.ОтветственныйЗаКонтрольИсполнения)"; - - Ответственные = НайтиИсполнителейПоРолям(Задача, БазовыйТекстЗапроса); - Возврат Ответственные; - -КонецФункции - -Функция ВыбратьИсполнителейЗадач(Знач Задача) - - ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ - | ИсполнителиЗадач.Исполнитель КАК Исполнитель - |ИЗ - | РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач - |ГДЕ - | ИсполнителиЗадач.РольИсполнителя = &РольИсполнителя - | И ИсполнителиЗадач.ОсновнойОбъектАдресации = &ОсновнойОбъектАдресации - | И ИсполнителиЗадач.ДополнительныйОбъектАдресации = &ДополнительныйОбъектАдресации"; - - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.Параметры.Вставить("РольИсполнителя", Задача.РольИсполнителя); - Запрос.Параметры.Вставить("ОсновнойОбъектАдресации", Задача.ОсновнойОбъектАдресации); - Запрос.Параметры.Вставить("ДополнительныйОбъектАдресации", Задача.ДополнительныйОбъектАдресации); - Исполнители = Запрос.Выполнить().Выгрузить(); Возврат Исполнители; КонецФункции -Процедура НайтиПисьмоИДобавитьТекст(Знач НаборПисемПоАдресатам, - Знач ПолучательПисьма, - Знач ПредставлениеПолучателяПисьма, - Знач ТекстПисьма, - Знач ТипПисьма) +Функция ИсполнителиЗадач(Задачи) + + Результат = Новый Структура; + Результат.Вставить("Исполнители", Новый Массив); + Результат.Вставить("ПоЗадачам", Новый Соответствие); + + ТекстЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ + | ЗадачаИсполнителя.Ссылка КАК Задача, + | ИсполнителиЗадач.Исполнитель КАК Исполнитель + |ИЗ + | Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач + | ПО ИсполнителиЗадач.РольИсполнителя = ЗадачаИсполнителя.РольИсполнителя + | И ИсполнителиЗадач.ОсновнойОбъектАдресации = ЗадачаИсполнителя.ОсновнойОбъектАдресации + | И ИсполнителиЗадач.ДополнительныйОбъектАдресации = ЗадачаИсполнителя.ДополнительныйОбъектАдресации + |ГДЕ + | ЗадачаИсполнителя.Ссылка В (&Задачи) + | + |УПОРЯДОЧИТЬ ПО + | ЗадачаИсполнителя.Ссылка"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("Задачи", Задачи); + ВыборкаЗапроса = Запрос.Выполнить().Выбрать(); + Пока ВыборкаЗапроса.Следующий() Цикл + ИсполнителиЗадачи = Результат.ПоЗадачам[ВыборкаЗапроса.Задача]; + Если ИсполнителиЗадачи = Неопределено Тогда + ИсполнителиЗадачи = Новый Массив; + Результат.ПоЗадачам[ВыборкаЗапроса.Задача] = ИсполнителиЗадачи; + КонецЕсли; + Если ЗначениеЗаполнено(ВыборкаЗапроса.Исполнитель) Тогда + ИсполнителиЗадачи.Добавить(ВыборкаЗапроса.Исполнитель); + Результат.Исполнители.Добавить(ВыборкаЗапроса.Исполнитель); + КонецЕсли; + КонецЦикла; + Возврат Результат; + +КонецФункции + +Процедура НайтиПисьмоИДобавитьТекст(Знач НаборПисемПоАдресатам, Знач ПолучательПисьма, + Знач ПредставлениеПолучателяПисьма, Знач ТекстПисьма, Знач ТипПисьма) ПараметрыОтбора = Новый Структура("ТипПисьма, ПочтовыйАдрес", ТипПисьма, ПолучательПисьма); СтрокаПараметрыПисьма = НаборПисемПоАдресатам.НайтиСтроки(ПараметрыОтбора); @@ -1572,8 +1583,32 @@ КонецФункции -Функция ВыбратьИсполнителейПросроченныхЗадач(ПросроченныеЗадачи) +Функция ПисьмаОПросроченныхЗадачах(ПросроченныеЗадачи) + КоординаторыЗадач = Новый Соответствие; + ПолучателиПисем = Новый Массив; + ЗадачиСРолевойАдресацией = Новый Массив; + Для Каждого ПросроченнаяЗадача Из ПросроченныеЗадачи Цикл + ПросроченнаяЗадачаСсылка = ПросроченнаяЗадача.Ссылка; + ПолучателиПисем.Добавить(ПросроченнаяЗадача.Автор); + Если ЗначениеЗаполнено(ПросроченнаяЗадача.Исполнитель) Тогда + ПолучателиПисем.Добавить(ПросроченнаяЗадача.Исполнитель); + Иначе + ЗадачиСРолевойАдресацией.Добавить(ПросроченнаяЗадача); + Координаторы = НайтиОтветственныхЗаНазначениеРолей(ПросроченнаяЗадача.ОсновнойОбъектАдресации, + ПросроченнаяЗадача.ДополнительныйОбъектАдресации); + КоординаторыЗадач[ПросроченнаяЗадачаСсылка] = Координаторы; + Для Каждого Координатор Из Координаторы Цикл + ПолучателиПисем.Добавить(Координатор); + КонецЦикла; + КонецЕсли; + КонецЦикла; + + ИсполнителиЗадач = ИсполнителиЗадач(ЗадачиСРолевойАдресацией); + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ПолучателиПисем, ИсполнителиЗадач.Исполнители); + ПолучателиПисем = ОбщегоНазначенияКлиентСервер.СвернутьМассив(ПолучателиПисем); + АдресаПолучателей = АдресаЭлектроннойПочты(ПолучателиПисем); + НаборПисемПоАдресатам = Новый ТаблицаЗначений; НаборПисемПоАдресатам.Колонки.Добавить("ПочтовыйАдрес"); НаборПисемПоАдресатам.Колонки.Добавить("ТекстПисьма"); @@ -1582,46 +1617,44 @@ НаборПисемПоАдресатам.Колонки.Добавить("Получатель"); НаборПисемПоАдресатам.Индексы.Добавить("ТипПисьма, ПочтовыйАдрес"); - Для Каждого ЭлементПросроченныеЗадачи Из ПросроченныеЗадачи Цикл - ПросроченнаяЗадача = ЭлементПросроченныеЗадачи.Ссылка; + Для Каждого ПросроченнаяЗадача Из ПросроченныеЗадачи Цикл + ПросроченнаяЗадачаСсылка = ПросроченнаяЗадача.Ссылка; - ТекстПисьма = СформироватьПредставлениеЗадачи(ЭлементПросроченныеЗадачи); - // Задача адресована лично исполнителю? + ТекстПисьма = СформироватьПредставлениеЗадачи(ПросроченнаяЗадача); Если ЗначениеЗаполнено(ПросроченнаяЗадача.Исполнитель) Тогда - ПолучательПисьма = АдресЭлектроннойПочты(ПросроченнаяЗадача.Исполнитель); + ПолучательПисьма = АдресЭлектроннойПочты(АдресаПолучателей, ПросроченнаяЗадача.Исполнитель); НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, ПросроченнаяЗадача.Исполнитель, ТекстПисьма, "Исполнителю"); - ПолучательПисьма = АдресЭлектроннойПочты(ПросроченнаяЗадача.Автор); - НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, ПросроченнаяЗадача.Автор, ТекстПисьма, "Автору"); Иначе - Исполнители = ВыбратьИсполнителейЗадач(ПросроченнаяЗадача); - Координаторы = НайтиОтветственныхЗаНазначениеРолей(ПросроченнаяЗадача); - // Есть хотя бы один исполнитель для измерений ролевой адресации задачи? + Исполнители = ИсполнителиЗадач.ПоЗадачам[ПросроченнаяЗадачаСсылка]; + Координаторы = КоординаторыЗадач[ПросроченнаяЗадачаСсылка]; Если Исполнители.Количество() > 0 Тогда - // Исполнитель не выполняет свои задачи. Для Каждого Исполнитель Из Исполнители Цикл - ПолучательПисьма = АдресЭлектроннойПочты(Исполнитель.Исполнитель); - НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, Исполнитель.Исполнитель, ТекстПисьма, "Исполнителю"); + ПолучательПисьма = АдресЭлектроннойПочты(АдресаПолучателей, Исполнитель); + НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, Исполнитель, ТекстПисьма, "Исполнителю"); КонецЦикла; Иначе // Задачу исполнять некому. - СоздатьЗадачуПоНастройкеРолей(ПросроченнаяЗадача, Координаторы); + СоздатьЗадачуПоНастройкеРолей(ПросроченнаяЗадачаСсылка, Координаторы); КонецЕсли; Для Каждого Координатор Из Координаторы Цикл - ПолучательПисьма = АдресЭлектроннойПочты(Координатор); + ПолучательПисьма = АдресЭлектроннойПочты(АдресаПолучателей, Координатор); НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, Координатор, ТекстПисьма, "Координатору"); КонецЦикла; КонецЕсли; + ПолучательПисьма = АдресЭлектроннойПочты(АдресаПолучателей, ПросроченнаяЗадача.Автор); + НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, ПросроченнаяЗадача.Автор, ТекстПисьма, "Автору"); КонецЦикла; Возврат НаборПисемПоАдресатам; КонецФункции -Процедура ОтправитьУведомлениеОПросроченныхЗадачах(ПисьмоИзНабора) +Процедура ОтправитьУведомлениеОПросроченноеЗадаче(Письмо) - Если ПустаяСтрока(ПисьмоИзНабора.ПочтовыйАдрес) Тогда - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Уведомление не было отправлено, так как у пользователя %1 не задан адрес электронной почты.'"), - ПисьмоИзНабора.Получатель); + Если ПустаяСтрока(Письмо.ПочтовыйАдрес) Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Уведомление не было отправлено, так как не задан адрес электронной почты у исполнителя задачи %1.'"), + ОбщегоНазначения.ПредметСтрокой(Письмо.Получатель)); ЗаписьЖурналаРегистрации(НСтр("ru = 'Бизнес-процессы и задачи.Уведомление о просроченных задачах'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Информация,,, ТекстСообщения); @@ -1629,33 +1662,33 @@ КонецЕсли; ПараметрыПисьма = Новый Структура; - ПараметрыПисьма.Вставить("Кому", ПисьмоИзНабора.ПочтовыйАдрес); - Если ПисьмоИзНабора.ТипПисьма = "Исполнителю" Тогда + ПараметрыПисьма.Вставить("Кому", Письмо.ПочтовыйАдрес); + Если Письмо.ТипПисьма = "Исполнителю" Тогда ТекстТелаПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не выполненные в срок задачи: | - |%1'"), ПисьмоИзНабора.ТекстПисьма); + |%1'"), Письмо.ТекстПисьма); ПараметрыПисьма.Вставить("Тело", ТекстТелаПисьма); ТекстТемыПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не выполненные в срок задачи (%1)'"), - Строка(ПисьмоИзНабора.КоличествоЗадач )); + Строка(Письмо.КоличествоЗадач )); ПараметрыПисьма.Вставить("Тема", ТекстТемыПисьма); - ИначеЕсли ПисьмоИзНабора.ТипПисьма = "Автору" Тогда + ИначеЕсли Письмо.ТипПисьма = "Автору" Тогда ТекстТелаПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'По введенным задачам прошел крайний срок: | - |%1'"), ПисьмоИзНабора.ТекстПисьма); + |%1'"), Письмо.ТекстПисьма); ПараметрыПисьма.Вставить("Тело", ТекстТелаПисьма); ТекстТемыПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'По задачам истек контрольный срок (%1)'"), - Строка(ПисьмоИзНабора.КоличествоЗадач)); + Строка(Письмо.КоличествоЗадач)); ПараметрыПисьма.Вставить("Тема", ТекстТемыПисьма); - ИначеЕсли ПисьмоИзНабора.ТипПисьма = "Координатору" Тогда + ИначеЕсли Письмо.ТипПисьма = "Координатору" Тогда ТекстТелаПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Прошел крайний срок по задачам: | - |%1'"), ПисьмоИзНабора.ТекстПисьма); + |%1'"), Письмо.ТекстПисьма); ПараметрыПисьма.Вставить("Тело", ТекстТелаПисьма); ТекстТемыПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Истек контрольный срок задач (%1)'"), - Строка(ПисьмоИзНабора.КоличествоЗадач)); + Строка(Письмо.КоличествоЗадач)); ПараметрыПисьма.Вставить("Тема", ТекстТемыПисьма); КонецЕсли; @@ -1667,8 +1700,10 @@ Письмо = МодульРаботаСПочтовымиСообщениями.ПодготовитьПисьмо(УчетнаяЗапись, ПараметрыПисьма); МодульРаботаСПочтовымиСообщениями.ОтправитьПисьмо(УчетнаяЗапись, Письмо); Исключение - ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при отправке уведомления о просроченных задачах: %1.'"), + ОписаниеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не отправлены уведомления о просроченных задачах по причине: + |%1.'"), ОписаниеОшибки); УровеньВажностиСобытия = УровеньЖурналаРегистрации.Ошибка; КонецПопытки; @@ -1680,7 +1715,8 @@ ПараметрыПисьма.Кому[0].Представление + " <" + ПараметрыПисьма.Кому[0].Адрес + ">"); КонецЕсли; - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Уведомление о просроченных задачах успешно отправлено на адрес %1.'"), Кому); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Уведомление о просроченных задачах успешно отправлено на адрес %1.'"), Кому); УровеньВажностиСобытия = УровеньЖурналаРегистрации.Информация; КонецЕсли; @@ -1753,14 +1789,15 @@ КонецФункции -Функция ОтправитьУведомлениеОНовыхЗадачах(Исполнитель, ЗадачиПоИсполнителю) +Функция ОтправитьУведомлениеОНовыхЗадачах(Исполнитель, ЗадачиПоИсполнителю, АдресаПолучателей) - ПочтовыйАдресПолучателя = АдресЭлектроннойПочты(Исполнитель); + ПочтовыйАдресПолучателя = АдресЭлектроннойПочты(АдресаПолучателей, Исполнитель); Если ПустаяСтрока(ПочтовыйАдресПолучателя) Тогда - ЗаписьЖурналаРегистрации(НСтр("ru = 'Бизнес-процессы и задачи.Уведомление о новых задачах'", - ОбщегоНазначения.КодОсновногоЯзыка()), + ЗаписьЖурналаРегистрации(НСтр("ru = 'Бизнес-процессы и задачи.Уведомление о новых задачах'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Информация,,, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Уведомление не отправлено, так как не указан почтовый адрес у пользователя %1.'"), Строка(Исполнитель))); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Уведомление не отправлено, так как не указан почтовый адрес у исполнителя задачи %1.'"), + ОбщегоНазначения.ПредметСтрокой(Исполнитель))); Возврат Ложь; КонецЕсли; @@ -1784,15 +1821,17 @@ ЗаписьЖурналаРегистрации(НСтр("ru = 'Бизнес-процессы и задачи.Уведомление о новых задачах'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при отправке уведомления о новых задачах: %1'"), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Уведомления о новых задачах не отправлены по причине: + |%1'"), + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); Возврат Ложь; КонецПопытки; ЗаписьЖурналаРегистрации(НСтр("ru = 'Бизнес-процессы и задачи.Уведомление о новых задачах'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Информация,,, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Уведомления успешно отправлены на адрес %1.'"), ПочтовыйАдресПолучателя)); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Уведомления успешно отправлены на адрес %1.'"), + ПочтовыйАдресПолучателя)); Возврат Истина; КонецФункции @@ -1805,22 +1844,28 @@ ЗадачаСтруктура.Ссылка, Формат(ЗадачаСтруктура.СрокИсполнения, НСтр("ru = 'ДЛФ=DD; ДП=''не указан'''"))); Если ЗначениеЗаполнено(ЗадачаСтруктура.Исполнитель) Тогда - Результат = Результат + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Исполнитель: %1'"), ЗадачаСтруктура.Исполнитель) + Символы.ПС; + Результат = Результат + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Исполнитель: %1'"), + ЗадачаСтруктура.Исполнитель) + Символы.ПС; КонецЕсли; Если ЗначениеЗаполнено(ЗадачаСтруктура.РольИсполнителя) Тогда - Результат = Результат + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Роль: %1'"), ЗадачаСтруктура.РольИсполнителя) + Символы.ПС; + Результат = Результат + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Роль: %1'"), + ЗадачаСтруктура.РольИсполнителя) + Символы.ПС; КонецЕсли; Если ЗначениеЗаполнено(ЗадачаСтруктура.ОсновнойОбъектАдресации) Тогда - Результат = Результат + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Основной объект адресации: %1'"), ЗадачаСтруктура.ОсновнойОбъектАдресации) + Символы.ПС; + Результат = Результат + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Основной объект адресации: %1'"), + ЗадачаСтруктура.ОсновнойОбъектАдресации) + Символы.ПС; КонецЕсли; Если ЗначениеЗаполнено(ЗадачаСтруктура.ДополнительныйОбъектАдресации) Тогда - Результат = Результат + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Доп. объект адресации: %1'"), ЗадачаСтруктура.ДополнительныйОбъектАдресации) + Символы.ПС; + Результат = Результат + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Доп. объект адресации: %1'"), + ЗадачаСтруктура.ДополнительныйОбъектАдресации) + Символы.ПС; КонецЕсли; Если ЗначениеЗаполнено(ЗадачаСтруктура.Автор) Тогда - Результат = Результат + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Автор: %1'"), ЗадачаСтруктура.Автор) + Символы.ПС; + Результат = Результат + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Автор: %1'"), + ЗадачаСтруктура.Автор) + Символы.ПС; КонецЕсли; Если ЗначениеЗаполнено(ЗадачаСтруктура.Описание) Тогда - Результат = Результат + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1'"), ЗадачаСтруктура.Описание) + Символы.ПС; + Результат = Результат + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1'"), + ЗадачаСтруктура.Описание) + Символы.ПС; КонецЕсли; Возврат Результат + Символы.ПС; @@ -1967,7 +2012,13 @@ Функция ВыбратьБизнесПроцессыВедущейЗадачи(ЗадачаСсылка, ДляИзменения = Ложь) Экспорт - ТекстЗапроса = ""; + ШаблонЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | &ИмяТаблицы КАК Таблица + |ГДЕ + | Таблица.ВедущаяЗадача = &ВедущаяЗадача"; + ТекстыЗапросов = Новый Массив; Для Каждого ТипБизнесПроцесса Из Метаданные.ОпределяемыеТипы.БизнесПроцесс.Тип.Типы() Цикл МетаданныеБизнесПроцесса = Метаданные.НайтиПоТипу(ТипБизнесПроцесса); @@ -1979,32 +2030,17 @@ Блокировка.Заблокировать(); КонецЕсли; - Если НЕ ПустаяСтрока(ТекстЗапроса) Тогда - ТекстЗапроса = ТекстЗапроса + " - | - |ОБЪЕДИНИТЬ ВСЕ - |"; - + ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "&ИмяТаблицы", МетаданныеБизнесПроцесса.ПолноеИмя()); + Если ТекстыЗапросов.Количество() > 0 Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); // @Query-part-1, @Query-part-2 КонецЕсли; - - ФрагментЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | Таблица.Ссылка КАК Ссылка - |ИЗ - | &ИмяТаблицы КАК Таблица - |ГДЕ - | Таблица.ВедущаяЗадача = &ВедущаяЗадача"; - Если НЕ ПустаяСтрока(ТекстЗапроса) Тогда - ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); //@Query-part-1, @Query-part-2 - КонецЕсли; - ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "&ИмяТаблицы", МетаданныеБизнесПроцесса.ПолноеИмя()); - - ТекстЗапроса = ТекстЗапроса + ФрагментЗапроса; + ТекстыЗапросов.Добавить(ТекстЗапроса); + КонецЦикла; - Запрос = Новый Запрос(ТекстЗапроса); + Запрос = Новый Запрос(СтрСоединить(ТекстыЗапросов, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС)); Запрос.УстановитьПараметр("ВедущаяЗадача", ЗадачаСсылка); - Результат = Запрос.Выполнить(); - Возврат Результат; + Возврат Запрос.Выполнить(); КонецФункции @@ -2039,20 +2075,24 @@ ЭлементБлокировки.УстановитьЗначение("БизнесПроцесс", БизнесПроцессОбъект.Ссылка); Блокировка.Заблокировать(); - ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать(); - Пока ВыборкаДетальныеЗаписи.Следующий() Цикл - - Задача = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(); + НевыполненныеЗадачи = Запрос.Выполнить().Выгрузить(); + Для каждого ЗадачаСсылка Из НевыполненныеЗадачи Цикл + Задача = ЗадачаСсылка.Ссылка.ПолучитьОбъект(); Задача.Заблокировать(); Задача.СостояниеБизнесПроцесса = БизнесПроцессОбъект.Состояние; Задача.Записать(); - - ПриИзмененииСостоянияЗадачи(Задача.Ссылка, СтароеСостояние, БизнесПроцессОбъект.Состояние); КонецЦикла; + ПриИзмененииСостоянияЗадач(НевыполненныеЗадачи, СтароеСостояние, БизнесПроцессОбъект.Состояние); КонецПроцедуры -Процедура ПриИзмененииСостоянияЗадачи(ЗадачаСсылка, СтароеСостояние, НовоеСостояние) +// Параметры: +// Задачи - ТаблицаЗначений: +// * Ссылка - ЗадачаСсылка.ЗадачаИсполнителя +// СтароеСостояние - ПеречислениеСсылка.СостоянияБизнесПроцессов +// НовоеСостояние - ПеречислениеСсылка.СостоянияБизнесПроцессов +// +Процедура ПриИзмененииСостоянияЗадач(Задачи, СтароеСостояние, НовоеСостояние) // Блокируем вложенные и подчиненные бизнес-процессы. Блокировка = Новый БлокировкаДанных; @@ -2063,46 +2103,68 @@ КонецЕсли; ЭлементБлокировки = Блокировка.Добавить(МетаданныеБизнесПроцесса.ПолноеИмя()); - ЭлементБлокировки.УстановитьЗначение("ВедущаяЗадача", ЗадачаСсылка); + ЭлементБлокировки.ИсточникДанных = Задачи; + ЭлементБлокировки.ИспользоватьИзИсточникаДанных("ВедущаяЗадача", "Ссылка"); РеквизитГлавнаяЗадача = МетаданныеБизнесПроцесса.Реквизиты.Найти("ГлавнаяЗадача"); Если РеквизитГлавнаяЗадача <> Неопределено Тогда ЭлементБлокировки = Блокировка.Добавить(МетаданныеБизнесПроцесса.ПолноеИмя()); - ЭлементБлокировки.УстановитьЗначение("ГлавнаяЗадача", ЗадачаСсылка); + ЭлементБлокировки.ИсточникДанных = Задачи; + ЭлементБлокировки.ИспользоватьИзИсточникаДанных("ГлавнаяЗадача", "Ссылка"); КонецЕсли; КонецЦикла; Блокировка.Заблокировать(); + ЗадачиСсылки = Задачи.ВыгрузитьКолонку("Ссылка"); + ШаблонЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | БизнесПроцессы.Ссылка КАК Ссылка + |ИЗ + | #БизнесПроцессы КАК БизнесПроцессы + |ГДЕ + | БизнесПроцессы.ВедущаяЗадача В (&Задачи) + | И БизнесПроцессы.ПометкаУдаления = ЛОЖЬ + | И БизнесПроцессы.Завершен = ЛОЖЬ"; + ТекстыЗапроса = Новый Массив; + // Меняем состояние вложенных и подчиненных бизнес-процессов. Для каждого МетаданныеБизнесПроцесса Из Метаданные.БизнесПроцессы Цикл Если НЕ ПравоДоступа("Изменение", МетаданныеБизнесПроцесса) Тогда - Продолжить; + Продолжить; КонецЕсли; - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | БизнесПроцессы.Ссылка КАК Ссылка - |ИЗ - | &БизнесПроцессы КАК БизнесПроцессы - |ГДЕ - | БизнесПроцессы.ВедущаяЗадача = &ВедущаяЗадача - | И БизнесПроцессы.ПометкаУдаления = ЛОЖЬ - | И БизнесПроцессы.Завершен = ЛОЖЬ"; - - Запрос.Текст = СтрЗаменить(Запрос.Текст, "&БизнесПроцессы", МетаданныеБизнесПроцесса.ПолноеИмя()); - Запрос.УстановитьПараметр("ВедущаяЗадача", ЗадачаСсылка); - + ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "#БизнесПроцессы", МетаданныеБизнесПроцесса.ПолноеИмя()); + Если ТекстыЗапроса.Количество() > 0 Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); // @query-part-1, @query-part-2 + КонецЕсли; + ТекстыЗапроса.Добавить(ТекстЗапроса); + + КонецЦикла; + + Если ТекстыЗапроса.Количество() > 0 Тогда + Запрос = Новый Запрос(СтрСоединить(ТекстыЗапроса, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС)); // @query-part + Запрос.УстановитьПараметр("Задачи", ЗадачиСсылки); + ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл БизнесПроцесс = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(); // БизнесПроцессОбъект БизнесПроцесс.Состояние = НовоеСостояние; БизнесПроцесс.Записать(); КонецЦикла; - - КонецЦикла; + КонецЕсли; + + ШаблонЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | БизнесПроцессы.Ссылка КАК Ссылка + |ИЗ + | #БизнесПроцессы КАК БизнесПроцессы + |ГДЕ + | БизнесПроцессы.ГлавнаяЗадача В (&Задачи) + | И БизнесПроцессы.ПометкаУдаления = ЛОЖЬ + | И БизнесПроцессы.Завершен = ЛОЖЬ"; + ТекстыЗапроса = Новый Массив; // Меняем состояние подчиненных бизнес-процессов. Для каждого МетаданныеБизнесПроцесса Из Метаданные.БизнесПроцессы Цикл @@ -2113,28 +2175,25 @@ Продолжить; КонецЕсли; - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | БизнесПроцессы.Ссылка КАК Ссылка - |ИЗ - | &БизнесПроцессы КАК БизнесПроцессы - |ГДЕ - | БизнесПроцессы.ГлавнаяЗадача = &ГлавнаяЗадача - | И БизнесПроцессы.ПометкаУдаления = ЛОЖЬ - | И БизнесПроцессы.Завершен = ЛОЖЬ"; - - Запрос.Текст = СтрЗаменить(Запрос.Текст, "&БизнесПроцессы", МетаданныеБизнесПроцесса.ПолноеИмя()); - Запрос.УстановитьПараметр("ГлавнаяЗадача", ЗадачаСсылка); + ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "#БизнесПроцессы", МетаданныеБизнесПроцесса.ПолноеИмя()); + Если ТекстыЗапроса.Количество() > 0 Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); // @query-part-1, @query-part-2 + КонецЕсли; + ТекстыЗапроса.Добавить(ТекстЗапроса); + КонецЦикла; + + Если ТекстыЗапроса.Количество() > 0 Тогда + Запрос = Новый Запрос(СтрСоединить(ТекстыЗапроса, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС)); // @query-part + Запрос.УстановитьПараметр("Задачи", ЗадачиСсылки); + ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл БизнесПроцесс = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(); // БизнесПроцессОбъект БизнесПроцесс.Состояние = НовоеСостояние; БизнесПроцесс.Записать(); КонецЦикла; - - КонецЦикла; + КонецЕсли; КонецПроцедуры @@ -2401,46 +2460,77 @@ КонецПроцедуры -// Возвращает адрес электронной почты пользователя Получатель для рассылки уведомлений о задачах. -// // Параметры: -// Получатель - СправочникСсылка.Пользователи -// - СправочникСсылка.ВнешниеПользователи - исполнитель задачи. -// Адрес - Строка - возвращаемый адрес электронной почты. +// Получатели - см. УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов +// Получатель - СправочникСсылка.Пользователи, СправочникСсылка.внешниеПользователи +// +// Возвращаемое значение: +// Строка // -// -Функция АдресЭлектроннойПочты(Получатель) +Функция АдресЭлектроннойПочты(Получатели, Получатель) - Адрес = ""; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); - Если ТипЗнч(Получатель) = Тип("СправочникСсылка.Пользователи") Тогда - Адрес = МодульУправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта( - Получатель, МодульУправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени("EmailПользователя")); - ИначеЕсли ТипЗнч(Получатель) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда - Адрес = ЭлектроннаяПочтаВнешнегоПользователя(Получатель); - КонецЕсли; + Если Получатели = Неопределено Тогда + Возврат ""; КонецЕсли; - - Возврат Адрес; - -КонецФункции -Функция ЭлектроннаяПочтаВнешнегоПользователя(Получатель) - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - - МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформациейСлужебный"); - МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); - ТипКонтактнойИнформации = МодульУправлениеКонтактнойИнформацией.ТипКонтактнойИнформацииПоНаименованию("АдресЭлектроннойПочты"); - - Возврат МодульУправлениеКонтактнойИнформациейСлужебный.ПервоеЗначениеКонтактнойИнформацииОбъектаПоТипу( - Получатель.ОбъектАвторизации, ТипКонтактнойИнформации, ТекущаяДатаСеанса()); - + СтрокиТаблицы = Получатели.НайтиСтроки(Новый Структура("Объект", Получатель)); + Если СтрокиТаблицы.Количество() > 0 Тогда + Возврат СтрокиТаблицы[0].Представление; КонецЕсли; Возврат ""; + +КонецФункции + +// Параметры: +// Получатели - Массив из СправочникСсылка.Пользователи +// - Массив из СправочникСсылка.внешниеПользователи +// +// Возвращаемое значение: +// см. УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов +// +Функция АдресаЭлектроннойПочты(Получатели) + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + + ПользователиСсылки = Новый Массив; + ВнешниеПользователиСсылки = Новый Массив; + ЕстьАдресаВнешнихПользователей = МодульУправлениеКонтактнойИнформацией.СодержитКонтактнуюИнформацию(Тип("СправочникСсылка.ВнешниеПользователи")); + Для каждого Получатель Из Получатели Цикл + Если ТипЗнч(Получатель) = Тип("СправочникСсылка.Пользователи") Тогда + ПользователиСсылки.Добавить(Получатель); + ИначеЕсли ЕстьАдресаВнешнихПользователей И ТипЗнч(Получатель) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда + ВнешниеПользователиСсылки.Добавить(Получатель); + КонецЕсли; + КонецЦикла; + + ВидКонтактнойИнформации = МодульУправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени("EmailПользователя"); + ТипКонтактнойИнформации = МодульУправлениеКонтактнойИнформацией.ТипКонтактнойИнформацииПоНаименованию("АдресЭлектроннойПочты"); + + Результат = Неопределено; + Если ПользователиСсылки.Количество() > 0 Тогда + Результат = МодульУправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(ПользователиСсылки,, + ВидКонтактнойИнформации, ТекущаяДатаСеанса()); + КонецЕсли; + + Если ВнешниеПользователиСсылки.Количество() > 0 Тогда + РезультатВнешниеПользователи = МодульУправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов( + ВнешниеПользователиСсылки, ТипКонтактнойИнформации,, ТекущаяДатаСеанса()); + Если Результат <> Неопределено Тогда + ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(РезультатВнешниеПользователи, Результат); + КонецЕсли; + КонецЕсли; + + Если Результат <> Неопределено Тогда + Результат.Индексы.Добавить("Объект"); + КонецЕсли; + Возврат Результат; + + КонецЕсли; + + Возврат Новый Массив; КонецФункции @@ -2499,4 +2589,24 @@ КонецПроцедуры +// Возвращаемое значение: +// ТаблицаЗначений: +// * ЗадачаСсылка - ЗадачаСсылка +// +Функция НовыеЗадачиПоПредмету() Экспорт + + СписокТипов = Новый Массив; + Для каждого МетаданныеЗадачи Из Метаданные.Задачи Цикл + СписокТипов.Добавить(Тип(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + "%1.%2", "ЗадачаСсылка", МетаданныеЗадачи.Имя))); + КонецЦикла; + + ОписаниеСоставногоТипа = Новый ОписаниеТипов(СписокТипов); + + ЗадачиПоПредмету = Новый ТаблицаЗначений; + ЗадачиПоПредмету.Колонки.Добавить("ЗадачаСсылка", ОписаниеСоставногоТипа); + Возврат ЗадачиПоПредмету; + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl index c8552c3a9..0a494c38a 100644 --- a/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl @@ -164,7 +164,7 @@ |Не удалось настроить варианты отчета из модуля менеджера по причине: |%3'"), "КлючВарианта", "ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, ОтчетМетаданные); КонецПопытки; КонецПроцедуры @@ -179,8 +179,10 @@ // // Возвращаемое значение: // СтрокаДереваЗначений - настройки отчета и настройки "по умолчанию" для вариантов этого отчета, где: -// * Включен - Булево - если Ложь, то вариант отчета не регистрируется в подсистеме. +// * Включен - Булево - если Ложь, то вариант отчета не выводится в панели отчетов. // * ВидимостьПоУмолчанию - Булево - если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. +// * ПоказыватьВПодменюВариантов - Булево - если Ложь, то вариант отчета не отображается в подменю выбора вариантов +// отчета в форме отчета. Используется, когда Включен - Ложь. // * Размещение - Соответствие из КлючИЗначение - настройки размещения варианта отчета в разделах, где: // ** Ключ - ОбъектМетаданных - подсистема, в которой размещается отчет или вариант отчета. // ** Значение - Строка - настройки размещения в подсистеме (группе), с вариантами значений: @@ -206,8 +208,8 @@ // // Задать настройки формы отчета. // // // // Параметры: -// // Форма - ФормаКлиентскогоПриложения, Неопределено - -// // КлючВарианта - Строка, Неопределено - +// // Форма - ФормаКлиентскогоПриложения, Неопределено +// // КлючВарианта - Строка, Неопределено // // Настройки - см. ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию // // // Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт @@ -258,8 +260,10 @@ // // Возвращаемое значение: // СтрокаДереваЗначений - настройки варианта отчета, где: -// * Включен - Булево - если Ложь, то вариант отчета не регистрируется в подсистеме. +// * Включен - Булево - если Ложь, то вариант отчета не выводится в панели отчетов. // * ВидимостьПоУмолчанию - Булево - если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. +// * ПоказыватьВПодменюВариантов - Булево - если Ложь, то вариант отчета не отображается в подменю выбора вариантов +// отчета в форме отчета. Используется, когда Включен - Ложь. // * Наименование - Строка - наименование варианта отчета. // * Описание - Строка - подсказка к варианту отчета. // * Размещение - Соответствие из КлючИЗначение - настройки размещения варианта отчета в разделах, где: @@ -287,8 +291,8 @@ // // Задать настройки формы отчета. // // // // Параметры: -// // Форма - ФормаКлиентскогоПриложения, Неопределено - -// // КлючВарианта - Строка, Неопределено - +// // Форма - ФормаКлиентскогоПриложения, Неопределено +// // КлючВарианта - Строка, Неопределено // // Настройки - см. значение ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию // // // Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт @@ -614,12 +618,13 @@ Ключ, Новый ОписаниеТипов("Строка, ОбъектМетаданных, СправочникСсылка.ВариантыОтчетов")); - КлючиВариантов = Новый Массив; // Итоговый список очищаемых ключей. + КлючиОбъектов = Новый Массив; // Итоговый список очищаемых ключей. // Список ключей может быть заполнен из запроса или извне можно передать один конкретный ключ. Запрос = Новый Запрос( "ВЫБРАТЬ | &ИмяОтчета КАК ИмяОтчета, + | &ЭтоВнешнийОтчет КАК ЭтоВнешнийОтчет, | ВариантыОтчетов.КлючВарианта |ИЗ | Справочник.ВариантыОтчетов КАК ВариантыОтчетов @@ -634,6 +639,8 @@ | ИНАЧЕ ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК СТРОКА(150)) | КОНЕЦ"; + ЭтоВнешнийОтчет = "Ложь"; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); ИмяТаблицыДополнительныеОтчеты = МодульДополнительныеОтчетыИОбработки.ИмяТаблицыДополнительныеОтчеты(); @@ -647,9 +654,17 @@ | ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК %1).ИмяОбъекта | ИНАЧЕ ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК СТРОКА(150)) | КОНЕЦ", ИмяТаблицыДополнительныеОтчеты); + + ЭтоВнешнийОтчет = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ВЫБОР + | КОГДА ТИПЗНАЧЕНИЯ(ВариантыОтчетов.Отчет) = ТИП(%1) + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ", ИмяТаблицыДополнительныеОтчеты); + КонецЕсли; Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИмяОтчета", ИмяОтчета); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ЭтоВнешнийОтчет", ЭтоВнешнийОтчет); Если Ключ = "*" Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", "ТипОтчета = ЗНАЧЕНИЕ(Перечисление.ТипыОтчетов.Внутренний)"); @@ -666,7 +681,9 @@ ИначеЕсли ТипЗнч(Ключ) = Тип("Строка") Тогда - КлючиВариантов.Добавить(Ключ); + КлючОбъекта = "Отчет." + Ключ + "/ТекущиеПользовательскиеНастройки"; + КлючиОбъектов.Добавить(КлючОбъекта); + Иначе ВызватьИсключение НСтр("ru = 'Некорректный тип параметра ""Отчет""'"); КонецЕсли; @@ -675,7 +692,9 @@ Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл - КлючиВариантов.Добавить(Выборка.ИмяОтчета +"/"+ Выборка.КлючВарианта); + ВидОтчета = ?(Выборка.ЭтоВнешнийОтчет, "ВнешнийОтчет.", "Отчет."); + КлючОбъекта = ВидОтчета + Выборка.ИмяОтчета +"/"+ Выборка.КлючВарианта + "/ТекущиеПользовательскиеНастройки"; + КлючиОбъектов.Добавить(КлючОбъекта); КонецЦикла; КонецЕсли; @@ -689,8 +708,7 @@ УстановитьПривилегированныйРежим(Истина); - Для Каждого ПолноеИмяВарианта Из КлючиВариантов Цикл - КлючОбъекта = "Отчет." + ПолноеИмяВарианта + "/ТекущиеПользовательскиеНастройки"; + Для Каждого КлючОбъекта Из КлючиОбъектов Цикл ВыборкаХранилища = ХранилищеСистемныхНастроек.Выбрать(Новый Структура("КлючОбъекта", КлючОбъекта)); ОшибокЧтенияПодряд = 0; @@ -702,9 +720,9 @@ ЭлементВыборкиПолучен = Неопределено; ОшибокЧтенияПодряд = ОшибокЧтенияПодряд + 1; ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, - НСтр("ru = 'В процессе выборки пользовательских настроек отчетов из системного хранилища возникла ошибка:'") + НСтр("ru = 'Не удалось прочитать пользовательские настройки отчетов по причине:'") + Символы.ПС - + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Если ЭлементВыборкиПолучен = Ложь Тогда @@ -794,9 +812,9 @@ ЭлементВыборкиПолучен = Неопределено; ОшибокЧтенияПодряд = ОшибокЧтенияПодряд + 1; ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, - НСтр("ru = 'В процессе выборки вариантов отчетов из стандартного хранилища возникла ошибка:'") + НСтр("ru = 'Не удалось прочитать варианты отчетов из стандартного хранилища по причине:'") + Символы.ПС - + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Если ЭлементВыборкиПолучен = Ложь Тогда @@ -815,7 +833,7 @@ КонецЕсли; // Пропуск не подключенных внутренних отчетов. - ОтчетМетаданные = Метаданные.НайтиПоПолномуИмени(ВыборкаХранилища.КлючОбъекта); // ОбъектМетаданныхОтчет + ОтчетМетаданные = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ВыборкаХранилища.КлючОбъекта); // ОбъектМетаданныхОтчет Если ОтчетМетаданные <> Неопределено Тогда ХранилищеМетаданные = ОтчетМетаданные.ХранилищеВариантов; Если ХранилищеМетаданные = Неопределено Или ХранилищеМетаданные.Имя <> "ХранилищеВариантовОтчетов" Тогда @@ -1390,7 +1408,7 @@ Возврат; КонецЕсли; - МетаданныеОтчета = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОтчета); + МетаданныеОтчета = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОтчета); Если (МетаданныеОтчета <> Неопределено И МетаданныеОтчета.ХранилищеВариантов <> Неопределено) Или ТипЗнч(ХранилищеВариантовОтчетов) <> Тип("СтандартноеХранилищеНастроекМенеджер") Тогда @@ -1440,7 +1458,15 @@ Выборка = Запрос.Выполнить().Выбрать(); Если Не Выборка.Следующий() Тогда - ВызватьИсключение НСтр("ru = 'Недостаточно прав для просмотра.'"); + УстановитьПривилегированныйРежим(Истина); + Выборка = Запрос.Выполнить().Выбрать(); + УстановитьПривилегированныйРежим(Ложь); + Если Выборка.Следующий() Тогда + ТекстОшибки = НСтр("ru = 'Недостаточно прав для просмотра.'"); + Иначе + ТекстОшибки = НСтр("ru = 'Вариант отчета не существует.'"); + КонецЕсли; + ВызватьИсключение ТекстОшибки; КонецЕсли; ЗаполнитьЗначенияСвойств(ПараметрыОткрытия, Выборка); @@ -1737,7 +1763,7 @@ Результат.ДанныеЕщеОбновляются = ПроверитьИспользуемыеТаблицы(ИспользуемыеТаблицы, Ложь); Исключение ТекстОшибки = НСтр("ru = 'Не удалось определить используемые таблицы:'"); - ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ТекстОшибки + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, Результат.СсылкаВарианта); КонецПопытки; @@ -1764,7 +1790,7 @@ Попытка ОтчетОбъект.СкомпоноватьРезультат(Результат.ТабличныйДокумент, Результат.Расшифровка); Исключение - Результат.ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Результат.ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Результат.Успех = Ложь; ЗаписьЖурналаРегистрации( @@ -1772,7 +1798,7 @@ УровеньЖурналаРегистрации.Ошибка, Результат.Метаданные, Результат.СсылкаВарианта, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат Результат; КонецПопытки; @@ -2136,7 +2162,7 @@ Исключение ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось прочитать схему отчета %1: - |%2'"), ОтчетМетаданные.Имя, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + |%2'"), ОтчетМетаданные.Имя, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Предупреждение, ТекстОшибки, ОтчетМетаданные); КонецПопытки; // Чтение настроек вариантов отчета из схемы. @@ -2147,17 +2173,17 @@ Если ОбщегоНазначения.РазделениеВключено() Тогда ШаблонТекстаОшибки = НСтр("ru = 'Не удалось прочитать список вариантов отчета %1 в неразделенном сеансе, |так как его настройки содержат ссылки на разделенные предопределенные значения. - |См. подробнее на ИТС: https://its.1c.ru/bmk/bsp_reports_service_model + |См. подробнее на ИТС: https://its.1c.eu/bmk/bsp_reports_service_mode |%2'"); ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонТекстаОшибки, ОтчетМетаданные.Имя, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ШаблонТекстаОшибки, ОтчетМетаданные.Имя, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Иначе ШаблонТекстаОшибки = НСтр("ru = 'Не удалось прочитать список вариантов отчета %1: |%2'"); ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонТекстаОшибки, ОтчетМетаданные.Имя, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ШаблонТекстаОшибки, ОтчетМетаданные.Имя, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецЕсли; ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Предупреждение, ТекстОшибки, ОтчетМетаданные); @@ -2170,7 +2196,7 @@ Исключение ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось прочитать список вариантов отчета %1 из модуля менеджера: - |%2'"), ОтчетМетаданные.Имя, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + |%2'"), ОтчетМетаданные.Имя, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, ОтчетМетаданные); КонецПопытки; КонецЕсли; @@ -2196,7 +2222,7 @@ Исключение ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось прочитать настройки варианта ""%1"": - |%2'"), ОписаниеВарианта.КлючВарианта, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + |%2'"), ОписаниеВарианта.КлючВарианта, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Предупреждение, ТекстОшибки, ОтчетМетаданные); КонецПопытки; КонецЕсли; @@ -2782,7 +2808,7 @@ Исключение ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось подключить отчет %1:'"), Результат.Метаданные); - ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ТекстОшибки + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, Результат.Метаданные); КонецПопытки; Иначе @@ -2810,7 +2836,7 @@ |ВариантМодифицирован, ПользовательскиеНастройкиМодифицированы"); ЗаполнитьЗначенияСвойств(Результат, Формирование); - Если Результат.ВариантМодифицирован Тогда + Если Результат.ВариантМодифицирован ИЛИ Параметры.ПараметрыИзменены Тогда Результат.Вставить("НастройкиКД", Формирование.НастройкиКД); КонецЕсли; Если Результат.ПользовательскиеНастройкиМодифицированы Тогда @@ -2835,7 +2861,7 @@ ОписаниеВарианта.ОписаниеПолучено = Истина; // Копирование настроек отчета. - ЗаполнитьЗначенияСвойств(ОписаниеВарианта, ОписаниеОтчета, "Включен, ВидимостьПоУмолчанию, ГруппироватьПоОтчету"); + ЗаполнитьЗначенияСвойств(ОписаниеВарианта, ОписаниеОтчета, "Включен, ВидимостьПоУмолчанию, ГруппироватьПоОтчету, ПоказыватьВПодменюВариантов"); Если ОписаниеВарианта.КлючВарианта = ОписаниеОтчета.ОсновнойВариант Тогда // Вариант "по умолчанию". @@ -2945,7 +2971,7 @@ Если Найденные.Количество() > 0 Тогда Конфликт = Найденные[0]; ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка регистрации изменений имени варианта отчета ""%1"": + НСтр("ru = 'Конфликт переименования варианта отчета ""%1"": |Актуальное имя варианта ""%2"" (старое имя ""%3"") |также числится как старое имя ""%4"" (актуальное имя ""%5"").'"), Строка(Изменение.Отчет), @@ -2958,10 +2984,9 @@ Если Найденные.Количество() > 2 Тогда Конфликт = Найденные[1]; ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка регистрации изменений имени варианта отчета ""%1"": + НСтр("ru = 'Конфликт переименования варианта отчета ""%1"": |Старое имя варианта ""%2"" (актуальное имя ""%3"") - |также числится как старое имя - |варианта отчета ""%4"" (актуальное имя ""%5"").'"), + |также числится как старое имя варианта отчета ""%4"" (актуальное имя ""%5"").'"), Строка(Изменение.Отчет), Изменение.СтароеИмяВарианта, Изменение.АктуальноеИмяВарианта, @@ -3431,7 +3456,7 @@ НСтр("ru = 'Варианты отчетов.Обновление служебного пользователя'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, Метаданные.Справочники.Пользователи,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; @@ -3632,7 +3657,7 @@ НСтр("ru = 'Не удалось перестроить индекс поиска для варианта ""%1"" отчета ""%2"". Возможно, отчет неисправен.'"), ВариантОбъект.КлючВарианта, ВариантОбъект.Отчет); ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки + Символы.ПС - + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ВариантОбъект.Ссылка); + + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ВариантОбъект.Ссылка); СписокОшибок.Добавить(ТекстОшибки); ОтменитьТранзакцию(); Продолжить; @@ -3940,7 +3965,7 @@ КонецЕсли; ЗаполнитьЗначенияСвойств(ВариантОбъект, ОписаниеВарианта, - "Отчет, КлючВарианта, Включен, ВидимостьПоУмолчанию, ГруппироватьПоОтчету"); + "Отчет, КлючВарианта, Включен, ВидимостьПоУмолчанию, ГруппироватьПоОтчету, ПоказыватьВПодменюВариантов"); ПоляДляПоиска = ПоляДляПоиска(ВариантОбъект); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда @@ -4021,7 +4046,8 @@ Если ВариантИзБазы.Включен <> ОписаниеВарианта.Включен Или ВариантИзБазы.Описание <> ОписаниеВарианта.Описание Или ВариантИзБазы.КлючЗамеров <> ОписаниеВарианта.КлючЗамеров - Или ВариантИзБазы.ГруппироватьПоОтчету <> ОписаниеВарианта.ГруппироватьПоОтчету Тогда + Или ВариантИзБазы.ГруппироватьПоОтчету <> ОписаниеВарианта.ГруппироватьПоОтчету + Или ВариантИзБазы.ПоказыватьВПодменюВариантов <> ОписаниеВарианта.ПоказыватьВПодменюВариантов Тогда Возврат Истина; КонецЕсли; @@ -4483,8 +4509,8 @@ ЭлементВыборкиПолучен = Неопределено; ОшибокЧтенияПодряд = ОшибокЧтенияПодряд + 1; ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, - НСтр("ru = 'В процессе выборки вариантов отчетов из стандартного хранилища возникла ошибка:'") - + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + НСтр("ru = 'Не удалось прочитать варианты отчетов из стандартного хранилища по причине:'") + + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтарыйВариант.Ссылка); КонецПопытки; @@ -4842,7 +4868,7 @@ НСтр("ru = 'Варианты отчетов.Создание служебного пользователя'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, Метаданные.Справочники.Пользователи,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат Неопределено; КонецПопытки; @@ -4945,7 +4971,7 @@ Функция ДеревоПодсистемСформировать(Форма, ВариантОснование) Экспорт // Пустое дерево без настроек. Прототип = Форма.РеквизитФормыВЗначение("ДеревоПодсистем", Тип("ДеревоЗначений")); // ДеревоЗначений - ДеревоПодсистем = ВариантыОтчетовПовтИсп.ПодсистемыТекущегоПользователя().Скопировать(); + ДеревоПодсистем = ВариантыОтчетовПовтИсп.ПодсистемыТекущегоПользователя().Дерево.Скопировать(); Для Каждого КолонкаПрототипа Из Прототип.Колонки Цикл Если ДеревоПодсистем.Колонки.Найти(КолонкаПрототипа.Имя) = Неопределено Тогда ДеревоПодсистем.Колонки.Добавить(КолонкаПрототипа.Имя, КолонкаПрототипа.ТипЗначения); @@ -5157,7 +5183,7 @@ ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПользователиВарианта.Представление"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит; - ОтборЭлемента.ПравоеЗначение = "[ЭтоТекущийПользователь]"; + ОтборЭлемента.ПравоеЗначение = "[ЭтоАвторВариантаОтчета]"; ШрифтВажнойНадписи = Метаданные.ЭлементыСтиля.ВажнаяНадписьШрифт; Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", ШрифтВажнойНадписи.Значение); @@ -5180,42 +5206,36 @@ Процедура ОпределитьПоведениеСпискаПользователейВариантаОтчета(Форма) Экспорт Элементы = Форма.Элементы; - ПодменюПодбора = Элементы.ПользователиВариантаГруппаПодобрать; // ГруппаФормы - КнопкаПодбораПользователей = Элементы.ПользователиВариантаПодобратьПользователейГруппы; // КнопкаФормы - КнопкаПодбораГруппВнеПользователей = Элементы.ПользователиВариантаПодобратьГруппыВнешнихПользователей; // КнопкаФормы - НастройкаДоступностиРазрешена = Не Элементы.Доступен.ТолькоПросмотр + ПодборДоступен = Не Элементы.Доступен.ТолькоПросмотр И ПравоДоступа("Чтение", Метаданные.Справочники.Пользователи); + ГруппыИспользуются = Форма.ИспользоватьГруппыПользователей Или Форма.ИспользоватьВнешнихПользователей; + + Элементы.ПользователиВариантаПометка.Видимость = Не ГруппыИспользуются; + + Если Не ПодборДоступен Тогда + Элементы.ПользователиВарианта.ТолькоПросмотр = Истина; + ПодменюПодбора.Видимость = Ложь; + Элементы.ПользователиВариантаПодобратьПользователейГруппы.Видимость = Ложь; + Элементы.ПользователиВариантаПодобратьГруппыВнешнихПользователей.Видимость = Ложь; + Элементы.ПользователиВариантаУдалить.Видимость = Ложь; + Элементы.ПользователиВариантаПодобратьПользователей.Видимость = Ложь; + Элементы.ПользователиВариантаКонтекстноеМенюУстановитьФлажки.Видимость = Ложь; + Элементы.ПользователиВариантаКонтекстноеМенюСнятьФлажки.Видимость = Ложь; + Возврат; + КонецЕсли; + ПодменюПодбора.Видимость = Форма.ИспользоватьГруппыПользователей И Форма.ИспользоватьВнешнихПользователей; Элементы.ПользователиВариантаПодобратьПользователей.Видимость = Не ПодменюПодбора.Видимость; - ГруппыИспользуются = Форма.ИспользоватьГруппыПользователей Или Форма.ИспользоватьВнешнихПользователей; - Элементы.ПользователиВариантаУдалить.Видимость = ГруппыИспользуются; - Элементы.ПользователиВарианта.ИзменятьСоставСтрок = ГруппыИспользуются И НастройкаДоступностиРазрешена; + Элементы.ПользователиВарианта.ИзменятьСоставСтрок = ГруппыИспользуются И ПодборДоступен; - Элементы.ПользователиВариантаПометка.Видимость = Не ГруппыИспользуются; Элементы.ПользователиВариантаКонтекстноеМенюУстановитьФлажки.Видимость = Не ГруппыИспользуются; Элементы.ПользователиВариантаКонтекстноеМенюСнятьФлажки.Видимость = Не ГруппыИспользуются; - Элементы.ПользователиВарианта.ТолькоПросмотр = Не НастройкаДоступностиРазрешена; - - Если ПодменюПодбора.Видимость Тогда - ПодменюПодбора.Доступность = НастройкаДоступностиРазрешена; - КнопкаПодбораПользователей.Доступность = НастройкаДоступностиРазрешена; - КнопкаПодбораГруппВнеПользователей.Доступность = НастройкаДоступностиРазрешена; - КонецЕсли; - - Если Элементы.ПользователиВариантаПодобратьПользователей.Видимость Тогда - Элементы.ПользователиВариантаПодобратьПользователей.Доступность = НастройкаДоступностиРазрешена; - КонецЕсли; - - Если Элементы.ПользователиВариантаУдалить.Видимость Тогда - Элементы.ПользователиВариантаУдалить.Доступность = НастройкаДоступностиРазрешена; - КонецЕсли; - КонецПроцедуры // Возвращает ключи пользовательских настроек соответствующего варианта отчета. @@ -5235,7 +5255,7 @@ // - СправочникСсылка.Пользователи - ссылка на пользователя настроек. // * КлючПользовательскойНастройки - Строка - идентификатор пользовательских настроек. // -Функция ПользовательскиеНастройкиВариантаОтчета(ВариантОтчета, Пользователь, КлючНастройки = Неопределено) +Функция ПользовательскиеНастройкиВариантаОтчета(ВариантОтчета, Знач Пользователь, КлючНастройки = Неопределено) Если ТипЗнч(ВариантОтчета) <> Тип("СправочникСсылка.ВариантыОтчетов") Тогда Возврат Неопределено; @@ -5243,55 +5263,33 @@ ПредставлениеВариантОтчета = Строка(ВариантОтчета); - НачатьТранзакцию(); + Если ТипЗнч(Пользователь) = Тип("Массив") Тогда + СписокПользователей = Пользователь; + Иначе + СписокПользователей = Новый Массив; + СписокПользователей.Добавить(Пользователь); + КонецЕсли; - Попытка + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Настройки.* + |ИЗ + | Справочник.ПользовательскиеНастройкиОтчетов КАК Настройки + |ГДЕ + | Настройки.Вариант = &ВариантОтчета + | И (НЕ &КлючНастройкиОпределен + | ИЛИ Настройки.КлючПользовательскойНастройки = &КлючНастройки) + | И Настройки.Пользователь В(&Пользователь) + | + |УПОРЯДОЧИТЬ ПО + | Настройки.ПометкаУдаления"); - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить(Метаданные.Справочники.ПользовательскиеНастройкиОтчетов.ПолноеИмя()); - ЭлементБлокировки.УстановитьЗначение("Вариант", ВариантОтчета); - ЭлементБлокировки.УстановитьЗначение("Пользователь", Пользователь); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; - Блокировка.Заблокировать(); - - Запрос = Новый Запрос( - "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | Настройки.* - |ИЗ - | Справочник.ПользовательскиеНастройкиОтчетов КАК Настройки - |ГДЕ - | Настройки.Вариант = &ВариантОтчета - | И Настройки.Пользователь = &Пользователь - | И (НЕ &КлючНастройкиОпределен - | ИЛИ Настройки.КлючПользовательскойНастройки = &КлючНастройки) - | - |УПОРЯДОЧИТЬ ПО - | Настройки.ПометкаУдаления"); - - Запрос.УстановитьПараметр("ВариантОтчета", ВариантОтчета); - Запрос.УстановитьПараметр("Пользователь", Пользователь); - Запрос.УстановитьПараметр("КлючНастройкиОпределен", КлючНастройки <> Неопределено); - Запрос.УстановитьПараметр("КлючНастройки", КлючНастройки); - - ПользовательскиеНастройки = Запрос.Выполнить().Выгрузить(); - - ЗафиксироватьТранзакцию(); - - Исключение - - ОтменитьТранзакцию(); - - ПользовательскиеНастройки = Неопределено; - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Чтение пользовательских настроек отчета'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,, - ПредставлениеВариантОтчета, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - - ВызватьИсключение; - - КонецПопытки; + Запрос.УстановитьПараметр("ВариантОтчета", ВариантОтчета); + Запрос.УстановитьПараметр("Пользователь", СписокПользователей); + Запрос.УстановитьПараметр("КлючНастройкиОпределен", КлючНастройки <> Неопределено); + Запрос.УстановитьПараметр("КлючНастройки", КлючНастройки); + + ПользовательскиеНастройки = Запрос.Выполнить().Выгрузить(); Возврат ПользовательскиеНастройки; @@ -5299,14 +5297,15 @@ Процедура ВывестиПризнакУведомленияПользователейВариантаОтчета(Признак) Экспорт - Признак.Видимость = Ложь; - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда + Признак.Видимость = Ложь; Возврат; КонецЕсли; МодульОбсуждения = ОбщегоНазначения.ОбщийМодуль("Обсуждения"); - Признак.Видимость = МодульОбсуждения.СистемаВзаимодействийПодключена(); + Если Не МодульОбсуждения.СистемаВзаимодействийПодключена() Тогда + Признак.Видимость = Ложь; + КонецЕсли; КонецПроцедуры @@ -5424,7 +5423,7 @@ ШаблонСообщения = НСтр("ru = 'Не удалось прочитать настройки пользовательского варианта отчета: |%1'"); ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстСообщения, ВариантОбъект.Ссылка); Возврат Ложь; КонецПопытки; @@ -5981,7 +5980,19 @@ Если ЭтоВнешнийОтчет(ОтчетОбъект) Тогда НастройкиОтчета = ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию(); Иначе - ВызватьИсключение; + ИнформацияОбОшибке = ИнформацияОбОшибке(); + МетаданныеОтчета = ОтчетОбъект.Метаданные(); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Отчет ""%1"" (%2) подключен к подсистеме + |""Варианты отчетов"", но при получении настроек возникла следующая ошибка + |(возможно процедура %3 не указана разработчиком отчета или не обновлен кэш вариантов отчетов): + | + |%4'"), + МетаданныеОтчета.Представление(), + МетаданныеОтчета.ПолноеИмя(), + "ОпределитьНастройкиФормы", + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстОшибки; КонецЕсли; КонецПопытки; @@ -6124,7 +6135,7 @@ ЕстьПравоЧтенияАвторов = ПравоДоступа("Чтение", Метаданные.Справочники.Пользователи); ТекущийПользователь = Пользователи.АвторизованныйПользователь(); - ПоказыватьЛичныеВариантыОтчетовДругихАвторов = Пользователи.ЭтоПолноправныйПользователь(); + ПоказыватьЛичныеВариантыОтчетовДругихАвторов = ПолныеПраваНаВарианты(); Если ПараметрыПоиска.Свойство("ТолькоЛичные") Тогда ПоказыватьЛичныеВариантыОтчетовДругихАвторов = ПоказыватьЛичныеВариантыОтчетовДругихАвторов И Не ПараметрыПоиска.ТолькоЛичные; @@ -6508,12 +6519,7 @@ |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗРЕШЕННЫЕ | ВариантыОтчетов.Ссылка КАК Ссылка, - | ВЫБОР - | КОГДА ВариантыОтчетов.Пользовательский - | ИЛИ ЕСТЬNULL(РазмещениеОтчетовКонфигурации.Подсистема, РазмещениеОтчетовРасширений.Подсистема) ЕСТЬ NULL - | ТОГДА РазмещениеОтчетов.Подсистема - | ИНАЧЕ ЕСТЬNULL(РазмещениеОтчетовКонфигурации.Подсистема, РазмещениеОтчетовРасширений.Подсистема) - | КОНЕЦ КАК Подсистема + | ЕСТЬNULL(РазмещениеОтчетов.Подсистема, ЕСТЬNULL(РазмещениеОтчетовКонфигурации.Подсистема, РазмещениеОтчетовРасширений.Подсистема)) КАК Подсистема |ПОМЕСТИТЬ РазмещениеВариантовОтчетов |ИЗ | ВариантыОтчетов КАК ВариантыОтчетов @@ -6765,7 +6771,6 @@ | ВариантыОтчетов.Отчет В (&ОтчетыПользователя) | И (НЕ &ЕстьОтборПоТипамОтчетов | ИЛИ ВариантыОтчетов.ТипОтчета В (&ТипыОтчетов)) - | И НЕ ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы) | И (НЕ ВариантыОтчетов.Пользовательский | ИЛИ &НетОтбораПоПометкеУдаления | ИЛИ НЕ ВариантыОтчетов.ИнтерактивнаяПометкаУдаления) @@ -6777,10 +6782,14 @@ | ИЛИ ВариантыОтчетов.Автор = &ТекущийПользователь) | И ЕСТЬNULL(ДоступныеВариантыОтчетов.Видимость, ИСТИНА) | И (&ЕстьОтборПоКонтексту - | И (ПользовательскиеВариантыОтчетов.Ссылка ЕСТЬ NULL + | И (ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы) + | И (ВариантыКонфигурации.ПоказыватьВПодменюВариантов = ИСТИНА + | ИЛИ ВариантыРасширений.ПоказыватьВПодменюВариантов = ИСТИНА) | ИЛИ НЕ ПользовательскиеВариантыОтчетов.Ссылка ЕСТЬ NULL - | И ВариантыОтчетов.Контекст = &Контекст) - | ИЛИ НЕ &ЕстьОтборПоКонтексту)"; + | И ВариантыОтчетов.Контекст = &Контекст) + | ИЛИ НЕ &ЕстьОтборПоКонтексту + | И НЕ ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы))"; + Иначе @@ -6877,10 +6886,13 @@ | ИЛИ ВариантыОтчетов.Автор = &ТекущийПользователь) | И ЕСТЬNULL(ДоступныеВариантыОтчетов.Видимость, ИСТИНА) | И (&ЕстьОтборПоКонтексту - | И (ПользовательскиеВариантыОтчетов.Ссылка ЕСТЬ NULL + | И (ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы) + | И (ВариантыКонфигурации.ПоказыватьВПодменюВариантов = ИСТИНА + | ИЛИ ВариантыРасширений.ПоказыватьВПодменюВариантов = ИСТИНА) | ИЛИ НЕ ПользовательскиеВариантыОтчетов.Ссылка ЕСТЬ NULL - | И ВариантыОтчетов.Контекст = &Контекст) - | ИЛИ НЕ &ЕстьОтборПоКонтексту)"; + | И ВариантыОтчетов.Контекст = &Контекст) + | ИЛИ НЕ &ЕстьОтборПоКонтексту + | И НЕ ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы))"; КонецЕсли; @@ -8174,18 +8186,14 @@ // ** Ключ - Строка // ** Значение - ПользовательскиеНастройкиКомпоновкиДанных // -Функция СвойстваВариантовОтчетовИзФайлов(ОписаниеФайлов) Экспорт +Функция ОбновитьВариантыОтчетовИзФайлов(ОписаниеФайлов) Экспорт ОписаниеВариантовОтчетов = Новый Массив; Для Каждого ОписаниеФайла Из ОписаниеФайлов Цикл ОписаниеВариантаОтчета = ОписаниеВариантаОтчета(ОписаниеФайла); - - ВариантОтчетаОснование = ВариантОтчетаОснование( - ОписаниеВариантаОтчета.ИмяОтчета, ОписаниеВариантаОтчета.КлючВарианта); - - Ссылка = ВариантОтчетаПоОписанию(ОписаниеВариантаОтчета, ВариантОтчетаОснование); + Ссылка = ОбновитьВариантОтчетаПоОписанию(ОписаниеВариантаОтчета); // @skip-check query-in-loop - По-объектная запись данных. ОписаниеВариантаОтчета.Вставить("Ссылка", Ссылка); ОписаниеВариантовОтчетов.Добавить(ОписаниеВариантаОтчета); @@ -8205,13 +8213,11 @@ // Возвращаемое значение: // см. ОписаниеВариантаОтчета // -Функция СвойстваВариантаОтчетаИзФайла(ОписаниеФайла, ВариантОтчетаОснование) Экспорт +Функция ОбновитьВариантОтчетаИзФайла(ОписаниеФайла, ВариантОтчетаОснование) Экспорт ОписаниеВариантаОтчета = ОписаниеВариантаОтчета(ОписаниеФайла); - - Ссылка = ВариантОтчетаПоОписанию(ОписаниеВариантаОтчета, ВариантОтчетаОснование); + Ссылка = ОбновитьВариантОтчетаПоОписанию(ОписаниеВариантаОтчета, ВариантОтчетаОснование); ОписаниеВариантаОтчета.Вставить("Ссылка", Ссылка); - Возврат ОписаниеВариантаОтчета; КонецФункции @@ -8219,7 +8225,7 @@ // Параметры: // ОписаниеФайла - Структура: // * Хранение - Строка -// * Имя - Строка +// * Имя - Строка // // Возвращаемое значение: // Структура: @@ -8236,12 +8242,12 @@ // * ХранилищеПользовательскихНастроек - Соответствие из КлючИЗначение // * Ключ - Строка // * Значение - ПользовательскиеНастройкиКомпоновкиДанных -// * Ссылка - см. ВариантОтчетаПоОписанию +// * Ссылка - СправочникСсылка.ВариантыОтчетов // Функция ОписаниеВариантаОтчета(ОписаниеФайла) ИмяКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ФайловаяСистема.СоздатьВременныйКаталог()); - ИмяФайлаАрхива = ПолучитьИмяВременногоФайла("zip"); // АПК:441 Временные файлы удаляются процедурой УдалитьФайлыОписанияВариантаОтчета; + ИмяФайлаАрхива = ПолучитьИмяВременногоФайла("zip"); // АПК:441 Временные файлы удаляются процедурой УдалитьФайлыОписанияВариантаОтчета ДвоичныеДанные = ПолучитьИзВременногоХранилища(ОписаниеФайла.Хранение); // ДвоичныеДанные ДвоичныеДанные.Записать(ИмяФайлаАрхива); @@ -8249,7 +8255,7 @@ Архив = Новый ЧтениеZipФайла(ИмяФайлаАрхива); Архив.ИзвлечьВсе(ИмяКаталога); - ОписаниеВариантаОтчета = ОписаниеНастроекВариантаОтчета(ИмяКаталога); + ОписаниеВариантаОтчета = ПрочитатьНастройкиВариантаОтчета(ИмяКаталога); Если ЗначениеЗаполнено(ОписаниеВариантаОтчета.ОписаниеОшибки) Тогда @@ -8282,11 +8288,11 @@ // ИмяКаталога - Строка // // Возвращаемое значение: -// см. ОписаниеНастроекВариантаОтчетаПоУмолчанию +// см. ОписаниеНастроекВариантаОтчета // -Функция ОписаниеНастроекВариантаОтчета(ИмяКаталога) +Функция ПрочитатьНастройкиВариантаОтчета(ИмяКаталога) - ОписаниеНастроек = ОписаниеНастроекВариантаОтчетаПоУмолчанию(); + ОписаниеНастроек = ОписаниеНастроекВариантаОтчета(); #Область ЧтениеФайлаОписанияНастроек @@ -8436,7 +8442,7 @@ // * Ключ - Строка - ключ пользовательских настроек. // * Значение - ПользовательскиеНастройкиКомпоновкиДанных - настройки. // -Функция ОписаниеНастроекВариантаОтчетаПоУмолчанию() +Функция ОписаниеНастроекВариантаОтчета() ОписаниеНастроек = Новый Структура; @@ -8472,70 +8478,6 @@ КонецФункции -// Параметры: -// ИмяОтчета - Строка -// КлючВарианта - Строка -// -// Возвращаемое значение: -// - СправочникСсылка.ВариантыОтчетов -// - Неопределено -// -Функция ВариантОтчетаОснование(ИмяОтчета, КлючВарианта) - - Запрос = Новый Запрос( - "ВЫБРАТЬ - | Отчеты.Ссылка КАК Ссылка - |ПОМЕСТИТЬ Отчеты - |ИЗ - | Справочник.ИдентификаторыОбъектовМетаданных КАК Отчеты - |ГДЕ - | Отчеты.ПолноеИмя = &ИмяОтчета - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ - | Отчеты.Ссылка КАК Ссылка - |ИЗ - | Справочник.ИдентификаторыОбъектовРасширений КАК Отчеты - |ГДЕ - | Отчеты.ПолноеИмя = &ИмяОтчета - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ НЕОПРЕДЕЛЕНО - |; - | - |ВЫБРАТЬ - | ВариантыОтчетов.Ссылка - |ИЗ - | Отчеты КАК Отчеты - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов КАК ВариантыОтчетов - | ПО ВариантыОтчетов.Отчет = Отчеты.Ссылка - |ГДЕ - | ВариантыОтчетов.КлючВарианта = &КлючВарианта"); - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - - ОписаниеИмениОтчета = СтрРазделить(ИмяОтчета, "."); - ИмяОбъекта = ?(ОписаниеИмениОтчета.Количество() > 1, ОписаниеИмениОтчета[1], ИмяОтчета); - - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - ТекстЗапросаДополнительныхОтчетов = МодульДополнительныеОтчетыИОбработки.ТекстЗапросаДополнительныхОтчетовПоИмениОбъекта(); - - Запрос.Текст = СтрЗаменить(Запрос.Текст, "ВЫБРАТЬ НЕОПРЕДЕЛЕНО", ТекстЗапросаДополнительныхОтчетов); - Запрос.УстановитьПараметр("ИмяОбъекта", ИмяОбъекта); - - КонецЕсли; - - Запрос.УстановитьПараметр("ИмяОтчета", ИмяОтчета); - Запрос.УстановитьПараметр("КлючВарианта", КлючВарианта); - - Выборка = Запрос.Выполнить().Выбрать(); - - Возврат ?(Выборка.Следующий(), Выборка.Ссылка, Неопределено); - -КонецФункции - // Параметры: // ОписаниеВариантаОтчета - Структура: // * ОписаниеОшибки - Строка @@ -8552,10 +8494,10 @@ // Возвращаемое значение: // СправочникСсылка.ВариантыОтчетов // -Функция ВариантОтчетаПоОписанию(ОписаниеВариантаОтчета, ВариантОтчетаОснование) +Функция ОбновитьВариантОтчетаПоОписанию(Знач ОписаниеВариантаОтчета, Знач ВариантОтчетаОснование = Неопределено) Если Не ВариантыОтчетовПовтИсп.ПравоДобавления() Тогда - ВызватьИсключение НСтр("ru = 'Недостаточно прав для выполнения операции'"); + ВызватьИсключение НСтр("ru = 'Недостаточно прав для выполнения операции.'"); КонецЕсли; ИнформацияОбОтчете = ИнформацияОбОтчете(ОписаниеВариантаОтчета.ИмяОтчета, Истина); @@ -8569,16 +8511,11 @@ Блокировка.Заблокировать(); ВариантОтчета = ПользовательскийВариантОтчета(ИнформацияОбОтчете.Отчет, ОписаниеВариантаОтчета.КлючВарианта, Автор); - Если ЗначениеЗаполнено(ВариантОтчета.Ссылка) Тогда - #Область ОбновлениеСуществующегоВариантаОтчета - Объект = ВариантОтчета.Ссылка.ПолучитьОбъект(); Объект.Настройки = Новый ХранилищеЗначения(ОписаниеВариантаОтчета.Настройки); - ПользователиВарианта = Новый СписокЗначений; - РегистрыСведений.НастройкиВариантовОтчетов.ПрочитатьНастройкиДоступностиВариантаОтчета( Объект.Ссылка, ПользователиВарианта); @@ -8588,12 +8525,8 @@ Объект.ДополнительныеСвойства.Вставить("ПользователиВарианта", ПользователиВарианта); - #КонецОбласти - Иначе - #Область СозданиеНовогоВариантаОтчета - Наименование = ДоступноеНаименованиеВариантаОтчета( ИнформацияОбОтчете.Отчет, ОписаниеВариантаОтчета.ПредставлениеВарианта); @@ -8601,6 +8534,10 @@ ОписаниеВариантаОтчета.КлючВарианта = Строка(Новый УникальныйИдентификатор()); КонецЕсли; + Если ВариантОтчетаОснование = Неопределено Тогда + ВариантОтчетаОснование = ВариантОтчета(ИнформацияОбОтчете.Отчет, ОписаниеВариантаОтчета.КлючВарианта); + КонецЕсли; + ДанныеЗаполнения = Новый Структура; ДанныеЗаполнения.Вставить("Отчет", ИнформацияОбОтчете.Отчет); ДанныеЗаполнения.Вставить("КлючВарианта", ОписаниеВариантаОтчета.КлючВарианта); @@ -8612,20 +8549,15 @@ Объект = Справочники.ВариантыОтчетов.СоздатьЭлемент(); Объект.Заполнить(ДанныеЗаполнения); - #КонецОбласти - КонецЕсли; Объект.Записать(); - СохранитьПользовательскиеНастройкиИзФайла(Объект.Ссылка, ОписаниеВариантаОтчета); ЗафиксироватьТранзакцию(); Исключение - ОтменитьТранзакцию(); ВызватьИсключение; - КонецПопытки; Возврат Объект.Ссылка; @@ -8884,8 +8816,8 @@ НормализоватьШаблонОписанияНастроек(ШаблонОписанияНастроек, ТекущийПользователь); + СписокПользователей = Новый Массив; Для Каждого СвойстваПользователя Из СвойстваПользователей.Действительных Цикл - ОписаниеНастроек = Новый ОписаниеНастроек; ЗаполнитьЗначенияСвойств(ОписаниеНастроек, ШаблонОписанияНастроек); ОписаниеНастроек.Пользователь = СвойстваПользователя.Имя; @@ -8897,10 +8829,17 @@ ОписаниеНастроек, ОписаниеНастроек.Пользователь); - ОбновитьСлужебнуюИнформациюПользовательскихНастроек(СвойстваПользователя.Ссылка, ШаблонОписанияНастроек); - + СписокПользователей.Добавить(СвойстваПользователя.Ссылка); КонецЦикла; + НастройкиПользователей = ПользовательскиеНастройкиВариантаОтчета( + ШаблонОписанияНастроек.ВариантОтчета, СписокПользователей, ШаблонОписанияНастроек.КлючНастроек); + + Для Каждого Пользователь Из СписокПользователей Цикл + НастройкиПользователя = НастройкиПользователей.НайтиСтроки(Новый Структура("Пользователь", Пользователь)); + ОбновитьСлужебнуюИнформациюПользовательскихНастроек(Пользователь, ШаблонОписанияНастроек, НастройкиПользователя); + КонецЦикла; + ОповеститьПользователейНастроекОтчета(СвойстваПользователей.Действительных, ШаблонОписанияНастроек); КонецПроцедуры @@ -9031,7 +8970,8 @@ КонецЦикла; - Если ВыбранныеПользователи.Количество() = 0 Тогда + Если ВыбранныеПользователи.Количество() = 0 + Или Не ПолныеПраваНаВарианты() Тогда Возврат; КонецЕсли; @@ -9133,13 +9073,9 @@ КонецПроцедуры -Процедура ОбновитьСлужебнуюИнформациюПользовательскихНастроек(Пользователь, ОписаниеНастроек) +Процедура ОбновитьСлужебнуюИнформациюПользовательскихНастроек(Пользователь, ОписаниеНастроек, Настройки) - Элементы = ПользовательскиеНастройкиВариантаОтчета( - ОписаниеНастроек.ВариантОтчета, Пользователь, ОписаниеНастроек.КлючНастроек); - - Если Элементы = Неопределено - Или Элементы.Количество() = 0 Тогда + Если Не ЗначениеЗаполнено(Настройки) Тогда Объект = Справочники.ПользовательскиеНастройкиОтчетов.СоздатьЭлемент(); Объект.Наименование = ОписаниеНастроек.Представление; @@ -9151,7 +9087,7 @@ КонецЕсли; - Элемент = Элементы[0]; + Элемент = Настройки[0]; Если Не Элемент.ПометкаУдаления И Элемент.Наименование = ОписаниеНастроек.Представление Тогда @@ -9159,14 +9095,10 @@ Возврат; КонецЕсли; - Объект = Элемент.Ссылка.ПолучитьОбъект(); // СправочникОбъект.ВариантыОтчетов + Объект = Элемент.Ссылка.ПолучитьОбъект(); // СправочникОбъект.ПользовательскиеНастройкиВариантов Объект.Наименование = ОписаниеНастроек.Представление; - - Если Элемент.ПометкаУдаления Тогда - Объект.УстановитьПометкуУдаления(Ложь); - Иначе - Объект.Записать(); // АПК:1327 - КонецЕсли; + Объект.ПометкаУдаления = Ложь; + Объект.Записать(); // АПК:1327 КонецПроцедуры @@ -9232,7 +9164,7 @@ НСтр("ru = 'Варианты отчетов.Оповещение о предоставлении доступа к настройкам отчета'", КодОсновногоЯзыка), УровеньЖурналаРегистрации.Ошибка,, ПредставлениеВариантаОтчета, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; @@ -9274,6 +9206,7 @@ Результат.Колонки.Добавить("ОписаниеПолучено", ОписаниеПризнака); Результат.Колонки.Добавить("Включен", ОписаниеПризнака); Результат.Колонки.Добавить("ВидимостьПоУмолчанию", ОписаниеПризнака); + Результат.Колонки.Добавить("ПоказыватьВПодменюВариантов", ОписаниеПризнака); Результат.Колонки.Добавить("Наименование", ОписаниеТиповСтрока()); Результат.Колонки.Добавить("Описание", ОписаниеТиповСтрока()); Результат.Колонки.Добавить("Размещение", ОписаниеСоответствия); diff --git a/SSL/src/CommonModules/ВариантыОтчетовВызовСервера/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовВызовСервера/Module.bsl index c462daff2..4981085b0 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовВызовСервера/Module.bsl @@ -74,9 +74,9 @@ // Возвращаемое значение: // Массив из Структура // -Функция СвойстваВариантовОтчетовИзФайлов(ОписаниеФайлов) Экспорт +Функция ОбновитьВариантыОтчетовИзФайлов(ОписаниеФайлов) Экспорт - Возврат ВариантыОтчетов.СвойстваВариантовОтчетовИзФайлов(ОписаниеФайлов); + Возврат ВариантыОтчетов.ОбновитьВариантыОтчетовИзФайлов(ОписаниеФайлов); КонецФункции @@ -87,11 +87,11 @@ // ВариантОтчетаОснование - СправочникСсылка.ВариантыОтчетов // // Возвращаемое значение: -// см. ВариантыОтчетов.СвойстваВариантаОтчетаИзФайла +// см. ВариантыОтчетов.ОбновитьВариантОтчетаИзФайла // -Функция СвойстваВариантаОтчетаИзФайла(ОписаниеФайла, ВариантОтчетаОснование) Экспорт +Функция ОбновитьВариантОтчетаИзФайла(ОписаниеФайла, ВариантОтчетаОснование) Экспорт - Возврат ВариантыОтчетов.СвойстваВариантаОтчетаИзФайла(ОписаниеФайла, ВариантОтчетаОснование); + Возврат ВариантыОтчетов.ОбновитьВариантОтчетаИзФайла(ОписаниеФайла, ВариантОтчетаОснование); КонецФункции diff --git a/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl index 3e4686951..6dd57431c 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl @@ -167,7 +167,7 @@ НСтр("ru = 'Варианты отчетов.Ошибка подключения обработчика действия сообщения'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), "Ошибка", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; КонецПроцедуры @@ -179,9 +179,8 @@ // Процедура ПоказатьНастройкиОтчета(Вариант) Экспорт ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ПоказатьКарточку", Истина); ПараметрыФормы.Вставить("Ключ", Вариант); - ОткрытьФорму("Справочник.ВариантыОтчетов.ФормаОбъекта", ПараметрыФормы); + ОткрытьФорму("Справочник.ВариантыОтчетов.Форма.ФормаЭлемента", ПараметрыФормы); КонецПроцедуры // Открывает диалог настройки размещения нескольких вариантов в разделах. @@ -214,7 +213,7 @@ НСтр("ru = 'Варианты отчетов.Ошибка обработки действия сообщения'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), "Ошибка", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры @@ -427,17 +426,19 @@ Процедура ПользователиВариантаОтчетаОбработкаВыбора(Форма, ВыбранныеЗначения, СтандартнаяОбработка) Экспорт - Если ТипЗнч(ВыбранныеЗначения) <> Тип("Массив") - Или ВыбранныеЗначения.Количество() = 0 Тогда - + Если ТипЗнч(ВыбранныеЗначения) <> Тип("Массив") Тогда Возврат; - КонецЕсли; СтандартнаяОбработка = Ложь; ПользователиВарианта = Форма.ПользователиВарианта; + Если Не ЗначениеЗаполнено(ВыбранныеЗначения) Тогда + ПользователиВарианта.Очистить(); + Возврат; + КонецЕсли; + ОбщаяГруппаПользователей = ПредопределенноеЗначение("Справочник.ГруппыПользователей.ВсеПользователи"); ОбщаяГруппаВнешниеПользователи = ПредопределенноеЗначение("Справочник.ГруппыВнешнихПользователей.ВсеВнешниеПользователи"); @@ -547,6 +548,10 @@ Возврат БиблиотекаКартинок.СостояниеПользователя02; + ИначеЕсли ТипЗнч(Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда + + Возврат БиблиотекаКартинок.СостояниеПользователя08; + ИначеЕсли ТипЗнч(Пользователь) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда Возврат БиблиотекаКартинок.СостояниеПользователя10; @@ -565,13 +570,12 @@ Возврат; КонецЕсли; - АвторизованныйПользователь = ПользователиКлиент.АвторизованныйПользователь(); ПользователиВарианта = Форма.ПользователиВарианта; ПользователиВарианта.Очистить(); ПользователиВарианта.Добавить( - АвторизованныйПользователь, - "[ЭтоТекущийПользователь]",, - КартинкаПользователяВариантаОтчета(АвторизованныйПользователь)); + Объект.Автор, + "[ЭтоАвторВариантаОтчета]",, + КартинкаПользователяВариантаОтчета(Объект.Автор)); КонецПроцедуры @@ -590,67 +594,80 @@ ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); ЦветНеактивныхЗначений = ПараметрыКлиента.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет; - - Если Не СбрасыватьПризнакИспользования Тогда - - Элементы.ПользователиВарианта.ЦветТекста = ?(Объект.ТолькоДляАвтора, ЦветНеактивныхЗначений, Новый Цвет); - Возврат; - - КонецЕсли; + ВариантАвтор = Объект.Автор; КоличествоПомеченных = 0; - Для Каждого Строка Из Форма.ПользователиВарианта Цикл - - КоличествоПомеченных = КоличествоПомеченных + Булево(Строка.Пометка); - + Если Строка.Значение = ВариантАвтор Тогда + ПризнакАвтора = "[ЭтоАвторВариантаОтчета]"; + Иначе + ПризнакАвтора = ""; + КоличествоПомеченных = КоличествоПомеченных + Булево(Строка.Пометка); + КонецЕсли; + Если Строка.Представление <> ПризнакАвтора Тогда + Строка.Представление = ПризнакАвтора; + КонецЕсли; КонецЦикла; - Объект.ТолькоДляАвтора = (КоличествоПомеченных = 0); - Форма.Доступен = ?(Объект.ТолькоДляАвтора, "ТолькоДляАвтора", "УказаннымПользователям"); + Если СбрасыватьПризнакИспользования Тогда + Если КоличествоПомеченных > 0 Тогда + Объект.ТолькоДляАвтора = Ложь; + КонецЕсли; + Форма.Доступен = ?(Объект.ТолькоДляАвтора, "Автору", "Всем"); + КонецЕсли; - Элементы.ПользователиВарианта.ЦветТекста = ?(Форма.Объект.ТолькоДляАвтора, ЦветНеактивныхЗначений, Новый Цвет); + Элементы.ПользователиВарианта.ЦветТекста = ?(Объект.ТолькоДляАвтора, ЦветНеактивныхЗначений, Новый Цвет); КонецПроцедуры #КонецОбласти -//////////////////////////////////////////////////////////////////////////////// -// Обмен настройками вариантов отчетов - #Область ОбновлениеВариантаОтчетаИзФайла -Функция ИмяСобытияОбновленияВариантовОтчетовИзФайлов() Экспорт +Функция ИмяСобытияОбновленияВариантовОтчетовИзФайлов() Экспорт Возврат "ОбновитьВариантыОтчетовИзФайлов"; КонецФункции +// Параметры: +// СвойстваВариантаОтчета - см. СвойстваВариантаОтчетаОснования +// ИдентификаторФормы - УникальныйИдентификатор +// +Процедура ОбновитьВариантОтчетаИзФайлов(СвойстваВариантаОтчета, ИдентификаторФормы) Экспорт + + ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла(); + ПараметрыЗагрузки.Диалог.Фильтр = НСтр("ru = 'Сведения об отчете (*.zip)|*.zip'"); + ПараметрыЗагрузки.ИдентификаторФормы = ИдентификаторФормы; + + Обработчик = Новый ОписаниеОповещения("ОбновитьВариантыОтчетовИзФайловЗавершение", ЭтотОбъект, + СвойстваВариантаОтчета); + ФайловаяСистемаКлиент.ЗагрузитьФайлы(Обработчик, ПараметрыЗагрузки); + +КонецПроцедуры + // Параметры: // ОписаниеФайлов - Массив из Структура: // * Хранение - Строка // * Имя - Строка // СвойстваВариантаОтчетаОснования - см. СвойстваВариантаОтчетаОснования // -Процедура ОбновитьВариантыОтчетовИзФайлов(ОписаниеФайлов, СвойстваВариантаОтчетаОснования) Экспорт // АПК:299 является обработчиком оповещения (см. процедуру ОбновитьВариантОтчетаИзФайла модуля формы списка справочника ВариантыОтчетов). +Процедура ОбновитьВариантыОтчетовИзФайловЗавершение(ОписаниеФайлов, СвойстваВариантаОтчетаОснования) Экспорт Если ТипЗнч(ОписаниеФайлов) <> Тип("Массив") Тогда Возврат; КонецЕсли; Если ОписаниеФайлов.Количество() = 1 Тогда - ОбновитьВариантОтчетаИзФайла(ОписаниеФайлов[0], СвойстваВариантаОтчетаОснования); Возврат; - КонецЕсли; - СвойстваВариантовОтчетов = ВариантыОтчетовВызовСервера.СвойстваВариантовОтчетовИзФайлов(ОписаниеФайлов); - + СвойстваВариантовОтчетов = ВариантыОтчетовВызовСервера.ОбновитьВариантыОтчетовИзФайлов(ОписаниеФайлов); ТекстУведомления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Варианты отчетов (%1) загружены из файла'"), СвойстваВариантовОтчетов.Количество()); + НСтр("ru = 'Загружены из файла: %1'"), СвойстваВариантовОтчетов.Количество()); - ПоказатьОповещениеПользователя(ТекстУведомления); + ПоказатьОповещениеПользователя(НСтр("ru = 'Отчеты обновлены'"),, ТекстУведомления); Оповестить(ИмяСобытияОбновленияВариантовОтчетовИзФайлов(), СвойстваВариантовОтчетов); КонецПроцедуры @@ -661,7 +678,7 @@ // * Имя - Строка // СвойстваВариантаОтчетаОснования - см. СвойстваВариантаОтчетаОснования // -Процедура ОбновитьВариантОтчетаИзФайла(ОписаниеФайла, СвойстваВариантаОтчетаОснования) Экспорт +Процедура ОбновитьВариантОтчетаИзФайла(ОписаниеФайла, СвойстваВариантаОтчетаОснования) Если ОписаниеФайла = Неопределено Тогда Возврат; @@ -671,26 +688,29 @@ СвойстваВариантаОтчетаОснования = СвойстваВариантаОтчетаОснования(); КонецЕсли; - СвойстваВариантаОтчета = ВариантыОтчетовВызовСервера.СвойстваВариантаОтчетаИзФайла( - ОписаниеФайла, СвойстваВариантаОтчетаОснования.Ссылка); - + СвойстваВариантаОтчета = ВариантыОтчетовВызовСервера.ОбновитьВариантОтчетаИзФайла(ОписаниеФайла, + СвойстваВариантаОтчетаОснования.Ссылка); Если СвойстваВариантаОтчетаОснования.ИмяОтчета = СвойстваВариантаОтчета.ИмяОтчета Тогда ПараметрыОбновленияФормы = Новый Структура("КлючВарианта"); ЗаполнитьЗначенияСвойств(ПараметрыОбновленияФормы, СвойстваВариантаОтчета); ОбновитьОткрытыеФормы(ПараметрыОбновленияФормы); - ПоказатьОповещениеПользователя(НСтр("ru = 'Вариант отчета обновлен из файла'")); + ПоказатьОповещениеПользователя(НСтр("ru = 'Отчет обновлен из файла'"), + ПолучитьНавигационнуюСсылку(СвойстваВариантаОтчета.Ссылка), + СвойстваВариантаОтчета.ПредставлениеВарианта); ИначеЕсли СвойстваВариантаОтчетаОснования.ПредставлениеВарианта = СвойстваВариантаОтчета.ПредставлениеВарианта Тогда ОткрытьФормуОтчета(Неопределено, СвойстваВариантаОтчета.Ссылка); - ПоказатьОповещениеПользователя(НСтр("ru = 'Вариант отчета найден и обновлен из файла'")); + ПоказатьОповещениеПользователя(НСтр("ru = 'Отчет обновлен из файла'"), + ПолучитьНавигационнуюСсылку(СвойстваВариантаОтчета.Ссылка), + СвойстваВариантаОтчета.ПредставлениеВарианта); Иначе Обработчик = Новый ОписаниеОповещения( - "ОткрытьФормуВыбранногоВариантаОтчета", ВариантыОтчетовКлиент, СвойстваВариантаОтчета.Ссылка); + "ОткрытьФормуВыбранногоВариантаОтчета", ЭтотОбъект, СвойстваВариантаОтчета.Ссылка); ШаблонТекстаВопроса = НСтр("ru = 'Выбраны настройки варианта отчета ""%1"", |которые не совпадают с ""%2"". @@ -709,22 +729,6 @@ КонецПроцедуры -// Конструктор описания свойств варианта отчета. -// -// Возвращаемое значение: -// Структура: -// * Ссылка - СправочникСсылка.ВариантыОтчетов -// * ИмяОтчета - Строка -// * ПредставлениеВарианта - Строка -// -Функция СвойстваВариантаОтчетаОснования() Экспорт - - Возврат Новый Структура("Ссылка, ИмяОтчета, ПредставлениеВарианта"); - -КонецФункции - -// Обработчик оповещения. -// // Параметры: // Ответ - КодВозвратаДиалога // ВариантОтчета - СправочникСсылка.ВариантыОтчетов @@ -737,6 +741,18 @@ КонецПроцедуры +// Возвращаемое значение: +// Структура: +// * Ссылка - СправочникСсылка.ВариантыОтчетов +// * ИмяОтчета - Строка +// * ПредставлениеВарианта - Строка +// +Функция СвойстваВариантаОтчетаОснования() Экспорт + + Возврат Новый Структура("Ссылка, ИмяОтчета, ПредставлениеВарианта"); + +КонецФункции + #КонецОбласти #Область ОбменПользовательскимиНастройками diff --git a/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl index a8dd78673..bfb8c95c8 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl @@ -109,8 +109,10 @@ // * ИспользуетСКД - Булево - признак использования в отчете основной СКД. // * КлючВарианта - Строка - идентификатор варианта отчета. // * ОписаниеПолучено - Булево - признак того, что описание строки уже получено. -// * Включен - Булево - если Ложь, то вариант отчета не регистрируется в подсистеме +// * Включен - Булево - если Ложь, то вариант отчета не выводится в панели отчетов. // * ВидимостьПоУмолчанию - Булево - если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. +// * ПоказыватьВПодменюВариантов - Булево - если Ложь, то вариант отчета не отображается в подменю выбора вариантов +// отчета в форме отчета. Используется, когда Включен - Ложь. // * Наименование - Строка - наименование варианта отчета. // * Описание - Строка - пояснение назначения отчета. // * Размещение - Соответствие из КлючИЗначение - настройки размещения варианта отчета в разделах (подсистемах), где: @@ -137,9 +139,9 @@ // // Задать настройки формы отчета. // // // // Параметры: -// // Форма - ФормаКлиентскогоПриложения, Неопределено - -// // КлючВарианта - Строка, Неопределено - -// // Настройки - см. значение ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию +// // Форма - ФормаКлиентскогоПриложения, Неопределено +// // КлючВарианта - Строка, Неопределено +// // Настройки - см. ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию // // // Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт // // Код процедуры. diff --git a/SSL/src/CommonModules/ВариантыОтчетовПовтИсп/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовПовтИсп/Module.bsl index 0e6f18396..3ca6fcac4 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовПовтИсп/Module.bsl @@ -65,13 +65,15 @@ // Формирует дерево подсистем, доступных текущему пользователю. // // Возвращаемое значение: -// ДеревоЗначений: -// * РазделСсылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных - ссылка раздела. -// * Ссылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных - ссылка подсистемы. -// * Имя - Строка - имя подсистемы. -// * ПолноеИмя - Строка - полное имя подсистемы. -// * Представление - Строка - представление подсистемы. -// * Приоритет - Строка - приоритет подсистемы. +// ФиксированнаяСтруктура: +// * Дерево - ДеревоЗначений: +// ** РазделСсылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных - ссылка раздела. +// ** Ссылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных - ссылка подсистемы. +// ** Имя - Строка - имя подсистемы. +// ** ПолноеИмя - Строка - полное имя подсистемы. +// ** Представление - Строка - представление подсистемы. +// ** Приоритет - Строка - приоритет подсистемы. +// * Список - ФиксированныйМассив из СправочникСсылка.ИдентификаторыОбъектовМетаданных // Функция ПодсистемыТекущегоПользователя() Экспорт @@ -157,6 +159,7 @@ КонецЕсли; КонецЦикла; + Список = Новый Массив; СсылкиПодсистем = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ПолныеИменаПодсистем); Для Каждого КлючИЗначение Из СсылкиПодсистем Цикл СтрокаДерева = ПолныеИменаСтрокДерева[КлючИЗначение.Ключ]; @@ -170,11 +173,16 @@ СтрокаДерева.Ссылка = КлючИЗначение.Значение; СтрокаДерева.РазделСсылка = СсылкиПодсистем[СтрокаДерева.РазделПолноеИмя]; КонецЕсли; + Список.Добавить(КлючИЗначение.Значение); КонецЦикла; ПолныеИменаСтрокДерева.Очистить(); - Возврат Результат; + Результаты = Новый Структура; + Результаты.Вставить("Дерево", Результат); + Результаты.Вставить("Список", Новый ФиксированныйМассив(Список)); + + Возврат Новый ФиксированнаяСтруктура(Результаты); КонецФункции diff --git a/SSL/src/CommonModules/ВариантыОтчетовСлужебный/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовСлужебный/Module.bsl index b6155613b..fe337d2f3 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовСлужебный/Module.bsl @@ -18,7 +18,8 @@ // * ИндексПолей - см. ИндексПолейСтруктурыОтчета // * ОсновныеПоля - Массив из см. ОсновныеПоляОтчета // * ИтоговыеНастройки - НастройкиКомпоновкиДанных - см. синтакс-помощник КомпоновщикНастроекКомпоновкиДанных.ПолучитьНастройки(); -// * КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных +// * КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных - без выполнения метода РазвернутьАвтоПоля. +// * КомпоновщикНастроекБезАвтоПолей - КомпоновщикНастроекКомпоновкиДанных - после выполнения метода РазвернутьАвтоПоля. // * МакетыОписаны - Булево // * ВремяФормирования - Число // @@ -33,6 +34,7 @@ СвойстваРезультата.Вставить("ОсновныеПоля", Новый Массив); СвойстваРезультата.Вставить("ИтоговыеНастройки", Неопределено); СвойстваРезультата.Вставить("КомпоновщикНастроек", Неопределено); + СвойстваРезультата.Вставить("КомпоновщикНастроекБезАвтоПолей", Неопределено); СвойстваРезультата.Вставить("МакетыОписаны", Ложь); СвойстваРезультата.Вставить("ВремяФормирования", 0); @@ -66,8 +68,6 @@ РазрезСвойствЗаголовков = СтандартныйРазрезСвойствЗаголовковОтчета(); - ВерсияРежимаСовместимости = СтандартныеПодсистемыСервер.ВерсияРежимаСовместимости(); - Для НомерСтроки = 1 По РезультатОтчета.ВысотаТаблицы Цикл НачальнаяЯчейка = РезультатОтчета.Область(НомерСтроки, 1); @@ -88,9 +88,8 @@ Продолжить; КонецЕсли; - Если НЕ ОбщегоНазначения.ЭтоМобильныйКлиент() ИЛИ ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияРежимаСовместимости, "8.3.19.0") >= 0 - И Форма.ПолучитьТекущийРежимОтображенияРезультата() = РежимОтображенияРезультатаОтчета.Обычный Тогда - Ячейка.ГиперСсылка = Истина; + Если Форма.ПолучитьТекущийРежимОтображенияРезультата() = РежимОтображенияРезультатаОтчета.Обычный Тогда + Ячейка.ГиперСсылка = Истина; КонецЕсли; ЗаполнитьЗначенияСвойств(РазрезСвойствЗаголовков.Добавить(), Ячейка); @@ -120,6 +119,17 @@ КонецПроцедуры +// См. МультиязычностьСервер.ОбъектыСТЧПредставления +Процедура ПриОпределенииОбъектовСТабличнойЧастьюПредставление(Объекты) Экспорт + Объекты.Добавить("Справочник.ВариантыОтчетов"); + Объекты.Добавить("Справочник.ПредопределенныеВариантыОтчетовРасширений"); +КонецПроцедуры + +// См. МультиязычностьСервер.ОбъектыСТЧПредставления +Процедура ПриОпределенииОбъектовСТабличнойЧастьюПредставлениеОбщиеДанные(Объекты) Экспорт + Объекты.Добавить("Справочник.ПредопределенныеВариантыОтчетов"); +КонецПроцедуры + #Область ПредставлениеНастроекКомпоновкиДанных Функция ПредставлениеЭлементовСтруктуры(ЭлементыСтруктуры) Экспорт @@ -397,16 +407,20 @@ НастройкиОтчета = Форма.НастройкиОтчета; СвойстваРезультата = НастройкиОтчета.СвойстваРезультата; - ИтоговыеНастройки = Форма.Отчет.КомпоновщикНастроек.ПолучитьНастройки(); + Настройки = Форма.Отчет.КомпоновщикНастроек.ПолучитьНастройки(); - КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; - ОтчетыСервер.ИнициализироватьКомпоновщикНастроек(КомпоновщикНастроек, НастройкиОтчета.АдресСхемы); - КомпоновщикНастроек.ЗагрузитьНастройки(ИтоговыеНастройки); + КомпоновщикНастроек = КопияКомпоновщикаНастроек(Форма.Отчет.КомпоновщикНастроек, + НастройкиОтчета.АдресСхемы, Настройки); - СкопироватьДополнительныеСвойстваНастроек(КомпоновщикНастроек, Форма.Отчет.КомпоновщикНастроек); + КомпоновщикНастроек2 = КопияКомпоновщикаНастроек(Форма.Отчет.КомпоновщикНастроек, + НастройкиОтчета.АдресСхемы, Настройки); - СвойстваРезультата.ИтоговыеНастройки = ИтоговыеНастройки; + КомпоновщикНастроек2.РазвернутьАвтоПоля(); + Настройки2 = КомпоновщикНастроек2.ПолучитьНастройки(); + + СвойстваРезультата.ИтоговыеНастройки = Настройки; СвойстваРезультата.КомпоновщикНастроек = КомпоновщикНастроек; + СвойстваРезультата.КомпоновщикНастроекБезАвтоПолей = КомпоновщикНастроек2; СвойстваРезультата.РолиПолей = РолиПолейОтчета(НастройкиОтчета.АдресСхемы); ИндексСтруктурыОтчета = Неопределено; @@ -418,10 +432,10 @@ Если ИндексСтруктурыОтчета = Неопределено Или Форма.ВариантМодифицирован Тогда - ИндексСтруктурыОтчета = ИндексСтруктурыОтчетаБезКонтекста(КомпоновщикНастроек, ИтоговыеНастройки); + ИндексСтруктурыОтчета = ИндексСтруктурыОтчетаБезКонтекста(Настройки, Настройки2); ОпределитьРолиПолей(ИндексСтруктурыОтчета, СвойстваРезультата.РолиПолей); - ОпределитьПоляФормулы(НастройкиОтчета.АдресСхемы, ИтоговыеНастройки, ИндексСтруктурыОтчета); + ОпределитьПоляФормулы(НастройкиОтчета.АдресСхемы, Настройки, ИндексСтруктурыОтчета); УстановитьИдентификаторыИндексаСтруктурыОтчета(ИндексСтруктурыОтчета); ОпределитьДоступныеДействияПолейОтчета(ИндексСтруктурыОтчета); @@ -441,18 +455,23 @@ КонецФункции -Функция ИндексСтруктурыОтчетаБезКонтекста(КомпоновщикНастроек, ИтоговыеНастройки = Неопределено) Экспорт +Функция КопияКомпоновщикаНастроек(ТекущийКомпоновщикНастроек, АдресСхемы, ИтоговыеНастройки) - Если ИтоговыеНастройки = Неопределено Тогда - - КомпоновщикНастроек.РазвернутьАвтоПоля(); - ИтоговыеНастройки = КомпоновщикНастроек.ПолучитьНастройки(); - - КонецЕсли; + КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; + ОтчетыСервер.ИнициализироватьКомпоновщикНастроек(КомпоновщикНастроек, АдресСхемы); + КомпоновщикНастроек.ЗагрузитьНастройки(ИтоговыеНастройки); + + СкопироватьДополнительныеСвойстваНастроек(КомпоновщикНастроек, ТекущийКомпоновщикНастроек); + + Возврат КомпоновщикНастроек; + +КонецФункции + +Функция ИндексСтруктурыОтчетаБезКонтекста(Настройки, Настройки2) Экспорт ИндексСтруктурыОтчета = НовыйИндексСтруктурыОтчета(); - ИндексироватьРазделыОтчета(ИтоговыеНастройки, ИтоговыеНастройки, ИндексСтруктурыОтчета); - ИндексироватьГруппировкиОтчета(ИтоговыеНастройки, ИндексСтруктурыОтчета); + ИндексироватьРазделыОтчета(Настройки2, Настройки2, ИндексСтруктурыОтчета); + ИндексироватьГруппировкиОтчета(Настройки, Настройки2, ИндексСтруктурыОтчета); УдалитьНеидентифицированныеПоля(ИндексСтруктурыОтчета); УточнитьПорядокРазделов(ИндексСтруктурыОтчета); @@ -509,84 +528,106 @@ КонецПроцедуры -Процедура ИндексироватьГруппировкиОтчета(ИтоговыеНастройки, ИндексСтруктурыОтчета) +// Параметры: +// ИндексРазделовОтчетов - см. НовыйИндексСтруктурыОтчета +// +// Возвращаемое значение: +// Структура: +// * ИндексСтруктурыОтчета - см. НовыйИндексСтруктурыОтчета +// * ПорядокГруппировки - Число +// * ПорядокПоля - Число +// * ПоляСортировки - Соответствие +// +Функция НовыйКонтекстИндексацииГруппировкиОтчета(ИндексСтруктурыОтчета) + + Контекст = Новый Структура; + Контекст.Вставить("ИндексСтруктурыОтчета", ИндексСтруктурыОтчета); + Контекст.Вставить("ПорядокГруппировки", 0); + Контекст.Вставить("ПорядокПоля", 0); + Контекст.Вставить("ПоляСортировки", Новый Соответствие); + + Возврат Контекст; + +КонецФункции + +Процедура ИндексироватьГруппировкиОтчета(ИтоговыеНастройки, ИтоговыеНастройки2, ИндексСтруктурыОтчета) ИндексРазделовОтчетов = ИндексСтруктурыОтчета.Скопировать(); Для Каждого ИндексРаздела Из ИндексРазделовОтчетов Цикл Настройки = ИтоговыеНастройки.ПолучитьОбъектПоИдентификатору(ИндексРаздела.ИдентификаторНастроек); + Настройки2 = ИтоговыеНастройки2.ПолучитьОбъектПоИдентификатору(ИндексРаздела.ИдентификаторНастроек); Раздел = Настройки.ПолучитьОбъектПоИдентификатору(ИндексРаздела.ИдентификаторРаздела); // ГруппировкаКомпоновкиДанных, ТаблицаКомпоновкиДанных + Раздел2 = Настройки2.ПолучитьОбъектПоИдентификатору(ИндексРаздела.ИдентификаторРаздела); // ГруппировкаКомпоновкиДанных, ТаблицаКомпоновкиДанных - Если ТипЗнч(Раздел) = Тип("ДиаграммаКомпоновкиДанных") Тогда + Если ТипЗнч(Раздел2) = Тип("ДиаграммаКомпоновкиДанных") Тогда Продолжить; КонецЕсли; - ПорядокГруппировки = 0; - ПорядокПоля = 0; + Контекст = НовыйКонтекстИндексацииГруппировкиОтчета(ИндексСтруктурыОтчета); - ПоляСортировки = Новый Соответствие; - ПоляСортировки(Настройки, Настройки, ПоляСортировки); + ПоляСортировки(Настройки, Настройки, Контекст.ПоляСортировки); - Если ТипЗнч(Раздел) = Тип("ТаблицаКомпоновкиДанных") Тогда - - ИндексироватьГруппировкиРазделаОтчета( - ИндексСтруктурыОтчета, ИндексРаздела, Настройки, Раздел.Строки, ПорядокГруппировки, ПорядокПоля, ПоляСортировки); - - ИндексироватьГруппировкиРазделаОтчета( - ИндексСтруктурыОтчета, ИндексРаздела, Настройки, Раздел.Колонки, ПорядокГруппировки, ПорядокПоля, ПоляСортировки); + Если ТипЗнч(Раздел2) = Тип("ТаблицаКомпоновкиДанных") Тогда + ИндексироватьГруппировкиРазделаОтчета(Контекст, ИндексРаздела, + Настройки, Раздел.Строки, Настройки2, Раздел2.Строки); + ИндексироватьГруппировкиРазделаОтчета(Контекст, ИндексРаздела, + Настройки, Раздел.Колонки, Настройки2, Раздел2.Колонки); Иначе + ИндексГруппировки = ИндексГруппировкиОтчета(Контекст, ИндексРаздела, Настройки2, Раздел2); - ИндексГруппировки = ИндексГруппировкиОтчета( - ИндексСтруктурыОтчета, ИндексРаздела, Настройки, Раздел, ПорядокГруппировки); + ПоляСортировки(Раздел, Настройки, Контекст.ПоляСортировки); - ПоляСортировки(Раздел, Настройки, ПоляСортировки); - - ИндексироватьПоляГруппировкиОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, Раздел, ПорядокПоля, ПоляСортировки); - ИндексироватьГруппировкиРазделаОтчета( - ИндексСтруктурыОтчета, ИндексРаздела, Настройки, Раздел.Структура, ПорядокГруппировки, ПорядокПоля, ПоляСортировки); + ИндексироватьПоляГруппировкиОтчета(Контекст, ИндексГруппировки, + Настройки, Раздел, Настройки2, Раздел2); + ИндексироватьГруппировкиРазделаОтчета(Контекст, ИндексРаздела, + Настройки, Раздел.Структура, Настройки2, Раздел2.Структура); КонецЕсли; КонецЦикла; КонецПроцедуры -Процедура ИндексироватьГруппировкиРазделаОтчета(ИндексСтруктурыОтчета, ИндексРаздела, Настройки, - Группировки, ПорядокГруппировки, ПорядокПоля, ПоляСортировки = Неопределено) +Процедура ИндексироватьГруппировкиРазделаОтчета(Контекст, ИндексРаздела, + Настройки, Группировки, Настройки2, Группировки2) - Для Каждого Элемент Из Группировки Цикл + Для НомерГруппировки = 1 По Группировки2.Количество() Цикл + Элемент = Группировки[НомерГруппировки - 1]; + Элемент2 = Группировки2[НомерГруппировки - 1]; - Если Не Элемент.Использование Тогда + Если Не Элемент2.Использование Тогда Продолжить; КонецЕсли; - ТипЭлемента = ТипЗнч(Элемент); + ТипЭлемента = ТипЗнч(Элемент2); Если ТипЭлемента = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда - ИндексироватьГруппировкиРазделаОтчета( - ИндексСтруктурыОтчета, ИндексРаздела, Элемент.Настройки, Элемент.Настройки.Структура, ПорядокГруппировки, ПорядокПоля, ПоляСортировки); + ИндексироватьГруппировкиРазделаОтчета(Контекст, ИндексРаздела, + Элемент.Настройки, Элемент.Настройки.Структура, Элемент2.Настройки, Элемент2.Настройки.Структура); ИначеЕсли ТипЭлемента = Тип("ТаблицаКомпоновкиДанных") Тогда - ИндексироватьГруппировкиРазделаОтчета( - ИндексСтруктурыОтчета, ИндексРаздела, Настройки, Элемент.Строки, ПорядокГруппировки, ПорядокПоля, ПоляСортировки); + ИндексироватьГруппировкиРазделаОтчета(Контекст, ИндексРаздела, + Настройки, Элемент.Строки, Настройки2, Элемент2.Строки); - ИндексироватьГруппировкиРазделаОтчета( - ИндексСтруктурыОтчета, ИндексРаздела, Настройки, Элемент.Колонки, ПорядокГруппировки, ПорядокПоля, ПоляСортировки); + ИндексироватьГруппировкиРазделаОтчета(Контекст, ИндексРаздела, + Настройки, Элемент.Колонки, Настройки2, Элемент2.Колонки); ИначеЕсли ТипЭлемента <> Тип("ДиаграммаКомпоновкиДанных") Тогда - ПоляСортировки(Элемент, Настройки, ПоляСортировки); + ПоляСортировки(Элемент, Настройки, Контекст.ПоляСортировки); - ИндексГруппировки = ИндексГруппировкиОтчета( - ИндексСтруктурыОтчета, ИндексРаздела, Настройки, Элемент, ПорядокГруппировки); + ИндексГруппировки = ИндексГруппировкиОтчета(Контекст, ИндексРаздела, Настройки2, Элемент2); - ИндексироватьПоляГруппировкиОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, Элемент, ПорядокПоля, ПоляСортировки); - ИндексироватьГруппировкиРазделаОтчета( - ИндексСтруктурыОтчета, ИндексРаздела, Настройки, Элемент.Структура, ПорядокГруппировки, ПорядокПоля, ПоляСортировки); + ИндексироватьПоляГруппировкиОтчета(Контекст, ИндексГруппировки, + Настройки, Элемент, Настройки2, Элемент2); + + ИндексироватьГруппировкиРазделаОтчета(Контекст, ИндексРаздела, + Настройки, Элемент.Структура, Настройки2, Элемент2.Структура); КонецЕсли; @@ -634,7 +675,12 @@ Если ТипЗнч(Элемент) = Тип("АвтоЭлементПорядкаКомпоновкиДанных") И ТипГруппировки <> Тип("НастройкиКомпоновкиДанных") Тогда - ПоляСортировки(Настройки, Настройки, ПоляСортировки, Ложь); + Для Каждого ЭлементПоля Из Группировка.ПоляГруппировки.Элементы Цикл + Если ТипЗнч(ЭлементПоля) = Тип("ПолеГруппировкиКомпоновкиДанных") + И ПоляСортировки.Получить(ЭлементПоля.Поле) = Неопределено Тогда + ПоляСортировки.Вставить(ЭлементПоля.Поле, НаправлениеСортировкиКомпоновкиДанных.Возр); + КонецЕсли; + КонецЦикла; ИначеЕсли ТипЗнч(Элемент) <> Тип("АвтоЭлементПорядкаКомпоновкиДанных") И (Замещать Или ПоляСортировки[Элемент.Поле] = Неопределено) Тогда @@ -649,15 +695,14 @@ КонецФункции -Функция ИндексГруппировкиОтчета(ИндексСтруктурыОтчета, ИндексРаздела, Настройки, - Группировка, ПорядокГруппировки) +Функция ИндексГруппировкиОтчета(Контекст, ИндексРаздела, Настройки, Группировка) - ПорядокГруппировки = ПорядокГруппировки + 1; + Контекст.ПорядокГруппировки = Контекст.ПорядокГруппировки + 1; - ИндексГруппировки = ИндексСтруктурыОтчета.Добавить(); + ИндексГруппировки = Контекст.ИндексСтруктурыОтчета.Добавить(); ЗаполнитьЗначенияСвойств(ИндексГруппировки, ИндексРаздела); - ИндексГруппировки.ПорядокГруппировки = ПорядокГруппировки; + ИндексГруппировки.ПорядокГруппировки = Контекст.ПорядокГруппировки; ИндексГруппировки.ИдентификаторГруппировки = Настройки.ПолучитьИдентификаторПоОбъекту(Группировка); ИндексГруппировки.ИмяГруппировки = Группировка.Имя; ИндексГруппировки.ПредставлениеГруппировки = ПредставлениеПолейГруппировки(Группировка); @@ -699,15 +744,15 @@ КонецФункции -Процедура ИндексироватьПоляГруппировкиОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, - Группировка, ПорядокПоля, ПоляСортировки) +Процедура ИндексироватьПоляГруппировкиОтчета(Контекст, ИндексГруппировки, + Настройки, Группировка, Настройки2, Группировка2) ИспользуемыеПоляГруппировки = Новый Соответствие; ИспользуетсяАвтоПоле = ИспользуетсяАвтоПоле(Группировка.Выбор); ИспользуемыеНастройки = ИспользуемыеНастройкиГруппировкиОтчета(Настройки, Группировка); - ПоляГруппировки = Группировка.ПоляГруппировки; + ПоляГруппировки = Группировка2.ПоляГруппировки; Для Каждого Элемент Из ПоляГруппировки.Элементы Цикл @@ -723,15 +768,15 @@ И Не ВариантыОтчетовСлужебныйКлиентСервер.ПолеСодержитсяВГруппировкеОтчета(Группировка.Выбор, Элемент.Поле) И Не ВариантыОтчетовСлужебныйКлиентСервер.ПолеСодержитсяВГруппировкеОтчета(ИспользуемыеНастройки.Выбор, Элемент.Поле) Тогда - ДобавитьПолеОтчетаВИндекс(ИндексСтруктурыОтчета, ИндексГруппировки, ПоляГруппировки, - Элемент, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки); + ДобавитьПолеОтчетаВИндекс(Контекст, + ИндексГруппировки, ПоляГруппировки, Элемент, ИспользуемыеПоляГруппировки); КонецЕсли; КонецЦикла; - ИндексироватьВыбранныеПоляГруппировкиОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, - Группировка, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки); + ИндексироватьВыбранныеПоляГруппировкиОтчета(Контекст, + ИндексГруппировки, Настройки2, Группировка2, ИспользуемыеПоляГруппировки); КонецПроцедуры @@ -751,8 +796,8 @@ КонецФункции -Процедура ИндексироватьВыбранныеПоляГруппировкиОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, - Группировка, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки, Поля = Неопределено, Родитель = Неопределено) // АПК:134 реализация сложной логики для формирования индекса структуры отчета. +Процедура ИндексироватьВыбранныеПоляГруппировкиОтчета(Контекст, ИндексГруппировки, Настройки, + Группировка, ИспользуемыеПоляГруппировки, Поля = Неопределено, Родитель = Неопределено) Если Поля = Неопределено Тогда Поля = Группировка.Выбор; @@ -766,30 +811,18 @@ Если ТипЗнч(Элемент) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") Тогда - ИндексироватьВыбранныеПоляНастроекОтчета( - ИндексСтруктурыОтчета, - ИндексГруппировки, - Настройки, - Группировка, - ПорядокПоля, - ПоляСортировки, - ИспользуемыеПоляГруппировки); + ИндексироватьВыбранныеПоляНастроекОтчета(Контекст, + ИндексГруппировки, Настройки, Группировка, ИспользуемыеПоляГруппировки); ИначеЕсли ТипЗнч(Элемент) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда - ИндексироватьВыбранныеПоляГруппировкиОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, - Группировка, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки, Элемент, Родитель); + ИндексироватьВыбранныеПоляГруппировкиОтчета(Контекст, ИндексГруппировки, Настройки, + Группировка, ИспользуемыеПоляГруппировки, Элемент, Родитель); ИначеЕсли РазрешеноИспользоватьПолеВГруппировке(Группировка, Элемент.Поле) Тогда - ДобавитьПолеОтчетаВИндекс( - ИндексСтруктурыОтчета, - ИндексГруппировки, - Родитель, - Элемент, - ПорядокПоля, - ПоляСортировки, - ИспользуемыеПоляГруппировки); + ДобавитьПолеОтчетаВИндекс(Контекст, + ИндексГруппировки, Родитель, Элемент, ИспользуемыеПоляГруппировки); КонецЕсли; @@ -797,8 +830,8 @@ КонецПроцедуры -Процедура ИндексироватьВыбранныеПоляНастроекОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, - Группировка, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки, Поля = Неопределено, Родитель = Неопределено) // АПК:134 реализация сложной логики для формирования индекса структуры отчета. +Процедура ИндексироватьВыбранныеПоляНастроекОтчета(Контекст, ИндексГруппировки, Настройки, + Группировка, ИспользуемыеПоляГруппировки, Поля = Неопределено, Родитель = Неопределено) ИспользуемыеНастройки = ИспользуемыеНастройкиГруппировкиОтчета(Настройки, Группировка); @@ -810,7 +843,7 @@ Родитель = ИспользуемыеНастройки.Выбор; КонецЕсли; - ПоляСортировки(Группировка, Настройки, ПоляСортировки); + ПоляСортировки(Группировка, Настройки, Контекст.ПоляСортировки); Для Каждого Элемент Из Поля.Элементы Цикл @@ -818,14 +851,14 @@ Если ТипЭлемента = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда - ИндексироватьВыбранныеПоляНастроекОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, - Группировка, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки, Элемент, Родитель); + ИндексироватьВыбранныеПоляНастроекОтчета(Контекст, ИндексГруппировки, Настройки, + Группировка, ИспользуемыеПоляГруппировки, Элемент, Родитель); ИначеЕсли ТипЭлемента <> Тип("АвтоВыбранноеПолеКомпоновкиДанных") И РазрешеноИспользоватьПолеВГруппировке(Группировка, Элемент.Поле) И Не ВариантыОтчетовСлужебныйКлиентСервер.ПолеСодержитсяВГруппировкеОтчета(Группировка.Выбор, Элемент.Поле, Ложь) Тогда - ДобавитьПолеОтчетаВИндекс(ИндексСтруктурыОтчета, ИндексГруппировки, Родитель, Элемент, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки); + ДобавитьПолеОтчетаВИндекс(Контекст, ИндексГруппировки, Родитель, Элемент, ИспользуемыеПоляГруппировки); КонецЕсли; @@ -884,7 +917,7 @@ КонецФункции -Процедура ДобавитьПолеОтчетаВИндекс(ИндексСтруктурыОтчета, ИндексГруппировки, Родитель, Поле, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки) +Процедура ДобавитьПолеОтчетаВИндекс(Контекст, ИндексГруппировки, Родитель, Поле, ИспользуемыеПоляГруппировки) Если Не Поле.Использование Тогда Возврат; @@ -902,7 +935,7 @@ ЗаполнитьЗначенияСвойств(Поиск, ИндексГруппировки); Поиск.Поле = Поле.Поле; - НайденныеИндексыПоля = ИндексСтруктурыОтчета.НайтиСтроки(Поиск); + НайденныеИндексыПоля = Контекст.ИндексСтруктурыОтчета.НайтиСтроки(Поиск); Если НайденныеИндексыПоля.Количество() > 0 Тогда @@ -910,18 +943,18 @@ Иначе - ПорядокПоля = ПорядокПоля + 1; + Контекст.ПорядокПоля = Контекст.ПорядокПоля + 1; - ИндексПоля = ИндексСтруктурыОтчета.Добавить(); + ИндексПоля = Контекст.ИндексСтруктурыОтчета.Добавить(); ЗаполнитьЗначенияСвойств(ИндексПоля, ИндексГруппировки); - ИндексПоля.ПорядокПоля = ПорядокПоля; + ИндексПоля.ПорядокПоля = Контекст.ПорядокПоля; КонецЕсли; ЗаполнитьЗначенияСвойств(ИндексПоля, ОписаниеПоля); ИндексПоля.ПредставлениеПоля = ВРег(ИндексПоля.ПредставлениеПоля); - ИндексПоля.НаправлениеСортировки = ПоляСортировки[Поле.Поле]; + ИндексПоля.НаправлениеСортировки = Контекст.ПоляСортировки[Поле.Поле]; ИндексПоля.ПолеСортируется = (ИндексПоля.НаправлениеСортировки <> Неопределено); Если ИндексПоля.ТипЗначения.СодержитТип(Тип("ТаблицаЗначений")) Тогда @@ -1150,6 +1183,7 @@ Группировки = ПоляГруппировок.Скопировать(); Группировки.Свернуть("ПорядокГруппировки"); ПорядокГруппировок = Группировки.ВыгрузитьКолонку("ПорядокГруппировки"); + ПоляГруппировкиВыше = Неопределено; Для Каждого ПорядокГруппировки Из ПорядокГруппировок Цикл @@ -1157,11 +1191,12 @@ ПоляГруппировки = ПоляГруппировок.Скопировать(ПоискПолейГруппировки); ПоляГруппировки.Сортировать("ПорядокПоля"); - ПоискПолейГруппировки.ПорядокГруппировки = ПорядокГруппировки - 1; - ПоляГруппировкиВыше = ПоляГруппировок.Скопировать(ПоискПолейГруппировки); - - ПоискПолейГруппировки.ПорядокГруппировки = ПорядокГруппировки + 1; - ПоляГруппировкиНиже = ПоляГруппировок.Скопировать(ПоискПолейГруппировки); + ПоляГруппировкиНиже = Неопределено; + Индекс = ПорядокГруппировок.Найти(ПорядокГруппировки); + Если Индекс + 1 < ПорядокГруппировок.Количество() Тогда + ПоискПолейГруппировки.ПорядокГруппировки = ПорядокГруппировок[Индекс + 1]; + ПоляГруппировкиНиже = ПоляГруппировок.Скопировать(ПоискПолейГруппировки); + КонецЕсли; Для Каждого ПолеГруппировки Из ПоляГруппировки Цикл @@ -1179,12 +1214,14 @@ И ПорядокРаздела = 1 И Не ЭтоРесурс И Индекс.СодержитРодительскиеГруппировки + И ПоляГруппировкиВыше <> Неопределено И ПоляГруппировкиВыше.Найти(Не ПолеГруппировки.Период, "Период") = Неопределено; Индекс.ПереместитьПолеНиже = Не ЭтоПолеГруппировкиКолонки И ПорядокРаздела = 1 И Не ЭтоРесурс И Индекс.СодержитДочерниеГруппировки + И ПоляГруппировкиНиже <> Неопределено И ПоляГруппировкиНиже.Найти(Не ПолеГруппировки.Период, "Период") = Неопределено; Если Не ЭтоПолеГруппировкиКолонки @@ -1204,7 +1241,8 @@ Индекс.ОформитьЕще = Не ЭтоПолеГруппировкиКолонки; КонецЦикла; - + + ПоляГруппировкиВыше = ПоляГруппировки; КонецЦикла; КонецПроцедуры @@ -1559,8 +1597,6 @@ ГраницаТекущегоРаздела = 0; ОбработанныеПоля = Новый Соответствие; - ВерсияРежимаСовместимости = СтандартныеПодсистемыСервер.ВерсияРежимаСовместимости(); - Для Каждого Граница Из ГраницыРазделов Цикл Для Каждого Запись Из РазрезСвойствЗаголовков Цикл @@ -1587,8 +1623,7 @@ СвойстваЗаголовка.ОформитьОтрицательные = ЭтоЧисло; СвойстваЗаголовка.ОформитьПоложительные = ЭтоЧисло; - Если НЕ ОбщегоНазначения.ЭтоМобильныйКлиент() ИЛИ ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияРежимаСовместимости, "8.3.19.0") >= 0 - И Форма.ПолучитьТекущийРежимОтображенияРезультата() = РежимОтображенияРезультатаОтчета.Обычный Тогда + Если Форма.ПолучитьТекущийРежимОтображенияРезультата() = РежимОтображенияРезультатаОтчета.Обычный Тогда ВставитьИндикаторСортировки(ИндексПоля, СвойстваЗаголовка, РезультатОтчета.Область(Запись.Имя)); КонецЕсли; @@ -2522,6 +2557,19 @@ КонецПроцедуры +Функция СвойстваОтбораОбработчикаРасшифровкиПоДетальнымЗаписям() Экспорт + + СвойстваЭлементаОтбора = Новый Структура; + СвойстваЭлементаОтбора.Вставить("Значение", Неопределено); + СвойстваЭлементаОтбора.Вставить("ВидСравнения", ВидСравненияКомпоновкиДанных.Равно); + СвойстваЭлементаОтбора.Вставить("РежимОтображения", РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный); + СвойстваЭлементаОтбора.Вставить("Представление", ""); + СвойстваЭлементаОтбора.Вставить("ИдентификаторПользовательскойНастройки", ""); + + Возврат СвойстваЭлементаОтбора; + +КонецФункции + #КонецОбласти #КонецОбласти diff --git a/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиент/Module.bsl index 365d4ae1f..3b6787ada 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиент/Module.bsl @@ -207,6 +207,7 @@ СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + Настройки2 = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек, Истина); ВыбранноеПоле = Настройки.ДоступныеПоляГруппировок.НайтиПоле(СвойстваЗаголовка.Поле); Если ВыбранноеПоле = Неопределено Тогда @@ -214,11 +215,14 @@ КонецЕсли; Раздел = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); + Раздел2 = Настройки2.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); Если ТипЗнч(Раздел) = Тип("ТаблицаКомпоновкиДанных") Тогда Группировки = Раздел.Строки; + Группировки2 = Раздел2.Строки; Иначе Группировки = Раздел.Родитель.Структура; + Группировки2 = Раздел2.Родитель.Структура; КонецЕсли; ПеремещаемыеГруппировки = Новый Массив; @@ -227,7 +231,7 @@ ПеремещаемыеГруппировки.Добавить(Элемент); КонецЦикла; - ДетальныеЗаписи = ДетальныеЗаписи(Группировки); + ДетальныеЗаписи = ДетальныеЗаписи(Группировки2); Если ТипЗнч(Группировки) = Тип("КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных") Тогда НоваяГруппировка = Группировки.Вставить(0, Тип("ГруппировкаКомпоновкиДанных")); // ГруппировкаКомпоновкиДанных @@ -341,6 +345,10 @@ СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); КонецЕсли; + Если СвойстваЗаголовка = Неопределено Тогда + Возврат; + КонецЕсли; + ДействиеКоманды = ДействиеКоманды(Команда); ПараметрыРаскраски = ПараметрыРаскраскиРазделаОтчета(ДействиеКоманды); @@ -382,7 +390,7 @@ РаскраситьРазделОтчета(Форма, ПараметрыРаскраски, СвойстваЗаголовка); - ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда), СвойстваЗаголовка.Текст); + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды, СвойстваЗаголовка.Текст); КонецПроцедуры @@ -392,6 +400,10 @@ СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); КонецЕсли; + Если СвойстваЗаголовка = Неопределено Тогда + Возврат; + КонецЕсли; + ДействиеКоманды = ДействиеКоманды(Команда); ПараметрыРаскраски = ПараметрыРаскраскиРазделаОтчета(ДействиеКоманды); @@ -433,7 +445,7 @@ РаскраситьРазделОтчета(Форма, ПараметрыРаскраски, СвойстваЗаголовка); - ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда), СвойстваЗаголовка.Текст); + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды, СвойстваЗаголовка.Текст); КонецПроцедуры @@ -452,6 +464,10 @@ СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); КонецЕсли; + Если СвойстваЗаголовка = Неопределено Тогда + Возврат; + КонецЕсли; + Если ВысотаСтроки = Неопределено Тогда ПараметрыВысотыСтроки = ПараметрыРазмераПоляОтчета(Форма, СвойстваЗаголовка); @@ -496,6 +512,10 @@ СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); КонецЕсли; + Если СвойстваЗаголовка = Неопределено Тогда + Возврат; + КонецЕсли; + ПараметрыШириныКолонки = ПараметрыРазмераПоляОтчета(Форма, СвойстваЗаголовка, "Ширина"); Если ШиринаКолонки = Неопределено Тогда @@ -532,8 +552,6 @@ КонецЕсли; ИспользуемыеНастройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); - - Раздел = ИспользуемыеНастройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); Группировка = ИспользуемыеНастройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); Если ТипЗнч(Группировка) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда @@ -560,13 +578,8 @@ ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("Форма", Форма); - ПараметрыОбработчика.Вставить("Настройки", КомпоновщикНастроек.Настройки); - ПараметрыОбработчика.Вставить("Раздел", Раздел); - ПараметрыОбработчика.Вставить("Группировка", Группировка); - ПараметрыОбработчика.Вставить("Поле", СвойстваЗаголовка.Поле); - ПараметрыОбработчика.Вставить("Ресурс", СвойстваЗаголовка.Ресурс); - ПараметрыОбработчика.Вставить("Действие", ДействиеКоманды(Команда)); - ПараметрыОбработчика.Вставить("КоличествоРазделов", СвойстваЗаголовка.КоличествоРазделов); + ПараметрыОбработчика.Вставить("Команда", Команда); + ПараметрыОбработчика.Вставить("СвойстваЗаголовка", СвойстваЗаголовка); Обработчик = Новый ОписаниеОповещения("ПослеИзмененияЭлементаОформленияГруппировкиОтчета", ЭтотОбъект, ПараметрыОбработчика); @@ -624,12 +637,12 @@ Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); Фильтры = ВариантыОтчетовСлужебныйКлиентСервер.ФильтрыРазделаОтчета(Настройки, СвойстваЗаголовка, ЭтоГруппировка); - Фильтр = ВариантыОтчетовСлужебныйКлиентСервер.ФильтрРазделаОтчета(Фильтры, СвойстваЗаголовка.Поле); + Фильтр = ВариантыОтчетовСлужебныйКлиентСервер.ФильтрРазделаОтчета(Фильтры, СвойстваЗаголовка.Поле,, Истина); Если Фильтр = Неопределено Тогда Фильтры = ВариантыОтчетовСлужебныйКлиентСервер.ФильтрыРазделаОтчета(Настройки, СвойстваЗаголовка, Не ЭтоГруппировка); - Фильтр = ВариантыОтчетовСлужебныйКлиентСервер.ФильтрРазделаОтчета(Фильтры, СвойстваЗаголовка.Поле); + Фильтр = ВариантыОтчетовСлужебныйКлиентСервер.ФильтрРазделаОтчета(Фильтры, СвойстваЗаголовка.Поле,, Истина); КонецЕсли; @@ -643,8 +656,6 @@ КонецЕсли; - Фильтры.Элементы.Удалить(Фильтр); - ОповеститьОЗавершенииКонтекстнойНастройки(Форма, "СнятьФильтр", СвойстваЗаголовка.Текст); КонецПроцедуры @@ -665,30 +676,28 @@ Возврат; КонецЕсли; - КомпоновщикНастроек = КомпоновщикНастроекОтчета(Форма); + КомпоновщикНастроек2 = КомпоновщикНастроекОтчета(Форма, Истина); Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + Настройки2 = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек, Истина); Раздел = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); - - КомпоновщикНастроек.РазвернутьАвтоПоля(); + Раздел2 = Настройки2.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); - ОписаниеПоля = ОписаниеПоляОтчета(КомпоновщикНастроек, СвойстваЗаголовка.Поле); + Группировка2 = Настройки2.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + ОписаниеПоля = ОписаниеПоляОтчета(КомпоновщикНастроек2, СвойстваЗаголовка.Поле); - ЭтоГруппировкаДетальныхЗаписей = Группировка.ПоляГруппировки.Элементы.Количество() = 0; + ЭтоГруппировкаДетальныхЗаписей = ЭтоГруппировкаДетальныхЗаписей(Группировка2); Если ОписаниеПоля <> Неопределено И ОписаниеПоля.Ресурс Тогда - СкрытьВыбранноеПолеРаздела(Раздел, СвойстваЗаголовка.Поле); - + СкрытьВыбранноеПолеРаздела(Раздел, Раздел2, СвойстваЗаголовка.Поле); Иначе - - СкрытьВыбранноеПолеГруппировки(Группировка, СвойстваЗаголовка.Поле); + СкрытьВыбранноеПолеГруппировки(Группировка, Группировка2, СвойстваЗаголовка.Поле); Если Не ЭтоГруппировкаДетальныхЗаписей Тогда - СкрытьГруппировку(Настройки, Группировка, СвойстваЗаголовка.Поле); + СкрытьГруппировку(Настройки, Группировка, Настройки2, Группировка2, СвойстваЗаголовка.Поле); КонецЕсли; - КонецЕсли; ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда), СвойстваЗаголовка.Текст); @@ -703,13 +712,15 @@ СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); - КомпоновщикНастроек = КомпоновщикНастроекОтчета(Форма); + КомпоновщикНастроек2 = КомпоновщикНастроекОтчета(Форма, Истина); Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + Настройки2 = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек, Истина); Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + Группировка2 = Настройки2.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); - ОписаниеПоля = ОписаниеПоляОтчета(КомпоновщикНастроек, СвойстваЗаголовка.Поле); + ОписаниеПоля = ОписаниеПоляОтчета(КомпоновщикНастроек2, СвойстваЗаголовка.Поле); - ПолеОтчета = ВариантыОтчетовСлужебныйКлиентСервер.ПолеОтчета(Группировка.Выбор, СвойстваЗаголовка.Поле); + ПолеОтчета = ПолеОтчета(Группировка, Группировка2, СвойстваЗаголовка.Поле, "Выбор").Поле; Если Не ЗначениеЗаполнено(Заголовок) Тогда @@ -728,13 +739,6 @@ КонецЕсли; - Если ПолеОтчета = Неопределено Тогда - - КомпоновщикНастроек.РазвернутьАвтоПоля(); - ПолеОтчета = ВариантыОтчетовСлужебныйКлиентСервер.ПолеОтчета(Группировка.Выбор, СвойстваЗаголовка.Поле); - - КонецЕсли; - Если ПолеОтчета <> Неопределено Тогда УстановитьЗаголовокПоляОтчета(Настройки, ПолеОтчета, ОписаниеПоля, Заголовок); КонецЕсли; @@ -749,6 +753,10 @@ СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); КонецЕсли; + Если СвойстваЗаголовка = Неопределено Тогда + Возврат; + КонецЕсли; + Если Не ТипСортировкиРазделаДоступен(Команда, СвойстваЗаголовка) Тогда Возврат; КонецЕсли; @@ -786,7 +794,7 @@ ЭлементСортировки.ТипУпорядочивания = ТипСортировкиРаздела(Команда); ЭлементСортировки.Использование = Истина; - ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда), Неопределено, Ложь); + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда)); КонецПроцедуры @@ -800,26 +808,26 @@ #Область ВставкаПоля -Процедура ВставитьПоле(КомпоновщикНастроек, Настройки, ВыбранноеПоле, Действие, СвойстваЗаголовка, РолиПолей) - - КомпоновщикНастроек.РазвернутьАвтоПоля(); +Процедура ВставитьПоле(Настройки, Настройки2, ВыбранноеПоле, Действие, СвойстваЗаголовка, РолиПолей) Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + Группировка2 = Настройки2.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); - ВставитьПолеВПоляГруппировки(Группировка.ПоляГруппировки, ВыбранноеПоле, СвойстваЗаголовка.Поле, Действие, РолиПолей); - ВставитьПолеВГруппировкуРаздела(Группировка, ВыбранноеПоле, СвойстваЗаголовка.Поле, Действие, РолиПолей); + ВставитьПолеВПоляГруппировки(Группировка, Группировка2, ВыбранноеПоле, СвойстваЗаголовка.Поле, Действие, РолиПолей); + ВставитьПолеВГруппировкуРаздела(Группировка, Группировка2, ВыбранноеПоле, СвойстваЗаголовка.Поле, Действие, РолиПолей); КонецПроцедуры -Процедура ВставитьПолеВПоляГруппировки(Поля, ВыбранноеПоле, ТекущееПоле, Действие, РолиПолей) +Процедура ВставитьПолеВПоляГруппировки(Группировка, Группировка2, ВыбранноеПоле, ТекущееПоле, Действие, РолиПолей) Если ВыбранноеПоле.Ресурс Тогда Возврат; КонецЕсли; - НайденноеТекущееПоле = ВариантыОтчетовСлужебныйКлиентСервер.ПолеОтчета(Поля, ТекущееПоле); + Поля2 = Группировка2.ПоляГруппировки; + НайденноеТекущееПоле2 = ВариантыОтчетовСлужебныйКлиентСервер.ПолеОтчета(Поля2, ТекущееПоле); - Если НайденноеТекущееПоле = Неопределено Тогда + Если НайденноеТекущееПоле2 = Неопределено Тогда Возврат; КонецЕсли; @@ -832,6 +840,11 @@ Возврат; КонецЕсли; + СкопироватьПоля(Группировка, Группировка2, "ПоляГруппировки"); + Поля = Группировка.ПоляГруппировки; + + НайденноеТекущееПоле = ВариантыОтчетовСлужебныйКлиентСервер.ПолеОтчета(Поля, ТекущееПоле); + ИндексПоля = Поля.Элементы.Индекс(НайденноеТекущееПоле); Если Действие = "ВставитьПолеСправа" Тогда @@ -863,7 +876,7 @@ КонецПроцедуры -Процедура ВставитьПолеВГруппировкуРаздела(Группировка, ВыбранноеПоле, ТекущееПоле, Действие, РолиПолей) +Процедура ВставитьПолеВГруппировкуРаздела(Группировка, Группировка2, ВыбранноеПоле, ТекущееПоле, Действие, РолиПолей) Если ТипЗнч(Группировка) <> Тип("ГруппировкаКомпоновкиДанных") И ТипЗнч(Группировка) <> Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда @@ -871,6 +884,7 @@ Возврат; КонецЕсли; + СкопироватьПоля(Группировка, Группировка2, "Выбор"); Поля = Группировка.Выбор; НайденноеТекущееПоле = ВариантыОтчетовСлужебныйКлиентСервер.ПолеОтчета(Поля, ТекущееПоле); @@ -919,11 +933,11 @@ УстановитьВыводРеквизитовГруппировкиОтдельно(Группировка); - ВставитьПолеВГруппировкиРаздела(Группировка, ВыбранноеПоле, ТекущееПоле, Действие, РолиПолей); + ВставитьПолеВГруппировкиРаздела(Группировка, Группировка2, ВыбранноеПоле, ТекущееПоле, Действие, РолиПолей); КонецПроцедуры -Процедура ВставитьПолеВГруппировкиРаздела(Родитель, ВыбранноеПоле, ТекущееПоле, Действие, РолиПолей) +Процедура ВставитьПолеВГруппировкиРаздела(Родитель, Родитель2, ВыбранноеПоле, ТекущееПоле, Действие, РолиПолей) Если Не ВыбранноеПоле.Ресурс Тогда Возврат; @@ -931,12 +945,16 @@ Если ТипЗнч(Родитель) = Тип("ТаблицаКомпоновкиДанных") Тогда Группировки = Родитель.Строки; + Группировки2 = Родитель2.Строки; Иначе Группировки = Родитель.Структура; + Группировки2 = Родитель2.Структура; КонецЕсли; - Для Каждого Группировка Из Группировки Цикл - ВставитьПолеВГруппировкуРаздела(Группировка, ВыбранноеПоле, ТекущееПоле, Действие, РолиПолей); + Для НомерГруппировки = 1 По Группировки.Количество() Цикл + Группировка = Группировки[НомерГруппировки - 1]; + Группировка2 = Группировки2[НомерГруппировки - 1]; + ВставитьПолеВГруппировкуРаздела(Группировка, Группировка2, ВыбранноеПоле, ТекущееПоле, Действие, РолиПолей); КонецЦикла; КонецПроцедуры @@ -1088,66 +1106,110 @@ #Область СкрытиеПоля -Процедура СкрытьВыбранноеПолеРаздела(Раздел, Поле) +Функция ЭтоГруппировкаДетальныхЗаписей(Группировка2) + + Возврат Группировка2.ПоляГруппировки.Элементы.Количество() = 0; + +КонецФункции + +Процедура СкрытьВыбранноеПолеРаздела(Раздел, Раздел2, Поле) ГруппировкиРаздела = Новый Массив; + ГруппировкиРаздела2 = Новый Массив; - Если ТипЗнч(Раздел) = Тип("ТаблицаКомпоновкиДанных") Тогда + Если ТипЗнч(Раздел2) = Тип("ТаблицаКомпоновкиДанных") Тогда ГруппировкиРаздела.Добавить(Раздел.Строки); ГруппировкиРаздела.Добавить(Раздел.Колонки); + ГруппировкиРаздела2.Добавить(Раздел2.Строки); + ГруппировкиРаздела2.Добавить(Раздел2.Колонки); Иначе ГруппировкиРаздела.Добавить(Раздел.Структура); - СкрытьВыбранноеПолеГруппировки(Раздел, Поле); + ГруппировкиРаздела2.Добавить(Раздел2.Структура); + СкрытьВыбранноеПолеГруппировки(Раздел, Раздел2, Поле); КонецЕсли; - Для Каждого Группировки Из ГруппировкиРаздела Цикл + Для НомерГруппировкиРаздела = 1 По ГруппировкиРаздела2.Количество() Цикл + Группировки = ГруппировкиРаздела[НомерГруппировкиРаздела - 1]; + Группировки2 = ГруппировкиРаздела2[НомерГруппировкиРаздела - 1]; - Для Каждого Группировка Из Группировки Цикл - - СкрытьВыбранноеПолеГруппировки(Группировка, Поле); - СкрытьВыбранноеПолеРаздела(Группировка, Поле); + Для НомерГруппировки = 1 По Группировки2.Количество() Цикл + Группировка = Группировки[НомерГруппировки - 1]; + Группировка2 = Группировки2[НомерГруппировки - 1]; + СкрытьВыбранноеПолеГруппировки(Группировка, Группировка2, Поле); + СкрытьВыбранноеПолеРаздела(Группировка, Группировка2, Поле); КонецЦикла; - КонецЦикла; КонецПроцедуры -Процедура СкрытьВыбранноеПолеГруппировки(Группировка, Поле) +Процедура СкрытьВыбранноеПолеГруппировки(Группировка, Группировка2, Поле) - Если ТипЗнч(Группировка) <> Тип("ГруппировкаКомпоновкиДанных") - И ТипЗнч(Группировка) <> Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда + Если ТипЗнч(Группировка2) <> Тип("ГруппировкаКомпоновкиДанных") + И ТипЗнч(Группировка2) <> Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда Возврат; КонецЕсли; - ПоляОтчета = ВариантыОтчетовСлужебныйКлиентСервер.ПолеОтчета(Группировка.Выбор, Поле); - - Если ПоляОтчета <> Неопределено Тогда - ПоляОтчета.Использование = Ложь; - КонецЕсли; - - ПоляОтчета = ВариантыОтчетовСлужебныйКлиентСервер.ПолеОтчета(Группировка.ПоляГруппировки, Поле); - - Если ПоляОтчета <> Неопределено Тогда - ПоляОтчета.Использование = Ложь; - КонецЕсли; - - ПоляОтчета = ВариантыОтчетовСлужебныйКлиентСервер.ПолеОтчета(Группировка.Порядок, Поле); - - Если ПоляОтчета <> Неопределено Тогда - ПоляОтчета.Использование = Ложь; - КонецЕсли; + ПолеНайдено = Ложь; + СкрытьВыбранноеПолеВКоллекцииГруппировки(Группировка, Группировка2, Поле, "ПоляГруппировки", Истина, ПолеНайдено); + СкрытьВыбранноеПолеВКоллекцииГруппировки(Группировка, Группировка2, Поле, "Выбор", ПолеНайдено); + СкрытьВыбранноеПолеВКоллекцииГруппировки(Группировка, Группировка2, Поле, "Порядок", Истина); КонецПроцедуры -Процедура СкрытьГруппировку(Настройки, Группировка, Поле) +Процедура СкрытьВыбранноеПолеВКоллекцииГруппировки(Группировка, Группировка2, Поле, ИмяКоллекции, + БезКопирования = Ложь, ПолеНайдено = Ложь) - Поля = Группировка.ПоляГруппировки; + ПолеОтчета = ПолеОтчета(Группировка, Группировка2, Поле, ИмяКоллекции, , БезКопирования); + Если ПолеОтчета = Неопределено Тогда + Возврат; + КонецЕсли; + + ПолеНайдено = Истина; + + ПолеОтчета.Поле.Использование = Ложь; + ПолеОтчета.Поле2.Использование = Ложь; + +КонецПроцедуры + +Функция ПолеОтчета(Группировка, Группировка2, Поле, ИмяКоллекции, ЗаголовокПоля = Неопределено, БезКопирования = Ложь) + + ПолеОтчета2 = ВариантыОтчетовСлужебныйКлиентСервер.ПолеОтчета(Группировка2[ИмяКоллекции], Поле,, ЗаголовокПоля); + Если ПолеОтчета2 = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + ПолеОтчета = ВариантыОтчетовСлужебныйКлиентСервер.ПолеОтчета(Группировка[ИмяКоллекции], Поле,, ЗаголовокПоля); + Если ПолеОтчета = Неопределено Тогда + Если БезКопирования Тогда + Возврат Неопределено; + КонецЕсли; + СкопироватьПоля(Группировка, Группировка2, ИмяКоллекции); + ПолеОтчета = ВариантыОтчетовСлужебныйКлиентСервер.ПолеОтчета(Группировка[ИмяКоллекции], Поле,, ЗаголовокПоля); + КонецЕсли; + + Возврат Новый Структура("Поле, Поле2", ПолеОтчета, ПолеОтчета2); + +КонецФункции + +Процедура СкопироватьПоля(Группировка, Группировка2, ИмяКоллекции) + + Группировка[ИмяКоллекции].Элементы.Очистить(); + Для Каждого ТекущееПоле2 Из Группировка2[ИмяКоллекции].Элементы Цикл + НовоеПоле = Группировка[ИмяКоллекции].Элементы.Добавить(ТипЗнч(ТекущееПоле2)); + ЗаполнитьЗначенияСвойств(НовоеПоле, ТекущееПоле2); + КонецЦикла; + +КонецПроцедуры + +Процедура СкрытьГруппировку(Настройки, Группировка, Настройки2, Группировка2, Поле) + + Поля = Группировка2.ПоляГруппировки; КоличествоИспользуемыхПолей = 0; @@ -1164,34 +1226,43 @@ КонецЕсли; Группировка.Использование = Ложь; + Группировка2.Использование = Ложь; РодительскаяГруппировка = Группировка.Родитель; + РодительскаяГруппировка2 = Группировка2.Родитель; - Если ТипЗнч(РодительскаяГруппировка) = Тип("ТаблицаКомпоновкиДанных") Тогда + Если ТипЗнч(РодительскаяГруппировка2) = Тип("ТаблицаКомпоновкиДанных") Тогда ИдентификаторГруппировки = Настройки.ПолучитьИдентификаторПоОбъекту(Группировка); + ИдентификаторГруппировки2 = Настройки2.ПолучитьИдентификаторПоОбъекту(Группировка2); - Если СтрНайти(ИдентификаторГруппировки, "/row/") > 0 Тогда + Если СтрНайти(ИдентификаторГруппировки2, "/row/") > 0 Тогда Группировки = РодительскаяГруппировка.Строки; + Группировки2 = РодительскаяГруппировка2.Строки; Иначе - Группировки = РодительскаяГруппировка.Колонки; + Группировки2 = РодительскаяГруппировка2.Колонки; КонецЕсли; Иначе Группировки = РодительскаяГруппировка.Структура; + Группировки2 = РодительскаяГруппировка2.Структура; КонецЕсли; ИндексГруппировки = Группировки.Индекс(Группировка); + ИндексГруппировки2 = Группировки2.Индекс(Группировка2); - Для Каждого ДочерняяГруппировка Из Группировка.Структура Цикл + Для НомерДочернейГруппировки = 1 По Группировка2.Структура.Количество() Цикл + ДочерняяГруппировка = Группировка.Структура[НомерДочернейГруппировки - 1]; + ДочерняяГруппировка2 = Группировка2.Структура[НомерДочернейГруппировки - 1]; - Если Не ДочерняяГруппировка.Использование Тогда + Если Не ДочерняяГруппировка2.Использование Тогда Продолжить; КонецЕсли; - ПоискЭлементов = Новый Соответствие; - ОтчетыКлиентСервер.СкопироватьРекурсивно(Настройки, ДочерняяГруппировка, Группировки, ИндексГруппировки, ПоискЭлементов); + ОтчетыКлиентСервер.СкопироватьРекурсивно(Настройки, ДочерняяГруппировка, Группировки, ИндексГруппировки); + ОтчетыКлиентСервер.СкопироватьРекурсивно(Настройки2, ДочерняяГруппировка2, Группировки2, ИндексГруппировки2); ДочерняяГруппировка.Использование = Ложь; + ДочерняяГруппировка2.Использование = Ложь; КонецЦикла; @@ -1496,6 +1567,10 @@ СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); КонецЕсли; + Если СвойстваЗаголовка = Неопределено Тогда + Возврат; + КонецЕсли; + ПараметрыРаскраски = ПараметрыРаскраскиРазделаОтчета(ДействиеКоманды(Команда)); ПараметрыРаскраски.Условие.ЛевоеЗначение = СвойстваЗаголовка.Поле; ПараметрыРаскраски.Условие.ВидСравнения = ВидСравненияУсловияОформления(Значение); @@ -1574,53 +1649,58 @@ Процедура РаскраситьРазделОтчета(Форма, ПараметрыРаскраски, СвойстваЗаголовка) Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + Настройки2 = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек, Истина); Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + Группировка2 = Настройки2.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); Если ТипЗнч(Группировка) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда - ПрименитьРаскраскуГруппировкиОтчета(Группировка.Настройки, ПараметрыРаскраски, СвойстваЗаголовка); + ПрименитьРаскраскуГруппировкиОтчета(Группировка.Настройки, Группировка2.Настройки, ПараметрыРаскраски, СвойстваЗаголовка); ИначеЕсли СвойстваЗаголовка.КоличествоРазделов = 1 Тогда - ПрименитьРаскраскуГруппировкиОтчета(Настройки, ПараметрыРаскраски, СвойстваЗаголовка); + ПрименитьРаскраскуГруппировкиОтчета(Настройки, Настройки2, ПараметрыРаскраски, СвойстваЗаголовка); Иначе Раздел = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); + Раздел2 = Настройки2.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); Если ТипЗнч(Раздел) = Тип("ТаблицаКомпоновкиДанных") Тогда - РаскраситьГруппировкиРазделаОтчета(Раздел.Строки, ПараметрыРаскраски, СвойстваЗаголовка); + РаскраситьГруппировкиРазделаОтчета(Раздел.Строки, Раздел2.Строки, ПараметрыРаскраски, СвойстваЗаголовка); Иначе - РаскраситьГруппировкуРазделаОтчета(Раздел, ПараметрыРаскраски, СвойстваЗаголовка); + РаскраситьГруппировкуРазделаОтчета(Раздел, Раздел2, ПараметрыРаскраски, СвойстваЗаголовка); КонецЕсли; КонецЕсли; КонецПроцедуры -Процедура РаскраситьГруппировкиРазделаОтчета(Группировки, ПараметрыРаскраски, СвойстваЗаголовка) +Процедура РаскраситьГруппировкиРазделаОтчета(Группировки, Группировки2, ПараметрыРаскраски, СвойстваЗаголовка) - Для Каждого Группировка Из Группировки Цикл - РаскраситьГруппировкуРазделаОтчета(Группировка, ПараметрыРаскраски, СвойстваЗаголовка); + Для НомерГруппировки = 1 По Группировки.Количество() Цикл + Группировка = Группировки[НомерГруппировки - 1]; + Группировка2 = Группировки2[НомерГруппировки - 1]; + РаскраситьГруппировкуРазделаОтчета(Группировка, Группировка2, ПараметрыРаскраски, СвойстваЗаголовка); КонецЦикла; КонецПроцедуры -Процедура РаскраситьГруппировкуРазделаОтчета(Группировка, ПараметрыРаскраски, СвойстваЗаголовка) +Процедура РаскраситьГруппировкуРазделаОтчета(Группировка, Группировка2, ПараметрыРаскраски, СвойстваЗаголовка) Если ТипЗнч(Группировка) = Тип("ТаблицаКомпоновкиДанных") Тогда - РаскраситьГруппировкиРазделаОтчета(Группировка.Строки, ПараметрыРаскраски, СвойстваЗаголовка); + РаскраситьГруппировкиРазделаОтчета(Группировка.Строки, Группировка2.Строки, ПараметрыРаскраски, СвойстваЗаголовка); Иначе - ПрименитьРаскраскуГруппировкиОтчета(Группировка, ПараметрыРаскраски, СвойстваЗаголовка); + ПрименитьРаскраскуГруппировкиОтчета(Группировка, Группировка2, ПараметрыРаскраски, СвойстваЗаголовка); - РаскраситьГруппировкиРазделаОтчета(Группировка.Структура, ПараметрыРаскраски, СвойстваЗаголовка) + РаскраситьГруппировкиРазделаОтчета(Группировка.Структура, Группировка2.Структура, ПараметрыРаскраски, СвойстваЗаголовка) КонецЕсли; КонецПроцедуры -Процедура ПрименитьРаскраскуГруппировкиОтчета(Группировка, ПараметрыРаскраски, СвойстваЗаголовка) +Процедура ПрименитьРаскраскуГруппировкиОтчета(Группировка, Группировка2, ПараметрыРаскраски, СвойстваЗаголовка) ПолеОформления = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыРаскраски.Условие, "ЛевоеЗначение"); - ПараметрыРаскраскиПрименимы = ОформлениеПрименимоКГруппировке( - Группировка, ПолеОформления, СвойстваЗаголовка.Ресурс); + ПараметрыРаскраскиПрименимы = ОформлениеПрименимоКГруппировке(Группировка2, + ПолеОформления, СвойстваЗаголовка.Ресурс); Если ПараметрыРаскраскиПрименимы Тогда @@ -1980,13 +2060,7 @@ НеиспользуемыеОбласти.Добавить("ИспользоватьВОбщемИтоге"); НеиспользуемыеОбласти.Добавить("ИспользоватьВОтборе"); НеиспользуемыеОбласти.Добавить("ИспользоватьВПараметрах"); - - ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); - - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ПараметрыКлиента.ВерсияРежимаСовместимости, "8.3.16.0") >= 0 Тогда - НеиспользуемыеОбласти.Добавить("ИспользоватьВЗаголовкеОбщегоИтога"); - КонецЕсли; - + НеиспользуемыеОбласти.Добавить("ИспользоватьВЗаголовкеОбщегоИтога"); Для Каждого Область Из НеиспользуемыеОбласти Цикл Элемент[Область] = ИспользованиеУсловногоОформленияКомпоновкиДанных.НеИспользовать; КонецЦикла; @@ -2064,39 +2138,48 @@ Возврат; КонецЕсли; - Настройки = ИспользуемыеНастройки(ДополнительныеПараметры.Форма); + Форма = ДополнительныеПараметры.Форма; + Команда = ДополнительныеПараметры.Команда; + СвойстваЗаголовка = ДополнительныеПараметры.СвойстваЗаголовка; + + Настройки = ИспользуемыеНастройки(Форма); Если Результат.Свойство("ОписаниеФормул") Тогда ДобавитьФормулы(Настройки, Настройки.ДоступныеПоляВыбора, Результат.ОписаниеФормул); КонецЕсли; - Раздел = ДополнительныеПараметры.Раздел; + ИспользуемыеНастройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + ИспользуемыеНастройки2 = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек, Истина); + Раздел = ИспользуемыеНастройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); + Раздел2 = ИспользуемыеНастройки2.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); + Группировка = ИспользуемыеНастройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + Группировка2 = ИспользуемыеНастройки2.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + ОбразецОформления = Результат.ЭлементКД; - Поле = ДополнительныеПараметры.Поле; - ЭтоРесурс = ДополнительныеПараметры.Ресурс; Если ТипЗнч(Раздел) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда - ПрименитьОформлениеГруппировкиОтчета(Раздел.Настройки, ОбразецОформления, Поле, ЭтоРесурс); - ИначеЕсли ДополнительныеПараметры.КоличествоРазделов = 1 Тогда - ПрименитьОформлениеГруппировкиОтчета(ДополнительныеПараметры.Настройки, ОбразецОформления, Поле, ЭтоРесурс); + ПрименитьОформлениеГруппировкиОтчета(Раздел.Настройки, Раздел2.Настройки, ОбразецОформления, СвойстваЗаголовка); + ИначеЕсли СвойстваЗаголовка.КоличествоРазделов = 1 Тогда + ПрименитьОформлениеГруппировкиОтчета(ИспользуемыеНастройки, ИспользуемыеНастройки2, ОбразецОформления, СвойстваЗаголовка); ИначеЕсли ТипЗнч(Раздел) = Тип("ТаблицаКомпоновкиДанных") Тогда - ОформитьГруппировкиРазделаОтчета(Раздел.Строки, Результат.ЭлементКД, Поле, ЭтоРесурс); + ОформитьГруппировкиРазделаОтчета(Раздел.Строки, Раздел2.Строки, Результат.ЭлементКД, СвойстваЗаголовка); Иначе - ОформитьГруппировкуРазделаОтчета(Раздел, Результат.ЭлементКД, Поле, ЭтоРесурс); + ОформитьГруппировкуРазделаОтчета(Раздел, Раздел2, Результат.ЭлементКД, СвойстваЗаголовка); КонецЕсли; - ОповеститьОЗавершенииКонтекстнойНастройки(ДополнительныеПараметры.Форма, ДополнительныеПараметры.Действие); + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда)); КонецПроцедуры -Процедура ПрименитьОформлениеГруппировкиОтчета(Группировка, ОбразецОформления, Поле, ЭтоРесурс) +Процедура ПрименитьОформлениеГруппировкиОтчета(Группировка, Группировка2, ОбразецОформления, СвойстваЗаголовка) - ОформлениеПрименимоКГруппировке = ОформлениеПрименимоКГруппировке(Группировка, Поле, ЭтоРесурс); + ОформлениеПрименимоКГруппировке = ОформлениеПрименимоКГруппировке(Группировка2, + СвойстваЗаголовка.Поле, СвойстваЗаголовка.Ресурс); Если ОформлениеПрименимоКГруппировке Тогда Оформление = Группировка.УсловноеОформление; - ЭлементОформления = ЭлементОформленияГруппировкиОтчета(Группировка, Поле); + ЭлементОформления = ЭлементОформленияГруппировкиОтчета(Группировка, СвойстваЗаголовка.Поле); Если ЭлементОформления = Неопределено Тогда ЭлементОформления = Оформление.Элементы.Добавить(); @@ -2112,25 +2195,27 @@ КонецПроцедуры -Процедура ОформитьГруппировкиРазделаОтчета(Группировки, ОбразецОформления, Поле, ЭтоРесурс) +Процедура ОформитьГруппировкиРазделаОтчета(Группировки, Группировки2, ОбразецОформления, СвойстваЗаголовка) - Для Каждого Группировка Из Группировки Цикл - ОформитьГруппировкуРазделаОтчета(Группировка, ОбразецОформления, Поле, ЭтоРесурс); + Для НомерГруппировки = 1 По Группировки.Количество() Цикл + Группировка = Группировки[НомерГруппировки - 1]; + Группировка2 = Группировки2[НомерГруппировки - 1]; + ОформитьГруппировкуРазделаОтчета(Группировка, Группировка2, ОбразецОформления, СвойстваЗаголовка); КонецЦикла; КонецПроцедуры -Процедура ОформитьГруппировкуРазделаОтчета(Группировка, ОбразецОформления, Поле, ЭтоРесурс) +Процедура ОформитьГруппировкуРазделаОтчета(Группировка, Группировка2, ОбразецОформления, СвойстваЗаголовка) Если ТипЗнч(Группировка) = Тип("ТаблицаКомпоновкиДанных") Тогда - ОформитьГруппировкиРазделаОтчета(Группировка.Строки, ОбразецОформления, Поле, ЭтоРесурс); + ОформитьГруппировкиРазделаОтчета(Группировка.Строки, Группировка2.Строки, ОбразецОформления, СвойстваЗаголовка); Иначе - ПрименитьОформлениеГруппировкиОтчета(Группировка, ОбразецОформления, Поле, ЭтоРесурс); + ПрименитьОформлениеГруппировкиОтчета(Группировка, Группировка2, ОбразецОформления, СвойстваЗаголовка); - ОформитьГруппировкиРазделаОтчета(Группировка.Структура, ОбразецОформления, Поле, ЭтоРесурс); + ОформитьГруппировкиРазделаОтчета(Группировка.Структура, Группировка2.Структура, ОбразецОформления, СвойстваЗаголовка); КонецЕсли; @@ -2154,23 +2239,9 @@ НеиспользуемыеОбласти.Добавить("ИспользоватьВОбщемИтоге"); НеиспользуемыеОбласти.Добавить("ИспользоватьВОтборе"); НеиспользуемыеОбласти.Добавить("ИспользоватьВПараметрах"); - - ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); - - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ПараметрыКлиента.ВерсияРежимаСовместимости, "8.3.16.0") < 0 Тогда - Возврат НеиспользуемыеОбласти; - КонецЕсли; - НеиспользуемыеОбласти.Добавить("ИспользоватьВЗаголовкеПолейРесурсов"); НеиспользуемыеОбласти.Добавить("ИспользоватьВЗаголовкеОбщегоИтога"); -#Если ВебКлиент Тогда - СистемнаяИнформация = Новый СистемнаяИнформация; - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.20.1859") > 0 Тогда - НеиспользуемыеОбласти.Добавить("ИспользоватьВЗаголовкеПолейРесурсовОбщегоИтога"); - КонецЕсли; -#Иначе НеиспользуемыеОбласти.Добавить("ИспользоватьВЗаголовкеПолейРесурсовОбщегоИтога"); -#КонецЕсли Возврат НеиспользуемыеОбласти; @@ -2275,15 +2346,15 @@ СвойстваЗаголовка = ДополнительныеПараметры.СвойстваЗаголовка; - КомпоновщикНастроек = КомпоновщикНастроекОтчета(Форма); Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + Настройки2 = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек, Истина); Действие = ДополнительныеПараметры.Действие; РолиПолей = Форма.НастройкиОтчета.СвойстваРезультата.РолиПолей; Если СтрНачинаетсяС(Действие, "ВставитьПоле") Тогда ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляВыбора, Поле); - ВставитьПоле(КомпоновщикНастроек, Настройки, Поле, Действие, СвойстваЗаголовка, РолиПолей); + ВставитьПоле(Настройки, Настройки2, Поле, Действие, СвойстваЗаголовка, РолиПолей); ИначеЕсли СтрНачинаетсяС(Действие, "ВставитьГруппировку") Тогда @@ -2551,9 +2622,18 @@ СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + Настройки2 = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек, Истина); Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + Группировка2 = Настройки2.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + + Если Группировка = Неопределено ИЛИ Группировка2 = Неопределено Тогда + Возврат; + КонецЕсли; + + СкопироватьПоля(Группировка, Группировка2, "Выбор"); Поля = Группировка.Выбор; + ПереместитьРесурсыВКонец(Поля); ТекущееПоле = ВариантыОтчетовСлужебныйКлиентСервер.ПолеОтчета(Поля, СвойстваЗаголовка.Поле); ИсходныйИндексПоля = Поля.Элементы.Индекс(ТекущееПоле); @@ -2585,10 +2665,57 @@ Поля.Элементы.Сдвинуть(ТекущееПоле, КонечныйИндексПоля - ИсходныйИндексПоля); + Если Не ЭтоГруппировкаДетальныхЗаписей(Группировка2) Тогда + СкопироватьПорядокПолей(Группировка.ПоляГруппировки, Поля); + КонецЕсли; + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда), СвойстваЗаголовка.Текст); КонецПроцедуры +Процедура ПереместитьРесурсыВКонец(Поля) + + Ресурсы = Новый Соответствие; + Для Каждого ДоступноеПоле Из Поля.ДоступныеПоляВыбора.Элементы Цикл + Если ДоступноеПоле.Ресурс Тогда + Ресурсы.Вставить(ДоступноеПоле.Поле, Истина); + КонецЕсли; + КонецЦикла; + + Индекс = Поля.Элементы.Количество(); + ИндексПоследнегоРесурса = Индекс; + Пока Индекс > 0 Цикл + Индекс = Индекс - 1; + ТекущийЭлемент = Поля.Элементы[Индекс]; + Если Ресурсы.Получить(ТекущийЭлемент.Поле) = Неопределено Тогда + Продолжить; + КонецЕсли; + Сдвиг = ИндексПоследнегоРесурса - Индекс - 1; + ИндексПоследнегоРесурса = Индекс + Сдвиг; + Если Сдвиг > 0 Тогда + Поля.Элементы.Сдвинуть(ТекущийЭлемент, Сдвиг); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Процедура СкопироватьПорядокПолей(ПоляГруппировки, ПоляВыбора) + + Индекс = 0; + Для Каждого ПолеВыбора Из ПоляВыбора.Элементы Цикл + Для ТекущийИндекс = Индекс По ПоляГруппировки.Элементы.Количество() - 1 Цикл + ПолеГруппировки = ПоляГруппировки.Элементы[ТекущийИндекс]; + Если ПолеГруппировки.Поле = ПолеВыбора.Поле Тогда + Сдвиг = Индекс - ПоляГруппировки.Элементы.Индекс(ПолеГруппировки); + ПоляГруппировки.Элементы.Сдвинуть(ПолеГруппировки, Сдвиг); + Индекс = Индекс + 1; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + Процедура ПереместитьПолеВертикально(Форма, Команда, Ответ = Неопределено) Если Не ДействиеДоступно(Форма, Команда) Тогда @@ -2597,11 +2724,14 @@ СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); - КомпоновщикНастроек = КомпоновщикНастроекОтчета(Форма); Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); - Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); - - КомпоновщикНастроек.РазвернутьАвтоПоля(); + Настройки2 = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек, Истина); + Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + Группировка2 = Настройки2.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + СкопироватьПоля(Группировка, Группировка2, "ПоляГруппировки"); + СкопироватьПоля(Группировка, Группировка2, "Выбор"); + ПереместитьРесурсыВКонец(Группировка.Выбор); + СкопироватьПорядокПолей(Группировка.ПоляГруппировки, Группировка.Выбор); ПолеГруппировки = ВариантыОтчетовСлужебныйКлиентСервер.ПолеОтчета( Группировка.ПоляГруппировки, СвойстваЗаголовка.Поле); @@ -2615,19 +2745,14 @@ Возврат; КонецЕсли; + СоседняяГруппировка2 = СоседняяГруппировка(Форма, Команда, Настройки2, СвойстваЗаголовка.ПорядокГруппировки); + СкопироватьПоля(СоседняяГруппировка, СоседняяГруппировка2, "ПоляГруппировки"); + СкопироватьПоля(СоседняяГруппировка, СоседняяГруппировка2, "Выбор"); + ПереместитьРесурсыВКонец(СоседняяГруппировка.Выбор); + СкопироватьПорядокПолей(СоседняяГруппировка.ПоляГруппировки, СоседняяГруппировка.Выбор); + ИсходныйИндексПоля = Группировка.Выбор.Элементы.Индекс(ВыбранноеПоле); - Поля = СоседняяГруппировка.ПоляГруппировки; - КоличествоПолей = Поля.Элементы.Количество(); - - Если КоличествоПолей > 0 Тогда - - ИндексПоля = ?(ИсходныйИндексПоля < КоличествоПолей, ИсходныйИндексПоля, КоличествоПолей); - НовоеПоле = Поля.Элементы.Вставить(ИндексПоля, Тип("ПолеГруппировкиКомпоновкиДанных")); - ЗаполнитьЗначенияСвойств(НовоеПоле, ?(ПолеГруппировки = Неопределено, ВыбранноеПоле, ПолеГруппировки)); - - КонецЕсли; - Поля = СоседняяГруппировка.Выбор; ПараметрыПеремещения = Новый Структура("Форма, Команда, Ответ", Форма, Команда, Ответ); ИндексПоля = ИндексВыбранногоПоля(ИсходныйИндексПоля, Поля, СвойстваЗаголовка.Поле, ПараметрыПеремещения); @@ -2636,12 +2761,30 @@ Возврат; КонецЕсли; - НовоеПоле = Поля.Элементы.Вставить(ИндексПоля, Тип("ВыбранноеПолеКомпоновкиДанных")); - - ЗаполнитьЗначенияСвойств(НовоеПоле, ?(ВыбранноеПоле = Неопределено, ПолеГруппировки, ВыбранноеПоле)); + СоседнееВыбранноеПоле = ВариантыОтчетовСлужебныйКлиентСервер.ПолеОтчета(Поля, СвойстваЗаголовка.Поле, Ложь); + Если СоседнееВыбранноеПоле = Неопределено Тогда + СоседнееВыбранноеПоле = Поля.Элементы.Вставить(ИндексПоля, Тип("ВыбранноеПолеКомпоновкиДанных")); + Иначе + Поля.Элементы.Сдвинуть(СоседнееВыбранноеПоле, ИндексПоля - Поля.Элементы.Индекс(СоседнееВыбранноеПоле)); + КонецЕсли; + ЗаполнитьЗначенияСвойств(СоседнееВыбранноеПоле, ВыбранноеПоле); + ПереместитьРесурсыВКонец(Поля); УстановитьВыводРеквизитовГруппировкиОтдельно(СоседняяГруппировка); + Поля = СоседняяГруппировка.ПоляГруппировки; + КоличествоПолей = Поля.Элементы.Количество(); + + Если КоличествоПолей > 0 Тогда + СоседнееПолеГруппировки = ВариантыОтчетовСлужебныйКлиентСервер.ПолеОтчета(Поля, СвойстваЗаголовка.Поле, Ложь); + Если СоседнееПолеГруппировки = Неопределено Тогда + СоседнееПолеГруппировки = Поля.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); + КонецЕсли; + ЗаполнитьЗначенияСвойств(СоседнееПолеГруппировки, + ?(ПолеГруппировки = Неопределено, ВыбранноеПоле, ПолеГруппировки)); + СкопироватьПорядокПолей(Поля, СоседняяГруппировка.Выбор); + КонецЕсли; + Если ПолеГруппировки <> Неопределено Тогда Группировка.ПоляГруппировки.Элементы.Удалить(ПолеГруппировки); КонецЕсли; @@ -2653,7 +2796,7 @@ ВыбранноеПоле.Использование = Ложь; Если КоличествоИспользуемыхПолей(Группировка.Выбор) = 0 Тогда - СкрытьГруппировку(Настройки, Группировка, СвойстваЗаголовка.Поле); + СкрытьГруппировку(Настройки, Группировка, Настройки, Группировка, СвойстваЗаголовка.Поле); КонецЕсли; Иначе @@ -2668,28 +2811,45 @@ Функция СоседняяГруппировка(Форма, Команда, Настройки, ПорядокГруппировки) - СоседняяГруппировка = Неопределено; - - Если ДействиеКоманды(Команда) = "ПереместитьПолеВыше" Тогда - ПорядокСоседнейГруппировки = ПорядокГруппировки - 1; - Иначе - ПорядокСоседнейГруппировки = ПорядокГруппировки + 1; - КонецЕсли; - Заголовки = ЗаголовкиОтчета(Форма); + МинимальныйПорядокГруппировки = 0; + МаксимальныйПорядокГруппировки = 0; - Для Каждого Свойства Из Заголовки Цикл - - Если Свойства.Значение.ПорядокГруппировки = ПорядокСоседнейГруппировки Тогда - - СоседняяГруппировка = Настройки.ПолучитьОбъектПоИдентификатору(Свойства.Значение.ИдентификаторГруппировки); - Прервать; - + Для Каждого Свойства Из Заголовки Цикл + Если МаксимальныйПорядокГруппировки < Свойства.Значение.ПорядокГруппировки Тогда + МаксимальныйПорядокГруппировки = Свойства.Значение.ПорядокГруппировки; + КонецЕсли; + Если МинимальныйПорядокГруппировки = 0 + Или МинимальныйПорядокГруппировки > Свойства.Значение.ПорядокГруппировки Тогда + МинимальныйПорядокГруппировки = Свойства.Значение.ПорядокГруппировки; КонецЕсли; - КонецЦикла; - Возврат СоседняяГруппировка; + Если Не ЗначениеЗаполнено(МинимальныйПорядокГруппировки) Тогда + Возврат Неопределено; + КонецЕсли; + + Сдвиг = 0; + Пока Истина Цикл + Сдвиг = Сдвиг + 1; + Если ДействиеКоманды(Команда) = "ПереместитьПолеВыше" Тогда + ПорядокСоседнейГруппировки = ПорядокГруппировки - Сдвиг; + Иначе + ПорядокСоседнейГруппировки = ПорядокГруппировки + Сдвиг; + КонецЕсли; + Если ПорядокСоседнейГруппировки < МинимальныйПорядокГруппировки + Или ПорядокСоседнейГруппировки > МаксимальныйПорядокГруппировки Тогда + Прервать; + КонецЕсли; + + Для Каждого Свойства Из Заголовки Цикл + Если Свойства.Значение.ПорядокГруппировки = ПорядокСоседнейГруппировки Тогда + Возврат Настройки.ПолучитьОбъектПоИдентификатору(Свойства.Значение.ИдентификаторГруппировки); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Возврат Неопределено; КонецФункции @@ -3004,6 +3164,10 @@ Команда = Форма.Команды.Найти(ВыполненноеДействие); + Если Команда = Неопределено Тогда + Команда = ВыполненноеДействие; + КонецЕсли; + Если ВыполненноеДействие = "ОформитьКрасным" Или ВыполненноеДействие = "ОформитьОтрицательные" Тогда @@ -3097,27 +3261,28 @@ // Параметры: // Форма - ФормаКлиентскогоПриложения +// БезАвтоПолей - Булево // // Возвращаемое значение: // КомпоновщикНастроекКомпоновкиДанных // -Функция КомпоновщикНастроекОтчета(Форма, РазвернутьАвтоПоля = Истина) +Функция КомпоновщикНастроекОтчета(Форма, БезАвтоПолей = Ложь) Если СтрЗаканчиваетсяНа(Форма.ИмяФормы, "КонтекстнаяНастройкаОтчета") Тогда КомпоновщикНастроек = Форма.КомпоновщикНастроек; - + Если БезАвтоПолей Тогда + КомпоновщикНастроек.РазвернутьАвтоПоля(); + КонецЕсли; Иначе - НастройкиОтчета = Форма.НастройкиОтчета; // см. ВариантыОтчетов.НастройкиФормыОтчета СвойстваРезультата = НастройкиОтчета.СвойстваРезультата; // см. ВариантыОтчетовСлужебный.СвойстваРезультатаОтчета - КомпоновщикНастроек = СвойстваРезультата.КомпоновщикНастроек; - - КонецЕсли; - - Если РазвернутьАвтоПоля Тогда - КомпоновщикНастроек.РазвернутьАвтоПоля(); + Если БезАвтоПолей Тогда + КомпоновщикНастроек = СвойстваРезультата.КомпоновщикНастроекБезАвтоПолей; + Иначе + КомпоновщикНастроек = СвойстваРезультата.КомпоновщикНастроек; + КонецЕсли; КонецЕсли; Возврат КомпоновщикНастроек; @@ -3128,13 +3293,14 @@ // Форма - ФормаКлиентскогоПриложения // ИдентификаторНастроек - ИдентификаторКомпоновкиДанных // - Неопределено +// БезАвтоПолей - Булево // // Возвращаемое значение: // НастройкиКомпоновкиДанных // -Функция ИспользуемыеНастройки(Форма, ИдентификаторНастроек = Неопределено, РазвернутьАвтоПоля = Истина) +Функция ИспользуемыеНастройки(Форма, ИдентификаторНастроек = Неопределено, БезАвтоПолей = Ложь) - КомпоновщикНастроек = КомпоновщикНастроекОтчета(Форма, РазвернутьАвтоПоля); + КомпоновщикНастроек = КомпоновщикНастроекОтчета(Форма, БезАвтоПолей); ИспользуемыеНастройки = КомпоновщикНастроек.Настройки; Если ТипЗнч(ИдентификаторНастроек) <> Тип("ИдентификаторКомпоновкиДанных") Тогда @@ -3235,6 +3401,10 @@ Возврат Неопределено; КонецЕсли; + Если ТипЗнч(Команда) = Тип("Строка") Тогда + Возврат Команда; + КонецЕсли; + Возврат ?(ЗначениеЗаполнено(Команда.Действие), Команда.Действие, Команда.Имя); КонецФункции @@ -3264,14 +3434,13 @@ КонецФункции -Процедура ОповеститьОЗавершенииКонтекстнойНастройки(Форма, Действие, ТекущееПоле = Неопределено, РазвернутьАвтоПоля = Истина) +Процедура ОповеститьОЗавершенииКонтекстнойНастройки(Форма, Действие, ТекущееПоле = Неопределено) ЭтоФормОтчета = СтрЗаканчиваетсяНа(Форма.ИмяФормы, "Форма") Или СтрЗаканчиваетсяНа(Форма.ИмяФормы, "ФормаОтчета"); - ИспользуемыеНастройки = ИспользуемыеНастройки(Форма, Неопределено, РазвернутьАвтоПоля); - КомпоновщикНастроек = КомпоновщикНастроекОтчета(Форма, РазвернутьАвтоПоля); - КомпоновщикНастроек.ЗагрузитьНастройки(ИспользуемыеНастройки); + КомпоновщикНастроек = КомпоновщикНастроекОтчета(Форма); + ИспользуемыеНастройки = КомпоновщикНастроек.Настройки; ДобавитьНастройкиВСтек(Форма, ИспользуемыеНастройки, Действие, ТекущееПоле); diff --git a/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиентСервер/Module.bsl index 906e88746..0d6b47430 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиентСервер/Module.bsl @@ -130,6 +130,10 @@ ДоступныеПоля = Поля.ДоступныеПоляПолейГруппировок; + ИначеЕсли ТипЗнч(Поля) = Тип("ПорядокКомпоновкиДанных") Тогда + + ДоступныеПоля = Поля.ДоступныеПоляПорядка; + КонецЕсли; ОписаниеПоля = ?(ДоступныеПоля = Неопределено, Неопределено, ДоступныеПоля.НайтиПоле(Поле)); @@ -152,19 +156,6 @@ КонецФункции -Функция СвойстваОтбораОбработчикаРасшифровкиПоДетальнымЗаписям() Экспорт - - СвойстваЭлементаОтбора = Новый Структура; - СвойстваЭлементаОтбора.Вставить("Значение", Неопределено); - СвойстваЭлементаОтбора.Вставить("ВидСравнения", ВидСравненияКомпоновкиДанных.Равно); - СвойстваЭлементаОтбора.Вставить("РежимОтображения", РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный); - СвойстваЭлементаОтбора.Вставить("Представление", ""); - СвойстваЭлементаОтбора.Вставить("ИдентификаторПользовательскойНастройки", ""); - - Возврат СвойстваЭлементаОтбора; - -КонецФункции - #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -261,28 +252,41 @@ // Поле - ПолеКомпоновкиДанных // Фильтр - Неопределено // - ЭлементОтбораКомпоновкиДанных +// Удалить - Булево // // Возвращаемое значение: // ЭлементОтбораКомпоновкиДанных // Неопределено // -Функция ФильтрРазделаОтчета(Фильтры, Поле, Фильтр = Неопределено) Экспорт +Функция ФильтрРазделаОтчета(Фильтры, Поле, Фильтр = Неопределено, Удалить = Ложь) Экспорт + + УдаляемыеЭлементы = Новый Массив; Для Каждого Элемент Из Фильтры.Элементы Цикл Если ТипЗнч(Элемент) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда - ФильтрРазделаОтчета(Элемент, Поле, Фильтр); + ФильтрРазделаОтчета(Элемент, Поле, Фильтр, Удалить); + Если Удалить И Элемент.Элементы.Количество() = 0 Тогда + УдаляемыеЭлементы.Добавить(Элемент); + КонецЕсли; ИначеЕсли Элемент.ЛевоеЗначение = Поле Тогда Фильтр = Элемент; - Прервать; + Если Не Удалить Тогда + Прервать; + КонецЕсли; + УдаляемыеЭлементы.Добавить(Элемент); КонецЕсли; КонецЦикла; + Для Каждого Элемент Из УдаляемыеЭлементы Цикл + Фильтры.Элементы.Удалить(Элемент); + КонецЦикла; + Возврат Фильтр; КонецФункции @@ -317,6 +321,8 @@ Или ОписаниеПоля <> Неопределено И ОписаниеПоля.Заголовок = ЗаголовокПоля; Если ТипЭлемента <> Тип("АвтоВыбранноеПолеКомпоновкиДанных") + И ТипЭлемента <> Тип("АвтоПолеГруппировкиКомпоновкиДанных") + И ТипЭлемента <> Тип("АвтоЭлементПорядкаКомпоновкиДанных") И Элемент.Поле = Поле И ПроверкаИспользованияПоляПройденаУспешно И ПроверкаЗаголовкаПройденаУспешно Тогда diff --git a/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl b/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl index c4aa5bb29..5a21ccfc2 100644 --- a/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl +++ b/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl @@ -24,22 +24,35 @@ ТипОбъекта = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипОбъекта); КонецЕсли; - Настройка = РегистрыСведений.НастройкиВерсионированияОбъектов.СоздатьМенеджерЗаписи(); - Настройка.ТипОбъекта = ТипОбъекта; - - Если СрокХраненияВерсий = Неопределено Тогда - Настройка.Прочитать(); - Если Настройка.Выбран() Тогда - СрокХраненияВерсий = Настройка.СрокХраненияВерсий; - Иначе - Настройка.ТипОбъекта = ТипОбъекта; - СрокХраненияВерсий = Перечисления.СрокиХраненияВерсий.Бессрочно; + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных(); + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НастройкиВерсионированияОбъектов"); + ЭлементБлокировки.УстановитьЗначение("ТипОбъекта", ТипОбъекта); + Блокировка.Заблокировать(); + + Настройка = РегистрыСведений.НастройкиВерсионированияОбъектов.СоздатьМенеджерЗаписи(); + Настройка.ТипОбъекта = ТипОбъекта; + + Если СрокХраненияВерсий = Неопределено Тогда + Настройка.Прочитать(); + Если Настройка.Выбран() Тогда + СрокХраненияВерсий = Настройка.СрокХраненияВерсий; + Иначе + Настройка.ТипОбъекта = ТипОбъекта; + СрокХраненияВерсий = Перечисления.СрокиХраненияВерсий.Бессрочно; + КонецЕсли; КонецЕсли; - КонецЕсли; - - Настройка.СрокХраненияВерсий = СрокХраненияВерсий; - Настройка.Вариант = ВариантВерсионирования; - Настройка.Записать(); + + Настройка.СрокХраненияВерсий = СрокХраненияВерсий; + Настройка.Вариант = ВариантВерсионирования; + Настройка.Записать(); + ЗафиксироватьТранзакцию(); + + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецПроцедуры @@ -143,10 +156,8 @@ ОбщегоНазначенияКлиентСервер.Проверить(ТипЗнч(ВариантВерсионирования) = Тип("ПеречислениеСсылка.ВариантыВерсионированияОбъектов"), ТекстОшибки, "ВерсионированиеОбъектов.ВключитьВерсионированиеОбъекта"); - Если Не ВключеноВерсионированиеОбъекта(ИмяОбъекта) Тогда - ЗаписатьНастройкуВерсионированияПоОбъекту(ИмяОбъекта, ВариантВерсионирования); - КонецЕсли; - + ЗаписатьНастройкуВерсионированияПоОбъекту(ИмяОбъекта, ВариантВерсионирования); + КонецПроцедуры // Включает запись истории изменения для указанных объектов метаданных. @@ -158,9 +169,21 @@ // Процедура ВключитьВерсионированиеОбъектов(Объекты) Экспорт - Для Каждого Объект Из Объекты Цикл - ВключитьВерсионированиеОбъекта(Объект); - КонецЦикла; + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных(); + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НастройкиВерсионированияОбъектов"); + Блокировка.Заблокировать(); + + Для Каждого ИмяОбъекта Из Объекты Цикл + ЗаписатьНастройкуВерсионированияПоОбъекту(ИмяОбъекта.Ключ, Перечисления.ВариантыВерсионированияОбъектов.ВерсионироватьПриЗаписи); + КонецЦикла; + ЗафиксироватьТранзакцию(); + + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецПроцедуры @@ -451,38 +474,29 @@ Если ЗначениеЗаполнено(ЭтоКоличествоКоллизий) Тогда Если ЭтоКоличествоКоллизий Тогда - ТипыВерсий.Добавить(Перечисления.ТипыВерсийОбъекта.ПринятыеДанныеПоКоллизии); ТипыВерсий.Добавить(Перечисления.ТипыВерсийОбъекта.НепринятыеДанныеПоКоллизии); - СтрокаОтбора = "ИСТИНА"; - Иначе - ТипыВерсий.Добавить(Перечисления.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе); ТипыВерсий.Добавить(Перечисления.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе); Если ЗначениеЗаполнено(СтрокаПоиска) Тогда - - СтрокаОтбора = "Выразить(ВерсииОбъектов.Комментарий КАК Строка(1000)) ПОДОБНО &Комментарий - |ИЛИ Выразить(ВерсииОбъектов.ПредупреждениеСинхронизации КАК Строка(1000)) ПОДОБНО &Комментарий"; - Запрос.УстановитьПараметр("Комментарий", "%" + СокрЛП(Лев(СтрокаПоиска, 998)) + "%"); - + СтрокаОтбора = + "Выразить(ВерсииОбъектов.Комментарий КАК Строка(1000)) ПОДОБНО &Комментарий СПЕЦСИМВОЛ ""~"" + |ИЛИ Выразить(ВерсииОбъектов.ПредупреждениеСинхронизации КАК Строка(1000)) ПОДОБНО &Комментарий СПЕЦСИМВОЛ ""~"""; + Запрос.УстановитьПараметр("Комментарий", + "%" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(СокрЛП(Лев(СтрокаПоиска, 998))) + "%"); Иначе - СтрокаОтбора = "ИСТИНА"; - КонецЕсли; - КонецЕсли; Иначе // Отбор по комментарию не поддерживается. - ТипыВерсий.Добавить(Перечисления.ТипыВерсийОбъекта.ПринятыеДанныеПоКоллизии); ТипыВерсий.Добавить(Перечисления.ТипыВерсийОбъекта.НепринятыеДанныеПоКоллизии); ТипыВерсий.Добавить(Перечисления.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе); ТипыВерсий.Добавить(Перечисления.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе); - КонецЕсли; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоПричине", СтрокаОтбора); Запрос.УстановитьПараметр("ТипыВерсий", ТипыВерсий); @@ -513,7 +527,7 @@ Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 101 | 1 КАК КоличествоПредупрежденийВерсий - |Поместить ВременнаяТаблица + |ПОМЕСТИТЬ ВременнаяТаблица |ИЗ | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов |ГДЕ @@ -527,7 +541,7 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | ЕстьNULL(СУММА(1), 0) КАК КоличествоПредупрежденийВерсий + | ЕСТЬNULL(СУММА(1), 0) КАК КоличествоПредупрежденийВерсий |ИЗ | ВременнаяТаблица КАК ВременнаяТаблица"; @@ -1260,14 +1274,14 @@ КонецПроцедуры -// См. УдалениеПомеченныхОбъектовПереопределяемый.ПередУдалениемГруппыОбъектов +// см. УдалениеПомеченныхОбъектовПереопределяемый.ПередУдалениемГруппыОбъектов Процедура ПередУдалениемГруппыОбъектов(Контекст, УдаляемыеОбъекты) Экспорт Контекст.Вставить("Версионирование_УдаляемыеОбъекты", УдаляемыеОбъекты); КонецПроцедуры -// См. УдалениеПомеченныхОбъектовПереопределяемый.ПослеУдаленияГруппыОбъектов +// см. УдалениеПомеченныхОбъектовПереопределяемый.ПослеУдаленияГруппыОбъектов Процедура ПослеУдаленияГруппыОбъектов(Контекст, Успешно) Экспорт Если Не Успешно Тогда @@ -1662,11 +1676,11 @@ Объект = ПрочитатьXML(ЧтениеFastInfoSet); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Версионирование'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ТекстСообщенияОбОшибке = НСтр("ru = 'Не удалось перейти на выбранную версию. |Возможная причина: версия объекта была записана в другой версии программы. |Техническая информация об ошибке: %1'"); - ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщенияОбОшибке, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщенияОбОшибке, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат Неопределено; КонецПопытки; @@ -2489,7 +2503,7 @@ Иначе ТабличныйДокумент = Новый ТабличныйДокумент; Секция = ТабличныйДокумент.ПолучитьОбласть("R2"); - ВывестиТекстВОтчет(ТабличныйДокумент, Секция, "R2C2", СсылкаНаОбъект.Метаданные().Синоним, 16, Истина); + ВывестиТекстВОтчет(ТабличныйДокумент, Секция, "R2C2", СсылкаНаОбъект.Метаданные().Синоним, ШрифтыСтиля.ОченьКрупныйШрифтТекста); ТабличныйДокумент.Область("C2").ШиринаКолонки = 30; Если ОписаниеОбъекта.НомерВерсии <> 0 Тогда @@ -2521,7 +2535,7 @@ Результат.Вывести(Область); Область = Результат.ПолучитьОбласть("R3"); - УстановитьСвойстваТекста(Область.Область("R1C2"), ОписаниеВерсии, , Истина); + УстановитьСвойстваТекста(Область.Область("R1C2"), ОписаниеВерсии, ШрифтыСтиля.ВажнаяНадписьШрифт); Результат.Вывести(Область); Область = Результат.ПолучитьОбласть("R5"); @@ -2624,7 +2638,7 @@ Регион = "R" + Формат(НомерСтроки, "ЧГ=0") + "C" + Формат(НомерКолонки, "ЧГ=0"); Результат.Область(Регион).Текст = Текст; Результат.Область(Регион).ЦветФона = ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет; - Результат.Область(Регион).Шрифт = Новый Шрифт(, 8, Истина, , , ); + Результат.Область(Регион).Шрифт = ШрифтыСтиля.ВажнаяНадписьШрифт; Результат.Область(Регион).ГраницаСверху = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная); Результат.Область(Регион).ГраницаСнизу = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная); Результат.Область(Регион).ГраницаСлева = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная); @@ -2638,7 +2652,7 @@ Секция = Результат.ПолучитьОбласть("R6"); ВывестиТекстВОтчет(Результат, Секция, "R1C1:R1C3", " "); - ВывестиТекстВОтчет(Результат, Секция, "R1C2", "Реквизиты", 11, Истина); + ВывестиТекстВОтчет(Результат, Секция, "R1C2", "Реквизиты", ШрифтыСтиля.КрупныйШрифтТекста); Результат.НачатьГруппуСтрок("ГруппаРеквизитов"); ВывестиТекстВОтчет(Результат, Секция, "R1C1:R1C3", " "); @@ -2665,7 +2679,7 @@ ЗначениеРеквизита = ?(ЭлементРеквизит.ЗначениеРеквизита = Неопределено, "", ЭлементРеквизит.ЗначениеРеквизита); ПредставлениеЗначения = ПредставлениеЗначенияРеквизита(ЗначениеРеквизита, ОписаниеРеквизита); - УстановитьСвойстваТекста(Секция.Область("R1C2"), ВыводимоеНаименование, , Истина); + УстановитьСвойстваТекста(Секция.Область("R1C2"), ВыводимоеНаименование, ШрифтыСтиля.ВажнаяНадписьШрифт); УстановитьСвойстваТекста(Секция.Область("R1C3"), ПредставлениеЗначения); Секция.Область("R1C2:R1C3").ГраницаСнизу = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1, 0); Секция.Область("R1C2:R1C3").ЦветРамки = ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет; @@ -2705,7 +2719,7 @@ Секция = Результат.ПолучитьОбласть("R" + XMLСтрока(Результат.ВысотаТаблицы + 1)); ВывестиТекстВОтчет(Результат, Секция, "R1C1:R1C" + Формат(ТабличнаяЧасть.Колонки.Количество(), "ЧГ=0"), " "); - ОбластьВывода = ВывестиТекстВОтчет(Результат, Секция, "R1C2", СинонимТЧ, 11, Истина); + ОбластьВывода = ВывестиТекстВОтчет(Результат, Секция, "R1C2", СинонимТЧ, ШрифтыСтиля.КрупныйШрифтТекста); Результат.Область("R" + Формат(ОбластьВывода.Верх, "ЧГ=0") + "C2").СоздатьФорматСтрок(); Результат.Область("R" + Формат(ОбластьВывода.Верх, "ЧГ=0") + "C2").ШиринаКолонки = Окр(СтрДлина(СинонимТЧ)*2, 0, РежимОкругления.Окр15как20); Результат.НачатьГруппуСтрок("ГруппаСтрок"); @@ -2722,14 +2736,14 @@ Секция = Новый ТабличныйДокумент; ОбластьСекции = Секция.Область("R1C1"); - УстановитьСвойстваТекста(ОбластьСекции, "N", , Истина, Истина); + УстановитьСвойстваТекста(ОбластьСекции, "N", ШрифтыСтиля.ВажнаяНадписьШрифт, Истина); ОбластьСекции.ЦветФона = ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет; НомерСтроки = 1; Для Каждого СтрокаТабличнойЧасти Из ТабличнаяЧасть Цикл НомерСтроки = НомерСтроки + 1; УстановитьСвойстваТекста(Секция.Область("R" + Формат(НомерСтроки, "ЧГ=0") + "C1"), - Формат(НомерСтроки-1, "ЧГ=0"), , Ложь, Истина); + Формат(НомерСтроки-1, "ЧГ=0"), , Истина); КонецЦикла; ДобавляемаяТЧ.Присоединить(Секция); @@ -2754,7 +2768,7 @@ ЦветЗаголовкаКолонки = ?(ОписаниеПоля = Неопределено, ЦветаСтиля.ЗаголовокУдаленногоРеквизитаФон, ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); СекцияОбласти = Секция.Область("R1C1"); - УстановитьСвойстваТекста(СекцияОбласти, ВыводимоеНаименованиеПоля, , Истина, Истина); + УстановитьСвойстваТекста(СекцияОбласти, ВыводимоеНаименованиеПоля, ШрифтыСтиля.ВажнаяНадписьШрифт, Истина); СекцияОбласти.ЦветФона = ЦветЗаголовкаКолонки; СоответствиеРазмерностиКолонок.Вставить(НомерКолонки, СтрДлина(НаименованиеПоля) + 4); НомерСтроки = 1; @@ -2763,7 +2777,7 @@ Значение = ?(СтрокаТабличнойЧасти[НаименованиеПоля] = Неопределено, "", СтрокаТабличнойЧасти[НаименованиеПоля]); ПредставлениеЗначения = ПредставлениеЗначенияРеквизита(Значение, ОписаниеПоля); - УстановитьСвойстваТекста(Секция.Область("R" + Формат(НомерСтроки, "ЧГ=0") + "C1"), ПредставлениеЗначения, , , Истина); + УстановитьСвойстваТекста(Секция.Область("R" + Формат(НомерСтроки, "ЧГ=0") + "C1"), ПредставлениеЗначения, , Истина); Если СтрДлина(ПредставлениеЗначения) > (СоответствиеРазмерностиКолонок[НомерКолонки] - 4) Тогда СоответствиеРазмерностиКолонок[НомерКолонки] = СтрДлина(ПредставлениеЗначения) + 4; КонецЕсли; @@ -2784,14 +2798,18 @@ КонецПроцедуры -Функция ВывестиТекстВОтчет(Результат, Знач Секция, Знач Регион, Знач Текст, Знач Размер = 9, Знач Жирный = Ложь) +Функция ВывестиТекстВОтчет(Результат, Знач Секция, Знач Регион, Знач Текст, Знач Шрифт = Неопределено) + + Если Шрифт = Неопределено Тогда + Шрифт = ШрифтыСтиля.ШрифтТекста; + КонецЕсли; ОбластьСекции = Секция.Область(Регион); Если ТипЗнч(ОбластьСекции) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда - ОбластьСекции.Текст = Текст; - ОбластьСекции.Шрифт = Новый Шрифт(, Размер, Жирный, , , ); + ОбластьСекции.Текст = Текст; + ОбластьСекции.Шрифт = Шрифт; ОбластьСекции.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Лево; ОбластьСекции.ГраницаСверху = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии); @@ -2805,12 +2823,16 @@ КонецФункции -Процедура УстановитьСвойстваТекста(ОбластьСекции, Текст, Знач Размер = 9, Знач Жирный = Ложь, Знач ПоказыватьГраницы = Ложь) +Процедура УстановитьСвойстваТекста(ОбластьСекции, Текст, Знач Шрифт = Неопределено, Знач ПоказыватьГраницы = Ложь) + + Если Шрифт = Неопределено Тогда + Шрифт = ШрифтыСтиля.ШрифтТекста; + КонецЕсли; Если ТипЗнч(ОбластьСекции) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда ОбластьСекции.Текст = Текст; - ОбластьСекции.Шрифт = Новый Шрифт(, Размер, Жирный, , , ); + ОбластьСекции.Шрифт = Шрифт; Если ПоказыватьГраницы Тогда ОбластьСекции.ГраницаСверху = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная); @@ -3294,7 +3316,7 @@ Исключение ОтменитьТранзакцию(); ВыполняетсяЗаписьОбъекта(Ложь); - ТекстСообщенияОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстСообщенияОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Возврат ИдентификаторОшибки; КонецПопытки; diff --git a/SSL/src/CommonModules/Взаимодействия/Module.bsl b/SSL/src/CommonModules/Взаимодействия/Module.bsl index d5abf1a6f..e96ecc464 100644 --- a/SSL/src/CommonModules/Взаимодействия/Module.bsl +++ b/SSL/src/CommonModules/Взаимодействия/Module.bsl @@ -8,6 +8,74 @@ #Область ПрограммныйИнтерфейс +// Включает или выключает почтовый клиент. +// +// Параметры: +// Значение - Булево +// +Процедура УстановитьИспользованиеПочтовогоКлиента(Знач Значение) Экспорт + + Константы.ИспользоватьПочтовыйКлиент.Установить(Значение); + +КонецПроцедуры + +// Проверяет возможность использования почтового клиента. +// +// Возвращаемое значение: +// Булево +// +Функция ИспользуетсяПочтовыйКлиент() Экспорт + + Возврат ПолучитьФункциональнуюОпцию("ИспользоватьПочтовыйКлиент"); + +КонецФункции + +// Включает или выключает возможность отправки писем в формате HTML. +// Если выключить, то будет доступна отправка только в текстовом формате. +// +// Параметры: +// Значение - Булево +// +Процедура УстановитьИспользованиеОтправкиПисемВФорматеHTML(Знач Значение) Экспорт + + Константы.ОтправлятьПисьмаВФорматеHTML.Установить(Значение); + +КонецПроцедуры + +// Проверяет возможность использования отправки писем в формате HTML. +// +// Возвращаемое значение: +// Булево +// +Функция ИспользуетсяОтправкаПисемВФорматеHTML() Экспорт + + Возврат ПолучитьФункциональнуюОпцию("ОтправлятьПисьмаВФорматеHTML"); + +КонецФункции + +// Включает или выключает возможность учета телефонных звонков, SMS-сообщений, +// встреч и планирования взаимодействий. +// +// Параметры: +// Значение - Булево +// +Процедура УстановитьИспользованиеПрочегоВзаимодействия(Знач Значение) Экспорт + + Константы.ИспользоватьПрочиеВзаимодействия.Установить(Значение); + +КонецПроцедуры + +// Проверяет возможность использования учета телефонных звонков, SMS-сообщений, встреч и планирования взаимодействий. +// +// Возвращаемое значение: +// Булево +// +Функция ИспользуютсяПрочиеВзаимодействия() Экспорт + + Возврат ПолучитьФункциональнуюОпцию("ИспользоватьПрочиеВзаимодействия"); + +КонецФункции + // Вызывается из обработчиков заполнения документов - взаимодействий и предметов заполнения. // Выполняет необходимые действия по заполнению реквизитов по умолчанию. // @@ -60,6 +128,9 @@ Если ДанныеЗаполнения.Свойство("УчетнаяЗапись") И ЗначениеЗаполнено(ДанныеЗаполнения.УчетнаяЗапись) Тогда Объект.УчетнаяЗапись = ДанныеЗаполнения.УчетнаяЗапись; КонецЕсли; + Если ДанныеЗаполнения.Свойство("МестоПроведенияВстречи") И ЗначениеЗаполнено(ДанныеЗаполнения.МестоПроведенияВстречи) Тогда + Объект.МестоПроведенияВстречи = ДанныеЗаполнения.МестоПроведенияВстречи; + КонецЕсли; КонецЕсли; // Заполним участников @@ -374,14 +445,6 @@ КонецПроцедуры -Функция ИспользуетсяПочтовыйКлиент() Экспорт - Возврат ПолучитьФункциональнуюОпцию("ИспользоватьПочтовыйКлиент"); -КонецФункции - -Функция ИспользуетсяПрочиеВзаимодействия() Экспорт - Возврат ПолучитьФункциональнуюОпцию("ИспользоватьПрочиеВзаимодействия"); -КонецФункции - // Возвращает список контактов предмету по заданному типу контактной информации. // Функция ПолучитьКонтактыПоПредмету(Предмет, ТипыКонтактнойИнформации) Экспорт @@ -487,7 +550,7 @@ // Создает и отправляет электронное письмо. // // Параметры: -// Сообщение - см. ШаблоныСообщенийСлужебный.СформироватьСообщение +// Сообщение - см. ПараметрыПисьма // УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - учетная запись, с которой будет отправлено письмо. // ОтправитьСразу - Булево - если Ложь, то письмо будет помещено в папку Исходящих и отправлено при общей отправке писем. // @@ -531,25 +594,21 @@ // Заполним реквизиты ВключатьТелоИсходногоПисьма, ОтображатьТелоИсходногоПисьма, УведомитьОДоставке и УведомитьОПрочтении. НастройкиПользователя = ПолучитьПараметрыРаботыПользователяДляИсходящегоЭлектронногоПисьма( УчетнаяЗапись, Сообщение.ДополнительныеПараметры.ФорматПисьма, Истина); - ЗаполнитьЗначенияСвойств(Письмо, НастройкиПользователя); + ЗаполнитьЗначенияСвойств(Письмо, НастройкиПользователя); + + Письмо.УведомитьОДоставке = Макс(Сообщение.ДополнительныеПараметры.УведомитьОДоставке, Письмо.УведомитьОДоставке); + Письмо.УведомитьОПрочтении = Макс(Сообщение.ДополнительныеПараметры.УведомитьОПрочтении, Письмо.УведомитьОПрочтении); + Письмо.УдалятьПослеОтправки = Ложь; - Письмо.Комментарий = КомментарийПоНаименованиюШаблона(Сообщение.ДополнительныеПараметры.Наименование); - СписокПолучателейСпискомЗначений =( ТипЗнч(Сообщение.Получатель) = Тип("СписокЗначений")); - Для Каждого ПолучательПисьма Из Сообщение.Получатель Цикл - + Письмо.Комментарий = Сообщение.ДополнительныеПараметры.Комментарий; + + Для Каждого ПолучательПисьма Из Сообщение.Получатели Цикл НоваяСтрока = Письмо["ПолучателиПисьма"].Добавить(); - - Если СписокПолучателейСпискомЗначений Тогда - НоваяСтрока.Адрес = ПолучательПисьма.Значение; - НоваяСтрока.Представление = ПолучательПисьма.Представление; - Иначе - НоваяСтрока.Адрес = ПолучательПисьма.Адрес; - НоваяСтрока.Представление = ПолучательПисьма.Представление; - НоваяСтрока.Контакт = ПолучательПисьма.ИсточникКонтактнойИнформации; - КонецЕсли; - + НоваяСтрока.Адрес = ПолучательПисьма.Адрес; + НоваяСтрока.Представление = ПолучательПисьма.Представление; + НоваяСтрока.Контакт = ПолучательПисьма.ИсточникКонтактнойИнформации; КонецЦикла; Письмо.СписокПолучателейПисьма = ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Письмо.ПолучателиПисьма, Ложь); @@ -569,7 +628,11 @@ // Если у идентификатора не английские символы, то письмо может быть некорректно обработано. Если ЗначениеЗаполнено(Вложение.Идентификатор) Тогда Идентификатор = СтроковыеФункции.СтрокаЛатиницей(Вложение.Идентификатор); - Письмо.ТекстHTML = СтрЗаменить(Письмо.ТекстHTML, "cid:" + Вложение.Идентификатор, "cid:" + Идентификатор); + Если СтрНайти(Письмо.ТекстHTML, "cid:" + Вложение.Идентификатор) > 0 Тогда + Письмо.ТекстHTML = СтрЗаменить(Письмо.ТекстHTML, "cid:" + Вложение.Идентификатор, "cid:" + Идентификатор); + Иначе + Письмо.ТекстHTML = СтрЗаменить(Письмо.ТекстHTML, Вложение.Идентификатор, "cid:" + Идентификатор); + КонецЕсли; Вложение.Идентификатор = Идентификатор; КонецЕсли; @@ -604,7 +667,7 @@ КонецЦикла; - Если Сообщение.ДополнительныеПараметры.Свойство("Предмет") И ЗначениеЗаполнено(Сообщение.ДополнительныеПараметры.Предмет) Тогда + Если ЗначениеЗаполнено(Сообщение.ДополнительныеПараметры.Предмет) Тогда Предмет = Сообщение.ДополнительныеПараметры.Предмет; Иначе Предмет = Письмо.Ссылка; @@ -626,9 +689,9 @@ ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,, Письмо, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); - РезультатОтправкиПисьма.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + РезультатОтправкиПисьма.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат РезультатОтправкиПисьма; КонецПопытки; @@ -640,7 +703,10 @@ КонецЕсли; Попытка - ИдентификаторПисьма = ВыполнитьОтправкуПисьма(Письмо); + РезультатОтправки = ВыполнитьОтправкуПисьма(Письмо); + ИдентификаторПисьма = РезультатОтправки.ИдентификаторПисьмаSMTP; + РезультатОтправкиПисьма.ОшибочныеПолучатели = РезультатОтправки.ОшибочныеПолучатели; + РезультатОтправкиПисьма.ИдентификаторПисьма = ИдентификаторПисьма; Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); @@ -652,7 +718,7 @@ УровеньЖурналаРегистрации.Ошибка,, Письмо, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, ТекстОшибки)); - РезультатОтправкиПисьма.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + РезультатОтправкиПисьма.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат РезультатОтправкиПисьма; КонецПопытки; @@ -679,10 +745,10 @@ ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,, Письмо, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); РезультатОтправкиПисьма.Отправлено = Ложь; - РезультатОтправкиПисьма.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + РезультатОтправкиПисьма.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат РезультатОтправкиПисьма; КонецПопытки; @@ -699,6 +765,65 @@ КонецФункции +// Функция-конструктор параметров письма. +// +// Возвращаемое значение: +// Структура: +// * Тема - Строка +// * Текст - Строка +// * СообщенияПользователю - ФиксированныйМассив +// * Получатели - ТаблицаЗначений: +// ** Представление - Строка +// ** АдресВоВременномХранилище - Строка +// ** ИсточникКонтактнойИнформации - ОпределяемыеТип.ВладелецКонтактнойИнформации +// * Вложения - ТаблицаЗначений: +// ** Представление - Строка +// ** АдресВоВременномХранилище - Строка +// ** Кодировка - Строка +// ** Идентификатор - Строка +// * ДополнительныеПараметры - Структура: +// ** Комментарий - Строка +// ** Предмет - ОпределяемыйТип.ПредметВзаимодействия +// ** ФорматПисьма - ПеречислениеСсылка.СпособыРедактированияЭлектронныхПисем +// ** УведомитьОДоставке - Булево +// ** УведомитьОПрочтении - Булево +// +Функция ПараметрыПисьма() Экспорт + + Сообщение = Новый Структура; + Сообщение.Вставить("Тема", ""); + Сообщение.Вставить("Текст", ""); + Сообщение.Вставить("СообщенияПользователю", Новый ФиксированныйМассив(Новый Массив)); + + ТипСтрока = Новый ОписаниеТипов("Строка"); + + Получатели = Новый ТаблицаЗначений; + Получатели.Колонки.Добавить("Адрес", ТипСтрока); + Получатели.Колонки.Добавить("Представление", ТипСтрока); + Получатели.Колонки.Добавить("ИсточникКонтактнойИнформации", Метаданные.ОпределяемыеТипы.ВладелецКонтактнойИнформации.Тип); + + Сообщение.Вставить("Получатели", Получатели); + + Вложения = Новый ТаблицаЗначений; + Вложения.Колонки.Добавить("Представление", ТипСтрока); + Вложения.Колонки.Добавить("АдресВоВременномХранилище", ТипСтрока); + Вложения.Колонки.Добавить("Кодировка", ТипСтрока); + Вложения.Колонки.Добавить("Идентификатор", ТипСтрока); + Сообщение.Вставить("Вложения", Вложения); + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("Комментарий", ""); + ДополнительныеПараметры.Вставить("Предмет", ""); + ДополнительныеПараметры.Вставить("ФорматПисьма", Перечисления.СпособыРедактированияЭлектронныхПисем.HTML); + ДополнительныеПараметры.Вставить("УведомитьОДоставке", Ложь); + ДополнительныеПараметры.Вставить("УведомитьОПрочтении", Ложь); + + Сообщение.Вставить("ДополнительныеПараметры", ДополнительныеПараметры); + + Возврат Сообщение; + +КонецФункции + // Создает документ Сообщение SMS и отправляет его. // // Параметры: @@ -718,7 +843,7 @@ СообщениеSMS.ТекстСообщения = Сообщение.Текст; СообщениеSMS.Тема = ТемаПоТекстуСообщения(Сообщение.Текст); СообщениеSMS.ОтправлятьВТранслите = Сообщение.ДополнительныеПараметры.ПеревестиВТранслит; - СообщениеSMS.Комментарий = КомментарийПоНаименованиюШаблона(Сообщение.ДополнительныеПараметры.Наименование); + СообщениеSMS.Комментарий = НСтр("ru = 'Создано и отправлено по шаблону'") + " - " + Сообщение.ДополнительныеПараметры.Наименование; Для каждого АдресатSMS Из Сообщение.Получатель Цикл @@ -761,16 +886,13 @@ // Устанавливает состояние "Исходящее" для документа сообщение SMS и всех входящих в него сообщений. // // Параметры: -// Объект - ДокументСсылка.СообщениеSMS - документ, для которого устанавливается состояние. +// Объект - ДокументОбъект.СообщениеSMS, ДанныеФормыСтруктура // Процедура УстановитьСостояниеИсходящееДокументСообщениеSMS(Объект) Экспорт Для каждого Адресат Из Объект.Адресаты Цикл - Адресат.СостояниеСообщения = ПредопределенноеЗначение("Перечисление.СостоянияСообщенияSMS.Исходящее"); - КонецЦикла; - Объект.Состояние = ПредопределенноеЗначение("Перечисление.СостоянияДокументаСообщениеSMS.Исходящее"); КонецПроцедуры @@ -1214,14 +1336,14 @@ ЗаписьЖурналаРегистрации(НСтр("ru='Поиск и замена ссылок'", ОбщегоНазначения.КодОсновногоЯзыка()) ,УровеньЖурналаРегистрации.Ошибка ,НеобработанныйДубль.ЗаменяемоеЗначение.Метаданные - ,,ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ,,ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЦикла; КонецПроцедуры -//// АПК:299-вкл +// АПК:299-вкл // Проверяет, выполняется ли фоновое задание по отправке и получению писем. // @@ -1255,9 +1377,7 @@ // Функция ИмяПоляДляНаименованияВладельца(ИмяТаблицы) Экспорт - ОписанияКонтактов = ВзаимодействияКлиентСервер.ОписанияКонтактов(); - - Для каждого ОписаниеКонтакта Из ОписанияКонтактов Цикл + Для каждого ОписаниеКонтакта Из ВзаимодействияКлиентСервер.ОписанияКонтактов() Цикл Если ОписаниеКонтакта.Имя = ИмяТаблицы И ОписаниеКонтакта.ЕстьВладелец Тогда Возврат "СправочникКонтакт.Владелец.Наименование"; КонецЕсли; @@ -1338,48 +1458,42 @@ // Устанавливает текущим контакт в форме "Адресной книге" и "Выборе контактов". // // Параметры: -// Контакт - СправочникСсылка - контакт на котором необходимо спозиционироваться в форме. -// Форма - ФормаКлиентскогоПриложения - форма для которой выполняются действия, содержит: -// * Элементы - ВсеЭлементыФормы - содержит: +// Контакт - СправочникСсылка - контакт, на котором необходимо спозиционироваться в форме. +// Форма - ФормаКлиентскогоПриложения - форма, для которой выполняются действия: +// * Элементы - ВсеЭлементыФормы: // ** СписокПользователей - ТаблицаФормы - элемент формы, содержащий список пользователей. // Процедура УстановитьТекущимКонтакт(Контакт, Форма) Экспорт - ПрефиксТаблица = ВзаимодействияКлиентСервер.ПрефиксТаблица(); - Если ТипЗнч(Контакт) = Тип("СправочникСсылка.Пользователи") Тогда - Форма.Элементы.СтраницыСписки.ТекущаяСтраница = Форма.Элементы.СтраницаПользователей; Форма.Элементы.СписокПользователей.ТекущаяСтрока = Контакт; - - Иначе - - МассивОписанийКонтактов = ВзаимодействияКлиентСервер.ОписанияКонтактов(); - ИмяМетаданныхКонтакта = Контакт.Метаданные().Имя; - - Для каждого ЭлементМассиваОписания Из МассивОписанийКонтактов Цикл - Если ЭлементМассиваОписания.Имя = ИмяМетаданныхКонтакта Тогда - Форма.Элементы.СтраницыСписки.ТекущаяСтраница = - Форма.Элементы["Страница_" + ?(ЭлементМассиваОписания.ЕстьВладелец, - ЭлементМассиваОписания.ИмяВладельца, - ЭлементМассиваОписания.Имя)]; - ТаблицаФормы = ТаблицаФормыПоИмени(Форма, ПрефиксТаблица + ЭлементМассиваОписания.Имя); - ТаблицаФормы.ТекущаяСтрока = Контакт; - Если ЭлементМассиваОписания.ЕстьВладелец Тогда - ТаблицаФормы = ТаблицаФормыПоИмени(Форма, ПрефиксТаблица + ЭлементМассиваОписания.ИмяВладельца); - ТаблицаФормы.ТекущаяСтрока = Контакт.Владелец; - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( - Форма["Список_" + ЭлементМассиваОписания.Имя],"Владелец",Контакт.Владелец,,,Истина); - КонецЕсли; - ИначеЕсли ЭлементМассиваОписания.ИмяВладельца = ИмяМетаданныхКонтакта Тогда - Форма.Элементы.СтраницыСписки.ТекущаяСтраница = - Форма.Элементы["Страница_" + ЭлементМассиваОписания.ИмяВладельца]; - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( - Форма["Список_" + ЭлементМассиваОписания.Имя],"Владелец",Контакт,,,Истина); - КонецЕсли; - КонецЦикла; - + Возврат; КонецЕсли; + + ПрефиксТаблица = ВзаимодействияКлиентСервер.ПрефиксТаблица(); + ИмяМетаданныхКонтакта = Контакт.Метаданные().Имя; + + Для каждого ОписаниеКонтакта Из ВзаимодействияКлиентСервер.ОписанияКонтактов() Цикл + Если ОписаниеКонтакта.Имя = ИмяМетаданныхКонтакта Тогда + Форма.Элементы.СтраницыСписки.ТекущаяСтраница = + Форма.Элементы["Страница_" + ?(ОписаниеКонтакта.ЕстьВладелец, + ОписаниеКонтакта.ИмяВладельца, ОписаниеКонтакта.Имя)]; + ТаблицаФормы = ТаблицаФормыПоИмени(Форма, ПрефиксТаблица + ОписаниеКонтакта.Имя); + ТаблицаФормы.ТекущаяСтрока = Контакт; + Если ОписаниеКонтакта.ЕстьВладелец Тогда + ТаблицаФормы = ТаблицаФормыПоИмени(Форма, ПрефиксТаблица + ОписаниеКонтакта.ИмяВладельца); + ТаблицаФормы.ТекущаяСтрока = Контакт.Владелец; + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( + Форма["Список_" + ОписаниеКонтакта.Имя],"Владелец",Контакт.Владелец,,, Истина); + КонецЕсли; + ИначеЕсли ОписаниеКонтакта.ИмяВладельца = ИмяМетаданныхКонтакта Тогда + Форма.Элементы.СтраницыСписки.ТекущаяСтраница = + Форма.Элементы["Страница_" + ОписаниеКонтакта.ИмяВладельца]; + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( + Форма["Список_" + ОписаниеКонтакта.Имя],"Владелец",Контакт,,, Истина); + КонецЕсли; + КонецЦикла; КонецПроцедуры @@ -1490,7 +1604,7 @@ // на основании переданной таблицы значений. // // Параметры: -// ТаблицаКонтакты - ТаблицаЗначений - таблица значений источник, содержит колонки: +// ТаблицаКонтактов - ТаблицаЗначений - таблица значений источник, содержит колонки: // * Контакт - ОпределяемыйТип.КонтактВзаимодействия - ссылка на контакт взаимодействий. // * Представление - Строка - представление контакта. // * Наименование - Строка - наименование контакта. @@ -1501,9 +1615,9 @@ // * НаименованиеКонтакта - Строка - наименование контакта. // * ИмяСправочника - Строка - имя объекта метаданных контакта. // -Процедура ЗаполнитьНайденныеКонтакты(ТаблицаКонтакты, НайденныеКонтакты) Экспорт +Процедура ЗаполнитьНайденныеКонтакты(ТаблицаКонтактов, НайденныеКонтакты) Экспорт - Для Каждого Стр Из ТаблицаКонтакты Цикл + Для Каждого Стр Из ТаблицаКонтактов Цикл НоваяСтрока = НайденныеКонтакты.Добавить(); НоваяСтрока.Ссылка = Стр.Контакт; НоваяСтрока.Представление = Стр.Представление; @@ -1521,9 +1635,8 @@ // Функция МетаданныеКонтактов() - ОписанияКонтактов = ВзаимодействияКлиентСервер.ОписанияКонтактов(); Результат = Новый Массив; - Для каждого ОписаниеКонтакта Из ОписанияКонтактов Цикл + Для каждого ОписаниеКонтакта Из ВзаимодействияКлиентСервер.ОписанияКонтактов() Цикл Результат.Добавить(Метаданные.Справочники[ОписаниеКонтакта.Имя]); КонецЦикла; Возврат Результат; @@ -1567,16 +1680,16 @@ ТекстЗапроса = ТекстЗапроса + ТекстЗапросаДляПоиска; КонецЕсли; - ТекстЗапроса = ТекстЗапроса + ТекстЗапросаНаПолучениеИнформацииОКонтактах(ВключатьEmail); + ТекстЗапроса = ТекстЗапроса + Символы.ПС + ";" + Символы.ПС + + ТекстЗапросаНаПолучениеИнформацииОКонтактах(ВключатьEmail); - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; + Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("Предмет", Предмет); - ТаблицаКонтакты = Запрос.Выполнить().Выгрузить(); + ТаблицаКонтактов = Запрос.Выполнить().Выгрузить(); - ТаблицаКонтакты.Колонки.Добавить("ПредставлениеНаименования"); + ТаблицаКонтактов.Колонки.Добавить("ПредставлениеНаименования"); - Для Каждого СтрокаТаблицы Из ТаблицаКонтакты Цикл + Для Каждого СтрокаТаблицы Из ТаблицаКонтактов Цикл СтрокаТаблицы = СтрокаТаблицыКонтакты(СтрокаТаблицы); СтрокаТаблицы.ПредставлениеНаименования = СтрокаТаблицы.Наименование + ?(ПустаяСтрока(СтрокаТаблицы.НаименованиеВладельца), @@ -1584,7 +1697,7 @@ " (" + СтрокаТаблицы.НаименованиеВладельца + ")"); КонецЦикла; - Возврат ТаблицаКонтакты; + Возврат ТаблицаКонтактов; КонецФункции @@ -1603,9 +1716,8 @@ КонецФункции -// Возвращает текст запроса, отбирающего все контакты по цепочке взаимодействий. // Параметры: -// ПомещатьВоВременнуюТаблицу - флаг помещения промежуточных результатов во временную таблицу. +// ПомещатьВоВременнуюТаблицу - Булево // Функция ТекстЗапросаПоискКонтактовПоЦепочкеВзаимодействий(ПомещатьВоВременнуюТаблицу) @@ -1622,23 +1734,19 @@ СписокПоиска.Добавить("ЭлектронноеПисьмоИсходящее.ПолучателиОтвета", "Контакт"); СписокПоиска.Добавить("ЭлектронноеПисьмоИсходящее.ПолучателиСкрытыхКопий", "Контакт"); - ТекстЗапроса = ""; - ПостфиксВыбрать = " РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ"; - ТекстВременнаяТаблица = ?( - ПомещатьВоВременнуюТаблицу, - "ПОМЕСТИТЬ ТаблицаКонтакты - |", - ""); - ТекстОбъединить = ""; + ТекстВременнаяТаблица = ?(ПомещатьВоВременнуюТаблицу, "ПОМЕСТИТЬ ТаблицаКонтактов + |", + ""); // @query-part-1 ШаблонУсловияНаСсылки = ШаблонУсловияНаСсылкиКонтактовДляЗапроса(); + ТекстыЗапроса = Новый Массив; Для Каждого ЭлементСписка Из СписокПоиска Цикл ИмяТаблицы = ЭлементСписка.Значение; ИмяПоля = ЭлементСписка.Представление; УсловиеНаСсылки = СтрЗаменить(ШаблонУсловияНаСсылки, "%ИмяПоля%", ИмяПоля); - ТекстЗапроса = ТекстЗапроса + (ТекстОбъединить - + "ВЫБРАТЬ &ПостфиксВыбрать, + ТекстЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ | &ИмяПоляКонтакта | ,&ТекстПоместить |ИЗ @@ -1647,25 +1755,22 @@ | ПО КонтактыВзаимодействия.Ссылка = ПредметыВзаимодействий.Взаимодействие | ГДЕ | ПредметыВзаимодействий.Предмет = &Предмет - | И (&УсловиеНаСсылки)"); + | И (&УсловиеНаСсылки)"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПостфиксВыбрать,", ПостфиксВыбрать); + Если ТекстыЗапроса.Количество() > 0 Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ РАЗЛИЧНЫЕ"); // @query-part-1, @query-part-2 + КонецЕсли; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ",&ТекстПоместить", ТекстВременнаяТаблица); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", "Документ." + ИмяТаблицы); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеНаСсылки", УсловиеНаСсылки); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляКонтакта", "КонтактыВзаимодействия." + ИмяПоля); - ПостфиксВыбрать = "РАЗЛИЧНЫЕ"; ТекстВременнаяТаблица = ""; - ТекстОбъединить = " - | - |ОБЪЕДИНИТЬ ВСЕ - | - |"; + ТекстыЗапроса.Добавить(ТекстЗапроса); КонецЦикла; - Возврат ТекстЗапроса; + Возврат СтрСоединить(ТекстыЗапроса, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС); КонецФункции @@ -1705,11 +1810,8 @@ Возврат Неопределено; КонецЕсли; - ТекстЗапроса = СформироватьТекстЗапросаДляПоискаПоEmail(Истина,Истина); - - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - + ТекстЗапроса = СформироватьТекстЗапросаДляПоискаПоEmail(Истина, Истина); + Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("Адрес", СписокАдресов); Возврат Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); @@ -1741,7 +1843,7 @@ КонецФункции -// Формирует строку выборки поля, для получения в запросе адреса электронной почты. +// Формирует строку выборки поля для получения в запросе адреса электронной почты. // // Параметры: // ВключатьEmail - Булево - признак необходимости получения в данном запросе @@ -1750,26 +1852,20 @@ // ИменоватьПоле - Булево - признак того, что поле в запросе необходимо именовать. // // Возвращаемое значение: -// Строка - строка, дополняющая запрос. +// Строка // -Функция ПолучитьСтрокуПроАдресДляЗапросаИнформацииОКонтактах(ВключатьEmail, ИмяСправочника, ИменоватьПоле = Ложь) +Функция ФрагментЗапросаИнформацияОКонтактах(ВключатьEmail, ИмяСправочника, ИменоватьПоле = Ложь) Если Не ВключатьEmail Тогда - Возврат ""; + КонецЕсли; + Если НаличиеТабличнойЧастиУСправочника(ИмяСправочника, "КонтактнаяИнформация") Тогда + Возврат ", + | ТаблицаКонтактнаяИнформация.АдресЭП"; Иначе - - Если НаличиеТабличнойЧастиУСправочника(ИмяСправочника,"КонтактнаяИнформация")Тогда - Возврат ", - | ТаблицаКонтактнаяИнформация.АдресЭП"; - Иначе - - Возврат ", - | """"" + ?(ИменоватьПоле," КАК АдресЭП",""); - - КонецЕсли; - + Возврат ", + | """"" + ?(ИменоватьПоле," КАК АдресЭП",""); КонецЕсли; КонецФункции @@ -1780,74 +1876,66 @@ // ВключатьEmail - Булево - признак необходимости получения информации о Email. // // Возвращаемое значение: -// Строка - текст запроса. +// Строка // Функция ТекстЗапросаНаПолучениеИнформацииОКонтактах(ВключатьEmail) - МассивОписанияТиповКонтактов = ВзаимодействияКлиентСервер.ОписанияКонтактов(); - - ТекстЗапроса ="; - | - |////////////////////////////////////////////////////////////////////////////////"; - - ТекстЗапроса = ТекстЗапроса + " - |ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ + ТекстЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ | СправочникКонтакт.Ссылка КАК Ссылка, | СправочникКонтакт.Наименование КАК Наименование, | """" КАК НаименованиеВладельца | ,&ПолеАдресЭлектроннойПочты |ИЗ - | ТаблицаКонтакты КАК ТаблицаКонтакты + | ТаблицаКонтактов КАК ТаблицаКонтактов | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК СправочникКонтакт - | ПО ТаблицаКонтакты.Контакт = СправочникКонтакт.Ссылка + | ПО ТаблицаКонтактов.Контакт = СправочникКонтакт.Ссылка | И &ТекстСоединенияПоАдресуЭлектроннойПочты |ГДЕ | (НЕ СправочникКонтакт.ПометкаУдаления) |"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ",&ПолеАдресЭлектроннойПочты", ПолучитьСтрокуПроАдресДляЗапросаИнформацииОКонтактах(ВключатьEmail,"Пользователи")); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ТекстСоединенияПоАдресуЭлектроннойПочты", СтрокаСоединенияДляЗапросаИнформацииОКонтактах(ВключатьEmail,"Пользователи")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ",&ПолеАдресЭлектроннойПочты", + ФрагментЗапросаИнформацияОКонтактах(ВключатьEmail, "Пользователи")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ТекстСоединенияПоАдресуЭлектроннойПочты", + СтрокаСоединенияДляЗапросаИнформацииОКонтактах(ВключатьEmail, "Пользователи")); + ТекстыЗапроса = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ТекстЗапроса); + + Для каждого ОписаниеКонтакта Из ВзаимодействияКлиентСервер.ОписанияКонтактов() Цикл - Для каждого ЭлементМассиваОписания Из МассивОписанияТиповКонтактов Цикл - - Если ЭлементМассиваОписания.Имя = "Пользователи" Тогда + Если ОписаниеКонтакта.Имя = "Пользователи" Тогда Продолжить; - Иначе - - ТекстЗапроса = ТекстЗапроса + " - |ОБЪЕДИНИТЬ - |"; - - ТекстЗапроса = ТекстЗапроса + " - |ВЫБРАТЬ - | СправочникКонтакт.Ссылка, - | СправочникКонтакт.Наименование, - | """" - | ,&ПолеАдресЭлектроннойПочты - |ИЗ - | ТаблицаКонтакты КАК ТаблицаКонтакты - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаСправочникКонтакт КАК СправочникКонтакт - | ПО ТаблицаКонтакты.Контакт = СправочникКонтакт.Ссылка - | И &ТекстСоединенияПоАдресуЭлектроннойПочты - |ГДЕ - | (НЕ СправочникКонтакт.ПометкаУдаления) - | И &УсловиеПоГруппе"; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ",&ПолеАдресЭлектроннойПочты",ПолучитьСтрокуПроАдресДляЗапросаИнформацииОКонтактах(ВключатьEmail,ЭлементМассиваОписания.Имя)); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ТекстСоединенияПоАдресуЭлектроннойПочты", СтрокаСоединенияДляЗапросаИнформацииОКонтактах(ВключатьEmail,ЭлементМассиваОписания.Имя)); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ТаблицаСправочникКонтакт", "Справочник." + ЭлементМассиваОписания.Имя); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеПоГруппе", ?(ЭлементМассиваОписания.Иерархический," И (НЕ СправочникКонтакт.Ссылка.ЭтоГруппа)","")); - КонецЕсли; + ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ + | СправочникКонтакт.Ссылка, + | СправочникКонтакт.Наименование, + | """" + | ,&ПолеАдресЭлектроннойПочты + |ИЗ + | ТаблицаКонтактов КАК ТаблицаКонтактов + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаСправочникКонтакт КАК СправочникКонтакт + | ПО ТаблицаКонтактов.Контакт = СправочникКонтакт.Ссылка + | И &ТекстСоединенияПоАдресуЭлектроннойПочты + |ГДЕ + | (НЕ СправочникКонтакт.ПометкаУдаления) + | И &УсловиеПоГруппе"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ",&ПолеАдресЭлектроннойПочты", + ФрагментЗапросаИнформацияОКонтактах(ВключатьEmail, ОписаниеКонтакта.Имя)); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ТекстСоединенияПоАдресуЭлектроннойПочты", + СтрокаСоединенияДляЗапросаИнформацииОКонтактах(ВключатьEmail, ОписаниеКонтакта.Имя)); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ТаблицаСправочникКонтакт", "Справочник." + ОписаниеКонтакта.Имя); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеПоГруппе", + ?(ОписаниеКонтакта.Иерархический, " И (НЕ СправочникКонтакт.Ссылка.ЭтоГруппа)", "")); + ТекстыЗапроса.Добавить(ТекстЗапроса); + КонецЦикла; - ТекстУпорядочитьПо = " - | - |УПОРЯДОЧИТЬ ПО - | Наименование"; - - ТекстЗапроса = ТекстЗапроса + ТекстУпорядочитьПо; + ТекстЗапроса = СтрСоединить(ТекстыЗапроса, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС) + + " + |УПОРЯДОЧИТЬ ПО + | Наименование"; // @query-part-1, @query-part-2 Возврат ТекстЗапроса; @@ -1859,14 +1947,12 @@ // ПоискПоСписку - Булево - признак того, что в качестве параметра передается массив значений. // // Возвращаемое значение: -// Строка - текст запроса. +// Строка // Функция СформироватьТекстЗапросаДляПоискаПоEmail(ПоискПоСписку, ИтогиПоEmail = Ложь) - МассивОписанияТиповКонтактов = ВзаимодействияКлиентСервер.ОписанияКонтактов(); - ТекстЗапроса = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ + "ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ | ТаблицаКонтактнойИнформации.Ссылка КАК Контакт, | ТаблицаКонтактнойИнформации.Представление, | """" КАК НаименованиеВладельца, @@ -1877,51 +1963,48 @@ | ТаблицаКонтактнойИнформации.АдресЭП = &Адрес | И (НЕ ТаблицаКонтактнойИнформации.Ссылка.ПометкаУдаления) | И ТаблицаКонтактнойИнформации.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)"; + ТекстыЗапроса = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ТекстЗапроса); - Для каждого ЭлементМассиваОписания Из МассивОписанияТиповКонтактов Цикл + Для каждого ОписаниеКонтакта Из ВзаимодействияКлиентСервер.ОписанияКонтактов() Цикл - Если ЭлементМассиваОписания.Имя = "Пользователи" Тогда + Если ОписаниеКонтакта.Имя = "Пользователи" Тогда Продолжить; - Иначе - - ТекстЗапроса = ТекстЗапроса + " - |ОБЪЕДИНИТЬ ВСЕ - |"; - - ТекстЗапроса = ТекстЗапроса + " - |ВЫБРАТЬ - | ТаблицаКонтактнойИнформации.Ссылка, - | ТаблицаКонтактнойИнформации.Представление, - | &ПолеНаименованиеВладельца, - | &ПолеНаименование КАК Наименование - |ИЗ - | &ТаблицаСправочника КАК ТаблицаКонтактнойИнформации - |ГДЕ - | ТаблицаКонтактнойИнформации.АдресЭП = &Адрес - | И (НЕ ТаблицаКонтактнойИнформации.Ссылка.ПометкаУдаления) - | И ТаблицаКонтактнойИнформации.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты) - | И &УсловиеГруппа"; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеНаименованиеВладельца", ?(ЭлементМассиваОписания.ЕстьВладелец," ТаблицаКонтактнойИнформации.Ссылка.Владелец.Наименование","""""")); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеНаименование", "ТаблицаКонтактнойИнформации.Ссылка." + ЭлементМассиваОписания.ИмяРеквизитаПредставлениеКонтакта); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСправочника", "Справочник." + ЭлементМассиваОписания.Имя + ".КонтактнаяИнформация"); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеГруппа", ?(ЭлементМассиваОписания.Иерархический," И (НЕ ТаблицаКонтактнойИнформации.Ссылка.ЭтоГруппа)","")); - - КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ТаблицаКонтактнойИнформации.Ссылка, + | ТаблицаКонтактнойИнформации.Представление, + | &ПолеНаименованиеВладельца, + | &ПолеНаименование КАК Наименование + |ИЗ + | &ТаблицаСправочника КАК ТаблицаКонтактнойИнформации + |ГДЕ + | ТаблицаКонтактнойИнформации.АдресЭП = &Адрес + | И (НЕ ТаблицаКонтактнойИнформации.Ссылка.ПометкаУдаления) + | И ТаблицаКонтактнойИнформации.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты) + | И &УсловиеГруппа"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеНаименованиеВладельца", + ?(ОписаниеКонтакта.ЕстьВладелец," ТаблицаКонтактнойИнформации.Ссылка.Владелец.Наименование", """""")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеНаименование", + "ТаблицаКонтактнойИнформации.Ссылка." + ОписаниеКонтакта.ИмяРеквизитаПредставлениеКонтакта); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСправочника", + "Справочник." + ОписаниеКонтакта.Имя + ".КонтактнаяИнформация"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеГруппа", + ?(ОписаниеКонтакта.Иерархический," И (НЕ ТаблицаКонтактнойИнформации.Ссылка.ЭтоГруппа)","")); + ТекстыЗапроса.Добавить(ТекстЗапроса); КонецЦикла; - ТекстЗапроса = ТекстЗапроса + " - | - |УПОРЯДОЧИТЬ ПО - | Наименование"; - + ТекстЗапроса = СтрСоединить(ТекстыЗапроса, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС) // @query-part + + " + |УПОРЯДОЧИТЬ ПО + | Наименование"; // @query-part Если ИтогиПоEmail Тогда ТекстЗапроса = ТекстЗапроса + " - | |ИТОГИ ПО - | Представление"; // @query-part-1 + | Представление"; // @query-part КонецЕсли; Если ПоискПоСписку Тогда @@ -1943,12 +2026,12 @@ // Функция НайтиКонтактыСАдресамиПоНаименованию(Знач СтрокаПоиска, НайденныеКонтакты) Экспорт - ТаблицаКонтакты = НайтиКонтактыСАдресами(СтрокаПоиска); - Если ТаблицаКонтакты = Неопределено ИЛИ ТаблицаКонтакты.Количество() = 0 Тогда + ТаблицаКонтактов = НайтиКонтактыСАдресами(СтрокаПоиска); + Если ТаблицаКонтактов = Неопределено ИЛИ ТаблицаКонтактов.Количество() = 0 Тогда Возврат Ложь; КонецЕсли; - ЗаполнитьНайденныеКонтакты(ТаблицаКонтакты, НайденныеКонтакты); + ЗаполнитьНайденныеКонтакты(ТаблицаКонтактов, НайденныеКонтакты); Возврат Истина; КонецФункции @@ -1977,29 +2060,27 @@ КонецФункции -// Формирует шаблон условия для запроса, на соответствие получаемого поля в запросе типу возможного контакта. +// Формирует шаблон условия для запроса на соответствие получаемого поля в запросе типу возможного контакта. // // Возвращаемое значение: -// Строка - сформированный текст шаблона условия. +// Строка // Функция ШаблонУсловияНаСсылкиКонтактовДляЗапроса() - МассивОписанияТиповКонтактов = ВзаимодействияКлиентСервер.ОписанияКонтактов(); - - ТекстКВозврату = "КонтактыВзаимодействия.%ИмяПоля% ССЫЛКА Справочник.Пользователи"; - - Для каждого ЭлементМассиваОписания Из МассивОписанияТиповКонтактов Цикл - - Если ЭлементМассиваОписания.Имя = "Пользователи" Тогда + Результат = "КонтактыВзаимодействия.ИмяПоля ССЫЛКА Справочник.Пользователи"; // @query-part + Для каждого ОписаниеКонтакта Из ВзаимодействияКлиентСервер.ОписанияКонтактов() Цикл + Если ОписаниеКонтакта.Имя = "Пользователи" Тогда Продолжить; - Иначе - ТекстКВозврату = ТекстКВозврату + " - |ИЛИ КонтактыВзаимодействия.%ИмяПоля% ССЫЛКА Справочник." + ЭлементМассиваОписания.Имя; // @query-part КонецЕсли; - - КонецЦикла; - Возврат ТекстКВозврату; + ШаблонУсловия = "ИЛИ КонтактыВзаимодействия.ИмяПоля ССЫЛКА Справочник.Пользователи"; // @query-part + ШаблонУсловия = СтрЗаменить(ШаблонУсловия, "Пользователи", ОписаниеКонтакта.Имя); + + Результат = Результат + Символы.ПС + ШаблонУсловия; + КонецЦикла; + + Результат = СтрЗаменить(Результат, "ИмяПоля", "%ИмяПоля%"); + Возврат Результат; КонецФункции @@ -2009,13 +2090,13 @@ ИЛИ Не ПолучитьФункциональнуюОпцию("ИспользоватьПолнотекстовыйПоиск") Тогда НайтиКонтактыСАдресамиПоНаименованию(СтрокаПоиска, НайденныеКонтакты); Возврат ""; - Иначе - Результат = ПолнотекстовыйПоискКонтактовПоСтроке(СтрокаПоиска, НайденныеКонтакты, ДляАдреснойКниги); - Если ПустаяСтрока(Результат) Тогда - НайтиПоEmail(СтрокаПоиска, Ложь, НайденныеКонтакты); - КонецЕсли; - Возврат Результат; КонецЕсли; + + Результат = ПолнотекстовыйПоискКонтактовПоСтроке(СтрокаПоиска, НайденныеКонтакты, ДляАдреснойКниги); + Если ПустаяСтрока(Результат) Тогда + НайтиПоEmail(СтрокаПоиска, Ложь, НайденныеКонтакты); + КонецЕсли; + Возврат Результат; КонецФункции @@ -2032,16 +2113,16 @@ Функция НайтиПоEmail(Знач СтрокаПоиска, Знач ПоДомену, НайденныеКонтакты) Экспорт Если ПоДомену Тогда - ТаблицаКонтакты = КонтактыПоДоменномуАдресу(СтрокаПоиска); + ТаблицаКонтактов = КонтактыПоДоменномуАдресу(СтрокаПоиска); Иначе - ТаблицаКонтакты = КонтактыПоEmail(СтрокаПоиска); + ТаблицаКонтактов = КонтактыПоEmail(СтрокаПоиска); КонецЕсли; - Если ТаблицаКонтакты = Неопределено ИЛИ ТаблицаКонтакты.Количество() = 0 Тогда + Если ТаблицаКонтактов = Неопределено ИЛИ ТаблицаКонтактов.Количество() = 0 Тогда Возврат Ложь; КонецЕсли; - ЗаполнитьНайденныеКонтакты(ТаблицаКонтакты, НайденныеКонтакты); + ЗаполнитьНайденныеКонтакты(ТаблицаКонтактов, НайденныеКонтакты); Возврат Истина; КонецФункции @@ -2060,55 +2141,47 @@ Возврат Неопределено; КонецЕсли; - ПерваяТаблица = Истина; - ТекстЗапроса = ""; - - ОписанияКонтактов = ВзаимодействияКлиентСервер.ОписанияКонтактов(); - Для каждого ОписаниеКонтакта Из ОписанияКонтактов Цикл + ТекстыЗапроса = Новый Массив; + Для каждого ОписаниеКонтакта Из ВзаимодействияКлиентСервер.ОписанияКонтактов() Цикл - Если ОписаниеКонтакта.ИскатьПоДомену Тогда + Если Не ОписаниеКонтакта.ИскатьПоДомену Тогда + Продолжить; + КонецЕсли; - Если Не ПерваяТаблица Тогда - - ТекстЗапроса = ТекстЗапроса + " - |ОБЪЕДИНИТЬ ВСЕ - |"; - - КонецЕсли; - - ТекстЗапроса = ТекстЗапроса + " - |ВЫБРАТЬ &ПостфиксВыбрать, - | ТаблицаКонтактнаяИнформация.Ссылка КАК Контакт, - | &ПолеНаименование КАК Наименование, - | ТаблицаКонтактнаяИнформация.АдресЭП КАК Представление, - | &ПолеНаименованиеВладельца КАК НаименованиеВладельца - |ИЗ - | &ИмяТаблицы КАК ТаблицаКонтактнаяИнформация - |ГДЕ - | ТаблицаКонтактнаяИнформация.АдресЭП ПОДОБНО &СтрокаПоиска СПЕЦСИМВОЛ ""~"""; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПостфиксВыбрать,", ?(ПерваяТаблица, "РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ ", "")); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеНаименованиеВладельца", ?(ОписаниеКонтакта.ЕстьВладелец,"ТаблицаКонтактнаяИнформация.Ссылка.Владелец.Наименование ","""""")); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеНаименование", "ТаблицаКонтактнаяИнформация.Ссылка." + ОписаниеКонтакта.ИмяРеквизитаПредставлениеКонтакта); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", "Справочник." + ОписаниеКонтакта.Имя + ".КонтактнаяИнформация"); - - ПерваяТаблица = Ложь; + ТекстЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ + | ТаблицаКонтактнаяИнформация.Ссылка КАК Контакт, + | &ПолеНаименование КАК Наименование, + | ТаблицаКонтактнаяИнформация.АдресЭП КАК Представление, + | &ПолеНаименованиеВладельца КАК НаименованиеВладельца + |ИЗ + | &ИмяТаблицы КАК ТаблицаКонтактнаяИнформация + |ГДЕ + | ТаблицаКонтактнаяИнформация.АдресЭП ПОДОБНО &СтрокаПоиска СПЕЦСИМВОЛ ""~"""; + + Если ТекстыЗапроса.Количество() > 0 Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ РАЗЛИЧНЫЕ"); // @query-part-1, @query-part-2 КонецЕсли; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеНаименованиеВладельца", + ?(ОписаниеКонтакта.ЕстьВладелец, "ТаблицаКонтактнаяИнформация.Ссылка.Владелец.Наименование ", """""")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеНаименование", + "ТаблицаКонтактнаяИнформация.Ссылка." + ОписаниеКонтакта.ИмяРеквизитаПредставлениеКонтакта); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", "Справочник." + ОписаниеКонтакта.Имя + ".КонтактнаяИнформация"); + ТекстыЗапроса.Добавить(ТекстЗапроса); + КонецЦикла; - Если НЕ ПерваяТаблица Тогда - ТекстЗапроса = ТекстЗапроса + " + Если ТекстыЗапроса.Количество() = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + ТекстЗапроса = СтрСоединить(ТекстыЗапроса, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС) + " |УПОРЯДОЧИТЬ ПО | Ссылка, - | АдресЭП"; - Иначе - Возврат Неопределено; - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - Запрос.УстановитьПараметр("СтрокаПоиска", "%@" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(ИмяДомена) + "%"); + | АдресЭП"; // @query-part-1, @query-part-2 + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("СтрокаПоиска", "%@" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(ИмяДомена) + "%"); Возврат Запрос.Выполнить().Выгрузить(); КонецФункции @@ -2165,7 +2238,7 @@ Если ДляАдреснойКниги Тогда ТекстЗапроса = ПолучитьТекстЗапросаПоискКонтактовПоСтрокеСEmail(); Иначе - ТекстЗапроса = ПолучитьТекстЗапросаПоискКонтактовПоСтроке(); + ТекстЗапроса = ТекстЗапросаПоискКонтактовПоСтроке(); КонецЕсли; Запрос = Новый Запрос; @@ -2189,11 +2262,9 @@ // Формирует текст запроса для поиска контактов по строке. // // Возвращаемое значение: -// Строка - текст запроса. +// Строка // -Функция ПолучитьТекстЗапросаПоискКонтактовПоСтроке() - - МассивОписанияТиповКонтактов = ВзаимодействияКлиентСервер.ОписанияКонтактов(); +Функция ТекстЗапросаПоискКонтактовПоСтроке() ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ @@ -2205,20 +2276,17 @@ | Справочник.Пользователи КАК ТаблицаСправочника |ГДЕ | ТаблицаСправочника.Ссылка В(&МассивСсылок) - | И (НЕ ТаблицаСправочника.ПометкаУдаления)"; + | И (НЕ ТаблицаСправочника.ПометкаУдаления)"; + ТекстыЗапроса = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ТекстЗапроса); - Для каждого ЭлементМассиваОписания Из МассивОписанияТиповКонтактов Цикл + Для каждого ОписаниеКонтакта Из ВзаимодействияКлиентСервер.ОписанияКонтактов() Цикл - Если ЭлементМассиваОписания.Имя = "Пользователи" Тогда + Если ОписаниеКонтакта.Имя = "Пользователи" Тогда Продолжить; КонецЕсли; - ТекстЗапроса =ТекстЗапроса + " - |ОБЪЕДИНИТЬ ВСЕ - |"; - - ТекстЗапроса =ТекстЗапроса + " - |ВЫБРАТЬ + ТекстЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ | ТаблицаСправочника.Ссылка, | &ИмяПоляНаименование КАК Наименование, | &ИмяПоляНаименованиеВладельца, @@ -2230,17 +2298,21 @@ | И &УсловиеИерархический | И (НЕ ТаблицаСправочника.ПометкаУдаления)"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляНаименованиеВладельца", ?(ЭлементМассиваОписания.ЕстьВладелец," ТаблицаСправочника.Владелец.Наименование","""""")); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляНаименование", "ТаблицаСправочника." + ЭлементМассиваОписания.ИмяРеквизитаПредставлениеКонтакта); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСправочника", "Справочник." +ЭлементМассиваОписания.Имя); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеИерархический", ?(ЭлементМассиваОписания.Иерархический," И (НЕ ТаблицаСправочника.ЭтоГруппа)","")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляНаименованиеВладельца", + ?(ОписаниеКонтакта.ЕстьВладелец," ТаблицаСправочника.Владелец.Наименование", """""")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляНаименование", + "ТаблицаСправочника." + ОписаниеКонтакта.ИмяРеквизитаПредставлениеКонтакта); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСправочника", "Справочник." + ОписаниеКонтакта.Имя); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеИерархический", + ?(ОписаниеКонтакта.Иерархический," И (НЕ ТаблицаСправочника.ЭтоГруппа)", "")); + ТекстыЗапроса.Добавить(ТекстЗапроса); КонецЦикла; - ТекстЗапроса = ТекстЗапроса + " - | - |УПОРЯДОЧИТЬ ПО - | Наименование"; + ТекстЗапроса = СтрСоединить(ТекстыЗапроса, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС) + + " + |УПОРЯДОЧИТЬ ПО + | Наименование"; // @query-part-1, @query-part-2 Возврат ТекстЗапроса; @@ -2253,8 +2325,6 @@ // Функция ПолучитьТекстЗапросаПоискКонтактовПоСтрокеСEmail() - МассивОписанияТиповКонтактов = ВзаимодействияКлиентСервер.ОписанияКонтактов(); - ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ | ТаблицаСправочника.Ссылка КАК Контакт, @@ -2268,20 +2338,17 @@ | И (ТаблицаКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)) |ГДЕ | ТаблицаСправочника.Ссылка В(&МассивСсылок) - | И (НЕ ТаблицаСправочника.ПометкаУдаления)"; + | И (НЕ ТаблицаСправочника.ПометкаУдаления)"; + ТекстыЗапроса = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ТекстЗапроса); - Для каждого ЭлементМассиваОписания Из МассивОписанияТиповКонтактов Цикл + Для каждого ОписаниеКонтакта Из ВзаимодействияКлиентСервер.ОписанияКонтактов() Цикл - Если ЭлементМассиваОписания.Имя = "Пользователи" Тогда + Если ОписаниеКонтакта.Имя = "Пользователи" Тогда Продолжить; КонецЕсли; - ТекстЗапроса =ТекстЗапроса + " - |ОБЪЕДИНИТЬ ВСЕ - |"; - - ТекстЗапроса =ТекстЗапроса + " - |ВЫБРАТЬ + ТекстЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ | ТаблицаСправочника.Ссылка, | &ИмяПоляНаименование КАК Наименование, | &ИмяПоляНаименованиеВладельца, @@ -2296,18 +2363,23 @@ | И &УсловиеИерархический | И (НЕ ТаблицаСправочника.ПометкаУдаления)"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляНаименованиеВладельца", ?(ЭлементМассиваОписания.ЕстьВладелец," ТаблицаСправочника.Владелец.Наименование","""""")); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляНаименование", "ТаблицаСправочника." + ЭлементМассиваОписания.ИмяРеквизитаПредставлениеКонтакта); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСправочника", "Справочник." +ЭлементМассиваОписания.Имя); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеИерархический", ?(ЭлементМассиваОписания.Иерархический," И (НЕ ТаблицаСправочника.ЭтоГруппа)","")); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИмяТаблицаКонтактнаяИнформация" ,"Справочник." + ЭлементМассиваОписания.Имя + ".КонтактнаяИнформация"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляНаименованиеВладельца", + ?(ОписаниеКонтакта.ЕстьВладелец," ТаблицаСправочника.Владелец.Наименование","""""")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляНаименование", + "ТаблицаСправочника." + ОписаниеКонтакта.ИмяРеквизитаПредставлениеКонтакта); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСправочника", "Справочник." + ОписаниеКонтакта.Имя); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеИерархический", + ?(ОписаниеКонтакта.Иерархический," И (НЕ ТаблицаСправочника.ЭтоГруппа)","")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИмяТаблицаКонтактнаяИнформация", + "Справочник." + ОписаниеКонтакта.Имя + ".КонтактнаяИнформация"); + ТекстыЗапроса.Добавить(ТекстЗапроса); КонецЦикла; - ТекстЗапроса = ТекстЗапроса + " - | - |УПОРЯДОЧИТЬ ПО - | Наименование"; + ТекстЗапроса = СтрСоединить(ТекстыЗапроса, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС) + + " + |УПОРЯДОЧИТЬ ПО + | Наименование"; // @query-part-1, @query-part-2 Возврат ТекстЗапроса; @@ -2329,13 +2401,13 @@ Возврат; КонецЕсли; - ТаблицаКонтакты = КонтактыПоПредметуИлиЦепочке(Предмет, ВключатьEmail); - Если (ТаблицаКонтакты = Неопределено) ИЛИ (ТаблицаКонтакты.Количество() = 0) Тогда + ТаблицаКонтактов = КонтактыПоПредметуИлиЦепочке(Предмет, ВключатьEmail); + Если (ТаблицаКонтактов = Неопределено) ИЛИ (ТаблицаКонтактов.Количество() = 0) Тогда ЭлементыФормы.СтраницаВсеКонтактыПоПредмету.Видимость = Ложь; Возврат; КонецЕсли; - Для Каждого СтрокаТаблицы Из ТаблицаКонтакты Цикл + Для Каждого СтрокаТаблицы Из ТаблицаКонтактов Цикл НоваяСтрока = КонтактыПоПредмету.Добавить(); НоваяСтрока.Ссылка = СтрокаТаблицы.Ссылка; НоваяСтрока.Наименование = СтрокаТаблицы.Наименование; @@ -2748,11 +2820,16 @@ // Получает адреса электронной почты для массива контактов. // // Параметры: -// Контакты - Массив - массив ссылок на контакты. -// ГруппаПолучателей - Строка - имя группы в письме для которой ищутся адреса, например "Получатели", "Получатели копий". +// Контакты - Массив из ОпределяемыйТип.КонтактВзаимодействия +// ГруппаПолучателей - Строка - имя группы, в письме для которой ищутся адреса, например, "Получатели", "Получатели копий". // // Возвращаемое значение: -// ТаблицаЗначений - таблица содержащая контакты и адреса их электронной почты. +// ТаблицаЗначений: +// * Контакт - ОпределяемыйТип.КонтактВзаимодействия +// * Представление - Строка +// * Адрес - Строка +// * СписокАдресов - Строка +// Неопределено // Функция АдресаЭлектроннойПочтыКонтактов(Контакты, ГруппаПолучателей = "") Экспорт @@ -2760,10 +2837,9 @@ Возврат Неопределено; КонецЕсли; - ОписанияКонтактов = ВзаимодействияКлиентСервер.ОписанияКонтактов(); - + // АПК:96-выкл Ключевое слово ОБЪЕДИНИТЬ, т.к. один и тот же пользователь может входить в несколько групп пользователей. ТекстЗапроса = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + "ВЫБРАТЬ РАЗРЕШЕННЫЕ | ТаблицаКонтактнаяИнформация.АдресЭП КАК Адрес, | ТаблицаКонтакт.Ссылка КАК Контакт |ПОМЕСТИТЬ КонтактыАдреса @@ -2778,7 +2854,7 @@ | И НЕ ТаблицаКонтакт.Недействителен | И НЕ ТаблицаКонтакт.ПометкаУдаления | - |ОБЪЕДИНИТЬ ВСЕ + |ОБЪЕДИНИТЬ | |ВЫБРАТЬ | ТаблицаКонтактнаяИнформация.АдресЭП, @@ -2799,20 +2875,18 @@ | РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей | ГДЕ | СоставыГруппПользователей.Пользователь = ТаблицаКонтакт.Ссылка - | И СоставыГруппПользователей.ГруппаПользователей В (&МассивКонтактов))"; + | И СоставыГруппПользователей.ГруппаПользователей В (&МассивКонтактов))"; + // АПК:96-вкл + ТекстыЗапроса = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ТекстЗапроса); - Для каждого ОписаниеКонтакта Из ОписанияКонтактов Цикл + Для каждого ОписаниеКонтакта Из ВзаимодействияКлиентСервер.ОписанияКонтактов() Цикл Если ОписаниеКонтакта.Имя = "Пользователи" Тогда Продолжить; КонецЕсли; - - ТекстЗапроса =ТекстЗапроса + " - |ОБЪЕДИНИТЬ ВСЕ - |"; - - ТекстЗапроса =ТекстЗапроса + " - |ВЫБРАТЬ + + ТекстЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ | ТаблицаКонтактнаяИнформация.АдресЭП, | ТаблицаКонтакт.Ссылка |ИЗ @@ -2825,37 +2899,41 @@ | И ТаблицаКонтакт.Ссылка В(&МассивКонтактов) | И &УсловиеИерархический"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСправочника", "Справочник." +ОписаниеКонтакта.Имя); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеИерархический", ?(ОписаниеКонтакта.Иерархический," И (НЕ ТаблицаКонтакт.ЭтоГруппа)","")); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИмяТаблицаКонтактнаяИнформация" ,"Справочник." + ОписаниеКонтакта.Имя + ".КонтактнаяИнформация"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСправочника", "Справочник." + ОписаниеКонтакта.Имя); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеИерархический", + ?(ОписаниеКонтакта.Иерархический, " И (НЕ ТаблицаКонтакт.ЭтоГруппа)","")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИмяТаблицаКонтактнаяИнформация", + "Справочник." + ОписаниеКонтакта.Имя + ".КонтактнаяИнформация"); + ТекстыЗапроса.Добавить(ТекстЗапроса); КонецЦикла; - ТекстЗапроса = ТекстЗапроса + " - |; - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ - | КонтактыАдреса.Контакт, - | ПРЕДСТАВЛЕНИЕ(КонтактыАдреса.Контакт) КАК Представление, - | &Группа - |ИЗ - | КонтактыАдреса КАК КонтактыАдреса - |УПОРЯДОЧИТЬ ПО - | Контакт - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | КонтактыАдреса.Контакт КАК Контакт, - | КонтактыАдреса.Адрес КАК Адрес - |ИЗ - | КонтактыАдреса КАК КонтактыАдреса - |УПОРЯДОЧИТЬ ПО - | Контакт - |ИТОГИ - |ПО - | Контакт - |"; + ТекстЗапроса = СтрСоединить(ТекстыЗапроса, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС) + + " + |; + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | КонтактыАдреса.Контакт, + | ПРЕДСТАВЛЕНИЕ(КонтактыАдреса.Контакт) КАК Представление, + | &Группа + |ИЗ + | КонтактыАдреса КАК КонтактыАдреса + |УПОРЯДОЧИТЬ ПО + | Контакт + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | КонтактыАдреса.Контакт КАК Контакт, + | КонтактыАдреса.Адрес КАК Адрес + |ИЗ + | КонтактыАдреса КАК КонтактыАдреса + |УПОРЯДОЧИТЬ ПО + | Контакт + |ИТОГИ + |ПО + | Контакт + |"; // @query-part-1 Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("МассивКонтактов", Контакты); @@ -2878,7 +2956,8 @@ Если ПустаяСтрока(СтрокаТаблицы.Адрес) Тогда СтрокаТаблицы.Адрес = ВыборкаАдреса.Адрес; КонецЕсли; - СтрокаТаблицы.СписокАдресов = СтрокаТаблицы.СписокАдресов + ?(ПустаяСтрока(СтрокаТаблицы.СписокАдресов), "", ";") + ВыборкаАдреса.Адрес; + СтрокаТаблицы.СписокАдресов = СтрокаТаблицы.СписокАдресов + + ?(ПустаяСтрока(СтрокаТаблицы.СписокАдресов), "", ";") + ВыборкаАдреса.Адрес; КонецЦикла; КонецЦикла; @@ -2905,7 +2984,7 @@ СтруктураВозврата.Вставить("ОтображатьТелоИсходногоПисьма", Ложь); СтруктураВозврата.Вставить("ВключатьТелоИсходногоПисьма", Ложь); - НастройкиРаботыСПочтой = ПолучитьНастройкуРаботаСПочтой(); + НастройкиРаботыСПочтой = НастройкиРаботыСПочтой(); ВключатьПодпись = Ложь; Если ДляНового Тогда @@ -3054,8 +3133,7 @@ // Функция ПолучитьПараметрыРаботыПользователяДляВходящегоЭлектронногоПисьма() Экспорт - НастройкиРаботыСПочтой = ПолучитьНастройкуРаботаСПочтой(); - + НастройкиРаботыСПочтой = НастройкиРаботыСПочтой(); Возврат ?(НастройкиРаботыСПочтой.Свойство("ПорядокОтветовНаЗапросыУведомленийОПрочтении"), НастройкиРаботыСПочтой.ПорядокОтветовНаЗапросыУведомленийОПрочтении, Перечисления.ПорядокОтветовНаЗапросыУведомленийОПрочтении.ЗапрашиватьПередТемКакОтправитьУведомление); @@ -3092,7 +3170,7 @@ // Объект - ДокументОбъект.ЭлектронноеПисьмоИсходящее - отправляемое письмо. // // Возвращаемое значение: -// Строка - идентификатор почтового сообщения. +// см. РаботаСПочтовымиСообщениями.ОтправитьПисьмо // Функция ВыполнитьОтправкуПисьма(Объект, Соединение = Неопределено, ПараметрыПисьма = Неопределено, ПротоколПочты = "") @@ -3104,7 +3182,7 @@ ПараметрыПисьма.Вставить("ИдентификаторСообщения", РезультатОтправки.ИдентификаторПисьмаSMTP); ПараметрыПисьма.Вставить("ОшибочныеПолучатели", РезультатОтправки.ОшибочныеПолучатели); - Возврат Объект.ИдентификаторСообщения; + Возврат РезультатОтправки; КонецФункции @@ -3700,6 +3778,7 @@ // Параметры: // Письмо - ДокументСсылка.ЭлектронноеПисьмоИсходящее // - ДокументСсылка.ЭлектронноеПисьмоИсходящее - письмо, информацию о вложениях которого требуется получить. +// // Возвращаемое значение: // ТаблицаЗначений: // * Письмо - ДокументСсылка.ЭлектронноеПисьмоИсходящее @@ -3710,39 +3789,40 @@ // Функция ДанныеХранимыхВБазеПисемВложений(Письмо) Экспорт - Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ - | ЭлектронноеПисьмоИсходящееПисьмаВложения.Письмо КАК Письмо, - | ЭлектронноеПисьмоВходящее.Размер КАК Размер, - | ЭлектронноеПисьмоВходящее.Тема КАК Тема, - | ЭлектронноеПисьмоВходящее.ДатаПолучения КАК Дата - |ИЗ - | Документ.ЭлектронноеПисьмоИсходящее.ПисьмаВложения КАК ЭлектронноеПисьмоИсходящееПисьмаВложения - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЭлектронноеПисьмоВходящее КАК ЭлектронноеПисьмоВходящее - | ПО ЭлектронноеПисьмоИсходящееПисьмаВложения.Письмо = ЭлектронноеПисьмоВходящее.Ссылка - |ГДЕ - | ЭлектронноеПисьмоИсходящееПисьмаВложения.Ссылка = &Письмо - | - |ОБЪЕДИНИТЬ - | - |ВЫБРАТЬ - | ЭлектронноеПисьмоИсходящееПисьмаВложения.Письмо, - | ЭлектронноеПисьмоИсходящее.Размер, - | ЭлектронноеПисьмоИсходящее.Тема, - | ВЫБОР - | КОГДА ЭлектронноеПисьмоИсходящее.ДатаОтправления = ДАТАВРЕМЯ(1, 1, 1, 1, 1, 1) - | ТОГДА ЭлектронноеПисьмоИсходящее.Дата - | ИНАЧЕ ЭлектронноеПисьмоИсходящее.ДатаОтправления - | КОНЕЦ - |ИЗ - | Документ.ЭлектронноеПисьмоИсходящее.ПисьмаВложения КАК ЭлектронноеПисьмоИсходящееПисьмаВложения - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЭлектронноеПисьмоИсходящее КАК ЭлектронноеПисьмоИсходящее - | ПО ЭлектронноеПисьмоИсходящееПисьмаВложения.Письмо = ЭлектронноеПисьмоИсходящее.Ссылка - |ГДЕ - | ЭлектронноеПисьмоИсходящееПисьмаВложения.Ссылка = &Письмо"; + // АПК:96-выкл Ключевое слово ОБЪЕДИНИТЬ, т.к. одно и тот же письмо-вложение может быть в нескольких письмах. + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ЭлектронноеПисьмоИсходящееПисьмаВложения.Письмо КАК Письмо, + | ЭлектронноеПисьмоВходящее.Размер КАК Размер, + | ЭлектронноеПисьмоВходящее.Тема КАК Тема, + | ЭлектронноеПисьмоВходящее.ДатаПолучения КАК Дата + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПисьмаВложения КАК ЭлектронноеПисьмоИсходящееПисьмаВложения + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЭлектронноеПисьмоВходящее КАК ЭлектронноеПисьмоВходящее + | ПО ЭлектронноеПисьмоИсходящееПисьмаВложения.Письмо = ЭлектронноеПисьмоВходящее.Ссылка + |ГДЕ + | ЭлектронноеПисьмоИсходящееПисьмаВложения.Ссылка = &Письмо + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | ЭлектронноеПисьмоИсходящееПисьмаВложения.Письмо, + | ЭлектронноеПисьмоИсходящее.Размер, + | ЭлектронноеПисьмоИсходящее.Тема, + | ВЫБОР + | КОГДА ЭлектронноеПисьмоИсходящее.ДатаОтправления = ДАТАВРЕМЯ(1, 1, 1, 1, 1, 1) + | ТОГДА ЭлектронноеПисьмоИсходящее.Дата + | ИНАЧЕ ЭлектронноеПисьмоИсходящее.ДатаОтправления + | КОНЕЦ + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПисьмаВложения КАК ЭлектронноеПисьмоИсходящееПисьмаВложения + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЭлектронноеПисьмоИсходящее КАК ЭлектронноеПисьмоИсходящее + | ПО ЭлектронноеПисьмоИсходящееПисьмаВложения.Письмо = ЭлектронноеПисьмоИсходящее.Ссылка + |ГДЕ + | ЭлектронноеПисьмоИсходящееПисьмаВложения.Ссылка = &Письмо"); + // АПК:96-вкл Запрос.УстановитьПараметр("Письмо", Письмо); - Возврат Запрос.Выполнить().Выгрузить(); КонецФункции @@ -3817,7 +3897,6 @@ КонецЕсли; ИмяСписка = "Список_" + ОписаниеКонтакта.Имя; - ДобавляемыеРеквизиты.Добавить( Новый РеквизитФормы(ИмяСписка, ОписаниеТипаДинамическийСписок)); @@ -3833,10 +3912,8 @@ КонецЕсли; ИмяСписка = "Список_" + ОписаниеКонтакта.Имя; - ЕстьКолонкаАдрес = УстановитьТекстЗапросаКонтакта(Форма[ИмяСписка], ОписаниеКонтакта); ЕстьКолонкиАдрес[ОписаниеКонтакта.Имя] = ЕстьКолонкаАдрес; - Если ЕстьКолонкаАдрес Тогда Форма.ИменаДобавленныхТаблиц.Добавить(ИмяСписка); КонецЕсли; @@ -5214,9 +5291,7 @@ КонецПроцедуры -// Получает настройку пользователя работы с почтой. -// -Функция ПолучитьНастройкуРаботаСПочтой() Экспорт +Функция НастройкиРаботыСПочтой() Экспорт Настройка = ПолучитьНастройкуТекущегоПользователя("РаботаСПочтой", "НастройкиПользователя", Новый Структура); Если ТипЗнч(Настройка) <> Тип("Структура") Тогда @@ -5226,9 +5301,7 @@ КонецФункции -// Сохраняет настройку пользователя работы с почтой. -// -Процедура СохранитьНастройкуРаботаСПочтой(Значение) Экспорт +Процедура СохранитьНастройкиРаботыСПочтой(Значение) Экспорт СохранитьНастройкуТекущегоПользователя("РаботаСПочтой", Значение, "НастройкиПользователя"); @@ -5285,76 +5358,56 @@ // Определяет статус документа "Сообщение SMS" по состоянию входящих в него сообщений SMS. // // Параметры: -// СообщениеSMS - ДокументОбъект.СообщениеSMS - документ, для которого необходимо определить -// статус. +// СообщениеSMS - ДокументОбъект.СообщениеSMS // // Возвращаемое значение: -// ПеречислениеСсылка.СостоянияДокументаСообщениеSMS - рассчитанный статус документа. +// ПеречислениеСсылка.СостоянияДокументаСообщениеSMS // Функция СостояниеДокументаСообщениеSMS(СообщениеSMS) - Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ - | Адресаты.СостояниеСообщения КАК Состояние - |ПОМЕСТИТЬ Состояния - |ИЗ - | &Адресаты КАК Адресаты - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | Состояния.Состояние - |ИЗ - | Состояния КАК Состояния"; - - Запрос.УстановитьПараметр("Адресаты", СообщениеSMS.Адресаты.Выгрузить()); - - Результат = Запрос.Выполнить(); - - Если Результат.Пустой() Тогда + СостоянияСообщенийАдресатам = СообщениеSMS.Адресаты.Выгрузить(, "СостояниеСообщения").ВыгрузитьКолонку("СостояниеСообщения"); + Если СостоянияСообщенийАдресатам.Количество() = 0 Тогда Возврат Перечисления.СостоянияДокументаСообщениеSMS.Черновик; КонецЕсли; - ТекущийСтатус = Неопределено; + РазличныеСостояния = Новый Соответствие; + Для каждого СостояниеСообщения Из СостоянияСообщенийАдресатам Цикл + РазличныеСостояния[СостояниеСообщения] = Истина; + КонецЦикла; + + ТекущийСтатус = Неопределено; + Для каждого КлючЗначение Из РазличныеСостояния Цикл - Выборка = Результат.Выбрать(); - Пока Выборка.Следующий() Цикл - - Если Выборка.Состояние = Перечисления.СостоянияСообщенияSMS.Исходящее Тогда - - Возврат Перечисления.СостоянияДокументаСообщениеSMS.Исходящее; - - ИначеЕсли Выборка.Состояние = Перечисления.СостоянияСообщенияSMS.Черновик Тогда - + СостояниеСообщения = КлючЗначение.Ключ; // ПеречислениеСсылка.СостоянияДокументаСообщениеSMS + Если СостояниеСообщения = Перечисления.СостоянияСообщенияSMS.Исходящее Тогда + Возврат Перечисления.СостоянияДокументаСообщениеSMS.Исходящее; + ИначеЕсли СостояниеСообщения = Перечисления.СостоянияСообщенияSMS.Черновик Тогда Возврат Перечисления.СостоянияСообщенияSMS.Черновик; - - ИначеЕсли Выборка.Состояние = Перечисления.СостоянияСообщенияSMS.НеУдалосьПередатьПровайдеру Тогда - + ИначеЕсли СостояниеСообщения = Перечисления.СостоянияСообщенияSMS.НеУдалосьПередатьПровайдеру Тогда Если ТекущийСтатус = Перечисления.СостоянияДокументаСообщениеSMS.Доставлено Тогда ТекущийСтатус = Перечисления.СостоянияДокументаСообщениеSMS.ЧастичноДоставлено; Иначе ТекущийСтатус = Перечисления.СостоянияДокументаСообщениеSMS.НеДоставлено; КонецЕсли; - - ИначеЕсли Выборка.Состояние = Перечисления.СостоянияСообщенияSMS.ОтправляетсяПровайдером - ИЛИ Выборка.Состояние = Перечисления.СостоянияСообщенияSMS.ОтправленоПровайдером - ИЛИ Выборка.Состояние = Перечисления.СостоянияСообщенияSMS.ОшибкаПолученияСтатусаУПровайдера - ИЛИ Выборка.Состояние = Перечисления.СостоянияСообщенияSMS.НеОтправленоПровайдером Тогда + ИначеЕсли СостояниеСообщения = Перечисления.СостоянияСообщенияSMS.ОтправляетсяПровайдером + ИЛИ СостояниеСообщения = Перечисления.СостоянияСообщенияSMS.ОтправленоПровайдером + ИЛИ СостояниеСообщения = Перечисления.СостоянияСообщенияSMS.ОшибкаПолученияСтатусаУПровайдера + ИЛИ СостояниеСообщения = Перечисления.СостоянияСообщенияSMS.НеОтправленоПровайдером Тогда Возврат Перечисления.СостоянияДокументаСообщениеSMS.Доставляется; - ИначеЕсли Выборка.Состояние = Перечисления.СостоянияСообщенияSMS.Доставлено Тогда + ИначеЕсли СостояниеСообщения = Перечисления.СостоянияСообщенияSMS.Доставлено Тогда Если ТекущийСтатус = Перечисления.СостоянияДокументаСообщениеSMS.Доставлено - ИЛИ ТекущийСтатус = Неопределено Тогда + ИЛИ ТекущийСтатус = Неопределено Тогда ТекущийСтатус = Перечисления.СостоянияДокументаСообщениеSMS.Доставлено; Иначе ТекущийСтатус = Перечисления.СостоянияДокументаСообщениеSMS.ЧастичноДоставлено; КонецЕсли; - ИначеЕсли Выборка.Состояние = Перечисления.СостоянияСообщенияSMS.НеДоставлено Тогда + ИначеЕсли СостояниеСообщения = Перечисления.СостоянияСообщенияSMS.НеДоставлено Тогда Если ТекущийСтатус = Перечисления.СостоянияДокументаСообщениеSMS.Доставлено Тогда ТекущийСтатус = Перечисления.СостоянияДокументаСообщениеSMS.ЧастичноДоставлено; Иначе ТекущийСтатус = Перечисления.СостоянияДокументаСообщениеSMS.НеДоставлено; КонецЕсли; - ИначеЕсли Выборка.Состояние = Перечисления.СостоянияСообщенияSMS.НеОпознаноПровайдером Тогда + ИначеЕсли СостояниеСообщения = Перечисления.СостоянияСообщенияSMS.НеОпознаноПровайдером Тогда Если ТекущийСтатус = Перечисления.СостоянияДокументаСообщениеSMS.Доставлено Тогда ТекущийСтатус = Перечисления.СостоянияДокументаСообщениеSMS.ЧастичноДоставлено; Иначе @@ -5369,13 +5422,13 @@ КонецФункции // Преобразует статусы доставки SMS подсистемы ОтправкаSMS в -// состояния сообщения SMS подсистемы Взаимодействия. +// состояния сообщения SMS подсистемы Взаимодействия. // // Параметры: -// СтатусДоставки - Строка - значение, которое необходимо преобразовать. +// СтатусДоставки - Строка // // Возвращаемое значение: -// ПеречислениеСсылка.СостоянияСообщенияSMS - преобразованное значение. +// ПеречислениеСсылка.СостоянияСообщенияSMS // Функция СостояниеСообщенияSMSСогласноСтатусуДоставки(СтатусДоставки); @@ -5402,7 +5455,7 @@ // Выполняет отправку сообщений SMS по переданному документу Сообщение SMS. // // Параметры: -// Документ - ДокументОбъект.СообщениеSMS - документ, сообщения которого отправляются. +// Документ - ДокументОбъект.СообщениеSMS, ДанныеФормыСтруктура // // Возвращаемое значение: // Число - количество отправленных сообщений. @@ -5412,38 +5465,29 @@ УстановитьПривилегированныйРежим(Истина); Если Не ОтправкаSMS.НастройкаОтправкиSMSВыполнена() Тогда - ОбщегоНазначения.СообщитьПользователю(НСтр("ru = 'Не выполнены настройки отправки SMS.'"),,"Объект"); + ОбщегоНазначения.СообщитьПользователю(НСтр("ru = 'Не выполнены настройки отправки SMS.'"),, "Объект"); УстановитьСостояниеИсходящееДокументСообщениеSMS(Документ); Возврат 0; КонецЕсли; - МассивНомеров = Документ.Адресаты.Выгрузить(,"НомерДляОтправки").ВыгрузитьКолонку("НомерДляОтправки"); - РезультатОтправки = ОтправкаSMS.ОтправитьSMS(МассивНомеров, Документ.ТекстСообщения, Неопределено, Документ.ОтправлятьВТранслите); + НомераДляОтправки = Документ.Адресаты.Выгрузить(,"НомерДляОтправки").ВыгрузитьКолонку("НомерДляОтправки"); + РезультатОтправки = ОтправкаSMS.ОтправитьSMS(НомераДляОтправки, Документ.ТекстСообщения, Неопределено, + Документ.ОтправлятьВТранслите); ОтразитьРезультатыОтправкиSMSВДокументе(Документ, РезультатОтправки); Если Не ПустаяСтрока(РезультатОтправки.ОписаниеОшибки) Тогда - ОбщегоНазначения.СообщитьПользователю(РезультатОтправки.ОписаниеОшибки,,"Документ"); + ОбщегоНазначения.СообщитьПользователю(РезультатОтправки.ОписаниеОшибки,, "Документ"); КонецЕсли; Возврат РезультатОтправки.ОтправленныеСообщения.Количество(); КонецФункции -// Выполняет процедуру отправки сообщений SMS. -Процедура ОтправкаSMS() Экспорт +Процедура ОтправитьSMS() Экспорт ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ОтправкаSMS); - УстановитьПривилегированныйРежим(Истина); - - МетаданныеДокумента = Метаданные.Документы.СообщениеSMS; - - ТаблицаАдресатовСообщения = Новый ТаблицаЗначений; - ТаблицаАдресатовСообщения.Колонки.Добавить("НомерСтроки"); - ТаблицаАдресатовСообщения.Колонки.Добавить("НомерДляОтправки"); - ТаблицаАдресатовСообщения.Колонки.Добавить("КакСвязаться"); - Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ @@ -5476,74 +5520,84 @@ Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса()); + УстановитьПривилегированныйРежим(Истина); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Возврат; КонецЕсли; - ВыборкаДокументы = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); - Если Не ОтправкаSMS.НастройкаОтправкиSMSВыполнена() Тогда ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка, , , - НСтр("ru = 'Не выполнены настройки отправки SMS.'", ОбщегоНазначения.КодОсновногоЯзыка())); + УровеньЖурналаРегистрации.Ошибка, , , + НСтр("ru = 'Не выполнены настройки отправки SMS.'", ОбщегоНазначения.КодОсновногоЯзыка())); Возврат; КонецЕсли; + МетаданныеДокумента = Метаданные.Документы.СообщениеSMS; + + ТаблицаАдресатовСообщения = Новый ТаблицаЗначений; + ТаблицаАдресатовСообщения.Колонки.Добавить("НомерСтроки"); + ТаблицаАдресатовСообщения.Колонки.Добавить("НомерДляОтправки"); + ТаблицаАдресатовСообщения.Колонки.Добавить("КакСвязаться"); + + ВыборкаДокументы = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаДокументы.Следующий() Цикл ТаблицаАдресатовСообщения.Очистить(); - ВыборкаАдресаты = ВыборкаДокументы.Выбрать(); Пока ВыборкаАдресаты.Следующий() Цикл - ТекстСообщения = ВыборкаАдресаты.ТекстСообщения; ОтправлятьВТранслите = ВыборкаАдресаты.ОтправлятьВТранслите; - НоваяСтрока = ТаблицаАдресатовСообщения.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаАдресаты); - КонецЦикла; Если ТаблицаАдресатовСообщения.Количество() = 0 Тогда Продолжить; КонецЕсли; + // Отправка вне транзакции. + НомераДляОтправки = ТаблицаАдресатовСообщения.ВыгрузитьКолонку("НомерДляОтправки"); + Попытка + РезультатОтправки = ОтправкаSMS.ОтправитьSMS(НомераДляОтправки, ТекстСообщения, "", ОтправлятьВТранслите); + Если РезультатОтправки.ОтправленныеСообщения.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + Исключение + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, + НСтр("ru = 'Не удалось отправить %1 по причине: + |%2'"), + ВыборкаДокументы.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Предупреждение, МетаданныеДокумента, ВыборкаДокументы.Ссылка, + ТекстСообщения); + Продолжить; + КонецПопытки; + + ПредставлениеДокумента = Строка(ВыборкаДокументы.Ссылка); НачатьТранзакцию(); Попытка - Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить(МетаданныеДокумента.ПолноеИмя()); ЭлементБлокировки.УстановитьЗначение("Ссылка", ВыборкаДокументы.Ссылка); Блокировка.Заблокировать(); - МассивНомеров = ТаблицаАдресатовСообщения.ВыгрузитьКолонку("НомерДляОтправки"); - РезультатОтправки = ОтправкаSMS.ОтправитьSMS(МассивНомеров, ТекстСообщения, "", ОтправлятьВТранслите); - - Если РезультатОтправки.ОтправленныеСообщения.Количество() = 0 Тогда - ОтменитьТранзакцию(); - Продолжить; - КонецЕсли; - ДокументОбъект = ВыборкаДокументы.Ссылка.ПолучитьОбъект(); + // @skip-check query-in-loop - Запрос для поэлементной записи данных. ОтразитьРезультатыОтправкиSMSВДокументе(ДокументОбъект, РезультатОтправки); ДокументОбъект.ДополнительныеСвойства.Вставить("НеЗаписыватьКонтакты", Истина); ДокументОбъект.Записать(); ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ТекстСообщения = НСтр("ru = 'Не удалось отправить : %Ссылка% по причине: %Причина%'"); - ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Ссылка%", ВыборкаДокументы.Ссылка); - ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Причина%", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, + НСтр("ru = 'Не удалось записать факт отправки %1 по причине: + |%2'"), + ПредставлениеДокумента, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Предупреждение, - МетаданныеДокумента, - ВыборкаДокументы.Ссылка, - ТекстСообщения); - + УровеньЖурналаРегистрации.Ошибка, МетаданныеДокумента, ВыборкаДокументы.Ссылка, + ТекстСообщения); КонецПопытки; КонецЦикла; @@ -5590,8 +5644,8 @@ Если Не ОтправкаSMS.НастройкаОтправкиSMSВыполнена() Тогда ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка, , , - НСтр("ru = 'Не выполнены настройки отправки SMS.'", ОбщегоНазначения.КодОсновногоЯзыка())); + УровеньЖурналаРегистрации.Ошибка, , , + НСтр("ru = 'Не выполнены настройки отправки SMS.'", ОбщегоНазначения.КодОсновногоЯзыка())); Возврат; КонецЕсли; @@ -5600,6 +5654,7 @@ Пока ВыборкаДокументы.Следующий() Цикл ТаблицаИзменившихсяСтатусов.Очистить(); + ПредставлениеДокумента = ОбщегоНазначения.ПредметСтрокой(ВыборкаДокументы.Ссылка); НачатьТранзакцию(); Попытка @@ -5642,14 +5697,12 @@ Исключение ОтменитьТранзакцию(); - ТекстСообщения = НСтр("ru = 'Не удалось обновить статусы доставки : %Ссылка% по причине: %Причина%'"); - ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Ссылка%", ВыборкаДокументы.Ссылка); - ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Причина%", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось обновить статусы доставки %1 по причине: %2'"), + ПредставлениеДокумента, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Предупреждение, - МетаданныеДокумента, - ВыборкаДокументы.Ссылка, - ТекстСообщения); + УровеньЖурналаРегистрации.Предупреждение, МетаданныеДокумента, ВыборкаДокументы.Ссылка, + ТекстСообщения); КонецПопытки; @@ -5660,13 +5713,14 @@ // Устанавливает состояние документа "Сообщение SMS" в зависимости от состояний отдельных сообщений различным контактам. // // Параметры: -// ДокументОбъект - ДокументОбъект.СообщениеSMS - документ, для которого определяется состояние. +// ДокументОбъект - ДокументОбъект.СообщениеSMS, ДанныеФормыСтруктура // РезультатОтправки - Структура - результат отправки сообщения SMS. // Процедура ОтразитьРезультатыОтправкиSMSВДокументе(ДокументОбъект, РезультатОтправки) Для Каждого ОтправленноеСообщение Из РезультатОтправки.ОтправленныеСообщения Цикл - Для Каждого НайденнаяСтрока Из ДокументОбъект.Адресаты.НайтиСтроки(Новый Структура("НомерДляОтправки",ОтправленноеСообщение.НомерПолучателя)) Цикл + Для Каждого НайденнаяСтрока Из ДокументОбъект.Адресаты.НайтиСтроки( + Новый Структура("НомерДляОтправки", ОтправленноеСообщение.НомерПолучателя)) Цикл НайденнаяСтрока.ИдентификаторСообщения = ОтправленноеСообщение.ИдентификаторСообщения; НайденнаяСтрока.СостояниеСообщения = Перечисления.СостоянияСообщенияSMS.ОтправляетсяПровайдером; КонецЦикла; @@ -6073,7 +6127,7 @@ ОтменитьТранзакцию(); ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Удаление папки не выполнено по причине: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат; КонецПопытки; @@ -6093,16 +6147,19 @@ УстановитьПривилегированныйРежим(Истина); - Папка = ОпределитьПапкуДляПисьмаПоУмолчанию(Письмо ,Истина); - Если ЗначениеЗаполнено(Папка) И (НЕ Папка.ПредопределеннаяПапка) Тогда + Папка = ОпределитьПапкуДляПисьмаПоУмолчанию(Письмо, Истина); + Если ЗначениеЗаполнено(Папка) И НЕ Папка.ПредопределеннаяПапка Тогда Возврат Папка; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ + | ПравилаОбработкиЭлектроннойПочты.Ссылка КАК Ссылка, + | ПравилаОбработкиЭлектроннойПочты.Владелец КАК УчетнаяЗапись, + | ПравилаОбработкиЭлектроннойПочты.Наименование КАК НаименованиеПравила, | ПравилаОбработкиЭлектроннойПочты.КомпоновщикНастроек КАК КомпоновщикНастроек, - | ПравилаОбработкиЭлектроннойПочты.ПомещатьВПапку КАК ПомещатьВПапку + | ПравилаОбработкиЭлектроннойПочты.ПомещатьВПапку КАК ПомещатьВПапку |ИЗ | Справочник.ПравилаОбработкиЭлектроннойПочты КАК ПравилаОбработкиЭлектроннойПочты |ГДЕ @@ -6121,10 +6178,14 @@ Запрос.УстановитьПараметр("Письмо", Письмо); Результат = Запрос.Выполнить(); - Если Не Результат.Пустой() Тогда - Выборка = Результат.Выбрать(); - Пока Выборка.Следующий() Цикл - + Если Результат.Пустой() Тогда + Возврат Папка; + КонецЕсли; + + Выборка = Результат.Выбрать(); + Пока Выборка.Следующий() Цикл + + Попытка СхемаПравилаОбработки = Справочники.ПравилаОбработкиЭлектроннойПочты.ПолучитьМакет("СхемаПравилаОбработкиЭлектроннойПочты"); @@ -6134,10 +6195,11 @@ КомпоновщикНастроек.ЗагрузитьНастройки(Выборка.КомпоновщикНастроек.Получить()); КомпоновщикНастроек.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.ПроверятьДоступность); ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( - КомпоновщикНастроек.Настройки.Отбор,"Ссылка",Письмо,ВидСравненияКомпоновкиДанных.Равно); + КомпоновщикНастроек.Настройки.Отбор, "Ссылка", Письмо, ВидСравненияКомпоновкиДанных.Равно); МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить( - СхемаПравилаОбработки, КомпоновщикНастроек.ПолучитьНастройки(),,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); + СхемаПравилаОбработки, КомпоновщикНастроек.ПолучитьНастройки(),,, + Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); Если МакетКомпоновкиДанных.ЗначенияПараметров.Количество() = 0 Тогда Продолжить; @@ -6149,13 +6211,31 @@ ЗапросПравило.Параметры.Вставить(Параметр.Имя, Параметр.Значение); КонецЦикла; + // @skip-check query-in-loop - Последовательное выполнение правил обработки писем до первого подходящего. Результат = ЗапросПравило.Выполнить(); - Если Не Результат.Пустой() Тогда - Возврат Выборка.ПомещатьВПапку; - КонецЕсли; + + Исключение - КонецЦикла; - КонецЕсли; + ШаблонСообщенияОбОшибке = НСтр("ru = 'Не удалось применить правило обработки писем ""%1"" для учетной записи ""%2"" по причине: + |%3 + |Требуется исправить правило.'", ОбщегоНазначения.КодОсновногоЯзыка()); + + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонСообщенияОбОшибке, + Выборка.НаименованиеПравила, + Выборка.УчетнаяЗапись, + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Ошибка, , Выборка.Ссылка, ТекстСообщенияОбОшибке); + Продолжить; + + КонецПопытки; + + Если Не Результат.Пустой() Тогда + Возврат Выборка.ПомещатьВПапку; + КонецЕсли; + + КонецЦикла; Возврат Папка; @@ -6353,7 +6433,7 @@ Запрос.УстановитьПараметр("МассивПисем", МассивПисем); ПапкиДляРасчета = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Папка"); - ТаблицаПапок = ОпределитьПапкиДляМассиваПисем(МассивПисем); + ТаблицаПапок = ОпределитьПапкиДляПисем(МассивПисем); Если ТаблицаПапок.Количество() = 0 Тогда Возврат; @@ -6381,50 +6461,52 @@ КонецПроцедуры -// Определяет папки для массива писем. +// Определяет папки для переданных писем. // // Параметры: -// МассивПисем - Массив - массив писем для которого будут определены папки. +// Письма - Массив из ДокументСсылка.ЭлектронноеПисьмоВходящее +// - Массив из ДокументСсылка.ЭлектронноеПисьмоИсходящее // // Возвращаемое значение: -// ТаблицаЗначений - содержит соответствие писем и определенных для них папок. +// ТаблицаЗначений - соответствие писем и определенных для них папок: +// * Папка - СправочникСсылка.ПапкиЭлектронныхПисем +// * Письмо - ДокументСсылка.ЭлектронноеПисьмоВходящее, ДокументСсылка.ЭлектронноеПисьмоИсходящее // -Функция ОпределитьПапкиДляМассиваПисем(МассивПисем) +Функция ОпределитьПапкиДляПисем(Письма) ТаблицаСоответствий = Новый ТаблицаЗначений; ТаблицаСоответствий.Колонки.Добавить("Папка"); ТаблицаСоответствий.Колонки.Добавить("Письмо"); - Если МассивПисем.Количество() = 0 Тогда + Если Письма.Количество() = 0 Тогда Возврат ТаблицаСоответствий; КонецЕсли; - Запрос = Новый Запрос; - Запрос.Текст = " - |ВЫБРАТЬ - | ПравилаОбработкиЭлектроннойПочты.Владелец КАК УчетнаяЗапись, - | ПравилаОбработкиЭлектроннойПочты.КомпоновщикНастроек КАК КомпоновщикНастроек, - | ПравилаОбработкиЭлектроннойПочты.ПомещатьВПапку КАК ПомещатьВПапку, - | ПравилаОбработкиЭлектроннойПочты.Ссылка КАК Ссылка, - | ПравилаОбработкиЭлектроннойПочты.Наименование КАК НаименованиеПравила - |ИЗ - | Справочник.ПравилаОбработкиЭлектроннойПочты КАК ПравилаОбработкиЭлектроннойПочты - |ГДЕ - | ПравилаОбработкиЭлектроннойПочты.Владелец В - | (ВЫБРАТЬ - | Взаимодействия.УчетнаяЗапись - | ИЗ - | ЖурналДокументов.Взаимодействия КАК Взаимодействия - | ГДЕ - | Взаимодействия.Ссылка В (&МассивПисем)) - | И (НЕ ПравилаОбработкиЭлектроннойПочты.ПометкаУдаления) - | - |УПОРЯДОЧИТЬ ПО - | ПравилаОбработкиЭлектроннойПочты.РеквизитДопУпорядочивания - |ИТОГИ ПО - | УчетнаяЗапись"; + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ПравилаОбработкиЭлектроннойПочты.Владелец КАК УчетнаяЗапись, + | ПравилаОбработкиЭлектроннойПочты.КомпоновщикНастроек КАК КомпоновщикНастроек, + | ПравилаОбработкиЭлектроннойПочты.ПомещатьВПапку КАК ПомещатьВПапку, + | ПравилаОбработкиЭлектроннойПочты.Ссылка КАК Ссылка, + | ПравилаОбработкиЭлектроннойПочты.Наименование КАК НаименованиеПравила + |ИЗ + | Справочник.ПравилаОбработкиЭлектроннойПочты КАК ПравилаОбработкиЭлектроннойПочты + |ГДЕ + | ПравилаОбработкиЭлектроннойПочты.Владелец В + | (ВЫБРАТЬ + | Взаимодействия.УчетнаяЗапись + | ИЗ + | ЖурналДокументов.Взаимодействия КАК Взаимодействия + | ГДЕ + | Взаимодействия.Ссылка В (&МассивПисем)) + | И (НЕ ПравилаОбработкиЭлектроннойПочты.ПометкаУдаления) + | + |УПОРЯДОЧИТЬ ПО + | ПравилаОбработкиЭлектроннойПочты.РеквизитДопУпорядочивания + |ИТОГИ ПО + | УчетнаяЗапись"); - Запрос.УстановитьПараметр("МассивПисем", МассивПисем); + Запрос.УстановитьПараметр("МассивПисем", Письма); Результат = Запрос.Выполнить(); Если Не Результат.Пустой() Тогда @@ -6437,14 +6519,14 @@ СхемаПравилаОбработки = Справочники.ПравилаОбработкиЭлектроннойПочты.ПолучитьМакет("СхемаПравилаОбработкиЭлектроннойПочты"); - + КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных(); КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаПравилаОбработки)); КомпоновщикНастроек.ЗагрузитьНастройки(Выборка.КомпоновщикНастроек.Получить()); КомпоновщикНастроек.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.ПроверятьДоступность); ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( - КомпоновщикНастроек.Настройки.Отбор, "Ссылка", МассивПисем, ВидСравненияКомпоновкиДанных.ВСписке); + КомпоновщикНастроек.Настройки.Отбор, "Ссылка", Письма, ВидСравненияКомпоновкиДанных.ВСписке); ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( КомпоновщикНастроек.Настройки.Отбор, "Ссылка.УчетнаяЗапись", @@ -6463,27 +6545,9 @@ ЗапросПравило.Параметры.Вставить(Параметр.Имя, Параметр.Значение); КонецЦикла; + // @skip-check query-in-loop - Порционная обработка писем по учетным записям. РезультатПисьма = ЗапросПравило.Выполнить(); - Если Не РезультатПисьма.Пустой() Тогда - ВыборкаПисьма = РезультатПисьма.Выбрать(); - Пока ВыборкаПисьма.Следующий() Цикл - - НоваяСтрокаТаблицы = ТаблицаСоответствий.Добавить(); - НоваяСтрокаТаблицы.Папка = Выборка.ПомещатьВПапку; - НоваяСтрокаТаблицы.Письмо = ВыборкаПисьма.Ссылка; - - ИндексЭлементаМассиваКУдалению = МассивПисем.Найти(ВыборкаПисьма.Ссылка); - Если ИндексЭлементаМассиваКУдалению <> Неопределено Тогда - МассивПисем.Удалить(ИндексЭлементаМассиваКУдалению); - КонецЕсли; - - КонецЦикла; - КонецЕсли; - Если МассивПисем.Количество() = 0 Тогда - Возврат ТаблицаСоответствий; - КонецЕсли; - Исключение ШаблонСообщенияОбОшибке = НСтр("ru = 'Не удалось применить правило обработки писем ""%1"" для учетной записи ""%2"" по причине: @@ -6494,90 +6558,111 @@ ШаблонСообщенияОбОшибке, Выборка.НаименованиеПравила, Выборка.УчетнаяЗапись, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, , , ТекстСообщенияОбОшибке); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Ошибка, , Выборка.Ссылка, ТекстСообщенияОбОшибке); + Продолжить; КонецПопытки; + + Если Не РезультатПисьма.Пустой() Тогда + ВыборкаПисьма = РезультатПисьма.Выбрать(); + Пока ВыборкаПисьма.Следующий() Цикл + + НоваяСтрокаТаблицы = ТаблицаСоответствий.Добавить(); + НоваяСтрокаТаблицы.Папка = Выборка.ПомещатьВПапку; + НоваяСтрокаТаблицы.Письмо = ВыборкаПисьма.Ссылка; + + ИндексЭлементаМассиваКУдалению = Письма.Найти(ВыборкаПисьма.Ссылка); + Если ИндексЭлементаМассиваКУдалению <> Неопределено Тогда + Письма.Удалить(ИндексЭлементаМассиваКУдалению); + КонецЕсли; + КонецЦикла; + КонецЕсли; + Если Письма.Количество() = 0 Тогда + Возврат ТаблицаСоответствий; + КонецЕсли; + КонецЦикла; КонецЦикла; КонецЕсли; - Если МассивПисем.Количество() > 0 Тогда - ОпределитьПапкиДляМассиваПисемПоУмолчанию(МассивПисем, ТаблицаСоответствий); + Если Письма.Количество() > 0 Тогда + ОпределитьПапкиДляПисемПоУмолчанию(Письма, ТаблицаСоответствий); КонецЕсли; Возврат ТаблицаСоответствий; КонецФункции -// Определяет папки по умолчанию для массива писем. +// Определяет папки по умолчанию для переданных писем. // // Параметры: -// МассивПисем - Массив - массив писем для которого будут определены папки. -// ТаблицаПисем - ТаблицаЗначений - в которую помещается соответствие писем и определенных для них папок. +// Письма - Массив из ДокументСсылка.ЭлектронноеПисьмоВходящее +// - Массив из ДокументСсылка.ЭлектронноеПисьмоИсходящее +// ТаблицаПисем - см. ОпределитьПапкиДляПисем // -Процедура ОпределитьПапкиДляМассиваПисемПоУмолчанию(МассивПисем,ТаблицаПисем) +Процедура ОпределитьПапкиДляПисемПоУмолчанию(Письма, ТаблицаПисем) - Запрос = Новый Запрос; - Запрос.Текст = " - |ВЫБРАТЬ - | ПапкиЭлектронныхПисем.Ссылка КАК Ссылка, - | ПапкиЭлектронныхПисем.ТипПредопределеннойПапки КАК ТипПредопределеннойПапки, - | ПапкиЭлектронныхПисем.Владелец КАК УчетнаяЗапись - |ПОМЕСТИТЬ ПапкиПисем - |ИЗ - | Справочник.ПапкиЭлектронныхПисем КАК ПапкиЭлектронныхПисем - |ГДЕ - | ПапкиЭлектронныхПисем.ПредопределеннаяПапка - | И ПапкиЭлектронныхПисем.Владелец В - | (ВЫБРАТЬ РАЗЛИЧНЫЕ - | Взаимодействия.УчетнаяЗапись - | ИЗ - | ЖурналДокументов.Взаимодействия КАК Взаимодействия - | ГДЕ - | Взаимодействия.Ссылка В (&МассивПисем)) - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | Взаимодействия.Ссылка, - | ВЫБОР - | КОГДА Взаимодействия.ПометкаУдаления - | ТОГДА ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.Удаленные) - | КОГДА Взаимодействия.Тип = ТИП(Документ.ЭлектронноеПисьмоВходящее) - | ТОГДА ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.Входящие) - | КОГДА Взаимодействия.Тип = ТИП(Документ.ЭлектронноеПисьмоИсходящее) - | ТОГДА ВЫБОР - | КОГДА Взаимодействия.СтатусИсходящегоПисьма = ЗНАЧЕНИЕ(Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик) - | ТОГДА ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.Черновики) - | КОГДА Взаимодействия.СтатусИсходящегоПисьма = ЗНАЧЕНИЕ(Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено) - | ТОГДА ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.Отправленные) - | КОГДА Взаимодействия.СтатусИсходящегоПисьма = ЗНАЧЕНИЕ(Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Исходящее) - | ТОГДА ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.Исходящие) - | КОНЕЦ - | ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.НежелательнаяПочта) - | КОНЕЦ КАК ТипПапки, - | Взаимодействия.УчетнаяЗапись - |ПОМЕСТИТЬ ТипыПапокНазначения - |ИЗ - | ЖурналДокументов.Взаимодействия КАК Взаимодействия - |ГДЕ - | Взаимодействия.Ссылка В(&МассивПисем) - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ПапкиПисем.Ссылка КАК Папка, - | ТипыПапокНазначения.Ссылка КАК Письмо - |ИЗ - | ТипыПапокНазначения КАК ТипыПапокНазначения - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПапкиПисем КАК ПапкиПисем - | ПО ТипыПапокНазначения.ТипПапки = ПапкиПисем.ТипПредопределеннойПапки - | И ТипыПапокНазначения.УчетнаяЗапись = ПапкиПисем.УчетнаяЗапись"; + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ПапкиЭлектронныхПисем.Ссылка КАК Ссылка, + | ПапкиЭлектронныхПисем.ТипПредопределеннойПапки КАК ТипПредопределеннойПапки, + | ПапкиЭлектронныхПисем.Владелец КАК УчетнаяЗапись + |ПОМЕСТИТЬ ПапкиПисем + |ИЗ + | Справочник.ПапкиЭлектронныхПисем КАК ПапкиЭлектронныхПисем + |ГДЕ + | ПапкиЭлектронныхПисем.ПредопределеннаяПапка + | И ПапкиЭлектронныхПисем.Владелец В + | (ВЫБРАТЬ РАЗЛИЧНЫЕ + | Взаимодействия.УчетнаяЗапись + | ИЗ + | ЖурналДокументов.Взаимодействия КАК Взаимодействия + | ГДЕ + | Взаимодействия.Ссылка В (&МассивПисем)) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Взаимодействия.Ссылка, + | ВЫБОР + | КОГДА Взаимодействия.ПометкаУдаления + | ТОГДА ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.Удаленные) + | КОГДА Взаимодействия.Тип = ТИП(Документ.ЭлектронноеПисьмоВходящее) + | ТОГДА ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.Входящие) + | КОГДА Взаимодействия.Тип = ТИП(Документ.ЭлектронноеПисьмоИсходящее) + | ТОГДА ВЫБОР + | КОГДА Взаимодействия.СтатусИсходящегоПисьма = ЗНАЧЕНИЕ(Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик) + | ТОГДА ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.Черновики) + | КОГДА Взаимодействия.СтатусИсходящегоПисьма = ЗНАЧЕНИЕ(Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено) + | ТОГДА ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.Отправленные) + | КОГДА Взаимодействия.СтатусИсходящегоПисьма = ЗНАЧЕНИЕ(Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Исходящее) + | ТОГДА ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.Исходящие) + | КОНЕЦ + | ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.НежелательнаяПочта) + | КОНЕЦ КАК ТипПапки, + | Взаимодействия.УчетнаяЗапись + |ПОМЕСТИТЬ ТипыПапокНазначения + |ИЗ + | ЖурналДокументов.Взаимодействия КАК Взаимодействия + |ГДЕ + | Взаимодействия.Ссылка В(&МассивПисем) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ПапкиПисем.Ссылка КАК Папка, + | ТипыПапокНазначения.Ссылка КАК Письмо + |ИЗ + | ТипыПапокНазначения КАК ТипыПапокНазначения + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПапкиПисем КАК ПапкиПисем + | ПО ТипыПапокНазначения.ТипПапки = ПапкиПисем.ТипПредопределеннойПапки + | И ТипыПапокНазначения.УчетнаяЗапись = ПапкиПисем.УчетнаяЗапись"); - Запрос.УстановитьПараметр("МассивПисем",МассивПисем); + Запрос.УстановитьПараметр("МассивПисем", Письма); Результат = Запрос.Выполнить(); Если НЕ Результат.Пустой() Тогда @@ -6589,8 +6674,7 @@ // Определяет признак изменения пометки удаления при записи письма. // // Параметры: -// ПисьмоОбъект - ДокументОбъект.ЭлектронноеПисьмоИсходящее -// - ДокументОбъект.ЭлектронноеПисьмоВходящее - письмо для которого выполняется процедура. +// ПисьмоОбъект - ДокументОбъект.ЭлектронноеПисьмоИсходящее, ДокументОбъект.ЭлектронноеПисьмоВходящее // Процедура ОтработатьПризнакИзмененияПометкиУдаленияПриЗаписиПисьма(ПисьмоОбъект) Экспорт @@ -6610,17 +6694,41 @@ КонецПроцедуры -// Устанавливает папку электронного письма. // Параметры: -// Ссылка - ссылка на письмо, -// Папка - устанавливаемая папка электронного письма. +// ПапкиПисем - ТаблицаЗначений: +// * Письмо - ДокументСсылка.ЭлектронноеПисьмоИсходящее +// * Папка - СправочникСсылка.ПапкиЭлектронныхПисем +// РассчитыватьРассмотрено - Булево +// +Процедура УстановитьПапкиЭлектронныхПисем(ПапкиПисем, РассчитыватьРассмотрено = Истина) Экспорт + + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных(); + РегистрыСведений.ПредметыПапкиВзаимодействий.ЗаблокироватьПредметыПапок(Блокировка, ПапкиПисем, "Письмо"); + Блокировка.Заблокировать(); + Для каждого ПапкаПисьма Из ПапкиПисем Цикл + УстановитьПапкуЭлектронногоПисьма(ПапкаПисьма.Письмо, ПапкаПисьма.Папка, РассчитыватьРассмотрено); + КонецЦикла; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// Параметры: +// Ссылка - ДокументСсылка.ЭлектронноеПисьмоИсходящее +// Папка - СправочникСсылка.ПапкиЭлектронныхПисем +// РассчитыватьРассмотрено - Булево // Процедура УстановитьПапкуЭлектронногоПисьма(Ссылка, Папка, РассчитыватьРассмотрено = Истина) Экспорт - СтруктураДляЗаписи = РегистрыСведений.ПредметыПапкиВзаимодействий.РеквизитыВзаимодействия(); - СтруктураДляЗаписи.Папка = Папка; - СтруктураДляЗаписи.РассчитыватьРассмотрено = РассчитыватьРассмотрено; - РегистрыСведений.ПредметыПапкиВзаимодействий.ЗаписатьПредметыПапкиВзаимодействий(Ссылка, СтруктураДляЗаписи); + Реквизиты = РегистрыСведений.ПредметыПапкиВзаимодействий.РеквизитыВзаимодействия(); + Реквизиты.Папка = Папка; + Реквизиты.РассчитыватьРассмотрено = РассчитыватьРассмотрено; + РегистрыСведений.ПредметыПапкиВзаимодействий.ЗаписатьПредметыПапкиВзаимодействий(Ссылка, Реквизиты); КонецПроцедуры @@ -7095,12 +7203,15 @@ // Параметры: // ДанныеДляРасчета - Структура // - ВыборкаИзРезультатаЗапроса -// - Массив - данные, на основании -// которых будет формироваться таблица. -// ИмяРеквизита - Строка - может принимать значения "Предмет" или "Папка". +// - Массив из СправочникСсылка.ПапкиЭлектронныхПисем +// - Массив из ОпределяемыйТип.ПредметВзаимодействия +// - Массив из ОпределяемыйТип.КонтактВзаимодействия - данные, на основании которых +// будет формироваться таблица. +// ИмяРеквизита - Строка - может принимать значения "Предмет", "Папка" или "Контакт". // // Возвращаемое значение: -// ТаблицаЗначений - подготовленная для расчета таблица. +// ТаблицаЗначений: +// * ПоЧемуРассчитывать - СправочникСсылка.ПапкиЭлектронныхПисем, ОпределяемыйТип.ПредметВзаимодействия, ОпределяемыйТип.КонтактВзаимодействия // Функция ТаблицаДанныхДляРасчетаРассмотрено(ДанныеДляРасчета, ИмяРеквизита) Экспорт @@ -7611,7 +7722,8 @@ УстановитьПривилегированныйРежим(Истина); - Запрос = Новый Запрос; + // АПК:96-выкл Ключевое слово ОБЪЕДИНИТЬ, т.к. один и тот же контакт может участвовать в нескольких взаимодействиях. + Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ РАЗЛИЧНЫЕ | ВстречаУчастники.Ссылка КАК Взаимодействие, @@ -7765,7 +7877,7 @@ | ПО УникальныеКонтактыВзаимодействияПредставления.ПредставлениеКонтакта = СтроковыеКонтактыВзаимодействий.Наименование |ИТОГИ ПО | Взаимодействие"; - + // АПК:96-вкл Запрос.УстановитьПараметр("МассивВзаимодействий", МассивВзаимодействий); РезультатЗапроса = Запрос.Выполнить(); @@ -7830,65 +7942,6 @@ КонецПроцедуры -// Удаляет повторяющиеся элементы массива. -// -Функция УдалитьПовторяющиесяЭлементыМассива(Массив, НеИспользоватьНеопределено = Ложь) Экспорт - - ОписаниеТиповСправочники = Справочники.ТипВсеСсылки(); - ОписаниеТиповДокументы = Документы.ТипВсеСсылки(); - ОписаниеТиповПВХ = ПланыВидовХарактеристик.ТипВсеСсылки(); - ОписаниеТиповПланыСчетов = ПланыСчетов.ТипВсеСсылки(); - ОписаниеТиповПланыРасчета = ПланыВидовРасчета.ТипВсеСсылки(); - - Если ТипЗнч(Массив) = Тип("Массив") Тогда - - УжеВМассиве = Новый Соответствие; - БылоНеопределено = Ложь; - КоличествоЭлементовВМассиве = Массив.Количество(); - - Для ОбратныйИндекс = 1 По КоличествоЭлементовВМассиве Цикл - - ЭлементМассива = Массив[КоличествоЭлементовВМассиве - ОбратныйИндекс]; - ТипЭлемента = ТипЗнч(ЭлементМассива); - - Если ЭлементМассива = Неопределено Тогда - - Если БылоНеопределено ИЛИ НеИспользоватьНеопределено Тогда - Массив.Удалить(КоличествоЭлементовВМассиве - ОбратныйИндекс); - Иначе - БылоНеопределено = Истина; - КонецЕсли; - - Продолжить; - - ИначеЕсли ОписаниеТиповСправочники.СодержитТип(ТипЭлемента) - ИЛИ ОписаниеТиповДокументы.СодержитТип(ТипЭлемента) - ИЛИ ОписаниеТиповПВХ.СодержитТип(ТипЭлемента) - ИЛИ ОписаниеТиповПланыСчетов.СодержитТип(ТипЭлемента) - ИЛИ ОписаниеТиповПланыРасчета.СодержитТип(ТипЭлемента) Тогда - - ИДЭлемента = Строка(ЭлементМассива.УникальныйИдентификатор()); - - Иначе - - ИДЭлемента = ЭлементМассива; - - КонецЕсли; - - Если УжеВМассиве[ИДЭлемента] = Истина Тогда - Массив.Удалить(КоличествоЭлементовВМассиве - ОбратныйИндекс); - Иначе - УжеВМассиве[ИДЭлемента] = Истина; - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - - Возврат Массив; - -КонецФункции - // Заполняет подменю быстрых отборов по статусам. // // Параметры: @@ -8109,11 +8162,7 @@ КонецФункции -Функция КомментарийПоНаименованиюШаблона(НаименованиеШаблона) - Возврат НСтр("ru = 'Создано и отправлено по шаблону'") + " - " + НаименованиеШаблона; - -КонецФункции // Возвращаемое значение: // Структура: @@ -8121,6 +8170,10 @@ // * ОписаниеОшибки - Строка - содержит описание ошибки, в случае если письмо отправить не удалось. // * СсылкаНаПисьмо - Неопределено - письмо не было создано. // - ДокументСсылка.ЭлектронноеПисьмоИсходящее - ссылка на созданное электронное исходящие письмо. +// * ИдентификаторПисьма - Строка +// * ОшибочныеПолучатели - Соответствие из КлючИЗначение - адреса получателей с ошибками: +// ** Ключ - Строка - адрес получателя; +// ** Значение - Строка - текст ошибки. // Функция РезультатОтправкиПисьма() @@ -8129,6 +8182,9 @@ РезультатОтправкиПисьма.Вставить("Отправлено", Ложь); РезультатОтправкиПисьма.Вставить("ОписаниеОшибки", ""); РезультатОтправкиПисьма.Вставить("СсылкаНаПисьмо", Неопределено); + РезультатОтправкиПисьма.Вставить("ИдентификаторПисьма", ""); + РезультатОтправкиПисьма.Вставить("ОшибочныеПолучатели", Новый Соответствие); + Возврат РезультатОтправкиПисьма; @@ -8152,17 +8208,15 @@ КонецФункции -// Получает описания возможных контактов и формирует из него массив типов. -// // Возвращаемое значение: -// Массив - возможные типы контактов. +// Массив из Тип // Функция ТипыКонтактов() ОписанияКонтактов = ВзаимодействияКлиентСервер.ОписанияКонтактов(); Результат = Новый Массив; - Для каждого ЭлементМассиваОписания Из ОписанияКонтактов Цикл - Результат.Добавить(ЭлементМассиваОписания.Тип); + Для каждого ОписаниеКонтакта Из ОписанияКонтактов Цикл + Результат.Добавить(ОписаниеКонтакта.Тип); КонецЦикла; Возврат Результат; @@ -8363,18 +8417,16 @@ // Формирует текст запроса для поиска контактов по телефону и выполняет его. // // Параметры: -// Телефон - Строка - строка, содержащая телефон. -// НайденныеКонтакты - ТаблицаЗначений. +// Телефон - Строка +// НайденныеКонтакты - ТаблицаЗначений // // Возвращаемое значение: // Булево - Истина, если найден хотя бы один контакт. // Функция НайтиКонтактыПоТелефону(Знач Телефон, НайденныеКонтакты) Экспорт - МассивОписанияТиповКонтактов = ВзаимодействияКлиентСервер.ОписанияКонтактов(); - ТекстЗапроса = - "ВЫБРАТЬ + "ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ | ТаблицаКонтактнойИнформации.Ссылка КАК Контакт, | ПОДСТРОКА(ТаблицаКонтактнойИнформации.Представление, 1, 1000)КАК Представление, | ТаблицаКонтактнойИнформации.Ссылка.Наименование КАК Наименование, @@ -8386,20 +8438,17 @@ | И (ТаблицаКонтактнойИнформации.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон) | ИЛИ ТаблицаКонтактнойИнформации.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Факс)) | И (НЕ ТаблицаКонтактнойИнформации.Ссылка.ПометкаУдаления) - |"; + |"; + ТекстыЗапроса = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ТекстЗапроса); - Для каждого ЭлементМассиваОписания Из МассивОписанияТиповКонтактов Цикл + Для каждого ОписаниеКонтакта Из ВзаимодействияКлиентСервер.ОписанияКонтактов() Цикл - Если ЭлементМассиваОписания.Имя = "Пользователи" Тогда + Если ОписаниеКонтакта.Имя = "Пользователи" Тогда Продолжить; КонецЕсли; - ТекстЗапроса = ТекстЗапроса + " - |ОБЪЕДИНИТЬ ВСЕ - |"; - - ТекстЗапроса = ТекстЗапроса + " - |ВЫБРАТЬ + ТекстЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ | ТаблицаКонтактнойИнформации.Ссылка, | ПОДСТРОКА(ТаблицаКонтактнойИнформации.Представление, 1, 1000), | &ИмяРеквизитаНаименование КАК Наименование, @@ -8413,26 +8462,31 @@ | И (НЕ ТаблицаКонтактнойИнформации.Ссылка.ПометкаУдаления) | И &УсловиеИерархический"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяРеквизитаНаименованиеВладельца", ?(ЭлементМассиваОписания.ЕстьВладелец," ТаблицаКонтактнойИнформации.Ссылка.Владелец.Наименование","""""")); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяРеквизитаНаименование", "ТаблицаКонтактнойИнформации.Ссылка." + ЭлементМассиваОписания.ИмяРеквизитаПредставлениеКонтакта); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСправочника", "Справочник." + ЭлементМассиваОписания.Имя + ".КонтактнаяИнформация"); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеИерархический", ?(ЭлементМассиваОписания.Иерархический," И (НЕ ТаблицаКонтактнойИнформации.Ссылка.ЭтоГруппа)","")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяРеквизитаНаименованиеВладельца", + ?(ОписаниеКонтакта.ЕстьВладелец," ТаблицаКонтактнойИнформации.Ссылка.Владелец.Наименование", """""")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяРеквизитаНаименование", + "ТаблицаКонтактнойИнформации.Ссылка." + ОписаниеКонтакта.ИмяРеквизитаПредставлениеКонтакта); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСправочника", + "Справочник." + ОписаниеКонтакта.Имя + ".КонтактнаяИнформация"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеИерархический", + ?(ОписаниеКонтакта.Иерархический, " И (НЕ ТаблицаКонтактнойИнформации.Ссылка.ЭтоГруппа)", "")); + ТекстыЗапроса.Добавить(ТекстЗапроса); КонецЦикла; - ТекстЗапроса = ТекстЗапроса + " - |УПОРЯДОЧИТЬ ПО - | Наименование"; + ТекстЗапроса = СтрСоединить(ТекстыЗапроса, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС) + + " + |УПОРЯДОЧИТЬ ПО + | Наименование"; // @query-part-1, @query-part-2 Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("Телефон", Телефон); - ТаблицаКонтакты = Запрос.Выполнить().Выгрузить(); - - Если ТаблицаКонтакты = Неопределено ИЛИ ТаблицаКонтакты.Количество() = 0 Тогда + ТаблицаКонтактов = Запрос.Выполнить().Выгрузить(); + Если ТаблицаКонтактов = Неопределено ИЛИ ТаблицаКонтактов.Количество() = 0 Тогда Возврат Ложь; КонецЕсли; - ЗаполнитьНайденныеКонтакты(ТаблицаКонтакты, НайденныеКонтакты); + ЗаполнитьНайденныеКонтакты(ТаблицаКонтактов, НайденныеКонтакты); Возврат Истина; КонецФункции @@ -8440,17 +8494,15 @@ // Формирует текст запроса для поиска контактов по началу наименования и выполняет его. // // Параметры: -// Наименование - Строка - строка, содержащая начало наименования контакта. +// Наименование - Строка - начало наименования контакта. // // Возвращаемое значение: -// ТаблицаЗначений - результат выполненного запроса выгруженный в таблицу значений. +// ТаблицаЗначений // Функция НайтиКонтактыПоНачалуНаименования(Знач СтрокаПоиска) Экспорт - МассивОписанияТиповКонтактов = ВзаимодействияКлиентСервер.ОписанияКонтактов(); - ТекстЗапроса = - "ВЫБРАТЬ + "ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ | СправочникКонтакт.Ссылка КАК Контакт, | СправочникКонтакт.Наименование КАК Наименование, | """" КАК НаименованиеВладельца, @@ -8461,46 +8513,44 @@ | СправочникКонтакт.Наименование ПОДОБНО &Наименование СПЕЦСИМВОЛ ""~"" | И (НЕ СправочникКонтакт.ПометкаУдаления) |"; + ТекстыЗапроса = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ТекстЗапроса); - Для каждого ЭлементМассиваОписания Из МассивОписанияТиповКонтактов Цикл + Для каждого ОписаниеКонтакта Из ВзаимодействияКлиентСервер.ОписанияКонтактов() Цикл - Если ЭлементМассиваОписания.Имя = "Пользователи" Тогда + Если ОписаниеКонтакта.Имя = "Пользователи" Тогда Продолжить; - Иначе - - ТекстЗапроса = ТекстЗапроса + " - |ОБЪЕДИНИТЬ ВСЕ - |"; - - ТекстЗапроса = ТекстЗапроса + " - |ВЫБРАТЬ - | ТаблицаСправочника.Ссылка, - | &ИмяРеквизитаНаименование КАК Наименование, - | &ИмяРеквизитаНаименованиеВладельца, - | """" - |ИЗ - | &ТаблицаСправочника КАК ТаблицаСправочника - |ГДЕ - | ТаблицаСправочника.Наименование ПОДОБНО &Наименование СПЕЦСИМВОЛ ""~"" - | И &УсловиеИерархический - | И (НЕ ТаблицаСправочника.ПометкаУдаления)"; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяРеквизитаНаименованиеВладельца", ?(ЭлементМассиваОписания.ЕстьВладелец," ТаблицаСправочника.Владелец.Наименование","""""")); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяРеквизитаНаименование", "ТаблицаСправочника." + ЭлементМассиваОписания.ИмяРеквизитаПредставлениеКонтакта); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСправочника", "Справочник." +ЭлементМассиваОписания.Имя); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеИерархический", ?(ЭлементМассиваОписания.Иерархический, " И (НЕ ТаблицаСправочника.ЭтоГруппа)","")); - КонецЕсли; - + + ТекстЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ТаблицаСправочника.Ссылка, + | &ИмяРеквизитаНаименование КАК Наименование, + | &ИмяРеквизитаНаименованиеВладельца, + | """" + |ИЗ + | &ТаблицаСправочника КАК ТаблицаСправочника + |ГДЕ + | ТаблицаСправочника.Наименование ПОДОБНО &Наименование СПЕЦСИМВОЛ ""~"" + | И &УсловиеИерархический + | И (НЕ ТаблицаСправочника.ПометкаУдаления)"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяРеквизитаНаименованиеВладельца", + ?(ОписаниеКонтакта.ЕстьВладелец, " ТаблицаСправочника.Владелец.Наименование", """""")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяРеквизитаНаименование", + "ТаблицаСправочника." + ОписаниеКонтакта.ИмяРеквизитаПредставлениеКонтакта); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСправочника", "Справочник." + ОписаниеКонтакта.Имя); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеИерархический", + ?(ОписаниеКонтакта.Иерархический, " И (НЕ ТаблицаСправочника.ЭтоГруппа)", "")); + ТекстыЗапроса.Добавить(ТекстЗапроса); + КонецЦикла; - ТекстЗапроса = ТекстЗапроса + " - |УПОРЯДОЧИТЬ ПО - | Наименование"; - - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; + ТекстЗапроса = СтрСоединить(ТекстыЗапроса, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС) + + " + |УПОРЯДОЧИТЬ ПО + | Наименование"; // @query-part-1, @query-part-2 + Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("Наименование", ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(СтрокаПоиска) + "%"); Возврат Запрос.Выполнить().Выгрузить(); diff --git a/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl b/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl index 41d37005a..350072155 100644 --- a/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl @@ -729,11 +729,19 @@ КонецПроцедуры -Процедура ОткрытьВложениеПисьмо(ФайлВложенияПисьма, ПараметрыОткрытия , Форма) Экспорт +// Параметры: +// Письмо - ДокументСсылка.ЭлектронноеПисьмоВходящее +// - ДокументСсылка.ЭлектронноеПисьмоИсходящее +// - СправочникСсылка.ЭлектронноеПисьмоВходящееПрисоединенныеФайлы +// - СправочникСсылка.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы +// ПараметрыОткрытия - см. ПараметрыПисьмаВложения +// Форма - ФормаКлиентскогоПриложения +// +Процедура ОткрытьВложениеПисьмо(Письмо, ПараметрыОткрытия, Форма) Экспорт ОчиститьСообщения(); ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("Письмо", ФайлВложенияПисьма); + ПараметрыФормы.Вставить("Письмо", Письмо); ПараметрыФормы.Вставить("НеВызыватьКомандуПечати", ПараметрыОткрытия.НеВызыватьКомандуПечати); ПараметрыФормы.Вставить("ИмяПользователяУчетнойЗаписи", ПараметрыОткрытия.ИмяПользователяУчетнойЗаписи); ПараметрыФормы.Вставить("ОтображатьВложенияПисьма", ПараметрыОткрытия.ОтображатьВложенияПисьма); @@ -745,24 +753,20 @@ КонецПроцедуры -// Формирует структуру по умолчанию параметров письма-вложения, которая передается в форму просмотра и печати. -// -// Параметры: -// // Возвращаемое значение: // Структура: -// *ДатаПисьмаОснования - Дата - дата письма основания. +// *ДатаПисьмаОснования - Дата - дата письма-основания. // *ИмяПользователяУчетнойЗаписи - Строка - имя пользователя учетной записи, которая приняла письмо-основание. // *НеВызыватьКомандуПечати - Булево - признак того, что при открытии формы печати не нужно вызывать команду // печати ОС. -// *ПисьмоОснование - Неопределено, -// - Строка, -// - ДокументСсылка.ЭлектронноеПисьмоВходящее, -// - ДокументСсылка.ЭлектронноеПисьмоИсходящее - ссылка на письмо основание или +// *ПисьмоОснование - Неопределено +// - Строка +// - ДокументСсылка.ЭлектронноеПисьмоВходящее +// - ДокументСсылка.ЭлектронноеПисьмоИсходящее - ссылка на письмо-основание или // представление письма. // *ТемаПисьмаОснования - Строка - тема письма-основания. // -Функция ПустаяСтруктураПараметровПисьмаВложения() Экспорт +Функция ПараметрыПисьмаВложения() Экспорт ПараметрыОткрытия = Новый Структура; ПараметрыОткрытия.Вставить("ДатаПисьмаОснования", Дата(1, 1, 1)); diff --git a/SSL/src/CommonModules/ВзаимодействияЛокализация/Module.bsl b/SSL/src/CommonModules/ВзаимодействияЛокализация/Module.bsl index 19d1b3c6b..a8581ba66 100644 --- a/SSL/src/CommonModules/ВзаимодействияЛокализация/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияЛокализация/Module.bsl @@ -38,4 +38,23 @@ КонецПроцедуры +// Формирует соответствие идентичных (подменяемых) доменов электронной почты. +// Используется при определении того, что письмо отправлено на почтовый ящик отправителя. +// Может потребоваться при загрузке исходящего письма по протоколу IMAP. +// При отправке такого письма почтовый сервер мог указать в адресе отправителя другой домен. +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - Строка - имя домена на который зарегистрирована учетная запись. +// * Значение - Строка - имя домена, который указан в адресе отправителя в электронном письме +// +Функция СинонимыДоменовЭлектроннойПочты() Экспорт + + Результат = Новый Соответствие; + Результат.Вставить("yandex.ru","ya.ru"); + + Возврат Результат; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/ВзаимодействияСобытия/Module.bsl b/SSL/src/CommonModules/ВзаимодействияСобытия/Module.bsl index 28cfe37d4..f9e99ffb5 100644 --- a/SSL/src/CommonModules/ВзаимодействияСобытия/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияСобытия/Module.bsl @@ -47,12 +47,12 @@ |ИЗ | #ИмяДокумента КАК ДокументВзаимодействий |ГДЕ - | ДокументВзаимодействий.Тема ПОДОБНО &СтрокаПоиска - | ИЛИ ДокументВзаимодействий.Номер ПОДОБНО &СтрокаПоиска"; + | ДокументВзаимодействий.Тема ПОДОБНО &СтрокаПоиска СПЕЦСИМВОЛ ""~"" + | ИЛИ ДокументВзаимодействий.Номер ПОДОБНО &СтрокаПоиска СПЕЦСИМВОЛ ""~"""; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ИмяДокумента", "Документ" + "." + ИмяДокумента); Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("СтрокаПоиска", Параметры.СтрокаПоиска + "%"); + Запрос.УстановитьПараметр("СтрокаПоиска", ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(Параметры.СтрокаПоиска) + "%"); ДанныеВыбора = Новый СписокЗначений; ДанныеВыбора.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка")); diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыВМоделиСервисаСлужебный/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыВМоделиСервисаСлужебный/Module.bsl index 656dabf4d..03c37aa3f 100644 --- a/SSL/src/CommonModules/ВнешниеКомпонентыВМоделиСервисаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеКомпонентыВМоделиСервисаСлужебный/Module.bsl @@ -75,7 +75,7 @@ НСтр("ru = 'Поставляемые внешние компоненты.Загрузка поставляемой компоненты'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; УстановитьПривилегированныйРежим(Ложь); diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыКлиент/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыКлиент/Module.bsl index d90a4d578..affcce470 100644 --- a/SSL/src/CommonModules/ВнешниеКомпонентыКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеКомпонентыКлиент/Module.bsl @@ -19,6 +19,12 @@ // * ИдентификаторыСозданияОбъектов - Массив - массив строк идентификаторов создания экземпляров модуля объекта, // используется только для компонент, у которых есть несколько идентификаторов создания объектов, // при задании параметр Идентификатор будет использоваться только для определения компоненты. +// * Изолированно - Булево, Неопределено - (по умолчанию Неопределено) если Истина, компонента будет подключена +// изолированно, в этом случае внешняя компонента загружается в отдельный процесс операционной системы; +// Ложь - в этом случае внешняя компонента будет выполняться в том же процессе операционной системы, +// который выполняет код встроенного языка; Неопределено - поддерживается поведение платформы по умолчанию: +// изолированно - если компонентой поддерживается только этот режим, не изолированно - в остальных случаях. +// См. https://its.1c.eu/db/v83doc#bookmark:dev:TI000001866 // // Пример: // @@ -35,6 +41,7 @@ Параметры.Вставить("ПредложитьЗагрузить", Истина); Параметры.Вставить("ТекстПояснения", ""); Параметры.Вставить("ИдентификаторыСозданияОбъектов", Новый Массив); + Параметры.Вставить("Изолированно", Неопределено); Возврат Параметры; @@ -158,7 +165,7 @@ КонецПроцедуры -// Структура параметров для см. процедуру УстановитьКомпоненту. +// Структура параметров для процедуры ВнешниеКомпонентыКлиент.УстановитьКомпоненту. // // Возвращаемое значение: // Структура: @@ -236,6 +243,7 @@ КонецПроцедуры + // Возвращает структуру параметров для описания правил поиска дополнительной информации в составе внешней компоненты, // см. процедуру ЗагрузитьКомпонентуИзФайла. // @@ -260,7 +268,7 @@ КонецФункции -// Структура параметров для см. процедуру ЗагрузитьКомпонентуИзФайла. +// Структура параметров для процедуру ВнешниеКомпонентыКлиент.ЗагрузитьКомпонентуИзФайла. // // Возвращаемое значение: // Структура: @@ -338,4 +346,116 @@ КонецПроцедуры +#Область ДляВызоваИзДругихПодсистем + +// ПоддержкаОборудования +// +// Подключает компоненту, выполненную по технологии Native API или COM на клиентском компьютере. +// Выполняет проверку возможности исполнения компоненты на текущем клиенте пользователя. +// +// Параметры: +// Идентификатор - Строка - идентификатор объекта внешней компоненты. +// Версия - Строка - версия компоненты. +// ПараметрыПодключения - см. ВнешниеКомпонентыКлиент.ПараметрыПодключения. +// +// Возвращаемое значение: +// Структура - результат подключения компоненты: +// * Подключено - Булево - признак подключения; +// * ПодключаемыйМодуль - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты; +// - ФиксированноеСоответствие из КлючИЗначение - экземпляры объектов внешней компоненты, +// указанные в ПараметрыПодключения.ИдентификаторыСозданияОбъектов: +// *** Ключ - Строка - идентификатор внешней компоненты; +// *** Значение - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты. +// * ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка. +// +Асинх Функция ПодключитьКомпонентуАсинх(Идентификатор, Версия = Неопределено, + ПараметрыПодключения = Неопределено) Экспорт + + Если ПараметрыПодключения = Неопределено Тогда + ПараметрыПодключения = ПараметрыПодключения(); + КонецЕсли; + + Контекст = ОбщегоНазначенияСлужебныйКлиент.КонтекстПодключенияКомпоненты(); + ЗаполнитьЗначенияСвойств(Контекст, ПараметрыПодключения); + Контекст.Идентификатор = Идентификатор; + Контекст.Версия = Версия; + + Возврат Ждать ВнешниеКомпонентыСлужебныйКлиент.ПодключитьКомпонентуАсинх(Контекст); + +КонецФункции + +// Устанавливает компоненту, выполненную по технологии Native API и COM асинхронном режиме. +// Выполняет проверку возможности исполнения компоненты на текущем клиенте пользователя. +// +// Параметры: +// Идентификатор - Строка - идентификатор объекта внешней компоненты. +// Версия - Строка - версия компоненты. +// ПараметрыУстановки - см. ПараметрыУстановки. +// +// Возвращаемое значение: +// Структура - результат установки компоненты: +// * Установлено - Булево - признак установки. +// * ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка. +// +Асинх Функция УстановитьКомпонентуАсинх(Идентификатор, Версия = Неопределено, + ПараметрыУстановки = Неопределено) Экспорт + + Если ПараметрыУстановки = Неопределено Тогда + ПараметрыУстановки = ПараметрыУстановки(); + КонецЕсли; + + Контекст = ОбщегоНазначенияСлужебныйКлиент.КонтекстПодключенияКомпоненты(); + Контекст.Идентификатор = Идентификатор; + Контекст.Версия = Версия; + Контекст.ТекстПояснения = ПараметрыУстановки.ТекстПояснения; + Контекст.ПредложитьЗагрузить = ПараметрыУстановки.ПредложитьЗагрузить; + Контекст.ПредложитьУстановить = ПараметрыУстановки.ПредложитьУстановить; + + Возврат Ждать ВнешниеКомпонентыСлужебныйКлиент.УстановитьКомпонентуАсинх(Контекст); + +КонецФункции + +// Подключает компоненту, выполненную по технологии COM, из реестра Windows в асинхронном режиме. +// (не рекомендуется, для обратной совместимости с компонентами 1С 7.7). +// +// Параметры: +// Идентификатор - Строка - идентификатор объекта внешней компоненты. +// ИдентификаторСозданияОбъекта - Строка - идентификатор создания экземпляра модуля объекта +// (только для компонент, у которых идентификатор создания объекта отличается от ProgID). +// +// Возвращаемое значение: +// Структура - результат подключения компоненты: +// * Подключено - Булево - признак подключения; +// * ПодключаемыйМодуль - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты; +// - ФиксированноеСоответствие из КлючИЗначение - экземпляры объектов внешней компоненты, +// указанные в ПараметрыПодключения.ИдентификаторыСозданияОбъектов: +// *** Ключ - Строка - идентификатор внешней компоненты; +// *** Значение - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты. +// * ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка. +// +Асинх Функция ПодключитьКомпонентуИзРеестраWindowsАсинх(Идентификатор, + ИдентификаторСозданияОбъекта = Неопределено) Экспорт + + Контекст = ВнешниеКомпонентыСлужебныйКлиент.КонтекстПодключенияКомпонентыИзРеестраWindows(); + Контекст.Идентификатор = Идентификатор; + Контекст.ИдентификаторСозданияОбъекта = ИдентификаторСозданияОбъекта; + + Возврат Ждать ВнешниеКомпонентыСлужебныйКлиент.ПодключитьКомпонентуИзРеестраWindowsАсинх(Контекст); + +КонецФункции + +// Конец ПоддержкаОборудования + #КонецОбласти + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ПоказатьВнешниеКомпоненты() Экспорт + + ОткрытьФорму("Справочник.ВнешниеКомпоненты.ФормаСписка"); + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыСервер/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыСервер/Module.bsl index 1ce613878..c38f81380 100644 --- a/SSL/src/CommonModules/ВнешниеКомпонентыСервер/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеКомпонентыСервер/Module.bsl @@ -15,11 +15,19 @@ // * ИдентификаторыСозданияОбъектов - Массив из Строка - идентификаторы экземпляров модуля объекта, // используется только для компонент, у которых есть несколько идентификаторов создания объектов. // При задании параметр Идентификатор будет использоваться только для определения компоненты. +// * Изолированно - Булево, Неопределено - (по умолчанию Неопределено) если Истина, компонента будет подключена +// изолированно, в этом случае внешняя компонента загружается в отдельный процесс операционной системы; +// Ложь - в этом случае внешняя компонента будет выполняться в том же процессе операционной системы, +// который выполняет код встроенного языка; Неопределено - поддерживается поведение платформы по умолчанию: +// не изолированно - если компонентой поддерживается только этот режим, изолированно - в остальных случаях. +// См. https://its.1c.ru/db/v83doc#bookmark:dev:TI000001866 +// // Функция ПараметрыПодключения() Экспорт Параметры = Новый Структура; Параметры.Вставить("ИдентификаторыСозданияОбъектов", Новый Массив); + Параметры.Вставить("Изолированно", Ложь); Возврат Параметры; @@ -32,7 +40,7 @@ // Параметры: // Идентификатор - Строка - идентификатор объекта внешней компоненты. // Версия - Строка - версия компоненты. -// ПараметрыПодключения - см. ВнешниеКомпонентыСервер.ПодключитьКомпоненту. +// ПараметрыПодключения - см. ПараметрыПодключения. // // Возвращаемое значение: // Структура - результат подключения компоненты: @@ -46,6 +54,12 @@ // Функция ПодключитьКомпоненту(Знач Идентификатор, Версия = Неопределено, ПараметрыПодключения = Неопределено) Экспорт + Если ПараметрыПодключения = Неопределено Тогда + Изолированно = Ложь; + Иначе + Изолированно = ПараметрыПодключения.Изолированно; + КонецЕсли; + РезультатПроверки = ВнешниеКомпонентыСлужебный.ПроверитьПодключениеКомпоненты(Идентификатор, Версия, ПараметрыПодключения); Если Не ПустаяСтрока(РезультатПроверки.ОписаниеОшибки) Тогда Результат = Новый Структура; @@ -53,9 +67,11 @@ Результат.Вставить("ПодключаемыйМодуль", Неопределено); Результат.Вставить("Версия", Версия); Результат.Вставить("ОписаниеОшибки", РезультатПроверки.ОписаниеОшибки); - Возврат Результат; - КонецЕсли; - Возврат ОбщегоНазначения.ПодключитьКомпонентуПоИдентификатору(РезультатПроверки.Идентификатор, РезультатПроверки.Местоположение); + Возврат Результат; + КонецЕсли; + + Возврат ОбщегоНазначения.ПодключитьКомпонентуПоИдентификатору( + РезультатПроверки.Идентификатор, РезультатПроверки.Местоположение, Изолированно); КонецФункции @@ -161,7 +177,7 @@ Если КодОшибки = "ОтсутствуетКомпонента" Тогда ИнформацияОбОшибке = НСтр("ru = 'В сервисе отсутствует данная внешняя компонента'"); ИначеЕсли КодОшибки = "ФайлНеЗагружен" Тогда - ИнформацияОбОшибке = НСтр("ru = 'Ошибка при попытке загрузки файла внешней компоненты из сервиса'"); + ИнформацияОбОшибке = НСтр("ru = 'Файл внешней компоненты не загружен из сервиса'"); КонецЕсли; ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -230,11 +246,11 @@ Исключение ОтменитьТранзакцию(); Результат = Результат + ПредставлениеКомпоненты - + " - " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + Символы.ПС; + + " - " + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + Символы.ПС; ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/Module.bsl index 2d6b2ada9..3938f451f 100644 --- a/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/Module.bsl @@ -139,8 +139,8 @@ КонецЦикла; Исключение - Результат.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при разборе файла %1 - |%2'"), ЭлементАрхива.ИсходноеПолноеИмя, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Результат.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Некорректный файл %1: + |%2'"), ЭлементАрхива.ИсходноеПолноеИмя, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат Результат; КонецПопытки; КонецЦикла; @@ -318,7 +318,7 @@ Исключение ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Добавление внешней компоненты'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -1007,7 +1007,7 @@ ИначеЕсли КодОшибки = "ОтсутствуетВерсия" Тогда ИнформацияОбОшибке = НСтр("ru = 'На портале 1С:ИТС нет требуемой версии внешней компоненты %1.'"); ИначеЕсли КодОшибки = "ФайлНеЗагружен" Или КодОшибки = "АктуальнаяВерсия" Тогда - ИнформацияОбОшибке = НСтр("ru = 'При загрузке внешней компоненты %1 произошла непредвиденная ошибка (код %2).'"); + ИнформацияОбОшибке = НСтр("ru = 'Не удалось загрузить внешнюю компоненту %1 по непредвиденной причине (код %2).'"); КонецЕсли; ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИнформацияОбОшибке, @@ -1048,7 +1048,7 @@ ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; ОповеститьВсеСеансыОбИзмененииВнешнейКомпоненты(); diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйВызовСервера/Module.bsl index 3e611baef..077aba264 100644 --- a/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйВызовСервера/Module.bsl @@ -23,7 +23,7 @@ Если Результат.Состояние = "НайденаВХранилище" Или Результат.Состояние = "НайденаВОбщемХранилище" Тогда Версия = Результат.Реквизиты.Версия; ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для идентификатора %1 (версия %2) получена внешняя компонента %3 (версия %4). + НСтр("ru = 'Для идентификатора %1 (версия %2) получена внешняя компонента %3 (версия %4) из справочника. |Состояние: %5'"), Идентификатор, ?(Версия <> Неопределено, Версия, НСтр("ru = 'не указана'")), Результат.Реквизиты.Наименование, Результат.Реквизиты.Версия, Результат.Состояние); @@ -31,11 +31,11 @@ УровеньЖурналаРегистрации.Информация,, Результат.Ссылка, ТекстСообщения); Иначе ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для идентификатора %1 (версия %2) не удалось получить внешнюю компоненту. + НСтр("ru = 'Для идентификатора %1 (версия %2) в справочнике нет подходящей внешней компоненты. |Состояние: %3'"), Идентификатор, ?(Версия <> Неопределено, Версия, НСтр("ru = 'не указана'")), Результат.Состояние); ЗаписьЖурналаРегистрации(НСтр("ru = 'Внешние компоненты'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Предупреждение,,, ТекстСообщения); + УровеньЖурналаРегистрации.Информация,,, ТекстСообщения); КонецЕсли; Возврат Результат; diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйКлиент/Module.bsl index 895a32001..19980a61a 100644 --- a/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйКлиент/Module.bsl @@ -128,6 +128,80 @@ КонецПроцедуры +// Параметры: +// Контекст - см. ОбщегоНазначенияСлужебныйКлиент.КонтекстПодключенияКомпоненты +// +Функция РезультатПроверкиДоступностиКомпоненты(Контекст) Экспорт + + ПутьКМакетуДляПоискаПоследнейВерсии = Неопределено; + ИскатьКомпонентуПоследнейВерсии = ЗначениеЗаполнено(Контекст.ИсходноеМестоположение) И Не Контекст.ВыполненПоискНовойВерсии; + Если ИскатьКомпонентуПоследнейВерсии Тогда + ПутьКМакетуДляПоискаПоследнейВерсии = Контекст.ИсходноеМестоположение; + КонецЕсли; + + Информация = ВнешниеКомпонентыСлужебныйВызовСервера.ИнформацияОСохраненнойКомпоненте( + Контекст.Идентификатор, Контекст.Версия, ПутьКМакетуДляПоискаПоследнейВерсии); + + Контекст.Местоположение = Информация.Местоположение; + + // Информация.Состояние: + // * НеНайдена + // * НайденаВХранилище + // * НайденаВОбщемХранилище + // * ОтключенаАдминистратором + + Результат = РезультатДоступностиКомпоненты(); + Результат.КомпонентаПоследнейВерсии = Информация.ПоследняяВерсияКомпонентыИзМакета; + Результат.Местоположение = Информация.Местоположение; + + Если Информация.Состояние = "ОтключенаАдминистратором" Тогда + + Результат.ОписаниеОшибки = НСтр("ru = 'Отключена администратором.'"); + Возврат Результат; + + ИначеЕсли Информация.Состояние = "НеНайдена" Тогда + + Результат.ОписаниеОшибки = НСтр("ru = 'Компонента отсутствует в списке разрешенных внешних компонент.'"); + + Возврат Результат; + + Иначе + + Если ТекущийКлиентПоддерживаетсяКомпонентой(Информация.Реквизиты) Тогда + + Результат.Доступна = Истина; + Результат.Вставить("Версия", Информация.Реквизиты.Версия); + + Если ИскатьКомпонентуПоследнейВерсии Тогда + ЧастиВерсии = СтрРазделить(Результат.Версия, "."); + Если ЧастиВерсии.Количество() = 4 Тогда + // Версия внешней компоненты больше, чем версия макета. + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Результат.Версия, + Результат.КомпонентаПоследнейВерсии.Версия) > 0 Тогда + Результат.КомпонентаПоследнейВерсии = Новый Структура("Идентификатор, Версия, Местоположение", + Контекст.Идентификатор, Результат.Версия, Информация.Местоположение); + КонецЕсли; + Иначе + // Если номер версии компоненты не соответствует шаблону, используется компонента из справочника. + Результат.КомпонентаПоследнейВерсии = Новый Структура("Идентификатор, Версия, Местоположение", + Контекст.Идентификатор, Результат.Версия, Информация.Местоположение); + КонецЕсли; + КонецЕсли; + + Возврат Результат; + + Иначе + + Результат.ОписаниеОшибки = ТекстУстановкаВнешнейКомпонентыНевозможна(Контекст.ТекстПояснения); + + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + // См. СтандартныеПодсистемыКлиент.ПриПолученииСерверногоОповещения Процедура ПриПолученииСерверногоОповещения(ИмяОповещения, Результат) Экспорт @@ -308,10 +382,102 @@ КонецФункции +Функция ТекстУстановкаВнешнейКомпонентыНевозможна(Знач ТекстПояснения) Экспорт + + Если ПустаяСтрока(ТекстПояснения) Тогда + ТекстПояснения = НСтр("ru = 'Установка внешней компоненты невозможна.'"); + КонецЕсли; + + Возврат СтроковыеФункцииКлиент.ФорматированнаяСтрока(НСтр("ru = '%1 + | + |Не предусмотрена работа внешней компоненты + |в клиентском приложении <b>%2</b>. + |Используйте <a href = about:blank>поддерживаемое клиентское приложение</a> или обратитесь к разработчику внешней компоненты.'"), + ТекстПояснения, ПредставлениеТекущегоКлиента()); + +КонецФункции + +Функция ПредставлениеТекущегоКлиента() + + СистемнаяИнформация = Новый СистемнаяИнформация; + +#Если ВебКлиент Тогда + Строка = СистемнаяИнформация.ИнформацияПрограммыПросмотра; + + Если СтрНайти(Строка, "Chrome/") > 0 Тогда + Браузер = НСтр("ru = 'Chrome'"); + ИначеЕсли СтрНайти(Строка, "MSIE") > 0 Тогда + Браузер = НСтр("ru = 'Internet Explorer'"); + ИначеЕсли СтрНайти(Строка, "Safari/") > 0 Тогда + Браузер = НСтр("ru = 'Safari'"); + ИначеЕсли СтрНайти(Строка, "Firefox/") > 0 Тогда + Браузер = НСтр("ru = 'Firefox'"); + КонецЕсли; + + Приложение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'веб-клиент %1'"), Браузер); +#ИначеЕсли МобильноеПриложениеКлиент Тогда + Приложение = НСтр("ru = 'мобильное приложение'"); +#ИначеЕсли МобильныйКлиент Тогда + Приложение = НСтр("ru = 'мобильный клиент'"); +#ИначеЕсли ТонкийКлиент Тогда + Приложение = НСтр("ru = 'тонкий клиент'"); +#ИначеЕсли ТолстыйКлиентОбычноеПриложение Тогда + Приложение = НСтр("ru = 'толстый клиент (обычное приложение)'"); +#ИначеЕсли ТолстыйКлиентУправляемоеПриложение Тогда + Приложение = НСтр("ru = 'толстый клиент'"); +#КонецЕсли + + Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда + Платформа = НСтр("ru = 'Windows x86'"); + ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда + Платформа = НСтр("ru = 'Windows x86-64'"); + ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 Тогда + Платформа = НСтр("ru = 'Linux x86'"); + ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда + Платформа = НСтр("ru = 'Linux x86-64'"); + ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86 Тогда + Платформа = НСтр("ru = 'macOS x86'"); + ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86_64 Тогда + Платформа = НСтр("ru = 'macOS x86-64'"); + КонецЕсли; + + // Например: + // веб-клиент Firefox Windows x86 + // тонкий клиент Windows x86-64 + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 %2'"), Приложение, Платформа); + +КонецФункции + #КонецОбласти #Область ПодключитьКомпоненту +// Параметры: +// Контекст - см. ОбщегоНазначенияСлужебныйКлиент.КонтекстПодключенияКомпоненты +// +Асинх Функция ПодключитьКомпонентуАсинх(Контекст) Экспорт + + Результат = РезультатПроверкиДоступностиКомпоненты(Контекст); + + Если Результат.Доступна Тогда + Возврат Ждать ОбщегоНазначенияСлужебныйКлиент.ПодключитьКомпонентуАсинх(Контекст); + Иначе + Если Не ПустаяСтрока(Результат.ОписаниеОшибки) Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось подключить внешнюю компоненту ""%1"" на клиенте + |из хранилища внешних компонент + |по причине: + |%2'"), + Контекст.Идентификатор, + Результат.ОписаниеОшибки); + КонецЕсли; + + Возврат ОбщегоНазначенияСлужебныйКлиент.ОшибкаПодключенияКомпоненты(ТекстОшибки); + + КонецЕсли; + +КонецФункции + Процедура ПодключитьКомпоненту(Контекст) Экспорт Оповещение = Новый ОписаниеОповещения( @@ -368,9 +534,96 @@ Контекст.Вставить("ИдентификаторСозданияОбъекта", ""); Возврат Контекст; -КонецФункции +КонецФункции -// Для вызова из ВнешниеКомпонентыКлиент.ПодключитьКомпонентуИзРеестраWindows. +// Для вызова из ВнешниеКомпонентыКлиент.ПодключитьКомпонентуИзРеестраWindowsАсинх. +// +// Параметры: +// Контекст - см. КонтекстПодключенияКомпонентыИзРеестраWindows. +// +Асинх Функция ПодключитьКомпонентуИзРеестраWindowsАсинх(Контекст) Экспорт + + Если ПодключитьКомпонентуИзРеестраWindowsДоступноПодключение() Тогда + + Попытка + + Подключено = Ждать ПодключитьВнешнююКомпонентуАсинх("AddIn." + Контекст.Идентификатор); + + Исключение + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось подключить внешнюю компоненту ""%1"" на клиенте + |из реестра Windows + |по причине: + |%2'"), Контекст.Идентификатор, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + Возврат ОбщегоНазначенияСлужебныйКлиент.ОшибкаПодключенияКомпоненты(ТекстОшибки); + КонецПопытки; + + Если Подключено Тогда + + ИдентификаторСозданияОбъекта = Контекст.ИдентификаторСозданияОбъекта; + + Если ИдентификаторСозданияОбъекта = Неопределено Тогда + ИдентификаторСозданияОбъекта = Контекст.Идентификатор; + КонецЕсли; + + Попытка + ПодключаемыйМодуль = Новый ("AddIn." + ИдентификаторСозданияОбъекта); + Если ПодключаемыйМодуль = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Оператор Новый вернул Неопределено'"); + КонецЕсли; + Исключение + ПодключаемыйМодуль = Неопределено; + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; + + Если ПодключаемыйМодуль = Неопределено Тогда + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось создать объект внешней компоненты ""%1"", подключенной на клиенте + |из реестра Windows, + |по причине: + |%2'"), Контекст.Идентификатор, ТекстОшибки); + + Возврат ОбщегоНазначенияСлужебныйКлиент.ОшибкаПодключенияКомпоненты(ТекстОшибки); + + Иначе + + Результат = ОбщегоНазначенияСлужебныйКлиент.РезультатПодключенияКомпоненты(); + Результат.Подключено = Истина; + Результат.ПодключаемыйМодуль = ПодключаемыйМодуль; + Возврат Результат; + + КонецЕсли; + + Иначе + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось подключить внешнюю компоненту ""%1"" на клиенте + |из реестра Windows + |по причине: + |Метод %2 вернул %3.'"), Контекст.Идентификатор, "ПодключитьВнешнююКомпонентуАсинх", "Ложь"); + + Возврат ОбщегоНазначенияСлужебныйКлиент.ОшибкаПодключенияКомпоненты(ТекстОшибки); + + КонецЕсли; + + Иначе + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось подключить внешнюю компоненту ""%1"" на клиенте + |из реестра Windows + |по причине: + |Подключить компоненту из реестра Windows возможно только в тонком или толстом клиентах Windows.'"), + Контекст.Идентификатор); + + Возврат ОбщегоНазначенияСлужебныйКлиент.ОшибкаПодключенияКомпоненты(ТекстОшибки); + + КонецЕсли; + +КонецФункции + +// Для вызова из см. ВнешниеКомпонентыКлиент.ПодключитьКомпонентуИзРеестраWindows. // // Параметры: // Контекст - см. КонтекстПодключенияКомпонентыИзРеестраWindows. @@ -423,7 +676,7 @@ КонецЕсли; Исключение ПодключаемыйМодуль = Неопределено; - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Если ПодключаемыйМодуль = Неопределено Тогда @@ -474,7 +727,7 @@ |по причине: |%2'"), Контекст.Идентификатор, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ОбщегоНазначенияСлужебныйКлиент.ПодключитьКомпонентуОповеститьОбОшибке(ТекстОшибки, Контекст); @@ -495,6 +748,29 @@ #Область УстановитьКомпоненту +// Параметры: +// Контекст - см. ОбщегоНазначенияСлужебныйКлиент.КонтекстПодключенияКомпоненты +// +Асинх Функция УстановитьКомпонентуАсинх(Контекст) Экспорт + + РезультатПроверки = РезультатПроверкиДоступностиКомпоненты(Контекст); + + Если РезультатПроверки.Доступна Тогда + Возврат Ждать ОбщегоНазначенияСлужебныйКлиент.УстановитьКомпонентуАсинх(Контекст); + Иначе + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось подключить внешнюю компоненту ""%1"" на клиенте + |из хранилища внешних компонент + |по причине: + |%2'"), + Контекст.Идентификатор, + РезультатПроверки.ОписаниеОшибки); + + Возврат ОбщегоНазначенияСлужебныйКлиент.ОшибкаУстановкиКомпоненты(ТекстОшибки); + КонецЕсли; + +КонецФункции + Процедура УстановитьКомпоненту(Контекст) Экспорт Оповещение = Новый ОписаниеОповещения( diff --git a/SSL/src/CommonModules/ВнешниеПользователи/Module.bsl b/SSL/src/CommonModules/ВнешниеПользователи/Module.bsl index 75ae01cb7..53d59d652 100644 --- a/SSL/src/CommonModules/ВнешниеПользователи/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеПользователи/Module.bsl @@ -73,28 +73,129 @@ КонецФункции -// Используется для настройки отображения наличия внешних пользователей в списках справочников (партнеры, респонденты и др.), -// являющихся объектом авторизации в справочнике ВнешниеПользователи. +// Используется для настройки отображения состояния внешних пользователей +// в списках справочников (партнеры, респонденты и др.), которые +// являются объектом авторизации в справочнике ВнешниеПользователи. +// +// Когда нет прав к справочнику ВнешниеПользователи или он не используется, тогда +// отключается видимость колонки ВнешнийДоступ и легенды ВнешнийДоступЛегенда. // // Параметры: -// Форма - ФормаКлиентскогоПриложения - вызывающий объект. +// Форма - ФормаКлиентскогоПриложения +// ДополнительныеПараметры - см. ПараметрыНастройкиОтображенияСпискаВнешнихПользователей // -Процедура НастроитьОтображениеСпискаВнешнихПользователей(Форма) Экспорт +Процедура НастроитьОтображениеСпискаВнешнихПользователей(Форма, ДополнительныеПараметры = Неопределено) Экспорт - Если ПравоДоступа("Чтение", Метаданные.Справочники.ВнешниеПользователи) Тогда + Если ДополнительныеПараметры = Неопределено Тогда + ДополнительныеПараметры = ПараметрыНастройкиОтображенияСпискаВнешнихПользователей(); + КонецЕсли; + + Список = Форма[ДополнительныеПараметры.ИмяСписка]; + ПользователиСлужебный.ОграничитьИспользованиеЗаполняемогоПоляДинамическогоСписка(Список, + ДополнительныеПараметры.ИмяПоля); + + Если ПравоДоступа("Чтение", Метаданные.Справочники.ВнешниеПользователи) + И ИспользоватьВнешнихПользователей() Тогда + Возврат; + КонецЕсли; + + Элемент = Форма.Элементы.Найти(ДополнительныеПараметры.ИмяЭлемента); + Если Элемент <> Неопределено Тогда + Элемент.Видимость = Ложь; + КонецЕсли; + + Элемент = Форма.Элементы.Найти(ДополнительныеПараметры.ИмяГруппыЛегенды); + Если Элемент <> Неопределено Тогда + Элемент.Видимость = Ложь; Возврат; КонецЕсли; // Удаление отображения недоступных сведений. СхемаЗапроса = Новый СхемаЗапроса; - СхемаЗапроса.УстановитьТекстЗапроса(Форма.Список.ТекстЗапроса); + СхемаЗапроса.УстановитьТекстЗапроса(Список.ТекстЗапроса); Источники = СхемаЗапроса.ПакетЗапросов[0].Операторы[0].Источники; // ИсточникиСхемыЗапроса Для Индекс = 0 По Источники.Количество() - 1 Цикл Если Источники[Индекс].Источник.ИмяТаблицы = "Справочник.ВнешниеПользователи" Тогда Источники.Удалить(Индекс); КонецЕсли; КонецЦикла; - Форма.Список.ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса(); + Список.ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса(); + +КонецПроцедуры + +// Конструктор дополнительных параметров процедуры НастроитьОтображениеСпискаВнешнихПользователей. +// +// Возвращаемое значение: +// Структура: +// * ИмяСписка - Строка - имя реквизита формы с динамическим списком. +// * ИмяПоля - Строка - имя поля запроса динамического списка. +// * ИмяЭлемента - Строка - имя элемента формы колонки динамического списка. +// * ИмяГруппыЛегенды - Строка - имя элемента формы, содержащую легенду состояний внешнего доступа. +// +Функция ПараметрыНастройкиОтображенияСпискаВнешнихПользователей() Экспорт + + Результат = Новый Структура; + Результат.Вставить("ИмяСписка", "Список"); + Результат.Вставить("ИмяПоля", "ВнешнийДоступНомерКартинки"); + Результат.Вставить("ИмяЭлемента", "ВнешнийДоступНомерКартинки"); + Результат.Вставить("ИмяГруппыЛегенды", "ВнешнийДоступЛегенда"); + + Возврат Результат; + +КонецФункции + +// Используется для заполнения значений поля состояния внешних пользователей +// в списках справочников (партнеры, респонденты и др.), которые +// являются объектом авторизации в справочнике ВнешниеПользователи. +// +// Вызов выполняется из события ПриПолученииДанныхНаСервере динамического списка +// справочника, при этом заполняется поле ВнешнийДоступ на основе данных поля Ссылка. +// +// Параметры: +// ИмяЭлемента - Строка +// Настройки - НастройкиКомпоновкиДанных +// Строки - СтрокиДинамическогоСписка +// ИмяПоля - Строка - имя поля номера картинки строк в динамическом списке. +// +Процедура СписокВнешнихПользователейПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки, + ИмяПоля = "ВнешнийДоступНомерКартинки") Экспорт + + Если Строки.Количество() = 0 + Или Не ПравоДоступа("Чтение", Метаданные.Справочники.ВнешниеПользователи) Тогда + Возврат; + КонецЕсли; + + Для Каждого КлючИЗначение Из Строки Цикл + Свойства = Новый Структура("Ссылка" + "," + ИмяПоля); + ЗаполнитьЗначенияСвойств(Свойства, КлючИЗначение.Значение.Данные); + Если КлючИЗначение.Ключ <> Свойства.Ссылка + Или ТипЗнч(Свойства[ИмяПоля]) <> Тип("Число") Тогда + Возврат; + КонецЕсли; + Прервать; + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ОбъектыАвторизации", Строки.ПолучитьКлючи()); + Запрос.Текст = + "ВЫБРАТЬ + | ВнешниеПользователи.ОбъектАвторизации КАК ОбъектАвторизации, + | СведенияОПользователях.НомерКартинкиСостояния - 1 КАК НомерКартинки + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях + | ПО (СведенияОПользователях.Пользователь = ВнешниеПользователи.Ссылка) + |ГДЕ + | ВнешниеПользователи.ОбъектАвторизации В(&ОбъектыАвторизации)"; + + УстановитьПривилегированныйРежим(Истина); + Выборка = Запрос.Выполнить().Выбрать(); + УстановитьПривилегированныйРежим(Ложь); + + Пока Выборка.Следующий() Цикл + Строка = Строки.Получить(Выборка.ОбъектАвторизации); + Строка.Данные[ИмяПоля] = Выборка.НомерКартинки; + КонецЦикла; КонецПроцедуры diff --git a/SSL/src/CommonModules/ВызовОнлайнПоддержки/Module.bsl b/SSL/src/CommonModules/ВызовОнлайнПоддержки/Module.bsl deleted file mode 100644 index ffc5943d2..000000000 --- a/SSL/src/CommonModules/ВызовОнлайнПоддержки/Module.bsl +++ /dev/null @@ -1,118 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////// -// Copyright (c) 2023, ООО 1С-Софт -// Все права защищены. Эта программа и сопроводительные материалы предоставляются -// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) -// Текст лицензии доступен по ссылке: -// https://creativecommons.org/licenses/by/4.0/legalcode -/////////////////////////////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Выполняет действия, необходимые для подключения подсистемы в форме. -// -// Параметры: -// Элемент - КнопкаФормы - команда вызова онлайн поддержки на форме. -// -Процедура ПриСозданииНаСервере(Элемент) Экспорт - - НастройкиПользователя = ВызовОнлайнПоддержкиВызовСервера.НастройкиУчетнойЗаписиПользователя(); - Элемент.Видимость = НастройкиПользователя.ВидимостьКнопкиВызовОнлайнПоддержки; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныйПрограммныйИнтерфейс - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем конфигурации. - -// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Процедура = "ВызовОнлайнПоддержки.ПервоначальноеЗаполнение"; - -КонецПроцедуры - -// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. -Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт - - Библиотека = "СтандартныеПодсистемы"; - - СтароеИмя = "Роль.Интеграция1СБухфон"; - НовоеИмя = "Роль.ВызовОнлайнПоддержки"; - ОбщегоНазначения.ДобавитьПереименование(Итог, "2.4.1.1", СтароеИмя, НовоеИмя, Библиотека); - - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Записывает в регистр сведений путь исполняемого файла онлайн-поддержки. -// Хранение путей до исполняемых файлов ведется в разрезе ПК, для определения ПК используется идентификатор клиента -// т.к. невозможно использование функции ИмяКомпьютера в веб клиенте. -// -// Параметры: -// ИдентификаторКлиента - УникальныйИдентификатор - идентификатор клиента (программы) 1С. -// НовоеРасположениеФайла - Строка - расположение исполняемого файла для ПК на котором запущен клиент 1С. -// -Процедура СохранитьРасположениеИсполняемогоФайлаВызовОнлайнПоддержки(ИдентификаторКлиента, НовоеРасположениеФайла) Экспорт - - ТекущееРасположениеФайла = ВызовОнлайнПоддержкиВызовСервера.РасположениеИсполняемогоФайла(ИдентификаторКлиента); - - Если ТекущееРасположениеФайла = НовоеРасположениеФайла Тогда - Возврат; - КонецЕсли; - - ХранилищеОбщихНастроек.Сохранить("ПутиИсполняемыхФайловВызовОнлайнПоддержки", ИдентификаторКлиента, НовоеРасположениеФайла); - -КонецПроцедуры - -// Записывает в регистр сведений настройки учетных записей пользователей для запуска приложения. -// -// Параметры: -// Пользователь - УникальныйИдентификатор - текущий пользователь информационной базы. -// Логин - Строка - данные учетной записи приложения. -// Пароль - Строка - данные учетной записи приложения. -// ИспользоватьЛП - Булево - если значение Ложь, параметры Логин, Пароль не доступны. -// ВидимостьКнопкиВызовОнлайнПоддержки - Булево - отображение Кнопки запуска приложения на начальной странице. -// -Процедура СохранитьНастройкиПользователяВХранилище(Логин, - Пароль, - ИспользоватьЛП, - ВидимостьКнопкиВызовОнлайнПоддержки) Экспорт - - НастройкиПользователя = НастройкиПользователя(); - НастройкиПользователя.Логин = Логин; - НастройкиПользователя.Пароль = Пароль; - НастройкиПользователя.ИспользоватьЛП = ИспользоватьЛП; - НастройкиПользователя.ВидимостьКнопкиВызовОнлайнПоддержки = ВидимостьКнопкиВызовОнлайнПоддержки; - - ХранилищеОбщихНастроек.Сохранить("УчетныеЗаписиПользователейВызовОнлайнПоддержки", "НастройкиУчетныхДанных", НастройкиПользователя); - -КонецПроцедуры - -Функция НастройкиПользователя() Экспорт - - НастройкиПользователя = Новый Структура(); - НастройкиПользователя.Вставить("Логин", ""); - НастройкиПользователя.Вставить("Пароль",""); - НастройкиПользователя.Вставить("ИспользоватьЛП",Ложь); - НастройкиПользователя.Вставить("ВидимостьКнопкиВызовОнлайнПоддержки",Ложь); - - Возврат НастройкиПользователя; - -КонецФункции - -Процедура ПервоначальноеЗаполнение() Экспорт - Константы.ИспользоватьОнлайнПоддержку.Установить(Истина); -КонецПроцедуры - -#КонецОбласти - - - diff --git a/SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/Module.bsl b/SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/Module.bsl deleted file mode 100644 index bd546f06e..000000000 --- a/SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/Module.bsl +++ /dev/null @@ -1,52 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////// -// Copyright (c) 2023, ООО 1С-Софт -// Все права защищены. Эта программа и сопроводительные материалы предоставляются -// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) -// Текст лицензии доступен по ссылке: -// https://creativecommons.org/licenses/by/4.0/legalcode -/////////////////////////////////////////////////////////////////////////////////////////////////////// - -#Область СлужебныеПроцедурыИФункции - -// Получает из регистра сведений путь к исполняемому файлу. -// -// Параметры: -// ИдентификаторКлиента - УникальныйИдентификатор - идентификатор клиента (программы) 1С. -// -// Возвращаемое значение: -// Строка - путь к исполняемому файлу на ПК текущего пользователя. -// -Функция РасположениеИсполняемогоФайла(ИдентификаторКлиента) Экспорт - - Возврат ХранилищеОбщихНастроек.Загрузить("ПутиИсполняемыхФайловВызовОнлайнПоддержки", ИдентификаторКлиента); - -КонецФункции - -// Получает из регистра сведений параметры для запуска приложения. -// -// Параметры: -// Пользователь - УникальныйИдентификатор - текущий пользователь информационной базы. -// -// Возвращаемое значение: -// Структура - настройки пользователя для запуска приложения. -// -Функция НастройкиУчетнойЗаписиПользователя() Экспорт - - НастройкиПользователя = ВызовОнлайнПоддержки.НастройкиПользователя(); - НастройкиПользователяХранилище = ХранилищеОбщихНастроек.Загрузить("УчетныеЗаписиПользователейВызовОнлайнПоддержки", "НастройкиУчетныхДанных"); - - Если НЕ НастройкиПользователяХранилище = Неопределено Тогда - ЗаполнитьЗначенияСвойств(НастройкиПользователя, НастройкиПользователяХранилище); - Если НастройкиПользователяХранилище.Свойство("ВидимостьКнопки1СБухфон") Тогда - НастройкиПользователя.ВидимостьКнопкиВызовОнлайнПоддержки = НастройкиПользователяХранилище.ВидимостьКнопки1СБухфон; - КонецЕсли; - КонецЕсли; - - Возврат НастройкиПользователя; - -КонецФункции - -#КонецОбласти - - - diff --git a/SSL/src/CommonModules/ВызовОнлайнПоддержкиКлиент/Module.bsl b/SSL/src/CommonModules/ВызовОнлайнПоддержкиКлиент/Module.bsl deleted file mode 100644 index 5d5fffda1..000000000 --- a/SSL/src/CommonModules/ВызовОнлайнПоддержкиКлиент/Module.bsl +++ /dev/null @@ -1,215 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////// -// Copyright (c) 2023, ООО 1С-Софт -// Все права защищены. Эта программа и сопроводительные материалы предоставляются -// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) -// Текст лицензии доступен по ссылке: -// https://creativecommons.org/licenses/by/4.0/legalcode -/////////////////////////////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Управляет видимостью команды вызова онлайн поддержки на форме -// -// Параметры: -// ИмяСобытия - Строка - идентификатор сообщения; -// Элемент - КнопкаФормы - команда вызова онлайн поддержки на форме. -// -Процедура ОбработкаОповещения(ИмяСобытия, Элемент) Экспорт - - Если ИмяСобытия = "СохранениеНастроекВызовОнлайнПоддержки" Тогда - НастройкиПользователя = ВызовОнлайнПоддержкиВызовСервера.НастройкиУчетнойЗаписиПользователя(); - Элемент.Видимость = НастройкиПользователя.ВидимостьКнопкиВызовОнлайнПоддержки; - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныйПрограммныйИнтерфейс - -Процедура ОткрытьФормуНастройкаОнлайнПоддержки() Экспорт - - ОткрытьФорму("ОбщаяФорма.НастройкаОнлайнПоддержки"); - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Возвращает уникальный идентификатор клиента 1С (приложение). -Функция ИдентификаторКлиента() Экспорт - - СистемнаяИнформация = Новый СистемнаяИнформация; - ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; - Возврат ИдентификаторКлиента; - -КонецФункции - -// Возвращает путь файла приложения в реестре Windows. -// -Функция ПутьКИсполняемомуФайлуИзРеестраWindows() Экспорт - -#Если ВебКлиент Тогда - Возврат ""; -#Иначе - Если Не ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда - Возврат ""; - КонецЕсли; - - Значение = ""; - - Объект = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"); - Объект.GetStringValue("2147483649","Software\Buhphone","ProgramPath", Значение); - - Если Значение = "" Или Значение = NULL Тогда - ЗначениеИзРеестра = ""; - Иначе - ЗначениеИзРеестра = Значение; - КонецЕсли; - - Возврат ЗначениеИзРеестра; - -#КонецЕсли - -КонецФункции - -// Диалоговое окно для выбора файла. -// -Процедура ВыбратьФайлВызовОнлайнПоддержки(ОповещениеОЗакрытии, ПутьКФайлу = "") Экспорт - - Каталог = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ПутьКФайлу); - - Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); - Диалог.Заголовок = НСтр("ru = 'Выберите исполняемый файл приложения'"); - Диалог.ПолноеИмяФайла = ПутьКФайлу; - Диалог.Каталог = Каталог.Путь; - Фильтр = НСтр("ru = 'Файл приложения (*.exe)|*.exe'"); - Диалог.Фильтр = Фильтр; - Диалог.МножественныйВыбор = Ложь; - - Оповещение = Новый ОписаниеОповещения("ВыбратьФайлВызовОнлайнПоддержкиЗавершение", ЭтотОбъект, ОповещениеОЗакрытии); - - ФайловаяСистемаКлиент.ПоказатьДиалогВыбора(Оповещение, Диалог); - -КонецПроцедуры - -// Продолжение процедуры (см. выше). -Процедура ВыбратьФайлВызовОнлайнПоддержкиЗавершение(ВыбранныеФайлы, ОповещениеОЗакрытии) Экспорт - - Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() > 0 Тогда - ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, ВыбранныеФайлы[0]); - Иначе - ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, ""); - КонецЕсли; - -КонецПроцедуры - -// Проверяет наличие исполняемого файла по указанному пути. -// -Процедура НаличиеФайлаВызовОнлайнПоддержки(ОповещениеОЗакрытии, Путь) - ПроверяемыйФайл = Новый Файл(Путь); - Оповещение = Новый ОписаниеОповещения("НаличиеФайлаВызовОнлайнПоддержкиПослеПроверкиСуществования", ЭтотОбъект, ОповещениеОЗакрытии); - Если НРег(ПроверяемыйФайл.Расширение) <> ".exe" Тогда - ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, Ложь); - Иначе - ПроверяемыйФайл.НачатьПроверкуСуществования(Оповещение); - КонецЕсли; -КонецПроцедуры - -// Продолжение процедуры (см. выше). -Процедура НаличиеФайлаВызовОнлайнПоддержкиПослеПроверкиСуществования(Существует, ОповещениеОЗакрытии) Экспорт - ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, Существует); -КонецПроцедуры - -// Процедура запускает исполняемый файл приложения. -// При отсутствии файла приложения - открывает форму поиска пути к исполняемому файлу. -// -Процедура ВызватьОнлайнПоддержку() Экспорт - - Если Не ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда - ПоказатьПредупреждение(,НСтр("ru = 'Для работы с приложением необходима операционная система Microsoft Windows.'")); - Возврат - КонецЕсли; - - Оповещение = Новый ОписаниеОповещения("ВызватьОнлайнПоддержкуПослеУстановкиРасширения", ЭтотОбъект); - ТекстСообщения = НСтр("ru = 'Для запуска приложения установите расширение для работы с 1С:Предприятием.'"); - ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(Оповещение, ТекстСообщения, Ложь); - -КонецПроцедуры - -// Продолжение процедуры (см. выше). -Процедура ВызватьОнлайнПоддержкуПослеУстановкиРасширения(РасширениеПодключено, ДополнительныеПараметры) Экспорт - - Если НЕ РасширениеПодключено Тогда - Возврат; - КонецЕсли; - - // Определение параметров запуска. - ИдентификаторКлиента = ИдентификаторКлиента(); - ПутьИзРеестра = ПутьКИсполняемомуФайлуИзРеестраWindows(); - ПутьИзХранилища = ВызовОнлайнПоддержкиВызовСервера.РасположениеИсполняемогоФайла(ИдентификаторКлиента); - - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ПутьИзРеестра", ПутьИзРеестра); - ДополнительныеПараметры.Вставить("ПутьИзХранилища", ПутьИзХранилища); - - Оповещение = Новый ОписаниеОповещения("ВызватьОнлайнПоддержкуПослеПроверкиПутиИзРеестра", ЭтотОбъект, ДополнительныеПараметры); - НаличиеФайлаВызовОнлайнПоддержки(Оповещение, ПутьИзРеестра); - -КонецПроцедуры - -// Продолжение процедуры (см. выше). -Процедура ВызватьОнлайнПоддержкуПослеПроверкиПутиИзРеестра(ПутьИзРеестраВерен, ДополнительныеПараметры) Экспорт - - ДополнительныеПараметры.Вставить("ПутьИзРеестраВерен", ПутьИзРеестраВерен); - Оповещение = Новый ОписаниеОповещения("ВызватьОнлайнПоддержкуПослеПроверкиПутиИзХранилища", ЭтотОбъект, ДополнительныеПараметры); - НаличиеФайлаВызовОнлайнПоддержки(Оповещение, ДополнительныеПараметры.ПутьИзХранилища); - -КонецПроцедуры - -// Продолжение процедуры (см. выше). -Процедура ВызватьОнлайнПоддержкуПослеПроверкиПутиИзХранилища(ПутьИзХранилищаВерен, Контекст) Экспорт - - УчетнаяЗапись = ВызовОнлайнПоддержкиВызовСервера.НастройкиУчетнойЗаписиПользователя(); - ПараметрыЗапускаВызовОнлайнПоддержки = Новый Массив; - ПараметрыЗапускаВызовОнлайнПоддержки.Добавить("/StartedFrom1CConf"); - - Если УчетнаяЗапись.ИспользоватьЛП Тогда - - Если Не ПустаяСтрока(УчетнаяЗапись.Логин) И Не ПустаяСтрока(УчетнаяЗапись.Пароль) Тогда - ПараметрыЗапускаВызовОнлайнПоддержки.Добавить("/login:"); - ПараметрыЗапускаВызовОнлайнПоддержки.Добавить(УчетнаяЗапись.Логин); - ПараметрыЗапускаВызовОнлайнПоддержки.Добавить("/password:"); - ПараметрыЗапускаВызовОнлайнПоддержки.Добавить(УчетнаяЗапись.Пароль); - КонецЕсли; - - КонецЕсли; - - Если ПутьИзХранилищаВерен Тогда - КомандаЗапуска = Новый Массив; - КомандаЗапуска.Добавить(Контекст.ПутьИзХранилища); - ОбщегоНазначенияКлиентСервер.ДополнитьМассив(КомандаЗапуска, ПараметрыЗапускаВызовОнлайнПоддержки); - ФайловаяСистемаКлиент.ЗапуститьПрограмму(КомандаЗапуска); - Возврат; - КонецЕсли; - - Если Контекст.ПутьИзРеестраВерен Тогда - КомандаЗапуска = Новый Массив; - КомандаЗапуска.Добавить(Контекст.ПутьИзРеестра); - ОбщегоНазначенияКлиентСервер.ДополнитьМассив(КомандаЗапуска, ПараметрыЗапускаВызовОнлайнПоддержки); - ФайловаяСистемаКлиент.ЗапуститьПрограмму(КомандаЗапуска); - Возврат; - КонецЕсли; - - ОткрытьФорму("ОбщаяФорма.ПоискИсполняемогоФайлаОнлайнПоддержки"); - -КонецПроцедуры - -#КонецОбласти - - - - - - \ No newline at end of file diff --git a/SSL/src/CommonModules/ГенерацияШтрихкода/Module.bsl b/SSL/src/CommonModules/ГенерацияШтрихкода/Module.bsl index 17d1f0900..5f19f7e2d 100644 --- a/SSL/src/CommonModules/ГенерацияШтрихкода/Module.bsl +++ b/SSL/src/CommonModules/ГенерацияШтрихкода/Module.bsl @@ -105,10 +105,12 @@ Если ВнешняяКомпонента = Неопределено Тогда ТекстСообщения = НСтр("ru = 'Ошибка подключения внешней компоненты печати штрихкода.'"); + #Если НЕ МобильноеПриложениеСервер Тогда ЗаписьЖурналаРегистрации(НСтр("ru = 'Ошибка генерации штрихкода'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, ТекстСообщения); + #КонецЕсли ВызватьИсключение ТекстСообщения; КонецЕсли; @@ -160,10 +162,12 @@ РезультатФормированияШтрихкода = ИзображениеШтрихкода(ПараметрыШтрихкода); ДвоичныеДанныеКартинки = РезультатФормированияШтрихкода.ДвоичныеДанные; Исключение + #Если НЕ МобильноеПриложениеСервер Тогда ЗаписьЖурналаРегистрации(НСтр("ru = 'Ошибка генерации штрихкода'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + #КонецЕсли КонецПопытки; Возврат ДвоичныеДанныеКартинки; @@ -187,13 +191,17 @@ #КонецЕсли ВнешняяКомпонента = Неопределено; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда - МодульВнешниеКомпонентыСервер = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыСервер"); - РезультатПодключения = МодульВнешниеКомпонентыСервер.ПодключитьКомпоненту("Barcode"); - Если РезультатПодключения.Подключено Тогда - ВнешняяКомпонента = РезультатПодключения.ПодключаемыйМодуль; +#Если НЕ МобильноеПриложениеСервер Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда + МодульВнешниеКомпонентыСервер = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыСервер"); + РезультатПодключения = МодульВнешниеКомпонентыСервер.ПодключитьКомпоненту("Barcode"); + Если РезультатПодключения.Подключено Тогда + ВнешняяКомпонента = РезультатПодключения.ПодключаемыйМодуль; + КонецЕсли; КонецЕсли; КонецЕсли; +#КонецЕсли Если ВнешняяКомпонента = Неопределено Тогда ВнешняяКомпонента = ОбщегоНазначения.ПодключитьКомпонентуИзМакета("Barcode", "ОбщийМакет.КомпонентаПечатиШтрихкодов"); @@ -203,28 +211,6 @@ Возврат Неопределено; КонецЕсли; - // Если нет возможности рисовать. - Если НЕ ВнешняяКомпонента.ГрафикаУстановлена Тогда - // То картинку сформировать не сможем. - Возврат Неопределено; - Иначе - ПодготовитьКомпонентуГенерацииИзображенияШтрихкода(ВнешняяКомпонента); - Возврат ВнешняяКомпонента; - КонецЕсли; - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Подготовить компоненту генерации изображения штрихкода. -// -// Параметры: -// ВнешняяКомпонента - см. ГенерацияШтрихкодаСерверПовтИсп.ПодключитьКомпонентуГенерацииИзображенияШтрихкода -// -Процедура ПодготовитьКомпонентуГенерацииИзображенияШтрихкода(ВнешняяКомпонента) - // Установим основные параметры компоненты. // Если в системе установлен шрифт Tahoma. Если ВнешняяКомпонента.НайтиШрифт("Tahoma") Тогда @@ -247,7 +233,13 @@ // Установим размер шрифта ВнешняяКомпонента.РазмерШрифта = 12; -КонецПроцедуры + Возврат ВнешняяКомпонента; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции // Подготовить изображения штрихкода. // @@ -335,12 +327,12 @@ // Если установленная нами ширина меньше минимально допустимой для этого штрихкода. Если ВнешняяКомпонента.Ширина < ВнешняяКомпонента.МинимальнаяШиринаКода Тогда ВнешняяКомпонента.Ширина = ВнешняяКомпонента.МинимальнаяШиринаКода; - ВнешняяКомпонента.Высота = (ВнешняяКомпонента.МинимальнаяШиринаКода / Окр(ПараметрыШтрихкода.Ширина)) * Окр(ПараметрыШтрихкода.Высота); + ВнешняяКомпонента.Высота = Окр(ВнешняяКомпонента.МинимальнаяШиринаКода / ШиринаШтрихкода) * ВысотаШтрихкода; КонецЕсли; // Если установленная нами высота меньше минимально допустимой для этого штрихкода. Если ВнешняяКомпонента.Высота < ВнешняяКомпонента.МинимальнаяВысотаКода Тогда ВнешняяКомпонента.Высота = ВнешняяКомпонента.МинимальнаяВысотаКода; - ВнешняяКомпонента.Ширина = (ВнешняяКомпонента.МинимальнаяВысотаКода / Окр(ПараметрыШтрихкода.Высота)) * Окр(ПараметрыШтрихкода.Ширина); + ВнешняяКомпонента.Ширина = Окр(ВнешняяКомпонента.МинимальнаяВысотаКода / ВысотаШтрихкода) * ШиринаШтрихкода; КонецЕсли; КонецЦикла; КонецЕсли; @@ -366,13 +358,12 @@ КонецЕсли; Если ПараметрыШтрихкода.ТипКода = 16 Тогда // QR - Если ПараметрыШтрихкода.Свойство("ЛоготипКартинка") И ЗначениеЗаполнено(ПараметрыШтрихкода.ЛоготипКартинка) Тогда - ВнешняяКомпонента.ЛоготипКартинка = ПараметрыШтрихкода.ЛоготипКартинка; + Если ПараметрыШтрихкода.Свойство("ЛоготипКартинка") И ЗначениеЗаполнено(ПараметрыШтрихкода.ЛоготипКартинка) Тогда + ВнешняяКомпонента.ЛоготипКартинка = ПараметрыШтрихкода.ЛоготипКартинка; Иначе ВнешняяКомпонента.ЛоготипКартинка = ""; КонецЕсли; - Если ПараметрыШтрихкода.Свойство("ЛоготипРазмерПроцентОтШК") И Не ПустаяСтрока( - ПараметрыШтрихкода.ЛоготипРазмерПроцентОтШК) Тогда + Если ПараметрыШтрихкода.Свойство("ЛоготипРазмерПроцентОтШК") И Не ПустаяСтрока(ПараметрыШтрихкода.ЛоготипРазмерПроцентОтШК) Тогда ВнешняяКомпонента.ЛоготипРазмерПроцентОтШК = ПараметрыШтрихкода.ЛоготипРазмерПроцентОтШК; КонецЕсли; КонецЕсли; diff --git a/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовПереопределяемый/Module.bsl index 1657509d9..de3fa9401 100644 --- a/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовПереопределяемый/Module.bsl @@ -47,6 +47,21 @@ +КонецПроцедуры + +// Определяет реквизиты объекта, которые разрешается редактировать с помощью обработки группового изменения реквизитов. +// По умолчанию все реквизиты объекта разрешено редактировать. Для ограничения списка реквизитов необходимо заполнить +// одну из коллекций РедактируемыеРеквизиты и НередактируемыеРеквизиты. Если заполнены обе коллекции, то для разрешения +// неоднозначности приоритет отдается в пользу коллекции НередактируемыеРеквизиты. +// +// Параметры: +// Объект - ОбъектМетаданных - объект, для которого устанавливается список редактируемых реквизитов. +// РедактируемыеРеквизиты - Неопределено, Массив из Строка - имена редактируемых групповой обработкой реквизитов объекта. +// Значение игнорируется, если заполнен параметр НередактируемыеРеквизиты. +// НередактируемыеРеквизиты - Неопределено, Массив из Строка - имена не редактируемых групповой обработкой реквизитов объекта. +// +Процедура ПриОпределенииРедактируемыхРеквизитовОбъекта(Объект, РедактируемыеРеквизиты, НередактируемыеРеквизиты) Экспорт + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl b/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl index 1b67750f8..d30bcfb6c 100644 --- a/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl +++ b/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl @@ -65,6 +65,17 @@ Функция ИзменениеЗапрещено(ДанныеИлиПолноеИмя, ИдентификаторДанных = Неопределено, ОписаниеОшибки = Null, УзелПроверкиЗапретаЗагрузки = Неопределено) Экспорт + Если ТипЗнч(ДанныеИлиПолноеИмя) = Тип("Строка") Тогда + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ДанныеИлиПолноеИмя); + Иначе + ОбъектМетаданных = ДанныеИлиПолноеИмя.Метаданные(); + КонецЕсли; + + ИсточникиДанных = ДатыЗапретаИзмененияСлужебный.ИсточникиДанныхДляПроверкиЗапретаИзменения(); + Если ИсточникиДанных.Получить(ОбъектМетаданных.ПолноеИмя()) = Неопределено Тогда + Возврат Ложь; // Для текущего типа объекта не определены запреты по датам. + КонецЕсли; + ПроверкаЗапретаИзменения = УзелПроверкиЗапретаЗагрузки = Неопределено; Если ТипЗнч(ДанныеИлиПолноеИмя) = Тип("Строка") Тогда @@ -100,7 +111,7 @@ Идентификатор = ИдентификаторДанных; Если ВерсияОбъекта = "СтараяВерсия" Тогда - Источник = Метаданные.НайтиПоТипу(ДанныеИлиПолноеИмя).ПолноеИмя(); + Источник = ОбъектМетаданных.ПолноеИмя(); ИначеЕсли ВерсияОбъекта = "НоваяВерсия" Тогда Идентификатор = Неопределено; diff --git a/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl b/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl index b678d72fb..3fdd223c6 100644 --- a/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl @@ -8,20 +8,6 @@ #Область СлужебныйПрограммныйИнтерфейс -// Возвращает возможность проверки запрета изменения данных. -// -// Параметры: -// ОбъектМетаданных - ОбъектМетаданных -// -// Возвращаемое значение: -// Булево -// -Функция ЗапретИзмененияПроверяется(ОбъектМетаданных) Экспорт - - Возврат ИсточникиДанныхДляПроверкиЗапретаИзменения().Получить(ОбъектМетаданных.ПолноеИмя()) <> Неопределено; - -КонецФункции - // Возвращаемое значение: // ФиксированнаяСтруктура: // * БезРазделовИОбъектов - Булево @@ -37,8 +23,8 @@ // *** Имя - Строка // *** Представление - Строка // *** Ссылка - ПланВидовХарактеристикСсылка.РазделыДатЗапретаИзменения -// *** ТипыОбъектов- ФиксированныйМассив -// * РазделыБезОбъектов- ФиксированныйМассив +// *** ТипыОбъектов - ФиксированныйМассив +// * РазделыБезОбъектов - ФиксированныйМассив // Функция СвойстваРазделов() Экспорт @@ -82,6 +68,9 @@ Обработчики.Вставить("ОбновитьВерсиюДатЗапретаИзмененияПослеЗагрузкиДанных", "ДатыЗапретаИзмененияСлужебный.УстановкаПараметровСеанса"); + Обработчики.Вставить("ПраваДоступаКДатамЗапрета", + "ДатыЗапретаИзмененияСлужебный.УстановкаПараметровСеанса"); + КонецПроцедуры // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. @@ -107,6 +96,10 @@ Обработчик.Версия = "2.4.1.1"; Обработчик.Процедура = "ДатыЗапретаИзмененияСлужебный.ЗаменитьРазделыДатЗапретаНаНовые"; + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "3.1.8.75"; + Обработчик.Процедура = "ДатыЗапретаИзмененияСлужебный.ДополнитьНастройкиУказанныхАдресатов"; + КонецПроцедуры // См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхГлавному. @@ -223,6 +216,30 @@ ИначеЕсли ИмяПараметра = "ОбновитьВерсиюДатЗапретаИзмененияПослеЗагрузкиДанных" Тогда ПараметрыСеанса.ОбновитьВерсиюДатЗапретаИзмененияПослеЗагрузкиДанных = Ложь; УстановленныеПараметры.Добавить("ОбновитьВерсиюДатЗапретаИзмененияПослеЗагрузкиДанных"); + + ИначеЕсли ИмяПараметра = "ПраваДоступаКДатамЗапрета" Тогда + Права = Новый Массив; + // АПК:515-выкл - №737.4 проверка по ролям, так как право есть всегда. + Если Пользователи.РолиДоступны("ЧтениеДатЗапретаИзменения, ДобавлениеИзменениеДатЗапретаИзменения",, Ложь) Тогда + Права.Добавить("ЧтениеДатЗапретаИзменения"); + КонецЕсли; + Если Пользователи.РолиДоступны("ДобавлениеИзменениеДатЗапретаИзменения",, Ложь) Тогда + Права.Добавить("ИзменениеДатЗапретаИзменения"); + КонецЕсли; + Если Пользователи.РолиДоступны("ЧтениеДатЗапретаЗагрузки, ДобавлениеИзменениеДатЗапретаЗагрузки",, Ложь) Тогда + Права.Добавить("ЧтениеДатЗапретаЗагрузки"); + КонецЕсли; + Если Пользователи.РолиДоступны("ДобавлениеИзменениеДатЗапретаЗагрузки",, Ложь) Тогда + Права.Добавить("ИзменениеДатЗапретаЗагрузки"); + КонецЕсли; + // АПК:515-вкл + Если ЗначениеЗаполнено(Права) Тогда + ПраваДоступаКДатамЗапрета = "," + СтрСоединить(Права, "," + Символы.ПС + ",") + ","; + Иначе + ПраваДоступаКДатамЗапрета = ""; + КонецЕсли; + ПараметрыСеанса.ПраваДоступаКДатамЗапрета = ПраваДоступаКДатамЗапрета; + УстановленныеПараметры.Добавить("ПраваДоступаКДатамЗапрета"); КонецЕсли; КонецПроцедуры @@ -625,7 +642,7 @@ КонецЦикла; // Свертка лишних строк, чтобы сократить число проверок и сообщений. - РазделыИОбъекты = ДанныеДляПроверки.Скопировать(); + РазделыИОбъекты = ДанныеДляПроверки.Скопировать(, "Раздел, Объект"); РазделыИОбъекты.Свернуть("Раздел, Объект"); Отбор = Новый Структура("Раздел, Объект"); РазделыИОбъекты.Колонки.Добавить("Дата", @@ -649,104 +666,86 @@ ДанныеДляПроверки = РазделыИОбъекты; // Приоритеты дат запрета изменения. - // 1. Для раздела, объекта и пользователя. - // 2. Для раздела, объекта и группы пользователей. - // 3. Для раздела, объекта и любого пользователя. - // 4. Для раздела, любого объекта (объект = раздел) и пользователя. - // 5. Для раздела, любого объекта (объект = раздел) и группы пользователей. - // 6. Для раздела, любого объекта (объект = раздел) и любого пользователя. - // 7. Для любого раздела (пустой раздел), любого объекта (объект = раздел) и пользователя. - // 8. Для любого раздела (пустой раздел), любого объекта (объект = раздел) и группы пользователей. - // 9. Для любого раздела (пустой раздел), любого объекта (объект = раздел) и любого пользователя. + // 1. Если есть настройка для пользователя, то используется она, + // а настройки для групп пользователей и для всех пользователей не учитывается. + // 2. Если нет настройки для пользователя, но есть настройка для групп пользователей, + // в которые входит пользователь, тогда будет использована настройка для последней + // группы пользователей по порядку, а настройки для остальных групп пользователей и + // для всех пользователей не учитываются. + // 3. Если нет настройки для пользователя и нет настроек для групп пользователей, в которые + // входит пользователь, тогда будет использоваться настройка для всех пользователей. // Приоритеты дат запрета загрузки. - // 1. Для раздела, объекта и узла. - // 2. Для раздела, объекта и любого узла. - // 3. Для раздела, любого объекта (объект = раздел) и узла. - // 4. Для раздела, любого объекта (объект = раздел) и любого узла. - // 5. Для любого раздела (пустой раздел), любого объекта (объект = раздел) и узла. - // 6. Для любого раздела (пустой раздел), любого объекта (объект = раздел) и любого узла. + // 1. Если есть настройка для узла информационной базы, то используется она, + // а настройки для плана обмена и для всех планов обмена не учитываются. + // 2. Если нет настройки для узла, но есть настройка для плана обмена, тогда будет + // использоваться она, а настройка для всех планов обмена не учитываются. + // 3. Если нет настройки для узла и нет настройки для плана обмена, + // тогда будет использоваться настройка для всех планов обмена. + + // Приоритеты по разделам и объектам применяются в пределах приоритетов, + // описанных выше и одинаковы для дат запрета изменения и загрузки данных. + // 1. Для раздела, объекта. + // 2. Для раздела, любого объекта (объект = раздел). + // 3. Для любого раздела (пустой раздел), любого объекта (объект = раздел). ЗапретыИзменения = ДанныеДляПроверки.Скопировать(Новый Массив); ЗапретыИзменения.Колонки.Добавить("Адресат"); ЗапретыИзменения.Колонки.Добавить("Данные"); - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("УзелПроверкиЗапретаЗагрузки", УзелПроверкиЗапретаЗагрузки); - // Поиск запретов изменения данных. Если УзелПроверкиЗапретаЗагрузки = Неопределено Тогда - Разделы = ДействующиеДаты.ДляПользователей.Разделы; - Пользователь = Пользователи.АвторизованныйПользователь(); - ГруппыПользователя = ДействующиеДаты.ГруппыПользователей.Получить(Пользователь); - Если ГруппыПользователя = Неопределено Тогда - ГруппыПользователя = Новый Массив; + Адресаты = ДействующиеДаты.ДляПользователей.Адресаты; + Адресат = Пользователи.АвторизованныйПользователь(); + Разделы = Адресаты.Получить(Адресат); + Если Разделы = Неопределено Тогда + ГруппыПользователя = ДействующиеДаты.ГруппыПользователей.Получить(Адресат); + Если ГруппыПользователя <> Неопределено Тогда + Для Каждого Группа Из ГруппыПользователя Цикл + АдресатЗапрета = Группа; + Разделы = Адресаты.Получить(АдресатЗапрета); + Прервать; + КонецЦикла; + КонецЕсли; + Если Разделы = Неопределено Тогда + АдресатЗапрета = Перечисления.ВидыНазначенияДатЗапрета.ДляВсехПользователей; + Разделы = Адресаты.Получить(АдресатЗапрета); + КонецЕсли; КонецЕсли; - ДополнительныеПараметры.Вставить("Пользователь", Пользователь); - ДополнительныеПараметры.Вставить("ГруппыПользователя", ГруппыПользователя); Иначе - Разделы = ДействующиеДаты.ДляИнформационныхБаз.Разделы; - ДополнительныеПараметры.Вставить("ПустойУзелПланаОбмена", - ОбщегоНазначения.МенеджерОбъектаПоСсылке(УзелПроверкиЗапретаЗагрузки).ПустаяСсылка()); + Адресаты = ДействующиеДаты.ДляИнформационныхБаз.Адресаты; + Адресат = УзелПроверкиЗапретаЗагрузки; + Разделы = Адресаты.Получить(Адресат); + Если Разделы = Неопределено Тогда + АдресатЗапрета = ОбщегоНазначения.МенеджерОбъектаПоСсылке(УзелПроверкиЗапретаЗагрузки).ПустаяСсылка(); + Разделы = Адресаты.Получить(АдресатЗапрета); + Если Разделы = Неопределено Тогда + АдресатЗапрета = Перечисления.ВидыНазначенияДатЗапрета.ДляВсехИнформационныхБаз; + Разделы = Адресаты.Получить(АдресатЗапрета); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если Разделы = Неопределено Тогда + Возврат Ложь; КонецЕсли; Для Каждого Данные Из ДанныеДляПроверки Цикл - РазделЗапрета = Данные.Раздел; - ОбъектЗапрета = Данные.Объект; - - Объекты = Разделы.Получить(РазделЗапрета); - Адресаты = Неопределено; - ДатаЗапрета = Неопределено; - - Если Объекты <> Неопределено Тогда - Адресаты = Объекты.Получить(ОбъектЗапрета); - Если Адресаты <> Неопределено Тогда - // Поиск для раздела и объекта. - ДатаЗапрета = НайтиДатуЗапрета(Адресаты, РазделЗапрета, ОбъектЗапрета, ДополнительныеПараметры); - КонецЕсли; - Если ДатаЗапрета = Неопределено Тогда - ОбъектЗапрета = РазделЗапрета; - Адресаты = Объекты.Получить(ОбъектЗапрета); - Если Адресаты <> Неопределено Тогда - // Поиск для раздела и любого объекта. - ДатаЗапрета = НайтиДатуЗапрета(Адресаты, РазделЗапрета, ОбъектЗапрета, ДополнительныеПараметры); - КонецЕсли; - КонецЕсли; - КонецЕсли; - Если ДатаЗапрета = Неопределено Тогда - РазделЗапрета = ПустойРаздел; - ОбъектЗапрета = РазделЗапрета; - Объекты = Разделы.Получить(РазделЗапрета); - Если Объекты = Неопределено Тогда - Продолжить; - КонецЕсли; - Адресаты = Объекты.Получить(ОбъектЗапрета); - Если Адресаты = Неопределено Тогда - Продолжить; - КонецЕсли; - // Поиск для любого раздела и любого объекта (общая дата). - ДатаЗапрета = НайтиДатуЗапрета(Адресаты, РазделЗапрета, ОбъектЗапрета, ДополнительныеПараметры); - Если ДатаЗапрета = Неопределено Тогда - Продолжить; - КонецЕсли; - КонецЕсли; - - Если ДатаЗапрета < Данные.Дата Тогда + РезультатПоиска = НайтиДатуЗапрета(Разделы, Данные, ПустойРаздел); + Если РезультатПоиска = Неопределено Тогда Продолжить; КонецЕсли; - Если УзелПроверкиЗапретаЗагрузки = Неопределено Тогда - Адресат = Пользователь; - Иначе - Адресат = УзелПроверкиЗапретаЗагрузки; + Если РезультатПоиска.ДатаЗапрета < Данные.Дата Тогда + Продолжить; КонецЕсли; Строка = ЗапретыИзменения.Добавить(); Строка.Данные = Данные; - Строка.Раздел = РазделЗапрета; - Строка.Объект = ОбъектЗапрета; + Строка.Раздел = РезультатПоиска.РазделЗапрета; + Строка.Объект = РезультатПоиска.ОбъектЗапрета; Строка.Адресат = Адресат; - Строка.Дата = ДатаЗапрета; + Строка.Дата = РезультатПоиска.ДатаЗапрета; КонецЦикла; Если ТипЗнч(ПараметрыСообщенияОЗапрете) = Тип("Структура") @@ -1138,6 +1137,63 @@ КонецПроцедуры +// Дополняет настройки для пользователей, групп, узлов и планов обмена. +Процедура ДополнитьНастройкиУказанныхАдресатов() Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ДатыЗапретаИзменения.Пользователь, + | МАКСИМУМ(ДатыЗапретаИзменения.Комментарий) КАК Комментарий + |ИЗ + | РегистрСведений.ДатыЗапретаИзменения КАК ДатыЗапретаИзменения + | + |СГРУППИРОВАТЬ ПО + | ДатыЗапретаИзменения.Пользователь + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | СоставыГруппПользователей.Пользователь КАК Пользователь, + | СоставыГруппПользователей.ГруппаПользователей КАК ГруппаПользователей + |ИЗ + | РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДатыЗапретаИзменения КАК ДатыЗапретаИзменения + | ПО СоставыГруппПользователей.ГруппаПользователей = ДатыЗапретаИзменения.Пользователь + | И (СоставыГруппПользователей.ГруппаПользователей <> СоставыГруппПользователей.Пользователь) + |; + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ДатыЗапретаИзменения.Пользователь КАК Пользователь, + | ДатыЗапретаИзменения.Раздел КАК Раздел, + | ДатыЗапретаИзменения.Объект КАК Объект, + | ДатыЗапретаИзменения.ДатаЗапрета КАК ДатаЗапрета, + | ДатыЗапретаИзменения.ОписаниеДатыЗапрета КАК ОписаниеДатыЗапрета + |ИЗ + | РегистрСведений.ДатыЗапретаИзменения КАК ДатыЗапретаИзменения"; + + Блокировка = Новый БлокировкаДанных; + Блокировка.Добавить("РегистрСведений.ДатыЗапретаИзменения"); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + РезультатыЗапроса = Запрос.ВыполнитьПакет(); + АдресатыНастроек = РезультатыЗапроса[0].Выгрузить(); + ГруппыПользователей = РезультатыЗапроса[1].Выгрузить(); + Настройки = РезультатыЗапроса[2].Выгрузить(); + НаборЗаписей = РегистрыСведений.ДатыЗапретаИзменения.СоздатьНаборЗаписей(); + ДобавитьНастройки(НаборЗаписей, Настройки, АдресатыНастроек, ГруппыПользователей, Истина); + ДобавитьНастройки(НаборЗаписей, Настройки, АдресатыНастроек, ГруппыПользователей, Ложь); + ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(НаборЗаписей, Ложь); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Вспомогательные процедуры и функции. @@ -1169,7 +1225,7 @@ Если ТипЗнч(ИдентификаторДанных) = Тип("Отбор") Тогда Если ТипЗнч(Данные) = Тип("Строка") Тогда - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Данные); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Данные); Иначе ОбъектМетаданных = Данные.Метаданные(); КонецЕсли; @@ -1209,6 +1265,7 @@ Для Каждого ИсточникДанных Из ИсточникиДанных.Состав Цикл Выборка = РезультатыЗапроса[ИсточникиДанных.Состав.Найти(ИсточникДанных)].Выбрать(); Пока Выборка.Следующий() Цикл + // @skip-check query-in-loop - Цикл для исключения разыменования составного типа (стандарт 654) ДобавитьСтрокуДанныхИзБазыДанных(Выборка, ИсточникДанных, ДанныеДляПроверки, БезОбъекта); КонецЦикла; КонецЦикла; @@ -1275,6 +1332,7 @@ КонецЕсли; Для Каждого Строка Из ЗначенияПолей Цикл Для Каждого ИсточникДанных Из ИсточникиДанных.Состав Цикл + // @skip-check query-in-loop - Цикл для исключения разыменования составного типа (стандарт 654) ДобавитьСтрокуДанных(Строка, Строка, ИсточникДанных, ДанныеДляПроверки, БезОбъекта); КонецЦикла; КонецЦикла; @@ -1283,19 +1341,22 @@ Если Не ЗначениеЗаполнено(ИсточникДанных.ПолеДаты.ТабличнаяЧасть) И Не ЗначениеЗаполнено(ИсточникДанных.ПолеОбъекта.ТабличнаяЧасть) Тогда - + // @skip-check query-in-loop - Цикл для исключения разыменования составного типа (стандарт 654) ДобавитьСтрокуДанных(Данные, Данные, ИсточникДанных, ДанныеДляПроверки, БезОбъекта); ИначеЕсли Не ЗначениеЗаполнено(ИсточникДанных.ПолеДаты.ТабличнаяЧасть) Тогда Если БезОбъекта Тогда + // @skip-check query-in-loop - Цикл для исключения разыменования составного типа (стандарт 654) ДобавитьСтрокуДанных(Данные, Неопределено, ИсточникДанных, ДанныеДляПроверки, БезОбъекта); Иначе + // @skip-check query-in-loop - Цикл для исключения разыменования составного типа (стандарт 654) СтрокаДаты = Новый Структура("Значение", ЗначениеПоля(Данные, ИсточникДанных.ПолеДаты)); Поле = ИсточникДанных.ПолеОбъекта.Имя; ЗначенияОбъекта = Данные[ИсточникДанных.ПолеОбъекта.ТабличнаяЧасть].Выгрузить(, Поле); // ТаблицаЗначений ЗначенияОбъекта.Свернуть(Поле); Для Каждого СтрокаОбъекта Из ЗначенияОбъекта Цикл + // @skip-check query-in-loop - Цикл для исключения разыменования составного типа (стандарт 654) ДобавитьСтрокуДанных(СтрокаДаты, СтрокаОбъекта, ИсточникДанных, ДанныеДляПроверки); КонецЦикла; КонецЕсли; @@ -1303,12 +1364,14 @@ ИначеЕсли Не ЗначениеЗаполнено(ИсточникДанных.ПолеОбъекта.ТабличнаяЧасть) Тогда Если Не БезОбъекта Тогда + // @skip-check query-in-loop - Цикл для исключения разыменования составного типа (стандарт 654) СтрокаОбъекта = Новый Структура("Значение", ЗначениеПоля(Данные, ИсточникДанных.ПолеОбъекта)); КонецЕсли; Поле = ИсточникДанных.ПолеДаты.Имя; ЗначенияДаты = Данные[ИсточникДанных.ПолеДаты.ТабличнаяЧасть].Выгрузить(, Поле); // ТаблицаЗначений ЗначенияДаты.Свернуть(Поле); Для Каждого СтрокаДаты Из ЗначенияДаты Цикл + // @skip-check query-in-loop - Цикл для исключения разыменования составного типа (стандарт 654) ДобавитьСтрокуДанных(СтрокаДаты, СтрокаОбъекта, ИсточникДанных, ДанныеДляПроверки, БезОбъекта); КонецЦикла; @@ -1322,6 +1385,7 @@ Значения = Данные[ИсточникДанных.ПолеДаты.ТабличнаяЧасть].Выгрузить(, Поля); // ТаблицаЗначений Значения.Свернуть(Поля); Для Каждого Строка Из Значения Цикл + // @skip-check query-in-loop - Цикл для исключения разыменования составного типа (стандарт 654) ДобавитьСтрокуДанных(Строка, Строка, ИсточникДанных, ДанныеДляПроверки, БезОбъекта); КонецЦикла; Иначе @@ -1336,11 +1400,14 @@ КонецЕсли; Для Каждого СтрокаДаты Из ЗначенияДаты Цикл + // @skip-check query-in-loop - Цикл для исключения разыменования составного типа (стандарт 654) СтрокаДаты = Новый Структура("Значение", ЗначениеПоля(СтрокаДаты, ИсточникДанных.ПолеДаты)); Если БезОбъекта Тогда + // @skip-check query-in-loop - Цикл для исключения разыменования составного типа (стандарт 654) ДобавитьСтрокуДанных(СтрокаДаты, Неопределено, ИсточникДанных, ДанныеДляПроверки, БезОбъекта); Иначе Для Каждого СтрокаОбъекта Из ЗначенияОбъекта Цикл + // @skip-check query-in-loop - Цикл для исключения разыменования составного типа (стандарт 654) ДобавитьСтрокуДанных(СтрокаДаты, СтрокаОбъекта, ИсточникДанных, ДанныеДляПроверки); КонецЦикла; КонецЕсли; @@ -1455,7 +1522,7 @@ Запрос.Текст = СтрЗаменить(ТекстЗапроса, "ПолеПути", ПолеПути); Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекущаяТаблица", Таблица); Запрос.УстановитьПараметр("ТекущаяСсылка", ТекущаяСсылка); - + // @skip-check query-in-loop - Цикл для исключения разыменования составного типа (стандарт 654) Выборка = Запрос.Выполнить().Выбрать(); Если Не Выборка.Следующий() Тогда Возврат Неопределено; @@ -1473,12 +1540,8 @@ // ФиксированнаяСтруктура: // * Версия - УникальныйИдентификатор // * ГруппыПользователей - ФиксированноеСоответствие -// * ДляИнформационныхБаз - ФиксированнаяСтруктура: -// ** ДатыЗапретаПоОбъектамНеУказаны - Булево -// ** Разделы - ФиксированноеСоответствие -// * ДляПользователей - ФиксированнаяСтруктура: -// ** ДатыЗапретаПоОбъектамНеУказаны - Булево -// ** Разделы - ФиксированноеСоответствие +// * ДляИнформационныхБаз - см. УстановленныеДаты +// * ДляПользователей - см. УстановленныеДаты // * ЗапретЗагрузкиИспользуется - Булево // * ЗапретИзмененияИспользуется - Булево // * ИсточникиДанных - ФиксированноеСоответствие @@ -1487,24 +1550,8 @@ // Функция ЗначениеПараметраСеансаДействующиеДатыЗапретаИзменения() Экспорт - // Приоритеты дат запрета изменения. - // 1. Для раздела, объекта и пользователя. - // 2. Для раздела, объекта и группы пользователей. - // 3. Для раздела, объекта и любого пользователя. - // 4. Для раздела, любого объекта (объект = раздел) и пользователя. - // 5. Для раздела, любого объекта (объект = раздел) и группы пользователей. - // 6. Для раздела, любого объекта (объект = раздел) и любого пользователя. - // 7. Для любого раздела (пустой раздел), любого объекта (объект = раздел) и пользователя. - // 8. Для любого раздела (пустой раздел), любого объекта (объект = раздел) и группы пользователей. - // 9. Для любого раздела (пустой раздел), любого объекта (объект = раздел) и любого пользователя. - - // Приоритеты дат запрета загрузки. - // 1. Для раздела, объекта и узла. - // 2. Для раздела, объекта и любого узла. - // 3. Для раздела, любого объекта (объект = раздел) и узла. - // 4. Для раздела, любого объекта (объект = раздел) и любого узла. - // 5. Для любого раздела (пустой раздел), любого объекта (объект = раздел) и узла. - // 6. Для любого раздела (пустой раздел), любого объекта (объект = раздел) и любого узла. + // Смотри приоритеты дат запрета изменения и загрузки данных + // в функции НайденЗапретИзмененияДанных. НачалоДня = НачалоДня(ТекущаяДатаСеанса()); @@ -1549,17 +1596,17 @@ ДействующиеДаты.Вставить("ЗапретЗагрузкиИспользуется", Ложь); ДействующиеДаты.Вставить("ГруппыПользователей", Новый ФиксированноеСоответствие(Новый Соответствие)); УстановленныеДаты = Новый Структура; - УстановленныеДаты.Вставить("Разделы", Новый ФиксированноеСоответствие(Новый Соответствие)); + УстановленныеДаты.Вставить("Адресаты", Новый ФиксированноеСоответствие(Новый Соответствие)); УстановленныеДаты.Вставить("ДатыЗапретаПоОбъектамНеУказаны", Истина); ДействующиеДаты.Вставить("ДляПользователей", Новый ФиксированнаяСтруктура(УстановленныеДаты)); ДействующиеДаты.Вставить("ДляИнформационныхБаз", Новый ФиксированнаяСтруктура(УстановленныеДаты)); КонецЕсли; - Если ДействующиеДаты.ДляПользователей.Разделы.Количество() = 0 Тогда + Если ДействующиеДаты.ДляПользователей.Адресаты.Количество() = 0 Тогда ДействующиеДаты.ЗапретИзмененияИспользуется = Ложь; КонецЕсли; - Если ДействующиеДаты.ДляИнформационныхБаз.Разделы.Количество() = 0 + Если ДействующиеДаты.ДляИнформационныхБаз.Адресаты.Количество() = 0 Или ТипыАдресатовУзлов.Количество() = 0 Тогда ДействующиеДаты.ЗапретЗагрузкиИспользуется = Ложь; @@ -1574,43 +1621,43 @@ // Для функции НайденЗапретИзмененияДанных. -Функция НайтиДатуЗапрета(Адресаты, РазделЗапрета, ОбъектЗапрета, ДополнительныеПараметры) +Функция НайтиДатуЗапрета(Разделы, Данные, ПустойРаздел) + РазделЗапрета = Данные.Раздел; + ОбъектЗапрета = Данные.Объект; ДатаЗапрета = Неопределено; - Если ДополнительныеПараметры.УзелПроверкиЗапретаЗагрузки = Неопределено Тогда - Адресат = ДополнительныеПараметры.Пользователь; - ДатаЗапрета = Адресаты.Получить(Адресат); + Объекты = Разделы.Получить(РазделЗапрета); + Если Объекты <> Неопределено Тогда + // Поиск для раздела и объекта. + ДатаЗапрета = Объекты.Получить(ОбъектЗапрета); Если ДатаЗапрета = Неопределено Тогда - Для Каждого Группа Из ДополнительныеПараметры.ГруппыПользователя Цикл - Дата = Адресаты.Получить(Группа); - Если ДатаЗапрета = Неопределено Тогда - ДатаЗапрета = Дата; - Адресат = Группа; - ИначеЕсли Дата <> Неопределено И ДатаЗапрета < Дата Тогда - ДатаЗапрета = Дата; - Адресат = Группа; - КонецЕсли; - КонецЦикла; - Если ДатаЗапрета = Неопределено Тогда - Адресат = Перечисления.ВидыНазначенияДатЗапрета.ДляВсехПользователей; - ДатаЗапрета = Адресаты.Получить(Адресат); - КонецЕсли; - КонецЕсли; - Иначе - Адресат = ДополнительныеПараметры.УзелПроверкиЗапретаЗагрузки; - ДатаЗапрета = Адресаты.Получить(Адресат); - Если ДатаЗапрета = Неопределено Тогда - Адресат = ДополнительныеПараметры.ПустойУзелПланаОбмена; - ДатаЗапрета = Адресаты.Получить(Адресат); - КонецЕсли; - Если ДатаЗапрета = Неопределено Тогда - Адресат = Перечисления.ВидыНазначенияДатЗапрета.ДляВсехИнформационныхБаз; - ДатаЗапрета = Адресаты.Получить(Адресат); + ОбъектЗапрета = РазделЗапрета; + // Поиск для раздела и любого объекта. + ДатаЗапрета = Объекты.Получить(ОбъектЗапрета); КонецЕсли; КонецЕсли; - Возврат ДатаЗапрета; + Если ДатаЗапрета = Неопределено Тогда + РазделЗапрета = ПустойРаздел; + ОбъектЗапрета = ПустойРаздел; + Объекты = Разделы.Получить(РазделЗапрета); + Если Объекты <> Неопределено Тогда + // Поиск для любого раздела и любого объекта (общая дата). + ДатаЗапрета = Объекты.Получить(ОбъектЗапрета); + КонецЕсли; + КонецЕсли; + + Если ДатаЗапрета = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + РезультатПоиска = Новый Структура; + РезультатПоиска.Вставить("РазделЗапрета", РазделЗапрета); + РезультатПоиска.Вставить("ОбъектЗапрета", ОбъектЗапрета); + РезультатПоиска.Вставить("ДатаЗапрета", ДатаЗапрета); + + Возврат РезультатПоиска; КонецФункции @@ -1997,7 +2044,7 @@ Если ТипЗнч(Данные) = Тип("Структура") Тогда ЭтоРегистр = Истина; Если ТипЗнч(Данные.Регистр) = Тип("Строка") Тогда - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Данные.Регистр); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Данные.Регистр); Иначе ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(Данные.Регистр)); КонецЕсли; @@ -2052,6 +2099,8 @@ Функция ЗапросДатЗапретаИзменения() + // АПК:1377-выкл - №654.2.1 Использование 2 типов "через точку" допустимо, + // кроме того объем данных небольшой (от единиц до сотен). Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ @@ -2065,21 +2114,28 @@ |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ | СоставыГруппПользователей.Пользователь КАК Пользователь, - | СоставыГруппПользователей.ГруппаПользователей КАК ГруппаПользователей + | СоставыГруппПользователей.ГруппаПользователей КАК ГруппаПользователей, + | ДатыЗапретаИзменения.Комментарий КАК Комментарий, + | ЕСТЬNULL(СоставыГруппПользователей.ГруппаПользователей.Наименование, """") КАК НаименованиеГруппы |ИЗ | РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДатыЗапретаИзменения КАК ДатыЗапретаИзменения | ПО СоставыГруппПользователей.ГруппаПользователей = ДатыЗапретаИзменения.Пользователь | И (СоставыГруппПользователей.ГруппаПользователей <> СоставыГруппПользователей.Пользователь) + | + |УПОРЯДОЧИТЬ ПО + | Пользователь, + | Комментарий УБЫВ, + | НаименованиеГруппы УБЫВ |ИТОГИ ПО | Пользователь |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ + | ДатыЗапретаИзменения.Пользователь КАК Пользователь, | ДатыЗапретаИзменения.Раздел КАК Раздел, | ДатыЗапретаИзменения.Объект КАК Объект, - | ДатыЗапретаИзменения.Пользователь КАК Пользователь, | ДатыЗапретаИзменения.ОписаниеДатыЗапрета КАК ОписаниеДатыЗапрета, | ДатыЗапретаИзменения.ДатаЗапрета КАК ДатаЗапрета |ИЗ @@ -2091,15 +2147,15 @@ | ИЛИ ТИПЗНАЧЕНИЯ(ДатыЗапретаИзменения.Пользователь) = ТИП(Справочник.ВнешниеПользователи) | ИЛИ ТИПЗНАЧЕНИЯ(ДатыЗапретаИзменения.Пользователь) = ТИП(Справочник.ГруппыВнешнихПользователей)) |ИТОГИ ПО - | Раздел, - | Объект + | Пользователь, + | Раздел |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ + | ДатыЗапретаИзменения.Пользователь КАК Пользователь, | ДатыЗапретаИзменения.Раздел КАК Раздел, | ДатыЗапретаИзменения.Объект КАК Объект, - | ДатыЗапретаИзменения.Пользователь КАК Пользователь, | ДатыЗапретаИзменения.ОписаниеДатыЗапрета КАК ОписаниеДатыЗапрета, | ДатыЗапретаИзменения.ДатаЗапрета КАК ДатаЗапрета |ИЗ @@ -2113,38 +2169,50 @@ | И ТИПЗНАЧЕНИЯ(ДатыЗапретаИзменения.Пользователь) <> ТИП(Справочник.ВнешниеПользователи) | И ТИПЗНАЧЕНИЯ(ДатыЗапретаИзменения.Пользователь) <> ТИП(Справочник.ГруппыВнешнихПользователей) |ИТОГИ ПО - | Раздел, - | Объект"; + | Пользователь, + | Раздел"; + // АПК:1377-вкл. Возврат Запрос; КонецФункции +// Возвращаемое значение: +// ФиксированнаяСтруктура: +// * ДатыЗапретаПоОбъектамНеУказаны - Булево +// * Адресаты - ФиксированноеСоответствие из КлючИЗначение: +// ** Ключ - ОпределяемыйТип.АдресатЗапретаИзменения - адресат. +// ** Значение - ФиксированноеСоответствие из КлючИЗначение: +// *** Ключ - Строка - имя раздела. +// *** Значение - ФиксированноеСоответствие из КлючИЗначение: +// **** Ключ - Характеристика.РазделыДатЗапретаИзменения - объект. +// **** Значение - Дата - рассчитанная дата запрета. +// Функция УстановленныеДаты(РезультатЗапроса, НачалоДня) Выгрузка = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); - Разделы = Новый Соответствие; + Адресаты = Новый Соответствие; ДатыЗапретаПоОбъектамНеУказаны = Истина; - Для Каждого Раздел Из Выгрузка.Строки Цикл - Объекты = Новый Соответствие; - Для Каждого Объект Из Раздел.Строки Цикл - Адресаты = Новый Соответствие; - Для Каждого Адресат Из Объект.Строки Цикл - Адресаты.Вставить(Адресат.Пользователь, ДатаЗапретаПоОписанию( - Адресат.ОписаниеДатыЗапрета, Адресат.ДатаЗапрета, НачалоДня)); + Для Каждого Адресат Из Выгрузка.Строки Цикл + Разделы = Новый Соответствие; + Для Каждого Раздел Из Адресат.Строки Цикл + Объекты = Новый Соответствие; + Для Каждого Объект Из Раздел.Строки Цикл + Если Раздел.Раздел <> Объект.Объект Тогда + ДатыЗапретаПоОбъектамНеУказаны = Ложь; + КонецЕсли; + Объекты.Вставить(Объект.Объект, ДатаЗапретаПоОписанию( + Объект.ОписаниеДатыЗапрета, Объект.ДатаЗапрета, НачалоДня)); КонецЦикла; - Объекты.Вставить(Объект.Объект, Новый ФиксированноеСоответствие(Адресаты)); - Если Объект.Объект <> Раздел.Раздел Тогда - ДатыЗапретаПоОбъектамНеУказаны = Ложь; - КонецЕсли; + Разделы.Вставить(Раздел.Раздел, Новый ФиксированноеСоответствие(Объекты)); КонецЦикла; - Разделы.Вставить(Раздел.Раздел, Новый ФиксированноеСоответствие(Объекты)); + Адресаты.Вставить(Адресат.Пользователь, Новый ФиксированноеСоответствие(Разделы)); КонецЦикла; УстановленныеДаты = Новый Структура; - УстановленныеДаты.Вставить("Разделы", Новый ФиксированноеСоответствие(Разделы)); + УстановленныеДаты.Вставить("Адресаты", Новый ФиксированноеСоответствие(Адресаты)); УстановленныеДаты.Вставить("ДатыЗапретаПоОбъектамНеУказаны", ДатыЗапретаПоОбъектамНеУказаны); Возврат Новый ФиксированнаяСтруктура(УстановленныеДаты); @@ -2179,6 +2247,14 @@ КонецФункции +// Параметры: +// СвойстваРазделов - см. СвойстваРазделов +// +// Возвращаемое значение: +// ФиксированноеСоответствие из КлючИЗначение: +// * Ключ - Строка - имя таблицы +// * Значение - см. ПолучитьИсточникиДанных +// Функция ТекущиеИсточникиДанныхДляПроверкиЗапретаИзменения(СвойстваРазделов) Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда @@ -2209,19 +2285,7 @@ Для Каждого Строка Из Таблицы Цикл ИсточникиТаблицы = Новый Структура; - Попытка - Если СтандартныеПодсистемыСервер.ЭтоТаблицаРегистра(Строка.Таблица) Тогда - ТипЭлемента = Тип(СтрЗаменить(Строка.Таблица, ".", "КлючЗаписи.")); - ЭтоРегистр = Истина; - Иначе - ТипЭлемента = Тип(СтрЗаменить(Строка.Таблица, ".", "Ссылка.")); - ЭтоРегистр = Ложь; - КонецЕсли; - ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЭлемента); - Исключение - ЭтоРегистр = Неопределено; - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Строка.Таблица); - КонецПопытки; + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Строка.Таблица); Если ОбъектМетаданных = Неопределено Тогда ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Для проверки запрета изменения в источнике данных неверно указана таблица @@ -2229,9 +2293,7 @@ Строка.Таблица); ВызватьИсключение ТекстОшибки; КонецЕсли; - Если ЭтоРегистр = Неопределено Тогда - ЭтоРегистр = ОбщегоНазначения.ЭтоРегистр(ОбъектМетаданных); - КонецЕсли; + ЭтоРегистр = СтандартныеПодсистемыСервер.ЭтоТаблицаРегистра(Строка.Таблица); ИсточникиТаблицы.Вставить("ЭтоРегистр", ЭтоРегистр); ИсточникиДанныхТаблицы = ИсточникиДанных.НайтиСтроки(Новый Структура("Таблица", Строка.Таблица)); @@ -2239,6 +2301,7 @@ ПоляРегистра = Новый Соответствие; ТекстЗапроса = ""; ТекстЗапросаТолькоДаты = ""; + Таблица = ОбъектМетаданных.ПолноеИмя(); Для Каждого Строка Из ИсточникиДанныхТаблицы Цикл СвойстваРаздела = СвойстваРазделов.Разделы.Получить(Строка.Раздел); @@ -2261,19 +2324,19 @@ Если ЭтоРегистр Тогда ПоляРегистра.Вставить(Источник.ПолеДаты.Имя, Истина); Если ЗначениеЗаполнено(Источник.ПолеОбъекта.Имя) Тогда - ДобавитьТекстЗапросаДляРегистра(ТекстЗапроса, Строка.Таблица, Источник); + ДобавитьТекстЗапросаДляРегистра(ТекстЗапроса, Таблица, Источник); ПоляРегистра.Вставить(Источник.ПолеОбъекта.Имя, Истина); Иначе - ДобавитьТекстЗапросаТолькоДатыДляРегистра(ТекстЗапроса, Строка.Таблица, Источник); + ДобавитьТекстЗапросаТолькоДатыДляРегистра(ТекстЗапроса, Таблица, Источник); КонецЕсли; - ДобавитьТекстЗапросаТолькоДатыДляРегистра(ТекстЗапросаТолькоДаты, Строка.Таблица, Источник); + ДобавитьТекстЗапросаТолькоДатыДляРегистра(ТекстЗапросаТолькоДаты, Таблица, Источник); Иначе Если ЗначениеЗаполнено(Источник.ПолеОбъекта.Имя) Тогда - ДобавитьТекстЗапроса(ТекстЗапроса, Строка.Таблица, Источник); + ДобавитьТекстЗапроса(ТекстЗапроса, Таблица, Источник); Иначе - ДобавитьТекстЗапросаТолькоДаты(ТекстЗапроса, Строка.Таблица, Источник); + ДобавитьТекстЗапросаТолькоДаты(ТекстЗапроса, Таблица, Источник); КонецЕсли; - ДобавитьТекстЗапросаТолькоДаты(ТекстЗапросаТолькоДаты, Строка.Таблица, Источник); + ДобавитьТекстЗапросаТолькоДаты(ТекстЗапросаТолькоДаты, Таблица, Источник); КонецЕсли; СоставИсточников.Добавить(Новый ФиксированнаяСтруктура(Источник)); КонецЦикла; @@ -2287,7 +2350,7 @@ КонецЦикла; ИсточникиТаблицы.Вставить("ПоляРегистра", Сред(Поля, 2)); КонецЕсли; - Источники.Вставить(Строка.Таблица, Новый ФиксированнаяСтруктура(ИсточникиТаблицы)); + Источники.Вставить(Таблица, Новый ФиксированнаяСтруктура(ИсточникиТаблицы)); КонецЦикла; Возврат Новый ФиксированноеСоответствие(Источники); @@ -2603,4 +2666,126 @@ КонецФункции +// Для процедуры ДополнитьНастройкиУказанныхАдресатов. +Процедура ДобавитьНастройки(НаборЗаписей, Настройки, АдресатыНастроек, ГруппыПользователей, НастройкиГрупп) + + Для Каждого АдресатНастроек Из АдресатыНастроек Цикл + Адресат = АдресатНастроек.Пользователь; + ТипАдресата = ТипЗнч(Адресат); + ОбъектМетаданныхАдресата = Метаданные.НайтиПоТипу(ТипАдресата); + ЭтоПланОбмена = ТипЗнч(ОбъектМетаданныхАдресата) = Тип("ОбъектМетаданных") + И Метаданные.ПланыОбмена.Содержит(ОбъектМетаданныхАдресата); + Если ТипАдресата = Тип("ПеречислениеСсылка.ВидыНазначенияДатЗапрета") + Или Не ЗначениеЗаполнено(Адресат) + И Не ЭтоПланОбмена + Или НастройкиГрупп + И Не ( ТипЗнч(Адресат) = Тип("СправочникСсылка.Пользователи") + Или ТипЗнч(Адресат) = Тип("СправочникСсылка.ВнешниеПользователи") + Или ЭтоПланОбмена + И ЗначениеЗаполнено(Адресат)) Тогда + Продолжить; + КонецЕсли; + + Если Не НастройкиГрупп Тогда + Отбор = Новый Структура("Пользователь", ?(ЭтоПланОбмена, + Перечисления.ВидыНазначенияДатЗапрета.ДляВсехИнформационныхБаз, + Перечисления.ВидыНазначенияДатЗапрета.ДляВсехПользователей)); + ДополнительныеНастройки = Настройки.НайтиСтроки(Отбор); + + ИначеЕсли ТипЗнч(Адресат) <> Тип("СправочникСсылка.Пользователи") + И ТипЗнч(Адресат) <> Тип("СправочникСсылка.ВнешниеПользователи") Тогда + + Типы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ТипАдресата); + ОписаниеТипов = Новый ОписаниеТипов(Типы); + ПустойУзел = ОписаниеТипов.ПривестиЗначение(Неопределено); + Отбор = Новый Структура("Пользователь", ПустойУзел); + ДополнительныеНастройки = Настройки.НайтиСтроки(Отбор); + Иначе + Отбор = Новый Структура("Пользователь", Адресат); + Строки = ГруппыПользователей.НайтиСтроки(Отбор); + ДополнительныеНастройки = Настройки.Скопировать(Новый Массив); + Для Каждого Строка Из Строки Цикл + Отбор = Новый Структура("Пользователь", Строка.ГруппаПользователей); + НастройкиГруппы = Настройки.НайтиСтроки(Отбор); + Для Каждого НастройкаГруппы Из НастройкиГруппы Цикл + Отбор = Новый Структура("Раздел, Объект", НастройкаГруппы.Раздел, НастройкаГруппы.Объект); + СуществующиеНастройки = ДополнительныеНастройки.НайтиСтроки(Отбор); + Если СуществующиеНастройки.Количество() > 0 Тогда + СуществующаяНастройка = СуществующиеНастройки[0]; + Если ДатаЗапретаМеньше(НастройкаГруппы, СуществующаяНастройка) Тогда + Продолжить; + Иначе + ДополнительныеНастройки.Удалить(СуществующаяНастройка); + КонецЕсли; + КонецЕсли; + ЗаполнитьЗначенияСвойств(ДополнительныеНастройки.Добавить(), НастройкаГруппы); + КонецЦикла; + КонецЦикла; + КонецЕсли; + + Для Каждого Строка Из ДополнительныеНастройки Цикл + Отбор = Новый Структура("Пользователь, Раздел, Объект", + АдресатНастроек.Пользователь, Строка.Раздел, Строка.Объект); + Если Настройки.НайтиСтроки(Отбор).Количество() > 0 Тогда + Продолжить; + КонецЕсли; + НоваяСтрока = НаборЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); + ЗаполнитьЗначенияСвойств(НоваяСтрока, АдресатНастроек); + ЗаполнитьЗначенияСвойств(Настройки.Добавить(), НоваяСтрока); + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + +// Для процедуры ДобавитьНастройки. +Функция ДатаЗапретаМеньше(ПерваяНастройка, ВтораяНастройка) + + Если ЗначениеЗаполнено(ПерваяНастройка.ОписаниеДатыЗапрета) + И ЗначениеЗаполнено(ВтораяНастройка.ОписаниеДатыЗапрета) Тогда + + Возврат ИнтервалОтносительнойДатыЗапрета(ПерваяНастройка.ОписаниеДатыЗапрета) + > ИнтервалОтносительнойДатыЗапрета(ВтораяНастройка.ОписаниеДатыЗапрета); + КонецЕсли; + + Возврат ДатаЗапретаПоОписанию(ПерваяНастройка.ОписаниеДатыЗапрета, ПерваяНастройка.ДатаЗапрета) + < ДатаЗапретаПоОписанию(ВтораяНастройка.ОписаниеДатыЗапрета, ВтораяНастройка.ДатаЗапрета); + +КонецФункции + +// Для функции ДатаЗапретаМеньше. +Функция ИнтервалОтносительнойДатыЗапрета(ОписаниеДатыЗапрета) + + ВариантДатыЗапрета = СтрПолучитьСтроку(ОписаниеДатыЗапрета, 1); + КоличествоДнейСтрокой = СтрПолучитьСтроку(ОписаниеДатыЗапрета, 2); + + Если ЗначениеЗаполнено(КоличествоДнейСтрокой) Тогда + ОписаниеТипа = Новый ОписаниеТипов("Число"); + КоличествоДнейРазрешения = ОписаниеТипа.ПривестиЗначение(КоличествоДнейСтрокой); + Иначе + КоличествоДнейРазрешения = 0; + КонецЕсли; + + Интервал = 10; + + Если ВариантДатыЗапрета = "КонецПрошлогоГода" Тогда + Интервал = 5; + + ИначеЕсли ВариантДатыЗапрета = "КонецПрошлогоКвартала" Тогда + Интервал = 4; + + ИначеЕсли ВариантДатыЗапрета = "КонецПрошлогоМесяца" Тогда + Интервал = 3; + + ИначеЕсли ВариантДатыЗапрета = "КонецПрошлойНедели" Тогда + Интервал = 2; + + ИначеЕсли ВариантДатыЗапрета = "ПредыдущийДень" Тогда + Интервал = 1; + КонецЕсли; + + Возврат Интервал * 1000 + КоличествоДнейРазрешения; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/ДлительныеОперации/Module.bsl b/SSL/src/CommonModules/ДлительныеОперации/Module.bsl index 5a73b9e03..1a32368ac 100644 --- a/SSL/src/CommonModules/ДлительныеОперации/Module.bsl +++ b/SSL/src/CommonModules/ДлительныеОперации/Module.bsl @@ -8,16 +8,20 @@ #Область ПрограммныйИнтерфейс +// АПК:142-выкл - Необязательных параметров более 3 для поддержки разных прикладных функций. +// АПК:134-выкл - Количество параметров более 7 для поддержки разных прикладных функций. + // Запустить выполнение функции в фоновом задании, если это возможно. // Вызываемая функция может быть с произвольным числом параметров, но не более 7. // Значения передаваемых параметров функции, а также возвращаемое значение должны быть сериализуемыми. // Параметры функции не должны быть возвращаемыми. // // Не следует использовать эту функцию, если необходимо безусловно запускать фоновое задание. -// Может применяться совместно с функцией ДлительныеОперацииКлиент.ОжидатьЗавершение. +// Рекомендуется применять совместно с функцией ДлительныеОперацииКлиент.ОжидатьЗавершение, +// если невозможно, тогда для проверки завершения операции использовать функцию ЗаданиеВыполнено. // // Параметры: -// ПараметрыВыполнения - ФормаКлиентскогоПриложения - форма, из которой из которой выполняется вызов; +// ПараметрыВыполнения - ФормаКлиентскогоПриложения - форма, из которой выполняется вызов; // - УникальныйИдентификатор - идентификатор формы, из которой выполняется вызов; // - Структура - см. ПараметрыВыполненияФункции // ИмяФункции - Строка - имя экспортной функции общего модуля, модуля менеджера объекта @@ -95,13 +99,17 @@ КонецФункции +// АПК:141-выкл - Первый необязательный параметр перед обязательным выбран +// для сохранения порядка параметров как в функции ВыполнитьФункцию. + // Запустить выполнение процедуры в фоновом задании, если это возможно. // Вызываемая процедура может быть с произвольным числом параметров, но не более 7. // Значения передаваемых параметров процедуры, а также возвращаемое значение должны быть сериализуемыми. // Параметры процедуры не должны быть возвращаемыми. // // Не следует использовать эту функцию, если необходимо безусловно запускать фоновое задание. -// Может применяться совместно с функцией ДлительныеОперацииКлиент.ОжидатьЗавершение. +// Рекомендуется применять совместно с функцией ДлительныеОперацииКлиент.ОжидатьЗавершение, +// если невозможно, тогда для проверки завершения операции использовать функцию ЗаданиеВыполнено. // // Параметры: // @@ -178,15 +186,19 @@ КонецФункции -// Управляет процессом выполнения многопоточной операции. -// +// АПК:141-вкл +// АПК:134-вкл +// АПК:142-вкл + // Запустить выполнение функции в многопоточном фоновом задании, если это возможно. // Вызываемая процедура может быть с произвольным числом параметров, но не более 7. // Значения передаваемых параметров процедуры, а также возвращаемое значение должны быть сериализуемыми. // Параметры процедуры не должны быть возвращаемыми. +// Многопоточные длительные операции в неразделенном сеансе не поддерживаются. // // Не следует использовать эту функцию, если необходимо безусловно запускать фоновое задание. -// Может применяться совместно с функцией ДлительныеОперацииКлиент.ОжидатьЗавершение. +// Рекомендуется применять совместно с функцией ДлительныеОперацииКлиент.ОжидатьЗавершение, +// если невозможно, тогда для проверки завершения операции использовать функцию ЗаданиеВыполнено. // // Параметры: // ИмяФункции - Строка - имя экспортной функции общего модуля, модуля менеджера объекта @@ -222,6 +234,10 @@ ВызватьИсключение НСтр("ru ='Передан неверный тип набора параметров'"); КонецЕсли; + Если ОбщегоНазначения.РазделениеВключено() И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + ВызватьИсключение НСтр("ru ='Многопоточные длительные операции в неразделенном сеансе не поддерживаются.'"); + КонецЕсли; + Если ПараметрыВыполнения.ОжидатьЗавершение = ОбщиеПараметрыВыполненияВФоне().ОжидатьЗавершение Тогда ПараметрыВыполнения.ОжидатьЗавершение = 0; КонецЕсли; @@ -233,29 +249,47 @@ АдресРезультатаПотока = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); АдресРезультатов.Вставить(ПараметрФункции.Ключ, АдресРезультатаПотока); КонецЦикла; + ПараметрыМетода = НаборПараметровФункции.Количество(); + Иначе + ПараметрыМетода = НаборПараметровФункции; // Структура + НаборПараметровФункции = Новый Соответствие; КонецЕсли; - ПараметрыМногопоточнойОперации = Новый Структура; - ПараметрыМногопоточнойОперации.Вставить("ИдентификаторПроцесса", Новый УникальныйИдентификатор); - ПараметрыМногопоточнойОперации.Вставить("ИмяМетода", ИмяФункции); - ПараметрыМногопоточнойОперации.Вставить("ДляФункции", Истина); - ПараметрыМногопоточнойОперации.Вставить("ПараметрыВыполнения", ПараметрыВыполнения); - ПараметрыМногопоточнойОперации.Вставить("ПараметрыМетода", НаборПараметровФункции); - ПараметрыМногопоточнойОперации.Вставить("АдресРезультатов", АдресРезультатов); + ИдентификаторПроцесса = Новый УникальныйИдентификатор; + ПараметрыМногопоточнойОперации = ПараметрыМногопоточнойОперации(ИдентификаторПроцесса); + ПараметрыМногопоточнойОперации.ИмяМетода = ИмяФункции; + ПараметрыМногопоточнойОперации.ДляФункции = Истина; + ПараметрыМногопоточнойОперации.ПараметрыВыполнения = ПараметрыВыполнения; + ПараметрыМногопоточнойОперации.ПараметрыМетода = ПараметрыМетода; + ПараметрыМногопоточнойОперации.АдресРезультатов = АдресРезультатов; - Возврат ВыполнитьФункцию(ПараметрыВыполнения, ИмяМетодаМногопоточногоПроцесса(), ПараметрыМногопоточнойОперации); + ПодготовитьМногопоточнуюОперациюКЗапуску(ИмяФункции, + АдресРезультатов, ИдентификаторПроцесса, НаборПараметровФункции); + + РезультатЗапуска = Новый Структура("Статус, ИдентификаторЗадания, АдресРезультата", + СтатусДлительнойОперации().Выполняется); + ЗапланироватьЗапускПотоковДлительныхОпераций(РезультатЗапуска, ПараметрыМногопоточнойОперации); + + РезультатЗапуска = ВыполнитьФункцию(ПараметрыВыполнения, + ИмяМетодаМногопоточногоПроцесса(), ПараметрыМногопоточнойОперации); + + Если РезультатЗапуска.Статус <> СтатусДлительнойОперации().Выполняется Тогда + УдалитьДанныеОПотоках(ИдентификаторПроцесса); + КонецЕсли; + + Возврат РезультатЗапуска; КонецФункции -// Управляет процессом выполнения многопоточной операции. -// // Запускает выполнение процедуры в многопоточном фоновом задании, если это возможно. // Вызываемая процедура может быть с произвольным числом параметров, но не более 7. // Значения передаваемых параметров процедуры, а также возвращаемое значение должны быть сериализуемыми. // Параметры процедуры не должны быть возвращаемыми. +// Многопоточные длительные операции в неразделенном сеансе не поддерживаются. // // Не следует использовать эту функцию, если необходимо безусловно запускать фоновое задание. -// Может применяться совместно с функцией ДлительныеОперацииКлиент.ОжидатьЗавершение. +// Рекомендуется применять совместно с функцией ДлительныеОперацииКлиент.ОжидатьЗавершение, +// если невозможно, тогда для проверки завершения операции использовать функцию ЗаданиеВыполнено. // // Параметры: // ИмяПроцедуры - Строка - имя экспортной процедуры общего модуля, модуля менеджера объекта @@ -289,6 +323,10 @@ ВызватьИсключение НСтр("ru ='Передан неверный тип набора параметров'"); КонецЕсли; + Если ОбщегоНазначения.РазделениеВключено() И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + ВызватьИсключение НСтр("ru ='Многопоточные длительные операции в неразделенном сеансе не поддерживаются.'"); + КонецЕсли; + НовыеПараметрыВыполнения = ПараметрыВыполненияФункции(Неопределено); ЗаполнитьЗначенияСвойств(НовыеПараметрыВыполнения, ПараметрыВыполнения); ПараметрыВыполнения = НовыеПараметрыВыполнения; @@ -304,19 +342,35 @@ АдресРезультатаПотока = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); АдресРезультатов.Вставить(ПараметрФункции.Ключ, АдресРезультатаПотока); КонецЦикла; + ПараметрыМетода = НаборПараметровПроцедуры.Количество(); + Иначе + ПараметрыМетода = НаборПараметровПроцедуры; // Структура + НаборПараметровПроцедуры = Новый Соответствие; КонецЕсли; - ПараметрыМногопоточнойОперации = Новый Структура; - ПараметрыМногопоточнойОперации.Вставить("ИдентификаторПроцесса", Новый УникальныйИдентификатор); - ПараметрыМногопоточнойОперации.Вставить("ИмяМетода", ИмяПроцедуры); - ПараметрыМногопоточнойОперации.Вставить("ДляФункции", Ложь); - ПараметрыМногопоточнойОперации.Вставить("ПараметрыВыполнения", ПараметрыВыполнения); - ПараметрыМногопоточнойОперации.Вставить("ПараметрыМетода", НаборПараметровПроцедуры); - ПараметрыМногопоточнойОперации.Вставить("АдресРезультатов", АдресРезультатов); + ИдентификаторПроцесса = Новый УникальныйИдентификатор; + ПараметрыМногопоточнойОперации = ПараметрыМногопоточнойОперации(ИдентификаторПроцесса); + ПараметрыМногопоточнойОперации.ИмяМетода = ИмяПроцедуры; + ПараметрыМногопоточнойОперации.ДляФункции = Ложь; + ПараметрыМногопоточнойОперации.ПараметрыВыполнения = ПараметрыВыполнения; + ПараметрыМногопоточнойОперации.ПараметрыМетода = ПараметрыМетода; + ПараметрыМногопоточнойОперации.АдресРезультатов = АдресРезультатов; - Результат = ВыполнитьФункцию(ПараметрыВыполнения, ИмяМетодаМногопоточногоПроцесса(), ПараметрыМногопоточнойОперации); + ПодготовитьМногопоточнуюОперациюКЗапуску(ИмяПроцедуры, + АдресРезультатов, ИдентификаторПроцесса, НаборПараметровПроцедуры); - Возврат Результат; + РезультатЗапуска = Новый Структура("Статус, ИдентификаторЗадания, АдресРезультата", + СтатусДлительнойОперации().Выполняется); + ЗапланироватьЗапускПотоковДлительныхОпераций(РезультатЗапуска, ПараметрыМногопоточнойОперации); + + РезультатЗапуска = ВыполнитьФункцию(ПараметрыВыполнения, + ИмяМетодаМногопоточногоПроцесса(), ПараметрыМногопоточнойОперации); + + Если РезультатЗапуска.Статус <> СтатусДлительнойОперации().Выполняется Тогда + УдалитьДанныеОПотоках(ИдентификаторПроцесса); + КонецЕсли; + + Возврат РезультатЗапуска; КонецФункции @@ -419,7 +473,8 @@ // // Запустить выполнение процедуры в фоновом задании, если это возможно. // Не следует использовать эту функцию, если необходимо безусловно запускать фоновое задание. -// Может применяться совместно с функцией ДлительныеОперацииКлиент.ОжидатьЗавершение. +// Рекомендуется применять совместно с функцией ДлительныеОперацииКлиент.ОжидатьЗавершение, +// если невозможно, тогда для проверки завершения операции использовать функцию ЗаданиеВыполнено. // // Параметры: // ИмяПроцедуры - Строка - имя экспортной процедуры общего модуля, модуля менеджера объекта @@ -534,7 +589,8 @@ Результат = Новый Структура; Результат.Вставить("Статус", "Выполняется"); Результат.Вставить("ИдентификаторЗадания", Неопределено); - Если ПараметрыВыполнения.Свойство("АдресРезультата") Тогда + Если ПараметрыВыполнения.Свойство("АдресРезультата") + И Не ПараметрыВыполнения.Свойство("СвойстваИсполняющегоПотокаМногопоточнойДлительнойОперации") Тогда Если ПараметрыВыполнения.АдресРезультата = Неопределено Тогда Если Не ЗначениеЗаполнено(ПараметрыВыполнения.ИдентификаторФормы) И ОбщегоНазначения.РежимОтладки() Тогда Попытка @@ -547,7 +603,7 @@ Исключение // АПК:154-выкл Не ошибка, а предупреждение (рекомендация разработчику). ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительные операции.Диагностика'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Предупреждение, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Предупреждение, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); // АПК:154-вкл КонецПопытки; КонецЕсли; @@ -606,15 +662,15 @@ Если ВыполнитьБезФоновогоЗадания Тогда Попытка Если ПараметрыВыполнения.Свойство("ЭтоФункция") И ПараметрыВыполнения.ЭтоФункция Тогда - ВызватьФункцию(ИмяПроцедуры, ПараметрыЭкспортнойПроцедуры, ПараметрыВыполнения.АдресРезультата); + ВызватьФункцию(ИмяПроцедуры, ПараметрыЭкспортнойПроцедуры, ПараметрыВыполнения); Иначе ВызватьПроцедуру(ИмяПроцедуры, ПараметрыЭкспортнойПроцедуры); КонецЕсли; Результат.Статус = "Выполнено"; Исключение Результат.Статус = "Ошибка"; - Результат.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Результат.КраткоеПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Результат.ПодробноеПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительные операции.Ошибка выполнения'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , Результат.ПодробноеПредставлениеОшибки); КонецПопытки; @@ -631,11 +687,11 @@ Исключение Результат.Статус = "Ошибка"; Если Задание <> Неопределено И Задание.ИнформацияОбОшибке <> Неопределено Тогда - Результат.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Задание.ИнформацияОбОшибке); - Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке); + Результат.КраткоеПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(Задание.ИнформацияОбОшибке); + Результат.ПодробноеПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке); Иначе - Результат.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Результат.КраткоеПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Результат.ПодробноеПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецЕсли; Возврат Результат; КонецПопытки; @@ -643,31 +699,45 @@ Если Задание <> Неопределено И Задание.ИнформацияОбОшибке <> Неопределено Тогда Результат.Статус = "Ошибка"; - Результат.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Задание.ИнформацияОбОшибке); - Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке); + Результат.КраткоеПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(Задание.ИнформацияОбОшибке); + Результат.ПодробноеПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке); Возврат Результат; КонецЕсли; Результат.ИдентификаторЗадания = Задание.УникальныйИдентификатор; + Если ИмяПроцедуры = ИмяМетодаМногопоточногоПроцесса() + И Не ПараметрыВыполнения.Свойство("ЭтоПерезапускУправляющегоПотока") Тогда + ЗапланироватьЗапускПотоковДлительныхОпераций(Результат, ПараметрыЭкспортнойПроцедуры[0]); + КонецЕсли; ЗаданиеВыполнено = Ложь; + Сообщения = Новый Массив; Если ПараметрыВыполнения.ОжидатьЗавершение <> 0 Тогда - Задание = Задание.ОжидатьЗавершенияВыполнения(ПараметрыВыполнения.ОжидатьЗавершение); - Если Задание.Состояние <> СостояниеФоновогоЗадания.Активно Тогда - ЗаданиеВыполнено = Истина; - КонецЕсли; + Пока Истина Цикл + Задание = Задание.ОжидатьЗавершенияВыполнения(ПараметрыВыполнения.ОжидатьЗавершение); + Если Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда + Прервать; + КонецЕсли; + Если ПараметрыВыполнения.ОжидатьЗавершение = Неопределено Тогда + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Сообщения, + Задание.ПолучитьСообщенияПользователю(Истина)); + КонецЕсли; + ТекущийРезультат = ОперацияВыполнена(Результат.ИдентификаторЗадания, Задание); + Если ТекущийРезультат.Статус <> "Выполняется" Тогда + ЗаданиеВыполнено = Истина; + Прервать; + КонецЕсли; + КонецЦикла; КонецЕсли; Если ЗаданиеВыполнено Тогда Если ПараметрыВыполнения.ОжидатьЗавершение <> Неопределено Тогда - Сообщения = ПолучитьИзОповещений(Истина, Задание.УникальныйИдентификатор, "Сообщения"); - Иначе - Сообщения = Задание.ПолучитьСообщенияПользователю(Истина); + Сообщения = ПолучитьИзОповещений(Истина, Результат.ИдентификаторЗадания, "Сообщения"); КонецЕсли; Результат.Сообщения = Сообщения; КонецЕсли; - ЗаполнитьЗначенияСвойств(Результат, ОперацияВыполнена(Задание.УникальныйИдентификатор), , "Сообщения"); + ЗаполнитьЗначенияСвойств(Результат, ОперацияВыполнена(Результат.ИдентификаторЗадания), , "Сообщения"); Возврат Результат; КонецФункции @@ -801,7 +871,8 @@ // то, напротив, открывать одну длинную транзакцию не требуется. // // Параметры: -// ИдентификаторЗадания - см. ДлительныеОперации.ВыполнитьВФоне. +// ИдентификаторЗадания - УникальныйИдентификатор - идентификатор фонового задания, полученный при запуске +// длительной операции. Смотри ДлительныеОперации.ВыполнитьВФоне. // Процедура ОтменитьВыполнениеЗадания(Знач ИдентификаторЗадания) Экспорт @@ -829,30 +900,58 @@ Исключение // Возможно задание как раз в этот момент закончилось и ошибки нет. ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительные операции.Отмена выполнения фонового задания'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Информация, , , КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Информация, , , ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры // Проверяет состояние фонового задания по переданному идентификатору. -// При аварийном завершении задания вызывает исключение, возникшее в нем, -// либо исключение общего вида "Не удалось выполнить данную операцию. Подробности см. в Журнале регистрации". +// При аварийном завершении задания вызывает исключение с текстом ошибки, +// возникшим в нем, и уточнением вида "См. также журнал регистрации". // // Параметры: -// ИдентификаторЗадания - УникальныйИдентификатор - идентификатор фонового задания. +// ИдентификаторЗадания - УникальныйИдентификатор - идентификатор фонового задания. +// РасширенныйРезультат - Булево - если Истина, вернуть структуру. // // Возвращаемое значение: // Булево - состояние выполнения задания. -// -Функция ЗаданиеВыполнено(Знач ИдентификаторЗадания) Экспорт +// Структура: +// * Статус - Строка - "Выполняется", если задание еще не завершилось; +// "Выполнено", если задание было успешно выполнено; +// "Ошибка", если задание завершено с ошибкой; +// "Отменено", если задание отменено пользователем или администратором. +// +// * ТекстОшибки - Строка - текст ошибки для вызова исключения (как при возврате краткого результата), +// если Статус = "Ошибка" или Статус = "Отменено". +// +// * КраткоеПредставлениеОшибки - Строка - краткая информация об исключении, если Статус = "Ошибка". +// * ПодробноеПредставлениеОшибки - Строка - подробная информация об исключении, если Статус = "Ошибка". +// * ИдентификаторЗадания - УникальныйИдентификатор - последний идентификатор задания, +// если были перезапуски (например, при многопоточной длительной операции) +// или тот же идентификатор, что передан в функцию, когда перезапусков не было. +// +// * Задание - Неопределено - задание не найдено. +// - ФоновоеЗадание - когда задание найдено. +// +Функция ЗаданиеВыполнено(Знач ИдентификаторЗадания, РасширенныйРезультат = Ложь) Экспорт Задание = Неопределено; Результат = ОперацияВыполнена(ИдентификаторЗадания, Задание); + Если РасширенныйРезультат Тогда + Свойства = Новый Структура; + Свойства.Вставить("Статус", Результат.Статус); + Свойства.Вставить("ТекстОшибки", ""); + Свойства.Вставить("КраткоеПредставлениеОшибки", Результат.КраткоеПредставлениеОшибки); + Свойства.Вставить("ПодробноеПредставлениеОшибки", Результат.ПодробноеПредставлениеОшибки); + Свойства.Вставить("ИдентификаторЗадания", ПоследнийИдентификатор(ИдентификаторЗадания)); + Свойства.Вставить("Задание", Задание); + КонецЕсли; + Если Результат.Статус = "Выполняется" Тогда - Возврат Ложь; + Возврат ?(РасширенныйРезультат, Свойства, Ложь); ИначеЕсли Результат.Статус = "Выполнено" Тогда - Возврат Истина; + Возврат ?(РасширенныйРезультат, Свойства, Истина); КонецЕсли; Если Результат.Статус = "Отменено" Тогда @@ -883,6 +982,11 @@ Результат.ПодробноеПредставлениеОшибки); КонецЕсли; + Если РасширенныйРезультат Тогда + Свойства.ТекстОшибки = ТекстОшибки; + Возврат Свойства; + КонецЕсли; + ВызватьИсключение ТекстОшибки; КонецФункции @@ -1024,8 +1128,9 @@ Функция ОперацияВыполнена(Знач ИдентификаторЗадания, Задание = Неопределено) Экспорт Результат = НовыйРезультатВыполненияОперации(); + ПоследнийИдентификатор = ПоследнийИдентификатор(ИдентификаторЗадания); - Задание = НайтиЗаданиеПоИдентификатору(ИдентификаторЗадания); + Задание = НайтиЗаданиеПоИдентификатору(ПоследнийИдентификатор); Если Задание = Неопределено Тогда РезультатИзОповещения = ПолучитьИзОповещений(Ложь, ИдентификаторЗадания, "ДлительнаяОперацияЗавершена"); @@ -1033,25 +1138,29 @@ ЗаполнитьЗначенияСвойств(Результат, РезультатИзОповещения); Возврат Результат; КонецЕсли; + Если ВыполненПерезапускУправляющегоПотока(ИдентификаторЗадания, Задание) Тогда + Возврат Результат; + КонецЕсли; Результат.КраткоеПредставлениеОшибки = НСтр("ru = 'Операция не выполнена из-за аварийного завершения фонового задания.'"); Результат.ПодробноеПредставлениеОшибки = Результат.КраткоеПредставлениеОшибки + Символы.ПС - + НСтр("ru = 'Фоновое задание не существует'") + ": " + Строка(ИдентификаторЗадания); + + НСтр("ru = 'Фоновое задание не существует'") + ": " + Строка(ПоследнийИдентификатор); ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительные операции.Фоновое задание не найдено'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , Результат.ПодробноеПредставлениеОшибки); Результат.Статус = "Ошибка"; Возврат Результат; КонецЕсли; - ЗаписатьОстаткиСообщенийПользователю(Задание.УникальныйИдентификатор); + ЗаписатьОстаткиСообщенийПользователю(ИдентификаторЗадания); - Если Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда + Если Задание.Состояние = СостояниеФоновогоЗадания.Активно + Или ВыполненПерезапускУправляющегоПотока(ИдентификаторЗадания, Задание) Тогда Возврат Результат; КонецЕсли; Если Задание.Состояние = СостояниеФоновогоЗадания.Отменено Тогда УстановитьПривилегированныйРежим(Истина); - Если ПараметрыСеанса.ДлительныеОперации.Отмененные.Найти(ИдентификаторЗадания) = Неопределено Тогда + Если ПараметрыСеанса.ДлительныеОперации.Отмененные.Найти(ПоследнийИдентификатор) = Неопределено Тогда Результат.Статус = "Ошибка"; Если Задание.ИнформацияОбОшибке <> Неопределено Тогда Результат.КраткоеПредставлениеОшибки = НСтр("ru = 'Операция отменена администратором.'"); @@ -1069,8 +1178,8 @@ Результат.Статус = "Ошибка"; Если Задание.ИнформацияОбОшибке <> Неопределено Тогда - Результат.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Задание.ИнформацияОбОшибке); - Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке); + Результат.КраткоеПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(Задание.ИнформацияОбОшибке); + Результат.ПодробноеПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке); КонецЕсли; Возврат Результат; КонецЕсли; @@ -1169,6 +1278,8 @@ Если ИмяПараметра = "ДлительныеОперации" Тогда Свойства = Новый Структура; Свойства.Вставить("Отмененные", Новый ФиксированныйМассив(Новый Массив)); + Свойства.Вставить("Перезапущенные", Новый ФиксированноеСоответствие(Новый Соответствие)); + Свойства.Вставить("ИдентификаторОсновногоЗадания"); Свойства.Вставить("ПолученныеОповещения", Новый ФиксированноеСоответствие(Новый Соответствие)); ПараметрыСеанса.ДлительныеОперации = Новый ФиксированнаяСтруктура(Свойства); УстановленныеПараметры.Добавить("ДлительныеОперации"); @@ -1182,7 +1293,11 @@ Оповещение = СерверныеОповещения.НовоеСерверноеОповещение(ИмяОповещения()); Оповещение.ИмяМодуляОтправки = ""; Оповещение.ИмяМодуляПолучения = "ДлительныеОперацииКлиент"; + Оповещения.Вставить(Оповещение.Имя, Оповещение); + Оповещение = СерверныеОповещения.НовоеСерверноеОповещение(ИмяДополнительногоОповещения()); + Оповещение.ИмяМодуляОтправки = "ДлительныеОперации"; + Оповещение.ИмяМодуляПолучения = "ДлительныеОперацииКлиент"; Оповещения.Вставить(Оповещение.Имя, Оповещение); КонецПроцедуры @@ -1191,6 +1306,17 @@ #Область СлужебныеПроцедурыИФункции +// См. СтандартныеПодсистемыСервер.ПриОтправкеСерверногоОповещения +Процедура ПриОтправкеСерверногоОповещения(ИмяОповещения, ВариантыПараметров) Экспорт + + Если ИмяОповещения <> ИмяДополнительногоОповещения() Тогда + Возврат; + КонецЕсли; + + УдалитьНесуществующиеПотоки(); + +КонецПроцедуры + Функция НовыйРезультатВыполненияОперации() Экспорт Результат = Новый Структура; @@ -1204,6 +1330,87 @@ КонецФункции +// Параметры: +// ИдентификаторЗадания - УникальныйИдентификатор +// +// Возвращаемое значение: +// УникальныйИдентификатор +// +Функция ПоследнийИдентификатор(ИдентификаторЗадания) + + УстановитьОтключениеБезопасногоРежима(Истина); + УстановитьПривилегированныйРежим(Истина); + + Последний = ПараметрыСеанса.ДлительныеОперации.Перезапущенные.Получить(ИдентификаторЗадания); + + УстановитьПривилегированныйРежим(Ложь); + УстановитьОтключениеБезопасногоРежима(Ложь); + + Если Последний = Неопределено Тогда + Возврат ИдентификаторЗадания; + КонецЕсли; + + Возврат Последний; + +КонецФункции + +Функция ИдентификаторОсновногоЗадания(ФоновоеЗадание, ИдентификаторПроцесса = Неопределено) + + УстановитьОтключениеБезопасногоРежима(Истина); + УстановитьПривилегированныйРежим(Истина); + + Если ЗначениеЗаполнено(ИдентификаторПроцесса) Тогда + Идентификатор = ПервыйИдентификаторЗаданияУправляющегоПотока(ИдентификаторПроцесса); + Свойства = Новый Структура(ПараметрыСеанса.ДлительныеОперации); + Свойства.ИдентификаторОсновногоЗадания = Идентификатор; + ПараметрыСеанса.ДлительныеОперации = Новый ФиксированнаяСтруктура(Свойства); + Иначе + Идентификатор = ПараметрыСеанса.ДлительныеОперации.ИдентификаторОсновногоЗадания; + Если Не ЗначениеЗаполнено(Идентификатор) Тогда + Идентификатор = ФоновоеЗадание.УникальныйИдентификатор; + КонецЕсли; + КонецЕсли; + + УстановитьПривилегированныйРежим(Ложь); + УстановитьОтключениеБезопасногоРежима(Ложь); + + Возврат Идентификатор; + +КонецФункции + +// Конструктор параметров многопоточной операции. +// +// Параметры: +// ИдентификаторПроцесса - УникальныйИдентификатор +// СохраненныеПараметры - Неопределено, Структура +// +// Возвращаемое значение: +// Структура: +// * ИдентификаторПроцесса - УникальныйИдентификатор +// * ИмяМетода - Строка +// * ДляФункции - Булево +// * ПараметрыВыполнения - см. ПараметрыВыполненияФункции +// * ПараметрыМетода - Число, Структура +// * АдресРезультатов - Строка +// +Функция ПараметрыМногопоточнойОперации(ИдентификаторПроцесса, СохраненныеПараметры = Неопределено) + + ПараметрыМногопоточнойОперации = Новый Структура; + ПараметрыМногопоточнойОперации.Вставить("ИдентификаторПроцесса", ИдентификаторПроцесса); + ПараметрыМногопоточнойОперации.Вставить("ИмяМетода", ""); + ПараметрыМногопоточнойОперации.Вставить("ДляФункции", Ложь); + ПараметрыМногопоточнойОперации.Вставить("ПараметрыВыполнения", ПараметрыВыполненияФункции(Неопределено)); + ПараметрыМногопоточнойОперации.Вставить("ПараметрыМетода", 0); + ПараметрыМногопоточнойОперации.Вставить("АдресРезультатов", ""); + + Если ТипЗнч(СохраненныеПараметры) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(ПараметрыМногопоточнойОперации, СохраненныеПараметры); + КонецЕсли; + + Возврат ПараметрыМногопоточнойОперации; + +КонецФункции + // См. ОбщегоНазначенияПереопределяемый.ПриПериодическомПолученииДанныхКлиентаНаСервере Процедура ПриПериодическомПолученииДанныхКлиентаНаСервере(Параметры, Результаты) Экспорт @@ -1231,6 +1438,7 @@ Результат = Новый Соответствие; Для Каждого ИдентификаторЗадания Из Параметры.ЗаданияДляПроверки Цикл + // @skip-check query-in-loop - ветка с запросом вызывается редко (только при перезапуске управляющего потока) Результат.Вставить(ИдентификаторЗадания, ОперацияВыполнена(ИдентификаторЗадания)); КонецЦикла; @@ -1272,11 +1480,7 @@ ПараметрыПроцедурыФоновогоЗадания = Новый Массив; ПараметрыПроцедурыФоновогоЗадания.Добавить(ВсеПараметры); - Если ИмяПроцедуры = РегистрыСведений.ПараметрыРаботыПрограммы.ИмяПроцедурыФоновогоЗадания() Тогда - ИмяПроцедурыФоновогоЗадания = ИмяПроцедурыФоновогоЗаданияПередЗапускомПрограммы(); - Иначе - ИмяПроцедурыФоновогоЗадания = "ДлительныеОперации.ВыполнитьСКонтекстомКлиента"; - КонецЕсли; + ИмяПроцедурыФоновогоЗадания = ИмяПроцедурыФоновогоЗаданияДлительнойОперации(); Возврат ВыполнитьФоновоеЗадание(ПараметрыВыполнения, ИмяПроцедурыФоновогоЗадания, ПараметрыПроцедурыФоновогоЗадания, @@ -1284,38 +1488,42 @@ КонецФункции +// Возвращает Истина, если текущий сеанс является сеансом фонового задания +// длительной операции или имя метода фонового задания не указано +// ни в одном из регламентных заданий. +// Функция ПропуститьОбработчикПередЗапускомПрограммы() Экспорт Если ТекущийРежимЗапуска() <> Неопределено Тогда Возврат Ложь; КонецЕсли; - ФоновоеЗадание = ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание(); - Если ФоновоеЗадание = Неопределено - Или ФоновоеЗадание.ИмяМетода <> ИмяПроцедурыФоновогоЗаданияПередЗапускомПрограммы() Тогда + ФоновоеЗадание = ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание(); + Если ФоновоеЗадание = Неопределено Тогда Возврат Ложь; КонецЕсли; + ИмяМетода = НРег(ФоновоеЗадание.ИмяМетода); + Если ИмяМетода = НРег(ИмяПроцедурыФоновогоЗаданияДлительнойОперации()) Тогда + Возврат Истина; + КонецЕсли; + + Для Каждого РегламентноеЗадание Из Метаданные.РегламентныеЗадания Цикл + Если ИмяМетода = НРег(РегламентноеЗадание.ИмяМетода) Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + Возврат Истина; КонецФункции -// Возвращает имя процедуры фонового задания, которое является маркером -// для функции ПропуститьОбработчикПередЗапускомПрограммы, чтобы пропустить выполнение -// процедуры СтандартныеПодсистемыСервер.ПередЗапускомПрограммы при обновлении параметров работы программы. -// -Функция ИмяПроцедурыФоновогоЗаданияПередЗапускомПрограммы() +Функция ИмяПроцедурыФоновогоЗаданияДлительнойОперации() - Возврат "ДлительныеОперации.ВыполнитьСКонтекстомКлиентаПередЗапускомПрограммы"; + Возврат "ДлительныеОперации.ВыполнитьСКонтекстомКлиента"; КонецФункции -Процедура ВыполнитьСКонтекстомКлиентаПередЗапускомПрограммы(ВсеПараметры) Экспорт - - ВыполнитьСКонтекстомКлиента(ВсеПараметры); - -КонецПроцедуры - // Возвращаемое значение: // Строка // @@ -1359,8 +1567,9 @@ Если ФоновоеЗадание <> Неопределено И ВсеПараметры.ИмяПроцедуры = ИмяМетодаМногопоточногоПроцесса() Тогда ПараметрыКлиента = Новый Соответствие(ПараметрыКлиента); + ИдентификаторПроцесса = ВсеПараметры.ПараметрыПроцедуры[0].ИдентификаторПроцесса; ПараметрыКлиента.Вставить("ИдентификаторЗаданияМногопоточногоПроцесса", - ФоновоеЗадание.УникальныйИдентификатор); + ИдентификаторОсновногоЗадания(ФоновоеЗадание, ИдентификаторПроцесса)); ПараметрыКлиента = Новый ФиксированноеСоответствие(ПараметрыКлиента); КонецЕсли; КонецЕсли; @@ -1384,8 +1593,9 @@ УстановитьПолноеИмяПрикладнойПроцедуры(ВсеПараметры.ИмяПроцедуры); Результат = НовыйРезультатВыполненияОперации(); Попытка - Если ВсеПараметры.ПараметрыВыполнения.Свойство("ЭтоФункция") И ВсеПараметры.ПараметрыВыполнения.ЭтоФункция Тогда - ВызватьФункцию(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры, ВсеПараметры.ПараметрыВыполнения.АдресРезультата); + ПараметрыВыполнения = ВсеПараметры.ПараметрыВыполнения; + Если ПараметрыВыполнения.Свойство("ЭтоФункция") И ПараметрыВыполнения.ЭтоФункция Тогда + ВызватьФункцию(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры, ПараметрыВыполнения); Иначе ВызватьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры); КонецЕсли; @@ -1393,14 +1603,14 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); Результат.Статус = "Ошибка"; - Результат.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); - УстановитьПолноеИмяПрикладнойПроцедуры("ДлительныеОперации.ВыполнитьСКонтекстомКлиента"); + Результат.КраткоеПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + Результат.ПодробноеПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + УстановитьПолноеИмяПрикладнойПроцедуры(ИмяПроцедурыФоновогоЗаданияДлительнойОперации()); ОтправитьОповещениеКлиенту("ДлительнаяОперацияЗавершена", Результат); ВызватьИсключение; КонецПопытки; - УстановитьПолноеИмяПрикладнойПроцедуры("ДлительныеОперации.ВыполнитьСКонтекстомКлиента"); + УстановитьПолноеИмяПрикладнойПроцедуры(ИмяПроцедурыФоновогоЗаданияДлительнойОперации()); ОтправитьОповещениеКлиенту("ДлительнаяОперацияЗавершена", Результат); КонецПроцедуры @@ -1438,13 +1648,13 @@ КонецПроцедуры -Процедура ВызватьФункцию(ИмяФункции, ПараметрыПроцедуры, АдресРезультата) +Процедура ВызватьФункцию(ИмяФункции, ПараметрыПроцедуры, ПараметрыВыполнения) ЧастиИмени = СтрРазделить(ИмяФункции, "."); ЭтоПроцедураМодуляОбработки = (ЧастиИмени.Количество() = 4) И ВРег(ЧастиИмени[2]) = "МОДУЛЬОБЪЕКТА"; Если Не ЭтоПроцедураМодуляОбработки Тогда Результат = ОбщегоНазначения.ВызватьФункциюКонфигурации(ИмяФункции, ПараметрыПроцедуры); - ПоместитьВоВременноеХранилище(Результат, АдресРезультата); + УстановитьРезультатВызоваФункции(Результат, ПараметрыВыполнения); Возврат; КонецЕсли; @@ -1454,7 +1664,7 @@ МенеджерОбъекта = ?(ЭтоОтчет, Отчеты, Обработки); ОбработкаОтчетОбъект = МенеджерОбъекта[ЧастиИмени[1]].Создать(); Результат = ОбщегоНазначения.ВызватьФункциюОбъекта(ОбработкаОтчетОбъект, ЧастиИмени[3], ПараметрыПроцедуры); - ПоместитьВоВременноеХранилище(Результат, АдресРезультата); + УстановитьРезультатВызоваФункции(Результат, ПараметрыВыполнения); Возврат; КонецЕсли; @@ -1465,7 +1675,7 @@ МенеджерОбъекта = ?(ЭтоВнешнийОтчет, ВнешниеОтчеты, ВнешниеОбработки); ОбработкаОтчетОбъект = МенеджерОбъекта.Создать(ЧастиИмени[1], БезопасныйРежим()); Результат = ОбщегоНазначения.ВызватьФункциюОбъекта(ОбработкаОтчетОбъект, ЧастиИмени[3], ПараметрыПроцедуры); - ПоместитьВоВременноеХранилище(Результат, АдресРезультата); + УстановитьРезультатВызоваФункции(Результат, ПараметрыВыполнения); Возврат; КонецЕсли; @@ -1474,6 +1684,29 @@ КонецПроцедуры +Процедура УстановитьРезультатВызоваФункции(Результат, ПараметрыВыполнения) + + Если Не ПараметрыВыполнения.Свойство("СвойстваИсполняющегоПотокаМногопоточнойДлительнойОперации") Тогда + ПоместитьВоВременноеХранилище(Результат, ПараметрыВыполнения.АдресРезультата); + Возврат; + КонецЕсли; + + УстановитьОтключениеБезопасногоРежима(Истина); + УстановитьПривилегированныйРежим(Истина); + + УстановитьРезультатПотока(ПараметрыВыполнения.СвойстваИсполняющегоПотокаМногопоточнойДлительнойОперации, Результат); + + УстановитьПривилегированныйРежим(Ложь); + УстановитьОтключениеБезопасногоРежима(Ложь); + +КонецПроцедуры + +// Параметры: +// ИдентификаторЗадания - УникальныйИдентификатор, Строка +// +// Возвращаемое значение: +// ФоновоеЗадание, Неопределено +// Функция НайтиЗаданиеПоИдентификатору(Знач ИдентификаторЗадания) Если ТипЗнч(ИдентификаторЗадания) = Тип("Строка") Тогда @@ -1577,9 +1810,11 @@ КонецФункции Функция ИмяОповещения() - Возврат "СтандартныеПодсистемы.БазоваяФункциональность.ДлительныеОперации"; - +КонецФункции + +Функция ИмяДополнительногоОповещения() + Возврат "СтандартныеПодсистемы.БазоваяФункциональность.ДлительныеОперации.УдалениеНесуществующихПотоков"; КонецФункции // Параметры: @@ -1605,7 +1840,8 @@ КонецФункции -Процедура ОтправитьОповещениеКлиенту(ВидОповещения, ПередаваемоеЗначение, ФоновоеЗадание = Неопределено) Экспорт +Процедура ОтправитьОповещениеКлиенту(ВидОповещения, ПередаваемоеЗначение, + ФоновоеЗадание = Неопределено, ИдентификаторОсновногоЗадания = Неопределено) Экспорт УстановитьОтключениеБезопасногоРежима(Истина); УстановитьПривилегированныйРежим(Истина); @@ -1613,7 +1849,6 @@ ЗаписатьСообщенияПользователю = ФоновоеЗадание <> Неопределено И ВидОповещения = "СообщениеПользователю"; Если ЗаписатьСообщенияПользователю Тогда КлючСеансаРодителя = СерверныеОповещения.КлючСеанса(); - ИдентификаторОсновногоЗадания = ФоновоеЗадание.УникальныйИдентификатор; Иначе КлючСеансаРодителя = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере(Ложь).Получить( "КлючСеансаРодителя"); @@ -1628,12 +1863,15 @@ СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере(Ложь).Получить( "ИдентификаторЗаданияМногопоточногоПроцесса"); ИдентификаторОсновногоЗадания = ?(ЗначениеЗаполнено(ИдентификаторЗаданияМногопоточногоПроцесса), - ИдентификаторЗаданияМногопоточногоПроцесса, ФоновоеЗадание.УникальныйИдентификатор); + ИдентификаторЗаданияМногопоточногоПроцесса, ИдентификаторОсновногоЗадания(ФоновоеЗадание)); КонецЕсли; Если ВидОповещения = "ДлительнаяОперацияЗавершена" Тогда Если ЗначениеЗаполнено(ИдентификаторЗаданияМногопоточногоПроцесса) Тогда - Возврат; + Если ИдентификаторЗаданияМногопоточногоПроцесса <> ИдентификаторОсновногоЗадания(ФоновоеЗадание) + Или ПередаваемоеЗначение.Статус = "Ошибка" Тогда + Возврат; + КонецЕсли; КонецЕсли; Результат = ПередаваемоеЗначение; Иначе @@ -1645,6 +1883,7 @@ ИначеЕсли ВидОповещения = "Прогресс" Тогда Сообщения = ФоновоеЗадание.ПолучитьСообщенияПользователю(Истина); Для Каждого Сообщение Из Сообщения Цикл + // @skip-check query-in-loop - ветка с запросом вызывается только при первом вызове в сеансе ОтправитьОповещениеКлиенту("СообщениеПользователю", Сообщение); КонецЦикла; Результат.Сообщения = Новый ФиксированныйМассив(Новый Массив); @@ -1652,6 +1891,7 @@ ИначеЕсли ВидОповещения = "ДлительнаяОперацияЗавершена" Тогда Сообщения = ФоновоеЗадание.ПолучитьСообщенияПользователю(Истина); Для Каждого Сообщение Из Сообщения Цикл + // @skip-check query-in-loop - ветка с запросом вызывается только при первом вызове в сеансе ОтправитьОповещениеКлиенту("СообщениеПользователю", Сообщение); КонецЦикла; КонецЕсли; @@ -1679,7 +1919,7 @@ Попытка ВызватьИсключение НСтр("ru = 'Стек вызовов:'"); Исключение - СтекВызовов = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СтекВызовов = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; ДополнительныеПараметрыОтправки.КомментарийЖурналаПриОтсрочкеДоставки = НСтр("ru = 'Отправка прогресса чаще одного раза в 3 сек.'") @@ -1722,11 +1962,13 @@ // Процедура ЗаписатьОстаткиСообщенийПользователю(ИдентификаторЗадания) - ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания); + ПоследнийИдентификатор = ПоследнийИдентификатор(ИдентификаторЗадания); + ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ПоследнийИдентификатор); Если ФоновоеЗадание <> Неопределено Тогда Сообщения = ФоновоеЗадание.ПолучитьСообщенияПользователю(Истина); Для Каждого Сообщение Из Сообщения Цикл - ОтправитьОповещениеКлиенту("СообщениеПользователю", Сообщение, ФоновоеЗадание); + // @skip-check query-in-loop - ветка с запросом вызывается только при первом вызове в сеансе + ОтправитьОповещениеКлиенту("СообщениеПользователю", Сообщение, ФоновоеЗадание, ИдентификаторЗадания); КонецЦикла; КонецЕсли; @@ -1865,204 +2107,147 @@ УдалитьНесуществующиеПотоки(); ИдентификаторПроцесса = ПараметрыОперации.ИдентификаторПроцесса; - ПотокиПроцесса = НовоеОписаниеПотоков(); ПрерватьВыполнениеЕслиОшибка = ПараметрыОперации.ПараметрыВыполнения.ПрерватьВыполнениеЕслиОшибка; - РезультатДлительнойОперации = НовыйРезультатДлительнойОперации(); - ИмяМетодаПолученияПорций = Неопределено; - КонтекстПолученияИОбработкиПорций = Новый Структура; + ДинамическоеПолучениеПорций = ТипЗнч(ПараметрыОперации.ПараметрыМетода) = Тип("Структура"); + Процент = 0; - Порции = Новый Массив; - Результаты = Новый Соответствие(); - - Если ТипЗнч(ПараметрыОперации.ПараметрыМетода) = Тип("Соответствие") Тогда - Для Каждого КлючЗначение Из ПараметрыОперации.ПараметрыМетода Цикл - Порции.Добавить(КлючЗначение); - Результаты.Вставить(КлючЗначение.Ключ, Новый Структура(Новый ФиксированнаяСтруктура(РезультатДлительнойОперации))); - Результаты[КлючЗначение.Ключ].АдресРезультата = ПараметрыОперации.АдресРезультатов[КлючЗначение.Ключ]; - КонецЦикла; + Если ДинамическоеПолучениеПорций Тогда + ИмяМетодаПолученияПорций = ПараметрыОперации.ПараметрыМетода.ИмяМетодаПолученияПорций; + КонтекстПолученияИОбработкиПорций = ПараметрыОперации.ПараметрыМетода.Контекст; + Если Не КонтекстПолученияИОбработкиПорций.Свойство("Процент") Тогда + КонтекстПолученияИОбработкиПорций.Вставить("Процент", 0); + КонецЕсли; + КонтекстПолученияИОбработкиПорций.Вставить("Кэш", Неопределено); Иначе - ПараметрыОперации.ПараметрыМетода.Свойство("ИмяМетодаПолученияПорций", ИмяМетодаПолученияПорций); - ПараметрыОперации.ПараметрыМетода.Свойство("Контекст", КонтекстПолученияИОбработкиПорций); - КонтекстПолученияИОбработкиПорций.Вставить("Процент", 0); + КоличествоПорций = ПараметрыОперации.ПараметрыМетода; + КоличествоОбработанныхПорций = Неопределено; КонецЕсли; - КоличествоОбработанныхПорций = 0; - ИндексТекущейПорции = -1; - ЗавершитьДосрочно = Ложь; - Попытка + Пока Истина Цикл - Пока Истина Цикл - ИндексТекущейПорции = ИндексТекущейПорции + 1; + Если ДинамическоеПолучениеПорций Тогда + НовыеПорции = Новый Соответствие; + ПараметрыПолученияПорций = Новый Массив; + ПараметрыПолученияПорций.Добавить(НовыеПорции); + ПараметрыПолученияПорций.Добавить(КонтекстПолученияИОбработкиПорций); + ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяМетодаПолученияПорций, ПараметрыПолученияПорций); + АдресаНовыхРезультатов = Новый Соответствие; + Для Каждого КлючИЗначение Из НовыеПорции Цикл + АдресаНовыхРезультатов.Вставить(КлючИЗначение.Ключ, + ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор)); + КонецЦикла; + ПодготовитьМногопоточнуюОперациюКЗапуску(ПараметрыОперации.ИмяМетода, + АдресаНовыхРезультатов, ИдентификаторПроцесса, НовыеПорции, ПараметрыОперации); + КонецЕсли; + + // @skip-check query-in-loop - Получение актуальных данных о потоках с учетом работы других процессов. + Потоки = ПотокиОжидающиеОбработки(ИдентификаторПроцесса); + Если Потоки.Количество() = 0 Тогда + Прервать; + КонецЕсли; + + Если Не ДинамическоеПолучениеПорций + И КоличествоОбработанныхПорций = Неопределено Тогда + КоличествоОбработанныхПорций = КоличествоПорций - Потоки.Количество(); + КонецЕсли; + + Для Каждого Поток Из Потоки Цикл - Если ИндексТекущейПорции >= Порции.Количество() - И ИмяМетодаПолученияПорций <> Неопределено Тогда - - НовыеПорции = Новый Соответствие; - ПараметрыПолученияПорций = Новый Массив; - ПараметрыПолученияПорций.Добавить(НовыеПорции); - ПараметрыПолученияПорций.Добавить(КонтекстПолученияИОбработкиПорций); - ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяМетодаПолученияПорций, ПараметрыПолученияПорций); - Для Каждого КлючИЗначение Из НовыеПорции Цикл - Порции.Добавить(КлючИЗначение); - Результаты.Вставить(КлючИЗначение.Ключ, - Новый Структура(Новый ФиксированнаяСтруктура(РезультатДлительнойОперации))); - КонецЦикла; - КонецЕсли; - - Если ИндексТекущейПорции >= Порции.Количество() Тогда - Прервать; - КонецЕсли; - КлючЗначение = Порции.Получить(ИндексТекущейПорции); - - ПорцияОбработана = Ложь; - Пока Не ПорцияОбработана Цикл - - ВыполнитьВФоне = ОжидатьСвободныйПоток(ИдентификаторПроцесса, ПотокиПроцесса, - Результаты, ПрерватьВыполнениеЕслиОшибка); - Если ВыполнитьВФоне = Неопределено Тогда + Если Поток.Статус <> СтатусДлительнойОперации().Создано Тогда + Если ПрерватьВыполнениеЕслиОшибка Тогда ЗавершитьДосрочно = Истина; Прервать; - КонецЕсли; - - Поток = ДобавитьПоток(ПотокиПроцесса, ИдентификаторПроцесса, КлючЗначение.Ключ, КлючЗначение.Значение, ВыполнитьВФоне); - - Если ТипЗнч(Поток) = Тип("СтрокаТаблицыЗначений") Тогда - Результат = ВыполнитьПоток(ПараметрыОперации, ПотокиПроцесса, Поток, Результаты[КлючЗначение.Ключ], ВыполнитьВФоне); - - ЗаполнитьЗначенияСвойств(Результаты[КлючЗначение.Ключ], Результат); - Если Результат.Статус <> "Выполняется" Тогда - ОтправитьСообщенияПотока(Результат.ИдентификаторЗадания); - КонецЕсли; - - Если Результат.Статус = "Ошибка" И ПрерватьВыполнениеЕслиОшибка Тогда - ЗавершитьДосрочно = Истина; - Прервать; - КонецЕсли; - ПорцияОбработана = Истина; - КонецЕсли; - - КонецЦикла; + КонецЕсли; + // @skip-check query-in-loop - ветка с запросом вызывается только при первом вызове в сеансе + ОтправитьСообщенияПотока(Поток.ИдентификаторЗадания); + КонецЕсли; - Если ЗавершитьДосрочно Тогда - РезультатДлительнойОперации.Статус = "Ошибка"; - ОтменитьВыполнениеВсехПотоков(ПотокиПроцесса, Результаты); + // @skip-check query-in-loop - зачитывание актуальных данных о потоках из ИБ. + ВыполнитьВФоне = ОжидатьСвободныйПоток(ИдентификаторПроцесса, ПрерватьВыполнениеЕслиОшибка); + Если ВыполнитьВФоне = Неопределено Тогда + ЗавершитьДосрочно = Истина; Прервать; КонецЕсли; - Если ИмяМетодаПолученияПорций = Неопределено Тогда - КоличествоОбработанныхПорций = КоличествоОбработанныхПорций + 1; - Процент = Окр(КоличествоОбработанныхПорций * 100 / Порции.Количество()); - Иначе + Результат = ВыполнитьПоток(Поток, ПараметрыОперации, ВыполнитьВФоне); + Если Результат.Статус = СтатусДлительнойОперации().Ошибка Тогда + Если ПрерватьВыполнениеЕслиОшибка Тогда + ЗавершитьДосрочно = Истина; + Прервать; + КонецЕсли; + КонецЕсли; + + Если ДинамическоеПолучениеПорций Тогда Процент = КонтекстПолученияИОбработкиПорций.Процент; + Иначе + КоличествоОбработанныхПорций = КоличествоОбработанныхПорций + 1; + Процент = Окр(КоличествоОбработанныхПорций * 100 / КоличествоПорций); КонецЕсли; Процент = ?(Процент < 100, Процент, 99); Если Процент > 0 Тогда - СообщитьПрогресс(Процент, Строка(КлючЗначение.Ключ), "ПрогрессМногопоточногоПроцесса"); + КлючПотока = Поток.КлючПотока.Получить(); + СообщитьПрогресс(Процент, Строка(КлючПотока), "ПрогрессМногопоточногоПроцесса"); КонецЕсли; + КонецЦикла; - ОжидатьЗавершениеВсехПотоков(ПотокиПроцесса, Результаты, ИдентификаторПроцесса, ПрерватьВыполнениеЕслиОшибка); - - Исключение - - ИнформацияОбОшибке = ИнформацияОбОшибке(); - РезультатДлительнойОперации.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); - РезультатДлительнойОперации.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - РезультатДлительнойОперации.Статус = "Ошибка"; - - ЗаписатьОшибку(РезультатДлительнойОперации.ПодробноеПредставлениеОшибки); - - ОтменитьВыполнениеВсехПотоков(ПотокиПроцесса, Результаты); - - КонецПопытки; - - Для каждого Результат Из Результаты Цикл - - Если Результат.Значение = Неопределено Тогда - Продолжить; - ИначеЕсли Результат.Значение.Статус = "Ошибка" Тогда - РезультатДлительнойОперации.Статус = "Ошибка"; + Если ЗавершитьДосрочно Тогда + Прервать; КонецЕсли; + // @skip-check query-in-loop - На каждой итерации необходимо зачитывать актуальные данные из ИБ. + ОжидатьЗавершениеВсехПотоков(ИдентификаторПроцесса, ПрерватьВыполнениеЕслиОшибка, ЗавершитьДосрочно); + + Если ЗавершитьДосрочно Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Если ЗавершитьДосрочно Тогда + ОтменитьВыполнениеВсехПотоков(ИдентификаторПроцесса); + КонецЕсли; + + Если Процент > 0 Тогда + СообщитьПрогресс(100, "", "ПрогрессМногопоточногоПроцесса"); + КонецЕсли; + // запрос к РС и получение всех результатов + + ПотокиПроцесса = ПотокиДлительныхОпераций(ИдентификаторПроцесса); + РезультатДлительнойОперации = НовыйРезультатДлительнойОперации(); + Результаты = Новый Соответствие(); + + Для Каждого Поток Из ПотокиПроцесса Цикл + + Ключ = Поток.КлючПотока.Получить(); + Результаты.Вставить(Ключ, Новый Структура(Новый ФиксированнаяСтруктура(РезультатДлительнойОперации))); + Результаты[Ключ].АдресРезультата = ПоместитьВоВременноеХранилище(Поток.Результат.Получить(), Поток.АдресРезультата); + + ЗаполнитьЗначенияСвойств(Результаты[Ключ], Поток, + "Статус, ПодробноеПредставлениеОшибки, КраткоеПредставлениеОшибки, ИдентификаторЗадания"); + + // @skip-check query-in-loop - ветка с запросом вызывается только при первом вызове в сеансе + ОтправитьСообщенияПотока(Поток.ИдентификаторЗадания); КонецЦикла; Возврат Результаты; КонецФункции -Функция ДобавитьПоток(Потоки, ИдентификаторПроцесса, КлючПотока, ПараметрыПотока, ВыполнитьВФоне) - - Поток = Неопределено; - - Если Не ВыполнитьВФоне Тогда - Поток = Потоки.Добавить(); - Поток.ИдентификаторПотока = Новый УникальныйИдентификатор; - Поток.ИдентификаторПроцесса = ИдентификаторПроцесса; - Поток.ПараметрыМетода = ПараметрыПотока; - Поток.КлючПотока = КлючПотока; - Возврат Поток; - КонецЕсли; - - НачатьТранзакцию(); - Попытка - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДлительныеОперации"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - Блокировка.Заблокировать(); - - Если КоличествоРаботающихПотоков() <= ДопустимоеКоличествоПотоков() Тогда - - Поток = Потоки.Добавить(); - Поток.ИдентификаторПотока = Новый УникальныйИдентификатор; - Поток.ИдентификаторПроцесса = ИдентификаторПроцесса; - Поток.ПараметрыМетода = ПараметрыПотока; - Поток.КлючПотока = КлючПотока; - - УстановитьПривилегированныйРежим(Истина); - - НаборЗаписей = РегистрыСведений.ДлительныеОперации.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.ИдентификаторПотока.Установить(Поток.ИдентификаторПотока); - НаборЗаписей.Прочитать(); - Запись = НаборЗаписей.Добавить(); - - ЗаполнитьЗначенияСвойств(Запись, Поток, , "ПараметрыМетода,КлючПотока"); - - Запись.ПараметрыМетода = Новый ХранилищеЗначения(Поток.ПараметрыМетода); - Запись.КлючПотока = Новый ХранилищеЗначения(Поток.КлючПотока); - - НаборЗаписей.Записать(); - - УстановитьПривилегированныйРежим(Ложь); - - КонецЕсли; - - ЗафиксироватьТранзакцию(); - - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - Возврат Поток; - -КонецФункции - // Выполнить указанный поток // // Параметры: -// ПараметрыОперации - Структура -// Поток - СтрокаТаблицыЗначений: см. НовоеОписаниеПотоков -// Результат - см. НовыйРезультатДлительнойОперации +// Поток - РегистрСведенийНаборЗаписей.ДлительныеОперации +// ПараметрыОперации - см. ПараметрыМногопоточнойОперации // ВыполнитьВФоне - Булево // // Возвращаемое значение: // см. ВыполнитьВФоне // -Функция ВыполнитьПоток(ПараметрыОперации, ПотокиПроцесса, Поток, Результат, ВыполнитьВФоне) +Функция ВыполнитьПоток(Поток, ПараметрыОперации, ВыполнитьВФоне) ПараметрыВыполнения = ПараметрыВыполненияВФоне(); ПараметрыВыполнения.НаименованиеФоновогоЗадания = Поток.Наименование; @@ -2070,87 +2255,257 @@ ПараметрыВыполнения.ЗапуститьНеВФоне = ПараметрыОперации.ПараметрыВыполнения.ЗапуститьНеВФоне Или МонопольныйРежим() Или Не ВыполнитьВФоне; - ПараметрыВыполнения.АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Результат.АдресРезультата); - Поток.АдресРезультата = ПараметрыВыполнения.АдресРезультата; + СвойстваПотока = Новый Структура; + СвойстваПотока.Вставить("ИдентификаторПроцесса", Поток.ИдентификаторПроцесса); + СвойстваПотока.Вставить("ИдентификаторПотока", Поток.ИдентификаторПотока); + ПараметрыВыполнения.Вставить("СвойстваИсполняющегоПотокаМногопоточнойДлительнойОперации", СвойстваПотока); + + Если ТипЗнч(Поток.ПараметрыПотока) = Тип("ХранилищеЗначения") Тогда + ПараметрыМетода = Поток.ПараметрыПотока.Получить(); + Иначе + ПараметрыМетода = Новый Массив; + КонецЕсли; ПараметрыВыполнения = ПодготовитьПараметрыВыполнения(ПараметрыВыполнения, ПараметрыОперации.ДляФункции); УстановитьПолноеИмяПрикладнойПроцедуры(ПараметрыОперации.ИмяМетода); - РезультатЗапуска = ВыполнитьВФоне(ПараметрыОперации.ИмяМетода, Поток.ПараметрыМетода, ПараметрыВыполнения); + РезультатЗапуска = ВыполнитьВФоне(ПараметрыОперации.ИмяМетода, ПараметрыМетода, ПараметрыВыполнения); УстановитьПолноеИмяПрикладнойПроцедуры(ИмяМетодаМногопоточногоПроцесса()); - - Если РезультатЗапуска.Статус = "Выполняется" Тогда - Поток.ИдентификаторЗадания = РезультатЗапуска.ИдентификаторЗадания; - Иначе - УдалитьПоток(Поток.ИдентификаторПотока); - ПотокиПроцесса.Удалить(Поток); - Возврат РезультатЗапуска; - КонецЕсли; - - СохранитьПоток(Поток); + ОбновитьСведенияОбПотоке(Поток, РезультатЗапуска); Возврат РезультатЗапуска; КонецФункции +Функция СтатусИзСостояния(Состояние) + + Если Состояние = СостояниеФоновогоЗадания.Завершено Тогда + Возврат СтатусДлительнойОперации().Выполнено; + ИначеЕсли Состояние = СостояниеФоновогоЗадания.Отменено Тогда + Возврат СтатусДлительнойОперации().Отменено; + ИначеЕсли Состояние = СостояниеФоновогоЗадания.Активно Тогда + Возврат СтатусДлительнойОперации().Выполняется; + КонецЕсли; + + Возврат СтатусДлительнойОперации().Ошибка; + +КонецФункции + +Процедура ОбновитьСведенияОбПотоке(Поток, РезультатЗапуска = Неопределено) + + РезультатЗапускаУказан = РезультатЗапуска <> Неопределено; + + Если РезультатЗапуска = Неопределено Тогда + РезультатЗапуска = НовыйРезультатДлительнойОперации(); + + Если ЗначениеЗаполнено(Поток.ИдентификаторЗадания) Тогда + ПоследнийИдентификатор = ПоследнийИдентификаторЗаданияУправляющегоПотока(Поток); + Задание = НайтиЗаданиеПоИдентификатору(ПоследнийИдентификатор); + + Если Задание <> Неопределено Тогда + РезультатЗапуска.Статус = СтатусИзСостояния(Задание.Состояние); + + Если Задание.ИнформацияОбОшибке <> Неопределено Тогда + РезультатЗапуска.КраткоеПредставлениеОшибки = + ОбработкаОшибок.КраткоеПредставлениеОшибки(Задание.ИнформацияОбОшибке); + РезультатЗапуска.ПодробноеПредставлениеОшибки = + ОбработкаОшибок.ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке); + КонецЕсли; + Иначе + РезультатЗапуска.Статус = СтатусДлительнойОперации().Ошибка; + КонецЕсли; + Иначе + РезультатЗапуска.Статус = СтатусДлительнойОперации().Создано; + КонецЕсли; + КонецЕсли; + + ИдентификаторПотока = Поток.ИдентификаторПотока; + ИдентификаторПроцесса = Поток.ИдентификаторПроцесса; + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДлительныеОперации"); + ЭлементБлокировки.УстановитьЗначение("ИдентификаторПроцесса", ИдентификаторПроцесса); + ЭлементБлокировки.УстановитьЗначение("ИдентификаторПотока", ИдентификаторПотока); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + + УстановитьПривилегированныйРежим(Истина); + + НаборЗаписей = РегистрыСведений.ДлительныеОперации.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ИдентификаторПроцесса.Установить(ИдентификаторПроцесса); + НаборЗаписей.Отбор.ИдентификаторПотока.Установить(ИдентификаторПотока); + + НаборЗаписей.Прочитать(); + + Если НаборЗаписей.Количество() > 0 Тогда + Запись = НаборЗаписей.Получить(0); + + Если РезультатЗапускаУказан Тогда + Запись.ИдентификаторЗадания = РезультатЗапуска.ИдентификаторЗадания; + Запись.НомерПопытки = Поток.НомерПопытки + 1; + Запись.КлючПотока = Поток.КлючПотока; + КонецЕсли; + Запись.Статус = РезультатЗапуска.Статус; + Если РезультатЗапуска.Статус = СтатусДлительнойОперации().Ошибка Тогда + Запись.ПодробноеПредставлениеОшибки = РезультатЗапуска.ПодробноеПредставлениеОшибки; + Запись.КраткоеПредставлениеОшибки = РезультатЗапуска.КраткоеПредставлениеОшибки; + КонецЕсли; + + ЗаполнитьЗначенияСвойств(Поток, Запись); + + НаборЗаписей.Записать(); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +Функция ПервыйИдентификаторЗаданияУправляющегоПотока(ИдентификаторПроцесса) + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ДлительныеОперации.ИдентификаторЗадания КАК ИдентификаторЗадания + |ИЗ + | РегистрСведений.ДлительныеОперации КАК ДлительныеОперации + |ГДЕ + | ДлительныеОперации.ИдентификаторПроцесса = &ИдентификаторПроцесса + | И ДлительныеОперации.ИдентификаторПотока = &ПустойУникальныйИдентификатор"; + + Запрос.УстановитьПараметр("ИдентификаторПроцесса", ИдентификаторПроцесса); + Запрос.УстановитьПараметр("ПустойУникальныйИдентификатор", + ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор()); + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + Возврат Выборка.ИдентификаторЗадания; + КонецЕсли; + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось найти запись управляющего потока многопоточной длительной операции %1'"), + Строка(ИдентификаторПроцесса)); + + ВызватьИсключение ТекстОшибки; + +КонецФункции + +Функция ПоследнийИдентификаторЗаданияУправляющегоПотока(Поток) + + ПоследнийИдентификатор = Поток.ИдентификаторЗадания; + + Если ЗначениеЗаполнено(Поток.ИдентификаторПотока) Тогда + Возврат ПоследнийИдентификатор; + КонецЕсли; + + ИдентификаторЗадания = Поток.КлючПотока.Получить(); + + Если ТипЗнч(ИдентификаторЗадания) = Тип("УникальныйИдентификатор") Тогда + ПоследнийИдентификатор = ИдентификаторЗадания; + КонецЕсли; + + Возврат ПоследнийИдентификатор; + +КонецФункции + +// Параметры: +// СвойстваПотока - Структура: +// * ИдентификаторПроцесса - УникальныйИдентификатор +// * ИдентификаторПотока - УникальныйИдентификатор +// +// Результат - Произвольный - результат работы функции исполняющего потока. +// +Процедура УстановитьРезультатПотока(СвойстваПотока, Результат) + + Результат = Новый ХранилищеЗначения(Результат); + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДлительныеОперации"); + ЭлементБлокировки.УстановитьЗначение("ИдентификаторПроцесса", СвойстваПотока.ИдентификаторПроцесса); + ЭлементБлокировки.УстановитьЗначение("ИдентификаторПотока", СвойстваПотока.ИдентификаторПотока); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + + УстановитьПривилегированныйРежим(Истина); + + НаборЗаписей = РегистрыСведений.ДлительныеОперации.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ИдентификаторПроцесса.Установить(СвойстваПотока.ИдентификаторПроцесса); + НаборЗаписей.Отбор.ИдентификаторПотока.Установить(СвойстваПотока.ИдентификаторПотока); + + НаборЗаписей.Прочитать(); + + Если НаборЗаписей.Количество() > 0 Тогда + Запись = НаборЗаписей.Получить(0); + Запись.Результат = Результат; + НаборЗаписей.Записать(); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + // Ожидать, пока количество выполняющихся потоков не станет меньше максимального. -Функция ОжидатьСвободныйПоток(ИдентификаторПроцесса, ПотокиПроцесса, Результаты, ЗавершитьДосрочноЕслиОшибка) +// +// Параметры: +// ДопустимоеКоличествоПотоков - Число +// ИдентификаторПроцесса - УникальныйИдентификатор +// ЗавершитьДосрочноЕслиОшибка - Булево +// ВыполнитьНеВФоне - Булево - возвращаемое значение +// +// Возвращаемое значение: +// Булево +// +Функция ОжидатьСвободныйПоток(ИдентификаторПроцесса, ЗавершитьДосрочноЕслиОшибка) МаксимумПотоков = ДопустимоеКоличествоПотоков(); ВыполнитьВФоне = МаксимумПотоков > 1; Пока Истина Цикл - Потоки = ПотокиДлительныхОпераций(); - ЕстьАктивныйПотокПроцесса = Ложь; + Потоки = АктивныеПотоки(); - Для Каждого ПотокПроцесса Из ПотокиПроцесса Цикл - Поток = Потоки.Найти(ПотокПроцесса.ИдентификаторПотока, "ИдентификаторПотока"); - Если Поток = Неопределено Тогда - Поток = Потоки.Добавить(); - Иначе - ЕстьАктивныйПотокПроцесса = Истина; - КонецЕсли; - ЗаполнитьЗначенияСвойств(Поток, ПотокПроцесса); - КонецЦикла; - - ИдентификаторыПроцессов = Потоки.Скопировать(, "ИдентификаторПроцесса"); - ИдентификаторыПроцессов.Свернуть("ИдентификаторПроцесса"); - КоличествоВсехАктивныхПотоков = Потоки.Количество() - + ИдентификаторыПроцессов.Количество() - ?(ЕстьАктивныйПотокПроцесса, 1, 0); - - Если КоличествоВсехАктивныхПотоков < МаксимумПотоков Тогда + Если Потоки.Количество() < МаксимумПотоков Тогда Прервать; КонецЕсли; ЕстьЗавершенныеПотоки = ЕстьЗавершенныеПотоки(Потоки, - Результаты, ЗавершитьДосрочноЕслиОшибка, ИдентификаторПроцесса); - - ИндексПотока = ПотокиПроцесса.Количество() - 1; - Пока ИндексПотока >= 0 Цикл - ПотокПроцесса = ПотокиПроцесса[ИндексПотока]; - Если Потоки.Найти(ПотокПроцесса.ИдентификаторПотока, "ИдентификаторПотока") = Неопределено Тогда - ПотокиПроцесса.Удалить(ПотокПроцесса); - КонецЕсли; - ИндексПотока = ИндексПотока - 1; - КонецЦикла; + ЗавершитьДосрочноЕслиОшибка, ИдентификаторПроцесса); Если ЗавершитьДосрочноЕслиОшибка И ЕстьЗавершенныеПотоки = Неопределено Тогда - ВыполнитьВФоне = Неопределено; + ВыполнитьВФоне = Неопределено; // Ошибка в потоке. Прервать; КонецЕсли; Если ЕстьЗавершенныеПотоки Или Не ВыполнитьВФоне Тогда - Продолжить; + Прервать; КонецЕсли; - Если Не ЕстьАктивныйПотокПроцесса Тогда + Отбор = Новый Структура; + Отбор.Вставить("ИдентификаторПотока", ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор()); + УправляющиеПотоки = Потоки.НайтиСтроки(Отбор); + Для Каждого УправляющийПоток Из УправляющиеПотоки Цикл + Потоки.Удалить(УправляющийПоток); + КонецЦикла; + Если Потоки.Найти(ИдентификаторПроцесса, "ИдентификаторПроцесса") = Неопределено Тогда // Не ждем, когда у процесса нет ни одного исполняющего потока. ВыполнитьВФоне = Ложь; Прервать; КонецЕсли; - ОжидатьЗавершениеПотока(Потоки[0]); - + Если ОжидатьЗавершениеПотока(Потоки[0]) Тогда // Задание выполнено. + ОбновитьСведенияОбПотоке(Потоки[0]); + Прервать; + КонецЕсли; КонецЦикла; Возврат ВыполнитьВФоне; @@ -2176,27 +2531,33 @@ Сообщения = ФоновоеЗадание.ПолучитьСообщенияПользователю(Истина); Для Каждого Сообщение Из Сообщения Цикл + // @skip-check query-in-loop - ветка с запросом вызывается только при первом вызове в сеансе ОтправитьОповещениеКлиенту("СообщениеПользователю", Сообщение); КонецЦикла; КонецПроцедуры // Ожидать завершение всех потоков. -Процедура ОжидатьЗавершениеВсехПотоков(Потоки, Результаты, ИдентификаторПроцесса, ЗавершитьДосрочноЕслиОшибка) +// +// Параметры: +// Группы - Соответствие +// +Процедура ОжидатьЗавершениеВсехПотоков(ИдентификаторПроцесса, ЗавершитьДосрочноЕслиОшибка, ЗавершитьДосрочно) + + Потоки = АктивныеПотоки(ИдентификаторПроцесса); Пока Потоки.Количество() > 0 Цикл ЕстьЗавершенныеПотоки = ЕстьЗавершенныеПотоки(Потоки, - Результаты, ЗавершитьДосрочноЕслиОшибка, ИдентификаторПроцесса); + ЗавершитьДосрочноЕслиОшибка, ИдентификаторПроцесса); Если ЕстьЗавершенныеПотоки = Неопределено Тогда - ОтменитьВыполнениеВсехПотоков(Потоки, Результаты); + ЗавершитьДосрочно = Истина; Прервать; КонецЕсли; Если Не ЕстьЗавершенныеПотоки Тогда ОжидатьЗавершениеПотока(Потоки[0]); КонецЕсли; - КонецЦикла; КонецПроцедуры @@ -2228,57 +2589,43 @@ КонецФункции -Функция ЕстьЗавершенныеПотоки(Потоки, Результаты, ЗавершитьДосрочноЕслиОшибка, ИдентификаторПроцесса) +Функция ЕстьЗавершенныеПотоки(Потоки, ЗавершитьДосрочноЕслиОшибка, ИдентификаторПроцесса) ЕстьЗавершенныеПотоки = Ложь; - Индекс = Потоки.Количество() - 1; Пока Индекс >= 0 Цикл Поток = Потоки[Индекс]; - - ИдентификаторЗадания = Поток.ИдентификаторЗадания; - КлючПотока = Поток.КлючПотока; - - Если ЗначениеЗаполнено(ИдентификаторЗадания) Тогда - Попытка - ЗаданиеВыполнено = ЗаданиеВыполнено(ИдентификаторЗадания); - - Если Поток.ИдентификаторПроцесса = ИдентификаторПроцесса - И КлючПотока <> Неопределено - И ЗаданиеВыполнено = Истина Тогда - - Результаты[КлючПотока].Статус = "Выполнено"; - ОтправитьСообщенияПотока(ИдентификаторЗадания); - КонецЕсли; - - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - ЗаданиеВыполнено = Неопределено; - - Если Поток.ИдентификаторПроцесса = ИдентификаторПроцесса - И КлючПотока <> Неопределено Тогда - - Результаты[КлючПотока].Статус = "Ошибка"; - Результаты[КлючПотока].КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - Результаты[КлючПотока].ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); - ОтправитьСообщенияПотока(ИдентификаторЗадания); - - Если ЗавершитьДосрочноЕслиОшибка = Истина Тогда - Возврат Неопределено; - КонецЕсли; - КонецЕсли; - - КонецПопытки; - КонецЕсли; - - Если Не ЗначениеЗаполнено(ИдентификаторЗадания) Или ЗаданиеВыполнено <> Ложь Тогда - УдалитьПоток(Поток.ИдентификаторПотока); - Потоки.Удалить(Поток); - ЕстьЗавершенныеПотоки = Истина; - КонецЕсли; - Индекс = Индекс - 1; + + Если Не ЗначениеЗаполнено(Поток.ИдентификаторЗадания) Тогда + Продолжить; + КонецЕсли; + + ПоследнийИдентификатор = ПоследнийИдентификаторЗаданияУправляющегоПотока(Поток); + Результат = ЗаданиеВыполнено(ПоследнийИдентификатор, Истина); + + Если Результат.Статус = "Выполняется" Тогда + Продолжить; + КонецЕсли; + + ОбновитьСведенияОбПотоке(Поток); + Потоки.Удалить(Поток); + ЕстьЗавершенныеПотоки = Истина; + + Если Результат.Статус = "Выполнено" Тогда + Продолжить; + КонецЕсли; + + Если Результат.Статус = "Ошибка" Тогда + ЗаписатьОшибку(Результат.ТекстОшибки); + КонецЕсли; + + Если ЗавершитьДосрочноЕслиОшибка = Истина + И Поток.ИдентификаторПроцесса = ИдентификаторПроцесса Тогда + Возврат Неопределено; + КонецЕсли; + КонецЦикла; Возврат ЕстьЗавершенныеПотоки; @@ -2288,230 +2635,183 @@ // Отменить выполнение потоков, если они активны. // // Параметры: -// Потоки - см. НовоеОписаниеПотоков -// Результаты - Соответствие +// ИдентификаторПроцесса - УникальныйИдентификатор // -Процедура ОтменитьВыполнениеВсехПотоков(Потоки, Результаты) +Процедура ОтменитьВыполнениеВсехПотоков(ИдентификаторПроцесса) + УстановитьПривилегированныйРежим(Истина); + + Потоки = АктивныеПотоки(ИдентификаторПроцесса); Для Каждого Поток Из Потоки Цикл Если ЗначениеЗаполнено(Поток.ИдентификаторЗадания) Тогда ОтменитьВыполнениеЗадания(Поток.ИдентификаторЗадания); КонецЕсли; - - КлючПотока = Поток.КлючПотока; - - Если КлючПотока <> Неопределено - И Результаты[КлючПотока].Статус <> "Ошибка" Тогда - Результаты[КлючПотока].Статус = "Отменено"; - КонецЕсли; - - УдалитьПоток(Поток.ИдентификаторПотока); КонецЦикла; + ОжидатьЗавершениеВсехПотоков(ИдентификаторПроцесса, Ложь, Ложь) + КонецПроцедуры // Удалить данные о потоках, если они активны. // Процедура УдалитьНесуществующиеПотоки() - Потоки = ПотокиДлительныхОпераций(); + УстановитьПривилегированныйРежим(Истина); - Для Каждого Поток Из Потоки Цикл + ВсеПотоки = ПотокиДлительныхОпераций(); + + Процессы = ВсеПотоки.Скопировать(, "ИдентификаторПроцесса"); + Процессы.Свернуть("ИдентификаторПроцесса"); + ИдентификаторыПроцессов = Процессы.ВыгрузитьКолонку("ИдентификаторПроцесса"); + + ОтборУправляющегоПотока = Новый Структура; + ОтборУправляющегоПотока.Вставить("ИдентификаторПроцесса"); + ОтборУправляющегоПотока.Вставить("ИдентификаторПотока", + ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор()); + + ТекущаяДатаСеанса = ТекущаяДатаСеанса(); + СрокОтмены = 24*60*60; // 24 часа. + СрокУстаревания = 15*60; // 15 минут. + + Для Каждого ИдентификаторПроцесса Из ИдентификаторыПроцессов Цикл + ОтборУправляющегоПотока.ИдентификаторПроцесса = ИдентификаторПроцесса; + НайденныеСтроки = ВсеПотоки.НайтиСтроки(ОтборУправляющегоПотока); + УправляющийПоток = ?(НайденныеСтроки.Количество() > 0, НайденныеСтроки[0], Неопределено); - Если Не ЗначениеЗаполнено(Поток.ИдентификаторЗадания) Тогда - УдалитьПоток(Поток.ИдентификаторПотока); - Иначе - Задание = НайтиЗаданиеПоИдентификатору(Поток.ИдентификаторЗадания); - Если Задание = Неопределено - Или Задание.Состояние <> СостояниеФоновогоЗадания.Активно Тогда - УдалитьПоток(Поток.ИдентификаторПотока); + Если УправляющийПоток <> Неопределено + И УправляющийПоток.ДатаСоздания + СрокОтмены > ТекущаяДатаСеанса Тогда + + Если Не ЗначениеЗаполнено(УправляющийПоток.ИдентификаторЗадания) + И УправляющийПоток.ДатаСоздания + СрокУстаревания > ТекущаяДатаСеанса Тогда + Продолжить; + КонецЕсли; + ИдентификаторЗадания = ПоследнийИдентификаторЗаданияУправляющегоПотока(УправляющийПоток); + Задание = НайтиЗаданиеПоИдентификатору(ИдентификаторЗадания); + Если Задание <> Неопределено + И (Задание.Состояние = СостояниеФоновогоЗадания.Активно + Или Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно + И УправляющийПоток.НомерПопытки < КоличествоПопыток() + И УправляющийПоток.ДатаСоздания + СрокУстаревания > ТекущаяДатаСеанса) Тогда + Продолжить; КонецЕсли; КонецЕсли; + Отбор = Новый Структура("ИдентификаторПроцесса", ИдентификаторПроцесса); + ПотокиПроцесса = ВсеПотоки.Скопировать(Отбор); + ПотокиПроцесса.Сортировать("ИдентификаторПотока"); + Для Каждого ПотокПроцесса Из ПотокиПроцесса Цикл + ИдентификаторЗадания = ПоследнийИдентификаторЗаданияУправляющегоПотока(ПотокПроцесса); + Задание = НайтиЗаданиеПоИдентификатору(ИдентификаторЗадания); + Если Задание <> Неопределено + И Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда + ОтменитьВыполнениеЗадания(ПотокПроцесса.ИдентификаторЗадания); + КонецЕсли; + КонецЦикла; + УдалитьДанныеОПотоках(ИдентификаторПроцесса); + КонецЦикла; КонецПроцедуры -Процедура СохранитьПоток(Поток) - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДлительныеОперации"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки.УстановитьЗначение("ИдентификаторПотока", Поток.ИдентификаторПотока); - - НачатьТранзакцию(); - - Попытка - - Блокировка.Заблокировать(); - - УстановитьПривилегированныйРежим(Истина); - - НаборЗаписей = РегистрыСведений.ДлительныеОперации.СоздатьНаборЗаписей(); - - НаборЗаписей.Отбор.ИдентификаторПотока.Установить(Поток.ИдентификаторПотока); - НаборЗаписей.Прочитать(); - - Если НаборЗаписей.Количество() = 0 Тогда - Запись = НаборЗаписей.Добавить(); - Иначе - Запись = НаборЗаписей[0]; - КонецЕсли; - - ЗаполнитьЗначенияСвойств(Запись, Поток, , "ПараметрыМетода,КлючПотока"); - Запись.ПараметрыМетода = Новый ХранилищеЗначения(Поток.ПараметрыМетода); - Запись.КлючПотока = Новый ХранилищеЗначения(Поток.КлючПотока); - - НаборЗаписей.Записать(); - - УстановитьПривилегированныйРежим(Ложь); - - ЗафиксироватьТранзакцию(); - - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -Процедура УдалитьПоток(ИдентификаторПотока) - - УстановитьПривилегированныйРежим(Истина); - - НаборЗаписей = РегистрыСведений.ДлительныеОперации.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.ИдентификаторПотока.Установить(ИдентификаторПотока); - НаборЗаписей.Записать(); - -КонецПроцедуры - -// Возвращает количество потоков многопоточной длительной операции. +// Возвращает допустимое количество потоков на все многопоточные длительные операции +// с учетом управляющих потоков. +// +// Если допустимое количество потоков 10, а операций 2, +// то получится 2 управляющих потока и 8 исполняющих потоков. +// +// Если допустимое количество потоков 3, а операций 2, +// то получится 2 управляющих потока и 1 исполняющий поток +// причем один управляющий поток будет выполнять функцию исполняющего. +// +// Если допустимое количество потоков 5, а операций 7, +// то получится 7 управляющих потоков и 0 исполняющих потоков +// причем каждый управляющий поток будет выполнять функцию исполняющего. +// +// Соответственно, если допустимое количество 1, +// то получится, что исполняющих потоков всегда будет 0 +// и каждый управляющий поток будет выполнять функцию исполняющего. // // Возвращаемое значение: // Число - количество потоков. // Функция ДопустимоеКоличествоПотоков() - Если ОбщегоНазначения.РазделениеВключено() - Или ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда - Возврат 1; + Если ОбщегоНазначения.РазделениеВключено() + Или ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Возврат 1; КонецЕсли; ДопустимоеКоличествоПотоков = Константы.КоличествоПотоковДлительныхОпераций.Получить(); - Возврат КоличествоПотоковСУчетомУправляющегоПотока(ДопустимоеКоличествоПотоков); - -КонецФункции - -Функция КоличествоПотоковСУчетомУправляющегоПотока(ДопустимоеКоличествоПотоков) - - Если ДопустимоеКоличествоПотоков > 1 Тогда - Возврат ДопустимоеКоличествоПотоков - 1; - ИначеЕсли ДопустимоеКоличествоПотоков = 1 Тогда + Если ДопустимоеКоличествоПотоков > 0 Тогда Возврат ДопустимоеКоличествоПотоков; КонецЕсли; // Значение по умолчанию. Управляющий поток + 3 дочерних - Возврат 3; - -КонецФункции - -Функция КоличествоРаботающихПотоков() - - УстановитьПривилегированныйРежим(Истина); - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | КОЛИЧЕСТВО(ДлительныеОперации.ИдентификаторПотока) КАК КоличествоПотоков - |ИЗ - | РегистрСведений.ДлительныеОперации КАК ДлительныеОперации"; - - Результат = Запрос.Выполнить(); - Если Результат.Пустой() Тогда - Возврат 0; - КонецЕсли; - - Возврат Результат.Выгрузить().Получить(0).КоличествоПотоков; - -КонецФункции - -Функция ПотокиДлительныхОпераций(ИдентификаторПроцесса = Неопределено) - - ТаблицаПотоков = НовоеОписаниеПотоков(); - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ДлительныеОперации.АдресРезультата КАК АдресРезультата, - | ДлительныеОперации.Наименование КАК Наименование, - | ДлительныеОперации.ПараметрыМетода КАК ПараметрыМетода, - | ДлительныеОперации.ИдентификаторЗадания КАК ИдентификаторЗадания, - | ДлительныеОперации.ИдентификаторПроцесса КАК ИдентификаторПроцесса, - | ДлительныеОперации.ИдентификаторПотока КАК ИдентификаторПотока, - | ДлительныеОперации.КлючПотока КАК КлючПотока - |ИЗ - | РегистрСведений.ДлительныеОперации КАК ДлительныеОперации"; - - Если ЗначениеЗаполнено(ИдентификаторПроцесса) Тогда - - Запрос.Текст = Запрос.Текст + " - |ГДЕ - | ДлительныеОперации.ИдентификаторПроцесса = &ИдентификаторПроцесса"; - - Запрос.Параметры.Вставить("ИдентификаторПроцесса", ИдентификаторПроцесса); - - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - - Результат = Запрос.Выполнить().Выгрузить(); - Для Каждого Поток Из Результат Цикл - - Строка = ТаблицаПотоков.Добавить(); - ЗаполнитьЗначенияСвойств(Строка, Поток, , "КлючПотока, ПараметрыМетода"); - Если Не ЗначениеЗаполнено(Строка.АдресРезультата) Тогда - Строка.АдресРезультата = Неопределено; - КонецЕсли; - - Если Поток.ПараметрыМетода <> Неопределено Тогда - Строка.ПараметрыМетода = Поток.ПараметрыМетода.Получить(); - КонецЕсли; - Если Поток.КлючПотока <> Неопределено Тогда - Строка.ПараметрыМетода = Поток.КлючПотока.Получить(); - КонецЕсли; - - КонецЦикла; - - Возврат ТаблицаПотоков; + Возврат 4; КонецФункции // Описание потоков. // +// Параметры: +// ИдентификаторПроцесса - УникальныйИдентификатор +// - Неопределено - вернуть все +// // Возвращаемое значение: -// ТаблицаЗначений - описание потоков со следующими колонками: +// ТаблицаЗначений: // * Наименование - Строка - произвольное наименование потока (используется в наименовании фонового задания). // * ИдентификаторЗадания - УникальныйИдентификатор - уникальный идентификатор фонового задания. // * ИдентификаторПроцесса - УникальныйИдентификатор - уникальный идентификатор процесса. // * ИдентификаторПотока - УникальныйИдентификатор - уникальный идентификатор потока внутри процесса. // * ПараметрыМетода - Произвольный - параметры для процедуры или функции. // * АдресРезультата - Строка - адрес временного хранилища для сохранения результата выполнения фонового задания. +// * ИмяМетода - Строка - имя метода для обработки порции // * КлючПотока - Произвольный - уникальный идентификатор порции (набора) данных. +// * Результат - ХранилищеЗначения +// * НомерПопытки - Число +// * ПодробноеПредставлениеОшибки - Строка +// * КраткоеПредставлениеОшибки - Строка +// * ДатаСоздания - Дата +// * Статус - Строка // -Функция НовоеОписаниеПотоков() +Функция ПотокиДлительныхОпераций(ИдентификаторПроцесса = Неопределено) - Потоки = Новый ТаблицаЗначений; - Колонки = Потоки.Колонки; - Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка")); - Колонки.Добавить("ИдентификаторЗадания", Новый ОписаниеТипов("УникальныйИдентификатор")); - Колонки.Добавить("ИдентификаторПотока", Новый ОписаниеТипов("УникальныйИдентификатор")); - Колонки.Добавить("ИдентификаторПроцесса", Новый ОписаниеТипов("УникальныйИдентификатор")); - Колонки.Добавить("ПараметрыМетода", Неопределено); - Колонки.Добавить("АдресРезультата" , Новый ОписаниеТипов("Строка")); - Колонки.Добавить("КлючПотока", Неопределено); + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ДлительныеОперации.АдресРезультата КАК АдресРезультата, + | ДлительныеОперации.Наименование КАК Наименование, + | ДлительныеОперации.ИдентификаторЗадания КАК ИдентификаторЗадания, + | ДлительныеОперации.ИдентификаторПроцесса КАК ИдентификаторПроцесса, + | ДлительныеОперации.ИдентификаторПотока КАК ИдентификаторПотока, + | ДлительныеОперации.КлючПотока КАК КлючПотока, + | ДлительныеОперации.ИмяМетода КАК ИмяМетода, + | ДлительныеОперации.Результат КАК Результат, + | ДлительныеОперации.НомерПопытки КАК НомерПопытки, + | ДлительныеОперации.ПодробноеПредставлениеОшибки КАК ПодробноеПредставлениеОшибки, + | ДлительныеОперации.КраткоеПредставлениеОшибки КАК КраткоеПредставлениеОшибки, + | ДлительныеОперации.ДатаСоздания КАК ДатаСоздания, + | ДлительныеОперации.Статус КАК Статус + |ИЗ + | РегистрСведений.ДлительныеОперации КАК ДлительныеОперации"; - Возврат Потоки; + Если ЗначениеЗаполнено(ИдентификаторПроцесса) Тогда + + Запрос.Текст = Запрос.Текст + " + |ГДЕ + | ДлительныеОперации.ИдентификаторПроцесса = &ИдентификаторПроцесса + | И ДлительныеОперации.ИдентификаторПотока <> &ПустойУникальныйИдентификатор"; + + Запрос.УстановитьПараметр("ИдентификаторПроцесса", ИдентификаторПроцесса); + Запрос.УстановитьПараметр("ПустойУникальныйИдентификатор", + ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор()); + + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + Возврат Запрос.Выполнить().Выгрузить(); КонецФункции @@ -2547,6 +2847,342 @@ КонецФункции +Функция АктивныеПотоки(ИдентификаторПроцесса = Неопределено) + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + ТекстЗапроса = + "ВЫБРАТЬ + | ДлительныеОперации.ИдентификаторПотока КАК ИдентификаторПотока, + | ДлительныеОперации.АдресРезультата КАК АдресРезультата, + | ДлительныеОперации.ИдентификаторЗадания КАК ИдентификаторЗадания, + | ДлительныеОперации.ИдентификаторПроцесса КАК ИдентификаторПроцесса, + | ДлительныеОперации.ИмяМетода КАК ИмяМетода, + | ДлительныеОперации.ИмяПользователя КАК ИмяПользователя, + | ДлительныеОперации.КлючПотока КАК КлючПотока, + | ДлительныеОперации.Наименование КАК Наименование, + | ДлительныеОперации.НомерПопытки КАК НомерПопытки, + | ДлительныеОперации.Статус КАК Статус + |ИЗ + | РегистрСведений.ДлительныеОперации КАК ДлительныеОперации + |ГДЕ + | ДлительныеОперации.Статус = &Выполняется"; + + Если ЗначениеЗаполнено(ИдентификаторПроцесса) Тогда + ТекстЗапроса = ТекстЗапроса + " + | И ДлительныеОперации.ИдентификаторПроцесса = &ИдентификаторПроцесса + | И ДлительныеОперации.ИдентификаторПотока <> &ПустойУникальныйИдентификатор"; + + Запрос.УстановитьПараметр("ИдентификаторПроцесса", ИдентификаторПроцесса); + Запрос.УстановитьПараметр("ПустойУникальныйИдентификатор", + ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор()); + КонецЕсли; + + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("Выполняется", СтатусДлительнойОперации().Выполняется); + + Возврат Запрос.Выполнить().Выгрузить() + +КонецФункции + +// Параметры: +// ИдентификаторПроцесса - УникальныйИдентификатор +// +// Возвращаемое значение: +// ТаблицаЗначений: +// * ИдентификаторПотока - УникальныйИдентификатор +// * АдресРезультата - Строка +// * ИдентификаторЗадания - УникальныйИдентификатор +// * ИдентификаторПроцесса - УникальныйИдентификатор +// * ИмяМетода - Строка +// * КлючПотока - ХранилищеЗначения +// * Наименование - Строка +// * НомерПопытки - Число +// * ПараметрыПотока - ХранилищеЗначения +// * Статус - Строка +// +Функция ПотокиОжидающиеОбработки(ИдентификаторПроцесса) + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ДлительныеОперации.ИдентификаторПотока КАК ИдентификаторПотока, + | ДлительныеОперации.АдресРезультата КАК АдресРезультата, + | ДлительныеОперации.ИдентификаторЗадания КАК ИдентификаторЗадания, + | ДлительныеОперации.ИдентификаторПроцесса КАК ИдентификаторПроцесса, + | ДлительныеОперации.ИмяМетода КАК ИмяМетода, + | ДлительныеОперации.ИмяПользователя КАК ИмяПользователя, + | ДлительныеОперации.КлючПотока КАК КлючПотока, + | ДлительныеОперации.Наименование КАК Наименование, + | ДлительныеОперации.НомерПопытки КАК НомерПопытки, + | ДлительныеОперации.ПараметрыПотока КАК ПараметрыПотока, + | ДлительныеОперации.Статус КАК Статус + |ИЗ + | РегистрСведений.ДлительныеОперации КАК ДлительныеОперации + |ГДЕ + | ДлительныеОперации.ИдентификаторПроцесса = &ИдентификаторПроцесса + | И ДлительныеОперации.ИдентификаторПотока <> &ПустойУникальныйИдентификатор + | И (ДлительныеОперации.Статус = &Создан + | ИЛИ ДлительныеОперации.Статус = &Ошибка + | И ДлительныеОперации.НомерПопытки < &КоличествоПопыток)"; + + Запрос.УстановитьПараметр("ИдентификаторПроцесса", ИдентификаторПроцесса); + Запрос.УстановитьПараметр("КоличествоПопыток", КоличествоПопыток()); + Запрос.УстановитьПараметр("Создан", СтатусДлительнойОперации().Создано); + Запрос.УстановитьПараметр("Ошибка", СтатусДлительнойОперации().Ошибка); + Запрос.УстановитьПараметр("ПустойУникальныйИдентификатор", + ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор()); + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +Процедура ПодготовитьМногопоточнуюОперациюКЗапуску(Знач ИмяМетода, АдресРезультатов, + Знач ИдентификаторПроцесса, Знач Порции, ОбновленныеПараметрыОперации = Неопределено) + + ИмяПользователя = ""; + Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда + ИмяПользователя = ПользователиИнформационнойБазы.ТекущийПользователь().Имя; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + НаборЗаписей = РегистрыСведений.ДлительныеОперации.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ИдентификаторПроцесса.Установить(ИдентификаторПроцесса); + + Для каждого КлючЗначение Из Порции Цикл + + Запись = НаборЗаписей.Добавить(); + + Запись.ИдентификаторПроцесса = ИдентификаторПроцесса; + Запись.ИдентификаторПотока = Новый УникальныйИдентификатор; + Запись.ИмяМетода = ИмяМетода; + Запись.КлючПотока = Новый ХранилищеЗначения(КлючЗначение.Ключ); + Запись.АдресРезультата = АдресРезультатов[КлючЗначение.Ключ]; + Запись.Статус = СтатусДлительнойОперации().Создано; + Запись.НомерПопытки = 0; + Запись.Наименование = Строка(КлючЗначение.Ключ); + Запись.ДатаСоздания = ТекущаяДатаСеанса(); + Запись.ИмяПользователя = ИмяПользователя; + Запись.ПараметрыПотока = Новый ХранилищеЗначения(КлючЗначение.Значение); + + КонецЦикла; + + Если ОбновленныеПараметрыОперации = Неопределено Тогда + НаборЗаписей.Записать(); + Иначе + ИдентификаторПотока = ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор(); + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДлительныеОперации"); + ЭлементБлокировки.УстановитьЗначение("ИдентификаторПроцесса", ИдентификаторПроцесса); + ЭлементБлокировки.УстановитьЗначение("ИдентификаторПотока", ИдентификаторПотока); + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + НаборИзОднойЗаписи = РегистрыСведений.ДлительныеОперации.СоздатьНаборЗаписей(); + НаборИзОднойЗаписи.Отбор.ИдентификаторПроцесса.Установить(ИдентификаторПроцесса); + НаборИзОднойЗаписи.Отбор.ИдентификаторПотока.Установить(ИдентификаторПотока); + НаборИзОднойЗаписи.Прочитать(); + Если НаборИзОднойЗаписи.Количество() <> 1 Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось найти запись управляющего потока многопоточной длительной операции %1'"), + Строка(ИдентификаторПроцесса)); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + ТекущийКэш = ОбновленныеПараметрыОперации.ПараметрыМетода.Контекст.Кэш; + ОбновленныеПараметрыОперации.ПараметрыМетода.Контекст.Кэш = Неопределено; + НаборИзОднойЗаписи[0].ПараметрыВыполнения = Новый ХранилищеЗначения(ОбновленныеПараметрыОперации); + ОбновленныеПараметрыОперации.ПараметрыМетода.Контекст.Кэш = ТекущийКэш; + НаборИзОднойЗаписи.Записать(); + НаборЗаписей.Записать(Ложь); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + КонецЕсли; + +КонецПроцедуры + +// Возвращаемое значение: +// Структура: +// * Создано - Строка +// * Выполняется - Строка +// * Выполнено - Строка +// * Ошибка - Строка +// * Отменено - Строка +// +Функция СтатусДлительнойОперации() + + Результат = Новый Структура(); + Результат.Вставить("Создано", ""); + Результат.Вставить("Выполняется", "Выполняется"); + Результат.Вставить("Выполнено", "Выполнено"); + Результат.Вставить("Ошибка", "Ошибка"); + Результат.Вставить("Отменено", "Отменено"); + + Возврат Результат; + +КонецФункции + +Функция КоличествоПопыток() + Возврат 3; +КонецФункции + +Функция ВыполненПерезапускУправляющегоПотока(ИдентификаторЗадания, Задание) + + Если Задание <> Неопределено + И Задание.Состояние <> СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда + Возврат Ложь; + КонецЕсли; + + УстановитьОтключениеБезопасногоРежима(Истина); + УстановитьПривилегированныйРежим(Истина); + + ПустойИдентификатор = ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор(); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ИдентификаторЗадания", ИдентификаторЗадания); + Запрос.УстановитьПараметр("ИдентификаторПотока", ПустойИдентификатор); + Запрос.Текст = + "ВЫБРАТЬ + | ДлительныеОперации.ИдентификаторПроцесса КАК ИдентификаторПроцесса, + | ДлительныеОперации.ИдентификаторПотока КАК ИдентификаторПотока, + | ДлительныеОперации.НомерПопытки КАК НомерПопытки, + | ДлительныеОперации.Статус КАК Статус, + | ДлительныеОперации.КлючПотока КАК КлючПотока, + | ДлительныеОперации.ПараметрыВыполнения КАК ПараметрыВыполнения + |ИЗ + | РегистрСведений.ДлительныеОперации КАК ДлительныеОперации + |ГДЕ + | ДлительныеОперации.ИдентификаторПотока = &ИдентификаторПотока + | И ДлительныеОперации.ИдентификаторЗадания = &ИдентификаторЗадания"; + + РезультатЗапроса = Запрос.Выполнить(); + Если РезультатЗапроса.Пустой() Тогда + Возврат Ложь; + КонецЕсли; + + Поток = РезультатЗапроса.Выгрузить()[0]; + + Если Поток.НомерПопытки >= КоличествоПопыток() Тогда + Возврат Ложь; + КонецЕсли; + + Попытка + ПараметрыОперации = ПараметрыМногопоточнойОперации(Поток.ИдентификаторПроцесса, + Поток.ПараметрыВыполнения.Получить()); + + ПараметрыВыполнения = ПараметрыОперации.ПараметрыВыполнения; + ПараметрыВыполнения.ОжидатьЗавершение = 0; + ПараметрыВыполнения.ЗапуститьВФоне = Истина; + ПараметрыВыполнения.Вставить("ЭтоПерезапускУправляющегоПотока"); + + РезультатЗапуска = ВыполнитьФункцию(ПараметрыВыполнения, + ИмяМетодаМногопоточногоПроцесса(), ПараметрыОперации); + + Если Не ЗначениеЗаполнено(РезультатЗапуска.ИдентификаторЗадания) Тогда + ТекстОшибки = НСтр("ru = 'Получен пустой идентификатор фонового задания'"); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + НовоеЗадание = НайтиЗаданиеПоИдентификатору(РезультатЗапуска.ИдентификаторЗадания); + Если НовоеЗадание = Неопределено Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не найдено новое фоновое задание по идентификатору %1'"), + РезультатЗапуска.ИдентификаторЗадания); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + Задание = НовоеЗадание; + + Свойства = Новый Структура(ПараметрыСеанса.ДлительныеОперации); + Перезапущенные = Новый Соответствие(Свойства.Перезапущенные); + Перезапущенные.Вставить(ИдентификаторЗадания, РезультатЗапуска.ИдентификаторЗадания); + Свойства.Перезапущенные = Новый ФиксированноеСоответствие(Перезапущенные); + ПараметрыСеанса.ДлительныеОперации = Новый ФиксированнаяСтруктура(Свойства); + + Поток.КлючПотока = Новый ХранилищеЗначения(РезультатЗапуска.ИдентификаторЗадания); + РезультатЗапуска.ИдентификаторЗадания = ИдентификаторЗадания; + ОбновитьСведенияОбПотоке(Поток, РезультатЗапуска); + Исключение + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'При попытке перезапуска фонового задания %1 + |управляющего потока %2 возникла ошибка: + | + |%3'"), + Строка(ИдентификаторЗадания), + Строка(Поток.ИдентификаторПроцесса), + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьОшибку(ТекстОшибки); + Возврат Ложь; + КонецПопытки; + + Возврат Истина; + +КонецФункции + +Процедура УдалитьДанныеОПотоках(ИдентификаторПроцесса) + + УстановитьПривилегированныйРежим(Истина); + + НаборЗаписей = РегистрыСведений.ДлительныеОперации.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ИдентификаторПроцесса.Установить(ИдентификаторПроцесса); + + НаборЗаписей.Записать(); + +КонецПроцедуры + +Процедура ЗапланироватьЗапускПотоковДлительныхОпераций(РезультатЗапуска, ПараметрыОперации) + + УстановитьПривилегированныйРежим(Истина); + + ИдентификаторПотока = ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор(); + ИдентификаторПроцесса = ПараметрыОперации.ИдентификаторПроцесса; + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДлительныеОперации"); + ЭлементБлокировки.УстановитьЗначение("ИдентификаторПроцесса", ИдентификаторПроцесса); + ЭлементБлокировки.УстановитьЗначение("ИдентификаторПотока", ИдентификаторПотока); + + НаборЗаписей = РегистрыСведений.ДлительныеОперации.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ИдентификаторПроцесса.Установить(ИдентификаторПроцесса); + НаборЗаписей.Отбор.ИдентификаторПотока.Установить(ИдентификаторПотока); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + НаборЗаписей.Прочитать(); + + Если НаборЗаписей.Количество() > 0 Тогда + Запись = НаборЗаписей[0]; + Иначе + Запись = НаборЗаписей.Добавить(); + Запись.ИдентификаторПотока = ИдентификаторПотока; + Запись.НомерПопытки = 0; + Запись.ДатаСоздания = ТекущаяДатаСеанса(); + Запись.ИмяПользователя = ИмяПользователя(); + Запись.ИдентификаторПроцесса = ИдентификаторПроцесса; + КонецЕсли; + Запись.АдресРезультата = РезультатЗапуска.АдресРезультата; + Запись.ИдентификаторЗадания = РезультатЗапуска.ИдентификаторЗадания; + Запись.Статус = РезультатЗапуска.Статус; + Запись.ПараметрыВыполнения = Новый ХранилищеЗначения(ПараметрыОперации); + + НаборЗаписей.Записать(); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Журнал регистрации + Процедура ЗаписатьОшибку(Знач Текст) ЖурналРегистрации.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, Текст); diff --git a/SSL/src/CommonModules/ДлительныеОперацииКлиент/Module.bsl b/SSL/src/CommonModules/ДлительныеОперацииКлиент/Module.bsl index 8da93d09a..8fb3380c8 100644 --- a/SSL/src/CommonModules/ДлительныеОперацииКлиент/Module.bsl +++ b/SSL/src/CommonModules/ДлительныеОперацииКлиент/Module.bsl @@ -32,7 +32,7 @@ // ** Сообщения - ФиксированныйМассив - массив объектов СообщениеПользователю, // сформированных в процедуре-обработчике длительной операции. // Массив будет пустым, когда в параметре ПараметрыОжидания -// свойство ВыводитьОкноОжидания = Истина или +// свойство ВыводитьОкноОжидания = Ложь и // заполнено свойство ОповещениеОПрогрессеВыполнения. // * ДополнительныеПараметры - Произвольный - произвольные данные, переданные в описании оповещения. // ПараметрыОжидания - см. ДлительныеОперацииКлиент.ПараметрыОжидания @@ -55,9 +55,19 @@ РасширенныеПараметры.Вставить("ИдентификаторЗадания", ДлительнаяОперация.ИдентификаторЗадания); Если ДлительнаяОперация.Статус <> "Выполняется" Тогда - РасширенныеПараметры.Вставить("НакопленныеСообщения", Новый Массив(ДлительнаяОперация.Сообщения)); + РасширенныеПараметры.Вставить("НакопленныеСообщения", Новый Массив); РасширенныеПараметры.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); - ЗавершитьДлительнуюОперацию(РасширенныеПараметры, ДлительнаяОперация); + Если РасширенныеПараметры.ВыводитьОкноОжидания Тогда + ОбработатьСообщенияПользователю(ДлительнаяОперация.Сообщения, + РасширенныеПараметры.НакопленныеСообщения, + РасширенныеПараметры.ВыводитьСообщения, + РасширенныеПараметры.ФормаВладелец); + ЗавершитьДлительнуюОперацию(РасширенныеПараметры, ДлительнаяОперация); + Иначе + ДлительнаяОперация.Вставить("Прогресс"); + ДлительнаяОперация.Вставить("ФоновоеЗаданиеЗавершено"); + ОбработатьРезультатАктивнойОперации(РасширенныеПараметры, ДлительнаяОперация); + КонецЕсли; Возврат; КонецЕсли; @@ -106,6 +116,8 @@ // * ВыводитьПрогрессВыполнения - Булево - выводить прогресс выполнения в процентах на форме ожидания. // Процедура-обработчик длительной операции может сообщить о ходе своего выполнения // с помощью вызова процедуры ДлительныеОперации.СообщитьПрогресс. +// * ВыводитьСообщения - Булево - из формы ожидания выводить в ФормаВладелец сообщения, +// сформированные в процедуре-обработчике длительной операции. // * ОповещениеОПрогрессеВыполнения - ОписаниеОповещения - оповещение, которое периодически вызывается при // проверке готовности фонового задания, если ВыводитьОкноОжидания = Ложь. // Параметры процедуры-обработчика оповещения: @@ -120,8 +132,6 @@ // очередная порция сообщений, сформированных в процедуре-обработчике длительной операции. // # ДополнительныеПараметры - Произвольный - произвольные данные, переданные в описании оповещения. // -// * ВыводитьСообщения - Булево - выводить на форме ожидания сообщения, -// сформированные в процедуре-обработчике длительной операции. // * Интервал - Число - интервал в секундах между проверками готовности длительной операции. // По умолчанию 0 - после каждой проверки интервал увеличивается с 1 до 15 секунд // с коэффициентом 1.4. @@ -135,6 +145,9 @@ // ** Важное - Булево - если Истина, то оповещение после автоматического закрытия будет добавлено в // центр оповещений. // +// * ОтменятьПриЗакрытииФормыВладельца - Булево - по умолчанию ФормаВладелец.Открыта(), Ложь если форма не указана. +// Если Ложь, тогда длительная операция не будет отменена при закрытии формы владельца. +// // * ПолучатьРезультат - Булево - служебный параметр. Не предназначен для использования. // Функция ПараметрыОжидания(ФормаВладелец) Экспорт @@ -142,7 +155,8 @@ Результат = Новый Структура; Результат.Вставить("ФормаВладелец", ФормаВладелец); Результат.Вставить("ТекстСообщения", ""); - Результат.Вставить("Заголовок", ""); + Результат.Вставить("Заголовок", ""); + Результат.Вставить("НомерПопытки", 1); Результат.Вставить("ВыводитьОкноОжидания", Истина); Результат.Вставить("ВыводитьПрогрессВыполнения", Ложь); Результат.Вставить("ОповещениеОПрогрессеВыполнения", Неопределено); @@ -509,7 +523,7 @@ |%1 возникла ошибка: |%2'"), Строка(ДлительнаяОперация.ИдентификаторЗадания), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( НСтр("ru = 'Длительные операции.Ошибка вызова обработчика события'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), @@ -533,7 +547,7 @@ // Требуется проверка, так как оповещение отправляется в конце фонового задания // до его завершения и данные результата еще недоступны по адресу временного хранилища. Или ДлительныеОперацииВызовСервера.ФоновоеЗаданиеЗавершено(ДлительнаяОперация.ИдентификаторЗадания) Тогда - + ЗавершитьДлительнуюОперацию(ДлительнаяОперация, Результат); Возврат Истина; КонецЕсли; @@ -553,6 +567,23 @@ КонецФункции +Процедура ОбработатьСообщенияПользователю(Сообщения, НакопленныеСообщения, ВыводитьСообщения, ВладелецФормы) Экспорт + + ИдентификаторНазначения = ?(ВыводитьСообщения И ВладелецФормы <> Неопределено, + ВладелецФормы.УникальныйИдентификатор, Неопределено); + + Для Каждого СообщениеПользователю Из Сообщения Цикл + НакопленныеСообщения.Добавить(СообщениеПользователю); + Если ИдентификаторНазначения <> Неопределено Тогда + НовоеСообщение = Новый СообщениеПользователю; + ЗаполнитьЗначенияСвойств(НовоеСообщение, СообщениеПользователю); + НовоеСообщение.ИдентификаторНазначения = ИдентификаторНазначения; + НовоеСообщение.Сообщить(); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + Процедура ЗавершитьДлительнуюОперацию(Знач ДлительнаяОперация, Знач Статус) Если Статус.Статус = "Выполнено" Тогда @@ -595,12 +626,12 @@ |%1 возникла ошибка: |%2'"), Строка(ИдентификаторЗадания), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( НСтр("ru = 'Длительные операции.Ошибка вызова обработчика события'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), "Ошибка", ТекстОшибки,, Истина); - ПоказатьИнформациюОбОшибке(ИнформацияОбОшибке); + ОбработкаОшибок.ПоказатьИнформациюОбОшибке(ИнформацияОбОшибке); КонецПопытки; КонецПроцедуры diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl index 516a182b1..76560c253 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl @@ -240,8 +240,8 @@ // // Задать настройки формы отчета. // // // // Параметры: -// // Форма - ФормаКлиентскогоПриложения, Неопределено - -// // КлючВарианта - Строка, Неопределено - +// // Форма - ФормаКлиентскогоПриложения, Неопределено +// // КлючВарианта - Строка, Неопределено // // Настройки - см. ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию // // // Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт @@ -1489,8 +1489,9 @@ Результат = Истина; Исключение ПараметрыОтчета.ТекстОшибки = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'При подключении дополнительного отчета ""%1"" возникла ошибка:'"), Строка(Ссылка)) - + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось подключить дополнительный отчет ""%1"" по причине:'"), Строка(Ссылка)) + + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); Результат = Ложь; КонецПопытки; @@ -1542,6 +1543,13 @@ КонецПроцедуры +// См. УправлениеСвойствамиПереопределяемый.ПриПолученииПредопределенныхНаборовСвойств. +Процедура ПриПолученииПредопределенныхНаборовСвойств(Наборы) Экспорт + Набор = Наборы.Строки.Добавить(); + Набор.Имя = "Справочник_ДополнительныеОтчетыИОбработки"; + Набор.Идентификатор = Новый УникальныйИдентификатор("82cbc0a7-224e-48bc-a4a5-a108c3ac3bd0"); +КонецПроцедуры + Процедура ПриОпределенииДоступностиОтчетов(СсылкиДопОтчетов, Результат) Экспорт ПодсистемаВключена = Истина; ЕстьПравоЧтения = Истина; @@ -1692,24 +1700,23 @@ Возврат ОбновлениеИнформационнойБазы.ЕстьЗаблокированныеПредыдущимиОчередямиДанные(Очередь, "Справочник.ДополнительныеОтчетыИОбработки"); КонецФункции -Функция ТекстЗапросаДополнительныхОтчетовПоИмениОбъекта() Экспорт - - Возврат "ВЫБРАТЬ - | Отчеты.Ссылка КАК Ссылка - |ИЗ - | Справочник.ДополнительныеОтчетыИОбработки КАК Отчеты - |ГДЕ - | Отчеты.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыДополнительныхОтчетовИОбработок.Отчет) - | И Отчеты.ИмяОбъекта = &ИмяОбъекта"; - -КонецФункции - Функция ИмяТаблицыДополнительныеОтчеты() Экспорт Возврат "Справочник.ДополнительныеОтчетыИОбработки"; КонецФункции +Функция ЭтоВидОбработкиДляШаблоновСообщений(ВидОбработки) Экспорт + + Если ВидОбработки = ПолучитьВидОбработкиПоСтроковомуПредставлениюВида( + ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиШаблонСообщения()) Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -1739,9 +1746,9 @@ Исключение ЗаписатьОшибку( ВнешняяОбработка, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Команда %1: Ошибка выполнения: + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Команда %1 не выполнена по причине: |%2'"), - ИдентификаторКоманды, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ИдентификаторКоманды, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; // Запись журнала регистрации @@ -2523,6 +2530,14 @@ Процедура ЗарегистрироватьОтчетыИОбработки(ОтчетыИОбработки) + ИменаОбработок = ОтчетыИОбработки.ВыгрузитьКолонку("Имя"); + СсылкиОбработок = ОтчетыИОбработки.ВыгрузитьКолонку("Ссылка"); + ВсеКонфликтующие = ВсеКонфликтующиеОтчетыИОбработки(СсылкиОбработок, ИменаОбработок); + + ВидыДополнительныхОтчетовИОбработок = Новый Массив; + ВидыДополнительныхОтчетовИОбработок.Добавить(Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет); + ВидыДополнительныхОтчетовИОбработок.Добавить(Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет); + Для Каждого СтрокаТаблицы Из ОтчетыИОбработки Цикл // Обновление/добавление. Если СтрокаТаблицы.Ссылка = Неопределено Тогда @@ -2574,18 +2589,31 @@ СправочникОбъект.Вид = ПолучитьВидОбработкиПоСтроковомуПредставлениюВида( ОбработкаСведения.Вид); - Результат = ЗарегистрироватьОбработку(СправочникОбъект, ПараметрыРегистрации); - Если Не Результат.Успех И Результат.ИмяОбъектаЗанято Тогда + Конфликтующие = Новый СписокЗначений; + Отбор = Новый Структура; + Отбор.Вставить("ИмяОбъекта", СтрокаТаблицы.Имя); + Найденные = ВсеКонфликтующие.НайтиСтроки(Отбор); + Для Каждого Найденный Из Найденные Цикл + ВидКонфликтаОтчет = ВидыДополнительныхОтчетовИОбработок.Найти(Найденный.Вид) <> Неопределено; + Если ЭтоОтчет И Не ВидКонфликтаОтчет Тогда + Продолжить; + ИначеЕсли Не ЭтоОтчет И ВидКонфликтаОтчет Тогда + Продолжить; + КонецЕсли; + + Конфликтующие.Добавить(Найденный.Ссылка, Найденный.Представление); + КонецЦикла; + Если Конфликтующие.Количество() <> 0 Тогда ПараметрыРегистрации.Вставить("ОтключатьКонфликтующие", Истина); - ПараметрыРегистрации.Вставить("Конфликтующие", Результат.Конфликтующие); - Результат = ЗарегистрироватьОбработку(СправочникОбъект, ПараметрыРегистрации); + ПараметрыРегистрации.Вставить("Конфликтующие", Конфликтующие); КонецЕсли; + Результат = ЗарегистрироватьОбработку(СправочникОбъект, ПараметрыРегистрации); Если Не Результат.Успех Тогда - Если Результат.ИмяОбъектаЗанято Тогда + Если Конфликтующие.Количество() <> 0 Тогда Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Имя ""%1"" занято объектами ""%2""'"), ИмяОбъекта, - Строка(Результат.Конфликтующие)); + Строка(Конфликтующие)); КонецЕсли; ЗаписьЖурналаРегистрации( НаименованиеПодсистемы(), @@ -2615,15 +2643,13 @@ Задание = РегламентныеЗаданияСервер.Задание(КлючИЗначение.Значение); Задание.Удалить(); Исключение - ЗаписьЖурналаРегистрации( - ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка, - Метаданные.Справочники.ДополнительныеОтчетыИОбработки, - СправочникОбъект.Ссылка, + ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Ошибка,, СправочникОбъект.Ссылка, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при удалении задания ""%1"":%2'"), + НСтр("ru = 'Регламентное задание ""%1"" не было удалено по причине: + |%2'"), КлючИЗначение.Значение, - Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; КонецЦикла; @@ -2639,7 +2665,7 @@ КонецЦикла; Иначе Для Каждого ОписаниеНазначения Из ОбработкаСведения.Назначение Цикл - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ОписаниеНазначения); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ОписаниеНазначения); Если ОбъектМетаданных = Неопределено Тогда Продолжить; КонецЕсли; @@ -2737,21 +2763,6 @@ Возврат Результат; КонецЕсли; - // Если отчет публикуется, то необходим контроль уникальности имени объекта, - // под которым дополнительный отчет регистрируется в системе. - Если Объект.Публикация = Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется Тогда - // Проверка имени - Конфликтующие = КонфликтующиеДополнительныеОтчетыИОбработки(Объект, ПараметрыРегистрации.ЭтоОтчет, Результат.ИмяОбъекта); - - Если Конфликтующие.Количество() > 0 Тогда - Результат.ИмяОбъектаЗанято = Истина; - Для Каждого СтрокаТаблицы Из Конфликтующие Цикл - Результат.Конфликтующие.Добавить(СтрокаТаблицы.Ссылка, СтрокаТаблицы.Представление); - КонецЦикла; - Возврат Результат; - КонецЕсли; - КонецЕсли; - Если Не РегистрационныеДанные.БезопасныйРежим И Не Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда Результат.ТекстОшибки = НСтр("ru = 'Для подключения обработки, запускаемой в небезопасном режиме, требуется роль ""Администратор системы"".'"); Возврат Результат; @@ -2882,41 +2893,39 @@ // Параметры: // Объект - СправочникСсылка.ДополнительныеОтчетыИОбработки -// ЭтоОтчет - Булево // ИмяОбъекта - Строка // Возвращаемое значение: // ТаблицаЗначений: // * Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки +// * Вид - ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок +// * ИмяОбъекта - Строка // * Представление - Строка // -Функция КонфликтующиеДополнительныеОтчетыИОбработки(Объект, ЭтоОтчет, ИмяОбъекта) +Функция ВсеКонфликтующиеОтчетыИОбработки(Ссылки, ИменаОбработок) УстановитьПривилегированныйРежим(Истина); ТекстЗапроса = "ВЫБРАТЬ | ТаблицаСправочника.Ссылка КАК Ссылка, + | ТаблицаСправочника.Вид КАК Вид, + | ТаблицаСправочника.ИмяОбъекта КАК ИмяОбъекта, | ТаблицаСправочника.Представление КАК Представление |ИЗ | Справочник.ДополнительныеОтчетыИОбработки КАК ТаблицаСправочника |ГДЕ - | ТаблицаСправочника.ИмяОбъекта = &ИмяОбъекта - | И ТаблицаСправочника.Вид В(&ВидыДополнительныхОтчетовИОбработок) + | ТаблицаСправочника.ИмяОбъекта В(&ИмяОбъекта) | И ТаблицаСправочника.Публикация = ЗНАЧЕНИЕ(Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется) | И ТаблицаСправочника.ПометкаУдаления = ЛОЖЬ - | И ТаблицаСправочника.Ссылка <> &Ссылка"; + | И НЕ ТаблицаСправочника.Ссылка В(&Ссылка)"; ВидыДополнительныхОтчетовИОбработок = Новый Массив; ВидыДополнительныхОтчетовИОбработок.Добавить(Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет); ВидыДополнительныхОтчетовИОбработок.Добавить(Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет); Запрос = Новый Запрос; - Запрос.УстановитьПараметр("ИмяОбъекта", ИмяОбъекта); + Запрос.УстановитьПараметр("ИмяОбъекта", ИменаОбработок); Запрос.УстановитьПараметр("ВидыДополнительныхОтчетовИОбработок", ВидыДополнительныхОтчетовИОбработок); - Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); - - Если Не ЭтоОтчет Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ТаблицаСправочника.Вид", "НЕ ТаблицаСправочника.Вид"); // не локализуется - КонецЕсли; + Запрос.УстановитьПараметр("Ссылка", Ссылки); Запрос.Текст = ТекстЗапроса; @@ -2975,19 +2984,18 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); КонецПопытки; - #Если ТолстыйКлиентОбычноеПриложение Тогда - Попытка - УдалитьФайлы(РезультатРегистрации.ИмяОбъекта); - Исключение - ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при получении регистрационных данных: - |Ошибка при удалении временного файла ""%1"": - |%2'"), - РезультатРегистрации.ИмяОбъекта, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ЗаписатьПредупреждение(Объект.Ссылка, ТекстПредупреждения); - КонецПопытки; - #КонецЕсли +#Если ТолстыйКлиентОбычноеПриложение Тогда + Попытка + УдалитьФайлы(РезультатРегистрации.ИмяОбъекта); + Исключение + ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не был удален временный файл ""%1"" по причине: + |%2'"), + РезультатРегистрации.ИмяОбъекта, + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьПредупреждение(Объект.Ссылка, ТекстПредупреждения); + КонецПопытки; +#КонецЕсли Если ИнформацияОбОшибке <> Неопределено Тогда Если ПараметрыРегистрации.ЭтоОтчет Тогда ТекстОшибки = НСтр("ru = 'Невозможно подключить дополнительный отчет из файла. @@ -2997,9 +3005,9 @@ |Возможно, она не подходит для этой версии программы.'"); КонецЕсли; ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + НСтр("ru = 'Техническая информация:'") + Символы.ПС; - РезультатРегистрации.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + РезультатРегистрации.КраткоеПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); РезультатРегистрации.ТекстОшибки = ТекстОшибки + РезультатРегистрации.КраткоеПредставлениеОшибки; - ЗаписатьОшибку(Объект.Ссылка, ТекстОшибки + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ЗаписатьОшибку(Объект.Ссылка, ТекстОшибки + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат; ИначеЕсли ПараметрыРегистрации.ЭтоОтчет И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервиса/Module.bsl index bed239467..ce8d21ccb 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервиса/Module.bsl @@ -449,7 +449,7 @@ Задания, Разделы, СправочникиИДокументы, НастройкиРасположенияКоманд, ВариантыДополнительногоОтчета, Ответственный); Исключение - ТекстИсключения = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстИсключения = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПоставляемаяОбработка = Справочники.ПоставляемыеДополнительныеОтчетыИОбработки.ПолучитьСсылку(ОписаниеИнсталляции.Идентификатор); ОбработатьОшибкуУстановкиДополнительнойОбработкиВОбластьДанных( ПоставляемаяОбработка, ОписаниеИнсталляции.Инсталляция, ТекстИсключения); @@ -742,7 +742,7 @@ ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - ТекстИсключения = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстИсключения = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Если Не ПустаяСтрока(ТекстИсключения) Тогда diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс/Module.bsl index 9cc3a1df1..6c3d5a73d 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс/Module.bsl @@ -6,6 +6,25 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// Возвращает текущую (используемую вызывающим кодом) версию интерфейса сообщений +// +// Возвращаемое значение: +// Строка +// +Функция Версия() Экспорт + + Возврат "1.0.0.2"; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + #Область СлужебныеПроцедурыИФункции // Возвращает пространство имен текущей (используемой вызывающим кодом) версии интерфейса сообщений. @@ -26,17 +45,6 @@ КонецФункции -// Возвращает текущую (используемую вызывающим кодом) версию интерфейса сообщений -// -// Возвращаемое значение: -// Строка -// -Функция Версия() Экспорт - - Возврат "1.0.0.2"; - -КонецФункции - // Возвращает название программного интерфейса сообщений // // Возвращаемое значение: diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаПовтИсп/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаПовтИсп/Module.bsl index 8f9d403ac..f13cb9c9e 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаПовтИсп/Module.bsl @@ -26,6 +26,7 @@ Результат.Добавить("ИмяОбъекта"); Результат.Добавить("Версия"); Результат.Добавить("Вид"); + Результат.Добавить("ПометкаУдаления"); Возврат Новый ФиксированныйМассив(Результат); diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl index 3689cc5b3..6dc5efbe6 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl @@ -485,7 +485,10 @@ Процедура ВыполнитьОткрытиеПечатнойФормы(ВыполняемаяКоманда, Форма, ОбъектыНазначения) Экспорт СтандартнаяОбработка = Истина; - ДополнительныеОтчетыИОбработкиКлиентПереопределяемый.ПередВыполнениемКомандыПечатиВнешнейПечатнойФормы(ОбъектыНазначения, СтандартнаяОбработка); + // АПК:222-выкл Для обратной совместимости. + ДополнительныеОтчетыИОбработкиКлиентПереопределяемый.ПередВыполнениемКомандыПечатиВнешнейПечатнойФормы( + ОбъектыНазначения, СтандартнаяОбработка); + // АПК:222-вкл Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда МодульУправлениеПечатьюСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюСлужебныйКлиент"); МодульУправлениеПечатьюСлужебныйКлиент.ВыполнитьОткрытиеПечатнойФормы( diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентПереопределяемый/Module.bsl index 50ba6683d..990c9dce1 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентПереопределяемый/Module.bsl @@ -8,6 +8,9 @@ #Область ПрограммныйИнтерфейс +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать УправлениеПечатьюПереопределяемый.ПриОпределенииНастроекПечати // Выполняет дополнительные действия перед формированием печатной формы. // // Параметры: @@ -20,3 +23,5 @@ КонецПроцедуры #КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl b/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl index f842f65a8..035fc7e4a 100644 --- a/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl +++ b/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl @@ -491,7 +491,16 @@ ЗначенияОтбора = СтрРазделить(ЗначениеИзСписка.Значение, Символы.ПС, Ложь); КонецЕсли; Для Каждого ЗначениеОтбора Из ЗначенияОтбора Цикл - НовоеЗначение.Добавить(ЗначениеОтбора); + Если ВРег(КлючСтруктурыОтбора) = ВРег("Пользователь") Тогда + Попытка + НовоеЗначение.Добавить(ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( + Новый УникальныйИдентификатор(ЗначениеОтбора))); + Исключение + НовоеЗначение.Добавить(ЗначениеОтбора); + КонецПопытки; + Иначе + НовоеЗначение.Добавить(ЗначениеОтбора); + КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; diff --git a/SSL/src/CommonModules/ЗагрузкаДанныхИзФайла/Module.bsl b/SSL/src/CommonModules/ЗагрузкаДанныхИзФайла/Module.bsl index ee72ce562..b5258f9cc 100644 --- a/SSL/src/CommonModules/ЗагрузкаДанныхИзФайла/Module.bsl +++ b/SSL/src/CommonModules/ЗагрузкаДанныхИзФайла/Module.bsl @@ -69,7 +69,7 @@ Позиция = Позиция + 1; КонецЦикла; ИначеЕсли ТипЗнч(ВнутренняяТаблица) = Тип("Строка") Тогда - Объект = Метаданные.НайтиПоПолномуИмени(ВнутренняяТаблица); // ОбъектМетаданныхСправочник, ОбъектМетаданныхДокумент + Объект = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ВнутренняяТаблица); // ОбъектМетаданныхСправочник, ОбъектМетаданныхДокумент Для каждого Колонка Из Объект.Реквизиты Цикл Если ИзвлекатьНеВсеКолонки И СписокКолонокДляИзвлечения.Найти(Колонка.Имя) = Неопределено Тогда Продолжить; @@ -166,8 +166,27 @@ #КонецОбласти -#Область СлужебныеПроцедурыИФункции +#Область СлужебныйПрограммныйИнтерфейс +// Загружает значения дополнительных реквизитов и свойств из строки таблицы загружаемых данных в элемент справочника. +// Вызывается из процедуры ЗагрузитьИзФайла при прикладной загрузке данных в модуле менеджере объекта. +// +// Параметры: +// СсылкаНаОбъект - СправочникСсылка - ссылка на объект куда загружаются данные +// СтрокаТаблицы - СтрокаТаблицыЗначений: см. ЗагрузкаДанныхИзФайла.ОписаниеЗагружаемыхДанныхДляСправочников +// +Процедура ЗагрузитьЗначенияСвойствИзФайла(СсылкаНаОбъект, СтрокаТаблицы) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); + МодульУправлениеСвойствамиСлужебный.ЗагрузитьЗначенияСвойствИзФайла(СсылкаНаОбъект, СтрокаТаблицы); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции Процедура ДобавитьСтатистическуюИнформацию(ИмяОперации, Значение = 1, Комментарий = "") Экспорт @@ -199,7 +218,7 @@ // Функция ПараметрыЗагрузкиИзФайла(ИмяОбъектаСопоставления) Экспорт - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаСопоставления); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъектаСопоставления); ОбязательныеКолонкиМакета = Новый Массив; Для каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл diff --git a/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl b/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl index bc89758ed..9d22838da 100644 --- a/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl @@ -137,7 +137,7 @@ Попытка ЗаметкаОбъект.Записать(); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(НСтр("ru = 'Заметки пользователя.Изменение пометки удаления'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, ЗаметкаОбъект.Метаданные(), ЗаметкаОбъект.Ссылка, ТекстОшибки); КонецПопытки; diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl index 6e0bc6f8f..5d1983f99 100644 --- a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl @@ -95,13 +95,72 @@ Результат = Новый Массив; Для Каждого ОписаниеРеквизита Из ОписанияРеквизитов Цикл - ЧастиСтроки = СтрРазделить(ОписаниеРеквизита, ";", Ложь); - ИмяРеквизита = ЧастиСтроки[0]; - Результат.Добавить(ИмяРеквизита); + Если ЗначениеЗаполнено(ОписаниеРеквизита.Имя) Тогда + Результат.Добавить(ОписаниеРеквизита.Имя); + КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции +// Возвращает свойства нового расширенного описания блокируемого реквизита +// для использования в функциях ПолучитьБлокируемыеРеквизитыОбъекта модулей менеджеров объектов. +// +// Возвращаемое значение: +// Структура: +// * Имя - Строка - имя реквизита, например, "Объект.Автор", "ПриниматьВыручкуОбщейСуммой". +// Можно оставлять пустым для описания группы отдельно от реквизита. +// * ЭлементыФормы - Массив из Строка - имена элементов формы, соответствующие реквизиту. +// Требуется заполнить, когда их нельзя определить по пути элемента формы к имени реквизита, +// например, "ПриниматьВыручкуОбщейСуммойПереключатель". +// * Предупреждение - Строка - текст предупреждения о последствиях разблокировки, который выводится +// в форме разблокировки над реквизитом или группой реквизитов, если указана. +// * Группа - Строка - имя группы реквизитов, которая используется в форме разблокировки. +// Не требуется заполнять, когда реквизит выводится отдельно. +// Не учитывается при вызове из группового изменения реквизитов, кроме ОбщаяНадпись. +// * ПредставлениеГруппы - Строка - представление группы реквизитов, которое выводится в форме разблокировки. +// Не требуется заполнять, когда реквизит выводится отдельно. +// Не учитывается при вызове из группового изменения реквизитов, кроме ОбщаяНадпись. +// * ПредупреждениеГруппы - Строка - текст предупреждения о последствиях разблокировки, который выводится +// в форме разблокировки только над группой реквизитов, если указана. +// * Предупреждение - Строка - текст предупреждения о последствиях разблокировки, который выводится +// в форме разблокировки над реквизитом или группой реквизитов, если указана. +// +Функция НовыйБлокируемыйРеквизит() Экспорт + + Результат = Новый Структура; + Результат.Вставить("Имя", ""); + Результат.Вставить("ЭлементыФормы", Новый Массив); + Результат.Вставить("Группа", ""); + Результат.Вставить("ПредставлениеГруппы", ""); + Результат.Вставить("Предупреждение", ""); + Результат.Вставить("ПредупреждениеГруппы", ""); + + Возврат Результат; + +КонецФункции + +#Область ДляВызоваИзДругихПодсистем + +// Описывает типы значений массива, возвращаемого из функции +// ПолучитьБлокируемыеРеквизитыОбъекта модулей менеджеров объектов. +// +// Возвращаемое значение: +// Строка - в формате "ИмяРеквизита[;ИмяЭлементаФормы,...][;ИмяГруппы]", где +// ИмяРеквизита - имя реквизита объекта, +// ИмяЭлементаФормы - имя элемента формы, связанного с реквизитом. +// Например: "Объект.Автор", "ПолеАвтор". +// ИмяГруппы - имя группы реквизитов, отображаемой в форме разблокировки. +// +// см. НовыйБлокируемыйРеквизит +// +Функция ОписаниеБлокируемогоРеквизита() Экспорт + + Возврат ""; + +КонецФункции + +#КонецОбласти + #КонецОбласти diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl index 228b617cf..8279009ee 100644 --- a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl @@ -10,6 +10,11 @@ // Разрешает редактирование заблокированных элементов формы, связанных с заданными реквизитами. // +// Если в объекте используется прикладная форма РазблокированиеРеквизитов, она будет открыта +// с параметрами Ссылка и ЗаблокированныеРеквизиты, а в описании оповещения закрытия формы +// должно быть возвращено Истина (все реквизиты разблокированы) или Массив имен реквизитов. +// При возврате Неопределено считается, что разблокировка не выполнялась. +// // Параметры: // Форма - ФормаКлиентскогоПриложения // - РасширениеУправляемойФормыДляОбъектов - форма, в которой требуется разрешить @@ -38,27 +43,38 @@ Возврат; КонецЕсли; - СинонимыРеквизитов = Новый Массив; + ОписаниеБлокируемыхРеквизитов = Новый Массив; Для Каждого ОписаниеРеквизита Из Форма.ПараметрыЗапретаРедактированияРеквизитов Цикл - Если ЗаблокированныеРеквизиты.Найти(ОписаниеРеквизита.ИмяРеквизита) <> Неопределено Тогда - СинонимыРеквизитов.Добавить(ОписаниеРеквизита.Представление); + Если ЗаблокированныеРеквизиты.Найти(ОписаниеРеквизита.ИмяРеквизита) = Неопределено Тогда + Продолжить; КонецЕсли; + Описание = Новый Структура("ИмяРеквизита, Представление, РедактированиеРазрешено, + |БлокируемыеЭлементы, ПравоРедактирования, ЭтоРеквизитФормы"); + ЗаполнитьЗначенияСвойств(Описание, ОписаниеРеквизита); + ОписаниеБлокируемыхРеквизитов.Добавить(Описание); КонецЦикла; - МассивСсылок = Новый Массив; - МассивСсылок.Добавить(Форма.Объект.Ссылка); + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ЗаблокированныеРеквизиты", ЗаблокированныеРеквизиты); + ПараметрыФормы.Вставить("Ссылка", Форма.Объект.Ссылка); + + ИмяФормыРазблокировки = Форма.ПолноеИмяФормыРазблокированияРеквизитов; + Если Не ЗначениеЗаполнено(ИмяФормыРазблокировки) Тогда + ИмяФормыРазблокировки = "ОбщаяФорма.РазблокированиеРеквизитов"; + ПараметрыФормы.Вставить("ПолноеИмяОбъекта", Форма.ПолноеИмяОбъектаРазблокированияРеквизитов); + ПараметрыФормы.Вставить("ОписаниеБлокируемыхРеквизитов", ОписаниеБлокируемыхРеквизитов); + КонецЕсли; Параметры = Новый Структура; Параметры.Вставить("Форма", Форма); Параметры.Вставить("ЗаблокированныеРеквизиты", ЗаблокированныеРеквизиты); Параметры.Вставить("ОбработкаПродолжения", ОбработкаПродолжения); - ПроверитьСсылкиНаОбъект( - Новый ОписаниеОповещения("РазрешитьРедактированиеРеквизитовОбъектаПослеПроверкиСсылок", - ЗапретРедактированияРеквизитовОбъектовСлужебныйКлиент, Параметры), - МассивСсылок, - СинонимыРеквизитов); + ОписаниеОповещения = Новый ОписаниеОповещения("РазрешитьРедактированиеРеквизитовОбъектаПослеЗакрытияФормы", + ЗапретРедактированияРеквизитовОбъектовСлужебныйКлиент, Параметры); + + ОткрытьФорму(ИмяФормыРазблокировки, ПараметрыФормы, , , , , ОписаниеОповещения); КонецПроцедуры @@ -102,79 +118,6 @@ КонецПроцедуры -// Спрашивает у пользователя подтверждение на включение редактирования реквизитов -// и проверяет, есть ли ссылки на объект в информационной базе. -// -// Параметры: -// ОбработкаПродолжения - ОписаниеОповещения - оповещение, которое вызывается после проверки. -// В обработку оповещения передается параметр типа Булево: -// Истина - ссылок не обнаружено или пользователь решил разрешить редактирование, -// Ложь - видимых заблокированных реквизитов нет или -// ссылки обнаружены и пользователь отказался от продолжения. -// МассивСсылок - Массив - значения: -// * Ссылка - искомые ссылки в различных объектах. -// СинонимыРеквизитов - Массив - значения: -// * Строка - синонимы реквизитов, которые показываются пользователю. -// -Процедура ПроверитьСсылкиНаОбъект(Знач ОбработкаПродолжения, Знач МассивСсылок, Знач СинонимыРеквизитов) Экспорт - - ЗаголовокДиалога = НСтр("ru = 'Разрешение редактирования реквизитов'"); - - РеквизитыПредставление = ""; - Для Каждого СинонимРеквизита Из СинонимыРеквизитов Цикл - РеквизитыПредставление = РеквизитыПредставление + СинонимРеквизита + "," + Символы.ПС; - КонецЦикла; - РеквизитыПредставление = Лев(РеквизитыПредставление, СтрДлина(РеквизитыПредставление) - 2); - - Если СинонимыРеквизитов.Количество() > 1 Тогда - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для того чтобы не допустить рассогласования данных в программе, - |следующие реквизиты не доступны для редактирования: - |%1. - | - |Перед тем, как разрешить их редактирование, рекомендуется оценить последствия, - |проверив все места использования этого элемента в программе. - |Поиск мест использования может занять длительное время.'"), - РеквизитыПредставление); - Иначе - Если МассивСсылок.Количество() = 1 Тогда - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для того чтобы не допустить рассогласования данных в программе, - |реквизит %1 не доступен для редактирования. - | - |Перед тем, как разрешить его редактирование, рекомендуется оценить последствия, - |проверив все места использования ""%2"" в программе. - |Поиск мест использования может занять длительное время.'"), - РеквизитыПредставление, МассивСсылок[0]); - Иначе - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для того чтобы не допустить рассогласования данных в программе, - |реквизит %1 не доступен для редактирования. - | - |Перед тем, как разрешить его редактирование, рекомендуется оценить последствия, - |проверив все места использования выбранных элементов (%2) в программе. - |Поиск мест использования может занять длительное время.'"), - РеквизитыПредставление, МассивСсылок.Количество()); - КонецЕсли; - КонецЕсли; - - Параметры = Новый Структура; - Параметры.Вставить("МассивСсылок", МассивСсылок); - Параметры.Вставить("СинонимыРеквизитов", СинонимыРеквизитов); - Параметры.Вставить("ЗаголовокДиалога", ЗаголовокДиалога); - Параметры.Вставить("ОбработкаПродолжения", ОбработкаПродолжения); - - Кнопки = Новый СписокЗначений; - Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Проверить и разрешить'")); - Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Отмена'")); - - ПоказатьВопрос( - Новый ОписаниеОповещения("ПроверитьСсылкиНаОбъектПослеПодтвержденияПроверки", - ЗапретРедактированияРеквизитовОбъектовСлужебныйКлиент, Параметры), - ТекстВопроса, Кнопки, , КодВозвратаДиалога.Да, ЗаголовокДиалога); - -КонецПроцедуры - // Устанавливает разрешенность редактирования для тех реквизитов, описание которых подготовлено в форме. // Используется, когда доступность элементов формы изменяется самостоятельно, без // использования функции УстановитьДоступностьЭлементовФормы. @@ -280,4 +223,156 @@ КонецПроцедуры +#Область ДляВызоваИзДругихПодсистем + +// Для вызова из обработки ГрупповоеИзменениеРеквизитов. +// +// Параметры: +// Параметры - см. НовыеПараметрыРазрешитьРедактированиеРеквизитовОбъектов +// +Процедура РазрешитьРедактированиеРеквизитовОбъектов(Параметры) Экспорт + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ГрупповоеИзменениеОбъектов", Истина); + ПараметрыФормы.Вставить("ЗаблокированныеРеквизиты", Параметры.ЗаблокированныеРеквизиты); + ПараметрыФормы.Вставить("АдресСсылокНаОбъекты", Параметры.АдресСсылокНаОбъекты); + ПараметрыФормы.Вставить("ОтмеченныйРеквизит", Параметры.ОтмеченныйРеквизит); + + ПолноеИмяСтандартнойФормы = "ОбщаяФорма.РазблокированиеРеквизитов"; + ПолноеИмяФормы = Параметры.ПолноеИмяОбъекта + ".Форма.РазблокированиеРеквизитов"; + + Попытка + // АПК:65-выкл - №404.1 - метод ПолучитьФорму используется только для проверки совместимости формы. + ПолученнаяФорма = ПолучитьФорму(ПолноеИмяФормы); + // АПК:65-вкл + Если Не ПолученнаяФорма.Параметры.Свойство("ГрупповоеИзменениеОбъектов") Тогда + ПолноеИмяФормы = ПолноеИмяСтандартнойФормы; + КонецЕсли; + Исключение + ПолноеИмяФормы = ПолноеИмяСтандартнойФормы; + КонецПопытки; + + Если ПолноеИмяФормы = ПолноеИмяСтандартнойФормы Тогда + ПараметрыФормы.Вставить("ПолноеИмяОбъекта", Параметры.ПолноеИмяОбъекта); + КонецЕсли; + + ОткрытьФорму(ПолноеИмяФормы, ПараметрыФормы, , , , , Параметры.ОбработкаРезультата); + +КонецПроцедуры + +// Конструктор параметров для процедуры РазрешитьРедактированиеРеквизитовОбъектов. +// +// Возвращаемое значение: +// Структура: +// * ОбработкаРезультата - ОписаниеОповещения - в случае разблокировки в Результат +// возвращается Истина (разблокированы все реквизиты) +// или массив строк имен разблокированных реквизитов. +// +// * ПолноеИмяОбъекта - Строка - например, "Документ.Заказ". +// +// * ЗаблокированныеРеквизиты - Массив из Строка - имена реквизитов, которые указаны +// в функции ПолучитьБлокируемыеРеквизитыОбъекта модуля менеджера объекта. +// +// * ОтмеченныйРеквизит - Строка - реквизит который нужно отметить при открытии. +// Если не указан отмечаются все реквизиты. +// +// * АдресСсылокНаОбъекты - Строка - адрес временного хранилища с массивом ссылок, +// если будет пустым, тогда кнопка проверки использования будет скрыта. +// +Функция НовыеПараметрыРазрешитьРедактированиеРеквизитовОбъектов() Экспорт + + НовыеПараметры = Новый Структура; + НовыеПараметры.Вставить("ОбработкаРезультата"); + НовыеПараметры.Вставить("ПолноеИмяОбъекта", ""); + НовыеПараметры.Вставить("ЗаблокированныеРеквизиты", Новый Массив); + НовыеПараметры.Вставить("ОтмеченныйРеквизит", ""); + НовыеПараметры.Вставить("АдресСсылокНаОбъекты", ""); + + Возврат НовыеПараметры; + +КонецФункции + +#КонецОбласти + +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Вместо этого вызова теперь проверка в общей форме РазблокированиеРеквизитов +// с длительной операцией. В собственной форме РазблокированиеРеквизитов следует +// самостоятельно реализовать проверку использования объектов с длительной операцией. +// +// Спрашивает у пользователя подтверждение на включение редактирования реквизитов +// и проверяет, есть ли ссылки на объект в информационной базе. +// +// Параметры: +// ОбработкаПродолжения - ОписаниеОповещения - оповещение, которое вызывается после проверки. +// В обработку оповещения передается параметр типа Булево: +// Истина - ссылок не обнаружено или пользователь решил разрешить редактирование, +// Ложь - видимых заблокированных реквизитов нет или +// ссылки обнаружены и пользователь отказался от продолжения. +// МассивСсылок - Массив - значения: +// * Ссылка - искомые ссылки в различных объектах. +// СинонимыРеквизитов - Массив - значения: +// * Строка - синонимы реквизитов, которые показываются пользователю. +// +Процедура ПроверитьСсылкиНаОбъект(Знач ОбработкаПродолжения, Знач МассивСсылок, Знач СинонимыРеквизитов) Экспорт + + ЗаголовокДиалога = НСтр("ru = 'Разрешение редактирования реквизитов'"); + + РеквизитыПредставление = ""; + Для Каждого СинонимРеквизита Из СинонимыРеквизитов Цикл + РеквизитыПредставление = РеквизитыПредставление + СинонимРеквизита + "," + Символы.ПС; + КонецЦикла; + РеквизитыПредставление = Лев(РеквизитыПредставление, СтрДлина(РеквизитыПредставление) - 2); + + Если СинонимыРеквизитов.Количество() > 1 Тогда + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для того чтобы не допустить рассогласования данных в программе, + |следующие реквизиты не доступны для редактирования: + |%1. + | + |Перед тем, как разрешить их редактирование, рекомендуется оценить последствия, + |проверив все места использования этого элемента в программе. + |Поиск мест использования может занять длительное время.'"), + РеквизитыПредставление); + Иначе + Если МассивСсылок.Количество() = 1 Тогда + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для того чтобы не допустить рассогласования данных в программе, + |реквизит %1 не доступен для редактирования. + | + |Перед тем, как разрешить его редактирование, рекомендуется оценить последствия, + |проверив все места использования ""%2"" в программе. + |Поиск мест использования может занять длительное время.'"), + РеквизитыПредставление, МассивСсылок[0]); + Иначе + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для того чтобы не допустить рассогласования данных в программе, + |реквизит %1 не доступен для редактирования. + | + |Перед тем, как разрешить его редактирование, рекомендуется оценить последствия, + |проверив все места использования выбранных элементов (%2) в программе. + |Поиск мест использования может занять длительное время.'"), + РеквизитыПредставление, МассивСсылок.Количество()); + КонецЕсли; + КонецЕсли; + + Параметры = Новый Структура; + Параметры.Вставить("МассивСсылок", МассивСсылок); + Параметры.Вставить("СинонимыРеквизитов", СинонимыРеквизитов); + Параметры.Вставить("ЗаголовокДиалога", ЗаголовокДиалога); + Параметры.Вставить("ОбработкаПродолжения", ОбработкаПродолжения); + + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Проверить и разрешить'")); + Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Отмена'")); + + ПоказатьВопрос( + Новый ОписаниеОповещения("ПроверитьСсылкиНаОбъектПослеПодтвержденияПроверки", + ЗапретРедактированияРеквизитовОбъектовСлужебныйКлиент, Параметры), + ТекстВопроса, Кнопки, , КодВозвратаДиалога.Да, ЗаголовокДиалога); + +КонецПроцедуры + +#КонецОбласти + #КонецОбласти diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовПереопределяемый/Module.bsl index ceb50ff5a..47dccce28 100644 --- a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовПереопределяемый/Module.bsl @@ -11,12 +11,11 @@ // Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность // редактирования реквизитов с помощью экспортной функции ПолучитьБлокируемыеРеквизитыОбъекта. // -// Функция ПолучитьБлокируемыеРеквизитыОбъекта должна возвращать значение Массив - строки в формате -// ИмяРеквизита[;ИмяЭлементаФормы,...], где ИмяРеквизита - имя реквизита объекта, ИмяЭлементаФормы - -// имя элемента формы, связанного с реквизитом. Например: "Объект.Автор", "ПолеАвтор". +// Функция ПолучитьБлокируемыеРеквизитыОбъекта должна возвращать значение типа +// см. ЗапретРедактированияРеквизитовОбъектов.ОписаниеБлокируемогоРеквизита // // Поле надписи, связанное с реквизитом, не блокируется. Если требуется блокировать, -// имя элемента надписи нужно указать после точки с запятой, как написано выше. +// имя элемента надписи нужно указать в описании блокируемого реквизита. // // Параметры: // Объекты - Соответствие из КлючИЗначение: @@ -26,11 +25,17 @@ // Пример: // Объекты.Вставить(Метаданные.Документы.ЗаказПокупателя.ПолноеИмя(), ""); // -// При этом в модуле менеджера документа ЗаказПокупателя размещается код: -// // См. ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами. +// При этом в модуле менеджера объекта размещается код, подобный: +// // См. ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииЗаблокированныхРеквизитов.ЗаблокированныеРеквизиты // Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт // БлокируемыеРеквизиты = Новый Массив; -// БлокируемыеРеквизиты.Добавить("Организация"); // заблокировать редактирование реквизита Организация +// БлокируемыеРеквизиты.Добавить("Организация"); +// БлокируемыеРеквизиты.Добавить("Партнер;Партнер"); +// Реквизит = ЗапретРедактированияРеквизитовОбъектов.НовыйБлокируемыйРеквизит(); +// Реквизит.Имя = "Контрагент"; +// Реквизит.Предупреждение = НСтр("ru = 'Поле не рекомендуется менять, если уже есть введенные документы'"); +// БлокируемыеРеквизиты.Добавить(Реквизит); +// ... // Возврат БлокируемыеРеквизиты; // КонецФункции // @@ -44,9 +49,7 @@ // // Параметры: // ИмяОбъектаМетаданных - Строка - например, "Справочник.Файлы". -// ЗаблокированныеРеквизиты - Массив из Строка - строки в формате "ИмяРеквизита[;ИмяЭлементаФормы,...]", -// где ИмяРеквизита - имя реквизита объекта, ИмяЭлементаФормы - -// имя элемента формы, связанного с реквизитом. Например: "Объект.Автор", "ПолеАвтор". +// ЗаблокированныеРеквизиты - Массив из см. ЗапретРедактированияРеквизитовОбъектов.ОписаниеБлокируемогоРеквизита // Процедура ПриОпределенииЗаблокированныхРеквизитов(ИмяОбъектаМетаданных, ЗаблокированныеРеквизиты) Экспорт diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебный/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебный/Module.bsl index 7cdf0e725..3a7152e67 100644 --- a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебный/Module.bsl @@ -27,41 +27,82 @@ // Процедура ПодготовитьФорму(Форма, Ссылка, ГруппаДляКнопкиЗапрета, ЗаголовокКнопкиЗапрета) Экспорт - ОписаниеТиповСтрока100 = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(100)); + ОписаниеТиповСтрока = Новый ОписаниеТипов("Строка"); ОписаниеТиповБулево = Новый ОписаниеТипов("Булево"); ОписаниеТиповМассив = Новый ОписаниеТипов("СписокЗначений"); // Добавление реквизитов на форму. ДобавляемыеРеквизиты = Новый Массив; - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ПараметрыЗапретаРедактированияРеквизитов", Новый ОписаниеТипов("ТаблицаЗначений"))); - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИмяРеквизита", ОписаниеТиповСтрока100, "ПараметрыЗапретаРедактированияРеквизитов")); - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Представление", ОписаниеТиповСтрока100, "ПараметрыЗапретаРедактированияРеквизитов")); - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("РедактированиеРазрешено", ОписаниеТиповБулево, "ПараметрыЗапретаРедактированияРеквизитов")); - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("БлокируемыеЭлементы", ОписаниеТиповМассив, "ПараметрыЗапретаРедактированияРеквизитов")); - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ПравоРедактирования", ОписаниеТиповБулево, "ПараметрыЗапретаРедактированияРеквизитов")); - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ЭтоРеквизитФормы", ОписаниеТиповБулево, "ПараметрыЗапретаРедактированияРеквизитов")); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ПолноеИмяОбъектаРазблокированияРеквизитов", Новый ОписаниеТипов("Строка"))); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ПолноеИмяФормыРазблокированияРеквизитов", Новый ОписаниеТипов("Строка"))); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ПараметрыЗапретаРедактированияРеквизитов", Новый ОписаниеТипов("ТаблицаЗначений"))); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИмяРеквизита", ОписаниеТиповСтрока, "ПараметрыЗапретаРедактированияРеквизитов")); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Представление", ОписаниеТиповСтрока, "ПараметрыЗапретаРедактированияРеквизитов")); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("РедактированиеРазрешено", ОписаниеТиповБулево, "ПараметрыЗапретаРедактированияРеквизитов")); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("БлокируемыеЭлементы", ОписаниеТиповМассив, "ПараметрыЗапретаРедактированияРеквизитов")); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ПравоРедактирования", ОписаниеТиповБулево, "ПараметрыЗапретаРедактированияРеквизитов")); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ЭтоРеквизитФормы", ОписаниеТиповБулево, "ПараметрыЗапретаРедактированияРеквизитов")); Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); МетаданныеОбъекта = Ссылка.Метаданные(); + Форма.ПолноеИмяОбъектаРазблокированияРеквизитов = МетаданныеОбъекта.ПолноеИмя(); + ОбъектМетаданныхФорма = МетаданныеОбъекта.Формы.Найти("РазблокированиеРеквизитов"); + Если ОбъектМетаданныхФорма <> Неопределено Тогда + Форма.ПолноеИмяФормыРазблокированияРеквизитов = ОбъектМетаданныхФорма.ПолноеИмя(); + КонецЕсли; + БлокируемыеРеквизиты = БлокируемыеРеквизитыОбъектаИЭлементыФормы(МетаданныеОбъекта.ПолноеИмя()); ВсеРеквизитыБезПраваРедактирования = Истина; + + ЗаполнитьОписаниеБлокируемыхРеквизитов(Форма.ПараметрыЗапретаРедактированияРеквизитов, + МетаданныеОбъекта, БлокируемыеРеквизиты, ВсеРеквизитыБезПраваРедактирования, Форма); + + ЗаполнитьСвязанныеЭлементы(Форма); + + // Добавление команды и кнопки, если есть права. + Если Пользователи.РолиДоступны("РедактированиеРеквизитовОбъектов") + И ПравоДоступа("Редактирование", МетаданныеОбъекта) + И НЕ ВсеРеквизитыБезПраваРедактирования Тогда + + // Добавление команды + Команда = Форма.Команды.Добавить("РазрешитьРедактированиеРеквизитовОбъекта"); + Команда.Заголовок = ?(ПустаяСтрока(ЗаголовокКнопкиЗапрета), НСтр("ru = 'Разрешить редактирование реквизитов'"), ЗаголовокКнопкиЗапрета); + Команда.Действие = "Подключаемый_РазрешитьРедактированиеРеквизитовОбъекта"; + Команда.Картинка = БиблиотекаКартинок.РазрешитьРедактированиеРеквизитовОбъекта; + Команда.ИзменяетСохраняемыеДанные = Истина; + + // Добавление кнопки + РодительскаяГруппа = ?(ГруппаДляКнопкиЗапрета <> Неопределено, ГруппаДляКнопкиЗапрета, Форма.КоманднаяПанель); + Кнопка = Форма.Элементы.Добавить("РазрешитьРедактированиеРеквизитовОбъекта", Тип("КнопкаФормы"), РодительскаяГруппа); + Кнопка.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; + Кнопка.ИмяКоманды = "РазрешитьРедактированиеРеквизитовОбъекта"; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции. + +// Для процедуры ПодготовитьФорму. +Процедура ЗаполнитьОписаниеБлокируемыхРеквизитов(Описание, МетаданныеОбъекта, БлокируемыеРеквизиты, + ВсеРеквизитыБезПраваРедактирования, Форма = Неопределено) Экспорт + РеквизитыФормы = Неопределено; Для Каждого БлокируемыйРеквизит Из БлокируемыеРеквизиты Цикл - - ОписаниеРеквизита = Форма.ПараметрыЗапретаРедактированияРеквизитов.Добавить(); - - ИнформацияОБлокируемомРеквизите = СтрРазделить(БлокируемыйРеквизит, ";", Ложь); - ОписаниеРеквизита.ИмяРеквизита = ИнформацияОБлокируемомРеквизите[0]; - - Если ИнформацияОБлокируемомРеквизите.Количество() > 1 Тогда - БлокируемыеЭлементы = СтрРазделить(ИнформацияОБлокируемомРеквизите[1], ",", Ложь); - Для Каждого БлокируемыйЭлемент Из БлокируемыеЭлементы Цикл - ОписаниеРеквизита.БлокируемыеЭлементы.Добавить(СокрЛП(БлокируемыйЭлемент)); - КонецЦикла; + Если Не ЗначениеЗаполнено(БлокируемыйРеквизит.Имя) Тогда + Продолжить; КонецЕсли; + ОписаниеРеквизита = Описание.Добавить(); + + ОписаниеРеквизита.ИмяРеквизита = БлокируемыйРеквизит.Имя; + + Для Каждого БлокируемыйЭлемент Из БлокируемыйРеквизит.ЭлементыФормы Цикл + ОписаниеРеквизита.БлокируемыеЭлементы.Добавить(СокрЛП(БлокируемыйЭлемент)); + КонецЦикла; + ЭтоПланСчетов = ОбщегоНазначения.ЭтоПланСчетов(МетаданныеОбъекта); ЕстьСтандартныеТабличныеЧасти = ЭтоПланСчетов Или ОбщегоНазначения.ЭтоПланВидовРасчета(МетаданныеОбъекта); @@ -89,6 +130,9 @@ КонецЕсли; Если МетаданныеРеквизитаИлиТабличнойЧасти = Неопределено Тогда + Если Форма = Неопределено Тогда + Продолжить; + КонецЕсли; Если РеквизитыФормы = Неопределено Тогда РеквизитыФормы = Новый Соответствие; Для Каждого РеквизитФормы Из Форма.ПолучитьРеквизиты() Цикл @@ -116,32 +160,8 @@ КонецЕсли; КонецЦикла; - ЗаполнитьСвязанныеЭлементы(Форма); - - // Добавление команды и кнопки, если есть права. - Если Пользователи.РолиДоступны("РедактированиеРеквизитовОбъектов") - И ПравоДоступа("Редактирование", МетаданныеОбъекта) - И НЕ ВсеРеквизитыБезПраваРедактирования Тогда - - // Добавление команды - Команда = Форма.Команды.Добавить("РазрешитьРедактированиеРеквизитовОбъекта"); - Команда.Заголовок = ?(ПустаяСтрока(ЗаголовокКнопкиЗапрета), НСтр("ru = 'Разрешить редактирование реквизитов'"), ЗаголовокКнопкиЗапрета); - Команда.Действие = "Подключаемый_РазрешитьРедактированиеРеквизитовОбъекта"; - Команда.Картинка = БиблиотекаКартинок.РазрешитьРедактированиеРеквизитовОбъекта; - Команда.ИзменяетСохраняемыеДанные = Истина; - - // Добавление кнопки - РодительскаяГруппа = ?(ГруппаДляКнопкиЗапрета <> Неопределено, ГруппаДляКнопкиЗапрета, Форма.КоманднаяПанель); - Кнопка = Форма.Элементы.Добавить("РазрешитьРедактированиеРеквизитовОбъекта", Тип("КнопкаФормы"), РодительскаяГруппа); - Кнопка.ТолькоВоВсехДействиях = Истина; - Кнопка.ИмяКоманды = "РазрешитьРедактированиеРеквизитовОбъекта"; - КонецЕсли; - КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Вспомогательные процедуры и функции. - // Для процедуры ПодготовитьФорму. // Дополняет массив блокируемых элементов формы связанными элементами. // @@ -192,7 +212,7 @@ // ИмяОбъекта - Строка - полное имя объекта метаданных. // // Возвращаемое значение: -// Массив из Строка +// Массив из см. ЗапретРедактированияРеквизитовОбъектов.НовыйБлокируемыйРеквизит // Функция БлокируемыеРеквизитыОбъектаИЭлементыФормы(ИмяОбъекта) Экспорт @@ -203,8 +223,27 @@ Возврат Результат; КонецЕсли; - Результат = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИмяОбъекта).ПолучитьБлокируемыеРеквизитыОбъекта(); - ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииЗаблокированныхРеквизитов(ИмяОбъекта, Результат); + БлокируемыеРеквизиты = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИмяОбъекта).ПолучитьБлокируемыеРеквизитыОбъекта(); + ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииЗаблокированныхРеквизитов(ИмяОбъекта, БлокируемыеРеквизиты); + + Для Каждого БлокируемыйРеквизит Из БлокируемыеРеквизиты Цикл + Если ТипЗнч(БлокируемыйРеквизит) <> Тип("Структура") Тогда + ЧастиСтроки = СтрРазделить(БлокируемыйРеквизит, ";"); + НовыйБлокируемыйРеквизит = ЗапретРедактированияРеквизитовОбъектов.НовыйБлокируемыйРеквизит(); + НовыйБлокируемыйРеквизит.Имя = СокрЛП(ЧастиСтроки[0]); + Если ЧастиСтроки.Количество() > 1 Тогда + Для Каждого ИмяЭлемента Из СтрРазделить(ЧастиСтроки[1], ",", Ложь) Цикл + НовыйБлокируемыйРеквизит.ЭлементыФормы.Добавить(СокрЛП(ИмяЭлемента)); + КонецЦикла; + КонецЕсли; + Если ЧастиСтроки.Количество() > 2 Тогда + НовыйБлокируемыйРеквизит.Группа = СокрЛП(ЧастиСтроки[2]); + КонецЕсли; + Результат.Добавить(НовыйБлокируемыйРеквизит); + Иначе + Результат.Добавить(БлокируемыйРеквизит); + КонецЕсли; + КонецЦикла; Возврат Результат; diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебныйКлиент/Module.bsl index 7153b9145..27a0c0932 100644 --- a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебныйКлиент/Module.bsl @@ -16,16 +16,29 @@ КонецПроцедуры -Процедура РазрешитьРедактированиеРеквизитовОбъектаПослеПроверкиСсылок(Результат, Параметры) Экспорт +Процедура РазрешитьРедактированиеРеквизитовОбъектаПослеЗакрытияФормы(Результат, Параметры) Экспорт - Если Результат Тогда + РазблокированныеРеквизиты = Неопределено; + + Если Результат = Истина Тогда + РазблокированныеРеквизиты = Параметры.ЗаблокированныеРеквизиты; + ИначеЕсли ТипЗнч(Результат) = Тип("Массив") Тогда + РазблокированныеРеквизиты = Результат; + Иначе + РазблокированныеРеквизиты = Неопределено; + КонецЕсли; + + Если РазблокированныеРеквизиты <> Неопределено Тогда ЗапретРедактированияРеквизитовОбъектовКлиент.УстановитьРазрешенностьРедактированияРеквизитов( - Параметры.Форма, Параметры.ЗаблокированныеРеквизиты); + Параметры.Форма, РазблокированныеРеквизиты); ЗапретРедактированияРеквизитовОбъектовКлиент.УстановитьДоступностьЭлементовФормы(Параметры.Форма); КонецЕсли; + Параметры.Форма = Неопределено; + Если Параметры.ОбработкаПродолжения <> Неопределено Тогда + Параметры.ОбработкаПродолжения = Неопределено; ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения, Результат); КонецЕсли; diff --git a/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl b/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl index 8bf61f7e6..359fa5236 100644 --- a/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl +++ b/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl @@ -330,15 +330,15 @@ Возврат; КонецЕсли; - Отказ = Истина; + ОтказОтСкрытия = Истина; ТаблицаИсключений = НоваяТаблицаИсключений(); - ЗащитаПерсональныхДанныхПереопределяемый.ПередСкрытиемПерсональныхДанныхСубъектов(Субъекты, ТаблицаИсключений, Отказ); + ЗащитаПерсональныхДанныхПереопределяемый.ПередСкрытиемПерсональныхДанныхСубъектов(Субъекты, ТаблицаИсключений, ОтказОтСкрытия); УстановитьПривилегированныйРежим(Истина); СубъектыИсключения = ОбработатьТаблицуИсключений(ТаблицаИсключений, СообщатьОбИсключениях); - Если Отказ Тогда + Если ОтказОтСкрытия Тогда Возврат; КонецЕсли; @@ -410,7 +410,7 @@ УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; @@ -480,11 +480,9 @@ Исключение - ОтменитьТранзакцию(); - + ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииИзменениеНастроекСкрытияПДн(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение НСтр("ru = 'Не удалось изменить настройки скрытия персональных данных.'"); КонецПопытки; @@ -750,40 +748,48 @@ ПараметрыОбновления.ОбработкаЗавершена = Ложь; - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ОбластиПерсональныхДанных.ИмяОбласти КАК ИмяОбласти, - | ОбластиПерсональныхДанных.ИспользованиеСобытийЖурналаРегистрации КАК ИспользованиеСобытийЖурналаРегистрации - |ИЗ - | РегистрСведений.УдалитьОбластиПерсональныхДанных КАК ОбластиПерсональныхДанных"; - - РезультатЗапроса = Запрос.Выполнить(); - Если РезультатЗапроса.Пустой() Тогда - ПараметрыОбновления.ОбработкаЗавершена = Истина; - Возврат; - КонецЕсли; - - НаборЗаписей = РегистрыСведений.ОбластиПерсональныхДанных.СоздатьНаборЗаписей(); - НаборЗаписей.Загрузить(РезультатЗапроса.Выгрузить()); - ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(НаборЗаписей); - + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных(); + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.УдалитьОбластиПерсональныхДанных"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; + Блокировка.Заблокировать(); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ОбластиПерсональныхДанных.ИмяОбласти КАК ИмяОбласти, + | ОбластиПерсональныхДанных.ИспользованиеСобытийЖурналаРегистрации КАК ИспользованиеСобытийЖурналаРегистрации + |ИЗ + | РегистрСведений.УдалитьОбластиПерсональныхДанных КАК ОбластиПерсональныхДанных"; + + РезультатЗапроса = Запрос.Выполнить(); + Если РезультатЗапроса.Пустой() Тогда + ПараметрыОбновления.ОбработкаЗавершена = Истина; + ЗафиксироватьТранзакцию(); + Возврат; + КонецЕсли; + + НаборЗаписей = РегистрыСведений.ОбластиПерсональныхДанных.СоздатьНаборЗаписей(); + НаборЗаписей.Загрузить(РезультатЗапроса.Выгрузить()); + ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(НаборЗаписей); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; ПараметрыОбновления.ОбработкаЗавершена = Истина; КонецПроцедуры -// Определяет объекты, в которых есть процедура ДобавитьКомандыПечати(). -// -// Параметры: -// СписокОбъектов - Массив - список менеджеров объектов. -// -Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт +// см. УправлениеПечатьюПереопределяемый.ПриОпределенииНастроекПечати +Процедура ПриОпределенииНастроекПечати(НастройкиПечати) Экспорт - СписокОбъектов.Добавить(Документы.СогласиеНаОбработкуПерсональныхДанных); + НастройкиПечати.ОбъектыПечати.Добавить(Документы.СогласиеНаОбработкуПерсональныхДанных); КонецПроцедуры - // Параметры: // СписокМакетов - Массив - макеты. // @@ -1138,8 +1144,7 @@ Функция ДнейДоСкрытияПерсональныхДанныхСубъектов() Экспорт - УстановитьПривилегированныйРежим(Истина); - + УстановитьПривилегированныйРежим(Истина); Возврат Константы.ДнейДоСкрытияПерсональныхДанныхСубъектов.Получить(); КонецФункции @@ -1392,7 +1397,7 @@ НоваяКнопка = Форма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ГруппаКнопки); НоваяКнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; НоваяКнопка.ИмяКоманды = НоваяКоманда.Имя; - НоваяКнопка.ТолькоВоВсехДействиях = Истина; + НоваяКнопка.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; УстановитьОтборСписка(Список, НоваяКнопка, ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(Форма.ИмяФормы, "ПоказыватьСоСкрытымиПДн", Ложь)); @@ -1800,36 +1805,81 @@ КонецФункции -Процедура ОбновитьНастройкиСкрытияСубъекта(Субъект, СрокДействияСогласия = Неопределено, Основание = Неопределено, ДнейДоСкрытия = Неопределено) +// Возвращаемое значение: +// ТаблицаЗначений: +// * Субъект - ОпределяемыйТип.СубъектПерсональныхДанных +// * СрокДействияСогласия - Дата +// * Основание - ДокументСсылка.СогласиеНаОбработкуПерсональныхДанных +// - ДокументСсылка.ОтзывСогласияНаОбработкуПерсональныхДанных +// * ДнейДоСкрытия - Число +// +Функция СведенияОСубъектах() - НастройкиСкрытия = НастройкиСкрытияСубъектовПоУмолчанию(); + Результат = Новый ТаблицаЗначений; + Результат.Колонки.Добавить("Субъект"); + Результат.Колонки.Добавить("СрокДействияСогласия"); + Результат.Колонки.Добавить("Основание"); + Результат.Колонки.Добавить("ДнейДоСкрытия"); + Возврат Результат; - Если СрокДействияСогласия = Неопределено Тогда - - Запрос = ЗапросДанныеДействующихСогласий(Субъект); +КонецФункции + +// Параметры: +// Субъекты - Массив из ОпределяемыйТип.СубъектПерсональныхДанных +// - см. СведенияОСубъектах +// +Процедура ОбновитьНастройкиСкрытияСубъектов(Субъекты) + + Если Субъекты.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(Субъекты) = Тип("Массив") Тогда + СведенияОСубъектах = СведенияОСубъектах(); + СведенияОСубъектах.ЗагрузитьКолонку(Субъекты, "Субъект"); + СведенияОСубъектах.Индексы.Добавить("Субъект"); + СубъектыБезСрокаДействияСогласия = Субъекты; + Иначе + СведенияОСубъектах = Субъекты; + СубъектыБезСрокаДействияСогласия = Новый Массив; + Для каждого Субъект Из Субъекты Цикл + Если Субъект.СрокДействияСогласия = Неопределено Тогда + СубъектыБезСрокаДействияСогласия.Добавить(Субъект.Субъект); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если СубъектыБезСрокаДействияСогласия.Количество() > 0 Тогда + Запрос = ЗапросДанныеДействующихСогласий(СубъектыБезСрокаДействияСогласия); Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - СрокДействияСогласия = Выборка.СрокДействия; - Основание = Выборка.ДокументОснование; + Пока Выборка.Следующий() Цикл + Субъект = СведенияОСубъектах.Найти(Выборка.Субъект, "Субъект"); + Если Субъект <> Неопределено Тогда + Субъект.СрокДействияСогласия = Выборка.СрокДействия; + Субъект.Основание = Выборка.ДокументОснование; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Для каждого Субъект Из СведенияОСубъектах Цикл + + Если Субъект.ДнейДоСкрытия = Неопределено Тогда + Субъект.ДнейДоСкрытия = ДнейДоСкрытияПерсональныхДанныхСубъектов(); КонецЕсли; - КонецЕсли; - - Если ДнейДоСкрытия = Неопределено Тогда - ДнейДоСкрытия = ДнейДоСкрытияПерсональныхДанныхСубъектов(); - КонецЕсли; - - Если ЗначениеЗаполнено(СрокДействияСогласия) Тогда - НастройкиСкрытия.ДатаСкрытия = СрокДействияСогласия + ДнейДоСкрытия * 86400; - ИначеЕсли СрокДействияСогласия = Дата(1, 1, 1) Тогда - НастройкиСкрытия.ДатаСкрытия = СрокДействияСогласия; - КонецЕсли; - - НастройкиСкрытия.Основание = Основание; - - ЗаписатьНастройкиСкрытияСубъектов(Субъект, НастройкиСкрытия); - + НастройкиСкрытия = НастройкиСкрытияСубъектовПоУмолчанию(); + Если ЗначениеЗаполнено(Субъект.СрокДействияСогласия) Тогда + НастройкиСкрытия.ДатаСкрытия = Субъект.СрокДействияСогласия + Субъект.ДнейДоСкрытия * 86400; + ИначеЕсли Субъект.СрокДействияСогласия = Дата(1, 1, 1) Тогда + НастройкиСкрытия.ДатаСкрытия = Субъект.СрокДействияСогласия; + КонецЕсли; + + НастройкиСкрытия.Основание = Субъект.Основание; + ЗаписатьНастройкиСкрытияСубъектов(Субъект.Субъект, НастройкиСкрытия); + + КонецЦикла; + КонецПроцедуры Процедура РассчитатьДатуСкрытияПерсональныхДанныхПоОснованиям(Основания) @@ -1844,20 +1894,14 @@ Запрос.УстановитьПараметр("Основания", Основания); Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ - | СубъектыДляСкрытияПерсональныхДанных.Субъект КАК Субъект - |ИЗ - | РегистрСведений.СубъектыДляСкрытияПерсональныхДанных КАК СубъектыДляСкрытияПерсональныхДанных - |ГДЕ - | СубъектыДляСкрытияПерсональныхДанных.Основание В (&Основания)"; + | СубъектыДляСкрытияПерсональныхДанных.Субъект КАК Субъект + |ИЗ + | РегистрСведений.СубъектыДляСкрытияПерсональныхДанных КАК СубъектыДляСкрытияПерсональныхДанных + |ГДЕ + | СубъектыДляСкрытияПерсональныхДанных.Основание В (&Основания)"; - Выборка = Запрос.Выполнить().Выбрать(); - - Пока Выборка.Следующий() Цикл - - ОбновитьНастройкиСкрытияСубъекта(Выборка.Субъект); - ПрежниеСубъекты.Добавить(Выборка.Субъект); - - КонецЦикла; + ПрежниеСубъекты = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Субъект"); + ОбновитьНастройкиСкрытияСубъектов(ПрежниеСубъекты); СубъектыОснований = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(Основания, "Субъект"); ТекущиеСубъекты = ОбщегоНазначения.ВыгрузитьКолонку(СубъектыОснований, "Значение", Истина); @@ -1865,6 +1909,7 @@ ОставшиесяСубъекты = ОбщегоНазначенияКлиентСервер.РазностьМассивов(ТекущиеСубъекты, ПрежниеСубъекты); НастройкиСубъектов = ПрочитатьНастройкиСкрытияСубъектов(ОставшиесяСубъекты); + Субъекты = Новый Массив; Для Каждого СубъектИНастройки Из НастройкиСубъектов Цикл Субъект = СубъектИНастройки.Ключ; @@ -1872,43 +1917,49 @@ Если НастройкиСубъекта.Состояние = Перечисления.СостоянияСубъектовДляСкрытия.СкрытиеОтменено Или НастройкиСубъекта.Состояние = Перечисления.СостоянияСубъектовДляСкрытия.СкрытиеВыполнено Тогда - Продолжить; - - Иначе - - ОбновитьНастройкиСкрытияСубъекта(Субъект); - КонецЕсли; + + Субъекты.Добавить(Субъект); КонецЦикла; + ОбновитьНастройкиСкрытияСубъектов(Субъекты); КонецПроцедуры Процедура ОчиститьСрокСкрытияПерсональныхДанныхСубъектов() - Запрос = Новый Запрос(); - Запрос.Текст = "ВЫБРАТЬ - | СубъектыДляСкрытияПерсональныхДанных.Субъект КАК Субъект - |ИЗ - | РегистрСведений.СубъектыДляСкрытияПерсональныхДанных КАК СубъектыДляСкрытияПерсональныхДанных - |ГДЕ - | СубъектыДляСкрытияПерсональныхДанных.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияСубъектовДляСкрытия.ГотовКСкрытию)"; + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных(); + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.СубъектыДляСкрытияПерсональныхДанных"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; + Блокировка.Заблокировать(); - Результат = Запрос.Выполнить(); - Если Не Результат.Пустой() Тогда - - НаборЗаписей = РегистрыСведений.СубъектыДляСкрытияПерсональныхДанных.СоздатьНаборЗаписей(); - - Выборка = Результат.Выбрать(); - Пока Выборка.Следующий() Цикл + Запрос = Новый Запрос(); + Запрос.Текст = "ВЫБРАТЬ + | СубъектыДляСкрытияПерсональныхДанных.Субъект КАК Субъект + |ИЗ + | РегистрСведений.СубъектыДляСкрытияПерсональныхДанных КАК СубъектыДляСкрытияПерсональныхДанных + |ГДЕ + | СубъектыДляСкрытияПерсональныхДанных.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияСубъектовДляСкрытия.ГотовКСкрытию)"; - НаборЗаписей.Отбор.Субъект.Установить(Выборка.Субъект); - ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(НаборЗаписей, , Истина, Истина); + Результат = Запрос.Выполнить(); + Если Не Результат.Пустой() Тогда - КонецЦикла; - - КонецЕсли; + НаборЗаписей = РегистрыСведений.СубъектыДляСкрытияПерсональныхДанных.СоздатьНаборЗаписей(); + Выборка = Результат.Выбрать(); + Пока Выборка.Следующий() Цикл + НаборЗаписей.Отбор.Субъект.Установить(Выборка.Субъект); + ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(НаборЗаписей, , Истина, Истина); + КонецЦикла; + + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецПроцедуры @@ -1947,20 +1998,27 @@ Запрос = ЗапросДанныеДействующихСогласий(Субъекты); Результат = Запрос.Выполнить(); - Если Не Результат.Пустой() Тогда - - Выборка = Результат.Выбрать(); - Пока Выборка.Следующий() Цикл - - Если Выборка.СрокДействия <> ПустаяДата И Выборка.СрокДействия < ДатаСеанса Тогда - Продолжить; - КонецЕсли; - - ОбновитьНастройкиСкрытияСубъекта(Выборка.Субъект, Выборка.СрокДействия, Выборка.ДокументОснование, ДнейДоСкрытияПДн); - - КонецЦикла; - + Если Результат.Пустой() Тогда + Возврат; КонецЕсли; + + СведенияОСубъектах = СведенияОСубъектах(); + Выборка = Результат.Выбрать(); + Пока Выборка.Следующий() Цикл + + Если Выборка.СрокДействия <> ПустаяДата И Выборка.СрокДействия < ДатаСеанса Тогда + Продолжить; + КонецЕсли; + + Субъект = СведенияОСубъектах.Добавить(); + Субъект.Субъект = Выборка.Субъект; + Субъект.СрокДействияСогласия = Выборка.СрокДействия; + Субъект.Основание = Выборка.ДокументОснование; + Субъект.ДнейДоСкрытия = ДнейДоСкрытияПДн; + + КонецЦикла; + + ОбновитьНастройкиСкрытияСубъектов(СведенияОСубъектах); КонецПроцедуры @@ -1974,6 +2032,7 @@ Возврат; КонецЕсли; + СубъектыКОбновлению = Новый Массив; НастройкиСубъектов = ПрочитатьНастройкиСкрытияСубъектов(Субъекты); Для Каждого КлючИЗначение Из НастройкиСубъектов Цикл Субъект = КлючИЗначение.Ключ; @@ -1982,8 +2041,9 @@ Или НастройкиСубъекта.Состояние = Перечисления.СостоянияСубъектовДляСкрытия.СкрытиеВыполнено Тогда Продолжить; КонецЕсли; - ОбновитьНастройкиСкрытияСубъекта(Субъект); + СубъектыКОбновлению.Добавить(Субъект); КонецЦикла; + ОбновитьНастройкиСкрытияСубъектов(СубъектыКОбновлению); КонецПроцедуры diff --git a/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПереопределяемый/Module.bsl index 3614e61c9..a22c410f8 100644 --- a/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПереопределяемый/Module.bsl @@ -104,10 +104,10 @@ // Субъекты - Массив - ссылки на объекты данных, чьи персональные данные будут скрыты. // ТаблицаИсключений - ТаблицаЗначений - таблица, в которую добавляются субъекты и причины отказа их скрытия. // Состав полей см. в функции ЗащитаПерсональныхДанных.НоваяТаблицаИсключений. -// Отказ - Булево - (по умолчанию Истина) признак отказа от скрытия. Если конфигурация адаптирована к обменам, и -// определены причины отказа от скрытия, то параметру необходимо установить значение Ложь. +// ОтказОтСкрытия - Булево - (по умолчанию Истина) признак отказа от скрытия. Если определены причины отказа +// от скрытия, то параметру необходимо установить значение Ложь. // -Процедура ПередСкрытиемПерсональныхДанныхСубъектов(Субъекты, ТаблицаИсключений, Отказ) Экспорт +Процедура ПередСкрытиемПерсональныхДанныхСубъектов(Субъекты, ТаблицаИсключений, ОтказОтСкрытия) Экспорт diff --git a/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПовтИсп/Module.bsl b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПовтИсп/Module.bsl index c653dca04..6d861a1e1 100644 --- a/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПовтИсп/Module.bsl @@ -58,7 +58,7 @@ ИменаРеквизитовСодержащихСубъект = Новый Массив; МетаданныеПоТипамСубъекта = ЗащитаПерсональныхДанныхПовтИсп.МетаданныеПоТипамСубъекта(); - МетаданныеИсточника = Метаданные.НайтиПоПолномуИмени(ИмяИсточника); // ОбъектМетаданныхСправочник + МетаданныеИсточника = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяИсточника); // ОбъектМетаданныхСправочник ИсточникЭтоРегистр = ОбщегоНазначения.ЭтоРегистр(МетаданныеИсточника); ТипыСсылкиИсточника = ?(ИсточникЭтоРегистр, Новый Массив, МетаданныеИсточника.СтандартныеРеквизиты.Ссылка.Тип.Типы()); ИсточникИмеетВладельца = ОбщегоНазначения.ЭтоСправочник(МетаданныеИсточника) И МетаданныеИсточника.Владельцы.Количество() > 0; diff --git a/SSL/src/CommonModules/ИнтеграцияПодсистемБСП/Module.bsl b/SSL/src/CommonModules/ИнтеграцияПодсистемБСП/Module.bsl index f655bf422..5139fe2c6 100644 --- a/SSL/src/CommonModules/ИнтеграцияПодсистемБСП/Module.bsl +++ b/SSL/src/CommonModules/ИнтеграцияПодсистемБСП/Module.bsl @@ -9,6 +9,7 @@ #Область ПрограммныйИнтерфейс #Область ДляВызоваИзДругихПодсистем + // Определяет события, на которые могут подписаться другие библиотеки. // // Возвращаемое значение: @@ -40,6 +41,9 @@ События.Вставить("ПриДобавленииСерверныхОповещений", Ложь); События.Вставить("ПриПериодическомПолученииДанныхКлиентаНаСервере", Ложь); + // Банки + События.Вставить("ПриОпределенииНастроекЗагрузкиКлассификатораБанков"); + // ВариантыОтчетов События.Вставить("ПриОпределенииНастроекВариантовОтчетов", Ложь); События.Вставить("ПриОпределенииРазделовСВариантамиОтчетов", Ложь); @@ -53,6 +57,7 @@ // ГрупповоеИзменениеОбъектов События.Вставить("ПриОпределенииОбъектовСРедактируемымиРеквизитами", Ложь); + События.Вставить("ПриОпределенииРедактируемыхРеквизитовОбъекта", Ложь); // ДатыЗапретаИзменений События.Вставить("ПриЗаполненииРазделовДатЗапретаИзменения", Ложь); @@ -80,15 +85,16 @@ // ОбменДанными События.Вставить("ПриНастройкеПодчиненногоУзлаРИБ", Ложь); - //ОбновлениеВерсииИБ - События.Вставить("ПриДобавленииОбработчиковОбновления", Ложь); // Для обратной совместимости с БТС 1.2.2. + // ОбновлениеВерсииИБ + События.Вставить("ПриДобавленииОбработчиковОбновления", Ложь); // Для совместимости с БТС 1.2.2. События.Вставить("ПослеОбновленияИнформационнойБазы", Ложь); События.Вставить("ПриПолученииПриоритетаОбновления", Ложь); События.Вставить("ПриЗаполненииОбъектовПланируемыхКУдалению", Ложь); // Печать + События.Вставить("ПриОпределенииНастроекПечати", Ложь); События.Вставить("ПриПодготовкеСпискаМакетовВФорматеОфисныхДокументовФормируемыхНаСервере", Ложь); - События.Вставить("ПриОпределенииОбъектовСКомандамиПечати", Ложь); + События.Вставить("ПриОпределенииОбъектовСКомандамиПечати", Ложь); // Устарела. Следует использовать ПриОпределенииНастроекПечати. События.Вставить("ПередДобавлениемКомандПечати", Ложь); События.Вставить("ПриПолученииНастроекСпискаКомандПечати", Ложь); События.Вставить("ПриПечати", Ложь); @@ -127,6 +133,10 @@ События.Вставить("ПриВключенииИспользованияПрофилейБезопасности", Ложь); События.Вставить("ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам", Ложь); + // РаботаСПочтовымиСообщениями + События.Вставить("ПередПолучениемСтатусовПисем", Ложь); + События.Вставить("ПослеПолученияСтатусовПисем", Ложь); + // РаботаСФайлами События.Вставить("ПриОпределенииОбъектовИсключенияСинхронизацииФайлов", Ложь); @@ -195,7 +205,7 @@ Подписки.ПриЗаполненииТаблицыПараметровИБ = Истина; Подписки.ПриОпределенииИсключенийНеразделенныхДанных = Истина; Подписки.ПриОпределенииПсевдонимаПользователя = Истина; - + // РаботаВМоделиСервиса_ОбменСообщениями Подписки.ПриОпределенииОбработчиковКаналовСообщений = Истина; Подписки.РегистрацияИнтерфейсовПринимаемыхСообщений = Истина; @@ -535,7 +545,7 @@ // Переопределяет исключения неразделенных данных для подсистемы ТехнологияСервиса // // Параметры: -// Исключения - Массив Из ОбъектМетаданных - исключения. +// Исключения - Массив из ОбъектМетаданных - исключения. // Процедура ПриОпределенииИсключенийНеразделенныхДанных(Исключения) Экспорт @@ -736,6 +746,16 @@ МодульЭлектроннаяПодписьСлужебный.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда + МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); + МодульРассылкаОтчетов.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); + КонецЕсли; + КонецПроцедуры // См. ОчередьЗаданийПереопределяемый.ПриОпределенииИспользованияРегламентныхЗаданий. @@ -792,11 +812,6 @@ МодульЭлектроннаяПодписьСлужебный.ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики); КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодписьСервисаDSS") Тогда - МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); - МодульСервисКриптографииDSSСлужебный.ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики); - КонецЕсли; - КонецПроцедуры #КонецОбласти @@ -883,13 +898,15 @@ // См. РаботаСКлассификаторамиПереопределяемый.ПриЗагрузкеКлассификатора. Процедура ПриЗагрузкеКлассификатора(Идентификатор, Версия, Адрес, Обработан, ДополнительныеПараметры) Экспорт - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") + И Метаданные.Обработки.Найти("ЗагрузкаКлассификатораБанков") <> Неопределено Тогда МодульЗагрузкаКлассификатораБанков = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗагрузкаКлассификатораБанков"); МодульЗагрузкаКлассификатораБанков.ПриЗагрузкеКлассификатора(Идентификатор, Версия, Адрес, Обработан, ДополнительныеПараметры); КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") + И Метаданные.Обработки.Найти("ЗагрузкаКурсовВалют") <> Неопределено Тогда МодульЗагрузкаКурсовВалют = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗагрузкаКурсовВалют"); МодульЗагрузкаКурсовВалют.ПриЗагрузкеКлассификатора(Идентификатор, Версия, Адрес, Обработан, ДополнительныеПараметры); @@ -1187,11 +1204,6 @@ МодульВариантыОтчетов.ПриДобавленииПереименованийОбъектовМетаданных(Итог); КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВызовОнлайнПоддержки") Тогда - МодульВызовОнлайнПоддержки = ОбщегоНазначения.ОбщийМодуль("ВызовОнлайнПоддержки"); - МодульВызовОнлайнПоддержки.ПриДобавленииПереименованийОбъектовМетаданных(Итог); - КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриДобавленииПереименованийОбъектовМетаданных(Итог); @@ -1662,8 +1674,13 @@ Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриДобавленииПараметровРаботыКлиентаПриЗапуске Тогда - МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + МодульТехнологияСервиса = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервиса"); + ВерсияБТС = МодульТехнологияСервиса.ВерсияБиблиотеки(); + Если Параметры.ДоступноИспользованиеРазделенныхДанных + Или ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияБТС, "2.0.11.0") >= 0 Тогда + МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); + МодульИнтеграцияПодсистемБТС.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + КонецЕсли; КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ИнформацияПриЗапуске") Тогда @@ -1734,8 +1751,13 @@ КонецЕсли; Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриДобавленииПараметровРаботыКлиентаПриЗапуске Тогда - МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + МодульИнтернетПоддержкаПользователейКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователейКлиентСервер"); + ВерсияБИП = МодульИнтернетПоддержкаПользователейКлиентСервер.ВерсияБиблиотеки(); + Если Параметры.ДоступноИспользованиеРазделенныхДанных + Или ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияБИП, "2.6.5.0") >= 0 Тогда + МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); + МодульИнтеграцияПодсистемБИП.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); + КонецЕсли; КонецЕсли; КонецПроцедуры @@ -1894,7 +1916,11 @@ МодульУчетОригиналовПервичныхДокументов = ОбщегоНазначения.ОбщийМодуль("УчетОригиналовПервичныхДокументов"); МодульУчетОригиналовПервичныхДокументов.ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты); КонецЕсли; - + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений") Тогда + МодульШаблоныСообщенийСлужебный = ОбщегоНазначения.ОбщийМодуль("ШаблоныСообщенийСлужебный"); + МодульШаблоныСообщенийСлужебный.ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты); + КонецЕсли; КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииСерверныхОповещений @@ -1975,6 +2001,15 @@ #КонецОбласти +#Область Банки + +// См. РаботаСБанкамиПереопределяемый.ПриОпределенииНастроекЗагрузкиКлассификатораБанков +Процедура ПриОпределенииНастроекЗагрузкиКлассификатораБанков(Настройки) Экспорт + +КонецПроцедуры + +#КонецОбласти + #Область ВариантыОтчетов // См. ВариантыОтчетовПереопределяемый.ПриОпределенииНастроек. @@ -2073,6 +2108,11 @@ МодульРезультатыПроверкиУчета = ОбщегоНазначения.ОбщийМодуль("Отчеты.РезультатыПроверкиУчета"); МодульРезультатыПроверкиУчета.ПриНастройкеВариантовОтчетов(Настройки); КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда + МодульКонтрольРассылкиОтчетов = ОбщегоНазначения.ОбщийМодуль("Отчеты.КонтрольРассылкиОтчетов"); + МодульКонтрольРассылкиОтчетов.ПриНастройкеВариантовОтчетов(Настройки); + КонецЕсли; Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриНастройкеВариантовОтчетов Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); @@ -2134,11 +2174,18 @@ МодульСервисКриптографииDSSСлужебный.ПриОпределенииОбъектовСКомандамиОтчетов(Объекты); КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда + МодульКонтрольРассылкиОтчетов = ОбщегоНазначения.ОбщийМодуль("Отчеты.КонтрольРассылкиОтчетов"); + МодульКонтрольРассылкиОтчетов.ПриОпределенииОбъектовСКомандамиОтчетов(Объекты); + КонецЕсли; + КонецПроцедуры // См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов. Процедура ПередДобавлениемКомандОтчетов(КомандыОтчетов, Параметры, СтандартнаяОбработка) Экспорт + Обработки.ЖурналРегистрации.ПередДобавлениемКомандОтчетов(КомандыОтчетов, Параметры, СтандартнаяОбработка); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОтчетОДвиженияхДокумента") Тогда МодульДвиженияДокумента = ОбщегоНазначения.ОбщийМодуль("Отчеты.ДвиженияДокумента"); МодульДвиженияДокумента.ПередДобавлениемКомандОтчетов(КомандыОтчетов, Параметры, СтандартнаяОбработка); @@ -2332,6 +2379,26 @@ МодульСервисКриптографииDSSСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульУправлениеПечатью.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); + КонецЕсли; + +КонецПроцедуры + +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииРедактируемыхРеквизитовОбъекта. +Процедура ПриОпределенииРедактируемыхРеквизитовОбъекта(Объект, РедактируемыеРеквизиты, НередактируемыеРеквизиты) Экспорт + + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииРедактируемыхРеквизитовОбъекта Тогда + МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); + МодульИнтеграцияПодсистемБТС.ПриОпределенииРедактируемыхРеквизитовОбъекта(Объект, РедактируемыеРеквизиты, НередактируемыеРеквизиты); + КонецЕсли; + + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииРедактируемыхРеквизитовОбъекта Тогда + МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); + МодульИнтеграцияПодсистемБИП.ПриОпределенииРедактируемыхРеквизитовОбъекта(Объект, РедактируемыеРеквизиты, НередактируемыеРеквизиты); + КонецЕсли; + КонецПроцедуры #КонецОбласти @@ -2966,11 +3033,6 @@ МодульВнешниеКомпонентыСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВызовОнлайнПоддержки") Тогда - МодульВызовОнлайнПоддержки = ОбщегоНазначения.ОбщийМодуль("ВызовОнлайнПоддержки"); - МодульВызовОнлайнПоддержки.ПриДобавленииОбработчиковОбновления(Обработчики); - КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы"); МодульГрафикиРаботы.ПриДобавленииОбработчиковОбновления(Обработчики); @@ -3061,6 +3123,11 @@ МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда + МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); + МодульРассылкаОтчетов.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда МодульРегламентныеЗаданияСлужебный = ОбщегоНазначения.ОбщийМодуль("РегламентныеЗаданияСлужебный"); @@ -3221,24 +3288,24 @@ #Область Печать -// См. УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати. -Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт - +// См. УправлениеПечатьюПереопределяемый.ПриОпределенииНастроекПечати. +Процедура ПриОпределенииНастроекПечати(НастройкиПечати) Экспорт + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); - МодульЗащитаПерсональныхДанных.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов); + МодульЗащитаПерсональныхДанных.ПриОпределенииНастроекПечати(НастройкиПечати); КонецЕсли; - - Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииОбъектовСКомандамиПечати Тогда + + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииНастроекПечати Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов); + МодульИнтеграцияПодсистемБТС.ПриОпределенииНастроекПечати(НастройкиПечати); КонецЕсли; - Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииОбъектовСКомандамиПечати Тогда + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииНастроекПечати Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов); + МодульИнтеграцияПодсистемБИП.ПриОпределенииНастроекПечати(НастройкиПечати); КонецЕсли; - + КонецПроцедуры // См. УправлениеПечатьюПереопределяемый.ПередДобавлениемКомандПечати. @@ -4474,6 +4541,30 @@ #КонецОбласти +#Область РаботаСПочтовымиСообщениями + +// См. РаботаСПочтовымиСообщениямиПереопределяемый.ПередПолучениемСтатусовПисем +Процедура ПередПолучениемСтатусовПисем(ИдентификаторыПисем) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда + МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); + МодульРассылкаОтчетов.ПередПолучениемСтатусовПисем(ИдентификаторыПисем); + КонецЕсли; + +КонецПроцедуры + +// См. РаботаСПочтовымиСообщениямиПереопределяемый.ПослеПолученияСтатусовПисем +Процедура ПослеПолученияСтатусовПисем(СтатусыДоставки) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда + МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); + МодульРассылкаОтчетов.ПослеПолученияСтатусовПисем(СтатусыДоставки); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + #Область РаботаСФайлами // См. РаботаСФайламиСлужебный.ПриОпределенииОбъектовИсключенияСинхронизацииФайлов. @@ -4670,6 +4761,11 @@ МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриПолученииПредопределенныхНаборовСвойств(Наборы); КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + МодульДополнительныеОтчетыИОбработки.ПриПолученииПредопределенныхНаборовСвойств(Наборы); + КонецЕсли; Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриПолученииПредопределенныхНаборовСвойств Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); @@ -5307,4 +5403,25 @@ #КонецОбласти +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать ИнтеграцияПодсистемБСП.ПриОпределенииНастроекПечати(). +// См. УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати. +// +Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт + + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииОбъектовСКомандамиПечати Тогда + МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); + МодульИнтеграцияПодсистемБТС.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов); + КонецЕсли; + + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииОбъектовСКомандамиПечати Тогда + МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); + МодульИнтеграцияПодсистемБИП.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ИнтеграцияПодсистемБСПКлиент/Module.bsl b/SSL/src/CommonModules/ИнтеграцияПодсистемБСПКлиент/Module.bsl index 8381d6f23..48d27e308 100644 --- a/SSL/src/CommonModules/ИнтеграцияПодсистемБСПКлиент/Module.bsl +++ b/SSL/src/CommonModules/ИнтеграцияПодсистемБСПКлиент/Module.bsl @@ -8,6 +8,8 @@ #Область ПрограммныйИнтерфейс +#Область ДляВызоваИзДругихПодсистем + #Область ОбработчикиСобытийБТС // Обработка программных событий, возникающих в подсистемах БТС. // Только для вызовов из библиотеки БТС в БСП. @@ -19,25 +21,9 @@ // Процедура ПриОпределенииПодписокНаСобытияБТС(Подписки) Экспорт - // ИнформационныйЦентр - Подписки.ИнтеграцияВызовОнлайнПоддержкиКлиентОбработкаОповещения = Истина; КонецПроцедуры -#Область ИнформационныйЦентр - -// См. ВызовОнлайнПоддержкиКлиент.ОбработкаОповещения. -Процедура ИнтеграцияВызовОнлайнПоддержкиКлиентОбработкаОповещения(ИмяСобытия, Элемент) Экспорт - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ВызовОнлайнПоддержки") Тогда - МодульВызовОнлайнПоддержкиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ВызовОнлайнПоддержкиКлиент"); - МодульВызовОнлайнПоддержкиКлиент.ОбработкаОповещения(ИмяСобытия, Элемент); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - #КонецОбласти #Область ОбработчикиСобытийБИП @@ -56,6 +42,19 @@ #КонецОбласти +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Для корректной работы интеграции с 1С-Коннект следует использовать подсистему "Интеграция с Коннект" +// Библиотеки Интернет-поддержки пользователей версии 2.4.2 и выше. +// +Процедура ИнтеграцияВызовОнлайнПоддержкиКлиентОбработкаОповещения(ИмяСобытия, Элемент) Экспорт + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -133,7 +132,7 @@ // Обработка ключа запуска ВыполнитьОбновлениеИЗавершитьРаботу. Параметры.Модули.Добавить(Новый Структура("Модуль, Номер", ОбновлениеИнформационнойБазыКлиент, 5)); - // Смена пароля при входе, если требуется. + // Смена пароля или проверка сложности старого пароля при входе, если требуется. Параметры.Модули.Добавить(Новый Структура("Модуль, Номер", ПользователиСлужебныйКлиент, 3)); Если ИнтеграцияПодсистемБСПКлиентПовтИсп.ПодпискиБТС().ПередНачаломРаботыСистемы Тогда diff --git a/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl b/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl index b02fe7326..3e4c3d877 100644 --- a/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl +++ b/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl @@ -381,7 +381,7 @@ Если НосительМакетов.Метаданные().Макеты.Найти(ЛокализованноеИмяМакета) = Неопределено Тогда ТекстСообщения = ТекстСообщения + НСтр("ru = 'Макет с таким именем не существует.'") + Символы.ПС; КонецЕсли; - ТекстСообщения = ТекстСообщения + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстСообщения = ТекстСообщения + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации( НСтр("ru = 'Информация при запуске'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, ТекстСообщения); diff --git a/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl b/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl index 6e03b3a5f..604433796 100644 --- a/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl +++ b/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl @@ -826,7 +826,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать полученные данные календаря. |%1.'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение ТекстСообщения; КонецПопытки; diff --git a/SSL/src/CommonModules/КалендарныеГрафикиСлужебный/Module.bsl b/SSL/src/CommonModules/КалендарныеГрафикиСлужебный/Module.bsl index f485a181b..94ee07366 100644 --- a/SSL/src/CommonModules/КалендарныеГрафикиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/КалендарныеГрафикиСлужебный/Module.bsl @@ -113,7 +113,7 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Календарные графики.Распространение производственных календарей'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; УстановитьПривилегированныйРежим(Истина); МодульРаботаВМоделиСервиса.ВыйтиИзОбластиДанных(); diff --git a/SSL/src/CommonModules/КонструкторФормул/Module.bsl b/SSL/src/CommonModules/КонструкторФормул/Module.bsl index cd7c9bc3f..a3ed7d168 100644 --- a/SSL/src/CommonModules/КонструкторФормул/Module.bsl +++ b/SSL/src/CommonModules/КонструкторФормул/Module.bsl @@ -31,6 +31,8 @@ // * МестоРазмещенияСписка - ГруппаФормы // - ТаблицаФормы // - ФормаКлиентскогоПриложения +// * ИспользоватьФоновыйПоиск - Булево +// * КоличествоСимволовДляНачалаПоиска - Число // * ИмяСписка - Строка // * КоллекцииПолей - Массив из ДоступныеПоляКомпоновкиДанных // * МестоРазмещенияСтрокиПоиска - ГруппаФормы @@ -39,7 +41,7 @@ // * ПодсказкаВводаСтрокиПоиска - Строка // * ОбработчикиСписка - Структура // * ВключатьГруппыВПутьКДанным - Булево -// * СкобкиИдентификаторов - Булево +// * СкобкиИдентификаторов - Булев // * СкобкиПредставлений - Булево // * ИсточникиДоступныхПолей - ТаблицаЗначений - используется в случае, когда требуется изменить состав подчиненных // полей у любого поля: @@ -154,6 +156,17 @@ КонецПроцедуры +// Универсальный обработчик в клиентском контексте. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// Параметр - Произвольный +// ДополнительныеПараметры - см. КонструкторФормулКлиент.ПараметрыОбработчика +// +Процедура ОбработчикКонструктораФормул(Форма, Параметр, ДополнительныеПараметры) Экспорт + КонструкторФормулСлужебный.ОбработчикКонструктораФормул(Форма, Параметр, ДополнительныеПараметры); +КонецПроцедуры + // Подготавливает стандартный список операторов требуемых видов. // // Параметры: diff --git a/SSL/src/CommonModules/КонструкторФормулКлиент/Module.bsl b/SSL/src/CommonModules/КонструкторФормулКлиент/Module.bsl index bdf2280a7..0d9c17d4e 100644 --- a/SSL/src/CommonModules/КонструкторФормулКлиент/Module.bsl +++ b/SSL/src/CommonModules/КонструкторФормулКлиент/Module.bsl @@ -173,9 +173,18 @@ // Процедура СтрокаПоискаИзменениеТекстаРедактирования(Форма, Элемент, Текст, СтандартнаяОбработка) Экспорт - Форма[Элемент.Имя] = Текст; + АктуализироватьИмяСтрокиПоиска(Форма, Элемент.Имя); + + Форма[Форма.ИмяТекущейСтрокиПоиска] = Текст; + Форма.ОтключитьОбработчикОжидания("Подключаемый_ВыполнитьПоискВСпискеПолей"); - Форма.ПодключитьОбработчикОжидания("Подключаемый_ВыполнитьПоискВСпискеПолей", 0.5, Истина); + Форма.ОтключитьОбработчикОжидания("Подключаемый_НачатьПоискВСпискеПолей"); + ПараметрыПодключенногоСпискаПолей = ПараметрыПодключенногоСпискаПолей(Форма, Форма.ИмяТекущейСтрокиПоиска); + Если ПараметрыПодключенногоСпискаПолей.ИспользоватьФоновыйПоиск Тогда + Форма.ПодключитьОбработчикОжидания("Подключаемый_НачатьПоискВСпискеПолей", 0.5, Истина); + Иначе + Форма.ПодключитьОбработчикОжидания("Подключаемый_ВыполнитьПоискВСпискеПолей", 0.5, Истина); + КонецЕсли; КонецПроцедуры @@ -183,12 +192,25 @@ // // Параметры: // Форма - ФормаКлиентскогоПриложения - владелец списка. -// Элемент - ПолеФормы - строка поиска. -// СтандартнаяОбработка - Булево - если Ложь, стандартное действие выполнено не будет. +// Элемент - КнопкаФормы - кнопка очистки. +// УдалитьСтандартнаяОбработка - Булево - параметр устарел // -Процедура СтрокаПоискаОчистка(Форма, Элемент, СтандартнаяОбработка) Экспорт +Процедура СтрокаПоискаОчистка(Форма, Элемент, УдалитьСтандартнаяОбработка = Неопределено) Экспорт + + АктуализироватьИмяСтрокиПоиска(Форма, Элемент.Имя); - СтрокаПоискаИзменениеТекстаРедактирования(Форма, Элемент, "", СтандартнаяОбработка); + ПодключенныйСписокПолей = ПараметрыПодключенногоСпискаПолей(Форма, Форма.ИмяТекущейСтрокиПоиска); + + Если ПодключенныйСписокПолей.ИспользоватьФоновыйПоиск Тогда + ДополнительныеПараметры = ПараметрыОбработчика(); + ДополнительныеПараметры.ВыполнитьНаСервере = Истина; + ДополнительныеПараметры.КлючОперации = "ОчиститьСтрокуПоиска"; + Форма.Подключаемый_ОбработчикКонструктораФормулКлиент(Элемент.Имя, ДополнительныеПараметры); + Элемент = Форма.Элементы[СтрЗаменить(Элемент.Имя, "Очистка", "")]; + Элемент.ОбновитьТекстРедактирования(); + КонецЕсли; + + СтрокаПоискаИзменениеТекстаРедактирования(Форма, Элемент, "", УдалитьСтандартнаяОбработка); КонецПроцедуры @@ -239,6 +261,169 @@ КонецФункции +// Запуск фонового поиска +// Параметры: +// Форма - ФормаКлиентскогоПриложения - форма в которой производится поиск. +// +Процедура НачатьПоискВСпискеПолей(Форма) Экспорт + + ИмяСтрокиПоиска = Форма.ИмяТекущейСтрокиПоиска; + ПодключенныйСписокПолей = ПараметрыПодключенногоСпискаПолей(Форма, Форма.ИмяТекущейСтрокиПоиска); + + Отбор = Форма[Форма.ИмяТекущейСтрокиПоиска]; + ДлинаСтрокиОтбора = СтрДлина(Отбор); + + Если ДлинаСтрокиОтбора <> 0 И ДлинаСтрокиОтбора >= ПодключенныйСписокПолей.КоличествоСимволовДляНачалаПоиска Тогда + Форма.Элементы[ИмяСтрокиПоиска+"Очистка"].Картинка = БиблиотекаКартинок.ДлительнаяОперация16; + КонецЕсли; + + ДополнительныеПараметры = ПараметрыОбработчика(); + ДополнительныеПараметры.ВыполнитьНаСервере = Истина; + ДополнительныеПараметры.КлючОперации = "ЗапуститьФоновыйПоискВСпискеПолей"; + + ДлительнаяОперация = Неопределено; + + Форма.Подключаемый_ОбработчикКонструктораФормулКлиент(ДлительнаяОперация, ДополнительныеПараметры); + + Если ДлительнаяОперация <> Неопределено Тогда + ПараметрыЗавершения = Новый Структура("Форма, ИдентификаторЗадания", Форма, ДлительнаяОперация.ИдентификаторЗадания); + + ОповещениеЗавершения = Новый ОписаниеОповещения("ЗавершениеПоискаВСпискеПолей", ЭтотОбъект, ПараметрыЗавершения); + ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("ОбработкаПоискаВСпискеПолей", ЭтотОбъект, Форма); + + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Форма); + ПараметрыОжидания.ТекстСообщения = НСтр("ru = 'Поиск полей'"); + ПараметрыОжидания.ОповещениеПользователя.Показать = Ложь; + ПараметрыОжидания.ВыводитьОкноОжидания = Ложь; + ПараметрыОжидания.ВыводитьСообщения = Ложь; + ПараметрыОжидания.ОповещениеОПрогрессеВыполнения = ОповещениеОПрогрессеВыполнения; + ПараметрыОжидания.Интервал = 1; + + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеЗавершения, ПараметрыОжидания); + КонецЕсли; +КонецПроцедуры + +// Обработчик завершения поиска в списке полей. +// +// Параметры: +// Результат - см. ДлительныеОперацииКлиент.ОжидатьЗавершение.ОповещениеОЗавершении.Результат. +// ПараметрыЗавершения - Структура: +// * Форма - ФормаКлиентскогоПриложения +// * ИдентификаторЗадания - УникальныйИдентификатор - идентификатор фонового задания. +// +Процедура ЗавершениеПоискаВСпискеПолей(Результат, ПараметрыЗавершения) Экспорт + + ИдентификаторЗадания = ПараметрыЗавершения.ИдентификаторЗадания; + Форма = ПараметрыЗавершения.Форма; + + СоответствиеЗаданий = ПолучитьИзВременногоХранилища(Форма.АдресОписанияДлительнойОперации); + Для Каждого Задание Из СоответствиеЗаданий Цикл + Если Задание.Значение = ИдентификаторЗадания Тогда + ИмяСтрокиПоиска = Задание.Ключ; + Прервать; + КонецЕсли; + КонецЦикла; + + Если ИмяСтрокиПоиска = Неопределено Тогда + Возврат; + КонецЕсли; + + Форма.Элементы[ИмяСтрокиПоиска+"Очистка"].Картинка = БиблиотекаКартинок.ПолеВводаОчистить; + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Результат.Статус = "Ошибка" Тогда + ВызватьИсключение Результат.КраткоеПредставлениеОшибки; + КонецЕсли; + + Если Результат.Сообщения <> Неопределено Тогда + ОбработатьСообщения(Форма, Результат.Сообщения, ИдентификаторЗадания); + КонецЕсли; + + ОбработатьРезультатПоиска(Форма, Результат.АдресРезультата, ИдентификаторЗадания); + +КонецПроцедуры + +// Обработка поиска в списке полей. +// +// Параметры: +// Результат - см. ДлительныеОперацииКлиент.ОжидатьЗавершение.ОповещениеОЗавершении.Результат +// Форма - ФормаКлиентскогоПриложения - форма в которой производиться поиск +// +Процедура ОбработкаПоискаВСпискеПолей(Результат, Форма) Экспорт + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Результат.Статус = "Ошибка" Тогда + ВызватьИсключение Результат.КраткоеПредставлениеОшибки; + КонецЕсли; + + ИдентификаторЗадания = Результат.ИдентификаторЗадания; + + ИмяСтрокиПоиска = ""; + СоответствиеЗаданий = ПолучитьИзВременногоХранилища(Форма.АдресОписанияДлительнойОперации); + Для Каждого Задание Из СоответствиеЗаданий Цикл + Если Задание.Значение = ИдентификаторЗадания Тогда + ИмяСтрокиПоиска = Задание.Ключ; + Прервать; + КонецЕсли; + КонецЦикла; + + Если Результат.Статус = "Выполняется" Тогда + Если ЗначениеЗаполнено(ИмяСтрокиПоиска) Тогда + Форма.Элементы[ИмяСтрокиПоиска+"Очистка"].Картинка = БиблиотекаКартинок.ДлительнаяОперация16; + ПодключенныйСписокПолей = ПараметрыПодключенногоСпискаПолей(Форма, ИмяСтрокиПоиска); + + ДлинаСтрокиОтбора = СтрДлина(Форма[ИмяСтрокиПоиска]); + + Если ДлинаСтрокиОтбора < ПодключенныйСписокПолей.КоличествоСимволовДляНачалаПоиска Тогда + Форма.Элементы[ИмяСтрокиПоиска+"Очистка"].Картинка = БиблиотекаКартинок.ПолеВводаОчистить; + Возврат; + Иначе + Форма.Элементы[ИмяСтрокиПоиска+"Очистка"].Картинка = БиблиотекаКартинок.ДлительнаяОперация16; + КонецЕсли; + КонецЕсли; + + Если Результат.Сообщения <> Неопределено Тогда + ОбработатьСообщения(Форма, Результат.Сообщения, ИдентификаторЗадания); + КонецЕсли; + Иначе + Если ЗначениеЗаполнено(ИмяСтрокиПоиска) Тогда + Форма.Элементы[ИмяСтрокиПоиска+"Очистка"].Картинка = БиблиотекаКартинок.ПолеВводаОчистить; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Универсальный обработчик конструктора формул. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// Параметр - Произвольный +// ДополнительныеПараметры - см. ПараметрыОбработчика +// +Процедура ОбработчикКонструктораФормул(Форма, Параметр, ДополнительныеПараметры) Экспорт + Если ДополнительныеПараметры = Неопределено Тогда + ДополнительныеПараметры = ПараметрыОбработчика(); + КонецЕсли; +КонецПроцедуры + +// Конструктор дополнительных параметров для универсальных обработчиков конструктора формул. +// +// Возвращаемое значение: +// Структура: +// * ВыполнитьНаСервере - Булево - выполнить запуск серверного универсального обработчика. +// * КлючОперации - Строка +// +Функция ПараметрыОбработчика() Экспорт + Параметры = Новый Структура; + Параметры.Вставить("ВыполнитьНаСервере", Ложь); + Параметры.Вставить("КлючОперации"); + Возврат Параметры; +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -265,6 +450,60 @@ КонецФункции +Процедура ОбработатьСообщения(Форма, Сообщения, ИдентификаторЗадания) + ДополнительныеПараметры = ПараметрыОбработчика(); + ДополнительныеПараметры.КлючОперации = "ОбработатьСообщениеПоиска"; + ДополнительныеПараметры.ВыполнитьНаСервере = Истина; + + СтруктураПараметра = Новый Структура("Сообщения, ИдентификаторЗадания"); + СтруктураПараметра.Сообщения = Сообщения; + СтруктураПараметра.ИдентификаторЗадания = ИдентификаторЗадания; + + Форма.Подключаемый_ОбработчикКонструктораФормулКлиент(СтруктураПараметра, ДополнительныеПараметры); +КонецПроцедуры + +Процедура ОбработатьРезультатПоиска(Форма, АдресРезультата, ИдентификаторЗадания) + ДополнительныеПараметры = ПараметрыОбработчика(); + ДополнительныеПараметры.КлючОперации = "ОбработатьРезультатПоиска"; + ДополнительныеПараметры.ВыполнитьНаСервере = Истина; + + СтруктураПараметра = Новый Структура("АдресРезультата, ИдентификаторЗадания"); + СтруктураПараметра.АдресРезультата = АдресРезультата; + СтруктураПараметра.ИдентификаторЗадания = ИдентификаторЗадания; + + Форма.Подключаемый_ОбработчикКонструктораФормулКлиент(СтруктураПараметра, ДополнительныеПараметры); +КонецПроцедуры + +Функция ПараметрыПодключенногоСпискаПолей(Форма, ИмяРеквизита) + ИмяСпискаПолей = ИмяРеквизитаСпискаПолей(ИмяРеквизита); + Если СтрЗаканчиваетсяНа(ИмяСпискаПолей, "Очистка") Тогда + ИмяСпискаПолей = СтрЗаменить(ИмяСпискаПолей+" ", "Очистка ", ""); + КонецЕсли; + + ОтборСтрок = Новый Структура("ИмяСпискаПолей", ИмяСпискаПолей); + СтрокаСпискаПолей = Форма.ПодключенныеСпискиПолей.НайтиСтроки(ОтборСтрок); + ПодключенныйСписокПолей = СтрокаСпискаПолей[0]; + Возврат ПодключенныйСписокПолей; +КонецФункции + +Функция ИмяРеквизитаСпискаПолей(ИмяСтрокиПоискаСпискаПолей) + + Результат = СтрЗаменить(ИмяСтрокиПоискаСпискаПолей, "СтрокаПоиска", ""); + + Возврат Результат; + +КонецФункции + +Процедура АктуализироватьИмяСтрокиПоиска(Форма, Имя) + УдаляемоеОкончание = "Очистка"; + Если СтрЗаканчиваетсяНа(Имя, УдаляемоеОкончание) Тогда + ДлинаИмени = СтрДлина(Имя) - СтрДлина(УдаляемоеОкончание); + Форма.ИмяТекущейСтрокиПоиска = Лев(Имя, ДлинаИмени); + Иначе + Форма.ИмяТекущейСтрокиПоиска = Имя; + КонецЕсли; +КонецПроцедуры + Функция НастройкиСпискаПолей(Форма, ИмяСпискаПолей) Для Каждого ПодключенныйСписокПолей Из Форма.ПодключенныеСпискиПолей Цикл diff --git a/SSL/src/CommonModules/КонструкторФормулКлиентСервер/Module.bsl b/SSL/src/CommonModules/КонструкторФормулКлиентСервер/Module.bsl index 8e6b7e284..96e26c657 100644 --- a/SSL/src/CommonModules/КонструкторФормулКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/КонструкторФормулКлиентСервер/Module.bsl @@ -38,4 +38,5 @@ КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/КонструкторФормулПовтИсп/Module.bsl b/SSL/src/CommonModules/КонструкторФормулПовтИсп/Module.bsl new file mode 100644 index 000000000..931f43ef9 --- /dev/null +++ b/SSL/src/CommonModules/КонструкторФормулПовтИсп/Module.bsl @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 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..89e070e69 --- /dev/null +++ b/SSL/src/CommonModules/КонструкторФормулПовтИсп/КонструкторФормулПовтИсп.mdo @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="93afedb2-2d93-4611-b0fd-830bf33789c2"> + <name>КонструкторФормулПовтИсп</name> + <synonym> + <key>ru</key> + <value>Конструктор формул повт исп</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> + <returnValuesReuse>DuringSession</returnValuesReuse> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/КонструкторФормулСлужебный/Module.bsl b/SSL/src/CommonModules/КонструкторФормулСлужебный/Module.bsl index 4086daa3e..533164edd 100644 --- a/SSL/src/CommonModules/КонструкторФормулСлужебный/Module.bsl +++ b/SSL/src/CommonModules/КонструкторФормулСлужебный/Module.bsl @@ -198,8 +198,6 @@ ВсеЭлементы = Новый Массив; ОперандыИФункции = Новый Соответствие; - ЛогическиеОператоры = СтрРазделить("И,ИЛИ,НЕ", ",", Ложь); - Разделители = "()/*-+%=<>, " + Символы.Таб + Символы.ПС; ОткрывающихСкобок = 0; ЭтоСтрокаВКавычках = Ложь; @@ -233,8 +231,7 @@ Если ЭтоРазделитель И ОткрывающихСкобок = 0 Тогда Если ЗначениеЗаполнено(Операнд) Тогда ЭтоФункция = Ложь; - Если Символ = "(" И СтрНайти(Операнд, ".") = 0 - Или ЛогическиеОператоры.Найти(ВРег(Операнд)) <> Неопределено Тогда + Если Символ = "(" И СтрНайти(Операнд, ".") = 0 Тогда ЭтоФункция = Истина; КонецЕсли; @@ -276,6 +273,7 @@ КонецФункции + Функция ПроверитьФормулу(Форма, ПредставлениеФормулы) Экспорт ЭлементыФормулы = ЭлементыФормулы(ПредставлениеФормулы); @@ -330,10 +328,251 @@ КонецФункции + +Процедура ОбработчикКонструктораФормул(Форма, Параметр, ДополнительныеПараметры) Экспорт + КлючОперации = ДополнительныеПараметры.КлючОперации; + Если КлючОперации = "ОчиститьСтрокуПоиска" Тогда + ОчиститьСтрокуПоиска(Форма, Параметр); + ИначеЕсли КлючОперации = "ЗапуститьФоновыйПоискВСпискеПолей" Тогда + Параметр = ЗапуститьФоновыйПоискВСпискеПолей(Форма); + ИначеЕсли КлючОперации = "ОбработатьСообщениеПоиска" Тогда + Сообщения = Параметр.Сообщения; + ИдентификаторЗадания = Параметр.ИдентификаторЗадания; + ОбработатьСообщенияПоиска(Форма, Сообщения, ИдентификаторЗадания); + ИначеЕсли КлючОперации = "ОбработатьРезультатПоиска" Тогда + АдресРезультата = Параметр.АдресРезультата; + ИдентификаторЗадания = Параметр.ИдентификаторЗадания; + ОбработатьРезультатПоиска(Форма, АдресРезультата, ИдентификаторЗадания); + КонецЕсли; +КонецПроцедуры + +// Запустить поиск в списке полей. +// +// Параметры: +// СтруктураФормы - Структура: +// * +// +// Возвращаемое значение: +// Неопределено, Структура - запустить поиск в списке полей: +// * ДеревоЭлементов +// * НайденныеЭлементы - Массив +// +Функция ЗапуститьПоискВСпискеПолей(СтруктураФормы) Экспорт + + ТекущийСеанс = ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание(); + ЭтоФоновоеЗадание = (ТекущийСеанс <> Неопределено); + + ИмяСпискаПолей = СтруктураФормы.ИмяСписка; + ИмяРеквизитаСтрокиПоиска = ИмяРеквизитаСтрокиПоискаСпискаПолей(ИмяСпискаПолей); + Отбор = СтруктураФормы[ИмяРеквизитаСтрокиПоиска]; + ОтборУстановлен = ЗначениеЗаполнено(Отбор); + + Результат = Новый Структура; + Элементы = Новый Структура; + СтруктураЭлементаФормы = Новый Структура("Видимость", НЕ ОтборУстановлен); + Элементы.Вставить(ИмяСпискаПолей + "Представление", СтруктураЭлементаФормы); + + СтруктураЭлементаФормы = Новый Структура("Видимость", ОтборУстановлен); + Элементы.Вставить(ИмяСпискаПолей + "ПредставлениеПутиКДанным", СтруктураЭлементаФормы); + + СтруктураЭлементаФормы = Новый Структура("Отображение", ?(ОтборУстановлен, ОтображениеТаблицы.Список, ОтображениеТаблицы.Дерево)); + Элементы.Вставить(ИмяСпискаПолей, СтруктураЭлементаФормы); + Результат.Вставить("Элементы", Элементы); + + Результат.Вставить("ИмяСписка", ИмяСпискаПолей); + + Если ЭтоФоновоеЗадание Тогда + ОбщегоНазначения.СообщитьПользователю(ОбщегоНазначения.ЗначениеВСтрокуXML(Результат)); + КонецЕсли; + + Если ОтборУстановлен Тогда + УстановитьОтбор(СтруктураФормы, ИмяСпискаПолей, Отбор, СтруктураФормы[ИмяСпискаПолей]); + КонецЕсли; + + Если ЭтоФоновоеЗадание Тогда + Возврат Неопределено; + Иначе + ДеревоПоиска = СтруктураФормы[ИмяСпискаПолей];// см. ДеревоДоступныхРеквизитов + СтруктураОтбора = Новый Структура("СоответствуетОтбору", Истина); + МассивНайденныхЭлементов = ДеревоПоиска.Строки.НайтиСтроки(СтруктураОтбора, Истина); + Если МассивНайденныхЭлементов.Количество() <> 0 Тогда + ИдентификаторыСтрок = Новый Массив; + Для Каждого НайденныйЭлемент Из МассивНайденныхЭлементов Цикл + ИдентификаторыСтрок.Добавить(НайденныйЭлемент.Идентификатор); + КонецЦикла; + + СокращенноеДерево = СократитьДерево(ДеревоПоиска, ИдентификаторыСтрок); + Результат = Новый Структура("ДеревоЭлементов, НайденныеЭлементы", СокращенноеДерево, ИдентификаторыСтрок); + Возврат Результат; + КонецЕсли; + Возврат Неопределено; + КонецЕсли; +КонецФункции + #КонецОбласти + #Область СлужебныеПроцедурыИФункции +Процедура УстановитьИдентификаторыСтрокДерева(Коллекция) + Для Каждого Строка Из Коллекция.Строки Цикл + Если Не ЗначениеЗаполнено(Строка.Идентификатор) Тогда + Строка.Идентификатор = Новый УникальныйИдентификатор(); + КонецЕсли; + УстановитьИдентификаторыСтрокДерева(Строка); + КонецЦикла; +КонецПроцедуры + +Функция ЗапуститьФоновыйПоискВСпискеПолей(Форма) + + ИмяТекущегоРеквизитаСтрокиПоиска = Форма.ИмяТекущейСтрокиПоиска; + + Если ЭтоАдресВременногоХранилища(Форма.АдресОписанияДлительнойОперации) Тогда + СоответствиеДлительныхОпераций = ПолучитьИзВременногоХранилища(Форма.АдресОписанияДлительнойОперации); + Иначе + СоответствиеДлительныхОпераций = Новый Соответствие(); + КонецЕсли; + + Если СоответствиеДлительныхОпераций[ИмяТекущегоРеквизитаСтрокиПоиска] <> Неопределено Тогда + ИдентификаторЗадания = СоответствиеДлительныхОпераций[ИмяТекущегоРеквизитаСтрокиПоиска]; + ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания); + КонецЕсли; + + СтрокаОтбора = Форма[ИмяТекущегоРеквизитаСтрокиПоиска]; + ДлинаСтрокиОтбора = СтрДлина(СтрокаОтбора); + ИмяСписка = ИмяРеквизитаСпискаПолей(ИмяТекущегоРеквизитаСтрокиПоиска); + ТаблицаТекущегоСписка = ДеревоДоступныхРеквизитов(Форма, ИмяСписка); + + ПодключенныеСпискиПолей = Форма.ПодключенныеСпискиПолей.Выгрузить(); + Отбор = Новый Структура("ИмяСпискаПолей", ИмяРеквизитаСпискаПолей(ИмяТекущегоРеквизитаСтрокиПоиска)); + ПодключенныеСпискиПолейСтрокиПоиска = ПодключенныеСпискиПолей.Скопировать(Отбор); + ПодключенныйСписокПолей = ПодключенныеСпискиПолейСтрокиПоиска[0]; + + СообщениеСтрокиОжидания = НСтр("ru = 'Продолжите ввод...'"); + СтрокиДерева = ТаблицаТекущегоСписка.Строки; // КоллекцияСтрокДереваЗначений + + СтрокиПоОтбору = СтрокиДерева.НайтиСтроки(Новый Структура("СоответствуетОтбору", Истина), Истина); + Для Каждого СтрокаПоОтбору Из СтрокиПоОтбору Цикл + СтрокаПоОтбору.СоответствуетОтбору = Ложь; + КонецЦикла; + + СтрокиПоОтбору = СтрокиДерева.НайтиСтроки(Новый Структура("ПодчиненныйЭлементСоответствуетОтбору", Истина), Истина); + Для Каждого СтрокаПоОтбору Из СтрокиПоОтбору Цикл + СтрокаПоОтбору.ПодчиненныйЭлементСоответствуетОтбору = Ложь; + КонецЦикла; + + СтрокаОжидания = СтрокиДерева.Найти(СообщениеСтрокиОжидания, "Заголовок", Ложь); // СтрокаДереваЗначений: см. ДеревоДоступныхРеквизитов + + Если ДлинаСтрокиОтбора <> 0 И ДлинаСтрокиОтбора < ПодключенныйСписокПолей.КоличествоСимволовДляНачалаПоиска Тогда + СтрокаОтбора = ""; + Форма.Элементы[ИмяСписка].Доступность = Ложь; + Если СтрокаОжидания = Неопределено Тогда + СтрокаОжидания = СтрокиДерева.Добавить(); + КонецЕсли; + СтрокаОжидания.Заголовок = СообщениеСтрокиОжидания; + СтрокаОжидания.ПредставлениеПутиКДанным = СообщениеСтрокиОжидания; + СтрокаОжидания.СоответствуетОтбору = Истина; + Форма.Элементы[ИмяСписка].Отображение = ОтображениеТаблицы.Дерево; + ЗначениеВДанныеФормы(ТаблицаТекущегоСписка, Форма[ИмяСписка]); + Возврат Неопределено; + Иначе + Если СтрокаОжидания <> Неопределено Тогда + СтрокиДерева.Удалить(СтрокаОжидания); + КонецЕсли; + Форма.Элементы[ИмяСписка].Доступность = Истина; + ЗначениеВДанныеФормы(ТаблицаТекущегоСписка, Форма[ИмяСписка]); + КонецЕсли; + + ОтборУстановлен = ЗначениеЗаполнено(СтрокаОтбора); + + Если Не ОтборУстановлен Тогда + ВыполнитьПоискВСпискеПолей(Форма); + Возврат Неопределено; + КонецЕсли; + + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(Форма.УникальныйИдентификатор); + + СтруктураФормы = Новый Структура; + + СтруктураФормы.Вставить("ИмяСписка", ИмяСписка); + СтруктураФормы.Вставить("ПодключенныеСпискиПолей", ПодключенныеСпискиПолейСтрокиПоиска); + + Для Каждого ПодключенногоСпискаПолей Из ПодключенныеСпискиПолейСтрокиПоиска Цикл + ИмяСпискаПолей = ПодключенногоСпискаПолей.ИмяСпискаПолей; + ИмяРеквизитаСтрокиПоиска = ИмяРеквизитаСтрокиПоискаСпискаПолей(ИмяСпискаПолей); + + СтруктураФормы.Вставить(ИмяРеквизитаСтрокиПоиска, Форма[ИмяРеквизитаСтрокиПоиска]); + ДеревоПолей = ДеревоДоступныхРеквизитов(Форма, ПодключенногоСпискаПолей.ИмяСпискаПолей); + УбратьПризнакОтбора(ДеревоПолей); + + ЗначениеВДанныеФормы(ДеревоПолей, Форма[ПодключенногоСпискаПолей.ИмяСпискаПолей]); + УстановитьИдентификаторыСтрокДерева(ДеревоПолей); + СтруктураФормы.Вставить(ПодключенногоСпискаПолей.ИмяСпискаПолей, ДеревоПолей); + + ТаблицаИсточников = ДанныеФормыВЗначение(Форма[ПодключенногоСпискаПолей.ИмяСпискаИсточников], Тип("ТаблицаЗначений")); + Для Каждого СтрокаТаблицы Из ТаблицаИсточников Цикл + Если СтрокаТаблицы.СхемаКомпоновкиДанных <> Неопределено Тогда + Если ЭтоАдресВременногоХранилища(СтрокаТаблицы.СхемаКомпоновкиДанных) Тогда + СхемаКомпоновкиДанных = ПолучитьИзВременногоХранилища(СтрокаТаблицы.СхемаКомпоновкиДанных); + Иначе + СхемаКомпоновкиДанных = СтрокаТаблицы.СхемаКомпоновкиДанных; + КонецЕсли; + СтрокаТаблицы.СхемаКомпоновкиДанных = ОбщегоНазначения.ЗначениеВСтрокуXML(СхемаКомпоновкиДанных); + КонецЕсли; + Контейнер = ДоступныеПоляВКонтейнерСКД(СтрокаТаблицы.КоллекцияПолей); + СтрокаТаблицы.КоллекцияПолей = ОбщегоНазначения.ЗначениеВСтрокуXML(Контейнер); + КонецЦикла; + СтрокаТаблицыИсточников = ОбщегоНазначения.ЗначениеВСтрокуXML(ТаблицаИсточников); + СтруктураФормы.Вставить(ПодключенногоСпискаПолей.ИмяСпискаИсточников, СтрокаТаблицыИсточников); + КонецЦикла; + + СтруктураРеквизитов = Новый Структура("КомпоновщикНастроек, НастройкиОтчета, ВладелецМакета"); + ЗаполнитьЗначенияСвойств(СтруктураРеквизитов, Форма); + + ДлительнаяОперация = ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, "КонструкторФормулСлужебный.ЗапуститьПоискВСпискеПолей", СтруктураФормы); + + СоответствиеДлительныхОпераций.Вставить(ИмяТекущегоРеквизитаСтрокиПоиска, ДлительнаяОперация.ИдентификаторЗадания); + Если ЭтоАдресВременногоХранилища(Форма.АдресОписанияДлительнойОперации) Тогда + ПоместитьВоВременноеХранилище(СоответствиеДлительныхОпераций, Форма.АдресОписанияДлительнойОперации); + Иначе + Форма.АдресОписанияДлительнойОперации = ПоместитьВоВременноеХранилище(СоответствиеДлительныхОпераций, Форма.УникальныйИдентификатор); + КонецЕсли; + + Возврат ДлительнаяОперация; + +КонецФункции + +// Возвращаемое значение: +// ДеревоЗначений: +// * Имя - Строка +// * Заголовок - Строка +// * Поле - ПолеКомпоновкиДанных +// * ПутьКДанным - Строка +// * ПредставлениеПутиКДанным - Строка +// * Тип - ОписаниеТипов +// * Картинка - Картинка +// * Папка - Булево +// * Таблица - Булево +// * СвойНаборПолей - Булево +// * Отступ - Строка +// * СоответствуетОтбору - Булево +// * ПодчиненныйЭлементСоответствуетОтбору - Булево +// * ЭтоГруппа - Булево +// * ЭтоФункция - Булево +// * Идентификатор - УникальныйИдентификатор +// +Функция ДеревоДоступныхРеквизитов(Знач Форма, Знач ИмяСписка) + ДеревоТекущегоСписка = ДанныеФормыВЗначение(Форма[ИмяСписка], Тип("ДеревоЗначений"));// ДеревоЗначений + Если ДеревоТекущегоСписка.Колонки.Найти("Идентификатор") = Неопределено Тогда + ДеревоТекущегоСписка.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор")); + КонецЕсли; + Возврат ДеревоТекущегоСписка; +КонецФункции + +Функция ДоступныеПоляИзКонтейнераСКД(Контейнер) + Возврат КоллекцияПолей(Контейнер); +КонецФункции + // Параметры: // Форма - ФормаКлиентскогоПриложения // Параметры - см. ПараметрыДобавленияСпискаПолей @@ -345,7 +584,7 @@ ДобавляемыеРеквизиты = Новый Массив; - ЗначенияРеквизитов = Новый Структура("ПодключенныеСпискиПолей"); + ЗначенияРеквизитов = Новый Структура("ПодключенныеСпискиПолей, АдресОписанияДлительнойОперации"); ЗаполнитьЗначенияСвойств(ЗначенияРеквизитов, Форма); ПодключенныеСпискиПолей = ЗначенияРеквизитов.ПодключенныеСпискиПолей; Если ПодключенныеСпискиПолей = Неопределено Тогда @@ -358,14 +597,29 @@ ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИспользоватьИдентификаторыДляФормул", Новый ОписаниеТипов("Булево"), ИмяРеквизитаПодключенныеСпискиПолей)); ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ПриОпределенииИсточниковДоступныхПолей", Новый ОписаниеТипов("Строка"), ИмяРеквизитаПодключенныеСпискиПолей)); ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("РазворачиваемыеВетки", Новый ОписаниеТипов("Строка"), ИмяРеквизитаПодключенныеСпискиПолей)); + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИмяТекущейСтрокиПоиска", Новый ОписаниеТипов("Строка"))); + КонецЕсли; + + АдресОписанияДлительнойОперации = ЗначенияРеквизитов.АдресОписанияДлительнойОперации; + Если АдресОписанияДлительнойОперации = Неопределено Тогда + ИмяРеквизитаПодключенныеСпискиПолей = "ПодключенныеСпискиПолей"; + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИспользоватьФоновыйПоиск", Новый ОписаниеТипов("Булево"), ИмяРеквизитаПодключенныеСпискиПолей)); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("КоличествоСимволовДляНачалаПоиска", Новый ОписаниеТипов("Число"), ИмяРеквизитаПодключенныеСпискиПолей)); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("АдресОписанияДлительнойОперации", Новый ОписаниеТипов("Строка"))); КонецЕсли; ИмяСпискаПолей = ПараметрыДобавления.ИмяСписка; - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяСпискаПолей, Новый ОписаниеТипов("ДеревоЗначений"))); + Если НайтиРеквизитФормы(Форма, ИмяСпискаПолей) = Неопределено Тогда + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяСпискаПолей, Новый ОписаниеТипов("ДеревоЗначений"))); + КонецЕсли; + Для Каждого ОписаниеРеквизита Из РеквизитыПодключаемогоСписка() Цикл ИмяРеквизита = ОписаниеРеквизита.Ключ; - ТипРеквизита = ОписаниеРеквизита.Значение; - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяРеквизита, ТипРеквизита, ИмяСпискаПолей)); + Если НайтиРеквизитФормы(Форма, ИмяРеквизита) = Неопределено Тогда + ТипРеквизита = ОписаниеРеквизита.Значение; + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяРеквизита, ТипРеквизита, ИмяСпискаПолей)); + КонецЕсли; КонецЦикла; ИмяСтрокиПоиска = ИмяРеквизитаСтрокиПоискаСпискаПолей(ИмяСпискаПолей); @@ -386,19 +640,47 @@ МестоРазмещенияСтрокиПоиска = ПараметрыДобавления.МестоРазмещенияСписка; КонецЕсли; - СтрокаПоиска = Форма.Элементы.Добавить(ИмяСтрокиПоиска, Тип("ПолеФормы"), МестоРазмещенияСтрокиПоиска); + СписокПолей = Форма.Элементы.Найти(ИмяСпискаПолей); + + ГруппаПоиска = Форма.Элементы.Добавить("Группа"+ИмяСтрокиПоиска, Тип("ГруппаФормы"), МестоРазмещенияСтрокиПоиска); + ГруппаПоиска.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ГруппаПоиска.Отображение = ОтображениеОбычнойГруппы.Нет; + ГруппаПоиска.ОтображатьЗаголовок = Ложь; + ГруппаПоиска.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда; + + СтрокаПоиска = Форма.Элементы.Добавить(ИмяСтрокиПоиска, Тип("ПолеФормы"), ГруппаПоиска); + + ИмяКомандыОчистки = ИмяСтрокиПоиска+"Очистка"; + Если Форма.Команды.Найти(ИмяКомандыОчистки) = Неопределено Тогда + Команда = Форма.Команды.Добавить(ИмяСтрокиПоиска+"Очистка"); + Команда.Действие = "Подключаемый_СтрокаПоискаОчистка"; + Команда.Отображение = ОтображениеКнопки.Картинка; + КонецЕсли; + + КнопкаОчисткиПоиска = Форма.Элементы.Добавить(ИмяКомандыОчистки, Тип("КнопкаФормы"), ГруппаПоиска); + КнопкаОчисткиПоиска.Вид = ВидКнопкиФормы.ОбычнаяКнопка; + КнопкаОчисткиПоиска.Картинка = БиблиотекаКартинок.ПолеВводаОчистить; + КнопкаОчисткиПоиска.ВертикальноеПоложениеВГруппе = ВертикальноеПоложениеЭлемента.Центр; + КнопкаОчисткиПоиска.ИмяКоманды = ИмяКомандыОчистки; + КнопкаОчисткиПоиска.ОтображениеФигуры = ОтображениеФигурыКнопки.ПриАктивности; + + Если СписокПолей <> Неопределено Тогда + Форма.Элементы.Переместить(ГруппаПоиска, МестоРазмещенияСтрокиПоиска, СписокПолей); + КонецЕсли; + СтрокаПоиска.ПутьКДанным = ИмяСтрокиПоиска; СтрокаПоиска.Вид = ВидПоляФормы.ПолеВвода; СтрокаПоиска.ПодсказкаВвода = ПараметрыДобавления.ПодсказкаВводаСтрокиПоиска; СтрокаПоиска.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; СтрокаПоиска.УстановитьДействие("ИзменениеТекстаРедактирования", "Подключаемый_СтрокаПоискаИзменениеТекстаРедактирования"); - СтрокаПоиска.УстановитьДействие("Очистка", "Подключаемый_СтрокаПоискаОчистка"); - СтрокаПоиска.ОбновлениеТекстаРедактирования = ОбновлениеТекстаРедактирования.НеИспользовать; СтрокаПоиска.АвтоМаксимальнаяШирина = Ложь; - СтрокаПоиска.КнопкаОчистки = Истина; + СтрокаПоиска.ОбновлениеТекстаРедактирования = ОбновлениеТекстаРедактирования.НеИспользовать; + + Если СписокПолей = Неопределено Тогда + СписокПолей = Форма.Элементы.Добавить(ИмяСпискаПолей, Тип("ТаблицаФормы"), ПараметрыДобавления.МестоРазмещенияСписка); + СписокПолей.ПутьКДанным = ИмяСпискаПолей; + КонецЕсли; - СписокПолей = Форма.Элементы.Добавить(ИмяСпискаПолей, Тип("ТаблицаФормы"), ПараметрыДобавления.МестоРазмещенияСписка); - СписокПолей.ПутьКДанным = ИмяСпискаПолей; СписокПолей.НачальноеОтображениеДерева = НачальноеОтображениеДерева.НеРаскрывать; СписокПолей.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; СписокПолей.Шапка = Ложь; @@ -411,6 +693,12 @@ СписокПолей.УстановитьДействие("ПередРазворачиванием", "Подключаемый_СписокПолейПередРазворачиванием"); СписокПолей.УстановитьДействие("НачалоПеретаскивания", "Подключаемый_СписокПолейНачалоПеретаскивания"); + Для Каждого КнопкаКонтекстногоМеню Из ПараметрыДобавления.КонтекстноеМеню Цикл + Кнопка = Форма.Элементы.Добавить(ИмяСпискаПолей + КнопкаКонтекстногоМеню.Ключ, Тип("КнопкаФормы"), СписокПолей.КонтекстноеМеню); + Кнопка.ИмяКоманды = КнопкаКонтекстногоМеню.Значение; + Кнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; + КонецЦикла; + Для Каждого Обработчик Из ПараметрыДобавления.ОбработчикиСписка Цикл ИмяСобытия = Обработчик.Ключ; ИмяПроцедуры = Обработчик.Значение; @@ -445,10 +733,25 @@ ПодключенныйСписок.СкобкиПредставлений = ПараметрыДобавления.СкобкиПредставлений; ПодключенныйСписок.ИспользоватьИдентификаторыДляФормул = ПараметрыДобавления.ИспользоватьИдентификаторыДляФормул; ПодключенныйСписок.ПриОпределенииИсточниковДоступныхПолей = ПараметрыДобавления.ПриОпределенииИсточниковДоступныхПолей; + Если ПараметрыДобавления.ИспользоватьФоновыйПоиск Тогда + ПодключенныйСписок.ИспользоватьФоновыйПоиск = ПараметрыДобавления.ИспользоватьФоновыйПоиск; + ПодключенныйСписок.КоличествоСимволовДляНачалаПоиска = ПараметрыДобавления.КоличествоСимволовДляНачалаПоиска; + КонецЕсли; ИсточникиДоступныхПолей = Форма[ИмяСпискаИсточников]; // ТаблицаЗначений - - Для Каждого КоллекцияПолей Из ПараметрыДобавления.КоллекцииПолей Цикл + + КоллекцииПолей = ПараметрыДобавления.КоллекцииПолей; + Если ТипЗнч(КоллекцииПолей) = Тип("Массив") Тогда + КоллекцииПолей = Новый СписокЗначений; + КоллекцииПолей.ЗагрузитьЗначения(ПараметрыДобавления.КоллекцииПолей); + КонецЕсли; + + Для Каждого Элемент Из КоллекцииПолей Цикл + КоллекцияПолей = Элемент.Значение; + ИсточникДанных = Элемент.Представление; + Если Не ЗначениеЗаполнено(ИсточникДанных) Тогда + ИсточникДанных = ПараметрыДобавления.ИмяОсновногоИсточника; + КонецЕсли; ИсточникДоступныхПолей = ИсточникиДоступныхПолей.Добавить(); Если ТипЗнч(КоллекцияПолей) = Тип("Строка") И ЭтоАдресВременногоХранилища(КоллекцияПолей) Тогда ИсточникДоступныхПолей.СхемаКомпоновкиДанных = КоллекцияПолей; @@ -456,7 +759,8 @@ Иначе ИсточникДоступныхПолей.КоллекцияПолей = КоллекцияПолей; КонецЕсли; - ИсточникДоступныхПолей.ИсточникДанных = ПараметрыДобавления.ИмяОсновногоИсточника; + ИсточникДоступныхПолей.ИсточникДанных = ИсточникДанных; + ИсточникДоступныхПолей.Замещать = ПараметрыДобавления.Замещать; КонецЦикла; Для Каждого ИсточникДоступныхПолей Из ПараметрыДобавления.ИсточникиДоступныхПолей Цикл @@ -466,7 +770,7 @@ ДеревоПолей = Форма.РеквизитФормыВЗначение(ИмяСпискаПолей); ТаблицаИсточников = Форма.РеквизитФормыВЗначение(ИмяСпискаИсточников); - ЗаполнитьСписокДоступныхРеквизитов(ДеревоПолей, ТаблицаИсточников, , ПодключенныйСписок); + ЗаполнитьСписокДоступныхРеквизитов(ДеревоПолей, ТаблицаИсточников, , ПодключенныйСписок, Форма.УникальныйИдентификатор); Форма.ЗначениеВРеквизитФормы(ДеревоПолей, ИмяСпискаПолей); Форма.ЗначениеВРеквизитФормы(ТаблицаИсточников, ИмяСпискаИсточников); @@ -475,11 +779,23 @@ КонецПроцедуры +Функция НайтиРеквизитФормы(Форма, ИмяРеквизита) + МассивРеквизитов = Форма.ПолучитьРеквизиты(); + Для Каждого РеквизитФормы Из МассивРеквизитов Цикл + Если РеквизитФормы.Имя = ИмяРеквизита Тогда + Возврат РеквизитФормы; + КонецЕсли; + КонецЦикла; + Возврат Неопределено; +КонецФункции + // Возвращаемое значение: // Структура: // * МестоРазмещенияСписка - ГруппаФормы // - ТаблицаФормы // - ФормаКлиентскогоПриложения +// * ИспользоватьФоновыйПоиск - Булево +// * КоличествоСимволовДляНачалаПоиска - Число // * ИмяСписка - Строка // * КоллекцииПолей - Массив // * МестоРазмещенияСтрокиПоиска - ГруппаФормы @@ -494,11 +810,14 @@ // * ИспользоватьИдентификаторыДляФормул - Булево // * ПриОпределенииИсточниковДоступныхПолей - Строка // * ИмяОсновногоИсточника - Строка +// * Замещать - Булево // Функция ПараметрыДобавленияСпискаПолей() Экспорт Результат = Новый Структура; Результат.Вставить("МестоРазмещенияСписка"); + Результат.Вставить("ИспользоватьФоновыйПоиск", Ложь); + Результат.Вставить("КоличествоСимволовДляНачалаПоиска", 3); Результат.Вставить("ИмяСписка", "ДоступныеПоля"); Результат.Вставить("КоллекцииПолей", Новый Массив); Результат.Вставить("МестоРазмещенияСтрокиПоиска"); @@ -511,25 +830,61 @@ Результат.Вставить("ИспользоватьИдентификаторыДляФормул", Ложь); Результат.Вставить("ПриОпределенииИсточниковДоступныхПолей", ""); Результат.Вставить("ИмяОсновногоИсточника", ""); + Результат.Вставить("КонтекстноеМеню", Новый Структура); + Результат.Вставить("Замещать", Ложь); Возврат Результат; КонецФункции +Процедура ЗаполнитьДеревоПоДоступнымПолям(СтрокаДерева, ДоступныеПоля) + Для Каждого ДоступноеПоле Из ДоступныеПоля.Элементы Цикл + НоваяСтрока = СтрокаДерева.Строки.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ДоступноеПоле); + НоваяСтрока.Идентификатор = Строка(ДоступноеПоле.Поле); + Родитель = ДоступноеПоле.Родитель; + + Если Родитель <> Неопределено И СтрНачинаетсяС(НоваяСтрока.Идентификатор, Строка(Родитель.Поле)) Тогда + НоваяСтрока.Идентификатор = Сред(НоваяСтрока.Идентификатор, СтрДлина(Строка(Родитель.Поле)) + 2); + КонецЕсли; + + НоваяСтрока.Представление = ДоступноеПоле.Заголовок; + НоваяСтрока.Папка = ДоступноеПоле.Папка И Не ДоступноеПоле.Таблица; + Если (ДоступноеПоле.Папка Или ДоступноеПоле.Таблица) И ДоступноеПоле.Элементы.Количество() <> 0 Тогда + ЗаполнитьДеревоПоДоступнымПолям(НоваяСтрока, ДоступноеПоле); + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +Процедура ОчиститьСтрокуПоиска(Форма, ИмяЭлемента) + + Элемент = Форма.Элементы[СтрЗаменить(ИмяЭлемента, "Очистка", "")]; + Форма.ТекущийЭлемент = Элемент; + Форма[Элемент.Имя] = ""; + +КонецПроцедуры Процедура ОбновитьКоллекцииПолей(Форма, КоллекцииПолей, ИмяСпискаПолей = "ДоступныеПоля") Экспорт ИсточникиДоступныхПолей = СписокИсточниковДоступныхПолей(Форма, ИмяСпискаПолей); // ДанныеФормыКоллекция ИмяОсновногоИсточникаДанных = ИмяОсновногоИсточникаДанных(ИсточникиДоступныхПолей); - Отбор = Новый Структура("ИсточникДанных", ИмяОсновногоИсточникаДанных); - Для Каждого СтрокаТаблицы Из ИсточникиДоступныхПолей.НайтиСтроки(Отбор) Цикл - ИсточникиДоступныхПолей.Удалить(СтрокаТаблицы); - КонецЦикла; + ИсточникиДоступныхПолей.Очистить(); - Для Индекс = 0 По КоллекцииПолей.ВГраница() Цикл - КоллекцияПолей = КоллекцииПолей[Индекс]; + КоллекцииПолейИсточниковДанных = КоллекцииПолей; + Если ТипЗнч(КоллекцииПолей) = Тип("Массив") Тогда + КоллекцииПолейИсточниковДанных = Новый СписокЗначений; + КоллекцииПолейИсточниковДанных.ЗагрузитьЗначения(КоллекцииПолей); + КонецЕсли; + + Для Индекс = 0 По КоллекцииПолей.Количество()-1 Цикл + КоллекцияПолей = КоллекцииПолейИсточниковДанных[Индекс].Значение; + ИсточникДанных = КоллекцииПолейИсточниковДанных[Индекс].Представление; + Если Не ЗначениеЗаполнено(ИсточникДанных) Тогда + ИсточникДанных = ИмяОсновногоИсточникаДанных; + КонецЕсли; + ИсточникДоступныхПолей = ИсточникиДоступныхПолей.Вставить(Индекс); - ИсточникДоступныхПолей.ИсточникДанных = ИмяОсновногоИсточникаДанных; + ИсточникДоступныхПолей.ИсточникДанных = ИсточникДанных; ИсточникДоступныхПолей.КоллекцияПолей = КоллекцияПолей; КонецЦикла; @@ -623,13 +978,13 @@ КонецФункции Процедура ЗаполнитьСписокДоступныхРеквизитов(Знач ТекущийРеквизит, ИсточникиДоступныхПолей, Знач Отбор = "", - НастройкиСписка = Неопределено) + НастройкиСписка = Неопределено, УникальныйИдентификаторФормы = Неопределено) ДоступныеРеквизиты = НоваяКоллекцияДоступныхРеквизитов(); ДоступныеРеквизиты.Колонки.Добавить("ЕстьПодчиненные", Новый ОписаниеТипов("Булево")); ДоступныеРеквизиты.Колонки.Добавить("Порядок", Новый ОписаниеТипов("Число")); - КоллекцииДоступныхПолей = КоллекцииДоступныхПолей(ТекущийРеквизит, ИсточникиДоступныхПолей, НастройкиСписка); + КоллекцииДоступныхПолей = КоллекцииДоступныхПолей(ТекущийРеквизит, ИсточникиДоступныхПолей, НастройкиСписка, УникальныйИдентификаторФормы); Для Каждого КоллекцияДоступныхПолей Из КоллекцииДоступныхПолей Цикл Для Каждого ОписаниеПоля Из КоллекцияДоступныхПолей.Элементы Цикл Если ОписаниеПоля.Таблица И (Строка(ОписаниеПоля.Поле) = "ДополнительныеРеквизиты" @@ -648,6 +1003,16 @@ Продолжить; КонецЕсли; + НайденныеРеквизиты = ДоступныеРеквизиты.НайтиСтроки(Новый Структура("Поле", ОписаниеПоля.Поле)); + Для Каждого Реквизит Из НайденныеРеквизиты Цикл + Если Не ОписаниеПоля.Тип.СодержитТип(Тип("ТаблицаЗначений")) Тогда + Реквизит.Тип = Новый ОписаниеТипов(Реквизит.Тип, ОписаниеПоля.Тип.Типы()); + КонецЕсли; + КонецЦикла; + Если НайденныеРеквизиты.Количество() > 0 Тогда + Продолжить; + КонецЕсли; + Реквизит = ДоступныеРеквизиты.Добавить(); Реквизит.Заголовок = ОписаниеПоля.Заголовок; @@ -737,9 +1102,11 @@ КонецЕсли; ЕстьПодчиненные = Реквизит.ЭтоГруппа Или ЕстьПодчиненныеЭлементы(ОписаниеПоля); + Если ЕстьПодчиненные Тогда Реквизит.ЕстьПодчиненные = Истина; КонецЕсли; + КонецЦикла; КонецЦикла; @@ -774,8 +1141,8 @@ Если ДоступныйРеквизит.ЕстьПодчиненные Тогда ПодчиненныеЭлементы(Реквизит).Добавить(); - ИначеЕсли НастройкиСписка <> Неопределено И ЗначениеЗаполнено(НастройкиСписка.ПриОпределенииИсточниковДоступныхПолей) Тогда - КоллекцииПолейРеквизита = КоллекцииДоступныхПолей(Реквизит, ИсточникиДоступныхПолей, НастройкиСписка); + ИначеЕсли НастройкиСписка <> Неопределено И ЗначениеЗаполнено(НастройкиСписка.ПриОпределенииИсточниковДоступныхПолей) Тогда + КоллекцииПолейРеквизита = КоллекцииДоступныхПолей(Реквизит, ИсточникиДоступныхПолей, НастройкиСписка, УникальныйИдентификаторФормы); Если ЗначениеЗаполнено(КоллекцииПолейРеквизита) И Не СтрНайти(Реквизит.ПутьКДанным, Реквизит.Имя + ".") И ЗначениеЗаполнено(КоллекцииПолейРеквизита[0].Элементы) Тогда ПодчиненныеЭлементы(Реквизит).Добавить(); @@ -851,22 +1218,32 @@ КонецФункции +Функция НайтиПоИдентификатору(Коллекция, ИдентификаторСтроки) + + Если ТипЗнч(Коллекция) = Тип("ДеревоЗначений") Или ТипЗнч(Коллекция) = Тип("СтрокаДереваЗначений") Тогда + Возврат Коллекция.Строки.Найти(ИдентификаторСтроки, "Идентификатор", Истина); + КонецЕсли; + + Возврат Коллекция.НайтиПоИдентификатору(ИдентификаторСтроки); + +КонецФункции + // Возвращаемое значение: // Массив из ДоступныеПоляКомпоновкиДанных // -Функция КоллекцииДоступныхПолей(Реквизит, ИсточникиДоступныхПолей, НастройкиСписка) +Функция КоллекцииДоступныхПолей(Реквизит, ИсточникиДоступныхПолей, НастройкиСписка, УникальныйИдентификаторФормы) Результат = Новый Массив; Если ТипЗнч(Реквизит) = Тип("ДанныеФормыДерево") Или ТипЗнч(Реквизит) = Тип("ДеревоЗначений") Тогда - Для Каждого ИсточникДоступныхПолей Из ИсточникиДоступныхПолей(ИсточникиДоступныхПолей, НастройкиСписка) Цикл + Для Каждого ИсточникДоступныхПолей Из ИсточникиДоступныхПолей Цикл Результат.Добавить(ИсточникДоступныхПолей.КоллекцияПолей); КонецЦикла; Возврат Результат; КонецЕсли; Замещать = Ложь; - Для Каждого ИсточникДоступныхПолей Из ИсточникиДоступныхПолей(ИсточникиДоступныхПолей, НастройкиСписка, Реквизит) Цикл + Для Каждого ИсточникДоступныхПолей Из ИсточникиДоступныхПолей(ИсточникиДоступныхПолей, НастройкиСписка, Реквизит, УникальныйИдентификаторФормы) Цикл Реквизит.СвойНаборПолей = Истина; Результат.Добавить(ИсточникДоступныхПолей.КоллекцияПолей); Замещать = Замещать Или ИсточникДоступныхПолей.Замещать; @@ -887,7 +1264,7 @@ КонецЦикла; Если Родитель <> Неопределено Тогда - Для Каждого ИсточникДоступныхПолей Из ИсточникиДоступныхПолей(ИсточникиДоступныхПолей, НастройкиСписка, Родитель) Цикл + Для Каждого ИсточникДоступныхПолей Из ИсточникиДоступныхПолей(ИсточникиДоступныхПолей, НастройкиСписка, Родитель, УникальныйИдентификаторФормы) Цикл Поле = ИсточникДоступныхПолей.КоллекцияПолей.НайтиПоле(Реквизит.Поле); Если Поле <> Неопределено Тогда Результат.Добавить(Поле); @@ -895,8 +1272,12 @@ КонецЦикла; КонецЕсли; + Если ЗначениеЗаполнено(Результат) И Реквизит.Поле = Новый ПолеКомпоновкиДанных("Номер") Тогда + Возврат Результат; + КонецЕсли; + Если Не Замещать Или Не ЗначениеЗаполнено(Результат) Тогда - Для Каждого ИсточникДоступныхПолей Из ИсточникиДоступныхПолей(ИсточникиДоступныхПолей, НастройкиСписка) Цикл + Для Каждого ИсточникДоступныхПолей Из ИсточникиДоступныхПолей(ИсточникиДоступныхПолей, НастройкиСписка, ,УникальныйИдентификаторФормы) Цикл Поле = ИсточникДоступныхПолей.КоллекцияПолей.НайтиПоле(Реквизит.Поле); Если Поле <> Неопределено Тогда Результат.Добавить(Поле); @@ -908,7 +1289,7 @@ КонецФункции -Функция ИсточникиДоступныхПолей(ИсточникиДоступныхПолей, НастройкиСписка, Реквизит = Неопределено) +Функция ИсточникиДоступныхПолей(ИсточникиДоступныхПолей, НастройкиСписка, Реквизит = Неопределено, УникальныйИдентификаторФормы = Неопределено) Результат = Новый Массив; ИмяОсновногоИсточникаДанных = ИмяОсновногоИсточникаДанных(ИсточникиДоступныхПолей); @@ -935,6 +1316,10 @@ КонецЕсли; Иначе Для Каждого Тип Из Родитель.Тип.Типы() Цикл + Если Тип = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") + Или Тип = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда + Продолжить; + КонецЕсли; ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); Если ОбъектМетаданных = Неопределено Тогда Продолжить; @@ -945,9 +1330,15 @@ КонецЦикла; КонецЕсли; + МассивМетаданныхПеречислений = КонструкторФормулПовтИсп.МетаданныеПеречислений(); + Для Каждого Тип Из Реквизит.Тип.Типы() Цикл + Если Тип = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") + Или Тип = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда + Продолжить; + КонецЕсли; ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); - Если ОбъектМетаданных = Неопределено Или Метаданные.Перечисления.Содержит(ОбъектМетаданных) Тогда + Если ОбъектМетаданных = Неопределено Или МассивМетаданныхПеречислений.Найти(ОбъектМетаданных) <> Неопределено Тогда Продолжить; КонецЕсли; ИсточникДанных = ОбъектМетаданных.ПолноеИмя(); @@ -969,7 +1360,7 @@ ИсточникиПолей = КоллекцияИсточниковДоступныхПолей(); Модуль = ОбщегоНазначения.ОбщийМодуль(НастройкиСписка.ПриОпределенииИсточниковДоступныхПолей); - Модуль.ПриОпределенииИсточниковДоступныхПолей(ИсточникДанных, ИсточникиПолей); + Модуль.ПриОпределенииИсточниковДоступныхПолей(ИсточникДанных, Реквизит.Тип, ИсточникиПолей, УникальныйИдентификаторФормы); Если ЗначениеЗаполнено(ИсточникиПолей) Тогда Для Каждого ИсточникПолей Из ИсточникиПолей Цикл @@ -1036,7 +1427,7 @@ Возврат Ложь; КонецЕсли; - Если Не СтрНайти(Шаблон, "*") Тогда + Если Не СтрЧислоВхождений(Шаблон, "*") Тогда Возврат Строка = Шаблон; КонецЕсли; @@ -1117,7 +1508,7 @@ ОбъектыМетаданных = Новый Массив; Для Каждого ИмяОбъекта Из СтрРазделить(ТипыИзменяемыхОбъектов, ",", Ложь) Цикл - ОбъектыМетаданных.Добавить(Метаданные.НайтиПоПолномуИмени(ИмяОбъекта)); + ОбъектыМетаданных.Добавить(ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъекта)); КонецЦикла; СтруктураОбъектов = ОбщиеРеквизитыОбъектов(ТипыИзменяемыхОбъектов); @@ -1172,7 +1563,7 @@ ОбъектыМетаданных = Новый Массив; Для Каждого ИмяОбъекта Из СтрРазделить(ТипыОбъектов, ",", Ложь) Цикл - ОбъектыМетаданных.Добавить(Метаданные.НайтиПоПолномуИмени(ИмяОбъекта)); + ОбъектыМетаданных.Добавить(ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъекта)); КонецЦикла; Результат = Новый Структура; @@ -1399,52 +1790,437 @@ Процедура ВыполнитьПоискВСпискеПолей(Форма) Экспорт - Для Каждого Элемент Из Форма.ПодключенныеСпискиПолей Цикл - ИмяСпискаПолей = Элемент.ИмяСпискаПолей; - ИмяРеквизитаСтрокиПоиска = ИмяРеквизитаСтрокиПоискаСпискаПолей(ИмяСпискаПолей); - Отбор = Форма[ИмяРеквизитаСтрокиПоиска]; - ОтборУстановлен = ЗначениеЗаполнено(Отбор); - Если ЗначениеЗаполнено(Отбор) Тогда - УстановитьОтбор(Форма, ИмяСпискаПолей, Отбор, Форма[ИмяСпискаПолей]); - КонецЕсли; - Форма.Элементы[ИмяСпискаПолей + "Представление"].Видимость = НЕ ОтборУстановлен; - Форма.Элементы[ИмяСпискаПолей + "ПредставлениеПутиКДанным"].Видимость = ОтборУстановлен; - Форма.Элементы[ИмяСпискаПолей].Отображение = ?(ОтборУстановлен, ОтображениеТаблицы.Список, ОтображениеТаблицы.Дерево); - КонецЦикла; + ИмяСпискаПолей = ИмяРеквизитаСпискаПолей(Форма.ИмяТекущейСтрокиПоиска); + ИмяРеквизитаСтрокиПоиска = Форма.ИмяТекущейСтрокиПоиска; + Отбор = Форма[ИмяРеквизитаСтрокиПоиска]; + ОтборУстановлен = ЗначениеЗаполнено(Отбор); + Если ЗначениеЗаполнено(Отбор) Тогда + УстановитьОтбор(Форма, ИмяСпискаПолей, Отбор, Форма[ИмяСпискаПолей]); + КонецЕсли; + Форма.Элементы[ИмяСпискаПолей + "Представление"].Видимость = НЕ ОтборУстановлен; + Форма.Элементы[ИмяСпискаПолей + "ПредставлениеПутиКДанным"].Видимость = ОтборУстановлен; + Форма.Элементы[ИмяСпискаПолей].Отображение = ?(ОтборУстановлен, ОтображениеТаблицы.Список, ОтображениеТаблицы.Дерево); КонецПроцедуры -Функция УстановитьОтбор(Знач Форма, Знач ИмяСписка, Знач Отбор, +Процедура УстановитьОтбор(Знач Форма, Знач ИмяСписка, Знач Отбор, Знач КоллекцияРеквизитов = Неопределено, Знач Уровень = 0) - Уровень = Уровень + 1; - ЕстьРеквизитыСоответствующиеОтбору = Ложь; - Для Каждого Реквизит Из КоллекцияРеквизитов.ПолучитьЭлементы() Цикл + ТекущийСеанс = ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание(); + ЭтоФоновоеЗадание = (ТекущийСеанс <> Неопределено); + + МаксимальноеКоличествоРезультатов = 200; + МаксимальныйУровеньПоиска = 3; + + + СтруктураОтбора = Новый Структура("СоответствуетОтбору", Истина); + Уровень = 1; + КоличествоНайденных = 0; + + ИдентификаторыСтрок = Новый Массив; + Пока Истина Цикл + ИспользованныеУзлы = Новый Соответствие; + Пока Истина Цикл + ПорцияПолейТекущегоУровня = ПолучитьПорциюПолейЗаданногоУровня(КоллекцияРеквизитов, Уровень, ИспользованныеУзлы, ИмяСписка, Форма); + Если ПорцияПолейТекущегоУровня = Неопределено Тогда + Прервать; + КонецЕсли; + УстановитьПризнакОтбора(КоличествоНайденных, МаксимальноеКоличествоРезультатов, ПорцияПолейТекущегоУровня, Отбор); + Если КоличествоНайденных = МаксимальноеКоличествоРезультатов Тогда + Возврат; + КонецЕсли; + Если ЭтоФоновоеЗадание Тогда + МассивНайденныхЭлементов = ПорцияПолейТекущегоУровня.Строки.НайтиСтроки(СтруктураОтбора, Истина); + Если МассивНайденныхЭлементов.Количество() <> 0 Тогда + Для Каждого НайденныйЭлемент Из МассивНайденныхЭлементов Цикл + ИдентификаторыСтрок.Добавить(НайденныйЭлемент.Идентификатор); + КонецЦикла; + + СокращенноеДерево = СократитьДерево(КоллекцияРеквизитов, ИдентификаторыСтрок); + Результат = Новый Структура("ДеревоЭлементов, НайденныеЭлементы", СокращенноеДерево, ИдентификаторыСтрок); + ОбщегоНазначения.СообщитьПользователю(ОбщегоНазначения.ЗначениеВСтрокуXML(Результат)); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Уровень = Уровень + 1; + Если Уровень > МаксимальныйУровеньПоиска Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Функция СократитьДерево(Дерево, ИдентификаторыСтрок) + Результат = Дерево.Скопировать(); + СтрокиДляОтправки = Новый Соответствие; + Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл + СтрокаДерева = Результат.Строки.Найти(ИдентификаторСтроки, "Идентификатор", Истина); + СтрокиРодителей(Результат, СтрокаДерева, СтрокиДляОтправки); + КонецЦикла; + + УдалитьСтрокиНеВСписке(Результат, СтрокиДляОтправки); + Возврат Результат; +КонецФункции + +Процедура УдалитьСтрокиНеВСписке(Дерево, Фильтр) + МассивСтрокДляУдаленияПодчиненных = Новый Массив; + Для Каждого Строка Из Дерево.Строки Цикл + Если Фильтр[Строка] = Истина Тогда + УдалитьСтрокиНеВСписке(Строка, Фильтр) + Иначе + МассивСтрокДляУдаленияПодчиненных.Добавить(Строка); + КонецЕсли; + КонецЦикла; + + Для Каждого СтрокаУдаления Из МассивСтрокДляУдаленияПодчиненных Цикл + СтрокаУдаления.Строки.Очистить(); + КонецЦикла; +КонецПроцедуры + +Процедура СтрокиРодителей(Дерево, СтрокаДерева, СтрокиДляОтправки) + СтрокиДляОтправки.Вставить(СтрокаДерева, Истина); + Если СтрокаДерева.Родитель <> Неопределено Тогда + СтрокиРодителей(Дерево, СтрокаДерева.Родитель, СтрокиДляОтправки); + КонецЕсли; +КонецПроцедуры + + +Процедура УстановитьПризнакОтбора(КоличествоНайденных, Знач МаксимальноеКоличествоРезультатов, Знач КоллекцияРеквизитов, Знач Отбор) + + Для Каждого Реквизит Из ПодчиненныеЭлементы(КоллекцияРеквизитов) Цикл + Если КоличествоНайденных = МаксимальноеКоличествоРезультатов Тогда + Возврат; + КонецЕсли; Если РодительскийРеквизитСоответствуетОтбору(Реквизит) Тогда Реквизит.СоответствуетОтбору = Ложь; Иначе ФорматированнаяСтрока = НайтиТекстВСтроке(Реквизит.ПредставлениеПутиКДанным, Отбор); Реквизит.СоответствуетОтбору = ФорматированнаяСтрока <> Неопределено; Если Реквизит.СоответствуетОтбору Тогда + КоличествоНайденных = КоличествоНайденных + 1; Реквизит.ПредставлениеПутиКДанным = ФорматированнаяСтрока; + РодительРеквизита = Родитель(Реквизит); + Если РодительРеквизита <> Неопределено Тогда + РодительРеквизита.ПодчиненныйЭлементСоответствуетОтбору = Истина; + КонецЕсли; КонецЕсли; КонецЕсли; - Если Не Реквизит.СоответствуетОтбору И (Уровень < 2 - Или Реквизит.Поле <> Неопределено И СтрНачинаетсяС(Отбор, Реквизит.ПредставлениеПутиКДанным)) Тогда - РазвернутьРеквизит(Реквизит.ПолучитьИдентификатор(), ИмяСписка, Форма); + КонецЦикла; + +КонецПроцедуры + +Функция ПолучитьПорциюПолейЗаданногоУровня(КоллекцияРеквизитов, Уровень, ИспользованныеУзлы, ИмяСписка, Форма) + Если Уровень = 1 Тогда + Если ИспользованныеУзлы.Получить(-1) <> Неопределено Тогда + Возврат Неопределено; + Иначе + ИспользованныеУзлы.Вставить(-1, Истина); + Возврат КоллекцияРеквизитов; + КонецЕсли; + КонецЕсли; + Возврат ПолучитьКоллекциюУровня(КоллекцияРеквизитов, Уровень, ИспользованныеУзлы, ИмяСписка, Форма); +КонецФункции + +Функция ПолучитьИдентификатор(Элемент) + Если ТипЗнч(Элемент) = Тип("ДанныеФормыЭлементДерева") Тогда + Возврат Элемент.ПолучитьИдентификатор(); + ИначеЕсли ТипЗнч(Элемент) = Тип("СтрокаДереваЗначений") Тогда + Возврат Элемент.Идентификатор; + КонецЕсли; + + Возврат Неопределено; +КонецФункции + +Функция ПолучитьКоллекциюУровня(КоллекцияРеквизитов, Уровень, ИспользованныеУзлы, ИмяСписка, Форма, ТекущийУровень = 1, ИндексРодителя = "") + Если Уровень = ТекущийУровень Тогда + ИдентификаторРеквизита = ИндексРодителя; + ИспользованныеУзлы.Вставить(ИдентификаторРеквизита, Истина); + Возврат КоллекцияРеквизитов; + КонецЕсли; + + ЭлементыКоллекции = ПодчиненныеЭлементы(КоллекцияРеквизитов); + + Для Каждого Реквизит Из ЭлементыКоллекции Цикл + ИдентификаторРеквизита = ПолучитьИдентификатор(Реквизит); + Если ИспользованныеУзлы.Получить(ИдентификаторРеквизита) = Неопределено Тогда + Если ЭлементыКоллекции.Количество() = ЭлементыКоллекции.Индекс(Реквизит)+1 Тогда + РодительКоллекции = Родитель(КоллекцияРеквизитов); + Если РодительКоллекции <> Неопределено Тогда + ИспользованныеУзлы.Вставить(ИндексРодителя, Истина); + КонецЕсли; + КонецЕсли; + + Если Уровень = ТекущийУровень + 1 Тогда + Если Не Реквизит.СоответствуетОтбору Тогда + РазвернутьРеквизит(ИдентификаторРеквизита, ИмяСписка, Форма); + КонецЕсли; + КонецЕсли; + + Коллекция = ПолучитьКоллекциюУровня(Реквизит, Уровень, ИспользованныеУзлы, ИмяСписка, Форма, ТекущийУровень + 1, ИдентификаторРеквизита); + + Если Коллекция <> Неопределено Тогда + Возврат Коллекция; + КонецЕсли; + КонецЕсли; + КонецЦикла; +КонецФункции + + +Процедура ОбработатьРезультатПоиска(Форма, АдресРезультата, ИдентификаторЗадания) + + РезультатПоиска = ПолучитьИзВременногоХранилища(АдресРезультата); + + Если РезультатПоиска = Неопределено Тогда + Возврат; + КонецЕсли; + + ИмяСтрокиПоиска = ИмяСтрокиПоискаПоИдентификаторуЗадания(Форма, ИдентификаторЗадания); + + Если ИмяСтрокиПоиска = Неопределено Тогда + Возврат; + КонецЕсли; + + ИмяСписка = ИмяРеквизитаСпискаПолей(ИмяСтрокиПоиска); + ДеревоПолей = Форма.РеквизитФормыВЗначение(ИмяСписка); + СтрокаДереваПоОтбору = Неопределено; + + ДеревоЭлементов = РезультатПоиска.ДеревоЭлементов; + НайденныеЭлементы = РезультатПоиска.НайденныеЭлементы; + Для Каждого НайденныйЭлемент Из НайденныеЭлементы Цикл + СтрокаДляДобавления = ДеревоЭлементов.Строки.Найти(НайденныйЭлемент, "Идентификатор", Истина); + + ДобавляемыйЭлемент = ДобавитьЭлементПоПутиКДанным(ДеревоПолей, СтрокаДляДобавления); + ДобавляемыйЭлемент.СоответствуетОтбору = Истина; + СтрокаДереваПоОтбору = ?(СтрокаДереваПоОтбору = Неопределено, ДобавляемыйЭлемент, СтрокаДереваПоОтбору); + Если ДобавляемыйЭлемент.Родитель <> Неопределено Тогда + ДобавляемыйЭлемент.Родитель.ПодчиненныйЭлементСоответствуетОтбору = Истина; + КонецЕсли; + КонецЦикла; + + Форма.ЗначениеВРеквизитФормы(ДеревоПолей, ИмяСписка); + + СтрокаКоллекции = СтрокаКоллекцииПоСтрокеДерева(Форма[ИмяСписка], СтрокаДереваПоОтбору, ДеревоПолей); + Форма.Элементы[ИмяСписка].ТекущаяСтрока = СтрокаКоллекции.ПолучитьИдентификатор(); + + Форма.Элементы[ИмяСписка + "Представление"].Видимость = Ложь; + Форма.Элементы[ИмяСписка + "ПредставлениеПутиКДанным"].Видимость = Истина; + Форма.Элементы[ИмяСписка].Отображение = ОтображениеТаблицы.Список; +КонецПроцедуры + +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// Сообщения - Массив +// ИдентификаторЗадания - УникальныйИдентификатор +// +Процедура ОбработатьСообщенияПоиска(Форма, Сообщения, ИдентификаторЗадания) + + ИмяСтрокиПоиска = ИмяСтрокиПоискаПоИдентификаторуЗадания(Форма, ИдентификаторЗадания); + + Если ИмяСтрокиПоиска = Неопределено Тогда + Возврат; + КонецЕсли; + + ИмяСписка = ИмяРеквизитаСпискаПолей(ИмяСтрокиПоиска); + + ДеревоПолей = Форма.РеквизитФормыВЗначение(ИмяСписка); + + ИдентификаторТекущейСтроки = Форма.Элементы[ИмяСписка].ТекущаяСтрока; + Если ИдентификаторТекущейСтроки <> Неопределено Тогда + СтрокаКоллекции = Форма[ИмяСписка].НайтиПоИдентификатору(ИдентификаторТекущейСтроки); + ТекущаяСтрокаДерева = ДеревоПолей.Строки.Найти(СтрокаКоллекции.ПутьКДанным, "ПутьКДанным", Истина); + ТекущаяСтрокаДерева = ?(СтрокаКоллекции.СоответствуетОтбору, ТекущаяСтрокаДерева, Неопределено); + КонецЕсли; + + ПоступилиНовыеРезультатыПоиска = Ложь; + + СтрокаДереваПоОтбору = Неопределено; + + Для каждого Сообщение Из Сообщения Цикл + + Результат = ОбщегоНазначения.ЗначениеИзСтрокиXML(Сообщение.Текст); + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + Если Результат.Свойство("Элементы") Тогда + Для Каждого Элемент Из Результат.Элементы Цикл + ЗаполнитьЗначенияСвойств(Форма.Элементы[Элемент.Ключ], Элемент.Значение); + КонецЦикла; + КонецЕсли; + + Если Результат.Свойство("НайденныеЭлементы") Тогда + + ДеревоЭлементов = Результат.ДеревоЭлементов; + НайденныеЭлементы = Результат.НайденныеЭлементы; + Для Каждого НайденныйЭлемент Из НайденныеЭлементы Цикл + СтрокаДляДобавления = ДеревоЭлементов.Строки.Найти(НайденныйЭлемент, "Идентификатор", Истина); + + ДобавляемыйЭлемент = ДобавитьЭлементПоПутиКДанным(ДеревоПолей, СтрокаДляДобавления); + ДобавляемыйЭлемент.СоответствуетОтбору = Истина; + СтрокаДереваПоОтбору = ?(СтрокаДереваПоОтбору = Неопределено, ДобавляемыйЭлемент, СтрокаДереваПоОтбору); + Если ДобавляемыйЭлемент.Родитель <> Неопределено Тогда + ДобавляемыйЭлемент.Родитель.ПодчиненныйЭлементСоответствуетОтбору = Истина; + КонецЕсли; + КонецЦикла; + + Форма.ЗначениеВРеквизитФормы(ДеревоПолей, ИмяСписка); + ПоступилиНовыеРезультатыПоиска = Истина; КонецЕсли; - Реквизит.ПодчиненныйЭлементСоответствуетОтбору = УстановитьОтбор(Форма, ИмяСписка, Отбор, Реквизит, Уровень); - ЕстьРеквизитыСоответствующиеОтбору = ЕстьРеквизитыСоответствующиеОтбору Или Реквизит.СоответствуетОтбору - Или Реквизит.ПодчиненныйЭлементСоответствуетОтбору; КонецЦикла; - Возврат ЕстьРеквизитыСоответствующиеОтбору; + Если ПоступилиНовыеРезультатыПоиска Тогда + Если ТекущаяСтрокаДерева = Неопределено Тогда + СтрокаКоллекции = СтрокаКоллекцииПоСтрокеДерева(Форма[ИмяСписка], СтрокаДереваПоОтбору, ДеревоПолей); + Иначе + СтрокаКоллекции = СтрокаКоллекцииПоСтрокеДерева(Форма[ИмяСписка], ТекущаяСтрокаДерева, ДеревоПолей); + КонецЕсли; + Форма.Элементы[ИмяСписка].ТекущаяСтрока = СтрокаКоллекции.ПолучитьИдентификатор(); + КонецЕсли; + +КонецПроцедуры + +Функция ИмяСтрокиПоискаПоИдентификаторуЗадания(Форма, ИдентификаторЗадания) + СоответствиеЗаданий = ПолучитьИзВременногоХранилища(Форма.АдресОписанияДлительнойОперации); + Для Каждого Задание Из СоответствиеЗаданий Цикл + Если Задание.Значение = ИдентификаторЗадания Тогда + Возврат Задание.Ключ; + КонецЕсли; + КонецЦикла; +КонецФункции + +// Параметры: +// ДеревоФормы - ДанныеФормыДерево +// ТекущаяСтрокаДерева - СтрокаДереваЗначений +// ДеревоПолей - ДеревоЗначений +// +Функция СтрокаКоллекцииПоСтрокеДерева(ДеревоФормы, ТекущаяСтрокаДерева, ДеревоПолей) + РодительТекущейСтроки = ТекущаяСтрокаДерева.Родитель; + Если РодительТекущейСтроки <> Неопределено Тогда + Результат = СтрокаКоллекцииПоСтрокеДерева(ДеревоФормы, РодительТекущейСтроки, ДеревоПолей); + ИндексСтрокиДерева = РодительТекущейСтроки.Строки.Индекс(ТекущаяСтрокаДерева); + Возврат Результат.ПолучитьЭлементы().Получить(ИндексСтрокиДерева); + Иначе + ИндексСтрокиДерева = ДеревоПолей.Строки.Индекс(ТекущаяСтрокаДерева); + Возврат ДеревоФормы.ПолучитьЭлементы().Получить(ИндексСтрокиДерева); + КонецЕсли; + +КонецФункции + + +// Параметры: +// ДеревоПолей - ДеревоЗначений +// СтрокаДляДобавления - СтрокаДереваЗначений +// +// Возвращаемое значение: +// +Функция ДобавитьЭлементПоПутиКДанным(ДеревоПолей, СтрокаДляДобавления) + НайденнаяСтрока = ДеревоПолей.Строки.Найти(СтрокаДляДобавления.ПутьКДанным, "ПутьКДанным", Истина); + Если НайденнаяСтрока <> Неопределено Тогда + Возврат НайденнаяСтрока; + Иначе + СтрокаРодителя = ДобавитьЭлементПоПутиКДанным(ДеревоПолей, СтрокаДляДобавления.Родитель); + СтрокиТекущегоУровня = СтрокаРодителя.Строки; + СтрокиТекущегоУровня.Очистить(); + КоллекцияСтрокУровня = СтрокаДляДобавления.Родитель.Строки; + Для Каждого СтрокаУровня Из КоллекцияСтрокУровня Цикл + НоваяСтрокаДереваПолей = СтрокиТекущегоУровня.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрокаДереваПолей, СтрокаУровня,,"Родитель"); + + ЕстьПодчиненные = СтрокаУровня.Папка ИЛИ СтрокаУровня.Таблица; + + Если Не ЕстьПодчиненные Тогда + Для Каждого Тип Из СтрокаУровня.Тип.Типы() Цикл + ЕстьПодчиненные = ЕстьПодчиненные ИЛИ ОбщегоНазначения.ЭтоСсылка(Тип); + Если ЕстьПодчиненные Тогда + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если ЕстьПодчиненные Тогда + НоваяСтрокаДереваПолей.Строки.Добавить(); + КонецЕсли; + + КонецЦикла; + + Возврат СтрокиТекущегоУровня.Найти(СтрокаДляДобавления.ПутьКДанным, "ПутьКДанным"); + + КонецЕсли; КонецФункции +Функция ПолучитьМассивИменПоляКомпоновки(ПолеКомпоновки) + Представление = Строка(ПолеКомпоновки); + Результат = Новый Массив; + МассивСлов = СтрРазделить(Представление, "[]"); + Если МассивСлов.Количество() = 1 Тогда + Состав = СтрРазделить(Представление, ".", Истина); + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, Состав, Ложь); + Иначе + Для Каждого Слово Из МассивСлов Цикл + Состав = СтрРазделить(Слово, ".", Истина); + Если Состав[0] = "" Тогда + Состав.Удалить(0); + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, Состав, Ложь); + ИначеЕсли Состав[Состав.ВГраница()] = "" Тогда + Состав.Удалить(Состав.ВГраница()); + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, Состав, Ложь); + Иначе + Результат.Добавить("["+Слово+"]"); + КонецЕсли; + КонецЦикла; + КонецЕсли; + Возврат Результат; +КонецФункции + +Процедура УстановитьНайденныйЭлементДерева(Форма, СписокПолей, ИмяСпискаПолей, МассивПутиКДанным, НайденныйЭлемент, Уровень = 0) + + МассивПутиКДаннымВр = Новый Массив(Новый ФиксированныйМассив(МассивПутиКДанным)); + + Пока МассивПутиКДаннымВр.ВГраница() > Уровень Цикл + МассивПутиКДаннымВр.Удалить(МассивПутиКДаннымВр.ВГраница()); + КонецЦикла; + + ИскомыйПутьКДанным = СтрСоединить(МассивПутиКДаннымВр, "."); + ПараметрыЗаполнения = Новый Структура; + ПараметрыЗаполнения.Вставить("ИмяСписка", ИмяСпискаПолей); + + Для Каждого Элемент Из СписокПолей Цикл + ПутьКДанным = Элемент.ПутьКДанным; + КоличествоСлов = СтрРазделить(ПутьКДанным, ".", Ложь); + Если КоличествоСлов.Количество() < Уровень + 1 Тогда + ПутьКДанным = СтрСоединить(ПолучитьМассивИменПоляКомпоновки(Элемент.Поле), "."); + КонецЕсли; + + Если ПутьКДанным = ИскомыйПутьКДанным Тогда + Если МассивПутиКДанным.ВГраница() = Уровень Тогда + Элемент.СоответствуетОтбору = Истина; + Элемент.ПредставлениеПутиКДанным = НайденныйЭлемент.ПредставлениеПутиКДанным; + Прервать; + Иначе + Элемент.ПодчиненныйЭлементСоответствуетОтбору = Истина; + ПодчиненныеЭлементы = Элемент.ПолучитьЭлементы(); + Если ПодчиненныеЭлементы.Количество() < 2 Тогда + ИдентификаторЭлемента = Элемент.ПолучитьИдентификатор(); + + ПараметрыЗаполнения.Вставить("ИдентификаторСтроки", ИдентификаторЭлемента); + ЗаполнитьСписокДоступныхПолей(Форма, ПараметрыЗаполнения); + КонецЕсли; + + УстановитьНайденныйЭлементДерева(Форма, Элемент.ПолучитьЭлементы(), ИмяСпискаПолей, МассивПутиКДанным, НайденныйЭлемент, Уровень+1) + КонецЕсли; + КонецЕсли; + КонецЦикла; +КонецПроцедуры + Функция РодительскийРеквизитСоответствуетОтбору(Реквизит) - Родитель = Реквизит.ПолучитьРодителя(); + Родитель = Родитель(Реквизит); + Если Родитель <> Неопределено Тогда Возврат Родитель.СоответствуетОтбору Или РодительскийРеквизитСоответствуетОтбору(Родитель); КонецЕсли; @@ -1456,8 +2232,9 @@ Процедура РазвернутьРеквизит(ИдентификаторСтроки, ИмяСписка, Форма) Отбор = Форма[ИмяРеквизитаСтрокиПоискаСпискаПолей(ИмяСписка)]; - ТекущиеДанные = Форма[ИмяСписка].НайтиПоИдентификатору(ИдентификаторСтроки); - КоллекцияРеквизитов = ТекущиеДанные.ПолучитьЭлементы(); + + ТекущиеДанные = НайтиПоИдентификатору(Форма[ИмяСписка], ИдентификаторСтроки); + КоллекцияРеквизитов = ПодчиненныеЭлементы(ТекущиеДанные); НастройкиСписка = КонструкторФормулКлиентСервер.НастройкиСпискаПолей(Форма, ИмяСписка); @@ -1467,8 +2244,26 @@ КоллекцияРеквизитов.Очистить(); ИсточникиДоступныхПолей = СписокИсточниковДоступныхПолей(Форма, ИмяСписка); - ЗаполнитьСписокДоступныхРеквизитов(ТекущиеДанные, ИсточникиДоступныхПолей, Отбор, НастройкиСписка); + Если ТипЗнч(ИсточникиДоступныхПолей) = Тип("Строка") Тогда + ИсточникиДоступныхПолей = ОбщегоНазначения.ЗначениеИзСтрокиXML(ИсточникиДоступныхПолей); + ИмяСпискаИсточников = КонструкторФормулКлиентСервер.НастройкиСпискаПолей(Форма, ИмяСписка).ИмяСпискаИсточников; + Для Каждого СтрокаТаблицы Из ИсточникиДоступныхПолей Цикл + + Если СтрокаТаблицы.СхемаКомпоновкиДанных <> Неопределено Тогда + СтрокаТаблицы.СхемаКомпоновкиДанных = ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаТаблицы.СхемаКомпоновкиДанных); + КонецЕсли; + + Контейнер = ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаТаблицы.КоллекцияПолей); + СтрокаТаблицы.КоллекцияПолей = ДоступныеПоляИзКонтейнераСКД(Контейнер); + + КонецЦикла; + Форма[ИмяСпискаИсточников] = ИсточникиДоступныхПолей; + КонецЕсли; + ЗаполнитьСписокДоступныхРеквизитов(ТекущиеДанные, ИсточникиДоступныхПолей, Отбор, НастройкиСписка); + Если ТипЗнч(ТекущиеДанные) = Тип("СтрокаДереваЗначений") Тогда + УстановитьИдентификаторыСтрокДерева(ТекущиеДанные); + КонецЕсли; КонецПроцедуры Процедура РазвернутьПоле(ТекущиеДанные, ИсточникиДоступныхПолей, НастройкиСписка) @@ -1662,7 +2457,13 @@ Операнд = ЭлементыФормулы.ВсеЭлементы[ОписаниеЭлемента.Ключ]; ЭтоФункция = ОписаниеЭлемента.Значение; - ПутьКДанным = Строка(Новый ПолеКомпоновкиДанных(ОчиститьКвадратныеСкобки(Операнд))); + ПутьКДанным = ОчиститьКвадратныеСкобки(Операнд); + Если СтрНайти(ПутьКДанным, "[") Или СтрНайти(ПутьКДанным, "]") Тогда + Продолжить; + КонецЕсли; + + ПутьКДанным = Строка(Новый ПолеКомпоновкиДанных(ПутьКДанным)); + Реквизит = НайтиРеквизит(Форма, ИмяСпискаПолей, ПутьКДанным, КоллекцияПолей.ПолучитьЭлементы(), Ложь); Если Реквизит <> Неопределено Тогда Если ЭтоФункция <> Реквизит.ЭтоФункция Тогда @@ -1732,14 +2533,18 @@ Поле = СхемаКомпоновкиДанных.НаборыДанных[0].Поля.Найти(ПутьКДанным); Если ТипЗнч(Поле) <> Тип("ПолеНабораДанныхСхемыКомпоновкиДанных") Тогда - Возврат ""; + Если ПутьКДанным = "Дата" Тогда + Возврат "ДЛФ=D;"; + Иначе + Возврат ""; + КонецЕсли; КонецЕсли; ЗначениеПараметра = Поле.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Формат")); Если ЗначениеПараметра <> Неопределено Тогда Возврат ЗначениеПараметра.Значение; КонецЕсли; - + Возврат ""; КонецФункции @@ -1998,24 +2803,24 @@ Функция КартинкаТипа(ОписаниеТипов) - Картинка = БиблиотекаКартинок.ТипНеопределено; + Картинка = КонструкторФормулПовтИсп.КартинкаПоИмени("ТипНеопределено"); Если ОписаниеТипов.Типы().Количество() = 1 Тогда Тип = ОписаниеТипов.Типы()[0]; Если Тип = Тип("Число") Тогда - Картинка = БиблиотекаКартинок.ТипЧисло; + Картинка = КонструкторФормулПовтИсп.КартинкаПоИмени("ТипЧисло"); ИначеЕсли Тип = Тип("Дата") Тогда - Картинка = БиблиотекаКартинок.ТипДата; + Картинка = КонструкторФормулПовтИсп.КартинкаПоИмени("ТипДата"); ИначеЕсли Тип = Тип("Булево") Тогда - Картинка = БиблиотекаКартинок.ТипБулево; + Картинка = КонструкторФормулПовтИсп.КартинкаПоИмени("ТипБулево"); ИначеЕсли Тип = Тип("Строка") Тогда - Картинка = БиблиотекаКартинок.ТипСтрока; + Картинка = КонструкторФормулПовтИсп.КартинкаПоИмени("ТипСтрока"); ИначеЕсли ОбщегоНазначения.ЭтоСсылка(Тип) Тогда - Картинка = БиблиотекаКартинок.ТипСсылка; + Картинка = КонструкторФормулПовтИсп.КартинкаПоИмени("ТипСсылка"); ИначеЕсли Тип = Тип("УникальныйИдентификатор") Тогда - Картинка = БиблиотекаКартинок.ТипИдентификатор; + Картинка = КонструкторФормулПовтИсп.КартинкаПоИмени("ТипИдентификатор"); КонецЕсли; ИначеЕсли ОписаниеТипов.Типы().Количество() > 1 Тогда - Картинка = БиблиотекаКартинок.ТипСоставнойОсновной; + Картинка = КонструкторФормулПовтИсп.КартинкаПоИмени("ТипСоставнойОсновной"); КонецЕсли; Возврат Картинка; @@ -2027,20 +2832,16 @@ СписокОператоров = ДеревоПолей(); Если ГруппыОператоров = Неопределено Тогда - ГруппыОператоров = "Разделители, Операторы, ЛогическиеОператорыИКонстанты, - |ЧисловыеФункции, СтроковыеФункции, ПрочиеФункции"; + ГруппыОператоров = "ЛогическиеОператорыИКонстанты, + |ЧисловыеФункции, СтроковыеФункции, ФункцииДляТабличныхЧастей, ПрочиеФункции"; ИначеЕсли ГруппыОператоров = "ВсеОператорыСКД" Тогда - ГруппыОператоров = "Операторы, ОперацииНадСтрокамиСКД, РаботаСДатамиСКД, ОперацииСравненияСКД, + ГруппыОператоров = "ОперацииНадСтрокамиСКД, РаботаСДатамиСКД, ОперацииСравненияСКД, |ЛогическиеОперацииСКД, АгрегатныеФункцииСКД, ПрочиеФункцииСКД"; КонецЕсли; Для Каждого Элемент Из Новый Структура(ГруппыОператоров) Цикл ИмяГруппы = Элемент.Ключ; - Если ИмяГруппы = "Разделители" Тогда - ДобавитьГруппуОператоровРазделители(СписокОператоров); - ИначеЕсли ИмяГруппы = "Операторы" Тогда - ДобавитьГруппуОператоровОператоры(СписокОператоров); - ИначеЕсли ИмяГруппы = "ЛогическиеОператорыИКонстанты" Тогда + Если ИмяГруппы = "ЛогическиеОператорыИКонстанты" Тогда ДобавитьГруппуОператоровЛогическиеОператорыИКонстанты(СписокОператоров); ИначеЕсли ИмяГруппы = "ЧисловыеФункции" Тогда ДобавитьГруппуОператоровЧисловыеФункции(СписокОператоров); @@ -2058,6 +2859,8 @@ ДобавитьГруппуОператоровЛогическиеОперации(СписокОператоров); ИначеЕсли ИмяГруппы = "АгрегатныеФункцииСКД" Тогда ДобавитьГруппуОператоровАгрегатныеФункции(СписокОператоров); + ИначеЕсли ИмяГруппы = "ФункцииДляТабличныхЧастей" Тогда + ДобавитьГруппуОператоровФункцииДляТабличныхЧастей(СписокОператоров); ИначеЕсли ИмяГруппы = "ПрочиеФункцииСКД" Тогда ДобавитьГруппуОператоровПрочиеФункцииСКД(СписокОператоров); КонецЕсли; @@ -2067,34 +2870,6 @@ КонецФункции -Процедура ДобавитьГруппуОператоровРазделители(СписокОператоров) - - Группа = СписокОператоров.Строки.Добавить(); - Группа.Идентификатор = "Разделители"; - Группа.Представление = НСтр("ru = 'Разделители'"); - Группа.Порядок = 1; - - Для Каждого Идентификатор Из СтрРазделить("/ | \ _ , . ( ) """, " ", Ложь) Цикл - ДобавитьОператорВГруппу(Группа, Идентификатор, , Новый ОписаниеТипов("Строка")); - КонецЦикла; - - ДобавитьОператорВГруппу(Группа, " ", НСтр("ru = 'Пробел'"), Новый ОписаниеТипов("Строка")); - -КонецПроцедуры - -Процедура ДобавитьГруппуОператоровОператоры(СписокОператоров) - - Группа = СписокОператоров.Строки.Добавить(); - Группа.Идентификатор = "Операторы"; - Группа.Представление = НСтр("ru = 'Операторы'"); - Группа.Порядок = 2; - - Для Каждого Идентификатор Из СтрРазделить("+ - * / %", " ", Ложь) Цикл - ДобавитьОператорВГруппу(Группа, Идентификатор, , Новый ОписаниеТипов("Число")); - КонецЦикла; - -КонецПроцедуры - Процедура ДобавитьГруппуОператоровЛогическиеОператорыИКонстанты(СписокОператоров) Группа = СписокОператоров.Строки.Добавить(); @@ -2104,10 +2879,6 @@ Тип = Новый ОписаниеТипов("Булево"); - Для Каждого Идентификатор Из СтрРазделить("<,>,<=,>=,=,<>", ",", Ложь) Цикл - ДобавитьОператорВГруппу(Группа, Идентификатор, , Тип); - КонецЦикла; - ДобавитьОператорВГруппу(Группа, "И", НСтр("ru = 'И'"), Тип); ДобавитьОператорВГруппу(Группа, "Или", НСтр("ru = 'Или'"), Тип); ДобавитьОператорВГруппу(Группа, "Не", НСтр("ru = 'Не'"), Тип); @@ -2129,7 +2900,7 @@ ДобавитьОператорВГруппу(Группа, "Макс", НСтр("ru = 'Максимум'"), Тип, Истина); ДобавитьОператорВГруппу(Группа, "Мин", НСтр("ru = 'Минимум'"), Тип, Истина); ДобавитьОператорВГруппу(Группа, "Окр", НСтр("ru = 'Округлить'"), Тип, Истина); - ДобавитьОператорВГруппу(Группа, "Цел", НСтр("ru = 'ЦелаяЧасть'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "Цел", НСтр("ru = 'Целая часть'"), Тип, Истина); КонецПроцедуры @@ -2145,17 +2916,17 @@ // В НСтр переводимые на другие языки идентификаторы. - ДобавитьОператорВГруппу(Группа, "Строка", НСтр("ru = 'ПреобразоватьВСтроку'"), Тип, Истина); - ДобавитьОператорВГруппу(Группа, "ВРег", НСтр("ru = 'ВсеПрописные'"), Тип, Истина); - ДобавитьОператорВГруппу(Группа, "НРег", НСтр("ru = 'ВсеСтрочные'"), Тип, Истина); - ДобавитьОператорВГруппу(Группа, "ТРег", НСтр("ru = 'КаждоеСловоСПрописной'"), Тип, Истина); - ДобавитьОператорВГруппу(Группа, "Лев", НСтр("ru = 'СимволыСлева'"), Тип, Истина); - ДобавитьОператорВГруппу(Группа, "Прав", НСтр("ru = 'СимволыСправа'"), Тип, Истина); - ДобавитьОператорВГруппу(Группа, "СокрЛ", НСтр("ru = 'УбратьПробелыСлева'"), Тип, Истина); - ДобавитьОператорВГруппу(Группа, "СокрЛП", НСтр("ru = 'УбратьПробелыСлеваИСправа'"), Тип, Истина); - ДобавитьОператорВГруппу(Группа, "СокрП", НСтр("ru = 'УбратьПробелыСправа'"), Тип, Истина); - ДобавитьОператорВГруппу(Группа, "СтрЗаменить", НСтр("ru = 'ЗаменитьСимволыВСтроке'"), Тип, Истина); - ДобавитьОператорВГруппу(Группа, "СтрДлина", НСтр("ru = 'ДлинаСтроки'"), Новый ОписаниеТипов("Число"), Истина); + ДобавитьОператорВГруппу(Группа, "Строка", НСтр("ru = 'Преобразовать в строку'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "ВРег", НСтр("ru = 'Все прописные'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "НРег", НСтр("ru = 'Все строчные'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "ТРег", НСтр("ru = 'Каждое слово с прописной'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "Лев", НСтр("ru = 'Символы слева'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "Прав", НСтр("ru = 'Символы справа'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "СокрЛ", НСтр("ru = 'Убрать пробелы слева'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "СокрЛП", НСтр("ru = 'Убрать пробелы слева и справа'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "СокрП", НСтр("ru = 'Убрать пробелы справа'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "СтрЗаменить", НСтр("ru = 'Заменить символы в строке'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "СтрДлина", НСтр("ru = 'Длина строки'"), Новый ОписаниеТипов("Число"), Истина); КонецПроцедуры @@ -2168,25 +2939,21 @@ Группа.Картинка = БиблиотекаКартинок.ТипФункция; ДобавитьОператорВГруппу(Группа, "?", НСтр("ru = 'Условие'"), Новый ОписаниеТипов("Булево"), Истина); - ДобавитьОператорВГруппу(Группа, "ПредопределенноеЗначение", НСтр("ru = 'ПредопределенноеЗначение'"), Новый ОписаниеТипов, Истина); - ДобавитьОператорВГруппу(Группа, "ЗначениеЗаполнено", НСтр("ru = 'ЗначениеЗаполнено'"), Новый ОписаниеТипов("Булево"), Истина); + ДобавитьОператорВГруппу(Группа, "ЗначениеЗаполнено", НСтр("ru = 'Значение заполнено'"), Новый ОписаниеТипов("Булево"), Истина); ДобавитьОператорВГруппу(Группа, "Формат", НСтр("ru = 'Формат'"), Новый ОписаниеТипов("Строка"), Истина); КонецПроцедуры -Процедура ДобавитьОператорВГруппу(Группа, Идентификатор, Знач Представление = Неопределено, Тип = Неопределено, ЭтоФункция = Ложь) - - Если Представление = Неопределено Тогда - Представление = Идентификатор; - КонецЕсли; +Процедура ДобавитьОператорВГруппу(Группа, Идентификатор, Знач Представление, Тип = Неопределено, ЭтоФункция = Ложь, Скрытый = Ложь) Оператор = Группа.Строки.Добавить(); Оператор.Идентификатор = Идентификатор; - Оператор.Представление = Представление; + Оператор.Представление = ПредставлениеОператора(Представление); Оператор.ТипЗначения = Тип; Оператор.Картинка = БиблиотекаКартинок.Пустая; Оператор.ЭтоФункция = ЭтоФункция; - + Оператор.Скрытый = Скрытый; + КонецПроцедуры Процедура ДобавитьГруппуОператоровОперацииНадСтроками(СписокОператоров) @@ -2198,7 +2965,6 @@ Тип = Новый ОписаниеТипов("Строка"); - ДобавитьОператорВГруппу(Группа, "+", , Тип); ДобавитьОператорВГруппу(Группа, "ПОДОБНО", НСтр("ru = 'ПОДОБНО'"), Тип); КонецПроцедуры @@ -2216,22 +2982,22 @@ ДобавитьОператорВГруппу(Группа, "ГОД", НСтр("ru = 'ГОД'"), Тип, Истина); ДобавитьОператорВГруппу(Группа, "МЕСЯЦ", НСтр("ru = 'МЕСЯЦ'"), Тип, Истина); ДобавитьОператорВГруппу(Группа, "ЧИСЛО", НСтр("ru = 'ЧИСЛО'"), Тип, Истина); - ДобавитьОператорВГруппу(Группа, "ДЕНЬГОДА", НСтр("ru = 'ДЕНЬГОДА'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "ДЕНЬГОДА", НСтр("ru = 'День года'"), Тип, Истина); ДобавитьОператорВГруппу(Группа, "ДЕНЬ", НСтр("ru = 'ДЕНЬ'"), Тип, Истина); ДобавитьОператорВГруппу(Группа, "НЕДЕЛЯ", НСтр("ru = 'НЕДЕЛЯ'"), Тип, Истина); - ДобавитьОператорВГруппу(Группа, "ДЕНЬНЕДЕЛИ", НСтр("ru = 'ДЕНЬНЕДЕЛИ'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "ДЕНЬНЕДЕЛИ", НСтр("ru = 'День недели'"), Тип, Истина); ДобавитьОператорВГруппу(Группа, "ЧАС", НСтр("ru = 'ЧАС'"), Тип, Истина); ДобавитьОператорВГруппу(Группа, "МИНУТА", НСтр("ru = 'МИНУТА'"), Тип, Истина); ДобавитьОператорВГруппу(Группа, "СЕКУНДА", НСтр("ru = 'СЕКУНДА'"), Тип, Истина); - ДобавитьОператорВГруппу(Группа, "НАЧАЛОПЕРИОДА", НСтр("ru = 'НАЧАЛОПЕРИОДА'"), Новый ОписаниеТипов, Истина); - ДобавитьОператорВГруппу(Группа, "КОНЕЦПЕРИОДА", НСтр("ru = 'КОНЕЦПЕРИОДА'"), Новый ОписаниеТипов, Истина); - ДобавитьОператорВГруппу(Группа, "ДОБАВИТЬКДАТЕ", НСтр("ru = 'ДОБАВИТЬКДАТЕ'"), Новый ОписаниеТипов, Истина); + ДобавитьОператорВГруппу(Группа, "НАЧАЛОПЕРИОДА", НСтр("ru = 'Начало периода'"), Новый ОписаниеТипов, Истина); + ДобавитьОператорВГруппу(Группа, "КОНЕЦПЕРИОДА", НСтр("ru = 'Конец периода'"), Новый ОписаниеТипов, Истина); + ДобавитьОператорВГруппу(Группа, "ДОБАВИТЬКДАТЕ", НСтр("ru = 'Добавить к дате'"), Новый ОписаниеТипов, Истина); - ДобавитьОператорВГруппу(Группа, "РАЗНОСТЬДАТ", НСтр("ru = 'РАЗНОСТЬДАТ'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "РАЗНОСТЬДАТ", НСтр("ru = 'Разность дат'"), Тип, Истина); + + ДобавитьОператорВГруппу(Группа, "ТЕКУЩАЯДАТА", НСтр("ru = 'Текущая дата'"), Новый ОписаниеТипов, Истина); - ДобавитьОператорВГруппу(Группа, "ТЕКУЩАЯДАТА", НСтр("ru = 'ТЕКУЩАЯДАТА'"), Новый ОписаниеТипов, Истина); - КонецПроцедуры Процедура ДобавитьГруппуОператоровОперацииСравнения(СписокОператоров) @@ -2243,12 +3009,8 @@ Тип = Новый ОписаниеТипов("Булево"); - Для Каждого Идентификатор Из СтрРазделить("<,>,<=,>=,=,<>", ",", Ложь) Цикл - ДобавитьОператорВГруппу(Группа, Идентификатор, , Тип); - КонецЦикла; - ДобавитьОператорВГруппу(Группа, "В", НСтр("ru = 'В'"), Тип, Истина); - ДобавитьОператорВГруппу(Группа, "ЗНАЧЕНИЕЗАПОЛНЕНО", НСтр("ru = 'ЗНАЧЕНИЕЗАПОЛНЕНО'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "ЗначениеЗаполнено", НСтр("ru = 'Значение заполнено'"), Тип, Истина); КонецПроцедуры @@ -2269,63 +3031,29 @@ Оператор.Идентификатор = "ВЫБОРКОГДАТОГДАИНАЧЕКОНЕЦ"; Оператор.Представление = СтрШаблон( НСтр("ru = '%1 %2 ... %3 ...'"), - НСтр("ru = 'ВЫБОР'"), - НСтр("ru = 'КОГДА'"), - НСтр("ru = 'ТОГДА'")); + ПредставлениеОператора(НСтр("ru = 'ВЫБОР'")), + ПредставлениеОператора(НСтр("ru = 'КОГДА'")), + ПредставлениеОператора(НСтр("ru = 'ТОГДА'"))); Оператор.Картинка = БиблиотекаКартинок.Пустая; Оператор.ВыражениеДляВставки = СтрШаблон(НСтр( "ru = '%1 | %2 <%6> %3 <%6> | %4 <%6> |%5'"), - НСтр("ru = 'ВЫБОР'"), - НСтр("ru = 'КОГДА'"), - НСтр("ru = 'ТОГДА'"), - НСтр("ru = 'ИНАЧЕ'"), - НСтр("ru = 'КОНЕЦ'"), + ПредставлениеОператора(НСтр("ru = 'ВЫБОР'")), + ПредставлениеОператора(НСтр("ru = 'КОГДА'")), + ПредставлениеОператора(НСтр("ru = 'ТОГДА'")), + ПредставлениеОператора(НСтр("ru = 'ИНАЧЕ'")), + ПредставлениеОператора(НСтр("ru = 'КОНЕЦ'")), НСтр("ru = 'Выражение'")); - Оператор = Группа.Строки.Добавить(); - Оператор.Идентификатор = "ВЫБОР"; - Оператор.Представление = НСтр("ru = 'ВЫБОР'"); - Оператор.Картинка = БиблиотекаКартинок.Пустая; - Оператор.Скрытый = Истина; - - Оператор = Группа.Строки.Добавить(); - Оператор.Идентификатор = "КОГДА"; - Оператор.Представление = НСтр("ru = 'КОГДА'"); - Оператор.Картинка = БиблиотекаКартинок.Пустая; - Оператор.Скрытый = Истина; - - Оператор = Группа.Строки.Добавить(); - Оператор.Идентификатор = "ТОГДА"; - Оператор.Представление = НСтр("ru = 'ТОГДА'"); - Оператор.Картинка = БиблиотекаКартинок.Пустая; - Оператор.Скрытый = Истина; - - Оператор = Группа.Строки.Добавить(); - Оператор.Идентификатор = "ИНАЧЕ"; - Оператор.Представление = НСтр("ru = 'ИНАЧЕ'"); - Оператор.Картинка = БиблиотекаКартинок.Пустая; - Оператор.Скрытый = Истина; - - Оператор = Группа.Строки.Добавить(); - Оператор.Идентификатор = "КОНЕЦ"; - Оператор.Представление = НСтр("ru = 'КОНЕЦ'"); - Оператор.Картинка = БиблиотекаКартинок.Пустая; - Оператор.Скрытый = Истина; - - Оператор = Группа.Строки.Добавить(); - Оператор.Идентификатор = "ИСТИНА"; - Оператор.Представление = НСтр("ru = 'ИСТИНА'"); - Оператор.Картинка = БиблиотекаКартинок.Пустая; - Оператор.Скрытый = Истина; - - Оператор = Группа.Строки.Добавить(); - Оператор.Идентификатор = "ЛОЖЬ"; - Оператор.Представление = НСтр("ru = 'ЛОЖЬ'"); - Оператор.Картинка = БиблиотекаКартинок.Пустая; - Оператор.Скрытый = Истина; + ДобавитьОператорВГруппу(Группа, "ВЫБОР", НСтр("ru = 'ВЫБОР'"), , , Истина); + ДобавитьОператорВГруппу(Группа, "КОГДА", НСтр("ru = 'КОГДА'"), , , Истина); + ДобавитьОператорВГруппу(Группа, "ТОГДА", НСтр("ru = 'ТОГДА'"), , , Истина); + ДобавитьОператорВГруппу(Группа, "ИНАЧЕ", НСтр("ru = 'ИНАЧЕ'"), , , Истина); + ДобавитьОператорВГруппу(Группа, "КОНЕЦ", НСтр("ru = 'КОНЕЦ'"), , , Истина); + ДобавитьОператорВГруппу(Группа, "ИСТИНА", НСтр("ru = 'ИСТИНА'"), , , Истина); + ДобавитьОператорВГруппу(Группа, "ЛОЖЬ", НСтр("ru = 'ЛОЖЬ'"), , , Истина); КонецПроцедуры @@ -2360,12 +3088,34 @@ КонецПроцедуры +Процедура ДобавитьГруппуОператоровФункцииДляТабличныхЧастей(СписокОператоров) + Группа = СписокОператоров.Строки.Добавить(); + Группа.Идентификатор = "ФункцииДляТабличныхЧастей"; + Группа.Представление = НСтр("ru = 'Функции для табличных частей'"); + Группа.Порядок = 7; + Группа.Картинка = БиблиотекаКартинок.ТипФункция; + + Тип = Новый ОписаниеТипов("Число"); + + ДобавитьОператорВГруппу(Группа, "УправлениеПечатью_СуммаПоКолонке", НСтр("ru = 'Сумма по колонке'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "УправлениеПечатью_КоличествоСтрок", НСтр("ru = 'Количество строк'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "УправлениеПечатью_МаксимумПоКолонке", НСтр("ru = 'Максимум по колонке'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "УправлениеПечатью_МинимумПоКолонке", НСтр("ru = 'Минимум по колонке'"), Тип, Истина); + ДобавитьОператорВГруппу(Группа, "УправлениеПечатью_СреднееПоКолонке", НСтр("ru = 'Среднее по колонке'"), Тип, Истина); +КонецПроцедуры + Функция ИмяРеквизитаСтрокиПоискаСпискаПолей(ИмяСпискаПолей) Возврат "СтрокаПоиска" + ИмяСпискаПолей; КонецФункции +Функция ИмяРеквизитаСпискаПолей(ИмяСтрокиПоискаСпискаПолей) + + Возврат СтрЗаменить(ИмяСтрокиПоискаСпискаПолей, "СтрокаПоиска", ""); + +КонецФункции + Функция ИмяОсновногоИсточникаДанных(ИсточникиДоступныхПолей) Если ИсточникиДоступныхПолей.Количество() > 0 Тогда @@ -2467,4 +3217,24 @@ КонецФункции +Процедура УбратьПризнакОтбора(Коллекция) + Для Каждого СтрокаКоллекции Из Коллекция.Строки Цикл + СтрокаКоллекции.СоответствуетОтбору = Ложь; + СтрокаКоллекции.ПодчиненныйЭлементСоответствуетОтбору = Ложь; + УбратьПризнакОтбора(СтрокаКоллекции); + КонецЦикла; +КонецПроцедуры + +Функция ДоступныеПоляВКонтейнерСКД(ДоступныеПоля) + ДеревоПолей = ДеревоПолей(); + ЗаполнитьДеревоПоДоступнымПолям(ДеревоПолей, ДоступныеПоля); + Возврат СхемаКомпоновкиДанныхИзДереваЗначений(ДеревоПолей); +КонецФункции + +Функция ПредставлениеОператора(Знач Оператор) + + Возврат СтрЗаменить(ТРег(Оператор), " ", "") + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/КонтрольВеденияУчета/Module.bsl b/SSL/src/CommonModules/КонтрольВеденияУчета/Module.bsl index ac9a6a26b..e4961f00b 100644 --- a/SSL/src/CommonModules/КонтрольВеденияУчета/Module.bsl +++ b/SSL/src/CommonModules/КонтрольВеденияУчета/Module.bsl @@ -1109,7 +1109,7 @@ ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры @@ -1135,7 +1135,7 @@ ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры @@ -1158,7 +1158,7 @@ ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры diff --git a/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебный/Module.bsl b/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебный/Module.bsl index e0dea1054..19ad8235c 100644 --- a/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебный/Module.bsl @@ -32,7 +32,7 @@ Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; Обработчик.Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Начальное заполнение признака %1 и расчет контрольных сумм в регистре сведений ""Результаты проверки учета"" для повышение производительности.'"), + НСтр("ru = 'Начальное заполнение признака %1 и расчет контрольных сумм в регистре сведений ""Результаты проверки учета"" для повышения производительности.'"), "ИгнорироватьПроблему"); Обработчик = Обработчики.Добавить(); @@ -1381,7 +1381,7 @@ Если ИсключаемыеИзПроверкиОбъекты.Найти(ПолноеИмя) <> Неопределено Тогда Продолжить; КонецЕсли; - НайтиБитыеСсылки(ОбъектМетаданных, ПараметрыПроверки, ПроверенныеСсылки); + НайтиБитыеСсылки(ОбъектМетаданных, ПараметрыПроверки, ПроверенныеСсылки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; КонецЦикла; @@ -1394,7 +1394,7 @@ Если ИсключаемыеИзПроверкиОбъекты.Найти(ПолноеИмя) <> Неопределено Тогда Продолжить; КонецЕсли; - НайтиБитыеСсылкиВРегистрах(ОбъектМетаданных, ПараметрыПроверки, ПроверенныеСсылки); + НайтиБитыеСсылкиВРегистрах(ОбъектМетаданных, ПараметрыПроверки, ПроверенныеСсылки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; КонецЦикла; @@ -1443,7 +1443,7 @@ Или СтрНачинаетсяС(ОбъектМетаданных.Имя, "Удалить") Тогда Продолжить; КонецЕсли; - НайтиНезаполненныеОбязательныеРеквизиты(ОбъектМетаданных, ПараметрыПроверки); + НайтиНезаполненныеОбязательныеРеквизиты(ОбъектМетаданных, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; КонецЦикла; @@ -1461,7 +1461,7 @@ Или СтрНачинаетсяС(ОбъектМетаданных.Имя, "Удалить") Тогда Продолжить; КонецЕсли; - НайтиНезаполненныеОбязательныеРеквизитыВРегистрах(ОбъектМетаданных, ПараметрыПроверки); + НайтиНезаполненныеОбязательныеРеквизитыВРегистрах(ОбъектМетаданных, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; КонецЦикла; @@ -1479,7 +1479,7 @@ Если Не ЕстьИерархия(ОбъектМетаданных.СтандартныеРеквизиты) Тогда Продолжить; КонецЕсли; - НайтиЦиклическиеСсылки(ОбъектМетаданных, ПараметрыПроверки); + НайтиЦиклическиеСсылки(ОбъектМетаданных, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; КонецЦикла; @@ -1520,7 +1520,7 @@ Если СтрНачинаетсяС(ОбъектМетаданных.Имя, "Удалить") Тогда Продолжить; КонецЕсли; - НайтиОтсутствующиеПредопределенныеЭлементы(ОбъектМетаданных, ПараметрыПроверки); + НайтиОтсутствующиеПредопределенныеЭлементы(ОбъектМетаданных, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; КонецЦикла; @@ -1542,7 +1542,7 @@ Продолжить; КонецЕсли; - НайтиДублиПредопределенныхЭлементов(ВидМетаданных, ПараметрыПроверки); + НайтиДублиПредопределенныхЭлементов(ВидМетаданных, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -1562,9 +1562,9 @@ Продолжить; КонецЕсли; - Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(МетаданныеПланОбмена.ПолноеИмя()), ПараметрыПроверки); + Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(МетаданныеПланОбмена.ПолноеИмя()), ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета Проблема.УточнениеПроблемы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В плане обмена ""%1"" отсутствует предопределенный узел (%2 = Неопределено).'"), МетаданныеПланОбмена.Имя, "ЭтотУзел()"); - ЗаписатьПроблему(Проблема, ПараметрыПроверки); + ЗаписатьПроблему(Проблема, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -1797,7 +1797,7 @@ // Процедура ПроверитьОбъект(ПроверяемыеОбъекты, Проверки) Экспорт Для Каждого Проверка Из Проверки Цикл - ВыполнитьПроверку(Проверка, , ПроверяемыеОбъекты); + ВыполнитьПроверку(Проверка, , ПроверяемыеОбъекты); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; КонецПроцедуры @@ -1832,7 +1832,7 @@ Результат = Запрос.Выполнить().Выбрать(); Пока Результат.Следующий() Цикл - ВыполнитьПроверку(Результат.Идентификатор); + ВыполнитьПроверку(Результат.Идентификатор); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; КонецЕсли; @@ -1842,7 +1842,7 @@ Процедура ВыполнитьПроверки(Знач Проверки) Экспорт Для Каждого Проверка Из Проверки Цикл - ВыполнитьПроверку(Проверка); + ВыполнитьПроверку(Проверка); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; КонецПроцедуры @@ -2187,12 +2187,12 @@ Продолжить; КонецЕсли; - Проблема = ОписаниеПроблемы(СсылкаНаОбъект, ПараметрыПроверки); + Проблема = ОписаниеПроблемы(СсылкаНаОбъект, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета Проблема.УточнениеПроблемы = НСтр("ru = 'Нарушена ссылочная целостность:'") + Символы.ПС + УточнениеПроблемы; Если ЕстьОтветственный Тогда Проблема.Ответственный = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаОбъект, "Ответственный"); КонецЕсли; - ЗаписатьПроблему(Проблема, ПараметрыПроверки); + ЗаписатьПроблему(Проблема, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -2201,7 +2201,7 @@ КонецЕсли; Запрос.УстановитьПараметр("Ссылка", СтрокаРезультата.ПроблемныйОбъект); - Результат = Запрос.Выполнить().Выгрузить(); + Результат = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -2411,7 +2411,7 @@ Продолжить; КонецЕсли; - Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); + Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета Проблема.УточнениеПроблемы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'У регистра накопления ""%1"" в записях с номерами %2 по регистратору ""%3"" указаны ссылки на несуществующие данные.'"), ОбъектМетаданных.Представление(), НомераПроблемныхЗаписей, СтрокаРезультата.РегистраторРеквизитСсылка); @@ -2420,12 +2420,12 @@ ДополнительнаяИнформация.Вставить("Регистратор", СтрокаРезультата.РегистраторРеквизитСсылка); Проблема.ДополнительнаяИнформация = Новый ХранилищеЗначения(ДополнительнаяИнформация); - ЗаписатьПроблему(Проблема, ПараметрыПроверки); + ЗаписатьПроблему(Проблема, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; Запрос.УстановитьПараметр("ДатаНачалаПроверки", СтрокаРезультата.Период); - Результат = Запрос.Выполнить().Выгрузить(); + Результат = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -2523,7 +2523,7 @@ Продолжить; КонецЕсли; - Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); + Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета Проблема.УточнениеПроблемы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'У регистра сведений ""%1"" в записях с номерами %2 по регистратору ""%3"" указаны ссылки на несуществующие данные.'"), ОбъектМетаданных.Представление(), НомераПроблемныхЗаписей, СтрокаРезультата.РегистраторРеквизитСсылка); @@ -2532,7 +2532,7 @@ ДополнительнаяИнформация.Вставить("Регистратор", СтрокаРезультата.РегистраторРеквизитСсылка); Проблема.ДополнительнаяИнформация = Новый ХранилищеЗначения(ДополнительнаяИнформация); - ЗаписатьПроблему(Проблема, ПараметрыПроверки); + ЗаписатьПроблему(Проблема, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -2542,7 +2542,7 @@ Запрос.УстановитьПараметр("Регистратор", СтрокаРезультата.РегистраторРеквизитСсылка); КонецЕсли; - Результат = Запрос.Выполнить().Выгрузить(); + Результат = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -2621,14 +2621,14 @@ ДополнительнаяИнформация.Вставить(Измерение.Имя, ИзмерениеСсылка); КонецЦикла; - Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); + Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета Проблема.УточнениеПроблемы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'У регистра сведений ""%1"" в %2, по комбинации измерений ""%3"" указана ссылка на несуществующий элемент: ""%4"".'"), ОбъектМетаданных.Представление(), ИнформацияОРеквизите.ТипМетаданныхВТворительномПадеже, ПоляУпорядочивания, СтрокаРезультата[ИнформацияОРеквизите.ИмяМетаданных + ИнформацияОРеквизите.ТипМетаданныхВИменительномПадеже + "Ссылка"]); Проблема.ДополнительнаяИнформация = Новый ХранилищеЗначения(ДополнительнаяИнформация); - ЗаписатьПроблему(Проблема, ПараметрыПроверки); + ЗаписатьПроблему(Проблема, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -2649,13 +2649,13 @@ Для Каждого Измерение Из Измерения Цикл Запрос.УстановитьПараметр(Измерение.Имя, СтрокаРезультата[Измерение.Имя + "ИзмерениеСсылка"]); КонецЦикла; - Результат = Запрос.Выполнить().Выгрузить(); + Результат = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - порционная проверка ведения учета // Если по последнему периоду все записи обработаны, то выбираем все записи по следующим периодам. Если Результат.Количество() = 0 Или Результат.Количество() = 1 Тогда Запрос.Текст = ТекстПервогоЗапроса; Запрос.УстановитьПараметр("Период", СтрокаРезультата["Период"]); Запрос.УстановитьПараметр("ТолькоУказанныйПериод", Ложь); - Результат = Запрос.Выполнить().Выгрузить(); + Результат = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - порционная проверка ведения учета ЭтоПервыйПроход = Истина; КонецЕсли; @@ -2735,14 +2735,14 @@ ДополнительнаяИнформация.Вставить(Измерение.Имя, ИзмерениеСсылка); КонецЦикла; - Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); + Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета Проблема.УточнениеПроблемы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'У регистра сведений ""%1"" в %2, по комбинации измерений ""%3"" указана ссылка на несуществующий элемент: ""%4"".'"), ОбъектМетаданных.Представление(), ИнформацияОРеквизите.ТипМетаданныхВТворительномПадеже, ПоляУпорядочивания, СтрокаРезультата[ИнформацияОРеквизите.ИмяМетаданных + ИнформацияОРеквизите.ТипМетаданныхВИменительномПадеже + "Ссылка"]); Проблема.ДополнительнаяИнформация = Новый ХранилищеЗначения(ДополнительнаяИнформация); - ЗаписатьПроблему(Проблема, ПараметрыПроверки); + ЗаписатьПроблему(Проблема, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -2761,7 +2761,7 @@ Запрос.УстановитьПараметр(Измерение.Имя, СтрокаРезультата[Измерение.Имя + "ИзмерениеСсылка"]); КонецЦикла; - Результат = Запрос.Выполнить().Выгрузить(); + Результат = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -2874,7 +2874,7 @@ Продолжить; КонецЕсли; - Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); + Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета Проблема.УточнениеПроблемы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'У регистра бухгалтерии ""%1"" в записях с номерами %2 по регистратору ""%3"" указаны ссылки на несуществующие данные.'"), ОбъектМетаданных.Представление(), НомераПроблемныхЗаписей, СтрокаРезультата.РегистраторРеквизитСсылка); @@ -2883,12 +2883,12 @@ ДополнительнаяИнформация.Вставить("Регистратор", СтрокаРезультата.РегистраторРеквизитСсылка); Проблема.ДополнительнаяИнформация = Новый ХранилищеЗначения(ДополнительнаяИнформация); - ЗаписатьПроблему(Проблема, ПараметрыПроверки); + ЗаписатьПроблему(Проблема, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; Запрос.УстановитьПараметр("ДатаНачалаПроверки", СтрокаРезультата.Период); - Результат = Запрос.Выполнить().Выгрузить(); + Результат = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -2954,7 +2954,7 @@ Продолжить; КонецЕсли; - Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); + Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета Проблема.УточнениеПроблемы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'У регистра расчета ""%1"" в записях с номерами %2 по регистратору ""%3"" указаны ссылки на несуществующие данные.'"), @@ -2964,12 +2964,12 @@ ДополнительнаяИнформация.Вставить("Регистратор", СтрокаРезультата.РегистраторРеквизитСсылка); Проблема.ДополнительнаяИнформация = Новый ХранилищеЗначения(ДополнительнаяИнформация); - ЗаписатьПроблему(Проблема, ПараметрыПроверки); + ЗаписатьПроблему(Проблема, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; Запрос.УстановитьПараметр("ДатаНачалаПроверки", СтрокаРезультата.Период); - Результат = Запрос.Выполнить().Выгрузить(); + Результат = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -3192,14 +3192,14 @@ Продолжить; КонецЕсли; - Проблема = ОписаниеПроблемы(СсылкаНаОбъект, ПараметрыПроверки); + Проблема = ОписаниеПроблемы(СсылкаНаОбъект, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета Проблема.УточнениеПроблемы = НСтр("ru = 'Не заполнены реквизиты, обязательные к заполнению:'") + Символы.ПС + ОшибкиЗаполненияОбъекта(); Если Реквизиты.Найти("Ответственный") <> Неопределено Тогда Проблема.Вставить("Ответственный", ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаОбъект, "Ответственный")); КонецЕсли; - ЗаписатьПроблему(Проблема, ПараметрыПроверки); + ЗаписатьПроблему(Проблема, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -3213,7 +3213,7 @@ КонецЕсли; Запрос.УстановитьПараметр("Ссылка", СтрокаРезультата.ПроблемныйОбъект); - Результат = Запрос.Выполнить().Выгрузить(); + Результат = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -3358,7 +3358,7 @@ ДополнительнаяИнформация = Новый Структура; ДополнительнаяИнформация.Вставить("Регистратор", СтрокаРезультата.РегистраторРеквизитСсылка); - Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); + Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета Проблема.УточнениеПроблемы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'У записи с полями: |%1, @@ -3366,7 +3366,7 @@ " • " + НСтр("ru = 'Регистратор:'") + " = """ + СтрокаРезультата.РегистраторРеквизитСсылка, Символы.ПС + ОшибкиЗаполненияОбъекта()); Проблема.ДополнительнаяИнформация = Новый ХранилищеЗначения(ДополнительнаяИнформация); - ЗаписатьПроблему(Проблема, ПараметрыПроверки); + ЗаписатьПроблему(Проблема, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -3377,7 +3377,7 @@ КонецЕсли; Запрос.УстановитьПараметр("ДатаНачалаПроверки", СтрокаРезультата.Период); - Результат = Запрос.Выполнить().Выгрузить(); + Результат = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -3442,7 +3442,7 @@ ДополнительнаяИнформация = Новый Структура; ДополнительнаяИнформация.Вставить("Регистратор", СтрокаРезультата.РегистраторРеквизитСсылка); - Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); + Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета Проблема.УточнениеПроблемы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'У записи с полями: |%1, @@ -3450,7 +3450,7 @@ " • " + НСтр("ru = 'Регистратор:'") + " = """ + СтрокаРезультата.РегистраторРеквизитСсылка, Символы.ПС + ОшибкиЗаполненияОбъекта()); Проблема.ДополнительнаяИнформация = Новый ХранилищеЗначения(ДополнительнаяИнформация); - ЗаписатьПроблему(Проблема, ПараметрыПроверки); + ЗаписатьПроблему(Проблема, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -3460,7 +3460,7 @@ КонецЕсли; Запрос.УстановитьПараметр("Регистратор", СтрокаРезультата.РегистраторРеквизитСсылка); - Результат = Запрос.Выполнить().Выгрузить(); + Результат = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -3574,14 +3574,14 @@ ДополнительнаяИнформация.Вставить(Измерение.Имя, ИзмерениеСсылка); КонецЦикла; - Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); + Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета Проблема.УточнениеПроблемы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'У записи с полями: |%1, |обнаружены незаполненные данные, обязательные к заполнению: %2'"), ПредставлениеОтбораНабораЗаписей, Символы.ПС + ОшибкиЗаполненияОбъекта()); Проблема.ДополнительнаяИнформация = Новый ХранилищеЗначения(ДополнительнаяИнформация); - ЗаписатьПроблему(Проблема, ПараметрыПроверки); + ЗаписатьПроблему(Проблема, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -3599,7 +3599,7 @@ МодульОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(ОписаниеЗамера, ОбщееКоличествоДанных); КонецЕсли; - Результат = Запрос.Выполнить().Выгрузить(); + Результат = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -3712,13 +3712,13 @@ СтруктураНабораЗаписей.Вставить(Измерение.Имя, ИзмерениеСсылка); КонецЦикла; - Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); + Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета Проблема.УточнениеПроблемы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'У записи с полями: |%1, |обнаружены незаполненные данные, обязательные к заполнению: %2'"), ПредставлениеОтбораНабораЗаписей, Символы.ПС + УточнениеПроблемы); Проблема.ДополнительнаяИнформация = Новый ХранилищеЗначения(СтруктураНабораЗаписей); - ЗаписатьПроблему(Проблема, ПараметрыПроверки); + ЗаписатьПроблему(Проблема, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -3733,13 +3733,13 @@ Для Каждого Измерение Из Измерения Цикл Запрос.УстановитьПараметр(Измерение.Имя, СтрокаРезультата[Измерение.Имя + "ИзмерениеСсылка"]); КонецЦикла; - Результат = Запрос.Выполнить().Выгрузить(); + Результат = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - порционная проверка ведения учета // Если по последнему периоду все записи обработаны, то выбираем все записи по следующим периодам. Если Результат.Количество() = 0 Или Результат.Количество() = 1 Тогда Запрос.Текст = ТекстПервогоЗапроса; Запрос.УстановитьПараметр("Период", СтрокаРезультата.Период); Запрос.УстановитьПараметр("ТолькоУказанныйПериод", Ложь); - Результат = Запрос.Выполнить().Выгрузить(); + Результат = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - порционная проверка ведения учета ЭтоПервыйПроход = Истина; КонецЕсли; @@ -3809,21 +3809,21 @@ УточнениеПроблемы = ПредставлениеОбъекта + " -> " + ПредставлениеОбъекта; КонецЕсли; - Проблема = ОписаниеПроблемы(СсылкаНаОбъект, ПараметрыПроверки); + Проблема = ОписаниеПроблемы(СсылкаНаОбъект, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета Проблема.УточнениеПроблемы = УточнениеПроблемы; Если Реквизиты.Найти("Ответственный") <> Неопределено Тогда Проблема.Вставить("Ответственный", ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаОбъект, "Ответственный")); КонецЕсли; - ЗаписатьПроблему(Проблема, ПараметрыПроверки); + ЗаписатьПроблему(Проблема, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЕсли; КонецЦикла; Запрос.УстановитьПараметр("Ссылка", СтрокаРезультата.ПроблемныйОбъект); - Результат = Запрос.Выполнить().Выгрузить(); + Результат = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -3910,8 +3910,8 @@ ПоследнийОбъектЦикла = ПроверяемыеЭлементы[ПроверяемыеЭлементы.Количество() - 1]; - КоличествоДетейПервого = КоличествоДочернихЭлементов(ПроблемныйОбъектСсылка, Родитель); - КоличествоДетейВторого = КоличествоДочернихЭлементов(ПоследнийОбъектЦикла, Родитель); + КоличествоДетейПервого = КоличествоДочернихЭлементов(ПроблемныйОбъектСсылка, Родитель); // @skip-check query-in-loop - порционная проверка ведения учета + КоличествоДетейВторого = КоличествоДочернихЭлементов(ПоследнийОбъектЦикла, Родитель); // @skip-check query-in-loop - порционная проверка ведения учета ПроблемныйОбъект = ?(КоличествоДетейПервого > КоличествоДетейВторого, ПроблемныйОбъектСсылка, ПоследнийОбъектЦикла); ПроблемныйОбъект = ПроблемныйОбъект.ПолучитьОбъект(); @@ -3936,7 +3936,7 @@ Выгрузка = ДочерниеЭлементыРодителя(СсылкаНаОбъект, ИсключениеВыборки); КоличествоДетей = КоличествоДетей + Выгрузка.Количество(); Для Каждого ЭлементПотомства Из Выгрузка Цикл - КоличествоДетей = КоличествоДочернихЭлементов(ЭлементПотомства.Ссылка, ИсключениеВыборки, КоличествоДетей); + КоличествоДетей = КоличествоДочернихЭлементов(ЭлементПотомства.Ссылка, ИсключениеВыборки, КоличествоДетей); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; Возврат КоличествоДетей; @@ -3990,9 +3990,9 @@ Продолжить; КонецЕсли; - Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); + Проблема = ОписаниеПроблемы(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных), ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета Проблема.УточнениеПроблемы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Предопределенный элемент ""%1"" отсутствует в информационной базе.'"), ПредопределенныйЭлемент); - ЗаписатьПроблему(Проблема, ПараметрыПроверки); + ЗаписатьПроблему(Проблема, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -4102,9 +4102,9 @@ Продолжить; КонецЕсли; - Проблема = ОписаниеПроблемы(Результат.ПроблемныйОбъект, ПараметрыПроверки); + Проблема = ОписаниеПроблемы(Результат.ПроблемныйОбъект, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета Проблема.УточнениеПроблемы = УточнениеПроблемы; - ЗаписатьПроблему(Проблема, ПараметрыПроверки); + ЗаписатьПроблему(Проблема, ПараметрыПроверки); // @skip-check query-in-loop - порционная проверка ведения учета КонецЦикла; @@ -4165,7 +4165,7 @@ Иначе Результат.ОбластьПроверки = "СсылочныеОбъекты"; КонецЕсли; - Результат.ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Результат.ПолноеИмя); + Результат.ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Результат.ПолноеИмя); Возврат Результат; КонецФункции @@ -4178,7 +4178,7 @@ КонецЕсли; Результат = Строка(ПроблемныйОбъект) + "<РасшифровкаСписка>" + Символы.ПС + ПроблемныйОбъект.ПолноеИмя; - Если Не ОбщегоНазначения.ЭтоРегистр(Метаданные.НайтиПоПолномуИмени(ПроблемныйОбъект.ПолноеИмя)) Тогда + Если Не ОбщегоНазначения.ЭтоРегистр(ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПроблемныйОбъект.ПолноеИмя)) Тогда Возврат Результат; КонецЕсли; @@ -4315,7 +4315,7 @@ Для Каждого ПараметрВыполненияПроверки Из ПараметрыВыполненияПроверки Цикл - ВидПроверки = ВидПроверки(ПараметрВыполненияПроверки, Истина); + ВидПроверки = ВидПроверки(ПараметрВыполненияПроверки, Истина); // @skip-check query-in-loop - порционная проверка ведения учета Если Не ЗначениеЗаполнено(ВидПроверки) Тогда Продолжить; КонецЕсли; diff --git a/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебныйПовтИсп/Module.bsl index cb16228e0..4c2e742a3 100644 --- a/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебныйПовтИсп/Module.bsl @@ -120,7 +120,7 @@ + НСтр("ru = 'Для очистки ссылок на удаленные данные следует: |• Завершить работу всех пользователей, установить блокировку входа в программу и сделать резервную копию информационной базы; |• Запустить конфигуратор, меню Администрирование - Тестирования и исправление, включить два флажка для проверки логической и ссылочной целостности - | См. подробнее на ИТС: https://its.1c.ru/db/v83doc#bookmark:adm:TI000000142 + | См. подробнее на ИТС: https://its.1c.eu/db/v83doc#bookmark:adm:TI000000142 |• Дождаться завершения тестирования и исправления, снять блокировку входа в программу. | |Если работа ведется в распределенной информационной базе (РИБ), то исправление следует запускать только в главном узле. @@ -193,7 +193,7 @@ Проверка.Рекомендация = НСтр("ru = '• Перейти на версию платформы 1С:Предприятие 8.3.9.2033 или выше; |• Завершить работу всех пользователей, установить блокировку входа в программу и сделать резервную копию информационной базы; |• Запустить конфигуратор, меню Администрирование - Тестирования и исправление, включить два флажка для проверки логической и ссылочной целостности - | См. подробнее на ИТС: https://its.1c.ru/db/v83doc#bookmark:adm:TI000000142 + | См. подробнее на ИТС: https://its.1c.eu/db/v83doc#bookmark:adm:TI000000142 |• Дождаться завершения тестирования и исправления, снять блокировку входа в программу. | |Если работа ведется в распределенной информационной базе (РИБ), то исправление следует запускать только в главном узле. diff --git a/SSL/src/CommonModules/МультиязычностьПовтИсп/Module.bsl b/SSL/src/CommonModules/МультиязычностьПовтИсп/Module.bsl index e0a866372..2815d2397 100644 --- a/SSL/src/CommonModules/МультиязычностьПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/МультиязычностьПовтИсп/Module.bsl @@ -36,7 +36,7 @@ Функция ОбъектСодержитТЧПредставления(СсылкаИлиПолноеИмяМетаданных, ИмяРеквизита = "") Экспорт Если ТипЗнч(СсылкаИлиПолноеИмяМетаданных) = Тип("Строка") Тогда - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(СсылкаИлиПолноеИмяМетаданных); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(СсылкаИлиПолноеИмяМетаданных); ПолноеИмя = СсылкаИлиПолноеИмяМетаданных; Иначе ОбъектМетаданных = СсылкаИлиПолноеИмяМетаданных.Метаданные(); @@ -98,7 +98,7 @@ ТипОбъекта = ТипЗнч(ОбъектИлиСсылка); Если ТипОбъекта = Тип("Строка") Тогда - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ОбъектИлиСсылка); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ОбъектИлиСсылка); ИначеЕсли ОбщегоНазначения.ЭтоСсылка(ТипОбъекта) Тогда МетаданныеОбъекта = ОбъектИлиСсылка.Метаданные(); Иначе diff --git a/SSL/src/CommonModules/МультиязычностьСервер/Module.bsl b/SSL/src/CommonModules/МультиязычностьСервер/Module.bsl index 7aea5b460..974e6eab5 100644 --- a/SSL/src/CommonModules/МультиязычностьСервер/Module.bsl +++ b/SSL/src/CommonModules/МультиязычностьСервер/Module.bsl @@ -12,8 +12,8 @@ // Заполняет колонки с именами ИмяРеквизита_<КодЯзыка> текстовыми значениями для указанных кодов языков. // // Параметры: -// Элемент - СтрокаТаблицыЗначений - заполняемая строка таблицы. С колонками ИмяРеквизита_КодЯзыка. -// ИмяРеквизита - Строка - имя реквизита. Например, "Наименование" +// Элемент - СтрокаТаблицыЗначений - заполняемая строка таблицы с колонками ИмяРеквизита_КодЯзыка. +// ИмяРеквизита - Строка - имя реквизита. Например, "Наименование" // ИсходнаяСтрока - Строка - строка в формате НСтр. Например, "ru = 'Сообщение на русском'; en = 'English message'". // КодыЯзыков - Массив - коды языков, на которых нужно заполнить строки. // @@ -395,18 +395,18 @@ Для каждого Поле Из ПоляВводаПоСтроке Цикл Если НаименованияЛокализуемыхРеквизитов.Получить(Поле.Имя) = Истина Тогда - Поля.Добавить("Таблица." + Поле.Имя + " ПОДОБНО &СтрокаПоиска"); + Поля.Добавить("Таблица." + Поле.Имя + " ПОДОБНО &СтрокаПоиска СПЕЦСИМВОЛ ""~"""); Если ИспользуетсяПервыйДополнительныйЯзык() Тогда - Поля.Добавить("Таблица." + Поле.Имя + "Язык1 ПОДОБНО &СтрокаПоиска"); + Поля.Добавить("Таблица." + Поле.Имя + "Язык1 ПОДОБНО &СтрокаПоиска СПЕЦСИМВОЛ ""~"""); КонецЕсли; Если ИспользуетсяВторойДополнительныйЯзык() Тогда - Поля.Добавить("Таблица." + Поле.Имя + "Язык2 ПОДОБНО &СтрокаПоиска"); + Поля.Добавить("Таблица." + Поле.Имя + "Язык2 ПОДОБНО &СтрокаПоиска СПЕЦСИМВОЛ ""~"""); КонецЕсли; Иначе - Поля.Добавить("Таблица." + Поле.Имя + " ПОДОБНО &СтрокаПоиска"); + Поля.Добавить("Таблица." + Поле.Имя + " ПОДОБНО &СтрокаПоиска СПЕЦСИМВОЛ ""~"""); КонецЕсли; КонецЦикла; @@ -420,10 +420,8 @@ ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "&ИмяОбъекта", ОбъектМетаданных.ПолноеИмя()); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловияОтбора", СтрСоединить(Поля, " ИЛИ ")); - Запрос = Новый Запрос(ТекстЗапроса); - - Запрос.УстановитьПараметр("СтрокаПоиска", "%" + Параметры.СтрокаПоиска +"%"); - + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("СтрокаПоиска", "%" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(Параметры.СтрокаПоиска) +"%"); РезультатЗапроса = Запрос.Выполнить().Выбрать(); ДанныеВыбора = Новый СписокЗначений; @@ -581,7 +579,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать элемент %1 по причине: |%2'"), - СсылкиНаОбъекты.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + СсылкиНаОбъекты.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, ОбъектМетаданных, СсылкиНаОбъекты.Ссылка, ТекстСообщения); @@ -609,13 +607,13 @@ ОбъектМетаданных = Неопределено; Если ЗначениеЗаполнено(Список.ОсновнаяТаблица) Тогда - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Список.ОсновнаяТаблица); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Список.ОсновнаяТаблица); КонецЕсли; Если ОбъектМетаданных = Неопределено Тогда НаборЧастейПутиОбъектаМетаданных = СтрРазделить(Форма.ИмяФормы, "."); ИмяОбъектаМетаданных = НаборЧастейПутиОбъектаМетаданных[0] + "." + НаборЧастейПутиОбъектаМетаданных[1]; - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаМетаданных ); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъектаМетаданных); КонецЕсли; Если ОбъектМетаданных = Неопределено Тогда @@ -786,7 +784,8 @@ ПараметрыЗаполнения = Неопределено; Если Выборка.Количество() > 0 Тогда - ПараметрыЗаполнения = ОбновлениеИнформационнойБазыСлужебный.НаборПараметровДляЗаполненияОбъекта(Метаданные.НайтиПоПолномуИмени(ИмяОбъектСТЧПредставления)); + ПараметрыЗаполнения = ОбновлениеИнформационнойБазыСлужебный.НаборПараметровДляЗаполненияОбъекта( + ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъектСТЧПредставления)); КонецЕсли; Пока Выборка.Следующий() Цикл @@ -822,6 +821,7 @@ Если ОбрабатываемыеОбъекты.Найти(ОбъектСПредопределеннымиЭлементами.ПолноеИмя()) = Неопределено Тогда ОбрабатываемыеОбъекты.Добавить(ОбъектСПредопределеннымиЭлементами.ПолноеИмя()); КонецЕсли; + КонецЦикла; Для каждого ОбъектСПредопределеннымиЭлементами Из ОбъектыСПредопределеннымиЭлементами Цикл @@ -832,7 +832,8 @@ Выборка = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, ОбъектСПредопределеннымиЭлементами.ПолноеИмя()); Если Выборка.Количество() > 0 Тогда - + + // @skip-check query-in-loop - Порционная обработка данных в обработчике обновления ЗаполнитьПустыеМультиязычныеРеквизитыЗначениемОсновногоЯзыка(Выборка, ОбъектСПредопределеннымиЭлементами, ИтогоОбработано); КонецЕсли; @@ -1564,7 +1565,7 @@ Или ЧастиИмениФормы[0] = "РЕГИСТРРАСЧЕТА" Или ЧастиИмениФормы[0] = "РЕГИСТРСВЕДЕНИЙ" Или ЧастиИмениФормы[0] = "ПЛАНОБМЕНА" Тогда - Возврат Метаданные.НайтиПоПолномуИмени(ЧастиИмениФормы[0] + "." + ЧастиИмениФормы[1]).ОсновнаяФормаСписка; + Возврат ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ЧастиИмениФормы[0] + "." + ЧастиИмениФормы[1]).ОсновнаяФормаСписка; КонецЕсли; Возврат Неопределено; @@ -1582,7 +1583,7 @@ Или ЧастиИмениФормы[0] = "ЗАДАЧА" Или ЧастиИмениФормы[0] = "ЗАДАЧА" Или ЧастиИмениФормы[0] = "ПЛАНОБМЕНА" Тогда - Возврат Метаданные.НайтиПоПолномуИмени(ЧастиИмениФормы[0] + "." + ЧастиИмениФормы[1]).ОсновнаяФормаДляВыбора; + Возврат ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ЧастиИмениФормы[0] + "." + ЧастиИмениФормы[1]).ОсновнаяФормаДляВыбора; КонецЕсли; Возврат Неопределено; @@ -1685,6 +1686,7 @@ ЗаблокироватьДанныеДляРедактирования(Выборка.Ссылка); + // @skip-check query-in-loop - Порционная обработка больших объемов данных. ИменаЛокализуемыхРеквизитов = НаименованияЛокализуемыхРеквизитовОбъектаВШапке(ОбъектМетаданных); Для Каждого Реквизит Из ИменаЛокализуемыхРеквизитов Цикл @@ -1719,7 +1721,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось заполнить мультиязычные реквизиты объекта %1 по причине: - |%2'"), Выборка.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + |%2'"), Выборка.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, ОбъектМетаданных, Выборка.Ссылка, ТекстСообщения); @@ -1755,7 +1757,7 @@ // ВариантДанных - Строка - Варианты: Общие, Разделенные, Все // // Возвращаемое значение: -// Массив - Объекты СТЧПредставления +// Массив - объекты СТЧПредставления // Функция ОбъектыСТЧПредставления(ВариантДанных) @@ -1764,25 +1766,25 @@ Если ВариантДанных = "Разделенные" Или ВариантДанных = "Все" Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - ОбъектыСТЧПредставления.Добавить(Метаданные.Справочники["ВидыКонтактнойИнформации"].ПолноеИмя()); + МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформациейСлужебный"); + МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСТабличнойЧастьюПредставление(ОбъектыСТЧПредставления); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - ОбъектыСТЧПредставления.Добавить(Метаданные.Справочники["ВариантыОтчетов"].ПолноеИмя()); - ОбъектыСТЧПредставления.Добавить(Метаданные.Справочники["ПредопределенныеВариантыОтчетовРасширений"].ПолноеИмя()); + МодульВариантыОтчетовСлужебный = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетовСлужебный"); + МодульВариантыОтчетовСлужебный.ПриОпределенииОбъектовСТабличнойЧастьюПредставление(ОбъектыСТЧПредставления); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда - ОбъектыСТЧПредставления.Добавить(Метаданные.Справочники["ЗначенияСвойствОбъектов"].ПолноеИмя()); - ОбъектыСТЧПредставления.Добавить(Метаданные.Справочники["ЗначенияСвойствОбъектовИерархия"].ПолноеИмя()); - ОбъектыСТЧПредставления.Добавить(Метаданные.Справочники["НаборыДополнительныхРеквизитовИСведений"].ПолноеИмя()); - ОбъектыСТЧПредставления.Добавить(Метаданные.ПланыВидовХарактеристик["ДополнительныеРеквизитыИСведения"].ПолноеИмя()); + МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); + МодульУправлениеСвойствамиСлужебный.ПриОпределенииОбъектовСТабличнойЧастьюПредставление(ОбъектыСТЧПредставления); КонецЕсли; КонецЕсли; Если ВариантДанных = "Общие" Или ВариантДанных = "Все" Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - ОбъектыСТЧПредставления.Добавить(Метаданные.Справочники["ПредопределенныеВариантыОтчетов"].ПолноеИмя()); + МодульВариантыОтчетовСлужебный = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетовСлужебный"); + МодульВариантыОтчетовСлужебный.ПриОпределенииОбъектовСТабличнойЧастьюПредставлениеОбщиеДанные(ОбъектыСТЧПредставления); КонецЕсли; КонецЕсли; @@ -1906,14 +1908,13 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать объект: %1 по причине: %2'"), - Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Ссылка.Метаданные(), Ссылка, ТекстСообщения); КонецПопытки; КонецПроцедуры - // Параметры: // СписокОбъектов - Массив // @@ -1945,7 +1946,7 @@ ОбъектыСПредопределеннымиЭлементами = ОбъектыСНачальнымЗаполнением(ВариантДанных); - ШаблонаЗапроса = "ВЫБРАТЬ + ШаблонЗапроса = "ВЫБРАТЬ | ДанныеОбъекта.Ссылка |ИЗ | &Таблица КАК ДанныеОбъекта @@ -1956,6 +1957,7 @@ Для каждого ОбъектМетаданныхСЭлементами Из ОбъектыСПредопределеннымиЭлементами Цикл + // @skip-check query-in-loop - Порционная обработка больших объемов данных. ЛокализуемыеРеквизитыОбъекта = НаименованияЛокализуемыхРеквизитовОбъектаВШапке(ОбъектМетаданныхСЭлементами); Отборы = Новый Массив; @@ -1993,7 +1995,7 @@ Продолжить; КонецЕсли; - ТекстЗапросаПредварительный = СтрЗаменить(ШаблонаЗапроса, "&Таблица", ОбъектМетаданныхСЭлементами.ПолноеИмя()); + ТекстЗапросаПредварительный = СтрЗаменить(ШаблонЗапроса, "&Таблица", ОбъектМетаданныхСЭлементами.ПолноеИмя()); ТекстЗапросаПредварительный = СтрЗаменить(ТекстЗапросаПредварительный, "&УсловиеОтбора", СтрСоединить(Отборы, " ИЛИ ")); НаборЗапросов.Добавить(ТекстЗапросаПредварительный); @@ -2154,7 +2156,7 @@ Для Каждого ДанныеОбъекта Из ДанныеДляИзмененияМультиязычныхРеквизитов.Объекты Цикл ПолноеИмя = ДанныеОбъекта.Ключ; - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмя); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмя); ПараметрыЗаполнения = Новый Структура; Если ОбъектыСНачальнымЗаполнением.Найти(МетаданныеОбъекта) <> Неопределено Тогда @@ -2166,15 +2168,18 @@ Если СтрНачинаетсяС(ПолноеИмя, "Справочник") Или СтрНачинаетсяС(ПолноеИмя, "ПланВидовХарактеристик") Тогда + // @skip-check query-in-loop - Порционная обработка больших объемов данных. ОбработатьСсылочныеОбъекты(ПолноеИмя, ДанныеОбъекта.Значение, ДанныеДляИзмененияМультиязычныхРеквизитов, ПараметрыЗаполнения); ИначеЕсли СтрНачинаетсяС(ПолноеИмя, "РегистрСведений") Тогда - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмя); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмя); Если ОбъектМетаданных.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору Тогда + // @skip-check query-in-loop - Порционная обработка больших объемов данных. ИзменитьЯзыкВПодчиненныхРегистрахСведений(ОбъектМетаданных, ДанныеОбъекта.Значение, ДанныеДляИзмененияМультиязычныхРеквизитов, ПараметрыЗаполнения); Иначе Периодический = ОбъектМетаданных.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический; + // @skip-check query-in-loop - Порционная обработка больших объемов данных. ИзменитьЯзыкВНезависимыхРегистрахСведений(ОбъектМетаданных, ДанныеОбъекта.Значение, ДанныеДляИзмененияМультиязычныхРеквизитов, ПараметрыЗаполнения, Периодический); КонецЕсли; @@ -2243,7 +2248,8 @@ Запрос.Текст = ТекстЗапроса; Запрос.УстановитьПараметр("Ссылка", ПоследняяСсылка); - + + // @skip-check query-in-loop - Порционная обработка данных РезультатЗапроса = Запрос.Выполнить(); Если Не РезультатЗапроса.Пустой() Тогда @@ -2576,6 +2582,7 @@ Запрос.УстановитьПараметр("Регистратор", СтрокаРезультата.РегистраторРеквизитСсылка); + // @skip-check query-in-loop - Порционная обработка данных Результат = Запрос.Выполнить().Выгрузить(); КонецЦикла; @@ -2780,6 +2787,7 @@ Запрос.УстановитьПараметр(Измерение.Имя, СтрокаРезультата[Измерение.Имя + "ИзмерениеСсылка"]); КонецЦикла; + // @skip-check query-in-loop - Порционная обработка данных Результат = Запрос.Выполнить().Выгрузить(); КонецЦикла; diff --git a/SSL/src/CommonModules/НапоминанияПользователя/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователя/Module.bsl index f9aaddc36..2e15450b0 100644 --- a/SSL/src/CommonModules/НапоминанияПользователя/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователя/Module.bsl @@ -103,4 +103,76 @@ КонецФункции +// Обработчик одноименного события формы, размещает на форме элементы для настройки напоминания. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения - форма, в которой необходимо разместить элементы настройки напоминания. +// ПараметрыРазмещения - см. ПараметрыРазмещения +// +Процедура ПриСозданииНаСервере(Форма, ПараметрыРазмещения) Экспорт + + НапоминанияПользователяСлужебный.ПриСозданииНаСервере(Форма, ПараметрыРазмещения); + +КонецПроцедуры + +// Определяет параметры размещения на форме элементов настройки напоминания. +// +// Возвращаемое значение: +// Структура: +// * Группа - ГруппаФормы - место размещения элементов настройки напоминания. +// * ИмяРеквизитаСДатойСобытия - Строка - реквизит, относительно которого устанавливается время напоминания о событии. +// * ИнтервалВремениНапоминания - Число - интервал времени напоминания по умолчанию, в секундах. По умолчанию - 0. +// * ДобавлятьФлажок - Булево - если Истина, то рядом с полем ввода интервала времени будет добавлен флажок для +// быстрого включения/отключения напоминания. Если Ложь, то флажок выводиться не будет, +// отключение напоминания будет доступно в списке выбора интервалов времени. Значение по +// умолчанию - Ложь. +// +Функция ПараметрыРазмещения() Экспорт + + Возврат НапоминанияПользователяСлужебный.ПараметрыРазмещения(); + +КонецФункции + +// Обработчик одноименного события формы, обновляет на форме элементы, связанные с настройкой напоминания. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения - форма, в которой необходимо разместить элементы настройки напоминания. +// ТекущийОбъект - СправочникОбъект +// - ДокументОбъект +// - ПланВидовХарактеристикОбъект +// - ПланСчетовОбъект +// - ПланВидовРасчетаОбъект +// - БизнесПроцессОбъект +// - ЗадачаОбъект +// - ПланОбменаОбъект - предмет напоминания. +// +Процедура ПриЧтенииНаСервере(Форма, ТекущийОбъект) Экспорт + + НапоминанияПользователяСлужебный.ПриЧтенииНаСервере(Форма, ТекущийОбъект); + +КонецПроцедуры + +// Обработчик одноименного события формы, устанавливает напоминание по предмету при записи объекта в форме. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения - форма, в которой размещены элементы настройки напоминания. +// Отказ - Булево - признак отказа от записи. +// ТекущийОбъект - СправочникОбъект +// - ДокументОбъект +// - ПланВидовХарактеристикОбъект +// - ПланСчетовОбъект +// - ПланВидовРасчетаОбъект +// - БизнесПроцессОбъект +// - ЗадачаОбъект +// - ПланОбменаОбъект - предмет напоминания. +// ПараметрыЗаписи - Структура +// ТекстНапоминания - Строка - текст устанавливаемого напоминания. Если не заполнен, то используется представление +// предмета напоминания. +// +Процедура ПриЗаписиНаСервере(Форма, Отказ, ТекущийОбъект, ПараметрыЗаписи, ТекстНапоминания = "") Экспорт + + НапоминанияПользователяСлужебный.ПриЗаписиНаСервере(Форма, Отказ, ТекущийОбъект, ПараметрыЗаписи, ТекстНапоминания); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/НапоминанияПользователяГлобальный/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяГлобальный/Module.bsl index 9a0d582af..a7a7c436a 100644 --- a/SSL/src/CommonModules/НапоминанияПользователяГлобальный/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователяГлобальный/Module.bsl @@ -12,8 +12,7 @@ // Процедура ПроверитьТекущиеНапоминания() Экспорт - ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрКлиента(Неопределено); - Если Не ПараметрыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда + Если Не ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат; КонецЕсли; diff --git a/SSL/src/CommonModules/НапоминанияПользователяКлиент/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяКлиент/Module.bsl index ec898b1db..c35ab13d2 100644 --- a/SSL/src/CommonModules/НапоминанияПользователяКлиент/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователяКлиент/Module.bsl @@ -92,6 +92,62 @@ КонецПроцедуры +// Обработчик одноименного события формы. +// +// Параметры: +// Элемент - ПолеФормы - форма, в которой размещены элементы настройки напоминания. +// Форма - ФормаКлиентскогоПриложения - форма, в которой размещены элементы настройки напоминания. +// +Процедура ПриИзмененииНастройкиНапоминания(Элемент, Форма) Экспорт + + ИмяПоляИнтервалВремениНапоминания = НапоминанияПользователяКлиентСервер.ИмяПоляИнтервалВремениНапоминания(); + + Если Элемент.Имя = ИмяПоляИнтервалВремениНапоминания Тогда + НастройкиНапоминания = НастройкиНапоминанияВФорме(Форма); + Если Форма[Элемент.Имя] = НапоминанияПользователяКлиентСервер.ПредставлениеПеречисленияНеНапоминать() Тогда + Напоминать = Ложь; + Иначе + ИнтервалВремениНапоминания = ПолучитьИнтервалВремениИзСтроки(Форма[Элемент.Имя]); + Если Форма[Элемент.Имя] <> НапоминанияПользователяКлиентСервер.ПредставлениеПеречисленияПриНаступлении() Тогда + Форма[Элемент.Имя] = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'за %1'"), ПредставлениеВремени(ИнтервалВремениНапоминания, , ИнтервалВремениНапоминания <> 0)); + КонецЕсли; + НастройкиНапоминания.ИнтервалВремениНапоминания = ИнтервалВремениНапоминания; + Напоминать = Истина; + КонецЕсли; + Форма[НапоминанияПользователяКлиентСервер.ИмяПоляНапоминатьОСобытии()] = Напоминать; + КонецЕсли; + +КонецПроцедуры + +// Обработчик одноименного события формы. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения - форма, в которой размещены элементы настройки напоминания. +// ИмяСобытия - Строка +// Параметр - см. НапоминанияПользователяКлиентСервер.ОписаниеНапоминания +// Источник - ФормаКлиентскогоПриложения +// - Произвольный - источник события. +// +Процедура ОбработкаОповещения(Форма, ИмяСобытия, Параметр, Источник) Экспорт + + Если ИмяСобытия = "Запись_НапоминанияПользователя" Тогда + НастройкиНапоминания = НастройкиНапоминанияВФорме(Форма); + Если Параметр.Источник = НастройкиНапоминания.Предмет И Параметр.ИмяРеквизитаИсточника = НастройкиНапоминания.ИмяРеквизитаСДатойСобытия Тогда + ИмяПоляИнтервалВремениНапоминания = НапоминанияПользователяКлиентСервер.ИмяПоляИнтервалВремениНапоминания(); + ИнтервалВремениНапоминания = Параметр.ИнтервалВремениНапоминания; + НастройкиНапоминания.ИнтервалВремениНапоминания = ИнтервалВремениНапоминания; + + Форма[ИмяПоляИнтервалВремениНапоминания] = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'за %1'"), ПредставлениеВремени(ИнтервалВремениНапоминания)); + + Форма[НапоминанияПользователяКлиентСервер.ИмяПоляНапоминатьОСобытии()] = Истина; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -102,14 +158,13 @@ // См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы. Процедура ПослеНачалаРаботыСистемы() Экспорт - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); - Если Не ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда + Если Не ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат; КонецЕсли; - Если ПараметрыРаботыКлиента.НастройкиНапоминаний.ИспользоватьНапоминания Тогда - НастройкиНаКлиенте().СписокТекущихНапоминаний = - ПараметрыРаботыКлиента.НастройкиНапоминаний.СписокТекущихНапоминаний; + НастройкиНапоминаний = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске().НастройкиНапоминаний; + Если НастройкиНапоминаний.ИспользоватьНапоминания Тогда + НастройкиНаКлиенте().СписокТекущихНапоминаний = НастройкиНапоминаний.СписокТекущихНапоминаний; ПодключитьОбработчикОжидания("ПроверитьТекущиеНапоминания", 60, Истина); // Через 60 секунд после запуска клиента. КонецЕсли; @@ -259,196 +314,23 @@ Возврат ПредставлениеВремени(ПолучитьИнтервалВремениИзСтроки(ВремяСтрокой)); КонецФункции -// Возвращает текстовое представление интервала времени, заданного в секундах. -// -// Параметры: -// -// Время - Число - интервал времени в секундах. -// -// ПолноеПредставление - Булево - кратное или полное представление времени. -// Например, интервал 1 000 000 секунд: -// 1) полное представление: 11 дней 13 часов 46 минут 40 секунд; -// 2) краткое представление: 11 дней 13 часов. -// -// ВыводитьСекунды - Булево - Ложь, если секунды не требуются. -// -// Возвращаемое значение: -// Строка - представление интервала времени. -// +// См. НапоминанияПользователяКлиентСервер.ПредставлениеВремени Функция ПредставлениеВремени(Знач Время, ПолноеПредставление = Истина, ВыводитьСекунды = Истина) Экспорт - Результат = ""; - // Представление единиц измерения времени в винительном падеже для количеств: 1, 2-4, 5-20. - ПредставлениеНедель = НСтр("ru = ';%1 неделю;;%1 недели;%1 недель;%1 недели'"); - ПредставлениеДней = НСтр("ru = ';%1 день;;%1 дня;%1 дней;%1 дня'"); - ПредставлениеЧасов = НСтр("ru = ';%1 час;;%1 часа;%1 часов;%1 часа'"); - ПредставлениеМинут = НСтр("ru = ';%1 минуту;;%1 минуты;%1 минут;%1 минуты'"); - ПредставлениеСекунд = НСтр("ru = ';%1 секунду;;%1 секунды;%1 секунд;%1 секунды'"); - - Время = Число(Время); - - Если Время < 0 Тогда - Время = -Время; - КонецЕсли; - - КоличествоНедель = Цел(Время / 60/60/24/7); - КоличествоДней = Цел(Время / 60/60/24); - КоличествоЧасов = Цел(Время / 60/60); - КоличествоМинут = Цел(Время / 60); - КоличествоСекунд = Цел(Время); - - КоличествоСекунд = КоличествоСекунд - КоличествоМинут * 60; - КоличествоМинут = КоличествоМинут - КоличествоЧасов * 60; - КоличествоЧасов = КоличествоЧасов - КоличествоДней * 24; - КоличествоДней = КоличествоДней - КоличествоНедель * 7; - - Если Не ВыводитьСекунды Тогда - КоличествоСекунд = 0; - КонецЕсли; - - ФорматнаяСтрока = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("L=%1", ТекущийЯзык()); - - Если КоличествоНедель > 0 И КоличествоДней+КоличествоЧасов+КоличествоМинут+КоличествоСекунд=0 Тогда - Результат = СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(ПредставлениеНедель, КоличествоНедель,, ФорматнаяСтрока); - Иначе - КоличествоДней = КоличествоДней + КоличествоНедель * 7; - - Счетчик = 0; - Если КоличествоДней > 0 Тогда - Результат = Результат + СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(ПредставлениеДней, КоличествоДней,, ФорматнаяСтрока) + " "; - Счетчик = Счетчик + 1; - КонецЕсли; - - Если КоличествоЧасов > 0 Тогда - Результат = Результат + СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(ПредставлениеЧасов, КоличествоЧасов,, ФорматнаяСтрока) + " "; - Счетчик = Счетчик + 1; - КонецЕсли; - - Если (ПолноеПредставление Или Счетчик < 2) И КоличествоМинут > 0 Тогда - Результат = Результат + СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(ПредставлениеМинут, КоличествоМинут,, ФорматнаяСтрока) + " "; - Счетчик = Счетчик + 1; - КонецЕсли; - - Если (ПолноеПредставление Или Счетчик < 2) И (КоличествоСекунд > 0 Или КоличествоНедель+КоличествоДней+КоличествоЧасов+КоличествоМинут = 0) Тогда - Результат = Результат + СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(ПредставлениеСекунд, КоличествоСекунд,, ФорматнаяСтрока); - КонецЕсли; - - КонецЕсли; - - Возврат СокрП(Результат); + Возврат НапоминанияПользователяКлиентСервер.ПредставлениеВремени(Время, ПолноеПредставление, ВыводитьСекунды); КонецФункции -// Получает из текстового описания интервал времени в секундах. -// -// Параметры: -// СтрокаСоВременем - Строка - текстовое описание времени, где числа записаны цифрами, -// а единицы измерения - строкой. -// -// Возвращаемое значение: -// Число - интервал времени в секундах. -// +// См. НапоминанияПользователяКлиентСервер.ИнтервалВремениИзСтроки Функция ПолучитьИнтервалВремениИзСтроки(Знач СтрокаСоВременем) Экспорт - Если ПустаяСтрока(СтрокаСоВременем) Тогда - Возврат 0; - КонецЕсли; - - СтрокаСоВременем = НРег(СтрокаСоВременем); - СтрокаСоВременем = СтрЗаменить(СтрокаСоВременем, Символы.НПП," "); - СтрокаСоВременем = СтрЗаменить(СтрокаСоВременем, ".",","); - СтрокаСоВременем = СтрЗаменить(СтрокаСоВременем, "+",""); - - ПодстрокаСЦифрами = ""; - ПодстрокаСБуквами = ""; - - ПредыдущийСимволЭтоЦифра = Ложь; - ЕстьДробнаяЧасть = Ложь; - - Результат = 0; - Для Позиция = 1 По СтрДлина(СтрокаСоВременем) Цикл - ТекущийКодСимвола = КодСимвола(СтрокаСоВременем,Позиция); - Символ = Сред(СтрокаСоВременем,Позиция,1); - Если (ТекущийКодСимвола >= КодСимвола("0") И ТекущийКодСимвола <= КодСимвола("9")) - ИЛИ (Символ="," И ПредыдущийСимволЭтоЦифра И Не ЕстьДробнаяЧасть) Тогда - Если Не ПустаяСтрока(ПодстрокаСБуквами) Тогда - ПодстрокаСЦифрами = СтрЗаменить(ПодстрокаСЦифрами,",","."); - Результат = Результат + ?(ПустаяСтрока(ПодстрокаСЦифрами), 1, Число(ПодстрокаСЦифрами)) - * ЗаменитьЕдиницуИзмеренияНаМножитель(ПодстрокаСБуквами); - - ПодстрокаСЦифрами = ""; - ПодстрокаСБуквами = ""; - - ПредыдущийСимволЭтоЦифра = Ложь; - ЕстьДробнаяЧасть = Ложь; - КонецЕсли; - - ПодстрокаСЦифрами = ПодстрокаСЦифрами + Сред(СтрокаСоВременем,Позиция,1); - - ПредыдущийСимволЭтоЦифра = Истина; - Если Символ = "," Тогда - ЕстьДробнаяЧасть = Истина; - КонецЕсли; - Иначе - Если Символ = " " И ЗаменитьЕдиницуИзмеренияНаМножитель(ПодстрокаСБуквами) = "0" Тогда - ПодстрокаСБуквами = ""; - КонецЕсли; - - ПодстрокаСБуквами = ПодстрокаСБуквами + Сред(СтрокаСоВременем,Позиция,1); - ПредыдущийСимволЭтоЦифра = Ложь; - КонецЕсли; - КонецЦикла; - - Если Не ПустаяСтрока(ПодстрокаСБуквами) Тогда - ПодстрокаСЦифрами = СтрЗаменить(ПодстрокаСЦифрами,",","."); - Результат = Результат + ?(ПустаяСтрока(ПодстрокаСЦифрами), 1, Число(ПодстрокаСЦифрами)) - * ЗаменитьЕдиницуИзмеренияНаМножитель(ПодстрокаСБуквами); - КонецЕсли; - - Возврат Результат; + Возврат НапоминанияПользователяКлиентСервер.ИнтервалВремениИзСтроки(СтрокаСоВременем); КонецФункции -// Анализирует слово на предмет соответствия единице времени и, если соответствие установлено, -// возвращает количество секунд, содержащееся в единице времени. -// -// Параметры: -// Единица - Строка - анализируемое слово. -// -// Возвращаемое значение: -// Число - количество секунд в Единице. Если единица не определена или пустая, то возвращается 0. -// -Функция ЗаменитьЕдиницуИзмеренияНаМножитель(Знач Единица) +Функция НастройкиНапоминанияВФорме(Форма) - Результат = 0; - Единица = НРег(Единица); - - ДопустимыеСимволы = НСтр("ru = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'"); // АПК:163; АПК:1036 (см. 456:1.1) символы, которые может вводить пользователь. - ПосторонниеСимволы = СтрСоединить(СтрРазделить(Единица, ДопустимыеСимволы, Ложь), ""); - Если ПосторонниеСимволы <> "" Тогда - Единица = СтрСоединить(СтрРазделить(Единица, ПосторонниеСимволы, Ложь), ""); - КонецЕсли; - - СловоформыНедели = СтрРазделить(НСтр("ru = 'нед,н'"), ",", Ложь); - СловоформыДня = СтрРазделить(НСтр("ru = 'ден,дне,дня,дн,д'"), ",", Ложь); - СловоформыЧаса = СтрРазделить(НСтр("ru = 'час,ч'"), ",", Ложь); - СловоформыМинуты = СтрРазделить(НСтр("ru = 'мин,м'"), ",", Ложь); - СловоформыСекунды = СтрРазделить(НСтр("ru = 'сек,с'"), ",", Ложь); - - ПервыеТриСимвола = Лев(Единица, 3); - Если СловоформыНедели.Найти(ПервыеТриСимвола) <> Неопределено Тогда - Результат = 60*60*24*7; - ИначеЕсли СловоформыДня.Найти(ПервыеТриСимвола) <> Неопределено Тогда - Результат = 60*60*24; - ИначеЕсли СловоформыЧаса.Найти(ПервыеТриСимвола) <> Неопределено Тогда - Результат = 60*60; - ИначеЕсли СловоформыМинуты.Найти(ПервыеТриСимвола) <> Неопределено Тогда - Результат = 60; - ИначеЕсли СловоформыСекунды.Найти(ПервыеТриСимвола) <> Неопределено Тогда - Результат = 1; - КонецЕсли; - - Возврат Формат(Результат,"ЧН=0; ЧГ=0"); + Возврат НапоминанияПользователяКлиентСервер.НастройкиНапоминанияВФорме(Форма); КонецФункции diff --git a/SSL/src/CommonModules/НапоминанияПользователяКлиентСервер/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяКлиентСервер/Module.bsl index 03a70a72a..e90224aed 100644 --- a/SSL/src/CommonModules/НапоминанияПользователяКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователяКлиентСервер/Module.bsl @@ -64,5 +64,229 @@ КонецФункции +// Возвращает текстовое представление интервала времени, заданного в секундах. +// +// Параметры: +// +// Время - Число - интервал времени в секундах. +// +// ПолноеПредставление - Булево - кратное или полное представление времени. +// Например, интервал 1 000 000 секунд: +// 1) полное представление: 11 дней 13 часов 46 минут 40 секунд; +// 2) краткое представление: 11 дней 13 часов. +// +// ВыводитьСекунды - Булево - Ложь, если секунды не требуются. +// +// Возвращаемое значение: +// Строка - представление интервала времени. +// +Функция ПредставлениеВремени(Знач Время, ПолноеПредставление = Истина, ВыводитьСекунды = Истина) Экспорт + Результат = ""; + + // Представление единиц измерения времени в винительном падеже для количеств: 1, 2-4, 5-20. + ПредставлениеНедель = НСтр("ru = ';%1 неделю;;%1 недели;%1 недель;%1 недели'"); + ПредставлениеДней = НСтр("ru = ';%1 день;;%1 дня;%1 дней;%1 дня'"); + ПредставлениеЧасов = НСтр("ru = ';%1 час;;%1 часа;%1 часов;%1 часа'"); + ПредставлениеМинут = НСтр("ru = ';%1 минуту;;%1 минуты;%1 минут;%1 минуты'"); + ПредставлениеСекунд = НСтр("ru = ';%1 секунду;;%1 секунды;%1 секунд;%1 секунды'"); + + Время = Число(Время); + + Если Время < 0 Тогда + Время = -Время; + КонецЕсли; + + КоличествоНедель = Цел(Время / 60/60/24/7); + КоличествоДней = Цел(Время / 60/60/24); + КоличествоЧасов = Цел(Время / 60/60); + КоличествоМинут = Цел(Время / 60); + КоличествоСекунд = Цел(Время); + + КоличествоСекунд = КоличествоСекунд - КоличествоМинут * 60; + КоличествоМинут = КоличествоМинут - КоличествоЧасов * 60; + КоличествоЧасов = КоличествоЧасов - КоличествоДней * 24; + КоличествоДней = КоличествоДней - КоличествоНедель * 7; + + Если Не ВыводитьСекунды Тогда + КоличествоСекунд = 0; + КонецЕсли; + + Если КоличествоНедель > 0 И КоличествоДней+КоличествоЧасов+КоличествоМинут+КоличествоСекунд=0 Тогда + Результат = СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(ПредставлениеНедель, КоличествоНедель); + Иначе + КоличествоДней = КоличествоДней + КоличествоНедель * 7; + + Счетчик = 0; + Если КоличествоДней > 0 Тогда + Результат = Результат + СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(ПредставлениеДней, КоличествоДней) + " "; + Счетчик = Счетчик + 1; + КонецЕсли; + + Если КоличествоЧасов > 0 Тогда + Результат = Результат + СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(ПредставлениеЧасов, КоличествоЧасов) + " "; + Счетчик = Счетчик + 1; + КонецЕсли; + + Если (ПолноеПредставление Или Счетчик < 2) И КоличествоМинут > 0 Или Время = 0 И Не ВыводитьСекунды Тогда + Результат = Результат + СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(ПредставлениеМинут, КоличествоМинут) + " "; + Счетчик = Счетчик + 1; + КонецЕсли; + + Если ВыводитьСекунды И (ПолноеПредставление Или Счетчик < 2) И (КоличествоСекунд > 0 Или КоличествоНедель+КоличествоДней+КоличествоЧасов+КоличествоМинут = 0) Тогда + Результат = Результат + СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(ПредставлениеСекунд, КоличествоСекунд); + КонецЕсли; + + КонецЕсли; + + Возврат СокрП(Результат); + +КонецФункции + +Функция ИмяПоляНапоминатьОСобытии() Экспорт + + Возврат "НапоминатьОСобытии"; + +КонецФункции + +Функция ИмяПоляИнтервалВремениНапоминания() Экспорт + Возврат "ИнтервалВремениНапоминания"; +КонецФункции + +Функция ИмяПоляНастройкиНапоминания() Экспорт + Возврат "НастройкиНапоминания"; +КонецФункции + +Функция НастройкиНапоминанияВФорме(Форма) Экспорт + + ЗначенияРеквизитов = Новый Структура(ИмяПоляНастройкиНапоминания()); + ЗаполнитьЗначенияСвойств(ЗначенияРеквизитов, Форма); + Возврат ЗначенияРеквизитов[ИмяПоляНастройкиНапоминания()]; + +КонецФункции + +// Получает из текстового описания интервал времени в секундах. +// +// Параметры: +// СтрокаСоВременем - Строка - текстовое описание времени, где числа записаны цифрами, +// а единицы измерения - строкой. +// +// Возвращаемое значение: +// Число - интервал времени в секундах. +// +Функция ИнтервалВремениИзСтроки(Знач СтрокаСоВременем) Экспорт + + Если ПустаяСтрока(СтрокаСоВременем) Тогда + Возврат 0; + КонецЕсли; + + СтрокаСоВременем = НРег(СтрокаСоВременем); + СтрокаСоВременем = СтрЗаменить(СтрокаСоВременем, Символы.НПП," "); + СтрокаСоВременем = СтрЗаменить(СтрокаСоВременем, ".",","); + СтрокаСоВременем = СтрЗаменить(СтрокаСоВременем, "+",""); + + ПодстрокаСЦифрами = ""; + ПодстрокаСБуквами = ""; + + ПредыдущийСимволЭтоЦифра = Ложь; + ЕстьДробнаяЧасть = Ложь; + + Результат = 0; + Для Позиция = 1 По СтрДлина(СтрокаСоВременем) Цикл + ТекущийКодСимвола = КодСимвола(СтрокаСоВременем,Позиция); + Символ = Сред(СтрокаСоВременем,Позиция,1); + Если (ТекущийКодСимвола >= КодСимвола("0") И ТекущийКодСимвола <= КодСимвола("9")) + ИЛИ (Символ="," И ПредыдущийСимволЭтоЦифра И Не ЕстьДробнаяЧасть) Тогда + Если Не ПустаяСтрока(ПодстрокаСБуквами) Тогда + ПодстрокаСЦифрами = СтрЗаменить(ПодстрокаСЦифрами,",","."); + Результат = Результат + ?(ПустаяСтрока(ПодстрокаСЦифрами), 1, Число(ПодстрокаСЦифрами)) + * ЗаменитьЕдиницуИзмеренияНаМножитель(ПодстрокаСБуквами); + + ПодстрокаСЦифрами = ""; + ПодстрокаСБуквами = ""; + + ПредыдущийСимволЭтоЦифра = Ложь; + ЕстьДробнаяЧасть = Ложь; + КонецЕсли; + + ПодстрокаСЦифрами = ПодстрокаСЦифрами + Сред(СтрокаСоВременем,Позиция,1); + + ПредыдущийСимволЭтоЦифра = Истина; + Если Символ = "," Тогда + ЕстьДробнаяЧасть = Истина; + КонецЕсли; + Иначе + Если Символ = " " И ЗаменитьЕдиницуИзмеренияНаМножитель(ПодстрокаСБуквами) = "0" Тогда + ПодстрокаСБуквами = ""; + КонецЕсли; + + ПодстрокаСБуквами = ПодстрокаСБуквами + Сред(СтрокаСоВременем,Позиция,1); + ПредыдущийСимволЭтоЦифра = Ложь; + КонецЕсли; + КонецЦикла; + + Если Не ПустаяСтрока(ПодстрокаСБуквами) Тогда + ПодстрокаСЦифрами = СтрЗаменить(ПодстрокаСЦифрами,",","."); + Результат = Результат + ?(ПустаяСтрока(ПодстрокаСЦифрами), 1, Число(ПодстрокаСЦифрами)) + * ЗаменитьЕдиницуИзмеренияНаМножитель(ПодстрокаСБуквами); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Анализирует слово на предмет соответствия единице времени и, если соответствие установлено, +// возвращает количество секунд, содержащееся в единице времени. +// +// Параметры: +// Единица - Строка - анализируемое слово. +// +// Возвращаемое значение: +// Число - количество секунд в Единице. Если единица не определена или пустая, то возвращается 0. +// +Функция ЗаменитьЕдиницуИзмеренияНаМножитель(Знач Единица) + + Результат = 0; + Единица = НРег(Единица); + + ДопустимыеСимволы = НСтр("ru = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'"); // АПК:163; АПК:1036 (см. 456:1.1) символы, которые может вводить пользователь. + ПосторонниеСимволы = СтрСоединить(СтрРазделить(Единица, ДопустимыеСимволы, Ложь), ""); + Если ПосторонниеСимволы <> "" Тогда + Единица = СтрСоединить(СтрРазделить(Единица, ПосторонниеСимволы, Ложь), ""); + КонецЕсли; + + СловоформыНедели = СтрРазделить(НСтр("ru = 'нед,н'"), ",", Ложь); + СловоформыДня = СтрРазделить(НСтр("ru = 'ден,дне,дня,дн,д'"), ",", Ложь); + СловоформыЧаса = СтрРазделить(НСтр("ru = 'час,ч'"), ",", Ложь); + СловоформыМинуты = СтрРазделить(НСтр("ru = 'мин,м'"), ",", Ложь); + СловоформыСекунды = СтрРазделить(НСтр("ru = 'сек,с'"), ",", Ложь); + + ПервыеТриСимвола = Лев(Единица,3); + Если СловоформыНедели.Найти(ПервыеТриСимвола) <> Неопределено Тогда + Результат = 60*60*24*7; + ИначеЕсли СловоформыДня.Найти(ПервыеТриСимвола) <> Неопределено Тогда + Результат = 60*60*24; + ИначеЕсли СловоформыЧаса.Найти(ПервыеТриСимвола) <> Неопределено Тогда + Результат = 60*60; + ИначеЕсли СловоформыМинуты.Найти(ПервыеТриСимвола) <> Неопределено Тогда + Результат = 60; + ИначеЕсли СловоформыСекунды.Найти(ПервыеТриСимвола) <> Неопределено Тогда + Результат = 1; + КонецЕсли; + + Возврат Формат(Результат,"ЧН=0; ЧГ=0"); + +КонецФункции + +Функция ПредставлениеПеречисленияНеНапоминать() Экспорт + + Возврат НСтр("ru = 'не напоминать'"); + +КонецФункции + +Функция ПредставлениеПеречисленияПриНаступлении() Экспорт + + Возврат НСтр("ru = 'при наступлении'"); + +КонецФункции #КонецОбласти diff --git a/SSL/src/CommonModules/НапоминанияПользователяСлужебный/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяСлужебный/Module.bsl index fc73445b4..bbd359372 100644 --- a/SSL/src/CommonModules/НапоминанияПользователяСлужебный/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователяСлужебный/Module.bsl @@ -14,6 +14,10 @@ // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиентаПриЗапуске. Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Возврат; + КонецЕсли; + ИспользоватьНапоминания = ПолучитьНастройкиНапоминаний().ИспользоватьНапоминания; СписокТекущихНапоминаний = ?(ИспользоватьНапоминания, СписокТекущихНапоминанийПользователя(), Новый Массив); @@ -567,6 +571,7 @@ Для Каждого СтрокаТаблицы Из ТаблицаРезультата Цикл ДатаПредмета = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаТаблицы.Источник, СтрокаТаблицы.ИмяРеквизитаИсточника); Если (ДатаПредмета - СтрокаТаблицы.ИнтервалВремениНапоминания) <> СтрокаТаблицы.ВремяСобытия Тогда + // @skip-check query-in-loop - запись данных набором с чтением в цикле. ОтключитьНапоминание(СтрокаТаблицы, Ложь); СтрокаТаблицы.СрокНапоминания = ДатаПредмета - СтрокаТаблицы.ИнтервалВремениНапоминания; СтрокаТаблицы.ВремяСобытия = ДатаПредмета; @@ -576,6 +581,7 @@ ПараметрыНапоминания = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(СтрокаТаблицы); ПараметрыНапоминания.Расписание = СтрокаТаблицы.Расписание.Получить(); + // @skip-check query-in-loop - запись данных набором с чтением в цикле. Напоминание = СоздатьНапоминание(ПараметрыНапоминания); ПодключитьНапоминание(Напоминание); КонецЕсли; @@ -936,7 +942,9 @@ Продолжить; КонецЕсли; + // @skip-check query-in-loop - нет обращения к данным ИБ в запросе. ГрафикСобытияНаГод = ГрафикСобытия(Расписание, Напоминание.ВремяСобытия, ДобавитьМесяц(Напоминание.ВремяСобытия, 12) - 1); + // @skip-check query-in-loop - нет обращения к данным ИБ в запросе. ПодошедшееВремяСобытия = ГрафикСобытия(Расписание, Напоминание.ВремяСобытия + 1, ТекущаяДатаСеанса()); // - подошло следующее время события по расписанию; @@ -950,22 +958,25 @@ НачатьТранзакцию(); Попытка Если ПодошедшееВремяСобытия.Количество() > 0 Тогда + // @skip-check query-in-loop - запись данных набором с чтением в цикле. ОтключитьНапоминание(Напоминание, Ложь, ПриЗапуске); ПараметрыНапоминания = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(Напоминание); ПараметрыНапоминания.Расписание = Напоминание.Расписание.Получить(); + // @skip-check query-in-loop - запись данных набором с чтением в цикле. Напоминание = СоздатьНапоминание(ПараметрыНапоминания); Напоминание.ВремяСобытия = ПодошедшееВремяСобытия[ПодошедшееВремяСобытия.ВГраница()]; Напоминание.СрокНапоминания = Напоминание.ВремяСобытия - Напоминание.ИнтервалВремениНапоминания; ПодключитьНапоминание(Напоминание,, ПриЗапуске); КонецЕсли; + // @skip-check query-in-loop - запись данных набором с чтением в цикле. ОтключитьНапоминание(Напоминание, Истина, ПриЗапуске); ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Напоминания пользователя'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, Метаданные.РегистрыСведений.НапоминанияПользователя, , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, Метаданные.РегистрыСведений.НапоминанияПользователя, , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; КонецЦикла; @@ -1025,4 +1036,285 @@ КонецФункции +// См. НапоминанияПользователя.ПриЧтенииНаСервере +Процедура ПриСозданииНаСервере(Форма, ПараметрыРазмещения) Экспорт + + Если Не ПолучитьФункциональнуюОпцию("ИспользоватьНапоминанияПользователя") Тогда + Возврат; + КонецЕсли; + + Если Не ПравоДоступа("Редактирование", Метаданные.РегистрыСведений.НапоминанияПользователя) Тогда + Возврат; + КонецЕсли; + + Если Не ЗначениеЗаполнено(ПараметрыРазмещения.ИмяРеквизитаСДатойСобытия) Тогда + Возврат; + КонецЕсли; + + Объект = Неопределено; + Для Каждого Реквизит Из Форма.ПолучитьРеквизиты() Цикл + Если ТипЗнч(Форма[Реквизит.Имя]) = Тип("ДанныеФормыСтруктура") Тогда + Объект = Форма[Реквизит.Имя]; + Прервать; + КонецЕсли; + КонецЦикла; + + Если Объект = Неопределено Тогда + Возврат; + КонецЕсли; + + ИмяРеквизитаСДатойСобытия = ПараметрыРазмещения.ИмяРеквизитаСДатойСобытия; + + Предмет = Объект.Ссылка; + ОбъектМетаданных = Предмет.Метаданные(); + + РеквизитСДатой = ОбъектМетаданных.Реквизиты.Найти(ИмяРеквизитаСДатойСобытия); + Если РеквизитСДатой = Неопределено Тогда + ЗначенияСвойств = Новый Структура("ИмяРеквизитаСДатойСобытия"); + ЗаполнитьЗначенияСвойств(ЗначенияСвойств, ОбъектМетаданных.СтандартныеРеквизиты); + РеквизитСДатой = ЗначенияСвойств.ИмяРеквизитаСДатойСобытия; + КонецЕсли; + + Если РеквизитСДатой = Неопределено Тогда + Возврат; + КонецЕсли; + + ВыводитьКороткиеИнтервалы = Истина; + ОписаниеТипаДата = РеквизитСДатой.Тип; // ОписаниеТипов + Если ОписаниеТипаДата.КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Дата Тогда + ВыводитьКороткиеИнтервалы = Ложь; + КонецЕсли; + + ИмяПоляНастройкиНапоминания = НапоминанияПользователяКлиентСервер.ИмяПоляНастройкиНапоминания(); + ИмяГруппыЭлементов = "НастройкаНапоминания"; + ИмяПоляИнтервалВремениНапоминания = НапоминанияПользователяКлиентСервер.ИмяПоляИнтервалВремениНапоминания(); + ИмяПоляНапоминатьОСобытии = ИмяПоляНапоминатьОСобытии(); + + НастройкиНапоминания = ПараметрыРазмещения(); + НастройкиНапоминания.Удалить("Группа"); + + ЗаполнитьЗначенияСвойств(НастройкиНапоминания, ПараметрыРазмещения); + + НастройкиНапоминания.Вставить("Предмет", Предмет); + + Если Форма.Элементы.Найти(ИмяГруппыЭлементов) = Неопределено Тогда + ДобавляемыеРеквизиты = Новый Массив; + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяПоляНастройкиНапоминания, Новый ОписаниеТипов)); + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяПоляНапоминатьОСобытии, + Новый ОписаниеТипов("Булево"), , НСтр("ru = 'Напомнить'"), Истина)); + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяПоляИнтервалВремениНапоминания, + Новый ОписаниеТипов("Строка"), , НСтр("ru = 'Интервал времени напоминания'"), Истина)); + + Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); + + Группа = Форма.Элементы.Добавить(ИмяГруппыЭлементов, Тип("ГруппаФормы"), ПараметрыРазмещения.Группа); + Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа; + Группа.ОтображатьЗаголовок = Ложь; + Группа.Заголовок = НСтр("ru = 'Настройка напоминания'"); + + Если НастройкиНапоминания.ДобавлятьФлажок Тогда + Флажок = Форма.Элементы.Добавить(ИмяПоляНапоминатьОСобытии, Тип("ПолеФормы"), Группа); + Флажок.ПутьКДанным = ИмяПоляНапоминатьОСобытии; + Флажок.Вид = ВидПоляФормы.ПолеФлажка; + Флажок.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право; + Флажок.Заголовок = НСтр("ru = 'Напомнить:'"); + КонецЕсли; + + ПолеВвода = Форма.Элементы.Добавить(ИмяПоляИнтервалВремениНапоминания, Тип("ПолеФормы"), Группа); + ПолеВвода.ПутьКДанным = ИмяПоляИнтервалВремениНапоминания; + ПолеВвода.Вид = ВидПоляФормы.ПолеВвода; + ПолеВвода.Подсказка = НСтр("ru = 'Время, за которое необходимо напомнить о событии'"); + Если НастройкиНапоминания.ДобавлятьФлажок Тогда + ПолеВвода.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Иначе + ПолеВвода.Заголовок = НСтр("ru = 'Напомнить'"); + КонецЕсли; + ПолеВвода.УстановитьДействие("ПриИзменении", "Подключаемый_ПриИзмененииНастройкиНапоминания"); + ПолеВвода.ОбновлениеТекстаРедактирования = ОбновлениеТекстаРедактирования.ПриИзмененииЗначения; + ПолеВвода.КнопкаВыпадающегоСписка = Истина; + ПолеВвода.Ширина = 12; + ПолеВвода.РастягиватьПоГоризонтали = Ложь; + + НастройкиПодсистемы = НастройкиПодсистемы(); + ИнтервалыВремени = НастройкиПодсистемы.СтандартныеИнтервалы; + + ПолеВвода.СписокВыбора.Очистить(); + Если Не НастройкиНапоминания.ДобавлятьФлажок Тогда + ПолеВвода.СписокВыбора.Добавить(НапоминанияПользователяКлиентСервер.ПредставлениеПеречисленияНеНапоминать()); + КонецЕсли; + ПолеВвода.СписокВыбора.Добавить(НапоминанияПользователяКлиентСервер.ПредставлениеПеречисленияПриНаступлении()); + + Для Каждого Интервал Из ИнтервалыВремени Цикл + Если Не ВыводитьКороткиеИнтервалы И ИнтервалВремениИзСтроки(Интервал) < 24*60*60 Тогда + Продолжить; + КонецЕсли; + + ПолеВвода.СписокВыбора.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'за %1'"), Интервал)); + КонецЦикла; + + Если НастройкиНапоминания.ИнтервалВремениНапоминания = Неопределено Тогда + ИнтервалВремениНапоминания = НапоминанияПользователяКлиентСервер.ПредставлениеПеречисленияПриНаступлении(); + НастройкиНапоминания.ИнтервалВремениНапоминания = 0; + КонецЕсли; + + Если НастройкиНапоминания.ДобавлятьФлажок Тогда + Если НастройкиНапоминания.ИнтервалВремениНапоминания = 0 Тогда + Форма[ИмяПоляИнтервалВремениНапоминания] = НапоминанияПользователяКлиентСервер.ПредставлениеПеречисленияПриНаступлении(); + Иначе + Форма[ИмяПоляИнтервалВремениНапоминания] = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'за %1'"), ПредставлениеВремени(НастройкиНапоминания.ИнтервалВремениНапоминания, , Ложь)); + КонецЕсли; + Иначе + Форма[ИмяПоляИнтервалВремениНапоминания] = НапоминанияПользователяКлиентСервер.ПредставлениеПеречисленияНеНапоминать(); + КонецЕсли; + + Форма[ИмяПоляНастройкиНапоминания] = НастройкиНапоминания; + КонецЕсли; + + Если Не ЗначениеЗаполнено(Предмет) Тогда + Возврат; + КонецЕсли; + + ПрочитатьНастройкиНапоминанияПоПредмету(Форма, Предмет); + +КонецПроцедуры + +// См. НапоминанияПользователя.ПриЧтенииНаСервере +Процедура ПриЧтенииНаСервере(Форма, ТекущийОбъект) Экспорт + + Если Не ПолучитьФункциональнуюОпцию("ИспользоватьНапоминанияПользователя") Тогда + Возврат; + КонецЕсли; + + Если Не ПравоДоступа("Редактирование", Метаданные.РегистрыСведений.НапоминанияПользователя) Тогда + Возврат; + КонецЕсли; + + НастройкиНапоминания = НапоминанияПользователяКлиентСервер.НастройкиНапоминанияВФорме(Форма); + Если НастройкиНапоминания = Неопределено Тогда + Возврат; + КонецЕсли; + + ИмяПоляИнтервалВремениНапоминания = НапоминанияПользователяКлиентСервер.ИмяПоляИнтервалВремениНапоминания(); + ИмяПоляНапоминатьОСобытии = ИмяПоляНапоминатьОСобытии(); + Предмет = ТекущийОбъект.Ссылка; + + ПрочитатьНастройкиНапоминанияПоПредмету(Форма, Предмет); + +КонецПроцедуры + +Процедура ПриЗаписиНаСервере(Форма, Отказ, ТекущийОбъект, ПараметрыЗаписи, Знач ТекстНапоминания) Экспорт + + Если Не ПолучитьФункциональнуюОпцию("ИспользоватьНапоминанияПользователя") Тогда + Возврат; + КонецЕсли; + + Если Не ПравоДоступа("Редактирование", Метаданные.РегистрыСведений.НапоминанияПользователя) Тогда + Возврат; + КонецЕсли; + + НастройкиНапоминания = НапоминанияПользователяКлиентСервер.НастройкиНапоминанияВФорме(Форма); + НапоминаниеВключено = Форма[ИмяПоляНапоминатьОСобытии()]; + Предмет = ТекущийОбъект.Ссылка; + НастройкиНапоминания.Вставить("Предмет", Предмет); + + ИмяРеквизитаСДатойСобытия = НастройкиНапоминания.ИмяРеквизитаСДатойСобытия; + ИнтервалВремениНапоминания = НастройкиНапоминания.ИнтервалВремениНапоминания; + Текст = ТекстНапоминания; + Если Не ЗначениеЗаполнено(Текст) Тогда + Текст = ОбщегоНазначения.ПредметСтрокой(Предмет); + КонецЕсли; + + Если НапоминаниеВключено Тогда + ПереустановитьНапоминаниеПоПредмету(Предмет, ИмяРеквизитаСДатойСобытия, ИнтервалВремениНапоминания, Текст); + Иначе + УдалитьНапоминанияПоПредмету(Предмет, ИмяРеквизитаСДатойСобытия) + КонецЕсли; + +КонецПроцедуры + +// См. НапоминанияПользователя.ПараметрыРазмещения +Функция ПараметрыРазмещения() Экспорт + + Результат = Новый Структура; + Результат.Вставить("Группа"); + Результат.Вставить("ИмяРеквизитаСДатойСобытия"); + Результат.Вставить("ИнтервалВремениНапоминания"); + Результат.Вставить("ДобавлятьФлажок", Ложь); + + Возврат Результат; + +КонецФункции + +// См. НапоминанияПользователяКлиентСервер.ПредставлениеВремени +Функция ПредставлениеВремени(Знач Время, ПолноеПредставление = Истина, ВыводитьСекунды = Истина) + + Возврат НапоминанияПользователяКлиентСервер.ПредставлениеВремени(Время, ПолноеПредставление, ВыводитьСекунды); + +КонецФункции + +Процедура УдалитьНапоминанияПоПредмету(Предмет, ИмяРеквизита) + + НапоминанияПоПредмету = НапоминанияПользователя.НайтиНапоминания(Предмет); + Для Каждого Напоминание Из НапоминанияПоПредмету Цикл + Если НРег(Напоминание.ИмяРеквизитаИсточника) = НРег(ИмяРеквизита) Тогда + // @skip-check query-in-loop - запись данных набором с чтением в цикле. + ОтключитьНапоминание(Напоминание, Ложь); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Процедура ПереустановитьНапоминаниеПоПредмету(Предмет, ИмяРеквизита, ИнтервалВремениНапоминания, Текст) + + УдалитьНапоминанияПоПредмету(Предмет, ИмяРеквизита); + ПодключитьПроизвольноеНапоминание(Текст, ИмяРеквизита, ИнтервалВремениНапоминания, Предмет); + +КонецПроцедуры + +// См. НапоминанияПользователяКлиентСервер.ИнтервалВремениИзСтроки +Функция ИнтервалВремениИзСтроки(Знач СтрокаСоВременем) Экспорт + + Возврат НапоминанияПользователяКлиентСервер.ИнтервалВремениИзСтроки(СтрокаСоВременем); + +КонецФункции + +Функция ИмяПоляНапоминатьОСобытии() Экспорт + + Возврат НапоминанияПользователяКлиентСервер.ИмяПоляНапоминатьОСобытии(); + +КонецФункции + +Процедура ПрочитатьНастройкиНапоминанияПоПредмету(Форма, Предмет) + + НастройкиНапоминания = НапоминанияПользователяКлиентСервер.НастройкиНапоминанияВФорме(Форма); + Если НастройкиНапоминания = Неопределено Тогда + Возврат; + КонецЕсли; + + НастройкиНапоминания.Вставить("Предмет", Предмет); + + НапоминанияПоПредмету = НапоминанияПользователя.НайтиНапоминания(Предмет); + Для Каждого Напоминание Из НапоминанияПоПредмету Цикл + Если НРег(Напоминание.ИмяРеквизитаИсточника) = НРег(НастройкиНапоминания.ИмяРеквизитаСДатойСобытия) Тогда + ИмяПоляНапоминатьОСобытии = ИмяПоляНапоминатьОСобытии(); + ИмяПоляИнтервалВремениНапоминания = НапоминанияПользователяКлиентСервер.ИмяПоляИнтервалВремениНапоминания(); + + Форма[ИмяПоляНапоминатьОСобытии] = Истина; + Если Напоминание.ИнтервалВремениНапоминания = 0 Тогда + Форма[ИмяПоляИнтервалВремениНапоминания] = НапоминанияПользователяКлиентСервер.ПредставлениеПеречисленияПриНаступлении(); + Иначе + Форма[ИмяПоляИнтервалВремениНапоминания] = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'за %1'"), ПредставлениеВремени(Напоминание.ИнтервалВремениНапоминания, , Ложь)); + КонецЕсли; + Прервать; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/НастройкаПорядкаЭлементов/Module.bsl b/SSL/src/CommonModules/НастройкаПорядкаЭлементов/Module.bsl index 034883e70..a13a4ec95 100644 --- a/SSL/src/CommonModules/НастройкаПорядкаЭлементов/Module.bsl +++ b/SSL/src/CommonModules/НастройкаПорядкаЭлементов/Module.bsl @@ -133,6 +133,7 @@ Вид.ИмяПодменю = "НастройкаПорядкаЭлементов"; Вид.Заголовок = НСтр("ru = 'Настройка порядка элементов'"); Вид.ВидГруппыФормы = ВидГруппыФормы.ГруппаКнопок; + Вид.Отображение = ОтображениеГруппыКнопок.Компактное; КонецПроцедуры // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту diff --git a/SSL/src/CommonModules/НастройкиПрограммы/Module.bsl b/SSL/src/CommonModules/НастройкиПрограммы/Module.bsl new file mode 100644 index 000000000..1572c81b4 --- /dev/null +++ b/SSL/src/CommonModules/НастройкиПрограммы/Module.bsl @@ -0,0 +1,350 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// Вызывается из обработчика ПриСозданииНаСервере() панели администрирования БСП. Выполняет настройку отображения +// элементов управления для подсистем библиотеки БСП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// Отказ - Булево +// СтандартнаяОбработка - Булево +// +Процедура ИнтернетПоддержкаИСервисыПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт + + Элементы = Форма.Элементы; + + Элементы.ГруппаКлассификаторы.Видимость = Не Форма.РазделениеВключено; + + Если Элементы.ГруппаКлассификаторы.Видимость Тогда + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + Если Не МодульАдресныйКлассификаторСлужебный.ЕстьПравоДобавлениеИзменениеАдресныхСведений() Тогда + Элементы.АдресныйКлассификаторНастройки.Видимость = Ложь; + КонецЕсли; + Иначе + Элементы.АдресныйКлассификаторНастройки.Видимость = Ложь; + КонецЕсли; + + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда + Элементы.ГруппаОбработкаЗагрузкаКурсовВалют.Видимость = + Не Форма.РазделениеВключено + И Не Форма.ЭтоАвтономноеРабочееМесто; + Иначе + Элементы.ГруппаОбработкаЗагрузкаКурсовВалют.Видимость = Ложь; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда + Элементы.ГруппаСклонения.Видимость = + Не Форма.РазделениеВключено + И Не Форма.ЭтоАвтономноеРабочееМесто + И Форма.ЭтоАдминистраторСистемы; + Если Элементы.ГруппаСклонения.Видимость Тогда + МодульСклонениеПредставленийОбъектов = ОбщегоНазначения.ОбщийМодуль("СклонениеПредставленийОбъектов"); + Форма.ИспользоватьСервисСклоненияMorpher = + МодульСклонениеПредставленийОбъектов.ИспользоватьСервисСклоненияMorpher(); + КонецЕсли; + Иначе + Элементы.ГруппаСклонения.Видимость = Ложь; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда + Элементы.ГруппаЦентрМониторинга.Видимость = Форма.ЭтоАдминистраторСистемы; + Если Форма.ЭтоАдминистраторСистемы Тогда + ПараметрыЦентраМониторинга = ПолучитьПараметрыЦентраМониторинга(); + Форма.ЦентрМониторингаРазрешитьОтправлятьДанные = ПолучитьПереключательОтправкиДанных( + ПараметрыЦентраМониторинга.ВключитьЦентрМониторинга, + ПараметрыЦентраМониторинга.ЦентрОбработкиИнформацииОПрограмме); + + ПараметрыСервиса = Новый Структура("Сервер, АдресРесурса, Порт"); + Если Форма.ЦентрМониторингаРазрешитьОтправлятьДанные = 0 Тогда + ПараметрыСервиса.Сервер = ПараметрыЦентраМониторинга.СерверПоУмолчанию; + ПараметрыСервиса.АдресРесурса = ПараметрыЦентраМониторинга.АдресРесурсаПоУмолчанию; + ПараметрыСервиса.Порт = ПараметрыЦентраМониторинга.ПортПоУмолчанию; + ИначеЕсли Форма.ЦентрМониторингаРазрешитьОтправлятьДанные = 1 Тогда + ПараметрыСервиса.Сервер = ПараметрыЦентраМониторинга.Сервер; + ПараметрыСервиса.АдресРесурса = ПараметрыЦентраМониторинга.АдресРесурса; + ПараметрыСервиса.Порт = ПараметрыЦентраМониторинга.Порт; + ИначеЕсли Форма.ЦентрМониторингаРазрешитьОтправлятьДанные = 2 Тогда + ПараметрыСервиса = Неопределено; + КонецЕсли; + + Если ПараметрыСервиса <> Неопределено Тогда + Если ПараметрыСервиса.Порт = 80 Тогда + Схема = "http://"; + Порт = ""; + ИначеЕсли ПараметрыСервиса.Порт = 443 Тогда + Схема = "https://"; + Порт = ""; + Иначе + Схема = "http://"; + Порт = ":" + Формат(ПараметрыСервиса.Порт, "ЧН=0; ЧГ="); + КонецЕсли; + + Форма.ЦентрМониторингаАдресСервиса = Схема + + ПараметрыСервиса.Сервер + + Порт + + "/" + + ПараметрыСервиса.АдресРесурса; + Иначе + Форма.ЦентрМониторингаАдресСервиса = ""; + КонецЕсли; + + Элементы.ЦентрМониторингаАдресСервиса.Доступность = (Форма.ЦентрМониторингаРазрешитьОтправлятьДанные = 1); + Элементы.ЦентрМониторингаНастройки.Доступность = (Форма.ЦентрМониторингаРазрешитьОтправлятьДанные <> 2); + Элементы.ГруппаОтправитьКонтактнуюИнформацию.Видимость = + (ПараметрыЦентраМониторинга.ЗапросКонтактнойИнформации <> 2); + КонецЕсли; + Иначе + Элементы.ГруппаЦентрМониторинга.Видимость = Ложь; + КонецЕсли; + + ВидимостьГруппыВнешниеКомпоненты = Ложь; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда + + МодульВнешниеКомпонентыСлужебный = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыСлужебный"); + ВидимостьГруппыВнешниеКомпоненты = МодульВнешниеКомпонентыСлужебный.ДоступнаЗагрузкаСПортала(); + + КонецЕсли; + + Элементы.ГруппаВнешниеКомпоненты.Видимость = ВидимостьГруппыВнешниеКомпоненты; + + НастройкиПрограммыПереопределяемый.ИнтернетПоддержкаИСервисыПриСозданииНаСервере(Форма); + + Элементы.ГруппаОбсуждения.Видимость = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения"); + +КонецПроцедуры + +// Сохраняет новое значение константы панели администрирования "Интернет-поддержка и сервисы" БСП и БИП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// ИмяКонстанты - Строка - имя константы, значение которого было изменено. +// НовоеЗначение - Произвольный +// +Процедура ИнтернетПоддержкаИСервисыПриИзмененииКонстанты(Форма, ИмяКонстанты, НовоеЗначение) Экспорт + + СохранитьЗначениеКонстанты(ИмяКонстанты, НовоеЗначение); + + Если ИмяКонстанты = "ИспользоватьСервисСклоненияMorpher" + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда + + МодульСклонениеПредставленийОбъектов = ОбщегоНазначения.ОбщийМодуль("СклонениеПредставленийОбъектов"); + МодульСклонениеПредставленийОбъектов.УстановитьДоступностьСервисаСклонения(Истина); + + КонецЕсли; + + ОбновитьПовторноИспользуемыеЗначения(); + +КонецПроцедуры + +// Выполняет обработку события ПриИзменении() элементов формы БСП ЦентрМониторингаРазрешитьОтправлятьДанные, +// ЦентрМониторингаРазрешитьОтправлятьДанныеСтороннему, ЦентрМониторингаЗапретитьОтправлятьДанные панели +// администрирования "Интернет-поддержка и сервисы" БСП и БИП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// Элемент - ПолеФормы +// ПараметрыОперации - Структура из КлючИЗначение - заполняется параметрами, которые будут переданы для исполнения в +// клиентской среде. +// +Процедура ИнтернетПоддержкаИСервисыРазрешитьОтправлятьДанныеПриИзменении(Форма, Элемент, ПараметрыОперации) Экспорт + Перем РезультатЗапуска; + + Элементы = Форма.Элементы; + + Элементы.ЦентрМониторингаАдресСервиса.Доступность = (Форма.ЦентрМониторингаРазрешитьОтправлятьДанные = 1); + Элементы.ЦентрМониторингаНастройки.Доступность = (Форма.ЦентрМониторингаРазрешитьОтправлятьДанные <> 2); + Если Форма.ЦентрМониторингаРазрешитьОтправлятьДанные = 2 Тогда + ПараметрыЦентраМониторинга = + Новый Структура("ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме", Ложь, Ложь); + ИначеЕсли Форма.ЦентрМониторингаРазрешитьОтправлятьДанные = 1 Тогда + ПараметрыЦентраМониторинга = + Новый Структура("ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме", Ложь, Истина); + ИначеЕсли Форма.ЦентрМониторингаРазрешитьОтправлятьДанные = 0 Тогда + ПараметрыЦентраМониторинга = + Новый Структура("ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме", Истина, Ложь); + КонецЕсли; + + Форма.ЦентрМониторингаАдресСервиса = ПолучитьАдресСервиса(Форма.ЦентрМониторингаРазрешитьОтправлятьДанные); + + МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); + МодульЦентрМониторингаСлужебный.УстановитьПараметрыЦентраМониторингаВнешнийВызов(ПараметрыЦентраМониторинга); + + ВключитьЦентрМониторинга = ПараметрыЦентраМониторинга.ВключитьЦентрМониторинга; + ЦентрОбработкиИнформацииОПрограмме = ПараметрыЦентраМониторинга.ЦентрОбработкиИнформацииОПрограмме; + + Результат = ПолучитьПереключательОтправкиДанных(ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме); + + Если Результат = 0 Или Результат = 1 Тогда + // Отправка ознакомительного пакета. + РезультатЗапуска = МодульЦентрМониторингаСлужебный.ЗапускОтправкиОзнакомительногоПакета(); + КонецЕсли; + + Если Результат = 0 Тогда + // Включение задания сбора и отправки статистики. + РегЗадание = МодульЦентрМониторингаСлужебный.ПолучитьРегламентноеЗаданиеВнешнийВызов( + "СборИОтправкаСтатистики", + Истина); + МодульЦентрМониторингаСлужебный.УстановитьРасписаниеПоУмолчаниюВнешнийВызов(РегЗадание); + ИначеЕсли Результат = 1 Тогда + РегЗадание = МодульЦентрМониторингаСлужебный.ПолучитьРегламентноеЗаданиеВнешнийВызов( + "СборИОтправкаСтатистики", + Истина); + МодульЦентрМониторингаСлужебный.УстановитьРасписаниеПоУмолчаниюВнешнийВызов(РегЗадание); + ИначеЕсли Результат = 2 Тогда + МодульЦентрМониторингаСлужебный.УдалитьРегламентноеЗаданиеВнешнийВызов("СборИОтправкаСтатистики"); + КонецЕсли; + + ПараметрыОперации.Вставить("РезультатЗапуска", РезультатЗапуска); + +КонецПроцедуры + +// Выполняет обработку события ПриИзменении() элементов формы БСП ЦентрМониторингаАдресСервиса панели администрирования +// "Интернет-поддержка и сервисы" БСП и БИП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// Элемент - ПолеФормы +// +Процедура ИнтернетПоддержкаИСервисыЦентрМониторингаАдресСервисаПриИзменении(Форма, Элемент) Экспорт + + Попытка + СтруктураАдреса = ОбщегоНазначенияКлиентСервер.СтруктураURI(Форма.ЦентрМониторингаАдресСервиса); + + Если СтруктураАдреса.Схема = "http" Тогда + СтруктураАдреса.Вставить("ЗащищенноеСоединение", Ложь); + ИначеЕсли СтруктураАдреса.Схема = "https" Тогда + СтруктураАдреса.Вставить("ЗащищенноеСоединение", Истина); + Иначе + СтруктураАдреса.Вставить("ЗащищенноеСоединение", Ложь); + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(СтруктураАдреса.Порт) Тогда + Если СтруктураАдреса.Схема = "http" Тогда + СтруктураАдреса.Порт = 80; + ИначеЕсли СтруктураАдреса.Схема = "https" Тогда + СтруктураАдреса.Порт = 443; + Иначе + СтруктураАдреса.Порт = 80; + КонецЕсли; + КонецЕсли; + Исключение + // Внимание, формат адреса должен соответствовать RFC 3986 + // см. описание функции ОбщегоНазначенияКлиентСервер.СтруктураURI. + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Адрес сервиса %1 не является допустимым адресом веб-сервиса для отправки отчетов об использовании программы.'"), + Форма.ЦентрМониторингаАдресСервиса); + ВызватьИсключение(ОписаниеОшибки); + КонецПопытки; + + ПараметрыЦентраМониторинга = Новый Структура(); + ПараметрыЦентраМониторинга.Вставить("Сервер", СтруктураАдреса.Хост); + ПараметрыЦентраМониторинга.Вставить("АдресРесурса", СтруктураАдреса.ПутьНаСервере); + ПараметрыЦентраМониторинга.Вставить("Порт", СтруктураАдреса.Порт); + ПараметрыЦентраМониторинга.Вставить("ЗащищенноеСоединение", СтруктураАдреса.ЗащищенноеСоединение); + + МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); + МодульЦентрМониторингаСлужебный.УстановитьПараметрыЦентраМониторингаВнешнийВызов(ПараметрыЦентраМониторинга); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#Область ЦентрМониторинга + +Функция ПолучитьПереключательОтправкиДанных(ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме) + Состояние = ?(ВключитьЦентрМониторинга, "1", "0") + ?(ЦентрОбработкиИнформацииОПрограмме, "1", "0"); + + Если Состояние = "00" Тогда + Результат = 2; + ИначеЕсли Состояние = "01" Тогда + Результат = 1; + ИначеЕсли Состояние = "10" Тогда + Результат = 0; + ИначеЕсли Состояние = "11" Тогда + // А такого быть не может... + КонецЕсли; + + Возврат Результат; +КонецФункции + +Функция ПолучитьАдресСервиса(ЦентрМониторингаРазрешитьОтправлятьДанные) + + ПараметрыЦентраМониторинга = ПолучитьПараметрыЦентраМониторинга(); + + ПараметрыСервиса = Новый Структура("Сервер, АдресРесурса, Порт"); + + Если ЦентрМониторингаРазрешитьОтправлятьДанные = 0 Тогда + ПараметрыСервиса.Сервер = ПараметрыЦентраМониторинга.СерверПоУмолчанию; + ПараметрыСервиса.АдресРесурса = ПараметрыЦентраМониторинга.АдресРесурсаПоУмолчанию; + ПараметрыСервиса.Порт = ПараметрыЦентраМониторинга.ПортПоУмолчанию; + ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 1 Тогда + ПараметрыСервиса.Сервер = ПараметрыЦентраМониторинга.Сервер; + ПараметрыСервиса.АдресРесурса = ПараметрыЦентраМониторинга.АдресРесурса; + ПараметрыСервиса.Порт = ПараметрыЦентраМониторинга.Порт; + ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 2 Тогда + ПараметрыСервиса = Неопределено; + КонецЕсли; + + Если ПараметрыСервиса <> Неопределено Тогда + Если ПараметрыСервиса.Порт = 80 Тогда + Схема = "http://"; + Порт = ""; + ИначеЕсли ПараметрыСервиса.Порт = 443 Тогда + Схема = "https://"; + Порт = ""; + Иначе + Схема = "http://"; + Порт = ":" + Формат(ПараметрыСервиса.Порт, "ЧН=0; ЧГ="); + КонецЕсли; + + АдресСервиса = Схема + ПараметрыСервиса.Сервер + Порт + "/" + ПараметрыСервиса.АдресРесурса; + Иначе + АдресСервиса = ""; + КонецЕсли; + + Возврат АдресСервиса; +КонецФункции + +Функция ПолучитьПараметрыЦентраМониторинга() + МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); + ПараметрыЦентраМониторинга = МодульЦентрМониторингаСлужебный.ПолучитьПараметрыЦентраМониторингаВнешнийВызов(); + + ПараметрыСервисаПоУмолчанию = МодульЦентрМониторингаСлужебный.ПолучитьПараметрыПоУмолчаниюВнешнийВызов(); + ПараметрыЦентраМониторинга.Вставить("СерверПоУмолчанию", ПараметрыСервисаПоУмолчанию.Сервер); + ПараметрыЦентраМониторинга.Вставить("АдресРесурсаПоУмолчанию", ПараметрыСервисаПоУмолчанию.АдресРесурса); + ПараметрыЦентраМониторинга.Вставить("ПортПоУмолчанию", ПараметрыСервисаПоУмолчанию.Порт); + + Возврат ПараметрыЦентраМониторинга; +КонецФункции + +#КонецОбласти + +Процедура СохранитьЗначениеКонстанты(ИмяКонстанты, НовоеЗначение) + + КонстантаМенеджер = Константы[ИмяКонстанты]; + + Если КонстантаМенеджер.Получить() <> НовоеЗначение Тогда + КонстантаМенеджер.Установить(НовоеЗначение); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ВызовОнлайнПоддержки/ВызовОнлайнПоддержки.mdo b/SSL/src/CommonModules/НастройкиПрограммы/НастройкиПрограммы.mdo similarity index 63% rename from SSL/src/CommonModules/ВызовОнлайнПоддержки/ВызовОнлайнПоддержки.mdo rename to SSL/src/CommonModules/НастройкиПрограммы/НастройкиПрограммы.mdo index 39ceabf59..3fba04daa 100644 --- a/SSL/src/CommonModules/ВызовОнлайнПоддержки/ВызовОнлайнПоддержки.mdo +++ b/SSL/src/CommonModules/НастройкиПрограммы/НастройкиПрограммы.mdo @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c0e01a15-6937-4331-bdd7-2f5a68d0d3dd"> - <name>ВызовОнлайнПоддержки</name> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="e1a375da-c16c-4616-8a33-9414c13a48c7"> + <name>НастройкиПрограммы</name> <synonym> <key>ru</key> - <value>Вызов онлайн-поддержки</value> + <value>Настройки программы</value> </synonym> <server>true</server> <externalConnection>true</externalConnection> diff --git a/SSL/src/CommonModules/НастройкиПрограммыКлиент/Module.bsl b/SSL/src/CommonModules/НастройкиПрограммыКлиент/Module.bsl new file mode 100644 index 000000000..de6070cdf --- /dev/null +++ b/SSL/src/CommonModules/НастройкиПрограммыКлиент/Module.bsl @@ -0,0 +1,341 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// Вызывается из обработчика ПриОткрытии() панели администрирования БСП и БИП. Выполняет настройку отображения элементов +// управления для подсистем библиотеки БСП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// Отказ - Булево +// +Процедура ИнтернетПоддержкаИСервисыПриОткрытии(Форма, Отказ) Экспорт + + // Обновление состояния элементов. + ИнтернетПоддержкаИСервисыУстановитьДоступность(Форма); + + ИнтернетПоддержкаИСервисыПриИзмененииСостоянияПодключенияОбсуждений(Форма); + +КонецПроцедуры + +// Вызывается из обработчика ОбработкаОповещения() панели администрирования БСП и БИП. Выполняет настройку отображения +// элементов управления для подсистем библиотеки БСП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// ИмяСобытия - Строка - имя события для идентификации сообщений. +// Параметр - Произвольный - параметр события. +// Источник - Произвольный - источник события. +// +Процедура ИнтернетПоддержкаИСервисыОбработкаОповещения(Форма, ИмяСобытия, Параметр, Источник) Экспорт + + Если ИмяСобытия = "ОбсужденияПодключены" Тогда + ИнтернетПоддержкаИСервисыПриИзмененииСостоянияПодключенияОбсуждений(Форма, Параметр); + КонецЕсли; + +КонецПроцедуры + +// Выполняет обработку события ПриИзменении() элементов формы БСП ЦентрМониторингаРазрешитьОтправлятьДанные, +// ЦентрМониторингаРазрешитьОтправлятьДанныеСтороннему, ЦентрМониторингаЗапретитьОтправлятьДанные панели +// администрирования "Интернет-поддержка и сервисы" БСП и БИП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// Элемент - ПолеФормы +// ПараметрыОперации - Структура: +// * РезультатЗапуска - см. ДлительныеОперации.ВыполнитьВФоне +// +Процедура ИнтернетПоддержкаИСервисыРазрешитьОтправлятьДанныеПриИзменении(Форма, Элемент, ПараметрыОперации) Экспорт + + Если ПараметрыОперации.РезультатЗапуска <> Неопределено Тогда + Форма.ЦентрМониторингаИдентификаторЗадания = ПараметрыОперации.РезультатЗапуска.ИдентификаторЗадания; + Форма.ЦентрМониторингаАдресРезультатаЗадания = ПараметрыОперации.РезультатЗапуска.АдресРезультата; + МодульЦентрМониторингаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЦентрМониторингаКлиент"); + Оповещение = Новый ОписаниеОповещения("ПослеОбновленияИдентификатора", МодульЦентрМониторингаКлиент); + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Форма); + ПараметрыОжидания.ВыводитьОкноОжидания = Ложь; + ДлительныеОперацииКлиент.ОжидатьЗавершение(ПараметрыОперации.РезультатЗапуска, Оповещение, ПараметрыОжидания); + КонецЕсли; + +КонецПроцедуры + +// Выполняет обработку события ПриИзменении() элементов формы БСП, связанного с константой панели администрирования +// "Интернет-поддержка и сервисы" БСП и БИП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// Элемент - ПолеФормы +// +Процедура ИнтернетПоддержкаИСервисыПриИзмененииКонстанты(Форма, Элемент) Экспорт + + ИмяКонстанты = Элемент.Имя; + + ИнтернетПоддержкаИСервисыУстановитьДоступность(Форма, ИмяКонстанты); + ОбновитьПовторноИспользуемыеЗначения(); + + Если ИмяКонстанты <> "" Тогда + Оповестить("Запись_НаборКонстант", Новый Структура, ИмяКонстанты); + КонецЕсли; + +КонецПроцедуры + +// Выполняет обработку события команды БСП ЗагрузкаАдресногоКлассификатора панели администрирования "Интернет-поддержка +// и сервисы" БСП и БИП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// Команда - КомандаФормы +// +Процедура ИнтернетПоддержкаИСервисыЗагрузкаАдресногоКлассификатора(Форма, Команда) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АдресныйКлассификаторКлиент"); + МодульАдресныйКлассификаторКлиент.ЗагрузитьАдресныйКлассификатор(); + КонецЕсли; + +КонецПроцедуры + +// Выполняет обработку события команды БСП ОчисткаАдресныхСведений панели администрирования "Интернет-поддержка и +// сервисы" БСП и БИП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// Команда - КомандаФормы +// +Процедура ИнтернетПоддержкаИСервисыОчисткаАдресныхСведений(Форма, Команда) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АдресныйКлассификаторКлиент"); + МодульАдресныйКлассификаторКлиент.ПоказатьОчисткуАдресногоКлассификатора(); + КонецЕсли; + +КонецПроцедуры + +// Выполняет обработку события команды БСП ЗагрузкаКурсовВалют панели администрирования "Интернет-поддержка и сервисы" +// БСП и БИП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// Команда - КомандаФормы +// +Процедура ИнтернетПоддержкаИСервисыЗагрузкаКурсовВалют(Форма, Команда) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда + МодульРаботаСКурсамиВалютКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСКурсамиВалютКлиент"); + МодульРаботаСКурсамиВалютКлиент.ПоказатьЗагрузкуКурсовВалют(); + КонецЕсли; + +КонецПроцедуры + +// Выполняет обработку события команды БСП ОткрытьОписаниеИзмененийСистемы панели администрирования "Интернет-поддержка +// и сервисы" БСП и БИП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// Команда - КомандаФормы +// +Процедура ИнтернетПоддержкаИСервисыОткрытьОписаниеИзмененийСистемы(Форма, Команда) Экспорт + + ОткрытьФорму("ОбщаяФорма.ОписаниеИзмененийПрограммы",, Форма); + +КонецПроцедуры + +// Выполняет обработку события команды БСП НастройкаДоступаКСервисуMorpher панели администрирования "Интернет-поддержка +// и сервисы" БСП и БИП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// Команда - КомандаФормы +// +Процедура ИнтернетПоддержкаИСервисыНастройкаДоступаКСервисуMorpher(Форма, Команда) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда + МодульСклонениеПредставленийОбъектовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль( + "СклонениеПредставленийОбъектовКлиент"); + МодульСклонениеПредставленийОбъектовКлиент.ПоказатьНастройкиДоступаКСервисуMorpher(); + КонецЕсли; + +КонецПроцедуры + +// Выполняет обработку события команды БСП ЦентрМониторингаНастройки панели администрирования "Интернет-поддержка и +// сервисы" БСП и БИП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// Команда - КомандаФормы +// +Процедура ИнтернетПоддержкаИСервисыЦентрМониторингаНастройки(Форма, Команда) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("ИдентификаторЗадания" , Форма.ЦентрМониторингаИдентификаторЗадания); + ПараметрыОткрытия.Вставить("АдресРезультатаЗадания", Форма.ЦентрМониторингаАдресРезультатаЗадания); + МодульЦентрМониторингаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЦентрМониторингаКлиент"); + МодульЦентрМониторингаКлиент.ПоказатьНастройкиЦентраМониторинга(Форма, ПараметрыОткрытия); + КонецЕсли; + +КонецПроцедуры + +// Выполняет обработку события команды БСП ЦентрМониторингаОтправитьКонтактнуюИнформацию панели администрирования +// "Интернет-поддержка и сервисы" БСП и БИП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// Команда - КомандаФормы +// +Процедура ИнтернетПоддержкаИСервисыЦентрМониторингаОтправитьКонтактнуюИнформацию(Форма, Команда) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда + МодульЦентрМониторингаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЦентрМониторингаКлиент"); + МодульЦентрМониторингаКлиент.ПоказатьНастройкуОтправкиКонтактнойИнформации(Форма); + КонецЕсли; + +КонецПроцедуры + +// Выполняет обработку события команды БСП ОткрытьВнешниеКомпоненты панели администрирования "Интернет-поддержка и +// сервисы" БСП и БИП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// Команда - КомандаФормы +// +Процедура ИнтернетПоддержкаИСервисыОткрытьВнешниеКомпоненты(Форма, Команда) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда + МодульВнешниеКомпонентыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ВнешниеКомпонентыКлиент"); + МодульВнешниеКомпонентыКлиент.ПоказатьВнешниеКомпоненты(); + КонецЕсли; + +КонецПроцедуры + +// Выполняет обработку события команды БСП РезультатыОбновленияИДополнительнаяОбработкаДанных панели администрирования +// "Интернет-поддержка и сервисы" БСП и БИП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// Команда - КомандаФормы +// +Процедура ИнтернетПоддержкаИСервисыОткрытьИндикациюХодаОтложенногоОбновленияИБ(Форма, Команда) Экспорт + + ПараметрыФормы = Новый Структура("ОткрытиеИзПанелиАдминистрирования", Истина); + ОткрытьФорму( + "Обработка.РезультатыОбновленияПрограммы.Форма.РезультатыОбновленияПрограммы", + ПараметрыФормы); + +КонецПроцедуры + +// Выполняет обработку события команды БСП ПодключитьОтключитьОбсуждения панели администрирования "Интернет-поддержка и +// сервисы" БСП и БИП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// Команда - КомандаФормы +// +Процедура ИнтернетПоддержкаИСервисыПодключитьОтключитьОбсуждения(Форма, Команда) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда + + МодульОбсужденияСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбсужденияСлужебныйКлиент"); + + Если МодульОбсужденияСлужебныйКлиент.Подключены() Тогда + МодульОбсужденияСлужебныйКлиент.ПоказатьОтключение(); + Иначе + МодульОбсужденияСлужебныйКлиент.ПоказатьПодключение(); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Выполняет обработку события команды БСП ОбсужденияНастроитьИнтеграциюСВнешнимиСистемами панели администрирования +// "Интернет-поддержка и сервисы" БСП и БИП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// Команда - КомандаФормы +// +Процедура ИнтернетПоддержкаИСервисыПоказатьНастройкуИнтеграцииСВнешнимиСистемами(Форма, Команда) Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда + МодульОбсужденияСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбсужденияСлужебныйКлиент"); + МодульОбсужденияСлужебныйКлиент.ПоказатьНастройкуИнтеграцииСВнешнимиСистемами(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ИнтернетПоддержкаИСервисыПриИзмененииСостоянияПодключенияОбсуждений( + Форма, + ОбсужденияПодключены = Неопределено) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда + + Элементы = Форма.Элементы; + + Если ОбсужденияПодключены = Неопределено Тогда + МодульОбсужденияСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбсужденияСлужебныйКлиент"); + ОбсужденияПодключены = МодульОбсужденияСлужебныйКлиент.Подключены(); + Форма.ОбсужденияПодключены = ОбсужденияПодключены; + КонецЕсли; + + Если ОбсужденияПодключены Тогда + Элементы.ПодключитьОтключитьОбсуждения.Заголовок = НСтр("ru = 'Отключить'"); + Элементы.СостояниеПодключенияОбсуждений.Заголовок = НСтр("ru = 'Обсуждения подключены.'"); + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, + "ОбсужденияНастроитьИнтеграциюСВнешнимиСистемами", + "Доступность", + Истина); + Иначе + Элементы.ПодключитьОтключитьОбсуждения.Заголовок = НСтр("ru = 'Подключить'"); + Элементы.СостояниеПодключенияОбсуждений.Заголовок = НСтр("ru = 'Подключение обсуждений не выполнено.'"); + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, + "ОбсужденияНастроитьИнтеграциюСВнешнимиСистемами", + "Доступность", + Ложь); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Обновляет доступность элементов панели администрирования "Интернет-поддержка и сервисы" БСП и БИП. +// +// Параметры: +// Форма - см. Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы +// ИмяКонстанты - Строка - если заполнено, то выполняется обновление элементов связанных с командой. +// +Процедура ИнтернетПоддержкаИСервисыУстановитьДоступность(Форма, ИмяКонстанты = "") + + Если Не Форма.ЭтоАдминистраторСистемы Тогда + Возврат; + КонецЕсли; + + Элементы = Форма.Элементы; + + Если (ИмяКонстанты = "ИспользоватьСервисСклоненияMorpher" Или ИмяКонстанты = "") + И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда + + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( + Элементы, + "ГруппаНастройкаСклонения", + "Доступность", + Форма.ИспользоватьСервисСклоненияMorpher); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ВызовОнлайнПоддержкиКлиент/ВызовОнлайнПоддержкиКлиент.mdo b/SSL/src/CommonModules/НастройкиПрограммыКлиент/НастройкиПрограммыКлиент.mdo similarity index 59% rename from SSL/src/CommonModules/ВызовОнлайнПоддержкиКлиент/ВызовОнлайнПоддержкиКлиент.mdo rename to SSL/src/CommonModules/НастройкиПрограммыКлиент/НастройкиПрограммыКлиент.mdo index 4f339c6a7..d63e9c43d 100644 --- a/SSL/src/CommonModules/ВызовОнлайнПоддержкиКлиент/ВызовОнлайнПоддержкиКлиент.mdo +++ b/SSL/src/CommonModules/НастройкиПрограммыКлиент/НастройкиПрограммыКлиент.mdo @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c509683e-eb13-4e1a-91ed-cd6982ec5001"> - <name>ВызовОнлайнПоддержкиКлиент</name> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="99993a9b-97e9-4606-94fa-2da43a03c3b2"> + <name>НастройкиПрограммыКлиент</name> <synonym> <key>ru</key> - <value>Вызов онлайн-поддержки клиент</value> + <value>Настройки программы клиент</value> </synonym> <clientManagedApplication>true</clientManagedApplication> <clientOrdinaryApplication>true</clientOrdinaryApplication> diff --git a/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl index 0affa8146..d9b4554c3 100644 --- a/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl @@ -235,7 +235,7 @@ ТаблицаПКС.Колонки.Добавить("СвойствоКонфигурации", Новый ОписаниеТипов("Строка")); ТаблицаПКС.Колонки.Добавить("СвойствоФормата", Новый ОписаниеТипов("Строка")); - ТаблицаПКС.Колонки.Добавить("ПравилоКонвертацииСвойства", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(50))); + ТаблицаПКС.Колонки.Добавить("ПравилоКонвертацииСвойства", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(100))); ТаблицаПКС.Колонки.Добавить("ИспользуетсяАлгоритмКонвертации", Новый ОписаниеТипов("Булево")); ТаблицаПКС.Колонки.Добавить("ОбработкаКлючевогоСвойства", Новый ОписаниеТипов("Булево")); @@ -833,12 +833,14 @@ ЗначениеСвойства = Неопределено; СвойствоНайдено = Ложь; + ИмяСвойстваИсточника = ТранслироватьИмя(Свойство.Имя, "en", Источник); + Если ТипЗнч(Источник) = Тип("Структура") Тогда - СвойствоНайдено = Источник.Свойство(Свойство.Имя, ЗначениеСвойства); + СвойствоНайдено = Источник.Свойство(ИмяСвойстваИсточника, ЗначениеСвойства); ИначеЕсли ТипЗнч(Источник) = Тип("СтрокаТаблицыЗначений") - И Источник.Владелец().Колонки.Найти(Свойство.Имя) <> Неопределено Тогда + И Источник.Владелец().Колонки.Найти(ИмяСвойстваИсточника) <> Неопределено Тогда СвойствоНайдено = Истина; - ЗначениеСвойства = Источник[Свойство.Имя]; + ЗначениеСвойства = Источник[ИмяСвойстваИсточника]; КонецЕсли; Если ТипЗнч(ЗначениеСвойства) = Тип("Структура") Тогда @@ -858,9 +860,9 @@ ТипСвойства = "AdditionalInfo"; ИначеЕсли ЭтоТаблицаОбъекта(Свойство) Тогда ТипСвойства = "Таблица"; - ИначеЕсли Свойство.Имя = КлассКлючевыеСвойства() - Или СтрНайти(Свойство.Тип.Имя, КлассКлючевыеСвойства()) > 0 Тогда - ТипСвойства = КлассКлючевыеСвойства(); + ИначеЕсли Свойство.Имя = КлассКлючевыеСвойстваФормата() + Или СтрНайти(Свойство.Тип.Имя, КлассКлючевыеСвойстваФормата()) > 0 Тогда + ТипСвойства = КлассКлючевыеСвойстваФормата(); Иначе Если СвойствоНайдено Тогда Если ТипЗнч(ЗначениеСвойства) = Тип("Структура") @@ -917,7 +919,7 @@ КонецЕсли; ЗначениеXDTO = Неопределено; - Если ТипСвойства = КлассКлючевыеСвойства() Тогда + Если ТипСвойства = КлассКлючевыеСвойстваФормата() Тогда ЗначениеXDTO = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, ЗначениеСвойства, Свойство.Тип, СсылкиИзОбъекта, , Расширения); ИначеЕсли ТипСвойства = "ОбычноеСвойство" Тогда @@ -965,13 +967,10 @@ ЕстьРасширенияXDTO = Ложь; КонецЕсли; - + ЗначениеXDTO = ФабрикаXDTO.Создать(Свойство.Тип); - ТипТаблицы = Свойство.Тип.Свойства[0].Тип; - ИмяСвойстваСтроки = Свойство.Тип.Свойства[0].Имя; - СписокXDTO = ЗначениеXDTO[ИмяСвойстваСтроки]; // СписокXDTO Для Каждого ИсточникСтрока Из ЗначениеСвойства Цикл @@ -2183,7 +2182,7 @@ Если КомпонентыОбмена.ОбменДаннымиСВнешнейСистемой Тогда ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(КомпонентыОбмена.УзелКорреспондента); Иначе - ИмяПланаОбмена = ПодтверждениеXDTO.ExchangePlan; + ИмяПланаОбмена = ТранслироватьИмя(ПодтверждениеXDTO.ExchangePlan, "en"); Если Метаданные.ПланыОбмена.Найти(ИмяПланаОбмена) = Неопределено Тогда ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 177); @@ -2318,6 +2317,8 @@ КомпонентыОбмена.ПрефиксКорреспондента = ЗаголовокСообщенияXDTO.Prefix; КонецЕсли; + ОбменДаннымиКонтрольЗацикливания.ЗагрузитьКонтурИзСообщения(КомпонентыОбмена, ЗаголовокСообщенияXDTO); + // Проверяем поддержку кодировки по УИДам в корреспонденте. КомпонентыОбмена.Вставить("КорреспондентПоддерживаетИдентификаторОбменаДанными", ВерсияПоддерживается(КомпонентыОбмена.НастройкиXDTOКорреспондента.ПоддерживаемыеВерсии, НомерВерсииСПоддержкойИдентификатораОбменаДанными())); @@ -2383,15 +2384,17 @@ КлючевыеСвойстваКопия = Неопределено; СсылкаКопия = Неопределено; - Если Приемник.Свойство(КлассКлючевыеСвойства(), КлючевыеСвойстваКопия) + Если Приемник.Свойство(КлассКлючевыеСвойстваФормата(), КлючевыеСвойстваКопия) И ТипЗнч(КлючевыеСвойстваКопия) = Тип("Структура") - И КлючевыеСвойстваКопия.Свойство(КлассСсылка(), СсылкаКопия) + И КлючевыеСвойстваКопия.Свойство(КлассСсылкаФормата(), СсылкаКопия) Тогда - Приемник.Вставить(КлассСсылка(), СсылкаКопия); + Приемник.Вставить(КлассСсылкаФормата(), СсылкаКопия); КонецЕсли; + Приемник = ТранслироватьСтруктуру(Приемник, "en"); + Возврат Приемник; КонецФункции @@ -2849,6 +2852,17 @@ // Функция КлассКлючевыеСвойства() Экспорт + Возврат "КлючевыеСвойства"; + +КонецФункции + +// Возвращает имя свойства, которое содержит ключевые свойства объекта пакета XDTO +// +// Возвращаемое значение: +// Строка - "КлючевыеСвойства". +// +Функция КлассКлючевыеСвойстваФормата() Экспорт + Возврат "КлючевыеСвойства"; // @Non-NLS КонецФункции @@ -2974,7 +2988,7 @@ КонецЕсли; ПодтверждениеXDTO = ЗаголовокСообщенияXDTO.Confirmation; - ИмяПланаОбмена = ПодтверждениеXDTO.ExchangePlan; + ИмяПланаОбмена = ТранслироватьИмя(ПодтверждениеXDTO.ExchangePlan, "en"); Если Метаданные.ПланыОбмена.Найти(ИмяПланаОбмена) = Неопределено Тогда Возврат Ложь; @@ -3382,7 +3396,7 @@ КонецЕсли; - КлючевыеСвойства = ТипXDTO.Свойства.Получить(КлассКлючевыеСвойства()); + КлючевыеСвойства = ТипXDTO.Свойства.Получить(КлассКлючевыеСвойстваФормата()); Если КлючевыеСвойства <> Неопределено Тогда ТипКлючевыхСвойствОбъектаXDTO = КлючевыеСвойства.Тип; @@ -3555,27 +3569,21 @@ ЕстьРасширения = ПравилоКонвертации.Расширения.Количество() > 0; Если ЗначениеЗаполнено(ПравилоКонвертации.ОбъектФормата) Тогда - ПравилоКонвертации.ТипXDTO = ФабрикаXDTO.Тип(ПространствоИмен, ПравилоКонвертации.ОбъектФормата); + Если ПравилоКонвертации.ТипXDTO = Неопределено И ЕстьРасширения Тогда - ТипXDTOПравилаКонвертацииИзРасширенийПакетаXDTO(ПравилоКонвертации); - КонецЕсли; Если ПравилоКонвертации.ТипXDTO = Неопределено Тогда - ПравилаКонвертации.Удалить(ПравилоКонвертации); Продолжить; - КонецЕсли; КонецЕсли; Если ЭтоБазоваяСхема И ЕстьРасширения Тогда - УдалитьИзбыточныеРасширенияПравилаКонвертации(ПравилоКонвертации); - КонецЕсли; Если КомпонентыОбмена.НаправлениеОбмена = "Получение" Тогда @@ -3670,7 +3678,7 @@ Или ПравилоКонвертации.ЭтоПланВидовРасчета; Если ЗначениеЗаполнено(ПравилоКонвертации.ОбъектФормата) Тогда - КлючевыеСвойства = ПравилоКонвертации.ТипXDTO.Свойства.Получить(КлассКлючевыеСвойства()); + КлючевыеСвойства = ПравилоКонвертации.ТипXDTO.Свойства.Получить(КлассКлючевыеСвойстваФормата()); Если КлючевыеСвойства <> Неопределено Тогда ТипКлючевыхСвойствОбъектаXDTO = КлючевыеСвойства.Тип; @@ -3683,11 +3691,13 @@ ТаблицаПКС = ПравилоКонвертации.Свойства; Для Каждого ПКС Из ТаблицаПКС Цикл + + СвойствоФормата = ТранслироватьИмя(ПКС.СвойствоФормата, "ru", ПравилоКонвертации.ТипXDTO); - Если СвойстваКлючевыхСвойств.Найти(ПКС.СвойствоФормата) <> Неопределено Тогда + Если СвойстваКлючевыхСвойств.Найти(СвойствоФормата) <> Неопределено Тогда ПКС.ОбработкаКлючевогоСвойства = Истина; - Если ПравилоКонвертации.ТипXDTO.Свойства.Получить(ПКС.СвойствоФормата) <> Неопределено Тогда + Если ПравилоКонвертации.ТипXDTO.Свойства.Получить(СвойствоФормата) <> Неопределено Тогда ПКСДляДобавления.Добавить(ПКС); КонецЕсли; КонецЕсли; @@ -3699,7 +3709,7 @@ ЗаполнитьЗначенияСвойств(НовоеПКС, ПКС, , "ОбработкаКлючевогоСвойства"); КонецЦикла; - СвойствоСсылкаXDTO = ТипКлючевыхСвойствОбъектаXDTO.Свойства.Получить(КлассСсылка()); + СвойствоСсылкаXDTO = ТипКлючевыхСвойствОбъектаXDTO.Свойства.Получить(КлассСсылкаФормата()); Если СвойствоСсылкаXDTO <> Неопределено Тогда ПравилоКонвертации.ТипСсылкиXDTO = СвойствоСсылкаXDTO.Тип; @@ -3707,7 +3717,7 @@ Если ПравилоКонвертации.ЭтоСсылочныйТип И КомпонентыОбмена.НаправлениеОбмена = "Отправка" Тогда ПКСДляСсылки = ТаблицаПКС.Добавить(); - ПКСДляСсылки.СвойствоКонфигурации = "Ссылка"; + ПКСДляСсылки.СвойствоКонфигурации = КлассСсылка(); ПКСДляСсылки.СвойствоФормата = КлассСсылка(); ПКСДляСсылки.ОбработкаКлючевогоСвойства = Истина; КонецЕсли; @@ -3718,7 +3728,7 @@ Если ЭтоБазоваяСхема И ЕстьРасширения Тогда Для Каждого Расширение Из ПравилоКонвертации.Расширения Цикл - КлючевыеСвойства = Расширение.Значение.ТипXDTO.Свойства.Получить(КлассКлючевыеСвойства()); + КлючевыеСвойства = Расширение.Значение.ТипXDTO.Свойства.Получить(КлассКлючевыеСвойстваФормата()); Если КлючевыеСвойства <> Неопределено Тогда @@ -3848,6 +3858,8 @@ ПравилаКонвертации.Колонки.Добавить("ИмяПКПД", Новый ОписаниеТипов("Строка")); КомпонентыОбмена.МенеджерОбмена.ЗаполнитьПравилаКонвертацииПредопределенныхДанных(КомпонентыОбмена.НаправлениеОбмена, ПравилаКонвертации); + + ТранслироватьПредопределенныеданные(ПравилаКонвертации); Для Каждого ПравилоКонвертации Из ПравилаКонвертации Цикл ПравилоКонвертации.ТипXDTO = ФабрикаXDTO.Тип(XMLСхема, ПравилоКонвертации.ТипXDTO); @@ -3916,10 +3928,11 @@ Для каждого ОписаниеРасширения Из КомпонентыОбмена.РасширенияФормата Цикл ПространствоИменРасширения = ОписаниеРасширения.Ключ; - ТипXDTO = ФабрикаXDTO.Тип(ПространствоИменРасширения, ПОД.ОбъектВыборкиФормат); - Если ТипXDTO <> Неопределено Тогда + ТипРасширенияXDTO = ФабрикаXDTO.Тип(ПространствоИменРасширения, ПОД.ОбъектВыборкиФормат); + Если ТипРасширенияXDTO <> Неопределено Тогда // Установили пренадлежность к расширению схемы XDTO + ТипXDTO = ТипРасширенияXDTO; Прервать; КонецЕсли; @@ -3972,6 +3985,7 @@ КонецЦикла; КонецПроцедуры +// АПК:299-вкл #КонецОбласти @@ -4273,8 +4287,10 @@ Функция КонвертироватьПеречислениеВXDTO(КомпонентыОбмена, ЗначениеПеречисления, ТипПеречисленияXDTO) Если ТипЗнч(ЗначениеПеречисления) = Тип("Строка") Тогда - - ЗначениеXDTO = ФабрикаXDTO.Создать(ТипПеречисленияXDTO, ЗначениеПеречисления); + + ЗначениеПеречисленияФормата = ТранслироватьПеречисление(ЗначениеПеречисления, "ru", ТипПеречисленияXDTO); + + ЗначениеXDTO = ФабрикаXDTO.Создать(ТипПеречисленияXDTO, ЗначениеПеречисленияФормата); Иначе @@ -4477,7 +4493,7 @@ КонецЦикла; Если НоваяТЧПриемника.Колонки.Количество() > 0 Тогда - + НоваяТЧПриемника.Колонки.Добавить("Расширения"); КонецЕсли; @@ -4661,7 +4677,8 @@ ВыгрузитьПоддерживаемыеОбъектыФормата(ЗаголовокСообщенияXDTO, ПараметрыЗаголовка.ПоддерживаемыеОбъекты, ПараметрыЗаголовка.УзелКорреспондента); Иначе - ПодтверждениеXDTO.ExchangePlan = ПараметрыЗаголовка.ИмяПланаОбмена; + ИмяПланаОбмена = ТранслироватьИмя(ПараметрыЗаголовка.ИмяПланаОбмена, "ru"); + ПодтверждениеXDTO.ExchangePlan = ИмяПланаОбмена; ПодтверждениеXDTO.To = ПараметрыЗаголовка.ИдентификаторПолучателя; Если ЗначениеЗаполнено(ПараметрыЗаголовка.ПсевдонимПредопределенногоУзла) Тогда @@ -4690,6 +4707,9 @@ ПараметрыЗаголовка.ПоддерживаемыеОбъекты, ПараметрыЗаголовка.УзелКорреспондента); ЗаголовокСообщенияXDTO.Prefix = ПараметрыЗаголовка.Префикс; + + ОбменДаннымиКонтрольЗацикливания.ВыгрузитьКонтурВСообщение(ЗаголовокСообщенияXDTO, ПараметрыЗаголовка.ИмяПланаОбмена); + КонецЕсли; Иначе @@ -4907,7 +4927,7 @@ КонвертироватьТаблицуОбъекта(Приемник, КомпонентыОбмена, ИмяСвойства, Свойство, ТипЗначенияXDTO, ЗначениеXDTO); - ИначеЕсли КлассЗначенияXDTO = КлассКлючевыеСвойства() Тогда + ИначеЕсли КлассЗначенияXDTO = КлассКлючевыеСвойстваФормата() Тогда КонвертироватьКлючевоеСвойство(Приемник, КомпонентыОбмена, ИмяСвойства, ТипЗначенияXDTO, ЗначениеXDTO); @@ -4963,11 +4983,17 @@ ТипСвойства = ?(ТипСвойства = Неопределено, ЗначениеXDTO.Тип(), ТипСвойства); СтруктураXDTO = Новый Структура; - СтруктураXDTO.Вставить("ЭтоСсылка", СложныйТип = КлассСсылка()); + СтруктураXDTO.Вставить("ЭтоСсылка", СложныйТип = "Ссылка"); СтруктураXDTO.Вставить("ЭтоПеречисление", СложныйТип = "Перечисление"); СтруктураXDTO.Вставить("ТипЗначенияXDTO", ТипСвойства); - СтруктураXDTO.Вставить("Значение", ЗначениеXDTO.Значение); - + + Если СложныйТип = "Перечисление" Тогда + Значение = ТранслироватьИмя(ЗначениеXDTO.Значение, "en"); + СтруктураXDTO.Вставить("Значение", Значение); + Иначе + СтруктураXDTO.Вставить("Значение", ЗначениеXDTO.Значение); + КонецЕсли;; + Возврат СтруктураXDTO; КонецФункции @@ -5058,6 +5084,8 @@ Возврат КлассТаблицаОбъекта(); ИначеЕсли СтрНайти(ТипЗначенияXDTO.Имя, КлассКлючевыеСвойства()) > 0 Тогда Возврат КлассКлючевыеСвойства(); + ИначеЕсли СтрНайти(ТипЗначенияXDTO.Имя, КлассКлючевыеСвойстваФормата()) > 0 Тогда + Возврат КлассКлючевыеСвойстваФормата(); ИначеЕсли СтрНайти(ТипЗначенияXDTO.Имя, КлассОбщиеСвойства()) > 0 Тогда Возврат КлассОбщиеСвойства(); КонецЕсли; @@ -5102,10 +5130,10 @@ ТабличнаяЧастьXDTO = ЗначениеXDTO.Строка; Если ТипЗнч(ТабличнаяЧастьXDTO) <> Тип("СписокXDTO") Тогда - МассивОбъектоXDTO = Новый Массив(1); - МассивОбъектоXDTO[0] = ТабличнаяЧастьXDTO; + МассивОбъектовXDTO = Новый Массив(1); + МассивОбъектовXDTO[0] = ТабличнаяЧастьXDTO; - ТабличнаяЧастьXDTO = МассивОбъектоXDTO; + ТабличнаяЧастьXDTO = МассивОбъектовXDTO; КонецЕсли; @@ -5186,7 +5214,7 @@ Процедура КонвертироватьКлючевоеСвойство(Приемник, Знач КомпонентыОбмена, Знач ИмяСвойства, Знач ТипЗначенияXDTO, Знач ЗначениеXDTO) Значение = Новый Структура("ЭтоНаборКлючевыхСвойств"); - Значение.Вставить("ТипЗначения", СтрЗаменить(ТипЗначенияXDTO.Имя, КлассКлючевыеСвойства(), "")); + Значение.Вставить("ТипЗначения", СтрЗаменить(ТипЗначенияXDTO.Имя, КлассКлючевыеСвойстваФормата(), "")); Для Каждого КлючевоеСвойство Из ЗначениеXDTO.Свойства() Цикл ОписаниеСвойства = ТипЗначенияXDTO.Свойства.Получить(КлючевоеСвойство.Имя); @@ -5256,6 +5284,12 @@ Функция КлассСсылка() + Возврат "Ссылка"; + +КонецФункции + +Функция КлассСсылкаФормата() + Возврат "Ссылка"; // @Non-NLS КонецФункции @@ -6047,17 +6081,13 @@ Для Каждого ПодчиненноеПолеИзРасширения Из ПолеИзРасширения.Тип.Свойства Цикл КолонкаТаблицыПоПолюИзРасширения(ТаблицаОбъекта, ПодчиненноеПолеИзРасширения.Имя); - - КонецЦикла; Иначе КолонкаТаблицыПоПолюИзРасширения(ТаблицаОбъекта, ПолеИзРасширения.Имя); - - КонецЕсли; КонецЦикла; @@ -6108,9 +6138,9 @@ // Если не смогли получить тип объекта по пространству имен, // то переходим к чтению след порции данных xml. // Такое может произойти, если объект был выгружен в URI, - // которое отсутствует в приемнике, например, - // объект в источнике добавлен расширением пакета XDTO и - // это расширение отсутствует в приемнике. + // который отсутствует в приемнике, например, + // объект в источнике добавлен расширением, + // а в приемнике есть одноименный объект в рамках базового пакета XDTO. Продолжить; ИначеЕсли ТипОбъектаXDTO.Имя = "УдалениеОбъекта" Тогда @@ -8285,4 +8315,153 @@ #КонецОбласти +#Область ТрансляцияФормата + +Функция ТранслироватьИмя(ИсхдноеИмя, НаправлениеПеревода, ДоступныеИмена = Неопределено) + + Если Метаданные.ВариантВстроенногоЯзыка = Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Русский Тогда + Возврат ИсхдноеИмя; + КонецЕсли; + + НовоеИмя = ОбменДаннымиТрансляцияФорматаПовтИсп.ТранслироватьИмя(ИсхдноеИмя, НаправлениеПеревода); + + Если ТипЗнч(НовоеИмя) = Тип("Строка") Тогда + + Возврат НовоеИмя; + + ИначеЕсли ДоступныеИмена <> Неопределено Тогда + + МассивДоступныхИмен = Новый Массив; + + Если ТипЗнч(ДоступныеИмена) = Тип("Структура") Тогда + Для Каждого КлючИЗначение Из ДоступныеИмена Цикл + МассивДоступныхИмен.Добавить(КлючИЗначение.Ключ); + КонецЦикла; + ИначеЕсли ТипЗнч(ДоступныеИмена) = Тип("ТипОбъектаXDTO") Тогда + Для Каждого Свойство Из ДоступныеИмена.Свойства Цикл + МассивДоступныхИмен.Добавить(Свойство.Имя); + КонецЦикла; + КонецЕсли; + + Для Каждого Имя Из НовоеИмя Цикл + Если МассивДоступныхИмен.Найти(Имя) <> Неопределено Тогда + Возврат Имя; + КонецЕсли; + КонецЦикла; + + Иначе + + Возврат НовоеИмя[0]; + + КонецЕсли; + +КонецФункции + +Функция ТранслироватьПеречисление(Имя, НаправлениеПеревода, ТипXDTO) + + Если Метаданные.ВариантВстроенногоЯзыка = Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Русский Тогда + Возврат Имя; + КонецЕсли; + + НовоеИмя = ОбменДаннымиТрансляцияФорматаПовтИсп.ТранслироватьИмя(Имя, НаправлениеПеревода); + + Если ТипЗнч(НовоеИмя) = Тип("Строка") Тогда + + Возврат НовоеИмя; + + Иначе + + Для Каждого Фасет Из ТипXDTO.Фасеты Цикл + Если НовоеИмя.Найти(Фасет.Значение) <> Неопределено Тогда + Возврат Фасет.Значение; + Прервать; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + +КонецФункции + +Функция ТранслироватьСтруктуру(Источник, НаправлениеПеревода) + + Если Метаданные.ВариантВстроенногоЯзыка = Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Русский Тогда + Возврат Источник; + КонецЕсли; + + Если ТипЗнч(Источник) = Тип("Структура") Тогда + + Результат = Новый Структура; + + Для Каждого КлючИЗначение Из Источник Цикл + Ключ = ТранслироватьИмя(КлючИЗначение.Ключ, НаправлениеПеревода); + Результат.Вставить(Ключ, ТранслироватьСтруктуру(КлючИЗначение.Значение, НаправлениеПеревода)); + КонецЦикла; + + Возврат Результат; + + ИначеЕсли ТипЗнч(Источник) = Тип("Массив") Тогда + + Результат = Новый Массив; + + Для Каждого ЭлМассива Из Источник Цикл + Результат.Добавить(ТранслироватьСтруктуру(ЭлМассива, НаправлениеПеревода)); + КонецЦикла; + + Возврат Результат; + + ИначеЕсли ТипЗнч(Источник) = Тип("ТаблицаЗначений") Тогда + + Результат = Источник.Скопировать(); + + ПерваяКолонка = Истина; + + Для Каждого Колонка Из Результат.Колонки Цикл + + Колонка.Имя = ТранслироватьИмя(Колонка.Имя, НаправлениеПеревода); + + Для Каждого Строка Из Результат Цикл + Строка[Колонка.Имя] = ТранслироватьСтруктуру(Строка[Колонка.Имя], НаправлениеПеревода); + КонецЦикла; + + КонецЦикла; + + Возврат Результат; + + Иначе + + Возврат Источник; + + КонецЕсли; + +КонецФункции + +Процедура ТранслироватьПредопределенныеДанные(ПравилаКонвертации) + + Если Метаданные.ВариантВстроенногоЯзыка = Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Русский Тогда + Возврат; + КонецЕсли; + + Для Каждого Строка Из ПравилаКонвертации Цикл + + Если ЗначениеЗаполнено(Строка.КонвертацииЗначенийПриОтправке) Тогда + + ЗначенийПриОтправке = Новый Соответствие; + + Для Каждого КлючИЗначение Из Строка.КонвертацииЗначенийПриОтправке Цикл + ЗначенийПриОтправке.Вставить(КлючИЗначение.Ключ, ТранслироватьИмя(КлючИЗначение.Значение, "ru")); + КонецЦикла; + + Строка.КонвертацииЗначенийПриОтправке = ЗначенийПриОтправке; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + + #КонецОбласти + +#КонецОбласти + + diff --git a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервиса/Module.bsl index 895aebbc8..1daf5c752 100644 --- a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервиса/Module.bsl @@ -96,7 +96,11 @@ СоответствиеИменПсевдонимам.Вставить("ОбменДаннымиВМоделиСервиса.ВыполнитьОбменДанными"); СоответствиеИменПсевдонимам.Вставить("ОбменДаннымиВМоделиСервиса.ВыполнитьДействиеСценарияОбменаДаннымиВПервойИнформационнойБазе"); СоответствиеИменПсевдонимам.Вставить("ОбменДаннымиВМоделиСервиса.ВыполнитьДействиеСценарияОбменаДаннымиВоВторойИнформационнойБазе"); - + СоответствиеИменПсевдонимам.Вставить("ОбменДаннымиВнутренняяПубликация.ВыполнитьОбменДаннымиПоСценарию"); + СоответствиеИменПсевдонимам.Вставить("ОбменДаннымиВнутренняяПубликация.ВыполнитьОчередьЗадач"); + СоответствиеИменПсевдонимам.Вставить("ОбменДаннымиВнутренняяПубликация.ВыполнитьВыгрузкуДляУзлаИнформационнойБазыВСервисПередачиФайлов"); + СоответствиеИменПсевдонимам.Вставить("ОбменДаннымиВнутренняяПубликация.ВыполнитьЗагрузкуДляУзлаИнформационнойБазыИзСервисаПередачиФайлов"); + КонецПроцедуры // Формирует список параметров ИБ. @@ -201,14 +205,21 @@ Типы.Добавить(Метаданные.Константы.НастройкиПодчиненногоУзлаРИБ); Типы.Добавить(Метаданные.Константы.ПрефиксПоследнегоАвтономногоРабочегоМеста); - Типы.Добавить(Метаданные.Справочники.СценарииОбменовДанными); + МодульВыгрузкаЗагрузкаДанных = ОбщегоНазначения.ОбщийМодуль("ВыгрузкаЗагрузкаДанных"); + МодульВыгрузкаЗагрузкаДанных.ДополнитьТипомИсключаемымИзВыгрузкиЗагрузки(Типы, + Метаданные.Справочники.СценарииОбменовДанными, МодульВыгрузкаЗагрузкаДанных.ДействиеСоСсылкамиНеВыгружатьОбъект()); + Типы.Добавить(Метаданные.РегистрыСведений.АрхивСообщенийОбменов); Типы.Добавить(Метаданные.РегистрыСведений.ДанныеОбъектовДляРегистрацииВОбменах); + Типы.Добавить(Метаданные.РегистрыСведений.ЗадачиОбменаДаннымиВнутренняяПубликация); Типы.Добавить(Метаданные.РегистрыСведений.ИзмененияОбщихДанныхУзлов); + Типы.Добавить(Метаданные.РегистрыСведений.КонтурСинхронизации); + Типы.Добавить(Метаданные.РегистрыСведений.НастройкиАрхиваСообщенийОбменов); Типы.Добавить(Метаданные.РегистрыСведений.НастройкиОбменаДаннымиXDTO); Типы.Добавить(Метаданные.РегистрыСведений.НастройкиТранспортаОбменаДанными); Типы.Добавить(Метаданные.РегистрыСведений.НастройкиТранспортаОбменаОбластиДанных); Типы.Добавить(Метаданные.РегистрыСведений.ОбработчикиСобытийСинхронизацииДанных); + Типы.Добавить(Метаданные.РегистрыСведений.ОбъектыНезарегистрированныеПриЗацикливании); Типы.Добавить(Метаданные.РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз); Типы.Добавить(Метаданные.РегистрыСведений.ПсевдонимыПредопределенныхУзлов); Типы.Добавить(Метаданные.РегистрыСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов); @@ -420,6 +431,35 @@ #КонецОбласти +// Проверяет возможность записи неразделенных данных в Автономном рабочем месте. +// Объект нельзя записать в Автономном рабочем месте, если он одновременно соответствует следующим условиям: +// 1. Это автономное рабочее место. +// 2. Это неразделенный объект метаданных. +// 3. Этот объект входит в состав плана обмена автономной работы. +// 4. Не входит в список исключений. +// +// Параметры: +// Объект - Произвольный - объект-источник данных +// Отказ - Булево - флаг отказа +// +Процедура ПередЗаписьюОбщихДанных(Объект, Отказ) Экспорт + + Если Объект.ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + ТолькоПросмотр = Ложь; + АвтономнаяРаботаСлужебный.ОпределитьВозможностьИзмененияДанных(Объект.Метаданные(), ТолькоПросмотр); + + Если ТолькоПросмотр Тогда + СтрокаОшибки = НСтр("ru = 'Изменение неразделенных данных (%1), загружаемых из приложения, в Автономном рабочем месте запрещено. + |Обратитесь к администратору.'"); + СтрокаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаОшибки, Строка(Объект)); + ВызватьИсключение СтрокаОшибки; + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -2122,7 +2162,9 @@ Строка(Сообщение.Body.SessionId), Представление, Сообщение.Body.ErrorDescription); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииСессииОбменаСообщениямиСистемы(), УровеньЖурналаРегистрации.Ошибка,,, СтрокаСообщения); - РегистрыСведений.СессииОбменаСообщениямиСистемы.ЗафиксироватьНеуспешноеВыполнениеСессии(Сообщение.Body.SessionId); + + РегистрыСведений.СессииОбменаСообщениямиСистемы.ЗафиксироватьНеуспешноеВыполнениеСессии( + Сообщение.Body.SessionId, Сообщение.Body.ErrorDescription); КонецПроцедуры @@ -2554,24 +2596,6 @@ Возврат ПараметрыПриЗавершении; КонецФункции -Процедура ПередЗаписьюОбщихДанных(Объект, Отказ) - - Если Объект.ОбменДанными.Загрузка Тогда - Возврат; - КонецЕсли; - - ТолькоПросмотр = Ложь; - АвтономнаяРаботаСлужебный.ОпределитьВозможностьИзмененияДанных(Объект.Метаданные(), ТолькоПросмотр); - - Если ТолькоПросмотр Тогда - СтрокаОшибки = НСтр("ru = 'Изменение неразделенных данных (%1), загружаемых из приложения, в Автономном рабочем месте запрещено. - |Обратитесь к администратору.'"); - СтрокаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаОшибки, Строка(Объект)); - ВызватьИсключение СтрокаОшибки; - КонецЕсли; - -КонецПроцедуры - // Добавляет параметры работы клиентской логики для подсистемы обмена данными в модели сервиса. // Процедура ДобавитьПараметрыРаботыКлиента(Параметры) @@ -2603,54 +2627,6 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Подписки на события для Автономного рабочего места - -// Проверяет возможность записи неразделенных данных в Автономном рабочем месте. -// Подробное описание см. в АвтономнаяРаботаСлужебный.ОпределитьВозможностьИзмененияДанных. -// -Процедура АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанных(Источник, Отказ) Экспорт - - ПередЗаписьюОбщихДанных(Источник, Отказ); - -КонецПроцедуры - -// Проверяет возможность записи неразделенных данных в Автономном рабочем месте. -// Подробное описание см. в АвтономнаяРаботаСлужебный.ОпределитьВозможностьИзмененияДанных. -// -Процедура АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхДокумент(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт - - ПередЗаписьюОбщихДанных(Источник, Отказ); - -КонецПроцедуры - -// Проверяет возможность записи неразделенных данных в Автономном рабочем месте. -// Подробное описание см. в АвтономнаяРаботаСлужебный.ОпределитьВозможностьИзмененияДанных. -// -Процедура АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхКонстанта(Источник, Отказ) Экспорт - - ПередЗаписьюОбщихДанных(Источник, Отказ); - -КонецПроцедуры - -// Проверяет возможность записи неразделенных данных в Автономном рабочем месте. -// Подробное описание см. в АвтономнаяРаботаСлужебный.ОпределитьВозможностьИзмененияДанных. -// -Процедура АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписей(Источник, Отказ, Замещение) Экспорт - - ПередЗаписьюОбщихДанных(Источник, Отказ); - -КонецПроцедуры - -// Проверяет возможность записи неразделенных данных в Автономном рабочем месте. -// Подробное описание см. в АвтономнаяРаботаСлужебный.ОпределитьВозможностьИзмененияДанных. -// -Процедура АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписейРасчета(Источник, Отказ, Замещение, ТолькоЗапись, ЗаписьФактическогоПериодаДействия, ЗаписьПерерасчетов) Экспорт - - ПередЗаписьюОбщихДанных(Источник, Отказ); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Получение ссылок на общие страницы информации сервиса diff --git a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаКлиент/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаКлиент/Module.bsl index 4b3de541c..c83a8af6f 100644 --- a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаКлиент/Module.bsl @@ -15,12 +15,12 @@ // Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); - - Если ПараметрыРаботыКлиента.РазделениеВключено Тогда + Если ОбщегоНазначенияКлиент.РазделениеВключено() Тогда Возврат; КонецЕсли; + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); + Если ПараметрыРаботыКлиента.ЭтоАвтономноеРабочееМесто Тогда ИмяПараметра = "СтандартныеПодсистемы.ПредлагатьСинхронизироватьДанныеСПриложениемВИнтернетеПриЗавершенииСеанса"; Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда diff --git a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаПовтИсп/Module.bsl index 5207f38e9..bef0f9426 100644 --- a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаПовтИсп/Module.bsl @@ -70,7 +70,7 @@ СтруктураНастроек.Вставить("WSURLПространстваИменСервиса", "http://www.1c.ru/SaaS/1.0/WS/ManageApplicationExchange_1_0_6_5"); СтруктураНастроек.Вставить("WSТаймаут", 20); - Результат = ОбменДаннымиСервер.ПолучитьWSПроксиПоПараметрамПодключения(СтруктураНастроек); + Результат = ОбменДаннымиВебСервис.ПолучитьWSПроксиПоПараметрамПодключения(СтруктураНастроек); КонецЕсли; Если Результат = Неопределено Тогда @@ -96,7 +96,7 @@ СтруктураНастроек.Вставить("WSURLПространстваИменСервиса", "http://www.1c.ru/SaaS/1.0/WS/RemoteAdministrationOfExchange"); СтруктураНастроек.Вставить("WSТаймаут", 20); - Возврат ОбменДаннымиСервер.ПолучитьWSПроксиПоПараметрамПодключения(СтруктураНастроек, СтрокаСообщенияОбОшибке); + Возврат ОбменДаннымиВебСервис.ПолучитьWSПроксиПоПараметрамПодключения(СтруктураНастроек, СтрокаСообщенияОбОшибке); КонецФункции diff --git a/SSL/src/CommonModules/ОбменДаннымиВебСервис/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВебСервис/Module.bsl new file mode 100644 index 000000000..c30dd80a5 --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиВебСервис/Module.bsl @@ -0,0 +1,1609 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// Получает сообщение обмена из информационной базы корреспондента через веб-сервис во временный каталог пользователя +// ОС. +// +// Параметры: +// Отказ - Булево - флаг отказа; поднимается в случае возникновения ошибки. +// УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого выполняется получение сообщения обмена. +// ИдентификаторФайла - УникальныйИдентификатор - идентификатор файла. +// ДлительнаяОперация - Булево - признак использования длительное операции. +// ИдентификаторОперации - УникальныйИдентификатор - уникальный идентификатор длительной операции. +// ПараметрыАутентификации - Структура - содержит параметры аутентификации на веб-сервисе (Пользователь, Пароль). +// +// Возвращаемое значение: +// Структура со следующими ключи: +// * ИмяВременногоКаталогаСообщенийОбмена - полное имя каталога обмена, в которое было загружено сообщение обмена. +// * ИмяФайлаСообщенияОбмена - полное имя файла сообщения обмена. +// * ИдентификаторФайлаПакетаДанных - дата изменения файла сообщения обмена. +// +Функция ПолучитьСообщениеОбменаВоВременныйКаталогИзИнформационнойБазыКорреспондентаЧерезВебСервис( + Отказ, + УзелИнформационнойБазы, + ИдентификаторФайла, + ДлительнаяОперация, + ИдентификаторОперации, + ПараметрыАутентификации = Неопределено) Экспорт + + ОбменДаннымиСервер.ПроверитьВозможностьВыполненияОбменов(); + + ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными(); + + УстановитьПривилегированныйРежим(Истина); + + // Возвращаемое значение функции. + Результат = Новый Структура; + Результат.Вставить("ИмяВременногоКаталогаСообщенийОбмена", ""); + Результат.Вставить("ИмяФайлаСообщенияОбмена", ""); + Результат.Вставить("ИдентификаторФайлаПакетаДанных", Неопределено); + + // Параметры, которые будут определены в функции. + ИмяКаталогаСообщенияОбмена = ""; + ИмяФайлаСообщенияОбмена = ""; + ДатаФайлаСообщенияОбмена = Дата('00010101'); + + СтруктураНастроекОбмена = ОбменДаннымиСервер.НастройкиОбменаДляУзлаИнформационнойБазы( + УзелИнформационнойБазы, "ПолучениеСообщенияОбмена", Перечисления.ВидыТранспортаСообщенийОбмена.WS, Ложь); + + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = + ОбменДаннымиСервер.КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + СтруктураНастроекОбмена.ДействиеПриОбмене = Неопределено; + + ПараметрыПрокси = Новый Структура; + ПараметрыПрокси.Вставить("ПараметрыАутентификации", ПараметрыАутентификации); + + Прокси = Неопределено; + СостояниеНастройки = Неопределено; + СообщениеОбОшибке = ""; + ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, + СтруктураНастроекОбмена, ПараметрыПрокси, Отказ, СостояниеНастройки, СообщениеОбОшибке); + + Если Отказ Тогда + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СообщениеОбОшибке, СтруктураНастроекОбмена, Истина); + Возврат Результат; + КонецЕсли; + + ПараметрыОбмена = Новый Структура; + ПараметрыОбмена.Вставить("ИдентификаторФайла", ИдентификаторФайла); + ПараметрыОбмена.Вставить("ДлительнаяОперация", ДлительнаяОперация); + ПараметрыОбмена.Вставить("ИдентификаторОперации", ИдентификаторОперации); + ПараметрыОбмена.Вставить("ДлительнаяОперацияРазрешена", Истина); + + Попытка + + ВыполнитьВыгрузкуДанных(Прокси, ПараметрыПрокси.ТекущаяВерсия, СтруктураНастроекОбмена, ПараметрыОбмена); + + ИдентификаторФайла = ПараметрыОбмена.ИдентификаторФайла; + ДлительнаяОперация = ПараметрыОбмена.ДлительнаяОперация; + ИдентификаторОперации = ПараметрыОбмена.ИдентификаторОперации; + + Исключение + + Отказ = Истина; + Сообщение = НСтр("ru = 'При выгрузке данных возникли ошибки во второй информационной базе: %1'", ОбщегоНазначения.КодОсновногоЯзыка()); + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Истина); + + Возврат Результат; + КонецПопытки; + + Если ПараметрыОбмена.ДлительнаяОперация Тогда + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(НСтр("ru = 'Ожидание получения данных от базы-корреспондента...'", + ОбщегоНазначения.КодОсновногоЯзыка()), СтруктураНастроекОбмена); + Возврат Результат; + КонецЕсли; + + Попытка + ИмяФайлаИзСервисаПередачиФайлов = ПолучитьФайлИзХранилищаВСервисе( + Новый УникальныйИдентификатор(ПараметрыОбмена.ИдентификаторФайла), + СтруктураНастроекОбмена.УзелИнформационнойБазы,, ПараметрыАутентификации); + Исключение + + Отказ = Истина; + Сообщение = НСтр("ru = 'Возникли ошибки при получении сообщения обмена из сервиса передачи файлов: %1'", ОбщегоНазначения.КодОсновногоЯзыка()); + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Истина); + + Возврат Результат; + КонецПопытки; + + Попытка + ИмяКаталогаСообщенияОбмена = ОбменДаннымиСервер.СоздатьВременныйКаталогСообщенийОбмена(); + Исключение + Отказ = Истина; + Сообщение = НСтр("ru = 'При получении сообщения обмена возникли ошибки: %1'", ОбщегоНазначения.КодОсновногоЯзыка()); + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Истина); + + Возврат Результат; + КонецПопытки; + + ШаблонИмениФайлаСообщения = ОбменДаннымиСервер.ШаблонИмениФайлаСообщения(СтруктураНастроекОбмена.ТекущийУзелПланаОбмена, + СтруктураНастроекОбмена.УзелИнформационнойБазы, Ложь); + + ИмяФайлаСообщенияОбмена = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ИмяКаталогаСообщенияОбмена, ШаблонИмениФайлаСообщения + ".xml"); + + ПереместитьФайл(ИмяФайлаИзСервисаПередачиФайлов, ИмяФайлаСообщенияОбмена); + + ФайлСообщенияОбмена = Новый Файл(ИмяФайлаСообщенияОбмена); + Если ФайлСообщенияОбмена.Существует() Тогда + ДатаФайлаСообщенияОбмена = ФайлСообщенияОбмена.ПолучитьВремяИзменения(); + КонецЕсли; + + Результат.ИмяВременногоКаталогаСообщенийОбмена = ИмяКаталогаСообщенияОбмена; + Результат.ИмяФайлаСообщенияОбмена = ИмяФайлаСообщенияОбмена; + Результат.ИдентификаторФайлаПакетаДанных = ДатаФайлаСообщенияОбмена; + + Возврат Результат; +КонецФункции + +// Получает сообщение обмена из базы-корреспондента через веб-сервис. +// Сохраняет полученное сообщение обмена во временный каталог. +// Используется в том случае, если получение сообщения обмена выполнялось в контексте фонового задания в +// базе-корреспонденте. +// +// Параметры: +// Отказ - Булево - флаг отказа; поднимается в случае возникновения ошибки. +// УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого выполняется получение сообщения обмена. +// ИдентификаторФайла - УникальныйИдентификатор - идентификатор файла. +// ПараметрыАутентификации - Структура - содержит параметры аутентификации на веб-сервисе (Пользователь, Пароль). +// +// Возвращаемое значение: +// Структура со следующими ключи: +// * ИмяВременногоКаталогаСообщенийОбмена - полное имя каталога обмена, в которое было загружено сообщение обмена. +// * ИмяФайлаСообщенияОбмена - полное имя файла сообщения обмена. +// * ИдентификаторФайлаПакетаДанных - дата изменения файла сообщения обмена. +// +Функция ПолучитьСообщениеОбменаВоВременныйКаталогИзИнформационнойБазыКорреспондентаЧерезВебСервисЗавершениеДлительнойОперации( + Отказ, + УзелИнформационнойБазы, + ИдентификаторФайла, + Знач ПараметрыАутентификации = Неопределено) Экспорт + + // Возвращаемое значение функции. + Результат = Новый Структура; + Результат.Вставить("ИмяВременногоКаталогаСообщенийОбмена", ""); + Результат.Вставить("ИмяФайлаСообщенияОбмена", ""); + Результат.Вставить("ИдентификаторФайлаПакетаДанных", Неопределено); + + // Параметры, которые будут определены в функции. + ИмяКаталогаСообщенияОбмена = ""; + ИмяФайлаСообщенияОбмена = ""; + ДатаФайлаСообщенияОбмена = Дата('00010101'); + + Попытка + + ИмяФайлаИзСервисаПередачиФайлов = ПолучитьФайлИзХранилищаВСервисе(Новый УникальныйИдентификатор(ИдентификаторФайла), УзелИнформационнойБазы,, ПараметрыАутентификации); + + Исключение + + Отказ = Истина; + Сообщение = НСтр("ru = 'Возникли ошибки при получении сообщения обмена из сервиса передачи файлов: %1'", ОбщегоНазначения.КодОсновногоЯзыка()); + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + СтруктураНастроекОбмена = Новый Структура("КлючСообщенияЖурналаРегистрации"); + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = + ОбменДаннымиСервер.КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Истина); + + Возврат Результат; + + КонецПопытки; + + Попытка + ИмяКаталогаСообщенияОбмена = ОбменДаннымиСервер.СоздатьВременныйКаталогСообщенийОбмена(); + Исключение + Отказ = Истина; + Сообщение = НСтр("ru = 'При получении сообщения обмена возникли ошибки: %1'", ОбщегоНазначения.КодОсновногоЯзыка()); + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + СтруктураНастроекОбмена = Новый Структура("КлючСообщенияЖурналаРегистрации"); + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = + ОбменДаннымиСервер.КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Истина); + + Возврат Результат; + КонецПопытки; + + ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелИнформационнойБазы); + ТекущийУзелПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьЭтотУзелПланаОбмена(ИмяПланаОбмена); + + ШаблонИмениФайлаСообщения = ОбменДаннымиСервер.ШаблонИмениФайлаСообщения(ТекущийУзелПланаОбмена, УзелИнформационнойБазы, Ложь); + + ИмяФайлаСообщенияОбмена = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ИмяКаталогаСообщенияОбмена, ШаблонИмениФайлаСообщения + ".xml"); + ФайлСообщенияОбмена = Новый Файл(ИмяФайлаСообщенияОбмена); + Если НЕ ФайлСообщенияОбмена.Существует() Тогда + // Возможно, файл удастся получить если применить виртуальный код узла. + ШаблонИмениФайлаСообщенияСтарый = ШаблонИмениФайлаСообщения; + ШаблонИмениФайлаСообщения = ОбменДаннымиСервер.ШаблонИмениФайлаСообщения(ТекущийУзелПланаОбмена, УзелИнформационнойБазы, Ложь,, Истина); + Если ШаблонИмениФайлаСообщения <> ШаблонИмениФайлаСообщенияСтарый Тогда + ИмяФайлаСообщенияОбмена = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ИмяКаталогаСообщенияОбмена, ШаблонИмениФайлаСообщения + ".xml"); + ФайлСообщенияОбмена = Новый Файл(ИмяФайлаСообщенияОбмена); + КонецЕсли; + КонецЕсли; + + ПереместитьФайл(ИмяФайлаИзСервисаПередачиФайлов, ИмяФайлаСообщенияОбмена); + + Если ФайлСообщенияОбмена.Существует() Тогда + ДатаФайлаСообщенияОбмена = ФайлСообщенияОбмена.ПолучитьВремяИзменения(); + КонецЕсли; + + Результат.ИмяВременногоКаталогаСообщенийОбмена = ИмяКаталогаСообщенияОбмена; + Результат.ИмяФайлаСообщенияОбмена = ИмяФайлаСообщенияОбмена; + Результат.ИдентификаторФайлаПакетаДанных = ДатаФайлаСообщенияОбмена; + + Возврат Результат; +КонецФункции + +Процедура ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыЧерезWebСервис(Отказ, + УзелИнформационнойБазы, ДействиеПриОбмене, ПараметрыОбмена) Экспорт + + ТолькоПараметры = ПараметрыОбмена.ТолькоПараметры; + + УстановитьПривилегированныйРежим(Истина); + + // ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ + СтруктураНастроекОбмена = ОбменДаннымиСервер.НастройкиОбменаДляУзлаИнформационнойБазы( + УзелИнформационнойБазы, ДействиеПриОбмене, Перечисления.ВидыТранспортаСообщенийОбмена.WS, Ложь); + ОбменДаннымиСервер.ЗафиксироватьНачалоОбменаВРегистреСведений(СтруктураНастроекОбмена); + + Если СтруктураНастроекОбмена.Отказ Тогда + // Если настройка содержит ошибки, то обмен не производим; статус "Отменено". + ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Отказ = Истина; + Возврат; + КонецЕсли; + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; + + СтрокаСообщения = НСтр("ru = 'Начало процесса обмена данными для узла %1'", ОбщегоНазначения.КодОсновногоЯзыка()); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, СтруктураНастроекОбмена.УзелИнформационнойБазыНаименование); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщения, СтруктураНастроекОбмена); + + Если СтруктураНастроекОбмена.ПроизводитьЗагрузкуДанных Тогда + + // {Обработчик: ПередЧтениемСообщенияОбмена} Начало + ФайлСообщенияОбмена = ""; + СтандартнаяОбработка = Истина; + + ОбменДаннымиСервер.ПередЧтениемСообщенияОбмена(СтруктураНастроекОбмена.УзелИнформационнойБазы, ФайлСообщенияОбмена, СтандартнаяОбработка); + // {Обработчик: ПередЧтениемСообщенияОбмена} Окончание + + Если СтандартнаяОбработка Тогда + + Прокси = Неопределено; + + ПараметрыПрокси = Новый Структура; + ПараметрыПрокси.Вставить("ПараметрыАутентификации", ПараметрыОбмена.ПараметрыАутентификации); + + СостояниеНастройки = Неопределено; + СообщениеОбОшибке = ""; + ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, + СтруктураНастроекОбмена, ПараметрыПрокси, Отказ, СостояниеНастройки, СообщениеОбОшибке); + + Если Отказ Тогда + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СообщениеОбОшибке, СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; + ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Возврат; + КонецЕсли; + + ФайлСообщенияОбмена = ""; + + Попытка + + ВыполнитьВыгрузкуДанных(Прокси, ПараметрыПрокси.ТекущаяВерсия, СтруктураНастроекОбмена, ПараметрыОбмена); + + Если ПараметрыОбмена.ДлительнаяОперация Тогда + + ОжиданиеЗавершенияОперации(СтруктураНастроекОбмена, ПараметрыОбмена, Прокси, ПараметрыПрокси, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + + КонецЕсли; + + УИДФайлаСообщения = Новый УникальныйИдентификатор(ПараметрыОбмена.ИдентификаторФайла); + ФайлСообщенияОбмена = ПолучитьФайлИзХранилищаВСервисе(УИДФайлаСообщения, УзелИнформационнойБазы, 1024, ПараметрыОбмена.ПараметрыАутентификации); + + Исключение + + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + Отказ = Истина; + + КонецПопытки; + + КонецЕсли; + + Если Не Отказ Тогда + + ОбменДаннымиСервер.ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ФайлСообщенияОбмена,, ТолькоПараметры); + + КонецЕсли; + + // {Обработчик: ПослеЧтенияСообщенияОбмена} Начало + СтандартнаяОбработка = Истина; + + ОбменДаннымиСервер.ПослеЧтенияСообщенияОбмена( + СтруктураНастроекОбмена.УзелИнформационнойБазы, + ФайлСообщенияОбмена, + ОбменДаннымиСервер.РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена), + СтандартнаяОбработка, + Не ТолькоПараметры); + // {Обработчик: ПослеЧтенияСообщенияОбмена} Окончание + + Если СтандартнаяОбработка Тогда + + Попытка + Если Не ПустаяСтрока(ФайлСообщенияОбмена) + И ТипЗнч(ОбменДаннымиСервер.СообщениеОбменаДаннымиИзГлавногоУзла()) <> Тип("Структура") Тогда + УдалитьФайлы(ФайлСообщенияОбмена); + КонецЕсли; + Исключение + ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + КонецЕсли; + + ИначеЕсли СтруктураНастроекОбмена.ПроизводитьВыгрузкуДанных Тогда + + Прокси = Неопределено; + + ПараметрыПрокси = Новый Структура; + ПараметрыПрокси.Вставить("ПараметрыАутентификации", ПараметрыОбмена.ПараметрыАутентификации); + Если ПараметрыОбмена.СообщениеДляСопоставленияДанных Тогда + ПараметрыПрокси.Вставить("МинимальнаяВерсия", "3.0.1.1"); + КонецЕсли; + + СостояниеНастройки = Неопределено; + СообщениеОбОшибке = ""; + ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, + СтруктураНастроекОбмена, ПараметрыПрокси, Отказ, СостояниеНастройки, СообщениеОбОшибке); + + Если Отказ Тогда + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СообщениеОбОшибке, СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; + ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Возврат; + КонецЕсли; + + ВременныйКаталог = ПолучитьИмяВременногоФайла(); + СоздатьКаталог(ВременныйКаталог); + + ФайлСообщенияОбмена = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( + ВременныйКаталог, ОбменДаннымиСервер.УникальноеИмяФайлаСообщенияОбмена()); + + Попытка + ОбменДаннымиСервер.ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ФайлСообщенияОбмена); + Исключение + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + Отказ = Истина; + КонецПопытки; + + // Отправка сообщения обмена только в случае успешной выгрузки данных. + Если ОбменДаннымиСервер.РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) И Не Отказ Тогда + + Попытка + + ИдентификаторФайлаУИД = ПоместитьФайлВХранилищеВСервисе(Прокси, ПараметрыПрокси.ТекущаяВерсия, + СтруктураНастроекОбмена, ФайлСообщенияОбмена, УзелИнформационнойБазы, 1024); + + ИдентификаторФайлаСтрокой = Строка(ИдентификаторФайлаУИД); + + Попытка + УдалитьФайлы(ВременныйКаталог); + Исключение + ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Если ПараметрыОбмена.СообщениеДляСопоставленияДанных + И (СостояниеНастройки.ПоддерживаетсяСопоставлениеДанных + Или Не СостояниеНастройки.НастройкаСинхронизацииДанныхЗавершена) Тогда + + ПоместитьСообщениеДляСопоставленияДанных(Прокси, ПараметрыПрокси.ТекущаяВерсия, + СтруктураНастроекОбмена, ИдентификаторФайлаСтрокой); + + Иначе + + ВыполнитьЗагрузкуДанных(Прокси, ПараметрыПрокси.ТекущаяВерсия, + СтруктураНастроекОбмена, ПараметрыОбмена, ИдентификаторФайлаСтрокой); + + Если ПараметрыОбмена.ДлительнаяОперация Тогда + + ОжиданиеЗавершенияОперации(СтруктураНастроекОбмена, ПараметрыОбмена, Прокси, ПараметрыПрокси, Перечисления.ДействияПриОбмене.ВыгрузкаДанных); + + КонецЕсли; + + КонецЕсли; + + Исключение + + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными( + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + Отказ = Истина; + + КонецПопытки; + + КонецЕсли; + + Попытка + УдалитьФайлы(ВременныйКаталог); + Исключение + ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + КонецЕсли; + + ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + Если Не ОбменДаннымиСервер.РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) Тогда + Отказ = Истина; + КонецЕсли; + +КонецПроцедуры + +// Выполняет получение файла сообщения обмена из базы-корреспондента через веб-сервис. +// Выполняет загрузку полученного файла сообщения обмена в эту базу. +// +// Параметры: +// Отказ - Булево - флаг отказа; поднимается в случае возникновения ошибки. +// УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого выполняется получение сообщения обмена. +// ИдентификаторФайла - УникальныйИдентификатор - идентификатор файла. +// ДатаНачалаОперации - Дата - дата начала загрузки. +// ПараметрыАутентификации - Структура - содержит параметры аутентификации на веб-сервисе (Пользователь, Пароль). +// +Процедура ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЗавершениеДлительнойОперации( + Отказ, + Знач УзелИнформационнойБазы, + Знач ИдентификаторФайла, + Знач ДатаНачалаОперации, + Знач ПараметрыАутентификации = Неопределено, + ВыдаватьОшибку = Ложь) Экспорт + + ОбменДаннымиСервер.ПроверитьВозможностьВыполненияОбменов(); + + ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными(); + + УстановитьПривилегированныйРежим(Истина); + + Попытка + ФайлСообщенияОбмена = ПолучитьФайлИзХранилищаВСервисе(Новый УникальныйИдентификатор(ИдентификаторФайла), + УзелИнформационнойБазы,, ПараметрыАутентификации); + Исключение + ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбменаСОшибкой(УзелИнформационнойБазы, + Перечисления.ДействияПриОбмене.ЗагрузкаДанных, + ДатаНачалаОперации, + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Если ВыдаватьОшибку Тогда + ВызватьИсключение; + Иначе + Отказ = Истина; + КонецЕсли; + Возврат; + КонецПопытки; + + // Загрузка файла сообщения обмена в эту базу. + ПараметрыОбменаДанными = ОбменДаннымиСервер.ПараметрыОбменаДаннымиЧерезФайлИлиСтроку(); + + ПараметрыОбменаДанными.УзелИнформационнойБазы = УзелИнформационнойБазы; + ПараметрыОбменаДанными.ПолноеИмяФайлаСообщенияОбмена = ФайлСообщенияОбмена; + ПараметрыОбменаДанными.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ЗагрузкаДанных; + ПараметрыОбменаДанными.ДатаНачалаОперации = ДатаНачалаОперации; + + Попытка + ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными); + Исключение + ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбменаСОшибкой(УзелИнформационнойБазы, + Перечисления.ДействияПриОбмене.ЗагрузкаДанных, + ДатаНачалаОперации, + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Если ВыдаватьОшибку Тогда + ВызватьИсключение; + Иначе + Отказ = Истина; + КонецЕсли; + КонецПопытки; + + Попытка + УдалитьФайлы(ФайлСообщенияОбмена); + Исключение + ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + +КонецПроцедуры + +// Функция по переданному идентификатору скачивает файл из сервиса передачи файлов. +// +// Параметры: +// ИдентификаторФайла - УникальныйИдентификатор - идентификатор получаемого файла. +// УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого необходимо получить файл. +// РазмерЧасти - Число - размер части в килобайтах. Если значение равно 0, +// то разбивка на части не производится. +// ПараметрыАутентификации - Структура: АдресСервиса, ИмяПользователя, ПарольПользователя. +// +// Возвращаемое значение: +// Строка - путь к полученному файлу. +// +Функция ПолучитьФайлИзХранилищаВСервисе(Знач ИдентификаторФайла, Знач УзелИнформационнойБазы, + Знач РазмерЧасти = 1024, Знач ПараметрыАутентификации = Неопределено) Экспорт + + // Возвращаемое значение функции. + ИмяФайлаРезультата = ""; + + ДополнительныеПараметры = Новый Структура("ПараметрыАутентификации", ПараметрыАутентификации); + + СообщениеОбОшибке = ""; + Прокси = WSПроксиДляУзлаИнформационнойБазы(УзелИнформационнойБазы, СообщениеОбОшибке, ДополнительныеПараметры); + + Если Прокси = Неопределено Тогда + ВызватьИсключение СообщениеОбОшибке; + КонецЕсли; + + ИдентификаторСессии = Неопределено; + КоличествоЧастей = Неопределено; + + ПараметрыПрокси = Новый Структура("ТекущаяВерсия", ДополнительныеПараметры.ТекущаяВерсия); + СтруктураНастроекОбмена = ОбменДаннымиСервер.НастройкиОбменаДляУзлаИнформационнойБазы(УзелИнформационнойБазы, + Перечисления.ДействияПриОбмене.ВыгрузкаДанных, Перечисления.ВидыТранспортаСообщенийОбмена.WS, Ложь); + + ПодготовитьФайлДляПолучения(Прокси, ПараметрыПрокси.ТекущаяВерсия, СтруктураНастроекОбмена, + ИдентификаторФайла, РазмерЧасти, ИдентификаторСессии, КоличествоЧастей); + + ИменаФайлов = Новый Массив; + + КаталогСборки = ПолучитьИмяВременногоФайла(); + СоздатьКаталог(КаталогСборки); + + ШаблонИмениФайла = "data.zip.[n]"; + + // Протоколирование событий обмена. + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = + ОбменДаннымиСервер.КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + + Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Начало получения сообщения обмена из Интернета (количество частей файла %1).'"), + Формат(КоличествоЧастей, "ЧН=0; ЧГ=0")); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Комментарий, СтруктураНастроекОбмена); + + Для НомерЧасти = 1 По КоличествоЧастей Цикл + ДанныеЧасти = Неопределено; // ДвоичныеДанные + Попытка + ПолучитьЧастьФайла(Прокси, ПараметрыПрокси.ТекущаяВерсия, СтруктураНастроекОбмена, ИдентификаторСессии, НомерЧасти, ДанныеЧасти); + Исключение + Прокси.ReleaseFile(ИдентификаторСессии); + ВызватьИсключение; + КонецПопытки; + + ИмяФайла = СтрЗаменить(ШаблонИмениФайла, "[n]", Формат(НомерЧасти, "ЧГ=0")); + ИмяФайлаЧасти = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогСборки, ИмяФайла); + + ДанныеЧасти.Записать(ИмяФайлаЧасти); + ИменаФайлов.Добавить(ИмяФайлаЧасти); + КонецЦикла; + ДанныеЧасти = Неопределено; + + Прокси.ReleaseFile(ИдентификаторСессии); + + ИмяАрхива = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогСборки, "data.zip"); + + ОбъединитьФайлы(ИменаФайлов, ИмяАрхива); + + РегистрыСведений.АрхивСообщенийОбменов.ПоместитьСообщениеВАрхив(УзелИнформационнойБазы, ИмяАрхива); + + Разархиватор = Новый ЧтениеZipФайла(ИмяАрхива); + Если Разархиватор.Элементы.Количество() = 0 Тогда + Попытка + УдалитьФайлы(КаталогСборки); + Исключение + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУдалениеВременногоФайла(), + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + ВызватьИсключение(НСтр("ru = 'Файл архива не содержит данных.'")); + КонецЕсли; + + // Протоколирование событий обмена. + ФайлАрхива = Новый Файл(ИмяАрхива); + + Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Окончание получения сообщения обмена из Интернета (размер сжатого сообщения обмена %1 Мб).'"), + Формат(Окр(ФайлАрхива.Размер() / 1024 / 1024, 3), "ЧН=0; ЧГ=0")); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Комментарий, СтруктураНастроекОбмена); + + ЭлементАрхива = Разархиватор.Элементы.Получить(0); + ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогСборки, ЭлементАрхива.Имя); + + Разархиватор.Извлечь(ЭлементАрхива, КаталогСборки); + Разархиватор.Закрыть(); + + Файл = Новый Файл(ИмяФайла); + + ВременныйКаталог = ПолучитьИмяВременногоФайла(); //АПК:441 удаление каталога происходит при получении данных обмена в другой ИБ + СоздатьКаталог(ВременныйКаталог); + + ИмяФайлаРезультата = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ВременныйКаталог, Файл.Имя); + + ПереместитьФайл(ИмяФайла, ИмяФайлаРезультата); + + Попытка + УдалитьФайлы(КаталогСборки); + Исключение + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУдалениеВременногоФайла(), + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Возврат ИмяФайлаРезультата; +КонецФункции + +// Функция передает указанный файл в сервис передачи файлов. +// +// Параметры: +// Прокси +// ВерсияПрокси - Строка - версия используемого веб-сервиса +// СтруктураНастроекОбмена - Структура - структура со всеми необходимыми данными и объектами для выполнения обмена. +// ИмяФайла - Строка - путь к передаваемому файлу. +// УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого необходимо получить файл. +// РазмерЧастиКБ - Число - размер части в килобайтах. Если значение равно 0, +// то разбивка на части не производится. +// ИдентификаторФайла - УникальныйИдентификатор - идентификатор помещаемого в сервис файла. +// +// Возвращаемое значение: +// УникальныйИдентификатор - идентификатор файла в сервисе передачи файлов. +// +Функция ПоместитьФайлВХранилищеВСервисе(Прокси, ВерсияПрокси, СтруктураНастроекОбмена, Знач ИмяФайла, + Знач УзелИнформационнойБазы, Знач РазмерЧастиКБ = 1024, ИдентификаторФайла = Неопределено) Экспорт + + Если Прокси = Неопределено Тогда + + ВызватьИсключение НСтр("ru ='Не определен WS-прокси передачи файла выгрузки в базу приемник. + |Обратитесь к администратору.'", ОбщегоНазначения.КодОсновногоЯзыка()); + + КонецЕсли; + + КаталогФайлов = ПолучитьИмяВременногоФайла(); + СоздатьКаталог(КаталогФайлов); + + // Архивирование файла. + ИмяНеразделенногоФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогФайлов, "data.zip"); + Архиватор = Новый ЗаписьZipФайла(ИмяНеразделенногоФайла,,,, УровеньСжатияZIP.Максимальный); + Архиватор.Добавить(ИмяФайла); + Архиватор.Записать(); + + // Разделение файла на части. + ИдентификаторСессии = Новый УникальныйИдентификатор; + + РазмерЧастиВБайтах = РазмерЧастиКБ * 1024; + ИменаФайлов = РазделитьФайл(ИмяНеразделенногоФайла, РазмерЧастиВБайтах); + + КоличествоЧастей = ИменаФайлов.Количество(); + Для НомерЧасти = 1 По КоличествоЧастей Цикл + + ИмяФайлаЧасти = ИменаФайлов[НомерЧасти - 1]; + ДанныеФайла = Новый ДвоичныеДанные(ИмяФайлаЧасти); + ПоместитьЧастьФайла(Прокси, ВерсияПрокси, СтруктураНастроекОбмена, ИдентификаторСессии, НомерЧасти, ДанныеФайла); + + КонецЦикла; + + Попытка + УдалитьФайлы(КаталогФайлов); + Исключение + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУдалениеВременногоФайла(), + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + СобратьФайлИзЧастей(Прокси, ВерсияПрокси, СтруктураНастроекОбмена, ИдентификаторСессии, КоличествоЧастей, ИдентификаторФайла); + + Возврат ИдентификаторФайла; + +КонецФункции + +// Инициализирует WS-прокси для выполнения управляющих команд обмена данными, +// предварительно проверяет наличие узла обмена. +// +// Параметры: +// Прокси - WSПрокси - WS-прокси для передачи управляющих команд. +// СтруктураНастроек - Структура - структура параметров для подключения к корреспонденту и идентификации настройки обмена: +// * ИмяПланаОбмена - Строка - имя плана обмена, используемого при синхронизации. +// * УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, соответствующий корреспонденту. +// * КлючСообщенияЖурналаРегистрации - Строка - имя события для записи ошибок в журнал регистрации. +// * ТекущийУзелПланаОбмена - ПланОбменаСсылка - ссылка на ЭтотУзел плана обмена. +// * ТекущийУзелПланаОбменаКод - Строка - идентификатор текущего узла плана обмена. +// * ДействиеПриОбмене - ПеречислениеСсылка.ДействияПриОбмене - указывает на направление обмена. +// ПараметрыПрокси - Структура: +// * ПараметрыАутентификации - Строка +// - Структура - содержит пароль для аутентификации на веб-сервере. +// * СтруктураНастроекАутентификации - Структура - содержит структуру настроек для аутентификации на веб-сервере. +// * МинимальнаяВерсия - Строка - номер минимальной версии интерфейса "ОбменДанными", требуемый для выполнения действий. +// * ТекущаяВерсия - Строка - исходящий, фактическая версия интерфейса инициализированного WS-прокси. +// Отказ - Булево - признак неуспешной инициализации WS-прокси. +// СостояниеНастройки - Структура - исходящий, возвращает состояние настройки синхронизации, описанной в СтруктураНастроек: +// * НастройкаСуществует - Булево - Истина, если настройка с указанными планом обмена и идентификатором узла существует. +// * НастройкаСинхронизацииДанныхЗавершена - Булево - Истина, если настройка синхронизации завершена. +// * ПоддерживаетсяСопоставлениеДанных - Булево - Истина, если корреспондент поддерживает функцию сопоставления данных. +// * ПолученоСообщениеДляСопоставленияДанных - Булево - Истина, в корреспондент загружено сообщение для сопоставления. +// СтрокаСообщенияОбОшибке - Строка - описание ошибки инициализации WS-прокси. +// +Процедура ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, + СтруктураНастроек, ПараметрыПрокси, Отказ, СостояниеНастройки, СтрокаСообщенияОбОшибке = "") Экспорт + + МинимальнаяВерсия = "0.0.0.0"; + Если ПараметрыПрокси.Свойство("МинимальнаяВерсия") Тогда + МинимальнаяВерсия = ПараметрыПрокси.МинимальнаяВерсия; + КонецЕсли; + + ПараметрыАутентификации = Неопределено; + ПараметрыПрокси.Свойство("ПараметрыАутентификации", ПараметрыАутентификации); + + СтруктураНастроекАутентификации = Неопределено; + ПараметрыПрокси.Свойство("СтруктураНастроекАутентификации", СтруктураНастроекАутентификации); + + ПараметрыПрокси.Вставить("ТекущаяВерсия", Неопределено); + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ПараметрыАутентификации", ПараметрыАутентификации); + ДополнительныеПараметры.Вставить("МинимальнаяВерсия", МинимальнаяВерсия); + ДополнительныеПараметры.Вставить("СтруктураНастроекАутентификации", СтруктураНастроекАутентификации); + + Прокси = WSПроксиДляУзлаИнформационнойБазы( + СтруктураНастроек.УзелИнформационнойБазы, + СтрокаСообщенияОбОшибке, + ДополнительныеПараметры); + + Если Прокси = Неопределено Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + + ПараметрыПрокси.ТекущаяВерсия = ДополнительныеПараметры.ТекущаяВерсия; + + Если ОбменДаннымиСервер.ЭтоПланОбменаXDTO(СтруктураНастроек.ИмяПланаОбмена) Тогда + + ПсевдонимУзла = ОбменДаннымиСервер.ПсевдонимПредопределенногоУзла(СтруктураНастроек.УзелИнформационнойБазы); + Если ЗначениеЗаполнено(ПсевдонимУзла) Тогда + // Проверка настройки со старым идентификатором (префиксом). + СтруктураНастроекПредопределенного = Новый Структура; + СтруктураНастроекПредопределенного.Вставить("ИмяПланаОбмена", СтруктураНастроек.ИмяПланаОбмена); + СтруктураНастроекПредопределенного.Вставить("ТекущийУзелПланаОбменаКод", ПсевдонимУзла); + СостояниеНастройки = СостояниеНастройкиСинхронизацииВКорреспонденте(Прокси, ПараметрыПрокси, СтруктураНастроекПредопределенного); + + Если Не СостояниеНастройки.НастройкаСуществует Тогда + Если ВКорреспондентеУстаревшийВариантНастроекОбмена( + Прокси, ПараметрыПрокси, СостояниеНастройки, СтруктураНастроек, ПсевдонимУзла, Отказ, СтрокаСообщенияОбОшибке) + Или Отказ Тогда + Возврат; + КонецЕсли; + Иначе + СтруктураНастроек.ТекущийУзелПланаОбменаКод = ПсевдонимУзла; + Возврат; + КонецЕсли; + КонецЕсли; + + СостояниеНастройки = СостояниеНастройкиСинхронизацииВКорреспонденте(Прокси, ПараметрыПрокси, СтруктураНастроек); + + Если Не СостояниеНастройки.НастройкаСуществует Тогда + Если ВКорреспондентеУстаревшийВариантНастроекОбмена( + Прокси, ПараметрыПрокси, СостояниеНастройки, СтруктураНастроек, СтруктураНастроек.ТекущийУзелПланаОбменаКод, Отказ, СтрокаСообщенияОбОшибке) + Или Отказ Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + Иначе + + СостояниеНастройки = СостояниеНастройкиСинхронизацииВКорреспонденте(Прокси, ПараметрыПрокси, СтруктураНастроек); + + КонецЕсли; + + Если Не СостояниеНастройки.НастройкаСуществует Тогда + СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не найдена настройка синхронизации данных ""%1"" с идентификатором ""%2"".'"), + СтруктураНастроек.ИмяПланаОбмена, + СтруктураНастроек.ТекущийУзелПланаОбменаКод); + Отказ = Истина; + КонецЕсли; + +КонецПроцедуры + +Функция WSПроксиДляУзлаИнформационнойБазы(УзелИнформационнойБазы, СтрокаСообщенияОбОшибке = "", ДополнительныеПараметры = Неопределено) Экспорт + + Если ДополнительныеПараметры = Неопределено Тогда + ДополнительныеПараметры = Новый Структура; + КонецЕсли; + + ПараметрыАутентификации = Неопределено; + ДополнительныеПараметры.Свойство("ПараметрыАутентификации", ПараметрыАутентификации); + + СтруктураНастроекАутентификации = Неопределено; + ДополнительныеПараметры.Свойство("СтруктураНастроекАутентификации", СтруктураНастроекАутентификации); + + МинимальнаяВерсия = Неопределено; + Если Не ДополнительныеПараметры.Свойство("МинимальнаяВерсия", МинимальнаяВерсия) Тогда + МинимальнаяВерсия = "0.0.0.0"; + КонецЕсли; + + ДополнительныеПараметры.Вставить("ТекущаяВерсия"); + + Если СтруктураНастроекАутентификации = Неопределено Тогда + Если ОбменДаннымиПовтИсп.ЭтоУзелОбменаСообщениями(УзелИнформационнойБазы) Тогда + МодульНастройкиТранспортаОбменаСообщениями = ОбщегоНазначения.ОбщийМодуль("РегистрыСведений.НастройкиТранспортаОбменаСообщениями"); + СтруктураНастроекАутентификации = МодульНастройкиТранспортаОбменаСообщениями.НастройкиТранспортаWS( + УзелИнформационнойБазы, ПараметрыАутентификации); + Иначе + СтруктураНастроекАутентификации = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспортаWS( + УзелИнформационнойБазы, ПараметрыАутентификации); + КонецЕсли; + КонецЕсли; + + Попытка + ВерсииКорреспондента = ОбменДаннымиПовтИсп.ВерсииКорреспондента(СтруктураНастроекАутентификации); + Исключение + СтрокаСообщенияОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУстановкаПодключенияКWebСервису(), + УровеньЖурналаРегистрации.Ошибка,,, СтрокаСообщенияОбОшибке); + Возврат Неопределено; + КонецПопытки; + + ДоступныеВерсии = Новый Соответствие; + Для Каждого Версия Из СтрРазделить("3.0.2.1;3.0.1.1;2.1.1.7;2.0.1.6", ";", Ложь) Цикл + ДоступныеВерсии.Вставить(Версия, ВерсииКорреспондента.Найти(Версия) <> Неопределено + И (ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Версия, МинимальнаяВерсия) >= 0)); + КонецЦикла; + + ДоступныеВерсии.Вставить("0.0.0.0", ОбщегоНазначенияКлиентСервер.СравнитьВерсии("0.0.0.0", МинимальнаяВерсия) >= 0); + + Если ДоступныеВерсии.Получить("3.0.2.1") = Истина Тогда + ТекущаяВерсия = "3.0.2.1"; + ИначеЕсли ДоступныеВерсии.Получить("3.0.1.1") = Истина Тогда + ТекущаяВерсия = "3.0.1.1"; + ИначеЕсли ДоступныеВерсии.Получить("2.1.1.7") = Истина Тогда + ТекущаяВерсия = "2.1.1.7"; + ИначеЕсли ДоступныеВерсии.Получить("2.0.1.6") = Истина Тогда + ТекущаяВерсия = "2.0.1.6"; + ИначеЕсли ДоступныеВерсии.Получить("0.0.0.0") = Истина Тогда + ТекущаяВерсия = "0.0.0.0"; + Иначе + СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Корреспондент не поддерживает требуемую версию ""%1"" интерфейса ""ОбменДанными"".'"), + МинимальнаяВерсия); + Возврат Неопределено; + КонецЕсли; + + ДополнительныеПараметры.ТекущаяВерсия = ТекущаяВерсия; + + Если ТекущаяВерсия = "0.0.0.0" Тогда + ВерсияДляАдреса = ""; + Иначе + ВерсияДляАдреса = "_" + СтрЗаменить(ТекущаяВерсия, ".", "_"); + КонецЕсли; + + // + ОбменДаннымиСервер.УдалитьНезначащиеСимволыВНастройкахПодключения(СтруктураНастроекАутентификации); + + СтруктураНастроекАутентификации.Вставить("WSURLПространстваИменСервиса", "http://www.1c.ru/SSL/Exchange" + ВерсияДляАдреса); + СтруктураНастроекАутентификации.Вставить("WSИмяСервиса", "Exchange" + ВерсияДляАдреса); + СтруктураНастроекАутентификации.Вставить("WSТаймаут", 600); + + Возврат ПолучитьWSПроксиПоПараметрамПодключения(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке, СтрокаСообщенияОбОшибке, Истина); + +КонецФункции + +Функция ПолучитьWSПроксиПоПараметрамПодключения( + СтруктураНастроек, + СтрокаСообщенияОбОшибке = "", + СообщениеПользователю = "", + ДелатьКонтрольныйВызов = Ложь) Экспорт + + Попытка + ПроверитьКорректностьФорматаАдресаWSПрокси(СтруктураНастроек.WSURLВебСервиса); + Исключение + СообщениеПользователю = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + СтрокаСообщенияОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУстановкаПодключенияКWebСервису(), УровеньЖурналаРегистрации.Ошибка,,, СтрокаСообщенияОбОшибке); + Возврат Неопределено; + КонецПопытки; + + Попытка + ПроверитьНедопустимыеСимволыВИмениПользователяWSПрокси(СтруктураНастроек.WSИмяПользователя); + Исключение + СообщениеПользователю = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + СтрокаСообщенияОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУстановкаПодключенияКWebСервису(), УровеньЖурналаРегистрации.Ошибка,,, СтрокаСообщенияОбОшибке); + Возврат Неопределено; + КонецПопытки; + + МестоположениеWSDL = "[URLВебСервиса]/ws/[ИмяСервиса]?wsdl"; + МестоположениеWSDL = СтрЗаменить(МестоположениеWSDL, "[URLВебСервиса]", СтруктураНастроек.WSURLВебСервиса); + МестоположениеWSDL = СтрЗаменить(МестоположениеWSDL, "[ИмяСервиса]", СтруктураНастроек.WSИмяСервиса); + + ПараметрыПодключения = ОбщегоНазначения.ПараметрыПодключенияWSПрокси(); + ПараметрыПодключения.АдресWSDL = МестоположениеWSDL; + ПараметрыПодключения.URIПространстваИмен = СтруктураНастроек.WSURLПространстваИменСервиса; + ПараметрыПодключения.ИмяСервиса = СтруктураНастроек.WSИмяСервиса; + ПараметрыПодключения.ИмяПользователя = СтруктураНастроек.WSИмяПользователя; + ПараметрыПодключения.Пароль = СтруктураНастроек.WSПароль; + ПараметрыПодключения.Таймаут = СтруктураНастроек.WSТаймаут; + ПараметрыПодключения.ДелатьКонтрольныйВызов = ДелатьКонтрольныйВызов; + + Попытка + WSПрокси = ОбщегоНазначения.СоздатьWSПрокси(ПараметрыПодключения); + Исключение + СообщениеПользователю = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + СтрокаСообщенияОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУстановкаПодключенияКWebСервису(), УровеньЖурналаРегистрации.Ошибка,,, СтрокаСообщенияОбОшибке); + Возврат Неопределено; + КонецПопытки; + + Возврат WSПрокси; +КонецФункции + +Функция ЕстьПодключениеККорреспонденту(Знач Корреспондент, + Знач СтруктураНастроек, + СообщениеПользователю = "", + НастройкаСинхронизацииДанныхЗавершена = Истина, + ПолученоСообщениеДляСопоставленияДанных = Ложь) Экспорт + + СтруктураНастроекОбмена = ОбменДаннымиСервер.НастройкиОбменаДляУзлаИнформационнойБазы( + Корреспондент, Перечисления.ДействияПриОбмене.ВыгрузкаДанных, Перечисления.ВидыТранспортаСообщенийОбмена.WS, Ложь); + + СтруктураНастроекОбмена.Вставить("КлючСообщенияЖурналаРегистрации", + НСтр("ru = 'Обмен данными.Проверка подключения'", ОбщегоНазначения.КодОсновногоЯзыка())); + + ПараметрыПрокси = Новый Структура; + ПараметрыПрокси.Вставить("ПараметрыАутентификации", Неопределено); + ПараметрыПрокси.Вставить("СтруктураНастроекАутентификации", СтруктураНастроек); + + Прокси = Неопределено; + СостояниеНастройки = Неопределено; + Отказ = Ложь; + ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, + СтруктураНастроекОбмена, ПараметрыПрокси, Отказ, СостояниеНастройки, СообщениеПользователю); + + Если Отказ Тогда + СброситьПарольСинхронизацииДанных(Корреспондент); + НастройкаСинхронизацииДанныхЗавершена = Ложь; + Возврат Ложь; + КонецЕсли; + + УстановитьПарольСинхронизацииДанных(Корреспондент, СтруктураНастроек.WSПароль); + + НастройкаСинхронизацииДанныхЗавершена = СостояниеНастройки.НастройкаСинхронизацииДанныхЗавершена; + ПолученоСообщениеДляСопоставленияДанных = СостояниеНастройки.ПолученоСообщениеДляСопоставленияДанных; + + Возврат СостояниеНастройки.НастройкаСуществует; + +КонецФункции + +Процедура ВыполнитьВыгрузкуДляУзлаИнформационнойБазыВСервисПередачиФайлов(ПараметрыПроцедуры, АдресХранилища) Экспорт + + ИмяПланаОбмена = ПараметрыПроцедуры["ИмяПланаОбмена"]; + КодУзлаИнформационнойБазы = ПараметрыПроцедуры["КодУзлаИнформационнойБазы"]; + ИдентификаторФайла = ПараметрыПроцедуры["ИдентификаторФайла"]; + + ИспользоватьСжатие = ПараметрыПроцедуры.Свойство("ИспользоватьСжатие") И ПараметрыПроцедуры["ИспользоватьСжатие"]; + + УстановитьПривилегированныйРежим(Истина); + + ИмяФайлаСообщения = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( + ОбменДаннымиСервер.КаталогВременногоХранилищаФайлов(), + ОбменДаннымиСервер.УникальноеИмяФайлаСообщенияОбмена()); + + ПараметрыОбменаДанными = ОбменДаннымиСервер.ПараметрыОбменаДаннымиЧерезФайлИлиСтроку(); + + ПараметрыОбменаДанными.ПолноеИмяФайлаСообщенияОбмена = ИмяФайлаСообщения; + ПараметрыОбменаДанными.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных; + ПараметрыОбменаДанными.ИмяПланаОбмена = ИмяПланаОбмена; + ПараметрыОбменаДанными.КодУзлаИнформационнойБазы = КодУзлаИнформационнойБазы; + + ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными); + + ИмяФайлаДляПомещенияВХранилище = ИмяФайлаСообщения; + Если ИспользоватьСжатие Тогда + ИмяФайлаДляПомещенияВХранилище = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( + ОбменДаннымиСервер.КаталогВременногоХранилищаФайлов(), + ОбменДаннымиСервер.УникальноеИмяФайлаСообщенияОбмена("zip")); + + Архиватор = Новый ЗаписьZipФайла(ИмяФайлаДляПомещенияВХранилище, , , , УровеньСжатияZIP.Максимальный); + Архиватор.Добавить(ИмяФайлаСообщения); + Архиватор.Записать(); + + УдалитьФайлы(ИмяФайлаСообщения); + КонецЕсли; + + ОбменДаннымиСервер.ПоместитьФайлВХранилище(ИмяФайлаДляПомещенияВХранилище, ИдентификаторФайла); + +КонецПроцедуры + +Процедура ВыполнитьЗагрузкуДляУзлаИнформационнойБазыИзСервисаПередачиФайлов(ПараметрыПроцедуры, АдресХранилища) Экспорт + + ИмяПланаОбмена = ПараметрыПроцедуры["ИмяПланаОбмена"]; + КодУзлаИнформационнойБазы = ПараметрыПроцедуры["КодУзлаИнформационнойБазы"]; + ИдентификаторФайла = ПараметрыПроцедуры["ИдентификаторФайла"]; + + УстановитьПривилегированныйРежим(Истина); + + ИмяВременногоФайла = ОбменДаннымиСервер.ПолучитьФайлИзХранилища(ИдентификаторФайла); + + ПараметрыОбменаДанными = ОбменДаннымиСервер.ПараметрыОбменаДаннымиЧерезФайлИлиСтроку(); + + ПараметрыОбменаДанными.ПолноеИмяФайлаСообщенияОбмена = ИмяВременногоФайла; + ПараметрыОбменаДанными.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ЗагрузкаДанных; + ПараметрыОбменаДанными.ИмяПланаОбмена = ИмяПланаОбмена; + ПараметрыОбменаДанными.КодУзлаИнформационнойБазы = КодУзлаИнформационнойБазы; + + Попытка + ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными); + Исключение + ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + УдалитьФайлы(ИмяВременногоФайла); + ВызватьИсключение ПредставлениеОшибки; + КонецПопытки; + + УдалитьФайлы(ИмяВременногоФайла); +КонецПроцедуры + +// Соответствует операции UploadData +Процедура ВыполнитьВыгрузкуДанных(Прокси, ВерсияПрокси, СтруктураНастроекОбмена, ПараметрыОбмена) Экспорт + + Если Версия3_0_2_1(ВерсияПрокси) Тогда + + Прокси.UploadData( + СтруктураНастроекОбмена.ИмяПланаОбмена, + СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, + ПараметрыОбмена.ИдентификаторФайла, + ПараметрыОбмена.ДлительнаяОперация, + ПараметрыОбмена.ИдентификаторОперации, + ПараметрыОбмена.ДлительнаяОперацияРазрешена, + СтруктураНастроекОбмена.НастройкиТранспорта.WSОбластьДанныхКорреспондента); + + Иначе + + Прокси.UploadData( + СтруктураНастроекОбмена.ИмяПланаОбмена, + СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, + ПараметрыОбмена.ИдентификаторФайла, + ПараметрыОбмена.ДлительнаяОперация, + ПараметрыОбмена.ИдентификаторОперации, + ПараметрыОбмена.ДлительнаяОперацияРазрешена); + + КонецЕсли; + +КонецПроцедуры + +// Соответствует операции DownloadData. +Процедура ВыполнитьЗагрузкуДанных(Прокси, ВерсияПрокси, СтруктураНастроекОбмена, ПараметрыОбмена, ИдентификаторФайлаСтрокой) Экспорт + + Если Версия3_0_2_1(ВерсияПрокси) Тогда + + Прокси.DownloadData( + СтруктураНастроекОбмена.ИмяПланаОбмена, + СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, + ИдентификаторФайлаСтрокой, + ПараметрыОбмена.ДлительнаяОперация, + ПараметрыОбмена.ИдентификаторОперации, + ПараметрыОбмена.ДлительнаяОперацияРазрешена, + СтруктураНастроекОбмена.НастройкиТранспорта.WSОбластьДанныхКорреспондента); + + Иначе + + Прокси.DownloadData( + СтруктураНастроекОбмена.ИмяПланаОбмена, + СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, + ИдентификаторФайлаСтрокой, + ПараметрыОбмена.ДлительнаяОперация, + ПараметрыОбмена.ИдентификаторОперации, + ПараметрыОбмена.ДлительнаяОперацияРазрешена); + + КонецЕсли; + +КонецПроцедуры + +// Соответствует операции GetIBParameters. +Функция ПолучитьПараметрыИБ(Прокси, ВерсияПрокси, ИмяПланаОбмена, КодУзла, СообщениеОбОшибке, ОбластьДанных) Экспорт + + Если Версия3_0_2_1(ВерсияПрокси) Тогда + + Возврат Прокси.GetIBParameters(ИмяПланаОбмена, КодУзла, СообщениеОбОшибке, ОбластьДанных); + + Иначе + + Возврат Прокси.GetIBParameters(ИмяПланаОбмена, КодУзла, СообщениеОбОшибке); + + КонецЕсли; + +КонецФункции + +// Соответствует операции GetContinuousOperationStatus +Функция ПолучитьСтатусДлительнойОперации(Прокси, ВерсияПрокси, СтруктураНастроекОбмена, ПараметрыОбмена, СтрокаСообщенияОбОшибке) Экспорт + + Если Версия3_0_2_1(ВерсияПрокси) Тогда + + Возврат Прокси.GetContinuousOperationStatus(ПараметрыОбмена.ИдентификаторОперации, + СтрокаСообщенияОбОшибке, + СтруктураНастроекОбмена.НастройкиТранспорта.WSОбластьДанныхКорреспондента); + + Иначе + + Возврат Прокси.GetContinuousOperationStatus(ПараметрыОбмена.ИдентификаторОперации, СтрокаСообщенияОбОшибке); + + КонецЕсли; + +КонецФункции + +// Соответствует операции PutMessageForDataMatching +Процедура ПоместитьСообщениеДляСопоставленияДанных(Прокси, ВерсияПрокси, СтруктураНастроекОбмена, ИдентификаторФайлаСтрокой) Экспорт + + Если Версия3_0_2_1(ВерсияПрокси) Тогда + + Прокси.PutMessageForDataMatching(СтруктураНастроекОбмена.ИмяПланаОбмена, + СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, + ИдентификаторФайлаСтрокой, + СтруктураНастроекОбмена.НастройкиТранспорта.WSОбластьДанныхКорреспондента); + + + Иначе + + Прокси.PutMessageForDataMatching(СтруктураНастроекОбмена.ИмяПланаОбмена, + СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, + ИдентификаторФайлаСтрокой); + + КонецЕсли; + +КонецПроцедуры + +// Соответствует операции RemoveExchangeNode +Процедура УдалитьУзелОбмена(Прокси, ВерсияПрокси, СтруктураНастроекОбмена) Экспорт + + Если Версия3_0_2_1(ВерсияПрокси) Тогда + + Прокси.RemoveExchangeNode(СтруктураНастроекОбмена.ИмяПланаОбмена, + СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, + СтруктураНастроекОбмена.НастройкиТранспорта.WSОбластьДанныхКорреспондента); + + Иначе + + Прокси.RemoveExchangeNode(СтруктураНастроекОбмена.ИмяПланаОбмена, СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод); + + КонецЕсли; + +КонецПроцедуры + +// Соответствует операции CreateExchangeNode +Процедура СоздатьУзелОбмена(Прокси, ВерсияПрокси, ПараметрыПодключения, ОбластьДанных) Экспорт + + Сериализатор = Новый СериализаторXDTO(Прокси.ФабрикаXDTO); + + Если Версия3_0_2_1(ВерсияПрокси) Тогда + + Прокси.CreateExchangeNode(Сериализатор.ЗаписатьXDTO(ПараметрыПодключения), ОбластьДанных); + + Иначе + + Прокси.CreateExchangeNode(Сериализатор.ЗаписатьXDTO(ПараметрыПодключения)); + + КонецЕсли; + +КонецПроцедуры + +// Возвращаемое значение: +// Строка +// +Функция СобытиеЖурналаРегистрацииУстановкаПодключенияКWebСервису() Экспорт + + Возврат НСтр("ru = 'Обмен данными.Установка подключения к web-сервису'", ОбщегоНазначения.КодОсновногоЯзыка()); + +КонецФункции + +// Возвращаемое значение: +// Строка +// +Функция СобытиеЖурналаРегистрацииУдалениеВременногоФайла() Экспорт + + Возврат НСтр("ru = 'Обмен данными.Удаление временного файла'", ОбщегоНазначения.КодОсновногоЯзыка()); + +КонецФункции + +// Возвращаемое значение: +// Строка +// +Функция СобытиеЖурналаРегистрацииИзменениеТранспортаНаWS() Экспорт + + Возврат НСтр("ru = 'Обмен данными.Изменение транспорта на WS'", ОбщегоНазначения.КодОсновногоЯзыка()); + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ОжиданиеЗавершенияОперации(СтруктураНастроекОбмена, ПараметрыОбмена, Прокси, ПараметрыПрокси, ДействиеПриОбменеВЭтойИБ = Неопределено) + + Если ПараметрыОбмена.ИнтервалОжиданияНаСервере = 0 Тогда + + Если ДействиеПриОбменеВЭтойИБ <> Неопределено Тогда + + // В этой ИБ "Загрузка", значит в корреспонденте "Выгрузка" + Если ДействиеПриОбменеВЭтойИБ = Перечисления.ДействияПриОбмене.ЗагрузкаДанных Тогда + + ДействиеВКорреспондентеСтрокой = НСтр("ru ='выгрузка'", ОбщегоНазначения.КодОсновногоЯзыка()); + + Иначе + + ДействиеВКорреспондентеСтрокой = НСтр("ru ='загрузка'", ОбщегоНазначения.КодОсновногоЯзыка()); + + КонецЕсли; + + ШаблонСообщения = НСтр("ru = 'Ожидание выполнения операции (%1 данных в базе-корреспонденте)...'", ОбщегоНазначения.КодОсновногоЯзыка()); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СтрШаблон(ШаблонСообщения, ДействиеВКорреспондентеСтрокой), СтруктураНастроекОбмена); + + КонецЕсли; + + Возврат; + + КонецЕсли; + + Пока ПараметрыОбмена.ДлительнаяОперация Цикл // Замена рекурсии + + ОбменДаннымиСервер.Пауза(ПараметрыОбмена.ИнтервалОжиданияНаСервере); + + СтрокаСообщенияОбОшибке = ""; + + СостояниеОперации = ПолучитьСтатусДлительнойОперации(Прокси, ПараметрыПрокси.ТекущаяВерсия, + СтруктураНастроекОбмена, ПараметрыОбмена, СтрокаСообщенияОбОшибке); + + Если СостояниеОперации = "Active" Тогда + + ПараметрыОбмена.ИнтервалОжиданияНаСервере = Мин(ПараметрыОбмена.ИнтервалОжиданияНаСервере + 30, 180); + + ИначеЕсли СостояниеОперации = "Completed" Тогда + + ПараметрыОбмена.ИнтервалОжиданияНаСервере = 15; + ПараметрыОбмена.ДлительнаяОперация = Ложь; + ПараметрыОбмена.ИдентификаторОперации = Неопределено; + + Иначе + + ВызватьИсключение СтрШаблон(НСтр("ru = 'Ошибка в базе-корреспонденте:%1 %2'"), Символы.ПС, СтрокаСообщенияОбОшибке);; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Функция Версия3_0_2_1(ВерсияПрокси) + + Возврат ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияПрокси, "3.0.2.1") >= 0; + +КонецФункции + +// Соответствует операции PrepareGetFile +Функция ПодготовитьФайлДляПолучения(Прокси, ВерсияПрокси, СтруктураНастроекОбмена, + ИдентификаторФайла, РазмерЧасти, ИдентификаторСессии, КоличествоЧастей) + + Если Версия3_0_2_1(ВерсияПрокси) Тогда + + Возврат Прокси.PrepareGetFile(ИдентификаторФайла, + РазмерЧасти, + ИдентификаторСессии, + КоличествоЧастей, + СтруктураНастроекОбмена.НастройкиТранспорта.WSОбластьДанныхКорреспондента); + + Иначе + + Возврат Прокси.PrepareGetFile(ИдентификаторФайла, РазмерЧасти, ИдентификаторСессии, КоличествоЧастей); + + КонецЕсли; + +КонецФункции + +// Соответствует операции GetFilePart +Процедура ПолучитьЧастьФайла(Прокси, ВерсияПрокси, СтруктураНастроекОбмена, ИдентификаторСессии, НомерЧасти, ДанныеЧасти) + + Если Версия3_0_2_1(ВерсияПрокси) Тогда + + Прокси.GetFilePart(ИдентификаторСессии, + НомерЧасти, ДанныеЧасти, + СтруктураНастроекОбмена.НастройкиТранспорта.WSОбластьДанныхКорреспондента); + + Иначе + + Прокси.GetFilePart(ИдентификаторСессии, НомерЧасти, ДанныеЧасти); + + КонецЕсли; + +КонецПроцедуры + +// Соответствует операции PutFilePart +Процедура ПоместитьЧастьФайла(Прокси, ВерсияПрокси, СтруктураНастроекОбмена, ИдентификаторСессии, НомерЧасти, ДанныеФайла) + + Если Версия3_0_2_1(ВерсияПрокси) Тогда + + Прокси.PutFilePart(ИдентификаторСессии, НомерЧасти, ДанныеФайла, + СтруктураНастроекОбмена.НастройкиТранспорта.WSОбластьДанныхКорреспондента); + + Иначе + + Прокси.PutFilePart(ИдентификаторСессии, НомерЧасти, ДанныеФайла); + + КонецЕсли; + +КонецПроцедуры + +// Соответствует операции SaveFileFromParts +Процедура СобратьФайлИзЧастей(Прокси, ВерсияПрокси, СтруктураНастроекОбмена, ИдентификаторСессии, КоличествоЧастей, ИдентификаторФайла) + + Если Версия3_0_2_1(ВерсияПрокси) Тогда + + Прокси.SaveFileFromParts(ИдентификаторСессии, КоличествоЧастей, ИдентификаторФайла, + СтруктураНастроекОбмена.НастройкиТранспорта.WSОбластьДанныхКорреспондента); + Иначе + + Прокси.SaveFileFromParts(ИдентификаторСессии, КоличествоЧастей, ИдентификаторФайла); + + КонецЕсли; + +КонецПроцедуры + +// Соответствует операции TestConnection +Функция ТестСоединения(Прокси, ВерсияПрокси, СтруктураНастроекОбмена, СообщениеОбОшибке) + + Если Версия3_0_2_1(ВерсияПрокси) Тогда + + Возврат Прокси.TestConnection( + СтруктураНастроекОбмена.ИмяПланаОбмена, + СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, + СообщениеОбОшибке, + СтруктураНастроекОбмена.НастройкиТранспорта.WSОбластьДанныхКорреспондента); + + Иначе + + Возврат Прокси.TestConnection(СтруктураНастроекОбмена.ИмяПланаОбмена, + СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, + СообщениеОбОшибке); + + КонецЕсли; + +КонецФункции + +Процедура ПроверитьНедопустимыеСимволыВИмениПользователяWSПрокси(Знач ИмяПользователя) + + НедопустимыеСимволы = НедопустимыеСимволыВИмениПользователяWSПрокси(); + + Если СтрокаСодержитСимвол(ИмяПользователя, НедопустимыеСимволы) Тогда + + СтрокаСообщения = НСтр("ru = 'В имени пользователя %1 содержатся недопустимые символы. + |Имя пользователя не должно содержать символы %2.'"); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ИмяПользователя, НедопустимыеСимволы); + + ВызватьИсключение СтрокаСообщения; + + КонецЕсли; + +КонецПроцедуры + +Функция СтрокаСодержитСимвол(Знач Строка, Знач СтрокаСимволов) + + Для Индекс = 1 По СтрДлина(СтрокаСимволов) Цикл + Символ = Сред(СтрокаСимволов, Индекс, 1); + + Если СтрНайти(Строка, Символ) <> 0 Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Функция НедопустимыеСимволыВИмениПользователяWSПрокси() + + Возврат ":"; + +КонецФункции + +Процедура ПроверитьКорректностьФорматаАдресаWSПрокси(Знач АдресWSПрокси) + + ЭтоИнтернетАдрес = Ложь; + ДопустимыеПрефиксыWSПрокси = ДопустимыеПрефиксыWSПрокси(); + + Для Каждого Префикс Из ДопустимыеПрефиксыWSПрокси Цикл + Если Лев(НРег(АдресWSПрокси), СтрДлина(Префикс)) = НРег(Префикс) Тогда + ЭтоИнтернетАдрес = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Если Не ЭтоИнтернетАдрес Тогда + СтрокаПрефиксов = ""; + Для Каждого Префикс Из ДопустимыеПрефиксыWSПрокси Цикл + СтрокаПрефиксов = СтрокаПрефиксов + ?(ПустаяСтрока(СтрокаПрефиксов), """", " или """) + Префикс + """"; + КонецЦикла; + + СтрокаСообщения = НСтр("ru = 'Неверный формат адреса ""%1"". + |Адрес должен начинаться с префикса Интернет протокола %2 (например: ""http://myserver.com/service"").'"); + + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, АдресWSПрокси, СтрокаПрефиксов); + + ВызватьИсключение СтрокаСообщения; + КонецЕсли; + +КонецПроцедуры + +Функция ДопустимыеПрефиксыWSПрокси() + + Результат = Новый Массив(); + + Результат.Добавить("http"); + Результат.Добавить("https"); + + Возврат Результат; + +КонецФункции + +Функция СостояниеНастройкиСинхронизацииВКорреспонденте(Прокси, ПараметрыПрокси, СтруктураНастроек) + + Результат = Новый Структура; + Результат.Вставить("НастройкаСуществует", Ложь); + + Результат.Вставить("НастройкаСинхронизацииДанныхЗавершена", Истина); + Результат.Вставить("ПолученоСообщениеДляСопоставленияДанных", Ложь); + Результат.Вставить("ПоддерживаетсяСопоставлениеДанных", Истина); + + СтрокаСообщенияОбОшибке = ""; + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ПараметрыПрокси.ТекущаяВерсия, "2.0.1.6") >= 0 Тогда + + НастройкаСуществует = ТестСоединения(Прокси, ПараметрыПрокси.ТекущаяВерсия, СтруктураНастроек, СтрокаСообщенияОбОшибке); + + Если НастройкаСуществует + И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ПараметрыПрокси.ТекущаяВерсия, "3.0.1.1") >= 0 Тогда + + ПараметрыПриемникаПрокси = ПолучитьПараметрыИБ(Прокси, ПараметрыПрокси.ТекущаяВерсия, + СтруктураНастроек.ИмяПланаОбмена, + СтруктураНастроек.ТекущийУзелПланаОбменаКод, + СтрокаСообщенияОбОшибке, + СтруктураНастроек.НастройкиТранспорта.WSОбластьДанныхКорреспондента); + + ПараметрыПриемника = СериализаторXDTO.ПрочитатьXDTO(ПараметрыПриемникаПрокси); + + ЗаполнитьЗначенияСвойств(Результат, ПараметрыПриемника); + КонецЕсли; + + Результат.НастройкаСуществует = НастройкаСуществует; + Иначе + + ПараметрыПриемникаПрокси = ПолучитьПараметрыИБ(Прокси, ПараметрыПрокси.ТекущаяВерсия, + СтруктураНастроек.ИмяПланаОбмена, + СтруктураНастроек.ТекущийУзелПланаОбменаКод, + СтрокаСообщенияОбОшибке, + СтруктураНастроек.НастройкиТранспорта.WSОбластьДанныхКорреспондента); + + ПараметрыПриемника = ЗначениеИзСтрокиВнутр(ПараметрыПриемникаПрокси); + + Если ПараметрыПриемника.Свойство("УзелСуществует") Тогда + Результат.НастройкаСуществует = ПараметрыПриемника.УзелСуществует; + Иначе + Результат.НастройкаСуществует = Истина; + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ВКорреспондентеУстаревшийВариантНастроекОбмена(Прокси, ПараметрыПрокси, СостояниеНастройки, СтруктураНастроек, КодУзла, Отказ, СтрокаСообщенияОбОшибке = "") + + СостояниеНастройкиВарианта = Новый Структура(); + СостояниеНастройкиВарианта.Вставить("НастройкиТранспорта", СтруктураНастроек.НастройкиТранспорта); + + // Проверка возможности выполнения перехода. + Для Каждого ВариантНастройки Из УстаревшиеВариантыНастроекОбмена(СтруктураНастроек.УзелИнформационнойБазы) Цикл + + СостояниеНастройкиВарианта.Вставить("ИмяПланаОбмена", ВариантНастройки.ИмяПланаОбмена); + СостояниеНастройкиВарианта.Вставить("ТекущийУзелПланаОбменаКод", КодУзла); + + СостояниеНастройки = СостояниеНастройкиСинхронизацииВКорреспонденте( + Прокси, ПараметрыПрокси, СостояниеНастройкиВарианта); + + Если СостояниеНастройки.НастройкаСуществует Тогда + Если СтруктураНастроек.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных Тогда + СтруктураНастроек.ИмяПланаОбмена = ВариантНастройки.ИмяПланаОбмена; + Если КодУзла <> СтруктураНастроек.ТекущийУзелПланаОбменаКод Тогда + СтруктураНастроек.ТекущийУзелПланаОбменаКод = КодУзла; + КонецЕсли; + Иначе + // В этой ИБ выполнен переход на новый план обмена, в корреспонденте еще не выполнен. + // Получение данных необходимо отменить. + СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В программе ""%1"" выполняется обновление настроек синхронизации. + |Загрузка данных отменена. Запустите синхронизацию данных повторно.'"), + Строка(СтруктураНастроек.УзелИнформационнойБазы)); + Отказ = Истина; + КонецЕсли; + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Функция УстаревшиеВариантыНастроекОбмена(УзелОбмена) + + Результат = Новый Массив; + + ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелОбмена); + + ВариантНастройки = ""; + Если ОбщегоНазначения.ЕстьРеквизитОбъекта("ВариантНастройки", УзелОбмена.Метаданные()) Тогда + ВариантНастройки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(УзелОбмена, "ВариантНастройки"); + КонецЕсли; + + Если ЗначениеЗаполнено(ВариантНастройки) Тогда + Для Каждого ИмяСтарогоПланаОбмена Из ОбменДаннымиПовтИсп.ПланыОбменаБСП() Цикл + Если ИмяСтарогоПланаОбмена = ИмяПланаОбмена Тогда + Продолжить; + КонецЕсли; + Если ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(ИмяСтарогоПланаОбмена) Тогда + Продолжить; + КонецЕсли; + + НастройкиСтарогоПланаОбмена = ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(ИмяСтарогоПланаОбмена, + "ИмяПланаОбменаДляПереходаНаНовыйОбмен,ВариантыНастроекОбмена"); + + Если НастройкиСтарогоПланаОбмена.ИмяПланаОбменаДляПереходаНаНовыйОбмен = ИмяПланаОбмена Тогда + ВариантНастроек = НастройкиСтарогоПланаОбмена.ВариантыНастроекОбмена.Найти(ВариантНастройки, "ИдентификаторНастройки"); + Если Не ВариантНастроек = Неопределено Тогда + Результат.Добавить(Новый Структура("ИмяПланаОбмена, ИдентификаторНастройки", + ИмяСтарогоПланаОбмена, ВариантНастроек.ИдентификаторНастройки)); + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Устанавливает пароль синхронизации данных для заданного узла. +// Пароль сохраняется в параметре сеанса. +// +Процедура УстановитьПарольСинхронизацииДанных(Знач УзелИнформационнойБазы, Знач Пароль) + + УстановитьПривилегированныйРежим(Истина); + + ПаролиСинхронизацииДанных = Новый Соответствие; + + Для Каждого Элемент Из ПараметрыСеанса.ПаролиСинхронизацииДанных Цикл + + ПаролиСинхронизацииДанных.Вставить(Элемент.Ключ, Элемент.Значение); + + КонецЦикла; + + ПаролиСинхронизацииДанных.Вставить(УзелИнформационнойБазы, Пароль); + + ПараметрыСеанса.ПаролиСинхронизацииДанных = Новый ФиксированноеСоответствие(ПаролиСинхронизацииДанных); + +КонецПроцедуры + +// Сбрасывает пароль синхронизации данных для заданного узла. +// +Процедура СброситьПарольСинхронизацииДанных(Знач УзелИнформационнойБазы) + + УстановитьПарольСинхронизацииДанных(УзелИнформационнойБазы, Неопределено); + +КонецПроцедуры + +#КонецОбласти + diff --git a/SSL/src/CommonModules/ВызовОнлайнПоддержкиПереопределяемый/ВызовОнлайнПоддержкиПереопределяемый.mdo b/SSL/src/CommonModules/ОбменДаннымиВебСервис/ОбменДаннымиВебСервис.mdo similarity index 55% rename from SSL/src/CommonModules/ВызовОнлайнПоддержкиПереопределяемый/ВызовОнлайнПоддержкиПереопределяемый.mdo rename to SSL/src/CommonModules/ОбменДаннымиВебСервис/ОбменДаннымиВебСервис.mdo index 48a2c50aa..6a9b3090b 100644 --- a/SSL/src/CommonModules/ВызовОнлайнПоддержкиПереопределяемый/ВызовОнлайнПоддержкиПереопределяемый.mdo +++ b/SSL/src/CommonModules/ОбменДаннымиВебСервис/ОбменДаннымиВебСервис.mdo @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="88bf6f58-7943-42c4-bc0f-56b991590026"> - <name>ВызовОнлайнПоддержкиПереопределяемый</name> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="b20780cd-53d9-48bb-ac3f-2aa4eb6ab3c5"> + <name>ОбменДаннымиВебСервис</name> <synonym> <key>ru</key> - <value>Вызов онлайн-поддержки переопределяемый</value> + <value>Обмен данными веб сервис</value> </synonym> <server>true</server> <externalConnection>true</externalConnection> diff --git a/SSL/src/CommonModules/ОбменДаннымиВнешнееСоединение/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВнешнееСоединение/Module.bsl index 499b82c3f..9e97c6b3b 100644 --- a/SSL/src/CommonModules/ОбменДаннымиВнешнееСоединение/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиВнешнееСоединение/Module.bsl @@ -73,7 +73,7 @@ ОбменДаннымиСервер.ВыполнитьВыгрузкуДляУзлаИнформационнойБазыЧерезФайл(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ПолноеИмяФайлаСообщенияОбмена); Исключение Отказ = Истина; - СтрокаСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СтрокаСообщенияОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Иначе @@ -91,7 +91,7 @@ Исключение Отказ = Истина; - СтрокаСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СтрокаСообщенияОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; КонецЕсли; diff --git a/SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликация/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликация/Module.bsl new file mode 100644 index 000000000..81b7f7528 --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликация/Module.bsl @@ -0,0 +1,1458 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ВыполнитьОбменДаннымиПоСценарию(КодСценарияОбмена) Экспорт + + Если Не ЗначениеЗаполнено(КодСценарияОбмена) Тогда + ВызватьИсключение НСтр("ru = 'Не задан сценарий обмена данными.'"); + КонецЕсли; + + ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.СинхронизацияДанных); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Код", КодСценарияОбмена); + + Запрос.Текст = + "ВЫБРАТЬ + | СценарииОбменовДанными.Ссылка КАК Ссылка + |ИЗ + | Справочник.СценарииОбменовДанными КАК СценарииОбменовДанными + |ГДЕ + | СценарииОбменовДанными.Код = &Код + | И НЕ СценарииОбменовДанными.ПометкаУдаления"; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + + Сценарий = Выборка.Ссылка; + + Иначе + + СтрокаСообщения = НСтр("ru = 'Сценарий обмена данными с кодом %1 не найден.'"); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, КодСценарияОбмена); + ВызватьИсключение СтрокаСообщения; + + КонецЕсли; + + УдалитьУстаревшиеЗадачи(Сценарий); + + Если ОтключитьСценарийПриНеобходимости(Сценарий) Тогда + Возврат; + КонецЕсли; + + // Должны быть выполнены задачи из сценария из последнего запуска + Если Не ОчередьЗадачВыполнена(Сценарий) Тогда + Возврат; + КонецЕсли; + + ПерваяЗадача = Неопределено; + ЗаполнитьЗадачиПоСценарию(Сценарий, ПерваяЗадача); + + ВыполнитьОчередьЗадач(ПерваяЗадача); + +КонецПроцедуры + +Процедура ВыполнитьОбменДаннымиВручную(Узел, ПараметрыОбмена, ДополнениеВыгрузки = Неопределено) Экспорт + + УдалитьУстаревшиеЗадачи(, Истина); + + ИдентификаторОбмена = Строка(Новый УникальныйИдентификатор); + + ПараметрыОбмена = Новый Структура; + ПараметрыОбмена.Вставить("Узел", Узел); + ПараметрыОбмена.Вставить("ИдентификаторОбмена", ИдентификаторОбмена); + ПараметрыОбмена.Вставить("Отказ", Ложь); + ПараметрыОбмена.Вставить("СообщениеОбОшибке", ""); + + ПерваяЗадача = Неопределено; + ЗаполнитьЗадачиДляОбменаВручную(Узел, ИдентификаторОбмена, ПерваяЗадача, ДополнениеВыгрузки); + + ПараметрыПроцедуры = Новый Массив; + ПараметрыПроцедуры.Добавить(ПерваяЗадача); + + Ключ = ПерваяЗадача.ИдентификаторЗадачи; + + ПараметрыЗадания = Новый Структура; + ПараметрыЗадания.Вставить("Ключ", Лев(Ключ, 120)); + ПараметрыЗадания.Вставить("ИмяМетода" , "ОбменДаннымиВнутренняяПубликация.ВыполнитьОчередьЗадач"); + ПараметрыЗадания.Вставить("ОбластьДанных", ПараметрыСеанса.ОбластьДанныхЗначение); + ПараметрыЗадания.Вставить("Использование", Истина); + ПараметрыЗадания.Вставить("ЗапланированныйМоментЗапуска", ТекущаяУниверсальнаяДата()); + ПараметрыЗадания.Вставить("Параметры", ПараметрыПроцедуры); + + МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); + МодульОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания); + +КонецПроцедуры + +Процедура ВыполнитьОчередьЗадач(Задача, ЗадачаПред = "") Экспорт + + Если ТипЗнч(Задача) = Тип("Строка") Тогда + ТекЗадача = ЗадачаПоИдентификатору(Задача); + Иначе + ТекЗадача = Задача; + КонецЕсли; + + Отказ = Ложь; + Если ТекЗадача.НомерЗадачи = 1 Тогда + + СтруктураНастроекОбмена = НастройкиОбменаДляУзлаИнформационнойБазы(ТекЗадача.УзелИнформационнойБазы, ТекЗадача.Действие, Отказ); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + ОбменДаннымиСервер.ЗафиксироватьНачалоОбменаВРегистреСведений(СтруктураНастроекОбмена); + + СтрокаСообщения = НСтр("ru = 'Начало процесса обмена данными для узла %1'", ОбщегоНазначения.КодОсновногоЯзыка()); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, СтруктураНастроекОбмена.УзелИнформационнойБазыНаименование); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщения, СтруктураНастроекОбмена); + + КонецЕсли; + + // Действия, которые выполняются в базе источнике. После их выполнения сразу можно выполнить следующую задачу + ДействияВИсточнике = Новый Массив; + ДействияВИсточнике.Добавить(Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанных); + ДействияВИсточнике.Добавить(Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанных); + ДействияВИсточнике.Добавить(Перечисления.ДействияПриОбменеВнутренняяПубликация.ДополнительнаяРегистрация); + + Отказ = Ложь; + Пока Истина Цикл + + ПараметрыОбмена = ОбменДаннымиСервер.ПараметрыОбмена(); + ПараметрыОбмена.Вставить("ИдентификаторЗадачиПред", ЗадачаПред); + + ВыполнитьЗадачу(ТекЗадача, ПараметрыОбмена, Отказ); + + Если Не Отказ И ДействияВИсточнике.Найти(ТекЗадача.Действие) <> Неопределено Тогда + + ЗадачаПред = ТекЗадача.ИдентификаторЗадачи; + ТекЗадача = СледующаяЗадача(ТекЗадача.ИдентификаторЗадачи); + + Иначе + + Прервать; + + КонецЕсли; + + // Закончились задачи + Если ТекЗадача = Неопределено Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Функция ЗадачаПоИдентификатору(ИдентификаторЗадачи) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Задачи.ДатаСоздания КАК ДатаСоздания, + | Задачи.Сценарий КАК Сценарий, + | Задачи.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | Задачи.НомерЗадачи КАК НомерЗадачи, + | Задачи.ИдентификаторЗадачи КАК ИдентификаторЗадачи, + | Задачи.ИдентификаторОбмена КАК ИдентификаторОбмена, + | Задачи.Действие КАК Действие, + | Задачи.ЗавершенаУспешно КАК ЗавершенаУспешно, + | Задачи.ЗавершенаСОшибкой КАК ЗавершенаСОшибкой, + | Задачи.Ошибка КАК Ошибка, + | Задачи.Параметры КАК Параметры + |ИЗ + | РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи + |ГДЕ + | Задачи.ИдентификаторЗадачи = &ИдентификаторЗадачи"; + + Запрос.УстановитьПараметр("ИдентификаторЗадачи", ИдентификаторЗадачи); + + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + Результат = СтруктураЗадачи(); + ЗаполнитьЗначенияСвойств(Результат, Выборка); + Возврат Результат; + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции + +Функция СледующаяЗадача(ИдентификаторЗадачи) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ЗадачаСлед.ДатаСоздания КАК ДатаСоздания, + | ЗадачаСлед.Сценарий КАК Сценарий, + | ЗадачаСлед.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | ЗадачаСлед.НомерЗадачи КАК НомерЗадачи, + | ЗадачаСлед.ИдентификаторЗадачи КАК ИдентификаторЗадачи, + | ЗадачаСлед.ИдентификаторОбмена КАК ИдентификаторОбмена, + | ЗадачаСлед.Действие КАК Действие, + | ЗадачаСлед.ЗавершенаУспешно КАК ЗавершенаУспешно, + | ЗадачаСлед.ЗавершенаСОшибкой КАК ЗавершенаСОшибкой, + | ЗадачаСлед.Ошибка КАК Ошибка, + | ЗадачаСлед.Параметры КАК Параметры + |ИЗ + | РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задача + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК ЗадачаСлед + | ПО Задача.ИдентификаторОбмена = ЗадачаСлед.ИдентификаторОбмена + | И (Задача.НомерЗадачи + 1 = ЗадачаСлед.НомерЗадачи) + |ГДЕ + | Задача.ИдентификаторЗадачи = &ИдентификаторЗадачи"; + + Запрос.УстановитьПараметр("ИдентификаторЗадачи", ИдентификаторЗадачи); + + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + Результат = СтруктураЗадачи(); + ЗаполнитьЗначенияСвойств(Результат, Выборка); + Возврат Результат; + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции + +Функция ПоУзлуЗапланированОбмен(Узел, Сценарий = "", ИдентификаторОбмена = "") Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Задачи.Сценарий КАК Сценарий, + | Задачи.ИдентификаторОбмена КАК ИдентификаторОбмена + |ИЗ + | РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи + |ГДЕ + | Задачи.УзелИнформационнойБазы = &Узел + | И НЕ Задачи.ЗавершенаУспешно + | И НЕ Задачи.ЗавершенаСОшибкой + | + |УПОРЯДОЧИТЬ ПО + | Задачи.ДатаСоздания УБЫВ, + | Задачи.НомерЗадачи"; + + Запрос.УстановитьПараметр("Узел", Узел); + + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + + Сценарий = Выборка.Сценарий; + ИдентификаторОбмена = Выборка.ИдентификаторОбмена; + + Возврат Не ОчередьЗадачВыполнена(, Выборка.ИдентификаторОбмена); + + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +Процедура ОтменитьОчередьЗадач(Узел, Сценарий, ИдентификаторОбмена) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | Задачи.ДатаСоздания КАК ДатаСоздания, + | Задачи.Сценарий КАК Сценарий, + | Задачи.ИдентификаторОбмена КАК ИдентификаторОбмена + |ПОМЕСТИТЬ втПоследнийСценарий + |ИЗ + | РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи + |ГДЕ + | Задачи.ИдентификаторОбмена = &ИдентификаторОбмена + | + |УПОРЯДОЧИТЬ ПО + | ДатаСоздания УБЫВ + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Задачи.ДатаСоздания КАК ДатаСоздания, + | Задачи.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | Задачи.НомерЗадачи КАК НомерЗадачи, + | Задачи.ИдентификаторОбмена КАК ИдентификаторОбмена, + | Задачи.ИдентификаторЗадачи КАК ИдентификаторЗадачи + |ИЗ + | втПоследнийСценарий КАК втПоследнийСценарий + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи + | ПО втПоследнийСценарий.ДатаСоздания = Задачи.ДатаСоздания + | И втПоследнийСценарий.ИдентификаторОбмена = Задачи.ИдентификаторОбмена + | И (НЕ Задачи.ЗавершенаУспешно) + | И (НЕ Задачи.ЗавершенаСОшибкой) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Задачи.ИдентификаторЗадачи КАК ИдентификаторЗадачи, + | Задачи.Действие КАК Действие, + | Задачи.ЗавершенаУспешно КАК ЗавершенаУспешно, + | Задачи.ЗавершенаСОшибкой КАК ЗавершенаСОшибкой + |ИЗ + | втПоследнийСценарий КАК втПоследнийСценарий + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи + | ПО втПоследнийСценарий.ДатаСоздания = Задачи.ДатаСоздания + | И втПоследнийСценарий.ИдентификаторОбмена = Задачи.ИдентификаторОбмена"; + + Запрос.УстановитьПараметр("ИдентификаторОбмена", ИдентификаторОбмена); + + Результат = Запрос.ВыполнитьПакет(); + + Выборка = Результат[1].Выбрать(); + + Пока Выборка.Следующий() Цикл + + Запись = РегистрыСведений.ЗадачиОбменаДаннымиВнутренняяПубликация.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(Запись, Выборка); + Запись.Прочитать(); + + Если Запись.Выбран() Тогда + Запись.ЗавершенаСОшибкой = Истина; + Запись.Ошибка = НСтр("ru = 'Отменено пользователем'"); + Запись.Записать(); + КонецЕсли; + + КонецЦикла; + + ЗадачиИсточника = Новый Массив; + + Если ТипЗнч(Сценарий) = Тип("СправочникСсылка.СценарииОбменовДанными") Тогда + ЗадачиИсточника.Добавить(Сценарий.РегламентноеЗаданиеGUID); + КонецЕсли; + + ЗадачиПриемника = Новый Массив; + + Выборка = Результат[2].Выбрать(); + + Пока Выборка.Следующий() Цикл + + Если (Выборка.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанныхКорреспондент + Или Выборка.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанныхКорреспондент) + И Не Выборка.ЗавершенаУспешно Тогда + + ЗадачиПриемника.Добавить(Выборка.ИдентификаторЗадачи); + + ИначеЕсли Выборка.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанных + Или Выборка.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанных + Или Выборка.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ДополнительнаяРегистрация Тогда + + ЗадачиИсточника.Добавить(Выборка.ИдентификаторЗадачи); + + КонецЕсли; + + Если Не Выборка.ЗавершенаУспешно Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + УстановитьПривилегированныйРежим(Истина); + + МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); + + Для Каждого ИдентификаторЗадачи Из ЗадачиИсточника Цикл + + Отбор = Новый Структура("Ключ", ИдентификаторЗадачи); + Задания = МодульОчередьЗаданий.ПолучитьЗадания(Отбор); + + Если Задания.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + + УникальныйИдентификаторФЗ = Задания[0].Идентификатор.ИсполняющееФоновоеЗадание; + + Если Не ЗначениеЗаполнено(УникальныйИдентификаторФЗ) Тогда + Продолжить; + КонецЕсли; + + ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(УникальныйИдентификаторФЗ); + Если ФоновоеЗадание <> Неопределено Тогда + ФоновоеЗадание.Отменить(); + КонецЕсли; + + КонецЦикла; + + Если ЗадачиПриемника.Количество() > 0 Тогда + + Прокси = Неопределено; + ПараметрыПрокси = Новый Структура; + СтруктураНастроекОбмена = Неопределено; + Отказ = Ложь; + Ошибка = ""; + + СтруктураНастроекОбмена = НастройкиОбменаДляУзлаИнформационнойБазы(Узел, "ОтменаОперацииПользователем", Отказ); + ИнициализацияПрокси(Прокси, ПараметрыПрокси, СтруктураНастроекОбмена, Отказ, Ошибка); + + Прокси.StopTasks(СериализаторXDTO.ЗаписатьXDTO(ЗадачиПриемника), + СтруктураНастроекОбмена.НастройкиТранспорта.WSОбластьДанныхКорреспондента); + + КонецЕсли; + +КонецПроцедуры + +Процедура ОтметитьВыполнениеЗадачи(Задача, Ошибка) Экспорт + + Если ТипЗнч(Задача) = Тип("Строка") Тогда + ТекЗадача = ЗадачаПоИдентификатору(Задача); + Иначе + ТекЗадача = Задача; + КонецЕсли; + + Если ЗначениеЗаполнено(ТекЗадача) Тогда + + Запись = РегистрыСведений.ЗадачиОбменаДаннымиВнутренняяПубликация.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(Запись, ТекЗадача); + Запись.Прочитать(); + + Если Ошибка = "" Тогда + Запись.ЗавершенаУспешно = Истина; + Иначе + Запись.ЗавершенаСОшибкой = Истина; + Запись.Ошибка = Ошибка; + КонецЕсли; + + Запись.Записать(); + + КонецЕсли; + +КонецПроцедуры + +Процедура ПриОжиданииВыгрузкиДанных(ПараметрыОбмена, ПродолжитьОжидание) Экспорт + + Ошибка = ""; + ПродолжитьОжидание = Не ОчередьЗадачВыполнена(,ПараметрыОбмена.ИдентификаторОбмена, Ошибка); + + Если Ошибка <> "" Тогда + ПараметрыОбмена.Отказ = Истина; + ПараметрыОбмена.СообщениеОбОшибке = Ошибка; + КонецЕсли; + +КонецПроцедуры + +Процедура ФормаУзлаПриСозданииНаСервере(Форма, Отказ) Экспорт + + МодульНастройкиТранспортаОбменаДанными = РегистрыСведений["НастройкиТранспортаОбменаДанными"]; + НастройкиТранспорта = МодульНастройкиТранспортаОбменаДанными.НастройкиТранспорта(Форма.Объект.Ссылка); + + Если НастройкиТранспорта <> Неопределено Тогда + УстановитьФункциональныеОпцииДляУзла(Форма, НастройкиТранспорта); + НастроитьЭлементыФормыПоПереходуНаВебСервис(Форма, НастройкиТранспорта); + КонецЕсли; + +КонецПроцедуры + +#Область ЗадачиПриемника + +Процедура ВыполнитьВыгрузкуДляУзлаИнформационнойБазыВСервисПередачиФайлов(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторЗадачи) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ИмяФайлаСообщения = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( + ОбменДаннымиСервер.КаталогВременногоХранилищаФайлов(), + ОбменДаннымиСервер.УникальноеИмяФайлаСообщенияОбмена()); + + ПараметрыОбменаДанными = ОбменДаннымиСервер.ПараметрыОбменаДаннымиЧерезФайлИлиСтроку(); + + ПараметрыОбменаДанными.ПолноеИмяФайлаСообщенияОбмена = ИмяФайлаСообщения; + ПараметрыОбменаДанными.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных; + ПараметрыОбменаДанными.ИмяПланаОбмена = ИмяПланаОбмена; + ПараметрыОбменаДанными.КодУзлаИнформационнойБазы = КодУзлаИнформационнойБазы; + + ПредставлениеОшибки = ""; + Попытка + + ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными); + + ИмяФайлаДляПомещенияВХранилище = ИмяФайлаСообщения; + + ИмяФайлаДляПомещенияВХранилище = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( + ОбменДаннымиСервер.КаталогВременногоХранилищаФайлов(), + ОбменДаннымиСервер.УникальноеИмяФайлаСообщенияОбмена("zip")); + + Архиватор = Новый ЗаписьZipФайла(ИмяФайлаДляПомещенияВХранилище, , , , УровеньСжатияZIP.Максимальный); + Архиватор.Добавить(ИмяФайлаСообщения); + Архиватор.Записать(); + + Исключение + + ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ОтветныйВызов(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторЗадачи, ПредставлениеОшибки); + + УдалитьФайлы(ИмяФайлаСообщения); + ВызватьИсключение ПредставлениеОшибки; + + КонецПопытки; + + УдалитьФайлы(ИмяФайлаСообщения); + + ОбменДаннымиСервер.ПоместитьФайлВХранилище(ИмяФайлаДляПомещенияВХранилище, ИдентификаторЗадачи); + + ОтветныйВызов(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторЗадачи); + +КонецПроцедуры + +Процедура ВыполнитьЗагрузкуДляУзлаИнформационнойБазыИзСервисаПередачиФайлов(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторЗадачи, ИдентификаторФайла) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ИмяФайлаСообщения = ОбменДаннымиСервер.ПолучитьФайлИзХранилища(ИдентификаторФайла); + + ПараметрыОбменаДанными = ОбменДаннымиСервер.ПараметрыОбменаДаннымиЧерезФайлИлиСтроку(); + + ПараметрыОбменаДанными.ПолноеИмяФайлаСообщенияОбмена = ИмяФайлаСообщения; + ПараметрыОбменаДанными.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ЗагрузкаДанных; + ПараметрыОбменаДанными.ИмяПланаОбмена = ИмяПланаОбмена; + ПараметрыОбменаДанными.КодУзлаИнформационнойБазы = КодУзлаИнформационнойБазы; + + ПредставлениеОшибки = ""; + Попытка + + ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными); + + Исключение + + ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ОтветныйВызов(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторЗадачи, ПредставлениеОшибки); + + УдалитьФайлы(ИмяФайлаСообщения); + ВызватьИсключение ПредставлениеОшибки; + + КонецПопытки; + + УдалитьФайлы(ИмяФайлаСообщения); + + ОтветныйВызов(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторЗадачи); + +КонецПроцедуры + +#КонецОбласти + +#Область ДоступностьExchangeAdministrationManage_3_0_1_1 + +Функция ВСервисеДоступенExchangeAdministrationManage_3_0_1_1() Экспорт + + Если Не ОбщегоНазначения.РазделениеВключено() Тогда + Возврат Ложь; + КонецЕсли; + + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + + ПараметрыПодключения = Новый Структура; + УстановитьПривилегированныйРежим(Истина); + ПараметрыПодключения.Вставить("URL", МодульРаботаВМоделиСервиса.ВнутреннийАдресМенеджераСервиса()); + ПараметрыПодключения.Вставить("UserName", МодульРаботаВМоделиСервиса.ИмяСлужебногоПользователяМенеджераСервиса()); + ПараметрыПодключения.Вставить("Password", МодульРаботаВМоделиСервиса.ПарольСлужебногоПользователяМенеджераСервиса()); + УстановитьПривилегированныйРежим(Ложь); + + Версии = ОбщегоНазначения.ПолучитьВерсииИнтерфейса(ПараметрыПодключения, "ExchangeAdministrationManage"); + + Возврат Версии.Найти("3.0.1.1") <> Неопределено; + +КонецФункции + +#КонецОбласти + +Функция НастройкиОбменаДляУзлаИнформационнойБазы(Узел, Действие, Отказ) Экспорт + + Если Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанных + Или Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанныхКорреспондент Тогда + + ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ЗагрузкаДанных; + + ИначеЕсли Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанных + Или Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанныхКорреспондент Тогда + + ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных; + + Иначе + + ДействиеПриОбмене = Действие; + + КонецЕсли; + + СтруктураНастроекОбмена = ОбменДаннымиСервер.НастройкиОбменаДляУзлаИнформационнойБазы( + Узел, ДействиеПриОбмене, Перечисления.ВидыТранспортаСообщенийОбмена.WS, Ложь); + + Если СтруктураНастроекОбмена.Отказ Тогда + // Если настройка содержит ошибки, то обмен не производим; статус "Отменено". + ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Отказ = Истина; + Возврат Неопределено; + КонецЕсли; + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; + + Возврат СтруктураНастроекОбмена; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#Область Задачи + +Процедура УдалитьУстаревшиеЗадачи(Сценарий = Неопределено, РучнойОбмен = Ложь) + + // Оставляем N последних записей + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 5 + | Задачи.ДатаСоздания КАК ДатаСоздания + |ПОМЕСТИТЬ втДаты + |ИЗ + | РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи + |ГДЕ + | (&РучнойОбмен + | И ТИПЗНАЧЕНИЯ(Задачи.Сценарий) = ТИП(СТРОКА) + | ИЛИ НЕ &РучнойОбмен + | И Задачи.Сценарий = &Сценарий) + | + |УПОРЯДОЧИТЬ ПО + | ДатаСоздания УБЫВ + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Задачи.ДатаСоздания КАК ДатаСоздания, + | Задачи.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | Задачи.НомерЗадачи КАК НомерЗадачи, + | Задачи.ИдентификаторОбмена КАК ИдентификаторОбмена, + | Задачи.ИдентификаторЗадачи КАК ИдентификаторЗадачи + |ИЗ + | РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи + |ГДЕ + | Задачи.Сценарий = &Сценарий + | И НЕ Задачи.ДатаСоздания В + | (ВЫБРАТЬ + | втДаты.ДатаСоздания + | ИЗ + | втДаты)"; + + Запрос.УстановитьПараметр("Сценарий", Сценарий); + Запрос.УстановитьПараметр("РучнойОбмен", РучнойОбмен); + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + Запись = РегистрыСведений.ЗадачиОбменаДаннымиВнутренняяПубликация.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(Запись, Выборка); + Запись.Прочитать(); + + Если Запись.Выбран() Тогда + Запись.Удалить(); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Функция ОтключитьСценарийПриНеобходимости(Сценарий) + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 3 + | Задачи.ДатаСоздания КАК ДатаСоздания, + | Задачи.Сценарий КАК Сценарий, + | Задачи.ИдентификаторОбмена КАК ИдентификаторОбмена + |ПОМЕСТИТЬ втДаты + |ИЗ + | РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи + |ГДЕ + | Задачи.Сценарий = &Сценарий + | + |УПОРЯДОЧИТЬ ПО + | ДатаСоздания УБЫВ + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Задачи.ДатаСоздания КАК ДатаСоздания + |ИЗ + | втДаты КАК втДаты + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи + | ПО втДаты.ДатаСоздания = Задачи.ДатаСоздания + | И втДаты.ИдентификаторОбмена = Задачи.ИдентификаторОбмена + | И (Задачи.ЗавершенаСОшибкой)"; + + Запрос.УстановитьПараметр("Сценарий", Сценарий); + + Результат = Запрос.Выполнить().Выгрузить(); + + Если Результат.Количество() >= 3 Тогда + + СценарийОбъект = Сценарий.ПолучитьОбъект(); + СценарийОбъект.ИспользоватьРегламентноеЗадание = Ложь; + СценарийОбъект.ОтключенАвтоматически = Истина; + + НачатьТранзакцию(); + + Попытка + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.СценарииОбменовДанными"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Сценарий); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + Блокировка.Заблокировать(); + + СценарийОбъект.Записать(); + + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + + СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОтключениеСценария(), + УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); + + КонецПопытки; + + Возврат Истина; + + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +Функция ОчередьЗадачВыполнена(Сценарий = "", ИдентификаторОбмена = "", Ошибка = "") + + // Считаем, что сценарий (или ручной обмен) завершен, если для всех задач ЗавершеноУспешно = Истина, или есть ошибка + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Задачи.ИдентификаторЗадачи КАК ИдентификаторЗадачи, + | Задачи.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | Задачи.НомерЗадачи КАК НомерЗадачи, + | Задачи.Действие КАК Действие, + | Задачи.ЗавершенаУспешно КАК ЗавершенаУспешно, + | Задачи.ЗавершенаСОшибкой КАК ЗавершенаСОшибкой, + | Задачи.Ошибка КАК Ошибка + |ПОМЕСТИТЬ втЗадачи + |ИЗ + | РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи + |ГДЕ + | (Задачи.Сценарий = &Сценарий + | ИЛИ Задачи.ИдентификаторОбмена = &ИдентификаторОбмена) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | втЗадачи.ИдентификаторЗадачи КАК ИдентификаторЗадачи, + | втЗадачи.Действие КАК Действие, + | втЗадачи.Ошибка КАК Ошибка + |ИЗ + | втЗадачи КАК втЗадачи + |ГДЕ + | втЗадачи.ЗавершенаСОшибкой + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ИСТИНА КАК Выполнено + |ИЗ + | втЗадачи КАК втЗадачи + | + |ИМЕЮЩИЕ + | СУММА(ВЫБОР + | КОГДА втЗадачи.ЗавершенаУспешно + | ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ) = МАКСИМУМ(втЗадачи.НомерЗадачи) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ ПЕРВЫЕ 1 + | втЗадачи.ИдентификаторЗадачи КАК ИдентификаторЗадачи, + | втЗадачи.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | втЗадачи.Действие КАК Действие, + | втЗадачи.НомерЗадачи КАК НомерЗадачи + |ИЗ + | втЗадачи КАК втЗадачи + |ГДЕ + | НЕ втЗадачи.ЗавершенаУспешно + | И НЕ втЗадачи.ЗавершенаСОшибкой + | + |УПОРЯДОЧИТЬ ПО + | НомерЗадачи"; + + Запрос.УстановитьПараметр("Сценарий", Сценарий); + Запрос.УстановитьПараметр("ИдентификаторОбмена", ИдентификаторОбмена); + + Результат = Запрос.ВыполнитьПакет(); + + // Завершено с ошибкой + Выборка = Результат[1].Выбрать();; + Если Выборка.Следующий() Тогда + Ошибка = Выборка.Ошибка; + Возврат Истина; + КонецЕсли; + + // Все задачи завершены успешно + Выборка = Результат[2].Выбрать(); + Если Выборка.Следующий() Тогда + Возврат Истина; + КонецЕсли; + + // Текущая задача + Выборка = Результат[3].Выбрать(); + + Если Выборка.Следующий() Тогда + Возврат Ложь + КонецЕсли; + + Возврат Истина; + +КонецФункции + +Функция СтруктураЗадачи() + + Задача = Новый Структура; + Задача.Вставить("ДатаСоздания"); + Задача.Вставить("Сценарий"); + Задача.Вставить("УзелИнформационнойБазы"); + Задача.Вставить("НомерЗадачи"); + Задача.Вставить("ИдентификаторОбмена"); + Задача.Вставить("ИдентификаторЗадачи"); + Задача.Вставить("Действие"); + Задача.Вставить("ЗавершенаУспешно"); + Задача.Вставить("ЗавершенаСОшибкой"); + Задача.Вставить("Параметры"); + + Возврат Задача; + +КонецФункции + +Процедура ЗаполнитьЗадачиПоСценарию(Сценарий, ПерваяЗадача = Неопределено) + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | НастройкиОбмена.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | НастройкиОбмена.ВыполняемоеДействие КАК ВыполняемоеДействие + |ИЗ + | Справочник.СценарииОбменовДанными.НастройкиОбмена КАК НастройкиОбмена + |ГДЕ + | НастройкиОбмена.Ссылка = &Ссылка + | + |УПОРЯДОЧИТЬ ПО + | НастройкиОбмена.НомерСтроки"; + + Запрос.УстановитьПараметр("Ссылка", Сценарий); + + Выборка = Запрос.Выполнить().Выбрать(); // АПК:1328 - блокировка не требуется. + + НомерЗадачи = 1; + + Запись = СтруктураЗадачи(); + Запись.ДатаСоздания = ТекущаяУниверсальнаяДата(); + Запись.Сценарий = Сценарий; + Запись.ЗавершенаУспешно = Ложь; + Запись.ЗавершенаСОшибкой = Ложь; + Запись.ИдентификаторОбмена = Строка(Новый УникальныйИдентификатор); + + Набор = РегистрыСведений.ЗадачиОбменаДаннымиВнутренняяПубликация.СоздатьНаборЗаписей(); + + Пока Выборка.Следующий() Цикл + + Запись.Вставить("УзелИнформационнойБазы", Выборка.УзелИнформационнойБазы); + + Если Выборка.ВыполняемоеДействие = Перечисления.ДействияПриОбмене.ЗагрузкаДанных Тогда + + // + Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанныхКорреспондент; + Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор); + Запись.НомерЗадачи = НомерЗадачи; + + НоваяЗапись = Набор.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись); + + Если ПерваяЗадача = Неопределено Тогда + ПерваяЗадача = ОбщегоНазначения.СкопироватьРекурсивно(Запись, Ложь); + КонецЕсли; + + НомерЗадачи = НомерЗадачи + 1; + + // + Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанных; + Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор); + Запись.НомерЗадачи = НомерЗадачи; + + НоваяЗапись = Набор.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись); + + НомерЗадачи = НомерЗадачи + 1; + + Иначе + + // + Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанных; + Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор); + Запись.НомерЗадачи = НомерЗадачи; + + НоваяЗапись = Набор.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись); + + Если ПерваяЗадача = Неопределено Тогда + ПерваяЗадача = ОбщегоНазначения.СкопироватьРекурсивно(Запись, Ложь);; + КонецЕсли; + + НомерЗадачи = НомерЗадачи + 1; + + // + Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанныхКорреспондент; + Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор); + Запись.НомерЗадачи = НомерЗадачи; + + НоваяЗапись = Набор.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись); + + НомерЗадачи = НомерЗадачи + 1; + + КонецЕсли; + + КонецЦикла; + + Набор.Записать(Ложь); + +КонецПроцедуры + +Процедура ЗаполнитьЗадачиДляОбменаВручную(УзелИнформационнойБазы, ИдентификаторОбмена, ПерваяЗадача, ДополнениеВыгрузки) + + Запись = СтруктураЗадачи(); + Запись.ДатаСоздания = ТекущаяУниверсальнаяДата(); + Запись.УзелИнформационнойБазы = УзелИнформационнойБазы; + Запись.ЗавершенаУспешно = Ложь; + Запись.ЗавершенаСОшибкой = Ложь; + Запись.ИдентификаторОбмена = ИдентификаторОбмена; + + Набор = РегистрыСведений.ЗадачиОбменаДаннымиВнутренняяПубликация.СоздатьНаборЗаписей(); + + НомерЗадачи = 1; + + // Получение данных (UploadDataInt) + Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанныхКорреспондент; + Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор); + Запись.НомерЗадачи = НомерЗадачи; + НоваяЗапись = Набор.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись); + + НомерЗадачи = НомерЗадачи + 1; + + ПерваяЗадача = ОбщегоНазначения.СкопироватьРекурсивно(Запись, Ложь); + + // Получение данных (Загрузка) + Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанных; + Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор); + Запись.НомерЗадачи = НомерЗадачи; + НоваяЗапись = Набор.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись); + + НомерЗадачи = НомерЗадачи + 1; + + // Дополнительная регистрация + Если ДополнениеВыгрузки <> Неопределено Тогда + + Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ДополнительнаяРегистрация; + Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор); + Запись.НомерЗадачи = НомерЗадачи; + НоваяЗапись = Набор.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись); + НоваяЗапись.Параметры = Новый ХранилищеЗначения(ДополнениеВыгрузки); + + НомерЗадачи = НомерЗадачи + 1; + + КонецЕсли; + + // Отправка данных (Выгрузка) + Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанных; + Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор); + Запись.НомерЗадачи = НомерЗадачи; + НоваяЗапись = Набор.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись); + + НомерЗадачи = НомерЗадачи + 1; + + // Отправка данных (DownloadDataInt) + Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанныхКорреспондент; + Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор); + Запись.НомерЗадачи = НомерЗадачи; + НоваяЗапись = Набор.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись); + + Набор.Записать(Ложь); + +КонецПроцедуры + +Процедура ОтветныйВызов(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторЗадачи, Ошибка = "") + + Узел = ПланыОбмена[ИмяПланаОбмена].НайтиПоКоду(КодУзлаИнформационнойБазы); + НастройкиТранспорта = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспортаWS(Узел); + СтрокаСообщенияОбОшибке = ""; + + Прокси = ОбменДаннымиВебСервис.WSПроксиДляУзлаИнформационнойБазы(Узел, СтрокаСообщенияОбОшибке); + + Прокси.Callback(ИдентификаторЗадачи, Ошибка, НастройкиТранспорта.WSОбластьДанныхКорреспондента); + +КонецПроцедуры + +Процедура ВыполнитьЗадачу(Задача, ПараметрыОбмена, Отказ) Экспорт + + // Синхронизация может быть прервана пользователем + Если Задача.ЗавершенаСОшибкой Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + Прокси = Неопределено; + ПараметрыПрокси = Новый Структура; + СтруктураНастроекОбмена = Неопределено; + + Ошибка = ""; + Узел = Задача.УзелИнформационнойБазы; + Действие = Задача.Действие; + + Если Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанныхКорреспондент Тогда + + СтруктураНастроекОбмена = НастройкиОбменаДляУзлаИнформационнойБазы(Узел, Действие, Отказ); + ИнициализацияПрокси(Прокси, ПараметрыПрокси, СтруктураНастроекОбмена, Отказ, Ошибка); + ВыполнитьЗадачуВыгрузкаДанныхКорреспондент(Задача, Прокси, СтруктураНастроекОбмена, Отказ, Ошибка); + ОтметитьВыполнениеЗадачи(Задача, Ошибка); + + ИначеЕсли Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанных Тогда + + СтруктураНастроекОбмена = НастройкиОбменаДляУзлаИнформационнойБазы(Узел, Действие, Отказ); + ВыполнитьЗадачуЗагрузкаДанных(Задача, ПараметрыОбмена, СтруктураНастроекОбмена, Отказ, Ошибка); + ОтметитьВыполнениеЗадачи(Задача, Ошибка); + ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + ИначеЕсли Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанных Тогда + + СтруктураНастроекОбмена = НастройкиОбменаДляУзлаИнформационнойБазы(Узел, Действие, Отказ); + ИнициализацияПрокси(Прокси, ПараметрыПрокси, СтруктураНастроекОбмена, Отказ, Ошибка); + ВыполнитьЗадачуВыгрузкаДанных(Задача, Прокси, ПараметрыПрокси, СтруктураНастроекОбмена, Отказ, Ошибка); + ОтметитьВыполнениеЗадачи(Задача, Ошибка); + ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + ИначеЕсли Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанныхКорреспондент Тогда + + СтруктураНастроекОбмена = НастройкиОбменаДляУзлаИнформационнойБазы(Узел, Действие, Отказ); + ИнициализацияПрокси(Прокси, ПараметрыПрокси, СтруктураНастроекОбмена, Отказ, Ошибка); + ВыполнитьЗадачуЗагрузкаДанныхКорреспондент(Задача, Прокси, ПараметрыОбмена, СтруктураНастроекОбмена, Отказ, Ошибка) + + ИначеЕсли Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ДополнительнаяРегистрация Тогда + + ВыполнитьЗадачуДополнительнаяРегистрация(Задача, Отказ, Ошибка); + ОтметитьВыполнениеЗадачи(Задача, Ошибка); + + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьЗадачуВыгрузкаДанныхКорреспондент(Задача, Прокси, СтруктураНастроекОбмена, Отказ, Ошибка) + + Если Отказ Тогда + Возврат; + КонецЕсли; + + Попытка + + Прокси.UploadDataInt(СтруктураНастроекОбмена.ИмяПланаОбмена, СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, + Задача.ИдентификаторЗадачи, СтруктураНастроекОбмена.НастройкиТранспорта.WSОбластьДанныхКорреспондента); + + Исключение + + Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Отказ = Истина; + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Ошибка, СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + + КонецПопытки; + +КонецПроцедуры + +Процедура ВыполнитьЗадачуЗагрузкаДанных(Задача, ПараметрыОбмена, СтруктураНастроекОбмена, Отказ, Ошибка) + + Если Отказ Тогда + Возврат; + КонецЕсли; + + Попытка + + УИДФайлаСообщения = Новый УникальныйИдентификатор(ПараметрыОбмена.ИдентификаторЗадачиПред); + ФайлСообщенияОбмена = ОбменДаннымиВебСервис.ПолучитьФайлИзХранилищаВСервисе(УИДФайлаСообщения, + СтруктураНастроекОбмена.УзелИнформационнойБазы, 1024, ПараметрыОбмена.ПараметрыАутентификации); + + ОбменДаннымиСервер.ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ФайлСообщенияОбмена); + + Исключение + + Отказ = Истина; + Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Ошибка, СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + + КонецПопытки; + + Если РезультатВыполненияОбменаВыполненоСОшибкой(СтруктураНастроекОбмена, Отказ, Ошибка) Тогда + Возврат; + КонецЕсли; + + СообщениеПрочитано = ОбменДаннымиСервер.РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена); + + Если СообщениеПрочитано И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + РегистрыСведений.ОбработчикиСобытийСинхронизацииДанных.ВыполнитьОбработчики(СтруктураНастроекОбмена.УзелИнформационнойБазы, "ПослеПолученияДанных"); + КонецЕсли; + + Попытка + Если Не ПустаяСтрока(ФайлСообщенияОбмена) Тогда + УдалитьФайлы(ФайлСообщенияОбмена); + КонецЕсли; + Исключение + ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), + УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + +КонецПроцедуры + +Процедура ВыполнитьЗадачуВыгрузкаДанных(Задача, Прокси, ПараметрыПрокси, СтруктураНастроекОбмена, Отказ, Ошибка) + + Если Отказ Тогда + Возврат; + КонецЕсли; + + ВременныйКаталог = ПолучитьИмяВременногоФайла(); + СоздатьКаталог(ВременныйКаталог); + + ФайлСообщенияОбмена = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ВременныйКаталог, ОбменДаннымиСервер.УникальноеИмяФайлаСообщенияОбмена()); + + Попытка + ОбменДаннымиСервер.ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ФайлСообщенияОбмена); + Исключение + Отказ = Истина; + Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Ошибка, СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + КонецПопытки; + + Если РезультатВыполненияОбменаВыполненоСОшибкой(СтруктураНастроекОбмена, Отказ, Ошибка) Тогда + Возврат; + КонецЕсли; + + Если ОбменДаннымиСервер.РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) И Не Отказ Тогда + + Попытка + + ИдентификаторФайла = Задача.ИдентификаторЗадачи; + + ОбменДаннымиВебСервис.ПоместитьФайлВХранилищеВСервисе(Прокси, ПараметрыПрокси.ТекущаяВерсия, СтруктураНастроекОбмена, + ФайлСообщенияОбмена, СтруктураНастроекОбмена.УзелИнформационнойБазы, 1024, ИдентификаторФайла); + + Если РезультатВыполненияОбменаВыполненоСОшибкой(СтруктураНастроекОбмена, Отказ, Ошибка) Тогда + Возврат; + КонецЕсли; + + Попытка + УдалитьФайлы(ВременныйКаталог); + Исключение + ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), + УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Исключение + + Отказ = Истина; + Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Ошибка, СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьЗадачуЗагрузкаДанныхКорреспондент(Задача, Прокси, ПараметрыОбмена, СтруктураНастроекОбмена, Отказ, Ошибка) + + Если Отказ Тогда + Возврат; + КонецЕсли; + + Попытка + + Прокси.DownloadDataInt(СтруктураНастроекОбмена.ИмяПланаОбмена, СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, + Задача.ИдентификаторЗадачи, ПараметрыОбмена.ИдентификаторЗадачиПред, + СтруктураНастроекОбмена.НастройкиТранспорта.WSОбластьДанныхКорреспондента); + + Исключение + + Отказ = Истина; + Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Ошибка, СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + + КонецПопытки; + +КонецПроцедуры + +Процедура ВыполнитьЗадачуДополнительнаяРегистрация(Задача, Отказ, Ошибка) + + Если Отказ Тогда + Возврат; + КонецЕсли; + + ДополнениеВыгрузки = Задача.Параметры.Получить(); + + ДополнениеВыгрузкиОбъект = Обработки.ИнтерактивноеИзменениеВыгрузки.Создать(); + ЗаполнитьЗначенияСвойств(ДополнениеВыгрузкиОбъект, ДополнениеВыгрузки, , "ДополнительнаяРегистрация, ДополнительнаяРегистрацияСценарияУзла"); + + ДополнениеВыгрузкиОбъект.КомпоновщикОтбораВсехДокументов.ЗагрузитьНастройки(ДополнениеВыгрузки.КомпоновщикОтбораВсехДокументовНастройки); + + ОбменДаннымиСервер.ЗаполнитьТаблицуЗначений(ДополнениеВыгрузкиОбъект.ДополнительнаяРегистрация, ДополнениеВыгрузки.ДополнительнаяРегистрация); + ОбменДаннымиСервер.ЗаполнитьТаблицуЗначений(ДополнениеВыгрузкиОбъект.ДополнительнаяРегистрацияСценарияУзла, ДополнениеВыгрузки.ДополнительнаяРегистрацияСценарияУзла); + + Если Не ДополнениеВыгрузки.КомпоновщикВсехДокументов = Неопределено Тогда + ДополнениеВыгрузкиОбъект.АдресКомпоновщикаВсехДокументов = ПоместитьВоВременноеХранилище(ДополнениеВыгрузки.КомпоновщикВсехДокументов); + КонецЕсли; + + // Сохраняем настройки дополнения выгрузки. + ОбменДаннымиСервер.ИнтерактивноеИзменениеВыгрузкиСохранитьНастройки(ДополнениеВыгрузкиОбъект, + ОбменДаннымиСервер.ДополнениеВыгрузкиИмяАвтоСохраненияНастроек()); + + // Дополнительно регистрируем данные. + Попытка + ОбменДаннымиСервер.ИнтерактивноеИзменениеВыгрузкиЗарегистрироватьДополнительныеДанные(ДополнениеВыгрузкиОбъект); + Исключение + + Отказ = Истина; + + Информация = ИнформацияОбОшибке(); + + Ошибка = НСтр("ru = 'Возникла проблема при добавлении данных к выгрузке:'") + + Символы.ПС + КраткоеПредставлениеОшибки(Информация) + + Символы.ПС + НСтр("ru = 'Измените условия отбора.'"); + + ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(), + УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(Информация)); + + КонецПопытки; + +КонецПроцедуры + +#КонецОбласти + +#Область НастройкаФормыУзла + +Процедура УстановитьФункциональныеОпцииДляУзла(Форма, НастройкиТранспорта) + + УстановитьПривилегированныйРежим(Истина); + + Узел = Форма.Объект.Ссылка; + ВидТранспорта = НастройкиТранспорта.ВидТранспортаСообщенийОбменаПоУмолчанию; + + ИспользоватьСценарии = + ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WS + И ЗначениеЗаполнено(НастройкиТранспорта.WSКонечнаяТочкаКорреспондента); + + ИспользоватьНастройкиПодключения = + ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WS + Или ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим; + + ЗаписьНастроек = РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.СоздатьМенеджерЗаписи(); + ЗаписьНастроек.УзелИнформационнойБазы = Узел; + ЗаписьНастроек.Прочитать(); + + Если ЗаписьНастроек.ИспользоватьСценарииВМоделиСервиса <> ИспользоватьСценарии + Или ЗаписьНастроек.ИспользоватьНастройкиПодключенияВМоделиСервиса <> ИспользоватьНастройкиПодключения Тогда + + ЗаписьНастроек.ИспользоватьСценарииВМоделиСервиса = ИспользоватьСценарии; + ЗаписьНастроек.ИспользоватьНастройкиПодключенияВМоделиСервиса = ИспользоватьНастройкиПодключения; + + ЗаписьНастроек.Записать(); + + КонецЕсли; + + Форма.УстановитьПараметрыФункциональныхОпцийФормы(Новый Структура("ОбщиеНастройкиУзлов", Узел)) + +КонецПроцедуры + +Процедура НастроитьЭлементыФормыПоПереходуНаВебСервис(Форма, НастройкиТранспорта) + + Элементы = Форма.Элементы; + УзелСсылка = Форма.Объект.Ссылка; + + ЭтоОбменЧерезВебСервис = + НастройкиТранспорта <> Неопределено + И (НастройкиТранспорта.ВидТранспортаСообщенийОбменаПоУмолчанию = Перечисления.ВидыТранспортаСообщенийОбмена.WS + Или НастройкиТранспорта.ВидТранспортаСообщенийОбменаПоУмолчанию = Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим); + + ДоступенExchangeAdministrationManage_3_0_1_1 = ДляУзлаДоступенExchangeAdministrationManage_3_0_1_1(УзелСсылка) = Истина; + + Если Не Пользователи.ЭтоПолноправныйПользователь() + Или УзелСсылка.Пустая() + Или ЭтоОбменЧерезВебСервис + Или Не ДоступенExchangeAdministrationManage_3_0_1_1 + Или Не ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(УзелСсылка) + Или Не ОбменДаннымиСервер.НастройкаСинхронизацииЗавершена(УзелСсылка) Тогда + + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( + Форма.Элементы, + "ФормаОбщаяКомандаПомощникПереходаНаИнтернетВнутренняяПубликация", + "Видимость", + Ложь); + + Возврат; + + КонецЕсли; + + Элементы = Форма.Элементы; + + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( + Форма.Элементы, + "ФормаОбщаяКомандаПомощникПереходаНаИнтернетВнутренняяПубликация", + "ПоложениеВКоманднойПанели", + ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Настройки.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | Настройки.ПереходНаWS_Этап КАК ПереходНаWS_Этап + |ИЗ + | РегистрСведений.ОбщиеНастройкиУзловИнформационныхБаз КАК Настройки + |ГДЕ + | Настройки.УзелИнформационнойБазы = &Узел"; + + Запрос.УстановитьПараметр("Узел", УзелСсылка); + + Выборка = Запрос.Выполнить().Выбрать(); + + НеЗаконченПереходНаВебСервис = Выборка.Следующий() И Выборка.ПереходНаWS_Этап > 0; + НеПредлагатьПерейтиНаВебСервис = ОбменДаннымиВнутренняяПубликацияВызовСервера.ФлагНастройкиНеПредлагатьПерейтиНаВебСервис(УзелСсылка); + ТекстПанели = ""; + + Если НеЗаконченПереходНаВебСервис Тогда + + ТекстПанели = + НСтр("ru = '<br>Не завершен переход на обмен через Интернет (веб-сервис). + |<br> + |<br>Воспользуйтесь <a href=ФормаПомощникПереходаНаИнтернетВнутренняяПубликация>помощником</a> для завершения перехода.'"); + + ИначеЕсли Не НеПредлагатьПерейтиНаВебСервис Тогда + + ТекстПанели = + НСтр("ru = 'Для данной синхронизации есть возможность настроить обмен через Интернет (веб-сервис). + |<br>Это позволит ускорить обмен и более гибко настроить график синхронизации. + |<br>Для перехода на обмен по средством веб-сервиса, воспользуйтесь <a href=ФормаПомощникПереходаНаИнтернетВнутренняяПубликация>помощником перехода</a>. + |<br><br> + |<a href=НеПредлагатьПерейтиНаВебСервис>Больше не предлагать перейти на веб-сервис</a>. (Вызвать помощник перехода можно через меню <b>Еще<b>)'"); + + КонецЕсли; + + Если Не ПустаяСтрока(ТекстПанели) Тогда + + ИмяЭлемента = "ИнформацияОПереходеНаВебСервис"; + + Группа = Элементы.Вставить(ИмяЭлемента, Тип("ГруппаФормы"), Форма, Элементы.ФормаКоманднаяПанель); + Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа; + Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда; + Группа.ЦветФона = WebЦвета.БледноЗеленый; + Группа.ОтображатьЗаголовок = Ложь; + + ДекорацияОтступ = Элементы.Добавить("Отступ" + ИмяЭлемента, Тип("ДекорацияФормы"), Группа); + ДекорацияОтступ.Вид = ВидДекорацииФормы.Надпись; + + ДекорацияКартинка = Элементы.Добавить("Картинка" + ИмяЭлемента, Тип("ДекорацияФормы"), Группа); + ДекорацияКартинка.Вид = ВидДекорацииФормы.Картинка; + ДекорацияКартинка.Картинка = БиблиотекаКартинок.Информация; + ДекорацияКартинка.Высота = 3; + ДекорацияКартинка.Ширина = 5; + ДекорацияКартинка.РазмерКартинки = РазмерКартинки.Пропорционально; + + ФДок = Новый ФорматированныйДокумент; + ФДок.УстановитьHTML("<html>" + ТекстПанели + "</html>", Новый Структура); + + ДекорацияНадпись = Элементы.Добавить("Надпись" + ИмяЭлемента, Тип("ДекорацияФормы"), Группа); + ДекорацияНадпись.Вид = ВидДекорацииФормы.Надпись; + ДекорацияНадпись.АвтоМаксимальнаяШирина = Ложь; + ДекорацияНадпись.РастягиватьПоГоризонтали = Истина; + ДекорацияНадпись.Заголовок = ФДок.ПолучитьФорматированнуюСтроку(); + ДекорацияНадпись.УстановитьДействие("ОбработкаНавигационнойСсылки", "Подключаемый_ОбработкаНавигационнойСсылки"); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область Прочее + +Функция ДляУзлаДоступенExchangeAdministrationManage_3_0_1_1(Узел) + + Доступен = РегистрыСведений.НастройкиОбменаДаннымиXDTO.ЗначениеНастройкиКорреспондента(Узел, "ДоступенExchangeAdministrationManage_3_0_1_1"); + + Возврат Доступен = Истина; + +КонецФункции + +Процедура ИнициализацияПрокси(Прокси, ПараметрыПрокси, СтруктураНастроекОбмена, Отказ, Ошибка) + + Если Отказ Тогда + Возврат; + КонецЕсли; + + СостояниеНастройки = Неопределено; + ОбменДаннымиВебСервис.ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, СтруктураНастроекОбмена, + ПараметрыПрокси, Отказ, СостояниеНастройки, Ошибка); + + Если Отказ Тогда + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Ошибка, СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; + ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + КонецЕсли; + +КонецПроцедуры + +Функция СобытиеЖурналаРегистрацииОтключениеСценария() + + Возврат НСтр("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..4ce9d63d5 --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликация/ОбменДаннымиВнутренняяПубликация.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="ddac9d84-61b8-49e7-b468-e4aef4403d64"> + <name>ОбменДаннымиВнутренняяПубликация</name> + <synonym> + <key>ru</key> + <value>Обмен данными (внутренняя публикация)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликацияВызовСервера/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликацияВызовСервера/Module.bsl new file mode 100644 index 000000000..9e54b1cd6 --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликацияВызовСервера/Module.bsl @@ -0,0 +1,31 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +Функция ФлагНастройкиНеПредлагатьПерейтиНаВебСервис(ОбъектНастройки, Значение = Неопределено) Экспорт + + Если ТипЗнч(ОбъектНастройки) = Тип("Строка") Тогда + Ключ = "НеПредлагатьПерейтиНаВебСервис" + ОбъектНастройки; + Иначе + Ключ = "НеПредлагатьПерейтиНаВебСервис" + ОбъектНастройки.УникальныйИдентификатор(); + КонецЕсли; + + Если Значение = Неопределено Тогда + // Чтение + Возврат ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиПрограммы", Ключ, Ложь,, ИмяПользователя()); + КонецЕсли; + + ОписаниеНастроек = НСтр("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..ef41df1e1 --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликацияВызовСервера/ОбменДаннымиВнутренняяПубликацияВызовСервера.mdo @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="ae2eec04-8327-4c51-89d3-eb6b725d6e8b"> + <name>ОбменДаннымиВнутренняяПубликацияВызовСервера</name> + <synonym> + <key>ru</key> + <value>Обмен данными (внутренняя публикация) вызов сервера</value> + </synonym> + <server>true</server> + <serverCall>true</serverCall> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликацияКлиент/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликацияКлиент/Module.bsl new file mode 100644 index 000000000..31a23a785 --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликацияКлиент/Module.bsl @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 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..da7fa3591 --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиВнутренняяПубликацияКлиент/ОбменДаннымиВнутренняяПубликацияКлиент.mdo @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="350b262d-2b1f-43de-9994-6abfd2e4e761"> + <name>ОбменДаннымиВнутренняяПубликацияКлиент</name> + <synonym> + <key>ru</key> + <value>Обмен данными (внутренняя публикация) клиент</value> + </synonym> + <clientManagedApplication>true</clientManagedApplication> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl index e159ca00f..2afb57cc8 100644 --- a/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl @@ -43,7 +43,7 @@ Исключение Результат = "ЗавершеноАварийно"; ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Возврат Результат; @@ -279,7 +279,7 @@ Исключение - СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); СобытиеЖурналаРегистрации = НСтр("ru = 'Обмен данными.Загрузка расширения'", ОбщегоНазначения.КодОсновногоЯзыка()); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); diff --git a/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl index 113b13106..0dc97b3b7 100644 --- a/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl @@ -327,6 +327,27 @@ КонецПроцедуры +// Процедура-обработчик навигационной ссылки в форме узла для элементов созданных программно. +// Только при работе в модели сервиса. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения - узел плана обмена. +// Элемент - ЭлементыФормы +// НавигационнаяСсылка - Строка - сформированная навигационная ссылка +// СтандартнаяОбработка - Булево +// +Процедура ОбработкаНавигационнойСсылкиВФормеУзла(Форма, Элемент, НавигационнаяСсылка, СтандартнаяОбработка) Экспорт + + СтандартнаяОбработка = Ложь; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда + МодульОбменДаннымиВнутренняяПубликацияКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбменДаннымиВнутренняяПубликацияКлиент"); + МодульОбменДаннымиВнутренняяПубликацияКлиент.ОбработкаНавигационнойСсылкиВФормеУзла( + Форма, НавигационнаяСсылка, СтандартнаяОбработка); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс diff --git a/SSL/src/CommonModules/ОбменДаннымиКонтрольЗацикливания/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиКонтрольЗацикливания/Module.bsl new file mode 100644 index 000000000..4c6739903 --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиКонтрольЗацикливания/Module.bsl @@ -0,0 +1,698 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ЗагрузитьКонтурИзСообщения(КомпонентыОбмена, Header) Экспорт + + Если Не Header.Установлено("SynchronizationContour") Тогда + Возврат; + КонецЕсли; + + Если Header.SynchronizationContour <> Неопределено Тогда + + Дерево = Новый ДеревоЗначений; + Дерево.Колонки.Добавить("КодУзла"); + Дерево.Колонки.Добавить("КодУзлаКорреспондента"); + Дерево.Колонки.Добавить("ИмяУзла"); + Дерево.Колонки.Добавить("ИмяУзлаКорреспондента"); + Дерево.Колонки.Добавить("ПоследнееОбновление"); + Дерево.Колонки.Добавить("Префикс"); + Дерево.Колонки.Добавить("Зацикливание"); + + Для Каждого Node Из Header.SynchronizationContour.Node Цикл + + НовыйУзел = Дерево.Строки.Добавить(); + НовыйУзел.КодУзла = Node.Code; + НовыйУзел.ИмяУзла = Node.Name; + НовыйУзел.ПоследнееОбновление = Node.LastUpdate; + НовыйУзел.Префикс = Node.Prefix; + + Для Каждого CorrNode Из Node.CorrNodes.CorrNode Цикл + + НовыйКоррУзел = НовыйУзел.Строки.Добавить(); + НовыйКоррУзел.КодУзлаКорреспондента = CorrNode.Code; + НовыйКоррУзел.ИмяУзлаКорреспондента = CorrNode.Name; + НовыйКоррУзел.Зацикливание = CorrNode.Looping; + + КонецЦикла; + + КонецЦикла; + + ИмяПланаОбмена = КомпонентыОбмена.УзелКорреспондента.Метаданные().Имя; + + ОбновитьКонтурИзДерева(Дерево, ИмяПланаОбмена); + ЗаменитьПрефиксы(); + ПроверитьЗацикливание(ИмяПланаОбмена); + + КонецЕсли; + +КонецПроцедуры + +Процедура ВыгрузитьКонтурВСообщение(Header, ИмяПланаОбмена) Экспорт + + ОбновитьКонтур(ИмяПланаОбмена); + + КонтурСинхронизации = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(XMLБазоваяСхема(), "SynchronizationContour")); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Контур.КодУзла КАК КодУзла, + | Контур.КодУзлаКорреспондента КАК КодУзлаКорреспондента, + | Контур.ИмяУзла КАК ИмяУзла, + | Контур.ИмяУзлаКорреспондента КАК ИмяУзлаКорреспондента, + | Контур.ПоследнееОбновление КАК ПоследнееОбновление, + | Контур.Префикс КАК Префикс, + | Контур.Зацикливание КАК Зацикливание + |ИЗ + | РегистрСведений.КонтурСинхронизации КАК Контур + |ИТОГИ + | МАКСИМУМ(ИмяУзла), + | МАКСИМУМ(ПоследнееОбновление), + | МАКСИМУМ(Префикс) + |ПО + | КодУзла"; + + ВыборкаПоУзлам = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + + Пока ВыборкаПоУзлам.Следующий() Цикл + + Узел = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(XMLБазоваяСхема(), "Node")); + Узел.Code = ВыборкаПоУзлам.КодУзла; + Узел.Name = ВыборкаПоУзлам.ИмяУзла; + Узел.LastUpdate = ВыборкаПоУзлам.ПоследнееОбновление; + Узел.Prefix = ВыборкаПоУзлам.Префикс; + + КоррУзлы = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(XMLБазоваяСхема(), "CorrNodes")); + + ВыборкаПоКоррУзлам = ВыборкаПоУзлам.Выбрать(); + Пока ВыборкаПоКоррУзлам.Следующий() Цикл + + КоррУзел = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(XMLБазоваяСхема(), "CorrNode")); + КоррУзел.Code = ВыборкаПоКоррУзлам.КодУзлаКорреспондента; + КоррУзел.Name = ВыборкаПоКоррУзлам.ИмяУзлаКорреспондента; + КоррУзел.Looping = ВыборкаПоКоррУзлам.Зацикливание; + КоррУзлы.CorrNode.Добавить(КоррУзел); + + КонецЦикла; + + Если КоррУзлы.CorrNode.Количество() > 0 Тогда + Узел.CorrNodes = КоррУзлы; + Иначе + Узел.CorrNodes = Неопределено; + КонецЕсли; + + КонтурСинхронизации.Node.Добавить(Узел); + + КонецЦикла; + + Если КонтурСинхронизации.Node.Количество() > 0 Тогда + Header.SynchronizationContour = КонтурСинхронизации; + Иначе + Header.SynchronizationContour = Неопределено; + КонецЕсли; + +КонецПроцедуры + +Процедура ОбновитьКонтур(ИмяПланаОбмена) Экспорт + + ТекстЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | Контур.КодУзла КАК КодУзла, + | Контур.Префикс КАК Префикс + |ПОМЕСТИТЬ ВТ_Префиксы + |ИЗ + | РегистрСведений.КонтурСинхронизации КАК Контур + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Контур.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | Контур.КодУзла КАК КодУзла, + | Контур.КодУзлаКорреспондента КАК КодУзлаКорреспондента, + | Контур.ИмяУзла КАК ИмяУзла, + | Контур.ИмяУзлаКорреспондента КАК ИмяУзлаКорреспондента, + | Контур.ПоследнееОбновление КАК ПоследнееОбновление + |ПОМЕСТИТЬ ВТ_Контур + |ИЗ + | РегистрСведений.КонтурСинхронизации КАК Контур + |ГДЕ + | Контур.УзелИнформационнойБазы <> НЕОПРЕДЕЛЕНО + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Узлы.Ссылка КАК Ссылка, + | ЕСТЬNULL(ВТ_Префиксы.КодУзла, Узлы.Код) КАК Код, + | Узлы.Наименование КАК Наименование + |ПОМЕСТИТЬ ВТ_Узлы + |ИЗ + | &ПланОбмена КАК Узлы + | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Префиксы КАК ВТ_Префиксы + | ПО Узлы.Код = ВТ_Префиксы.Префикс + |ГДЕ + | Узлы.Ссылка <> &ЭтотУзел + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ИСТИНА КАК ЕстьУдаление + |ПОМЕСТИТЬ ВТ_ЕстьУдаление + |ИЗ + | ВТ_Контур КАК ВТ_Контур + | ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Узлы КАК ВТ_Узлы + | ПО ВТ_Контур.УзелИнформационнойБазы = ВТ_Узлы.Ссылка + |ГДЕ + | ВТ_Узлы.Ссылка ЕСТЬ NULL + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВТ_Узлы.Ссылка КАК Ссылка, + | ВТ_Узлы.Код КАК Код, + | ВТ_Узлы.Наименование КАК Наименование, + | ВТ_Контур.КодУзла КАК КодУзла, + | ВТ_Контур.КодУзлаКорреспондента КАК КодУзлаКорреспондента, + | ВТ_Контур.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | ВЫБОР + | КОГДА НЕ ВТ_Контур.УзелИнформационнойБазы ЕСТЬ NULL + | И НЕ ВТ_Узлы.Ссылка ЕСТЬ NULL + | И (ВТ_Контур.КодУзла <> &КодЭтогоУзла + | ИЛИ ВТ_Контур.ИмяУзла <> &НаименованиеЭтогоУзла + | ИЛИ ВТ_Контур.КодУзлаКорреспондента <> ВТ_Узлы.Код + | ИЛИ ВТ_Контур.ИмяУзлаКорреспондента <> ВТ_Узлы.Наименование) + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК ОбновитьРеквизиты, + | ВЫБОР + | КОГДА ВТ_Контур.УзелИнформационнойБазы ЕСТЬ NULL + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК ДобавитьУзелВКонтур, + | ВЫБОР + | КОГДА ВТ_Узлы.Ссылка ЕСТЬ NULL + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК УдалитьУзелИзКонтура, + | ВЫБОР + | КОГДА ЕСТЬNULL(ВТ_ЕстьУдаление.ЕстьУдаление, ЛОЖЬ) + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК УстановитьПоследнееОбновление + |ИЗ + | ВТ_Контур КАК ВТ_Контур + | ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Узлы КАК ВТ_Узлы + | ПО ВТ_Контур.УзелИнформационнойБазы = ВТ_Узлы.Ссылка + | ПОЛНОЕ СОЕДИНЕНИЕ ВТ_ЕстьУдаление КАК ВТ_ЕстьУдаление + | ПО (ИСТИНА)"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПланОбмена", "ПланОбмена." + ИмяПланаОбмена); + + ЭтотУзел = ОбменДаннымиПовтИсп.ПолучитьЭтотУзелПланаОбмена(ИмяПланаОбмена); + Префикс = Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Получить(); + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("ЭтотУзел", ЭтотУзел); + Запрос.УстановитьПараметр("КодЭтогоУзла", ЭтотУзел.Код); + Запрос.УстановитьПараметр("НаименованиеЭтогоУзла", ЭтотУзел.Наименование); + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + Если Выборка.ОбновитьРеквизиты Тогда + + Запись = РегистрыСведений.КонтурСинхронизации.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(Запись, Выборка); + Запись.Прочитать(); + Запись.КодУзла = ЭтотУзел.Код; + Запись.ИмяУзла = ЭтотУзел.Наименование; + Запись.КодУзлаКорреспондента = Выборка.Код; + Запись.ИмяУзлаКорреспондента = Выборка.Наименование; + Запись.ПоследнееОбновление = УниверсальноеВремя(ТекущаяДатаСеанса()); + Запись.Префикс = Префикс; + Запись.Записать(); + + ИначеЕсли Выборка.ДобавитьУзелВКонтур Тогда + + Запись = РегистрыСведений.КонтурСинхронизации.СоздатьМенеджерЗаписи(); + Запись.УзелИнформационнойБазы = Выборка.Ссылка; + Запись.КодУзла = ЭтотУзел.Код; + Запись.ИмяУзла= ЭтотУзел.Наименование; + Запись.КодУзлаКорреспондента = Выборка.Код; + Запись.ИмяУзлаКорреспондента = Выборка.Наименование; + Запись.ПоследнееОбновление = УниверсальноеВремя(ТекущаяДатаСеанса()); + Запись.Префикс = Префикс; + Запись.Записать(); + + ИначеЕсли Выборка.УдалитьУзелИзКонтура Тогда + + Запись = РегистрыСведений.КонтурСинхронизации.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(Запись, Выборка); + Запись.Прочитать(); + Запись.Удалить(); + + УдалитьКоррУзел(Выборка.КодУзла, Выборка.КодУзлаКорреспондента); + + ИначеЕсли Выборка.УстановитьПоследнееОбновление Тогда + + Запись = РегистрыСведений.КонтурСинхронизации.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(Запись, Выборка); + Запись.Прочитать(); + Запись.ПоследнееОбновление = УниверсальноеВремя(ТекущаяДатаСеанса()); + Запись.Записать(); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ПроверитьЗацикливание(ИмяПланаОбмена, Режим = "ЗагрузкаКонтура") Экспорт + + ЭтотУзел = ПланыОбмена[ИмяПланаОбмена].ЭтотУзел(); + + Запрос = Новый Запрос; + Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + Запрос.Текст = + "ВЫБРАТЬ + | Узлы.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | Узлы.КодУзла КАК КодУзла, + | Узлы.КодУзлаКорреспондента КАК КодУзлаКорреспондента, + | Узлы.ИмяУзла КАК ИмяУзла, + | Узлы.ИмяУзлаКорреспондента КАК ИмяУзлаКорреспондента, + | Узлы.СинхронизацияУдалена КАК СинхронизацияУдалена, + | Узлы.ПоследнееОбновление КАК ПоследнееОбновление, + | Узлы.Префикс КАК Префикс, + | Узлы.Зацикливание КАК Зацикливание + |ПОМЕСТИТЬ ВТ_Контур + |ИЗ + | РегистрСведений.КонтурСинхронизации КАК Узлы + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КонтурСинхронизации КАК КоррУзлы + | ПО Узлы.КодУзла = КоррУзлы.КодУзлаКорреспондента + | И Узлы.КодУзлаКорреспондента = КоррУзлы.КодУзла"; + + Запрос.Выполнить(); + + Если Режим = "ЗагрузкаКонтура" Тогда + + // Если зацикливание было раньше определено в другой базе, и эта база участвует в нем, + // то не устанавливаем признак зацикливания в этом узле + + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | Контур.КодУзла КАК КодУзла + |ИЗ + | ВТ_Контур КАК Контур + |ГДЕ + | Контур.УзелИнформационнойБазы = НЕОПРЕДЕЛЕНО + | И Контур.КодУзлаКорреспондента = &КодУзла + | И Контур.Зацикливание"; + + Запрос.УстановитьПараметр("КодУзла", ЭтотУзел.Код); + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + Возврат; + КонецЕсли; + + КонецЕсли; + + // + Запрос.Текст = + "ВЫБРАТЬ + | Контур.КодУзла КАК КодУзла, + | Контур.КодУзлаКорреспондента КАК КодУзлаКорреспондента, + | Контур.ИмяУзла КАК ИмяУзла, + | Контур.ИмяУзлаКорреспондента КАК ИмяУзлаКорреспондента + |ИЗ + | ВТ_Контур КАК Контур + |ИТОГИ + | МАКСИМУМ(ИмяУзла) + |ПО + | КодУзла"; + + КонтурСинхронизации = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); + + СписокУзлов = ПроверитьЗацикливаниеРекурсивно(КонтурСинхронизации, ЭтотУзел.Код); + + Если СписокУзлов = Неопределено Тогда + СнятьПризнакЗацикливания(); + Иначе + УстановитьПризнакЗацикливания(СписокУзлов); + КонецЕсли; + +КонецПроцедуры + +Функция ЕстьЗацикливание() Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | КонтурСинхронизации.УзелИнформационнойБазы КАК УзелИнформационнойБазы + |ИЗ + | РегистрСведений.КонтурСинхронизации КАК КонтурСинхронизации + |ГДЕ + | КонтурСинхронизации.Зацикливание"; + + Результат = Запрос.Выполнить(); + + Возврат Не Результат.Пустой(); + +КонецФункции + +Функция УзелЗациклен(УзелИнформационнойБазы) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | КонтурСинхронизации.УзелИнформационнойБазы КАК УзелИнформационнойБазы + |ИЗ + | РегистрСведений.КонтурСинхронизации КАК КонтурСинхронизации + |ГДЕ + | КонтурСинхронизации.Зацикливание + | И (КонтурСинхронизации.КодУзла = &КодУзла + | ИЛИ КонтурСинхронизации.КодУзлаКорреспондента = &КодУзла)"; + + Запрос.УстановитьПараметр("КодУзла", УзелИнформационнойБазы.Код); + + Результат = Запрос.Выполнить(); + + Возврат Не Результат.Пустой(); + +КонецФункции + +Функция ВсеЗацикленныеУзлыПредставление() Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Контур.ИмяУзла КАК ИмяУзла, + | Контур.ИмяУзлаКорреспондента КАК ИмяУзлаКорреспондента + |ПОМЕСТИТЬ ВТ_Контур + |ИЗ + | РегистрСведений.КонтурСинхронизации КАК Контур + |ГДЕ + | Контур.Зацикливание + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ВТ_Контур.ИмяУзла КАК ИмяУзла + |ИЗ + | ВТ_Контур КАК ВТ_Контур + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ВТ_Контур.ИмяУзлаКорреспондента + |ИЗ + | ВТ_Контур КАК ВТ_Контур"; + + МассивУзлов = Новый Массив; + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + ИмяУзла = Выборка.ИмяУзла; + МассивУзлов.Добавить(" - " + ИмяУзла); + КонецЦикла; + + Возврат СтрСоединить(МассивУзлов, Символы.ПС); + +КонецФункции + +Функция БазаСПриостановленнойРегистрациейПредставление() Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | Контур.ИмяУзла КАК ИмяУзла + |ИЗ + | РегистрСведений.КонтурСинхронизации КАК Контур + |ГДЕ + | Контур.Зацикливание"; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + Возврат Выборка.ИмяУзла; + Иначе + Возврат ""; + КонецЕсли; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПроверитьЗацикливаниеРекурсивно(КонтурСинхронизации, НачальныйУзел, ТекущийУзел = "", Знач Родитель = "", Знач ЦепочкаУзлов = Неопределено) + + Если ЦепочкаУзлов = Неопределено Тогда + ЦепочкаУзлов = Новый СписокЗначений; + Иначе + ЦепочкаУзлов.Добавить(ТекущийУзел); + КонецЕсли; + + Если ТекущийУзел = "" Тогда + ТекущийУзел = НачальныйУзел; + КонецЕсли; + + Если ЦепочкаУзлов.НайтиПоЗначению(НачальныйУзел) <> Неопределено Тогда + Возврат ЦепочкаУзлов; + КонецЕсли; + + Отбор = Новый Структура("КодУзла", ТекущийУзел); + Узлы = КонтурСинхронизации.Строки.НайтиСтроки(Отбор); + + Для Каждого Узел Из Узлы Цикл + Для Каждого КоррУзел Из Узел.Строки Цикл + + Если КоррУзел.КодУзлаКорреспондента = Родитель Тогда // Обмен между двумя соседними узлами + Продолжить; + КонецЕсли; + + Результат = ПроверитьЗацикливаниеРекурсивно(КонтурСинхронизации, НачальныйУзел, КоррУзел.КодУзлаКорреспондента, ТекущийУзел, ЦепочкаУзлов); + + Если Результат <> Неопределено Тогда + Возврат Результат; + КонецЕсли; + + КонецЦикла; + КонецЦикла; + +КонецФункции + +Процедура ОбновитьКонтурИзДерева(Дерево, ИмяПланаОбмена) + + МенеджерПланаОбмена = ПланыОбмена[ИмяПланаОбмена]; + ЭтотУзел = МенеджерПланаОбмена.ЭтотУзел(); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Контур.КодУзла КАК КодУзла, + | Контур.КодУзлаКорреспондента КАК КодУзлаКорреспондента, + | Контур.ИмяУзла КАК ИмяУзла, + | Контур.ИмяУзлаКорреспондента КАК ИмяУзлаКорреспондента, + | Контур.ПоследнееОбновление КАК ПоследнееОбновление, + | 1 КАК КоличествоЗаписей + |ИЗ + | РегистрСведений.КонтурСинхронизации КАК Контур + |ГДЕ + | Контур.УзелИнформационнойБазы = НЕОПРЕДЕЛЕНО + |ИТОГИ + | МАКСИМУМ(ПоследнееОбновление), + | СУММА(КоличествоЗаписей) + |ПО + | КодУзла"; + + КонтурСинхронизации = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); + + Для Каждого УзелДерева Из Дерево.Строки Цикл + + // Не обновляем данные текущего узла + Если УзелДерева.КодУзла = ЭтотУзел.Код Тогда + Продолжить; + КонецЕсли; + + Отбор = Новый Структура("КодУзла", УзелДерева.КодУзла); + УзлыКонтура = КонтурСинхронизации.Строки.НайтиСтроки(Отбор); + + // Удаление устаревших записей + Если УзлыКонтура.Количество() > 0 + И УзлыКонтура[0].ПоследнееОбновление < УзелДерева.ПоследнееОбновление + И УзлыКонтура[0].КоличествоЗаписей > 0 Тогда + + Для Каждого КоррУзелКонтура Из УзлыКонтура[0].Строки Цикл + + Запись = РегистрыСведений.КонтурСинхронизации.СоздатьМенеджерЗаписи(); + Запись.УзелИнформационнойБазы = Неопределено; + Запись.КодУзла = КоррУзелКонтура.КодУзла; + Запись.КодУзлаКорреспондента = КоррУзелКонтура.КодУзлаКорреспондента; + Запись.Прочитать(); + Запись.Удалить(); + + КонецЦикла; + + КонецЕсли; + + Если УзлыКонтура.Количество() = 0 + ИЛИ (УзлыКонтура[0].ПоследнееОбновление < УзелДерева.ПоследнееОбновление + И УзлыКонтура[0].КоличествоЗаписей > 0) Тогда + + Для Каждого КоррУзелДерева Из УзелДерева.Строки Цикл + + Запись = РегистрыСведений.КонтурСинхронизации.СоздатьМенеджерЗаписи(); + Запись.УзелИнформационнойБазы = Неопределено; + Запись.КодУзла = УзелДерева.КодУзла; + Запись.ИмяУзла = УзелДерева.ИмяУзла; + Запись.КодУзлаКорреспондента = КоррУзелДерева.КодУзлаКорреспондента; + Запись.ИмяУзлаКорреспондента = КоррУзелДерева.ИмяУзлаКорреспондента; + Запись.ПоследнееОбновление = УзелДерева.ПоследнееОбновление; + Запись.Префикс = УзелДерева.Префикс; + Запись.Зацикливание = КоррУзелДерева.Зацикливание; + Запись.Записать(); + + КонецЦикла; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаменитьПрефиксы() + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | Контур1.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | Контур1.КодУзла КАК КодУзла, + | Контур1.КодУзлаКорреспондента КАК КодУзлаКорреспондента, + | Контур2.КодУзла КАК НовыйКодУзлаКорреспондента + |ИЗ + | РегистрСведений.КонтурСинхронизации КАК Контур1 + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КонтурСинхронизации КАК Контур2 + | ПО Контур1.КодУзлаКорреспондента = Контур2.Префикс"; + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + Запись = РегистрыСведений.КонтурСинхронизации.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(Запись, Выборка); + Запись.Прочитать(); + Запись.КодУзлаКорреспондента = Выборка.НовыйКодУзлаКорреспондента; + Запись.ПоследнееОбновление = УниверсальноеВремя(ТекущаяДатаСеанса()); + Запись.Записать(); + + КонецЦикла; + +КонецПроцедуры + +Процедура УстановитьПризнакЗацикливания(СписокУзлов = Неопределено) + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Контур.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | Контур.КодУзла КАК КодУзла, + | Контур.КодУзлаКорреспондента КАК КодУзлаКорреспондента + |ИЗ + | РегистрСведений.КонтурСинхронизации КАК Контур + |ГДЕ + | Контур.УзелИнформационнойБазы <> НЕОПРЕДЕЛЕНО + | И Контур.КодУзлаКорреспондента В(&СписокУзлов)"; + + Запрос.УстановитьПараметр("СписокУзлов", СписокУзлов); + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + Запись = РегистрыСведений.КонтурСинхронизации.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(Запись, Выборка); + Запись.Прочитать(); + Запись.Зацикливание = Истина; + Запись.ПоследнееОбновление = УниверсальноеВремя(ТекущаяДатаСеанса()); + Запись.Записать(); + + РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.УстановитьЗацикливание(Выборка.УзелИнформационнойБазы, Истина); + + КонецЦикла; + + ОбновитьПовторноИспользуемыеЗначения(); + +КонецПроцедуры + +Процедура СнятьПризнакЗацикливания() + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Контур.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | Контур.КодУзла КАК КодУзла, + | Контур.КодУзлаКорреспондента КАК КодУзлаКорреспондента + |ИЗ + | РегистрСведений.КонтурСинхронизации КАК Контур"; + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + Запись = РегистрыСведений.КонтурСинхронизации.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(Запись, Выборка); + Запись.Прочитать(); + Запись.Зацикливание = Ложь; + Запись.ПоследнееОбновление = УниверсальноеВремя(ТекущаяДатаСеанса()); + Запись.Записать(); + + РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.УстановитьЗацикливание(Выборка.УзелИнформационнойБазы, Ложь, Ложь); + + КонецЦикла; + + ОбновитьПовторноИспользуемыеЗначения(); + +КонецПроцедуры + +Процедура УдалитьКоррУзел(КодУзла, КодУзлаКорреспондента) + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Контур.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | Контур.КодУзла КАК КодУзла, + | Контур.КодУзлаКорреспондента КАК КодУзлаКорреспондента + |ИЗ + | РегистрСведений.КонтурСинхронизации КАК Контур + |ГДЕ + | Контур.КодУзла = &КодУзла + | И Контур.КодУзлаКорреспондента = &КодУзлаКорреспондента"; + + Запрос.УстановитьПараметр("КодУзла", КодУзлаКорреспондента); + Запрос.УстановитьПараметр("КодУзлаКорреспондента", КодУзла); + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + Запись = РегистрыСведений.КонтурСинхронизации.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(Запись, Выборка); + Запись.Прочитать(); + Запись.Удалить(); + КонецЦикла; + +КонецПроцедуры + +Функция XMLБазоваяСхема() + + Возврат "http://www.1c.ru/SSL/Exchange/Message"; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбменДаннымиКонтрольЗацикливания/ОбменДаннымиКонтрольЗацикливания.mdo b/SSL/src/CommonModules/ОбменДаннымиКонтрольЗацикливания/ОбменДаннымиКонтрольЗацикливания.mdo new file mode 100644 index 000000000..65ae8a024 --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиКонтрольЗацикливания/ОбменДаннымиКонтрольЗацикливания.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="740a6d15-23e8-43a0-af3c-71a544f8fa4f"> + <name>ОбменДаннымиКонтрольЗацикливания</name> + <synonym> + <key>ru</key> + <value>Обмен данными контроль зацикливания</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/Module.bsl index 971d7c502..e7190e28d 100644 --- a/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/Module.bsl @@ -27,6 +27,8 @@ // Элементами массива являются объекты метаданных планов обмена. // // Пример: +// ПланыОбменаПодсистемы.Добавить(Метаданные.ПланыОбмена.ОбменБезИспользованияПравилКонвертации); +// ПланыОбменаПодсистемы.Добавить(Метаданные.ПланыОбмена.ОбменСБиблиотекойСтандартныхПодсистем); // ПланыОбменаПодсистемы.Добавить(Метаданные.ПланыОбмена.РаспределеннаяИнформационнаяБаза); // Процедура ПолучитьПланыОбмена(ПланыОбменаПодсистемы) Экспорт @@ -225,10 +227,12 @@ // общему модулю, в котором находятся обработчики выгрузки/загрузки для данной версии. // // Пример: -// ВерсииФормата.Вставить("1.2", МенеджерОбменаЧерезУниверсальныйФормат); +// ВерсииФормата.Вставить("1.2", <ИмяОбщегоМодуляСПравиламиКонвертации>); // Процедура ПриПолученииДоступныхВерсийФормата(ВерсииФормата) Экспорт - + + + КонецПроцедуры // Получает доступные для использования расширения универсального формата EnterpriseData. @@ -237,11 +241,11 @@ // РасширенияФормата - Соответствие из КлючИЗначение: // * Ключ - Строка - URI пространства имен схемы расширения формата. // * Значение - Строка - номер расширяемой версии формата. -// Пример: -// РасширенияФормата.Вставить("http://v8.1c.ru/edi/edi_stnd/_DemoEnterpriseDataExt/1.1", "1.8"); // Процедура ПриПолученииДоступныхРасширенийФормата(РасширенияФормата) Экспорт + + КонецПроцедуры // Вызывается в событии ПриЗаписи константы ЭтоАвтономноеРабочееМесто. diff --git a/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl index 1c05f98bf..982395f20 100644 --- a/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl @@ -748,48 +748,6 @@ Возврат Результат; КонецФункции -// Получает таблицу реквизитов регистрации объектов для механизма выборочной регистрации объектов. -// -// Параметры: -// ИмяОбъекта - Строка - полное имя объекта метаданного, например, "Справочник.Номенклатура". -// ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе. -// -// Возвращаемое значение: -// ТаблицаЗначений - таблица реквизитов регистрации ("ТаблицаРеквизитовРегистрации") -// упорядоченная по полю "Порядок", для заданного объекта метаданного. -// -Функция РеквизитыОбъектаДляРегистрации(ИмяОбъекта, ИмяПланаОбмена) Экспорт - - ТаблицаРеквизитовРегистрацииОбъектов = ОбменДаннымиСервер.ПолучитьПравилаВыборочнойРегистрацииОбъектовПС(); - - Отбор = Новый Структура; - Отбор.Вставить("ИмяПланаОбмена", ИмяПланаОбмена); - Отбор.Вставить("ИмяОбъекта", ИмяОбъекта); - - ТаблицаРеквизитовРегистрации = ТаблицаРеквизитовРегистрацииОбъектов.Скопировать(Отбор); - - ТаблицаРеквизитовРегистрации.Сортировать("Порядок Возр"); - - Возврат ТаблицаРеквизитовРегистрации; - -КонецФункции - -// Получает таблицу правил выборочной регистрации объектов из параметров сеанса. -// -// Параметры: -// Нет. -// -// Возвращаемое значение: -// ТаблицаЗначений - таблица реквизитов регистрации для всех объектов метаданных. -// -Функция ПолучитьПравилаВыборочнойРегистрацииОбъектовПС() Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Возврат ПараметрыСеанса.ПравилаВыборочнойРегистрацииОбъектов.Получить(); - -КонецФункции - // Получает предопределенный узел плана обмена. // // Параметры: @@ -1279,7 +1237,7 @@ СтруктураНастроек = Корреспондент; Иначе Если ОбменДаннымиПовтИсп.ЭтоУзелОбменаСообщениями(Корреспондент) Тогда - МодульНастройкиТранспортаОбменаСообщениями = РегистрыСведений["НастройкиТранспортаОбменаСообщениями"]; + МодульНастройкиТранспортаОбменаСообщениями = ОбщегоНазначения.ОбщийМодуль("РегистрыСведений.НастройкиТранспортаОбменаСообщениями"); СтруктураНастроек = МодульНастройкиТранспортаОбменаСообщениями.НастройкиТранспортаWS(Корреспондент); Иначе СтруктураНастроек = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспортаWS(Корреспондент); @@ -1364,6 +1322,12 @@ КонецФункции +Функция РегистрацияПриЗацикливании(УзелИнформационнойБазы) Экспорт + + Возврат РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.РегистрацияПриЗацикливании(УзелИнформационнойБазы); + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Инициализация структуры настроек обмена данными. @@ -1600,170 +1564,72 @@ Функция ЭтоРегистр(ПолноеИмяОбъекта) Экспорт - ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); Возврат ОбщегоНазначения.ЭтоРегистр(ОбъектМетаданных); КонецФункции Функция ЭтоДокумент(ПолноеИмяОбъекта) Экспорт - ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); Возврат ОбщегоНазначения.ЭтоДокумент(ОбъектМетаданных); КонецФункции Функция ЭтоСправочник(ПолноеИмяОбъекта) Экспорт - ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); Возврат ОбщегоНазначения.ЭтоСправочник(ОбъектМетаданных); КонецФункции Функция ЭтоПеречисление(ПолноеИмяОбъекта) Экспорт - ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); Возврат ОбщегоНазначения.ЭтоПеречисление(ОбъектМетаданных); КонецФункции Функция ЭтоПланВидовХарактеристик(ПолноеИмяОбъекта) Экспорт - ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); Возврат ОбщегоНазначения.ЭтоПланВидовХарактеристик(ОбъектМетаданных); КонецФункции Функция ЭтоБизнесПроцесс(ПолноеИмяОбъекта) Экспорт - ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); Возврат ОбщегоНазначения.ЭтоБизнесПроцесс(ОбъектМетаданных); КонецФункции Функция ЭтоЗадача(ПолноеИмяОбъекта) Экспорт - ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); Возврат ОбщегоНазначения.ЭтоЗадача(ОбъектМетаданных); КонецФункции Функция ЭтоПланСчетов(ПолноеИмяОбъекта) Экспорт - ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); Возврат ОбщегоНазначения.ЭтоПланСчетов(ОбъектМетаданных); КонецФункции Функция ЭтоПланВидовРасчета(ПолноеИмяОбъекта) Экспорт - ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); Возврат ОбщегоНазначения.ЭтоПланВидовРасчета(ОбъектМетаданных); КонецФункции Функция ЭтоКонстанта(ПолноеИмяОбъекта) Экспорт - ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); Возврат ОбщегоНазначения.ЭтоКонстанта(ОбъектМетаданных); КонецФункции -Функция ИменаКоллекцийПоИменамБазовыхТипов() - - ИменаКоллекций = Новый Соответствие; - ИменаКоллекций.Вставить(ВРег("Подсистема"), "Подсистемы"); - ИменаКоллекций.Вставить(ВРег("ОбщийМодуль"), "ОбщиеМодули"); - ИменаКоллекций.Вставить(ВРег("ПараметрСеанса"), "ПараметрыСеанса"); - ИменаКоллекций.Вставить(ВРег("Роль"), "Роли"); - ИменаКоллекций.Вставить(ВРег("ОбщийРеквизит"), "ОбщиеРеквизиты"); - ИменаКоллекций.Вставить(ВРег("ПланОбмена"), "ПланыОбмена"); - ИменаКоллекций.Вставить(ВРег("КритерийОтбора"), "КритерииОтбора"); - ИменаКоллекций.Вставить(ВРег("ПодпискаНаСобытие"), "ПодпискиНаСобытия"); - ИменаКоллекций.Вставить(ВРег("РегламентноеЗадание"), "РегламентныеЗадания"); - ИменаКоллекций.Вставить(ВРег("ФункциональнаяОпция"), "ФункциональныеОпции"); - ИменаКоллекций.Вставить(ВРег("ПараметрФункциональныхОпций"), "ПараметрыФункциональныхОпций"); - ИменаКоллекций.Вставить(ВРег("ОпределяемыйТип"), "ОпределяемыеТипы"); - ИменаКоллекций.Вставить(ВРег("ХранилищеНастроек"), "ХранилищаНастроек"); - ИменаКоллекций.Вставить(ВРег("ОбщаяФорма"), "ОбщиеФормы"); - ИменаКоллекций.Вставить(ВРег("ОбщаяКоманда"), "ОбщиеКоманды"); - ИменаКоллекций.Вставить(ВРег("ГруппаКоманд"), "ГруппыКоманд"); - ИменаКоллекций.Вставить(ВРег("ОбщийМакет"), "ОбщиеМакеты"); - ИменаКоллекций.Вставить(ВРег("ОбщаяКартинка"), "ОбщиеКартинки"); - ИменаКоллекций.Вставить(ВРег("ПакетXDTO"), "ПакетыXDTO"); - ИменаКоллекций.Вставить(ВРег("WebСервис"), "WebСервисы"); - ИменаКоллекций.Вставить(ВРег("HTTPСервис"), "HTTPСервисы"); - ИменаКоллекций.Вставить(ВРег("WSСсылка"), "WSСсылки"); - ИменаКоллекций.Вставить(ВРег("СервисИнтеграции"), "СервисыИнтеграции"); - ИменаКоллекций.Вставить(ВРег("ЭлементСтиля"), "ЭлементыСтиля"); - ИменаКоллекций.Вставить(ВРег("Стиль"), "Стили"); - ИменаКоллекций.Вставить(ВРег("Язык"), "Языки"); - ИменаКоллекций.Вставить(ВРег("Константа"), "Константы"); - ИменаКоллекций.Вставить(ВРег("Справочник"), "Справочники"); - ИменаКоллекций.Вставить(ВРег("Документ"), "Документы"); - ИменаКоллекций.Вставить(ВРег("Последовательность"), "Последовательности"); - ИменаКоллекций.Вставить(ВРег("ЖурналДокументов"), "ЖурналыДокументов"); - ИменаКоллекций.Вставить(ВРег("Перечисление"), "Перечисления"); - ИменаКоллекций.Вставить(ВРег("Отчет"), "Отчеты"); - ИменаКоллекций.Вставить(ВРег("Обработка"), "Обработки"); - ИменаКоллекций.Вставить(ВРег("ПланВидовХарактеристик"), "ПланыВидовХарактеристик"); - ИменаКоллекций.Вставить(ВРег("ПланСчетов"), "ПланыСчетов"); - ИменаКоллекций.Вставить(ВРег("ПланВидовРасчета"), "ПланыВидовРасчета"); - ИменаКоллекций.Вставить(ВРег("РегистрСведений"), "РегистрыСведений"); - ИменаКоллекций.Вставить(ВРег("РегистрНакопления"), "РегистрыНакопления"); - ИменаКоллекций.Вставить(ВРег("РегистрБухгалтерии"), "РегистрыБухгалтерии"); - ИменаКоллекций.Вставить(ВРег("РегистрРасчета"), "РегистрыРасчета"); - ИменаКоллекций.Вставить(ВРег("БизнесПроцесс"), "БизнесПроцессы"); - ИменаКоллекций.Вставить(ВРег("Задача"), "Задачи"); - ИменаКоллекций.Вставить(ВРег("ВнешниеИсточникиДанных"), "ВнешнийИсточникДанных"); - - Возврат Новый ФиксированноеСоответствие(ИменаКоллекций); - -КонецФункции - -Функция ОбъектМетаданныхПоПолномуИмени(ПолноеИмя) - - ПозицияТочки = СтрНайти(ПолноеИмя, "."); - ИмяБазовогоТипа = Лев(ПолноеИмя, ПозицияТочки - 1); - - ИменаКоллекций = ИменаКоллекцийПоИменамБазовыхТипов(); - Коллекция = ИменаКоллекций.Получить(ВРег(ИмяБазовогоТипа)); - - Если Коллекция <> Неопределено Тогда - Если Коллекция <> "Подсистемы" Тогда - ИмяОбъекта = Сред(ПолноеИмя, ПозицияТочки + 1); - ОбъектМетаданных = Метаданные[Коллекция].Найти(ИмяОбъекта); - Иначе - ИменаПодсистем = СтрРазделить(ВРег(ПолноеИмя), "."); - Количество = ИменаПодсистем.Количество(); - Подсистема = Метаданные; - ОбъектМетаданных = Неопределено; - Индекс = 0; - Пока Истина Цикл - Индекс = Индекс + 1; - Если Индекс >= Количество Тогда - Прервать; - КонецЕсли; - ИмяПодсистемы = ИменаПодсистем[Индекс]; - Подсистема = Подсистема.Подсистемы.Найти(ИмяПодсистемы); - Если Подсистема = Неопределено Тогда - Прервать; - КонецЕсли; - Индекс = Индекс + 1; - Если Индекс = Количество Тогда - ОбъектМетаданных = Подсистема; - Прервать; - КонецЕсли; - КонецЦикла; - КонецЕсли; - КонецЕсли; - - Если ОбъектМетаданных = Неопределено Тогда - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмя); - КонецЕсли; - - Возврат ОбъектМетаданных; - -КонецФункции - - #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбменДаннымиРегистрацияПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиРегистрацияПовтИсп/Module.bsl new file mode 100644 index 000000000..ef43d1700 --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиРегистрацияПовтИсп/Module.bsl @@ -0,0 +1,97 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +#Область ВыборочнаяРегистрацияДанных + +// Возвращает структуру с параметрами выборочной регистрации объектов, +// которая храниться в регистре сведений ПравилаДляОбменаДанными. +// +// Параметры: +// ИмяПланаОбмена - Строка - имя плана обмена. +// +// Возвращаемое значение: +// ПараметрыВыборочнойРегистрации - Структура +// - Неопределено - параметры выборочной регистрации объектов. +// В случае, если выборочная регистрация не используется для указанного плана +// обмена возвращаем Неопределено. +// +Функция ПараметрыВыборочнойРегистрацииПоИмениПланаОбмена(ИмяПланаОбмена) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ИмяПланаОбмена", ИмяПланаОбмена); + + Запрос.Текст = + "ВЫБРАТЬ + | ПравилаДляОбменаДанными.ПараметрыВыборочнойРегистрации КАК ПараметрыВыборочнойРегистрации + |ИЗ + | РегистрСведений.ПравилаДляОбменаДанными КАК ПравилаДляОбменаДанными + |ГДЕ + | ПравилаДляОбменаДанными.ВидПравил = ЗНАЧЕНИЕ(Перечисление.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов) + | И ПравилаДляОбменаДанными.ИмяПланаОбмена = &ИмяПланаОбмена"; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда // для одного плана обмена может быть только одна запись в правилах регистрации + + ПараметрыВыборочнойРегистрации = Выборка.ПараметрыВыборочнойРегистрации.Получить(); + + // ПараметрыВыборочнойРегистрации может содержать 2 ключа: + // - ЭтоПланОбменаXDTO; + // - ТаблицаРеквизитовРегистрации. + + Возврат ПараметрыВыборочнойРегистрации; + + КонецЕсли; + + Возврат ОбменДаннымиРегистрацияСервер.НовыеПараметрыВыборочнойРегистрацииДанныхПланаОбмена(ИмяПланаОбмена);; + +КонецФункции + +// Возвращаем режим выборочной регистрации, который установлен в настройках плана обмена. +// В случаях, когда настройка не заполнена возвращает значение по-умолчанию ("Модифицированность"). +// Если для плана обмена ОУФ указан неподдерживаемый режим "СогласноПравиламXML", то будет возвращено значение по-умолчанию. +// +// Возвращаемое значение: +// Строка - значение настройки плана обмена "РежимВыборочнойРегистрации". +// +// Описание значений: +// +// // Режим "Отключен" - все объекты считаем измененными, регистрируем без отбора +// (см. ОбменДаннымиРегистрацияСервер.РежимВыборочнойРегистрацииОтключен()); +// // Режим "СогласноПравиламXML" - регистрируем к обмену объекты, у которых есть изменения в полях ПКС +// (см. ОбменДаннымиРегистрацияСервер.РежимВыборочнойРегистрацииСогласноПравиламXML()); +// // Режим "Модифицированность" - регистрируем объекты, у которых свойство Модифицированность = Истина +// (см. ОбменДаннымиРегистрацияСервер.РежимВыборочнойРегистрацииМодифицированность()). +// +Функция РежимВыборочнойРегистрацииДанныхПланаОбмена(ИмяПланаОбмена) Экспорт + + ЗначениеНастройки = ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена, "РежимВыборочнойРегистрации"); + Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(ИмяПланаОбмена) + И ЗначениеНастройки = ОбменДаннымиРегистрацияСервер.РежимВыборочнойРегистрацииСогласноПравиламXML() Тогда + + // Для обменов в формате XDTO поддерживается только режим выборочной регистрации "Модифицированность". + // Что бы исправить неявную ошибку внедрения неявно исправим значение выборочной регистрации. + ЗначениеНастройки = ОбменДаннымиРегистрацияСервер.РежимВыборочнойРегистрацииМодифицированность(); + + ИначеЕсли ЗначениеНастройки = Неопределено Тогда + + // Если настройку не описывали, то возвращаем значение по умолчанию. + ЗначениеНастройки = ОбменДаннымиРегистрацияСервер.РежимВыборочнойРегистрацииМодифицированность(); + + КонецЕсли; + + Возврат ЗначениеНастройки; + +КонецФункции + +#КонецОбласти + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбменДаннымиРегистрацияПовтИсп/ОбменДаннымиРегистрацияПовтИсп.mdo b/SSL/src/CommonModules/ОбменДаннымиРегистрацияПовтИсп/ОбменДаннымиРегистрацияПовтИсп.mdo new file mode 100644 index 000000000..dfb4277a6 --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиРегистрацияПовтИсп/ОбменДаннымиРегистрацияПовтИсп.mdo @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="16080b3d-b385-4e44-af16-d1a357a2b842"> + <name>ОбменДаннымиРегистрацияПовтИсп</name> + <synonym> + <key>ru</key> + <value>Обмен данными повторное использование</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> + <returnValuesReuse>DuringSession</returnValuesReuse> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/ОбменДаннымиРегистрацияСервер/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиРегистрацияСервер/Module.bsl new file mode 100644 index 000000000..cf8e1a983 --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиРегистрацияСервер/Module.bsl @@ -0,0 +1,831 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +#Область ВыборочнаяРегистрацияДанных + +// Возвращает идентификатор режима выборочной регистрации, при котором данная функциональность отключена, +// т.е. все записываемые объекты считаются измененными. +// +// Возвращаемое значение: +// Строка - идентификатор режима выборочной регистрации "Отключен". +// +Функция РежимВыборочнойРегистрацииОтключен() Экспорт + + Возврат "Отключен"; + +КонецФункции + +// Возвращает идентификатор режима выборочной регистрации, при котором изменение объекта проверяется по +// свойству "Модифицированность" объекта информационной базы. +// +// Возвращаемое значение: +// Строка - идентификатор режима выборочной регистрации "Модифицированность". +// +Функция РежимВыборочнойРегистрацииМодифицированность() Экспорт + + Возврат "Модифицированность"; + +КонецФункции + +// Возвращает идентификатор режима выборочной регистрации, при котором изменение объекта проверяется +// сравнением значений реквизитов до и после записи. Список реквизитов готовиться по свойствам объектов, +// описанных в правилах конвертации. +// Режим поддерживается только для планов обменов УОП (см. документацию its.1c.ru). +// +// Возвращаемое значение: +// Строка - идентификатор режима выборочной регистрации "СогласноПравиламXML". +// +Функция РежимВыборочнойРегистрацииСогласноПравиламXML() Экспорт + + Возврат "СогласноПравиламXML"; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +#Область ВыборочнаяРегистрацияДанных + +Функция ИнициализацияТаблицыПравилВыборочнойРегистрацииОбъектов() Экспорт + + ОписаниеТипаЧисло = Новый ОписаниеТипов("Число"); + ОписаниеТипаСтрока = Новый ОписаниеТипов("Строка"); + ОписаниеТипаСтруктура = Новый ОписаниеТипов("Структура"); + + ТаблицаРезультат = Новый ТаблицаЗначений; + + ТаблицаРезультат.Колонки.Добавить("Порядок", ОписаниеТипаЧисло); + ТаблицаРезультат.Колонки.Добавить("ИмяОбъекта", ОписаниеТипаСтрока); + ТаблицаРезультат.Колонки.Добавить("ТипОбъектаСтрокой", ОписаниеТипаСтрока); + ТаблицаРезультат.Колонки.Добавить("ИмяПланаОбмена", ОписаниеТипаСтрока); + ТаблицаРезультат.Колонки.Добавить("ИмяТабличнойЧасти", ОписаниеТипаСтрока); + ТаблицаРезультат.Колонки.Добавить("РеквизитыРегистрации", ОписаниеТипаСтрока); + ТаблицаРезультат.Колонки.Добавить("СтруктураРеквизитовРегистрации", ОписаниеТипаСтруктура); + + ТаблицаРезультат.Индексы.Добавить("ИмяОбъекта, ТипОбъектаСтрокой, ИмяПланаОбмена, ИмяТабличнойЧасти"); + + Возврат ТаблицаРезультат; + +КонецФункции + +Функция НовыеПараметрыВыборочнойРегистрацииДанныхПланаОбмена(ИмяПланаОбмена) Экспорт + + Если ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(ИмяПланаОбмена) Тогда + + Возврат Новый Структура; + + КонецЕсли; + + ПараметрыВыборочнойРегистрации = Новый Структура; + ПараметрыВыборочнойРегистрации.Вставить("ЭтоПланОбменаXDTO", Ложь); + ПараметрыВыборочнойРегистрации.Вставить("ТаблицаРеквизитовРегистрации", Неопределено); + + ПередФормированиемНовыхПараметровВыборочнойРегистрацииОбъектов(ПараметрыВыборочнойРегистрации, ИмяПланаОбмена); + + Возврат ПараметрыВыборочнойРегистрации; + +КонецФункции + +Функция ОбъектМодифицированДляПланаОбмена(Источник, ОбъектМетаданных, ИмяПланаОбмена, РежимЗаписи, ЗарегистрироватьОбъектКВыгрузке) Экспорт + + Попытка + + ОбъектМодифицирован = ОбъектМодифицирован(Источник, ОбъектМетаданных, ИмяПланаОбмена, РежимЗаписи, ЗарегистрироватьОбъектКВыгрузке); + + Исключение + + СтрокаШаблона = НСтр("ru = 'Ошибка определения модифицированности объекта: %1'", ОбщегоНазначения.КодОсновногоЯзыка()); + ВызватьИсключение СтрШаблон(СтрокаШаблона, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + КонецПопытки; + + Возврат ОбъектМодифицирован; + +КонецФункции + +Функция ОпределитьИзмененияВерсийОбъекта(Объект, СтрокаТаблицыРеквизитовРегистрации) Экспорт + + Если ПустаяСтрока(СтрокаТаблицыРеквизитовРегистрации.ИмяТабличнойЧасти) Тогда // реквизиты Шапки объекта + + ТаблицаРеквизитовРегистрацииВерсияОбъектаДоИзменения = РеквизитыРегистрацииШапкиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); + + ТаблицаРеквизитовРегистрацииВерсияОбъектаПослеИзменения = РеквизитыРегистрацииШапкиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); + + Иначе // реквизиты ТЧ объекта + + // Проверка, что это ТЧ объекта, а не таблица регистра. + Если Объект.Метаданные().ТабличныеЧасти.Найти(СтрокаТаблицыРеквизитовРегистрации.ИмяТабличнойЧасти) = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + ТаблицаРеквизитовРегистрацииВерсияОбъектаДоИзменения = РеквизитыРегистрацииТабличнойЧастиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); + + ТаблицаРеквизитовРегистрацииВерсияОбъектаПослеИзменения = РеквизитыРегистрацииТабличнойЧастиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); + + КонецЕсли; + + Возврат Не ТаблицыРеквизитовРегистрацииОдинаковые(ТаблицаРеквизитовРегистрацииВерсияОбъектаДоИзменения, ТаблицаРеквизитовРегистрацииВерсияОбъектаПослеИзменения, СтрокаТаблицыРеквизитовРегистрации); + +КонецФункции + +#КонецОбласти + +Функция ИмяСобытияПравилаРегистрации() Экспорт + + Возврат НСтр("ru = 'Обмен данными.Правила регистрации объектов'", ОбщегоНазначения.КодОсновногоЯзыка()); + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#Область ВыборочнаяРегистрацияДанных + +Функция ЗначениеМодифицированностиИзПКС(Источник, ИмяПланаОбмена, ОбъектМетаданных, ТаблицаРеквизитовРегистрации) + + Если ТипЗнч(ТаблицаРеквизитовРегистрации) <> Тип("ТаблицаЗначений") Тогда + + // Если нет таблицы реквизитов выборочной регистрации, то считаем, что фильтра нет + Возврат Истина; + + КонецЕсли; + + ИмяОбъекта = ОбъектМетаданных.ПолноеИмя(); + + РеквизитыВыборочнойРегистрацииОбъекта = РеквизитыВыборочнойРегистрацииОбъекта(ТаблицаРеквизитовРегистрации, ИмяОбъекта, ИмяПланаОбмена); + Если РеквизитыВыборочнойРегистрацииОбъекта.Количество() = 0 Тогда + + // Если в таблице нет строк с реквизитами, которые описывают правила ВРО, то считаем, что фильтра нет, + // объект модифицирован всегда. + Возврат Истина; + + КонецЕсли; + + Для Каждого СтрокаТаблицы Из РеквизитыВыборочнойРегистрацииОбъекта Цикл + + ЕстьИзмененияВерсийОбъектов = ОпределитьИзмененияВерсийОбъекта(Источник, СтрокаТаблицы); + Если ЕстьИзмененияВерсийОбъектов Тогда + + Возврат Истина; + + КонецЕсли; + + КонецЦикла; + + // Если дошли до конца, то объект не изменился по реквизитам регистрации. Регистрация на узлах не нужна. + Возврат Ложь; + +КонецФункции + +Функция ЗначениеСвойстваМодифицированностьОбъектаИБ(Источник) + + Попытка + + Возврат Источник.Модифицированность(); + + Исключение + + Возврат Истина; + + КонецПопытки; + +КонецФункции + +Функция ИзмененоПроведениеДокумента(Источник, РежимЗаписи) + + Возврат (Источник.Проведен И РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения) + ИЛИ (НЕ Источник.Проведен И РежимЗаписи = РежимЗаписиДокумента.Проведение); + +КонецФункции + +Функция ИнициализацияТаблицыОбщихРеквизитов() + + ТаблицаОбщихРеквизитов = Новый ТаблицаЗначений; + ТаблицаОбщихРеквизитов.Колонки.Добавить("ОбщийРеквизит"); + ТаблицаОбщихРеквизитов.Колонки.Добавить("ОбъектМетаданных"); + + ТаблицаОбщихРеквизитов.Индексы.Добавить("ОбщийРеквизит, ОбъектМетаданных"); + + Возврат ТаблицаОбщихРеквизитов; + +КонецФункции + +Функция МетаданныеТабличнойЧастиРеквизитовРегистрацииОбъектов(МетаданныеТекущегоОбъекта, ИмяИскомойТабличнойЧасти) + + МетаТест = Новый Структура("ТабличныеЧасти, СтандартныеТабличныеЧасти, Движения"); + ЗаполнитьЗначенияСвойств(МетаТест, МетаданныеТекущегоОбъекта); + МетаТаблицы = Новый Массив; + + ИмяКандидата = ВРег(ИмяИскомойТабличнойЧасти); + + Для Каждого КлючЗначение Из МетаТест Цикл + МетаКоллекцияТаблиц = КлючЗначение.Значение; // КоллекцияОбъектовМетаданных, КоллекцияЗначенийСвойстваОбъектаМетаданных, ОписанияСтандартныхТабличныхЧастей + Если МетаКоллекцияТаблиц <> Неопределено Тогда + + Для Каждого МетаТаблица Из МетаКоллекцияТаблиц Цикл + Если ВРег(МетаТаблица.Имя) = ИмяКандидата Тогда + МетаТаблицы.Добавить(МетаТаблица); + КонецЕсли; + КонецЦикла; + + КонецЕсли; + КонецЦикла; + Если МетаТаблицы.Количество() > 0 Тогда + Возврат МетаТаблицы; + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +Функция ОбъектМодифицирован(Источник, ОбъектМетаданных, ИмяПланаОбмена, РежимЗаписи, ЗарегистрироватьОбъектКВыгрузке) + + Если ЗарегистрироватьОбъектКВыгрузке + ИЛИ Источник.ЭтоНовый() + ИЛИ Источник.ОбменДанными.Загрузка Тогда + + // Регистрируем изменения всегда + // - для наборов записей регистров, + // - при физическом удалении объектов, + // - для новых объектов, + // - для объектов записанных по обмену данными. + Возврат Истина; + + ИначеЕсли РежимЗаписи <> Неопределено + И ИзмененоПроведениеДокумента(Источник, РежимЗаписи) Тогда + + // Если изменен признак документа "Проведен", то считаем документ измененным. + Возврат Истина; + + КонецЕсли; + + РежимВыборочнойРегистрации = ОбменДаннымиРегистрацияПовтИсп.РежимВыборочнойРегистрацииДанныхПланаОбмена(ИмяПланаОбмена); + Если РежимВыборочнойРегистрации = РежимВыборочнойРегистрацииОтключен() Тогда + + // Для плана обмена не используется выборочная регистрация + Возврат Истина; + + ИначеЕсли РежимВыборочнойРегистрации = РежимВыборочнойРегистрацииМодифицированность() Тогда + + Возврат ЗначениеСвойстваМодифицированностьОбъектаИБ(Источник); + + Иначе + + ПараметрыВыборочнойРегистрации = ОбменДаннымиРегистрацияПовтИсп.ПараметрыВыборочнойРегистрацииПоИмениПланаОбмена(ИмяПланаОбмена); + Если ТипЗнч(ПараметрыВыборочнойРегистрации) = Тип("Структура") Тогда + + Возврат ЗначениеМодифицированностиИзПКС(Источник, ИмяПланаОбмена, ОбъектМетаданных, ПараметрыВыборочнойРегистрации.ТаблицаРеквизитовРегистрации); + + Иначе + + // Сформируем новые параметры выборочной регистрации и запишем в регистр сведений. + + + КонецЕсли; + + КонецЕсли; + + // Заглушка на случай, если параметры временной регистрации есть, но в них нет обязательного поля. + // Такого быть не должно, но если случиться, то будем считать, выборочную регистрацию пройденной. + Возврат Истина; + +КонецФункции + +Функция РеквизитНайденВТабличнойЧастиРеквизитовРегистрацииОбъектов(МетаданныеТаблицы, ИмяИскомогоРеквизита) + + МетаТест = Новый Структура("Реквизиты, СтандартныеРеквизиты, Измерения, Ресурсы"); + ЗаполнитьЗначенияСвойств(МетаТест, МетаданныеТаблицы); + + ИмяКандидата = ВРег(ИмяИскомогоРеквизита); + Корреспонденция = Ложь; + Если ТипЗнч(МетаданныеТаблицы) = Тип("ОбъектМетаданных") И ОбщегоНазначения.ЭтоРегистрБухгалтерии(МетаданныеТаблицы) Тогда + Корреспонденция = МетаданныеТаблицы.Корреспонденция; + // Субконто Дт и Кт отсутствуют в измерениях, их не проверить. + // Счет - стандартный реквизит без признака баланса. + Если ИмяКандидата = "СУБКОНТОДТ" Или ИмяКандидата = "СУБКОНТОКТ" + Или ИмяКандидата = "СЧЕТДТ" Или ИмяКандидата = "СЧЕТКТ" Тогда + Возврат Истина; + КонецЕсли; + КонецЕсли; + + Для Каждого КлючЗначение Из МетаТест Цикл + МетаКоллекцияРеквизитов = КлючЗначение.Значение; // КоллекцияОбъектовМетаданных, ОписанияСтандартныхРеквизитов + + Если МетаКоллекцияРеквизитов <> Неопределено Тогда + + Для Каждого МетаРеквизит Из МетаКоллекцияРеквизитов Цикл + + Если ВРег(МетаРеквизит.Имя) = ИмяКандидата Тогда + Возврат Истина; + КонецЕсли; + + Если (КлючЗначение.Ключ = "Измерения" Или КлючЗначение.Ключ = "Ресурсы") И Корреспонденция И НЕ МетаРеквизит.Балансовый Тогда + Если ВРег(МетаРеквизит.Имя) + "ДТ" = ИмяКандидата + Или ВРег(МетаРеквизит.Имя) + "КТ" = ИмяКандидата Тогда + Возврат Истина; + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Функция РеквизитыВыборочнойРегистрацииОбъекта(ТаблицаРеквизитовРегистрации, ИмяОбъекта, ИмяПланаОбмена) + + Если ТаблицаРеквизитовРегистрации.Количество() = 0 Тогда + + Возврат ТаблицаРеквизитовРегистрации; + + КонецЕсли; + + Отбор = Новый Структура; + Отбор.Вставить("ИмяПланаОбмена", ИмяПланаОбмена); + Отбор.Вставить("ИмяОбъекта", ИмяОбъекта); + + ТаблицаРеквизитовВыборочнойРегистрации = ТаблицаРеквизитовРегистрации.Скопировать(Отбор); + ТаблицаРеквизитовВыборочнойРегистрации.Сортировать("Порядок Возр"); + + Возврат ТаблицаРеквизитовВыборочнойРегистрации; + +КонецФункции + +Функция РеквизитыРегистрацииШапкиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) + + ШаблонТекстаЗапроса = + "ВЫБРАТЬ + | &РеквизитыРегистрации + |ИЗ + | &ИмяТаблицыМетаданных КАК ТекущийОбъект + |ГДЕ + | ТекущийОбъект.Ссылка = &Ссылка"; + + ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапроса, "&РеквизитыРегистрации", СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицыМетаданных", СтрокаТаблицыРеквизитовРегистрации.ИмяОбъекта); + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +Функция РеквизитыРегистрацииТабличнойЧастиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) + + ШаблонТекстаЗапроса = + "ВЫБРАТЬ + | &РеквизитыРегистрации + |ИЗ + | &ИмяТаблицыМетаданных КАК ТекущийОбъектИмяТабличнойЧасти + |ГДЕ + | ТекущийОбъектИмяТабличнойЧасти.Ссылка = &Ссылка"; + + СтрокаЗамены = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1.%2", СтрокаТаблицыРеквизитовРегистрации.ИмяОбъекта, СтрокаТаблицыРеквизитовРегистрации.ИмяТабличнойЧасти); + + ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапроса, "&РеквизитыРегистрации", СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицыМетаданных", СтрокаЗамены); + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +Функция РеквизитыРегистрацииШапкиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) + + СтруктураРеквизитовРегистрации = СтрокаТаблицыРеквизитовРегистрации.СтруктураРеквизитовРегистрации; + + ТаблицаРеквизитовРегистрации = Новый ТаблицаЗначений; + + Для Каждого РеквизитРегистрации Из СтруктураРеквизитовРегистрации Цикл + + ТаблицаРеквизитовРегистрации.Колонки.Добавить(РеквизитРегистрации.Ключ); + + КонецЦикла; + + СтрокаТаблицы = ТаблицаРеквизитовРегистрации.Добавить(); + + Для Каждого РеквизитРегистрации Из СтруктураРеквизитовРегистрации Цикл + + СтрокаТаблицы[РеквизитРегистрации.Ключ] = Объект[РеквизитРегистрации.Ключ]; + + КонецЦикла; + + Возврат ТаблицаРеквизитовРегистрации; +КонецФункции + +Функция РеквизитыРегистрацииТабличнойЧастиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) + + ТаблицаРеквизитовРегистрации = Объект[СтрокаТаблицыРеквизитовРегистрации.ИмяТабличнойЧасти].Выгрузить(, СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации); + + Возврат ТаблицаРеквизитовРегистрации; + +КонецФункции + +Функция ТаблицыРеквизитовРегистрацииОдинаковые(Таблица1, Таблица2, СтрокаТаблицыРеквизитовРегистрации) + + Таблица1.Колонки.Добавить("ИтераторТаблицыРеквизитовРегистрации"); + Таблица1.ЗаполнитьЗначения(+1, "ИтераторТаблицыРеквизитовРегистрации"); + + Таблица2.Колонки.Добавить("ИтераторТаблицыРеквизитовРегистрации"); + Таблица2.ЗаполнитьЗначения(-1, "ИтераторТаблицыРеквизитовРегистрации"); + + ТаблицаРезультат = Таблица1.Скопировать(); + + ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(Таблица2, ТаблицаРезультат); + + ТаблицаРезультат.Свернуть(СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации, "ИтераторТаблицыРеквизитовРегистрации"); + + КоличествоОдинаковыхСтрок = ТаблицаРезультат.НайтиСтроки(Новый Структура ("ИтераторТаблицыРеквизитовРегистрации", 0)).Количество(); + + КоличествоСтрокТаблицы = ТаблицаРезультат.Количество(); + + Возврат КоличествоОдинаковыхСтрок = КоличествоСтрокТаблицы; + +КонецФункции + +Функция ЭтоОбщийРеквизит(ОбщийРеквизит, ИмяОМД, ТаблицаОбщихРеквизитов) + + ПараметрыПоиска = Новый Структура("ОбщийРеквизит, ОбъектМетаданных", ОбщийРеквизит, ИмяОМД); + НайденныеЗначения = ТаблицаОбщихРеквизитов.НайтиСтроки(ПараметрыПоиска); + + Если НайденныеЗначения.Количество() > 0 Тогда + + Возврат Истина; + + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +Процедура ВыполнитьПроверкуРеквизитовРегистрацииОбъектов(ТаблицаРеквизитовРегистрации) + + Для Каждого СтрокаТаблицы Из ТаблицаРеквизитовРегистрации Цикл + + Попытка + ТипОбъекта = Тип(СтрокаТаблицы.ТипОбъектаСтрокой); + Исключение + + СтрокаСообщения = НСтр("ru = 'Тип объекта не определен: %1'", ОбщегоНазначения.КодОсновногоЯзыка()); + СтрокаСообщения = СтрШаблон(СтрокаСообщения, СтрокаТаблицы.ТипОбъектаСтрокой); + ЗаписатьВПротоколВыполнения(СтрокаСообщения); + Продолжить; + + КонецПопытки; + + ОбъектМД = Метаданные.НайтиПоТипу(ТипОбъекта); + + // Проверку выполняем только для ссылочных типов. + Если Не ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(ОбъектМД) Тогда + Продолжить; + КонецЕсли; + + ТаблицаОбщихРеквизитов = ИнициализацияТаблицыОбщихРеквизитов(); + ЗаполнитьТаблицуОбщихРеквизитов(ТаблицаОбщихРеквизитов); + + Если ПустаяСтрока(СтрокаТаблицы.ИмяТабличнойЧасти) Тогда // реквизиты шапки + + Для Каждого Реквизит Из СтрокаТаблицы.СтруктураРеквизитовРегистрации Цикл + + Если ОбщегоНазначения.ЭтоЗадача(ОбъектМД) Тогда + + Если Не (ОбъектМД.Реквизиты.Найти(Реквизит.Ключ) <> Неопределено + Или ОбъектМД.РеквизитыАдресации.Найти(Реквизит.Ключ) <> Неопределено + Или ОбменДаннымиСервер.ЭтоСтандартныйРеквизит(ОбъектМД.СтандартныеРеквизиты, Реквизит.Ключ) + Или ЭтоОбщийРеквизит(Реквизит.Ключ, ОбъектМД.ПолноеИмя(), ТаблицаОбщихРеквизитов)) Тогда + + СтрокаСообщения = НСтр("ru = 'Неправильно указаны реквизиты шапки объекта ""%1"". Реквизит ""%2"" не существует.'"); + СтрокаСообщения = СтрШаблон(СтрокаСообщения, Строка(ОбъектМД), Реквизит.Ключ); + ЗаписатьВПротоколВыполнения(СтрокаСообщения); + + КонецЕсли; + + ИначеЕсли ОбщегоНазначения.ЭтоПланСчетов(ОбъектМД) Тогда + + Если Не (ОбъектМД.Реквизиты.Найти(Реквизит.Ключ) <> Неопределено + Или ОбъектМД.ПризнакиУчета.Найти(Реквизит.Ключ) <> Неопределено + Или ОбменДаннымиСервер.ЭтоСтандартныйРеквизит(ОбъектМД.СтандартныеРеквизиты, Реквизит.Ключ) + Или ЭтоОбщийРеквизит(Реквизит.Ключ, ОбъектМД.ПолноеИмя(), ТаблицаОбщихРеквизитов)) Тогда + + СтрокаСообщения = НСтр("ru = 'Неправильно указаны реквизиты шапки объекта ""%1"". Реквизит ""%2"" не существует.'"); + СтрокаСообщения = СтрШаблон(СтрокаСообщения, Строка(ОбъектМД), Реквизит.Ключ); + ЗаписатьВПротоколВыполнения(СтрокаСообщения); + + КонецЕсли; + + Иначе + + Если Не (ОбъектМД.Реквизиты.Найти(Реквизит.Ключ) <> Неопределено + Или ОбменДаннымиСервер.ЭтоСтандартныйРеквизит(ОбъектМД.СтандартныеРеквизиты, Реквизит.Ключ) + Или ЭтоОбщийРеквизит(Реквизит.Ключ, ОбъектМД.ПолноеИмя(), ТаблицаОбщихРеквизитов)) Тогда + + СтрокаСообщения = НСтр("ru = 'Неправильно указаны реквизиты шапки объекта ""%1"". Реквизит ""%2"" не существует.'"); + СтрокаСообщения = СтрШаблон(СтрокаСообщения, Строка(ОбъектМД), Реквизит.Ключ); + ЗаписатьВПротоколВыполнения(СтрокаСообщения); + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + Иначе + + // Табличная часть, стандартная табличная часть, движения. + МетаТаблицы = МетаданныеТабличнойЧастиРеквизитовРегистрацииОбъектов(ОбъектМД, СтрокаТаблицы.ИмяТабличнойЧасти); + Если МетаТаблицы = Неопределено Тогда + + СтрокаСообщения = НСтр("ru = 'Табличная часть (стандартная табличная часть, движения) ""%1"" объекта ""%2"" не существует.'"); + ЗаписатьВПротоколВыполнения(СтрШаблон(СтрокаСообщения, СтрокаТаблицы.ИмяТабличнойЧасти, ОбъектМД)); + Продолжить; + + КонецЕсли; + + // Пробуем найти каждый реквизит хоть где-нибудь. + Для Каждого Реквизит Из СтрокаТаблицы.СтруктураРеквизитовРегистрации Цикл + + РеквизитНайден = Ложь; + Для Каждого МетаТаблица Из МетаТаблицы Цикл + РеквизитНайден = РеквизитНайденВТабличнойЧастиРеквизитовРегистрацииОбъектов(МетаТаблица, Реквизит.Ключ); + Если РеквизитНайден Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + Если Не РеквизитНайден Тогда + + СтрокаСообщения = НСтр("ru = 'Реквизит ""%3"" не существует в табличной части (стандартной табличной части, движениях) ""%1"" объекта ""%2"".'"); + ЗаписатьВПротоколВыполнения(СтрШаблон(СтрокаСообщения, СтрокаТаблицы.ИмяТабличнойЧасти, ОбъектМД, Реквизит.Ключ)); + Прервать; + + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ДополнитьТаблицуРеквизитовРегистрации(МассивСтрок, ТаблицаРеквизитовРегистрации) + + СтрокаТаблицы = ТаблицаРеквизитовРегистрации.Добавить(); + + СтруктураРезультат = Новый Структура; + РеквизитыРегистрацииСтрокой = ""; + + Для Каждого СтрокаТаблицыРезультат Из МассивСтрок Цикл + + СтруктураРеквизитовРегистрации = СтрокаТаблицыРезультат.СтруктураРеквизитовРегистрации; + Для Каждого РеквизитРегистрации Из СтруктураРеквизитовРегистрации Цикл + + СтруктураРезультат.Вставить(РеквизитРегистрации.Ключ); + РеквизитыРегистрацииСтрокой = РеквизитыРегистрацииСтрокой + РеквизитРегистрации.Ключ + ", "; + + КонецЦикла; + + КонецЦикла; + + СтроковыеФункцииКлиентСервер.УдалитьПоследнийСимволВСтроке(РеквизитыРегистрацииСтрокой, 2); + + СтрокаТаблицы.Порядок = МассивСтрок[0].Порядок; + СтрокаТаблицы.ИмяОбъекта = МассивСтрок[0].ИмяОбъекта; + СтрокаТаблицы.ТипОбъектаСтрокой = МассивСтрок[0].ТипОбъектаСтрокой; + СтрокаТаблицы.ИмяТабличнойЧасти = МассивСтрок[0].ИмяТабличнойЧасти; + СтрокаТаблицы.СтруктураРеквизитовРегистрации = СтруктураРезультат; + СтрокаТаблицы.РеквизитыРегистрации = РеквизитыРегистрацииСтрокой; + +КонецПроцедуры + +Процедура ДобавитьСтрокуТаблицыВыборочнойРегистрации(ТипОбъектаСтрокой, ИмяОбъекта, ИмяТабличнойЧасти, Порядок, ТаблицаСвойств, ТаблицаРезультат) + + СтруктураРеквизитовРегистрации = Новый Структура; + + МассивСтрокПКС = ТаблицаСвойств.НайтиСтроки(Новый Структура("ЭтоГруппа", Ложь)); + Для Каждого ПКС Из МассивСтрокПКС Цикл + + ИсточникПКС = ПКС.Источник; + + // Проверка на недопустимые символы в строке. + Если ПустаяСтрока(ИсточникПКС) + Или Лев(ИсточникПКС, 1) = "{" Тогда + + Продолжить; + КонецЕсли; + + Попытка + СтруктураРеквизитовРегистрации.Вставить(ИсточникПКС); + Исключение + ЗаписьЖурналаРегистрации(НСтр("ru = 'Обмен данными.Загрузка правил конвертации'", ОбщегоНазначения.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + КонецЦикла; + + СтрокаТаблицыРезультат = ТаблицаРезультат.Добавить(); + + СтрокаТаблицыРезультат.Порядок = Порядок; + СтрокаТаблицыРезультат.ИмяОбъекта = ИмяОбъекта; + СтрокаТаблицыРезультат.ТипОбъектаСтрокой = ТипОбъектаСтрокой; + СтрокаТаблицыРезультат.ИмяТабличнойЧасти = ИмяТабличнойЧасти; + СтрокаТаблицыРезультат.СтруктураРеквизитовРегистрации = СтруктураРеквизитовРегистрации; + +КонецПроцедуры + +Процедура ЗаписатьВПротоколВыполнения(ТекстОшибки) + + ОбработкаОбъект = Обработки.КонвертацияОбъектовИнформационныхБаз.Создать(); + ОбработкаОбъект.ЗаписатьВПротоколВыполнения(ТекстОшибки); + +КонецПроцедуры + +Процедура ЗаполнитьРеквизитыВыборочнойРегистрацииПоКоллекцииПКО(ПараметрыВыборочнойРегистрации, ИмяПланаОбмена, ТаблицаПравилКонвертации) + + Если ТаблицаПравилКонвертации.Количество() = 0 Тогда + + Возврат; + + КонецЕсли; + + ТаблицаРеквизитовРегистрации = ИнициализацияТаблицыПравилВыборочнойРегистрацииОбъектов(); + ТаблицаРезультат = ИнициализацияТаблицыПравилВыборочнойРегистрацииОбъектов(); + + Для каждого ПКО Из ТаблицаПравилКонвертации Цикл + + ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоПравилу(ПКО, ТаблицаРезультат); + + КонецЦикла; + + ТаблицаРезультатГруппировка = ТаблицаРезультат.Скопировать(); + ТаблицаРезультатГруппировка.Свернуть("ИмяОбъекта, ИмяТабличнойЧасти"); + + // Получаем итоговую таблицу с учетом сгруппированных строк предварительной таблицы. + Для Каждого СтрокаТаблицы Из ТаблицаРезультатГруппировка Цикл + + Отбор = Новый Структура("ИмяОбъекта, ИмяТабличнойЧасти", СтрокаТаблицы.ИмяОбъекта, СтрокаТаблицы.ИмяТабличнойЧасти); + МассивСтрокТаблицыРезультат = ТаблицаРезультат.НайтиСтроки(Отбор); + ДополнитьТаблицуРеквизитовРегистрации(МассивСтрокТаблицыРезультат, ТаблицаРеквизитовРегистрации); + + КонецЦикла; + + УдалитьСтрокиСОшибкамиТаблицыРеквизитовРегистрации(ТаблицаРеквизитовРегистрации); + ВыполнитьПроверкуРеквизитовРегистрацииОбъектов(ТаблицаРеквизитовРегистрации); + + // Колонка ИмяПланаОбмена сохранена для обратной совместимости + ТаблицаРеквизитовРегистрации.ЗаполнитьЗначения(ИмяПланаОбмена, "ИмяПланаОбмена"); + + ПараметрыВыборочнойРегистрации.ТаблицаРеквизитовРегистрации = ТаблицаРеквизитовРегистрации; + +КонецПроцедуры + +Процедура ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоПравилу(ПКО, ТаблицаРезультат) + + ИмяОбъекта = СтрЗаменить(ПКО.ТипИсточника, "Ссылка", ""); + ТипОбъектаСтрокой = ПКО.ТипИсточника; + + // Заполняем таблицу реквизитами шапки (свойства). + ДобавитьСтрокуТаблицыВыборочнойРегистрации(ТипОбъектаСтрокой, ИмяОбъекта, "", -50, ПКО.Свойства, ТаблицаРезультат); + + // Заполняем таблицу реквизитами шапки (свойства поиска). + ДобавитьСтрокуТаблицыВыборочнойРегистрации(ТипОбъектаСтрокой, ИмяОбъекта, "", -50, ПКО.СвойстваПоиска, ТаблицаРезультат); + + // Заполняем таблицу реквизитами шапки (свойства отключенные). + ДобавитьСтрокуТаблицыВыборочнойРегистрации(ТипОбъектаСтрокой, ИмяОбъекта, "", -50, ПКО.СвойстваОтключенные, ТаблицаРезультат); + + // табличные части правила + МассивПКГС = ПКО.Свойства.НайтиСтроки(Новый Структура("ЭтоГруппа", Истина)); + + Для Каждого ПКГС Из МассивПКГС Цикл + + // Заполняем таблицу реквизитами табличной части. + ДобавитьСтрокуТаблицыВыборочнойРегистрации(ТипОбъектаСтрокой, ИмяОбъекта, ПКГС.Источник, ПКГС.Порядок, ПКГС.ПравилаГруппы, ТаблицаРезультат); + + // Заполняем таблицу реквизитами табличной части (отключенные). + ДобавитьСтрокуТаблицыВыборочнойРегистрации(ТипОбъектаСтрокой, ИмяОбъекта, ПКГС.Источник, ПКГС.Порядок, ПКГС.ПравилаГруппыОтключенные, ТаблицаРезультат); + + КонецЦикла; + + // Табличные части правила (отключенные). + МассивПКГС = ПКО.СвойстваОтключенные.НайтиСтроки(Новый Структура("ЭтоГруппа", Истина)); + + Для Каждого ПКГС Из МассивПКГС Цикл + + // Заполняем таблицу реквизитами табличной части. + ДобавитьСтрокуТаблицыВыборочнойРегистрации(ТипОбъектаСтрокой, ИмяОбъекта, ПКГС.Источник, ПКГС.Порядок, ПКГС.ПравилаГруппы, ТаблицаРезультат); + + // Заполняем таблицу реквизитами табличной части (отключенные). + ДобавитьСтрокуТаблицыВыборочнойРегистрации(ТипОбъектаСтрокой, ИмяОбъекта, ПКГС.Источник, ПКГС.Порядок, ПКГС.ПравилаГруппыОтключенные, ТаблицаРезультат); + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаполнитьТаблицуОбщихРеквизитов(ТаблицаОбщихРеквизитов) + + Если Метаданные.ОбщиеРеквизиты.Количество() <> 0 Тогда + + АвтоиспользованиеОбщегоРеквизита = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.Авто; + ИспользованиеОбщегоРеквизита = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.Использовать; + + Для Каждого ОбщийРеквизит Из Метаданные.ОбщиеРеквизиты Цикл + + Если ОбщийРеквизит.ИспользованиеРазделенияДанных = Неопределено Тогда + + Автоиспользование = (ОбщийРеквизит.Автоиспользование = Метаданные.СвойстваОбъектов.АвтоИспользованиеОбщегоРеквизита.Использовать); + + Для Каждого Элемент Из ОбщийРеквизит.Состав Цикл + + Если Элемент.Использование = ИспользованиеОбщегоРеквизита + Или (Элемент.Использование = АвтоиспользованиеОбщегоРеквизита И Автоиспользование) Тогда + + НоваяСтрока = ТаблицаОбщихРеквизитов.Добавить(); + НоваяСтрока.ОбщийРеквизит = ОбщийРеквизит.Имя; + НоваяСтрока.ОбъектМетаданных = Элемент.Метаданные.ПолноеИмя(); + + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +Процедура ПередФормированиемНовыхПараметровВыборочнойРегистрацииОбъектов(ПараметрыВыборочнойРегистрации, ИмяПланаОбмена) + + УстановитьПривилегированныйРежим(Истина); + + Если ОбменДаннымиСервер.ЭтоПланОбменаXDTO(ИмяПланаОбмена) Тогда + + ПараметрыВыборочнойРегистрации.ЭтоПланОбменаXDTO = Истина; + + Иначе + + ПараметрыВыборочнойРегистрации.ЭтоПланОбменаXDTO = Ложь; + + РежимВыборочнойРегистрации = ОбменДаннымиРегистрацияПовтИсп.РежимВыборочнойРегистрацииДанныхПланаОбмена(ИмяПланаОбмена); + + // Обход правил конвертации и заполнение параметра "ТаблицаРеквизитовРегистрации" необходим только в том случае, + // если в настройках плана обмена установлен режим выборочной регистрации "СогласноПравиламXML". + Если РежимВыборочнойРегистрации = РежимВыборочнойРегистрацииСогласноПравиламXML() Тогда + + ПравилаЗачитанные = РегистрыСведений.ПравилаДляОбменаДанными.ЗачитанныеПравилаКонвертацииОбъектов(ИмяПланаОбмена); + Если ТипЗнч(ПравилаЗачитанные) = Тип("ХранилищеЗначения") Тогда + + СтруктураЗачитанныхПравил = ПравилаЗачитанные.Получить(); + Если СтруктураЗачитанныхПравил.Свойство("ТаблицаПравилКонвертации") + И ТипЗнч(СтруктураЗачитанныхПравил.ТаблицаПравилКонвертации) = Тип("ТаблицаЗначений") Тогда + + ЗаполнитьРеквизитыВыборочнойРегистрацииПоКоллекцииПКО(ПараметрыВыборочнойРегистрации, ИмяПланаОбмена, СтруктураЗачитанныхПравил.ТаблицаПравилКонвертации); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Процедура УдалитьСтрокиСОшибкамиТаблицыРеквизитовРегистрации(ТаблицаРеквизитовРегистрации) + + КоличествоЭлементовКоллекции = ТаблицаРеквизитовРегистрации.Количество(); + + Для ОбратныйИндекс = 1 По КоличествоЭлементовКоллекции Цикл + + СтрокаТаблицы = ТаблицаРеквизитовРегистрации[КоличествоЭлементовКоллекции - ОбратныйИндекс]; + + // Если нет реквизитов регистрации, то удаляем строку. + Если ПустаяСтрока(СтрокаТаблицы.РеквизитыРегистрации) Тогда + + ТаблицаРеквизитовРегистрации.Удалить(СтрокаТаблицы); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/ОбменДаннымиРегистрацияСервер/ОбменДаннымиРегистрацияСервер.mdo b/SSL/src/CommonModules/ОбменДаннымиРегистрацияСервер/ОбменДаннымиРегистрацияСервер.mdo new file mode 100644 index 000000000..d6132c67c --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиРегистрацияСервер/ОбменДаннымиРегистрацияСервер.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="8de85e8b-6828-44a3-8481-4ff4c8c2b9e2"> + <name>ОбменДаннымиРегистрацияСервер</name> + <synonym> + <key>ru</key> + <value>Обмен данными регистрация сервер</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl index 85ff58966..b4d594cfe 100644 --- a/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl @@ -77,28 +77,17 @@ Форма.АвтоЗаголовок = Ложь; Форма.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Форма.Объект.Наименование + " (%1)", ПредставлениеПланаОбмена); - - Если ОбщегоНазначения.РазделениеВключено() Тогда - - ВидимостьНастройкиПодключения = Ложь; - Если Не Форма.Объект.Ссылка.Пустая() Тогда - - ВидТранспорта = РегистрыСведений.НастройкиТранспортаОбменаДанными.ВидТранспортаСообщенийОбменаПоУмолчанию(Форма.Объект.Ссылка); - - ВидимостьНастройкиПодключения = (ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WS - Или ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим); - - КонецЕсли; + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда + + МодульОбменДаннымиВнутренняяПубликация = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВнутренняяПубликация"); + МодульОбменДаннымиВнутренняяПубликация.ФормаУзлаПриСозданииНаСервере(Форма, Отказ); - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( - Форма.Элементы, - "ФормаОбщаяКомандаНастройкиПодключения", - "Видимость", - ВидимостьНастройкиПодключения); - КонецЕсли; + НастроитьЭлементыФормыЗацикливания(Форма); + КонецПроцедуры // Процедура-обработчик события "ПриЗаписиНаСервере" для формы узла плана обмена. @@ -281,9 +270,9 @@ НачатьТранзакцию(); Попытка Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить(ОбщегоНазначения.ИмяТаблицыПоСсылке(ПараметрыРезервнойКопии.Отправитель)); - ЭлементБлокировки.УстановитьЗначение("Ссылка", ПараметрыРезервнойКопии.Отправитель); - Блокировка.Заблокировать(); + ЭлементБлокировки = Блокировка.Добавить(ОбщегоНазначения.ИмяТаблицыПоСсылке(ПараметрыРезервнойКопии.Отправитель)); + ЭлементБлокировки.УстановитьЗначение("Ссылка", ПараметрыРезервнойКопии.Отправитель); + Блокировка.Заблокировать(); ЗаблокироватьДанныеДляРедактирования(ПараметрыРезервнойКопии.Отправитель); ОтправительОбъект = ПараметрыРезервнойКопии.Отправитель.ПолучитьОбъект(); @@ -746,6 +735,35 @@ КонецФункции +// Функция возвращает объект WSПрокси веб-сервиса Exchange_3_0_1_1, созданный с переданными параметрами. +// +// Параметры: +// СтруктураНастроек - Структура: +// * WSURLВебСервиса - Строка - месторасположение wsdl. +// * WSИмяСервиса - Строка - имя сервиса. +// * WSURLПространстваИменСервиса - Строка - URI пространства имен web-сервиса. +// * WSИмяПользователя - Строка - имя пользователя для входа на сервер. +// * WSПароль - Строка - пароль пользователя. +// * WSТаймаут - Число - таймаут на операции выполняемые через полученное прокси. +// СтрокаСообщенияОбОшибке - Строка - содержит подробное описание ошибки в случае неуспешного подключения; +// СообщениеПользователю - Строка - содержит краткое описание ошибки в случае неуспешного подключения. +// Таймаут - Число - таймаут. +// +// Возвращаемое значение: +// WSПрокси - объект WSПрокси веб-сервиса Exchange_3_0_2_1. +// +Функция ПолучитьWSПрокси_3_0_2_1(СтруктураНастроек, СтрокаСообщенияОбОшибке = "", СообщениеПользователю = "", Таймаут = 600) Экспорт + + УдалитьНезначащиеСимволыВНастройкахПодключения(СтруктураНастроек); + + СтруктураНастроек.Вставить("WSURLПространстваИменСервиса", "http://www.1c.ru/SSL/Exchange_3_0_2_1"); + СтруктураНастроек.Вставить("WSИмяСервиса", "Exchange_3_0_2_1"); + СтруктураНастроек.Вставить("WSТаймаут", Таймаут); + + Возврат ПолучитьWSПроксиПоПараметрамПодключения(СтруктураНастроек, СтрокаСообщенияОбОшибке, СообщениеПользователю, Истина); + +КонецФункции + // Возвращает допустимое количество элементов, обрабатываемых в одной транзакции загрузки данных. // // Возвращаемое значение: @@ -885,6 +903,222 @@ КонецПроцедуры +// Определяет настройки по умолчанию для плана обмена, которые затем могут быть переопределены +// в модуле менеджера плана обмена в процедуре ПриПолученииНастроек(). +// +// Возвращаемое значение: +// Структура: +// * ВариантыНастроекОбмена - см. КоллекцияВариантовНастроекОбмена +// * ВидГруппыДляВариантовНастроек - ВидГруппыФормы - вариант вида группы для отображения в +// дереве команд создания обмена вариантов настроек. +// * ИмяКонфигурацииИсточника - Строка - имя конфигурации источника, выводимое в +// пользовательском интерфейсе. +// * ИмяКонфигурацииПриемника - Структура - перечень идентификаторов конфигураций-корреспондентов, +// обмен с которыми возможен через данный план обмена. +// * ВерсииФорматаОбмена - Соответствие - соответствие номеров поддерживаемых версий формата +// и ссылок на общие модули с логикой обмена через формат. +// Используется только для обменов через универсальный формат. +// * ФорматОбмена - Строка - пространство имен XDTO пакета, в котором содержится +// универсальный формат, без указания версии формата. +// Используется только для обменов через универсальный формат. +// * РасширенияФорматаОбмена - Соответствие из КлючИЗначение: +// ** Ключ - Строка - URI пространства имен схемы расширения формата. +// ** Значение - Строка - номер расширяемой версии формата. +// * ПланОбменаИспользуетсяВМоделиСервиса - Булево - признак использования плана обмена для организации +// обмена в модели сервиса. +// * ЭтоПланОбменаXDTO - Булево - признак того, что это план обмена через +// универсальный формат. +// * ПредупреждатьОНесоответствииВерсийПравилОбмена - Булево - признак необходимости проверки на +// расхождение версий в правилах конвертации. +// Проверка выполняется при загрузке комплекта +// правил, при отправке данных и при получении данных. +// * ИмяПланаОбменаДляПереходаНаНовыйОбмен - Строка - если для плана обмена свойство установлено, в +// рабочих местах управления настройками не будет +// предлагаться настроить этот вид обмена. +// Существующие обмены этого вида будут продолжать +// отображаться в списке настроенных обменов. +// Получении сообщения обмена в новом формате будет +// инициировать переход на новый вид обмена. +// * НазначениеПланаОбмена - Строка - вариант назначения плана обмена. +// * Алгоритмы - Структура - перечень экспортных процедур и функций, которые +// объявлены в модуле менеджера плана обмена +// и используются подсистемой обмена данными. +// +Функция НастройкиПланаОбменаПоУмолчанию(ИмяПланаОбмена) Экспорт + + НазначениеПланаОбмена = "СинхронизацияСДругойПрограммой"; + Если ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(ИмяПланаОбмена) Тогда + НазначениеПланаОбмена = "РИБ"; + КонецЕсли; + + Алгоритмы = Новый Структура; + Алгоритмы.Вставить("ПриПолученииВариантовНастроекОбмена", Ложь); + Алгоритмы.Вставить("ПриПолученииОписанияВариантаНастройки", Ложь); + + Алгоритмы.Вставить("ОписаниеОграниченийПередачиДанных", Ложь); + Алгоритмы.Вставить("ОписаниеЗначенийПоУмолчанию", Ложь); + + Алгоритмы.Вставить("ПредставлениеОтбораИнтерактивнойВыгрузки", Ложь); + Алгоритмы.Вставить("НастроитьИнтерактивнуюВыгрузку", Ложь); + Алгоритмы.Вставить("НастроитьИнтерактивнуюВыгрузкуВМоделиСервиса", Ложь); + + Алгоритмы.Вставить("ОбработчикПроверкиОграниченийПередачиДанных", Ложь); + Алгоритмы.Вставить("ОбработчикПроверкиЗначенийПоУмолчанию", Ложь); + Алгоритмы.Вставить("ОбработчикПроверкиПараметровУчета", Ложь); + + Алгоритмы.Вставить("ПриПодключенииККорреспонденту", Ложь); + Алгоритмы.Вставить("ПриПолученииДанныхОтправителя", Ложь); + Алгоритмы.Вставить("ПриОтправкеДанныхОтправителя", Ложь); + + Алгоритмы.Вставить("ПриСохраненииНастроекСинхронизацииДанных", Ложь); + + Алгоритмы.Вставить("ПриОпределенииПоддерживаемыхОбъектовФормата", Ложь); + Алгоритмы.Вставить("ПриОпределенииПоддерживаемыхКорреспондентомОбъектовФормата", Ложь); + + Алгоритмы.Вставить("ПередНастройкойСинхронизацииДанных", Ложь); + + Параметры = Новый Структура; + Параметры.Вставить("ВариантыНастроекОбмена", КоллекцияВариантовНастроекОбмена()); + Параметры.Вставить("ИмяКонфигурацииИсточника", ""); + Параметры.Вставить("ИмяКонфигурацииПриемника", Новый Структура); + Параметры.Вставить("ВерсииФорматаОбмена", Новый Соответствие); + Параметры.Вставить("ФорматОбмена", ""); + Параметры.Вставить("РасширенияФорматаОбмена", Новый Соответствие); + Параметры.Вставить("ПланОбменаИспользуетсяВМоделиСервиса", Ложь); + Параметры.Вставить("ЭтоПланОбменаXDTO", Ложь); + Параметры.Вставить("ИмяПланаОбменаДляПереходаНаНовыйОбмен", ""); + Параметры.Вставить("ПредупреждатьОНесоответствииВерсийПравилОбмена", Истина); + Параметры.Вставить("НазначениеПланаОбмена", НазначениеПланаОбмена); + Параметры.Вставить("НаличиеПравилКонвертацииОбязательно", Истина); + Параметры.Вставить("РежимВыборочнойРегистрации", Неопределено); + Параметры.Вставить("Алгоритмы", Алгоритмы); + Параметры.Вставить("ПравилаРегистрацииВМенеджере", Ложь); + Параметры.Вставить("ИмяМенеджераРегистрации", ""); + + Возврат Параметры; + +КонецФункции + +// Определяет настройки по умолчанию варианта настройки обмена, которые затем могут быть переопределены +// в модуле менеджера плана обмена в процедуре ПриПолученииОписанияВариантаНастройки(). +// +// Параметры: +// ИмяПланаОбмена - Строка - содержит имя плана обмена. +// +// Возвращаемое значение: +// Структура: +// * Отборы - Структура - отборы на узле плана обмена, +// подлежат заполнению значениями по умолчанию. +// * ЗначенияПоУмолчанию - Структура - значения по умолчанию на узле плана обмена. +// * ОбщиеДанныеУзлов - Строка - имена реквизитов и табличных частей плана обмена, +// через запятую, которые являются общими для пары +// обменивающихся конфигураций. +// * ИспользоватьПомощникСозданияОбменаДанными - Булево - признак, будет ли использоваться помощник для +// создания новых узлов плана обмена. +// * ИмяФормыСозданияНачальногоОбраза - Строка - имя используемой формы создания начального +// образа распределенной ИБ. +// * ИмяФормыПомощникаНастройкиСинхронизацииДанных - Строка - имя формы, которая будет использована для настройки +// правил отправки и получения данных вместо +// стандартной формы. +// * ПояснениеДляНастройкиПараметровУчета - Строка - пояснение о последовательности действий пользователя +// для настройки параметров учета в текущей +// информационной базе. +// * ПутьКФайлуКомплектаПравилНаПользовательскомСайте - Строка - путь к файлу комплекта правил в виде архива +// на пользовательском сайте в разделе конфигурации. +// * ПутьКФайлуКомплектаПравилВКаталогеШаблонов - Строка - относительный путь к файлу комплекта правил в +// каталоге шаблонов. +// * ЗаголовокКомандыДляСозданияНовогоОбменаДанными - Строка - представление команды, выводимое в пользовательском +// интерфейсе при создании новой настройки +// обмена данными. +// * ЗаголовокПомощникаСозданияОбмена - Строка - представление заголовка формы помощника +// создания обмена данными выводимое в +// пользовательском интерфейсе. +// * ЗаголовокУзлаПланаОбмена - Строка - представление узла плана обмена +// выводимое в пользовательском интерфейсе. +// * ИмяКонфигурацииКорреспондента - Строка - идентификатор конфигурации корреспондента. +// * НаименованиеКонфигурацииКорреспондента - Строка - представление наименования конфигурации корреспондента +// выводимое в пользовательском интерфейсе. +// * ИспользуемыеТранспортыСообщенийОбмена - Массив из ПеречислениеСсылка.ВидыТранспортаСообщенийОбмена +// - перечень используемых транспортов сообщений. +// Если не заполнен, будут доступны все возможные +// виды транспорта. +// * КраткаяИнформацияПоОбмену - Строка - краткое описание обмена данными, которое +// выводится на первой странице помощника +// создания обмена. +// * ПодробнаяИнформацияПоОбмену - Строка - ссылка на веб-страницу или полный путь к +// форме внутри конфигурации строкой, для +// отображения в помощнике создания обмена. +// * ИмяФайлаНастроекДляПриемника - Строка - имя файла для сохранения настроек подключения +// при настройке обмена через offline-каналы. +// * ПоддерживаетсяСопоставлениеДанных - Булево - Истина, если для данного варианта настройки поддерживается +// интерактивное сопоставление данных. В +// противном случае полученные сообщения обмена +// будут сразу загружаться в информационную базу. +// * РасширениеФормата - Строка - имя расширения формата, применимое для +// данного варианта настройки. Образуется из URI +// пространства имен схемы расширения формата, +// без учета версии. Напр., для пространства +// имен +// "http://v8.1c.ru/edi/edi_stnd/_DemoEnterpriseDataExt/1.1" +// имя расширение формата будет "http://v8.1c.ru/edi/edi_stnd/_DemoEnterpriseDataExt"; +// +Функция ОписаниеВариантаНастройкиОбменаПоУмолчанию(ИмяПланаОбмена) Экспорт + + МетаданныеПланаОбмена = Метаданные.ПланыОбмена[ИмяПланаОбмена]; + СинонимПланаОбмена = МетаданныеПланаОбмена.Синоним; + + ЗаголовокФормыПомощника = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Синхронизация данных с %1 (настройка)'"), + СинонимПланаОбмена); + + ОписаниеВарианта = Новый Структура; + + ОписаниеВарианта.Вставить("Отборы", Новый Структура); + ОписаниеВарианта.Вставить("ЗначенияПоУмолчанию", Новый Структура); + ОписаниеВарианта.Вставить("ОбщиеДанныеУзлов", ""); + ОписаниеВарианта.Вставить("ИспользоватьПомощникСозданияОбменаДанными", Истина); + ОписаниеВарианта.Вставить("ИмяФормыСозданияНачальногоОбраза", ""); + ОписаниеВарианта.Вставить("ИмяФормыПомощникаНастройкиСинхронизацииДанных", ""); + ОписаниеВарианта.Вставить("ПояснениеДляНастройкиПараметровУчета", ""); + ОписаниеВарианта.Вставить("ПутьКФайлуКомплектаПравилНаПользовательскомСайте", ""); + ОписаниеВарианта.Вставить("ПутьКФайлуКомплектаПравилВКаталогеШаблонов", ""); + ОписаниеВарианта.Вставить("ЗаголовокКомандыДляСозданияНовогоОбменаДанными", СинонимПланаОбмена); + ОписаниеВарианта.Вставить("ЗаголовокПомощникаСозданияОбмена", ЗаголовокФормыПомощника); + ОписаниеВарианта.Вставить("ЗаголовокУзлаПланаОбмена", СинонимПланаОбмена); + ОписаниеВарианта.Вставить("ИмяКонфигурацииКорреспондента", ""); + ОписаниеВарианта.Вставить("НаименованиеКонфигурацииКорреспондента", ""); + ОписаниеВарианта.Вставить("ИспользуемыеТранспортыСообщенийОбмена", Новый Массив); + ОписаниеВарианта.Вставить("КраткаяИнформацияПоОбмену", ""); + ОписаниеВарианта.Вставить("ПодробнаяИнформацияПоОбмену", ""); + ОписаниеВарианта.Вставить("ИмяФайлаНастроекДляПриемника", ""); + ОписаниеВарианта.Вставить("ПоддерживаетсяСопоставлениеДанных", Истина); + ОписаниеВарианта.Вставить("РасширениеФормата", ""); + + Возврат ОписаниеВарианта; + +КонецФункции + +// Предназначена для подготовки структуры, для последующей передачи в обработчик получения описания варианта. +// +// Параметры: +// ИмяКорреспондента - Строка - имя конфигурации-корреспондента. +// ВерсияКорреспондента - Строка - версия конфигурации-корреспондента. +// +// Возвращаемое значение: +// Структура: +// * ИмяКорреспондента - Строка - имя конфигурации корреспондента. +// * ВерсияКорреспондента - Строка - номер версии конфигурации корреспондента. +// +Функция ПараметрыКонтекстаПолученияОписанияВариантаНастройки(ИмяКорреспондента, ВерсияКорреспондента) Экспорт + + Результат = Новый Структура; + Результат.Вставить("ИмяКорреспондента", ИмяКорреспондента); + Результат.Вставить("ВерсияКорреспондента", ВерсияКорреспондента); + + Возврат Результат; + +КонецФункции + #Область НастройкиПодключенияКВнешнейСистеме // Сохраняет настройки подключения для обмена с внешней системой через EnterpriseData. @@ -1687,24 +1921,6 @@ #Область РазличногоНазначения -Функция ЭтоТехническийОбъект(Знач ПолноеИмяОбъекта) Экспорт - - Если СтрНайти(ПолноеИмяОбъекта, ВРег("ПланОбмена")) > 0 Тогда - - Для Каждого ИмяПланаОбмена Из ОбменДаннымиПовтИсп.ПланыОбменаБСП() Цикл - - Если СтрНайти(ПолноеИмяОбъекта, ВРег(ИмяПланаОбмена)) Тогда - Возврат Истина; - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - - Возврат Ложь; - -КонецФункции - // Выполняет загрузку приоритетных данных, полученных из главного узла РИБ. Процедура ЗагрузитьПриоритетныеДанныеВПодчиненныйУзелРИБ(Отказ = Ложь) Экспорт @@ -2795,27 +3011,6 @@ КонецФункции -// Предназначена для подготовки структуры, для последующей передачи в обработчик получения описания варианта. -// -// Параметры: -// ИмяКорреспондента - Строка - имя конфигурации-корреспондента. -// ВерсияКорреспондента - Строка - версия конфигурации-корреспондента. -// -// Возвращаемое значение: -// Структура: -// * ИмяКорреспондента - Строка - имя конфигурации корреспондента. -// * ВерсияКорреспондента - Строка - номер версии конфигурации корреспондента. -// -Функция ПараметрыКонтекстаПолученияОписанияВариантаНастройки(ИмяКорреспондента, ВерсияКорреспондента) Экспорт - - Результат = Новый Структура; - Результат.Вставить("ИмяКорреспондента", ИмяКорреспондента); - Результат.Вставить("ВерсияКорреспондента", ВерсияКорреспондента); - - Возврат Результат; - -КонецФункции - // Предназначена для подготовки структуры, для последующей передачи в обработчик получения вариантов настроек. // // Параметры: @@ -2862,198 +3057,6 @@ КонецФункции -// Определяет настройки по умолчанию для плана обмена, которые затем могут быть переопределены -// в модуле менеджера плана обмена в процедуре ПриПолученииНастроек(). -// -// Возвращаемое значение: -// Структура: -// * ВариантыНастроекОбмена - см. КоллекцияВариантовНастроекОбмена -// * ВидГруппыДляВариантовНастроек - ВидГруппыФормы - вариант вида группы для отображения в -// дереве команд создания обмена вариантов настроек. -// * ИмяКонфигурацииИсточника - Строка - имя конфигурации источника, выводимое в -// пользовательском интерфейсе. -// * ИмяКонфигурацииПриемника - Структура - перечень идентификаторов конфигураций-корреспондентов, -// обмен с которыми возможен через данный план обмена. -// * ВерсииФорматаОбмена - Соответствие - соответствие номеров поддерживаемых версий формата -// и ссылок на общие модули с логикой обмена через формат. -// Используется только для обменов через универсальный формат. -// * ФорматОбмена - Строка - пространство имен XDTO пакета, в котором содержится -// универсальный формат, без указания версии формата. -// Используется только для обменов через универсальный формат. -// * РасширенияФорматаОбмена - Соответствие из КлючИЗначение: -// ** Ключ - Строка - URI пространства имен схемы расширения формата. -// ** Значение - Строка - номер расширяемой версии формата. -// * ПланОбменаИспользуетсяВМоделиСервиса - Булево - признак использования плана обмена для организации -// обмена в модели сервиса. -// * ЭтоПланОбменаXDTO - Булево - признак того, что это план обмена через -// универсальный формат. -// * ПредупреждатьОНесоответствииВерсийПравилОбмена - Булево - признак необходимости проверки на -// расхождение версий в правилах конвертации. -// Проверка выполняется при загрузке комплекта -// правил, при отправке данных и при получении данных. -// * ИмяПланаОбменаДляПереходаНаНовыйОбмен - Строка - если для плана обмена свойство установлено, в -// рабочих местах управления настройками не будет -// предлагаться настроить этот вид обмена. -// Существующие обмены этого вида будут продолжать -// отображаться в списке настроенных обменов. -// Получении сообщения обмена в новом формате будет -// инициировать переход на новый вид обмена. -// * НазначениеПланаОбмена - Строка - вариант назначения плана обмена. -// * Алгоритмы - Структура - перечень экспортных процедур и функций, которые -// объявлены в модуле менеджера плана обмена -// и используются подсистемой обмена данными. -// -Функция НастройкиПланаОбменаПоУмолчанию(ИмяПланаОбмена) Экспорт - - НазначениеПланаОбмена = "СинхронизацияСДругойПрограммой"; - Если ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(ИмяПланаОбмена) Тогда - НазначениеПланаОбмена = "РИБ"; - КонецЕсли; - - Алгоритмы = Новый Структура; - Алгоритмы.Вставить("ПриПолученииВариантовНастроекОбмена", Ложь); - Алгоритмы.Вставить("ПриПолученииОписанияВариантаНастройки", Ложь); - - Алгоритмы.Вставить("ОписаниеОграниченийПередачиДанных", Ложь); - Алгоритмы.Вставить("ОписаниеЗначенийПоУмолчанию", Ложь); - - Алгоритмы.Вставить("ПредставлениеОтбораИнтерактивнойВыгрузки", Ложь); - Алгоритмы.Вставить("НастроитьИнтерактивнуюВыгрузку", Ложь); - Алгоритмы.Вставить("НастроитьИнтерактивнуюВыгрузкуВМоделиСервиса", Ложь); - - Алгоритмы.Вставить("ОбработчикПроверкиОграниченийПередачиДанных", Ложь); - Алгоритмы.Вставить("ОбработчикПроверкиЗначенийПоУмолчанию", Ложь); - Алгоритмы.Вставить("ОбработчикПроверкиПараметровУчета", Ложь); - - Алгоритмы.Вставить("ПриПодключенииККорреспонденту", Ложь); - Алгоритмы.Вставить("ПриПолученииДанныхОтправителя", Ложь); - Алгоритмы.Вставить("ПриОтправкеДанныхОтправителя", Ложь); - - Алгоритмы.Вставить("ПриСохраненииНастроекСинхронизацииДанных", Ложь); - - Алгоритмы.Вставить("ПриОпределенииПоддерживаемыхОбъектовФормата", Ложь); - Алгоритмы.Вставить("ПриОпределенииПоддерживаемыхКорреспондентомОбъектовФормата", Ложь); - - Алгоритмы.Вставить("ПередНастройкойСинхронизацииДанных", Ложь); - - Параметры = Новый Структура; - Параметры.Вставить("ВариантыНастроекОбмена", КоллекцияВариантовНастроекОбмена()); - Параметры.Вставить("ИмяКонфигурацииИсточника", ""); - Параметры.Вставить("ИмяКонфигурацииПриемника", Новый Структура); - Параметры.Вставить("ВерсииФорматаОбмена", Новый Соответствие); - Параметры.Вставить("ФорматОбмена", ""); - Параметры.Вставить("РасширенияФорматаОбмена", Новый Соответствие); - Параметры.Вставить("ПланОбменаИспользуетсяВМоделиСервиса", Ложь); - Параметры.Вставить("ЭтоПланОбменаXDTO", Ложь); - Параметры.Вставить("ИмяПланаОбменаДляПереходаНаНовыйОбмен", ""); - Параметры.Вставить("ПредупреждатьОНесоответствииВерсийПравилОбмена", Истина); - Параметры.Вставить("НазначениеПланаОбмена", НазначениеПланаОбмена); - Параметры.Вставить("НаличиеПравилКонвертацииОбязательно", Истина); - Параметры.Вставить("Алгоритмы", Алгоритмы); - Параметры.Вставить("ПравилаРегистрацииВМенеджере", Ложь); - Параметры.Вставить("ИмяМенеджераРегистрации", ""); - - Возврат Параметры; - -КонецФункции - -// Определяет настройки по умолчанию варианта настройки обмена, которые затем могут быть переопределены -// в модуле менеджера плана обмена в процедуре ПриПолученииОписанияВариантаНастройки(). -// -// Параметры: -// ИмяПланаОбмена - Строка - содержит имя плана обмена. -// -// Возвращаемое значение: -// Структура: -// * Отборы - Структура - отборы на узле плана обмена, -// подлежат заполнению значениями по умолчанию. -// * ЗначенияПоУмолчанию - Структура - значения по умолчанию на узле плана обмена. -// * ОбщиеДанныеУзлов - Строка - имена реквизитов и табличных частей плана обмена, -// через запятую, которые являются общими для пары -// обменивающихся конфигураций. -// * ИспользоватьПомощникСозданияОбменаДанными - Булево - признак, будет ли использоваться помощник для -// создания новых узлов плана обмена. -// * ИмяФормыСозданияНачальногоОбраза - Строка - имя используемой формы создания начального -// образа распределенной ИБ. -// * ИмяФормыПомощникаНастройкиСинхронизацииДанных - Строка - имя формы, которая будет использована для настройки -// правил отправки и получения данных вместо -// стандартной формы. -// * ПояснениеДляНастройкиПараметровУчета - Строка - пояснение о последовательности действий пользователя -// для настройки параметров учета в текущей -// информационной базе. -// * ПутьКФайлуКомплектаПравилНаПользовательскомСайте - Строка - путь к файлу комплекта правил в виде архива -// на пользовательском сайте в разделе конфигурации. -// * ПутьКФайлуКомплектаПравилВКаталогеШаблонов - Строка - относительный путь к файлу комплекта правил в -// каталоге шаблонов. -// * ЗаголовокКомандыДляСозданияНовогоОбменаДанными - Строка - представление команды, выводимое в пользовательском -// интерфейсе при создании новой настройки -// обмена данными. -// * ЗаголовокПомощникаСозданияОбмена - Строка - представление заголовка формы помощника -// создания обмена данными выводимое в -// пользовательском интерфейсе. -// * ЗаголовокУзлаПланаОбмена - Строка - представление узла плана обмена -// выводимое в пользовательском интерфейсе. -// * ИмяКонфигурацииКорреспондента - Строка - идентификатор конфигурации корреспондента. -// * НаименованиеКонфигурацииКорреспондента - Строка - представление наименования конфигурации корреспондента -// выводимое в пользовательском интерфейсе. -// * ИспользуемыеТранспортыСообщенийОбмена - Массив из -// ПеречислениеСсылка.ВидыТранспортаСообщенийОбмена - Перечень используемых транспортов сообщений. Если не заполнен, будут доступны все -// возможные виды транспорта. -// * КраткаяИнформацияПоОбмену - Строка - краткое описание обмена данными, которое -// выводится на первой странице помощника -// создания обмена. -// * ПодробнаяИнформацияПоОбмену - Строка - ссылка на веб-страницу или полный путь к -// форме внутри конфигурации строкой, для -// отображения в помощнике создания обмена. -// * ИмяФайлаНастроекДляПриемника - Строка - имя файла для сохранения настроек подключения -// при настройке обмена через offline-каналы. -// * ПоддерживаетсяСопоставлениеДанных - Булево - Истина, если для данного варианта настройки поддерживается -// интерактивное сопоставление данных. В -// противном случае полученные сообщения обмена -// будут сразу загружаться в информационную базу. -// * РасширениеФормата - Строка - имя расширения формата, применимое для -// данного варианта настройки. Образуется из URI -// пространства имен схемы расширения формата, -// без учета версии. Напр., для пространства -// имен -// "http://v8.1c.ru/edi/edi_stnd/_DemoEnterpriseDataExt/1.1" имя расширение формата будет "http://v8.1c.ru/edi/edi_stnd/_DemoEnterpriseDataExt"; -// -Функция ОписаниеВариантаНастройкиОбменаПоУмолчанию(ИмяПланаОбмена) Экспорт - - МетаданныеПланаОбмена = Метаданные.ПланыОбмена[ИмяПланаОбмена]; - СинонимПланаОбмена = МетаданныеПланаОбмена.Синоним; - - ЗаголовокФормыПомощника = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Синхронизация данных с %1 (настройка)'"), - СинонимПланаОбмена); - - ОписаниеВарианта = Новый Структура; - - ОписаниеВарианта.Вставить("Отборы", Новый Структура); - ОписаниеВарианта.Вставить("ЗначенияПоУмолчанию", Новый Структура); - ОписаниеВарианта.Вставить("ОбщиеДанныеУзлов", ""); - ОписаниеВарианта.Вставить("ИспользоватьПомощникСозданияОбменаДанными", Истина); - ОписаниеВарианта.Вставить("ИмяФормыСозданияНачальногоОбраза", ""); - ОписаниеВарианта.Вставить("ИмяФормыПомощникаНастройкиСинхронизацииДанных", ""); - ОписаниеВарианта.Вставить("ПояснениеДляНастройкиПараметровУчета", ""); - ОписаниеВарианта.Вставить("ПутьКФайлуКомплектаПравилНаПользовательскомСайте", ""); - ОписаниеВарианта.Вставить("ПутьКФайлуКомплектаПравилВКаталогеШаблонов", ""); - ОписаниеВарианта.Вставить("ЗаголовокКомандыДляСозданияНовогоОбменаДанными", СинонимПланаОбмена); - ОписаниеВарианта.Вставить("ЗаголовокПомощникаСозданияОбмена", ЗаголовокФормыПомощника); - ОписаниеВарианта.Вставить("ЗаголовокУзлаПланаОбмена", СинонимПланаОбмена); - ОписаниеВарианта.Вставить("ИмяКонфигурацииКорреспондента", ""); - ОписаниеВарианта.Вставить("НаименованиеКонфигурацииКорреспондента", ""); - ОписаниеВарианта.Вставить("ИспользуемыеТранспортыСообщенийОбмена", Новый Массив); - ОписаниеВарианта.Вставить("КраткаяИнформацияПоОбмену", ""); - ОписаниеВарианта.Вставить("ПодробнаяИнформацияПоОбмену", ""); - ОписаниеВарианта.Вставить("ИмяФайлаНастроекДляПриемника", ""); - ОписаниеВарианта.Вставить("ПоддерживаетсяСопоставлениеДанных", Истина); - ОписаниеВарианта.Вставить("РасширениеФормата", ""); - - Возврат ОписаниеВарианта; - -КонецФункции - // Получение файла по его идентификатору. // // Параметры: @@ -3172,6 +3175,24 @@ КонецПроцедуры +Функция ЭтоТехническийОбъект(Знач ПолноеИмяОбъекта) Экспорт + + Если СтрНайти(ПолноеИмяОбъекта, ВРег("ПланОбмена")) > 0 Тогда + + Для Каждого ИмяПланаОбмена Из ОбменДаннымиПовтИсп.ПланыОбменаБСП() Цикл + + Если СтрНайти(ПолноеИмяОбъекта, ВРег(ИмяПланаОбмена)) Тогда + Возврат Истина; + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + Возврат Ложь; + +КонецФункции + #КонецОбласти #Область ОберткиДляРаботыСПрограммнымИнтерфейсомМенеджераПланаОбмена @@ -3795,6 +3816,8 @@ | ОбщиеНастройкиУзловИнформационныхБаз.ВерсияКорреспондента КАК ВерсияКорреспондента, | ОбщиеНастройкиУзловИнформационныхБаз.ПрефиксКорреспондента КАК ПрефиксКорреспондента, | ОбщиеНастройкиУзловИнформационныхБаз.НастройкаЗавершена КАК НастройкаЗавершена, + | ОбщиеНастройкиУзловИнформационныхБаз.ПереходНаWS_Этап КАК ПереходНаWS_Этап, + | ОбщиеНастройкиУзловИнформационныхБаз.ВидТранспорта КАК ВидТранспорта, | ВЫБОР | КОГДА ЕСТЬNULL(СостоянияОбменовДаннымиВыгрузка.РезультатВыполненияОбмена, 0) = 0 | И ЕСТЬNULL(СостоянияОбменовДаннымиЗагрузка.РезультатВыполненияОбмена, 0) = 0 @@ -3852,6 +3875,8 @@ НастройкиСинхронизации.Колонки.Добавить("ПредставлениеДатыСообщенияДляСопоставленияДанных", Новый ОписаниеТипов("Строка")); + НастройкиСинхронизации.Колонки.Добавить("ДоступенПереходНаWS", Новый ОписаниеТипов("Булево")); + Для Каждого НастройкаСинхронизации Из НастройкиСинхронизации Цикл НастройкаСинхронизации.ДатаПоследнегоЗапуска = Макс(НастройкаСинхронизации.ДатаНачалаПоследнейЗагрузки, @@ -3874,6 +3899,16 @@ НастройкаСинхронизации.ВариантОбменаДанными = ВариантОбменаДанными(НастройкаСинхронизации.УзелИнформационнойБазы); НастройкаСинхронизации.ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(НастройкаСинхронизации.УзелИнформационнойБазы); + Если ОбщегоНазначения.РазделениеВключено() + И НастройкаСинхронизации.НастройкаЗавершена + И ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(НастройкаСинхронизации.УзелИнформационнойБазы) + И НастройкаСинхронизации.ВидТранспорта <> Перечисления.ВидыТранспортаСообщенийОбмена.WS + И НастройкаСинхронизации.ВидТранспорта <> Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим Тогда + + НастройкаСинхронизации.ДоступенПереходНаWS = Истина; + + КонецЕсли; + КонецЦикла; Возврат НастройкиСинхронизации; @@ -3992,53 +4027,35 @@ КонецФункции +// Устарело. Использовать ОбменДаннымиВебСервис.ПолучитьWSПроксиПоПараметрамПодключения Функция ПолучитьWSПроксиПоПараметрамПодключения( СтруктураНастроек, СтрокаСообщенияОбОшибке = "", СообщениеПользователю = "", ДелатьКонтрольныйВызов = Ложь) Экспорт - Попытка - ПроверитьКорректностьФорматаАдресаWSПрокси(СтруктураНастроек.WSURLВебСервиса); - Исключение - СообщениеПользователю = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - СтрокаСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУстановкаПодключенияКWebСервису(), УровеньЖурналаРегистрации.Ошибка,,, СтрокаСообщенияОбОшибке); - Возврат Неопределено; - КонецПопытки; - - Попытка - ПроверитьНедопустимыеСимволыВИмениПользователяWSПрокси(СтруктураНастроек.WSИмяПользователя); - Исключение - СообщениеПользователю = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - СтрокаСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУстановкаПодключенияКWebСервису(), УровеньЖурналаРегистрации.Ошибка,,, СтрокаСообщенияОбОшибке); - Возврат Неопределено; - КонецПопытки; - - МестоположениеWSDL = "[URLВебСервиса]/ws/[ИмяСервиса]?wsdl"; - МестоположениеWSDL = СтрЗаменить(МестоположениеWSDL, "[URLВебСервиса]", СтруктураНастроек.WSURLВебСервиса); - МестоположениеWSDL = СтрЗаменить(МестоположениеWSDL, "[ИмяСервиса]", СтруктураНастроек.WSИмяСервиса); - - ПараметрыПодключения = ОбщегоНазначения.ПараметрыПодключенияWSПрокси(); - ПараметрыПодключения.АдресWSDL = МестоположениеWSDL; - ПараметрыПодключения.URIПространстваИмен = СтруктураНастроек.WSURLПространстваИменСервиса; - ПараметрыПодключения.ИмяСервиса = СтруктураНастроек.WSИмяСервиса; - ПараметрыПодключения.ИмяПользователя = СтруктураНастроек.WSИмяПользователя; - ПараметрыПодключения.Пароль = СтруктураНастроек.WSПароль; - ПараметрыПодключения.Таймаут = СтруктураНастроек.WSТаймаут; - ПараметрыПодключения.ДелатьКонтрольныйВызов = ДелатьКонтрольныйВызов; - - Попытка - WSПрокси = ОбщегоНазначения.СоздатьWSПрокси(ПараметрыПодключения); - Исключение - СообщениеПользователю = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - СтрокаСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУстановкаПодключенияКWebСервису(), УровеньЖурналаРегистрации.Ошибка,,, СтрокаСообщенияОбОшибке); - Возврат Неопределено; - КонецПопытки; + WSПрокси = ОбменДаннымиВебСервис.ПолучитьWSПроксиПоПараметрамПодключения( + СтруктураНастроек, + СтрокаСообщенияОбОшибке, + СообщениеПользователю, + ДелатьКонтрольныйВызов); Возврат WSПрокси; + +КонецФункции + +// Определяет, входит ли план обмена в список планов обмена, которые используют обмен данными по формату XDTO. +// +// Параметры: +// ПланОбмена - ПланОбменаСсылка - ссылка на узел плана обмена или имя плана обмена. +// +// Возвращаемое значение: +// Булево - Истина, если план обмена используется для обмена данными по формату XDTO. +// +Функция ЭтоПланОбменаXDTO(ПланОбмена) Экспорт + + Возврат ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(ПланОбмена); + КонецФункции // Выполняет действия по удалению настройки синхронизации данных. @@ -4058,21 +4075,25 @@ НачатьТранзакцию(); Попытка - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить(ОбщегоНазначения.ИмяТаблицыПоСсылке(УзелИнформационнойБазы)); - ЭлементБлокировки.УстановитьЗначение("Ссылка", УзелИнформационнойБазы); - Блокировка.Заблокировать(); - - ОбщегоНазначения.УдалитьДанныеИзБезопасногоХранилища(УзелИнформационнойБазы); + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(ОбщегоНазначения.ИмяТаблицыПоСсылке(УзелИнформационнойБазы)); + ЭлементБлокировки.УстановитьЗначение("Ссылка", УзелИнформационнойБазы); + Блокировка.Заблокировать(); + + ОбщегоНазначения.УдалитьДанныеИзБезопасногоХранилища(УзелИнформационнойБазы); ЗаблокироватьДанныеДляРедактирования(УзелИнформационнойБазы); ОбъектУзла = УзелИнформационнойБазы.ПолучитьОбъект(); ОбъектУзла.ДополнительныеСвойства.Вставить("УдалениеНастройкиСинхронизации"); ОбъектУзла.Удалить(); + + ИмяПланаОбмена = ОбъектУзла.Метаданные().Имя; + ОбменДаннымиКонтрольЗацикливания.ОбновитьКонтур(ИмяПланаОбмена); + ОбменДаннымиКонтрольЗацикливания.ПроверитьЗацикливание(ИмяПланаОбмена, "УдалениеУзла"); - ЗафиксироватьТранзакцию(); + ЗафиксироватьТранзакцию(); Исключение - ОтменитьТранзакцию(); + ОтменитьТранзакцию(); ВызватьИсключение; КонецПопытки; @@ -4277,6 +4298,11 @@ Обработчик.Процедура = "ОбменДаннымиСервер.УстановитьКодыПредопределенныхУзлов"; Обработчик.РежимВыполнения = "Оперативно"; + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "*"; + Обработчик.Процедура = "ОбменДаннымиСервер.НастроитьАрхивированиеСообщенийАРМ"; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик = Обработчики.Добавить(); Обработчик.Версия = "2.4.1.1"; Обработчик.Процедура = "ОбменДаннымиСервер.УдалитьРольНастройкаСинхронизацииДанных"; @@ -4398,14 +4424,13 @@ Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт Обработчики.Вставить("РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском", "ОбменДаннымиСлужебный.УстановкаПараметровСеанса"); - Обработчики.Вставить("ДатаОбновленияПовторноИспользуемыхЗначенийМРО", "ОбменДаннымиСлужебный.УстановкаПараметровСеанса"); - Обработчики.Вставить("ПравилаВыборочнойРегистрацииОбъектов", "ОбменДаннымиСлужебный.УстановкаПараметровСеанса"); Обработчики.Вставить("ПравилаРегистрацииОбъектов", "ОбменДаннымиСлужебный.УстановкаПараметровСеанса"); Обработчики.Вставить("ПаролиСинхронизацииДанных", "ОбменДаннымиСлужебный.УстановкаПараметровСеанса"); Обработчики.Вставить("ПриоритетныеДанныеОбмена", "ОбменДаннымиСлужебный.УстановкаПараметровСеанса"); Обработчики.Вставить("ОшибкаРасхожденияВерсийПриПолученииДанных", "ОбменДаннымиСлужебный.УстановкаПараметровСеанса"); Обработчики.Вставить("ПараметрыСеансаСинхронизацииДанных", "ОбменДаннымиСлужебный.УстановкаПараметровСеанса"); + КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов. @@ -4415,6 +4440,7 @@ МассивВерсий.Добавить("2.0.1.6"); МассивВерсий.Добавить("2.1.1.7"); МассивВерсий.Добавить("3.0.1.1"); + МассивВерсий.Добавить("3.0.2.1"); СтруктураПоддерживаемыхВерсий.Вставить("ОбменДанными", МассивВерсий); КонецПроцедуры @@ -4553,6 +4579,7 @@ Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт СоответствиеИменПсевдонимам.Вставить("ОбменДаннымиСервер.ВыполнитьОбменДаннымиСВнешнейСистемой"); + СоответствиеИменПсевдонимам.Вставить(Метаданные.РегламентныеЗадания.СинхронизацияДанных.ИмяМетода); КонецПроцедуры @@ -4565,15 +4592,6 @@ #Область ФункцииСвойства -// Возвращаемое значение: -// Строка -// -Функция СобытиеЖурналаРегистрацииУстановкаПодключенияКWebСервису() Экспорт - - Возврат НСтр("ru = 'Обмен данными.Установка подключения к web-сервису'", ОбщегоНазначения.КодОсновногоЯзыка()); - -КонецФункции - // Возвращаемое значение: // Строка // @@ -4685,6 +4703,658 @@ КонецФункции +Функция НастройкиОбменаДляУзлаИнформационнойБазы( + УзелИнформационнойБазы, + ДействиеПриОбмене, + ВидТранспортаСообщенийОбмена, + ИспользоватьНастройкиТранспорта = Истина) Экспорт + + // Возвращаемое значение функции. + СтруктураНастроекОбмена = СтруктураНастроекОбменаБазовая(); + + СтруктураНастроекОбмена.УзелИнформационнойБазы = УзелИнформационнойБазы; + СтруктураНастроекОбмена.ДействиеПриОбмене = ДействиеПриОбмене; + СтруктураНастроекОбмена.ВидТранспортаОбмена = ВидТранспортаСообщенийОбмена; + СтруктураНастроекОбмена.ЭтоОбменВРИБ = ОбменДаннымиПовтИсп.ЭтоУзелРаспределеннойИнформационнойБазы(УзелИнформационнойБазы); + + ВыполнитьИнициализациюСтруктурыНастроекОбменаДляУзлаИнформационнойБазы(СтруктураНастроекОбмена, ИспользоватьНастройкиТранспорта); + + УстановитьНастройкиРежимаОтладкиДляСтруктуры(СтруктураНастроекОбмена); + + // Проверяем структуру настроек на валидность значений для выполнения обмена. Ошибки фиксируем в ЖР. + ВыполнитьПроверкуСтруктурыОбменаНаВалидность(СтруктураНастроекОбмена, ИспользоватьНастройкиТранспорта); + + // Если настройки содержат ошибки, то выходим. + Если СтруктураНастроекОбмена.Отказ Тогда + Возврат СтруктураНастроекОбмена; + КонецЕсли; + + Если ИспользоватьНастройкиТранспорта Тогда + + // Инициализируем обработку транспорта сообщений обмена. + ВыполнитьИнициализациюОбработкиТранспортаСообщенийОбмена(СтруктураНастроекОбмена); + + КонецЕсли; + + // Инициализируем обработку обмена данными. + Если СтруктураНастроекОбмена.ЭтоОбменВРИБ Тогда + + ВыполнитьИнициализациюОбработкиОбмена(СтруктураНастроекОбмена); + + ИначеЕсли СтруктураНастроекОбмена.ОбменПоПравиламКонвертацииОбъектов Тогда + + ВыполнитьИнициализациюОбработкиОбменаПоПравиламКонвертации(СтруктураНастроекОбмена); + + КонецЕсли; + + Возврат СтруктураНастроекОбмена; +КонецФункции + +#КонецОбласти + +#Область ДляРаботыЧерезВнешнееСоединение + +Функция ПараметрыОбменаДаннымиЧерезФайлИлиСтроку() Экспорт + + СтруктураПараметров = Новый Структура; + + СтруктураПараметров.Вставить("УзелИнформационнойБазы"); + СтруктураПараметров.Вставить("ПолноеИмяФайлаСообщенияОбмена", ""); + СтруктураПараметров.Вставить("ДействиеПриОбмене"); + СтруктураПараметров.Вставить("ИмяПланаОбмена", ""); + СтруктураПараметров.Вставить("КодУзлаИнформационнойБазы", ""); + СтруктураПараметров.Вставить("СообщениеОбмена", ""); + СтруктураПараметров.Вставить("ДатаНачалаОперации"); + + Возврат СтруктураПараметров; + +КонецФункции + +Процедура ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбмена) Экспорт + + ПроверитьВозможностьВыполненияОбменов(); + + ПроверитьИспользованиеОбменаДанными(); + + УстановитьПривилегированныйРежим(Истина); + + Если ПараметрыОбмена.УзелИнформационнойБазы = Неопределено Тогда + + ИмяПланаОбмена = ПараметрыОбмена.ИмяПланаОбмена; + КодУзлаИнформационнойБазы = ПараметрыОбмена.КодУзлаИнформационнойБазы; + + ПараметрыОбмена.УзелИнформационнойБазы = ПланыОбмена[ИмяПланаОбмена].НайтиПоКоду(КодУзлаИнформационнойБазы); + + Если ПараметрыОбмена.УзелИнформационнойБазы.Пустая() + И ЭтоПланОбменаXDTO(ИмяПланаОбмена) Тогда + ОшибкаПерехода = Ложь; + НастройкаСинхронизацииЧерезУФ = ПланыОбмена[ИмяПланаОбмена].ПереходНаСинхронизациюЧерезУниверсальныйФорматИнтернет( + КодУзлаИнформационнойБазы, ОшибкаПерехода); + Если ЗначениеЗаполнено(НастройкаСинхронизацииЧерезУФ) Тогда + ПараметрыОбмена.УзелИнформационнойБазы = НастройкаСинхронизацииЧерезУФ; + ИначеЕсли ОшибкаПерехода Тогда + СтрокаСообщенияОбОшибке = НСтр("ru = 'Не удалось выполнить переход на синхронизацию данных через универсальный формат.'"); + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + КонецЕсли; + + Если ПараметрыОбмена.УзелИнформационнойБазы.Пустая() Тогда + СтрокаСообщенияОбОшибке = НСтр("ru = 'Узел плана обмена %1 с кодом %2 не найден.'"); + СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ИмяПланаОбмена, КодУзлаИнформационнойБазы); + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецЕсли; + + ВыполнитьОбновлениеНастроекОбмена(ПараметрыОбмена.УзелИнформационнойБазы); + + Если Не НастройкаСинхронизацииЗавершена(ПараметрыОбмена.УзелИнформационнойБазы) Тогда + + ПредставлениеПрограммы = ?(ОбщегоНазначения.РазделениеВключено(), + Метаданные.Синоним, ОбменДаннымиПовтИсп.ИмяЭтойИнформационнойБазы()); + + ДанныеКорреспондента = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПараметрыОбмена.УзелИнформационнойБазы, + "Код, Наименование"); + + СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В ""%1"" настройка синхронизации данных с ""%2"" (идентификатор ""%3"") еще не завершена.'"), + ПредставлениеПрограммы, ДанныеКорреспондента.Наименование, ДанныеКорреспондента.Код); + + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + // ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ + СтруктураНастроекОбмена = НастройкиОбменаДляУзлаИнформационнойБазы( + ПараметрыОбмена.УзелИнформационнойБазы, ПараметрыОбмена.ДействиеПриОбмене, Неопределено, Ложь); + Если ЗначениеЗаполнено(ПараметрыОбмена.ДатаНачалаОперации) Тогда + СтруктураНастроекОбмена.ДатаНачала = ПараметрыОбмена.ДатаНачалаОперации; + КонецЕсли; + ЗафиксироватьНачалоОбменаВРегистреСведений(СтруктураНастроекОбмена); + + Если СтруктураНастроекОбмена.Отказ Тогда + СтрокаСообщенияОбОшибке = НСтр("ru = 'Ошибка при инициализации процесса обмена данными.'"); + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; + + СтрокаСообщения = НСтр("ru = 'Начало процесса обмена данными для узла %1'", ОбщегоНазначения.КодОсновногоЯзыка()); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, СтруктураНастроекОбмена.УзелИнформационнойБазыНаименование); + ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщения, СтруктураНастроекОбмена); + + Если СтруктураНастроекОбмена.ПроизводитьЗагрузкуДанных Тогда + + СозданВременныйФайл = Ложь; + Если ПараметрыОбмена.ПолноеИмяФайлаСообщенияОбмена = "" + И ПараметрыОбмена.СообщениеОбмена <> "" Тогда + + ПараметрыОбмена.ПолноеИмяФайлаСообщенияОбмена = ПолучитьИмяВременногоФайла(".xml"); + ТекстовыйФайл = Новый ТекстовыйДокумент; + ТекстовыйФайл.УстановитьТекст(ПараметрыОбмена.СообщениеОбмена); + ТекстовыйФайл.Записать(ПараметрыОбмена.ПолноеИмяФайлаСообщенияОбмена); + СозданВременныйФайл = Истина; + КонецЕсли; + + ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ПараметрыОбмена.ПолноеИмяФайлаСообщенияОбмена, ПараметрыОбмена.СообщениеОбмена); + + // {Обработчик: ПослеЧтенияСообщенияОбмена} Начало + СтандартнаяОбработка = Истина; + + ПослеЧтенияСообщенияОбмена( + СтруктураНастроекОбмена.УзелИнформационнойБазы, + ПараметрыОбмена.ПолноеИмяФайлаСообщенияОбмена, + РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена), + СтандартнаяОбработка); + // {Обработчик: ПослеЧтенияСообщенияОбмена} Окончание + + Если СозданВременныйФайл Тогда + + Попытка + УдалитьФайлы(ПараметрыОбмена.ПолноеИмяФайлаСообщенияОбмена); + Исключение + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), + УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + КонецЕсли; + + ИначеЕсли СтруктураНастроекОбмена.ПроизводитьВыгрузкуДанных Тогда + + ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ПараметрыОбмена.ПолноеИмяФайлаСообщенияОбмена, ПараметрыОбмена.СообщениеОбмена); + + КонецЕсли; + + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + Если Не РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) Тогда + ВызватьИсключение СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке; + КонецЕсли; + +КонецПроцедуры + +// Записывает изменения узла информационной базы в файл во временном каталоге. +// +// Параметры: +// СтруктураНастроекОбмена - Структура - структура со всеми необходимыми данными и объектами для выполнения обмена. +// +Процедура ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, Знач ИмяФайлаСообщенияОбмена = "", СообщениеОбмена = "") Экспорт + + Если СтруктураНастроекОбмена.ЭтоОбменВРИБ Тогда // Обмен в РИБ + + Отказ = Ложь; + СообщениеОбОшибке = ""; + + // Получаем обработку обмена данными. + ОбработкаОбменаДанными = СтруктураНастроекОбмена.ОбработкаОбменаДанными; + + // Устанавливаем имя файла сообщения обмена, который необходимо прочитать. + ОбработкаОбменаДанными.УстановитьИмяФайлаСообщенияОбмена(ИмяФайлаСообщенияОбмена); + + ОбработкаОбменаДанными.ВыполнитьВыгрузкуДанных(Отказ, СообщениеОбОшибке); + + Если Отказ Тогда + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = СообщениеОбОшибке; + + КонецЕсли; + + Иначе + + // {Обработчик: ПриВыгрузкеДанных} Начало. Переопределение стандартной обработки выгрузки данных. + СтандартнаяОбработка = Истина; + КоличествоОбъектовОбработано = 0; + + Попытка + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("УзелИнформационнойБазы", СтруктураНастроекОбмена.УзелИнформационнойБазы); + ПараметрыВыполнения.Вставить("КоличествоЭлементовВТранзакции", СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции); + ПараметрыВыполнения.Вставить("КлючСообщенияЖурналаРегистрации", СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации); + ПараметрыВыполнения.Вставить("ИмяФайлаСообщенияОбмена", ИмяФайлаСообщенияОбмена); + + Обработчики = Новый Массив; + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ОбменСообщениями") Тогда + МодульОбменСообщениямиВнутренний = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениямиВнутренний"); + Обработчики.Добавить(МодульОбменСообщениямиВнутренний); + КонецЕсли; + Обработчики.Добавить(ОбменДаннымиПереопределяемый); + + ОбработчикПриВыгрузкеДанныхБСП( + Обработчики, + ПараметрыВыполнения, + СтандартнаяОбработка, + СообщениеОбмена, + КоличествоОбъектовОбработано); + + Исключение + + СтрокаСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + ЗаписьЖурналаРегистрации(СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, + СтруктураНастроекОбмена.УзелИнформационнойБазы.Метаданные(), + СтруктураНастроекОбмена.УзелИнформационнойБазы, СтрокаСообщенияОбОшибке); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = СтрокаСообщенияОбОшибке; + Возврат; + КонецПопытки; + + Если СтандартнаяОбработка = Ложь Тогда + СтруктураНастроекОбмена.КоличествоОбъектовОбработано = КоличествоОбъектовОбработано; + Возврат; + КонецЕсли; + // {Обработчик: ПриВыгрузкеДанных} Окончание + + // Универсальный обмен (обмен по правилам конвертации). + Если СтруктураНастроекОбмена.ОбменПоПравиламКонвертацииОбъектов Тогда + + ФормироватьСообщениеОбмена = ПустаяСтрока(ИмяФайлаСообщенияОбмена); + Если ФормироватьСообщениеОбмена Тогда + ИмяФайлаСообщенияОбмена = ПолучитьИмяВременногоФайла(".xml"); + КонецЕсли; + + // Получаем инициализированную обработку обмена данными. + ОбработкаОбменаДаннымиXML = СтруктураНастроекОбмена.ОбработкаОбменаДанными; //ОбработкаОбъект.КонвертацияОбъектовXDTO + ОбработкаОбменаДаннымиXML.ИмяФайлаОбмена = ИмяФайлаСообщенияОбмена; + + // выгрузка данных + Попытка + ОбработкаОбменаДаннымиXML.ВыполнитьВыгрузкуДанных(); + Исключение + СтрокаСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + ЗаписьЖурналаРегистрации(СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, + СтруктураНастроекОбмена.УзелИнформационнойБазы.Метаданные(), + СтруктураНастроекОбмена.УзелИнформационнойБазы, СтрокаСообщенияОбОшибке); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = СтрокаСообщенияОбОшибке; + Возврат; + КонецПопытки; + + Если ФормироватьСообщениеОбмена Тогда + ТекстовыйФайл = Новый ТекстовыйДокумент; + ТекстовыйФайл.Прочитать(ИмяФайлаСообщенияОбмена, КодировкаТекста.UTF8); + СообщениеОбмена = ТекстовыйФайл.ПолучитьТекст(); + УдалитьФайлы(ИмяФайлаСообщенияОбмена); + КонецЕсли; + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = ОбработкаОбменаДаннымиXML.РезультатВыполненияОбмена(); + + // Фиксируем состояние выполнения обмена данными. + СтруктураНастроекОбмена.КоличествоОбъектовОбработано = ОбработкаОбменаДаннымиXML.СчетчикВыгруженныхОбъектов(); + СтруктураНастроекОбмена.СообщениеПриОбмене = ОбработкаОбменаДаннымиXML.КомментарийПриВыгрузкеДанных; + СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = ОбработкаОбменаДаннымиXML.СтрокаСообщенияОбОшибке(); + + Иначе // Стандартный обмен (платформенная сериализация). + + Отказ = Ложь; + КоличествоОбъектовОбработано = 0; + + Попытка + ВыполнитьСтандартнуюВыгрузкуИзмененийДляУзла(Отказ, + СтруктураНастроекОбмена.УзелИнформационнойБазы, + ИмяФайлаСообщенияОбмена, + СообщениеОбмена, + СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции, + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, + КоличествоОбъектовОбработано); + Исключение + СтрокаСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + ЗаписьЖурналаРегистрации(СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, + СтруктураНастроекОбмена.УзелИнформационнойБазы.Метаданные(), + СтруктураНастроекОбмена.УзелИнформационнойБазы, СтрокаСообщенияОбОшибке); + СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = СтрокаСообщенияОбОшибке; + Отказ = Истина; + КонецПопытки; + + СтруктураНастроекОбмена.КоличествоОбъектовОбработано = КоличествоОбъектовОбработано; + + Если Отказ Тогда + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Получает сообщение обмена с новыми данными и загружает данные в информационную базу. +// +// Параметры: +// СтруктураНастроекОбмена - Структура - структура со всеми необходимыми данными и объектами для выполнения обмена. +// +Процедура ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, + Знач ИмяФайлаСообщенияОбмена = "", СообщениеОбмена = "", Знач ТолькоПараметры = Ложь) Экспорт + + Если СтруктураНастроекОбмена.ЭтоОбменВРИБ Тогда // Обмен в РИБ + + Отказ = Ложь; + + // Получаем обработку обмена данными. + ОбработкаОбменаДанными = СтруктураНастроекОбмена.ОбработкаОбменаДанными; //ОбработкаОбъект.КонвертацияОбъектовРаспределенныхИнформационныхБаз + + // Устанавливаем имя файла сообщения обмена, который необходимо прочитать. + ОбработкаОбменаДанными.УстановитьИмяФайлаСообщенияОбмена(ИмяФайлаСообщенияОбмена); + + СообщениеОбОшибке = ""; + ОбработкаОбменаДанными.ВыполнитьЗагрузкуДанных(Отказ, ТолькоПараметры, СообщениеОбОшибке); + + Если Отказ Тогда + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = СообщениеОбОшибке; + КонецЕсли; + + Иначе + + // {Обработчик: ПриЗагрузкеДанных} Начало. Переопределение стандартной обработки загрузки данных. + СтандартнаяОбработка = Истина; + КоличествоОбъектовОбработано = 0; + + Попытка + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("УзелИнформационнойБазы", СтруктураНастроекОбмена.УзелИнформационнойБазы); + ПараметрыВыполнения.Вставить("КоличествоЭлементовВТранзакции", СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции); + ПараметрыВыполнения.Вставить("КлючСообщенияЖурналаРегистрации", СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации); + ПараметрыВыполнения.Вставить("ИмяФайлаСообщенияОбмена", ИмяФайлаСообщенияОбмена); + + Обработчики = Новый Массив; + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ОбменСообщениями") Тогда + МодульОбменСообщениямиВнутренний = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениямиВнутренний"); + Обработчики.Добавить(МодульОбменСообщениямиВнутренний); + КонецЕсли; + Обработчики.Добавить(ОбменДаннымиПереопределяемый); + + ОбработчикПриЗагрузкеДанныхБСП( + Обработчики, + ПараметрыВыполнения, + СтандартнаяОбработка, + СообщениеОбмена, + КоличествоОбъектовОбработано); + + Исключение + СтрокаСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + ЗаписьЖурналаРегистрации(СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, + СтруктураНастроекОбмена.УзелИнформационнойБазы.Метаданные(), + СтруктураНастроекОбмена.УзелИнформационнойБазы, СтрокаСообщенияОбОшибке); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = СтрокаСообщенияОбОшибке; + Возврат; + КонецПопытки; + + Если СтандартнаяОбработка = Ложь Тогда + СтруктураНастроекОбмена.КоличествоОбъектовОбработано = КоличествоОбъектовОбработано; + Возврат; + КонецЕсли; + // {Обработчик: ПриЗагрузкеДанных} Окончание + + // Универсальный обмен (обмен по правилам конвертации). + Если СтруктураНастроекОбмена.ОбменПоПравиламКонвертацииОбъектов Тогда + + // Получаем инициализированную обработку обмена данными. + ОбработкаОбменаДаннымиXML = СтруктураНастроекОбмена.ОбработкаОбменаДанными; //ОбработкаОбъект.КонвертацияОбъектовXDTO + ОбработкаОбменаДаннымиXML.ИмяФайлаОбмена = ИмяФайлаСообщенияОбмена; + + // загрузка данных + Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(СтруктураНастроекОбмена.ИмяПланаОбмена) Тогда + ПараметрыЗагрузки = Новый Структура; + ПараметрыЗагрузки.Вставить("ОбменДаннымиСВнешнейСистемой", + СтруктураНастроекОбмена.ВидТранспортаОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.ВнешняяСистема); + + ОбработкаОбменаДаннымиXML.ВыполнитьЗагрузкуДанных(ПараметрыЗагрузки); + + ПолученыДанныеДляСопоставления = Ложь; + Если Не ОбработкаОбменаДаннымиXML.КомпонентыОбмена.ФлагОшибки Тогда + ПолученыДанныеДляСопоставления = (ОбработкаОбменаДаннымиXML.КомпонентыОбмена.НомерВходящегоСообщения > 0 + И ОбработкаОбменаДаннымиXML.КомпонентыОбмена.НомерСообщенияПолученногоКорреспондентом = 0); + КонецЕсли; + СтруктураНастроекОбмена.ДополнительныеПараметры.Вставить("ПолученыДанныеДляСопоставления", ПолученыДанныеДляСопоставления); + Иначе + ОбработкаОбменаДаннымиXML.ВыполнитьЗагрузкуДанных(); + КонецЕсли; + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = ОбработкаОбменаДаннымиXML.РезультатВыполненияОбмена(); + + // Фиксируем состояние выполнения обмена данными. + СтруктураНастроекОбмена.КоличествоОбъектовОбработано = ОбработкаОбменаДаннымиXML.СчетчикЗагруженныхОбъектов(); + СтруктураНастроекОбмена.СообщениеПриОбмене = ОбработкаОбменаДаннымиXML.КомментарийПриЗагрузкеДанных; + СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = ОбработкаОбменаДаннымиXML.СтрокаСообщенияОбОшибке(); + + Иначе // Стандартный обмен (платформенная сериализация). + + КоличествоОбъектовОбработано = 0; + РезультатВыполненияОбмена = Неопределено; + + ВыполнитьСтандартнуюЗагрузкуИзмененийДляУзла( + СтруктураНастроекОбмена.УзелИнформационнойБазы, + ИмяФайлаСообщенияОбмена, + СообщениеОбмена, + СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции, + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, + КоличествоОбъектовОбработано, + РезультатВыполненияОбмена); + + СтруктураНастроекОбмена.КоличествоОбъектовОбработано = КоличествоОбъектовОбработано; + СтруктураНастроекОбмена.РезультатВыполненияОбмена = РезультатВыполненияОбмена; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ИнтерактивноеИзменениеВыгрузки + +// Сохраняет настройки с указанным именем по данным ДополнениеВыгрузки. +// +// Параметры: +// ДополнениеВыгрузки - Структура +// - РеквизитФормыКоллекция - описание параметров выгрузки. +// ПредставлениеНастройки - Строка - название сохраняемой настройки. +// +Процедура ИнтерактивноеИзменениеВыгрузкиСохранитьНастройки(ДополнениеВыгрузки, Знач ПредставлениеНастройки) Экспорт + + ОбработкаДополнения = Обработки.ИнтерактивноеИзменениеВыгрузки.Создать(); + ЗаполнитьЗначенияСвойств(ОбработкаДополнения, ДополнениеВыгрузки, , + "ДополнительнаяРегистрация, ДополнительнаяРегистрацияСценарияУзла"); + + ЗаполнитьТаблицуЗначений(ОбработкаДополнения.ДополнительнаяРегистрация, ДополнениеВыгрузки.ДополнительнаяРегистрация); + ЗаполнитьТаблицуЗначений(ОбработкаДополнения.ДополнительнаяРегистрацияСценарияУзла, ДополнениеВыгрузки.ДополнительнаяРегистрацияСценарияУзла); + + // Компоновщик настроек собираем заново. + Данные = ОбработкаДополнения.КомпоновщикНастроекОбщегоОтбора(); + + Если ПустаяСтрока(ДополнениеВыгрузки.АдресКомпоновщикаВсехДокументов) Тогда + ИсточникНастроек = ДополнениеВыгрузки.КомпоновщикОтбораВсехДокументов.Настройки; + Иначе + СтруктураКомпоновщика = ПолучитьИзВременногоХранилища(ДополнениеВыгрузки.АдресКомпоновщикаВсехДокументов); + ИсточникНастроек = СтруктураКомпоновщика.Настройки; + КонецЕсли; + + ОбработкаДополнения.КомпоновщикОтбораВсехДокументов = Новый КомпоновщикНастроекКомпоновкиДанных; + ОбработкаДополнения.КомпоновщикОтбораВсехДокументов.Инициализировать( Новый ИсточникДоступныхНастроекКомпоновкиДанных(Данные.СхемаКомпоновки) ); + ОбработкаДополнения.КомпоновщикОтбораВсехДокументов.ЗагрузитьНастройки(ИсточникНастроек); + + // Собственно сохранение + ОбработкаДополнения.СохранитьТекущееВНастройки(ПредставлениеНастройки); + + // Текущее представление запомненных настроек. + ДополнениеВыгрузки.ПредставлениеТекущейНастройки = ПредставлениеНастройки; + +КонецПроцедуры + +// Имя для сохранения и восстановления настроек при интерактивном дополнении выгрузки. +// +Функция ДополнениеВыгрузкиИмяАвтоСохраненияНастроек() Экспорт + Возврат НСтр("ru = 'Последняя отправка (сохраняется автоматически)'"); +КонецФункции + +// Производит дополнительную регистрацию объектов по настройкам. +// +// Параметры: +// ДополнениеВыгрузки - Структура +// - ДанныеФормыКоллекция - описание параметров выгрузки. +// +Процедура ИнтерактивноеИзменениеВыгрузкиЗарегистрироватьДополнительныеДанные(Знач ДополнениеВыгрузки) Экспорт + + Если ДополнениеВыгрузки.ВариантВыгрузки <= 0 Тогда + Возврат; + КонецЕсли; + + ОбъектОтчета = Обработки.ИнтерактивноеИзменениеВыгрузки.Создать(); + ЗаполнитьЗначенияСвойств(ОбъектОтчета, ДополнениеВыгрузки,,"ДополнительнаяРегистрация, ДополнительнаяРегистрацияСценарияУзла"); + + Если ОбъектОтчета.ВариантВыгрузки=1 Тогда + // За период с отбором, дополнительная пустая. + + ИначеЕсли ДополнениеВыгрузки.ВариантВыгрузки=2 Тогда + // Детально настроено + ОбъектОтчета.КомпоновщикОтбораВсехДокументов = Неопределено; + ОбъектОтчета.ПериодОтбораВсехДокументов = Неопределено; + + ЗаполнитьТаблицуЗначений(ОбъектОтчета.ДополнительнаяРегистрация, ДополнениеВыгрузки.ДополнительнаяРегистрация); + + ИначеЕсли ДополнениеВыгрузки.ВариантВыгрузки=3 Тогда + // По сценарию узла, имитируем детальное. + ОбъектОтчета.ВариантВыгрузки = 2; + + ОбъектОтчета.КомпоновщикОтбораВсехДокументов = Неопределено; + ОбъектОтчета.ПериодОтбораВсехДокументов = Неопределено; + + ЗаполнитьТаблицуЗначений(ОбъектОтчета.ДополнительнаяРегистрация, ДополнениеВыгрузки.ДополнительнаяРегистрацияСценарияУзла); + КонецЕсли; + + ОбъектОтчета.ЗарегистрироватьДополнительныеИзменения(); +КонецПроцедуры + +#КонецОбласти + +#Область ОбщегоНазначения + +// Регистрирует что обмен был произведен и фиксирует информацию в протоколе. +// +// Параметры: +// СтруктураНастроекОбмена - Структура - структура со всеми необходимыми данными и объектами для выполнения обмена. +// +Процедура ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена) Экспорт + + // Статус "Неопределено" в конце обмена свидетельствует об успешном выполнении обмена. + Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Выполнено; + КонецЕсли; + + // Формируем итоговое сообщение для протокола. + Если СтруктураНастроекОбмена.ЭтоОбменВРИБ Тогда + СтрокаСообщения = НСтр("ru = '%1, %2'", ОбщегоНазначения.КодОсновногоЯзыка()); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, + СтруктураНастроекОбмена.РезультатВыполненияОбмена, + СтруктураНастроекОбмена.ДействиеПриОбмене); + Иначе + СтрокаСообщения = НСтр("ru = '%1, %2; Объектов обработано: %3'", ОбщегоНазначения.КодОсновногоЯзыка()); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, + СтруктураНастроекОбмена.РезультатВыполненияОбмена, + СтруктураНастроекОбмена.ДействиеПриОбмене, + СтруктураНастроекОбмена.КоличествоОбъектовОбработано); + КонецЕсли; + + СтруктураНастроекОбмена.ДатаОкончания = ТекущаяДатаСеанса(); + + УстановитьПривилегированныйРежим(Истина); + + // Фиксируем состояние обмена в РС. + ЗафиксироватьЗавершениеОбменаВРегистреСведений(СтруктураНастроекОбмена); + + // Если обмен данными был успешно выполнен. + Если РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) Тогда + + ЗафиксироватьУспешныйОбменДаннымиВРегистреСведений(СтруктураНастроекОбмена); + + РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.СнятьПризнакОтправкиДанных(СтруктураНастроекОбмена.УзелИнформационнойБазы); + + КонецЕсли; + + ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщения, СтруктураНастроекОбмена); + +КонецПроцедуры + +Процедура ЗафиксироватьНачалоОбменаВРегистреСведений(СтруктураНастроекОбмена) Экспорт + + СтруктураЗаписи = Новый Структура; + СтруктураЗаписи.Вставить("УзелИнформационнойБазы", СтруктураНастроекОбмена.УзелИнформационнойБазы); + СтруктураЗаписи.Вставить("ДействиеПриОбмене", СтруктураНастроекОбмена.ДействиеПриОбмене); + + СтруктураЗаписи.Вставить("ДатаНачала", СтруктураНастроекОбмена.ДатаНачала); + + РегистрыСведений.СостоянияОбменовДанными.ОбновитьЗапись(СтруктураЗаписи); + +КонецПроцедуры + +// Создает запись в журнале регистрации о событии обмена данными/транспорте сообщений обмена. +// +Процедура ЗаписьЖурналаРегистрацииОбменаДанными(Комментарий, СтруктураНастроекОбмена, ЭтоОшибка = Ложь) Экспорт + + Уровень = ?(ЭтоОшибка, УровеньЖурналаРегистрации.Ошибка, УровеньЖурналаРегистрации.Информация); + + Если СтруктураНастроекОбмена.Свойство("УзелИнформационнойБазы") Тогда + + ЗаписьЖурналаРегистрации(СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, + Уровень, + СтруктураНастроекОбмена.УзелИнформационнойБазы.Метаданные(), + СтруктураНастроекОбмена.УзелИнформационнойБазы, + Комментарий); + + Иначе + ЗаписьЖурналаРегистрации(СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, Уровень,,, Комментарий); + КонецЕсли; + +КонецПроцедуры + +// Возвращает признак успешного выполнения обмена данными. +// +Функция РезультатВыполненияОбменаВыполнено(РезультатВыполненияОбмена) Экспорт + + Возврат РезультатВыполненияОбмена = Неопределено + ИЛИ РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Выполнено + ИЛИ РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.ВыполненоСПредупреждениями; + +КонецФункции + +Функция УникальноеИмяФайлаСообщенияОбмена(Расширение = "xml") Экспорт + + Результат = "Message{GUID}." + Расширение; + + Результат = СтрЗаменить(Результат, "GUID", Строка(Новый УникальныйИдентификатор)); + + Возврат Результат; +КонецФункции + #КонецОбласти #КонецОбласти @@ -4748,31 +5418,6 @@ КонецФункции -Функция СтрокаСодержитСимвол(Знач Строка, Знач СтрокаСимволов) - - Для Индекс = 1 По СтрДлина(СтрокаСимволов) Цикл - Символ = Сред(СтрокаСимволов, Индекс, 1); - - Если СтрНайти(Строка, Символ) <> 0 Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - - Возврат Ложь; - -КонецФункции - -Функция ДопустимыеПрефиксыWSПрокси() - - Результат = Новый Массив(); - - Результат.Добавить("http"); - Результат.Добавить("https"); - - Возврат Результат; - -КонецФункции - Функция НовыйУзелОбменаДаннымиXDTO( ИмяПланаОбмена, ИдентификаторНастройки, @@ -4809,12 +5454,6 @@ КонецФункции -Функция НедопустимыеСимволыВИмениПользователяWSПрокси() - - Возврат ":"; - -КонецФункции - Функция КоличествоЭлементовВТранзакцииВыполняемогоДействия(Действие) Если Действие = Перечисления.ДействияПриОбмене.ВыгрузкаДанных Тогда @@ -4836,50 +5475,6 @@ КонецПроцедуры -Процедура ПроверитьНедопустимыеСимволыВИмениПользователяWSПрокси(Знач ИмяПользователя) - - НедопустимыеСимволы = НедопустимыеСимволыВИмениПользователяWSПрокси(); - - Если СтрокаСодержитСимвол(ИмяПользователя, НедопустимыеСимволы) Тогда - - СтрокаСообщения = НСтр("ru = 'В имени пользователя %1 содержатся недопустимые символы. - |Имя пользователя не должно содержать символы %2.'"); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ИмяПользователя, НедопустимыеСимволы); - - ВызватьИсключение СтрокаСообщения; - - КонецЕсли; - -КонецПроцедуры - -Процедура ПроверитьКорректностьФорматаАдресаWSПрокси(Знач АдресWSПрокси) - - ЭтоИнтернетАдрес = Ложь; - ДопустимыеПрефиксыWSПрокси = ДопустимыеПрефиксыWSПрокси(); - - Для Каждого Префикс Из ДопустимыеПрефиксыWSПрокси Цикл - Если Лев(НРег(АдресWSПрокси), СтрДлина(Префикс)) = НРег(Префикс) Тогда - ЭтоИнтернетАдрес = Истина; - Прервать; - КонецЕсли; - КонецЦикла; - - Если Не ЭтоИнтернетАдрес Тогда - СтрокаПрефиксов = ""; - Для Каждого Префикс Из ДопустимыеПрефиксыWSПрокси Цикл - СтрокаПрефиксов = СтрокаПрефиксов + ?(ПустаяСтрока(СтрокаПрефиксов), """", " или """) + Префикс + """"; - КонецЦикла; - - СтрокаСообщения = НСтр("ru = 'Неверный формат адреса ""%1"". - |Адрес должен начинаться с префикса Интернет протокола %2 (например: ""http://myserver.com/service"").'"); - - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, АдресWSПрокси, СтрокаПрефиксов); - - ВызватьИсключение СтрокаСообщения; - КонецЕсли; - -КонецПроцедуры - Процедура ВыполнитьОбновлениеНастроекОбмена(УзелИнформационнойБазы) Если ОбменДаннымиПовтИсп.ЭтоУзелОбменаСообщениями(УзелИнформационнойБазы) Тогда @@ -5335,6 +5930,33 @@ КонецПроцедуры +Процедура НастроитьАрхивированиеСообщенийАРМ() Экспорт + + Если НЕ ЭтоАвтономноеРабочееМесто() Тогда + Возврат; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда + + МодульАвтономнаяРаботаСлужебный = ОбщегоНазначения.ОбщийМодуль("АвтономнаяРаботаСлужебный"); + + Узел = МодульАвтономнаяРаботаСлужебный.ПриложениеВСервисе(); + + Если РегистрыСведений.НастройкиАрхиваСообщенийОбменов.ПолучитьНастройки(Узел) = Неопределено Тогда + + Настройки = РегистрыСведений.НастройкиАрхиваСообщенийОбменов.СоздатьМенеджерЗаписи(); + Настройки.УзелИнформационнойБазы = Узел; + Настройки.КоличествоФайлов = 1; + Настройки.ХранитьНаДиске = Ложь; + Настройки.СжиматьФайлы = Истина; + Настройки.Записать(); // АПК:1363 Настройки не участвуют в обмене + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СообщенияОбменов @@ -5514,236 +6136,6 @@ Возврат Результат; КонецФункции -// Получает сообщение обмена из информационной базы корреспондента через веб-сервис во временный каталог пользователя -// ОС. -// -// Параметры: -// Отказ - Булево - флаг отказа; поднимается в случае возникновения ошибки. -// УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого выполняется получение сообщения обмена. -// ИдентификаторФайла - УникальныйИдентификатор - идентификатор файла. -// ДлительнаяОперация - Булево - признак использования длительное операции. -// ИдентификаторОперации - УникальныйИдентификатор - уникальный идентификатор длительной операции. -// ПараметрыАутентификации - Структура - содержит параметры аутентификации на веб-сервисе (Пользователь, Пароль). -// -// Возвращаемое значение: -// Структура со следующими ключи: -// * ИмяВременногоКаталогаСообщенийОбмена - полное имя каталога обмена, в которое было загружено сообщение обмена. -// * ИмяФайлаСообщенияОбмена - полное имя файла сообщения обмена. -// * ИдентификаторФайлаПакетаДанных - дата изменения файла сообщения обмена. -// -Функция ПолучитьСообщениеОбменаВоВременныйКаталогИзИнформационнойБазыКорреспондентаЧерезВебСервис( - Отказ, - УзелИнформационнойБазы, - ИдентификаторФайла, - ДлительнаяОперация, - ИдентификаторОперации, - ПараметрыАутентификации = Неопределено) Экспорт - - ПроверитьВозможностьВыполненияОбменов(); - - ПроверитьИспользованиеОбменаДанными(); - - УстановитьПривилегированныйРежим(Истина); - - // Возвращаемое значение функции. - Результат = Новый Структура; - Результат.Вставить("ИмяВременногоКаталогаСообщенийОбмена", ""); - Результат.Вставить("ИмяФайлаСообщенияОбмена", ""); - Результат.Вставить("ИдентификаторФайлаПакетаДанных", Неопределено); - - // Параметры, которые будут определены в функции. - ИмяКаталогаСообщенияОбмена = ""; - ИмяФайлаСообщенияОбмена = ""; - ДатаФайлаСообщенияОбмена = Дата('00010101'); - - СтруктураНастроекОбмена = Новый Структура; - СтруктураНастроекОбмена.Вставить("ИмяПланаОбмена", ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелИнформационнойБазы)); - СтруктураНастроекОбмена.Вставить("УзелИнформационнойБазы", УзелИнформационнойБазы); - СтруктураНастроекОбмена.Вставить("КлючСообщенияЖурналаРегистрации", - КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных)); - СтруктураНастроекОбмена.Вставить("ТекущийУзелПланаОбмена", - ОбменДаннымиПовтИсп.ПолучитьЭтотУзелПланаОбмена(СтруктураНастроекОбмена.ИмяПланаОбмена)); - СтруктураНастроекОбмена.Вставить("ТекущийУзелПланаОбменаКод", - ИдентификаторЭтогоУзлаДляОбмена(УзелИнформационнойБазы)); - СтруктураНастроекОбмена.Вставить("ДействиеПриОбмене", Перечисления.ДействияПриОбмене.ЗагрузкаДанных); - - ПараметрыПрокси = Новый Структура; - ПараметрыПрокси.Вставить("ПараметрыАутентификации", ПараметрыАутентификации); - - Прокси = Неопределено; - СостояниеНастройки = Неопределено; - СообщениеОбОшибке = ""; - ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, СтруктураНастроекОбмена, ПараметрыПрокси, Отказ, СостояниеНастройки, СообщениеОбОшибке); - - Если Отказ Тогда - ЗаписьЖурналаРегистрацииОбменаДанными(СообщениеОбОшибке, СтруктураНастроекОбмена, Истина); - Возврат Результат; - КонецЕсли; - - Попытка - - Прокси.UploadData( - СтруктураНастроекОбмена.ИмяПланаОбмена, - СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, - ИдентификаторФайла, - ДлительнаяОперация, - ИдентификаторОперации, - Истина); - - Исключение - - Отказ = Истина; - Сообщение = НСтр("ru = 'При выгрузке данных возникли ошибки во второй информационной базе: %1'", ОбщегоНазначения.КодОсновногоЯзыка()); - Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - - ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Истина); - - Возврат Результат; - КонецПопытки; - - Если ДлительнаяОперация Тогда - ЗаписьЖурналаРегистрацииОбменаДанными(НСтр("ru = 'Ожидание получения данных от базы-корреспондента...'", - ОбщегоНазначения.КодОсновногоЯзыка()), СтруктураНастроекОбмена); - Возврат Результат; - КонецЕсли; - - Попытка - ИмяФайлаИзСервисаПередачиФайлов = ПолучитьФайлИзХранилищаВСервисе(Новый УникальныйИдентификатор(ИдентификаторФайла), - СтруктураНастроекОбмена.УзелИнформационнойБазы,, ПараметрыАутентификации); - Исключение - - Отказ = Истина; - Сообщение = НСтр("ru = 'Возникли ошибки при получении сообщения обмена из сервиса передачи файлов: %1'", ОбщегоНазначения.КодОсновногоЯзыка()); - Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - - ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Истина); - - Возврат Результат; - КонецПопытки; - - Попытка - ИмяКаталогаСообщенияОбмена = СоздатьВременныйКаталогСообщенийОбмена(); - Исключение - Отказ = Истина; - Сообщение = НСтр("ru = 'При получении сообщения обмена возникли ошибки: %1'", ОбщегоНазначения.КодОсновногоЯзыка()); - Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - - ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Истина); - - Возврат Результат; - КонецПопытки; - - ШаблонИмениФайлаСообщения = ШаблонИмениФайлаСообщения(СтруктураНастроекОбмена.ТекущийУзелПланаОбмена, - СтруктураНастроекОбмена.УзелИнформационнойБазы, Ложь); - - ИмяФайлаСообщенияОбмена = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ИмяКаталогаСообщенияОбмена, ШаблонИмениФайлаСообщения + ".xml"); - - ПереместитьФайл(ИмяФайлаИзСервисаПередачиФайлов, ИмяФайлаСообщенияОбмена); - - ФайлСообщенияОбмена = Новый Файл(ИмяФайлаСообщенияОбмена); - Если ФайлСообщенияОбмена.Существует() Тогда - ДатаФайлаСообщенияОбмена = ФайлСообщенияОбмена.ПолучитьВремяИзменения(); - КонецЕсли; - - Результат.ИмяВременногоКаталогаСообщенийОбмена = ИмяКаталогаСообщенияОбмена; - Результат.ИмяФайлаСообщенияОбмена = ИмяФайлаСообщенияОбмена; - Результат.ИдентификаторФайлаПакетаДанных = ДатаФайлаСообщенияОбмена; - - Возврат Результат; -КонецФункции - -// Получает сообщение обмена из базы-корреспондента через веб-сервис. -// Сохраняет полученное сообщение обмена во временный каталог. -// Используется в том случае, если получение сообщения обмена выполнялось в контексте фонового задания в -// базе-корреспонденте. -// -// Параметры: -// Отказ - Булево - флаг отказа; поднимается в случае возникновения ошибки. -// УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого выполняется получение сообщения обмена. -// ИдентификаторФайла - УникальныйИдентификатор - идентификатор файла. -// ПараметрыАутентификации - Структура - содержит параметры аутентификации на веб-сервисе (Пользователь, Пароль). -// -// Возвращаемое значение: -// Структура со следующими ключи: -// * ИмяВременногоКаталогаСообщенийОбмена - полное имя каталога обмена, в которое было загружено сообщение обмена. -// * ИмяФайлаСообщенияОбмена - полное имя файла сообщения обмена. -// * ИдентификаторФайлаПакетаДанных - дата изменения файла сообщения обмена. -// -Функция ПолучитьСообщениеОбменаВоВременныйКаталогИзИнформационнойБазыКорреспондентаЧерезВебСервисЗавершениеДлительнойОперации( - Отказ, - УзелИнформационнойБазы, - ИдентификаторФайла, - Знач ПараметрыАутентификации = Неопределено) Экспорт - - // Возвращаемое значение функции. - Результат = Новый Структура; - Результат.Вставить("ИмяВременногоКаталогаСообщенийОбмена", ""); - Результат.Вставить("ИмяФайлаСообщенияОбмена", ""); - Результат.Вставить("ИдентификаторФайлаПакетаДанных", Неопределено); - - // Параметры, которые будут определены в функции. - ИмяКаталогаСообщенияОбмена = ""; - ИмяФайлаСообщенияОбмена = ""; - ДатаФайлаСообщенияОбмена = Дата('00010101'); - - Попытка - - ИмяФайлаИзСервисаПередачиФайлов = ПолучитьФайлИзХранилищаВСервисе(Новый УникальныйИдентификатор(ИдентификаторФайла), УзелИнформационнойБазы,, ПараметрыАутентификации); - Исключение - - Отказ = Истина; - Сообщение = НСтр("ru = 'Возникли ошибки при получении сообщения обмена из сервиса передачи файлов: %1'", ОбщегоНазначения.КодОсновногоЯзыка()); - Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - СтруктураНастроекОбмена = Новый Структура("КлючСообщенияЖурналаРегистрации"); - СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); - ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Истина); - - Возврат Результат; - КонецПопытки; - - Попытка - ИмяКаталогаСообщенияОбмена = СоздатьВременныйКаталогСообщенийОбмена(); - Исключение - Отказ = Истина; - Сообщение = НСтр("ru = 'При получении сообщения обмена возникли ошибки: %1'", ОбщегоНазначения.КодОсновногоЯзыка()); - Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - СтруктураНастроекОбмена = Новый Структура("КлючСообщенияЖурналаРегистрации"); - СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); - ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Истина); - - Возврат Результат; - КонецПопытки; - - ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелИнформационнойБазы); - ТекущийУзелПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьЭтотУзелПланаОбмена(ИмяПланаОбмена); - - ШаблонИмениФайлаСообщения = ШаблонИмениФайлаСообщения(ТекущийУзелПланаОбмена, УзелИнформационнойБазы, Ложь); - - ИмяФайлаСообщенияОбмена = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ИмяКаталогаСообщенияОбмена, ШаблонИмениФайлаСообщения + ".xml"); - ФайлСообщенияОбмена = Новый Файл(ИмяФайлаСообщенияОбмена); - Если НЕ ФайлСообщенияОбмена.Существует() Тогда - // Возможно, файл удастся получить если применить виртуальный код узла. - ШаблонИмениФайлаСообщенияСтарый = ШаблонИмениФайлаСообщения; - ШаблонИмениФайлаСообщения = ШаблонИмениФайлаСообщения(ТекущийУзелПланаОбмена, УзелИнформационнойБазы, Ложь,, Истина); - Если ШаблонИмениФайлаСообщения <> ШаблонИмениФайлаСообщенияСтарый Тогда - ИмяФайлаСообщенияОбмена = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ИмяКаталогаСообщенияОбмена, ШаблонИмениФайлаСообщения + ".xml"); - ФайлСообщенияОбмена = Новый Файл(ИмяФайлаСообщенияОбмена); - КонецЕсли; - КонецЕсли; - - ПереместитьФайл(ИмяФайлаИзСервисаПередачиФайлов, ИмяФайлаСообщенияОбмена); - - Если ФайлСообщенияОбмена.Существует() Тогда - ДатаФайлаСообщенияОбмена = ФайлСообщенияОбмена.ПолучитьВремяИзменения(); - КонецЕсли; - - Результат.ИмяВременногоКаталогаСообщенийОбмена = ИмяКаталогаСообщенияОбмена; - Результат.ИмяФайлаСообщенияОбмена = ИмяФайлаСообщенияОбмена; - Результат.ИдентификаторФайлаПакетаДанных = ДатаФайлаСообщенияОбмена; - - Возврат Результат; -КонецФункции - // Выполняет удаление файлов сообщений обмена, которые не были удалены из-за сбоев в работе системы. // Удалению подлежат файлы обмена с датой размещения более суток от текущей универсальной даты, // и файлы для сопоставления с датой размещения более 7 суток от текущей универсальной даты. @@ -5905,866 +6297,6 @@ #КонецОбласти -#Область ДляРаботыЧерезВнешнееСоединение - -Процедура ВыполнитьВыгрузкуДляУзлаИнформационнойБазыВоВременноеХранилище(Знач ИмяПланаОбмена, Знач КодУзлаИнформационнойБазы, Адрес) Экспорт - - ПолноеИмяФайлаСообщенияОбмена = ПолучитьИмяВременногоФайла("xml"); - - ПараметрыОбменаДанными = ПараметрыОбменаДаннымиЧерезФайлИлиСтроку(); - - ПараметрыОбменаДанными.ПолноеИмяФайлаСообщенияОбмена = ПолноеИмяФайлаСообщенияОбмена; - ПараметрыОбменаДанными.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных; - ПараметрыОбменаДанными.ИмяПланаОбмена = ИмяПланаОбмена; - ПараметрыОбменаДанными.КодУзлаИнформационнойБазы = КодУзлаИнформационнойБазы; - - ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными); - - Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ПолноеИмяФайлаСообщенияОбмена)); - - УдалитьФайлы(ПолноеИмяФайлаСообщенияОбмена); - -КонецПроцедуры - -Процедура ВыполнитьВыгрузкуДляУзлаИнформационнойБазыВСервисПередачиФайлов(ПараметрыПроцедуры, АдресХранилища) Экспорт - - ИмяПланаОбмена = ПараметрыПроцедуры["ИмяПланаОбмена"]; - КодУзлаИнформационнойБазы = ПараметрыПроцедуры["КодУзлаИнформационнойБазы"]; - ИдентификаторФайла = ПараметрыПроцедуры["ИдентификаторФайла"]; - - ИспользоватьСжатие = ПараметрыПроцедуры.Свойство("ИспользоватьСжатие") И ПараметрыПроцедуры["ИспользоватьСжатие"]; - - УстановитьПривилегированныйРежим(Истина); - - ИмяФайлаСообщения = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( - КаталогВременногоХранилищаФайлов(), - УникальноеИмяФайлаСообщенияОбмена()); - - ПараметрыОбменаДанными = ПараметрыОбменаДаннымиЧерезФайлИлиСтроку(); - - ПараметрыОбменаДанными.ПолноеИмяФайлаСообщенияОбмена = ИмяФайлаСообщения; - ПараметрыОбменаДанными.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных; - ПараметрыОбменаДанными.ИмяПланаОбмена = ИмяПланаОбмена; - ПараметрыОбменаДанными.КодУзлаИнформационнойБазы = КодУзлаИнформационнойБазы; - - ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными); - - ИмяФайлаДляПомещенияВХранилище = ИмяФайлаСообщения; - Если ИспользоватьСжатие Тогда - ИмяФайлаДляПомещенияВХранилище = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( - КаталогВременногоХранилищаФайлов(), - УникальноеИмяФайлаСообщенияОбмена("zip")); - - Архиватор = Новый ЗаписьZipФайла(ИмяФайлаДляПомещенияВХранилище, , , , УровеньСжатияZIP.Максимальный); - Архиватор.Добавить(ИмяФайлаСообщения); - Архиватор.Записать(); - - УдалитьФайлы(ИмяФайлаСообщения); - КонецЕсли; - - ПоместитьФайлВХранилище(ИмяФайлаДляПомещенияВХранилище, ИдентификаторФайла); - -КонецПроцедуры - -Процедура ВыполнитьВыгрузкуДляУзлаИнформационнойБазыЧерезФайл(Знач ИмяПланаОбмена, - Знач КодУзлаИнформационнойБазы, - Знач ПолноеИмяФайлаСообщенияОбмена) Экспорт - - ПараметрыОбменаДанными = ПараметрыОбменаДаннымиЧерезФайлИлиСтроку(); - - ПараметрыОбменаДанными.ПолноеИмяФайлаСообщенияОбмена = ПолноеИмяФайлаСообщенияОбмена; - ПараметрыОбменаДанными.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных; - ПараметрыОбменаДанными.ИмяПланаОбмена = ИмяПланаОбмена; - ПараметрыОбменаДанными.КодУзлаИнформационнойБазы = КодУзлаИнформационнойБазы; - - ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными); - -КонецПроцедуры - -Процедура ВыполнитьВыгрузкуДляУзлаИнформационнойБазыЧерезСтроку(Знач ИмяПланаОбмена, Знач КодУзлаИнформационнойБазы, СообщениеОбмена) Экспорт - - ПараметрыОбменаДанными = ПараметрыОбменаДаннымиЧерезФайлИлиСтроку(); - - ПараметрыОбменаДанными.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных; - ПараметрыОбменаДанными.ИмяПланаОбмена = ИмяПланаОбмена; - ПараметрыОбменаДанными.КодУзлаИнформационнойБазы = КодУзлаИнформационнойБазы; - ПараметрыОбменаДанными.СообщениеОбмена = СообщениеОбмена; - - ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными); - - СообщениеОбмена = ПараметрыОбменаДанными.СообщениеОбмена; - -КонецПроцедуры - -Процедура ВыполнитьЗагрузкуДляУзлаИнформационнойБазыЧерезСтроку(Знач ИмяПланаОбмена, Знач КодУзлаИнформационнойБазы, СообщениеОбмена) Экспорт - - ПараметрыОбменаДанными = ПараметрыОбменаДаннымиЧерезФайлИлиСтроку(); - - ПараметрыОбменаДанными.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ЗагрузкаДанных; - ПараметрыОбменаДанными.ИмяПланаОбмена = ИмяПланаОбмена; - ПараметрыОбменаДанными.КодУзлаИнформационнойБазы = КодУзлаИнформационнойБазы; - ПараметрыОбменаДанными.СообщениеОбмена = СообщениеОбмена; - - ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными); - - СообщениеОбмена = ПараметрыОбменаДанными.СообщениеОбмена; - -КонецПроцедуры - -Процедура ВыполнитьЗагрузкуДляУзлаИнформационнойБазыИзСервисаПередачиФайлов(ПараметрыПроцедуры, АдресХранилища) Экспорт - - ИмяПланаОбмена = ПараметрыПроцедуры["ИмяПланаОбмена"]; - КодУзлаИнформационнойБазы = ПараметрыПроцедуры["КодУзлаИнформационнойБазы"]; - ИдентификаторФайла = ПараметрыПроцедуры["ИдентификаторФайла"]; - - УстановитьПривилегированныйРежим(Истина); - - ИмяВременногоФайла = ПолучитьФайлИзХранилища(ИдентификаторФайла); - - ПараметрыОбменаДанными = ПараметрыОбменаДаннымиЧерезФайлИлиСтроку(); - - ПараметрыОбменаДанными.ПолноеИмяФайлаСообщенияОбмена = ИмяВременногоФайла; - ПараметрыОбменаДанными.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ЗагрузкаДанных; - ПараметрыОбменаДанными.ИмяПланаОбмена = ИмяПланаОбмена; - ПараметрыОбменаДанными.КодУзлаИнформационнойБазы = КодУзлаИнформационнойБазы; - - Попытка - ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными); - Исключение - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - УдалитьФайлы(ИмяВременногоФайла); - ВызватьИсключение ПредставлениеОшибки; - КонецПопытки; - - УдалитьФайлы(ИмяВременногоФайла); -КонецПроцедуры - -Функция ПараметрыОбменаДаннымиЧерезФайлИлиСтроку() Экспорт - - СтруктураПараметров = Новый Структура; - - СтруктураПараметров.Вставить("УзелИнформационнойБазы"); - СтруктураПараметров.Вставить("ПолноеИмяФайлаСообщенияОбмена", ""); - СтруктураПараметров.Вставить("ДействиеПриОбмене"); - СтруктураПараметров.Вставить("ИмяПланаОбмена", ""); - СтруктураПараметров.Вставить("КодУзлаИнформационнойБазы", ""); - СтруктураПараметров.Вставить("СообщениеОбмена", ""); - СтруктураПараметров.Вставить("ДатаНачалаОперации"); - - Возврат СтруктураПараметров; - -КонецФункции - -Процедура ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбмена) Экспорт - - ПроверитьВозможностьВыполненияОбменов(); - - ПроверитьИспользованиеОбменаДанными(); - - УстановитьПривилегированныйРежим(Истина); - - Если ПараметрыОбмена.УзелИнформационнойБазы = Неопределено Тогда - - ИмяПланаОбмена = ПараметрыОбмена.ИмяПланаОбмена; - КодУзлаИнформационнойБазы = ПараметрыОбмена.КодУзлаИнформационнойБазы; - - ПараметрыОбмена.УзелИнформационнойБазы = ПланыОбмена[ИмяПланаОбмена].НайтиПоКоду(КодУзлаИнформационнойБазы); - - Если ПараметрыОбмена.УзелИнформационнойБазы.Пустая() - И ЭтоПланОбменаXDTO(ИмяПланаОбмена) Тогда - ОшибкаПерехода = Ложь; - НастройкаСинхронизацииЧерезУФ = ПланыОбмена[ИмяПланаОбмена].ПереходНаСинхронизациюЧерезУниверсальныйФорматИнтернет( - КодУзлаИнформационнойБазы, ОшибкаПерехода); - Если ЗначениеЗаполнено(НастройкаСинхронизацииЧерезУФ) Тогда - ПараметрыОбмена.УзелИнформационнойБазы = НастройкаСинхронизацииЧерезУФ; - ИначеЕсли ОшибкаПерехода Тогда - СтрокаСообщенияОбОшибке = НСтр("ru = 'Не удалось выполнить переход на синхронизацию данных через универсальный формат.'"); - ВызватьИсключение СтрокаСообщенияОбОшибке; - КонецЕсли; - КонецЕсли; - - Если ПараметрыОбмена.УзелИнформационнойБазы.Пустая() Тогда - СтрокаСообщенияОбОшибке = НСтр("ru = 'Узел плана обмена %1 с кодом %2 не найден.'"); - СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ИмяПланаОбмена, КодУзлаИнформационнойБазы); - ВызватьИсключение СтрокаСообщенияОбОшибке; - КонецЕсли; - - КонецЕсли; - - ВыполнитьОбновлениеНастроекОбмена(ПараметрыОбмена.УзелИнформационнойБазы); - - Если Не НастройкаСинхронизацииЗавершена(ПараметрыОбмена.УзелИнформационнойБазы) Тогда - - ПредставлениеПрограммы = ?(ОбщегоНазначения.РазделениеВключено(), - Метаданные.Синоним, ОбменДаннымиПовтИсп.ИмяЭтойИнформационнойБазы()); - - ДанныеКорреспондента = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПараметрыОбмена.УзелИнформационнойБазы, - "Код, Наименование"); - - СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В ""%1"" настройка синхронизации данных с ""%2"" (идентификатор ""%3"") еще не завершена.'"), - ПредставлениеПрограммы, ДанныеКорреспондента.Наименование, ДанныеКорреспондента.Код); - - ВызватьИсключение СтрокаСообщенияОбОшибке; - КонецЕсли; - - // ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ - СтруктураНастроекОбмена = НастройкиОбменаДляУзлаИнформационнойБазы( - ПараметрыОбмена.УзелИнформационнойБазы, ПараметрыОбмена.ДействиеПриОбмене, Неопределено, Ложь); - Если ЗначениеЗаполнено(ПараметрыОбмена.ДатаНачалаОперации) Тогда - СтруктураНастроекОбмена.ДатаНачала = ПараметрыОбмена.ДатаНачалаОперации; - КонецЕсли; - ЗафиксироватьНачалоОбменаВРегистреСведений(СтруктураНастроекОбмена); - - Если СтруктураНастроекОбмена.Отказ Тогда - СтрокаСообщенияОбОшибке = НСтр("ru = 'Ошибка при инициализации процесса обмена данными.'"); - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - ВызватьИсключение СтрокаСообщенияОбОшибке; - КонецЕсли; - - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; - - СтрокаСообщения = НСтр("ru = 'Начало процесса обмена данными для узла %1'", ОбщегоНазначения.КодОсновногоЯзыка()); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, СтруктураНастроекОбмена.УзелИнформационнойБазыНаименование); - ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщения, СтруктураНастроекОбмена); - - Если СтруктураНастроекОбмена.ПроизводитьЗагрузкуДанных Тогда - - СозданВременныйФайл = Ложь; - Если ПараметрыОбмена.ПолноеИмяФайлаСообщенияОбмена = "" - И ПараметрыОбмена.СообщениеОбмена <> "" Тогда - - ПараметрыОбмена.ПолноеИмяФайлаСообщенияОбмена = ПолучитьИмяВременногоФайла(".xml"); - ТекстовыйФайл = Новый ТекстовыйДокумент; - ТекстовыйФайл.УстановитьТекст(ПараметрыОбмена.СообщениеОбмена); - ТекстовыйФайл.Записать(ПараметрыОбмена.ПолноеИмяФайлаСообщенияОбмена); - СозданВременныйФайл = Истина; - КонецЕсли; - - ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ПараметрыОбмена.ПолноеИмяФайлаСообщенияОбмена, ПараметрыОбмена.СообщениеОбмена); - - // {Обработчик: ПослеЧтенияСообщенияОбмена} Начало - СтандартнаяОбработка = Истина; - - ПослеЧтенияСообщенияОбмена( - СтруктураНастроекОбмена.УзелИнформационнойБазы, - ПараметрыОбмена.ПолноеИмяФайлаСообщенияОбмена, - РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена), - СтандартнаяОбработка); - // {Обработчик: ПослеЧтенияСообщенияОбмена} Окончание - - Если СозданВременныйФайл Тогда - - Попытка - УдалитьФайлы(ПараметрыОбмена.ПолноеИмяФайлаСообщенияОбмена); - Исключение - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - КонецЕсли; - - ИначеЕсли СтруктураНастроекОбмена.ПроизводитьВыгрузкуДанных Тогда - - ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ПараметрыОбмена.ПолноеИмяФайлаСообщенияОбмена, ПараметрыОбмена.СообщениеОбмена); - - КонецЕсли; - - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - - Если Не РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) Тогда - ВызватьИсключение СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке; - КонецЕсли; - -КонецПроцедуры - -Процедура ЗафиксироватьЗавершениеОбменаЧерезВнешнееСоединение(СтруктураНастроекОбмена) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - -КонецПроцедуры - -Функция СтруктураНастроекОбменаЧерезВнешнееСоединение(Структура) Экспорт - - ПроверитьИспользованиеОбменаДанными(); - - УстановитьПривилегированныйРежим(Истина); - - УзелИнформационнойБазы = ПланыОбмена[Структура.ИмяПланаОбмена].НайтиПоКоду(Структура.ТекущийУзелПланаОбменаКод); - - ДействиеПриОбмене = Перечисления.ДействияПриОбмене[Структура.ДействиеПриОбменеСтрокой]; - - СтруктураНастроекОбменаВнешнееСоединение = Новый Структура; - СтруктураНастроекОбменаВнешнееСоединение.Вставить("ИмяПланаОбмена", Структура.ИмяПланаОбмена); - СтруктураНастроекОбменаВнешнееСоединение.Вставить("РежимОтладки", Структура.РежимОтладки); - - СтруктураНастроекОбменаВнешнееСоединение.Вставить("УзелИнформационнойБазы", УзелИнформационнойБазы); - СтруктураНастроекОбменаВнешнееСоединение.Вставить("УзелИнформационнойБазыНаименование", Строка(УзелИнформационнойБазы)); - - СтруктураНастроекОбменаВнешнееСоединение.Вставить("КлючСообщенияЖурналаРегистрации", КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, ДействиеПриОбмене)); - - СтруктураНастроекОбменаВнешнееСоединение.Вставить("РезультатВыполненияОбмена", Неопределено); - СтруктураНастроекОбменаВнешнееСоединение.Вставить("РезультатВыполненияОбменаСтрокой", ""); - - СтруктураНастроекОбменаВнешнееСоединение.Вставить("ДействиеПриОбмене", ДействиеПриОбмене); - - СтруктураНастроекОбменаВнешнееСоединение.Вставить("ОтладкаОбработчиковВыгрузки ", Ложь); - СтруктураНастроекОбменаВнешнееСоединение.Вставить("ОтладкаОбработчиковЗагрузки", Ложь); - СтруктураНастроекОбменаВнешнееСоединение.Вставить("ИмяФайлаВнешнейОбработкиОтладкиВыгрузки", ""); - СтруктураНастроекОбменаВнешнееСоединение.Вставить("ИмяФайлаВнешнейОбработкиОтладкиЗагрузки", ""); - СтруктураНастроекОбменаВнешнееСоединение.Вставить("РежимПротоколированияОбменаДанными", Ложь); - СтруктураНастроекОбменаВнешнееСоединение.Вставить("ИмяФайлаПротоколаОбмена", ""); - СтруктураНастроекОбменаВнешнееСоединение.Вставить("ПродолжитьПриОшибке", Ложь); - - УстановитьНастройкиРежимаОтладкиДляСтруктуры(СтруктураНастроекОбменаВнешнееСоединение, Истина); - - СтруктураНастроекОбменаВнешнееСоединение.Вставить("КоличествоОбъектовОбработано", 0); - - СтруктураНастроекОбменаВнешнееСоединение.Вставить("ДатаНачала", Неопределено); - СтруктураНастроекОбменаВнешнееСоединение.Вставить("ДатаОкончания", Неопределено); - - СтруктураНастроекОбменаВнешнееСоединение.Вставить("СообщениеПриОбмене", ""); - СтруктураНастроекОбменаВнешнееСоединение.Вставить("СтрокаСообщенияОбОшибке", ""); - - СтруктураНастроекОбменаВнешнееСоединение.Вставить("КоличествоЭлементовВТранзакции", Структура.КоличествоЭлементовВТранзакции); - - СтруктураНастроекОбменаВнешнееСоединение.Вставить("ЭтоОбменВРИБ", Ложь); - - СтруктураНастроекОбменаВнешнееСоединение.Вставить("НастройкаСинхронизацииДанныхЗавершена", Ложь); - СтруктураНастроекОбменаВнешнееСоединение.Вставить("ПолученоСообщениеДляСопоставленияДанных", Ложь); - СтруктураНастроекОбменаВнешнееСоединение.Вставить("ПоддерживаетсяСопоставлениеДанных", Истина); - - Если ЗначениеЗаполнено(УзелИнформационнойБазы) Тогда - СтруктураНастроекОбменаВнешнееСоединение.НастройкаСинхронизацииДанныхЗавершена = НастройкаСинхронизацииЗавершена(УзелИнформационнойБазы); - СтруктураНастроекОбменаВнешнееСоединение.ПолученоСообщениеДляСопоставленияДанных = ПолученоСообщениеСДаннымиДляСопоставления(УзелИнформационнойБазы); - СтруктураНастроекОбменаВнешнееСоединение.ПоддерживаетсяСопоставлениеДанных = ЗначениеНастройкиПланаОбмена(Структура.ИмяПланаОбмена, - "ПоддерживаетсяСопоставлениеДанных", СохраненныйВариантНастройкиУзлаПланаОбмена(УзелИнформационнойБазы)); - КонецЕсли; - - Возврат СтруктураНастроекОбменаВнешнееСоединение; -КонецФункции - -Функция ПолучитьПравилаКонвертацииОбъектовЧерезВнешнееСоединение(ИмяПланаОбмена, ПолучатьПравилаКорреспондента = Ложь) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Возврат РегистрыСведений.ПравилаДляОбменаДанными.ЗачитанныеПравилаКонвертацииОбъектов(ИмяПланаОбмена, ПолучатьПравилаКорреспондента); - -КонецФункции - -Процедура ПередЧтениемСообщенияОбмена(Знач Получатель, СообщениеОбмена, СтандартнаяОбработка) - - Если ЭтоПодчиненныйУзелРИБ() - И ТипЗнч(ГлавныйУзел()) = ТипЗнч(Получатель) Тогда - - СохраненноеСообщениеОбмена = СообщениеОбменаДаннымиИзГлавногоУзла(); - - Если ТипЗнч(СохраненноеСообщениеОбмена) = Тип("ДвоичныеДанные") Тогда - // Приведение к новому формату хранения и повторное зачитывание - // значения константы СообщениеОбменаДаннымиИзГлавногоУзла. - УстановитьСообщениеОбменаДаннымиИзГлавногоУзла(СохраненноеСообщениеОбмена, Получатель); - СохраненноеСообщениеОбмена = СообщениеОбменаДаннымиИзГлавногоУзла(); - КонецЕсли; - - Если ТипЗнч(СохраненноеСообщениеОбмена) = Тип("Структура") Тогда - - СтандартнаяОбработка = Ложь; - - СообщениеОбмена = СохраненноеСообщениеОбмена.ПутьКФайлу; - - ЗаписатьСобытиеПолученияДанных(Получатель, НСтр("ru = 'Сообщение обмена получено из кэша.'")); - - УстановитьПривилегированныйРежим(Истина); - УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("СообщениеПолученоИзКэша", Истина); - УстановитьПривилегированныйРежим(Ложь); - - Иначе - УстановитьПривилегированныйРежим(Истина); - УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("СообщениеПолученоИзКэша", Ложь); - УстановитьПривилегированныйРежим(Ложь); - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -Процедура ПослеЧтенияСообщенияОбмена(Знач Получатель, Знач СообщениеОбмена, Знач СообщениеПрочитано, СтандартнаяОбработка, Знач УдалитьСообщение = Истина) - - Если ОбменДаннымиСлужебный.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("ЗагрузкаРасширений") Тогда - Возврат; - КонецЕсли; - - Если ЭтоПодчиненныйУзелРИБ() - И ТипЗнч(ГлавныйУзел()) = ТипЗнч(Получатель) Тогда - - Если Не СообщениеПрочитано - И ОбменДаннымиСлужебный.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("СообщениеПолученоИзКэша") Тогда - // Не удалось прочитать сообщение, полученное из кэша - требуется очистка кэша. - ОчиститьСообщениеОбменаДаннымиИзГлавногоУзла(); - Возврат; - КонецЕсли; - - ОбновитьСообщениеВКэше = Ложь; - - Если КонфигурацияИзменена() ИЛИ ОбменДаннымиСлужебный.ЗагрузитьРасширенияИзменяющиеСтруктуруДанных() Тогда - - // Т.к. конфигурация может быть изменена повторно, требуется - // обновить кэш, если он содержит устаревшее сообщение, - // а не только при первой загрузке изменений конфигурации. - ОбновитьСообщениеВКэше = Истина; - - Если Не СообщениеПрочитано Тогда - - Если НЕ Константы.ЗагрузитьСообщениеОбменаДанными.Получить() Тогда - Константы.ЗагрузитьСообщениеОбменаДанными.Установить(Истина); - КонецЕсли; - - КонецЕсли; - - Иначе - - Если УдалитьСообщение Тогда - - ОчиститьСообщениеОбменаДаннымиИзГлавногоУзла(); - Если Константы.ЗагрузитьСообщениеОбменаДанными.Получить() Тогда - Константы.ЗагрузитьСообщениеОбменаДанными.Установить(Ложь); - КонецЕсли; - - Иначе - // Т.к. чтение сообщение обмена может быть без загрузки метаданных, - // то нужно сохранить сообщение обмена после чтения параметров работы программы, - // чтобы не загружать его повторно для основного чтения. - ОбновитьСообщениеВКэше = Истина; - КонецЕсли; - - КонецЕсли; - - Если ОбновитьСообщениеВКэше Тогда - - СтароеСообщение = СообщениеОбменаДаннымиИзГлавногоУзла(); - - ОбновитьКэш = Ложь; - НовоеСообщение = Новый ДвоичныеДанные(СообщениеОбмена); - - ТипСтруктура = ТипЗнч(СтароеСообщение) = Тип("Структура"); - - Если ТипСтруктура Или ТипЗнч(СтароеСообщение) = Тип("ДвоичныеДанные") Тогда - - Если ТипСтруктура Тогда - СтароеСообщение = Новый ДвоичныеДанные(СтароеСообщение.ПутьКФайлу); - КонецЕсли; - - Если СтароеСообщение.Размер() <> НовоеСообщение.Размер() Тогда - ОбновитьКэш = Истина; - ИначеЕсли НовоеСообщение <> СтароеСообщение Тогда - ОбновитьКэш = Истина; - КонецЕсли; - - Иначе - - ОбновитьКэш = Истина; - - КонецЕсли; - - Если ОбновитьКэш Тогда - УстановитьСообщениеОбменаДаннымиИзГлавногоУзла(НовоеСообщение, Получатель); - КонецЕсли; - КонецЕсли; - - КонецЕсли; - - Если СообщениеПрочитано И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - РегистрыСведений.ОбработчикиСобытийСинхронизацииДанных.ВыполнитьОбработчики(Получатель, "ПослеПолученияДанных"); - КонецЕсли; - -КонецПроцедуры - -// Записывает изменения узла информационной базы в файл во временном каталоге. -// -// Параметры: -// СтруктураНастроекОбмена - Структура - структура со всеми необходимыми данными и объектами для выполнения обмена. -// -Процедура ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, Знач ИмяФайлаСообщенияОбмена = "", СообщениеОбмена = "") - - Если СтруктураНастроекОбмена.ЭтоОбменВРИБ Тогда // Обмен в РИБ - - Отказ = Ложь; - СообщениеОбОшибке = ""; - - // Получаем обработку обмена данными. - ОбработкаОбменаДанными = СтруктураНастроекОбмена.ОбработкаОбменаДанными; - - // Устанавливаем имя файла сообщения обмена, который необходимо прочитать. - ОбработкаОбменаДанными.УстановитьИмяФайлаСообщенияОбмена(ИмяФайлаСообщенияОбмена); - - ОбработкаОбменаДанными.ВыполнитьВыгрузкуДанных(Отказ, СообщениеОбОшибке); - - Если Отказ Тогда - - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; - СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = СообщениеОбОшибке; - - КонецЕсли; - - Иначе - - // {Обработчик: ПриВыгрузкеДанных} Начало. Переопределение стандартной обработки выгрузки данных. - СтандартнаяОбработка = Истина; - КоличествоОбъектовОбработано = 0; - - Попытка - - ПараметрыВыполнения = Новый Структура; - ПараметрыВыполнения.Вставить("УзелИнформационнойБазы", СтруктураНастроекОбмена.УзелИнформационнойБазы); - ПараметрыВыполнения.Вставить("КоличествоЭлементовВТранзакции", СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции); - ПараметрыВыполнения.Вставить("КлючСообщенияЖурналаРегистрации", СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации); - ПараметрыВыполнения.Вставить("ИмяФайлаСообщенияОбмена", ИмяФайлаСообщенияОбмена); - - Обработчики = Новый Массив; - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ОбменСообщениями") Тогда - МодульОбменСообщениямиВнутренний = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениямиВнутренний"); - Обработчики.Добавить(МодульОбменСообщениямиВнутренний); - КонецЕсли; - Обработчики.Добавить(ОбменДаннымиПереопределяемый); - - ОбработчикПриВыгрузкеДанныхБСП( - Обработчики, - ПараметрыВыполнения, - СтандартнаяОбработка, - СообщениеОбмена, - КоличествоОбъектовОбработано); - - Исключение - - СтрокаСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - - ЗаписьЖурналаРегистрации(СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, - СтруктураНастроекОбмена.УзелИнформационнойБазы.Метаданные(), - СтруктураНастроекОбмена.УзелИнформационнойБазы, СтрокаСообщенияОбОшибке); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; - СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = СтрокаСообщенияОбОшибке; - Возврат; - КонецПопытки; - - Если СтандартнаяОбработка = Ложь Тогда - СтруктураНастроекОбмена.КоличествоОбъектовОбработано = КоличествоОбъектовОбработано; - Возврат; - КонецЕсли; - // {Обработчик: ПриВыгрузкеДанных} Окончание - - // Универсальный обмен (обмен по правилам конвертации). - Если СтруктураНастроекОбмена.ОбменПоПравиламКонвертацииОбъектов Тогда - - ФормироватьСообщениеОбмена = ПустаяСтрока(ИмяФайлаСообщенияОбмена); - Если ФормироватьСообщениеОбмена Тогда - ИмяФайлаСообщенияОбмена = ПолучитьИмяВременногоФайла(".xml"); - КонецЕсли; - - // Получаем инициализированную обработку обмена данными. - ОбработкаОбменаДаннымиXML = СтруктураНастроекОбмена.ОбработкаОбменаДанными; //ОбработкаОбъект.КонвертацияОбъектовXDTO - ОбработкаОбменаДаннымиXML.ИмяФайлаОбмена = ИмяФайлаСообщенияОбмена; - - // выгрузка данных - Попытка - ОбработкаОбменаДаннымиXML.ВыполнитьВыгрузкуДанных(); - Исключение - СтрокаСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - - ЗаписьЖурналаРегистрации(СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, - СтруктураНастроекОбмена.УзелИнформационнойБазы.Метаданные(), - СтруктураНастроекОбмена.УзелИнформационнойБазы, СтрокаСообщенияОбОшибке); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; - СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = СтрокаСообщенияОбОшибке; - Возврат; - КонецПопытки; - - Если ФормироватьСообщениеОбмена Тогда - ТекстовыйФайл = Новый ТекстовыйДокумент; - ТекстовыйФайл.Прочитать(ИмяФайлаСообщенияОбмена, КодировкаТекста.UTF8); - СообщениеОбмена = ТекстовыйФайл.ПолучитьТекст(); - УдалитьФайлы(ИмяФайлаСообщенияОбмена); - КонецЕсли; - - СтруктураНастроекОбмена.РезультатВыполненияОбмена = ОбработкаОбменаДаннымиXML.РезультатВыполненияОбмена(); - - // Фиксируем состояние выполнения обмена данными. - СтруктураНастроекОбмена.КоличествоОбъектовОбработано = ОбработкаОбменаДаннымиXML.СчетчикВыгруженныхОбъектов(); - СтруктураНастроекОбмена.СообщениеПриОбмене = ОбработкаОбменаДаннымиXML.КомментарийПриВыгрузкеДанных; - СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = ОбработкаОбменаДаннымиXML.СтрокаСообщенияОбОшибке(); - - Иначе // Стандартный обмен (платформенная сериализация). - - Отказ = Ложь; - КоличествоОбъектовОбработано = 0; - - Попытка - ВыполнитьСтандартнуюВыгрузкуИзмененийДляУзла(Отказ, - СтруктураНастроекОбмена.УзелИнформационнойБазы, - ИмяФайлаСообщенияОбмена, - СообщениеОбмена, - СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции, - СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, - КоличествоОбъектовОбработано); - Исключение - СтрокаСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - - ЗаписьЖурналаРегистрации(СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, - СтруктураНастроекОбмена.УзелИнформационнойБазы.Метаданные(), - СтруктураНастроекОбмена.УзелИнформационнойБазы, СтрокаСообщенияОбОшибке); - СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = СтрокаСообщенияОбОшибке; - Отказ = Истина; - КонецПопытки; - - СтруктураНастроекОбмена.КоличествоОбъектовОбработано = КоличествоОбъектовОбработано; - - Если Отказ Тогда - - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; - - КонецЕсли; - - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -// Получает сообщение обмена с новыми данными и загружает данные в информационную базу. -// -// Параметры: -// СтруктураНастроекОбмена - Структура - структура со всеми необходимыми данными и объектами для выполнения обмена. -// -Процедура ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, - Знач ИмяФайлаСообщенияОбмена = "", СообщениеОбмена = "", Знач ТолькоПараметры = Ложь) - - Если СтруктураНастроекОбмена.ЭтоОбменВРИБ Тогда // Обмен в РИБ - - Отказ = Ложь; - - // Получаем обработку обмена данными. - ОбработкаОбменаДанными = СтруктураНастроекОбмена.ОбработкаОбменаДанными; //ОбработкаОбъект.КонвертацияОбъектовРаспределенныхИнформационныхБаз - - // Устанавливаем имя файла сообщения обмена, который необходимо прочитать. - ОбработкаОбменаДанными.УстановитьИмяФайлаСообщенияОбмена(ИмяФайлаСообщенияОбмена); - - СообщениеОбОшибке = ""; - ОбработкаОбменаДанными.ВыполнитьЗагрузкуДанных(Отказ, ТолькоПараметры, СообщениеОбОшибке); - - Если Отказ Тогда - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; - СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = СообщениеОбОшибке; - КонецЕсли; - - Иначе - - // {Обработчик: ПриЗагрузкеДанных} Начало. Переопределение стандартной обработки загрузки данных. - СтандартнаяОбработка = Истина; - КоличествоОбъектовОбработано = 0; - - Попытка - - ПараметрыВыполнения = Новый Структура; - ПараметрыВыполнения.Вставить("УзелИнформационнойБазы", СтруктураНастроекОбмена.УзелИнформационнойБазы); - ПараметрыВыполнения.Вставить("КоличествоЭлементовВТранзакции", СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции); - ПараметрыВыполнения.Вставить("КлючСообщенияЖурналаРегистрации", СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации); - ПараметрыВыполнения.Вставить("ИмяФайлаСообщенияОбмена", ИмяФайлаСообщенияОбмена); - - Обработчики = Новый Массив; - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ОбменСообщениями") Тогда - МодульОбменСообщениямиВнутренний = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениямиВнутренний"); - Обработчики.Добавить(МодульОбменСообщениямиВнутренний); - КонецЕсли; - Обработчики.Добавить(ОбменДаннымиПереопределяемый); - - ОбработчикПриЗагрузкеДанныхБСП( - Обработчики, - ПараметрыВыполнения, - СтандартнаяОбработка, - СообщениеОбмена, - КоличествоОбъектовОбработано); - - Исключение - СтрокаСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - - ЗаписьЖурналаРегистрации(СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, - СтруктураНастроекОбмена.УзелИнформационнойБазы.Метаданные(), - СтруктураНастроекОбмена.УзелИнформационнойБазы, СтрокаСообщенияОбОшибке); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; - СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = СтрокаСообщенияОбОшибке; - Возврат; - КонецПопытки; - - Если СтандартнаяОбработка = Ложь Тогда - СтруктураНастроекОбмена.КоличествоОбъектовОбработано = КоличествоОбъектовОбработано; - Возврат; - КонецЕсли; - // {Обработчик: ПриЗагрузкеДанных} Окончание - - // Универсальный обмен (обмен по правилам конвертации). - Если СтруктураНастроекОбмена.ОбменПоПравиламКонвертацииОбъектов Тогда - - // Получаем инициализированную обработку обмена данными. - ОбработкаОбменаДаннымиXML = СтруктураНастроекОбмена.ОбработкаОбменаДанными; //ОбработкаОбъект.КонвертацияОбъектовXDTO - ОбработкаОбменаДаннымиXML.ИмяФайлаОбмена = ИмяФайлаСообщенияОбмена; - - // загрузка данных - Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(СтруктураНастроекОбмена.ИмяПланаОбмена) Тогда - ПараметрыЗагрузки = Новый Структура; - ПараметрыЗагрузки.Вставить("ОбменДаннымиСВнешнейСистемой", - СтруктураНастроекОбмена.ВидТранспортаОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.ВнешняяСистема); - - ОбработкаОбменаДаннымиXML.ВыполнитьЗагрузкуДанных(ПараметрыЗагрузки); - - ПолученыДанныеДляСопоставления = Ложь; - Если Не ОбработкаОбменаДаннымиXML.КомпонентыОбмена.ФлагОшибки Тогда - ПолученыДанныеДляСопоставления = (ОбработкаОбменаДаннымиXML.КомпонентыОбмена.НомерВходящегоСообщения > 0 - И ОбработкаОбменаДаннымиXML.КомпонентыОбмена.НомерСообщенияПолученногоКорреспондентом = 0); - КонецЕсли; - СтруктураНастроекОбмена.ДополнительныеПараметры.Вставить("ПолученыДанныеДляСопоставления", ПолученыДанныеДляСопоставления); - Иначе - ОбработкаОбменаДаннымиXML.ВыполнитьЗагрузкуДанных(); - КонецЕсли; - - СтруктураНастроекОбмена.РезультатВыполненияОбмена = ОбработкаОбменаДаннымиXML.РезультатВыполненияОбмена(); - - // Фиксируем состояние выполнения обмена данными. - СтруктураНастроекОбмена.КоличествоОбъектовОбработано = ОбработкаОбменаДаннымиXML.СчетчикЗагруженныхОбъектов(); - СтруктураНастроекОбмена.СообщениеПриОбмене = ОбработкаОбменаДаннымиXML.КомментарийПриЗагрузкеДанных; - СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = ОбработкаОбменаДаннымиXML.СтрокаСообщенияОбОшибке(); - - Иначе // Стандартный обмен (платформенная сериализация). - - КоличествоОбъектовОбработано = 0; - РезультатВыполненияОбмена = Неопределено; - - ВыполнитьСтандартнуюЗагрузкуИзмененийДляУзла( - СтруктураНастроекОбмена.УзелИнформационнойБазы, - ИмяФайлаСообщенияОбмена, - СообщениеОбмена, - СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции, - СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, - КоличествоОбъектовОбработано, - РезультатВыполненияОбмена); - - СтруктураНастроекОбмена.КоличествоОбъектовОбработано = КоличествоОбъектовОбработано; - СтруктураНастроекОбмена.РезультатВыполненияОбмена = РезультатВыполненияОбмена; - - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -Процедура ВыполнитьОбменДаннымиСВнешнейСистемойЗагрузкаДанных(СтруктураНастроекОбмена) - - ИмяВременногоКаталога = СоздатьВременныйКаталогСообщенийОбмена(); - - ИмяФайлаСообщения = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( - ИмяВременногоКаталога, УникальноеИмяФайлаСообщенияОбмена()); - - ОбработкаТранспортаСообщенийОбмена = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена; - - СообщениеПолучено = Ложь; - Попытка - СообщениеПолучено = ОбработкаТранспортаСообщенийОбмена.ПолучитьСообщение(ИмяФайлаСообщения); - Исключение - Информация = ИнформацияОбОшибке(); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка_ТранспортСообщения; - ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(Информация), СтруктураНастроекОбмена, Истина); - КонецПопытки; - - СообщениеОбработано = Ложь; - ВыполнитьОбработчикПослеЗагрузки = Ложь; - - Если СообщениеПолучено - И СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда - - ВыполнитьОбработчикПослеЗагрузки = Истина; - - ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ИмяФайлаСообщения); - - СообщениеОбработано = РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена); - - КонецЕсли; - - Попытка - УдалитьФайлы(ИмяВременногоКаталога); - Исключение - ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(Информация), СтруктураНастроекОбмена); - КонецПопытки; - - НастройкаЗавершена = НастройкаСинхронизацииЗавершена(СтруктураНастроекОбмена.УзелИнформационнойБазы); - - Если ВыполнитьОбработчикПослеЗагрузки Тогда - ЕстьСледующееСообщение = Ложь; - Попытка - ОбработкаТранспортаСообщенийОбмена.ПослеОбработкиПолученногоСообщения(СообщениеОбработано, ЕстьСледующееСообщение); - Исключение - Информация = ИнформацияОбОшибке(); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка_ТранспортСообщения; - ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(Информация), СтруктураНастроекОбмена, Истина); - ЕстьСледующееСообщение = Ложь; - КонецПопытки; - - Если СообщениеОбработано - И Не НастройкаЗавершена Тогда - - ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(СтруктураНастроекОбмена.УзелИнформационнойБазы); - - Если ЕстьАлгоритмМенеджераПланаОбмена("ПередНастройкойСинхронизацииДанных", ИмяПланаОбмена) Тогда - - Контекст = Новый Структура; - Контекст.Вставить("Корреспондент", СтруктураНастроекОбмена.УзелИнформационнойБазы); - Контекст.Вставить("ИдентификаторНастройки", СохраненныйВариантНастройкиУзлаПланаОбмена(СтруктураНастроекОбмена.УзелИнформационнойБазы)); - Контекст.Вставить("НачальнаяНастройка", Не НастройкаЗавершена); - - ИмяФормыПомощника = ""; - - ПланыОбмена[ИмяПланаОбмена].ПередНастройкойСинхронизацииДанных(Контекст, НастройкаЗавершена, ИмяФормыПомощника); - - Если НастройкаЗавершена Тогда - ЗавершитьНастройкуСинхронизацииДанных(СтруктураНастроекОбмена.УзелИнформационнойБазы); - КонецЕсли; - - КонецЕсли; - - КонецЕсли; - - Если ЕстьСледующееСообщение И НастройкаЗавершена Тогда - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; - ВыполнитьОбменДаннымиСВнешнейСистемойЗагрузкаДанных(СтруктураНастроекОбмена); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -Процедура ВыполнитьОбменДаннымиСВнешнейСистемойВыгрузкаНастроекXDTO(СтруктураНастроекОбмена) - - ОбработкаТранспортаСообщенийОбмена = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена; - - ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(СтруктураНастроекОбмена.УзелИнформационнойБазы); - - НастройкиXDTO = Новый Структура; - НастройкиXDTO.Вставить("ФорматОбмена", - ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена, "ФорматОбмена")); - НастройкиXDTO.Вставить("ПоддерживаемыеВерсии", - ОбменДаннымиXDTOСервер.ВерсииФорматаОбменаМассив(СтруктураНастроекОбмена.УзелИнформационнойБазы)); - НастройкиXDTO.Вставить("ПоддерживаемыеОбъекты", - ОбменДаннымиXDTOСервер.ПоддерживаемыеОбъектыФормата(ИмяПланаОбмена, , СтруктураНастроекОбмена.УзелИнформационнойБазы)); - - Попытка - ОбработкаТранспортаСообщенийОбмена.ОтправитьНастройкиXDTO(НастройкиXDTO); - Исключение - Информация = ИнформацияОбОшибке(); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка_ТранспортСообщения; - ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(Информация), СтруктураНастроекОбмена, Истина); - КонецПопытки; - -КонецПроцедуры - -#КонецОбласти - #Область ВыполнениеОбменаМетодамиСериализации // Процедура записи изменений для сообщения обмена. @@ -7336,18 +6868,6 @@ КонецФункции -// Определяет, входит ли план обмена в список планов обмена, которые используют обмен данными по формату XDTO. -// -// Параметры: -// ПланОбмена - ПланОбменаСсылка - ссылка на узел плана обмена или имя плана обмена. -// -// Возвращаемое значение: -// Булево - Истина, если план обмена используется для обмена данными по формату XDTO. -// -Функция ЭтоПланОбменаXDTO(ПланОбмена) Экспорт - Возврат ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(ПланОбмена); -КонецФункции - // Функция-свойство: возвращает литерал обозначения строки неограниченной длины. // // Возвращаемое значение: @@ -7443,6 +6963,7 @@ // Получаем инициализированную обработку транспорта сообщений. ОбработкаТранспортаСообщенийОбмена = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена; + ОбработкаТранспортаСообщенийОбмена.УзелИнформационнойБазы = СтруктураНастроекОбмена.УзелИнформационнойБазы; // Получаем сообщение обмена во временный каталог. Если Не ОбработкаТранспортаСообщенийОбмена.ПодключениеУстановлено() @@ -7525,175 +7046,6 @@ #Область СервисПередачиФайлов -// Функция по переданному идентификатору скачивает файл из сервиса передачи файлов. -// -// Параметры: -// ИдентификаторФайла - УникальныйИдентификатор - идентификатор получаемого файла. -// ПараметрыДоступаКСервису - Структура: АдресСервиса, ИмяПользователя, ПарольПользователя. -// РазмерЧасти - Число - размер части в килобайтах. Если значение равно 0, -// то разбивка на части не производится. -// Возвращаемое значение: -// Строка - путь к полученному файлу. -// -Функция ПолучитьФайлИзХранилищаВСервисе(Знач ИдентификаторФайла, Знач УзелИнформационнойБазы, Знач РазмерЧасти = 1024, Знач ПараметрыАутентификации = Неопределено) Экспорт - - // Возвращаемое значение функции. - ИмяФайлаРезультата = ""; - - ДополнительныеПараметры = Новый Структура("ПараметрыАутентификации", ПараметрыАутентификации); - - СообщениеОбОшибке = ""; - Прокси = WSПроксиДляУзлаИнформационнойБазы(УзелИнформационнойБазы, СообщениеОбОшибке, ДополнительныеПараметры); - - Если Прокси = Неопределено Тогда - ВызватьИсключение СообщениеОбОшибке; - КонецЕсли; - - ИдентификаторСессии = Неопределено; - КоличествоЧастей = Неопределено; - - Прокси.PrepareGetFile(ИдентификаторФайла, РазмерЧасти, ИдентификаторСессии, КоличествоЧастей); - - ИменаФайлов = Новый Массив; - - КаталогСборки = ПолучитьИмяВременногоФайла(); - СоздатьКаталог(КаталогСборки); - - ШаблонИмениФайла = "data.zip.[n]"; - - // Протоколирование событий обмена. - СтруктураНастроекОбмена = Новый Структура("КлючСообщенияЖурналаРегистрации"); - СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); - - Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Начало получения сообщения обмена из Интернета (количество частей файла %1).'"), - Формат(КоличествоЧастей, "ЧН=0; ЧГ=0")); - ЗаписьЖурналаРегистрацииОбменаДанными(Комментарий, СтруктураНастроекОбмена); - - Для НомерЧасти = 1 По КоличествоЧастей Цикл - ДанныеЧасти = Неопределено; // ДвоичныеДанные - Попытка - Прокси.GetFilePart(ИдентификаторСессии, НомерЧасти, ДанныеЧасти); - Исключение - Прокси.ReleaseFile(ИдентификаторСессии); - ВызватьИсключение; - КонецПопытки; - - ИмяФайла = СтрЗаменить(ШаблонИмениФайла, "[n]", Формат(НомерЧасти, "ЧГ=0")); - ИмяФайлаЧасти = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогСборки, ИмяФайла); - - ДанныеЧасти.Записать(ИмяФайлаЧасти); - ИменаФайлов.Добавить(ИмяФайлаЧасти); - КонецЦикла; - ДанныеЧасти = Неопределено; - - Прокси.ReleaseFile(ИдентификаторСессии); - - ИмяАрхива = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогСборки, "data.zip"); - - ОбъединитьФайлы(ИменаФайлов, ИмяАрхива); - - Разархиватор = Новый ЧтениеZipФайла(ИмяАрхива); - Если Разархиватор.Элементы.Количество() = 0 Тогда - Попытка - УдалитьФайлы(КаталогСборки); - Исключение - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУдалениеВременногоФайла(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - ВызватьИсключение(НСтр("ru = 'Файл архива не содержит данных.'")); - КонецЕсли; - - // Протоколирование событий обмена. - ФайлАрхива = Новый Файл(ИмяАрхива); - - Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Окончание получения сообщения обмена из Интернета (размер сжатого сообщения обмена %1 Мб).'"), - Формат(Окр(ФайлАрхива.Размер() / 1024 / 1024, 3), "ЧН=0; ЧГ=0")); - ЗаписьЖурналаРегистрацииОбменаДанными(Комментарий, СтруктураНастроекОбмена); - - ЭлементАрхива = Разархиватор.Элементы.Получить(0); - ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогСборки, ЭлементАрхива.Имя); - - Разархиватор.Извлечь(ЭлементАрхива, КаталогСборки); - Разархиватор.Закрыть(); - - Файл = Новый Файл(ИмяФайла); - - ВременныйКаталог = ПолучитьИмяВременногоФайла(); - СоздатьКаталог(ВременныйКаталог); - - ИмяФайлаРезультата = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ВременныйКаталог, Файл.Имя); - - ПереместитьФайл(ИмяФайла, ИмяФайлаРезультата); - - Попытка - УдалитьФайлы(КаталогСборки); - Исключение - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУдалениеВременногоФайла(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - Возврат ИмяФайлаРезультата; -КонецФункции - -// Функция передает указанный файл в сервис передачи файлов. -// -// Параметры: -// ИмяФайла - Строка - путь к передаваемому файлу. -// ПараметрыДоступаКСервису - Структура: АдресСервиса, ИмяПользователя, ПарольПользователя. -// РазмерЧасти - Число - размер части в килобайтах. Если значение равно 0, -// то разбивка на части не производится. -// Возвращаемое значение: -// УникальныйИдентификатор - идентификатор файла в сервисе передачи файлов. -// -Функция ПоместитьФайлВХранилищеВСервисе(Прокси, Знач ИмяФайла, Знач УзелИнформационнойБазы, Знач РазмерЧастиКБ = 1024) - Перем ИдентификаторФайла; - - Если Прокси = Неопределено Тогда - - ВызватьИсключение НСтр("ru ='Не определен WS-прокси передачи файла выгрузки в базу приемник. - |Обратитесь к администратору.'", ОбщегоНазначения.КодОсновногоЯзыка()); - - КонецЕсли; - - КаталогФайлов = ПолучитьИмяВременногоФайла(); - СоздатьКаталог(КаталогФайлов); - - // Архивирование файла. - ИмяНеразделенногоФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогФайлов, "data.zip"); - Архиватор = Новый ЗаписьZipФайла(ИмяНеразделенногоФайла,,,, УровеньСжатияZIP.Максимальный); - Архиватор.Добавить(ИмяФайла); - Архиватор.Записать(); - - // Разделение файла на части. - ИдентификаторСессии = Новый УникальныйИдентификатор; - - РазмерЧастиВБайтах = РазмерЧастиКБ * 1024; - ИменаФайлов = РазделитьФайл(ИмяНеразделенногоФайла, РазмерЧастиВБайтах); - - КоличествоЧастей = ИменаФайлов.Количество(); - Для НомерЧасти = 1 По КоличествоЧастей Цикл - - ИмяФайлаЧасти = ИменаФайлов[НомерЧасти - 1]; - ДанныеФайла = Новый ДвоичныеДанные(ИмяФайлаЧасти); - Прокси.PutFilePart(ИдентификаторСессии, НомерЧасти, ДанныеФайла); - - КонецЦикла; - - Попытка - УдалитьФайлы(КаталогФайлов); - Исключение - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУдалениеВременногоФайла(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - Прокси.SaveFileFromParts(ИдентификаторСессии, КоличествоЧастей, ИдентификаторФайла); - - Возврат ИдентификаторФайла; - -КонецФункции - // Получение имени файла по его идентификатору из хранилища. // Если файла с указанным идентификатором нет, то вызывается исключение. // Если файл найден, то возвращается его имя, при этом удаляется информация об этом файле из хранилища. @@ -8253,35 +7605,6 @@ КонецФункции -// Устанавливает пароль синхронизации данных для заданного узла. -// Пароль сохраняется в параметре сеанса. -// -Процедура УстановитьПарольСинхронизацииДанных(Знач УзелИнформационнойБазы, Знач Пароль) - - УстановитьПривилегированныйРежим(Истина); - - ПаролиСинхронизацииДанных = Новый Соответствие; - - Для Каждого Элемент Из ПараметрыСеанса.ПаролиСинхронизацииДанных Цикл - - ПаролиСинхронизацииДанных.Вставить(Элемент.Ключ, Элемент.Значение); - - КонецЦикла; - - ПаролиСинхронизацииДанных.Вставить(УзелИнформационнойБазы, Пароль); - - ПараметрыСеанса.ПаролиСинхронизацииДанных = Новый ФиксированноеСоответствие(ПаролиСинхронизацииДанных); - -КонецПроцедуры - -// Сбрасывает пароль синхронизации данных для заданного узла. -// -Процедура СброситьПарольСинхронизацииДанных(Знач УзелИнформационнойБазы) - - УстановитьПарольСинхронизацииДанных(УзелИнформационнойБазы, Неопределено); - -КонецПроцедуры - #КонецОбласти #Область КонтрольНеразделенныхДанных @@ -8579,48 +7902,6 @@ КонецФункции -// Получает таблицу правил выборочной регистрации объектов из информационной базы. -// -// Параметры: -// Нет. -// -// Возвращаемое значение: -// ПравилаВыборочнойРегистрацииОбъектов - ТаблицаЗначений - таблица общих правил выборочной регистрации объектов для -// МРО. -// -Функция ПолучитьПравилаВыборочнойРегистрацииОбъектов() Экспорт - - // Возвращаемое значение функции. - ПравилаВыборочнойРегистрацииОбъектов = ИнициализацияТаблицыПравилВыборочнойРегистрацииОбъектов(); - - ТекстЗапроса = " - |ВЫБРАТЬ - | ПравилаДляОбменаДанными.ПравилаЗачитанные КАК ПравилаЗачитанные - |ИЗ - | РегистрСведений.ПравилаДляОбменаДанными КАК ПравилаДляОбменаДанными - |ГДЕ - | ПравилаДляОбменаДанными.ВидПравил = ЗНАЧЕНИЕ(Перечисление.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов) - | И ПравилаДляОбменаДанными.ИспользоватьФильтрВыборочнойРегистрацииОбъектов - | И ПравилаДляОбменаДанными.ПравилаЗагружены - |"; - - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - - Выборка = Запрос.Выполнить().Выбрать(); - - Пока Выборка.Следующий() Цикл - - СтруктураПравилОбмена = Выборка.ПравилаЗачитанные.Получить(); - - ЗаполнитьЗначенияСвойствДляТаблицыЗначений(ПравилаВыборочнойРегистрацииОбъектов, СтруктураПравилОбмена["ПравилаВыборочнойРегистрацииОбъектов"]); - - КонецЦикла; - - Возврат ПравилаВыборочнойРегистрацииОбъектов; - -КонецФункции - Функция ИнициализацияТаблицыПравилРегистрацииОбъектов() Экспорт // Возвращаемое значение функции. @@ -8667,27 +7948,6 @@ КонецФункции -Функция ИнициализацияТаблицыПравилВыборочнойРегистрацииОбъектов() Экспорт - - // Возвращаемое значение функции. - Правила = Новый ТаблицаЗначений; - - Колонки = Правила.Колонки; - - Колонки.Добавить("Порядок", Новый ОписаниеТипов("Число")); - Колонки.Добавить("ИмяОбъекта", Новый ОписаниеТипов("Строка")); - Колонки.Добавить("ИмяПланаОбмена", Новый ОписаниеТипов("Строка")); - Колонки.Добавить("ИмяТабличнойЧасти", Новый ОписаниеТипов("Строка")); - Колонки.Добавить("РеквизитыРегистрации", Новый ОписаниеТипов("Строка")); - Колонки.Добавить("СтруктураРеквизитовРегистрации", Новый ОписаниеТипов("Структура")); - - // добавляем индекс - Правила.Индексы.Добавить("ИмяПланаОбмена, ИмяОбъекта"); - - Возврат Правила; - -КонецФункции - Функция ПланОбменаНеСодержитУзлов(Знач ИмяПланаОбмена) Запрос = Новый Запрос( @@ -8714,16 +7974,6 @@ КонецПроцедуры -Процедура ЗаполнитьЗначенияСвойствДляТаблицыЗначений(ТаблицаПриемник, ТаблицаИсточник) - - Для Каждого СтрокаИсточника Из ТаблицаИсточник Цикл - - ЗаполнитьЗначенияСвойств(ТаблицаПриемник.Добавить(), СтрокаИсточника); - - КонецЦикла; - -КонецПроцедуры - Функция ОписаниеПравилСинхронизацииДанных(Знач УзелИнформационнойБазы) Экспорт УстановитьПривилегированныйРежим(Истина); @@ -8809,7 +8059,1673 @@ #КонецОбласти -#Область ИнициализацияСтруктурыНастроекОбмена +#Область РаботаСМониторомПроблемОбменаДанными + +Функция КоличествоПроблемОбменаДанными(УзлыОбмена = Неопределено) + + ПараметрыПоискаПроблем = РегистрыСведений.РезультатыОбменаДанными.ПараметрыПоискаПроблем(); + ПараметрыПоискаПроблем.УзлыПланаОбмена = УзлыОбмена; + + ТипыПроблем = Новый Массив; + ТипыПроблем.Добавить(Перечисления.ТипыПроблемОбменаДанными.НезаполненныеРеквизиты); + ТипыПроблем.Добавить(Перечисления.ТипыПроблемОбменаДанными.НепроведенныйДокумент); + ТипыПроблем.Добавить(Перечисления.ТипыПроблемОбменаДанными.ОшибкаПроверкиСконвертированногоОбъекта); + + ПараметрыПоискаПроблем.ТипПроблемы = ТипыПроблем; + + Возврат РегистрыСведений.РезультатыОбменаДанными.КоличествоПроблем(ПараметрыПоискаПроблем); + +КонецФункции + +Функция КоличествоПроблемВерсионирования(УзлыОбмена = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт + + Если ПараметрыЗапроса = Неопределено Тогда + ПараметрыЗапроса = ПараметрыЗапросаКоличествоПроблемВерсионирования(); + КонецЕсли; + + ИспользуетсяВерсионирование = ОбменДаннымиПовтИсп.ИспользуетсяВерсионирование(, Истина); + + Если ИспользуетсяВерсионирование Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + Возврат МодульВерсионированиеОбъектов.КоличествоКоллизийИлиНепринятых( + УзлыОбмена, + ПараметрыЗапроса.ЭтоКоличествоКоллизий, + ПараметрыЗапроса.УчитыватьПроигнорированные, + ПараметрыЗапроса.Период, + ПараметрыЗапроса.СтрокаПоиска); + КонецЕсли; + + Возврат 0; + +КонецФункции + +Функция ПараметрыЗапросаКоличествоПроблемВерсионирования() Экспорт + + Результат = Новый Структура; + + Результат.Вставить("ЭтоКоличествоКоллизий", Неопределено); + Результат.Вставить("УчитыватьПроигнорированные", Ложь); + Результат.Вставить("Период", Неопределено); + Результат.Вставить("СтрокаПоиска", ""); + + Возврат Результат; + +КонецФункции + +// Регистрирует ошибки при отложенном проведении документа в мониторе проблем обмена. +// +// Параметры: +// Объект - ДокументОбъект - документ при отложенном проведении которого возникли ошибки. +// УзелОбмена - ПланОбменаСсылка - узел информационной базы из которой получен документ. +// СообщениеОбОшибке - Строка - текст сообщения для журнала регистрации. +// Рекомендуется передавать в качестве этого параметра КраткоеПредставлениеОшибки(ИнформацияОбОшибке()). +// Текст сообщения для отображения в мониторе формируется из системных сообщений пользователю, которые +// были сформированы, но еще не были выведены пользователю. Поэтому рекомендуется, чтобы к моменту вызова +// данного метода в буфере сообщений системы не содержалось сообщений. +// РегистрироватьПроблемыВРезультатахОбмена - Булево - необходимо регистрировать проблемы. +// +// Пример: +// Процедура ПровестиДокументПриЗагрузке(Документ, УзелОбмена) +// Документ.ОбменДанными.Загрузка = Истина; +// Документ.Записать(); +// Документ.ОбменДанными.Загрузка = Ложь; +// Отказ = Ложь; +// +// Попытка +// Документ.Записать(РежимЗаписиДокумента.Проведение); +// Исключение +// СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); +// Отказ = Истина; +// КонецПопытки; +// +// Если Отказ Тогда +// ОбменДаннымиСервер.ЗарегистрироватьОшибкуПроведенияДокумента(Документ, УзелОбмена, СообщениеОбОшибке); +// КонецЕсли; +// +// КонецПроцедуры; +// +Процедура ЗарегистрироватьОшибкуПроведенияДокумента( + Объект, + УзелОбмена, + ТекстИсключения, + РегистрироватьПроблемыВРезультатахОбмена = Истина) + + СообщенияПользователю = ПолучитьСообщенияПользователю(Истина); + ТекстСообщения = ТекстИсключения; + Для Каждого Сообщение Из СообщенияПользователю Цикл + + Если СтрНайти(Сообщение.Текст, "СтандартныеПодсистемы.ДлительныеОперации") > 0 Тогда + + Продолжить; + + КонецЕсли; + + ТекстСообщения = ТекстСообщения + ?(ПустаяСтрока(ТекстСообщения), "", Символы.ПС) + Сообщение.Текст; + + КонецЦикла; + ТекстСообщения = СокрЛП(ТекстСообщения); + + СтрокаСообщения = ""; + Если Не ПустаяСтрока(ТекстСообщения) Тогда + СтрокаСообщения = НСтр("ru = 'Не удалось провести документ %1, полученный из другой информационной базы. + |По причине: %2. + |Возможно, не заполнены все реквизиты, обязательные к заполнению.'", + ОбщегоНазначения.КодОсновногоЯзыка()); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + СтрокаСообщения, Строка(Объект), ТекстСообщения); + Иначе + СтрокаСообщения = НСтр("ru = 'Не удалось провести документ %1, полученный из другой информационной базы. + |Возможно, не заполнены все реквизиты, обязательные к заполнению.'", + ОбщегоНазначения.КодОсновногоЯзыка()); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + СтрокаСообщения, Строка(Объект)); + КонецЕсли; + + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), УровеньЖурналаРегистрации.Предупреждение,,, СтрокаСообщения); + + Если РегистрироватьПроблемыВРезультатахОбмена Тогда + РегистрыСведений.РезультатыОбменаДанными.ЗарегистрироватьОшибкуПроверкиОбъекта(Объект.Ссылка, УзелОбмена, + ТекстСообщения, Перечисления.ТипыПроблемОбменаДанными.НепроведенныйДокумент); + КонецЕсли; + +КонецПроцедуры + +// Регистрирует ошибки при отложенной записи объекта в мониторе проблем обмена. +// +// Параметры: +// Объект - СправочникОбъект, ДокументОбъект и т.п. - объект, при отложенной записи которого возникли ошибки. +// УзелОбмена - ПланОбменаСсылка - узел информационной базы из которой получен объект. +// СообщениеОбОшибке - Строка - текст сообщения для журнала регистрации. +// Рекомендуется передавать в качестве этого параметра КраткоеПредставлениеОшибки(ИнформацияОбОшибке()). +// Текст сообщения для отображения в мониторе формируется из системных сообщений пользователю, которые +// были сформированы, но еще не были выведены пользователю. Поэтому рекомендуется, чтобы к моменту вызова +// данного метода в буфере сообщений системы не содержалось сообщений. +// +// Пример: +// Процедура ЗаписатьОбъектПриЗагрузке(Объект, УзелОбмена) +// Объект.ОбменДанными.Загрузка = Истина; +// Объект.Записать(); +// Объект.ОбменДанными.Загрузка = Ложь; +// Отказ = Ложь; +// +// Попытка +// Объект.Записать(); +// Исключение +// СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); +// Отказ = Истина; +// КонецПопытки; +// +// Если Отказ Тогда +// ОбменДаннымиСервер.ЗарегистрироватьОшибкуЗаписиОбъекта(Объект, УзелОбмена, СообщениеОбОшибке); +// КонецЕсли; +// +// КонецПроцедуры; +// +Процедура ЗарегистрироватьОшибкуЗаписиОбъекта( + Объект, + УзелОбмена, + ТекстИсключения) + + СообщенияПользователю = ПолучитьСообщенияПользователю(Истина); + ТекстСообщения = ТекстИсключения; + Для Каждого Сообщение Из СообщенияПользователю Цикл + + Если СтрНайти(Сообщение.Текст, "СтандартныеПодсистемы.ДлительныеОперации") > 0 Тогда + + Продолжить; + + КонецЕсли; + + ТекстСообщения = ТекстСообщения + ?(ПустаяСтрока(ТекстСообщения), "", Символы.ПС) + Сообщение.Текст; + + КонецЦикла; + + ПричинаОшибки = ТекстСообщения; + Если Не ПустаяСтрока(СокрЛП(ТекстСообщения)) Тогда + + ПричинаОшибки = " " + НСтр("ru = 'По причине %1.'"); + ПричинаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ПричинаОшибки, ТекстСообщения); + + КонецЕсли; + + СтрокаСообщения = НСтр("ru = 'Не удалось записать объект %1, полученный из другой информационной базы.%2 + |Возможно не заполнены все реквизиты, обязательные к заполнению.'", + ОбщегоНазначения.КодОсновногоЯзыка()); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, Строка(Объект), ПричинаОшибки); + + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), УровеньЖурналаРегистрации.Предупреждение,,, СтрокаСообщения); + + РегистрыСведений.РезультатыОбменаДанными.ЗарегистрироватьОшибкуПроверкиОбъекта(Объект.Ссылка, УзелОбмена, + ТекстСообщения, Перечисления.ТипыПроблемОбменаДанными.НезаполненныеРеквизиты); + +КонецПроцедуры + +#КонецОбласти + +#Область ПрогрессБар + +// Подсчет количества объектов ИБ, подлежащих выгрузке при создании начального образа. +// +// Параметры: +// Получатель - ПланОбменаОбъект - узел плана обмена, соответствующий получателю. +// +// Возвращаемое значение: +// Число +// +Функция РассчитатьКоличествоОбъектовВБазе(Получатель) + + ИмяПланаОбмена = Получатель.Метаданные().Имя; + СчетчикОбъектов = 0; + СоставПланаОбмена = Метаданные.ПланыОбмена[ИмяПланаОбмена].Состав; + + // 1. "Ссылочные" объекты. + СтруктураСсылочныхОбъектов = Новый Структура; + СтруктураСсылочныхОбъектов.Вставить("Справочник", Метаданные.Справочники); + СтруктураСсылочныхОбъектов.Вставить("Документ", Метаданные.Документы); + СтруктураСсылочныхОбъектов.Вставить("ПланВидовХарактеристик", Метаданные.ПланыВидовХарактеристик); + СтруктураСсылочныхОбъектов.Вставить("ПланВидовРасчета", Метаданные.ПланыВидовРасчета); + СтруктураСсылочныхОбъектов.Вставить("ПланСчетов", Метаданные.ПланыСчетов); + СтруктураСсылочныхОбъектов.Вставить("БизнесПроцесс", Метаданные.БизнесПроцессы); + СтруктураСсылочныхОбъектов.Вставить("Задача", Метаданные.Задачи); + СтруктураСсылочныхОбъектов.Вставить("ПланСчетов", Метаданные.ПланыСчетов); + + ШаблонТекстаЗапросаСсылки = + "ВЫБРАТЬ + | КОЛИЧЕСТВО(ПсевдонимТаблицыМетаданных.Ссылка) КАК КоличествоОбъектов + |ИЗ + | &ИмяТаблицыМетаданных КАК ПсевдонимТаблицыМетаданных"; + + Для Каждого СсылочныйОбъект Из СтруктураСсылочныхОбъектов Цикл + + Для Каждого ОбъектМетаданных Из СсылочныйОбъект.Значение Цикл + + Если СоставПланаОбмена.Найти(ОбъектМетаданных) = Неопределено Тогда + + Продолжить; + + КонецЕсли; + + ПолноеИмяОбъекта = СсылочныйОбъект.Ключ + "." + ОбъектМетаданных.Имя; + ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапросаСсылки, "&ИмяТаблицыМетаданных", ПолноеИмяОбъекта); + + Запрос = Новый Запрос(ТекстЗапроса); + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + + СчетчикОбъектов = СчетчикОбъектов + Выборка.КоличествоОбъектов; + + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + + // 2. Константы. + Для Каждого ОбъектМетаданных Из Метаданные.Константы Цикл + Если СоставПланаОбмена.Найти(ОбъектМетаданных) = Неопределено Тогда + Продолжить; + КонецЕсли; + СчетчикОбъектов = СчетчикОбъектов + 1; + КонецЦикла; + + // 3. Регистры сведений. + ШаблонТекстаЗапросаБезРегистратора = + "ВЫБРАТЬ + | КОЛИЧЕСТВО(*) КАК КоличествоОбъектов + |ИЗ + | &ИмяТаблицыМетаданных КАК ПсевдонимТаблицыМетаданных"; + + ШаблонТекстаЗапросаСРегистратором = + "ВЫБРАТЬ + | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПсевдонимТаблицыМетаданных.Регистратор) КАК КоличествоОбъектов + |ИЗ + | &ИмяТаблицыМетаданных КАК ПсевдонимТаблицыМетаданных"; + + Для Каждого ОбъектМетаданных Из Метаданные.РегистрыСведений Цикл + + Если СоставПланаОбмена.Найти(ОбъектМетаданных) = Неопределено Тогда + + Продолжить; + + КонецЕсли; + + ПолноеИмяОбъекта = "РегистрСведений."+ОбъектМетаданных.Имя; + Если ОбъектМетаданных.ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.ПозицияРегистратора Тогда + + ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапросаСРегистратором, "&ИмяТаблицыМетаданных", ПолноеИмяОбъекта); + + Иначе + + ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапросаБезРегистратора, "&ИмяТаблицыМетаданных", ПолноеИмяОбъекта); + + КонецЕсли; + + Запрос = Новый Запрос(ТекстЗапроса); + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + + СчетчикОбъектов = СчетчикОбъектов + Выборка.КоличествоОбъектов; + + КонецЕсли; + + КонецЦикла; + + // 4. Регистры (подчиненные регистратору) и последовательности. + СтруктураРегистров = Новый Структура; + СтруктураРегистров.Вставить("РегистрНакопления", Метаданные.РегистрыНакопления); + СтруктураРегистров.Вставить("РегистрРасчета", Метаданные.РегистрыРасчета); + СтруктураРегистров.Вставить("РегистрБухгалтерии", Метаданные.РегистрыБухгалтерии); + СтруктураРегистров.Вставить("Последовательность", Метаданные.Последовательности); + + Для Каждого Регистр Из СтруктураРегистров Цикл + + Для Каждого ОбъектМетаданных Из Регистр.Значение Цикл + + Если СоставПланаОбмена.Найти(ОбъектМетаданных) = Неопределено Тогда + + Продолжить; + + КонецЕсли; + + ПолноеИмяОбъекта = Регистр.Ключ +"."+ОбъектМетаданных.Имя; + ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапросаСРегистратором, "&ИмяТаблицыМетаданных", ПолноеИмяОбъекта); + + Запрос = Новый Запрос(ТекстЗапроса); + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + + СчетчикОбъектов = СчетчикОбъектов + Выборка.КоличествоОбъектов; + + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + + Возврат СчетчикОбъектов; + +КонецФункции + +// Подсчет количества объектов, зарегистрированных в плане обмена. +// +// Параметры: +// Получатель - ПланОбменаОбъект +// +// Возвращаемое значение: +// Число +// +Функция РассчитатьКоличествоЗарегистрированныхОбъектов(Получатель) Экспорт + + ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(Получатель.Ссылка, Получатель.НомерОтправленного + 1); + КоличествоОбъектовКВыгрузке = 0; + Пока ВыборкаИзменений.Следующий() Цикл + КоличествоОбъектовКВыгрузке = КоличествоОбъектовКВыгрузке + 1; + КонецЦикла; + Возврат КоличествоОбъектовКВыгрузке; + +КонецФункции + +#КонецОбласти + +#Область РаботаСКонстантойСообщениеОбменаИзГлавногоУзла + +// Зачитывает из информационной базы информацию о сообщении обмена данными. +// +// Возвращаемое значение: +// Структура - информация о расположении файла сообщения обмена (текущий формат). +// - ДвоичныеДанные - сообщение обмена в информационной базе (устаревший формат). +// +Функция СообщениеОбменаДаннымиИзГлавногоУзла() Экспорт + + Возврат Константы.СообщениеОбменаДаннымиИзГлавногоУзла.Получить().Получить(); + +КонецФункции + +// Записывает на диск файл сообщения обмена, полученный из главного узла. +// Сохраняет путь к записанному сообщению в константу СообщениеОбменаДаннымиИзГлавногоУзла. +// +// Параметры: +// СообщениеОбмена - ДвоичныеДанные - зачитанное сообщение обмена. +// ГлавныйУзел - ПланОбменаСсылка - узел из которого получено сообщение. +// +Процедура УстановитьСообщениеОбменаДаннымиИзГлавногоУзла(СообщениеОбмена, ГлавныйУзел) Экспорт + + ПутьКФайлу = "[Каталог][Путь].xml"; + ПутьКФайлу = СтрЗаменить(ПутьКФайлу, "[Каталог]", КаталогВременногоХранилищаФайлов()); + ПутьКФайлу = СтрЗаменить(ПутьКФайлу, "[Путь]", Новый УникальныйИдентификатор); + + СообщениеОбмена.Записать(ПутьКФайлу); + + СтруктураСообщения = Новый Структура; + СтруктураСообщения.Вставить("ПутьКФайлу", ПутьКФайлу); + + Константы.СообщениеОбменаДаннымиИзГлавногоУзла.Установить(Новый ХранилищеЗначения(СтруктураСообщения)); + + ЗаписатьСобытиеПолученияДанных(ГлавныйУзел, НСтр("ru = 'Сообщение обмена записано в кэш.'")); + +КонецПроцедуры + +// Удаляет файл сообщения обмена с диска и очищает константу СообщениеОбменаДаннымиИзГлавногоУзла. +// +Процедура ОчиститьСообщениеОбменаДаннымиИзГлавногоУзла() Экспорт + + СообщениеОбмена = СообщениеОбменаДаннымиИзГлавногоУзла(); + + Если ТипЗнч(СообщениеОбмена) = Тип("Структура") Тогда + + УдалитьФайлы(СообщениеОбмена.ПутьКФайлу); + + КонецЕсли; + + Константы.СообщениеОбменаДаннымиИзГлавногоУзла.Установить(Новый ХранилищеЗначения(Неопределено)); + + ЗаписатьСобытиеПолученияДанных(ГлавныйУзел(), НСтр("ru = 'Сообщение обмена удалено из кэша.'")); + +КонецПроцедуры + +#КонецОбласти + +#Область ПрофилиБезопасности + +Процедура СформироватьЗапросыНаИспользованиеВнешнихРесурсов(ЗапросыРазрешений) + + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Возврат; + КонецЕсли; + + Константы.КаталогСообщенийОбменаДаннымиДляLinux.СоздатьМенеджерЗначения().ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + Константы.КаталогСообщенийОбменаДаннымиДляWindows.СоздатьМенеджерЗначения().ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + РегистрыСведений.НастройкиТранспортаОбменаДанными.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + КонецЕсли; + + РегистрыСведений.ПравилаДляОбменаДанными.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + +КонецПроцедуры + +// Параметры: +// ЗапросыРазрешений - Массив из УникальныйИдентификатор - коллекция запросов разрешений. +// Объект - КонстантаМенеджерЗначения - менеджер значения объекта данных. +// +Процедура ЗапросВнешнихРесурсовДляКаталогаСообщенийОбменаДанными(ЗапросыРазрешений, Объект) Экспорт + + ЗначениеКонстанты = Объект.Значение; + МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); + Если Не ПустаяСтрока(ЗначениеКонстанты) Тогда + + Разрешения = Новый Массив; + Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы( + ЗначениеКонстанты, Истина, Истина)); + + ЗапросыРазрешений.Добавить( + МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, + ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Объект.Метаданные()))); + + КонецЕсли; + +КонецПроцедуры + +// Возвращает шаблон имени профиля безопасности для внешнего модуля. +// Функция должна возвращать одно и то же значение при многократном вызове. +// +// Параметры: +// ВнешнийМодуль - ЛюбаяСсылка - ссылка на внешний модуль. +// +// Возвращаемое значение: +// Строка - шаблон имя профиля безопасности, содержащий символы +// "%1", вместо которых в дальнейшем будет подставлен уникальный идентификатор. +// +Функция ШаблонИмениПрофиляБезопасности(Знач ВнешнийМодуль) Экспорт + + Шаблон = "Exchange_[ИмяПланаОбмена]_%1"; // Не локализуется + Возврат СтрЗаменить(Шаблон, "[ИмяПланаОбмена]", ВнешнийМодуль.Имя); + +КонецФункции + +// Возвращает пиктограмму, отображающую внешний модуль. +// +// ВнешнийМодуль - ЛюбаяСсылка, ссылка на внешний модуль, +// +// Возвращаемое значение: +// Картинка. +// +Функция ПиктограммаВнешнегоМодуля(Знач ВнешнийМодуль) Экспорт + + Возврат БиблиотекаКартинок.СинхронизацияДанных; + +КонецФункции + +Функция СловарьКонтейнераВнешнегоМодуля() Экспорт + + Результат = Новый Структура(); + + Результат.Вставить("Именительный", НСтр("ru = 'Настройка синхронизации данных'")); + Результат.Вставить("Родительный", НСтр("ru = 'Настройки синхронизации данных'")); + + Возврат Результат; + +КонецФункции + +Функция КонтейнерыВнешнихМодулей() Экспорт + + Результат = Новый Массив(); + ОбменДаннымиПереопределяемый.ПолучитьПланыОбмена(Результат); + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область ВыполнениеДействий + +Процедура ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыПоВнешнемуСоединению(Отказ, УзелИнформационнойБазы, + ДействиеПриОбмене, + КоличествоЭлементовВТранзакции, + СообщениеДляСопоставленияДанных = Ложь) + + УстановитьПривилегированныйРежим(Истина); + + // ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ + СтруктураНастроекОбмена = НастройкиОбменаДляВнешнегоСоединения( + УзелИнформационнойБазы, + ДействиеПриОбмене, + КоличествоЭлементовВТранзакции); + + ЗаписьЖурналаРегистрацииНачалаОбменаДанными(СтруктураНастроекОбмена); + + Если СтруктураНастроекОбмена.Отказ Тогда + // Если настройка содержит ошибки, то обмен не производим; статус "Отменено". + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Отказ = Истина; + Возврат; + КонецЕсли; + + СтрокаСообщенияОбОшибке = ""; + + // Получаем внешнее соединение для узла информационной базы. + ВнешнееСоединение = ОбменДаннымиПовтИсп.ПолучитьВнешнееСоединениеДляУзлаИнформационнойБазы( + УзелИнформационнойБазы, + СтрокаСообщенияОбОшибке); + + Если ВнешнееСоединение = Неопределено Тогда + + // добавляем запись в ЖР + ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); + + // Если настройка содержит ошибки, то обмен не производим; статус "Отменено". + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Отказ = Истина; + Возврат; + КонецЕсли; + + // Получаем версию удаленной базы. + ВерсияБСППоВнешнемуСоединению = ВнешнееСоединение.СтандартныеПодсистемыСервер.ВерсияБиблиотеки(); + ОбменСБСП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") <> Неопределено + Или ВерсииИнтерфейса.Найти("3.0.2.1") <> Неопределено Тогда + + СообщениеОбОшибке = ""; + ПараметрыИнформационнойБазы = ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.ПолучитьПараметрыИнформационнойБазы_2_0_1_6( + СтруктураНастроекОбмена.ИмяПланаОбмена, СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, СообщениеОбОшибке); + ПараметрыКорреспондента = ОбщегоНазначения.ЗначениеИзСтрокиXML(ПараметрыИнформационнойБазы); + Если ПараметрыКорреспондента.Свойство("ПоддерживаетсяСопоставлениеДанных") Тогда + ЕстьПоддержкаСопоставления = ПараметрыКорреспондента.ПоддерживаетсяСопоставлениеДанных; + КонецЕсли; + Если ПараметрыКорреспондента.Свойство("НастройкаСинхронизацииДанныхЗавершена") Тогда + НастройкаСинхронизацииДанныхЗавершена = ПараметрыКорреспондента.НастройкаСинхронизацииДанныхЗавершена; + КонецЕсли; + + КонецЕсли; + + Если СообщениеДляСопоставленияДанных + И (ЕстьПоддержкаСопоставления Или Не НастройкаСинхронизацииДанныхЗавершена) Тогда + ОбработкаДляЗагрузкиДанных.РежимЗагрузкиДанных = "ЗагрузкаСообщенияДляСопоставленияДанных"; + КонецЕсли; + + ОбработкаДляЗагрузкиДанных.КоличествоОбъектовНаТранзакцию = СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции; + ОбработкаДляЗагрузкиДанных.ИспользоватьТранзакции = (ОбработкаДляЗагрузкиДанных.КоличествоОбъектовНаТранзакцию <> 1); + + // Получаем инициализированную обработку для выгрузки данных. + ОбработкаОбменаДаннымиXML = СтруктураНастроекОбмена.ОбработкаОбменаДанными; //ОбработкаОбъект.КонвертацияОбъектовXDTO + ОбработкаОбменаДанными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Сервис(Отказ, + УзелИнформационнойБазы, ДействиеВыгрузка, ПараметрыОбмена); + КонецЕсли; + + Иначе // Обмен через обычные каналы связи. + + ТолькоПараметры = ПараметрыОбмена.ТолькоПараметры; + ВидТранспортаСообщенийОбмена = ПараметрыОбмена.ВидТранспортаСообщенийОбмена; + + Если ПараметрыОбмена.ВыполнятьЗагрузку Тогда + ВыполнитьДействиеОбменаДляУзлаИнформационнойБазы(Отказ, УзелИнформационнойБазы, + ДействиеЗагрузка, ВидТранспортаСообщенийОбмена, ТолькоПараметры, ДополнительныеПараметры); + КонецЕсли; + + Если ПараметрыОбмена.ВыполнятьВыгрузку Тогда + ВыполнитьДействиеОбменаДляУзлаИнформационнойБазы(Отказ, УзелИнформационнойБазы, + ДействиеВыгрузка, ВидТранспортаСообщенийОбмена, ТолькоПараметры, ДополнительныеПараметры); + КонецЕсли; + + КонецЕсли; + + ПослеВыполненияОбменов(УзелИнформационнойБазы, Отказ); + +КонецПроцедуры + +#КонецОбласти + +#Область ДляРаботыЧерезВнешнееСоединение_СлужебныеПроцедурыИФункции + +Процедура ВыполнитьВыгрузкуДляУзлаИнформационнойБазыВоВременноеХранилище(Знач ИмяПланаОбмена, Знач КодУзлаИнформационнойБазы, Адрес) Экспорт + + ПолноеИмяФайлаСообщенияОбмена = ПолучитьИмяВременногоФайла("xml"); + + ПараметрыОбменаДанными = ПараметрыОбменаДаннымиЧерезФайлИлиСтроку(); + + ПараметрыОбменаДанными.ПолноеИмяФайлаСообщенияОбмена = ПолноеИмяФайлаСообщенияОбмена; + ПараметрыОбменаДанными.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных; + ПараметрыОбменаДанными.ИмяПланаОбмена = ИмяПланаОбмена; + ПараметрыОбменаДанными.КодУзлаИнформационнойБазы = КодУзлаИнформационнойБазы; + + ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными); + + Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ПолноеИмяФайлаСообщенияОбмена)); + + УдалитьФайлы(ПолноеИмяФайлаСообщенияОбмена); + +КонецПроцедуры + +Процедура ВыполнитьВыгрузкуДляУзлаИнформационнойБазыЧерезФайл(Знач ИмяПланаОбмена, + Знач КодУзлаИнформационнойБазы, + Знач ПолноеИмяФайлаСообщенияОбмена) Экспорт + + ПараметрыОбменаДанными = ПараметрыОбменаДаннымиЧерезФайлИлиСтроку(); + + ПараметрыОбменаДанными.ПолноеИмяФайлаСообщенияОбмена = ПолноеИмяФайлаСообщенияОбмена; + ПараметрыОбменаДанными.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных; + ПараметрыОбменаДанными.ИмяПланаОбмена = ИмяПланаОбмена; + ПараметрыОбменаДанными.КодУзлаИнформационнойБазы = КодУзлаИнформационнойБазы; + + ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными); + +КонецПроцедуры + +Процедура ВыполнитьВыгрузкуДляУзлаИнформационнойБазыЧерезСтроку(Знач ИмяПланаОбмена, Знач КодУзлаИнформационнойБазы, СообщениеОбмена) Экспорт + + ПараметрыОбменаДанными = ПараметрыОбменаДаннымиЧерезФайлИлиСтроку(); + + ПараметрыОбменаДанными.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных; + ПараметрыОбменаДанными.ИмяПланаОбмена = ИмяПланаОбмена; + ПараметрыОбменаДанными.КодУзлаИнформационнойБазы = КодУзлаИнформационнойБазы; + ПараметрыОбменаДанными.СообщениеОбмена = СообщениеОбмена; + + ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными); + + СообщениеОбмена = ПараметрыОбменаДанными.СообщениеОбмена; + +КонецПроцедуры + +Процедура ВыполнитьЗагрузкуДляУзлаИнформационнойБазыЧерезСтроку(Знач ИмяПланаОбмена, Знач КодУзлаИнформационнойБазы, СообщениеОбмена) Экспорт + + ПараметрыОбменаДанными = ПараметрыОбменаДаннымиЧерезФайлИлиСтроку(); + + ПараметрыОбменаДанными.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ЗагрузкаДанных; + ПараметрыОбменаДанными.ИмяПланаОбмена = ИмяПланаОбмена; + ПараметрыОбменаДанными.КодУзлаИнформационнойБазы = КодУзлаИнформационнойБазы; + ПараметрыОбменаДанными.СообщениеОбмена = СообщениеОбмена; + + ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными); + + СообщениеОбмена = ПараметрыОбменаДанными.СообщениеОбмена; + +КонецПроцедуры + +Процедура ЗафиксироватьЗавершениеОбменаЧерезВнешнееСоединение(СтруктураНастроекОбмена) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + +КонецПроцедуры + +Функция СтруктураНастроекОбменаЧерезВнешнееСоединение(Структура) Экспорт + + ПроверитьИспользованиеОбменаДанными(); + + УстановитьПривилегированныйРежим(Истина); + + УзелИнформационнойБазы = ПланыОбмена[Структура.ИмяПланаОбмена].НайтиПоКоду(Структура.ТекущийУзелПланаОбменаКод); + + ДействиеПриОбмене = Перечисления.ДействияПриОбмене[Структура.ДействиеПриОбменеСтрокой]; + + СтруктураНастроекОбменаВнешнееСоединение = Новый Структура; + СтруктураНастроекОбменаВнешнееСоединение.Вставить("ИмяПланаОбмена", Структура.ИмяПланаОбмена); + СтруктураНастроекОбменаВнешнееСоединение.Вставить("РежимОтладки", Структура.РежимОтладки); + + СтруктураНастроекОбменаВнешнееСоединение.Вставить("УзелИнформационнойБазы", УзелИнформационнойБазы); + СтруктураНастроекОбменаВнешнееСоединение.Вставить("УзелИнформационнойБазыНаименование", Строка(УзелИнформационнойБазы)); + + СтруктураНастроекОбменаВнешнееСоединение.Вставить("КлючСообщенияЖурналаРегистрации", КлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, ДействиеПриОбмене)); + + СтруктураНастроекОбменаВнешнееСоединение.Вставить("РезультатВыполненияОбмена", Неопределено); + СтруктураНастроекОбменаВнешнееСоединение.Вставить("РезультатВыполненияОбменаСтрокой", ""); + + СтруктураНастроекОбменаВнешнееСоединение.Вставить("ДействиеПриОбмене", ДействиеПриОбмене); + + СтруктураНастроекОбменаВнешнееСоединение.Вставить("ОтладкаОбработчиковВыгрузки ", Ложь); + СтруктураНастроекОбменаВнешнееСоединение.Вставить("ОтладкаОбработчиковЗагрузки", Ложь); + СтруктураНастроекОбменаВнешнееСоединение.Вставить("ИмяФайлаВнешнейОбработкиОтладкиВыгрузки", ""); + СтруктураНастроекОбменаВнешнееСоединение.Вставить("ИмяФайлаВнешнейОбработкиОтладкиЗагрузки", ""); + СтруктураНастроекОбменаВнешнееСоединение.Вставить("РежимПротоколированияОбменаДанными", Ложь); + СтруктураНастроекОбменаВнешнееСоединение.Вставить("ИмяФайлаПротоколаОбмена", ""); + СтруктураНастроекОбменаВнешнееСоединение.Вставить("ПродолжитьПриОшибке", Ложь); + + УстановитьНастройкиРежимаОтладкиДляСтруктуры(СтруктураНастроекОбменаВнешнееСоединение, Истина); + + СтруктураНастроекОбменаВнешнееСоединение.Вставить("КоличествоОбъектовОбработано", 0); + + СтруктураНастроекОбменаВнешнееСоединение.Вставить("ДатаНачала", Неопределено); + СтруктураНастроекОбменаВнешнееСоединение.Вставить("ДатаОкончания", Неопределено); + + СтруктураНастроекОбменаВнешнееСоединение.Вставить("СообщениеПриОбмене", ""); + СтруктураНастроекОбменаВнешнееСоединение.Вставить("СтрокаСообщенияОбОшибке", ""); + + СтруктураНастроекОбменаВнешнееСоединение.Вставить("КоличествоЭлементовВТранзакции", Структура.КоличествоЭлементовВТранзакции); + + СтруктураНастроекОбменаВнешнееСоединение.Вставить("ЭтоОбменВРИБ", Ложь); + + СтруктураНастроекОбменаВнешнееСоединение.Вставить("НастройкаСинхронизацииДанныхЗавершена", Ложь); + СтруктураНастроекОбменаВнешнееСоединение.Вставить("ПолученоСообщениеДляСопоставленияДанных", Ложь); + СтруктураНастроекОбменаВнешнееСоединение.Вставить("ПоддерживаетсяСопоставлениеДанных", Истина); + + Если ЗначениеЗаполнено(УзелИнформационнойБазы) Тогда + СтруктураНастроекОбменаВнешнееСоединение.НастройкаСинхронизацииДанныхЗавершена = НастройкаСинхронизацииЗавершена(УзелИнформационнойБазы); + СтруктураНастроекОбменаВнешнееСоединение.ПолученоСообщениеДляСопоставленияДанных = ПолученоСообщениеСДаннымиДляСопоставления(УзелИнформационнойБазы); + СтруктураНастроекОбменаВнешнееСоединение.ПоддерживаетсяСопоставлениеДанных = ЗначениеНастройкиПланаОбмена(Структура.ИмяПланаОбмена, + "ПоддерживаетсяСопоставлениеДанных", СохраненныйВариантНастройкиУзлаПланаОбмена(УзелИнформационнойБазы)); + КонецЕсли; + + Возврат СтруктураНастроекОбменаВнешнееСоединение; +КонецФункции + +Функция ПолучитьПравилаКонвертацииОбъектовЧерезВнешнееСоединение(ИмяПланаОбмена, ПолучатьПравилаКорреспондента = Ложь) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Возврат РегистрыСведений.ПравилаДляОбменаДанными.ЗачитанныеПравилаКонвертацииОбъектов(ИмяПланаОбмена, ПолучатьПравилаКорреспондента); + +КонецФункции + +Процедура ВыполнитьОбменДаннымиСВнешнейСистемойЗагрузкаДанных(СтруктураНастроекОбмена) + + ИмяВременногоКаталога = СоздатьВременныйКаталогСообщенийОбмена(); + + ИмяФайлаСообщения = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( + ИмяВременногоКаталога, УникальноеИмяФайлаСообщенияОбмена()); + + ОбработкаТранспортаСообщенийОбмена = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена; + + СообщениеПолучено = Ложь; + Попытка + СообщениеПолучено = ОбработкаТранспортаСообщенийОбмена.ПолучитьСообщение(ИмяФайлаСообщения); + Исключение + Информация = ИнформацияОбОшибке(); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка_ТранспортСообщения; + ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(Информация), СтруктураНастроекОбмена, Истина); + КонецПопытки; + + СообщениеОбработано = Ложь; + ВыполнитьОбработчикПослеЗагрузки = Ложь; + + Если СообщениеПолучено + И СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда + + ВыполнитьОбработчикПослеЗагрузки = Истина; + + ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ИмяФайлаСообщения); + + СообщениеОбработано = РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена); + + КонецЕсли; + + Попытка + УдалитьФайлы(ИмяВременногоКаталога); + Исключение + ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(Информация), СтруктураНастроекОбмена); + КонецПопытки; + + НастройкаЗавершена = НастройкаСинхронизацииЗавершена(СтруктураНастроекОбмена.УзелИнформационнойБазы); + + Если ВыполнитьОбработчикПослеЗагрузки Тогда + ЕстьСледующееСообщение = Ложь; + Попытка + ОбработкаТранспортаСообщенийОбмена.ПослеОбработкиПолученногоСообщения(СообщениеОбработано, ЕстьСледующееСообщение); + Исключение + Информация = ИнформацияОбОшибке(); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка_ТранспортСообщения; + ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(Информация), СтруктураНастроекОбмена, Истина); + ЕстьСледующееСообщение = Ложь; + КонецПопытки; + + Если СообщениеОбработано + И Не НастройкаЗавершена Тогда + + ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(СтруктураНастроекОбмена.УзелИнформационнойБазы); + + Если ЕстьАлгоритмМенеджераПланаОбмена("ПередНастройкойСинхронизацииДанных", ИмяПланаОбмена) Тогда + + Контекст = Новый Структура; + Контекст.Вставить("Корреспондент", СтруктураНастроекОбмена.УзелИнформационнойБазы); + Контекст.Вставить("ИдентификаторНастройки", СохраненныйВариантНастройкиУзлаПланаОбмена(СтруктураНастроекОбмена.УзелИнформационнойБазы)); + Контекст.Вставить("НачальнаяНастройка", Не НастройкаЗавершена); + + ИмяФормыПомощника = ""; + + ПланыОбмена[ИмяПланаОбмена].ПередНастройкойСинхронизацииДанных(Контекст, НастройкаЗавершена, ИмяФормыПомощника); + + Если НастройкаЗавершена Тогда + ЗавершитьНастройкуСинхронизацииДанных(СтруктураНастроекОбмена.УзелИнформационнойБазы); + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Если ЕстьСледующееСообщение И НастройкаЗавершена Тогда + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; + ВыполнитьОбменДаннымиСВнешнейСистемойЗагрузкаДанных(СтруктураНастроекОбмена); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьОбменДаннымиСВнешнейСистемойВыгрузкаНастроекXDTO(СтруктураНастроекОбмена) + + ОбработкаТранспортаСообщенийОбмена = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена; + + ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(СтруктураНастроекОбмена.УзелИнформационнойБазы); + + НастройкиXDTO = Новый Структура; + НастройкиXDTO.Вставить("ФорматОбмена", + ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена, "ФорматОбмена")); + НастройкиXDTO.Вставить("ПоддерживаемыеВерсии", + ОбменДаннымиXDTOСервер.ВерсииФорматаОбменаМассив(СтруктураНастроекОбмена.УзелИнформационнойБазы)); + НастройкиXDTO.Вставить("ПоддерживаемыеОбъекты", + ОбменДаннымиXDTOСервер.ПоддерживаемыеОбъектыФормата(ИмяПланаОбмена, , СтруктураНастроекОбмена.УзелИнформационнойБазы)); + + Попытка + ОбработкаТранспортаСообщенийОбмена.ОтправитьНастройкиXDTO(НастройкиXDTO); + Исключение + Информация = ИнформацияОбОшибке(); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка_ТранспортСообщения; + ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(Информация), СтруктураНастроекОбмена, Истина); + КонецПопытки; + +КонецПроцедуры + +Процедура ПередЧтениемСообщенияОбмена(Знач Получатель, СообщениеОбмена, СтандартнаяОбработка) Экспорт + + Если ЭтоПодчиненныйУзелРИБ() + И ТипЗнч(ГлавныйУзел()) = ТипЗнч(Получатель) Тогда + + СохраненноеСообщениеОбмена = СообщениеОбменаДаннымиИзГлавногоУзла(); + + Если ТипЗнч(СохраненноеСообщениеОбмена) = Тип("ДвоичныеДанные") Тогда + // Приведение к новому формату хранения и повторное зачитывание + // значения константы СообщениеОбменаДаннымиИзГлавногоУзла. + УстановитьСообщениеОбменаДаннымиИзГлавногоУзла(СохраненноеСообщениеОбмена, Получатель); + СохраненноеСообщениеОбмена = СообщениеОбменаДаннымиИзГлавногоУзла(); + КонецЕсли; + + Если ТипЗнч(СохраненноеСообщениеОбмена) = Тип("Структура") Тогда + + СтандартнаяОбработка = Ложь; + + СообщениеОбмена = СохраненноеСообщениеОбмена.ПутьКФайлу; + + ЗаписатьСобытиеПолученияДанных(Получатель, НСтр("ru = 'Сообщение обмена получено из кэша.'")); + + УстановитьПривилегированныйРежим(Истина); + УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("СообщениеПолученоИзКэша", Истина); + УстановитьПривилегированныйРежим(Ложь); + + Иначе + УстановитьПривилегированныйРежим(Истина); + УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("СообщениеПолученоИзКэша", Ложь); + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Процедура ПослеЧтенияСообщенияОбмена(Знач Получатель, Знач СообщениеОбмена, Знач СообщениеПрочитано, + СтандартнаяОбработка, Знач УдалитьСообщение = Истина) Экспорт + + Если ОбменДаннымиСлужебный.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("ЗагрузкаРасширений") Тогда + Возврат; + КонецЕсли; + + Если ЭтоПодчиненныйУзелРИБ() + И ТипЗнч(ГлавныйУзел()) = ТипЗнч(Получатель) Тогда + + Если Не СообщениеПрочитано + И ОбменДаннымиСлужебный.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("СообщениеПолученоИзКэша") Тогда + // Не удалось прочитать сообщение, полученное из кэша - требуется очистка кэша. + ОчиститьСообщениеОбменаДаннымиИзГлавногоУзла(); + Возврат; + КонецЕсли; + + ОбновитьСообщениеВКэше = Ложь; + + Если КонфигурацияИзменена() ИЛИ ОбменДаннымиСлужебный.ЗагрузитьРасширенияИзменяющиеСтруктуруДанных() Тогда + + // Т.к. конфигурация может быть изменена повторно, требуется + // обновить кэш, если он содержит устаревшее сообщение, + // а не только при первой загрузке изменений конфигурации. + ОбновитьСообщениеВКэше = Истина; + + Если Не СообщениеПрочитано Тогда + + Если НЕ Константы.ЗагрузитьСообщениеОбменаДанными.Получить() Тогда + Константы.ЗагрузитьСообщениеОбменаДанными.Установить(Истина); + КонецЕсли; + + КонецЕсли; + + Иначе + + Если УдалитьСообщение Тогда + + ОчиститьСообщениеОбменаДаннымиИзГлавногоУзла(); + Если Константы.ЗагрузитьСообщениеОбменаДанными.Получить() Тогда + Константы.ЗагрузитьСообщениеОбменаДанными.Установить(Ложь); + КонецЕсли; + + Иначе + // Т.к. чтение сообщение обмена может быть без загрузки метаданных, + // то нужно сохранить сообщение обмена после чтения параметров работы программы, + // чтобы не загружать его повторно для основного чтения. + ОбновитьСообщениеВКэше = Истина; + КонецЕсли; + + КонецЕсли; + + Если ОбновитьСообщениеВКэше Тогда + + СтароеСообщение = СообщениеОбменаДаннымиИзГлавногоУзла(); + + ОбновитьКэш = Ложь; + НовоеСообщение = Новый ДвоичныеДанные(СообщениеОбмена); + + ТипСтруктура = ТипЗнч(СтароеСообщение) = Тип("Структура"); + + Если ТипСтруктура Или ТипЗнч(СтароеСообщение) = Тип("ДвоичныеДанные") Тогда + + Если ТипСтруктура Тогда + СтароеСообщение = Новый ДвоичныеДанные(СтароеСообщение.ПутьКФайлу); + КонецЕсли; + + Если СтароеСообщение.Размер() <> НовоеСообщение.Размер() Тогда + ОбновитьКэш = Истина; + ИначеЕсли НовоеСообщение <> СтароеСообщение Тогда + ОбновитьКэш = Истина; + КонецЕсли; + + Иначе + + ОбновитьКэш = Истина; + + КонецЕсли; + + Если ОбновитьКэш Тогда + УстановитьСообщениеОбменаДаннымиИзГлавногоУзла(НовоеСообщение, Получатель); + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + Если СообщениеПрочитано И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + РегистрыСведений.ОбработчикиСобытийСинхронизацииДанных.ВыполнитьОбработчики(Получатель, "ПослеПолученияДанных"); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ИнициализацияСтруктурыНастроекОбмена_СлужебныеПроцедурыИФункции // Выполняет инициализацию подсистемы обмена данными для выполнения процесса обмена. // @@ -8818,53 +9734,6 @@ // Возвращаемое значение: // Структура - структура со всеми необходимыми данными и объектами для выполнения обмена. // -Функция НастройкиОбменаДляУзлаИнформационнойБазы( - УзелИнформационнойБазы, - ДействиеПриОбмене, - ВидТранспортаСообщенийОбмена, - ИспользоватьНастройкиТранспорта = Истина) Экспорт - - // Возвращаемое значение функции. - СтруктураНастроекОбмена = СтруктураНастроекОбменаБазовая(); - - СтруктураНастроекОбмена.УзелИнформационнойБазы = УзелИнформационнойБазы; - СтруктураНастроекОбмена.ДействиеПриОбмене = ДействиеПриОбмене; - СтруктураНастроекОбмена.ВидТранспортаОбмена = ВидТранспортаСообщенийОбмена; - СтруктураНастроекОбмена.ЭтоОбменВРИБ = ОбменДаннымиПовтИсп.ЭтоУзелРаспределеннойИнформационнойБазы(УзелИнформационнойБазы); - - ВыполнитьИнициализациюСтруктурыНастроекОбменаДляУзлаИнформационнойБазы(СтруктураНастроекОбмена, ИспользоватьНастройкиТранспорта); - - УстановитьНастройкиРежимаОтладкиДляСтруктуры(СтруктураНастроекОбмена); - - // Проверяем структуру настроек на валидность значений для выполнения обмена. Ошибки фиксируем в ЖР. - ВыполнитьПроверкуСтруктурыОбменаНаВалидность(СтруктураНастроекОбмена, ИспользоватьНастройкиТранспорта); - - // Если настройки содержат ошибки, то выходим. - Если СтруктураНастроекОбмена.Отказ Тогда - Возврат СтруктураНастроекОбмена; - КонецЕсли; - - Если ИспользоватьНастройкиТранспорта Тогда - - // Инициализируем обработку транспорта сообщений обмена. - ВыполнитьИнициализациюОбработкиТранспортаСообщенийОбмена(СтруктураНастроекОбмена); - - КонецЕсли; - - // Инициализируем обработку обмена данными. - Если СтруктураНастроекОбмена.ЭтоОбменВРИБ Тогда - - ВыполнитьИнициализациюОбработкиОбмена(СтруктураНастроекОбмена); - - ИначеЕсли СтруктураНастроекОбмена.ОбменПоПравиламКонвертацииОбъектов Тогда - - ВыполнитьИнициализациюОбработкиОбменаПоПравиламКонвертации(СтруктураНастроекОбмена); - - КонецЕсли; - - Возврат СтруктураНастроекОбмена; -КонецФункции - Функция НастройкиОбменаДляВнешнегоСоединения(УзелИнформационнойБазы, ДействиеПриОбмене, КоличествоЭлементовВТранзакции) // Возвращаемое значение функции. @@ -9064,7 +9933,7 @@ СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации(СтруктураНастроекОбмена.УзелИнформационнойБазы, СтруктураНастроекОбмена.ДействиеПриОбмене); Если ОбменДаннымиПовтИсп.ЭтоУзелОбменаСообщениями(СтруктураНастроекОбмена.УзелИнформационнойБазы) Тогда - МодульНастройкиТранспортаОбменаСообщениями = РегистрыСведений["НастройкиТранспортаОбменаСообщениями"]; + МодульНастройкиТранспортаОбменаСообщениями = ОбщегоНазначения.ОбщийМодуль("РегистрыСведений.НастройкиТранспортаОбменаСообщениями"); СтруктураНастроекОбмена.НастройкиТранспорта = МодульНастройкиТранспортаОбменаСообщениями.НастройкиТранспортаWS(СтруктураНастроекОбмена.УзелИнформационнойБазы); Иначе СтруктураНастроекОбмена.НастройкиТранспорта = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспорта(СтруктураНастроекОбмена.УзелИнформационнойБазы, СтруктураНастроекОбмена.ВидТранспортаОбмена); @@ -9085,7 +9954,7 @@ // Получаем настройки транспорта обмена. Если ОбменДаннымиПовтИсп.ЭтоУзелОбменаСообщениями(СтруктураНастроекОбмена.УзелИнформационнойБазы) Тогда - МодульНастройкиТранспортаОбменаСообщениями = РегистрыСведений["НастройкиТранспортаОбменаСообщениями"]; + МодульНастройкиТранспортаОбменаСообщениями = ОбщегоНазначения.ОбщийМодуль("РегистрыСведений.НастройкиТранспортаОбменаСообщениями"); СтруктураНастроекОбмена.НастройкиТранспорта = МодульНастройкиТранспортаОбменаСообщениями.НастройкиТранспортаWS( СтруктураНастроекОбмена.УзелИнформационнойБазы); Иначе @@ -9211,7 +10080,7 @@ СтруктураНастроекОбмена.Вставить("КоличествоЭлементовВТранзакции", 1); // На каждый элемент отдельная транзакция. СтруктураНастроекОбмена.Вставить("ПроизводитьЗагрузкуДанных", Ложь); СтруктураНастроекОбмена.Вставить("ПроизводитьВыгрузкуДанных", Ложь); - СтруктураНастроекОбмена.Вставить("ИспользоватьПередачуБольшогоОбъемаДанных", Ложь); + СтруктураНастроекОбмена.Вставить("ИспользоватьПередачуБольшогоОбъемаДанных", Истина); // Структура настроек дополнительная. СтруктураНастроекОбмена.Вставить("Отказ", Ложь); @@ -9643,8 +10512,6 @@ Запрос.УстановитьПараметр("ПроизводитьВыгрузку", ПроизводитьВыгрузкуДанных); Запрос.УстановитьПараметр("ПроизводитьЗагрузку", ПроизводитьЗагрузкуДанных); - Результат = Запрос.Выполнить(); - ИмяФайлаПротокола = ""; Если ЭтоВнешнееСоединение И СтруктураНастроекОбмена.Свойство("ИмяФайлаПротоколаОбмена", ИмяФайлаПротокола) И Не ПустаяСтрока(ИмяФайлаПротокола) Тогда @@ -9653,12 +10520,18 @@ КонецЕсли; - Если Не Результат.Пустой() И Не ОбщегоНазначения.РазделениеВключено() Тогда + Если Не ОбщегоНазначения.РазделениеВключено() Тогда + + Результат = Запрос.Выполнить(); - ТаблицаНастроек = Результат.Выгрузить(); - СтрокаТаблицы = ТаблицаНастроек[0]; + Если Не Результат.Пустой() Тогда - ЗаполнитьЗначенияСвойств(СтруктураНастроекОбмена, СтрокаТаблицы); + ТаблицаНастроек = Результат.Выгрузить(); + СтрокаТаблицы = ТаблицаНастроек[0]; + + ЗаполнитьЗначенияСвойств(СтруктураНастроекОбмена, СтрокаТаблицы); + + КонецЕсли; КонецЕсли; @@ -9795,365 +10668,188 @@ #КонецОбласти -#Область РаботаСМониторомПроблемОбменаДанными +#Область ОбщегоНазначения_СлужебныеПроцедурыИФункции -Функция КоличествоПроблемОбменаДанными(УзлыОбмена = Неопределено) +Процедура ПолучитьОбщиеНастройкиУзловИнформационныхБаз(МенеджерВременныхТаблиц) - ПараметрыПоискаПроблем = РегистрыСведений.РезультатыОбменаДанными.ПараметрыПоискаПроблем(); - ПараметрыПоискаПроблем.УзлыПланаОбмена = УзлыОбмена; + Запрос = Новый Запрос; - ТипыПроблем = Новый Массив; - ТипыПроблем.Добавить(Перечисления.ТипыПроблемОбменаДанными.НезаполненныеРеквизиты); - ТипыПроблем.Добавить(Перечисления.ТипыПроблемОбменаДанными.НепроведенныйДокумент); - ТипыПроблем.Добавить(Перечисления.ТипыПроблемОбменаДанными.ОшибкаПроверкиСконвертированногоОбъекта); - - ПараметрыПоискаПроблем.ТипПроблемы = ТипыПроблем; - - Возврат РегистрыСведений.РезультатыОбменаДанными.КоличествоПроблем(ПараметрыПоискаПроблем); - -КонецФункции - -Функция КоличествоПроблемВерсионирования(УзлыОбмена = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт - - Если ПараметрыЗапроса = Неопределено Тогда - ПараметрыЗапроса = ПараметрыЗапросаКоличествоПроблемВерсионирования(); - КонецЕсли; - - ИспользуетсяВерсионирование = ОбменДаннымиПовтИсп.ИспользуетсяВерсионирование(, Истина); - - Если ИспользуетсяВерсионирование Тогда - МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); - Возврат МодульВерсионированиеОбъектов.КоличествоКоллизийИлиНепринятых( - УзлыОбмена, - ПараметрыЗапроса.ЭтоКоличествоКоллизий, - ПараметрыЗапроса.УчитыватьПроигнорированные, - ПараметрыЗапроса.Период, - ПараметрыЗапроса.СтрокаПоиска); - КонецЕсли; + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + + ТекстЗапросаРезультат = + "ВЫБРАТЬ + | ОбщиеНастройкиУзловИнформационныхБаз.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | ЕСТЬNULL(ОбщиеНастройкиУзловИнформационныхБаз.ВерсияКорреспондента, """") КАК ВерсияКорреспондента, + | ЕСТЬNULL(ОбщиеНастройкиУзловИнформационныхБаз.ПрефиксКорреспондента, """") КАК ПрефиксКорреспондента, + | ЕСТЬNULL(ОбщиеНастройкиУзловИнформационныхБаз.НастройкаЗавершена, ЛОЖЬ) КАК НастройкаЗавершена, + | ЕСТЬNULL(ОбщиеНастройкиУзловИнформационныхБаз.ПереходНаWS_Этап, 0) КАК ПереходНаWS_Этап, + | ЕСТЬNULL(НастройкиТранспортаОбменаДанными.ВидТранспортаСообщенийОбменаПоУмолчанию, """") КАК ВидТранспорта + |ПОМЕСТИТЬ ОбщиеНастройкиУзловИнформационныхБаз + |ИЗ + | РегистрСведений.ОбщиеНастройкиУзловИнформационныхБаз КАК ОбщиеНастройкиУзловИнформационныхБаз + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиТранспортаОбменаДанными КАК НастройкиТранспортаОбменаДанными + | ПО ОбщиеНастройкиУзловИнформационныхБаз.УзелИнформационнойБазы = НастройкиТранспортаОбменаДанными.Корреспондент"; - Возврат 0; - -КонецФункции - -Функция ПараметрыЗапросаКоличествоПроблемВерсионирования() Экспорт - - Результат = Новый Структура; - - Результат.Вставить("ЭтоКоличествоКоллизий", Неопределено); - Результат.Вставить("УчитыватьПроигнорированные", Ложь); - Результат.Вставить("Период", Неопределено); - Результат.Вставить("СтрокаПоиска", ""); - - Возврат Результат; - -КонецФункции - -// Регистрирует ошибки при отложенном проведении документа в мониторе проблем обмена. -// -// Параметры: -// Объект - ДокументОбъект - документ при отложенном проведении которого возникли ошибки. -// УзелОбмена - ПланОбменаСсылка - узел информационной базы из которой получен документ. -// СообщениеОбОшибке - Строка - текст сообщения для журнала регистрации. -// Рекомендуется передавать в качестве этого параметра КраткоеПредставлениеОшибки(ИнформацияОбОшибке()). -// Текст сообщения для отображения в мониторе формируется из системных сообщений пользователю, которые -// были сформированы, но еще не были выведены пользователю. Поэтому рекомендуется, чтобы к моменту вызова -// данного метода в буфере сообщений системы не содержалось сообщений. -// РегистрироватьПроблемыВРезультатахОбмена - Булево - необходимо регистрировать проблемы. -// -// Пример: -// Процедура ПровестиДокументПриЗагрузке(Документ, УзелОбмена) -// Документ.ОбменДанными.Загрузка = Истина; -// Документ.Записать(); -// Документ.ОбменДанными.Загрузка = Ложь; -// Отказ = Ложь; -// -// Попытка -// Документ.Записать(РежимЗаписиДокумента.Проведение); -// Исключение -// СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); -// Отказ = Истина; -// КонецПопытки; -// -// Если Отказ Тогда -// ОбменДаннымиСервер.ЗарегистрироватьОшибкуПроведенияДокумента(Документ, УзелОбмена, СообщениеОбОшибке); -// КонецЕсли; -// -// КонецПроцедуры; -// -Процедура ЗарегистрироватьОшибкуПроведенияДокумента( - Объект, - УзелОбмена, - ТекстИсключения, - РегистрироватьПроблемыВРезультатахОбмена = Истина) - - СообщенияПользователю = ПолучитьСообщенияПользователю(Истина); - ТекстСообщения = ТекстИсключения; - Для Каждого Сообщение Из СообщенияПользователю Цикл - Если СтрНайти(Сообщение.Текст, "СтандартныеПодсистемы.ДлительныеОперации") > 0 Тогда - Продолжить; - КонецЕсли; - ТекстСообщения = ТекстСообщения + ?(ПустаяСтрока(ТекстСообщения), "", Символы.ПС) + Сообщение.Текст; - КонецЦикла; - ТекстСообщения = СокрЛП(ТекстСообщения); - - СтрокаСообщения = ""; - Если Не ПустаяСтрока(ТекстСообщения) Тогда - СтрокаСообщения = НСтр("ru = 'Не удалось провести документ %1, полученный из другой информационной базы. - |По причине: %2. - |Возможно, не заполнены все реквизиты, обязательные к заполнению.'", - ОбщегоНазначения.КодОсновногоЯзыка()); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - СтрокаСообщения, Строка(Объект), ТекстСообщения); Иначе - СтрокаСообщения = НСтр("ru = 'Не удалось провести документ %1, полученный из другой информационной базы. - |Возможно, не заполнены все реквизиты, обязательные к заполнению.'", - ОбщегоНазначения.КодОсновногоЯзыка()); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - СтрокаСообщения, Строка(Объект)); - КонецЕсли; - - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), УровеньЖурналаРегистрации.Предупреждение,,, СтрокаСообщения); - - Если РегистрироватьПроблемыВРезультатахОбмена Тогда - РегистрыСведений.РезультатыОбменаДанными.ЗарегистрироватьОшибкуПроверкиОбъекта(Объект.Ссылка, УзелОбмена, - ТекстСообщения, Перечисления.ТипыПроблемОбменаДанными.НепроведенныйДокумент); - КонецЕсли; - -КонецПроцедуры - -// Регистрирует ошибки при отложенной записи объекта в мониторе проблем обмена. -// -// Параметры: -// Объект - СправочникОбъект, ДокументОбъект и т.п. - объект, при отложенной записи которого возникли ошибки. -// УзелОбмена - ПланОбменаСсылка - узел информационной базы из которой получен объект. -// СообщениеОбОшибке - Строка - текст сообщения для журнала регистрации. -// Рекомендуется передавать в качестве этого параметра КраткоеПредставлениеОшибки(ИнформацияОбОшибке()). -// Текст сообщения для отображения в мониторе формируется из системных сообщений пользователю, которые -// были сформированы, но еще не были выведены пользователю. Поэтому рекомендуется, чтобы к моменту вызова -// данного метода в буфере сообщений системы не содержалось сообщений. -// -// Пример: -// Процедура ЗаписатьОбъектПриЗагрузке(Объект, УзелОбмена) -// Объект.ОбменДанными.Загрузка = Истина; -// Объект.Записать(); -// Объект.ОбменДанными.Загрузка = Ложь; -// Отказ = Ложь; -// -// Попытка -// Объект.Записать(); -// Исключение -// СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); -// Отказ = Истина; -// КонецПопытки; -// -// Если Отказ Тогда -// ОбменДаннымиСервер.ЗарегистрироватьОшибкуЗаписиОбъекта(Объект, УзелОбмена, СообщениеОбОшибке); -// КонецЕсли; -// -// КонецПроцедуры; -// -Процедура ЗарегистрироватьОшибкуЗаписиОбъекта( - Объект, - УзелОбмена, - ТекстИсключения) - - СообщенияПользователю = ПолучитьСообщенияПользователю(Истина); - ТекстСообщения = ТекстИсключения; - Для Каждого Сообщение Из СообщенияПользователю Цикл - Если СтрНайти(Сообщение.Текст, "СтандартныеПодсистемы.ДлительныеОперации") > 0 Тогда - Продолжить; - КонецЕсли; - ТекстСообщения = ТекстСообщения + ?(ПустаяСтрока(ТекстСообщения), "", Символы.ПС) + Сообщение.Текст; - КонецЦикла; - - ПричинаОшибки = ТекстСообщения; - Если Не ПустаяСтрока(СокрЛП(ТекстСообщения)) Тогда - ПричинаОшибки = " " + НСтр("ru = 'По причине %1.'"); - ПричинаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ПричинаОшибки, ТекстСообщения); + ТекстЗапросаРезультат = + "ВЫБРАТЬ + | NULL КАК УзелИнформационнойБазы, + | """" КАК ВерсияКорреспондента, + | """" КАК ПрефиксКорреспондента, + | ЛОЖЬ КАК НастройкаЗавершена, + | 0 КАК ПереходНаWS_Этап, + | """" КАК ВидТранспорта + |ПОМЕСТИТЬ ОбщиеНастройкиУзловИнформационныхБаз"; КонецЕсли; - СтрокаСообщения = НСтр("ru = 'Не удалось записать объект %1, полученный из другой информационной базы.%2 - |Возможно не заполнены все реквизиты, обязательные к заполнению.'", - ОбщегоНазначения.КодОсновногоЯзыка()); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, Строка(Объект), ПричинаОшибки); - - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), УровеньЖурналаРегистрации.Предупреждение,,, СтрокаСообщения); - - РегистрыСведений.РезультатыОбменаДанными.ЗарегистрироватьОшибкуПроверкиОбъекта(Объект.Ссылка, УзелОбмена, - ТекстСообщения, Перечисления.ТипыПроблемОбменаДанными.НезаполненныеРеквизиты); + Запрос.Текст = ТекстЗапросаРезультат; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + Запрос.Выполнить(); КонецПроцедуры -#КонецОбласти - -#Область ПрогрессБар - -// Подсчет количества объектов ИБ, подлежащих выгрузке при создании начального образа. -// -// Параметры: -// Получатель - ПланОбменаОбъект - узел плана обмена, соответствующий получателю. -// -// Возвращаемое значение: -// Число -// -Функция РассчитатьКоличествоОбъектовВБазе(Получатель) +Функция СправочникиПланаОбмена(Знач ИмяПланаОбмена) + + Если ТипЗнч(ИмяПланаОбмена) <> Тип("Строка") Тогда + + ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(ИмяПланаОбмена); + + КонецЕсли; + + Результат = Новый Массив; - ИмяПланаОбмена = Получатель.Метаданные().Имя; - СчетчикОбъектов = 0; СоставПланаОбмена = Метаданные.ПланыОбмена[ИмяПланаОбмена].Состав; - // 1. "Ссылочные" объекты. - СтруктураСсылочныхОбъектов = Новый Структура; - СтруктураСсылочныхОбъектов.Вставить("Справочник", Метаданные.Справочники); - СтруктураСсылочныхОбъектов.Вставить("Документ", Метаданные.Документы); - СтруктураСсылочныхОбъектов.Вставить("ПланВидовХарактеристик", Метаданные.ПланыВидовХарактеристик); - СтруктураСсылочныхОбъектов.Вставить("ПланВидовРасчета", Метаданные.ПланыВидовРасчета); - СтруктураСсылочныхОбъектов.Вставить("ПланСчетов", Метаданные.ПланыСчетов); - СтруктураСсылочныхОбъектов.Вставить("БизнесПроцесс", Метаданные.БизнесПроцессы); - СтруктураСсылочныхОбъектов.Вставить("Задача", Метаданные.Задачи); - СтруктураСсылочныхОбъектов.Вставить("ПланСчетов", Метаданные.ПланыСчетов); - - ШаблонТекстаЗапросаСсылки = - "ВЫБРАТЬ - | КОЛИЧЕСТВО(ПсевдонимТаблицыМетаданных.Ссылка) КАК КоличествоОбъектов - |ИЗ - | &ИмяТаблицыМетаданных КАК ПсевдонимТаблицыМетаданных"; - - Для Каждого СсылочныйОбъект Из СтруктураСсылочныхОбъектов Цикл + Для Каждого Элемент Из СоставПланаОбмена Цикл - Для Каждого ОбъектМетаданных Из СсылочныйОбъект.Значение Цикл + Если ОбщегоНазначения.ЭтоСправочник(Элемент.Метаданные) + ИЛИ ОбщегоНазначения.ЭтоПланВидовХарактеристик(Элемент.Метаданные) Тогда - Если СоставПланаОбмена.Найти(ОбъектМетаданных) = Неопределено Тогда - - Продолжить; - - КонецЕсли; - - ПолноеИмяОбъекта = СсылочныйОбъект.Ключ + "." + ОбъектМетаданных.Имя; - ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапросаСсылки, "&ИмяТаблицыМетаданных", ПолноеИмяОбъекта); - - Запрос = Новый Запрос(ТекстЗапроса); - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - - СчетчикОбъектов = СчетчикОбъектов + Выборка.КоличествоОбъектов; - - КонецЕсли; - - КонецЦикла; - - КонецЦикла; - - // 2. Константы. - Для Каждого ОбъектМетаданных Из Метаданные.Константы Цикл - Если СоставПланаОбмена.Найти(ОбъектМетаданных) = Неопределено Тогда - Продолжить; - КонецЕсли; - СчетчикОбъектов = СчетчикОбъектов + 1; - КонецЦикла; - - // 3. Регистры сведений. - ШаблонТекстаЗапросаБезРегистратора = - "ВЫБРАТЬ - | КОЛИЧЕСТВО(*) КАК КоличествоОбъектов - |ИЗ - | &ИмяТаблицыМетаданных КАК ПсевдонимТаблицыМетаданных"; - - ШаблонТекстаЗапросаСРегистратором = - "ВЫБРАТЬ - | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПсевдонимТаблицыМетаданных.Регистратор) КАК КоличествоОбъектов - |ИЗ - | &ИмяТаблицыМетаданных КАК ПсевдонимТаблицыМетаданных"; - - Для Каждого ОбъектМетаданных Из Метаданные.РегистрыСведений Цикл - - Если СоставПланаОбмена.Найти(ОбъектМетаданных) = Неопределено Тогда - - Продолжить; + Результат.Добавить(Элемент.Метаданные); КонецЕсли; - ПолноеИмяОбъекта = "РегистрСведений."+ОбъектМетаданных.Имя; - Если ОбъектМетаданных.ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.ПозицияРегистратора Тогда - - ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапросаСРегистратором, "&ИмяТаблицыМетаданных", ПолноеИмяОбъекта); - + КонецЦикла; + + Возврат Результат; +КонецФункции + +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел +Процедура ПриЗаполненииСпискаТекущихДелПредупрежденияСинхронизации(ТекущиеДела) + + МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); + Если Не ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.РезультатыОбменаДанными) + Или МодульТекущиеДелаСервер.ДелоОтключено("ПредупрежденияПриСинхронизации") Тогда + Возврат; + КонецЕсли; + + ПланыОбменаБСП = ОбменДаннымиПовтИсп.ПланыОбменаБСП(); + Если ПланыОбменаБСП.Количество() > 0 Тогда + + ТаблицаМонитора = ТаблицаМонитораОбменаДанными(ПланыОбменаБСП); + СтруктураРезультат = РегистрыСведений.РезультатыОбменаДанными.КоличествоПредупрежденийДляЭлементаФормы(ТаблицаМонитора.ВыгрузитьКолонку("УзелИнформационнойБазы")); + + ЕстьЗацикливание = ОбменДаннымиКонтрольЗацикливания.ЕстьЗацикливание(); + + Иначе + + СтруктураРезультат = Новый Структура("Количество, Заголовок", 0, ""); + + ЕстьЗацикливание = Ложь; + + КонецЕсли; + + // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь + // не делается проверка существования подсистемы. + Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.ОбщиеФормы.НастройкиСинхронизацииДанных.ПолноеИмя()); + + Для Каждого Раздел Из Разделы Цикл + + ИдентификаторПредупрежденияПриСинхронизации = "ПредупрежденияПриСинхронизации" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); + Дело = ТекущиеДела.Добавить(); + Дело.Идентификатор = ИдентификаторПредупрежденияПриСинхронизации; + Дело.ЕстьДела = СтруктураРезультат.Количество > 0; + Дело.Представление = СтруктураРезультат.Заголовок; + Дело.Форма = "РегистрСведений.РезультатыОбменаДанными.Форма.ПредупрежденияСинхронизаций"; + Дело.Владелец = Раздел; + + ИдентификаторПредупрежденияПриСинхронизации = "ПредупрежденияПриСинхронизацииЗацикливание" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); + Дело = ТекущиеДела.Добавить(); + Дело.Идентификатор = ИдентификаторПредупрежденияПриСинхронизации; + Дело.ЕстьДела = ЕстьЗацикливание; + Дело.Представление = НСтр("ru = 'Обнаружено зацикливание синхронизаций'"); + Дело.Форма = "РегистрСведений.КонтурСинхронизации.Форма.ЗацикливаниеСинхронизации"; + Дело.Владелец = Раздел; + Дело.Важное = Истина; + + КонецЦикла; + +КонецПроцедуры + +// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +Процедура ПриЗаполненииСпискаТекущихДелПроверитьСовместимостьСТекущейВерсией(ТекущиеДела) + + МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); + Если Не ПравоДоступа("Редактирование", Метаданные.РегистрыСведений.ПравилаДляОбменаДанными) + Или МодульТекущиеДелаСервер.ДелоОтключено("ПравилаОбмена") Тогда + Возврат; + КонецЕсли; + + // Если в командном интерфейсе нет раздела к которому относится регистр сведений, дело не добавляется. + Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта("РегистрСведений.ПравилаДляОбменаДанными"); + Если Разделы.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ВывестиДело = Истина; + ПровереноНаВерсию = ХранилищеОбщихНастроек.Загрузить("ТекущиеДела", "ПланыОбмена"); + Если ПровереноНаВерсию <> Неопределено Тогда + ВерсияМассив = СтрРазделить(Метаданные.Версия, "."); + ТекущаяВерсия = ВерсияМассив[0] + ВерсияМассив[1] + ВерсияМассив[2]; + Если ПровереноНаВерсию = ТекущаяВерсия Тогда + ВывестиДело = Ложь; // Дополнительные отчеты и обработки проверены на текущей версии. + КонецЕсли; + КонецЕсли; + + ПланыОбменаСПравиламиИзФайла = ПланыОбменаСПравиламиИзФайла(); + + Для Каждого Раздел Из Разделы Цикл + ИдентификаторРаздела = "ПроверитьСовместимостьСТекущейВерсией" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); + + // Добавление дела. + Дело = ТекущиеДела.Добавить(); + Дело.Идентификатор = "ПравилаОбмена"; + Дело.ЕстьДела = ВывестиДело И ПланыОбменаСПравиламиИзФайла > 0; + Дело.Представление = НСтр("ru = 'Правила обмена'"); + Дело.Количество = ПланыОбменаСПравиламиИзФайла; + Дело.Форма = "РегистрСведений.ПравилаДляОбменаДанными.Форма.ПроверкаСинхронизацииДанных"; + Дело.Владелец = ИдентификаторРаздела; + + // Проверка наличия группы дела. Если группа отсутствует - добавляем. + ГруппаДела = ТекущиеДела.Найти(ИдентификаторРаздела, "Идентификатор"); + Если ГруппаДела = Неопределено Тогда + ГруппаДела = ТекущиеДела.Добавить(); + ГруппаДела.Идентификатор = ИдентификаторРаздела; + ГруппаДела.ЕстьДела = Дело.ЕстьДела; + ГруппаДела.Представление = НСтр("ru = 'Проверить совместимость'"); + Если Дело.ЕстьДела Тогда + ГруппаДела.Количество = Дело.Количество; + КонецЕсли; + ГруппаДела.Владелец = Раздел; Иначе - - ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапросаБезРегистратора, "&ИмяТаблицыМетаданных", ПолноеИмяОбъекта); - - КонецЕсли; - - Запрос = Новый Запрос(ТекстЗапроса); - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - - СчетчикОбъектов = СчетчикОбъектов + Выборка.КоличествоОбъектов; - - КонецЕсли; - - КонецЦикла; - - // 4. Регистры (подчиненные регистратору) и последовательности. - СтруктураРегистров = Новый Структура; - СтруктураРегистров.Вставить("РегистрНакопления", Метаданные.РегистрыНакопления); - СтруктураРегистров.Вставить("РегистрРасчета", Метаданные.РегистрыРасчета); - СтруктураРегистров.Вставить("РегистрБухгалтерии", Метаданные.РегистрыБухгалтерии); - СтруктураРегистров.Вставить("Последовательность", Метаданные.Последовательности); - - Для Каждого Регистр Из СтруктураРегистров Цикл - - Для Каждого ОбъектМетаданных Из Регистр.Значение Цикл - - Если СоставПланаОбмена.Найти(ОбъектМетаданных) = Неопределено Тогда - - Продолжить; - + Если Не ГруппаДела.ЕстьДела Тогда + ГруппаДела.ЕстьДела = Дело.ЕстьДела; КонецЕсли; - ПолноеИмяОбъекта = Регистр.Ключ +"."+ОбъектМетаданных.Имя; - ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапросаСРегистратором, "&ИмяТаблицыМетаданных", ПолноеИмяОбъекта); - - Запрос = Новый Запрос(ТекстЗапроса); - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - - СчетчикОбъектов = СчетчикОбъектов + Выборка.КоличествоОбъектов; - + Если Дело.ЕстьДела Тогда + ГруппаДела.Количество = ГруппаДела.Количество + Дело.Количество; КонецЕсли; - - КонецЦикла; - + КонецЕсли; КонецЦикла; - - Возврат СчетчикОбъектов; -КонецФункции - -// Подсчет количества объектов, зарегистрированных в плане обмена. -// -// Параметры: -// Получатель - ПланОбменаОбъект -// -// Возвращаемое значение: -// Число -// -Функция РассчитатьКоличествоЗарегистрированныхОбъектов(Получатель) Экспорт - - ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(Получатель.Ссылка, Получатель.НомерОтправленного + 1); - КоличествоОбъектовКВыгрузке = 0; - Пока ВыборкаИзменений.Следующий() Цикл - КоличествоОбъектовКВыгрузке = КоличествоОбъектовКВыгрузке + 1; - КонецЦикла; - Возврат КоличествоОбъектовКВыгрузке; - -КонецФункции - -#КонецОбласти - -#Область ОбщегоНазначения +КонецПроцедуры Функция ДополнительныеСвойстваПланаОбменаСтрокой(Знач СвойстваСтрокой) @@ -10640,40 +11336,6 @@ КонецПроцедуры -Процедура ПолучитьОбщиеНастройкиУзловИнформационныхБаз(МенеджерВременныхТаблиц) - - Запрос = Новый Запрос; - - Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - - ТекстЗапросаРезультат = - "ВЫБРАТЬ - | ОбщиеНастройкиУзловИнформационныхБаз.УзелИнформационнойБазы КАК УзелИнформационнойБазы, - | ЕСТЬNULL(ОбщиеНастройкиУзловИнформационныхБаз.ВерсияКорреспондента, """") КАК ВерсияКорреспондента, - | ЕСТЬNULL(ОбщиеНастройкиУзловИнформационныхБаз.ПрефиксКорреспондента, """") КАК ПрефиксКорреспондента, - | ЕСТЬNULL(ОбщиеНастройкиУзловИнформационныхБаз.НастройкаЗавершена, ЛОЖЬ) КАК НастройкаЗавершена - |ПОМЕСТИТЬ ОбщиеНастройкиУзловИнформационныхБаз - |ИЗ - | РегистрСведений.ОбщиеНастройкиУзловИнформационныхБаз КАК ОбщиеНастройкиУзловИнформационныхБаз"; - - Иначе - - ТекстЗапросаРезультат = - "ВЫБРАТЬ - | NULL КАК УзелИнформационнойБазы, - | """" КАК ВерсияКорреспондента, - | """" КАК ПрефиксКорреспондента, - | ЛОЖЬ КАК НастройкаЗавершена - |ПОМЕСТИТЬ ОбщиеНастройкиУзловИнформационныхБаз"; - - КонецЕсли; - - Запрос.Текст = ТекстЗапросаРезультат; - Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; - Запрос.Выполнить(); - -КонецПроцедуры - Функция ПланыОбменаСПравиламиИзФайла() Запрос = Новый Запрос; @@ -10733,64 +11395,6 @@ КонецПроцедуры -// Регистрирует что обмен был произведен и фиксирует информацию в протоколе. -// -// Параметры: -// СтруктураНастроекОбмена - Структура - структура со всеми необходимыми данными и объектами для выполнения обмена. -// -Процедура ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена) Экспорт - - // Статус "Неопределено" в конце обмена свидетельствует об успешном выполнении обмена. - Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Выполнено; - КонецЕсли; - - // Формируем итоговое сообщение для протокола. - Если СтруктураНастроекОбмена.ЭтоОбменВРИБ Тогда - СтрокаСообщения = НСтр("ru = '%1, %2'", ОбщегоНазначения.КодОсновногоЯзыка()); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, - СтруктураНастроекОбмена.РезультатВыполненияОбмена, - СтруктураНастроекОбмена.ДействиеПриОбмене); - Иначе - СтрокаСообщения = НСтр("ru = '%1, %2; Объектов обработано: %3'", ОбщегоНазначения.КодОсновногоЯзыка()); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, - СтруктураНастроекОбмена.РезультатВыполненияОбмена, - СтруктураНастроекОбмена.ДействиеПриОбмене, - СтруктураНастроекОбмена.КоличествоОбъектовОбработано); - КонецЕсли; - - СтруктураНастроекОбмена.ДатаОкончания = ТекущаяДатаСеанса(); - - УстановитьПривилегированныйРежим(Истина); - - // Фиксируем состояние обмена в РС. - ЗафиксироватьЗавершениеОбменаВРегистреСведений(СтруктураНастроекОбмена); - - // Если обмен данными был успешно выполнен. - Если РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) Тогда - - ЗафиксироватьУспешныйОбменДаннымиВРегистреСведений(СтруктураНастроекОбмена); - - РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.СнятьПризнакОтправкиДанных(СтруктураНастроекОбмена.УзелИнформационнойБазы); - - КонецЕсли; - - ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщения, СтруктураНастроекОбмена); - -КонецПроцедуры - -Процедура ЗафиксироватьНачалоОбменаВРегистреСведений(СтруктураНастроекОбмена) - - СтруктураЗаписи = Новый Структура; - СтруктураЗаписи.Вставить("УзелИнформационнойБазы", СтруктураНастроекОбмена.УзелИнформационнойБазы); - СтруктураЗаписи.Вставить("ДействиеПриОбмене", СтруктураНастроекОбмена.ДействиеПриОбмене); - - СтруктураЗаписи.Вставить("ДатаНачала", СтруктураНастроекОбмена.ДатаНачала); - - РегистрыСведений.СостоянияОбменовДанными.ОбновитьЗапись(СтруктураЗаписи); - -КонецПроцедуры - // Фиксирует состояние обмена данными в регистре сведений СостоянияОбменовДанными. // // Параметры: @@ -10831,26 +11435,6 @@ КонецПроцедуры -// Создает запись в журнале регистрации о событии обмена данными/транспорте сообщений обмена. -// -Процедура ЗаписьЖурналаРегистрацииОбменаДанными(Комментарий, СтруктураНастроекОбмена, ЭтоОшибка = Ложь) - - Уровень = ?(ЭтоОшибка, УровеньЖурналаРегистрации.Ошибка, УровеньЖурналаРегистрации.Информация); - - Если СтруктураНастроекОбмена.Свойство("УзелИнформационнойБазы") Тогда - - ЗаписьЖурналаРегистрации(СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, - Уровень, - СтруктураНастроекОбмена.УзелИнформационнойБазы.Метаданные(), - СтруктураНастроекОбмена.УзелИнформационнойБазы, - Комментарий); - - Иначе - ЗаписьЖурналаРегистрации(СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, Уровень,,, Комментарий); - КонецЕсли; - -КонецПроцедуры - Процедура ЗаписатьСобытиеПолученияДанных(Знач УзелИнформационнойБазы, Знач Комментарий, Знач ЭтоОшибка = Ложь) Уровень = ?(ЭтоОшибка, УровеньЖурналаРегистрации.Ошибка, УровеньЖурналаРегистрации.Информация); @@ -11113,16 +11697,6 @@ КонецФункции -// Возвращает признак успешного выполнения обмена данными. -// -Функция РезультатВыполненияОбменаВыполнено(РезультатВыполненияОбмена) - - Возврат РезультатВыполненияОбмена = Неопределено - ИЛИ РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Выполнено - ИЛИ РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.ВыполненоСПредупреждениями; - -КонецФункции - // Формирует и возвращает ключ таблицы данных. // Ключ таблицы используется для выборочной загрузки данных из сообщения обмена по заданному ключу. // @@ -11332,32 +11906,6 @@ Возврат ""; КонецФункции -Функция СправочникиПланаОбмена(Знач ИмяПланаОбмена) - - Если ТипЗнч(ИмяПланаОбмена) <> Тип("Строка") Тогда - - ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(ИмяПланаОбмена); - - КонецЕсли; - - Результат = Новый Массив; - - СоставПланаОбмена = Метаданные.ПланыОбмена[ИмяПланаОбмена].Состав; - - Для Каждого Элемент Из СоставПланаОбмена Цикл - - Если ОбщегоНазначения.ЭтоСправочник(Элемент.Метаданные) - ИЛИ ОбщегоНазначения.ЭтоПланВидовХарактеристик(Элемент.Метаданные) Тогда - - Результат.Добавить(Элемент.Метаданные); - - КонецЕсли; - - КонецЦикла; - - Возврат Результат; -КонецФункции - Функция ВсеДанныеПланаОбменаКромеСправочников(Знач ИмяПланаОбмена) Если ТипЗнч(ИмяПланаОбмена) <> Тип("Строка") Тогда @@ -11855,6 +12403,35 @@ Возврат Результат; КонецЕсли; + // Для конфигураций с разными вариантами встроенного языка COM соединение не работает + + ВариантВстроенногоЯзыкаКорреспондента = ""; + ВариантыВстроенногоЯзыкаОтличаются = Ложь; + Если Метаданные.ВариантВстроенногоЯзыка = Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Русский + И ВнешнееСоединение.Метаданные.ВариантВстроенногоЯзыка <> ВнешнееСоединение.Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Русский Тогда + ВариантВстроенногоЯзыкаКорреспондента = НСтр("ru = 'Английский'"); + ВариантыВстроенногоЯзыкаОтличаются = Истина; + КонецЕсли; + + Если Метаданные.ВариантВстроенногоЯзыка = Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Английский + И ВнешнееСоединение.Метаданные.ВариантВстроенногоЯзыка <> ВнешнееСоединение.Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Английский Тогда + ВариантВстроенногоЯзыкаКорреспондента = НСтр("ru = 'Русский'"); + ВариантыВстроенногоЯзыкаОтличаются = Истина; + КонецЕсли; + + Если ВариантыВстроенногоЯзыкаОтличаются Тогда + + ПодробноеОписаниеОшибки = НСтр("ru = 'В подключаемой программе отличается вариант встроенного языка (%1). Подключение невозможно.'"); + ПодробноеОписаниеОшибки = СтрШаблон(ПодробноеОписаниеОшибки, ВариантВстроенногоЯзыкаКорреспондента); + + Результат.ПодробноеОписаниеОшибки = ПодробноеОписаниеОшибки; + Результат.КраткоеОписаниеОшибки = ПодробноеОписаниеОшибки; + Результат.Соединение = Неопределено; + + Возврат Результат; + + КонецЕсли; + // Дополнительно проверяем возможность работы с внешней базой. Попытка @@ -11909,295 +12486,7 @@ КонецФункции -// Инициализирует WS-прокси для выполнения управляющих команд обмена данными, -// предварительно проверяет наличие узла обмена. -// -// Параметры: -// Прокси - WSПрокси - WS-прокси для передачи управляющих команд. -// СтруктураНастроек - Структура - структура параметров для подключения к корреспонденту и идентификации настройки обмена: -// * ИмяПланаОбмена - Строка - имя плана обмена, используемого при синхронизации. -// * УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, соответствующий корреспонденту. -// * КлючСообщенияЖурналаРегистрации - Строка - имя события для записи ошибок в журнал регистрации. -// * ТекущийУзелПланаОбмена - ПланОбменаСсылка - ссылка на ЭтотУзел плана обмена. -// * ТекущийУзелПланаОбменаКод - Строка - идентификатор текущего узла плана обмена. -// * ДействиеПриОбмене - ПеречислениеСсылка.ДействияПриОбмене - указывает на направление обмена. -// ПараметрыПрокси - Структура: -// * ПараметрыАутентификации - Строка -// - Структура - содержит пароль для аутентификации на веб-сервере. -// * СтруктураНастроекАутентификации - Структура - содержит структуру настроек для аутентификации на веб-сервере. -// * МинимальнаяВерсия - Строка - номер минимальной версии интерфейса "ОбменДанными", требуемый для выполнения действий. -// * ТекущаяВерсия - Строка - исходящий, фактическая версия интерфейса инициализированного WS-прокси. -// Отказ - Булево - признак неуспешной инициализации WS-прокси. -// СостояниеНастройки - Структура - исходящий, возвращает состояние настройки синхронизации, описанной в СтруктураНастроек: -// * НастройкаСуществует - Булево - Истина, если настройка с указанными планом обмена и идентификатором узла существует. -// * НастройкаСинхронизацииДанныхЗавершена - Булево - Истина, если настройка синхронизации завершена. -// * ПоддерживаетсяСопоставлениеДанных - Булево - Истина, если корреспондент поддерживает функцию сопоставления данных. -// * ПолученоСообщениеДляСопоставленияДанных - Булево - Истина, в корреспондент загружено сообщение для сопоставления. -// СтрокаСообщенияОбОшибке - Строка - описание ошибки инициализации WS-прокси. -// -Процедура ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, - СтруктураНастроек, ПараметрыПрокси, Отказ, СостояниеНастройки, СтрокаСообщенияОбОшибке = "") Экспорт - - МинимальнаяВерсия = "0.0.0.0"; - Если ПараметрыПрокси.Свойство("МинимальнаяВерсия") Тогда - МинимальнаяВерсия = ПараметрыПрокси.МинимальнаяВерсия; - КонецЕсли; - - ПараметрыАутентификации = Неопределено; - ПараметрыПрокси.Свойство("ПараметрыАутентификации", ПараметрыАутентификации); - - СтруктураНастроекАутентификации = Неопределено; - ПараметрыПрокси.Свойство("СтруктураНастроекАутентификации", СтруктураНастроекАутентификации); - - ПараметрыПрокси.Вставить("ТекущаяВерсия", Неопределено); - - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ПараметрыАутентификации", ПараметрыАутентификации); - ДополнительныеПараметры.Вставить("МинимальнаяВерсия", МинимальнаяВерсия); - ДополнительныеПараметры.Вставить("СтруктураНастроекАутентификации", СтруктураНастроекАутентификации); - - Прокси = WSПроксиДляУзлаИнформационнойБазы( - СтруктураНастроек.УзелИнформационнойБазы, - СтрокаСообщенияОбОшибке, - ДополнительныеПараметры); - - Если Прокси = Неопределено Тогда - Отказ = Истина; - Возврат; - КонецЕсли; - - ПараметрыПрокси.ТекущаяВерсия = ДополнительныеПараметры.ТекущаяВерсия; - - Если ЭтоПланОбменаXDTO(СтруктураНастроек.ИмяПланаОбмена) Тогда - - ПсевдонимУзла = ПсевдонимПредопределенногоУзла(СтруктураНастроек.УзелИнформационнойБазы); - Если ЗначениеЗаполнено(ПсевдонимУзла) Тогда - // Проверка настройки со старым идентификатором (префиксом). - СостояниеНастройки = СостояниеНастройкиСинхронизацииВКорреспонденте( - Прокси, - ПараметрыПрокси, - СтруктураНастроек.ИмяПланаОбмена, - ПсевдонимУзла); - - Если Не СостояниеНастройки.НастройкаСуществует Тогда - Если ВКорреспондентеУстаревшийВариантНастроекОбмена( - Прокси, ПараметрыПрокси, СостояниеНастройки, СтруктураНастроек, ПсевдонимУзла, Отказ, СтрокаСообщенияОбОшибке) - Или Отказ Тогда - Возврат; - КонецЕсли; - Иначе - СтруктураНастроек.ТекущийУзелПланаОбменаКод = ПсевдонимУзла; - Возврат; - КонецЕсли; - КонецЕсли; - - СостояниеНастройки = СостояниеНастройкиСинхронизацииВКорреспонденте( - Прокси, - ПараметрыПрокси, - СтруктураНастроек.ИмяПланаОбмена, - СтруктураНастроек.ТекущийУзелПланаОбменаКод); - - Если Не СостояниеНастройки.НастройкаСуществует Тогда - Если ВКорреспондентеУстаревшийВариантНастроекОбмена( - Прокси, ПараметрыПрокси, СостояниеНастройки, СтруктураНастроек, СтруктураНастроек.ТекущийУзелПланаОбменаКод, Отказ, СтрокаСообщенияОбОшибке) - Или Отказ Тогда - Возврат; - КонецЕсли; - КонецЕсли; - - Иначе - СостояниеНастройки = СостояниеНастройкиСинхронизацииВКорреспонденте( - Прокси, - ПараметрыПрокси, - СтруктураНастроек.ИмяПланаОбмена, - СтруктураНастроек.ТекущийУзелПланаОбменаКод); - КонецЕсли; - - Если Не СостояниеНастройки.НастройкаСуществует Тогда - СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не найдена настройка синхронизации данных ""%1"" с идентификатором ""%2"".'"), - СтруктураНастроек.ИмяПланаОбмена, - СтруктураНастроек.ТекущийУзелПланаОбменаКод); - Отказ = Истина; - КонецЕсли; - -КонецПроцедуры - -Функция ВКорреспондентеУстаревшийВариантНастроекОбмена(Прокси, ПараметрыПрокси, СостояниеНастройки, СтруктураНастроек, КодУзла, Отказ, СтрокаСообщенияОбОшибке = "") - - // Проверка возможности выполнения перехода. - Для Каждого ВариантНастройки Из УстаревшиеВариантыНастроекОбмена(СтруктураНастроек.УзелИнформационнойБазы) Цикл - СостояниеНастройки = СостояниеНастройкиСинхронизацииВКорреспонденте( - Прокси, - ПараметрыПрокси, - ВариантНастройки.ИмяПланаОбмена, - КодУзла); - Если СостояниеНастройки.НастройкаСуществует Тогда - Если СтруктураНастроек.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных Тогда - СтруктураНастроек.ИмяПланаОбмена = ВариантНастройки.ИмяПланаОбмена; - Если КодУзла <> СтруктураНастроек.ТекущийУзелПланаОбменаКод Тогда - СтруктураНастроек.ТекущийУзелПланаОбменаКод = КодУзла; - КонецЕсли; - Иначе - // В этой ИБ выполнен переход на новый план обмена, в корреспонденте еще не выполнен. - // Получение данных необходимо отменить. - СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В программе ""%1"" выполняется обновление настроек синхронизации. - |Загрузка данных отменена. Запустите синхронизацию данных повторно.'"), - Строка(СтруктураНастроек.УзелИнформационнойБазы)); - Отказ = Истина; - КонецЕсли; - Возврат Истина; - КонецЕсли; - КонецЦикла; - - Возврат Ложь; - -КонецФункции - -Функция УстаревшиеВариантыНастроекОбмена(УзелОбмена) - - Результат = Новый Массив; - - ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелОбмена); - - ВариантНастройки = ""; - Если ОбщегоНазначения.ЕстьРеквизитОбъекта("ВариантНастройки", УзелОбмена.Метаданные()) Тогда - ВариантНастройки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(УзелОбмена, "ВариантНастройки"); - КонецЕсли; - - Если ЗначениеЗаполнено(ВариантНастройки) Тогда - Для Каждого ИмяСтарогоПланаОбмена Из ОбменДаннымиПовтИсп.ПланыОбменаБСП() Цикл - Если ИмяСтарогоПланаОбмена = ИмяПланаОбмена Тогда - Продолжить; - КонецЕсли; - Если ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(ИмяСтарогоПланаОбмена) Тогда - Продолжить; - КонецЕсли; - - НастройкиСтарогоПланаОбмена = ЗначениеНастройкиПланаОбмена(ИмяСтарогоПланаОбмена, - "ИмяПланаОбменаДляПереходаНаНовыйОбмен,ВариантыНастроекОбмена"); - - Если НастройкиСтарогоПланаОбмена.ИмяПланаОбменаДляПереходаНаНовыйОбмен = ИмяПланаОбмена Тогда - ВариантНастроек = НастройкиСтарогоПланаОбмена.ВариантыНастроекОбмена.Найти(ВариантНастройки, "ИдентификаторНастройки"); - Если Не ВариантНастроек = Неопределено Тогда - Результат.Добавить(Новый Структура("ИмяПланаОбмена, ИдентификаторНастройки", - ИмяСтарогоПланаОбмена, ВариантНастроек.ИдентификаторНастройки)); - КонецЕсли; - КонецЕсли; - КонецЦикла; - КонецЕсли; - - Возврат Результат; - -КонецФункции - -Функция СостояниеНастройкиСинхронизацииВКорреспонденте(Прокси, ПараметрыПрокси, ИмяПланаОбмена, ИдентификаторУзла) - - Результат = Новый Структура; - Результат.Вставить("НастройкаСуществует", Ложь); - - Результат.Вставить("НастройкаСинхронизацииДанныхЗавершена", Истина); - Результат.Вставить("ПолученоСообщениеДляСопоставленияДанных", Ложь); - Результат.Вставить("ПоддерживаетсяСопоставлениеДанных", Истина); - - СтрокаСообщенияОбОшибке = ""; - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ПараметрыПрокси.ТекущаяВерсия, "2.0.1.6") >= 0 Тогда - НастройкаСуществует = Прокси.TestConnection(ИмяПланаОбмена, ИдентификаторУзла, СтрокаСообщенияОбОшибке); - - Если НастройкаСуществует - И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ПараметрыПрокси.ТекущаяВерсия, "3.0.1.1") >= 0 Тогда - ПараметрыПриемникаПрокси = Прокси.GetIBParameters(ИмяПланаОбмена, ИдентификаторУзла, СтрокаСообщенияОбОшибке); - ПараметрыПриемника = СериализаторXDTO.ПрочитатьXDTO(ПараметрыПриемникаПрокси); - - ЗаполнитьЗначенияСвойств(Результат, ПараметрыПриемника); - КонецЕсли; - - Результат.НастройкаСуществует = НастройкаСуществует; - Иначе - ПараметрыПриемникаПрокси = Прокси.GetIBParameters(ИмяПланаОбмена, ИдентификаторУзла, СтрокаСообщенияОбОшибке); - ПараметрыПриемника = ЗначениеИзСтрокиВнутр(ПараметрыПриемникаПрокси); - - Если ПараметрыПриемника.Свойство("УзелСуществует") Тогда - Результат.НастройкаСуществует = ПараметрыПриемника.УзелСуществует; - Иначе - Результат.НастройкаСуществует = Истина; - КонецЕсли; - КонецЕсли; - - Возврат Результат; - -КонецФункции - -Функция WSПроксиДляУзлаИнформационнойБазы(УзелИнформационнойБазы, - СтрокаСообщенияОбОшибке = "", - ДополнительныеПараметры = Неопределено) - - Если ДополнительныеПараметры = Неопределено Тогда - ДополнительныеПараметры = Новый Структура; - КонецЕсли; - - ПараметрыАутентификации = Неопределено; - ДополнительныеПараметры.Свойство("ПараметрыАутентификации", ПараметрыАутентификации); - - СтруктураНастроекАутентификации = Неопределено; - ДополнительныеПараметры.Свойство("СтруктураНастроекАутентификации", СтруктураНастроекАутентификации); - - МинимальнаяВерсия = Неопределено; - Если Не ДополнительныеПараметры.Свойство("МинимальнаяВерсия", МинимальнаяВерсия) Тогда - МинимальнаяВерсия = "0.0.0.0"; - КонецЕсли; - - ДополнительныеПараметры.Вставить("ТекущаяВерсия"); - - Если СтруктураНастроекАутентификации = Неопределено Тогда - Если ОбменДаннымиПовтИсп.ЭтоУзелОбменаСообщениями(УзелИнформационнойБазы) Тогда - МодульНастройкиТранспортаОбменаСообщениями = ОбщегоНазначения.ОбщийМодуль("РегистрыСведений.НастройкиТранспортаОбменаСообщениями"); - СтруктураНастроекАутентификации = МодульНастройкиТранспортаОбменаСообщениями.НастройкиТранспортаWS(УзелИнформационнойБазы, ПараметрыАутентификации); - Иначе - СтруктураНастроекАутентификации = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспортаWS(УзелИнформационнойБазы, ПараметрыАутентификации); - КонецЕсли; - КонецЕсли; - - Попытка - ВерсииКорреспондента = ОбменДаннымиПовтИсп.ВерсииКорреспондента(СтруктураНастроекАутентификации); - Исключение - СтрокаСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУстановкаПодключенияКWebСервису(), - УровеньЖурналаРегистрации.Ошибка,,, СтрокаСообщенияОбОшибке); - Возврат Неопределено; - КонецПопытки; - - ДоступныеВерсии = Новый Соответствие; - Для Каждого Версия Из СтрРазделить("3.0.1.1;2.1.1.7;2.0.1.6", ";", Ложь) Цикл - ДоступныеВерсии.Вставить(Версия, ВерсииКорреспондента.Найти(Версия) <> Неопределено - И (ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Версия, МинимальнаяВерсия) >= 0)); - КонецЦикла; - ДоступныеВерсии.Вставить("0.0.0.0", ОбщегоНазначенияКлиентСервер.СравнитьВерсии("0.0.0.0", МинимальнаяВерсия) >= 0); - - WSПрокси = Неопределено; - Если ДоступныеВерсии.Получить("3.0.1.1") = Истина Тогда - WSПрокси = ПолучитьWSПрокси_3_0_1_1(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке); - ДополнительныеПараметры.ТекущаяВерсия = "3.0.1.1"; - ИначеЕсли ДоступныеВерсии.Получить("2.1.1.7") = Истина Тогда - WSПрокси = ПолучитьWSПрокси_2_1_1_7(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке); - ДополнительныеПараметры.ТекущаяВерсия = "2.1.1.7"; - ИначеЕсли ДоступныеВерсии.Получить("2.0.1.6") = Истина Тогда - WSПрокси = ПолучитьWSПрокси_2_0_1_6(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке); - ДополнительныеПараметры.ТекущаяВерсия = "2.0.1.6"; - ИначеЕсли ДоступныеВерсии.Получить("0.0.0.0") = Истина Тогда - WSПрокси = ПолучитьWSПрокси(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке); - ДополнительныеПараметры.ТекущаяВерсия = "0.0.0.0"; - Иначе - СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Корреспондент не поддерживает требуемую версию ""%1"" интерфейса ""ОбменДанными"".'"), - МинимальнаяВерсия); - КонецЕсли; - - Возврат WSПрокси; -КонецФункции - -Процедура УдалитьНезначащиеСимволыВНастройкахПодключения(Настройки) +Процедура УдалитьНезначащиеСимволыВНастройкахПодключения(Настройки) Экспорт Для Каждого Настройка Из Настройки Цикл @@ -12211,47 +12500,6 @@ КонецПроцедуры -Функция ЕстьПодключениеККорреспонденту(Знач Корреспондент, - Знач СтруктураНастроек, - СообщениеПользователю = "", - НастройкаСинхронизацииДанныхЗавершена = Истина, - ПолученоСообщениеДляСопоставленияДанных = Ложь) Экспорт - - СтруктураНастроекОбмена = Новый Структура; - СтруктураНастроекОбмена.Вставить("ИмяПланаОбмена", ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(Корреспондент)); - СтруктураНастроекОбмена.Вставить("УзелИнформационнойБазы", Корреспондент); - СтруктураНастроекОбмена.Вставить("КлючСообщенияЖурналаРегистрации", - НСтр("ru = 'Обмен данными.Проверка подключения'", ОбщегоНазначения.КодОсновногоЯзыка())); - СтруктураНастроекОбмена.Вставить("ТекущийУзелПланаОбмена", - ОбменДаннымиПовтИсп.ПолучитьЭтотУзелПланаОбмена(СтруктураНастроекОбмена.ИмяПланаОбмена)); - СтруктураНастроекОбмена.Вставить("ТекущийУзелПланаОбменаКод", - ИдентификаторЭтогоУзлаДляОбмена(Корреспондент)); - СтруктураНастроекОбмена.Вставить("ДействиеПриОбмене", Перечисления.ДействияПриОбмене.ВыгрузкаДанных); // Для проверки возможности перехода. - - ПараметрыПрокси = Новый Структура; - ПараметрыПрокси.Вставить("ПараметрыАутентификации", Неопределено); - ПараметрыПрокси.Вставить("СтруктураНастроекАутентификации", СтруктураНастроек); - - Прокси = Неопределено; - СостояниеНастройки = Неопределено; - Отказ = Ложь; - ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, СтруктураНастроекОбмена, ПараметрыПрокси, Отказ, СостояниеНастройки, СообщениеПользователю); - - Если Отказ Тогда - СброситьПарольСинхронизацииДанных(Корреспондент); - НастройкаСинхронизацииДанныхЗавершена = Ложь; - Возврат Ложь; - КонецЕсли; - - УстановитьПарольСинхронизацииДанных(Корреспондент, СтруктураНастроек.WSПароль); - - НастройкаСинхронизацииДанныхЗавершена = СостояниеНастройки.НастройкаСинхронизацииДанныхЗавершена; - ПолученоСообщениеДляСопоставленияДанных = СостояниеНастройки.ПолученоСообщениеДляСопоставленияДанных; - - Возврат СостояниеНастройки.НастройкаСуществует; - -КонецФункции - // Выводит сообщение об ошибке и выставляет параметр Отказ в "Истина". // // Параметры: @@ -12266,20 +12514,6 @@ КонецПроцедуры -// Получает таблицу правил выборочной регистрации объектов из параметров сеанса. -// -// Параметры: -// Нет. -// -// Возвращаемое значение: -// ТаблицаЗначений - таблица реквизитов регистрации для всех объектов метаданных. -// -Функция ПолучитьПравилаВыборочнойРегистрацииОбъектовПС() Экспорт - - Возврат ОбменДаннымиПовтИсп.ПолучитьПравилаВыборочнойРегистрацииОбъектовПС(); - -КонецФункции - // Выполняет загрузку правил для обмена данными (ПРО или ПКО) в ИБ. // Процедура ЗагрузитьПравилаДляОбменаДанными(Отказ, @@ -12291,12 +12525,22 @@ СтруктураЗаписи = Новый Структура; СтруктураЗаписи.Вставить("ИмяПланаОбмена", ИмяПланаОбмена); СтруктураЗаписи.Вставить("ВидПравил", ВидПравил); + Если Не ПустаяСтрока(ИмяМакетаПравилКорреспондента) Тогда + СтруктураЗаписи.Вставить("ИмяМакетаПравилКорреспондента", ИмяМакетаПравилКорреспондента); + КонецЕсли; + СтруктураЗаписи.Вставить("ИмяМакетаПравил", ИмяМакетаПравил); СтруктураЗаписи.Вставить("ИсточникПравил", Перечисления.ИсточникиПравилДляОбменаДанными.МакетКонфигурации); - СтруктураЗаписи.Вставить("ИспользоватьФильтрВыборочнойРегистрацииОбъектов", Истина); + + Если ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов Тогда + + ПараметрыВыборочнойРегистрации = ОбменДаннымиРегистрацияСервер.НовыеПараметрыВыборочнойРегистрацииДанныхПланаОбмена(ИмяПланаОбмена); + СтруктураЗаписи.Вставить("ПараметрыВыборочнойРегистрации", Новый ХранилищеЗначения(ПараметрыВыборочнойРегистрации)); + + КонецЕсли; // Получаем набор записей регистра. НаборЗаписей = ОбменДаннымиСлужебный.СоздатьНаборЗаписейРегистраСведений(СтруктураЗаписи, "ПравилаДляОбменаДанными"); @@ -12311,26 +12555,28 @@ РегистрыСведений.ПравилаДляОбменаДанными.ЗагрузитьПравила(Отказ, НаборЗаписей[0]); Если Не Отказ Тогда + НаборЗаписей.Записать(); + КонецЕсли; КонецПроцедуры -Процедура ЗагрузитьМенеджерРегистрацииОбменаДанными(Отказ, - Знач ИмяПланаОбмена, - Знач ВидПравил) +Процедура ЗагрузитьМенеджерРегистрацииОбменаДанными(Отказ, Знач ИмяПланаОбмена) СтруктураЗаписи = Новый Структура; СтруктураЗаписи.Вставить("ИмяПланаОбмена", ИмяПланаОбмена); - СтруктураЗаписи.Вставить("ВидПравил", ВидПравил); + СтруктураЗаписи.Вставить("ВидПравил", Перечисления.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов); СтруктураЗаписи.Вставить("ИсточникПравил", Перечисления.ИсточникиПравилДляОбменаДанными.МенеджерТиповой); - СтруктураЗаписи.Вставить("ИспользоватьФильтрВыборочнойРегистрацииОбъектов", Истина); - + + ПараметрыВыборочнойРегистрации = ОбменДаннымиРегистрацияСервер.НовыеПараметрыВыборочнойРегистрацииДанныхПланаОбмена(ИмяПланаОбмена); + СтруктураЗаписи.Вставить("ПараметрыВыборочнойРегистрации", Новый ХранилищеЗначения(ПараметрыВыборочнойРегистрации)); + ИмяМенеджераРегистрации = ОбменДаннымиПовтИсп.ИмяМенеджераРегистрации(ИмяПланаОбмена); СтруктураЗаписи.Вставить("ИмяМенеджераРегистрации", ИмяМенеджераРегистрации); Менеджер = ОбщегоНазначения.ОбщийМодуль(ИмяМенеджераРегистрации); - СтруктураЗаписи.Вставить("ИнформацияОПравилах", Менеджер.ИнформацияОПравилах()); + СтруктураЗаписи.Вставить("ИнформацияОПравилах", Менеджер.ИнформацияОПравилах()); // Получаем набор записей регистра. НаборЗаписей = ОбменДаннымиСлужебный.СоздатьНаборЗаписейРегистраСведений(СтруктураЗаписи, "ПравилаДляОбменаДанными"); @@ -12342,7 +12588,9 @@ ЗаполнитьЗначенияСвойств(НоваяЗапись, СтруктураЗаписи); Если Не Отказ Тогда + НаборЗаписей.Записать(); + КонецЕсли; КонецПроцедуры @@ -12440,8 +12688,7 @@ УровеньЖурналаРегистрации.Информация,,, ТекстСообщения); Если ОбменДаннымиПовтИсп.ПравилаРегистрацииВМенеджере(ИмяПланаОбмена) Тогда - ЗагрузитьМенеджерРегистрацииОбменаДанными(Отказ, ИмяПланаОбмена, - Перечисления.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов); + ЗагрузитьМенеджерРегистрацииОбменаДанными(Отказ, ИмяПланаОбмена); Иначе ЗагрузитьПравилаДляОбменаДанными(Отказ, ИмяПланаОбмена, Перечисления.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов, "ПравилаРегистрации"); @@ -12662,15 +12909,6 @@ КонецПроцедуры -Функция УникальноеИмяФайлаСообщенияОбмена(Расширение = "xml") Экспорт - - Результат = "Message{GUID}." + Расширение; - - Результат = СтрЗаменить(Результат, "GUID", Строка(Новый УникальныйИдентификатор)); - - Возврат Результат; -КонецФункции - Функция ЭтоПодчиненныйУзелРИБ() Экспорт Возврат ГлавныйУзел() <> Неопределено; @@ -13103,53 +13341,27 @@ // Функция РолиПрофиляДоступаСинхронизацияДанныхСДругимиПрограммами() + МассивРолей = Новый Массив; + МассивРолей.Добавить("ВыполнениеСинхронизацииДанных"); + МассивРолей.Добавить("УдаленныйДоступБазоваяФункциональность"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда - Возврат "ВыполнениеСинхронизацииДанных, УдаленныйДоступБазоваяФункциональность, ЧтениеИнформацииОВерсияхОбъектов"; - Иначе - Возврат "ВыполнениеСинхронизацииДанных, УдаленныйДоступБазоваяФункциональность"; + + МассивРолей.Добавить("ЧтениеИнформацииОВерсияхОбъектов"); + КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") + И Метаданные.Роли.Найти("ЧтениеДатЗапретаЗагрузки") <> Неопределено Тогда + + МассивРолей.Добавить("ЧтениеДатЗапретаЗагрузки"); + + КонецЕсли; + + Возврат СтрСоединить(МассивРолей, ", "); + КонецФункции -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел -Процедура ПриЗаполненииСпискаТекущихДелПредупрежденияСинхронизации(ТекущиеДела) - - МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); - Если Не ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.РезультатыОбменаДанными) - Или МодульТекущиеДелаСервер.ДелоОтключено("ПредупрежденияПриСинхронизации") Тогда - Возврат; - КонецЕсли; - - ПланыОбменаБСП = ОбменДаннымиПовтИсп.ПланыОбменаБСП(); - Если ПланыОбменаБСП.Количество() > 0 Тогда - - ТаблицаМонитора = ТаблицаМонитораОбменаДанными(ПланыОбменаБСП); - СтруктураРезультат = РегистрыСведений.РезультатыОбменаДанными.КоличествоПредупрежденийДляЭлементаФормы(ТаблицаМонитора.ВыгрузитьКолонку("УзелИнформационнойБазы")); - - Иначе - - СтруктураРезультат = Новый Структура("Количество, Заголовок", 0, ""); - - КонецЕсли; - - // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь - // не делается проверка существования подсистемы. - Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.ОбщиеФормы.НастройкиСинхронизацииДанных.ПолноеИмя()); - - Для Каждого Раздел Из Разделы Цикл - - ИдентификаторПредупрежденияПриСинхронизации = "ПредупрежденияПриСинхронизации" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); - Дело = ТекущиеДела.Добавить(); - Дело.Идентификатор = ИдентификаторПредупрежденияПриСинхронизации; - Дело.ЕстьДела = СтруктураРезультат.Количество > 0; - Дело.Представление = СтруктураРезультат.Заголовок; - Дело.Форма = "РегистрСведений.РезультатыОбменаДанными.Форма.ПредупрежденияСинхронизаций"; - Дело.Владелец = Раздел; - - КонецЦикла; - -КонецПроцедуры - // См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел Процедура ПриЗаполненииСпискаТекущихДелНеобходимоОбновление(ТекущиеДела) @@ -13189,69 +13401,6 @@ КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. -Процедура ПриЗаполненииСпискаТекущихДелПроверитьСовместимостьСТекущейВерсией(ТекущиеДела) - - МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); - Если Не ПравоДоступа("Редактирование", Метаданные.РегистрыСведений.ПравилаДляОбменаДанными) - Или МодульТекущиеДелаСервер.ДелоОтключено("ПравилаОбмена") Тогда - Возврат; - КонецЕсли; - - // Если в командном интерфейсе нет раздела к которому относится регистр сведений, дело не добавляется. - Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта("РегистрСведений.ПравилаДляОбменаДанными"); - Если Разделы.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - ВывестиДело = Истина; - ПровереноНаВерсию = ХранилищеОбщихНастроек.Загрузить("ТекущиеДела", "ПланыОбмена"); - Если ПровереноНаВерсию <> Неопределено Тогда - ВерсияМассив = СтрРазделить(Метаданные.Версия, "."); - ТекущаяВерсия = ВерсияМассив[0] + ВерсияМассив[1] + ВерсияМассив[2]; - Если ПровереноНаВерсию = ТекущаяВерсия Тогда - ВывестиДело = Ложь; // Дополнительные отчеты и обработки проверены на текущей версии. - КонецЕсли; - КонецЕсли; - - ПланыОбменаСПравиламиИзФайла = ПланыОбменаСПравиламиИзФайла(); - - Для Каждого Раздел Из Разделы Цикл - ИдентификаторРаздела = "ПроверитьСовместимостьСТекущейВерсией" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); - - // Добавление дела. - Дело = ТекущиеДела.Добавить(); - Дело.Идентификатор = "ПравилаОбмена"; - Дело.ЕстьДела = ВывестиДело И ПланыОбменаСПравиламиИзФайла > 0; - Дело.Представление = НСтр("ru = 'Правила обмена'"); - Дело.Количество = ПланыОбменаСПравиламиИзФайла; - Дело.Форма = "РегистрСведений.ПравилаДляОбменаДанными.Форма.ПроверкаСинхронизацииДанных"; - Дело.Владелец = ИдентификаторРаздела; - - // Проверка наличия группы дела. Если группа отсутствует - добавляем. - ГруппаДела = ТекущиеДела.Найти(ИдентификаторРаздела, "Идентификатор"); - Если ГруппаДела = Неопределено Тогда - ГруппаДела = ТекущиеДела.Добавить(); - ГруппаДела.Идентификатор = ИдентификаторРаздела; - ГруппаДела.ЕстьДела = Дело.ЕстьДела; - ГруппаДела.Представление = НСтр("ru = 'Проверить совместимость'"); - Если Дело.ЕстьДела Тогда - ГруппаДела.Количество = Дело.Количество; - КонецЕсли; - ГруппаДела.Владелец = Раздел; - Иначе - Если Не ГруппаДела.ЕстьДела Тогда - ГруппаДела.ЕстьДела = Дело.ЕстьДела; - КонецЕсли; - - Если Дело.ЕстьДела Тогда - ГруппаДела.Количество = ГруппаДела.Количество + Дело.Количество; - КонецЕсли; - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - Функция СинонимДанныхСтрокиДереваСтатистики(СтрокаДерева, ТипИсточникаСтрокой) Синоним = СтрокаДерева.Синоним; @@ -13570,213 +13719,9 @@ КонецПроцедуры -Процедура ОжиданиеЗавершенияОперации(СтруктураНастроекОбмена, ПараметрыОбмена, Прокси, ДействиеПриОбменеВЭтойИБ = Неопределено) - - Если ПараметрыОбмена.ИнтервалОжиданияНаСервере = 0 Тогда - - Если ДействиеПриОбменеВЭтойИБ <> Неопределено Тогда - - // В этой ИБ "Загрузка", значит в корреспонденте "Выгрузка" - Если ДействиеПриОбменеВЭтойИБ = Перечисления.ДействияПриОбмене.ЗагрузкаДанных Тогда - - ДействиеВКорреспондентеСтрокой = НСтр("ru ='выгрузка'", ОбщегоНазначения.КодОсновногоЯзыка()); - - Иначе - - ДействиеВКорреспондентеСтрокой = НСтр("ru ='загрузка'", ОбщегоНазначения.КодОсновногоЯзыка()); - - КонецЕсли; - - ШаблонСообщения = НСтр("ru = 'Ожидание выполнения операции (%1 данных в базе-корреспонденте)...'", ОбщегоНазначения.КодОсновногоЯзыка()); - ЗаписьЖурналаРегистрацииОбменаДанными(СтрШаблон(ШаблонСообщения, ДействиеВКорреспондентеСтрокой), СтруктураНастроекОбмена); - - КонецЕсли; - - Возврат; - - КонецЕсли; - - Пока ПараметрыОбмена.ДлительнаяОперация Цикл // Замена рекурсии - - Пауза(ПараметрыОбмена.ИнтервалОжиданияНаСервере); - - СтрокаСообщенияОбОшибке = ""; - СостояниеОперации = Прокси.GetContinuousOperationStatus(ПараметрыОбмена.ИдентификаторОперации, СтрокаСообщенияОбОшибке); - - Если СостояниеОперации = "Active" Тогда - - ПараметрыОбмена.ИнтервалОжиданияНаСервере = Мин(ПараметрыОбмена.ИнтервалОжиданияНаСервере + 30, 180); - - ИначеЕсли СостояниеОперации = "Completed" Тогда - - ПараметрыОбмена.ИнтервалОжиданияНаСервере = 15; - ПараметрыОбмена.ДлительнаяОперация = Ложь; - ПараметрыОбмена.ИдентификаторОперации = Неопределено; - - Иначе - - ВызватьИсключение СтрШаблон(НСтр("ru = 'Ошибка в базе-корреспонденте:%1 %2'"), Символы.ПС, СтрокаСообщенияОбОшибке);; - - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - #КонецОбласти -#Область РаботаСКонстантойСообщениеОбменаИзГлавногоУзла - -// Зачитывает из информационной базы информацию о сообщении обмена данными. -// -// Возвращаемое значение: -// Структура - информация о расположении файла сообщения обмена (текущий формат). -// - ДвоичныеДанные - сообщение обмена в информационной базе (устаревший формат). -// -Функция СообщениеОбменаДаннымиИзГлавногоУзла() - - Возврат Константы.СообщениеОбменаДаннымиИзГлавногоУзла.Получить().Получить(); - -КонецФункции - -// Записывает на диск файл сообщения обмена, полученный из главного узла. -// Сохраняет путь к записанному сообщению в константу СообщениеОбменаДаннымиИзГлавногоУзла. -// -// Параметры: -// СообщениеОбмена - ДвоичныеДанные - зачитанное сообщение обмена. -// ГлавныйУзел - ПланОбменаСсылка - узел из которого получено сообщение. -// -Процедура УстановитьСообщениеОбменаДаннымиИзГлавногоУзла(СообщениеОбмена, ГлавныйУзел) Экспорт - - ПутьКФайлу = "[Каталог][Путь].xml"; - ПутьКФайлу = СтрЗаменить(ПутьКФайлу, "[Каталог]", КаталогВременногоХранилищаФайлов()); - ПутьКФайлу = СтрЗаменить(ПутьКФайлу, "[Путь]", Новый УникальныйИдентификатор); - - СообщениеОбмена.Записать(ПутьКФайлу); - - СтруктураСообщения = Новый Структура; - СтруктураСообщения.Вставить("ПутьКФайлу", ПутьКФайлу); - - Константы.СообщениеОбменаДаннымиИзГлавногоУзла.Установить(Новый ХранилищеЗначения(СтруктураСообщения)); - - ЗаписатьСобытиеПолученияДанных(ГлавныйУзел, НСтр("ru = 'Сообщение обмена записано в кэш.'")); - -КонецПроцедуры - -// Удаляет файл сообщения обмена с диска и очищает константу СообщениеОбменаДаннымиИзГлавногоУзла. -// -Процедура ОчиститьСообщениеОбменаДаннымиИзГлавногоУзла() Экспорт - - СообщениеОбмена = СообщениеОбменаДаннымиИзГлавногоУзла(); - - Если ТипЗнч(СообщениеОбмена) = Тип("Структура") Тогда - - УдалитьФайлы(СообщениеОбмена.ПутьКФайлу); - - КонецЕсли; - - Константы.СообщениеОбменаДаннымиИзГлавногоУзла.Установить(Новый ХранилищеЗначения(Неопределено)); - - ЗаписатьСобытиеПолученияДанных(ГлавныйУзел(), НСтр("ru = 'Сообщение обмена удалено из кэша.'")); - -КонецПроцедуры - -#КонецОбласти - -#Область ПрофилиБезопасности - -Процедура СформироватьЗапросыНаИспользованиеВнешнихРесурсов(ЗапросыРазрешений) - - Если ОбщегоНазначения.РазделениеВключено() - И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - Возврат; - КонецЕсли; - - Константы.КаталогСообщенийОбменаДаннымиДляLinux.СоздатьМенеджерЗначения().ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); - Константы.КаталогСообщенийОбменаДаннымиДляWindows.СоздатьМенеджерЗначения().ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); - - Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - РегистрыСведений.НастройкиТранспортаОбменаДанными.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); - КонецЕсли; - - РегистрыСведений.ПравилаДляОбменаДанными.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); - -КонецПроцедуры - -// Параметры: -// ЗапросыРазрешений - Массив из УникальныйИдентификатор - коллекция запросов разрешений. -// Объект - КонстантаМенеджерЗначения - менеджер значения объекта данных. -// -Процедура ЗапросВнешнихРесурсовДляКаталогаСообщенийОбменаДанными(ЗапросыРазрешений, Объект) Экспорт - - ЗначениеКонстанты = Объект.Значение; - МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); - Если Не ПустаяСтрока(ЗначениеКонстанты) Тогда - - Разрешения = Новый Массив; - Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы( - ЗначениеКонстанты, Истина, Истина)); - - ЗапросыРазрешений.Добавить( - МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, - ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Объект.Метаданные()))); - - КонецЕсли; - -КонецПроцедуры - -// Возвращает шаблон имени профиля безопасности для внешнего модуля. -// Функция должна возвращать одно и то же значение при многократном вызове. -// -// Параметры: -// ВнешнийМодуль - ЛюбаяСсылка - ссылка на внешний модуль. -// -// Возвращаемое значение: -// Строка - шаблон имя профиля безопасности, содержащий символы -// "%1", вместо которых в дальнейшем будет подставлен уникальный идентификатор. -// -Функция ШаблонИмениПрофиляБезопасности(Знач ВнешнийМодуль) Экспорт - - Шаблон = "Exchange_[ИмяПланаОбмена]_%1"; // Не локализуется - Возврат СтрЗаменить(Шаблон, "[ИмяПланаОбмена]", ВнешнийМодуль.Имя); - -КонецФункции - -// Возвращает пиктограмму, отображающую внешний модуль. -// -// ВнешнийМодуль - ЛюбаяСсылка, ссылка на внешний модуль, -// -// Возвращаемое значение: -// Картинка. -// -Функция ПиктограммаВнешнегоМодуля(Знач ВнешнийМодуль) Экспорт - - Возврат БиблиотекаКартинок.СинхронизацияДанных; - -КонецФункции - -Функция СловарьКонтейнераВнешнегоМодуля() Экспорт - - Результат = Новый Структура(); - - Результат.Вставить("Именительный", НСтр("ru = 'Настройка синхронизации данных'")); - Результат.Вставить("Родительный", НСтр("ru = 'Настройки синхронизации данных'")); - - Возврат Результат; - -КонецФункции - -Функция КонтейнерыВнешнихМодулей() Экспорт - - Результат = Новый Массив(); - ОбменДаннымиПереопределяемый.ПолучитьПланыОбмена(Результат); - Возврат Результат; - -КонецФункции - -#КонецОбласти - -#Область ИнтерактивноеИзменениеВыгрузки +#Область ИнтерактивноеИзменениеВыгрузки_СлужебныеПроцедурыИФункции // Инициализирует дополнение выгрузки для мастера пошагового обмена. // @@ -14092,44 +14037,6 @@ Возврат Результат; КонецФункции -// Сохраняет настройки с указанным именем по данным ДополнениеВыгрузки. -// -// Параметры: -// ДополнениеВыгрузки - Структура -// - РеквизитФормыКоллекция - описание параметров выгрузки. -// ПредставлениеНастройки - Строка - название сохраняемой настройки. -// -Процедура ИнтерактивноеИзменениеВыгрузкиСохранитьНастройки(ДополнениеВыгрузки, Знач ПредставлениеНастройки) Экспорт - - ОбработкаДополнения = Обработки.ИнтерактивноеИзменениеВыгрузки.Создать(); - ЗаполнитьЗначенияСвойств(ОбработкаДополнения, ДополнениеВыгрузки, , - "ДополнительнаяРегистрация, ДополнительнаяРегистрацияСценарияУзла"); - - ЗаполнитьТаблицуЗначений(ОбработкаДополнения.ДополнительнаяРегистрация, ДополнениеВыгрузки.ДополнительнаяРегистрация); - ЗаполнитьТаблицуЗначений(ОбработкаДополнения.ДополнительнаяРегистрацияСценарияУзла, ДополнениеВыгрузки.ДополнительнаяРегистрацияСценарияУзла); - - // Компоновщик настроек собираем заново. - Данные = ОбработкаДополнения.КомпоновщикНастроекОбщегоОтбора(); - - Если ПустаяСтрока(ДополнениеВыгрузки.АдресКомпоновщикаВсехДокументов) Тогда - ИсточникНастроек = ДополнениеВыгрузки.КомпоновщикОтбораВсехДокументов.Настройки; - Иначе - СтруктураКомпоновщика = ПолучитьИзВременногоХранилища(ДополнениеВыгрузки.АдресКомпоновщикаВсехДокументов); - ИсточникНастроек = СтруктураКомпоновщика.Настройки; - КонецЕсли; - - ОбработкаДополнения.КомпоновщикОтбораВсехДокументов = Новый КомпоновщикНастроекКомпоновкиДанных; - ОбработкаДополнения.КомпоновщикОтбораВсехДокументов.Инициализировать( Новый ИсточникДоступныхНастроекКомпоновкиДанных(Данные.СхемаКомпоновки) ); - ОбработкаДополнения.КомпоновщикОтбораВсехДокументов.ЗагрузитьНастройки(ИсточникНастроек); - - // Собственно сохранение - ОбработкаДополнения.СохранитьТекущееВНастройки(ПредставлениеНастройки); - - // Текущее представление запомненных настроек. - ДополнениеВыгрузки.ПредставлениеТекущейНастройки = ПредставлениеНастройки; - -КонецПроцедуры - // Заполняет реквизит формы по данным структуры настроек. // // Параметры: @@ -14315,50 +14222,6 @@ Возврат "ВсеСправочники"; КонецФункции -// Имя для сохранения и восстановления настроек при интерактивном дополнении выгрузки. -// -Функция ДополнениеВыгрузкиИмяАвтоСохраненияНастроек() Экспорт - Возврат НСтр("ru = 'Последняя отправка (сохраняется автоматически)'"); -КонецФункции - -// Производит дополнительную регистрацию объектов по настройкам. -// -// Параметры: -// ДополнениеВыгрузки - Структура -// - ДанныеФормыКоллекция - описание параметров выгрузки. -// -Процедура ИнтерактивноеИзменениеВыгрузкиЗарегистрироватьДополнительныеДанные(Знач ДополнениеВыгрузки) Экспорт - - Если ДополнениеВыгрузки.ВариантВыгрузки <= 0 Тогда - Возврат; - КонецЕсли; - - ОбъектОтчета = Обработки.ИнтерактивноеИзменениеВыгрузки.Создать(); - ЗаполнитьЗначенияСвойств(ОбъектОтчета, ДополнениеВыгрузки,,"ДополнительнаяРегистрация, ДополнительнаяРегистрацияСценарияУзла"); - - Если ОбъектОтчета.ВариантВыгрузки=1 Тогда - // За период с отбором, дополнительная пустая. - - ИначеЕсли ДополнениеВыгрузки.ВариантВыгрузки=2 Тогда - // Детально настроено - ОбъектОтчета.КомпоновщикОтбораВсехДокументов = Неопределено; - ОбъектОтчета.ПериодОтбораВсехДокументов = Неопределено; - - ЗаполнитьТаблицуЗначений(ОбъектОтчета.ДополнительнаяРегистрация, ДополнениеВыгрузки.ДополнительнаяРегистрация); - - ИначеЕсли ДополнениеВыгрузки.ВариантВыгрузки=3 Тогда - // По сценарию узла, имитируем детальное. - ОбъектОтчета.ВариантВыгрузки = 2; - - ОбъектОтчета.КомпоновщикОтбораВсехДокументов = Неопределено; - ОбъектОтчета.ПериодОтбораВсехДокументов = Неопределено; - - ЗаполнитьТаблицуЗначений(ОбъектОтчета.ДополнительнаяРегистрация, ДополнениеВыгрузки.ДополнительнаяРегистрацияСценарияУзла); - КонецЕсли; - - ОбъектОтчета.ЗарегистрироватьДополнительныеИзменения(); -КонецПроцедуры - // Производит установку общего периода во все разрезы отбора. // // Параметры: @@ -14426,1109 +14289,75 @@ #КонецОбласти -#Область ВыполнениеДействий +#Область Прочее_СлужебныеПроцедурыИФункции -Процедура ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыЧерезWebСервис(Отказ, - УзелИнформационнойБазы, ДействиеПриОбмене, ПараметрыОбмена) +Процедура НастроитьЭлементыФормыЗацикливания(Форма) - ТолькоПараметры = ПараметрыОбмена.ТолькоПараметры; - - УстановитьПривилегированныйРежим(Истина); - - // ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ - СтруктураНастроекОбмена = НастройкиОбменаДляУзлаИнформационнойБазы( - УзелИнформационнойБазы, ДействиеПриОбмене, Перечисления.ВидыТранспортаСообщенийОбмена.WS, Ложь); - ЗафиксироватьНачалоОбменаВРегистреСведений(СтруктураНастроекОбмена); - - Если СтруктураНастроекОбмена.Отказ Тогда - // Если настройка содержит ошибки, то обмен не производим; статус "Отменено". - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - Отказ = Истина; + Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда Возврат; КонецЕсли; - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; + УзелСсылка = Форма.Объект.Ссылка; + Элементы = Форма.Элементы; - СтрокаСообщения = НСтр("ru = 'Начало процесса обмена данными для узла %1'", ОбщегоНазначения.КодОсновногоЯзыка()); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, СтруктураНастроекОбмена.УзелИнформационнойБазыНаименование); - ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщения, СтруктураНастроекОбмена); + Если УзелСсылка.Пустая() + Или Не ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(УзелСсылка) Тогда + + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( + Элементы, + "ФормаОбщаяКомандаОбъектыНезарегистрированныеПриЗацикливании", + "Видимость", + Ложь); - Если СтруктураНастроекОбмена.ПроизводитьЗагрузкуДанных Тогда - - Если СтруктураНастроекОбмена.ИспользоватьПередачуБольшогоОбъемаДанных Тогда - - // {Обработчик: ПередЧтениемСообщенияОбмена} Начало - ФайлСообщенияОбмена = ""; - СтандартнаяОбработка = Истина; - - ПередЧтениемСообщенияОбмена(СтруктураНастроекОбмена.УзелИнформационнойБазы, ФайлСообщенияОбмена, СтандартнаяОбработка); - // {Обработчик: ПередЧтениемСообщенияОбмена} Окончание - - Если СтандартнаяОбработка Тогда - - Прокси = Неопределено; - - ПараметрыПрокси = Новый Структура; - ПараметрыПрокси.Вставить("ПараметрыАутентификации", ПараметрыОбмена.ПараметрыАутентификации); - - СостояниеНастройки = Неопределено; - СообщениеОбОшибке = ""; - ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, СтруктураНастроекОбмена, ПараметрыПрокси, Отказ, СостояниеНастройки, СообщениеОбОшибке); - - Если Отказ Тогда - ЗаписьЖурналаРегистрацииОбменаДанными(СообщениеОбОшибке, СтруктураНастроекОбмена, Истина); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - Возврат; - КонецЕсли; - - ФайлСообщенияОбмена = ""; - - Попытка - - Прокси.UploadData(СтруктураНастроекОбмена.ИмяПланаОбмена, - СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, - ПараметрыОбмена.ИдентификаторФайла, - ПараметрыОбмена.ДлительнаяОперация, - ПараметрыОбмена.ИдентификаторОперации, - ПараметрыОбмена.ДлительнаяОперацияРазрешена); - - Если ПараметрыОбмена.ДлительнаяОперация Тогда - - ОжиданиеЗавершенияОперации(СтруктураНастроекОбмена, ПараметрыОбмена, Прокси, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); - - КонецЕсли; - - УИДФайлаСообщения = Новый УникальныйИдентификатор(ПараметрыОбмена.ИдентификаторФайла); - ФайлСообщенияОбмена = ПолучитьФайлИзХранилищаВСервисе(УИДФайлаСообщения, УзелИнформационнойБазы, 1024, ПараметрыОбмена.ПараметрыАутентификации); - - Исключение - - ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; - Отказ = Истина; - - КонецПопытки; - - КонецЕсли; - - Если Не Отказ Тогда - - ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ФайлСообщенияОбмена,, ТолькоПараметры); - - КонецЕсли; - - // {Обработчик: ПослеЧтенияСообщенияОбмена} Начало - СтандартнаяОбработка = Истина; - - ПослеЧтенияСообщенияОбмена( - СтруктураНастроекОбмена.УзелИнформационнойБазы, - ФайлСообщенияОбмена, - РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена), - СтандартнаяОбработка, - Не ТолькоПараметры); - // {Обработчик: ПослеЧтенияСообщенияОбмена} Окончание - - Если СтандартнаяОбработка Тогда - - Попытка - Если Не ПустаяСтрока(ФайлСообщенияОбмена) И ТипЗнч(СообщениеОбменаДаннымиИзГлавногоУзла()) <> Тип("Структура") Тогда - УдалитьФайлы(ФайлСообщенияОбмена); - КонецЕсли; - Исключение - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - КонецЕсли; - - Иначе - - Прокси = Неопределено; - - ПараметрыПрокси = Новый Структура; - ПараметрыПрокси.Вставить("ПараметрыАутентификации", ПараметрыОбмена.ПараметрыАутентификации); - - СостояниеНастройки = Неопределено; - СообщениеОбОшибке = ""; - ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, СтруктураНастроекОбмена, ПараметрыПрокси, Отказ, СостояниеНастройки, СообщениеОбОшибке); - - Если Отказ Тогда - ЗаписьЖурналаРегистрацииОбменаДанными(СообщениеОбОшибке, СтруктураНастроекОбмена, Истина); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - Возврат; - КонецЕсли; - - ХранилищеСообщенияОбмена = Неопределено; - Попытка - Прокси.Upload(СтруктураНастроекОбмена.ИмяПланаОбмена, СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, ХранилищеСообщенияОбмена); - ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена,, ХранилищеСообщенияОбмена.Получить()); - Исключение - ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; - КонецПопытки; - - КонецЕсли; - - ИначеЕсли СтруктураНастроекОбмена.ПроизводитьВыгрузкуДанных Тогда - - Прокси = Неопределено; - - ПараметрыПрокси = Новый Структура; - ПараметрыПрокси.Вставить("ПараметрыАутентификации", ПараметрыОбмена.ПараметрыАутентификации); - Если ПараметрыОбмена.СообщениеДляСопоставленияДанных Тогда - ПараметрыПрокси.Вставить("МинимальнаяВерсия", "3.0.1.1"); - КонецЕсли; - - СостояниеНастройки = Неопределено; - СообщениеОбОшибке = ""; - ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, СтруктураНастроекОбмена, ПараметрыПрокси, Отказ, СостояниеНастройки, СообщениеОбОшибке); - - Если Отказ Тогда - ЗаписьЖурналаРегистрацииОбменаДанными(СообщениеОбОшибке, СтруктураНастроекОбмена, Истина); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - Возврат; - КонецЕсли; - - Если СтруктураНастроекОбмена.ИспользоватьПередачуБольшогоОбъемаДанных Тогда - - ВременныйКаталог = ПолучитьИмяВременногоФайла(); - СоздатьКаталог(ВременныйКаталог); - - ФайлСообщенияОбмена = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( - ВременныйКаталог, УникальноеИмяФайлаСообщенияОбмена()); - - Попытка - ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ФайлСообщенияОбмена); - Исключение - ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; - Отказ = Истина; - КонецПопытки; - - // Отправка сообщения обмена только в случае успешной выгрузки данных. - Если РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) И Не Отказ Тогда - - Попытка - - ИдентификаторФайлаУИД = ПоместитьФайлВХранилищеВСервисе(Прокси, ФайлСообщенияОбмена, УзелИнформационнойБазы, 1024); - ИдентификаторФайлаСтрокой = Строка(ИдентификаторФайлаУИД); - - Попытка - УдалитьФайлы(ВременныйКаталог); - Исключение - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - Если ПараметрыОбмена.СообщениеДляСопоставленияДанных - И (СостояниеНастройки.ПоддерживаетсяСопоставлениеДанных - Или Не СостояниеНастройки.НастройкаСинхронизацииДанныхЗавершена) Тогда - Прокси.PutMessageForDataMatching(СтруктураНастроекОбмена.ИмяПланаОбмена, - СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, - ИдентификаторФайлаСтрокой); - Иначе - - Прокси.DownloadData(СтруктураНастроекОбмена.ИмяПланаОбмена, - СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, - ИдентификаторФайлаСтрокой, - ПараметрыОбмена.ДлительнаяОперация, - ПараметрыОбмена.ИдентификаторОперации, - ПараметрыОбмена.ДлительнаяОперацияРазрешена); - - Если ПараметрыОбмена.ДлительнаяОперация Тогда - - ОжиданиеЗавершенияОперации(СтруктураНастроекОбмена, ПараметрыОбмена, Прокси, Перечисления.ДействияПриОбмене.ВыгрузкаДанных); - - КонецЕсли; - - КонецЕсли; - - Исключение - - ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; - Отказ = Истина; - - КонецПопытки; - - КонецЕсли; - - Попытка - УдалитьФайлы(ВременныйКаталог); - Исключение - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - Иначе - - СообщениеОбмена = ""; - - Попытка - - ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена,, СообщениеОбмена); - - // Отправка сообщения обмена только в случае успешной выгрузки данных. - Если РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) Тогда - - Прокси.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 = СтруктураНастроекОбмена.ОбработкаОбменаДанными; //ОбработкаОбъект.КонвертацияОбъектовXDTO - ОбработкаОбменаДанными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Сервис(Отказ, - УзелИнформационнойБазы, ДействиеВыгрузка, ПараметрыОбмена); - КонецЕсли; - - Иначе // Обмен через обычные каналы связи. - - ТолькоПараметры = ПараметрыОбмена.ТолькоПараметры; - ВидТранспортаСообщенийОбмена = ПараметрыОбмена.ВидТранспортаСообщенийОбмена; - - Если ПараметрыОбмена.ВыполнятьЗагрузку Тогда - ВыполнитьДействиеОбменаДляУзлаИнформационнойБазы(Отказ, УзелИнформационнойБазы, - ДействиеЗагрузка, ВидТранспортаСообщенийОбмена, ТолькоПараметры, ДополнительныеПараметры); - КонецЕсли; - - Если ПараметрыОбмена.ВыполнятьВыгрузку Тогда - ВыполнитьДействиеОбменаДляУзлаИнформационнойБазы(Отказ, УзелИнформационнойБазы, - ДействиеВыгрузка, ВидТранспортаСообщенийОбмена, ТолькоПараметры, ДополнительныеПараметры); - КонецЕсли; - - КонецЕсли; + ИмяПанели = "Зацикливание"; - ПослеВыполненияОбменов(УзелИнформационнойБазы, Отказ); + Группа = Элементы.Вставить(ИмяПанели, Тип("ГруппаФормы"), Неопределено, Форма.Элементы.ФормаКоманднаяПанель); + Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа; + Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда; + Группа.ЦветФона = ЦветаСтиля.ЦветФонаПредупреждения; + Группа.ОтображатьЗаголовок = Ложь; + + ДекорацияОтступ = Элементы.Добавить("Отступ" + ИмяПанели, Тип("ДекорацияФормы"), Группа); + ДекорацияОтступ.Вид = ВидДекорацииФормы.Надпись; + + ДекорацияКартинка = Элементы.Добавить("Картинка" + ИмяПанели, Тип("ДекорацияФормы"), Группа); + ДекорацияКартинка.Вид = ВидДекорацииФормы.Картинка; + ДекорацияКартинка.Картинка = БиблиотекаКартинок.Информация; + ДекорацияКартинка.Высота = 3; + ДекорацияКартинка.Ширина = 5; + ДекорацияКартинка.РазмерКартинки = РазмерКартинки.Пропорционально; + + ШаблонТекста = НСтр("ru = '<br>Обнаружено зацикливание синхронизаций. Для получения подробной информации перейдите по + |<a href=ФормаЗацикливаниеСинхронизации>ссылке</a>. + |<br><br> + |<a href=ФормаОбъектыНезарегистрированныеПриЗацикливании>Объекты незарегистрированные при зацикливании</a>.'"); + + ФДок = Новый ФорматированныйДокумент; + ФДок.УстановитьHTML("<html>" + ШаблонТекста + "</html>", Новый Структура); + + ДекорацияНадпись = Элементы.Добавить("Надпись" + ИмяПанели, Тип("ДекорацияФормы"), Группа); + ДекорацияНадпись.Вид = ВидДекорацииФормы.Надпись; + ДекорацияНадпись.АвтоМаксимальнаяШирина = Ложь; + ДекорацияНадпись.РастягиватьПоГоризонтали = Истина; + ДекорацияНадпись.Заголовок = ФДок.ПолучитьФорматированнуюСтроку(); + ДекорацияНадпись.УстановитьДействие("ОбработкаНавигационнойСсылки", "Подключаемый_ОбработкаНавигационнойСсылки"); КонецПроцедуры #КонецОбласти -#КонецОбласти - - +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбменДаннымиСлужебный/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСлужебный/Module.bsl index c5fbbc04d..1680e1537 100644 --- a/SSL/src/CommonModules/ОбменДаннымиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиСлужебный/Module.bsl @@ -45,7 +45,6 @@ // Зарегистрируем имена параметров, которые установлены при. // Выполнении ОбменДаннымиВызовСервера.ОбновитьКэшМеханизмаРегистрацииОбъектов. - УстановленныеПараметры.Добавить("ПравилаВыборочнойРегистрацииОбъектов"); УстановленныеПараметры.Добавить("ПравилаРегистрацииОбъектов"); УстановленныеПараметры.Добавить("ДатаОбновленияПовторноИспользуемыхЗначенийМРО"); @@ -106,40 +105,34 @@ // Устанавливаемые параметры сеанса: // ПравилаРегистрацииОбъектов - ХранилищеЗначения - в бинарном виде содержит таблицу значений с правилами регистрации // объектов. -// ПравилаВыборочнойРегистрацииОбъектов - // ДатаОбновленияПовторноИспользуемыхЗначенийМРО - Дата (Дата и время) - содержит дату последнего актуального // кэша для подсистемы обмена данными. // -// Параметры: -// Нет. -// Процедура ОбновитьКэшМеханизмаРегистрацииОбъектов() Экспорт - + УстановитьПривилегированныйРежим(Истина); - + ОбновитьПовторноИспользуемыеЗначения(); - Если ОбменДаннымиПовтИсп.ИспользуемыеПланыОбмена().Количество() > 0 Тогда - + ПараметрыСеанса.ПравилаРегистрацииОбъектов = Новый ХранилищеЗначения(ОбменДаннымиСервер.ПолучитьПравилаРегистрацииОбъектов()); - - ПараметрыСеанса.ПравилаВыборочнойРегистрацииОбъектов = Новый ХранилищеЗначения(ОбменДаннымиСервер.ПолучитьПравилаВыборочнойРегистрацииОбъектов()); - + Иначе - + ПараметрыСеанса.ПравилаРегистрацииОбъектов = Новый ХранилищеЗначения(ОбменДаннымиСервер.ИнициализацияТаблицыПравилРегистрацииОбъектов()); - - ПараметрыСеанса.ПравилаВыборочнойРегистрацииОбъектов = Новый ХранилищеЗначения(ОбменДаннымиСервер.ИнициализацияТаблицыПравилВыборочнойРегистрацииОбъектов()); - + КонецЕсли; // Ключ для проверки актуальности кэша. - ПараметрыСеанса.ДатаОбновленияПовторноИспользуемыхЗначенийМРО = ПолучитьФункциональнуюОпцию( - "АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО"); + ПараметрыСеанса.ДатаОбновленияПовторноИспользуемыхЗначенийМРО = + ПолучитьФункциональнуюОпцию("АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО"); КонецПроцедуры -// См. ОбменДаннымиВызовСервера.СброситьКэшМеханизмаРегистрацииОбъектов. +// Метод актуализирует значение константы ДатаОбновленияПовторноИспользуемыхЗначенийМРО. +// +// Подробнее см. процедуру ОбменДаннымиВызовСервера.СброситьКэшМеханизмаРегистрацииОбъектов. +// Процедура СброситьКэшМеханизмаРегистрацииОбъектов() Экспорт Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда @@ -755,6 +748,8 @@ КонецПроцедуры Процедура ПоместитьСообщениеДляСопоставленияДанных(УзелОбмена, ИдентификаторСообщения) Экспорт + + УстановитьПривилегированныйРежим(Истина); // Удаляется предыдущее сообщение для сопоставления данных. Отбор = Новый Структура("УзелИнформационнойБазы", УзелОбмена); @@ -803,31 +798,21 @@ ВерсииИнтерфейса = ОбменДаннымиПовтИсп.ВерсииКорреспондента(ПараметрыПодключения); - WSПрокси = Неопределено; - Если ВерсииИнтерфейса.Найти("3.0.1.1") <> Неопределено Тогда + СообщениеОбОшибке = ""; + ДополнительныеПараметры = Неопределено; + Прокси = ОбменДаннымиВебСервис.WSПроксиДляУзлаИнформационнойБазы(УзелИнформационнойБазы, СообщениеОбОшибке, ДополнительныеПараметры); - 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(ИдентификаторОперации, СтрокаСообщенияОбОшибке); - + + ПараметрыПрокси = Новый Структура("ТекущаяВерсия", ДополнительныеПараметры.ТекущаяВерсия); + ПараметрыОбмена = Новый Структура("ИдентификаторОперации", ИдентификаторОперации); + СтруктураНастроекОбмена = ОбменДаннымиСервер.НастройкиОбменаДляУзлаИнформационнойБазы(УзелИнформационнойБазы, + "ПроверкаСостоянияДлительнойОперации", Перечисления.ВидыТранспортаСообщенийОбмена.WS); + + Результат = ОбменДаннымиВебСервис.ПолучитьСтатусДлительнойОперации(Прокси, ПараметрыПрокси.ТекущаяВерсия, СтруктураНастроекОбмена, ПараметрыОбмена, СтрокаСообщенияОбОшибке); + Если Результат = "Failed" Тогда СтрокаСообщения = НСтр("ru = 'Ошибка в базе-корреспонденте: %1'"); СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, diff --git a/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl index 462a19c8f..f14dad091 100644 --- a/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl @@ -610,17 +610,16 @@ Возврат; // Запись узла при получении сообщения обмена. КонецЕсли; - ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(Источник.Ссылка); + ПараметрыПроверкиУзла = Новый Структура; + ПараметрыПроверкиУзла.Вставить("УзелМодифицирован", Ложь); + ПараметрыПроверкиУзла.Вставить("РеквизитыСсылочногоТипаУзлаПланаОбмена", Неопределено); - // Получает реквизиты ссылочного типа, которые предположительно используются как фильтры фильтров правил регистрации. - ТаблицаРеквизитовСсылочногоТипа = РеквизитыОбъектаСсылочногоТипа(Источник, ИмяПланаОбмена); + УзелПланаОбменаМодифицированПоСсылочнымРеквизитам(Источник, ПараметрыПроверкиУзла); - // Определяем признак модифицированности узла относительно выбранных реквизитов. - ОбъектМодифицирован = ОбъектМодифицированПоРеквизитам(Источник, ТаблицаРеквизитовСсылочногоТипа); - - Если ОбъектМодифицирован Тогда + Если ПараметрыПроверкиУзла.УзелМодифицирован + И ПараметрыПроверкиУзла.РеквизитыСсылочногоТипаУзлаПланаОбмена <> Неопределено Тогда - Источник.ДополнительныеСвойства.Вставить("ТаблицаРеквизитовУзла", ТаблицаРеквизитовСсылочногоТипа); + Источник.ДополнительныеСвойства.Вставить("ТаблицаРеквизитовУзла", ПараметрыПроверкиУзла.РеквизитыСсылочногоТипаУзлаПланаОбмена); КонецЕсли; @@ -1243,7 +1242,7 @@ ОбъектМодифицирован = Объект.ДополнительныеСвойства.Свойство("ОтложеннаяЗапись") Или Объект.ДополнительныеСвойства.Свойство("ОтложенноеПроведение") - Или ОбъектМодифицированДляПланаОбмена( + Или ОбменДаннымиРегистрацияСервер.ОбъектМодифицированДляПланаОбмена( Объект, ОбъектМетаданных, ИмяПланаОбмена, РежимЗаписи, ЗарегистрироватьОбъектКВыгрузке); Если Не ОбъектМодифицирован Тогда @@ -1283,20 +1282,24 @@ МодульОбменДаннымиВМоделиСервиса.ПослеОпределенияПолучателей(Объект, МассивУзловРезультат, ИмяПланаОбмена); КонецЕсли; + ИсключитьРегистрациюИзЗацикленныхУзлов(МассивУзловРезультат, Объект, ИмяПланаОбмена); + ДополнитьПолучателей(Объект, МассивУзловРезультат); КонецЕсли; - + Исключение - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось зарегистрировать изменения на узлах плана обмена %1 по причине: %2'"), - ИмяПланаОбмена, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ЗаписьЖурналаРегистрации(НСтр("ru = 'Обмен данными.Правила регистрации объектов'", ОбщегоНазначения.КодОсновногоЯзыка()), + ШаблонТекста = НСтр("ru = 'Не удалось зарегистрировать изменения на узлах плана обмена %1 по причине: %2'", ОбщегоНазначения.КодОсновногоЯзыка()); + ПодробноеПредставление = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + ОписаниеОшибки = СтрШаблон(ШаблонТекста, ИмяПланаОбмена, ПодробноеПредставление); + + ЗаписьЖурналаРегистрации(ОбменДаннымиРегистрацияСервер.ИмяСобытияПравилаРегистрации(), УровеньЖурналаРегистрации.Ошибка, Метаданные.ПланыОбмена[ИмяПланаОбмена], , ОписаниеОшибки); ВызватьИсключение ОписаниеОшибки; + КонецПопытки; КонецПроцедуры @@ -1328,210 +1331,6 @@ #КонецОбласти -#Область МеханизмВыборочнойРегистрацииОбъектов - -Функция ОбъектМодифицированДляПланаОбмена(Источник, ОбъектМетаданных, ИмяПланаОбмена, РежимЗаписи, ЗарегистрироватьОбъектКВыгрузке) - - Попытка - ОбъектМодифицирован = ОбъектМодифицированДляПланаОбменаПопыткаИсключение(Источник, ОбъектМетаданных, ИмяПланаОбмена, РежимЗаписи, ЗарегистрироватьОбъектКВыгрузке); - Исключение - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка определения модифицированности объекта: %1'"), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - Возврат ОбъектМодифицирован; -КонецФункции - -Функция ОбъектМодифицированДляПланаОбменаПопыткаИсключение(Источник, ОбъектМетаданных, ИмяПланаОбмена, РежимЗаписи, ЗарегистрироватьОбъектКВыгрузке) - - Если ЗарегистрироватьОбъектКВыгрузке Или Источник.ЭтоНовый() Или Источник.ОбменДанными.Загрузка Тогда - // Регистрируем изменения всегда - // - для наборов записей регистров, - // - при физическом удалении объектов, - // - для новых объектов, - // - для объектов записанных по обмену данными. - Возврат Истина; - - ИначеЕсли РежимЗаписи <> Неопределено И ИзмененоПроведениеДокумента(Источник, РежимЗаписи) Тогда - // Если изменен признак документа "Проведен", то считаем документ измененным. - Возврат Истина; - - КонецЕсли; - - ИмяОбъекта = ОбъектМетаданных.ПолноеИмя(); - - ТаблицаРеквизитовРегистрации = ОбменДаннымиПовтИсп.РеквизитыОбъектаДляРегистрации(ИмяОбъекта, ИмяПланаОбмена); - - Если ТаблицаРеквизитовРегистрации.Количество() = 0 Тогда - // Если правила ВРО не заданы, то считаем, что фильтра ВРО нет. - // Объект модифицирован всегда. - Возврат Истина; - КонецЕсли; - - Для Каждого СтрокаТаблицыРеквизитовРегистрации Из ТаблицаРеквизитовРегистрации Цикл - - ЕстьИзмененияВерсийОбъектов = ОпределитьИзмененияВерсийОбъекта(Источник, СтрокаТаблицыРеквизитовРегистрации); - - Если ЕстьИзмененияВерсийОбъектов Тогда - Возврат Истина; - КонецЕсли; - - КонецЦикла; - - // Если дошли до конца, то объект не изменился по реквизитам регистрации. Регистрация на узлах не нужна. - Возврат Ложь; -КонецФункции - -Функция ОбъектМодифицированПоРеквизитам(Источник, ТаблицаРеквизитовСсылочногоТипа) - - Для Каждого СтрокаТаблицы Из ТаблицаРеквизитовСсылочногоТипа Цикл - - ЕстьИзмененияВерсийОбъектов = ОпределитьИзмененияВерсийОбъекта(Источник, СтрокаТаблицы); - - Если ЕстьИзмененияВерсийОбъектов Тогда - - Возврат Истина; - - КонецЕсли; - - КонецЦикла; - - Возврат Ложь; -КонецФункции - -Функция ОпределитьИзмененияВерсийОбъекта(Объект, СтрокаТаблицыРеквизитовРегистрации) - - Если ПустаяСтрока(СтрокаТаблицыРеквизитовРегистрации.ИмяТабличнойЧасти) Тогда // реквизиты Шапки объекта - - ТаблицаРеквизитовРегистрацииВерсияОбъектаДоИзменения = РеквизитыРегистрацииШапкиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); - - ТаблицаРеквизитовРегистрацииВерсияОбъектаПослеИзменения = РеквизитыРегистрацииШапкиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); - - Иначе // реквизиты ТЧ объекта - - // Проверка, что это ТЧ объекта, а не таблица регистра. - Если Объект.Метаданные().ТабличныеЧасти.Найти(СтрокаТаблицыРеквизитовРегистрации.ИмяТабличнойЧасти) = Неопределено Тогда - Возврат Ложь; - КонецЕсли; - - ТаблицаРеквизитовРегистрацииВерсияОбъектаДоИзменения = РеквизитыРегистрацииТабличнойЧастиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); - - ТаблицаРеквизитовРегистрацииВерсияОбъектаПослеИзменения = РеквизитыРегистрацииТабличнойЧастиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); - - КонецЕсли; - - Возврат Не ТаблицыРеквизитовРегистрацииОдинаковые(ТаблицаРеквизитовРегистрацииВерсияОбъектаДоИзменения, ТаблицаРеквизитовРегистрацииВерсияОбъектаПослеИзменения, СтрокаТаблицыРеквизитовРегистрации); - -КонецФункции - -Функция РеквизитыРегистрацииШапкиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) - - ШаблонТекстаЗапроса = - "ВЫБРАТЬ - | &РеквизитыРегистрации - |ИЗ - | &ИмяТаблицыМетаданных КАК ТекущийОбъект - |ГДЕ - | ТекущийОбъект.Ссылка = &Ссылка"; - - ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапроса, "&РеквизитыРегистрации", СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицыМетаданных", СтрокаТаблицыРеквизитовРегистрации.ИмяОбъекта); - - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); - Возврат Запрос.Выполнить().Выгрузить(); - -КонецФункции - -Функция РеквизитыРегистрацииТабличнойЧастиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) - - ШаблонТекстаЗапроса = - "ВЫБРАТЬ - | &РеквизитыРегистрации - |ИЗ - | &ИмяТаблицыМетаданных КАК ТекущийОбъектИмяТабличнойЧасти - |ГДЕ - | ТекущийОбъектИмяТабличнойЧасти.Ссылка = &Ссылка"; - - СтрокаЗамены = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1.%2", СтрокаТаблицыРеквизитовРегистрации.ИмяОбъекта, СтрокаТаблицыРеквизитовРегистрации.ИмяТабличнойЧасти); - - ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапроса, "&РеквизитыРегистрации", СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицыМетаданных", СтрокаЗамены); - - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); - Возврат Запрос.Выполнить().Выгрузить(); - -КонецФункции - -Функция РеквизитыРегистрацииШапкиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) - - СтруктураРеквизитовРегистрации = СтрокаТаблицыРеквизитовРегистрации.СтруктураРеквизитовРегистрации; - - ТаблицаРеквизитовРегистрации = Новый ТаблицаЗначений; - - Для Каждого РеквизитРегистрации Из СтруктураРеквизитовРегистрации Цикл - - ТаблицаРеквизитовРегистрации.Колонки.Добавить(РеквизитРегистрации.Ключ); - - КонецЦикла; - - СтрокаТаблицы = ТаблицаРеквизитовРегистрации.Добавить(); - - Для Каждого РеквизитРегистрации Из СтруктураРеквизитовРегистрации Цикл - - СтрокаТаблицы[РеквизитРегистрации.Ключ] = Объект[РеквизитРегистрации.Ключ]; - - КонецЦикла; - - Возврат ТаблицаРеквизитовРегистрации; -КонецФункции - -Функция РеквизитыРегистрацииТабличнойЧастиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) - - ТаблицаРеквизитовРегистрации = Объект[СтрокаТаблицыРеквизитовРегистрации.ИмяТабличнойЧасти].Выгрузить(, СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации); - - Возврат ТаблицаРеквизитовРегистрации; - -КонецФункции - -Функция ТаблицыРеквизитовРегистрацииОдинаковые(Таблица1, Таблица2, СтрокаТаблицыРеквизитовРегистрации) - - ДобавитьКолонкуСоЗначениемВТаблицу(Таблица1, +1); - ДобавитьКолонкуСоЗначениемВТаблицу(Таблица2, -1); - - ТаблицаРезультат = Таблица1.Скопировать(); - - ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(Таблица2, ТаблицаРезультат); - - ТаблицаРезультат.Свернуть(СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации, "ИтераторТаблицыРеквизитовРегистрации"); - - КоличествоОдинаковыхСтрок = ТаблицаРезультат.НайтиСтроки(Новый Структура ("ИтераторТаблицыРеквизитовРегистрации", 0)).Количество(); - - КоличествоСтрокТаблицы = ТаблицаРезультат.Количество(); - - Возврат КоличествоОдинаковыхСтрок = КоличествоСтрокТаблицы; - -КонецФункции - -Функция ИзмененоПроведениеДокумента(Источник, РежимЗаписи) - - Возврат (Источник.Проведен И РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения) - ИЛИ (НЕ Источник.Проведен И РежимЗаписи = РежимЗаписиДокумента.Проведение); - -КонецФункции - -Процедура ДобавитьКолонкуСоЗначениемВТаблицу(Таблица, ЗначениеИтератора) - - Таблица.Колонки.Добавить("ИтераторТаблицыРеквизитовРегистрации"); - - Таблица.ЗаполнитьЗначения(ЗначениеИтератора, "ИтераторТаблицыРеквизитовРегистрации"); - -КонецПроцедуры - -#КонецОбласти - #Область ПравилаРегистрацииОбъектов // Процедура-обертка, выполняет код основной процедуры в режиме попытки @@ -2190,29 +1989,32 @@ // Возвращаемое значение функции. МассивУзловРезультат = Новый Массив; + // Для совместимости со старым параметром УсловиеОтбораПоРеквизитуФлагу + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[УсловиеОтбораПоРеквизитуФлагу]", "И &УсловиеОтбораПоРеквизитуФлагу"); + // Подготавливаем запрос для получения узлов планов обмена. Запрос = Новый Запрос; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ОбязательныеУсловия]", "И ПланОбменаОсновнаяТаблица.Ссылка <> &" + ИмяПланаОбмена + "ЭтотУзел |И НЕ ПланОбменаОсновнаяТаблица.ПометкаУдаления - |[УсловиеОтбораПоРеквизитуФлагу] + |И &УсловиеОтбораПоРеквизитуФлагу |"); // Если ПустаяСтрока(ИмяРеквизитаФлага) Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[УсловиеОтбораПоРеквизитуФлагу]", ""); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеОтбораПоРеквизитуФлагу", "ИСТИНА"); Иначе Если Выгрузка Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[УсловиеОтбораПоРеквизитуФлагу]", - "И (ПланОбменаОсновнаяТаблица.[ИмяРеквизитаФлага] = ЗНАЧЕНИЕ(Перечисление.РежимыВыгрузкиОбъектовОбмена.ВыгружатьПоУсловию) + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеОтбораПоРеквизитуФлагу", + "(ПланОбменаОсновнаяТаблица.[ИмяРеквизитаФлага] = ЗНАЧЕНИЕ(Перечисление.РежимыВыгрузкиОбъектовОбмена.ВыгружатьПоУсловию) |ИЛИ ПланОбменаОсновнаяТаблица.[ИмяРеквизитаФлага] = ЗНАЧЕНИЕ(Перечисление.РежимыВыгрузкиОбъектовОбмена.ВыгружатьВручную) |ИЛИ ПланОбменаОсновнаяТаблица.[ИмяРеквизитаФлага] = ЗНАЧЕНИЕ(Перечисление.РежимыВыгрузкиОбъектовОбмена.ПустаяСсылка))"); Иначе - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[УсловиеОтбораПоРеквизитуФлагу]", - "И (ПланОбменаОсновнаяТаблица.[ИмяРеквизитаФлага] = ЗНАЧЕНИЕ(Перечисление.РежимыВыгрузкиОбъектовОбмена.ВыгружатьПоУсловию) + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеОтбораПоРеквизитуФлагу", + "(ПланОбменаОсновнаяТаблица.[ИмяРеквизитаФлага] = ЗНАЧЕНИЕ(Перечисление.РежимыВыгрузкиОбъектовОбмена.ВыгружатьПоУсловию) |ИЛИ ПланОбменаОсновнаяТаблица.[ИмяРеквизитаФлага] = ЗНАЧЕНИЕ(Перечисление.РежимыВыгрузкиОбъектовОбмена.ПустаяСсылка))"); КонецЕсли; @@ -3097,12 +2899,14 @@ КонецПроцедуры -Функция РеквизитыОбъектаСсылочногоТипа(Объект, ИмяПланаОбмена) +Функция РеквизитыСсылочногоТипаУзлаПланаОбмена(УзелПланаОбменаОбъект) + + ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелПланаОбменаОбъект.Ссылка); // Выполняем инициализацию таблицы. - Результат = ОбменДаннымиСервер.ИнициализацияТаблицыПравилВыборочнойРегистрацииОбъектов(); + Результат = ОбменДаннымиРегистрацияСервер.ИнициализацияТаблицыПравилВыборочнойРегистрацииОбъектов(); - ОбъектМетаданных = Объект.Метаданные(); + ОбъектМетаданных = УзелПланаОбменаОбъект.Метаданные(); ОбъектМетаданныхПолноеИмя = ОбъектМетаданных.ПолноеИмя(); // Получаем реквизиты шапки @@ -3553,6 +3357,105 @@ КонецПроцедуры +// Проверяем есть изменения ссылочных реквизитов узла плана обмена. +// Сведения будут использованы при наложении фильтров на уже зарегистрированные данные узла плана обмена. +// Необходимо понимать: +// - какие данные проходят через новые фильтры узла плана обмена. +// +Процедура УзелПланаОбменаМодифицированПоСсылочнымРеквизитам(УзелПланаОбменаОбъект, ПараметрыПроверкиУзла) + + Если УзелПланаОбменаОбъект = Неопределено Тогда + + Возврат; + + КонецЕсли; + + // Получаем реквизиты ссылочного типа, которые предположительно используются как значения фильтров правил регистрации + // и проверяем их изменение в цикле + ПараметрыПроверкиУзла.РеквизитыСсылочногоТипаУзлаПланаОбмена = РеквизитыСсылочногоТипаУзлаПланаОбмена(УзелПланаОбменаОбъект); + + Для Каждого СтрокаТаблицы Из ПараметрыПроверкиУзла.РеквизитыСсылочногоТипаУзлаПланаОбмена Цикл + + ЕстьИзмененияВерсийОбъектов = ОбменДаннымиРегистрацияСервер.ОпределитьИзмененияВерсийОбъекта(УзелПланаОбменаОбъект, СтрокаТаблицы); + Если ЕстьИзмененияВерсийОбъектов Тогда + + ПараметрыПроверкиУзла.УзелМодифицирован = Истина; + Прервать; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ИсключитьРегистрациюИзЗацикленныхУзлов(МассивУзловРезультат, Объект, ИмяПланаОбмена) + + ОбъектМетаданных = Объект.Метаданные(); + ЭтоОбъектСсылочногоТипа = ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(ОбъектМетаданных); + + Если ЭтоОбъектСсылочногоТипа + И Объект.ОбменДанными.Загрузка Тогда + + Возврат; + + КонецЕсли; + + Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(ИмяПланаОбмена) + И Объект.ОбменДанными.Отправитель <> Неопределено Тогда + + КоличествоУзлов = МассивУзловРезультат.Количество(); + Для Сч = 1 По КоличествоУзлов Цикл + + Индекс = КоличествоУзлов - Сч; + Узел = МассивУзловРезультат.Получить(Индекс); + + Если Узел = Объект.ОбменДанными.Отправитель Тогда + Продолжить; + КонецЕсли; + + Если НЕ ОбменДаннымиПовтИсп.РегистрацияПриЗацикливании(Узел) Тогда + + Запись = РегистрыСведений.ОбъектыНезарегистрированныеПриЗацикливании.СоздатьМенеджерЗаписи(); + Запись.УзелИнформационнойБазы = Узел; + + Если ЭтоОбъектСсылочногоТипа Тогда + + Запись.Объект = Объект.Ссылка; + Запись.ПредставлениеОбъекта = Объект.Ссылка; + + Иначе + + КлючРегистраСведений = Новый Структура(); + Для Каждого Измерение Из ОбъектМетаданных.Измерения Цикл + КлючРегистраСведений.Вставить(Измерение.Имя, Объект.Отбор[Измерение.Имя].Значение); + КонецЦикла; + + Ключ = ОбъектМетаданных.Имя + ЗначениеВСтрокуВнутр(КлючРегистраСведений); + Хеш = Новый ХешированиеДанных(ХешФункция.MD5); + Хеш.Добавить(Ключ); + + Запись.КлючРегистраСведений = СтрЗаменить(Строка(Хеш.ХешСумма), " ", ""); + Запись.ИмяРегистраСведений = ОбъектМетаданных.Имя; + Запись.ИзмеренияРегистраСведений = Новый ХранилищеЗначения(КлючРегистраСведений); + + Шаблон = "%1: %2"; + Запись.ПредставлениеОбъекта = + СтроковыеФункции.ФорматированнаяСтрока(Шаблон, ОбъектМетаданных.Имя, Строка(Объект.Отбор)); + + КонецЕсли; + + Запись.Записать(Истина); + + МассивУзловРезультат.Удалить(Индекс); + + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область РаботаСКоллизиямиИзмененияДанныхПриОбмене diff --git a/SSL/src/CommonModules/ОбменДаннымиТрансляцияФорматаПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиТрансляцияФорматаПовтИсп/Module.bsl new file mode 100644 index 000000000..6f27264b9 --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиТрансляцияФорматаПовтИсп/Module.bsl @@ -0,0 +1,2352 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// Параметры: +// Имя - Строка +// НаправлениеПеревода - Строка - "ru" или "en" +// +// Возвращаемое значение: +// Строка +// +Функция ТранслироватьИмя(Имя, НаправлениеПеревода) Экспорт + + Если Метаданные.ВариантВстроенногоЯзыка = Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Русский Тогда + Возврат Имя; + КонецЕсли; + + Если НаправлениеПеревода = "ru" Тогда + Словарь = Словарь_en_ru(); + ИначеЕсли НаправлениеПеревода = "en" Тогда + Словарь = Словарь_ru_en(); + КонецЕсли; + + НовоеИмя = Словарь.Получить(НРег(Имя)); + + Если НовоеИмя = Неопределено Тогда + Возврат Имя; + Иначе + Возврат НовоеИмя; + КонецЕсли; + +КонецФункции + +// Возвращаемое значение: +// Соответствие +// +Функция Словарь_ru_en() Экспорт + + Словарь = Новый Соответствие; + + // АПК:1036-выкл не проверять текст на орфографию + Словарь.Вставить("skuконтрагента", "SKUCounterparty_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("аванс", "Prepayment_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("авансы", "Prepayments"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("автоматически", "Automatically"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("агент", "Agent"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("агентскоевознаграждение", "AgencyFee"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("адрес", "Address"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("адресдоставки", "DeliveryAddress"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("адресстрокой", "AddressAsString"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("адресэлектроннойпочты", "Email"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("аккредитив", "LetterOfCredit"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("актнапередачуправ", "DeedOfTransfer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("акциз", "ExciseDuty"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("акцизныемарки", "ExciseStamps"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("алкогольная", "Alcoholic"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("алкогольнаяпродукция", "AlcoholContainingProducts"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("альтернативныйтабак", "AlternativeTobaccoProducts"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("амортизационнаягруппа", "DepreciationGroup"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("амортизация", "Depreciation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("амортизациядо2009", "DepreciationBefore2009"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("амортизацияос", "FixedAssetsDepreciationCharge"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("аннулирован", "Canceled_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("антисептики", "Antiseptics"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("аренда", "Lease"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("артикул", "SKU"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("бады", "DietarySupplements"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("банк", "Bank"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("банкдлярасчетов", "TransferBank"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("банковскийордер", "BankPaymentOrder"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("банковскийплатежныйагент", "BankPayingAgent"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("банковскийплатежныйсубагент", "BankPayingSubagent"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("банковскийсчет", "BankAccount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("банковскийсчетконтрагента", "CounterpartyBankAccount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("банковскийсчеторганизации", "CompanyBankAccount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("банковскийсчетотправитель", "SenderBankAccount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("банковскийсчетсотрудника", "EmployeeSBankAccount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("безналичная", "BankAccountPayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("безндс", "EXCLUDINGVAT"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("бик", "BIC"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("бухгалтер", "Accountant"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("валюта", "Currency"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("валютавзаиморасчетов", "ARAPCurrency"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("валютаденежныхсредств", "CashCurrency"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("валютаконвертации", "CurrencyOfConversion"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("валютаконвертациибонусов", "BonusConversionCurrency"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("валютарегламентированногоучета", "LocalAccountingCurrency"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("валютацены", "PriceCurrency"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("вариантоплаты", "PaymentOption"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("вариантотражения", "PostingOption"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("вводвэксплуатацию", "Commissioning"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("вебстраница", "WebPage"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ведомость", "Statement"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("велосипеды", "Bicycles"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("вес", "Weight"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("весовой", "SoldByWeight"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("взносналичными", "CashContribution"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видагентскогодоговора", "AgencyAgreementKind"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видалкогольнойпродукции", "KindOfAlcoholContainingProducts"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видбанковскогосчета", "TypeOfBankAccount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("виддеятельностидляналоговогоучетазатрат", "ActivityTypeForTaxAccountingOfCosts"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("виддоговора", "TypeOfAgreement"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("виддокумента", "DocumentKind"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("виддокументаизклассификатора", "DocumentViewFromClassifier"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("виддокументаотбор", "DocumentTypeSelection"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("виддокументаправоподписи", "TypeOfDocumentRightToSign"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видзапасов", "InventoryOwnerAttribute"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видкарты", "CardKind"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видконтактнойинформации", "ContactInformationKind"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видноменклатуры", "ProductKind"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видобъектаучета", "KindOfAccountingObject"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видоперации", "OperationKind"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видоплаты", "PaymentKind_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видответственноголица", "ResponsiblePersonKind"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видответственноголицаотбор", "TypeOfResponsiblePersonSelection"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видответственноголицастрокой", "TypeOfResponsiblePersonByLine"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видотчета", "ReportKind"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видплатежа", "PaymentKind"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видподарочногосертификата", "GiftCertificateKind"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видпродукцииис", "ProductTypeIS"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видработ", "WorkKind"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видрасходовпонеосновнойдеятельности", "TypeOfExpensesForNonCoreActivities"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видрасходовпоосновнойдеятельности", "TypeOfExpensesForCoreActivities"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видрасчетов", "ARAPType"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видрасчетоврасширенный", "TypeOfCalculationsAdvanced"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видрезерва", "TypeOfReserve"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видсобытияос", "EventKindWithFixedAssets"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видсчета", "AccountType"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видсчетафактуры", "InvoiceType"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видэд", "EdView"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("владелец", "Owner"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("владелецдополнительныхзначений", "AdditionalValuesOwner"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("владелецкарты", "Cardholder"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("владелецфайла", "FileOwner"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("владелецхарактеристики", "TechnicalCharacteristics"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("внереализационныйдоход", "NonOperatingIncome"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("внутреннееперемещение", "InternalMovement"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("внутренняяпередача", "InternalTransmission"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("водительскоеудостоверение", "DriverLicense"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("военныйбилет", "MilitaryIDCard"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("военныйбилетофицеразапаса", "ReserveOfficerSMilitaryIDCard"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("возврат", "Return"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("возвраткомитенту", "RefundToCommittee"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("возвратнаятара", "ReturnContainers"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("возвратныеотходы", "RecyclableWaste"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("возвратоплатыклиентунаплатежнуюкарту", "RefundToCustomerSPaymentCard"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("возвратотклиента", "ReturnFromCustomer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("возвратотклиентачерезплатежнуюсистему", "RefundFromCustomerViaPaymentSystem"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("возвратоткомиссионера", "ReturnFromCommissionAgent"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("возвратотрозничногопокупателя", "ReturnFromRetailCustomer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("возвратподдеятельность", "ReturnUnderOperation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("возвратпоставщику", "ReturnToVendor"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("возвраты", "Returns"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("восстановитьндс", "RestoreVAT"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("впользупоставщика", "InFavorOfSupplier"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("всевыполнено", "AllExecuted"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("втомчислендс", "IncludingVAT"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("выбраннаяформа", "SelectedForm"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("выводитьмесяцпрописью", "DisplayMonthInWords"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("выводитьсуммубезкопеек", "OutputAmountWithoutFractionalPart"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("выданныеавансы", "PrepaymentsToVendor_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("выдать", "Issue"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("выигрышазартнойигры", "GamblingPrize"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("выигрышлотереи", "LotteryPrize"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("выполнен", "Completed"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("выполненныеработы", "CompletedWorks"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("выпускпродукциивподразделение", "ProductsReleaseToBusinessUnit"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("выпускпродукциинасклад", "ProductsReleaseToWarehouse"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("высота", "Height"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("выставленсф", "SetSF"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("вышестоящееподразделение", "SuperiorDepartment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("вэксплуатации", "InOperation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("вэлектронномвиде", "InElectronicForm"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("главныйбухгалтер", "ChiefAccountant"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("глубина", "Depth"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("год", "Year"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("годендо", "ValidUntil_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("головнаяорганизация", "ParentCompany"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("головнойконтрагент", "MainCounterparty"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("город", "City"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("готоваяпродукция", "FinishedProducts"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("готовквыдаче", "ReadyForIssuance"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("гражданство", "Citizenship"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("грузоотправитель", "Shipper"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("грузополучатель", "GoodsRecipient"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("группа", "Group"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("группааналитическогоучета", "AnalyticalGroup"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("группааналитическогоучетаноменклатуры", "AnalyticalProductGroup"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("группанастроекфинансовогоучетарасчетов", "GroupOfFinancialAccountingSettingsForSettlements"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("группаос", "OSGroup"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("давальческиесырьеиматериалы", "GiverRawMaterialsAndSupplies"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("данныеклассификатора", "ClassifierData"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("данныеноменклатуры", "ProductData_1"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("данныеотчета", "ReportData"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("данныепосф", "SFData"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("данныесертификата", "CertificateData"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("данныефио", "FullNameData"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("дата", "Date"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датаведомости", "StatementDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датаведомостинавыплатузарплаты", "PaysheetDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датавходящегодокумента", "IncomingDocumentDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датавыдачи", "DateOfIssue1"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датавыписки", "DateOfDischarge"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датавыполнения", "ExecutionDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датавыпуска", "DateOfProduction"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датавыставления", "IssueDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датадокумента", "DocumentDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датадокументаправаподписи", "DateOfDocumentSignatureRight"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датазакрытия", "ClosingDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датаинвентаризации", "InventoryDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датаисправления", "CorrectionDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датаначала", "StartDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датаначалаинвентаризации", "StartDateOfInventory"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датаначисления", "AccrualDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датаокончания", "EndDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датаокончанияинвентаризации", "EndDateOfInventory"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датаоткрытия", "OpeningDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датаотправки", "DateSent"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датаотправления", "PostingDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датапереходаправасобственности", "DateOfTransferOfTitleToGoods"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датаплатежа", "PaymentDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датаплатежнорасчетногодокумента", "DateOfDocumentInARAPAccounting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датаподписи", "SignatureDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датаполучения", "DateReceived"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датапринятиякучету", "DateOfRecognition"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датаприобретения", "PurchaseDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датапродажи", "DateOfSale"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датапроизводства", "ProductionDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датареализации", "SaleDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датарегистрации", "RegistrationDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датарождения", "BirthDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датасостояния", "StateDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датасписания", "DateOfDeduction"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("датасф", "InvoiceDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("дебиторскаязадолженность", "AccountsReceivable"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("действийнетребуется", "NoActionsNeeded"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("действителендо", "ValidBefore"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("декада", "TenDays"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("денежныедокументы", "CashEquivalents"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("денежныесредства", "Cash"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("денежныйдокумент", "MonetaryDocument"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("день", "Day"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("депозитный", "Deposit_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("депозиты", "Deposits"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("депонированиезарплаты", "SalaryDepositing"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("десятая", "Tenth"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("дипломатическийпаспорт", "DiplomaticPassport"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("длинамагнитногокода", "MagneticCodeLength"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("длинаштрихкода", "BarcodeLength"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("доверенность", "LetterOfAuthority"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("доверенностьдата", "PowerOfAttorneyDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("доверенностькемвыдана", "PowerOfAttorneyIssuedByWhom"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("доверенностькомувыдана", "PowerOfAttorneyIssuedTo"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("доверенностьномер", "PowerOfAttorneyNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("договор", "Contract"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("доклиента", "ToCustomer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("документ", "Document"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("документоснование", "DocumentBasis"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("документпередачи", "DocumentTransfers_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("документпоступления", "DocumentInflow"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("документпродажи", "DocumentSales"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("документрасчетов", "DocumentOfARAPAccounting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("документреализации", "DocumentSalesOfGoodsAndServices"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("документустановкицен", "PriceSettingDocument"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("документыоснования", "BasisDocuments"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("долг", "Debt"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("долгосрочныезаймы", "LongTermLoans"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("долгосрочныекредиты", "LongTermLoans_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("долгосрочный", "LongTerm"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("должность", "JobTitle"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("долястоимости", "CostShare"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("дооборудование", "FurtherEquipping"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("доплата", "ExtraPay"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("дополнительныезначенияиспользуются", "AdditionalValuesUsed"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("дополнительныезначениясвесом", "AdditionalValuesWithWeight"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("дополнительныереквизиты", "AdditionalAttributes"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("дополнительныйкодфсс", "SSFAdditionalCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("достройка", "Completion"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("духи", "PerfumesAndToiletWaters"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("единицаизмерения", "UnitOfMeasure"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("единицаизмеренияпрослеживаемости", "UnitOfTraceability"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("единицаизмерениясрокагодности", "ShelfLifeUnitOfMeasure"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("енвд", "UTII"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("естьвдокументепоступленияреализации", "ThereIsImplementationReceiptInDocument"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("желательнаяформаоплатыбезналичные", "DesirableFormOfPaymentNonCash"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("желательнаяформаоплатыналичные", "DesirableFormOfPaymentCash"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("желательнаяформаоплатыплатежнаякарта", "DesiredFormOfPaymentPaymentCard"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("женский", "Feminine"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("заводскойномер", "ManufaturerNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("заголовок", "Title"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("заголовокформывыборазначения", "ValueChoiceFormTitle"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("заголовокформызначения", "ValueFormTitle"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("загранпаспортрф", "ForeignPassportOfRussianFederation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("загранпаспортссср", "ForeignPassportOfUSSR"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("загружаетсяизинтернета", "ImportingFromInternet"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("займы", "Loans_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("займыполученные", "LoansReceived"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("заказ", "OrderDocument"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("заказклиента", "SalesOrder"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("заказчик", "Customer_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("закрытпринудительно", "ClosedForcefully"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("закупкаподдеятельность", "PurchaseForActivity"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("закупкапоимпорту", "PurchaseByImport"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("заметки", "Notes"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("записи", "Records"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("заполнятьобязательно", "RequiredToFill"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("зарплата", "Salary"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("засчетпоставщика", "AtExpenseOfSupplier"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("засчетстороннейкомпании", "AtExpenseOfThirdPartyCompany"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("заявканарасходденежныхсредств", "RequestForSpendingFunds"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("значениесвойства", "PropertyValue"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("значенияполей", "FieldValues"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("идентификатор", "Id"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("идентификаторгосконтракта", "StateContactID"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("идентификаторноменклатурысервиса1сноменклатура", "IDOf1CProductsProductCategory"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("идентификаторотчета", "ReportID"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("идентификаторплатежа", "PaymentID"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("идентификаторсервиса1сноменклатура", "IDOf1CProductsService"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("идентификаторстроки", "RowID"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("идентификаторупаковки", "PackageID"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("идентификаторхарактеристикисервиса1сноменклатура", "IDOf1CProductsServiceCharacteristic"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("изготовитель", "Manufacturer_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("излишки", "Surpluses"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("импортнаяалкогольнаяпродукция", "ImportedAlcoholContainingProducts"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("имущественноеправо", "PropertyRight"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("имя", "Name"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("инвентаризация", "Inventory_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("инвентарныйномер", "AssetID"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("инкассация", "Collection_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("инкассовоепоручение", "CollectionOrder_2"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("инн", "TIN"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("иннконтрагента", "TINOfCounterparty"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("иннплательщика", "TINOfPayer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("иннполучателя", "RecipientTIN"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("иннпродавца", "SellerTIN"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("иное", "OtherReasons"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("инойпредметрасчета", "OtherSettlementSubject"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("иностранныйбанк", "ForeignBank"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("исполнитель", "Performer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("использоватьоплатуплатежнымикартами", "UsePaymentByCards"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("использоватьсерии", "KeepAccountingByBatch"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("использоватьскидкинаценки", "UseDiscountsMarkups"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("использоватьсрокгодностисерии", "UseShelfLifeOnBatchRegistration"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("использоватьхарактеристики", "UseCharacteristics"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("исправлениеошибки", "CorrectionOfErrors"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("исправляемыйдокументпоступления", "CorrectedReceiptDocument"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("исправляемыйдокументреализации", "CorrectedImplementationDocument"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("исходныйдокумент", "SourceDocument_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("капитальныйремонт", "Overhaul"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("карталояльности", "LoyaltyCard"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кассаккм", "CashRegister"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кассаотправитель", "CashAccountIssuer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кассаполучатель", "CashAccountRecipient"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кассир", "Cashier"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кассоваясмена", "CashRegisterShift"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("квартал", "Quarter"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кемвыдан", "IssuedBy"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ключевыесвойства", "KeyProperties"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ключстроки", "Composite"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("код", "Code"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодавторизации", "AuthorizationCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодадресафиас", "FIASAddressCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодалкогольнойпродукции", "CodeOfAlcoholicProducts"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодальфа2", "CodeAlpha2"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодальфа3", "CodeAlpha3"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодвидадохода", "IncomeKindCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодвиданоменклатурнойклассификации", "ProductClassificationTypeCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодвидаоперации", "TransactionKindCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодвпрограмме", "CodeInApp"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодмвд", "FTSCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодналоговогооргана", "TaxAuthorityCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодоквэд", "BusinessActivityClassifierCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодокп", "RNCPCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодокпд2", "RNCTEAPS2Code"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодподразделения", "BusinessUnitCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодподчиненностифсс", "FTSSubordinationCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодпоокоф", "CodeByRNCFA"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодпфр", "PensionFundCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодтнвэд", "FEACNCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодтру", "TRUCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количество", "Count"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количестводнейотсрочки", "NumberOfDaysOfDeferral"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количестводоизменения", "QuantityBeforeChange_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количестводокорректировки", "QuantityBeforeAdjustment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количестводокументов", "DocumentsCount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количестволистов", "SheetQuantity"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количествонаскладе", "QuantityInStock_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количествопериодовдействия", "NumberOfValidityPeriods"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количествопослеизменения", "QuantityAfterChange"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количестворнпт", "NumberOfRNPT"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количестворнптдоизменения", "NumberOfRNPTBeforeChange"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количестворнптдокорректировки", "NumberOfRNPTBeforeAdjustment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количествоупаковок", "NumberOfPackages"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количествоупаковокдоизменения", "NumberOfPackagesBeforeChange_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количествоупаковокдокорректировки", "NumberOfPackagesBeforeAdjustment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количествоупаковокучет", "NumberOfPackagesAccounting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количествоупаковокфакт", "NumberOfPackagesReal"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количествоучет", "NumberOfDays_1"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("количествофакт", "CountReal"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("комиссионер", "Consignee"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("комиссионныетовары", "CommissionGoods"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("комиссия", "Fee"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("комментарий", "Comment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("комплектуется", "Replenished"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("конецдиапазонамагнитногокода", "EndOfMagneticCodeRange"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("конецдиапазонаштрихкода", "EndOfBarcodeRange"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("конецпериода", "EndOfPeriod"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("контактнаяинформация", "ContactInformation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("контактноелицо", "ContactPerson"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("контактноелицоконтрагента", "CounterpartySContactPerson"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("контрагент", "Counterparty"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("контрагентдебитор", "CounterpartyDebtor"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("контрагенткредитор", "Creditor"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("контрагенты", "Counterparties"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коплате", "AmountDue"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("корректировочный", "Corrective"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коррсчет", "CorrAccount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коэффициент", "ZoomRatio"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коэффициент1", "ZoomRatio1"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коэффициент10", "ZoomRatio10"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коэффициент11", "ZoomRatio11"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коэффициент12", "ZoomRatio12"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коэффициент2", "ZoomRatio2"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коэффициент3", "ZoomRatio3"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коэффициент4", "ZoomRatio4"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коэффициент5", "ZoomRatio5"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коэффициент6", "ZoomRatio6"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коэффициент7", "ZoomRatio7"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коэффициент8", "ZoomRatio8"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коэффициент9", "ZoomRatio9"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коэффициентамортизациибу", "AnnualDepreciationRate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коэффициентбу", "DepreciationAccrualFactor"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("коэффициентускорениябу", "AccelerationFactorAccounting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кполучателюопределяетслужбадоставки", "ToCustomerIsDefinedByTransportationCompany"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кпп", "CRTR"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кппконтрагента", "CounterpartyCRTR"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кппплательщика", "PayerCRTR"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кппполучателя", "RecipientCRTR"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кпппродавца", "SellerCRTR"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("крайнийсрокплатежа", "PaymentDeadline"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("краткосрочныезаймы", "ShortTermLoans"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("краткосрочныекредиты", "ShortTermLoans_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("краткосрочный", "ShortTerm"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кратностьвзаиморасчетов", "Multiplier_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кратностьдокумента", "DocumentMultiplicity"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кратностьконвертации", "ConversionMultiplicity"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кредит", "Credit"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кредиторскаязадолженность", "AccountsPayable"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кредитыизаймы", "LoansAndBorrowings"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кредитыполученные", "LoansReceived_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("крепость", "Strength"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("креслаколяски", "Wheelchairs"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ктозаявил", "WhoStated"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кторешил", "WhoDecided"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("курортныйсбор", "ResortFee"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("курсвзаиморасчетов", "TransactionRate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("курсдокумента", "DocumentCourse"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("курсконвертации", "ConversionRate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("курсконвертациибонусовввалюту", "ConversionRateOfBonusesIntoCurrency"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("курсцбнадатуконвертации", "ExchangeRateOfCentralBankOnDateOfConversion"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("курьер", "Courier"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("курьером", "ByCourier"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("легкаяпромышленность", "LightIndustryGoodsAndClothes"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("линейный", "Linear"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("лотерейныйбилет", "LotteryTicket"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("магнитныйкод", "MagneticCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("максимальныйпроцентоплатыбонусами", "MaximumSharePayableByPoints"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("марка", "Brand"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("маркированныйтовар", "MarkedGoods"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("маркировкаупаковки", "PackageMarking"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("маркировкиупаковок", "PackageMarkings"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("маркируемый", "Labelled"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("маршрут", "Route"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("материалы", "UsedMaterials"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("материалызаказчика", "CustomerMaterials"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("менеджер", "Manager"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("месторождения", "Birthplace"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("месяц", "Month"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("месяцналоговогопериода", "MonthOfTaxPeriod"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("многооборотнаятара", "ReusablePackage"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("многострочноеполеввода", "MultilineInputField"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("модернизация", "Modernization"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("модернизацияос", "FixedAssetsCostAdditions"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("мол", "FinanciallyLiablePerson"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("молочнаяпродукция", "MilkAndMilkProducts"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("монотоварнаяупаковка", "SingleProductPackage"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("мужской", "Masculine"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("мультитоварнаяупаковка", "MultiproductPackaging"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("нааванс", "AdvancePayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("набор", "Set"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("набумажномносителе", "OnPaper"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("названиедокументамодернизации", "ModernizationDocumentName"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("названиедокументапринятиякучету", "NameOfRecognitionDocument"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("назначениеаванса", "AdvancePurpose"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("назначениеплатежа", "PaymentPurposes"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименование", "Description"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименованиевходящегодокумента", "ExternalDocumentName"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименованиеконтактнойинформации", "NameOfContactInformation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименованиекраткое", "ShortDescription1"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименованиеназначенияиспользования", "NameOfPurposeOfUse"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименованиеоквэд", "ActivityType"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименованиеоквэд2", "ActivityType2"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименованиеокопф", "LegalForm"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименованиеокфс", "OwnershipForm"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименованиеотчета", "ReportDescription1"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименованиеполное", "DescriptionFull"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименованиесокращенное", "AbbreviatedDescription"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименованиеспособаотражениярасходов", "NameOfMethodForReflectingExpenses"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименованиетерриториальногоорганапфр", "PensionFundLocalAuthorityName"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименованиетерриториальногоорганафсс", "SSFLocalAuthorityName"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("накопленнаяамортизациябу", "AccumulatedDepreciationAccounting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("накопленнаяамортизациявр", "AccumulatedDepreciationTD"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("накопленнаяамортизацияну", "AccumulatedDepreciationTaxAccounting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("накопленнаяамортизацияпр", "PermanentDifferenceInEvaluationOfAccumulatedDepreciation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наличная", "CashAccountPayment_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наличные", "CashPayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("налоговыйагентпондс", "VATTaxAgent"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("налоговыйномернерезидента", "NonResidentTaxNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("налогообложение", "Taxation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("налогообложениендспродавца", "VATTaxationOfSeller"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("напрочиедоходы", "OnOtherIncome"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("напрочиерасходы", "ForOtherExpenses"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("настройкирасчета", "CalculationSettings"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наутверждении", "AwaitingConfirmation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наценка", "Markup"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("началодиапазонамагнитногокода", "StartOfMagneticCodeRange"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("началодиапазонаштрихкода", "StartOfBarcodeRange"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("началопериода", "BeginOfPeriod"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("началопериодаотчета", "BeginningOfReportPeriod"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("начислениеамортизации", "DepreciationAccrual"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("начислениебонусныхбаллов", "BonusPointAccrual"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("начислениеизноса", "WearAccrual"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("начислениеизносапоенаоф", "AccrueWearAsPerUFADR"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("начисления", "Accruals"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("начислятьамортизациюбу", "DepreciationAccrualAccounting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("начислятьамортизациюну", "DepreciationAccrualTaxAccounting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("нашимисиламисадресаотправителя", "OurOwnDeliveryFromSenderAddress"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ндс", "VAT"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ндс0", "VAT0"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ндс10", "VAT10"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ндс10_110", "VAT10_110"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ндс18", "VAT18"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ндс18_118", "VAT18_118"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ндс20", "VAT20"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ндс20_120", "VAT20_120"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ндсисчисляетсяналоговымагентом", "PersonalIncomeTaxIsCalculatedByTheTaxAgent"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ндсисчисляетсяпокупателем", "VATIsCalculatedByBuyer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ндфл", "PersonalIncomeTax"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("неавтоматизированнаяторговаяточка", "NonAutomatedPointOfSale"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("неделя", "Week"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("недостачи", "Shortages"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("нематериальныеактивы", "IntangibleAssets"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("нематериальныйактив", "IntangibleAsset"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("неначислятьбаллыприоплатебонусами", "DoNotAccruePointsWhenPayingWithBonuses"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("необлагаетсяндс", "NotSubjectToVAT"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("неоплачен", "NotPaid"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("неотгружен", "NotShipped_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("неполучен", "NotReceived"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("нерассчитывается", "NotCalculating"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("несогласована", "NotAgreedUpon"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("несформирован", "NotGenerated1"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("никотиносодержащаяпродукция", "NicotineContainingProducts"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номенклатура", "Products"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номер", "Number"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номеракцизноймарки", "ExciseStampNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номербилета", "TicketNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номерведомости", "StatementNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номерведомостинавыплатузарплаты", "PaysheetNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номервпрограмме", "NumberInProgram"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номервходящегодокумента", "IncomingDocumentNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номергтд", "CCDNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номергтддоизменения", "CCDNumberBeforeChange"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номердекларации", "DeclarationNo"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номердокумента", "DocumentNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номердокументамодернизации", "ModernizationDocumentNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номердокументаправаподписи", "NumberOfSignatureRightDocument"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номердокументапринятиякучету", "DocumentOfRecognitionNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номерисправления", "CorrectionNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номеркарты", "CardNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номеркассовойсмены", "CashShiftNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номерлицевогосчета", "PersonalAccountNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номерпаспорта", "PassportNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номерплатежнорасчетногодокумента", "SettlementDocumentNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номерраздела", "SectionNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номерстроки", "LineNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номерстрокидокумента", "DocumentRowNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номерсф", "InvoiceNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номерсчета", "AccountNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номерсчетафактурыкомиссионера", "CommissionAgentSTaxInvoiceNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номерчекаккм", "CashRegisterReceiptNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номерчекаккмпродажи", "CashRegisterSalesReceiptNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("номинал", "Nominal"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("облагаетсяенвд", "SubjectToENVD"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("облагаетсяндс", "SubjectToVAT"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("облагаетсяндсупокупателя", "SubjectToVATAtCustomer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("обмензавершен", "ExchangeCompleted"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("обособленноеподразделение", "BranchOffice"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("обувь", "ShoesProducts"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("общая", "Shared3"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("общиеданные", "SharedData"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("объект", "Object"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("объем", "VolumeM3"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("объемдал", "VolumeInDecaliters"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("объемпродукцииработдлявычисленияамортизации", "VolumeOfProductsWorksForCalculatingDepreciationInPhysicalUnits"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ожидаемаядатапоставки", "ExpectedDeliveryDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ожидаемаядатапоступления", "ExpectedDateOfReceipt"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ожидаетсяизвещениеополучении", "PendingReceiptNotification"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ожидаетсяисправление", "PendingCorrection"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ожидаетсяпередачаоператору", "PendingTransferToProvider"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ожидаетсяподтверждение", "PendingConfirmation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ожидаетсяподтверждениеоператора", "PendingConfirmationOfProvider"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("окато", "RNCPS"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("оквэд", "RNCEA"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("оквэд2", "RNCEA2"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("окончаниепериодаотчета", "EndOfReportPeriod_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("окопф", "RNCFI"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("окпо", "OKPO"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("округлятьвбольшуюсторону", "RoundUp"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("октмо", "MunicipalTerritoriesClassifier"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("окфс", "OKFS"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("описание", "LongDesc"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("оплатабонуснымибаллами", "PaymentWithBonusPoints"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("оплатаконтрагентам", "PaymentToCounterparties"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("оплатакредита", "PaymentForLoan"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("оплатаотклиентаплатежнойкартой", "PaymentFromClientByPaymentCard"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("оплатаотклиентачерезплатежнуюсистему", "PaymentFromClientThroughPaymentSystem"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("оплатаплатежнымикартами", "PaymentWithPaymentCards"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("оплатаплатежнымикартамиподарочныхсертификатов", "PaymentByCreditCardsForGiftCertificates"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("оплатасертификатами", "PaymentByCertificates"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("оплаты", "Payments"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("оплаченчастично", "PartiallyPaid"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("определяетсяраспределением", "DeterminedByAllocation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("оприходованиеподдеятельность", "ActivityRegistration"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("оптовый", "Wholesale_1"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("организация", "Organization"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("организацияотбор", "CompanyFilter"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("организацияотправитель", "SenderOrganization"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("организацияполучатель", "CompanyRecipient"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("органпфр", "FIUAuthority"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("основание", "Basis"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("основнаявалюта", "MainCurrency"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("основнаякартинка", "MainPicture"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("основнаясистеманалогообложения", "MainSystem"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("основноесредство", "FixedAsset"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("основнойбанковскийсчет", "MainBankAccount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("основныесредства", "FixedAssets"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("особыйпорядокналогообложения", "SpecialTaxationProcedure"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ответственноелицо", "EmployeeInCharge_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ответственный", "EmployeeResponsible"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ответственныйзабухгалтерскиерегистры", "AssigneeForMaintainingOfAccountingRegisters"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ответственныйзаналоговыерегистры", "AssigneeForMaintainingOfTaxRegisters"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("отгружатьзаказцеликом", "ShipEntireOrder"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("отгружен", "Shipped_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("отгруженчастично", "PartiallyShipped"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("отгрузкабезпереходаправсобственности_впути", "ShipmentWithoutTransferOfOwnership_inPath"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("отгрузкабезпереходаправсобственности_реализовано", "ShipmentWithoutTransferOfOwnership_Implemented"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("отгрузкаклиенту", "ShipmentToCustomer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("отгрузкаповозвратупоставщику", "ShipmentUnderReturnToVendor"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("отгрузкапоперемещению", "ShipmentByTransfer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("отклонен", "Rejected"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("отклонена", "IsRejected"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("отменен", "RolledBack_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("отменено", "Canceled"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ототправителяопределяетслужбадоставки", "FromSenderDeterminedByDeliveryService"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("отпускпроизвел", "VacationProduced"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("отсрочкаплатежа", "DeferredPayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("отчество", "MiddleName"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("отчеторозничныхпродажах", "RetailSalesReport"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("оценочныеобязательства", "Provisions"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("очередность", "RankingInPriority"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("параметрыпрописи", "AmountInWordsParameters"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("паспортминморфлота", "MinmorflotPassport"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("паспортморяка", "SeafarerSPassport"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("паспортрф", "PassportOfRussianFederation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("паспортссср", "PassportOfUSSR"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("патент", "Patent"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("первая", "First"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("первоначальнаястоимостьбу", "InitialCostLocalAccounting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("первоначальнаястоимостьну", "InitialCostTA"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("перевозчик", "Carrier"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("передача", "Transfer_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("передачабезоплаты", "TransferWithoutPayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("передачанакомиссию", "TransferToCommissionAgent"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("передачасполнойоплатой", "TransferWithFullPayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("передачасчастичнойоплатой", "TransferWithPartialPayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("перемещениеподдеятельность", "TransferForActivity"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("переносзадолженности", "DebtTransfer_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("переоценка", "Revaluation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("перечислениевбюджет", "TransferOfTaxesAndContributions"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("период", "Period"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("периодотбор", "PeriodFilter"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("периодрегистрации", "RegistrationPeriod"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("периодстрокой", "PeriodAsString"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("пиво", "BeerOrBeerDrink"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("платежвыплата", "PaymentDisbursement"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("платежнаякарта", "PaymentCard"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("платежнаяссылка", "PaymentLink_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("платежноепоручение", "PaymentOrder"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("платежноетребование", "PaymentDemand"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("платежнорасчетныедокументы", "PaymentAndSettlementDocuments"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("платежныйагент", "PayingAgent"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("платежныйордер", "PaymentWarrant"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("платежныйсубагент", "PayingSubagent"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("поверенный", "Attorney"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("погашениезадолженности", "RepaymentOfDebt"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("подакцизныйтовар", "ExcisableGoods"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("подакцизныйтовармаркируемыйсиимеющийкм", "ExcisableGoodsMarkedByIdentificationToolWithMarkingCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("подакцизныйтовармаркируемыйсинеимеющийкм", "ExcisableGoodsMarkedByIdentificationToolWithoutMarkingCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("подарок", "Gift"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("подарочныесертификаты", "GiftCertificates"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("подготовкакпередаче", "PreparingForSale"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("поддерживаетоплатуэсфсс", "SupportsESFSSPayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("подоговорулизинга", "UnderLeaseAgreement"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("подокументу", "ByDocument"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("подотчет", "Subreport"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("подотчетноелицо", "AdvanceHolder"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("подпись", "Signature"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("подразделение", "Department"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("подразделениезатрат", "CostDivision"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("подразделениеотправитель", "SendingDepartment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("подразделениеполучатель", "ReceivingBusinessUnit"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("подсказка", "ToolTip"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("подтвержден", "Confirmed_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("поенаоф", "ByUniformDepreciationRates"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("поенаофна1000кмпробега", "ByUniformDepreciationRatesPer1000KmOfMileage"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("показатели", "Indicators"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("показательдаты", "DateIndicator"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("показателькбк", "IndicatorBCC"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("показательнаработки", "RunningTimeValue"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("показательномера", "NumberIndicator"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("показательоснования", "BasisIndicator"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("показательпериода", "PeriodIndicator"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("показательтипа", "TypeIndicator"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("покупателемвыставляетсясчетфактуранавозврат", "BuyerIssuesInvoiceForReturn"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("покупатели", "Buyers"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("покупатель", "Customer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("покупка", "Purchase"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("покупкаупоставщика", "PurchaseFromSupplier_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("покупки", "Purchases"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("пол", "Gender"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("полугодье", "HalfYear_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("получениеналичных", "ReceivingCash"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("помещение", "Premise"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("понаработке", "ByAssetActivity"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("поручениеэкспедиторувпункте", "InstructionForShippingAgentAtPoint"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("поручениеэкспедиторунасклад", "InstructionForShippingAgentToWarehouse"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("поручениеэкспедиторусосклада", "InstructionForShippingAgentFromWarehouse"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("порядковыйномер", "SequenceNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("порядок", "Order"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("посроку", "ByDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("поставщик", "Vendor"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("постоплата", "Postpayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("поступлениеподдеятельность", "IncomeForActivities"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("посуммечиселлетиспользования", "BySumOfUsefulLifeYearNumbers"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("потребительскаяупаковка", "ConsumerPackaging"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("пофактическомуиспользованию", "ByActualUsage"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("почтовыйадрес", "MailAddress"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("прайслист", "PriceList"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("предоплата", "Prepayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("предоплатаполная", "FullPrepayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("предоплатачастичная", "PartialPrepayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("представление", "Presentation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("представлениевида", "KindPresentaion"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("представлениедокументаправаподписи", "PresentationOfSignatureRightsDocument"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("представлениепериода", "PeriodPresentation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("предъявленсф", "InvIsSubmitted"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("префикс", "Prefix"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("приемкаотпоставщика", "ReceiptFromVendor"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("приемкаповозвратуотклиента", "ReceivingByReturnFromACustomer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("приемкапоперемещению", "ReceivingByTransfer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("приемнакомиссию", "ConsignmentProcurement"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("признакагента", "AgentAttribute"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("признакпредметарасчета", "SettlementSubjectFlag"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("признакспособарасчета", "ShowsCalculationMethod"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("принципал", "Principal"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("принят", "Accepted"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("принятиекучету", "Recognition"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("принятиекучетусвводомвэксплуатацию", "RecognitionWithCommissioning"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("принятоот", "ReceivedFrom"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("припередаче", "OnCommissioning"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("проведениевзаимозачета", "CarryingOutNetting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("программалояльности", "LoyaltyProgram_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("продавец", "Seller"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("продавцы", "Sellers"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("продажанаэкспорт", "ExportSale"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("продажанеоблагаетсяндс", "SaleIsNotSubjectToVAT"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("продажаоблагаетсяенвд", "SaleIsSubjectToUTII"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("продажаоблагаетсяндс", "SaleIsSubjectToVAT"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("продажапопатенту", "SalesByPatent"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("продукция", "ManufacturedProduct"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("производитель", "Manufacturer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("производительимпортер", "ManufacturerImporter"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("пропорциональнообъемупродукции", "ByUnitsOfProduction"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("прослеживаемыйтовар", "TracedGoods"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("проценткомиссионноговознаграждения", "PercentageOfCommission"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("процентотразницысуммпродажиипоступления", "PercentageOfDifferenceBetweenSalesAndReceipts"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("процентотсуммыпродажи", "SaleShare"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("процентплатежа", "PaymentPercentage"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("процентскидки", "DiscountPercentage"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("проценты", "Interests"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("процентыподолгосрочнымзаймам", "InterestOnLongTermLoans_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("процентыподолгосрочнымкредитам", "InterestOnLongTermLoans"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("процентыпократкосрочнымзаймам", "InterestOnShortTermLoans_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("процентыпократкосрочнымкредитам", "InterestOnShortTermLoans"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("прочее", "Other"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("прочеесписание", "OtherWriteOffs"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("прочиерасходы", "OtherExpenses"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("прочиесведения", "OtherInformation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("пфрдопредельнойвеличины", "PensionFundFromBaseToLimitValue"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("пфрзазанятыхнаподземныхивредныхработах", "PFEmployedOnUndergroundAndHarmfulJobs"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("пфрзазанятыхнатяжелыхипрочихработах", "PFForEmployedOnHeavyAndOtherJobs"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("пфрпосуммарномутарифу", "PensionFundByOverallTariff"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("пфрспревышения", "PensionFundFromBaseInExcessOfLimitValue"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("работа", "Work_5"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("работы", "Works"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("разборка", "Disassembly"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("разделы", "Sections"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("разрешитьчастичнуюоплату", "AllowPartialPayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("распределяемыезатраты", "ExpensesForAllocation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("расходынаниокр", "RDExpenses"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("расценка", "Rate_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("расчетный", "Estimated_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("расчеты", "Calculations"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("расчетыввалюте", "ARAPInCurrency"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("расчетывусловныхединицах", "CalculationsInConventionalUnits"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("расчетысдебиторами", "DebtorsARAPAccounting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("расчетысклиентами", "CustomersARAPAccounting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("расчетыскомиссионерами", "CommissionAgentsARAPAccounting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("расчетыскомитентами", "ConsignorsARAPAccounting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("расчетыскомитентамипозакупке", "PurchaseSettlementsWithConsignors"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("расчетыскредиторами", "CreditorsARAPAccounting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("расчетыслизингодателями", "SettlementsWithLessors"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("расчетыспоставщиками", "VendorsARAPAccounting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("расширение", "Extension"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("расшифровкадопрасходов", "TranscriptOfAdditionalExpenses"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("расшифровкаплатежа", "ARAPDetails"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("реализацияклиенту", "SaleToCustomer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("реализациятоваров", "GoodsSales"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("регистрационныйномернерезидента", "NonResidentRegistrationNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("регистрационныйномерпфр", "PensionFundRegistrationNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("регистрационныйномерфсс", "SSFRegistrationNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("регистрациявналоговоморгане", "RegistrationWithTaxAuthority"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("регламентированнаяотчетность", "RegulatedReporting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("резерв", "Reserve"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("резервбу", "ACReserve"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("резервну", "TAReserve"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("реквизитыплатежа", "PaymentDetails"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("реконструкция", "Reconstruction"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("рнпт", "ProductBatchID"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("розничный", "Retail_2"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("руководитель", "Director"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("руководителькадровойслужбы", "HRDirector"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("самовывоз", "SelfPickup"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("сборка", "Assembly"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("свидетельстводатавыдачи", "SertificateDateOfIssue"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("свидетельствоорождении", "BirthCertificate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("свидетельствосерияномер", "SeriesAndNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("свифтбик", "SWIFTBIC"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("сводныйкомиссионный", "ConsolidatedCommission"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("свойство", "Property"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("себестоимость", "Cost_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("серийныйномер", "SerialNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("серия", "Series"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("серияпродукции", "ProductionSeries_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("сертификат", "Certificate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("сертификатнспк", "NSPKCertificate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("сертификатышифрования", "EncryptionCertificates"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("силамиперевозчика", "ByCarrier"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("силамиперевозчикадонашегосклада", "ByCarrierToOurWarehouse"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("силамиперевозчикадопунктапередачи", "ByCarrierToTransferPoint"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("силамиперевозчикапоадресу", "ByCarrierToAddress"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("силамипоставщикадонашегосклада", "ByVendorToOurWarehouse"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("системабыстрыхплатежей", "InstantPayments"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("системаналогообложения", "TaxationSystem"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("скидкинаценки", "DiscountsMarkups"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("склад", "Warehouse"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("складгруппа", "WarehouseGroup_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("складотправитель", "SourceWarehouse"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("складполучатель", "DestinationWarehouse"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("скомиссионером", "WithConsignee"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("скомиссионеромназакупку", "WithCommissionAgentForPurchase"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("скомитентом", "WithConsignor"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("скомитентомназакупку", "CustomerInvoiceOutsourcedSale"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("собственныетовары", "OwnProducts"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("согласована", "AgreedUpon"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("согласованноеизменение", "AgreedChange"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("содержание", "Content"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("содержаниедоизменения", "ContentBeforeChange"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("составнойпредметрасчета", "CompoundSettlementSubject"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("состояниезаказа", "OrderState"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("состояниезаказастрокой", "OrderStateByLine"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("состояниеоплаты", "StateOfPayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("состояниеотгрузки", "ShipmentStatus"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("состояниеэлектронногодокумента", "StateOfElectronicDocument"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("сотрудник", "Employee"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("специальныйкоэффициентну", "SpecialFactorTaxAccounting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("спирт", "Alcohol"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("спиртосодержащаянепищеваяпродукция", "AlcoholContainingNonFoodProducts"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("спиртосодержащаяпищеваяпродукция", "AlcoholContainingFoodProducts"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("списание", "WriteOff"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("списаниезадолженности", "DebtCancellation"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("списаниеприпринятиикучету", "IncludingInExpensesOnRecognition"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("спокупателем", "WithCustomer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("способвыставления", "BillingMethod"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("способдоставки", "DeliveryMethod"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("способпогашениязадолженности", "MethodOfDebtRepayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("способпогашениястоимоститмц", "MethodOfRepaymentOfCostOfInventory"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("способпоступления", "ReceiptMethod"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("способрасчетакомиссионноговознаграждения", "MethodOfCalculationOfCommission"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("способрасчетов", "CalculationMethod"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("споставщиком", "WithVendor"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("среднийремонт", "AssetRepair"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("срокгодности", "ExpirationDate_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("срокдействия", "ValidityPeriod"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("срокиспользованиянудо2009", "UsefulLifeBefore2009"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("срокполезногоиспользованиябу", "UsefulLifeMonthsAC"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("срокполезногоиспользованияну", "UsefulLifeMonthsTA"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("срокэксплуатации", "ServiceLife"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("срочностькредитазайма", "UrgencyOfLoanLoan"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ссылка", "Ref"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ссылканаобъект", "ObjectReference"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ставкаазартнойигры", "GamblingStake"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ставкандс", "VATRate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ставкандсвознаграждения", "VATRateOfRemuneration"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ставкандсврознице", "RetailNDSRate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ставкандсдоизменения", "VATRateBeforeChange"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ставкапошлины", "DutyRate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("статус", "Status"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("статуссоставителя", "AuthorStatus"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("статусуказаниясерий", "BatchesIndicationStatus"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("статьяддс", "CFItem"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("статьядоходов", "IncomeItem"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("статьязатрат", "CostItem"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("статьярасходов", "ExpenseItem"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("стоимость", "Cost"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("стоимостьнепогашается", "CostIsNotRedeemable"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("стоимостьос", "FACost"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("стоимостьтоваров", "GoodsCost"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("страна", "Country"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("странаввозанерф", "ImportingCountryIsNotRF"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("странапроисхождения", "OriginCountry"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("странапроисхождениядоизменения", "CountryOfOriginBeforeChange"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("странарегистрации", "RegistrationCountry"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("страховойномерпфр", "InsuranceNumberOfTheFIU"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("страховыевзносы", "InsuranceContributions"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("сумма", "Sum"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммабезндс", "AmountExcludingVAT"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммабонусныхбаллов", "AmountOfBonusPoints"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммавал", "SumCurr"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммавзаиморасчетов", "AmountARAP"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммавключаетндс", "AmountIncludesVAT"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммавозврата", "ReturnAmount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммавознаграждения", "CommissionAmount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммаврознице", "RetailAmount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммавсехплатежей", "TotalOfAllPayments"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммадебиторскойзадолженности", "AmountOfAccountsReceivable"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммадоизменения", "AmountBeforeChange"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммадокорректировки", "AmountBeforeAdjustment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммадокумента", "DocumentAmount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммакомиссии", "FeeAmount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммакомиссиябанка", "AmountBankCommission"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммакредиторскойзадолженности", "AmountOfAccountsPayable"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммандс", "VATAmount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммандс10", "VATAmount10"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммандс20", "VATAmount20"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммандсвознаграждения", "AmountVATRemuneration"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммандсдоизменения", "VATAmountBeforeChange"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммандсдокорректировки", "AmountOfVATBeforeAdjustment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("сумманеоблагаемаяндс", "AmountNotSubjectToVAT"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммаоплаты", "PayAmount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммапередачи", "TransferAmount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммапереоценки", "AmountOfRevaluation_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммаплатежа", "PaymentAmount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммапоступления", "OrderReceiptAmount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммапошлины", "DutyAmount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммарегл", "SumCompl"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммарезерва", "ReserveAmount_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммаскидки", "DiscountAmount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммаучет", "AmountAccounting_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("суммафакт", "SumReal"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетафактурывыданныепокупателям", "InvoicesIssuedToCustomers"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетдоходов", "RevenueAccount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетдт", "AccountDr"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетзатрат", "ExpenseAccount_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счеткт", "AccountCr"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетпередачи", "TransferAccount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетрасходов", "ExpenseAccount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетрасчетов", "SettlementAccount_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучета", "GLAccount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетаавансоввыданных", "AccountForAdvancesIssued"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетаавансовполученных", "AccountForAdvancesReceived"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетавпути", "TrackingAccountInTransit"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетавыручкиотпродаж", "SalesRevenueAccount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетанаскладе", "WarehouseInvoice"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетандсвпути", "NdsvPathAccountingAccount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетандспризакупке", "VATInvoiceForPurchases"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетандсприпродаже", "VATInvoiceForSales"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетанеотфактурованныепоставки", "InvoiceForUnfacturedDeliveries"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетапередачинакомиссию", "AccountForTransferToCommission"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетов", "Account_Settlement"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетовповознаграждению", "RemunerationSettlementAccount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетовпопретензиям", "ClaimsSettlementAccount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетовсдебиторамикомиссия", "AccountForSettlementsWithDebtorsCommission"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетовсдебиторамиосновнойдолг", "AccountForSettlementsWithDebtorsPrincipalDebt"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетовсдебиторамипроценты", "AccountForSettlementsWithDebtorsInterest"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетовсклиентами", "AccountForSettlementsWithCustomers"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетовсклиентамитара", "AccountForSettlementsWithCustomersTare"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетовсконтрагентом", "AccountForSettlementsWithCounterparty"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетовскредиторамикомиссия", "AccountForSettlementsWithCreditorsCommission"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетовскредиторамиосновнойдолг", "AccountForSettlementsWithCreditorsPrincipalDebt"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетовскредиторамипроценты", "AccountForSettlementsWithCreditorsInterest"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетовслизингодателемарендныеобязательства", "AccountForSettlementsWithLessorLeaseObligations"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетовслизингодателемвыкуппредметализинга", "AccountForSettlementsWithLessorRepurchaseOfLeasedItem"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетовслизингодателемлизинговыеуслуги", "AccountForSettlementsWithLessorLeasingServices"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетовслизингодателемобеспечительныйплатеж", "AccountForSettlementsWithLessorSecurityPayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетовспоставщиками", "AccountForSettlementsWithSuppliers"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетарасчетовспоставщикамитара", "AccountForSettlementsWithSuppliersTare"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетучетасебестоимостипродаж", "CostOfSalesAccount"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетфактура", "TaxInvoice"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетфактуравыданный", "InvoiceIssued"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("счетфактуравыданныйпокупателю", "InvoiceIssuedToBuyer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("сырьевойтовар", "Commodity"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("табак", "Tobacco"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("таможеннаястоимость", "CustomsValue"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("таможенныйсбор", "CustomsFee"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("таможенныйштраф", "CustomsPenalty"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("тара", "Tara"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("тексткорреспондента", "CorrespondentText"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("текстназначения", "PurposeText"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("текстплательщика", "PayerSName"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("текстполучателя", "RecipientText"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("текущаяноменклатура", "CurrentProducts"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("текущаястоимостьбу", "CurrentcCostFinAcc"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("текущаястоимостьвр", "CurrentCostTD"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("текущаястоимостьну", "CurrentCostTaxAccounting"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("текущаястоимостьпр", "CurrentcCostPD"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("текущийремонт", "AssetMaintenance"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("телефон", "Phone"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("телефондомашний", "HomePhoneNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("телефонрабочий", "WorkingPhone"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("телефоны", "Phones"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("типакцизноймарки", "TypeOfExciseStamp"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("типзапасов", "InventoryType"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("типноменклатуры", "ItemsType"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("типоплаты", "TypeOfPayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("типпериодадействия", "TypeOfValidityPeriod"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("типплатежногодокумента", "PaymentDocumentType"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("типсклада", "WarehouseStore"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("типсуммыграфика", "ScheduleAmountType"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("типупаковки", "PackageType"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("типуслуги", "ServiceType"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("типцен", "PriceType_"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("типштрихкода", "BarcodeType"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("типыплатежнойсистемыккт", "TypesOfCashRegisterPaymentSystem"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("тмц", "Inventory"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("товар", "OwnGoods"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("товармаркируемыйсиимеющийкм", "GoodsMarkedByIdentificationToolWithMarkingCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("товармаркируемыйсинеимеющийкм", "GoodsMarkedByIdentificationToolWithoutMarkingCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("товары", "Goods"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("товарывозвратпродажи", "GoodsReturnSales"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("товарыпродажа", "GoodsSale"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("торг12", "Auction12"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("торговыйсбор", "SalesCharge"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("точностьединицыизмерения", "AccuracyOfUnitOfMeasure"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("точностьокругления", "RoundingPrecision"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("транспортныесредства", "Vehicles"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("требуютсядействия", "ActionsAreRequired"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("тфомс", "TCMIF"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("удержатькомиссионноевознаграждение", "WithholdCommission"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("удостоверениеофицера", "OfficerSLicense"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("уменьшаемогоостатка", "ReducedBalance"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("упакованнаявода", "PackagedWater"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("упаковканоменклатуры", "ProductPackaging"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("уполномоченноелицо", "AuthorizedPerson"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("уполномоченноелицоотбор", "AuthorizedPersonSelection"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("уполномоченныйпредставитель", "AuthorizedRepresentativeInTaxAuthority"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("упрощеннаядоход", "SimplifiedRevenue"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("упрощеннаядоходминусрасход", "SimplifiedRevenueMinusExpense"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("услуга", "OperationService"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("услугаповознаграждению", "RewardService"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("услуги", "Services"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("утвержденнаядатаплатежа", "ApprovedPaymentDate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("утвержденнаяформаоплаты", "ApprovedFormOfPayment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("уточнениенаименования", "NameClarification"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("учетагентскогондс", "CompanyActsAsAVATTaxAgent"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("учетвыручкивоперационнойкассе", "AccountingForRevenueInOperatingCashRegister"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("факс", "Fax"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("фактическийадрес", "ActualAddress"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("фамилия", "LastName"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("физическиелица", "Persons"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("физическоелицо", "Individual"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("физическоелицоотбор", "IndividualSelection"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("фио", "LASTFIRSTNAME"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("формаоплаты", "PaymentMethod"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("форматвыгрузки", "UploadFormat"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("форматсвойства", "FormatProperties"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("фотоаппараты", "CamerasAndFlashbulbs"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("фсс", "InsuranceContributionsToSSF"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ффомс", "InsuranceContributionsToFCMIF"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("характеристика", "Characteristic"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("характеристикапродукции", "ItemVariant"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("хранимыйфайл", "StoredFile"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("цена", "Price"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ценавключаетндс", "PriceIncludesVAT"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ценаврознице", "RetailPrice"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ценаврозницестарая", "RetailPriceIsOld"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ценадоизменения", "PriceBeforeChange"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ценадокорректировки", "PriceBeforeAdjustment"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ценазаупаковку", "PricePerPackaging"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ценапередачи", "TransferPrice"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ценапоступления", "ReceiptPrice"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ценоваягруппа", "PriceGroup"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ценовыегруппы", "PriceGroups"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("цифровойиндексобособленногоподразделения", "NumericCodeForTaxInvoices"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("частичнаяликвидация", "PartialDisposal"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("частичноевыбытиевариантучета", "PartialDisposalAccountingOption"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("частичноевыбытиеколичество", "PartialDisposalQuantity"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("шаблонмагнитнойкарты", "MagneticStripeCardTemplate"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("шаблоныкодов", "CodeTemplates"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("шины", "Tires"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ширина", "Width"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("шифрпоенаоф", "CodeByUFADR"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("штраф", "Penalty"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("штрихкод", "Barcode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("эквайринговыйтерминал", "POSTerminal"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("экспортнесырьевыхтоваров", "ExportOfNonResourceGoods"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("экспортсырьевыхтоваров", "CommodityExports"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("электронно", "Electronically"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("электронныеподписи", "DigitalSignatures"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("электронныеуслуги", "DigitalServices"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("этапыоплаты", "PaymentSteps"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("этодополнительноесведение", "IsAdditionalInfo"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("этодопрасходы", "ThisIsAdditionalExpense"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("этонабор", "IsRecordsSet"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("юкасса", "YooKassa"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("юридическийадрес", "LegalAddress"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("юридическоелицо", "BusinessEntity"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("юридическоефизическоелицо", "CompanyIndividual"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("являетсярнпт", "IsRNPT"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("являетсяудостоверяющимличность", "IsIdentityDocument"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("пользовательскаякидругое", "UserCIOther"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("синхронизацияданныхчерезуниверсальныйформат", "DataSynchronizationViaUniversalFormat"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видытранспортасообщенийобмена", "ExchangeMessagesTransportTypes"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("wsпассивныйрежим", "WSPassiveMode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("внешняясистема", "ExternalSystem"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("имяпланаобмена", "ExchangePlanName"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименованиевторойбазы", "SecondInfobaseDescription"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименованиеэтойбазы", "ThisInfobaseDescription"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодновогоузлавторойбазы", "SecondInfobaseNewNodeCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("префиксинформационнойбазыисточника", "SourceInfobasePrefix"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("видтранспортасообщенийобмена", "ExchangeMessagesTransportKind"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("парольархивасообщенияобмена", "ArchivePasswordExchangeMessages"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("fileкаталогобменаинформацией", "FILEDataExchangeDirectory"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("fileсжиматьфайлисходящегосообщения", "FILECompressOutgoingMessageFile"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("использоватьпараметрытранспортаemail", "UseTransportParametersEMAIL"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("использоватьпараметрытранспортаfile", "UseTransportParametersFILE"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("да", "Yes"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("нет", "None"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("использоватьпараметрытранспортаftp", "UseTransportParametersFTP"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("наименованиенастройкивыполненияобмена", "DataExchangeExecutionSettingsDescription"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодновогоузла", "NewNodeCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("кодпредопределенногоузла", "PredefinedNodeCode"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("версияформатафайланастроекобменаданными", "ExchangeDataSettingsFileFormatVersion"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("собственные", "Own"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("агентские", "Agency"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("штрихкодотбор", "BarcodeSelection"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("выдано", "Issued"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("выставлен", "Issued"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("огрн", "RegistrationNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("регистрационныйномер", "RegistrationNumber"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("оплачен", "Paid"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("оплачено", "Paid"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("приложение", "Package"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("упаковка", "Package"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("эквайер", "Acquirer"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("эквайрер", "Acquirer"); // @NON-NLS-1 @NON-NLS-2 + // АПК:1036-вкл не проверять текст на орфографию + + Возврат Словарь; + +КонецФункции + +// Возвращаемое значение: +// Соответствие +// +Функция Словарь_en_ru() Экспорт + + Словарь = Новый Соответствие; + + // АПК:1036-выкл не проверять текст на орфографию + Словарь.Вставить("skucounterparty_", "SKUКонтрагента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("prepayment_", "Аванс"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("prepayments", "Авансы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("automatically", "Автоматически"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("agent", "Агент"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("agencyfee", "АгентскоеВознаграждение"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("address", "Адрес"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("deliveryaddress", "АдресДоставки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("addressasstring", "АдресСтрокой"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("email", "АдресЭлектроннойПочты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("letterofcredit", "Аккредитив"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("deedoftransfer", "АктНаПередачуПрав"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("exciseduty", "Акциз"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("excisestamps", "АкцизныеМарки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("alcoholic", "Алкогольная"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("alcoholcontainingproducts", "АлкогольнаяПродукция"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("alternativetobaccoproducts", "АльтернативныйТабак"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("depreciationgroup", "АмортизационнаяГруппа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("depreciation", "Амортизация"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("depreciationbefore2009", "АмортизацияДо2009"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("fixedassetsdepreciationcharge", "АмортизацияОС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("canceled_", "Аннулирован"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("antiseptics", "Антисептики"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("lease", "Аренда"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sku", "Артикул"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("dietarysupplements", "БАДы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bank", "Банк"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("transferbank", "БанкДляРасчетов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bankpaymentorder", "БанковскийОрдер"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bankpayingagent", "БанковскийПлатежныйАгент"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bankpayingsubagent", "БанковскийПлатежныйСубагент"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bankaccount", "БанковскийСчет"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("counterpartybankaccount", "БанковскийСчетКонтрагента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("companybankaccount", "БанковскийСчетОрганизации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("senderbankaccount", "БанковскийСчетОтправитель"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("employeesbankaccount", "БанковскийСчетСотрудника"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bankaccountpayment", "Безналичная"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("excludingvat", "БезНДС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bic", "БИК"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountant", "Бухгалтер"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("currency", "Валюта"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("arapcurrency", "ВалютаВзаиморасчетов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cashcurrency", "ВалютаДенежныхСредств"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("currencyofconversion", "ВалютаКонвертации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bonusconversioncurrency", "ВалютаКонвертацииБонусов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("localaccountingcurrency", "ВалютаРегламентированногоУчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pricecurrency", "ВалютаЦены"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentoption", "ВариантОплаты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("postingoption", "ВариантОтражения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("commissioning", "ВводВЭксплуатацию"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("webpage", "ВебСтраница"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("statement", "Ведомость"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bicycles", "Велосипеды"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("weight", "Вес"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("soldbyweight", "Весовой"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cashcontribution", "ВзносНаличными"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("agencyagreementkind", "ВидАгентскогоДоговора"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("kindofalcoholcontainingproducts", "ВидАлкогольнойПродукции"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("typeofbankaccount", "ВидБанковскогоСчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("activitytypefortaxaccountingofcosts", "ВидДеятельностиДляНалоговогоУчетаЗатрат"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("typeofagreement", "ВидДоговора"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("documentkind", "ВидДокумента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("documentviewfromclassifier", "ВидДокументаИзКлассификатора"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("documenttypeselection", "ВидДокументаОтбор"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("typeofdocumentrighttosign", "ВидДокументаПравоПодписи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("inventoryownerattribute", "ВидЗапасов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cardkind", "ВидКарты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("contactinformationkind", "ВидКонтактнойИнформации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("productkind", "ВидНоменклатуры"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("kindofaccountingobject", "ВидОбъектаУчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("operationkind", "ВидОперации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentkind_", "ВидОплаты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("responsiblepersonkind", "ВидОтветственногоЛица"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("typeofresponsiblepersonselection", "ВидОтветственногоЛицаОтбор"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("typeofresponsiblepersonbyline", "ВидОтветственногоЛицаСтрокой"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("reportkind", "ВидОтчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentkind", "ВидПлатежа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("giftcertificatekind", "ВидПодарочногоСертификата"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("producttypeis", "ВидПродукцииИС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("workkind", "ВидРабот"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("typeofexpensesfornoncoreactivities", "ВидРасходовПоНеосновнойДеятельности"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("typeofexpensesforcoreactivities", "ВидРасходовПоОсновнойДеятельности"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("araptype", "ВидРасчетов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("typeofcalculationsadvanced", "ВидРасчетовРасширенный"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("typeofreserve", "ВидРезерва"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("eventkindwithfixedassets", "ВидСобытияОС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accounttype", "ВидСчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("invoicetype", "ВидСчетаФактуры"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("edview", "ВидЭД"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("owner", "Владелец"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("additionalvaluesowner", "ВладелецДополнительныхЗначений"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cardholder", "ВладелецКарты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("fileowner", "ВладелецФайла"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("technicalcharacteristics", "ВладелецХарактеристики"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("nonoperatingincome", "ВнереализационныйДоход"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("internalmovement", "ВнутреннееПеремещение"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("internaltransmission", "ВнутренняяПередача"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("driverlicense", "ВодительскоеУдостоверение"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("militaryidcard", "ВоенныйБилет"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("reserveofficersmilitaryidcard", "ВоенныйБилетОфицераЗапаса"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("return", "Возврат"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("refundtocommittee", "ВозвратКомитенту"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("returncontainers", "ВозвратнаяТара"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("recyclablewaste", "ВозвратныеОтходы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("refundtocustomerspaymentcard", "ВозвратОплатыКлиентуНаПлатежнуюКарту"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("returnfromcustomer", "ВозвратОтКлиента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("refundfromcustomerviapaymentsystem", "ВозвратОтКлиентаЧерезПлатежнуюСистему"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("returnfromcommissionagent", "ВозвратОтКомиссионера"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("returnfromretailcustomer", "ВозвратОтРозничногоПокупателя"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("returnunderoperation", "ВозвратПодДеятельность"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("returntovendor", "ВозвратПоставщику"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("returns", "Возвраты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("restorevat", "ВосстановитьНДС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("infavorofsupplier", "ВПользуПоставщика"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("allexecuted", "ВсеВыполнено"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("includingvat", "ВТомЧислеНДС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("selectedform", "ВыбраннаяФорма"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("displaymonthinwords", "ВыводитьМесяцПрописью"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("outputamountwithoutfractionalpart", "ВыводитьСуммуБезКопеек"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("prepaymentstovendor_", "ВыданныеАвансы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("issue", "Выдать"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("gamblingprize", "ВыигрышАзартнойИгры"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("lotteryprize", "ВыигрышЛотереи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("completed", "Выполнен"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("completedworks", "ВыполненныеРаботы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("productsreleasetobusinessunit", "ВыпускПродукцииВПодразделение"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("productsreleasetowarehouse", "ВыпускПродукцииНаСклад"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("height", "Высота"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("setsf", "ВыставленСФ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("superiordepartment", "ВышестоящееПодразделение"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("inoperation", "ВЭксплуатации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("inelectronicform", "ВЭлектронномВиде"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("chiefaccountant", "ГлавныйБухгалтер"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("depth", "Глубина"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("year", "Год"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("validuntil_", "ГоденДо"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("parentcompany", "ГоловнаяОрганизация"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("maincounterparty", "ГоловнойКонтрагент"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("city", "Город"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("finishedproducts", "ГотоваяПродукция"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("readyforissuance", "ГотовКВыдаче"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("citizenship", "Гражданство"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shipper", "Грузоотправитель"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("goodsrecipient", "Грузополучатель"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("group", "Группа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("analyticalgroup", "ГруппаАналитическогоУчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("analyticalproductgroup", "ГруппаАналитическогоУчетаНоменклатуры"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("groupoffinancialaccountingsettingsforsettlements", "ГруппаНастроекФинансовогоУчетаРасчетов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("osgroup", "ГруппаОС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("giverrawmaterialsandsupplies", "ДавальческиеСырьеИМатериалы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("classifierdata", "ДанныеКлассификатора"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("productdata_1", "ДанныеНоменклатуры"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("reportdata", "ДанныеОтчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sfdata", "ДанныеПоСФ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("certificatedata", "ДанныеСертификата"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("fullnamedata", "ДанныеФИО"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("date", "Дата"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("statementdate", "ДатаВедомости"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paysheetdate", "ДатаВедомостиНаВыплатуЗарплаты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("incomingdocumentdate", "ДатаВходящегоДокумента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("dateofissue1", "ДатаВыдачи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("dateofdischarge", "ДатаВыписки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("executiondate", "ДатаВыполнения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("dateofproduction", "ДатаВыпуска"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("issuedate", "ДатаВыставления"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("documentdate", "ДатаДокумента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("dateofdocumentsignatureright", "ДатаДокументаПраваПодписи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("closingdate", "ДатаЗакрытия"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("inventorydate", "ДатаИнвентаризации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("correctiondate", "ДатаИсправления"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("startdate", "ДатаНачала"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("startdateofinventory", "ДатаНачалаИнвентаризации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accrualdate", "ДатаНачисления"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("enddate", "ДатаОкончания"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("enddateofinventory", "ДатаОкончанияИнвентаризации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("openingdate", "ДатаОткрытия"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("datesent", "ДатаОтправки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("postingdate", "ДатаОтправления"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("dateoftransferoftitletogoods", "ДатаПереходаПраваСобственности"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentdate", "ДатаПлатежа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("dateofdocumentinarapaccounting", "ДатаПлатежноРасчетногоДокумента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("signaturedate", "ДатаПодписи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("datereceived", "ДатаПолучения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("dateofrecognition", "ДатаПринятияКУчету"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("purchasedate", "ДатаПриобретения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("dateofsale", "ДатаПродажи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("productiondate", "ДатаПроизводства"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("saledate", "ДатаРеализации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("registrationdate", "ДатаРегистрации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("birthdate", "ДатаРождения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("statedate", "ДатаСостояния"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("dateofdeduction", "ДатаСписания"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("invoicedate", "ДатаСФ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountsreceivable", "ДебиторскаяЗадолженность"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("noactionsneeded", "ДействийНеТребуется"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("validbefore", "ДействителенДо"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("tendays", "Декада"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cashequivalents", "ДенежныеДокументы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cash", "ДенежныеСредства"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("monetarydocument", "ДенежныйДокумент"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("day", "День"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("deposit_", "Депозитный"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("deposits", "Депозиты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("salarydepositing", "ДепонированиеЗарплаты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("tenth", "Десятая"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("diplomaticpassport", "ДипломатическийПаспорт"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("magneticcodelength", "ДлинаМагнитногоКода"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("barcodelength", "ДлинаШтрихкода"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("letterofauthority", "Доверенность"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("powerofattorneydate", "ДоверенностьДата"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("powerofattorneyissuedbywhom", "ДоверенностьКемВыдана"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("powerofattorneyissuedto", "ДоверенностьКомуВыдана"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("powerofattorneynumber", "ДоверенностьНомер"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("contract", "Договор"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("tocustomer", "ДоКлиента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("document", "Документ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("documentbasis", "ДокументОснование"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("documenttransfers_", "ДокументПередачи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("documentinflow", "ДокументПоступления"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("documentsales", "ДокументПродажи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("documentofarapaccounting", "ДокументРасчетов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("documentsalesofgoodsandservices", "ДокументРеализации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pricesettingdocument", "ДокументУстановкиЦен"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("basisdocuments", "ДокументыОснования"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("debt", "Долг"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("longtermloans", "ДолгосрочныеЗаймы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("longtermloans_", "ДолгосрочныеКредиты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("longterm", "Долгосрочный"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("jobtitle", "Должность"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("costshare", "ДоляСтоимости"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("furtherequipping", "Дооборудование"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("extrapay", "Доплата"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("additionalvaluesused", "ДополнительныеЗначенияИспользуются"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("additionalvalueswithweight", "ДополнительныеЗначенияСВесом"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("additionalattributes", "ДополнительныеРеквизиты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ssfadditionalcode", "ДополнительныйКодФСС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("completion", "Достройка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("perfumesandtoiletwaters", "Духи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("unitofmeasure", "ЕдиницаИзмерения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("unitoftraceability", "ЕдиницаИзмеренияПрослеживаемости"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shelflifeunitofmeasure", "ЕдиницаИзмеренияСрокаГодности"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("utii", "ЕНВД"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("thereisimplementationreceiptindocument", "ЕстьВДокументеПоступленияРеализации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("desirableformofpaymentnoncash", "ЖелательнаяФормаОплатыБезналичные"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("desirableformofpaymentcash", "ЖелательнаяФормаОплатыНаличные"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("desiredformofpaymentpaymentcard", "ЖелательнаяФормаОплатыПлатежнаяКарта"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("feminine", "Женский"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("manufaturernumber", "ЗаводскойНомер"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("title", "Заголовок"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("valuechoiceformtitle", "ЗаголовокФормыВыбораЗначения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("valueformtitle", "ЗаголовокФормыЗначения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("foreignpassportofrussianfederation", "ЗагранпаспортРФ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("foreignpassportofussr", "ЗагранпаспортСССР"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("importingfrominternet", "ЗагружаетсяИзИнтернета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("loans_", "Займы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("loansreceived", "ЗаймыПолученные"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("orderdocument", "Заказ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("salesorder", "ЗаказКлиента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("customer_", "Заказчик"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("closedforcefully", "ЗакрытПринудительно"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("purchaseforactivity", "ЗакупкаПодДеятельность"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("purchasebyimport", "ЗакупкаПоИмпорту"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("notes", "Заметки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("records", "Записи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("requiredtofill", "ЗаполнятьОбязательно"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("salary", "Зарплата"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("atexpenseofsupplier", "ЗаСчетПоставщика"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("atexpenseofthirdpartycompany", "ЗаСчетСтороннейКомпании"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("requestforspendingfunds", "ЗаявкаНаРасходДенежныхСредств"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("propertyvalue", "ЗначениеСвойства"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("fieldvalues", "ЗначенияПолей"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("id", "Идентификатор"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("statecontactid", "ИдентификаторГосконтракта"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("idof1cproductsproductcategory", "ИдентификаторНоменклатурыСервиса1СНоменклатура"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("reportid", "ИдентификаторОтчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentid", "ИдентификаторПлатежа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("idof1cproductsservice", "ИдентификаторСервиса1СНоменклатура"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("rowid", "ИдентификаторСтроки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("packageid", "ИдентификаторУпаковки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("idof1cproductsservicecharacteristic", "ИдентификаторХарактеристикиСервиса1СНоменклатура"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("manufacturer_", "Изготовитель"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("surpluses", "Излишки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("importedalcoholcontainingproducts", "ИмпортнаяАлкогольнаяПродукция"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("propertyright", "ИмущественноеПраво"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("name", "Имя"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("inventory_", "Инвентаризация"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("assetid", "ИнвентарныйНомер"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("collection_", "Инкассация"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("collectionorder_2", "ИнкассовоеПоручение"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("tin", "ИНН"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("tinofcounterparty", "ИННКонтрагента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("tinofpayer", "ИННПлательщика"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("recipienttin", "ИННПолучателя"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sellertin", "ИННПродавца"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("otherreasons", "Иное"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("othersettlementsubject", "ИнойПредметРасчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("foreignbank", "ИностранныйБанк"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("performer", "Исполнитель"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("usepaymentbycards", "ИспользоватьОплатуПлатежнымиКартами"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("keepaccountingbybatch", "ИспользоватьСерии"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("usediscountsmarkups", "ИспользоватьСкидкиНаценки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("useshelflifeonbatchregistration", "ИспользоватьСрокГодностиСерии"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("usecharacteristics", "ИспользоватьХарактеристики"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("correctionoferrors", "ИсправлениеОшибки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("correctedreceiptdocument", "ИсправляемыйДокументПоступления"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("correctedimplementationdocument", "ИсправляемыйДокументРеализации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sourcedocument_", "ИсходныйДокумент"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("overhaul", "КапитальныйРемонт"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("loyaltycard", "КартаЛояльности"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cashregister", "КассаККМ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cashaccountissuer", "КассаОтправитель"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cashaccountrecipient", "КассаПолучатель"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cashier", "Кассир"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cashregistershift", "КассоваяСмена"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("quarter", "Квартал"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("issuedby", "КемВыдан"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("keyproperties", "КлючевыеСвойства"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("composite", "КлючСтроки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("code", "Код"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("authorizationcode", "КодАвторизации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("fiasaddresscode", "КодАдресаФИАС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("codeofalcoholicproducts", "КодАлкогольнойПродукции"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("codealpha2", "КодАльфа2"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("codealpha3", "КодАльфа3"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("incomekindcode", "КодВидаДохода"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("productclassificationtypecode", "КодВидаНоменклатурнойКлассификации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("transactionkindcode", "КодВидаОперации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("codeinapp", "КодВПрограмме"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ftscode", "КодМВД"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("taxauthoritycode", "КодНалоговогоОргана"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("businessactivityclassifiercode", "КодОКВЭД"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("rncpcode", "КодОКП"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("rncteaps2code", "КодОКПД2"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("businessunitcode", "КодПодразделения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ftssubordinationcode", "КодПодчиненностиФСС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("codebyrncfa", "КодПоОКОФ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pensionfundcode", "КодПФР"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("feacncode", "КодТНВЭД"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("trucode", "КодТРУ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("count", "Количество"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("numberofdaysofdeferral", "КоличествоДнейОтсрочки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("quantitybeforechange_", "КоличествоДоИзменения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("quantitybeforeadjustment", "КоличествоДоКорректировки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("documentscount", "КоличествоДокументов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sheetquantity", "КоличествоЛистов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("quantityinstock_", "КоличествоНаСкладе"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("numberofvalidityperiods", "КоличествоПериодовДействия"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("quantityafterchange", "КоличествоПослеИзменения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("numberofrnpt", "КоличествоРНПТ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("numberofrnptbeforechange", "КоличествоРНПТДоИзменения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("numberofrnptbeforeadjustment", "КоличествоРНПТДоКорректировки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("numberofpackages", "КоличествоУпаковок"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("numberofpackagesbeforechange_", "КоличествоУпаковокДоИзменения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("numberofpackagesbeforeadjustment", "КоличествоУпаковокДоКорректировки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("numberofpackagesaccounting", "КоличествоУпаковокУчет"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("numberofpackagesreal", "КоличествоУпаковокФакт"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("numberofdays_1", "КоличествоУчет"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("countreal", "КоличествоФакт"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("consignee", "Комиссионер"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("commissiongoods", "КомиссионныеТовары"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("fee", "Комиссия"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("comment", "Комментарий"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("replenished", "Комплектуется"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("endofmagneticcoderange", "КонецДиапазонаМагнитногоКода"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("endofbarcoderange", "КонецДиапазонаШтрихкода"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("endofperiod", "КонецПериода"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("contactinformation", "КонтактнаяИнформация"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("contactperson", "КонтактноеЛицо"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("counterpartyscontactperson", "КонтактноеЛицоКонтрагента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("counterparty", "Контрагент"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("counterpartydebtor", "КонтрагентДебитор"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("creditor", "КонтрагентКредитор"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("counterparties", "Контрагенты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("amountdue", "КОплате"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("corrective", "Корректировочный"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("corraccount", "КоррСчет"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("zoomratio", "Коэффициент"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("zoomratio1", "Коэффициент1"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("zoomratio10", "Коэффициент10"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("zoomratio11", "Коэффициент11"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("zoomratio12", "Коэффициент12"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("zoomratio2", "Коэффициент2"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("zoomratio3", "Коэффициент3"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("zoomratio4", "Коэффициент4"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("zoomratio5", "Коэффициент5"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("zoomratio6", "Коэффициент6"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("zoomratio7", "Коэффициент7"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("zoomratio8", "Коэффициент8"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("zoomratio9", "Коэффициент9"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("annualdepreciationrate", "КоэффициентАмортизацииБУ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("depreciationaccrualfactor", "КоэффициентБУ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accelerationfactoraccounting", "КоэффициентУскоренияБУ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("tocustomerisdefinedbytransportationcompany", "КПолучателюОпределяетСлужбаДоставки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("crtr", "КПП"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("counterpartycrtr", "КППКонтрагента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("payercrtr", "КПППлательщика"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("recipientcrtr", "КПППолучателя"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sellercrtr", "КПППродавца"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentdeadline", "КрайнийСрокПлатежа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shorttermloans", "КраткосрочныеЗаймы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shorttermloans_", "КраткосрочныеКредиты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shortterm", "Краткосрочный"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("multiplier_", "КратностьВзаиморасчетов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("documentmultiplicity", "КратностьДокумента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("conversionmultiplicity", "КратностьКонвертации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("credit", "Кредит"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountspayable", "КредиторскаяЗадолженность"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("loansandborrowings", "КредитыИЗаймы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("loansreceived_", "КредитыПолученные"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("strength", "Крепость"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("wheelchairs", "КреслаКоляски"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("whostated", "КтоЗаявил"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("whodecided", "КтоРешил"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("resortfee", "КурортныйСбор"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("transactionrate", "КурсВзаиморасчетов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("documentcourse", "КурсДокумента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("conversionrate", "КурсКонвертации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("conversionrateofbonusesintocurrency", "КурсКонвертацииБонусовВВалюту"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("exchangerateofcentralbankondateofconversion", "КурсЦБНаДатуКонвертации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("courier", "Курьер"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bycourier", "Курьером"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("lightindustrygoodsandclothes", "ЛегкаяПромышленность"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("linear", "Линейный"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("lotteryticket", "ЛотерейныйБилет"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("magneticcode", "МагнитныйКод"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("maximumsharepayablebypoints", "МаксимальныйПроцентОплатыБонусами"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("brand", "Марка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("markedgoods", "МаркированныйТовар"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("packagemarking", "МаркировкаУпаковки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("packagemarkings", "МаркировкиУпаковок"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("labelled", "Маркируемый"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("route", "Маршрут"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("usedmaterials", "Материалы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("customermaterials", "МатериалыЗаказчика"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("manager", "Менеджер"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("birthplace", "МестоРождения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("month", "Месяц"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("monthoftaxperiod", "МесяцНалоговогоПериода"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("reusablepackage", "МногооборотнаяТара"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("multilineinputfield", "МногострочноеПолеВвода"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("modernization", "Модернизация"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("fixedassetscostadditions", "МодернизацияОС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("financiallyliableperson", "МОЛ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("milkandmilkproducts", "МолочнаяПродукция"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("singleproductpackage", "МонотоварнаяУпаковка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("masculine", "Мужской"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("multiproductpackaging", "МультитоварнаяУпаковка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("advancepayment", "НаАванс"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("set", "Набор"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("onpaper", "НаБумажномНосителе"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("modernizationdocumentname", "НазваниеДокументаМодернизации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("nameofrecognitiondocument", "НазваниеДокументаПринятияКУчету"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("advancepurpose", "НазначениеАванса"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentpurposes", "НазначениеПлатежа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("description", "Наименование"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("externaldocumentname", "НаименованиеВходящегоДокумента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("nameofcontactinformation", "НаименованиеКонтактнойИнформации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shortdescription1", "НаименованиеКраткое"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("nameofpurposeofuse", "НаименованиеНазначенияИспользования"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("activitytype", "НаименованиеОКВЭД"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("activitytype2", "НаименованиеОКВЭД2"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("legalform", "НаименованиеОКОПФ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ownershipform", "НаименованиеОКФС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("reportdescription1", "НаименованиеОтчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("descriptionfull", "НаименованиеПолное"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("abbreviateddescription", "НаименованиеСокращенное"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("nameofmethodforreflectingexpenses", "НаименованиеСпособаОтраженияРасходов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pensionfundlocalauthorityname", "НаименованиеТерриториальногоОрганаПФР"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ssflocalauthorityname", "НаименованиеТерриториальногоОрганаФСС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accumulateddepreciationaccounting", "НакопленнаяАмортизацияБУ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accumulateddepreciationtd", "НакопленнаяАмортизацияВР"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accumulateddepreciationtaxaccounting", "НакопленнаяАмортизацияНУ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("permanentdifferenceinevaluationofaccumulateddepreciation", "НакопленнаяАмортизацияПР"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cashaccountpayment_", "Наличная"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cashpayment", "Наличные"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vattaxagent", "НалоговыйАгентПоНДС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("nonresidenttaxnumber", "НалоговыйНомерНерезидента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("taxation", "Налогообложение"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vattaxationofseller", "НалогообложениеНДСПродавца"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("onotherincome", "НаПрочиеДоходы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("forotherexpenses", "НаПрочиеРасходы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("calculationsettings", "НастройкиРасчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("awaitingconfirmation", "НаУтверждении"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("markup", "Наценка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("startofmagneticcoderange", "НачалоДиапазонаМагнитногоКода"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("startofbarcoderange", "НачалоДиапазонаШтрихкода"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("beginofperiod", "НачалоПериода"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("beginningofreportperiod", "НачалоПериодаОтчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("depreciationaccrual", "НачислениеАмортизации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bonuspointaccrual", "НачислениеБонусныхБаллов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("wearaccrual", "НачислениеИзноса"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accruewearasperufadr", "НачислениеИзносаПоЕНАОФ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accruals", "Начисления"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("depreciationaccrualaccounting", "НачислятьАмортизациюБУ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("depreciationaccrualtaxaccounting", "НачислятьАмортизациюНУ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ourowndeliveryfromsenderaddress", "НашимиСиламиСАдресаОтправителя"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vat", "НДС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vat0", "НДС0"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vat10", "НДС10"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vat10_110", "НДС10_110"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vat18", "НДС18"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vat18_118", "НДС18_118"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vat20", "НДС20"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vat20_120", "НДС20_120"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("personalincometaxiscalculatedbythetaxagent", "НДСИсчисляетсяНалоговымАгентом"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vatiscalculatedbybuyer", "НДСИсчисляетсяПокупателем"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("personalincometax", "НДФЛ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("nonautomatedpointofsale", "НеавтоматизированнаяТорговаяТочка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("week", "Неделя"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shortages", "Недостачи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("intangibleassets", "НематериальныеАктивы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("intangibleasset", "НематериальныйАктив"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("donotaccruepointswhenpayingwithbonuses", "НеНачислятьБаллыПриОплатеБонусами"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("notsubjecttovat", "НеОблагаетсяНДС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("notpaid", "НеОплачен"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("notshipped_", "НеОтгружен"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("notreceived", "НеПолучен"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("notcalculating", "НеРассчитывается"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("notagreedupon", "НеСогласована"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("notgenerated1", "НеСформирован"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("nicotinecontainingproducts", "НикотиносодержащаяПродукция"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("products", "Номенклатура"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("number", "Номер"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("excisestampnumber", "НомерАкцизнойМарки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ticketnumber", "НомерБилета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("statementnumber", "НомерВедомости"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paysheetnumber", "НомерВедомостиНаВыплатуЗарплаты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("numberinprogram", "НомерВПрограмме"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("incomingdocumentnumber", "НомерВходящегоДокумента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ccdnumber", "НомерГТД"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ccdnumberbeforechange", "НомерГТДДоИзменения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("declarationno", "НомерДекларации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("documentnumber", "НомерДокумента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("modernizationdocumentnumber", "НомерДокументаМодернизации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("numberofsignaturerightdocument", "НомерДокументаПраваПодписи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("documentofrecognitionnumber", "НомерДокументаПринятияКУчету"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("correctionnumber", "НомерИсправления"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cardnumber", "НомерКарты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cashshiftnumber", "НомерКассовойСмены"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("personalaccountnumber", "НомерЛицевогоСчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("passportnumber", "НомерПаспорта"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("settlementdocumentnumber", "НомерПлатежноРасчетногоДокумента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sectionnumber", "НомерРаздела"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("linenumber", "НомерСтроки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("documentrownumber", "НомерСтрокиДокумента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("invoicenumber", "НомерСФ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountnumber", "НомерСчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("commissionagentstaxinvoicenumber", "НомерСчетаФактурыКомиссионера"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cashregisterreceiptnumber", "НомерЧекаККМ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cashregistersalesreceiptnumber", "НомерЧекаККМПродажи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("nominal", "Номинал"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("subjecttoenvd", "ОблагаетсяЕНВД"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("subjecttovat", "ОблагаетсяНДС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("subjecttovatatcustomer", "ОблагаетсяНДСУПокупателя"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("exchangecompleted", "ОбменЗавершен"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("branchoffice", "ОбособленноеПодразделение"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shoesproducts", "Обувь"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shared3", "Общая"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shareddata", "ОбщиеДанные"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("object", "Объект"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("volumem3", "Объем"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("volumeindecaliters", "ОбъемДАЛ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("volumeofproductsworksforcalculatingdepreciationinphysicalunits", "ОбъемПродукцииРаботДляВычисленияАмортизации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("expecteddeliverydate", "ОжидаемаяДатаПоставки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("expecteddateofreceipt", "ОжидаемаяДатаПоступления"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pendingreceiptnotification", "ОжидаетсяИзвещениеОПолучении"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pendingcorrection", "ОжидаетсяИсправление"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pendingtransfertoprovider", "ОжидаетсяПередачаОператору"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pendingconfirmation", "ОжидаетсяПодтверждение"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pendingconfirmationofprovider", "ОжидаетсяПодтверждениеОператора"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("rncps", "ОКАТО"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("rncea", "ОКВЭД"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("rncea2", "ОКВЭД2"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("endofreportperiod_", "ОкончаниеПериодаОтчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("rncfi", "ОКОПФ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("okpo", "ОКПО"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("roundup", "ОкруглятьВБольшуюСторону"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("municipalterritoriesclassifier", "ОКТМО"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("okfs", "ОКФС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("longdesc", "Описание"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentwithbonuspoints", "ОплатаБонуснымиБаллами"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymenttocounterparties", "ОплатаКонтрагентам"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentforloan", "ОплатаКредита"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentfromclientbypaymentcard", "ОплатаОтКлиентаПлатежнойКартой"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentfromclientthroughpaymentsystem", "ОплатаОтКлиентаЧерезПлатежнуюСистему"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentwithpaymentcards", "ОплатаПлатежнымиКартами"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentbycreditcardsforgiftcertificates", "ОплатаПлатежнымиКартамиПодарочныхСертификатов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentbycertificates", "ОплатаСертификатами"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("payments", "Оплаты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("partiallypaid", "ОплаченЧастично"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("determinedbyallocation", "ОпределяетсяРаспределением"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("activityregistration", "ОприходованиеПодДеятельность"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("wholesale_1", "Оптовый"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("organization", "Организация"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("companyfilter", "ОрганизацияОтбор"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("senderorganization", "ОрганизацияОтправитель"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("companyrecipient", "ОрганизацияПолучатель"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("fiuauthority", "ОрганПФР"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("basis", "Основание"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("maincurrency", "ОсновнаяВалюта"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("mainpicture", "ОсновнаяКартинка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("mainsystem", "ОсновнаяСистемаНалогообложения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("fixedasset", "ОсновноеСредство"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("mainbankaccount", "ОсновнойБанковскийСчет"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("fixedassets", "ОсновныеСредства"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("specialtaxationprocedure", "ОсобыйПорядокНалогообложения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("employeeincharge_", "ОтветственноеЛицо"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("employeeresponsible", "Ответственный"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("assigneeformaintainingofaccountingregisters", "ОтветственныйЗаБухгалтерскиеРегистры"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("assigneeformaintainingoftaxregisters", "ОтветственныйЗаНалоговыеРегистры"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shipentireorder", "ОтгружатьЗаказЦеликом"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shipped_", "Отгружен"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("partiallyshipped", "ОтгруженЧастично"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shipmentwithouttransferofownership_inpath", "ОтгрузкаБезПереходаПравСобственности_ВПути"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shipmentwithouttransferofownership_implemented", "ОтгрузкаБезПереходаПравСобственности_Реализовано"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shipmenttocustomer", "ОтгрузкаКлиенту"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shipmentunderreturntovendor", "ОтгрузкаПоВозвратуПоставщику"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shipmentbytransfer", "ОтгрузкаПоПеремещению"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("rejected", "Отклонен"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("isrejected", "Отклонена"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("rolledback_", "Отменен"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("canceled", "Отменено"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("fromsenderdeterminedbydeliveryservice", "ОтОтправителяОпределяетСлужбаДоставки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vacationproduced", "ОтпускПроизвел"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("deferredpayment", "ОтсрочкаПлатежа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("middlename", "Отчество"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("retailsalesreport", "ОтчетОРозничныхПродажах"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("provisions", "ОценочныеОбязательства"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("rankinginpriority", "Очередность"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("amountinwordsparameters", "ПараметрыПрописи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("minmorflotpassport", "ПаспортМинморфлота"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("seafarerspassport", "ПаспортМоряка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("passportofrussianfederation", "ПаспортРФ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("passportofussr", "ПаспортСССР"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("patent", "Патент"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("first", "Первая"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("initialcostlocalaccounting", "ПервоначальнаяСтоимостьБУ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("initialcostta", "ПервоначальнаяСтоимостьНУ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("carrier", "Перевозчик"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("transfer_", "Передача"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("transferwithoutpayment", "ПередачаБезОплаты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("transfertocommissionagent", "ПередачаНаКомиссию"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("transferwithfullpayment", "ПередачаСПолнойОплатой"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("transferwithpartialpayment", "ПередачаСЧастичнойОплатой"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("transferforactivity", "ПеремещениеПодДеятельность"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("debttransfer_", "ПереносЗадолженности"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("revaluation", "Переоценка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("transferoftaxesandcontributions", "ПеречислениеВБюджет"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("period", "Период"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("periodfilter", "ПериодОтбор"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("registrationperiod", "ПериодРегистрации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("periodasstring", "ПериодСтрокой"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("beerorbeerdrink", "Пиво"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentdisbursement", "ПлатежВыплата"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentcard", "ПлатежнаяКарта"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentlink_", "ПлатежнаяСсылка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentorder", "ПлатежноеПоручение"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentdemand", "ПлатежноеТребование"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentandsettlementdocuments", "ПлатежноРасчетныеДокументы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("payingagent", "ПлатежныйАгент"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentwarrant", "ПлатежныйОрдер"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("payingsubagent", "ПлатежныйСубагент"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("attorney", "Поверенный"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("repaymentofdebt", "ПогашениеЗадолженности"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("excisablegoods", "ПодакцизныйТовар"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("excisablegoodsmarkedbyidentificationtoolwithmarkingcode", "ПодакцизныйТоварМаркируемыйСИИмеющийКМ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("excisablegoodsmarkedbyidentificationtoolwithoutmarkingcode", "ПодакцизныйТоварМаркируемыйСИНеИмеющийКМ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("gift", "Подарок"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("giftcertificates", "ПодарочныеСертификаты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("preparingforsale", "ПодготовкаКПередаче"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("supportsesfsspayment", "ПоддерживаетОплатуЭСФСС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("underleaseagreement", "ПоДоговоруЛизинга"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bydocument", "ПоДокументу"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("subreport", "Подотчет"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("advanceholder", "ПодотчетноеЛицо"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("signature", "Подпись"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("department", "Подразделение"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("costdivision", "ПодразделениеЗатрат"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sendingdepartment", "ПодразделениеОтправитель"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("receivingbusinessunit", "ПодразделениеПолучатель"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("tooltip", "Подсказка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("confirmed_", "Подтвержден"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("byuniformdepreciationrates", "ПоЕНАОФ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("byuniformdepreciationratesper1000kmofmileage", "ПоЕНАОФНа1000кмПробега"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("indicators", "Показатели"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("dateindicator", "ПоказательДаты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("indicatorbcc", "ПоказательКБК"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("runningtimevalue", "ПоказательНаработки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("numberindicator", "ПоказательНомера"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("basisindicator", "ПоказательОснования"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("periodindicator", "ПоказательПериода"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("typeindicator", "ПоказательТипа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("buyerissuesinvoiceforreturn", "ПокупателемВыставляетсяСчетФактураНаВозврат"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("buyers", "Покупатели"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("customer", "Покупатель"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("purchase", "Покупка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("purchasefromsupplier_", "ПокупкаУПоставщика"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("purchases", "Покупки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("gender", "Пол"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("halfyear_", "Полугодье"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("receivingcash", "ПолучениеНаличных"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("premise", "Помещение"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("byassetactivity", "ПоНаработке"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("instructionforshippingagentatpoint", "ПоручениеЭкспедиторуВПункте"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("instructionforshippingagenttowarehouse", "ПоручениеЭкспедиторуНаСклад"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("instructionforshippingagentfromwarehouse", "ПоручениеЭкспедиторуСоСклада"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sequencenumber", "ПорядковыйНомер"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("order", "Порядок"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bydate", "ПоСроку"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vendor", "Поставщик"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("postpayment", "Постоплата"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("incomeforactivities", "ПоступлениеПодДеятельность"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bysumofusefullifeyearnumbers", "ПоСуммеЧиселЛетИспользования"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("consumerpackaging", "ПотребительскаяУпаковка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("byactualusage", "ПоФактическомуИспользованию"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("mailaddress", "ПочтовыйАдрес"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pricelist", "ПрайсЛист"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("prepayment", "Предоплата"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("fullprepayment", "ПредоплатаПолная"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("partialprepayment", "ПредоплатаЧастичная"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("presentation", "Представление"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("kindpresentaion", "ПредставлениеВида"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("presentationofsignaturerightsdocument", "ПредставлениеДокументаПраваПодписи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("periodpresentation", "ПредставлениеПериода"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("invissubmitted", "ПредъявленСФ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("prefix", "Префикс"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("receiptfromvendor", "ПриемкаОтПоставщика"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("receivingbyreturnfromacustomer", "ПриемкаПоВозвратуОтКлиента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("receivingbytransfer", "ПриемкаПоПеремещению"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("consignmentprocurement", "ПриемНаКомиссию"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("agentattribute", "ПризнакАгента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("settlementsubjectflag", "ПризнакПредметаРасчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("showscalculationmethod", "ПризнакСпособаРасчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("principal", "Принципал"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accepted", "Принят"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("recognition", "ПринятиеКУчету"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("recognitionwithcommissioning", "ПринятиеКУчетуСВводомВЭксплуатацию"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("receivedfrom", "ПринятоОт"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("oncommissioning", "ПриПередаче"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("carryingoutnetting", "ПроведениеВзаимозачета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("loyaltyprogram_", "ПрограммаЛояльности"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("seller", "Продавец"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sellers", "Продавцы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("exportsale", "ПродажаНаЭкспорт"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("saleisnotsubjecttovat", "ПродажаНеОблагаетсяНДС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("saleissubjecttoutii", "ПродажаОблагаетсяЕНВД"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("saleissubjecttovat", "ПродажаОблагаетсяНДС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("salesbypatent", "ПродажаПоПатенту"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("manufacturedproduct", "Продукция"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("manufacturer", "Производитель"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("manufacturerimporter", "ПроизводительИмпортер"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("byunitsofproduction", "ПропорциональноОбъемуПродукции"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("tracedgoods", "ПрослеживаемыйТовар"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("percentageofcommission", "ПроцентКомиссионногоВознаграждения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("percentageofdifferencebetweensalesandreceipts", "ПроцентОтРазницыСуммПродажиИПоступления"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("saleshare", "ПроцентОтСуммыПродажи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentpercentage", "ПроцентПлатежа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("discountpercentage", "ПроцентСкидки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("interests", "Проценты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("interestonlongtermloans_", "ПроцентыПоДолгосрочнымЗаймам"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("interestonlongtermloans", "ПроцентыПоДолгосрочнымКредитам"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("interestonshorttermloans_", "ПроцентыПоКраткосрочнымЗаймам"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("interestonshorttermloans", "ПроцентыПоКраткосрочнымКредитам"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("other", "Прочее"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("otherwriteoffs", "ПрочееСписание"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("otherexpenses", "ПрочиеРасходы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("otherinformation", "ПрочиеСведения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pensionfundfrombasetolimitvalue", "ПФРДоПредельнойВеличины"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pfemployedonundergroundandharmfuljobs", "ПФРЗаЗанятыхНаПодземныхИВредныхРаботах"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pfforemployedonheavyandotherjobs", "ПФРЗаЗанятыхНаТяжелыхИПрочихРаботах"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pensionfundbyoveralltariff", "ПФРПоСуммарномуТарифу"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pensionfundfrombaseinexcessoflimitvalue", "ПФРСПревышения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("work_5", "Работа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("works", "Работы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("disassembly", "Разборка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sections", "Разделы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("allowpartialpayment", "РазрешитьЧастичнуюОплату"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("expensesforallocation", "РаспределяемыеЗатраты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("rdexpenses", "РасходыНаНИОКР"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("rate_", "Расценка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("estimated_", "Расчетный"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("calculations", "Расчеты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("arapincurrency", "РасчетыВВалюте"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("calculationsinconventionalunits", "РасчетыВУсловныхЕдиницах"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("debtorsarapaccounting", "РасчетыСДебиторами"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("customersarapaccounting", "РасчетыСКлиентами"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("commissionagentsarapaccounting", "РасчетыСКомиссионерами"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("consignorsarapaccounting", "РасчетыСКомитентами"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("purchasesettlementswithconsignors", "РасчетыСКомитентамиПоЗакупке"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("creditorsarapaccounting", "РасчетыСКредиторами"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("settlementswithlessors", "РасчетыСЛизингодателями"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vendorsarapaccounting", "РасчетыСПоставщиками"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("extension", "Расширение"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("transcriptofadditionalexpenses", "РасшифровкаДопРасходов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("arapdetails", "РасшифровкаПлатежа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("saletocustomer", "РеализацияКлиенту"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("goodssales", "РеализацияТоваров"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("nonresidentregistrationnumber", "РегистрационныйНомерНерезидента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pensionfundregistrationnumber", "РегистрационныйНомерПФР"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ssfregistrationnumber", "РегистрационныйНомерФСС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("registrationwithtaxauthority", "РегистрацияВНалоговомОргане"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("regulatedreporting", "РегламентированнаяОтчетность"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("reserve", "Резерв"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("acreserve", "РезервБУ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("tareserve", "РезервНУ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentdetails", "РеквизитыПлатежа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("reconstruction", "Реконструкция"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("productbatchid", "РНПТ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("retail_2", "Розничный"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("director", "Руководитель"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("hrdirector", "РуководительКадровойСлужбы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("selfpickup", "Самовывоз"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("assembly", "Сборка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sertificatedateofissue", "СвидетельствоДатаВыдачи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("birthcertificate", "СвидетельствоОРождении"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("seriesandnumber", "СвидетельствоСерияНомер"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("swiftbic", "СВИФТБИК"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("consolidatedcommission", "СводныйКомиссионный"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("property", "Свойство"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cost_", "Себестоимость"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("serialnumber", "СерийныйНомер"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("series", "Серия"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("productionseries_", "СерияПродукции"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("certificate", "Сертификат"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("nspkcertificate", "СертификатНСПК"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("encryptioncertificates", "СертификатыШифрования"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bycarrier", "СиламиПеревозчика"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bycarriertoourwarehouse", "СиламиПеревозчикаДоНашегоСклада"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bycarriertotransferpoint", "СиламиПеревозчикаДоПунктаПередачи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("bycarriertoaddress", "СиламиПеревозчикаПоАдресу"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("byvendortoourwarehouse", "СиламиПоставщикаДоНашегоСклада"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("instantpayments", "СистемаБыстрыхПлатежей"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("taxationsystem", "СистемаНалогообложения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("discountsmarkups", "СкидкиНаценки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("warehouse", "Склад"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("warehousegroup_", "СкладГруппа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sourcewarehouse", "СкладОтправитель"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("destinationwarehouse", "СкладПолучатель"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("withconsignee", "СКомиссионером"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("withcommissionagentforpurchase", "СКомиссионеромНаЗакупку"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("withconsignor", "СКомитентом"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("customerinvoiceoutsourcedsale", "СКомитентомНаЗакупку"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ownproducts", "СобственныеТовары"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("agreedupon", "Согласована"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("agreedchange", "СогласованноеИзменение"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("content", "Содержание"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("contentbeforechange", "СодержаниеДоИзменения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("compoundsettlementsubject", "СоставнойПредметРасчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("orderstate", "СостояниеЗаказа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("orderstatebyline", "СостояниеЗаказаСтрокой"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("stateofpayment", "СостояниеОплаты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("shipmentstatus", "СостояниеОтгрузки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("stateofelectronicdocument", "СостояниеЭлектронногоДокумента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("employee", "Сотрудник"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("specialfactortaxaccounting", "СпециальныйКоэффициентНУ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("alcohol", "Спирт"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("alcoholcontainingnonfoodproducts", "СпиртосодержащаяНеПищеваяПродукция"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("alcoholcontainingfoodproducts", "СпиртосодержащаяПищеваяПродукция"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("writeoff", "Списание"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("debtcancellation", "СписаниеЗадолженности"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("includinginexpensesonrecognition", "СписаниеПриПринятииКУчету"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("withcustomer", "СПокупателем"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("billingmethod", "СпособВыставления"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("deliverymethod", "СпособДоставки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("methodofdebtrepayment", "СпособПогашенияЗадолженности"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("methodofrepaymentofcostofinventory", "СпособПогашенияСтоимостиТМЦ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("receiptmethod", "СпособПоступления"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("methodofcalculationofcommission", "СпособРасчетаКомиссионногоВознаграждения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("calculationmethod", "СпособРасчетов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("withvendor", "СПоставщиком"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("assetrepair", "СреднийРемонт"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("expirationdate_", "СрокГодности"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("validityperiod", "СрокДействия"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("usefullifebefore2009", "СрокИспользованияНУДо2009"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("usefullifemonthsac", "СрокПолезногоИспользованияБУ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("usefullifemonthsta", "СрокПолезногоИспользованияНУ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("servicelife", "СрокЭксплуатации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("urgencyofloanloan", "СрочностьКредитаЗайма"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ref", "Ссылка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("objectreference", "СсылкаНаОбъект"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("gamblingstake", "СтавкаАзартнойИгры"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vatrate", "СтавкаНДС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vatrateofremuneration", "СтавкаНДСВознаграждения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("retailndsrate", "СтавкаНДСВРознице"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vatratebeforechange", "СтавкаНДСДоИзменения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("dutyrate", "СтавкаПошлины"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("status", "Статус"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("authorstatus", "СтатусСоставителя"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("batchesindicationstatus", "СтатусУказанияСерий"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cfitem", "СтатьяДДС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("incomeitem", "СтатьяДоходов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("costitem", "СтатьяЗатрат"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("expenseitem", "СтатьяРасходов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("cost", "Стоимость"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("costisnotredeemable", "СтоимостьНеПогашается"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("facost", "СтоимостьОС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("goodscost", "СтоимостьТоваров"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("country", "Страна"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("importingcountryisnotrf", "СтранаВвозаНеРФ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("origincountry", "СтранаПроисхождения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("countryoforiginbeforechange", "СтранаПроисхожденияДоИзменения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("registrationcountry", "СтранаРегистрации"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("insurancenumberofthefiu", "СтраховойНомерПФР"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("insurancecontributions", "СтраховыеВзносы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sum", "Сумма"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("amountexcludingvat", "СуммаБезНДС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("amountofbonuspoints", "СуммаБонусныхБаллов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sumcurr", "СуммаВал"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("amountarap", "СуммаВзаиморасчетов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("amountincludesvat", "СуммаВключаетНДС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("returnamount", "СуммаВозврата"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("commissionamount", "СуммаВознаграждения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("retailamount", "СуммаВРознице"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("totalofallpayments", "СуммаВсехПлатежей"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("amountofaccountsreceivable", "СуммаДебиторскойЗадолженности"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("amountbeforechange", "СуммаДоИзменения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("amountbeforeadjustment", "СуммаДоКорректировки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("documentamount", "СуммаДокумента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("feeamount", "СуммаКомиссии"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("amountbankcommission", "СуммаКомиссияБанка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("amountofaccountspayable", "СуммаКредиторскойЗадолженности"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vatamount", "СуммаНДС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vatamount10", "СуммаНДС10"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vatamount20", "СуммаНДС20"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("amountvatremuneration", "СуммаНДСВознаграждения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vatamountbeforechange", "СуммаНДСДоИзменения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("amountofvatbeforeadjustment", "СуммаНДСДоКорректировки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("amountnotsubjecttovat", "СуммаНеОблагаемаяНДС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("payamount", "СуммаОплаты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("transferamount", "СуммаПередачи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("amountofrevaluation_", "СуммаПереоценки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentamount", "СуммаПлатежа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("orderreceiptamount", "СуммаПоступления"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("dutyamount", "СуммаПошлины"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sumcompl", "СуммаРегл"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("reserveamount_", "СуммаРезерва"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("discountamount", "СуммаСкидки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("amountaccounting_", "СуммаУчет"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sumreal", "СуммаФакт"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("invoicesissuedtocustomers", "СчетаФактурыВыданныеПокупателям"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("revenueaccount", "СчетДоходов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountdr", "СчетДт"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("expenseaccount_", "СчетЗатрат"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountcr", "СчетКт"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("transferaccount", "СчетПередачи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("expenseaccount", "СчетРасходов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("settlementaccount_", "СчетРасчетов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("glaccount", "СчетУчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountforadvancesissued", "СчетУчетаАвансовВыданных"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountforadvancesreceived", "СчетУчетаАвансовПолученных"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("trackingaccountintransit", "СчетУчетаВПути"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("salesrevenueaccount", "СчетУчетаВыручкиОтПродаж"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("warehouseinvoice", "СчетУчетаНаСкладе"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("ndsvpathaccountingaccount", "СчетУчетаНДСВПути"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vatinvoiceforpurchases", "СчетУчетаНДСПриЗакупке"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vatinvoiceforsales", "СчетУчетаНДСПриПродаже"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("invoiceforunfactureddeliveries", "СчетУчетаНеотфактурованныеПоставки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountfortransfertocommission", "СчетУчетаПередачиНаКомиссию"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("account_settlement", "СчетУчетаРасчетов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("remunerationsettlementaccount", "СчетУчетаРасчетовПоВознаграждению"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("claimssettlementaccount", "СчетУчетаРасчетовПоПретензиям"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountforsettlementswithdebtorscommission", "СчетУчетаРасчетовСДебиторамиКомиссия"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountforsettlementswithdebtorsprincipaldebt", "СчетУчетаРасчетовСДебиторамиОсновнойДолг"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountforsettlementswithdebtorsinterest", "СчетУчетаРасчетовСДебиторамиПроценты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountforsettlementswithcustomers", "СчетУчетаРасчетовСКлиентами"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountforsettlementswithcustomerstare", "СчетУчетаРасчетовСКлиентамиТара"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountforsettlementswithcounterparty", "СчетУчетаРасчетовСКонтрагентом"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountforsettlementswithcreditorscommission", "СчетУчетаРасчетовСКредиторамиКомиссия"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountforsettlementswithcreditorsprincipaldebt", "СчетУчетаРасчетовСКредиторамиОсновнойДолг"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountforsettlementswithcreditorsinterest", "СчетУчетаРасчетовСКредиторамиПроценты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountforsettlementswithlessorleaseobligations", "СчетУчетаРасчетовСЛизингодателемАрендныеОбязательства"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountforsettlementswithlessorrepurchaseofleaseditem", "СчетУчетаРасчетовСЛизингодателемВыкупПредметаЛизинга"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountforsettlementswithlessorleasingservices", "СчетУчетаРасчетовСЛизингодателемЛизинговыеУслуги"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountforsettlementswithlessorsecuritypayment", "СчетУчетаРасчетовСЛизингодателемОбеспечительныйПлатеж"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountforsettlementswithsuppliers", "СчетУчетаРасчетовСПоставщиками"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountforsettlementswithsupplierstare", "СчетУчетаРасчетовСПоставщикамиТара"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("costofsalesaccount", "СчетУчетаСебестоимостиПродаж"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("taxinvoice", "СчетФактура"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("invoiceissued", "СчетФактураВыданный"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("invoiceissuedtobuyer", "СчетФактураВыданныйПокупателю"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("commodity", "СырьевойТовар"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("tobacco", "Табак"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("customsvalue", "ТаможеннаяСтоимость"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("customsfee", "ТаможенныйСбор"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("customspenalty", "ТаможенныйШтраф"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("tara", "Тара"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("correspondenttext", "ТекстКорреспондента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("purposetext", "ТекстНазначения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("payersname", "ТекстПлательщика"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("recipienttext", "ТекстПолучателя"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("currentproducts", "ТекущаяНоменклатура"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("currentccostfinacc", "ТекущаяСтоимостьБУ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("currentcosttd", "ТекущаяСтоимостьВР"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("currentcosttaxaccounting", "ТекущаяСтоимостьНУ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("currentccostpd", "ТекущаяСтоимостьПР"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("assetmaintenance", "ТекущийРемонт"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("phone", "Телефон"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("homephonenumber", "ТелефонДомашний"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("workingphone", "ТелефонРабочий"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("phones", "Телефоны"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("typeofexcisestamp", "ТипАкцизнойМарки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("inventorytype", "ТипЗапасов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("itemstype", "ТипНоменклатуры"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("typeofpayment", "ТипОплаты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("typeofvalidityperiod", "ТипПериодаДействия"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentdocumenttype", "ТипПлатежногоДокумента"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("warehousestore", "ТипСклада"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("scheduleamounttype", "ТипСуммыГрафика"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("packagetype", "ТипУпаковки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("servicetype", "ТипУслуги"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pricetype_", "ТипЦен"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("barcodetype", "ТипШтрихкода"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("typesofcashregisterpaymentsystem", "ТипыПлатежнойСистемыККТ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("inventory", "ТМЦ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("owngoods", "Товар"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("goodsmarkedbyidentificationtoolwithmarkingcode", "ТоварМаркируемыйСИИмеющийКМ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("goodsmarkedbyidentificationtoolwithoutmarkingcode", "ТоварМаркируемыйСИНеИмеющийКМ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("goods", "Товары"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("goodsreturnsales", "ТоварыВозвратПродажи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("goodssale", "ТоварыПродажа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("auction12", "ТОРГ12"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("salescharge", "ТорговыйСбор"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accuracyofunitofmeasure", "ТочностьЕдиницыИзмерения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("roundingprecision", "ТочностьОкругления"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("vehicles", "ТранспортныеСредства"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("actionsarerequired", "ТребуютсяДействия"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("tcmif", "ТФОМС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("withholdcommission", "УдержатьКомиссионноеВознаграждение"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("officerslicense", "УдостоверениеОфицера"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("reducedbalance", "УменьшаемогоОстатка"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("packagedwater", "УпакованнаяВода"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("productpackaging", "УпаковкаНоменклатуры"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("authorizedperson", "УполномоченноеЛицо"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("authorizedpersonselection", "УполномоченноеЛицоОтбор"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("authorizedrepresentativeintaxauthority", "УполномоченныйПредставитель"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("simplifiedrevenue", "УпрощеннаяДоход"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("simplifiedrevenueminusexpense", "УпрощеннаяДоходМинусРасход"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("operationservice", "Услуга"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("rewardservice", "УслугаПоВознаграждению"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("services", "Услуги"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("approvedpaymentdate", "УтвержденнаяДатаПлатежа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("approvedformofpayment", "УтвержденнаяФормаОплаты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("nameclarification", "УточнениеНаименования"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("companyactsasavattaxagent", "УчетАгентскогоНДС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("accountingforrevenueinoperatingcashregister", "УчетВыручкиВОперационнойКассе"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("fax", "Факс"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("actualaddress", "ФактическийАдрес"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("lastname", "Фамилия"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("persons", "ФизическиеЛица"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("individual", "ФизическоеЛицо"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("individualselection", "ФизическоеЛицоОтбор"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("lastfirstname", "ФИО"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentmethod", "ФормаОплаты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("uploadformat", "ФорматВыгрузки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("formatproperties", "ФорматСвойства"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("camerasandflashbulbs", "Фотоаппараты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("insurancecontributionstossf", "ФСС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("insurancecontributionstofcmif", "ФФОМС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("characteristic", "Характеристика"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("itemvariant", "ХарактеристикаПродукции"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("storedfile", "ХранимыйФайл"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("price", "Цена"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("priceincludesvat", "ЦенаВключаетНДС"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("retailprice", "ЦенаВРознице"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("retailpriceisold", "ЦенаВРозницеСтарая"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pricebeforechange", "ЦенаДоИзменения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pricebeforeadjustment", "ЦенаДоКорректировки"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("priceperpackaging", "ЦенаЗаУпаковку"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("transferprice", "ЦенаПередачи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("receiptprice", "ЦенаПоступления"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pricegroup", "ЦеноваяГруппа"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("pricegroups", "ЦеновыеГруппы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("numericcodefortaxinvoices", "ЦифровойИндексОбособленногоПодразделения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("partialdisposal", "ЧастичнаяЛиквидация"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("partialdisposalaccountingoption", "ЧастичноеВыбытиеВариантУчета"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("partialdisposalquantity", "ЧастичноеВыбытиеКоличество"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("magneticstripecardtemplate", "ШаблонМагнитнойКарты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("codetemplates", "ШаблоныКодов"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("tires", "Шины"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("width", "Ширина"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("codebyufadr", "ШифрПоЕНАОФ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("penalty", "Штраф"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("barcode", "Штрихкод"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("posterminal", "ЭквайринговыйТерминал"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("exportofnonresourcegoods", "ЭкспортНесырьевыхТоваров"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("commodityexports", "ЭкспортСырьевыхТоваров"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("electronically", "Электронно"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("digitalsignatures", "ЭлектронныеПодписи"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("digitalservices", "ЭлектронныеУслуги"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("paymentsteps", "ЭтапыОплаты"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("isadditionalinfo", "ЭтоДополнительноеСведение"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("thisisadditionalexpense", "ЭтоДопРасходы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("isrecordsset", "ЭтоНабор"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("yookassa", "ЮКасса"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("legaladdress", "ЮридическийАдрес"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("businessentity", "ЮридическоеЛицо"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("companyindividual", "ЮридическоеФизическоеЛицо"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("isrnpt", "ЯвляетсяРНПТ"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("isidentitydocument", "ЯвляетсяУдостоверяющимЛичность"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("userciother", "ПользовательскаяКИДругое"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("datasynchronizationviauniversalformat", "СинхронизацияДанныхЧерезУниверсальныйФормат"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("exchangemessagestransporttypes", "ВидыТранспортаСообщенийОбмена"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("wspassivemode", "WSПассивныйРежим"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("externalsystem", "ВнешняяСистема"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("exchangeplanname", "ИмяПланаОбмена"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("secondinfobasedescription", "НаименованиеВторойБазы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("thisinfobasedescription", "НаименованиеЭтойБазы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("secondinfobasenewnodecode", "КодНовогоУзлаВторойБазы"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("sourceinfobaseprefix", "ПрефиксИнформационнойБазыИсточника"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("exchangemessagestransportkind", "ВидТранспортаСообщенийОбмена"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("archivepasswordexchangemessages", "ПарольАрхиваСообщенияОбмена"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("filedataexchangedirectory", "FILEКаталогОбменаИнформацией"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("filecompressoutgoingmessagefile", "FILEСжиматьФайлИсходящегоСообщения"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("usetransportparametersemail", "ИспользоватьПараметрыТранспортаEMAIL"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("usetransportparametersfile", "ИспользоватьПараметрыТранспортаFILE"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("yes", "Да"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("none", "Нет"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("usetransportparametersftp", "ИспользоватьПараметрыТранспортаFTP"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("dataexchangeexecutionsettingsdescription", "НаименованиеНастройкиВыполненияОбмена"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("newnodecode", "КодНовогоУзла"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("predefinednodecode", "КодПредопределенногоУзла"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("exchangedatasettingsfileformatversion", "ВерсияФорматаФайлаНастроекОбменаДанными"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("own", "Собственные"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("agency", "Агентские"); // @NON-NLS-1 @NON-NLS-2 + Словарь.Вставить("barcodeselection", "ШтрихкодОтбор"); // @NON-NLS-1 @NON-NLS-2 + + Массив = Новый Массив; + Массив.Добавить("Выдано"); // @NON-NLS-1 + Массив.Добавить("Выставлен"); // @NON-NLS-1 + Словарь.Вставить("issued", Массив); + + Массив = Новый Массив; + Массив.Добавить("ОГРН"); // @NON-NLS-1 + Массив.Добавить("РегистрационныйНомер"); // @NON-NLS-1 + Словарь.Вставить("registrationnumber", Массив); + + Массив = Новый Массив; + Массив.Добавить("Оплачен"); // @NON-NLS-1 + Массив.Добавить("Оплачено"); // @NON-NLS-1 + Словарь.Вставить("paid", Массив); + + Массив = Новый Массив; + Массив.Добавить("Приложение"); // @NON-NLS-1 + Массив.Добавить("Упаковка"); // @NON-NLS-1 + Словарь.Вставить("package", Массив); + + Массив = Новый Массив; + Массив.Добавить("Эквайер"); // @NON-NLS-1 + Массив.Добавить("Эквайрер"); // @NON-NLS-1 + Словарь.Вставить("acquirer", Массив); + // АПК:1036-вкл не проверять текст на орфографию + + Возврат Словарь; + +КонецФункции +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбменДаннымиТрансляцияФорматаПовтИсп/ОбменДаннымиТрансляцияФорматаПовтИсп.mdo b/SSL/src/CommonModules/ОбменДаннымиТрансляцияФорматаПовтИсп/ОбменДаннымиТрансляцияФорматаПовтИсп.mdo new file mode 100644 index 000000000..770f7e38e --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиТрансляцияФорматаПовтИсп/ОбменДаннымиТрансляцияФорматаПовтИсп.mdo @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="090e521e-391a-4ce7-9f7c-1c459fd221eb"> + <name>ОбменДаннымиТрансляцияФорматаПовтИсп</name> + <synonym> + <key>ru</key> + <value>Обмен данными трансляция формата повт исп</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> + <returnValuesReuse>DuringSession</returnValuesReuse> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl index 4f1c45307..f3b25c62a 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl @@ -407,6 +407,13 @@ ЗаполнитьЗначенияСвойств(НовыеПараметрыСеанса, ПараметрыСеанса.ПараметрыОбработчикаОбновления); НовыеПараметрыСеанса.ЕстьОбработанныеОбъекты = Истина; + ИдентификаторТранзакции = Новый УникальныйИдентификатор; + МенеджерЗаписи = РегистрыСведений.ФиксацияОбработкиДанныхОбработчиками.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ИдентификаторТранзакции = ИдентификаторТранзакции; + МенеджерЗаписи.Записать(); + + НовыеПараметрыСеанса.ИдентификаторТранзакции = ИдентификаторТранзакции; + ПараметрыСеанса.ПараметрыОбработчикаОбновления = Новый ФиксированнаяСтруктура(НовыеПараметрыСеанса); КонецЕсли; @@ -526,6 +533,9 @@ Параметры.Вставить("ИмяОбработчика", ""); Параметры.Вставить("ПовторнаяРегистрация", Ложь); Параметры.Вставить("ПараметрыВыборки"); + Параметры.Вставить("АктуальныеДанные", ПараметрыВыборкиАктуальныхДанных()); + Параметры.Вставить("ЗарегистрированныеТаблицыРегистраторов", Новый Соответствие); + Параметры.Вставить("ВерсияПодсистемыНаНачалоОбновления", Неопределено); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда @@ -584,7 +594,7 @@ КонецЕсли; Если ДополнительныеПараметры.ЭтоДвижения Тогда - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ДополнительныеПараметры.ПолноеИмяРегистра); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ДополнительныеПараметры.ПолноеИмяРегистра); Иначе МетаданныеОбъекта = Неопределено; КонецЕсли; @@ -594,7 +604,7 @@ ЭтоНовый = Ложь; Если ТипЗнч(Данные) = Тип("Строка") Тогда - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(Данные); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Данные); ИначеЕсли ТипДанных = Тип("ДанныеФормыСтруктура") Тогда Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Данные, "Ссылка") Тогда @@ -725,7 +735,7 @@ Несуществующие = Новый Массив; Для Каждого ПолноеИмяОбъекта Из МассивИмен Цикл ПолноеИмяОбъекта = СокрЛП(ПолноеИмяОбъекта); - ОбъектСуществует = (Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта) <> Неопределено); + ОбъектСуществует = (ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта) <> Неопределено); Если Не ОбъектСуществует Тогда Несуществующие.Добавить(ПолноеИмяОбъекта); КонецЕсли; @@ -780,6 +790,15 @@ Иначе Регистраторы = Данные; + + // Сохранение списка таблиц, по которым выполнялась регистрация. + Для Каждого Регистратор Из Регистраторы Цикл + ТипТаблицы = ТипЗнч(Регистратор); + Если ОсновныеПараметры.ЗарегистрированныеТаблицыРегистраторов[ТипТаблицы] = Неопределено Тогда + ПолноеИмяТаблицы = Регистратор.Метаданные().ПолноеИмя(); + ОсновныеПараметры.ЗарегистрированныеТаблицыРегистраторов.Вставить(ТипТаблицы, ПолноеИмяТаблицы); + КонецЕсли; + КонецЦикла; КонецЕсли; ЗарегистрироватьИзмененияПодчиненногоРегистра(ОсновныеПараметры, @@ -883,6 +902,28 @@ КонецФункции +// Параметры, используемые для выборки актуальных данных обработчика при выполнении обновления. +// Используется для обработчиков с обычным порядком. Данные, которые не удовлетворяют условию +// будут обрабатываться в порядке некритичных обработчиков. +// +// Возвращаемое значение: +// Структура: +// * ПолеОтбора - Строка - имя реквизита, по которому устанавливается отбор. +// * ВидСравнения - ВидСравнения - допустимые значения - Больше, Меньше, Равно, +// БольшеИлиРавно, МеньшеИлиРавно. +// * Значение - Произвольный - значение, по которому будет выполняться сравнение. +// +Функция ПараметрыВыборкиАктуальныхДанных() Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("ПолеОтбора"); + Параметры.Вставить("ВидСравнения"); + Параметры.Вставить("Значение"); + + Возврат Параметры; + +КонецФункции + // Дополнительные параметры выборки данных для многопоточной обработки. // // Возвращаемое значение: @@ -1221,10 +1262,14 @@ ДополнительныеПараметры = ДополнительныеПараметрыВыборкиДанныхДляОбработки(); КонецЕсли; + ПараметрыОбработчикаОбновления = Неопределено; + ДополнительныеПараметры.Свойство("ПараметрыОбработчикаОбновления", ПараметрыОбработчикаОбновления); + МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц(); ПроверитьПараметрыВыборки(ДополнительныеПараметры); ПараметрыПостроения = ПараметрыПостроенияВыборки(ДополнительныеПараметры); + ЕстьФильтр = Ложь; Если ПолноеИмяДокумента = Неопределено Тогда ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 10000 @@ -1288,6 +1333,7 @@ | И &УсловиеПоДопИсточникамСсылкам | И &УсловиеПоДопИсточникамРегистрам | И &УсловиеПоСтраницам + | И &УсловиеАктуальныеДанные | |УПОРЯДОЧИТЬ ПО | &ПорядокВыборки"; @@ -1295,6 +1341,34 @@ ДополнительныеПараметрыСозданияВТ.ИмяВременнойТаблицы = "ВТЗаблокированоСсылка"; СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияДанных(Очередь, ПолноеИмяДокумента, МенеджерВременныхТаблиц, ДополнительныеПараметрыСозданияВТ); УстановитьПоляУпорядочиванияРегистраПоДокументу(ПараметрыПостроения); + + ФильтрАктуальныхДанных = ОбновлениеИнформационнойБазыСлужебный.ФильтрАктуальныхДанных(ПараметрыОбработчикаОбновления, "ТаблицаДокумента"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеАктуальныеДанные", ФильтрАктуальныхДанных.Условие); + + Если ФильтрАктуальныхДанных.ЕстьФильтр Тогда + ЕстьФильтр = Истина; + ТекстЗапросаПроверки = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + |ИЗ + | #ТаблицаРегистраИзменения КАК ТаблицаРегистраИзменения + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ #ПолноеИмяДокумента КАК ТаблицаДокумента + | ПО ТаблицаРегистраИзменения.Регистратор = ТаблицаДокумента.Ссылка + |ГДЕ + | ТаблицаРегистраИзменения.Узел = &ТекущаяОчередь + | И &УсловиеАктуальныеДанные"; + ТекстЗапросаПроверки = СтрЗаменить(ТекстЗапросаПроверки, "&УсловиеАктуальныеДанные", ФильтрАктуальныхДанных.Условие); + ТекстЗапросаПроверки = СтрЗаменить(ТекстЗапросаПроверки,"#ТаблицаРегистраИзменения", ПолноеИмяРегистра + ".Изменения"); + ТекстЗапросаПроверки = СтрЗаменить(ТекстЗапросаПроверки,"#ПолноеИмяДокумента", ПолноеИмяДокумента); + + ЗапросПроверки = Новый Запрос; + ЗапросПроверки.УстановитьПараметр("ТекущаяОчередь", ОчередьСсылкой(Очередь)); + ЗапросПроверки.УстановитьПараметр("ЗначениеОтбораАктуальныхДанных", ФильтрАктуальныхДанных.Значение); + ЗапросПроверки.Текст = ТекстЗапросаПроверки; + + ОбработаныВсеАктуальныеДанные = ЗапросПроверки.Выполнить().Пустой(); + УстановитьПараметрыОбработчикаПриВыборкеДанных(ДополнительныеПараметры, ОбработаныВсеАктуальныеДанные, ПараметрыОбработчикаОбновления, ПолноеИмяДокумента); + КонецЕсли; КонецЕсли; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаРегистраИзменения", ПолноеИмяРегистра + ".Изменения"); @@ -1319,6 +1393,9 @@ Запрос.Текст = ТекстЗапроса; Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; Запрос.УстановитьПараметр("ТекущаяОчередь", ОчередьСсылкой(Очередь)); + Если ЕстьФильтр Тогда + Запрос.УстановитьПараметр("ЗначениеОтбораАктуальныхДанных", ФильтрАктуальныхДанных.Значение); + КонецЕсли; УстановитьПоляПоСтраницам(Запрос, ПараметрыПостроения); УстановитьПорядокПоСтраницам(Запрос, ПараметрыПостроения); @@ -1347,8 +1424,11 @@ ДополнительныеПараметры = ДополнительныеПараметрыВыборкиДанныхДляОбработки(); КонецЕсли; + ПараметрыОбработчикаОбновления = Неопределено; + ДополнительныеПараметры.Свойство("ПараметрыОбработчикаОбновления", ПараметрыОбработчикаОбновления); + ИмяОбъекта = СтрРазделить(ПолноеИмяОбъекта,".",Ложь)[1]; - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); ЭтоДокумент = ОбщегоНазначения.ЭтоДокумент(МетаданныеОбъекта) Или ОбщегоНазначения.ЭтоЗадача(МетаданныеОбъекта); @@ -1373,21 +1453,50 @@ | ТаблицаИзменений.Ссылка = ВТЗаблокированоСсылка.Ссылка) | И &УсловиеПоДопИсточникамСсылкам | И &УсловиеПоДопИсточникамРегистрам - | И &УсловиеПоСтраницам"; + | И &УсловиеПоСтраницам + | И &УсловиеАктуальныеДанные"; Если ЭтоДокумент Или ПараметрыПостроения.ПостраничнаяВыборка Тогда ТекстЗапроса = ТекстЗапроса + " | |УПОРЯДОЧИТЬ ПО | &ПорядокВыборки"; КонецЕсли; + + ФильтрАктуальныхДанных = ОбновлениеИнформационнойБазыСлужебный.ФильтрАктуальныхДанных(ПараметрыОбработчикаОбновления, "ТаблицаОбъекта"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеАктуальныеДанные", ФильтрАктуальныхДанных.Условие); + Если ФильтрАктуальныхДанных.ЕстьФильтр Тогда + ТекстЗапросаПроверки = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + |ИЗ + | #ТаблицаОбъектаИзменения КАК ТаблицаИзменений + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ #ТаблицаОбъекта КАК ТаблицаОбъекта + | ПО ТаблицаИзменений.Ссылка = ТаблицаОбъекта.Ссылка + |ГДЕ + | ТаблицаИзменений.Узел = &ТекущаяОчередь + | И &УсловиеАктуальныеДанные"; + ТекстЗапросаПроверки = СтрЗаменить(ТекстЗапросаПроверки, "&УсловиеАктуальныеДанные", ФильтрАктуальныхДанных.Условие); + ТекстЗапросаПроверки = СтрЗаменить(ТекстЗапросаПроверки,"#ТаблицаОбъектаИзменения", ПолноеИмяОбъекта + ".Изменения"); + ТекстЗапросаПроверки = СтрЗаменить(ТекстЗапросаПроверки,"#ТаблицаОбъекта", ПолноеИмяОбъекта); + + ЗапросПроверки = Новый Запрос; + ЗапросПроверки.УстановитьПараметр("ТекущаяОчередь", ОчередьСсылкой(Очередь)); + ЗапросПроверки.УстановитьПараметр("ЗначениеОтбораАктуальныхДанных", ФильтрАктуальныхДанных.Значение); + ЗапросПроверки.Текст = ТекстЗапросаПроверки; + + ОбработаныВсеАктуальныеДанные = ЗапросПроверки.Выполнить().Пустой(); + + УстановитьПараметрыОбработчикаПриВыборкеДанных(ДополнительныеПараметры, ОбработаныВсеАктуальныеДанные, ПараметрыОбработчикаОбновления) + КонецЕсли; + ТекстЗапроса = ТекстЗапроса + " |; |УНИЧТОЖИТЬ | #ВТЗаблокированоСсылка"; УстановитьПоляУпорядочиванияСсылок(ПараметрыПостроения, ЭтоДокумент); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ВТЗаблокированоСсылка","ВТЗаблокировано" + ИмяОбъекта); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"#ТаблицаОбъектаИзменения", ПолноеИмяОбъекта + ".Изменения"); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"#ТаблицаОбъекта", ПолноеИмяОбъекта); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"#ТаблицаОбъектаИзменения", ПолноеИмяОбъекта + ".Изменения"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"#ТаблицаОбъекта", ПолноеИмяОбъекта); УстановитьРазмерВыборки(ТекстЗапроса, ДополнительныеПараметры); МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц(); СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияДанных(Очередь, ПолноеИмяОбъекта, МенеджерВременныхТаблиц); @@ -1398,6 +1507,9 @@ Запрос.Текст = ТекстЗапроса; Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; Запрос.УстановитьПараметр("ТекущаяОчередь", ОчередьСсылкой(Очередь)); + Если ФильтрАктуальныхДанных.ЕстьФильтр Тогда + Запрос.УстановитьПараметр("ЗначениеОтбораАктуальныхДанных", ФильтрАктуальныхДанных.Значение); + КонецЕсли; УстановитьПоляПоСтраницам(Запрос, ПараметрыПостроения); Если ЭтоДокумент Или ПараметрыПостроения.ПостраничнаяВыборка Тогда @@ -1436,7 +1548,7 @@ КонецЕсли; ИмяОбъекта = СтрРазделить(ПолноеИмяОбъекта,".",Ложь)[1]; - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); ФрагментыЗапроса = Новый Массив; ФрагментЗапроса = @@ -1457,12 +1569,40 @@ | ГДЕ | ТаблицаОбъекта.Ссылка = ВТЗаблокированоСсылка.Ссылка) | И &УсловиеПоДопИсточникамСсылкам - | И &УсловиеПоДопИсточникамРегистрам"; + | И &УсловиеПоДопИсточникамРегистрам + | И &УсловиеАктуальныеДанные"; Если Не ДополнительныеПараметры.ВыбиратьПорциями Тогда ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "ВЫБРАТЬ ПЕРВЫЕ 10000", "ВЫБРАТЬ"); // @query-part-1 @query-part-2 КонецЕсли; + ФильтрАктуальныхДанных = ОбновлениеИнформационнойБазыСлужебный.ФильтрАктуальныхДанных(Неопределено, "ТаблицаОбъекта"); + ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "&УсловиеАктуальныеДанные", ФильтрАктуальныхДанных.Условие); + Если ФильтрАктуальныхДанных.ЕстьФильтр Тогда + ТекстЗапросаПроверки = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + |ИЗ + | #ТаблицаОбъектаИзменения КАК ТаблицаИзменений + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ #ТаблицаОбъекта КАК ТаблицаОбъекта + | ПО ТаблицаИзменений.Ссылка = ТаблицаОбъекта.Ссылка + |ГДЕ + | ТаблицаИзменений.Узел = &ТекущаяОчередь + | И &УсловиеАктуальныеДанные"; + ТекстЗапросаПроверки = СтрЗаменить(ТекстЗапросаПроверки, "&УсловиеАктуальныеДанные", ФильтрАктуальныхДанных.Условие); + ТекстЗапросаПроверки = СтрЗаменить(ТекстЗапросаПроверки,"#ТаблицаОбъектаИзменения", ПолноеИмяОбъекта + ".Изменения"); + ТекстЗапросаПроверки = СтрЗаменить(ТекстЗапросаПроверки,"#ТаблицаОбъекта", ПолноеИмяОбъекта); + + ЗапросПроверки = Новый Запрос; + ЗапросПроверки.УстановитьПараметр("ТекущаяОчередь", ОчередьСсылкой(Очередь)); + ЗапросПроверки.УстановитьПараметр("ЗначениеОтбораАктуальныхДанных", ФильтрАктуальныхДанных.Значение); + ЗапросПроверки.Текст = ТекстЗапросаПроверки; + + ОбработаныВсеАктуальныеДанные = ЗапросПроверки.Выполнить().Пустой(); + + УстановитьПараметрыОбработчикаПриВыборкеДанных(ДополнительныеПараметры, ОбработаныВсеАктуальныеДанные, Неопределено) + КонецЕсли; + ФрагментыЗапроса.Добавить(ФрагментЗапроса); ЭтоСсылка = ОбщегоНазначения.ЭтоДокумент(МетаданныеОбъекта) Или ОбщегоНазначения.ЭтоЗадача(МетаданныеОбъекта); @@ -1539,8 +1679,11 @@ ДополнительныеПараметры = ДополнительныеПараметрыВыборкиДанныхДляОбработки(); КонецЕсли; + ПараметрыОбработчикаОбновления = Неопределено; + ДополнительныеПараметры.Свойство("ПараметрыОбработчикаОбновления", ПараметрыОбработчикаОбновления); + ИмяОбъекта = СтрРазделить(ПолноеИмяОбъекта,".",Ложь)[1]; - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); ПараметрыПостроения = ПараметрыПостроенияВыборки(ДополнительныеПараметры, "ТаблицаИзменений"); ЗаданыПоляУпорядочивания = ЗаданыПоляУпорядочивания(ДополнительныеПараметры); НеобходимоУпорядочивание = ЗаданыПоляУпорядочивания Или ПараметрыПостроения.ПостраничнаяВыборка; @@ -1555,7 +1698,8 @@ | ТаблицаИзменений.Узел = &ТекущаяОчередь | И &ТекстУсловияПоОтборуНезаблокированных | И &УсловиеПоДопИсточникамСсылкам - | И &УсловиеПоСтраницам"; + | И &УсловиеПоСтраницам + | И &УсловиеАктуальныеДанные"; Если НеобходимоУпорядочивание Тогда УстановитьПоляУпорядочиванияНезависимогоРегистраСведений(ПараметрыПостроения); @@ -1565,6 +1709,29 @@ |"; КонецЕсли; + ФильтрАктуальныхДанных = ОбновлениеИнформационнойБазыСлужебный.ФильтрАктуальныхДанных(ПараметрыОбработчикаОбновления, "ТаблицаИзменений"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеАктуальныеДанные", ФильтрАктуальныхДанных.Условие); + Если ФильтрАктуальныхДанных.ЕстьФильтр Тогда + ТекстЗапросаПроверки = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + |ИЗ + | #ТаблицаОбъектаИзменения КАК ТаблицаИзменений + |ГДЕ + | ТаблицаИзменений.Узел = &ТекущаяОчередь + | И &УсловиеАктуальныеДанные"; + ТекстЗапросаПроверки = СтрЗаменить(ТекстЗапросаПроверки, "&УсловиеАктуальныеДанные", ФильтрАктуальныхДанных.Условие); + ТекстЗапросаПроверки = СтрЗаменить(ТекстЗапросаПроверки,"#ТаблицаОбъектаИзменения", ПолноеИмяОбъекта + ".Изменения"); + + ЗапросПроверки = Новый Запрос; + ЗапросПроверки.УстановитьПараметр("ТекущаяОчередь", ОчередьСсылкой(Очередь)); + ЗапросПроверки.УстановитьПараметр("ЗначениеОтбораАктуальныхДанных", ФильтрАктуальныхДанных.Значение); + ЗапросПроверки.Текст = ТекстЗапросаПроверки; + + ОбработаныВсеАктуальныеДанные = ЗапросПроверки.Выполнить().Пустой(); + УстановитьПараметрыОбработчикаПриВыборкеДанных(ДополнительныеПараметры, ОбработаныВсеАктуальныеДанные, ПараметрыОбработчикаОбновления) + КонецЕсли; + ИзмеренияСОсновнымОтбором = Новый Массив; Для Каждого Измерение Из МетаданныеОбъекта.Измерения Цикл @@ -1605,6 +1772,9 @@ Запрос.Текст = ТекстЗапроса; Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; Запрос.УстановитьПараметр("ТекущаяОчередь", ОчередьСсылкой(Очередь)); + Если ФильтрАктуальныхДанных.ЕстьФильтр Тогда + Запрос.УстановитьПараметр("ЗначениеОтбораАктуальныхДанных", ФильтрАктуальныхДанных.Значение); + КонецЕсли; УстановитьПоляПоСтраницам(Запрос, ПараметрыПостроения); Если НеобходимоУпорядочивание Тогда @@ -1642,7 +1812,7 @@ КонецЕсли; ИмяОбъекта = СтрРазделить(ПолноеИмяОбъекта,".",Ложь)[1]; - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); Запрос = Новый Запрос; ТекстЗапроса = @@ -1791,7 +1961,7 @@ МетаданныеОбъекта = ОбрабатываемыйТип; ПолноеИмяОбъекта = ОбрабатываемыйТип.ПолноеИмя(); Иначе - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ОбрабатываемыйТип); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ОбрабатываемыйТип); ПолноеИмяОбъекта = ОбрабатываемыйТип; КонецЕсли; ПроверкаРегистра = Ложь; @@ -1976,7 +2146,7 @@ УстановитьОтключениеБезопасногоРежима(Истина); УстановитьПривилегированныйРежим(Истина); - Если Не Запрос.Выполнить().Пустой() Тогда + Если Не Запрос.Выполнить().Пустой() Тогда // @skip-check query-in-loop - для избежания слишком тяжелого запроса. Возврат Истина; КонецЕсли; УстановитьПривилегированныйРежим(Ложь); @@ -2114,7 +2284,7 @@ Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта); // ОбъектМетаданныхСправочник, ОбъектМетаданныхДокумент + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); // ОбъектМетаданныхСправочник, ОбъектМетаданныхДокумент ИмяИзмеренияДляОтбора = ДополнительныеПараметры.ИмяИзмеренияДляОтбора; ОтложенноеОбновлениеЗавершеноУспешно = ПолучитьФункциональнуюОпцию("ОтложенноеОбновлениеЗавершеноУспешно"); @@ -2333,11 +2503,11 @@ МетаданныеОбъекта = ОбрабатываемыйТип; ПолноеИмяОбъекта = ОбрабатываемыйТип.ПолноеИмя(); Иначе - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ОбрабатываемыйТип); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ОбрабатываемыйТип); ПолноеИмяОбъекта = ОбрабатываемыйТип; КонецЕсли; - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); Если ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(МетаданныеОбъекта) Тогда Если МассивТекстовЗапросов.Количество() = 0 Тогда @@ -2488,7 +2658,7 @@ ИзмеренияМассив = Измерения; КонецЕсли; - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяРегистра); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяРегистра); ИменаИзмерений = Новый Массив; ПсевдонимыИзмерений = Новый Массив; @@ -2757,6 +2927,9 @@ // для остальных заполнение не требуется. Полные имена объектов через запятую, // которые следует блокировать от изменения до завершения процедуры обработки данных. // Если заполнено, то также требуется заполнить и свойство ПроцедураПроверки. +// * НовыеОбъекты - Строка - необходимо заполнять для обработчиков отложенного обновления, +// для остальных заполнение не требуется. Полные имена объектов через запятую, +// которые создаются при работе обработчика обновления. // * ПроцедураПроверки - Строка - необходимо заполнять для обработчиков отложенного обновления, // для остальных заполнение не требуется. Имя функции, которая для переданного объекта // определяет, завершена ли для него процедура обработки данных. @@ -2781,6 +2954,8 @@ // * ПриоритетыВыполнения - ТаблицаЗначений - таблица приоритетов выполнения между отложенными обработчиками, // изменяющими или читающими одни и те же данные. Подробнее см. в комментарии // к функции ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика. +// * Многопоточный - Булево - Истина, если обработчик адаптирован для обработки данных в несколько потоков. +// * Порядок - ПеречислениеСсылка.ПорядокОбработчиковОбновления // // 5) Для оперативных и монопольных обработчиков начального заполнения: // * НеВыполнятьПриПереходеСДругойПрограммы - Булево - при переходе с другой программы обработчики начального @@ -2841,6 +3016,7 @@ Обработчики.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор")); Обработчики.Колонки.Добавить("ПроцедураПроверки", Новый ОписаниеТипов("Строка")); Обработчики.Колонки.Добавить("БлокируемыеОбъекты", Новый ОписаниеТипов("Строка")); + Обработчики.Колонки.Добавить("НовыеОбъекты", Новый ОписаниеТипов("Строка")); // Для параллельного режима отложенного обновления. Обработчики.Колонки.Добавить("ПроцедураЗаполненияДанныхОбновления", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(0))); Обработчики.Колонки.Добавить("ОчередьОтложеннойОбработки", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(4))); @@ -2850,6 +3026,7 @@ Обработчики.Колонки.Добавить("ИзменяемыеОбъекты", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(0))); Обработчики.Колонки.Добавить("ПриоритетыВыполнения"); Обработчики.Колонки.Добавить("Многопоточный", Новый ОписаниеТипов("Булево")); + Обработчики.Колонки.Добавить("Порядок", Новый ОписаниеТипов("ПеречислениеСсылка.ПорядокОбработчиковОбновления")); // Для обработчиков начального заполнения. Обработчики.Колонки.Добавить("НеВыполнятьПриПереходеСДругойПрограммы", Новый ОписаниеТипов("Булево")); @@ -4010,6 +4187,8 @@ СведенияОбОбновлении.ТекущаяИтерацияОбновления = 1; ОбновлениеИнформационнойБазыСлужебный.ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении); + Константы.ПорядокОбрабатываемыхДанных.Установить(Перечисления.ПорядокОбработчиковОбновления.Критичный); + Константы.ОтложенноеОбновлениеЗавершеноУспешно.Установить(Ложь); Если Не ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда Константы.ОтложенноеОбновлениеВГлавномУзлеЗавершеноУспешно.Установить(Ложь); @@ -4151,7 +4330,7 @@ ВызватьИсключение ТекстИсключения; КонецЕсли; - МетаданныеДокумента = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта); + МетаданныеДокумента = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); ВременныеТаблицыЗаблокированныхДопИсточников = Новый Соответствие; РеквизитыШапки = Новый Соответствие; РеквизитыТЧ = Новый Соответствие; @@ -4191,10 +4370,10 @@ ВременныеТаблицыЗаблокированныхДопИсточников[МетаданныеИсточника] = ИмяВТЗаблокированногоДопИсточника; ДополнительныеПараметрыСозданияВТ = ДополнительныеПараметрыВыборкиДанныхДляОбработки(); ДополнительныеПараметрыСозданияВТ.ИмяВременнойТаблицы = ИмяВТЗаблокированногоДопИсточника; - СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияДанных(Очередь, + СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияДанных(Очередь, // @skip-check query-in-loop - пакетная проверка заблокированных данных. ПолноеИмяИсточника, МенеджерВременныхТаблиц, - ДополнительныеПараметрыСозданияВТ); + ДополнительныеПараметрыСозданияВТ); КонецЕсли; КонецЦикла; КонецЦикла; @@ -4248,7 +4427,7 @@ ВременныеТаблицыЗаблокированныхДопИсточников = Новый Соответствие; Для Каждого ИсточникДанных Из ДополнительныеИсточникиРегистры Цикл - МетаданныеИсточника = Метаданные.НайтиПоПолномуИмени(ИсточникДанных); + МетаданныеИсточника = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИсточникДанных); Если ОбщегоНазначения.ЭтоРегистрСведений(МетаданныеИсточника) И МетаданныеИсточника.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый Тогда @@ -4265,7 +4444,7 @@ ДополнительныеПараметрыСозданияВТ = ДополнительныеПараметрыВыборкиДанныхДляОбработки(); ДополнительныеПараметрыСозданияВТ.ИмяВременнойТаблицы = ИмяВТЗаблокированногоДопИсточника; - СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияДанных(Очередь, ИсточникДанных, МенеджерВременныхТаблиц, ДополнительныеПараметрыСозданияВТ); + СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияДанных(Очередь, ИсточникДанных, МенеджерВременныхТаблиц, ДополнительныеПараметрыСозданияВТ); // @skip-check query-in-loop - пакетная проверка заблокированных данных. ВременныеТаблицыЗаблокированныхДопИсточников.Вставить(МетаданныеИсточника, ИмяВТЗаблокированногоДопИсточника); КонецЕсли; @@ -4314,7 +4493,7 @@ Иначе - МетаданныеРегистра = Метаданные.НайтиПоПолномуИмени(ПолноеИмяРегистра); + МетаданныеРегистра = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяРегистра); УсловияПоДопИсточникамСсылкам = Новый Массив; ШаблонУсловияПоДопИсточникамСсылкам = " НЕ ИСТИНА В ( @@ -4346,7 +4525,7 @@ ИмяВременнойТаблицы = "ВТЗаблокировано" + ИсточникДанных; ДополнительныеПараметрыСозданияВТ.ИмяВременнойТаблицы = ИмяВременнойТаблицы; - СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияСсылок(Очередь, МассивОбъектовМетаданных, МенеджерВременныхТаблиц, ДополнительныеПараметрыСозданияВТ); + СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияСсылок(Очередь, МассивОбъектовМетаданных, МенеджерВременныхТаблиц, ДополнительныеПараметрыСозданияВТ); // @skip-check query-in-loop - пакетная проверка заблокированных данных. УсловиеПоДопИсточникамСсылкам = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ШаблонУсловияПоДопИсточникамСсылкам, @@ -4478,7 +4657,7 @@ Процедура ЗарегистрироватьИзмененияНезависимогоРегистра(Параметры, Узел, Записи, ВидДанных, ПолноеИмяОбъекта) ПараметрыРегистрации = НовыеПараметрыРегистрации(Параметры, Узел, ВидДанных, ПолноеИмяОбъекта); - МетаданныеРегистра = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта); + МетаданныеРегистра = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); Для Каждого Запись Из Записи Цикл Набор = ПолучитьПереиспользуемыйНабор(ПараметрыРегистрации.ПереиспользуемыеНаборы); @@ -4637,7 +4816,7 @@ Набор = ПолучитьПереиспользуемыйНабор(ПараметрыУдаления.ПереиспользуемыеНаборы); Набор.Отбор.Регистратор.Установить(Регистратор); - ЗаписатьПрогрессВыполненияОбработчика(Набор, Узел); + ЗаписатьПрогрессВыполненияОбработчика(Набор, Узел); // @skip-check query-in-loop - нет запроса в цикле. УдалитьРегистрациюИзмененийЭлементаДанных(Набор, ПараметрыУдаления); КонецЦикла; @@ -4655,7 +4834,7 @@ Процедура УдалитьРегистрациюИзмененийНезависимогоРегистра(Узел, Записи, ПолноеИмяОбъекта) ПараметрыУдаления = НовыеПараметрыУдаленияРегистрации(Узел, ПолноеИмяОбъекта); - МетаданныеРегистра = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта); + МетаданныеРегистра = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); Для Каждого Запись Из Записи Цикл Набор = ПолучитьПереиспользуемыйНабор(ПараметрыУдаления.ПереиспользуемыеНаборы); @@ -4666,7 +4845,7 @@ Набор.Отбор[Колонка.Имя].Использование = Истина; КонецЦикла; - ЗаписатьПрогрессВыполненияОбработчика(Набор, Узел, МетаданныеРегистра); + ЗаписатьПрогрессВыполненияОбработчика(Набор, Узел, МетаданныеРегистра); // @skip-check query-in-loop - нет запроса в цикле. УдалитьРегистрациюИзмененийЭлементаДанных(Набор, ПараметрыУдаления); КонецЦикла; @@ -4733,19 +4912,6 @@ КонецПроцедуры -// Доступна ли платформа с оптимизированной пакетной регистрацией. -// -// Возвращаемое значение: -// Булево - Истина - быстрая пакетная регистрация доступна. -// -Функция ДоступнаПакетнаяРегистрация() Экспорт - - СистемнаяИнформация = Новый СистемнаяИнформация; - - Возврат ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.19.725") >= 0; - -КонецФункции - // Необходимо ли записывать данные для обновления в файл при использовании РИБ с фильтрами. // // Возвращаемое значение: @@ -4830,7 +4996,7 @@ ПараметрыРегистрации.Вставить("ВидДанных", ВидДанных); ПараметрыРегистрации.Вставить("ПолноеИмяОбъекта", ПолноеИмяОбъекта); ПараметрыРегистрации.Вставить("ДанныеДляРегистрации", Новый Массив); - ПараметрыРегистрации.Вставить("ДоступнаПакетнаяРегистрация", ДоступнаПакетнаяРегистрация()); + ПараметрыРегистрации.Вставить("ДоступнаПакетнаяРегистрация", Истина); ПараметрыРегистрации.Вставить("ЗаписыватьДанныеДляОбновленияВФайл", ЗаписыватьДанныеДляОбновленияВФайл(Параметры)); ПараметрыРегистрации.Вставить("МодульОбменДаннымиСервер", МодульОбменДаннымиСервер(ПараметрыРегистрации.ЗаписыватьДанныеДляОбновленияВФайл)); @@ -4840,7 +5006,7 @@ Если ЗначениеЗаполнено(ПолноеИмяОбъекта) Тогда МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПолноеИмяОбъекта); - Если ОбщегоНазначения.ЭтоРегистр(Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта)) Тогда + Если ОбщегоНазначения.ЭтоРегистр(ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта)) Тогда ПараметрыРегистрации.Вставить("ПереиспользуемыеНаборы", НовыеПереиспользуемыеНаборы(МенеджерОбъекта)); КонецЕсли; КонецЕсли; @@ -4881,14 +5047,14 @@ ПараметрыУдаления.Вставить("Узел", Узел); ПараметрыУдаления.Вставить("ПолноеИмяОбъекта", ПолноеИмяОбъекта); ПараметрыУдаления.Вставить("ДанныеДляУдаления", Новый Массив); - ПараметрыУдаления.Вставить("ДоступнаПакетнаяРегистрация", ДоступнаПакетнаяРегистрация()); + ПараметрыУдаления.Вставить("ДоступнаПакетнаяРегистрация", Истина); МенеджерОбъекта = Неопределено; Если ЗначениеЗаполнено(ПолноеИмяОбъекта) Тогда МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПолноеИмяОбъекта); - Если ОбщегоНазначения.ЭтоРегистр(Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта)) Тогда + Если ОбщегоНазначения.ЭтоРегистр(ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта)) Тогда ПараметрыУдаления.Вставить("ПереиспользуемыеНаборы", НовыеПереиспользуемыеНаборы(МенеджерОбъекта)); КонецЕсли; КонецЕсли; @@ -5296,7 +5462,7 @@ Запрос.Текст = Запрос.Текст + ТекстЗапросаУничтоженияВременныхТаблиц; КонецЕсли; - Выгрузка = Запрос.Выполнить().Выгрузить(); + Выгрузка = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - оптимизированная выборка данных. Если Результат = Неопределено Тогда Результат = Выгрузка; @@ -5699,27 +5865,6 @@ КонецПроцедуры -// Проверка, что имя начинается на букву или подчеркивание и кроме них может содержать только цифры. -// -// Параметры: -// Имя - Строка - проверяемое имя. -// -// Возвращаемое значение: -// Булево - Истина, если это правильный идентификатор. -// -Функция ИмяСоответствуетТребованиямИменованияСвойств(Имя) - - Цифры = "1234567890"; - Если Имя = "" Или СтрНайти(Цифры, Лев(Имя, 1)) > 0 Тогда - Возврат Ложь; - КонецЕсли; - - НедопустимыеСимволы = """/\[]:;|=-?*<>,.()+№@!%^&~" + " "; - НовоеИмя = СтрСоединить(СтрРазделить(Имя, НедопустимыеСимволы, Истина)); - Возврат (НовоеИмя = Имя); - -КонецФункции - // Формирует фрагмент текста запроса с выбираемыми полями. // // Параметры: @@ -5764,7 +5909,7 @@ КонецЕсли; КонецЕсли; - Если ИмяСоответствуетТребованиямИменованияСвойств(Псевдоним) Тогда + Если ОбщегоНазначенияКлиентСервер.ИмяСоответствуетТребованиямИменованияСвойств(Псевдоним) Тогда Псевдоним = " КАК " + Псевдоним; Иначе Псевдоним = ""; @@ -6548,4 +6693,34 @@ КонецПроцедуры +Процедура УстановитьПараметрыОбработчикаПриВыборкеДанных(ДополнительныеПараметры, ОбработаныВсеАктуальныеДанные, ПараметрыОбработчикаОбновления, ПолноеИмяДокумента = Неопределено) + + Если ПараметрыОбработчикаОбновления = Неопределено Тогда + ПараметрыОбработчика = ПараметрыСеанса.ПараметрыОбработчикаОбновления; + Иначе + ПараметрыОбработчика = ПараметрыОбработчикаОбновления; + КонецЕсли; + + ПараметрыОбработчика = Новый Структура(ПараметрыОбработчика); + Если ПолноеИмяДокумента = Неопределено Тогда + ПараметрыОбработчика.ОбработаныАктуальныеДанные = ОбработаныВсеАктуальныеДанные; + Иначе + Если ПараметрыОбработчика.ОбработанныеТаблицыРегистраторов = Неопределено Тогда + ОбработанныеТаблицы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПолноеИмяДокумента); + Иначе + ОбработанныеТаблицы = Новый Массив(ПараметрыОбработчика.ОбработанныеТаблицыРегистраторов); + ОбработанныеТаблицы.Добавить(ПолноеИмяДокумента); + КонецЕсли; + ОбработанныеТаблицы = Новый ФиксированныйМассив(ОбработанныеТаблицы); + ПараметрыОбработчика.ОбработанныеТаблицыРегистраторов = ОбработанныеТаблицы; + КонецЕсли; + + Если ПараметрыОбработчикаОбновления = Неопределено Тогда + ПараметрыСеанса.ПараметрыОбработчикаОбновления = Новый ФиксированнаяСтруктура(ПараметрыОбработчика); + Иначе + ДополнительныеПараметры.ПараметрыОбработчикаОбновления = Новый ФиксированнаяСтруктура(ПараметрыОбработчика); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСД/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСД/Module.bsl index db1d1acb6..d018a9be2 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСД/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСД/Module.bsl @@ -39,7 +39,7 @@ Процедура ПриДобавленииПодсистемы(Описание) Экспорт Описание.Имя = "БиблиотекаСинхронизацииДанных"; - Описание.Версия = "1.0.1.41"; + Описание.Версия = "1.0.2.187"; Описание.ИдентификаторИнтернетПоддержки = "DSL"; Описание.РежимВыполненияОтложенныхОбработчиков = "Параллельно"; Описание.ПараллельноеОтложенноеОбновлениеСВерсии = "1.0.1.1"; diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl index c7653520e..39c58aa12 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl @@ -45,7 +45,7 @@ Процедура ПриДобавленииПодсистемы(Описание) Экспорт Описание.Имя = "СтандартныеПодсистемы"; - Описание.Версия = "3.1.7.382"; + Описание.Версия = "3.1.8.276"; Описание.ИдентификаторИнтернетПоддержки = "SSL"; Описание.РежимВыполненияОтложенныхОбработчиков = "Параллельно"; Описание.ПараллельноеОтложенноеОбновлениеСВерсии = "2.3.3.0"; diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/Module.bsl index 4029d6bf0..9aa80aa5e 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/Module.bsl @@ -34,7 +34,9 @@ Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); - Если Не ПараметрыКлиента.РазделениеВключено Или Не ПараметрыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда + + Если Не ОбщегоНазначенияКлиент.РазделениеВключено() + Или Не ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда ОбновлениеИнформационнойБазыКлиентПереопределяемый.ПриОпределенииВозможностиОбновления(ПараметрыКлиента.ВерсияДанныхОсновнойКонфигурации); КонецЕсли; @@ -89,12 +91,13 @@ // См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. Процедура ПередНачаломРаботыСистемы4(Параметры) Экспорт - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); - Если НЕ ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда + Если Не ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда ЗакрытьФормуИндикацииХодаОбновленияЕслиОткрыта(Параметры); Возврат; КонецЕсли; + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); + Если ПараметрыРаботыКлиента.Свойство("НеобходимоОбновлениеИнформационнойБазы") Тогда Если ПараметрыРаботыКлиента.Свойство("УпрощеннаяФормаОбновленияИБ") Тогда Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( @@ -132,8 +135,7 @@ // См. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы. Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); - Если НЕ ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда + Если Не ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат; КонецЕсли; diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl index c24810132..5520be967 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl @@ -274,19 +274,19 @@ // Объекты - см. ОбновлениеИнформационнойБазы.ДобавитьОбъектПланируемыйКУдалению.Объекты // // Пример: -// ОбновлениеИнформационнойБазы.ДобавитьОбъектПланируемыйКУдалению(Объекты, +// ОбновлениеИнформационнойБазы.ДобавитьОбъектПланируемыйКУдалению(Объекты, // "Справочник.УдалитьОчередьЗаданий"); // -// ОбновлениеИнформационнойБазы.ДобавитьОбъектПланируемыйКУдалению(Объекты, +// ОбновлениеИнформационнойБазы.ДобавитьОбъектПланируемыйКУдалению(Объекты, // "Перечисление.УдалитьСовместимостьНоменклатуры"); // -// ОбновлениеИнформационнойБазы.ДобавитьОбъектПланируемыйКУдалению(Объекты, +// ОбновлениеИнформационнойБазы.ДобавитьОбъектПланируемыйКУдалению(Объекты, // "Перечисление.ХозяйственныеОперации.УдалитьСписаниеТоваровПереданныхПартнерам"); // -// ОбновлениеИнформационнойБазы.ДобавитьОбъектПланируемыйКУдалению(Объекты, +// ОбновлениеИнформационнойБазы.ДобавитьОбъектПланируемыйКУдалению(Объекты, // "БизнесПроцесс.Задание.ТочкаМаршрута.УдалитьВернутьИсполнителю"); // -// ОбновлениеИнформационнойБазы.ДобавитьОбъектПланируемыйКУдалению(Объекты, +// ОбновлениеИнформационнойБазы.ДобавитьОбъектПланируемыйКУдалению(Объекты, // "РегистрСведений.ВерсииОбъектов.Объект", // Новый ОписаниеТипов("СправочникСсылка.ФизическиеЛица, // |ДокументСсылка.НачислениеЗарплаты")); diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl index 5a0a292f2..e84c3bf07 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl @@ -100,7 +100,7 @@ Возврат ДополнительныеПараметры.Возврат; КонецЕсли; - ПараметрЗапускаКлиента = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере(Ложь).Получить("ПараметрЗапуска"); + ПараметрЗапускаКлиента = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ПараметрЗапуска"); ОтладкаОтложенногоОбновления = СтрНайти(НРег(ПараметрЗапускаКлиента), НРег("ОтладкаОтложенногоОбновления")) > 0; РежимВыполненияОтложенногоОбновления = РежимВыполненияОтложенногоОбновления(ПараметрыОбновления); ВыполнитьОтложенноеОбновлениеСейчас = Не ОтладкаОтложенногоОбновления И РежимВыполненияОтложенногоОбновления = "Монопольно"; @@ -120,11 +120,15 @@ // // Параметры: // ИдентификаторБиблиотеки - Строка - имя конфигурации или идентификатор библиотеки. +// - Неопределено - будет получены версии всех подсистем. // ПолучитьВерсиюОбщихДанных - Булево - если указать Истина, то при работе в модели сервиса будет // возвращена версия в общих данных. // // Возвращаемое значение: // Строка - версия. +// Соответствие из КлючИЗначение - если параметр ИдентификаторБиблиотеки неопределено: +// * Ключ - Строка - имя подсистемы +// * Значение - Строка - версия подсистемы // // Пример использования: // ВерсияКонфигурацииИБ = ВерсияИБ(Метаданные.Имя); @@ -145,27 +149,51 @@ КонецЕсли; + ВсеВерсииПодсистем = (ИдентификаторБиблиотеки = Неопределено); + Если ВсеВерсииПодсистем И Не СтандартнаяОбработка Тогда + Возврат Результат; + КонецЕсли; + Если СтандартнаяОбработка Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ - | ВерсииПодсистем.Версия + | ВерсииПодсистем.Версия, + | ВерсииПодсистем.ИмяПодсистемы |ИЗ | РегистрСведений.ВерсииПодсистем КАК ВерсииПодсистем |ГДЕ - | ВерсииПодсистем.ИмяПодсистемы = &ИмяПодсистемы"; + | &Условие"; - Запрос.УстановитьПараметр("ИмяПодсистемы", ИдентификаторБиблиотеки); + Если ВсеВерсииПодсистем Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", "ИСТИНА"); + Иначе + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", "ВерсииПодсистем.ИмяПодсистемы = &ИмяПодсистемы"); + Запрос.УстановитьПараметр("ИмяПодсистемы", ИдентификаторБиблиотеки); + КонецЕсли; ТаблицаЗначений = Запрос.Выполнить().Выгрузить(); Результат = ""; Если ТаблицаЗначений.Количество() > 0 Тогда - Результат = СокрЛП(ТаблицаЗначений[0].Версия); + Если Не ВсеВерсииПодсистем Тогда + Результат = СокрЛП(ТаблицаЗначений[0].Версия); + Иначе + ВерсииПодсистем = Новый Соответствие; + Для Каждого СтрокаВерсия Из ТаблицаЗначений Цикл + ВерсииПодсистем.Вставить(СтрокаВерсия.ИмяПодсистемы, СокрЛП(СтрокаВерсия.Версия)); + КонецЦикла; + + Возврат ВерсииПодсистем; + КонецЕсли; КонецЕсли; КонецЕсли; - Возврат ?(ПустаяСтрока(Результат), "0.0.0.0", Результат); + Если ВсеВерсииПодсистем Тогда + Возврат Неопределено; + Иначе + Возврат ?(ПустаяСтрока(Результат), "0.0.0.0", Результат); + КонецЕсли; КонецФункции @@ -556,15 +584,16 @@ ОбработчикиВыполнялись = Истина; Обработанные = Новый Массив; Пока ОбработчикиВыполнялись Цикл - ОбработчикиВыполнялись = ВыполнитьОтложенныйОбработчикОбновления(ПараметрыОбновления); + ОбработчикиВыполнялись = ВыполнитьОтложенныйОбработчикОбновления(ПараметрыОбновления); // @skip-check query-in-loop - выполнение отложенных обработчиков. - ОчередиДляОчистки = ОчередиДляОчистки(Обработанные); + ОчередиДляОчистки = ОчередиДляОчистки(Обработанные); // @skip-check query-in-loop - получение актуальных данных об обработанных очередях. ОбщегоНазначенияКлиентСервер.РазностьМассивов(ОчередиДляОчистки, Обработанные); ОчиститьОбработанныеОчереди(ОчередиДляОчистки, Обработанные, СведенияОбОбновлении); Если ОбработчикиВыполнялись Тогда СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); Если СведенияОбОбновлении.ОтложенноеОбновлениеЗавершеноУспешно <> Неопределено Тогда + ОчиститьТранзакцииЗапускаОбработчиков(); Прервать; КонецЕсли; КонецЕсли; @@ -827,6 +856,16 @@ // * СеансОбновления - Структура // * ОписаниеПотоков - см. НовоеОписаниеПотоковРегистрацииДанныхОтложенногоОбновления // * ВерсияУдалениеПатчей - Строка +// * ДлительностьЭтаповОбновления - Структура: +// ** Критичные - Структура: +// *** Начало - Дата +// *** Конец - Дата +// ** Обычные - Структура: +// *** Начало - Дата +// *** Конец - Дата +// ** Некритичные - Структура: +// *** Начало - Дата +// *** Конец - Дата // Функция СведенияОбОбновленииИнформационнойБазы() Экспорт @@ -936,8 +975,11 @@ ПараметрыИнициализированы = Ложь; Обработчики = ОбработчикиДляОтложеннойРегистрацииДанных(); + СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); + ВерсииПодсистемНаНачалоОбновления = СведенияОбОбновлении.ВерсииПодсистемНаНачалоОбновления; Для Каждого Обработчик Из Обработчики Цикл + ВерсияПодсистемыНаНачалоОбновления = ВерсииПодсистемНаНачалоОбновления[Обработчик.ИмяБиблиотеки]; Если Не ПараметрыИнициализированы Тогда ПараметрыОбработчикаСтруктура = ОбновлениеИнформационнойБазы.ОсновныеПараметрыОтметкиКОбработке(); @@ -948,6 +990,9 @@ ПараметрыОбработчикаСтруктура.Очередь = Обработчик.ОчередьОтложеннойОбработки; ПараметрыОбработчикаСтруктура.ИмяОбработчика = Обработчик.ИмяОбработчика; ПараметрыОбработчикаСтруктура.Вставить("ДанныеОбработчика", Новый Соответствие); + ПараметрыОбработчикаСтруктура.Вставить("АктуальныеДанные", ОбновлениеИнформационнойБазы.ПараметрыВыборкиАктуальныхДанных()); + ПараметрыОбработчикаСтруктура.Вставить("ЗарегистрированныеТаблицыРегистраторов", Новый Соответствие); + ПараметрыОбработчикаСтруктура.Вставить("ВерсияПодсистемыНаНачалоОбновления", ВерсияПодсистемыНаНачалоОбновления); Если Обработчик.Многопоточный Тогда ПараметрыОбработчикаСтруктура.ПараметрыВыборки = @@ -982,21 +1027,28 @@ |""%3"".'"), Обработчик.ПроцедураЗаполненияДанныхОбновления, Обработчик.ИмяОбработчика, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписатьОшибку(ТекстОшибки); Свойства = Новый Структура; Свойства.Вставить("Статус", Перечисления.СтатусыОбработчиковОбновления.Ошибка); Свойства.Вставить("ИнформацияОбОшибке", ТекстОшибки); УстановитьСвойстваОбработчика(Обработчик.ИмяОбработчика, Свойства); - + ВызватьИсключение; КонецПопытки; ОписаниеОбрабатываемыхДанных = НовоеОписаниеОбрабатываемыхДанных(Обработчик.Многопоточный); ОписаниеОбрабатываемыхДанных.ДанныеОбработчика = ПараметрыОбработчикаСтруктура.ДанныеОбработчика; ОписаниеОбрабатываемыхДанных.ИмяОбработчика = Обработчик.ИмяОбработчика; + ОписаниеОбрабатываемыхДанных.АктуальныеДанные = ПараметрыОбработчикаСтруктура.АктуальныеДанные; + Если ЗначениеЗаполнено(ПараметрыОбработчикаСтруктура.ЗарегистрированныеТаблицыРегистраторов) Тогда + ЗарегистрированныеТаблицы = Новый Массив; + Для Каждого КлючИЗначение Из ПараметрыОбработчикаСтруктура.ЗарегистрированныеТаблицыРегистраторов Цикл + ЗарегистрированныеТаблицы.Добавить(КлючИЗначение.Значение); + КонецЦикла; + КонецЕсли; + ОписаниеОбрабатываемыхДанных.ЗарегистрированныеТаблицыРегистраторов = ЗарегистрированныеТаблицы; Если Обработчик.Многопоточный Тогда ОписаниеОбрабатываемыхДанных.ПараметрыВыборки = ПараметрыОбработчикаСтруктура.ПараметрыВыборки; @@ -1074,7 +1126,7 @@ Если РазрешеноМногопоточноеОбновление() Тогда Количество = 0; ИмяПараметра = "ЧислоПотоковОбновления="; - Параметры = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере(Ложь).Получить("ПараметрЗапуска"); + Параметры = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ПараметрЗапуска"); ПозицияПараметра = СтрНайти(Параметры, ИмяПараметра); Если ПозицияПараметра > 0 Тогда @@ -1120,6 +1172,7 @@ ИтерацииОбновления = Новый Массив; ОписанияПодсистем = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем(); + ВерсииПодсистем = ВерсияИБ(Неопределено); Для каждого ИмяПодсистемы Из ОписанияПодсистем.Порядок Цикл ОписаниеПодсистемы = ОписанияПодсистем.ПоИменам.Получить(ИмяПодсистемы); Если НЕ ЗначениеЗаполнено(ОписаниеПодсистемы.ОсновнойСерверныйМодуль) Тогда @@ -1131,7 +1184,16 @@ ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(), ОписаниеПодсистемы.Имя = ИмяОсновнойКонфигурации); ИтерацияОбновления.ИмяОсновногоСерверногоМодуля = ОписаниеПодсистемы.ОсновнойСерверныйМодуль; ИтерацияОбновления.ОсновнойСерверныйМодуль = Модуль; - ИтерацияОбновления.ПредыдущаяВерсия = ВерсияИБ(ОписаниеПодсистемы.Имя); + Если Не ЗначениеЗаполнено(ВерсииПодсистем) Тогда + ИтерацияОбновления.ПредыдущаяВерсия = "0.0.0.0"; + Иначе + ПредыдущаяВерсия = ВерсииПодсистем[ОписаниеПодсистемы.Имя]; + Если ПредыдущаяВерсия = Неопределено Тогда + ИтерацияОбновления.ПредыдущаяВерсия = "0.0.0.0"; + Иначе + ИтерацияОбновления.ПредыдущаяВерсия = ВерсииПодсистем[ОписаниеПодсистемы.Имя]; + КонецЕсли; + КонецЕсли; ИтерацииОбновления.Добавить(ИтерацияОбновления); Модуль.ПриДобавленииОбработчиковОбновления(ИтерацияОбновления.Обработчики); @@ -1144,9 +1206,8 @@ КонецЦикла; Если ИтерацияОбновлениеОсновнойПодсистемы = Неопределено И ИмяОсновнойКонфигурации = "БиблиотекаСтандартныхПодсистем" Тогда - ТекстСообщения = НСтр("ru = 'Файл поставки 1С:Библиотека стандартных подсистем не предназначен для создания - |информационных баз по шаблону. Перед использованием необходимо - |ознакомиться с документацией на ИТС (http://its.1c.ru/db/bspdoc)'"); + ТекстСообщения = НСтр("ru = 'Файл поставки 1С:Библиотека стандартных подсистем не предназначен для создания информационных баз по шаблону. + |Перед использованием необходимо ознакомиться с документацией на ИТС (https://its.1c.eu/db/bspdoc)'"); ВызватьИсключение ТекстСообщения; КонецЕсли; @@ -1333,6 +1394,11 @@ ВызватьИсключение ТекстОшибок; КонецЕсли; + Если (ТипыОбработчиков = Неопределено Или ТолькоОтложенные) + И (Не ОбщегоНазначения.РазделениеВключено() Или Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных()) Тогда + Константы.ПорядокОбрабатываемыхДанных.Установить(Перечисления.ПорядокОбработчиковОбновления.Критичный); + КонецЕсли; + Если Не ТолькоМонопольные И ЗаполнитьВерсииПодсистем Тогда СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); СведенияОбОбновлении.ВерсииПодсистемНаНачалоОбновления = ВерсииПодсистемНаНачалоОбновления; @@ -2005,7 +2071,7 @@ ИмяКлючевогоРеквизита = НастройкиЗаполнения.ПереопределяемыеНастройки.ИмяКлючевогоРеквизита; - СуществующиеЭлементы = СуществующиеПоставляемыеЭлементы(ПредопределенныеДанные, НастройкиЗаполнения, МенеджерОбъекта, МетаданныеОбъекта); + СуществующиеЭлементы = СуществующиеПоставляемыеЭлементы(ПредопределенныеДанные, НастройкиЗаполнения, МенеджерОбъекта, МетаданныеОбъекта); // @skip-check query-in-loop - механизм обновления ТабличныеЧасти = Новый Массив; ОбъектМетаданныхТабличныеЧасти = МетаданныеОбъекта.ТабличныеЧасти; // КоллекцияОбъектовМетаданных из ОбъектМетаданныхТабличнаяЧасть @@ -2311,7 +2377,7 @@ Попытка РегистрыСведений.ПараметрыРаботыПрограммы.ЗагрузитьОбновитьПараметрыРаботыПрограммы(); Исключение - ЗаписатьОшибку(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьОшибку(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; КонецЕсли; @@ -2481,7 +2547,7 @@ // Выполняем все обработчики обновления для подсистем конфигурации. Для Каждого ИтерацияОбновления Из ИтерацииОбновления Цикл - ИтерацияОбновления.ВыполненныеОбработчики = ВыполнитьИтерациюОбновления(ИтерацияОбновления, Параметры); + ИтерацияОбновления.ВыполненныеОбработчики = ВыполнитьИтерациюОбновления(ИтерацияОбновления, Параметры); // @skip-check query-in-loop - выполнение монопольных и оперативных обработчиков. КонецЦикла; // Очистка списка новых подсистем. @@ -2566,6 +2632,14 @@ ЗапланироватьОтложенноеОбновление(); КонецЕсли; + Если ОбщегоНазначения.РазделениеВключено() И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Задания = РегламентныеЗаданияСервер.НайтиЗадания(Новый Структура("Метаданные", Метаданные.РегламентныеЗадания.УстановкаПорядкаОтложенногоОбновленияВМоделиСервиса)); + Для Каждого Задание Из Задания Цикл + РегламентныеЗаданияСервер.ИзменитьЗадание(Задание.УникальныйИдентификатор, + Новый Структура("Использование", Истина)); + КонецЦикла; + КонецЕсли; + ОпределитьВыводОписанияОбновлений(ВыводитьОписаниеОбновлений); // Сброс неуспешного статуса обновления конфигурации при завершении обновления вручную (без скрипта). @@ -2762,7 +2836,7 @@ ПараметрыОбновленияИБ = Новый Структура; ПараметрыОбновленияИБ.Вставить("ИсключениеПриНевозможностиБлокировкиИБ", Ложь); ПараметрыОбновленияИБ.Вставить("БлокировкаИБ", БлокировкаИБ); - ПараметрыОбновленияИБ.Вставить("ПараметрыКлиентаНаСервере", СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере(Ложь)); + ПараметрыОбновленияИБ.Вставить("ПараметрыКлиентаНаСервере", СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере()); // Установка монопольного режима до запуска фонового выполнения обновления. Попытка @@ -2773,8 +2847,8 @@ Результат = Новый Структура; Результат.Вставить("Статус", "Ошибка"); Результат.Вставить("БлокировкаИБ", ПараметрыОбновленияИБ.БлокировкаИБ); - Результат.Вставить("КраткоеПредставлениеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - Результат.Вставить("ПодробноеПредставлениеОшибки", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + Результат.Вставить("КраткоеПредставлениеОшибки", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + Результат.Вставить("ПодробноеПредставлениеОшибки", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат Результат; КонецПопытки; @@ -2830,8 +2904,8 @@ Если ИнформацияОбОшибке <> Неопределено Тогда РезультатОбновления = Новый Структура; - РезультатОбновления.Вставить("КраткоеПредставлениеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - РезультатОбновления.Вставить("ПодробноеПредставлениеОшибки", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + РезультатОбновления.Вставить("КраткоеПредставлениеОшибки", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + РезультатОбновления.Вставить("ПодробноеПредставлениеОшибки", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ИначеЕсли Не ПараметрыОбновленияИБ.ВФоне Тогда РезультатОбновления = Результат; Иначе @@ -2917,7 +2991,7 @@ | |Подробности ошибки: |%1'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписатьОшибку(Сообщение); @@ -2930,7 +3004,7 @@ И ОбщегоНазначения.ИнформационнаяБазаФайловая() И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда - ПараметрЗапускаКлиента = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере(Ложь).Получить("ПараметрЗапуска"); + ПараметрЗапускаКлиента = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ПараметрЗапуска"); Если СтрНайти(ПараметрЗапускаКлиента, "РегламентныеЗаданияОтключены") = 0 Тогда БлокировкаИБ.Ошибка = "ЗаблокироватьВыполнениеРегламентныхЗаданий"; Иначе @@ -2952,7 +3026,7 @@ Если МонопольныйРежим() Тогда Пока ТранзакцияАктивна() Цикл - ОтменитьТранзакцию(); + ОтменитьТранзакцию(); // АПК:325 Отмена незакрытых транзакций. КонецЦикла; УстановитьМонопольныйРежим(Ложь); @@ -3029,7 +3103,7 @@ НовыеОбъектыМетаданных = Новый Массив; Для Каждого Подсистема Из ВсеНовыеПодсистемы Цикл - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Подсистема); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Подсистема); Если ОбъектМетаданных = Неопределено Тогда Продолжить; КонецЕсли; @@ -3129,7 +3203,10 @@ | РегистрСведений.ВерсииПодсистем КАК ВерсииПодсистем |ГДЕ | ВерсииПодсистем.ЭтоОсновнаяКонфигурация = ИСТИНА"; + // АПК:1328-выкл Нет конкурентной работы, заполнение признака основной конфигурации выполняется + // только сеансом выполняющим обновления и который может быть только один. РезультатЗапроса = Запрос.Выполнить(); + // АПК:1328-вкл ИначеЕсли МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = Неопределено Тогда // Отсутствует подсистема ОбновлениеВерсииИБВМоделиСервиса. Возврат; @@ -3173,7 +3250,7 @@ НаборЗаписей[0].ИмяБиблиотеки = Метаданные.Имя; - НаборЗаписей.Записать(); + НаборЗаписей.Записать(); // АПК:1327 нет конкурентной работы с регистром КонецЦикла; КонецЕсли; КонецЕсли; @@ -3210,7 +3287,7 @@ |произошла ошибка: |""%2"".'"), ИмяОбработчика, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); ВызватьИсключение; КонецПопытки; @@ -3577,7 +3654,7 @@ // Процедура ВыполнитьОтложенноеОбновление() Экспорт - ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(); + ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ОтложенноеОбновлениеИБ); Если ОбновлениеИнформационнойБазыСлужебныйПовтИсп.НеобходимоОбновлениеИнформационнойБазы() Тогда Возврат; @@ -3617,34 +3694,37 @@ ОтменитьВыполнениеВсехПотоков(Группы); Пока ОбработчикиВыполнялись Цикл - Поток = ДобавитьПотокОбработчикаОтложенногоОбновления(СведенияОбОбновлении); + Поток = ДобавитьПотокОбработчикаОтложенногоОбновления(СведенияОбОбновлении); // @skip-check query-in-loop - многопоточное обновление. - ОчередиДляОчистки = ОчередиДляОчистки(Обработанные); + ОчередиДляОчистки = ОчередиДляОчистки(Обработанные); // @skip-check query-in-loop - получение актуальных данных об обработанных очередях. ОбщегоНазначенияКлиентСервер.РазностьМассивов(ОчередиДляОчистки, Обработанные); ОчиститьОбработанныеОчереди(ОчередиДляОчистки, Обработанные, СведенияОбОбновлении); Если ТипЗнч(Поток) = Тип("СтрокаТаблицыЗначений") Тогда ВыполнитьПоток(Группы, Поток); - ОжидатьСвободныйПоток(Группы); + ОжидатьСвободныйПоток(Группы); // @skip-check query-in-loop - многопоточное обновление. ИначеЕсли Поток = Истина Тогда - ОжидатьЗавершениеЛюбогоПотока(Группы); + ОжидатьЗавершениеЛюбогоПотока(Группы); // @skip-check query-in-loop - многопоточное обновление. ИначеЕсли Поток = Ложь Тогда ОбработчикиВыполнялись = Ложь; - ОжидатьЗавершениеВсехПотоков(Группы); + ОжидатьЗавершениеВсехПотоков(Группы); // @skip-check query-in-loop - многопоточное обновление. + Прервать; + ИначеЕсли Поток = "ПрерватьВыполнение" Тогда + ОжидатьЗавершениеВсехПотоков(Группы); // @skip-check query-in-loop - многопоточное обновление. Прервать; КонецЕсли; Если ДатаПоследнейПроверки = Неопределено Или ТекущаяДатаСеанса() - ДатаПоследнейПроверки > 600 Тогда ДатаПоследнейПроверки = ТекущаяДатаСеанса(); - ОчиститьПрогрессОбработкиЗаИнтервалыПредыдущегоДня(); + ОчиститьПрогрессОбработкиЗаИнтервалыПредыдущегоДня(); // @skip-check query-in-loop - многопоточное обновление. КонецЕсли; Задание = РегламентныеЗаданияСервер.Задание(Метаданные.РегламентныеЗадания.ОтложенноеОбновлениеИБ); ТребуетсяВыполнение = Задание.Расписание.ТребуетсяВыполнение(ТекущаяДатаСеанса()); Если Не ТребуетсяВыполнение Или Не ФорсироватьОбновление(СведенияОбОбновлении) Тогда - ОжидатьЗавершениеВсехПотоков(Группы); + ОжидатьЗавершениеВсехПотоков(Группы); // @skip-check query-in-loop - многопоточное обновление. УдалитьВсеПотокиОбновления(); Прервать; КонецЕсли; @@ -3655,19 +3735,28 @@ ОбработчикиВыполнялись = ВыполнитьОтложенныйОбработчикОбновления(); КонецЕсли; Исключение - ЗаписатьОшибку(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьОшибку(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ОтменитьВыполнениеВсехПотоков(Группы); УдалитьВсеПотокиОбновления(); КонецПопытки; + СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); Если Не ОбработчикиВыполнялись Или ВыполненыВсеОтложенныеОбработчики(СведенияОбОбновлении) Тогда УдалитьВсеПотокиОбновления(); ОтключитьОтложенноеОбновление(); + ОчиститьТранзакцииЗапускаОбработчиков(); ВыполнитьДействияПослеОтложенногоОбновленияИнформационнойБазы(); КонецЕсли; КонецПроцедуры +Процедура ОчиститьТранзакцииЗапускаОбработчиков() + + НаборЗаписей = РегистрыСведений.ФиксацияОбработкиДанныхОбработчиками.СоздатьНаборЗаписей(); + НаборЗаписей.Записать(); + +КонецПроцедуры + Процедура ОчиститьПрогрессОбработкиЗаИнтервалыПредыдущегоДня() Запрос = Новый Запрос; @@ -3744,6 +3833,27 @@ Функция НайтиОбработчикОбновления(КонтекстОбработчика, ПараметрыОбновления = Неопределено) СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); + ТекущийПорядок = ТекущийПорядокОбновления(); + ДлительностьЭтаповОбновления = СведенияОбОбновлении.ДлительностьЭтаповОбновления; + ЗаписатьДлительностьЭтапов = Ложь; + Если Не ЗначениеЗаполнено(ДлительностьЭтаповОбновления.Критичные.Начало) Тогда + ДлительностьЭтаповОбновления.Критичные.Начало = ТекущаяДатаСеанса(); + ЗаписатьДлительностьЭтапов = Истина; + ИначеЕсли ОбщегоНазначения.РазделениеВключено() Тогда + Если ТекущийПорядок = Перечисления.ПорядокОбработчиковОбновления.Обычный + И Не ЗначениеЗаполнено(ДлительностьЭтаповОбновления.Обычные.Начало) Тогда + ДлительностьЭтаповОбновления.Обычные.Начало = ТекущаяДатаСеанса(); + ЗаписатьДлительностьЭтапов = Истина; + ИначеЕсли ТекущийПорядок = Перечисления.ПорядокОбработчиковОбновления.Некритичный + И Не ЗначениеЗаполнено(ДлительностьЭтаповОбновления.Некритичные.Начало) Тогда + ДлительностьЭтаповОбновления.Некритичные.Начало = ТекущаяДатаСеанса(); + ЗаписатьДлительностьЭтапов = Истина; + КонецЕсли; + КонецЕсли; + + Если ЗаписатьДлительностьЭтапов Тогда + ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении); + КонецЕсли; // Получение групп, по которым еще не выполнены все обработчики обновления. Запрос = Новый Запрос; @@ -3790,7 +3900,10 @@ | ОбработчикиОбновления.ОбрабатываемыеДанные КАК ОбрабатываемыеДанные, | ОбработчикиОбновления.СтатистикаВыполнения КАК СтатистикаВыполнения, | ОбработчикиОбновления.РежимВыполненияОтложенногоОбработчика КАК РежимВыполненияОтложенногоОбработчика, - | ОбработчикиОбновления.ИзменяемыеОбъекты КАК ИзменяемыеОбъекты + | ОбработчикиОбновления.ИзменяемыеОбъекты КАК ИзменяемыеОбъекты, + | ОбработчикиОбновления.Порядок, + | ОбработчикиОбновления.ИспользуетсяРазделениеПоКритичности, + | ОбработчикиОбновления.ОбработаныАктуальныеДанные |ИЗ | РегистрСведений.ОбработчикиОбновления КАК ОбработчикиОбновления |ГДЕ @@ -3804,9 +3917,41 @@ Пока Истина Цикл Результат = ОбработчикДляВыполнения(Обработчики, ГруппыОбработчиковИЗависимость, СведенияОбОбновлении); + + Если Результат.Свойство("ПерейтиКСледующемуПорядкуОбновления") Тогда + + Если ТекущийПорядок = Перечисления.ПорядокОбработчиковОбновления.Критичный Тогда + ТекущийПорядок = Перечисления.ПорядокОбработчиковОбновления.Обычный; + ИначеЕсли ТекущийПорядок = Перечисления.ПорядокОбработчиковОбновления.Обычный Тогда + ТекущийПорядок = Перечисления.ПорядокОбработчиковОбновления.Некритичный; + КонецЕсли; + + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); + + Если ТекущийПорядок = Перечисления.ПорядокОбработчиковОбновления.Обычный Тогда + ДлительностьЭтаповОбновления.Критичные.Конец = ТекущаяДатаСеанса(); + Если Не РазделениеВключено Тогда + ДлительностьЭтаповОбновления.Обычные.Начало = ТекущаяДатаСеанса(); + КонецЕсли; + Иначе + ДлительностьЭтаповОбновления.Обычные.Конец = ТекущаяДатаСеанса(); + Если Не РазделениеВключено Тогда + ДлительностьЭтаповОбновления.Некритичные.Начало = ТекущаяДатаСеанса(); + КонецЕсли; + КонецЕсли; + ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении); + + Если РазделениеВключено Тогда + Возврат "ПрерватьВыполнение"; + Иначе + Константы.ПорядокОбрабатываемыхДанных.Установить(ТекущийПорядок); + КонецЕсли; + + Продолжить; + КонецЕсли; + Если Результат.ОбработчикДляВыполнения = Неопределено - И Результат.ЕстьНевыполненные - И Не Результат.ПрерватьВыполнение Тогда + И Результат.ЕстьНевыполненные Тогда СведенияОбОбновлении.ТекущаяИтерацияОбновления = СведенияОбОбновлении.ТекущаяИтерацияОбновления + 1; ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении); Иначе @@ -3815,12 +3960,13 @@ КонецЦикла; ОбработчикДляВыполнения = Результат.ОбработчикДляВыполнения; - Если ОбработчикДляВыполнения = Неопределено Или Результат.ПрерватьВыполнение Тогда - Если Результат.ЕстьВыполняющиеся И Не Результат.ПрерватьВыполнение Тогда + Если ОбработчикДляВыполнения = Неопределено Тогда + Если Результат.ЕстьВыполняющиеся Тогда Возврат Истина; Иначе СведенияОбОбновлении.ВремяОкончаниеОтложенногоОбновления = ТекущаяДатаСеанса(); СведенияОбОбновлении.ОтложенноеОбновлениеЗавершеноУспешно = Результат.ЗавершеноУспешно; + ДлительностьЭтаповОбновления.Некритичные.Конец = ТекущаяДатаСеанса(); ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении); Константы.ОтложенноеОбновлениеЗавершеноУспешно.Установить(Результат.ЗавершеноУспешно); Если Не ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда @@ -3863,6 +4009,8 @@ Возврат; КонецЕсли; + НовыеСведенияОбОбновлении = НовыеСведенияОбОбновлении(); + Константы.ОтложенноеОбновлениеЗавершеноУспешно.Установить(Ложь); СведенияОбОбновлении.Вставить("ВремяНачалаОбновления"); @@ -3885,6 +4033,8 @@ СведенияОбОбновлении.Вставить("ЧитаемыеИИзменяемыеТаблицы", Новый Соответствие); СведенияОбОбновлении.ВерсияДереваОбработчиков = Метаданные.Версия; + СведенияОбОбновлении.Вставить("ДлительностьЭтаповОбновления", НовыеСведенияОбОбновлении.ДлительностьЭтаповОбновления); + ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении); ЗаписатьСведенияОБлокируемыхОбъектах(НовыеСведенияОБлокируемыхОбъектах()); @@ -4015,6 +4165,10 @@ Итерация = 1; ЕстьОбработчикиТолькоГлавногоУзла = Ложь; СведенияОБлокируемыхОбъектах = СведенияОБлокируемыхОбъектах(); + + ОтборКритичных = Новый Структура("Порядок", Перечисления.ПорядокОбработчиковОбновления.Критичный); + ЕстьКритичныеОбработчики = (ОбработчикиПоВерсиям.НайтиСтроки(ОтборКритичных, Истина).Количество() > 0); + Для Каждого СтрокаВерсия Из ОбработчикиПоВерсиям Цикл ЗаполнитьБлокируемыеОбъекты(СтрокаВерсия, СведенияОБлокируемыхОбъектах); @@ -4058,7 +4212,6 @@ Для Каждого Обработчик Из СтрокаВерсия.Строки Цикл ПроверитьСвойстваОтложенногоОбработчика(Обработчик, ТекущийРежимВыполнения, ТекстОшибок); - Если ТекущийРежимВыполнения = "Параллельно" Тогда ЗаполнитьЧитаемыеИИзменяемыеДанные(Обработчик, ЧитаемыеИИзменяемыеТаблицы); КонецЕсли; @@ -4068,6 +4221,9 @@ ЗаполнитьЗначенияСвойств(Запись, Обработчик, , "РежимВыполнения,ВерсияПорядок"); РежимВыполнения = Перечисления.РежимыВыполненияОбработчиков[Обработчик.РежимВыполнения]; + Если Не ЗначениеЗаполнено(Запись.Порядок) Тогда + Запись.Порядок = Перечисления.ПорядокОбработчиковОбновления.Обычный; + КонецЕсли; Запись.ВерсияПорядок = СтрокаВерсия.ВерсияПорядок; Запись.РежимВыполнения = РежимВыполнения; Запись.Статус = Перечисления.СтатусыОбработчиковОбновления.НеВыполнялся; @@ -4078,6 +4234,9 @@ Запись.РежимВыполненияОтложенногоОбработчика = Перечисления.РежимыВыполненияОтложенныхОбработчиков.Параллельно; Иначе Запись.РежимВыполненияОтложенногоОбработчика = Перечисления.РежимыВыполненияОтложенныхОбработчиков.Последовательно; + Если ЗначениеЗаполнено(ПараллельноСВерсии) И ЕстьКритичныеОбработчики Тогда + Запись.Порядок = Перечисления.ПорядокОбработчиковОбновления.Критичный; + КонецЕсли; КонецЕсли; // Определение значения константы ОтложенноеОбновлениеВГлавномУзлеЗавершеноУспешно. @@ -4275,17 +4434,39 @@ ЗависимостьГруппОбработчиков = СведенияОбОбновлении.ЗависимостьГруппОбработчиков; ТекущаяИтерация = СведенияОбОбновлении.ТекущаяИтерацияОбновления; + ТекущийПорядок = ТекущийПорядокОбновления(); + + Выполняемые = Новый Соответствие; + Выполняемые.Вставить(Перечисления.ПорядокОбработчиковОбновления.Критичный, Истина); + Если ТекущийПорядок = Перечисления.ПорядокОбработчиковОбновления.Обычный Тогда + Выполняемые.Вставить(Перечисления.ПорядокОбработчиковОбновления.Обычный, Истина); + ИначеЕсли ТекущийПорядок = Перечисления.ПорядокОбработчиковОбновления.Некритичный Тогда + Выполняемые.Вставить(Перечисления.ПорядокОбработчиковОбновления.Обычный, Истина); + Выполняемые.Вставить(Перечисления.ПорядокОбработчиковОбновления.Некритичный, Истина); + КонецЕсли; ТекущаяГруппаОбновления = Неопределено; ОбработчикДляВыполнения = Неопределено; ПропускаемыеГруппы = Новый Массив; - ЗавершеноУспешно = Истина; ЕстьВыполняющиеся = Ложь; ЕстьОшибки = Ложь; ЕстьНевыполненные = Ложь; - ПрерватьВыполнение = Ложь; ВыполняющийсяМногопоточныйОбработчик = Неопределено; Для Каждого Обработчик Из Обработчики Цикл + Если Обработчик.ЧислоПопыток >= МаксимумПопытокОбновления(Обработчик) Тогда + ЕстьОшибки = Истина; + Продолжить; + КонецЕсли; + + // Фильтрация обработчиков не подходящих под текущий порядок выполнения. + Если Выполняемые[Обработчик.Порядок] = Неопределено Тогда + Продолжить; + ИначеЕсли ТекущийПорядок <> Перечисления.ПорядокОбработчиковОбновления.Некритичный + И Обработчик.ИспользуетсяРазделениеПоКритичности + И Обработчик.ОбработаныАктуальныеДанные Тогда + Продолжить; + КонецЕсли; + Если Обработчик.ИтерацияЗапуска = ТекущаяИтерация Тогда // Обработчик в этой итерации обновления уже запускался. ЕстьНевыполненные = Истина; @@ -4310,11 +4491,7 @@ ИначеЕсли ТекущаяГруппаОбновления <> Обработчик.ГруппаОбновления Тогда // При переходе к следующей группе обновления делается проверка ошибок по предыдущей группе // и наличия многопоточных обработчиков, для которых есть порция обновления. - Если ВыполняющийсяМногопоточныйОбработчик = Неопределено Тогда - Если ЕстьОшибки Тогда - ЗавершеноУспешно = Ложь; - КонецЕсли; - Иначе + Если ВыполняющийсяМногопоточныйОбработчик <> Неопределено Тогда ОбработчикДляВыполнения = ВыполняющийсяМногопоточныйОбработчик; Прервать; КонецЕсли; @@ -4325,9 +4502,11 @@ И Не Обработчик.ОбработкаПорцииЗавершена Тогда Если Обработчик.Многопоточный Тогда Если ЕстьПорцииДляОбновления(Обработчик) Тогда + // Есть дополнительные порции для обработки в новых потоках, будет взят в работу + // при отсутствии других обработчиков, подходящих для выполнения. ВыполняющийсяМногопоточныйОбработчик = Обработчик; КонецЕсли; - ИначеЕсли ПотокиОбновления().Количество() = 0 Тогда + ИначеЕсли ПотокиОбновления().Количество() = 0 Тогда // @skip-check query-in-loop - получение актуального количества потоков. ОбработчикДляВыполнения = Обработчик; КонецЕсли; ЕстьВыполняющиеся = Истина; @@ -4338,18 +4517,6 @@ Продолжить; КонецЕсли; - МаксимумПопытокОбновления = МаксимумПопытокОбновления(Обработчик); - Если Обработчик.ЧислоПопыток >= МаксимумПопытокОбновления Тогда - Если Обработчик.Статус = Перечисления.СтатусыОбработчиковОбновления.Ошибка Тогда - ПрерватьВыполнение = Истина; - Продолжить; - ИначеЕсли ВсеОбработчикиЗациклились() Тогда - ОтметитьЗациклившиесяОбработчики(); - ПрерватьВыполнение = Истина; - Продолжить; - КонецЕсли; - КонецЕсли; - ОбработчикДляВыполнения = Обработчик; Прервать; КонецЦикла; @@ -4358,17 +4525,19 @@ ОбработчикДляВыполнения = ВыполняющийсяМногопоточныйОбработчик; КонецЕсли; - Если ЕстьОшибки Или ПрерватьВыполнение Тогда - ЗавершеноУспешно = Ложь; - КонецЕсли; - Результат = Новый Структура; Результат.Вставить("ОбработчикДляВыполнения", ОбработчикДляВыполнения); - Результат.Вставить("ЗавершеноУспешно", ЗавершеноУспешно); - Результат.Вставить("ПрерватьВыполнение", ПрерватьВыполнение); + Результат.Вставить("ЗавершеноУспешно", Не ЕстьОшибки); Результат.Вставить("ЕстьВыполняющиеся", ЕстьВыполняющиеся); Результат.Вставить("ЕстьНевыполненные", ЕстьНевыполненные); + Если ОбработчикДляВыполнения = Неопределено + И Не ЕстьВыполняющиеся + И Не ЕстьНевыполненные + И ТекущийПорядок <> Перечисления.ПорядокОбработчиковОбновления.Некритичный Тогда + Результат.Вставить("ПерейтиКСледующемуПорядкуОбновления"); + КонецЕсли; + Возврат Результат; КонецФункции @@ -4479,7 +4648,7 @@ // ОписаниеОбрабатываемыхДанных - см. НовоеОписаниеОбрабатываемыхДанных // // Возвращаемое значение: -// СтрокаТаблицыЗначений - см. НовоеОписаниеПотоков +// СтрокаТаблицыЗначений: см. НовоеОписаниеПотоков // Функция ДобавитьПотокРегистрацииДанныхОтложенногоОбновления(ОписаниеОбрабатываемыхДанных) @@ -4511,15 +4680,34 @@ Результат = ПолучитьИзВременногоХранилища(АдресРезультата); - ЗаполнитьЗначенияСвойств(ОписаниеОбрабатываемыхДанных, Результат); + ЗаполнитьЗначенияСвойств(ОписаниеОбрабатываемыхДанных, Результат,, "ЗарегистрированныеТаблицыРегистраторов"); ОписаниеОбрабатываемыхДанных.Статус = "Выполнено"; + Если ЗначениеЗаполнено(Результат.ЗарегистрированныеТаблицыРегистраторов) Тогда + ЗарегистрированныеТаблицы = Новый Массив; + Для Каждого КлючИЗначение Из Результат.ЗарегистрированныеТаблицыРегистраторов Цикл + ЗарегистрированныеТаблицы.Добавить(КлючИЗначение.Значение); + КонецЦикла; + КонецЕсли; + ОписаниеОбрабатываемыхДанных.ЗарегистрированныеТаблицыРегистраторов = ЗарегистрированныеТаблицы; + + ДлительностьРегистрацииДанных = 0; + Результат.Свойство("ДлительностьРегистрацииДанных", ДлительностьРегистрацииДанных); + Если ЭтоОписаниеДанныхМногопоточногоОбработчика(ОписаниеОбрабатываемыхДанных) Тогда ИсправитьПолныеИменаВПараметрахВыборки(ОписаниеОбрабатываемыхДанных.ПараметрыВыборки); КонецЕсли; + УказанФильтрАктуальныхДанных = УказанФильтрАктуальныхДанных(ОписаниеОбрабатываемыхДанных.АктуальныеДанные); ОбрабатываемыеДанные = Новый ХранилищеЗначения(ОписаниеОбрабатываемыхДанных, Новый СжатиеДанных(9)); - УстановитьСвойствоОбработчика(ОписаниеОбрабатываемыхДанных.ИмяОбработчика, "ОбрабатываемыеДанные", ОбрабатываемыеДанные); + + УстанавливаемыеСвойства = Новый Структура; + УстанавливаемыеСвойства.Вставить("ДлительностьРегистрацииДанных", ДлительностьРегистрацииДанных); + УстанавливаемыеСвойства.Вставить("ОбрабатываемыеДанные", ОбрабатываемыеДанные); + Если УказанФильтрАктуальныхДанных Тогда + УстанавливаемыеСвойства.Вставить("ИспользуетсяРазделениеПоКритичности", Истина); + КонецЕсли; + УстановитьСвойстваОбработчика(ОписаниеОбрабатываемыхДанных.ИмяОбработчика, УстанавливаемыеСвойства); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда Если Результат.ДанныеОбновления <> Неопределено Тогда @@ -4582,8 +4770,7 @@ // СведенияОбОбновлении - см. СведенияОбОбновленииИнформационнойБазы // // Возвращаемое значение: -// СтрокаТаблицыЗначений - см. НовоеОписаниеПотоков -// Булево - Истина, если обработчик не нужно выполнять или Ложь, если выполнение обработчиков нужно завершить. +// СтрокаТаблицыЗначений: см. НовоеОписаниеПотоков // Функция ДобавитьПотокОбработчикаОтложенногоОбновления(СведенияОбОбновлении) @@ -4591,7 +4778,7 @@ Пока Поток = Неопределено Цикл КонтекстОбработчика = НовыйКонтекстОбработчика(); - ОбработчикОбновления = НайтиОбработчикОбновления(КонтекстОбработчика); + ОбработчикОбновления = НайтиОбработчикОбновления(КонтекстОбработчика); // @skip-check query-in-loop - создание потока обновления. Если ТипЗнч(ОбработчикОбновления) = Тип("СтрокаТаблицыЗначений") Тогда Если КонтекстОбработчика.ВыполнитьОбработчик Тогда @@ -4611,7 +4798,7 @@ ДобавитьПотокОбработчикаОбновления(Поток, КонтекстОбработчика); КонецЕсли; Иначе - ЗавершитьВыполнениеОтложенногоОбработчика(КонтекстОбработчика, Неопределено); + ЗавершитьВыполнениеОтложенногоОбработчика(КонтекстОбработчика, Неопределено); // @skip-check query-in-loop - создание потока обновления. Поток = Неопределено; КонецЕсли; Иначе @@ -4748,11 +4935,11 @@ ПроверитьВложеннуюТранзакцию(КонтекстОбработчика.ТранзакцияАктивнаНаНачалоВыполнения, КонтекстОбработчика.ИмяОбработчика); Исключение - Результат.ИнформацияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Результат.ИнформацияОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); Результат.ЕстьНеЗакрытыеТранзакции = Истина; Пока ТранзакцияАктивна() Цикл - ОтменитьТранзакцию(); + ОтменитьТранзакцию(); // АПК:325 Отмена незакрытых транзакций. КонецЦикла; КонецПопытки; @@ -5070,7 +5257,7 @@ Функция ФорсироватьОбновление(СведенияОбОбновлении) Если Не ОбщегоНазначения.РазделениеВключено() Тогда - ПараметрЗапускаКлиента = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере(Ложь).Получить("ПараметрЗапуска"); + ПараметрЗапускаКлиента = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ПараметрЗапуска"); Если СтрНайти(НРег(ПараметрЗапускаКлиента), НРег("ФорсироватьОтложенноеОбновление")) > 0 Тогда Возврат Истина; Иначе @@ -5162,7 +5349,7 @@ // // Параметры: // Группы - Соответствие -// Поток - СтрокаТаблицыЗначений - описание потока, см. Потоки в НовоеОписаниеПотоков. +// Поток - СтрокаТаблицыЗначений: см. НовоеОписаниеПотоков // ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы, если есть. // Процедура ВыполнитьПоток(Группы, Поток, ИдентификаторФормы = Неопределено) @@ -5385,7 +5572,7 @@ // Описание группы потоков. // // Возвращаемое значение: -// Структура: +// ТаблицаЗначений: // * Группы - Соответствие из КлючИЗначение - описание групп потоков, где: // ** Ключ - Строка - имя группы. // ** Значение - см. НовоеОписаниеГруппыПотоков @@ -5417,7 +5604,7 @@ // Ожидать завершение потока в течение указанной длительности. // // Параметры: -// Поток - СтрокаТаблицыЗначений - поток, завершение которого необходимо ожидать. +// Поток - СтрокаТаблицыЗначений: см. НовоеОписаниеПотоков // Длительность - Число - максимальная длительность ожидания в секундах. // // Возвращаемое значение: @@ -5476,7 +5663,20 @@ ДополнительныеИсточникиДанных, СсылочныйОбъект, ТабличныйОбъект); + + // Так как параметр сеанса не устанавливается на время выборки данных, то добавляем в параметры выборки + // текущие параметры обработчика обновления. + Если Не ПараметрыВыборки.Свойство("ПараметрыОбработчикаОбновления") Тогда + ПараметрыВыборки.Вставить("ПараметрыОбработчикаОбновления", ПараметрыПоиска.КонтекстОбработчика.ПараметрыОбработчикаОбновления); + КонецЕсли; Данные = ВыбратьДанныеПорции(ПараметрыВыборки, Очередь, СсылочныйОбъект, ТабличныйОбъект); + + Если ПараметрыВыборки.ПараметрыОбработчикаОбновления.ОбработаныАктуальныеДанные = Истина Тогда + РезультатПоиска.ОбработаныАктуальныеДанные = Истина; + ИначеЕсли ПараметрыВыборки.ПараметрыОбработчикаОбновления.ОбработанныеТаблицыРегистраторов <> Неопределено Тогда + РезультатПоиска.ОбработанныеТаблицыРегистраторов = ПараметрыВыборки.ПараметрыОбработчикаОбновления.ОбработанныеТаблицыРегистраторов; + КонецЕсли; + Количество = Данные.Количество(); РезультатПоиска.Количество = РезультатПоиска.Количество + Количество; ПараметрыВыборки.МаксимумВыборки = ПараметрыВыборки.МаксимумВыборки - Количество; @@ -5837,12 +6037,32 @@ // Если порций больше одной, то для каждой свой КлючЗаписиПрогрессаОбновления прогресса обновления ПараметрыОбработчикаОбновления = Новый Структура(КонтекстОбработчика.ПараметрыОбработчикаОбновления); ПараметрыОбработчикаОбновления.КлючЗаписиПрогрессаОбновления = Новый УникальныйИдентификатор; + Если РезультатПоиска.Свойство("ОбработаныАктуальныеДанные") + И РезультатПоиска.ОбработаныАктуальныеДанные = Истина Тогда + ПараметрыОбработчикаОбновления.ОбработаныАктуальныеДанные = Истина; + КонецЕсли; + Если РезультатПоиска.Свойство("ОбработанныеТаблицыРегистраторов") + И РезультатПоиска.ОбработанныеТаблицыРегистраторов <> Неопределено Тогда + ПараметрыОбработчикаОбновления.ОбработанныеТаблицыРегистраторов = РезультатПоиска.ОбработанныеТаблицыРегистраторов; + КонецЕсли; КонтекстОбработчика.ПараметрыОбработчикаОбновления = Новый ФиксированнаяСтруктура(ПараметрыОбработчикаОбновления); ОбработатьФрагментДанныхВПотоке(Фрагмент, Группы, КонтекстОбработчика); КонецЦикла; Иначе Фрагмент = НоваяПорцияДляОбновления(); Фрагмент.НаборДанных = НовыйНаборДанныхДляОбновления(); + ПараметрыОбработчикаОбновления = Новый Структура(КонтекстОбработчика.ПараметрыОбработчикаОбновления); + Если РезультатПоиска.Свойство("ОбработаныАктуальныеДанные") + И РезультатПоиска.ОбработаныАктуальныеДанные = Истина Тогда + ПараметрыОбработчикаОбновления.ОбработаныАктуальныеДанные = Истина; + КонецЕсли; + + Если РезультатПоиска.Свойство("ОбработанныеТаблицыРегистраторов") + И РезультатПоиска.ОбработанныеТаблицыРегистраторов <> Неопределено Тогда + ПараметрыОбработчикаОбновления.ОбработанныеТаблицыРегистраторов = РезультатПоиска.ОбработанныеТаблицыРегистраторов; + КонецЕсли; + КонтекстОбработчика.ПараметрыОбработчикаОбновления = Новый ФиксированнаяСтруктура(ПараметрыОбработчикаОбновления); + ОбработатьФрагментДанныхВПотоке(Фрагмент, Группы, КонтекстОбработчика); КонецЕсли; @@ -6229,6 +6449,10 @@ Описание = Новый Структура; Описание.Вставить("ДанныеОбработчика"); Описание.Вставить("ИмяОбработчика"); + Описание.Вставить("АктуальныеДанные"); + Описание.Вставить("ЗарегистрированныеТаблицыРегистраторов"); + Описание.Вставить("ОбработанныеТаблицыРегистраторов"); + Описание.Вставить("ВерсияПодсистемыНаНачалоОбновления"); Если Многопоточное Тогда Описание.Вставить("ВыполняетсяПоискПорции", Ложь); @@ -6397,6 +6621,8 @@ РезультатПоиска.Вставить("Количество", 0); РезультатПоиска.Вставить("НаборДанных"); РезультатПоиска.Вставить("ПоискЗавершен", Ложь); + РезультатПоиска.Вставить("ОбработаныАктуальныеДанные", Ложь); + РезультатПоиска.Вставить("ОбработанныеТаблицыРегистраторов", Неопределено); Возврат РезультатПоиска; @@ -6408,7 +6634,7 @@ // ПорцииДляОбновления - см. НоваяТаблицаПорцийДляОбновления // // Возвращаемое значение: -// СтрокаТаблицыЗначений - найденная порция. +// СтрокаТаблицыЗначений: см. НоваяТаблицаПорцийДляОбновления // Неопределено - если необработанных порций нет. // Функция ПерваяНеобработаннаяПорция(ПорцииДляОбновления) @@ -6477,7 +6703,7 @@ ОбъектыКОбработке = Новый Массив; - ШаблонаЗапроса = "ВЫБРАТЬ + ШаблонЗапроса = "ВЫБРАТЬ | &Поля |ИЗ | #Таблица КАК Таблица @@ -6520,10 +6746,11 @@ ИменаРеквизитовОбъекта.Добавить("Ссылка"); КонецЕсли; - ТекстЗапроса = СтрЗаменить(ШаблонаЗапроса, "&Поля", СтрСоединить(ИменаРеквизитовОбъекта, ", " + Символы.ПС)); + ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "&Поля", СтрСоединить(ИменаРеквизитовОбъекта, ", " + Символы.ПС)); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#Таблица", ОбъектМетаданныхСЭлементами.ПолноеИмя()); Запрос = Новый Запрос(ТекстЗапроса); + // @skip-check query-in-loop - запросы к разным таблицам с уникальным составом реквизитов в каждой. РезультатЗапроса = Запрос.Выполнить(); Если РезультатЗапроса.Пустой() Тогда Продолжить; @@ -6906,7 +7133,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось заполнить элемент: %1 по причине: %2'"), - СсылкиНаОбъекты.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + СсылкиНаОбъекты.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, МетаданныеОбъекта, СсылкиНаОбъекты.Ссылка, ТекстСообщения); @@ -7042,13 +7269,13 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + ПризнакЛокализуемогоРеквизита = МодульМультиязычностьСервер.ПризнакЛокализуемогоРеквизита() Иначе - Возврат; + ПризнакЛокализуемогоРеквизита = Неопределено; КонецЕсли; - + Для Каждого Язык Из Языки Цикл - ПредопределенныеДанные.Колонки.Добавить(Реквизит.Имя + "_" + Язык, Реквизит.Тип, - МодульМультиязычностьСервер.ПризнакЛокализуемогоРеквизита()); + ПредопределенныеДанные.Колонки.Добавить(Реквизит.Имя + "_" + Язык, Реквизит.Тип, ПризнакЛокализуемогоРеквизита); КонецЦикла; КонецПроцедуры @@ -7176,7 +7403,7 @@ ЕстьУспехи = Истина; Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - Ошибки.Добавить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + Ошибки.Добавить(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; Если Не Порция.ВсеПорцииОбработаны Тогда ВсеПорцииОбработаны = Ложь; @@ -7252,7 +7479,7 @@ |""%1"" по причине: |%2'"), Метаданные.РегламентныеЗадания.ОчисткаУстаревшихДанных.Имя, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации( НСтр("ru = 'Очистка устаревших данных.Ошибка настройки регламентного задания'", ОбщегоНазначения.КодОсновногоЯзыка()), @@ -7868,7 +8095,7 @@ "ОбластьДанных"); Для Каждого ОбластьДанных Из ОбластиДанных Цикл МодульРаботаВМоделиСервиса.ВойтиВОбластьДанных(ОбластьДанных); - ОчиститьУстаревшиеДанныеВФонеБезПопытки(Параметры); + ОчиститьУстаревшиеДанныеВФонеБезПопытки(Параметры); // @skip-check query-in-loop - Порционная обработка данных МодульРаботаВМоделиСервиса.ВыйтиИзОбластиДанных(); Если ПоследняяОтправка + 5 < ТекущаяДатаСеанса() Тогда НовыйПроцент = Цел(ОбластиДанных.Найти(ОбластьДанных) / ОбластиДанных.Количество() * 100); @@ -7883,7 +8110,7 @@ Результат = Новый Соответствие; Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - Результат = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + Результат = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); Если Параметры.ОбрабатыватьОбластиДанных И МодульРаботаВМоделиСервиса <> Неопределено Тогда МодульРаботаВМоделиСервиса.ВыйтиИзОбластиДанных(); @@ -7952,7 +8179,7 @@ Для Каждого ОбластьДанных Из ОбластиДанных Цикл УстаревшиеДанныеОбласти = УстаревшиеДанные.Скопировать(Новый Массив); МодульРаботаВМоделиСервиса.ВойтиВОбластьДанных(ОбластьДанных); - СформироватьСписокУстаревшихДанныхВФонеБезПопытки(УстаревшиеДанныеОбласти, Параметры); + СформироватьСписокУстаревшихДанныхВФонеБезПопытки(УстаревшиеДанныеОбласти, Параметры); // @skip-check query-in-loop - Порционная обработка данных МодульРаботаВМоделиСервиса.ВыйтиИзОбластиДанных(); Если ЗначениеЗаполнено(УстаревшиеДанныеОбласти) Тогда НоваяСтрока = УстаревшиеДанные.Добавить(); @@ -7972,7 +8199,7 @@ Результат = УстаревшиеДанные; Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - Результат = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + Результат = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); Если Параметры.ОбрабатыватьОбластиДанных И МодульРаботаВМоделиСервиса <> Неопределено Тогда МодульРаботаВМоделиСервиса.ВыйтиИзОбластиДанных(); @@ -7996,7 +8223,7 @@ Для Каждого ОчищаемаяТаблица Из ОчищаемыеТаблицы Цикл Запрос = ЗапросДанных(ОчищаемаяТаблица, Истина, ВывестиКоличество); - РезультатЗапроса = Запрос.Выполнить(); + РезультатЗапроса = Запрос.Выполнить(); // @skip-check query-in-loop - Порционная обработка данных Количество = 0; Если ВывестиКоличество Тогда Выборка = РезультатЗапроса.Выбрать(); @@ -8819,6 +9046,79 @@ //////////////////////////////////////////////////////////////////////////////// // Общего назначения +Процедура УстановитьПорядокОтложенногоОбновления() Экспорт + + Если Не ОбщегоНазначения.РазделениеВключено() + Или ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + // Регламентное задание предназначено для запуска только в неразделенном режиме работы. + Задания = РегламентныеЗаданияСервер.НайтиЗадания(Новый Структура("Метаданные", Метаданные.РегламентныеЗадания.УстановкаПорядкаОтложенногоОбновленияВМоделиСервиса)); + Для Каждого Задание Из Задания Цикл + РегламентныеЗаданияСервер.ИзменитьЗадание(Задание.УникальныйИдентификатор, + Новый Структура("Использование", Ложь)); + КонецЦикла; + Возврат; + КонецЕсли; + + ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.УстановкаПорядкаОтложенногоОбновленияВМоделиСервиса); + + ПрогрессОбновления = ОбновлениеИнформационнойБазы.ПрогрессОбновленияОбластейДанных("Отложенное"); + ОбластиДляПроверки = ПрогрессОбновления.ОбластиВыполняется; + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ОбластиДляПроверки, ПрогрессОбновления.ОбластиСПроблемами, Истина); + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ОбластиДляПроверки, ПрогрессОбновления.ОбластиОжидает, Истина); + + ПорядокОбрабатываемыхДанных = Константы.ПорядокОбрабатываемыхДанных.Получить(); + + Статусы = Новый Массив; + Статусы.Добавить(Перечисления.СтатусыОбработчиковОбновления.НеВыполнялся); + Статусы.Добавить(Перечисления.СтатусыОбработчиковОбновления.Выполняется); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ОбластиДляПроверки", ОбластиДляПроверки); + Запрос.УстановитьПараметр("РежимВыполнения", Перечисления.РежимыВыполненияОбработчиков.Отложенно); + Запрос.УстановитьПараметр("Порядок", Перечисления.ПорядокОбработчиковОбновления.Критичный); + Запрос.УстановитьПараметр("Статусы", Статусы); + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + |ИЗ + | РегистрСведений.ОбработчикиОбновления КАК ОбработчикиОбновления + |ГДЕ + | ОбработчикиОбновления.РежимВыполнения = &РежимВыполнения + | И ОбработчикиОбновления.ОбластьДанныхВспомогательныеДанные В(&ОбластиДляПроверки) + | И ОбработчикиОбновления.Порядок = &Порядок + | И ОбработчикиОбновления.Статус В(&Статусы) + | И &УсловиеОбычныхОбработчиков"; + + УсловиеОбычныхОбработчиков = "ИСТИНА"; + Если ПорядокОбрабатываемыхДанных = Перечисления.ПорядокОбработчиковОбновления.Обычный Тогда + // АПК:1297-выкл Условие запроса. + УсловиеОбычныхОбработчиков = "(Не ОбработчикиОбновления.ИспользуетсяРазделениеПоКритичности + | Или Не ОбработчикиОбновления.ОбработаныАктуальныеДанные)"; + // АПК:1297-вкл + КонецЕсли; + + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеОбычныхОбработчиков", УсловиеОбычныхОбработчиков); + + ОтключитьЗадание = Ложь; + Если Запрос.Выполнить().Пустой() Тогда + Если ПорядокОбрабатываемыхДанных = Перечисления.ПорядокОбработчиковОбновления.Критичный Тогда + Константы.ПорядокОбрабатываемыхДанных.Установить(Перечисления.ПорядокОбработчиковОбновления.Обычный); + Иначе + Константы.ПорядокОбрабатываемыхДанных.Установить(Перечисления.ПорядокОбработчиковОбновления.Некритичный); + ОтключитьЗадание = Истина; + КонецЕсли; + КонецЕсли; + + Если ОтключитьЗадание Тогда + Задания = РегламентныеЗаданияСервер.НайтиЗадания(Новый Структура("Метаданные", Метаданные.РегламентныеЗадания.УстановкаПорядкаОтложенногоОбновленияВМоделиСервиса)); + Для Каждого Задание Из Задания Цикл + РегламентныеЗаданияСервер.ИзменитьЗадание(Задание.УникальныйИдентификатор, + Новый Структура("Использование", Ложь)); + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + Процедура ОтключитьОбновлениеКлючейДоступа(Значение, ПодсистемаСуществует) Если ПодсистемаСуществует Тогда МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); @@ -9090,7 +9390,7 @@ |произошла ошибка: |""%2"".'"), ИмяОбработчика, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписатьОшибку(ТекстОшибки); УстановитьСтатусОбработчика(Обработчик.Процедура, "Ошибка", ТекстОшибки); @@ -9463,7 +9763,7 @@ // Список объектов новых подсистем. ОбъектыНовыхПодсистем = Новый Массив; Для Каждого ИмяПодсистемы Из СведенияОбОбновленииИнформационнойБазы().НовыеПодсистемы Цикл - Подсистема = Метаданные.НайтиПоПолномуИмени(ИмяПодсистемы); + Подсистема = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяПодсистемы); Если Подсистема = Неопределено Тогда Продолжить; КонецЕсли; @@ -9926,6 +10226,7 @@ Если НевыполненныеОбработчики.Количество() = 0 Тогда СведенияОбОбновлении.ВремяОкончаниеОтложенногоОбновления = ТекущаяДатаСеанса(); СведенияОбОбновлении.ОтложенноеОбновлениеЗавершеноУспешно = Истина; + СведенияОбОбновлении.ДлительностьЭтаповОбновления.Некритичные.Конец = ТекущаяДатаСеанса(); ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении); Константы.ОтложенноеОбновлениеЗавершеноУспешно.Установить(Истина); Если Не ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда @@ -9989,6 +10290,10 @@ КонтекстОбработчика = НовыйКонтекстОбработчика(); ОбработчикОбновления = НайтиОбработчикОбновления(КонтекстОбработчика, ПараметрыОбновления); + Если ОбработчикОбновления = "ПрерватьВыполнение" Тогда + Возврат Истина; + КонецЕсли; + Если ТипЗнч(ОбработчикОбновления) = Тип("СтрокаТаблицыЗначений") Тогда АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено); @@ -10014,13 +10319,20 @@ ОбработчикВыполнилсяБезОшибок = Ложь; СсылочныйОбъект = ИтераторОбхода.СсылочныйОбъект; ТабличныйОбъект = ИтераторОбхода.ТабличныйОбъект; - НаборДанных = НовыйНаборДанныхДляОбновления(); - ЗаписьДанных = НаборДанных.Добавить(); + НаборДанных = НовыйНаборДанныхДляОбновления(); + ЗаписьДанных = НаборДанных.Добавить(); ПараметрыВыборки.ДополнительныеИсточникиДанных = ОбновлениеИнформационнойБазы.ИсточникиДанных( ДополнительныеИсточникиДанных, СсылочныйОбъект, ТабличныйОбъект); + // Так как параметр сеанса не устанавливается на время выборки данных, то добавляем в параметры выборки + // текущие параметры обработчика обновления. + ПараметрыВыборки.Вставить("ПараметрыОбработчикаОбновления", КонтекстОбработчика.ПараметрыОбработчикаОбновления); + ЗаписьДанных.Данные = ВыбратьДанныеПорции(ПараметрыВыборки, Очередь, СсылочныйОбъект, ТабличныйОбъект); + + КонтекстОбработчика.ПараметрыОбработчикаОбновления = ПараметрыВыборки.ПараметрыОбработчикаОбновления; + ЗаписьДанных.СсылочныйОбъект = СсылочныйОбъект; ЗаписьДанных.ТабличныйОбъект = ТабличныйОбъект; ОбновляемыеДанные = НоваяПорцияДляОбновления(); @@ -10037,7 +10349,14 @@ ВыполнитьОтложенныйОбработчик(КонтекстОбработчика, АдресРезультата); КонецЕсли; ОбработчикВыполнилсяБезОшибок = Истина; - ЗавершитьВыполнениеОтложенногоОбработчика(КонтекстОбработчика, АдресРезультата); + ЗавершитьВыполнениеОтложенногоОбработчика(КонтекстОбработчика, АдресРезультата); // @skip-check query-in-loop - выполнение отложенных обработчиков. + + // Если обработчик исчерпал лимит попыток запуска - пропускаем его. + ОбработчикОбновления = ОбработчикОбновления(КонтекстОбработчика.ИмяОбработчика); // @skip-check query-in-loop - выполнение отложенных обработчиков. + МаксимумПопыток = МаксимумПопытокОбновления(ОбработчикОбновления); + Если ОбработчикОбновления.ЧислоПопыток >= МаксимумПопыток Тогда + Прервать; + КонецЕсли; Если Количество > 0 Тогда ОбрабатываемыеДанные.ПоследняяВыбраннаяЗапись = КлючЗаписиПоследнейСтрокиНабораДанных(НаборДанных); @@ -10123,7 +10442,8 @@ // т.к. от данных, которые он обрабатывает, могут зависеть другие обработчики. Если ПараллельныйРежим И ОбработчикОбновления.Статус = Перечисления.СтатусыОбработчиковОбновления.Ошибка - И ОбработчикОбновления.ЧислоПопыток >= МаксимумПопытокОбновления(ОбработчикОбновления) Тогда + И ОбработчикОбновления.ЧислоПопыток >= МаксимумПопытокОбновления(ОбработчикОбновления) + И ОтсутствуютОбработчикиДляВыполнения() Тогда СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); СведенияОбОбновлении.ВремяОкончаниеОтложенногоОбновления = ТекущаяДатаСеанса(); СведенияОбОбновлении.ОтложенноеОбновлениеЗавершеноУспешно = Ложь; @@ -10141,6 +10461,53 @@ КонецПроцедуры +Функция ОтсутствуютОбработчикиДляВыполнения() + + Статусы = Новый Массив; + Статусы.Добавить(Перечисления.СтатусыОбработчиковОбновления.НеВыполнялся); + Статусы.Добавить(Перечисления.СтатусыОбработчиковОбновления.Выполняется); + + // Быстрая проверка, что есть обработчики не в статусе ошибка. + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Статусы", Статусы); + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + |ИЗ + | РегистрСведений.ОбработчикиОбновления КАК ОбработчикиОбновления + |ГДЕ + | ОбработчикиОбновления.Статус В(&Статусы)"; + + Если Не Запрос.Выполнить().Пустой() Тогда + Возврат Ложь; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("РежимВыполнения", Перечисления.РежимыВыполненияОбработчиков.Отложенно); + Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыОбработчиковОбновления.Ошибка); + Запрос.Текст = + "ВЫБРАТЬ + | ОбработчикиОбновления.ИмяОбработчика КАК ИмяОбработчика, + | ОбработчикиОбновления.Статус КАК Статус, + | ОбработчикиОбновления.ЧислоПопыток КАК ЧислоПопыток, + | ОбработчикиОбновления.Многопоточный, + | ОбработчикиОбновления.ОбрабатываемыеДанные + |ИЗ + | РегистрСведений.ОбработчикиОбновления КАК ОбработчикиОбновления + |ГДЕ + | ОбработчикиОбновления.РежимВыполнения = &РежимВыполнения + | И ОбработчикиОбновления.Статус = &Статус"; + Обработчики = Запрос.Выполнить().Выгрузить(); + Для Каждого Обработчик Из Обработчики Цикл + Если Обработчик.ЧислоПопыток < МаксимумПопытокОбновления(Обработчик) Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + Функция ПереданныеПараметрыОбработчикаОбновления(Параметры) ПереданныеПараметры = Новый Структура; Для Каждого Параметр Из Параметры Цикл @@ -10178,8 +10545,13 @@ СведенияОбОбновлении.Вставить("ЗависимостьГруппОбработчиков", Новый Соответствие); СведенияОбОбновлении.Вставить("ВерсииПодсистемНаНачалоОбновления", Новый Соответствие); СведенияОбОбновлении.Вставить("ДатаНачалаСеансаОбновления", Неопределено); + СведенияОбОбновлении.Вставить("ДлительностьЭтаповОбновления", Новый Структура); СведенияОбОбновлении.Вставить("ЧитаемыеИИзменяемыеТаблицы", Новый Соответствие); + СведенияОбОбновлении.ДлительностьЭтаповОбновления.Вставить("Критичные", Новый Структура("Начало, Конец")); + СведенияОбОбновлении.ДлительностьЭтаповОбновления.Вставить("Обычные", Новый Структура("Начало, Конец")); + СведенияОбОбновлении.ДлительностьЭтаповОбновления.Вставить("Некритичные", Новый Структура("Начало, Конец")); + Если ТипЗнч(СтарыеСведения) = Тип("Структура") Тогда ЗаполнитьЗначенияСвойств(СведенияОбОбновлении, СтарыеСведения); КонецЕсли; @@ -10194,7 +10566,7 @@ РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); ДоступноИспользованиеРазделенныхДанных = ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(); ВыполнятьОтложенныеОбработчики = ПараметрыОбновления.ВыполнятьОтложенныеОбработчики; - ПараметрЗапускаКлиента = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере(Ложь).Получить("ПараметрЗапуска"); + ПараметрЗапускаКлиента = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ПараметрЗапуска"); Если Не РазделениеВключено Или ДоступноИспользованиеРазделенныхДанных Тогда Если ИнформационнаяБазаФайловая @@ -10315,7 +10687,7 @@ МинимальнаяОчередь = МинимальнаяОчередьОтложеннойОбработки(); Если Не ПараметрыОбновления.ПараллельныйРежим - Или МинимальнаяОчередь = ОбработчикОбновления.ОчередьОтложеннойОбработки Тогда + Или ОбработчикОбновления.ОчередьОтложеннойОбработки <= МинимальнаяОчередь Тогда ЧислоПопыток = МаксимумПопытокОбновления(ОбработчикОбновления); УстановитьСвойствоОбработчика(ОбработчикОбновления.ИмяОбработчика, "ЧислоПопыток", ЧислоПопыток); ВызватьИсключение ТекстОшибки; @@ -10383,6 +10755,11 @@ Попытка ЗавершениеОбработкиДанных = ТекущаяУниверсальнаяДатаВМиллисекундах(); + ОписаниеПроцедурыЗаполнения = ОбработчикОбновления.ОбрабатываемыеДанные.Получить(); + + Если КонтекстОбработчика.Свойство("ОбработкаИсключенияОбработчика") Тогда + Параметры.ОбработкаЗавершена = Ложь; + КонецЕсли; Если Параметры.ОбработкаЗавершена = Неопределено Тогда ТекстОшибки = НСтр("ru = 'Обработчик обновления не инициализировал параметр %1. @@ -10393,10 +10770,11 @@ СтатистикаВыполнения = ОбработчикОбновления.СтатистикаВыполнения.Получить(); ДобавитьКоличествоЗапусков = Истина; - Если Параметры.ОбработкаЗавершена - И Не КонтекстОбработчика.Свойство("ОбработкаИсключенияОбработчика") Тогда + Если Параметры.ОбработкаЗавершена Тогда СтатистикаВыполнения.Вставить("ЗавершениеОбработкиДанных", ТекущаяДатаСеанса()); + ЧистаяДлительностьВыполнения = ЧистаяДлительностьВыполненияОбработчика(ОбработчикОбновления, СтатистикаВыполнения); + УстанавливаемыеСвойства.Вставить("Статус", Перечисления.СтатусыОбработчиковОбновления.Выполнен); УстанавливаемыеСвойства.Вставить("Приоритет","ВПлановомПорядке"); @@ -10413,14 +10791,47 @@ ОчередьОбработчика = ОбработчикОбновления.ОчередьОтложеннойОбработки; МинимальнаяОчередь = 0; - Если Не ЕстьОбработанныеОбъекты Тогда - МинимальнаяОчередь = МинимальнаяОчередьОтложеннойОбработки(); + Если ЕстьОбработанныеОбъекты Тогда + // Дополнительная проверка, что не было отката транзакции. + ИдентификаторТранзакции = ПараметрыСеанса.ПараметрыОбработчикаОбновления.ИдентификаторТранзакции; + МенеджерЗаписи = РегистрыСведений.ФиксацияОбработкиДанныхОбработчиками.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ИдентификаторТранзакции = ИдентификаторТранзакции; + МенеджерЗаписи.Прочитать(); + ЕстьОбработанныеОбъекты = МенеджерЗаписи.Выбран(); + Если ЕстьОбработанныеОбъекты Тогда + МенеджерЗаписи.Удалить(); + КонецЕсли; КонецЕсли; - ДобавитьКоличествоЗапусков = (ЕстьОбработанныеОбъекты Или ОчередьОбработчика = МинимальнаяОчередь); + // Если в обработчике регистра данные разделяются по регистратору на критичные и некритичные, то получаем + // таблицы, для которых актуальные данные уже обработаны. + ОбработанныеТаблицыРегистраторов = ПараметрыСеанса.ПараметрыОбработчикаОбновления.ОбработанныеТаблицыРегистраторов; + Если ЗначениеЗаполнено(ОбработанныеТаблицыРегистраторов) Тогда + Если ОписаниеПроцедурыЗаполнения.ОбработанныеТаблицыРегистраторов = Неопределено Тогда + ОписаниеПроцедурыЗаполнения.ОбработанныеТаблицыРегистраторов = Новый Массив; + КонецЕсли; + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ОписаниеПроцедурыЗаполнения.ОбработанныеТаблицыРегистраторов, ОбработанныеТаблицыРегистраторов, Истина); + УстанавливаемыеСвойства.Вставить("ОбрабатываемыеДанные", Новый ХранилищеЗначения(ОписаниеПроцедурыЗаполнения)); + + Если ОбщегоНазначения.КоллекцииИдентичны(ОписаниеПроцедурыЗаполнения.ОбработанныеТаблицыРегистраторов, ОписаниеПроцедурыЗаполнения.ЗарегистрированныеТаблицыРегистраторов) Тогда + УстанавливаемыеСвойства.Вставить("ОбработаныАктуальныеДанные", Истина); + КонецЕсли; + КонецЕсли; + + // Проверка, что обработчик обработал актуальные данные. + Если Не ЕстьОбработанныеОбъекты Тогда + ОбработаныВсеАктуальныеДанные = ПараметрыСеанса.ПараметрыОбработчикаОбновления.ОбработаныАктуальныеДанные; + Если ОбработаныВсеАктуальныеДанные = Истина Тогда + УстанавливаемыеСвойства.Вставить("ОбработаныАктуальныеДанные", Истина); + Иначе + МинимальнаяОчередь = МинимальнаяОчередьОтложеннойОбработки(); + КонецЕсли; + КонецЕсли; + + ДобавитьКоличествоЗапусков = (ЕстьОбработанныеОбъекты Или ОчередьОбработчика <= МинимальнаяОчередь); Если Не ЕстьОбработанныеОбъекты - И ОчередьОбработчика = МинимальнаяОчередь Тогда + И ОчередьОбработчика <= МинимальнаяОчередь Тогда ЧислоПопыток = ОбработчикОбновления.ЧислоПопыток; МаксимумПопыток = МаксимумПопытокОбновления(ОбработчикОбновления) - 1; Если ЧислоПопыток >= МаксимумПопыток Тогда @@ -10454,9 +10865,13 @@ КоличествоЗапусковПроцедурыОбновления = КоличествоЗапусковПроцедурыОбновления(СтатистикаВыполнения); КонецЕсли; - ДлительностьВыполнения = ЗавершениеОбработкиДанных - КонтекстОбработчика.НачалоОбработкиДанных; - Если СтатистикаВыполнения["ДлительностьВыполнения"] <> Неопределено Тогда - ДлительностьВыполнения = ДлительностьВыполнения + СтатистикаВыполнения["ДлительностьВыполнения"]; + Если ЗначениеЗаполнено(ЧистаяДлительностьВыполнения) Тогда + ДлительностьВыполнения = ЧистаяДлительностьВыполнения; + Иначе + ДлительностьВыполнения = ЗавершениеОбработкиДанных - КонтекстОбработчика.НачалоОбработкиДанных; + Если СтатистикаВыполнения["ДлительностьВыполнения"] <> Неопределено Тогда + ДлительностьВыполнения = ДлительностьВыполнения + СтатистикаВыполнения["ДлительностьВыполнения"]; + КонецЕсли; КонецЕсли; СтатистикаВыполнения.Вставить("ДлительностьВыполнения", ДлительностьВыполнения); СтатистикаВыполнения.Вставить("КоличествоЗапусков", КоличествоЗапусковПроцедурыОбновления); @@ -10618,6 +11033,9 @@ КонецЦикла; КонецЕсли; + СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); + ВерсииПодсистемНаНачалоОбновления = СведенияОбОбновлении.ВерсииПодсистемНаНачалоОбновления; + Если Не ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); @@ -10630,6 +11048,8 @@ Для Каждого Обработчик Из Обработчики Цикл + ВерсияПодсистемыНаНачалоОбновления = ВерсииПодсистемНаНачалоОбновления[Обработчик.ИмяБиблиотеки]; + Если Не ПараметрыИнициализированы Тогда ПараметрыОбработчикаСтруктура = ОбновлениеИнформационнойБазы.ОсновныеПараметрыОтметкиКОбработке(); @@ -10646,6 +11066,9 @@ ПараметрыОбработчикаСтруктура.ИмяОбработчика = Обработчик.ИмяОбработчика; ПараметрыОбработчикаСтруктура.Вставить("ДанныеОбработчика", Новый Соответствие); ПараметрыОбработчикаСтруктура.Вставить("ПерезапускОбновления", ПерезапускОбновления); + ПараметрыОбработчикаСтруктура.Вставить("АктуальныеДанные", ОбновлениеИнформационнойБазы.ПараметрыВыборкиАктуальныхДанных()); + ПараметрыОбработчикаСтруктура.Вставить("ЗарегистрированныеТаблицыРегистраторов", Новый Соответствие); + ПараметрыОбработчикаСтруктура.Вставить("ВерсияПодсистемыНаНачалоОбновления", ВерсияПодсистемыНаНачалоОбновления); Если Обработчик.Многопоточный Тогда ПараметрыОбработчикаСтруктура.ПараметрыВыборки = @@ -10666,7 +11089,11 @@ Обработчик.ИмяОбработчика); ЗаписатьИнформацию(Сообщение); + НачалоРегистрации = ТекущаяУниверсальнаяДатаВМиллисекундах(); ОбщегоНазначения.ВыполнитьМетодКонфигурации(Обработчик.ПроцедураЗаполненияДанныхОбновления, ПараметрыОбработчика); + КонецРегистрации = ТекущаяУниверсальнаяДатаВМиллисекундах(); + + ДлительностьРегистрации = (КонецРегистрации - НачалоРегистрации) / 1000; Если Обработчик.Многопоточный Тогда ИсправитьПолныеИменаВПараметрахВыборки(ПараметрыОбработчикаСтруктура.ПараметрыВыборки); @@ -10693,7 +11120,7 @@ |""%3"".'"), Обработчик.ПроцедураЗаполненияДанныхОбновления, Обработчик.ИмяОбработчика, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписатьОшибку(ТекстОшибки); @@ -10701,21 +11128,36 @@ Свойства.Вставить("Статус", Перечисления.СтатусыОбработчиковОбновления.Ошибка); Свойства.Вставить("ИнформацияОбОшибке", ТекстОшибки); УстановитьСвойстваОбработчика(Обработчик.ИмяОбработчика, Свойства); - + ВызватьИсключение; КонецПопытки; ОписаниеОбрабатываемыхДанных = НовоеОписаниеОбрабатываемыхДанных(Обработчик.Многопоточный); ОписаниеОбрабатываемыхДанных.ДанныеОбработчика = ПараметрыОбработчикаСтруктура.ДанныеОбработчика; ОписаниеОбрабатываемыхДанных.ИмяОбработчика = Обработчик.ИмяОбработчика; + ОписаниеОбрабатываемыхДанных.АктуальныеДанные = ПараметрыОбработчикаСтруктура.АктуальныеДанные; + Если ЗначениеЗаполнено(ПараметрыОбработчикаСтруктура.ЗарегистрированныеТаблицыРегистраторов) Тогда + ЗарегистрированныеТаблицы = Новый Массив; + Для Каждого КлючИЗначение Из ПараметрыОбработчикаСтруктура.ЗарегистрированныеТаблицыРегистраторов Цикл + ЗарегистрированныеТаблицы.Добавить(КлючИЗначение.Значение); + КонецЦикла; + КонецЕсли; + ОписаниеОбрабатываемыхДанных.ЗарегистрированныеТаблицыРегистраторов = ЗарегистрированныеТаблицы; Если Обработчик.Многопоточный Тогда ОписаниеОбрабатываемыхДанных.ПараметрыВыборки = ПараметрыОбработчикаСтруктура.ПараметрыВыборки; КонецЕсли; ОписаниеОбрабатываемыхДанных = Новый ХранилищеЗначения(ОписаниеОбрабатываемыхДанных, Новый СжатиеДанных(9)); - УстановитьСвойствоОбработчика(Обработчик.ИмяОбработчика, "ОбрабатываемыеДанные", ОписаниеОбрабатываемыхДанных); + УстанавливаемыеСвойства = Новый Структура; + УстанавливаемыеСвойства.Вставить("ОбрабатываемыеДанные", ОписаниеОбрабатываемыхДанных); + УстанавливаемыеСвойства.Вставить("ДлительностьРегистрацииДанных", ДлительностьРегистрации); + Если УказанФильтрАктуальныхДанных(ПараметрыОбработчикаСтруктура.АктуальныеДанные) Тогда + УстанавливаемыеСвойства.Вставить("ИспользуетсяРазделениеПоКритичности", Истина); + КонецЕсли; + + УстановитьСвойстваОбработчика(Обработчик.ИмяОбработчика, УстанавливаемыеСвойства); КонецЦикла; Если Не ПерезапускОбновления Тогда @@ -10743,14 +11185,10 @@ УдалитьВсеПотокиОбновления(); Попытка - ДоступнаПакетнаяРегистрация = ОбновлениеИнформационнойБазы.ДоступнаПакетнаяРегистрация(); - - Если ДоступнаПакетнаяРегистрация Тогда - ТекущаяОчередь = ?(Обработчики.Количество() > 0, Обработчики[0].ОчередьОтложеннойОбработки, 0); - КонецЕсли; + ТекущаяОчередь = ?(Обработчики.Количество() > 0, Обработчики[0].ОчередьОтложеннойОбработки, 0); Для Каждого Обработчик Из Обработчики Цикл - Если ДоступнаПакетнаяРегистрация И Обработчик.ОчередьОтложеннойОбработки > ТекущаяОчередь Тогда - ОжидатьЗавершениеВсехПотоков(Группы); + Если Обработчик.ОчередьОтложеннойОбработки > ТекущаяОчередь Тогда + ОжидатьЗавершениеВсехПотоков(Группы); // @skip-check query-in-loop - пакетная регистрация данных. ТекущаяОчередь = Обработчик.ОчередьОтложеннойОбработки; КонецЕсли; @@ -10758,7 +11196,7 @@ Поток = ДобавитьПотокРегистрацииДанныхОтложенногоОбновления(ОписаниеОбрабатываемыхДанных); ВыполнитьПоток(Группы, Поток, ИдентификаторФормы); - ОжидатьСвободныйПоток(Группы); + ОжидатьСвободныйПоток(Группы); // @skip-check query-in-loop - пакетная регистрация данных. КонецЦикла; ОжидатьЗавершениеВсехПотоков(Группы); @@ -10813,9 +11251,11 @@ ЗаписатьИнформацию(ТекстСообщения); Попытка + НачалоРегистрации = ТекущаяУниверсальнаяДатаВМиллисекундах(); ОбщегоНазначения.ВыполнитьМетодКонфигурации(ОписаниеОбрабатываемыхДанных.ПроцедураЗаполнения, ПараметрыОбработчика); + КонецРегистрации = ТекущаяУниверсальнаяДатаВМиллисекундах(); Исключение - ИнформацияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ИнформацияОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ШаблонОшибки = НСтр( "ru = 'При вызове процедуры заполнения данных |""%1"" @@ -10833,12 +11273,17 @@ Свойства.Вставить("Статус", Перечисления.СтатусыОбработчиковОбновления.Ошибка); Свойства.Вставить("ИнформацияОбОшибке", ТекстОшибки); УстановитьСвойстваОбработчика(ОписаниеОбрабатываемыхДанных.ИмяОбработчика, Свойства); - + ВызватьИсключение; КонецПопытки; + ДлительностьРегистрацииДанных = (КонецРегистрации - НачалоРегистрации) / 1000; + Результат = Новый Структура; Результат.Вставить("ДанныеОбработчика", ПараметрыОтметкиКОбработке.ДанныеОбработчика); + Результат.Вставить("ДлительностьРегистрацииДанных", ДлительностьРегистрацииДанных); + Результат.Вставить("АктуальныеДанные", ПараметрыОтметкиКОбработке.АктуальныеДанные); + Результат.Вставить("ЗарегистрированныеТаблицыРегистраторов", ПараметрыОтметкиКОбработке.ЗарегистрированныеТаблицыРегистраторов); Если МногопоточныйРежим Тогда Результат.Вставить("ПараметрыВыборки", ПараметрыОтметкиКОбработке.ПараметрыВыборки); @@ -10889,6 +11334,15 @@ ПараметрыОбработчикаОбновления.ЕстьОбработанныеОбъекты = Ложь; ПараметрыОбработчикаОбновления.ИмяОбработчика = ИмяОбработчика; ПараметрыОбработчикаОбновления.ИзменяемыеОбъекты = УникальныеЗначенияЧерезЗапятую(ПолучениеСвойств.ИзменяемыеОбъекты); + Если Параллельно Тогда + ОбрабатываемыеДанные = ОбработчикОбновления.ОбрабатываемыеДанные.Получить(); + Если ТипЗнч(ОбрабатываемыеДанные) = Тип("Структура") + И ОбрабатываемыеДанные.Свойство("АктуальныеДанные") + И ТипЗнч(ОбрабатываемыеДанные.АктуальныеДанные) = Тип("Структура") Тогда + ОбрабатываемыеДанные.АктуальныеДанные.ВидСравнения = ВидСравненияСтрокой(ОбрабатываемыеДанные.АктуальныеДанные.ВидСравнения, ИмяОбработчика); + ПараметрыОбработчикаОбновления.АктуальныеДанные = Новый ФиксированнаяСтруктура(ОбрабатываемыеДанные.АктуальныеДанные); + КонецЕсли; + КонецЕсли; ПараметрыСеанса.ПараметрыОбработчикаОбновления = Новый ФиксированнаяСтруктура(ПараметрыОбработчикаОбновления); @@ -10905,10 +11359,101 @@ ПараметрыОбработчикаОбновления.Вставить("КлючЗаписиПрогрессаОбновления", Неопределено); ПараметрыОбработчикаОбновления.Вставить("ИмяОбработчика", ""); ПараметрыОбработчикаОбновления.Вставить("ИзменяемыеОбъекты", ""); + ПараметрыОбработчикаОбновления.Вставить("ИдентификаторТранзакции", ""); + ПараметрыОбработчикаОбновления.Вставить("АктуальныеДанные", Неопределено); + ПараметрыОбработчикаОбновления.Вставить("ОбработаныАктуальныеДанные", Неопределено); + ПараметрыОбработчикаОбновления.Вставить("ОбработанныеТаблицыРегистраторов", Неопределено); Возврат ПараметрыОбработчикаОбновления; КонецФункции +Функция ВидСравненияСтрокой(Знач УсловиеСравнения, ИмяОбработчика) + + Если Не ЗначениеЗаполнено(УсловиеСравнения) Тогда + Возврат ""; + ИначеЕсли УсловиеСравнения = ВидСравнения.Больше Тогда + УсловиеСравнения = ">"; + ИначеЕсли УсловиеСравнения = ВидСравнения.БольшеИлиРавно Тогда + УсловиеСравнения = ">="; + ИначеЕсли УсловиеСравнения = ВидСравнения.Меньше Тогда + УсловиеСравнения = "<"; + ИначеЕсли УсловиеСравнения = ВидСравнения.МеньшеИлиРавно Тогда + УсловиеСравнения = "<="; + ИначеЕсли УсловиеСравнения = ВидСравнения.Равно Тогда + УсловиеСравнения = "="; + ИначеЕсли УсловиеСравнения = ВидСравнения.НеРавно Тогда + УсловиеСравнения = "<>"; + Иначе + ТекстОшибки = НСтр("ru = 'Указан неподдерживаемый вид сравнения ""%1"" для фильтра актуальных данных + |в процедуре регистрации данных обработчика ""%2"". + |Доступные варианты описаны в функции %3'"); + ДоступныеВидыСравнения = "ОбновлениеИнформационнойБазы.ПараметрыВыборкиАктуальныхДанных"; + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, + УсловиеСравнения, ИмяОбработчика, ДоступныеВидыСравнения); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Возврат УсловиеСравнения; + +КонецФункции + +Функция ФильтрАктуальныхДанных(ПараметрыОбработчика, ПсевдонимТаблицы) Экспорт + + Результат = Новый Структура; + Результат.Вставить("Условие", "ИСТИНА"); + Результат.Вставить("Значение", Неопределено); + Результат.Вставить("ЕстьФильтр", Ложь); + + Если ПараметрыОбработчика = Неопределено Тогда + Параметры = ПараметрыСеанса.ПараметрыОбработчикаОбновления; + ФильтрАктуальныеДанные = Параметры.АктуальныеДанные; + Иначе + ФильтрАктуальныеДанные = ПараметрыОбработчика.АктуальныеДанные; + КонецЕсли; + + + Если ФильтрАктуальныеДанные = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + Если Не УказанФильтрАктуальныхДанных(ФильтрАктуальныеДанные) Тогда + Возврат Результат; + КонецЕсли; + + ПорядокОбрабатываемыхДанных = ТекущийПорядокОбновления(); + Если ПорядокОбрабатываемыхДанных = Перечисления.ПорядокОбработчиковОбновления.Некритичный Тогда + Возврат Результат; + КонецЕсли; + + УсловиеСравнения = ФильтрАктуальныеДанные.ВидСравнения; + ШаблонУсловия = "%1.%2 %3 &ЗначениеОтбораАктуальныхДанных"; + + Условие = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонУсловия, + ПсевдонимТаблицы, + ФильтрАктуальныеДанные.ПолеОтбора, + УсловиеСравнения); + + Результат.Условие = Условие; + Результат.Значение = ФильтрАктуальныеДанные.Значение; + Результат.ЕстьФильтр = Истина; + + Возврат Результат; + +КонецФункции + +Функция УказанФильтрАктуальныхДанных(ФильтрАктуальныеДанные) + + Если (ТипЗнч(ФильтрАктуальныеДанные) = Тип("Структура") Или ТипЗнч(ФильтрАктуальныеДанные) = Тип("ФиксированнаяСтруктура")) + И ЗначениеЗаполнено(ФильтрАктуальныеДанные.ПолеОтбора) + И ЗначениеЗаполнено(ФильтрАктуальныеДанные.ВидСравнения) Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + // Обработать исключение, возникшее при подготовке или завершении выполнения обработчика в основном потоке. // // Параметры: @@ -10931,7 +11476,7 @@ ДобавляемоеЧислоПопыток = ДобавляемоеЧислоПопыток(ОбработчикОбновления, КонтекстОбработчика, Истина); ЧислоПопыток = ОбработчикОбновления.ЧислоПопыток + ДобавляемоеЧислоПопыток; - ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ПодробноеПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); МаксимумПопытокОбновления = МаксимумПопытокОбновления(ОбработчикОбновления); @@ -10968,112 +11513,6 @@ КонецПроцедуры -// Устанавливает статус ошибки у всех зациклившихся обработчиков. -// -Процедура ОтметитьЗациклившиесяОбработчики() - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("РежимВыполнения", Перечисления.РежимыВыполненияОбработчиков.Отложенно); - Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыОбработчиковОбновления.Выполняется); - Запрос.Текст = - "ВЫБРАТЬ - | ОбработчикиОбновления.ИмяОбработчика КАК ИмяОбработчика, - | ОбработчикиОбновления.Статус КАК Статус, - | ОбработчикиОбновления.ЧислоПопыток КАК ЧислоПопыток, - | ОбработчикиОбновления.Многопоточный, - | ОбработчикиОбновления.ОбрабатываемыеДанные - |ИЗ - | РегистрСведений.ОбработчикиОбновления КАК ОбработчикиОбновления - |ГДЕ - | ОбработчикиОбновления.РежимВыполнения = &РежимВыполнения - | И ОбработчикиОбновления.Статус = &Статус"; - Выполняющиеся = Запрос.Выполнить().Выгрузить(); - - Для каждого ОбработчикОбновления Из Выполняющиеся Цикл - МаксимумПопыток = МаксимумПопытокОбновления(ОбработчикОбновления) - 1; - - Если ОбработчикОбновления.ЧислоПопыток >= МаксимумПопыток Тогда - ИнформацияОбОшибке = НСтр("ru = 'Произошло зацикливание процедуры обработки данных. Выполнение прервано.'"); - УстановитьСтатусОбработчика(ОбработчикОбновления.ИмяОбработчика, "Ошибка", ИнформацияОбОшибке); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -// Проверяет, все ли выполняемые обработчики зациклились. -// Условия зацикливания: -// - все выполняющиеся обработчики имеют число попыток >= 2; -// - или -// - есть минимум один выполняющийся обработчик с числом попыток >= 2 -// - и -// - есть минимум один обработчик, завершенный с ошибкой. -// -// Возвращаемое значение: -// Булево - Истина, если обработчики зациклились. -// -Функция ВсеОбработчикиЗациклились() - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("РежимВыполнения", Перечисления.РежимыВыполненияОбработчиков.Отложенно); - Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыОбработчиковОбновления.Выполняется); - Запрос.Текст = - "ВЫБРАТЬ - | ОбработчикиОбновления.ИмяОбработчика КАК ИмяОбработчика, - | ОбработчикиОбновления.Многопоточный КАК Многопоточный, - | ОбработчикиОбновления.ОбрабатываемыеДанные КАК ОбрабатываемыеДанные, - | ОбработчикиОбновления.Статус КАК Статус, - | ОбработчикиОбновления.ЧислоПопыток КАК ЧислоПопыток - |ИЗ - | РегистрСведений.ОбработчикиОбновления КАК ОбработчикиОбновления - |ГДЕ - | ОбработчикиОбновления.РежимВыполнения = &РежимВыполнения - | И ОбработчикиОбновления.Статус = &Статус"; - Выполняющиеся = Запрос.Выполнить().Выгрузить(); - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("РежимВыполнения", Перечисления.РежимыВыполненияОбработчиков.Отложенно); - Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыОбработчиковОбновления.Ошибка); - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - |ИЗ - | РегистрСведений.ОбработчикиОбновления КАК ОбработчикиОбновления - |ГДЕ - | ОбработчикиОбновления.РежимВыполнения = &РежимВыполнения - | И ОбработчикиОбновления.Статус = &Статус"; - СОшибками = Запрос.Выполнить().Выгрузить(); - - Если Выполняющиеся.Количество() > 0 Тогда - ЕстьПревысившие = Ложь; - ЕстьНормальные = Ложь; - - Для каждого ОбработчикОбновления Из Выполняющиеся Цикл - МаксимумПопыток = МаксимумПопытокОбновления(ОбработчикОбновления) - 1; - - Если ОбработчикОбновления.ЧислоПопыток < МаксимумПопыток Тогда - ЕстьНормальные = Истина; - Иначе - ЕстьПревысившие = Истина; - КонецЕсли; - - Если ЕстьНормальные И ЕстьПревысившие Тогда - Прервать; - КонецЕсли; - КонецЦикла; - - Если ЕстьПревысившие Тогда - Если ЕстьНормальные Тогда - Возврат СОшибками.Количество() > 0; - Иначе - Возврат Истина; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - // Получить количество запусков процедуры обновления. // // Параметры: @@ -11163,16 +11602,37 @@ Запрос.УстановитьПараметр("РежимВыполненияОтложенногоОбработчика", Перечисления.РежимыВыполненияОтложенныхОбработчиков.Параллельно); Запрос.Текст = "ВЫБРАТЬ - | МИНИМУМ(ОбработчикиОбновления.ОчередьОтложеннойОбработки) КАК Очередь + | ОбработчикиОбновления.ОчередьОтложеннойОбработки КАК Очередь, + | ОбработчикиОбновления.Многопоточный КАК Многопоточный, + | ОбработчикиОбновления.ОбрабатываемыеДанные КАК ОбрабатываемыеДанные, + | ОбработчикиОбновления.Статус КАК Статус, + | ОбработчикиОбновления.ЧислоПопыток КАК ЧислоПопыток |ИЗ | РегистрСведений.ОбработчикиОбновления КАК ОбработчикиОбновления |ГДЕ | ОбработчикиОбновления.РежимВыполнения = &РежимВыполнения | И ОбработчикиОбновления.РежимВыполненияОтложенногоОбработчика = &РежимВыполненияОтложенногоОбработчика - | И ОбработчикиОбновления.Статус <> &Статус"; + | И ОбработчикиОбновления.Статус <> &Статус + | + |УПОРЯДОЧИТЬ ПО + | Очередь"; Результат = Запрос.Выполнить().Выгрузить(); + Если Результат.Количество() = 0 Тогда + Возврат 0; + КонецЕсли; + Для Каждого ОбработчикОбновления Из Результат Цикл + Если ОбработчикОбновления.Статус <> Перечисления.СтатусыОбработчиковОбновления.Ошибка Тогда + Прервать; + КонецЕсли; + МаксимумПопыток = МаксимумПопытокОбновления(ОбработчикОбновления) - 1; + Если ОбработчикОбновления.ЧислоПопыток >= МаксимумПопыток Тогда + Продолжить; + Иначе + Прервать; + КонецЕсли; + КонецЦикла; - Возврат Результат[0].Очередь; + Возврат ОбработчикОбновления.Очередь; КонецФункции @@ -11298,7 +11758,7 @@ |по причине: |%2'"); ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, - ИмяОбработчика, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ИмяОбработчика, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписатьОшибку(ТекстОшибки); КонецПопытки @@ -11319,6 +11779,53 @@ КонецПроцедуры +Функция ДлительностьЭтапаСтрокой(Знач Длительность) Экспорт + + Если Длительность < 1 Тогда + Возврат "< " + НСтр("ru = '1 сек.'"); + ИначеЕсли Длительность < 60 Тогда + Шаблон = НСтр("ru = '%1 сек.'"); + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, Цел(Длительность)); + ИначеЕсли Длительность < 3600 Тогда + Шаблон = НСтр("ru = '%1 мин. %2 сек.'"); + Длительность = Длительность / 60; // В минутах. + Минуты = Цел(Длительность); + Секунды = Цел((Длительность - Минуты) * 60); + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, Минуты, Секунды); + Иначе + Шаблон = НСтр("ru = '%1 ч. %2 мин.'"); + Длительность = Длительность / 60 / 60; // В часах. + Часы = Цел(Длительность); + Минуты = Цел((Длительность - Часы) * 60); + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, Часы, Минуты); + КонецЕсли; + +КонецФункции + +Функция ТекущийПорядокОбновления() + + ПорядокОбновления = Неопределено; + Если ОбщегоНазначения.РазделениеВключено() Тогда + ИБФайловая = ОбщегоНазначения.ИнформационнаяБазаФайловая(); + ПараметрЗапускаКлиента = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ПараметрЗапуска"); + ФорсированиеОтложенного = СтрНайти(НРег(ПараметрЗапускаКлиента), НРег("ВыполнитьОтложенноеОбновлениеСейчас")) > 0; + Если ФорсированиеОтложенного Или ИБФайловая Тогда + Возврат Перечисления.ПорядокОбработчиковОбновления.Некритичный; + Иначе + ПорядокОбновления = Константы.ПорядокОбрабатываемыхДанных.Получить(); + КонецЕсли; + Иначе + ПорядокОбновления = Константы.ПорядокОбрабатываемыхДанных.Получить(); + КонецЕсли; + + Если Не ЗначениеЗаполнено(ПорядокОбновления) Тогда + Возврат Перечисления.ПорядокОбработчиковОбновления.Критичный; + Иначе + Возврат ПорядокОбновления; + КонецЕсли; + +КонецФункции + Функция ОчередиДляОчистки(Обработанные) Запрос = Новый Запрос; @@ -11381,15 +11888,15 @@ КонецЕсли; ЧитаемыеИИзменяемыеТаблицы = СведенияОбОбновлении.ЧитаемыеИИзменяемыеТаблицы; - ВсеЧитаемыеИИзменяемые = Новый Массив; + ВсеЧитаемыеИИзменяемыеТаблицы = Новый Массив; Для Каждого КлючИЗначение Из ЧитаемыеИИзменяемыеТаблицы Цикл - ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ВсеЧитаемыеИИзменяемые, КлючИЗначение.Значение, Истина); + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ВсеЧитаемыеИИзменяемыеТаблицы, КлючИЗначение.Значение, Истина); КонецЦикла; Для Каждого ОчередьДляОчистки Из ОчередиДляОчистки Цикл ОбъектыОчереди = ЧитаемыеИИзменяемыеТаблицы[ОчередьДляОчистки]; Узел = ПланыОбмена.ОбновлениеИнформационнойБазы.УзелПоОчереди(ОчередьДляОчистки); - Для Каждого ПолноеИмяТаблицы Из ВсеЧитаемыеИИзменяемые Цикл + Для Каждого ПолноеИмяТаблицы Из ВсеЧитаемыеИИзменяемыеТаблицы Цикл Если ОбъектыОчереди.Найти(ПолноеИмяТаблицы) <> Неопределено Тогда // Не очищаем таблицы, для которых есть обработчики. Продолжить; @@ -11413,4 +11920,63 @@ КонецПроцедуры +Функция ЧистаяДлительностьВыполненияОбработчика(ОбработчикОбновления, СтатистикаВыполнения) + + ЧистаяДлительность = 0; + Если ОбработчикОбновления.Многопоточный + И СтатистикаВыполнения <> Неопределено + И СтатистикаВыполнения["НачалоПроцедурыОбработчика"] <> Неопределено + И ТипЗнч(СтатистикаВыполнения["НачалоПроцедурыОбработчика"]) = Тип("Массив") + И СтатистикаВыполнения["ЗавершениеПроцедурыОбработчика"] <> Неопределено + И ТипЗнч(СтатистикаВыполнения["ЗавершениеПроцедурыОбработчика"]) = Тип("Массив") + И СтатистикаВыполнения["НачалоПроцедурыОбработчика"].Количество() = СтатистикаВыполнения["ЗавершениеПроцедурыОбработчика"].Количество() Тогда + ЧислоЗапусков = СтатистикаВыполнения["НачалоПроцедурыОбработчика"].Количество(); + ТаблицаДлительностей = Новый ТаблицаЗначений; + ТаблицаДлительностей.Колонки.Добавить("Начало"); + ТаблицаДлительностей.Колонки.Добавить("Конец"); + + Для Итератор = 1 По ЧислоЗапусков Цикл + ТаблицаДлительностей.Добавить(); + КонецЦикла; + + ТаблицаДлительностей.ЗагрузитьКолонку(СтатистикаВыполнения["НачалоПроцедурыОбработчика"], "Начало"); + ТаблицаДлительностей.ЗагрузитьКолонку(СтатистикаВыполнения["ЗавершениеПроцедурыОбработчика"], "Конец"); + ТаблицаДлительностей.Сортировать("Начало Возр"); + + НачалоТекущегоИнтервала = Неопределено; + КонецТекущегоИнтервала = Неопределено; + Для Каждого Строка Из ТаблицаДлительностей Цикл + Если Не ЗначениеЗаполнено(Строка.Начало) + Или Не ЗначениеЗаполнено(Строка.Конец) Тогда + Продолжить; + КонецЕсли; + Если НачалоТекущегоИнтервала = Неопределено Тогда + НачалоТекущегоИнтервала = Строка.Начало; + КонецТекущегоИнтервала = Строка.Конец; + Продолжить; + КонецЕсли; + + Если Строка.Конец < КонецТекущегоИнтервала Тогда + Продолжить; + КонецЕсли; + + Если Строка.Начало < КонецТекущегоИнтервала Тогда + Если Строка.Конец > КонецТекущегоИнтервала Тогда + КонецТекущегоИнтервала = Строка.Конец; + КонецЕсли; + Продолжить; + КонецЕсли; + + Если Строка.Начало > КонецТекущегоИнтервала Тогда + ЧистаяДлительность = ЧистаяДлительность + (КонецТекущегоИнтервала - НачалоТекущегоИнтервала); + НачалоТекущегоИнтервала = Строка.Начало; + КонецТекущегоИнтервала = Строка.Конец; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Возврат ЧистаяДлительность * 1000; + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl index e499d39b0..ac10c74a2 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl @@ -288,7 +288,8 @@ Запрос.Текст = "ВЫБРАТЬ | ВерсииПодсистемОбластейДанных.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанныхВспомогательныеДанные, - | ВерсииПодсистемОбластейДанных.ВыполненаРегистрацияОтложенныхОбработчиков КАК ВыполненаРегистрацияОтложенныхОбработчиков + | ВерсииПодсистемОбластейДанных.ВыполненаРегистрацияОтложенныхОбработчиков КАК + | ВыполненаРегистрацияОтложенныхОбработчиков |ИЗ | РегистрСведений.ВерсииПодсистемОбластейДанных КАК ВерсииПодсистемОбластейДанных |ГДЕ @@ -457,25 +458,44 @@ И Не ПолучитьВерсиюОбщихДанных Тогда СтандартнаяОбработка = Ложь; + + ВсеВерсииПодсистем = (ИдентификаторБиблиотеки = Неопределено); + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); ТекстЗапроса = "ВЫБРАТЬ - | ВерсииПодсистемОбластейДанных.Версия + | ВерсииПодсистемОбластейДанных.Версия, + | ВерсииПодсистемОбластейДанных.ИмяПодсистемы |ИЗ | РегистрСведений.ВерсииПодсистемОбластейДанных КАК ВерсииПодсистемОбластейДанных |ГДЕ - | ВерсииПодсистемОбластейДанных.ИмяПодсистемы = &ИмяПодсистемы + | &Условие | И ВерсииПодсистемОбластейДанных.ОбластьДанныхВспомогательныеДанные = &ОбластьДанныхВспомогательныеДанные"; + + Если ВсеВерсииПодсистем Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Условие", "ИСТИНА"); + Иначе + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Условие", "ВерсииПодсистемОбластейДанных.ИмяПодсистемы = &ИмяПодсистемы"); + КонецЕсли; + Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("ИмяПодсистемы", ИдентификаторБиблиотеки); Запрос.УстановитьПараметр("ОбластьДанныхВспомогательныеДанные", МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); ТаблицаЗначений = Запрос.Выполнить().Выгрузить(); ВерсияИБ = ""; Если ТаблицаЗначений.Количество() > 0 Тогда - ВерсияИБ = СокрЛП(ТаблицаЗначений[0].Версия); + Если Не ВсеВерсииПодсистем Тогда + ВерсияИБ = СокрЛП(ТаблицаЗначений[0].Версия); + Иначе + ВерсииПодсистем = Новый Соответствие; + Для Каждого СтрокаВерсия Из ТаблицаЗначений Цикл + ВерсииПодсистем.Вставить(СтрокаВерсия.ИмяПодсистемы, СокрЛП(СтрокаВерсия.Версия)); + КонецЦикла; + + ВерсияИБ = ВерсииПодсистем; + КонецЕсли; КонецЕсли; - КонецЕсли; КонецПроцедуры @@ -649,30 +669,25 @@ Если СозданиеНачальногоОбраза Тогда + ВерсииПодсистем = Новый Соответствие; + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ВерсииПодсистемОбластейДанных.Версия КАК Версия, + | ВерсииПодсистемОбластейДанных.ИмяПодсистемы + |ИЗ + | РегистрСведений.ВерсииПодсистемОбластейДанных КАК ВерсииПодсистемОбластейДанных"; + Результат = Запрос.Выполнить().Выгрузить(); + Для Каждого Строка Из Результат Цикл + ВерсииПодсистем.Вставить(Строка.ИмяПодсистемы, Строка.Версия); + КонецЦикла; + Для Каждого СтрокаНабора Из ЭлементДанных Цикл - ТекстЗапроса = - "ВЫБРАТЬ - | ВерсииПодсистемОбластейДанных.Версия КАК Версия - |ИЗ - | РегистрСведений.ВерсииПодсистемОбластейДанных КАК ВерсииПодсистемОбластейДанных - |ГДЕ - | ВерсииПодсистемОбластейДанных.ИмяПодсистемы = &ИмяПодсистемы"; - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("ИмяПодсистемы", СтрокаНабора.ИмяПодсистемы); - Запрос.Текст = ТекстЗапроса; - - Выборка = Запрос.Выполнить().Выбрать(); - - Если Выборка.Следующий() Тогда - - СтрокаНабора.Версия = Выборка.Версия; - - Иначе - + Если ВерсииПодсистем[СтрокаНабора.ИмяПодсистемы] = Неопределено Тогда СтрокаНабора.Версия = ""; - + Иначе + СтрокаНабора.Версия = ВерсииПодсистем[СтрокаНабора.ИмяПодсистемы]; КонецЕсли; КонецЦикла; @@ -1082,7 +1097,7 @@ ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы(); Исключение ЕстьОшибка = Истина; - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Для Каждого Идентификатор Из АктивированныеРасширения Цикл @@ -1229,7 +1244,7 @@ ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации() + "." + НСтр("ru = 'Обновление области данных'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение(НСтр("ru = 'Ошибка обновления области данных. Запись версий области данных заблокирована.'")); КонецПопытки; diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl index 128dee4c9..f3df4a30c 100644 --- a/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl @@ -132,7 +132,7 @@ ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось удалить исправление ""%1"" по причине: | - |%2'"), Исправление.Имя, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + |%2'"), Исправление.Имя, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации(НСтр("ru = 'Исправления.Удаление'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки); ВызватьИсключение ТекстОшибки; @@ -159,9 +159,9 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При записи исправления ""%1"" произошла ошибка: + НСтр("ru = 'Не удалось применить исправление ""%1"" по причине: | - |%2'"), Исправление.Имя, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + |%2'"), Исправление.Имя, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации(НСтр("ru = 'Исправления.Изменение'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки); ВызватьИсключение ТекстОшибки; @@ -190,7 +190,7 @@ ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось удалить отключенное исправление ""%1"" по причине: | - |%2'"), Расширение.Имя, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + |%2'"), Расширение.Имя, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации(НСтр("ru = 'Исправления.Удаление'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки); ВызватьИсключение ТекстОшибки; @@ -259,6 +259,7 @@ // * АдресЭлектроннойПочты - Строка - адрес электронной почты для отправки отчета обновлении. // * КодЗадачиПланировщика - Число - код задачи планировщика Windows. // * ИмяФайлаОбновления - Строка - имя файла, содержащего устанавливаемое обновление. +// * ФайлыИсправлений - Массив из Строка // * СоздаватьРезервнуюКопию - Число - признак необходимости создания резервной копии. // * ИмяКаталогаРезервнойКопииИБ - Строка - каталог для создания резервной копии. // * ВосстанавливатьИнформационнуюБазу - Булево - признак необходимости восстанавливать информационную базу @@ -436,9 +437,9 @@ Если Не ИсправлениеУжеУстановлено Тогда НеУстановлено = НеУстановлено + 1; ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При установке исправления %1 произошла ошибка: + НСтр("ru = 'Не удалось установить исправление %1 по причине: | - |%2'"), ИмяИсправления, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + |%2'"), ИмяИсправления, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации(НСтр("ru = 'Исправления.Установка'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки); КонецЕсли; @@ -446,7 +447,7 @@ ОписаниеОшибки = Новый Структура; ОписаниеОшибки.Вставить("НомерПатча", ИмяИсправления); ОписаниеОшибки.Вставить("Событие", "Установка"); - ОписаниеОшибки.Вставить("Причина", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОписаниеОшибки.Вставить("Причина", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); РезультатВыполнения.Ошибки.Добавить(ОписаниеОшибки); КонецПопытки; КонецЦикла; @@ -484,14 +485,14 @@ ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось удалить исправление ""%1"" по причине: | - |%2'"), Расширение.Имя, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + |%2'"), Расширение.Имя, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации(НСтр("ru = 'Исправления.Удаление'", ОбщегоНазначения.КодОсновногоЯзыка()) , УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки); ОписаниеОшибки = Новый Структура; ОписаниеОшибки.Вставить("НомерПатча", ИмяИсправления); ОписаниеОшибки.Вставить("Событие", "Удаление"); - ОписаниеОшибки.Вставить("Причина", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОписаниеОшибки.Вставить("Причина", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); РезультатВыполнения.Ошибки.Добавить(ОписаниеОшибки); КонецПопытки; КонецЦикла; @@ -640,8 +641,10 @@ + " " + ЭлектроннаяПочта; ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Информация,,,ТекстСообщения); Исключение - ТекстСообщения = НСтр("ru = 'Ошибка при отправке письма электронной почты:'") - + " " + ЭлектроннаяПочта + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось отправить письмо на адрес ""%1"" по причине: + |%2'"), + ЭлектроннаяПочта, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,,ТекстСообщения); КонецПопытки; КонецЕсли; @@ -1024,7 +1027,7 @@ ФайловаяСистема.УдалитьВременныйКаталог(ВременныйКаталог); КонецЕсли; ИнформацияОбОшибке = ИнформацияОбОшибке(); - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Результат = Новый Структура; @@ -1059,8 +1062,8 @@ ЧтениеXML.УстановитьСтроку(ТекстовыйДокумент.ПолучитьТекст()); Свойства = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ФабрикаXDTO.Тип("http://www.v8.1c.ru/ssl/patch", "Patch")); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ВызватьИсключение НСтр("ru = 'Ошибка при чтении файла манифеста исправления'") + ":" + Символы.ПС + ТекстОшибки; + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ВызватьИсключение НСтр("ru = 'Некорректный формат файла манифеста исправления'") + ":" + Символы.ПС + ТекстОшибки; КонецПопытки; ОписанияПодсистем = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем(); @@ -1105,8 +1108,8 @@ ДанныеФайла = Новый ДвоичныеДанные(ИмяФайлаПоставкиОбновления); Исключение ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - Результат.ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Результат.ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Возврат Результат; КонецПопытки; @@ -1114,9 +1117,9 @@ Описание = Новый ОписаниеОбновленияКонфигурации(ДанныеФайла); Исключение ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Результат.ТекстОшибки = НСтр("ru = 'Сведения не доступны'"); - КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + КраткоеПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Если Не ПустаяСтрока(КраткоеПредставлениеОшибки) Тогда Результат.ТекстОшибки = Результат.ТекстОшибки + " (" + КраткоеПредставлениеОшибки + ")"; КонецЕсли; diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииВызовСервера/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииВызовСервера/Module.bsl index 900d82731..d363a8ab1 100644 --- a/SSL/src/CommonModules/ОбновлениеКонфигурацииВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииВызовСервера/Module.bsl @@ -173,7 +173,7 @@ ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось удалить исправление ""%1"" по причине: | - |%2'"), Расширение.Имя, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + |%2'"), Расширение.Имя, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации(НСтр("ru = 'Исправления.Удаление'", ОбщегоНазначения.КодОсновногоЯзыка()) , УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки); КонецПопытки; @@ -199,13 +199,13 @@ Сообщения["[СообщениеВосстановлениеБазы]"] = НСтр("ru = 'Восстановление ИБ из временного архива'"); Сообщения["[СообщениеНачалоСеансаСоединенияСБазой]"] = НСтр("ru = 'Начат сеанс внешнего соединения с ИБ'"); Сообщения["[СообщениеУдалениеЗадачиПланировщика]"] = НСтр("ru = 'Удаление задачи планировщика задач: {0}'"); - Сообщения["[СообщениеОтказУдаленияЗадачиПланировщика]"] = НСтр("ru = 'Ошибка при удалении задачи из планировщика задач: {0}'"); + Сообщения["[СообщениеОтказУдаленияЗадачиПланировщика]"] = НСтр("ru = 'Задача из планировщика задач не была удалена по причине: {0}'"); Сообщения["[СообщениеОтказСоединенияСБазой]"] = НСтр("ru = 'Исключение при создании COM-соединения: {0}, {1}'"); Сообщения["[СообщениеВызовЗавершитьОбновление]"] = "ОбновлениеКонфигурации.ЗавершитьОбновление" + "({0}, {1}, {2})"; Сообщения["[СообщениеОтказПриВызовеЗавершитьОбновление]"] = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Исключение при вызове %1: {0}, {1}'"), "ОбновлениеКонфигурации.ЗавершитьОбновление"); Сообщения["[СообщениеРезультатОбновленияБазы]"] = НСтр("ru = 'Обновление информационной базы завершилась успешно'"); - Сообщения["[СообщениеОтказОбновленияБазы]"] = НСтр("ru = 'Ошибка при обновлении информационной базы'"); + Сообщения["[СообщениеОтказОбновленияБазы]"] = НСтр("ru = 'Непредвиденная ситуация при обновлении информационной базы'"); Сообщения["[СообщениеПараметрыБазы]"] = НСтр("ru = 'Параметры информационной базы: {0}.'"); Сообщения["[СообщениеОтказЛогирования]"] = НСтр("ru = 'Исключение при записи журнала: {0}, {1}'"); Сообщения["[СообщениеОбновлениеЛогирование1С]"] = НСтр("ru = 'Протокол обновления сохранен в журнал регистрации.'"); @@ -233,7 +233,7 @@ Сообщения["[СообщениеВызовВыполнитьОбновлениеИнформационнойБазы]"] = "ОбновлениеИнформационнойБазыВызовСервера.ВыполнитьОбновлениеИнформационнойБазы" + "({0})"; Сообщения["[СообщениеОтказВызоваВыполнитьОбновлениеИнформационнойБазы]"] = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Исключение при вызове %1: {0}, {1}.'"), "ОбновлениеИнформационнойБазыВызовСервера.ВыполнитьОбновлениеИнформационнойБазы"); - Сообщения["[СообщениеОтказОбновленияБазыОбщее]"] = НСтр("ru = 'При выполнении обновления информационной базы произошла ошибка:'"); + Сообщения["[СообщениеОтказОбновленияБазыОбщее]"] = НСтр("ru = 'Не удалось обновить информационную базу по причине:'"); Сообщения["[СообщениеБлокировкаБазы]"] = НСтр("ru = 'в связи с необходимостью обновления конфигурации'"); Сообщения["[СообщениеОтказЗавершенияРаботыПользователей]"] = НСтр("ru = 'Попытка завершения работы пользователей завершилась безуспешно: отменена блокировка ИБ.'"); Сообщения["[СообщениеОтменаБлокировкиРаботыПользователей]"] = НСтр("ru = 'Исключение при завершении работы пользователей: {0}, {1}'"); @@ -265,11 +265,11 @@ Сообщения["[СообщениеЗавершениеОбновления]"] = НСтр("ru = 'Завершение'"); // Сообщения в макете СкриптУдаленияПатчей - Сообщения["[СообщениеОтказИнициализации]"] = НСтр("ru = 'Ошибка инициализации переменных'"); + Сообщения["[СообщениеОтказИнициализации]"] = НСтр("ru = 'Переменные не инициализированы'"); Сообщения["[СообщениеСозданиеОбъектаCOMСоединителя]"] = НСтр("ru = 'Создание объекта COM-соединителя...'"); - Сообщения["[СообщениеОтказСозданияОбъектаCOMСоединителя]"] = НСтр("ru = 'Ошибка создания объекта COM-соединителя:'"); + Сообщения["[СообщениеОтказСозданияОбъектаCOMСоединителя]"] = НСтр("ru = 'Не удалось создать объект COM-соединителя:'"); Сообщения["[СообщениеУстановкаСоединенияСБазой]"] = НСтр("ru = 'Установка соединения с'"); - Сообщения["[СообщениеОтказСоединенияСБазойОбщее]"] = НСтр("ru = 'Ошибка установки соединения с'"); + Сообщения["[СообщениеОтказСоединенияСБазойОбщее]"] = НСтр("ru = 'Не удалось установить соединение с'"); Сообщения["[СообщениеОсновноеСобытие]"] = НСтр("ru = 'Удаление исправлений (патчей)'"); Сообщения["[СообщениеВызовУдалитьИсправленияИзСкрипта]"] = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Вызов %1...'"), "ОбновлениеКонфигурацииВызовСервера.УдалитьИсправленияИзСкрипта"); diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl index adc7c479c..700ac096a 100644 --- a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl @@ -29,14 +29,13 @@ Результат.Вставить("ПоддерживаетсяУстановкаИсправлений", Ложь); Результат.Вставить("ОписаниеОшибки", ""); - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); - Если ПараметрыРаботыКлиента.РазделениеВключено Тогда + Если ОбщегоНазначенияКлиент.РазделениеВключено() Тогда Результат.ОписаниеОшибки = НСтр("ru = 'Установка обновлений для приложения в Интернете выполняется централизованно через Менеджер сервиса.'"); Возврат Результат; КонецЕсли; - Если Не ПараметрыРаботыКлиента.ЭтоАдминистраторСистемы Тогда + Если Не СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ЭтоАдминистраторСистемы Тогда Результат.ОписаниеОшибки = НСтр("ru = 'Для установки обновления требуются права администрирования.'"); Возврат Результат; КонецЕсли; @@ -526,10 +525,6 @@ Если Не ЭтоНомерВерсии Тогда Продолжить; КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(НомерВерсииПрограммы, "8.3.18.0") < 0 Тогда - КодировкаЛогФайла = "ASCII"; - Продолжить; - КонецЕсли; КонецЦикла; Возврат КодировкаЛогФайла; @@ -597,11 +592,12 @@ КонецЕсли; #Если Не ВебКлиент И Не МобильныйКлиент Тогда - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); - Если ПараметрыРаботыКлиента.РазделениеВключено Или Не ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда + Если ОбщегоНазначенияКлиент.РазделениеВключено() + Или Не ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат; КонецЕсли; + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыРаботыКлиента.Свойство("ПоказатьСообщениеОбОшибочныхОбработчиках") Тогда Возврат; // Форма результатов обновления будет показана позже. КонецЕсли; diff --git a/SSL/src/CommonModules/Обсуждения/Module.bsl b/SSL/src/CommonModules/Обсуждения/Module.bsl index 884403d6c..6afb2a83c 100644 --- a/SSL/src/CommonModules/Обсуждения/Module.bsl +++ b/SSL/src/CommonModules/Обсуждения/Module.bsl @@ -238,7 +238,7 @@ Попытка Результат.Вставить(Идентификатор, ПользовательИнформационнойБазы(Идентификатор)); Исключение - Ошибки.Добавить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Ошибки.Добавить(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Результат.Вставить(Идентификатор, Неопределено); КонецПопытки; КонецЦикла; @@ -311,7 +311,7 @@ Попытка Результат.Вставить(Пользователь, ПользовательСистемыВзаимодействия(Пользователь)); Исключение - Ошибки.Добавить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Ошибки.Добавить(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Результат.Вставить(Пользователь, Неопределено); КонецПопытки; @@ -401,7 +401,7 @@ Если Не ЕстьСоединениеССерверомВзаимодействия Тогда ВызватьИсключение; КонецЕсли; - ОшибкаПолучениеИдентификатораСВ = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ОшибкаПолучениеИдентификатораСВ = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Если Результат = Неопределено Тогда @@ -414,20 +414,20 @@ Ошибка = ИнформацияОбОшибке(); ОписаниеОшибки = ?(Не ЗначениеЗаполнено(ОшибкаПолучениеИдентификатораСВ), "", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При получении идентификатора пользователя системы взаимодействия - |для пользователя %1 (%2) произошла ошибка: + НСтр("ru = 'Не удалось получить идентификатор пользователя системы взаимодействия для пользователя %1 (%2) + |по причине: |%3'"), Строка(Пользователь), Строка(ИдентификаторПользователяИнформационнойБазы), ОшибкаПолучениеИдентификатораСВ) + Символы.ПС + Символы.ПС); ОписаниеОшибки = ОписаниеОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При создании пользователя системы взаимодействия - |для пользователя %1 (%2) произошла ошибка: + НСтр("ru = 'Не удалось создать пользователя системы взаимодействия для пользователя %1 (%2) + |по причине: |%3'"), Строка(Пользователь), Строка(ИдентификаторПользователяИнформационнойБазы), - ПодробноеПредставлениеОшибки(Ошибка)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(Ошибка)); ЗаписьЖурналаРегистрации(ОбсужденияСлужебный.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки); @@ -475,7 +475,7 @@ УровеньЖурналаРегистрации.Ошибка, Пользователь.Метаданные(), Пользователь.Ссылка, - ОписаниеОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(Ошибка)); + ОписаниеОшибки + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(Ошибка)); КонецПопытки; КонецПроцедуры @@ -608,7 +608,7 @@ // АПК:1405-вкл // АПК:1297-вкл - КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + КраткоеПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); Для Каждого СтрокаНаРазныхЯзыках Из СтрокиНаРазныхЯзыках Цикл //@skip-check bsl-nstr-string-literal-format diff --git a/SSL/src/CommonModules/ОбсужденияКлиент/Module.bsl b/SSL/src/CommonModules/ОбсужденияКлиент/Module.bsl index 5e723265a..f1da2d2da 100644 --- a/SSL/src/CommonModules/ОбсужденияКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбсужденияКлиент/Module.bsl @@ -27,4 +27,19 @@ ОбсужденияСлужебныйКлиент.ПоказатьОтключение(); КонецПроцедуры +// Возвращает Истина, если система взаимодействия подключена и доступна для использования. +// +// Делает вызов сервера, что гарантирует получение корректного состояния в случае, +// когда данные регистрации информационной базы были изменены методом +// СистемаВзаимодействия.УстановитьДанныеРегистрацииИнформационнойБазы. +// +// Возвращаемое значение: +// Булево +// +Функция ОбсужденияДоступны() Экспорт + + Возврат ОбсужденияСлужебныйВызовСервера.Подключены(); + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбсужденияСлужебный/Module.bsl b/SSL/src/CommonModules/ОбсужденияСлужебный/Module.bsl index cd9b14cfc..d360a154c 100644 --- a/SSL/src/CommonModules/ОбсужденияСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ОбсужденияСлужебный/Module.bsl @@ -135,8 +135,8 @@ Обработчик.Комментарий = НСтр("ru='Блокировка недействительных пользователей в системе взаимодействия.'"); Обработчик.ПроцедураЗаполненияДанныхОбновления = "ОбсужденияСлужебный.ПользователиДляБлокировкиВСистемеВзаимодействий"; Обработчик.ЧитаемыеОбъекты = "Справочник.Пользователи"; - Обработчик.ИзменяемыеОбъекты = "Справочник.Пользователи"; - Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; + Обработчик.ИзменяемыеОбъекты = "ПользовательСистемыВзаимодействия"; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; КонецПроцедуры @@ -151,36 +151,33 @@ // ИнформацияОбОшибке, Неопределено // Функция ЗаблокироватьПользователяСистемыВзаимодействия(Пользователь) Экспорт + Результат = Неопределено; - - ИдентификаторПользователяСВ = Неопределено; - ШаблонЗаписиЖурналаРегистрации = НСтр("ru='Пользователь %1 недействителен. Пользователь системы взаимодействий заблокирован'"); - ИдентификаторПользователяИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Пользователь, "ИдентификаторПользователяИБ"); Если Не ЗначениеЗаполнено(ИдентификаторПользователяИБ) Тогда Возврат Результат; КонецЕсли; - // АПК:280-выкл - При отсутствии пользователя система взаимодействия может выбросить исключение. + ИдентификаторПользователяСВ = Неопределено; Попытка ИдентификаторПользователяСВ = СистемаВзаимодействия.ПолучитьИдентификаторПользователя( ИдентификаторПользователяИБ); Исключение - // Если выброшено исключение, то пользователя системы взаимодействия не удалось найти. + // АПК:280 Если выброшено исключение, то пользователя системы взаимодействия не удалось найти. КонецПопытки; - // АПК:280-вкл Если ИдентификаторПользователяСВ = Неопределено Тогда Возврат Результат; КонецЕсли; + ШаблонЗаписиЖурналаРегистрации = НСтр("ru='Пользователь %1 недействителен. Пользователь системы взаимодействий заблокирован'"); Попытка ПользовательСВ = СистемаВзаимодействия.ПолучитьПользователя(ИдентификаторПользователяСВ); ПользовательСВ.Заблокирован = Истина; ПользовательСВ.Записать(); ЗаписьЖурналаРегистрации( СобытиеЖурналаРегистрации(НСтр("ru='Блокировка недействительных пользователей'", ОбщегоНазначения.КодОсновногоЯзыка())), - УровеньЖурналаРегистрации.Информация,,Пользователь, + УровеньЖурналаРегистрации.Информация,, Пользователь, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗаписиЖурналаРегистрации, Пользователь)); Исключение Результат = ИнформацияОбОшибке(); @@ -235,7 +232,7 @@ Ошибка = ЗаблокироватьПользователяСистемыВзаимодействия(Пользователь); Если Ошибка <> Неопределено Тогда ОбъектыСОшибками = ОбъектыСОшибками + 1; - ТекстПоследнейОшибки = ПодробноеПредставлениеОшибки(Ошибка); + ТекстПоследнейОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(Ошибка); КонецЕсли; КонецЦикла; @@ -296,21 +293,17 @@ Процедура СоздатьИзменитьИнтеграцию(Параметры) Экспорт Идентификатор = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "Идентификатор"); - // АПК:488-выкл безопасный код Если Идентификатор <> Неопределено Тогда - НоваяИнтеграция = Вычислить("СистемаВзаимодействия.ПолучитьИнтеграцию(Идентификатор)"); // ИнтеграцияСистемыВзаимодействия + НоваяИнтеграция = СистемаВзаимодействия.ПолучитьИнтеграцию(Идентификатор); Иначе - НоваяИнтеграция = Вычислить("СистемаВзаимодействия.СоздатьИнтеграцию()"); // ИнтеграцияСистемыВзаимодействия + НоваяИнтеграция = СистемаВзаимодействия.СоздатьИнтеграцию(); КонецЕсли; - // АПК:488-вкл НоваяИнтеграция.ТипВнешнейСистемы = Параметры.Тип; НоваяИнтеграция.Представление = Параметры.Ключ; НоваяИнтеграция.Ключ = Параметры.Ключ; НоваяИнтеграция.Использование = Истина; - // АПК:488-выкл безопасный код - ОписаниеВнешнейСистемы = Вычислить("СистемаВзаимодействия.ПолучитьОписаниеВнешнейСистемы(Параметры.Тип)"); // ОписаниеВнешнейСистемыСистемыВзаимодействия - // АПК:488-вкл + ОписаниеВнешнейСистемы = СистемаВзаимодействия.ПолучитьОписаниеВнешнейСистемы(Параметры.Тип); НеУказанныеПараметры = Новый Массив; Для каждого ПараметрИнтеграции Из ОписаниеВнешнейСистемы.ОписанияПараметров Цикл @@ -340,9 +333,7 @@ Процедура ОтключитьИнтеграцию(Идентификатор) Экспорт - // АПК:488-выкл безопасный код - Интеграция = Вычислить("СистемаВзаимодействия.ПолучитьИнтеграцию(Идентификатор)"); - // АПК:488-вкл + Интеграция = СистемаВзаимодействия.ПолучитьИнтеграцию(Идентификатор); Интеграция.Использование = Ложь; Интеграция.Записать(); diff --git a/SSL/src/CommonModules/ОбсужденияСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ОбсужденияСлужебныйКлиент/Module.bsl index e57049bfe..afe0cee23 100644 --- a/SSL/src/CommonModules/ОбсужденияСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбсужденияСлужебныйКлиент/Module.bsl @@ -158,9 +158,9 @@ НСтр("ru = 'Обсуждения.Ошибка отмены регистрации информационной базы'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), "Ошибка", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке),, Истина); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке),, Истина); - ПоказатьИнформациюОбОшибке(ИнформацияОбОшибке); + ОбработкаОшибок.ПоказатьИнформациюОбОшибке(ИнформацияОбОшибке); КонецПроцедуры diff --git a/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl index bb5584e2e..b55854a33 100644 --- a/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl @@ -147,7 +147,7 @@ ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Неверный первый параметр %1 в функции %2: |%3'"), "Ссылка", "ОбщегоНазначения.ЗначенияРеквизитовОбъекта", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение ТекстОшибки; КонецПопытки; @@ -158,7 +158,7 @@ // Если предопределенный не создан в ИБ, то требуется выполнить проверку доступа к объекту. // В других сценариях проверка доступа выполняется в момент исполнения запроса. Если Ссылка = Неопределено Тогда - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных); + МетаданныеОбъекта = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъектаМетаданных); Если Не ПравоДоступа("Чтение", МетаданныеОбъекта) Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Недостаточно прав для работы с таблицей ""%1""'"), ПолноеИмяОбъектаМетаданных); @@ -775,6 +775,40 @@ КонецФункции +// Возвращает информацию о том, являются ли переданные элементы предопределенными. +// Если нет прав доступа на уровне записей, то элемент не включается в результат. +// Если нет прав доступа к таблице, то вызывается исключение. +// +// Параметры: +// Элементы - Массив из ЛюбаяСсылка +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение - список объектов и значений их реквизитов: +// * Ключ - ЛюбаяСсылка - ссылка на объект. +// * Значение - Булево - Истина, если это ссылка на предопределенный элемент. +// +Функция ЭтоПредопределенныеЭлементы(Знач Элементы) Экспорт + + ИменаРеквизитов = Новый Массив; + Для каждого ИмяРеквизита Из СтандартныеПодсистемыСервер.РеквизитыПредопределенныхДанных() Цикл + ИменаРеквизитов.Добавить(ИмяРеквизита.Ключ); + КонецЦикла; + + ЗначенияРеквизитов = СтандартныеПодсистемыСервер.ЗначенияРеквизитовОбъектовЕслиСуществуют(Элементы, ИменаРеквизитов); + Результат = Новый Соответствие; + Для каждого Элемент Из ЗначенияРеквизитов Цикл + ЭтоПредопределенныйЭлемент = Ложь; + Для каждого Значение Из Элемент.Значение Цикл + Если ЗначениеЗаполнено(Значение.Значение) Тогда + ЭтоПредопределенныйЭлемент = Истина; + КонецЕсли; + КонецЦикла; + Результат[Элемент.Ключ] = ЭтоПредопределенныйЭлемент; + КонецЦикла; + Возврат Результат; + +КонецФункции + // Проверяет статус проведения переданных документов и возвращает // те из них, которые не проведены. // @@ -863,7 +897,7 @@ ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведения); ВыполненоУспешно = Истина; Исключение - ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Иначе ПредставлениеОшибки = НСтр("ru = 'Поля документа не заполнены.'"); @@ -898,31 +932,16 @@ Если ТипЗнч(СсылкаИлиМассивСсылок) = Тип("Массив") Тогда МассивСсылок = СсылкаИлиМассивСсылок; Иначе - МассивСсылок = Новый Массив; - МассивСсылок.Добавить(СсылкаИлиМассивСсылок); + МассивСсылок = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СсылкаИлиМассивСсылок); КонецЕсли; УстановитьПривилегированныйРежим(Истина); МестаИспользования = НайтиПоСсылкам(МассивСсылок); УстановитьПривилегированныйРежим(Ложь); - // МестаИспользования - ТаблицаЗначений - где: - // * Ссылка - ЛюбаяСсылка - Ссылка, которая анализируется. - // * Данные - Произвольный - Данные, содержащие анализируемую ссылку. - // * Метаданные - ОбъектМетаданных - Метаданные найденных данных. - Если Не ИскатьСредиСлужебныхОбъектов Тогда - ИсключенияПоискаСсылок = ИсключенияПоискаСсылок(); - Исключения = Новый Массив; - - Для Каждого МестоИспользования Из МестаИспользования Цикл - Если ЭтоСлужебнаяСвязьДанных(МестоИспользования, ИсключенияПоискаСсылок) Тогда - Исключения.Добавить(МестоИспользования); - КонецЕсли; - КонецЦикла; - - Для Каждого МестоИспользования Из Исключения Цикл - МестаИспользования.Удалить(МестоИспользования); + Для каждого Элемент Из СлужебныеСвязиДанных(МестаИспользования) Цикл + МестаИспользования.Удалить(Элемент.Ключ); КонецЦикла; КонецЕсли; @@ -930,6 +949,206 @@ КонецФункции + +// Определяет, указаны ли места использования в исключениях поиска ссылок. +// +// Параметры: +// МестаИспользования - ТаблицаЗначений - результат функции НайтиПоСсылкам: +// * Ссылка - ЛюбаяСсылка - проверяемая ссылка. +// * Данные - ЛюбаяСсылка - место использования. +// * Метаданные - ОбъектМетаданных - метаданные места использования. +// ИсключенияПоискаСсылок - см. ИсключенияПоискаСсылок +// +// Возвращаемое значение: +// Соответствие из КлючЗначение: +// * Ключ - СтрокаТаблицыЗначений +// * Значение - Булево - всегда Истина. Если это не служебная связь данных, то в соответствии нет элемента. +// +Функция СлужебныеСвязиДанных(Знач МестаИспользования, Знач ИсключенияПоискаСсылок = Неопределено) Экспорт + + Если ИсключенияПоискаСсылок = Неопределено Тогда + ИсключенияПоискаСсылок = ИсключенияПоискаСсылок(); + КонецЕсли; + + Результат = Новый Соответствие; + МестоИспользованияПоМетаданным = Новый Соответствие; + + Для каждого МестоИспользования Из МестаИспользования Цикл + ИсключениеПоиска = ИсключенияПоискаСсылок[МестоИспользования.Метаданные]; + + // Данные могут быть как ссылкой, так и ключом записи регистра. + Если ИсключениеПоиска = Неопределено Тогда + Если МестоИспользования.Ссылка = МестоИспользования.Данные Тогда + Результат[МестоИспользования] = Истина; // Ссылку саму на себя исключаем. + КонецЕсли; + Продолжить; + ИначеЕсли ИсключениеПоиска = "*" Тогда + Результат[МестоИспользования] = Истина; // Если указано исключить все - считаем все исключением. + Продолжить; + КонецЕсли; + + ЭтоСсылка = ЭтоСсылка(ТипЗнч(МестоИспользования.Данные)); + Если Не ЭтоСсылка Тогда + Для Каждого ПутьКРеквизиту Из ИсключениеПоиска Цикл + ЗначениеРеквизита = Новый Структура(ПутьКРеквизиту); + ЗаполнитьЗначенияСвойств(ЗначениеРеквизита, МестоИспользования.Данные); + Если ЗначениеРеквизита[ПутьКРеквизиту] = МестоИспользования.Ссылка Тогда + Результат[МестоИспользования] = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + Продолжить; + КонецЕсли; + + Если ИсключениеПоиска.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + + ИмяТаблицы = МестоИспользования.Метаданные.ПолноеИмя(); + Значение = МестоИспользованияПоМетаданным[ИмяТаблицы]; + Если Значение = Неопределено Тогда + Значение = Новый ТаблицаЗначений; + Значение.Колонки.Добавить("Ссылка", ОписаниеТипаВсеСсылки()); + Значение.Колонки.Добавить("Данные", ОписаниеТипаВсеСсылки()); + Значение.Колонки.Добавить("Метаданные"); + МестоИспользованияПоМетаданным[ИмяТаблицы] = Значение; + КонецЕсли; + ЗаполнитьЗначенияСвойств(Значение.Добавить(), МестоИспользования); + + КонецЦикла; + + Индекс = 1; + Запрос = Новый Запрос; + ТекстыЗапроса = Новый Массив; + ВременныеТаблицы = Новый Массив; + + Для каждого МестоИспользования Из МестоИспользованияПоМетаданным Цикл + + ИмяТаблицы = МестоИспользования.Ключ; // Строка + МестоИспользования = МестоИспользования.Значение; // ТаблицаЗначений + + // Проверка, есть ли по исключаемому пути в указанных данных проверяемая ссылка. + Если МестоИспользования.Количество() > 1 Тогда + ШаблонЗапроса = + "ВЫБРАТЬ + | Ссылки.Данные КАК Ссылка, + | Ссылки.Ссылка КАК ПроверяемаяСсылка + |ПОМЕСТИТЬ ВТТаблицаСсылок + |ИЗ + | &Ссылки КАК Ссылки + |; + | + |ВЫБРАТЬ + | ТаблицаСсылок.Ссылка КАК Ссылка, + | ТаблицаСсылок.ПроверяемаяСсылка КАК ПроверяемаяСсылка + |ИЗ + | ВТТаблицаСсылок КАК ТаблицаСсылок + | ЛЕВОЕ СОЕДИНЕНИЕ #ПолноеИмяОбъектаМетаданных КАК Таблица + | ПО ТаблицаСсылок.Ссылка = Таблица.Ссылка + |ГДЕ + | &Условие"; + + ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "#ПолноеИмяОбъектаМетаданных", ИмяТаблицы); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВТТаблицаСсылок", "ВТТаблицаСсылок" + Формат(Индекс, "ЧГ=;ЧН=")); + + ИмяПараметра = "Ссылки" + Формат(Индекс, "ЧГ=;ЧН="); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Ссылки", "&" + ИмяПараметра); + Запрос.УстановитьПараметр(ИмяПараметра, МестоИспользования); + + ЧастиЗапроса = СтрРазделить(ТекстЗапроса, ";"); + ВременныеТаблицы.Добавить(ЧастиЗапроса[0]); + ТекстЗапроса = ЧастиЗапроса[1]; + + Иначе + ШаблонЗапроса = + "ВЫБРАТЬ + | &Ссылка КАК Ссылка, + | &ПроверяемаяСсылка КАК ПроверяемаяСсылка + |ИЗ + | #ПолноеИмяОбъектаМетаданных КАК Таблица + |ГДЕ + | Таблица.Ссылка = &Ссылка + | И (&Условие)"; + + ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "#ПолноеИмяОбъектаМетаданных", ИмяТаблицы); + + ИмяПараметра = "Ссылка" + Формат(Индекс, "ЧГ=;ЧН="); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Ссылка", "&" + ИмяПараметра); + Запрос.УстановитьПараметр(ИмяПараметра, МестоИспользования[0].Данные); + + ИмяПараметра = "ПроверяемаяСсылка" + Формат(Индекс, "ЧГ=;ЧН="); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПроверяемаяСсылка", "&" + ИмяПараметра); + Запрос.УстановитьПараметр(ИмяПараметра, МестоИспользования[0].Ссылка); + + КонецЕсли; + + ТекстУсловия = Новый Массив; + // Относительный путь к реквизиту: "<ИмяРеквизитаИлиТЧ>[.<ИмяРеквизитаТЧ>]". + Для Каждого ПутьКРеквизиту Из ИсключенияПоискаСсылок[МестоИспользования[0].Метаданные] Цикл + ТекстУсловия.Добавить(ПутьКРеквизиту + " = " + + ?(МестоИспользования.Количество() > 1, "ТаблицаСсылок.ПроверяемаяСсылка", "&" + ИмяПараметра)); + КонецЦикла; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Условие", СтрСоединить(ТекстУсловия, " ИЛИ ")); + + ТекстыЗапроса.Добавить(ТекстЗапроса); + Индекс = Индекс + 1; + + КонецЦикла; + + Если ТекстыЗапроса.Количество() = 0 Тогда + Возврат Результат; + КонецЕсли; + + Запрос.Текст = СтрСоединить(ВременныеТаблицы, ";" + Символы.ПС) + + ?(ВременныеТаблицы.Количество() > 0, ";" + Символы.ПС, "") + + СтрСоединить(ТекстыЗапроса, Символы.ПС + "ОБЪЕДИНИТЬ" + Символы.ПС); + УстановитьПривилегированныйРежим(Истина); + ВыборкаЗапроса = Запрос.Выполнить().Выбрать(); + УстановитьПривилегированныйРежим(Ложь); + + МестаИспользования.Индексы.Добавить("Ссылка,Данные"); + Пока ВыборкаЗапроса.Следующий() Цикл + СлужебныеСвязиДанных = МестаИспользования.НайтиСтроки(Новый Структура("Ссылка,Данные", + ВыборкаЗапроса.ПроверяемаяСсылка, ВыборкаЗапроса.Ссылка)); + Для каждого СлужебнаяСвязьДанных Из СлужебныеСвязиДанных Цикл + Результат[СлужебнаяСвязьДанных] = Истина; + КонецЦикла; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Определяет, указано ли место использования в исключениях поиска ссылок. +// +// Параметры: +// МестоИспользования - Структура: +// * Ссылка - ЛюбаяСсылка - проверяемая ссылка. +// * Данные - ЛюбаяСсылка - место использования. +// * Метаданные - ОбъектМетаданных - метаданные места использования. +// ИсключенияПоискаСсылок - см. ИсключенияПоискаСсылок +// +// Возвращаемое значение: +// Булево +// +Функция ЭтоСлужебнаяСвязьДанных(Знач МестоИспользования, Знач ИсключенияПоискаСсылок = Неопределено) Экспорт + + Если ИсключенияПоискаСсылок = Неопределено Тогда + ИсключенияПоискаСсылок = ИсключенияПоискаСсылок(); + КонецЕсли; + + Значение = Новый ТаблицаЗначений; + Значение.Колонки.Добавить("Ссылка", ОписаниеТипаВсеСсылки()); + Значение.Колонки.Добавить("Данные", ОписаниеТипаВсеСсылки()); + Значение.Колонки.Добавить("Метаданные"); + МестоИспользованияСтрока = Значение.Добавить(); + ЗаполнитьЗначенияСвойств(МестоИспользованияСтрока, МестоИспользования); + + Результат = СлужебныеСвязиДанных(Значение, ИсключенияПоискаСсылок); + Возврат Результат[МестоИспользованияСтрока] <> Неопределено; + +КонецФункции + // Производит замену ссылок во всех данных. После замены неиспользуемые ссылки опционально удаляются. // Замена ссылок происходит с транзакциями по изменяемому объекту и его связям, не по анализируемой ссылке. // При вызове в неразделенном сеансе не выявляет ссылок в разделенных областях. @@ -991,7 +1210,7 @@ КонецЕсли; Дубли = СформироватьДубли(ПараметрыВыполнения, ПараметрыЗамены, ПарыЗамен, Результат); - ТаблицаПоиска = МестаИспользования(Дубли,,ПараметрыВыполнения.ПараметрыПоискаМестИспользования); + ТаблицаПоиска = МестаИспользования(Дубли,, ПараметрыВыполнения.ПараметрыПоискаМестИспользования); // Для каждой ссылки объекта будем производить замены в порядке "Константа", "Объект", "Набор". // Одновременно пустая строка в этой колонке - флаг того, что эта замена не нужна или уже была произведена. @@ -1004,21 +1223,31 @@ ТаблицаПоиска.Колонки.Добавить("Обработано", Новый ОписаниеТипов("Булево")); // Определяем порядок обработки и проверяем то, что можно обработать. + ОшибкиРазметки = Новый Массив; + ОбъектыСОшибками = Новый Массив; Количество = Дубли.Количество(); Для Номер = 1 По Количество Цикл ОбратныйИндекс = Количество - Номер; Дубль = Дубли[ОбратныйИндекс]; РезультатРазметки = РазметитьМестаИспользования(ПараметрыВыполнения, Дубль, ПарыЗамен[Дубль], ТаблицаПоиска); Если Не РезультатРазметки.Успех Тогда - // Найдены неизвестные типы замены, не будем работать с этой ссылкой, возможно нарушение связности. Дубли.Удалить(ОбратныйИндекс); Для Каждого Ошибка Из РезультатРазметки.ОшибкиРазметки Цикл - ПредставлениеОбъектаОшибки = ПредметСтрокой(Ошибка.Объект); - ЗарегистрироватьОшибкуЗамены(Результат, Дубль, - ОписаниеОшибкиЗамены("НеизвестныеДанные", Ошибка.Объект, ПредставлениеОбъектаОшибки, Ошибка.Текст)); + Ошибка.Вставить("Дубль", Дубль); + ОбъектыСОшибками.Добавить(Ошибка.Объект); КонецЦикла; + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ОшибкиРазметки, РезультатРазметки.ОшибкиРазметки); КонецЕсли; КонецЦикла; + + Если ОшибкиРазметки.Количество() > 0 Тогда + ПредставленияОбъектов = ПредметыСтрокой(ОбъектыСОшибками); + Для Каждого Ошибка Из ОшибкиРазметки Цикл + ЗарегистрироватьОшибкуЗамены(Результат, Ошибка.Дубль, + ОписаниеОшибкиЗамены("НеизвестныеДанные", Ошибка.Объект, ПредставленияОбъектов[Ошибка.Объект], + Ошибка.Текст)); + КонецЦикла; + КонецЕсли; // Замена и удаление найденных дублей. ПараметрыВыполнения.Вставить("ПарыЗамен", ПарыЗамен); @@ -1035,6 +1264,7 @@ БылиОшибки = Результат.ЕстьОшибки; Результат.ЕстьОшибки = Ложь; + // @skip-check query-in-loop - Порционная обработка большого объема данных. ЗаменитьСсылкиКороткимиТранзакциями(Результат, ПараметрыВыполнения, Дубль, ТаблицаПоиска); Если НЕ Результат.ЕстьОшибки Тогда @@ -1043,7 +1273,7 @@ Результат.ЕстьОшибки = Результат.ЕстьОшибки ИЛИ БылиОшибки; ДлительныеОперации.СообщитьПрогресс(Номер, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Замена дублей... обработано (%1 из %2)'"), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Замена дублей... обработано %1 из %2.'"), Номер, КоличествоДублей)); Номер = Номер + 1; ДобавитьВСтатистикуЗаменыСсылок(Статистика, Дубль, Результат.ЕстьОшибки); @@ -1059,7 +1289,6 @@ ВызватьИсключение; КонецПопытки; - Если ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") И ПараметрыВыполнения.УдалятьНепосредственно Тогда @@ -1114,8 +1343,7 @@ // // Параметры: // НаборСсылок - Массив из ЛюбаяСсылка - ссылки, для которых ищем места использования. -// АдресРезультата - Строка - адрес во временном хранилище, куда будет помещен копия результата -// замены. +// АдресРезультата - Строка - адрес во временном хранилище, куда будет помещен копия результата замены. // ДополнительныеПараметры - см. ОбщегоНазначения.ПараметрыПоискаМестИспользования // // Возвращаемое значение: @@ -1182,20 +1410,19 @@ КонецЕсли; КонецЦикла; - ОтменаИсключенийПоискаСсылок = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( - ДополнительныеПараметры, - "ОтменаИсключенийПоискаСсылок", - Новый Массив); + ОтменаИсключенийПоискаСсылок = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеПараметры, + "ОтменаИсключенийПоискаСсылок", Новый Массив); Для каждого ОтменаИсключения Из ОтменаИсключенийПоискаСсылок Цикл ИсключенияПоискаСсылок.Удалить(ОтменаИсключения); КонецЦикла; + СлужебныеСвязиДанных = СлужебныеСвязиДанных(МестаИспользования, ИсключенияПоискаСсылок); КэшИзмеренийРегистров = Новый Соответствие; Для Каждого МестоИспользования Из МестаИспользования Цикл ТипДанных = ТипЗнч(МестоИспользования.Данные); - ЭтоСлужебныеДанные = ЭтоСлужебнаяСвязьДанных(МестоИспользования, ИсключенияПоискаСсылок); + ЭтоСлужебныеДанные = СлужебныеСвязиДанных[МестоИспользования] <> Неопределено; ЭтоВспомогательныеДанные = ЭтоСлужебныеДанные; Если МетаданныеДокументов.Содержит(МестоИспользования.Метаданные) Тогда @@ -1229,7 +1456,7 @@ Представление = МестоИспользования.Метаданные.Представление(); КонецЕсли; - ОписаниеИзмерений = ""; + ОписаниеИзмерений = Новый Массив; Для Каждого МетаданныеРеквизитыИсключения Из ОписаниеИзмеренийНабора(МестоИспользования.Метаданные, КэшИзмеренийРегистров) Цикл Значение = МестоИспользования.Данные[МетаданныеРеквизитыИсключения.Ключ]; Описание = МетаданныеРеквизитыИсключения.Значение; @@ -1238,19 +1465,19 @@ ЭтоВспомогательныеДанные = Истина; КонецЕсли; КонецЕсли; - ФорматЗначения = Описание.Формат; - ОписаниеИзмерений = ОписаниеИзмерений + ", " + Описание.Представление + " """ - + ?(ФорматЗначения = Неопределено, Строка(Значение), Формат(Значение, ФорматЗначения)) + """"; + Если Не ЭтоСлужебныеДанные Тогда // для оптимизации + ФорматЗначения = Описание.Формат; + ОписаниеИзмерений.Добавить(Описание.Представление + " """ + + ?(ФорматЗначения = Неопределено, Строка(Значение), Формат(Значение, ФорматЗначения)) + """"); + КонецЕсли; КонецЦикла; - ОписаниеИзмерений = Сред(ОписаниеИзмерений, 3); - Если Не ПустаяСтрока(ОписаниеИзмерений) Тогда - Представление = Представление + " (" + ОписаниеИзмерений + ")"; + Если ОписаниеИзмерений.Количество() > 0 Тогда + Представление = Представление + " (" + СтрСоединить(ОписаниеИзмерений, ", ") + ")"; КонецЕсли; Иначе Представление = Строка(МестоИспользования.Данные); - КонецЕсли; МестоИспользования.ПредставлениеДанных = Представление; @@ -1311,7 +1538,7 @@ ПолноеИмя = ИсключениеПоиска; МассивПодстрок = СтрРазделить(ПолноеИмя, "."); КоличествоПодстрок = МассивПодстрок.Количество(); - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(МассивПодстрок[0] + "." + МассивПодстрок[1]); + ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмени(МассивПодстрок[0] + "." + МассивПодстрок[1]); Иначе ОбъектМетаданных = ИсключениеПоиска; ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); @@ -1640,6 +1867,48 @@ КонецФункции +// Возвращает системную информацию клиента, если есть клиентское приложение. +// До первого серверного вызова с клиента вернет Неопределено. +// +// Возвращаемое значение: +// ФиксированнаяСтруктура: +// * ВерсияОС - Строка +// * ВерсияПриложения - Строка +// * ИдентификаторКлиента - УникальныйИдентификатор +// * ИнформацияПрограммыПросмотра - Строка +// * ОперативнаяПамять - Число +// * Процессор - Строка +// * ТипПлатформы - см. ОбщегоНазначенияКлиентСервер.ИмяТипаПлатформы +// Неопределено - если нет клиентского приложения или информация запрашивается +// до первого серверного вызова, например, при первом вызове события +// платформы УстановкаПараметровСеанса в модуле сеанса. +// +Функция СистемнаяИнформацияКлиента() Экспорт + + УстановитьПривилегированныйРежим(Истина); + Возврат СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("СистемнаяИнформация"); + +КонецФункции + +// Возвращает имя используемого клиента, а для веб-браузера название и версию, если есть. +// До первого серверного вызова с клиента вернет Неопределено. +// +// Возвращаемое значение: +// Строка - варианты строк "ВебКлиент.<Название>[.<Версия>]", "ТонкийКлиент", +// "ТолстыйКлиентУправляемоеПриложение", "ТолстыйКлиентОбычноеПриложение", +// где <Название> - варианты строк "Chrome", "Firefox", "Safari", "IE", "Opera" +// или "Другой", когда не определен (ни один из указанных), например "ВебКлиент.Chrome.109". +// Неопределено - если нет клиентского приложения или информация запрашивается +// до первого серверного вызова, например, при первом вызове события +// платформы УстановкаПараметровСеанса в модуле сеанса. +// +Функция ИспользуемыйКлиент() Экспорт + + УстановитьПривилегированныйРежим(Истина); + Возврат СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ИспользуемыйКлиент"); + +КонецФункции + // Возвращает Истина, если включен режим отладки. // // Возвращаемое значение: @@ -1661,7 +1930,7 @@ // Функция ОперативнаяПамятьДоступнаяКлиентскомуПриложению() Экспорт - ДоступныйОбъем = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере(Ложь).Получить("ОперативнаяПамять"); + ДоступныйОбъем = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ОперативнаяПамять"); Возврат ДоступныйОбъем; КонецФункции @@ -1921,8 +2190,6 @@ // Устарели, следует использовать свойства МинимальнаяВерсияПлатформы и РекомендуемаяВерсияПлатформы: // * МинимальноНеобходимаяВерсияПлатформы - Строка - полный номер версии платформы для запуска программы. // Например, "8.3.4.365". -// Ранее определялись в -// ОбщегоНазначенияПереопределяемый.ПолучитьМинимальноНеобходимуюВерсиюПлатформы. // * РаботаВПрограммеЗапрещена - Булево - начальное значение Ложь. // Функция ОбщиеПараметрыБазовойФункциональности() Экспорт @@ -1942,6 +2209,90 @@ ОбщиеПараметры.МинимальнаяВерсияПлатформы = НомерСборкиПоТекущейВерсииПлатформы(ОбщиеПараметры.МинимальнаяВерсияПлатформы); ОбщиеПараметры.РекомендуемаяВерсияПлатформы = НомерСборкиПоТекущейВерсииПлатформы(ОбщиеПараметры.РекомендуемаяВерсияПлатформы); + // Обновление минимальной и рекомендуемой версии платформы по данным сервиса + Если ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ПолучениеОбновленийПрограммы") Тогда + + // Проверка версии БИП начиная с которой появился программный интерфейс + МодульИнтернетПоддержкаПользователейКлиентСервер = ОбщийМодуль("ИнтернетПоддержкаПользователейКлиентСервер"); + ВерсияБИП = МодульИнтернетПоддержкаПользователейКлиентСервер.ВерсияБиблиотеки(); + + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияБИП, "2.7.1.35") > 0 Тогда + + // Попытка получить данные версий платформы из кеша и переопределить их + Попытка + + МодульПолучениеОбновленийПрограммы = ОбщийМодуль("ПолучениеОбновленийПрограммы"); + ИнформацияОВерсияхПлатформы = МодульПолучениеОбновленийПрограммы.ИнформацияОВерсияхПлатформы(); + + // Контроль заполнения версий платформы по данным сервиса + Если Не ПустаяСтрока(ИнформацияОВерсияхПлатформы.МинимальнаяВерсияПлатформы) + Или Не ПустаяСтрока(ИнформацияОВерсияхПлатформы.РекомендуемаяВерсияПлатформы) Тогда + + Минимальная = НомерСборкиПоТекущейВерсииПлатформы( + ИнформацияОВерсияхПлатформы.МинимальнаяВерсияПлатформы); + Рекомендуемая = НомерСборкиПоТекущейВерсииПлатформы( + ИнформацияОВерсияхПлатформы.РекомендуемаяВерсияПлатформы); + + Если МинимальнаяИРекомендуемаяВерсияПлатформыЗаполненаНеПравильно(Минимальная, Рекомендуемая) Тогда + + МодульПолучениеОбновленийПрограммы.УдалитьИнформациюОВерсияхПлатформы(); + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Минимальная и рекомендуемая версии платформы ""1С:Предприятие"", полученные с сервиса обновления программ, не соответствуют следующим требованиям: + | - минимальная версия должна быть заполнена; + | - минимальная версия не должна быть меньше минимальной версии БСП (см. %1); + | - минимальная версия не должна быть меньше рекомендуемой версии. + |Минимальная версия сервиса обновления программ: %2 + |Минимальная версия БСП: %3 + |Рекомендуемая версия сервиса обновления программ: %4 + | + |Минимальная и рекомендуемая версия платформы ""1С:Предприятие"" установлена по данным см. %5. + |Минимальная версия: %6 + |Рекомендуемая версия: %7'", + КодОсновногоЯзыка()), + "ОбщегоНазначения.МинимальнаяВерсияПлатформы", + Минимальная, + НомерСборкиПоТекущейВерсииПлатформы( + МинимальнаяВерсияПлатформы()), + Рекомендуемая, + "ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности", + ОбщиеПараметры.МинимальнаяВерсияПлатформы, + ОбщиеПараметры.РекомендуемаяВерсияПлатформы); + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Базовая функциональность'", КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Предупреждение, + , + , + ТекстСообщения); + + Иначе + ОбщиеПараметры.МинимальнаяВерсияПлатформы = Минимальная; + ОбщиеПараметры.РекомендуемаяВерсияПлатформы = Рекомендуемая; + КонецЕсли; + + КонецЕсли; + + Исключение + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось изменить минимальную и рекомендуемую версию платформы ""1С:Предприятие"", полученную с сервиса обновления программ, по причине: + |%1'", + КодОсновногоЯзыка()), + ОбработкаОшибок.ПодробноеПредставлениеОшибки( + ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Базовая функциональность'", КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Предупреждение, + , + , + ТекстСообщения); + + КонецПопытки; + + КонецЕсли; + + КонецЕсли; + СистемнаяИнформация = Новый СистемнаяИнформация; Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, ОбщиеПараметры.МинимальнаяВерсияПлатформы) < 0 И ЭтоВерсияЗащищенногоПрограммногоКомплекса(СистемнаяИнформация.ВерсияПриложения) Тогда @@ -1951,14 +2302,23 @@ Минимальная = ОбщиеПараметры.МинимальнаяВерсияПлатформы; Рекомендуемая = ОбщиеПараметры.РекомендуемаяВерсияПлатформы; - Если Не ПустаяСтрока(Минимальная) - И Не ПустаяСтрока(Рекомендуемая) - И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Минимальная, Рекомендуемая) > 0 Тогда - ТекстСообщения = НСтр("ru = 'Минимальная версия платформы ""1С:Предприятие"" указана выше рекомендуемой в %1. - |Минимальная версия %2, рекомендуемая версия %3.'"); + Если МинимальнаяИРекомендуемаяВерсияПлатформыЗаполненаНеПравильно(Минимальная, Рекомендуемая) Тогда + ТекстСообщения = НСтр("ru = 'Указанные в %1 минимальная и рекомендуемая версии платформы не соответствуют следующим требованиям: + | - минимальная версия должна быть заполнена; + | - минимальная версия не должна быть меньше минимальной версии БСП (см. %2); + | - минимальная версия не должна быть меньше рекомендуемой версии. + |Минимальная версия: %3 + |Минимальная версия БСП: %4 + |Рекомендуемая версия: %5'", + КодОсновногоЯзыка()); ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ТекстСообщения, "ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности", - Минимальная, Рекомендуемая); + ТекстСообщения, + "ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности", + "ОбщегоНазначения.МинимальнаяВерсияПлатформы", + Минимальная, + НомерСборкиПоТекущейВерсииПлатформы( + МинимальнаяВерсияПлатформы()), + Рекомендуемая); КонецЕсли; // Обратная совместимость. @@ -2750,7 +3110,6 @@ Возврат Результат; КонецФункции - // Создает полную копию структуры, соответствия, массива, списка или таблицы значений, рекурсивно, // с учетом типов дочерних элементов. При этом содержимое значений объектных типов // (СправочникОбъект, ДокументОбъект и т.п.) не копируются, а возвращаются ссылки на исходный объект. @@ -2782,10 +3141,12 @@ ТипИсточника = ТипЗнч(Источник); Если ТипИсточника = Тип("ТаблицаЗначений") Тогда - Возврат Источник.Скопировать(); - КонецЕсли; - - Если ТипИсточника = Тип("Структура") + Приемник = Источник.Скопировать(); + СкопироватьЗначенияТаблицыЗначений(Приемник, ФиксироватьДанные); + ИначеЕсли ТипИсточника = Тип("ДеревоЗначений") Тогда + Приемник = Источник.Скопировать(); + СкопироватьЗначенияСтрокиДереваЗначений(Приемник.Строки, ФиксироватьДанные); + ИначеЕсли ТипИсточника = Тип("Структура") Или ТипИсточника = Тип("ФиксированнаяСтруктура") Тогда Приемник = СкопироватьСтруктуру(Источник, ФиксироватьДанные); ИначеЕсли ТипИсточника = Тип("Соответствие") @@ -2805,36 +3166,156 @@ КонецФункции // Возвращает описание предмета в виде текстовой строки. +// Для документов возвращается представление, для остальных ссылочных типов возвращается +// представление и тип в скобках, например, "Ножницы (Номенклатура)". +// Для пустых ссылок, Неопределено или незаполненных значений примитивных типов возвращается "не задан". // // Параметры: -// СсылкаНаПредмет - ЛюбаяСсылка - объект ссылочного типа. +// СсылкаНаПредмет - Произвольный. // // Возвращаемое значение: -// Строка +// Строка - например, "Ножницы (Номенклатура)", "Заказ клиента № 0001 от 01.01.2001" или "не задан". // Функция ПредметСтрокой(СсылкаНаПредмет) Экспорт - Если СсылкаНаПредмет = Неопределено Тогда + Если СсылкаНаПредмет <> Неопределено Тогда + Возврат ПредметыСтрокой(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СсылкаНаПредмет))[СсылкаНаПредмет]; + Иначе Возврат НСтр("ru = 'не задан'"); - ИначеЕсли Не ЭтоСсылка(ТипЗнч(СсылкаНаПредмет)) Тогда - Возврат Строка(СсылкаНаПредмет); - ИначеЕсли СсылкаНаПредмет.Пустая() Тогда - Возврат НСтр("ru = 'не задан'"); - КонецЕсли; - - Если Метаданные.Перечисления.Содержит(СсылкаНаПредмет.Метаданные()) Тогда - Возврат Строка(СсылкаНаПредмет); - КонецЕсли; - - Результат = ?(СсылкаСуществует(СсылкаНаПредмет), Строка(СсылкаНаПредмет), НСтр("ru = 'удален'")); - Если Не Метаданные.Документы.Содержит(СсылкаНаПредмет.Метаданные()) Тогда - ПредставлениеОбъекта = СсылкаНаПредмет.Метаданные().ПредставлениеОбъекта; - Если ПустаяСтрока(ПредставлениеОбъекта) Тогда - ПредставлениеОбъекта = СсылкаНаПредмет.Метаданные().Представление(); - КонецЕсли; - Результат = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 (%2)", Результат, ПредставлениеОбъекта); КонецЕсли; +КонецФункции + +// Возвращает описания предметов СсылкиНаПредметы. +// Для документов возвращается представление, для остальных ссылочных типов возвращается +// представление и тип в скобках, например, "Ножницы (Номенклатура)". +// Для пустых ссылок или незаполненных значений примитивных типов возвращается "не задан". +// Значение "удален", если объект не существует в информационной базе. +// Значения Неопределено пропускаются. +// +// Параметры: +// СсылкиНаПредметы - Массив из ЛюбаяСсылка +// +// Возвращаемое значение: +// Соответствие из КлючЗначение: +// * Ключ - ЛюбаяСсылка +// * Значение - Строка - например, "Ножницы (Номенклатура)", "Заказ клиента № 0001 от 01.01.2001" или "не задан". +// +Функция ПредметыСтрокой(Знач СсылкиНаПредметы) Экспорт + + ПроверяемыеСсылки = Новый Массив; + Результат = Новый Соответствие; + Для каждого СсылкаНаПредмет Из СсылкиНаПредметы Цикл + Если СсылкаНаПредмет = Неопределено Тогда + Результат[СсылкаНаПредмет] = НСтр("ru = 'не задан'"); + ИначеЕсли Не ЭтоСсылка(ТипЗнч(СсылкаНаПредмет)) Тогда + Результат[СсылкаНаПредмет] = Строка(СсылкаНаПредмет); + ИначеЕсли СсылкаНаПредмет.Пустая() Тогда + Результат[СсылкаНаПредмет] = НСтр("ru = 'не задан'"); + ИначеЕсли Метаданные.Перечисления.Содержит(СсылкаНаПредмет.Метаданные()) Тогда + Результат[СсылкаНаПредмет] = Строка(СсылкаНаПредмет); + Иначе + ПроверяемыеСсылки.Добавить(СсылкаНаПредмет); + КонецЕсли; + КонецЦикла; + + Для каждого СуществующаяСсылка Из ПредставленияСсылок(ПроверяемыеСсылки) Цикл + СсылкаНаПредмет = СуществующаяСсылка.Ключ; + Результат[СсылкаНаПредмет] = СуществующаяСсылка.Значение; + Если Не Метаданные.Документы.Содержит(СсылкаНаПредмет.Метаданные()) Тогда + ПредставлениеОбъекта = СсылкаНаПредмет.Метаданные().ПредставлениеОбъекта; + Если ПустаяСтрока(ПредставлениеОбъекта) Тогда + ПредставлениеОбъекта = СсылкаНаПредмет.Метаданные().Представление(); + КонецЕсли; + Результат[СсылкаНаПредмет] = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 (%2)", + Результат[СсылкаНаПредмет], ПредставлениеОбъекта); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Возвращает представления переданных ссылок. +// +// Параметры: +// ПроверяемыеСсылки - Массив из ЛюбаяСсылка, ЛюбаяСсылка +// +// Возвращаемое значение: +// Соответствие из КлючЗначение: +// * Ключ - ЛюбаяСсылка +// * Значение - Строка - представление ссылки или "удален", если ссылка не существует в информационной базе. +// +Функция ПредставленияСсылок(ПроверяемыеСсылки) Экспорт + + ОбъектыПоТипу = Новый Соответствие; + Если ТипЗнч(ПроверяемыеСсылки) = Тип("Массив") Тогда + Для каждого ПроверяемаяСсылка Из ПроверяемыеСсылки Цикл + Объекты = ОбъектыПоТипу[ПроверяемаяСсылка.Метаданные()]; + Если Объекты = Неопределено Тогда + Объекты = Новый Массив; + ОбъектыПоТипу[ПроверяемаяСсылка.Метаданные()] = Объекты; + КонецЕсли; + Объекты.Добавить(ПроверяемаяСсылка); + КонецЦикла; + Иначе + ОбъектыПоТипу[ПроверяемыеСсылки.Метаданные()] = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПроверяемыеСсылки); + КонецЕсли; + + Результат = Новый Соответствие; + Если ОбъектыПоТипу.Количество() = 0 Тогда + Возврат Результат; + КонецЕсли; + + Запрос = Новый Запрос; + ТекстыЗапросов = Новый Массив; + Индекс = 0; + Для каждого ТипОбъекта Из ОбъектыПоТипу Цикл + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Представление КАК Представление, + | Таблица.Ссылка КАК Ссылка + |ИЗ + | &ИмяТаблицы КАК Таблица + |ГДЕ + | Таблица.Ссылка В (&Ссылка)"; + + Если ТекстыЗапросов.Количество() > 0 Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); // @query-part-1, @query-part-2 + КонецЕсли; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", ТипОбъекта.Ключ.ПолноеИмя()); + + ИмяПараметра = "Ссылка" + Формат(Индекс, "ЧГ=;ЧН="); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Ссылка", "&" + ИмяПараметра); + ТекстыЗапросов.Добавить(ТекстЗапроса); + Запрос.УстановитьПараметр(ИмяПараметра, ТипОбъекта.Значение); + + Индекс = Индекс + 1; + КонецЦикла; + + Запрос.Текст = СтрСоединить(ТекстыЗапросов, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС); // @query-part; + + УстановитьПривилегированныйРежим(Истина); + ФактическиеСсылки = Запрос.Выполнить().Выгрузить(); + УстановитьПривилегированныйРежим(Ложь); + + ПредставленияСсылок = Запрос.Выполнить().Выгрузить(); + ПредставленияСсылок.Индексы.Добавить("Ссылка"); + + Для каждого Ссылка Из ФактическиеСсылки Цикл + Если ЗначениеЗаполнено(Ссылка.Ссылка) Тогда + ПредставлениеСсылки = ПредставленияСсылок.Найти(Ссылка.Ссылка, "Ссылка"); + Результат[Ссылка.Ссылка] = ?(ПредставлениеСсылки <> Неопределено, + ПредставлениеСсылки.Представление, Строка(Ссылка.Ссылка)); + КонецЕсли; + КонецЦикла; + Для каждого Ссылка Из ПроверяемыеСсылки Цикл + Если Результат[Ссылка] = Неопределено Тогда + Результат[Ссылка] = НСтр("ru = 'удален'"); + КонецЕсли; + КонецЦикла; + Возврат Результат; КонецФункции @@ -3931,6 +4412,62 @@ КонецФункции +// Возвращает ОбъектМетаданных, быстро найденный по полному имени. +// Более производительный аналог метода платформы Метаданные.НайтиПоПолномуИмени +// для корневых объектов метаданных. +// +// Параметры: +// ПолноеИмя - Строка - полное имя объекта метаданных, например, Справочник.Организации +// +// Возвращаемое значение: +// ОбъектМетаданных - когда найден +// Неопределено - когда не найден +// +Функция ОбъектМетаданныхПоПолномуИмени(ПолноеИмя) Экспорт + + ПозицияТочки = СтрНайти(ПолноеИмя, "."); + ИмяБазовогоТипа = Лев(ПолноеИмя, ПозицияТочки - 1); + + ИменаКоллекций = СтандартныеПодсистемыПовтИсп.ИменаКоллекцийПоИменамБазовыхТипов(); + Коллекция = ИменаКоллекций.Получить(ВРег(ИмяБазовогоТипа)); + + Если Коллекция <> Неопределено Тогда + Если Коллекция <> "Подсистемы" Тогда + ИмяОбъекта = Сред(ПолноеИмя, ПозицияТочки + 1); + ОбъектМетаданных = Метаданные[Коллекция].Найти(ИмяОбъекта); + Иначе + ИменаПодсистем = СтрРазделить(ВРег(ПолноеИмя), "."); + Количество = ИменаПодсистем.Количество(); + Подсистема = Метаданные; + ОбъектМетаданных = Неопределено; + Индекс = 0; + Пока Истина Цикл + Индекс = Индекс + 1; + Если Индекс >= Количество Тогда + Прервать; + КонецЕсли; + ИмяПодсистемы = ИменаПодсистем[Индекс]; + Подсистема = Подсистема.Подсистемы.Найти(ИмяПодсистемы); + Если Подсистема = Неопределено Тогда + Прервать; + КонецЕсли; + Индекс = Индекс + 1; + Если Индекс = Количество Тогда + ОбъектМетаданных = Подсистема; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЕсли; + + Если ОбъектМетаданных = Неопределено Тогда + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмя); + КонецЕсли; + + Возврат ОбъектМетаданных; + +КонецФункции + // Определяет доступность объекта метаданных по функциональным опциям. // // Параметры: @@ -4736,7 +5273,7 @@ |по причине: |%2'"), ПараметрыПодключения.АдресWSDL, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Если ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда МодульПолучениеФайловИзИнтернета = ОбщийМодуль("ПолучениеФайловИзИнтернета"); @@ -4843,7 +5380,7 @@ Исключение СтрокаСообщения = НСтр("ru = 'Корреспондент не поддерживает версионирование программных интерфейсов. |Описание ошибки: %1'"); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(НСтр("ru = 'Получение версий интерфейса'", КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , СтрокаСообщения); @@ -4868,7 +5405,6 @@ Блокировка = Новый БлокировкаДанных; Блокировка.Добавить("РегистрСведений.КэшПрограммныхИнтерфейсов"); Блокировка.Заблокировать(); - ПодстрокаПоиска = СформироватьСтрокуДляПоискаВЗапросе(ПодстрокаПоискаИдентификаторов); ТекстЗапроса = "ВЫБРАТЬ @@ -4877,21 +5413,18 @@ |ИЗ | РегистрСведений.КэшПрограммныхИнтерфейсов КАК ТаблицаКэша |ГДЕ - | ТаблицаКэша.Идентификатор ПОДОБНО ""%ПодстрокаПоиска%"" - | СПЕЦСИМВОЛ ""~"""; + | ТаблицаКэша.Идентификатор ПОДОБНО ""%ПодстрокаПоиска%"" СПЕЦСИМВОЛ ""~"""; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ПодстрокаПоиска", ПодстрокаПоиска); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ПодстрокаПоиска", + СформироватьСтрокуДляПоискаВЗапросе(ПодстрокаПоискаИдентификаторов)); Запрос = Новый Запрос(ТекстЗапроса); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл - Запись = РегистрыСведений.КэшПрограммныхИнтерфейсов.СоздатьМенеджерЗаписи(); Запись.Идентификатор = Выборка.Идентификатор; Запись.ТипДанных = Выборка.ТипДанных; - Запись.Удалить(); - КонецЦикла; ЗафиксироватьТранзакцию(); @@ -4930,15 +5463,18 @@ // Владелец = "СтандартныеПодсистемы.УправлениеДоступом"; // если нужно более 1 хранилища на подсистему БСП: // Владелец = "СтандартныеПодсистемы.УправлениеДоступом.<Уточнение>"; -// // Данные - Произвольный - данные помещаемые в безопасное хранилище. Неопределенно - удаляет все данные. -// Для удаления данных по ключу следует использовать процедуру УдалитьДанныеИзБезопасногоХранилища. +// Для удаления данных по ключу следует использовать процедуру УдалитьДанныеИзБезопасногоХранилища. +// - Структура - если параметр Ключ содержит Неопределено. Подробнее см. описание параметра Ключ // Ключ - Строка - ключ сохраняемых настроек, по умолчанию "Пароль". // Ключ должен соответствовать правилам имен идентификаторов: // 1. Первым символом ключа должна быть буква или символ подчеркивания (_). -// 2. Каждый из последующих символов может быть буквой, цифрой или символом подчеркивания (_). +// 2. Каждый из последующих символов может быть буквой, цифрой или символом подчеркивания (_). +// Неопределено - для добавления набора данных структурой, где ключ структуры - это имя ключа данных, +// а значение - сохраняемые данные. Пример использования см. ниже. // // Пример: +// // Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) // Если ТекущийПользовательМожетИзменятьПароль Тогда // УстановитьПривилегированныйРежим(Истина); @@ -4947,6 +5483,17 @@ // УстановитьПривилегированныйРежим(Ложь); // КонецЕсли; // КонецПроцедуры +// +// Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) +// Если ТекущийПользовательМожетИзменятьПароль Тогда +// ЛогинИПароль = Новый Структура; +// ЛогинИПароль.Вставить("Логин", Логин); +// ЛогинИПароль.Вставить("Пароль", Пароль); +// УстановитьПривилегированныйРежим(Истина); +// ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(ТекущийОбъект.Ссылка, ЛогинИПароль, Неопределено); +// УстановитьПривилегированныйРежим(Ложь); +// КонецЕсли; +// КонецПроцедуры // Процедура ЗаписатьДанныеВБезопасноеХранилище(Владелец, Данные, Ключ = "Пароль") Экспорт @@ -4956,11 +5503,23 @@ |параметр должен содержать ссылку; передано значение: %3 (тип %4).'"), "Владелец", "ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище", Владелец, ТипЗнч(Владелец))); - ОбщегоНазначенияКлиентСервер.Проверить(ТипЗнч(Ключ) = Тип("Строка"), - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + Если ЗначениеЗаполнено(Ключ) Тогда + + ОбщегоНазначенияКлиентСервер.Проверить(ТипЗнч(Ключ) = Тип("Строка"), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Недопустимое значение параметра %1 в %2. - |параметр должен содержать строку; передано значение: %3 (тип %4).'"), - "Ключ", "ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище", Ключ, ТипЗнч(Ключ))); + |параметр должен содержать строку; передано значение: %3 (тип %4).'"), + "Ключ", "ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище", Ключ, ТипЗнч(Ключ))); + + Иначе + + ОбщегоНазначенияКлиентСервер.Проверить(ТипЗнч(Данные) = Тип("Структура"), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Недопустимое значение параметра %1 в %2. + |Если Ключ = Неопределено, то параметр должен содержать структуру; передано значение: %3 (тип %4).'"), + "Данные", "ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище", Данные, ТипЗнч(Данные))); + + КонецЕсли; ЭтоОбластьДанных = РазделениеВключено() И ДоступноИспользованиеРазделенныхДанных(); Если ЭтоОбластьДанных Тогда @@ -4971,29 +5530,102 @@ БезопасноеХранилищеДанных.Владелец = Владелец; БезопасноеХранилищеДанных.Прочитать(); + Если Данные <> Неопределено Тогда + Если БезопасноеХранилищеДанных.Выбран() Тогда + ДанныеДляСохранения = БезопасноеХранилищеДанных.Данные.Получить(); + Если ТипЗнч(ДанныеДляСохранения) <> Тип("Структура") Тогда ДанныеДляСохранения = Новый Структура(); КонецЕсли; - ДанныеДляСохранения.Вставить(Ключ, Данные); + + Если ЗначениеЗаполнено(Ключ) Тогда + ДанныеДляСохранения.Вставить(Ключ, Данные); + Иначе + ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ДанныеДляСохранения, Данные, Истина); + КонецЕсли; + ДанныеДляХранилищеЗначения = Новый ХранилищеЗначения(ДанныеДляСохранения, Новый СжатиеДанных(6)); БезопасноеХранилищеДанных.Данные = ДанныеДляХранилищеЗначения; БезопасноеХранилищеДанных.Записать(); + Иначе - ДанныеДляСохранения = Новый Структура(Ключ, Данные); + + ДанныеДляСохранения = ?(ЗначениеЗаполнено(Ключ), Новый Структура(Ключ, Данные), Данные); ДанныеДляХранилищеЗначения = Новый ХранилищеЗначения(ДанныеДляСохранения, Новый СжатиеДанных(6)); + БезопасноеХранилищеДанных.Данные = ДанныеДляХранилищеЗначения; БезопасноеХранилищеДанных.Владелец = Владелец; БезопасноеХранилищеДанных.Записать(); + КонецЕсли; Иначе + БезопасноеХранилищеДанных.Удалить(); + КонецЕсли; КонецПроцедуры +// Возвращает данные из безопасного хранилища. +// Вызывающий код должен самостоятельно устанавливать привилегированный режим. +// +// Безопасное хранилище недоступно для чтения пользователям (кроме администраторов), +// а доступно только коду, который делает обращения только к своей части данных и +// в том контексте, который предполагает чтение или запись конфиденциальных данных. +// +// Параметры: +// Владельцы - Массив из ПланОбменаСсылка +// - Массив из СправочникСсылка +// - Массив из Строка - ссылки на объекты информационной базы, +// представляющих объекты-владельцы или уникальные строки(до 128 символов) владельцев данных. +// Ключи - Строка - содержит имя ключа данных или список имен ключей, указанных через запятую. +// - Неопределено - будут возвращены все сохраненные данные переданных владельцев. +// ОбщиеДанные - Булево - Истина, если требуется в модели сервиса получить данные из общих данных в разделенном режиме. +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - ПланОбменаСсылка +// - СправочникСсылка +// - Строка - ссылка на объект информационной базы +// или строка до 128 символов идентифицирующая владельца данных. +// * Значение - Произвольный - если в параметре Ключи указан один ключ, +// то возвращается его значение произвольного типа. +// - Структура - если в параметре Ключи указано несколько ключей или Неопределено, +// где ключ структуры - это имя ключа сохраненных данных, +// а значение - данные произвольного типа. Когда для ключа отсутствуют данные, +// то значение содержит Неопределено. +// - Неопределено - если данные по ключу отсутствуют. +// +// Пример: +// Процедура РассылкаПриглашений(Пользователи) +// +// УстановитьПривилегированныйРежим(Истина); +// ДанныеАвторизации = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Пользователи, "Логин, Пароль"); +// УстановитьПривилегированныйРежим(Ложь); +// +// Для каждого Пользователь Из Пользователи Цикл +// ОтправитьПриглашение(Пользователь, ДанныеАвторизации[Пользователь]); +// КонецЦикла; +// +// КонецПроцедуры +// +Функция ПрочитатьДанныеВладельцевИзБезопасногоХранилища(Владельцы, Ключи = "Пароль", ОбщиеДанные = Неопределено) Экспорт + + ОбщегоНазначенияКлиентСервер.Проверить(ТипЗнч(Владельцы) = Тип("Массив"), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Недопустимое значение параметра %1 в %2. + |параметр должен содержать массив; передано значение: %3 (тип %4).'"), + "Владельцы", "ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища", Владельцы, ТипЗнч(Владельцы))); + + Результат = ДанныеИзБезопасногоХранилища(Владельцы, Ключи, ОбщиеДанные); + + Возврат Результат; + +КонецФункции + // Возвращает данные из безопасного хранилища. // Вызывающий код должен самостоятельно устанавливать привилегированный режим. // @@ -5005,8 +5637,9 @@ // Владелец - ПланОбменаСсылка // - СправочникСсылка // - Строка - ссылка на объект информационной базы, -// представляющий объект-владелец сохраняемого пароля или строка до 128 символов. +// представляющий объект-владелец сохраняемого пароля или уникальная строка(до 128 символов). // Ключи - Строка - содержит список имен сохраненных данных, указанных через запятую. +// - Неопределено - будут возвращены все сохраненные данные владельца. // ОбщиеДанные - Булево - Истина, если требуется в модели сервиса получить данные из общих данных в разделенном режиме. // // Возвращаемое значение: @@ -5015,44 +5648,27 @@ // Если данные отсутствуют - Неопределенно. // // Пример: -// Процедура ПриЧтенииНаСервере(ТекущийОбъект) -// -// Если ТекущийПользовательМожетИзменятьПароль Тогда -// УстановитьПривилегированныйРежим(Истина); -// Логин = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ТекущийОбъект.Ссылка, "Логин"); -// Пароль = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ТекущийОбъект.Ссылка); -// УстановитьПривилегированныйРежим(Ложь); -// Иначе -// Элементы.ГруппаЛогинИПароль.Видимость = Ложь; -// КонецЕсли; -// -// КонецПроцедуры +// Если ТекущийПользовательМожетИзменятьПароль Тогда +// УстановитьПривилегированныйРежим(Истина); +// Логин = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ТекущийОбъект.Ссылка, "Логин"); +// Пароль = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ТекущийОбъект.Ссылка); +// УстановитьПривилегированныйРежим(Ложь); +// Иначе +// Элементы.ГруппаЛогинИПароль.Видимость = Ложь; +// КонецЕсли; +// +// УстановитьПривилегированныйРежим(Истина); +// ЛогинИПароль = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ТекущийОбъект.Ссылка, Неопределено); // Функция ПрочитатьДанныеИзБезопасногоХранилища(Владелец, Ключи = "Пароль", ОбщиеДанные = Неопределено) Экспорт - ОбщегоНазначенияКлиентСервер.Проверить(ЗначениеЗаполнено(Владелец), - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Недопустимое значение параметра %1 в %2. - |параметр должен содержать ссылку; передано значение: %3 (тип %4).'"), - "Владелец", "ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища", Владелец, ТипЗнч(Владелец))); + Владельцы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Владелец); + ДанныеВладельца = ПрочитатьДанныеВладельцевИзБезопасногоХранилища(Владельцы, Ключи, ОбщиеДанные); - Если РазделениеВключено() И ДоступноИспользованиеРазделенныхДанных() Тогда - Если ОбщиеДанные = Истина Тогда - ИмяБезопасногоХранилищаДанных = "БезопасноеХранилищеДанных"; - Иначе - ИмяБезопасногоХранилищаДанных = "БезопасноеХранилищеДанныхОбластейДанных"; - КонецЕсли; - Иначе - ИмяБезопасногоХранилищаДанных = "БезопасноеХранилищеДанных"; - КонецЕсли; - Результат = ДанныеИзБезопасногоХранилища(Владелец, ИмяБезопасногоХранилищаДанных, Ключи); - - Если Результат <> Неопределено И Результат.Количество() = 1 Тогда - Возврат ?(Результат.Свойство(Ключи), Результат[Ключи], Неопределено); - КонецЕсли; + Результат = ДанныеВладельца[Владелец]; Возврат Результат; - + КонецФункции // Удаляет конфиденциальные данные в безопасное хранилище. @@ -5066,7 +5682,8 @@ // Владелец - ПланОбменаСсылка // - СправочникСсылка // - Строка - ссылка на объект информационной базы, -// представляющий объект-владелец сохраняемого пароля или строка до 128 символов. +// представляющий объект-владелец сохраняемого пароля или уникальная строка(до 128 символов). +// - Массив - ссылки на объекты информационной базы для удаления данным по нескольким владельцам. // Ключи - Строка - содержит список имен удаляемых данных, указанных через запятую. // Неопределено - удаляет все данные. // @@ -5094,29 +5711,35 @@ БезопасноеХранилищеДанных = РегистрыСведений.БезопасноеХранилищеДанныхОбластейДанных.СоздатьМенеджерЗаписи(); Иначе БезопасноеХранилищеДанных = РегистрыСведений.БезопасноеХранилищеДанных.СоздатьМенеджерЗаписи(); - КонецЕсли; + КонецЕсли; - БезопасноеХранилищеДанных.Владелец = Владелец; - БезопасноеХранилищеДанных.Прочитать(); - Если ТипЗнч(БезопасноеХранилищеДанных.Данные) = Тип("ХранилищеЗначения") Тогда - ДанныеДляСохранения = БезопасноеХранилищеДанных.Данные.Получить(); - Если Ключи <> Неопределено И ТипЗнч(ДанныеДляСохранения) = Тип("Структура") Тогда - СписокКлючей = СтрРазделить(Ключи, ",", Ложь); - Если БезопасноеХранилищеДанных.Выбран() И СписокКлючей.Количество() > 0 Тогда - Для каждого КлючДляУдаления Из СписокКлючей Цикл - Если ДанныеДляСохранения.Свойство(КлючДляУдаления) Тогда - ДанныеДляСохранения.Удалить(КлючДляУдаления); - КонецЕсли; - КонецЦикла; - ДанныеДляХранилищеЗначения = Новый ХранилищеЗначения(ДанныеДляСохранения, Новый СжатиеДанных(6)); - БезопасноеХранилищеДанных.Данные = ДанныеДляХранилищеЗначения; - БезопасноеХранилищеДанных.Записать(); - Возврат; + Владельцы = ?(ТипЗнч(Владелец) = Тип("Массив"), Владелец, ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Владелец)); + + Для Каждого ВладелецДанных Из Владельцы Цикл + + БезопасноеХранилищеДанных.Владелец = ВладелецДанных; + БезопасноеХранилищеДанных.Прочитать(); + Если ТипЗнч(БезопасноеХранилищеДанных.Данные) = Тип("ХранилищеЗначения") Тогда + ДанныеДляСохранения = БезопасноеХранилищеДанных.Данные.Получить(); + Если Ключи <> Неопределено И ТипЗнч(ДанныеДляСохранения) = Тип("Структура") Тогда + СписокКлючей = СтрРазделить(Ключи, ",", Ложь); + Если БезопасноеХранилищеДанных.Выбран() И СписокКлючей.Количество() > 0 Тогда + Для каждого КлючДляУдаления Из СписокКлючей Цикл + Если ДанныеДляСохранения.Свойство(КлючДляУдаления) Тогда + ДанныеДляСохранения.Удалить(КлючДляУдаления); + КонецЕсли; + КонецЦикла; + ДанныеДляХранилищеЗначения = Новый ХранилищеЗначения(ДанныеДляСохранения, Новый СжатиеДанных(6)); + БезопасноеХранилищеДанных.Данные = ДанныеДляХранилищеЗначения; + БезопасноеХранилищеДанных.Записать(); + Возврат; + КонецЕсли; КонецЕсли; КонецЕсли; - КонецЕсли; - - БезопасноеХранилищеДанных.Удалить(); + + БезопасноеХранилищеДанных.Удалить(); + + КонецЦикла; КонецПроцедуры @@ -5443,8 +6066,6 @@ КонецФункции // Возвращает описание защиты от опасных действий с отключенными предупреждениями. -// Функция не приводит к ошибке компиляции при отсутствии в платформе механизмов -// предупреждений безопасности. // // Возвращаемое значение: // ОписаниеЗащитыОтОпасныхДействий - со свойством ПредупреждатьОбОпасныхДействиях = Ложь. @@ -5658,7 +6279,7 @@ Если Настройки.Свойство("НапоминатьОбУстановкеРасширенияРаботыСФайлами") Тогда Если ЭтоВебКлиент() Тогда - ИдентификаторКлиента = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере(Ложь).Получить("ИдентификаторКлиента"); + ИдентификаторКлиента = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ИдентификаторКлиента"); Если ИдентификаторКлиента = Неопределено Тогда СистемнаяИнформация = Новый СистемнаяИнформация; ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; @@ -5742,6 +6363,13 @@ // Параметры: // Идентификатор - Строка - идентификатор объекта внешней компоненты. // ПолноеИмяМакета - Строка - полное имя макета конфигурации с ZIP-архивом. +// Изолированно - Булево, Неопределено - (по умолчанию Ложь) если Истина, компонента будет подключена +// изолированно, в этом случае внешняя компонента загружается в отдельный процесс операционной системы; +// Ложь - в этом случае внешняя компонента будет выполняться в том же процессе операционной системы, +// который выполняет код встроенного языка; Неопределено - поддерживается поведение платформы по умолчанию: +// не изолированно - если компонентой поддерживается только этот режим, изолированно - в остальных случаях. +// См. https://its.1c.eu/db/v83doc#bookmark:dev:TI000001866 +// // // Возвращаемое значение: // ОбъектВнешнейКомпоненты, Неопределено - экземпляр объекта внешней компоненты или Неопределено, если не удалось создать. @@ -5758,7 +6386,7 @@ // // ПодключаемыйМодуль = Неопределено; // -Функция ПодключитьКомпонентуИзМакета(Знач Идентификатор, Знач ПолноеИмяМакета) Экспорт +Функция ПодключитьКомпонентуИзМакета(Знач Идентификатор, Знач ПолноеИмяМакета, Знач Изолированно = Ложь) Экспорт РезультатПроверкиВнешнейКомпоненты = Неопределено; @@ -5773,7 +6401,7 @@ Идентификатор, ПолноеИмяМакета, РезультатПроверкиВнешнейКомпоненты); Результат = ПодключитьКомпонентуПоИдентификатору(Идентификатор, - КомпонентаПоследнейВерсии.Местоположение); + КомпонентаПоследнейВерсии.Местоположение, Изолированно); Возврат Результат.ПодключаемыйМодуль; @@ -5923,7 +6551,7 @@ Возврат ЗначениеВСтрокуXML(Структура); КонецФункции -Функция ПодключитьКомпонентуПоИдентификатору(Знач Идентификатор, Знач Местоположение) Экспорт +Функция ПодключитьКомпонентуПоИдентификатору(Знач Идентификатор, Знач Местоположение, Знач Изолированно = Ложь) Экспорт ПроверитьМестоположениеКомпоненты(Идентификатор, Местоположение); @@ -5932,7 +6560,27 @@ Результат.Вставить("ПодключаемыйМодуль", Неопределено); Результат.Вставить("ОписаниеОшибки", ""); - Если Не ПодключитьВнешнююКомпоненту(Местоположение, Идентификатор + "SymbolicName") Тогда + Попытка + + #Если МобильноеПриложениеСервер Тогда + РезультатПодключения = ПодключитьВнешнююКомпоненту(Местоположение, Идентификатор + "SymbolicName"); + #Иначе + РезультатПодключения = ПодключитьВнешнююКомпоненту(Местоположение, Идентификатор + "SymbolicName",, + ОбщегоНазначенияСлужебныйКлиентСервер.ТипПодключенияКомпоненты(Изолированно)); + #КонецЕсли + + Исключение + Результат.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось подключить внешнюю компоненту ""%1"" на сервере по причине: + |%2.'"), + Идентификатор, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + ЗаписьЖурналаРегистрации(НСтр("ru = 'Подключение внешней компоненты на сервере'", КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, Результат.ОписаниеОшибки); + Возврат Результат; + КонецПопытки; + + Если Не РезультатПодключения Тогда Результат.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось подключить внешнюю компоненту ""%1"" на сервере по причине: |Метод %2 вернул Ложь.'"), @@ -5941,7 +6589,7 @@ ЗаписьЖурналаРегистрации(НСтр("ru = 'Подключение внешней компоненты на сервере'", КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, Результат.ОписаниеОшибки); Возврат Результат; - КонецЕсли; + КонецЕсли; ПодключаемыйМодуль = Неопределено; Попытка @@ -5951,7 +6599,7 @@ КонецЕсли; Исключение ПодключаемыйМодуль = Неопределено; - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Если ПодключаемыйМодуль = Неопределено Тогда @@ -5971,81 +6619,6 @@ КонецФункции -// Определяет добавлено ли место использования в исключения поиска ссылок. -// -// Параметры: -// МестоИспользования - Структура: -// * Ссылка - ЛюбаяСсылка - проверяемая ссылка. -// * Данные - ЛюбаяСсылка - место использования. -// * Метаданные - ОбъектМетаданных - метаданные места использования. -// ИсключенияПоискаСсылок - Соответствие -// -// Возвращаемое значение: -// Булево -// -Функция ЭтоСлужебнаяСвязьДанных(МестоИспользования, ИсключенияПоискаСсылок) Экспорт - - ИсключениеПоиска = ИсключенияПоискаСсылок[МестоИспользования.Метаданные]; - - // Данные может быть как ссылкой так и ключом записи регистра. - - Если ИсключениеПоиска = Неопределено Тогда - Возврат (МестоИспользования.Ссылка = МестоИспользования.Данные); // Ссылку саму на себя исключаем. - ИначеЕсли ИсключениеПоиска = "*" Тогда - Возврат Истина; // Если указано исключить все - считаем все исключением. - Иначе - Для Каждого ПутьКРеквизиту Из ИсключениеПоиска Цикл - // Если указаны исключения. - - // Относительный путь к реквизиту: - // "<ИмяРеквизитаИлиТЧ>[.<ИмяРеквизитаТЧ>]". - - Если ЭтоСсылка(ТипЗнч(МестоИспользования.Данные)) Тогда - - // Проверка есть ли по исключаемому пути в указанных данных проверяемая ссылка - - ПолноеИмяОбъектаМетаданных = МестоИспользования.Метаданные.ПолноеИмя(); - - ТекстЗапроса = - "ВЫБРАТЬ - | ИСТИНА - |ИЗ - | &ПолноеИмяОбъектаМетаданных КАК Таблица - |ГДЕ - | &ПутьКРеквизиту = &ПроверяемаяСсылка - | И Таблица.Ссылка = &Ссылка"; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъектаМетаданных", ПолноеИмяОбъектаМетаданных); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПутьКРеквизиту", ПутьКРеквизиту); - - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - Запрос.УстановитьПараметр("ПроверяемаяСсылка", МестоИспользования.Ссылка); - Запрос.УстановитьПараметр("Ссылка", МестоИспользования.Данные); - - Результат = Запрос.Выполнить(); - - Если Не Результат.Пустой() Тогда - Возврат Истина; - КонецЕсли; - - Иначе - - БуферДанных = Новый Структура(ПутьКРеквизиту); - ЗаполнитьЗначенияСвойств(БуферДанных, МестоИспользования.Данные); - Если БуферДанных[ПутьКРеквизиту] = МестоИспользования.Ссылка Тогда - Возврат Истина; - КонецЕсли; - - КонецЕсли; - - КонецЦикла; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - Функция СтрокаВВидеНСтр(Знач ПроверяемаяСтрока) Экспорт ПроверяемаяСтрока = СтрЗаменить(ПроверяемаяСтрока, " ", ""); @@ -6128,62 +6701,6 @@ КонецФункции -// Возвращает ОбъектМетаданных, быстро найденный по полному имени. -// Более производительный аналог метода платформы Метаданные.НайтиПоПолномуИмени -// для корневых объектов метаданных. -// -// Параметры: -// ПолноеИмя - Строка - полное имя объекта метаданных, например, Справочник.Организации -// -// Возвращаемое значение: -// ОбъектМетаданных - когда найден -// Неопределено - когда не найден -// -Функция ОбъектМетаданныхПоПолномуИмени(ПолноеИмя) Экспорт - - ПозицияТочки = СтрНайти(ПолноеИмя, "."); - ИмяБазовогоТипа = Лев(ПолноеИмя, ПозицияТочки - 1); - - ИменаКоллекций = СтандартныеПодсистемыПовтИсп.ИменаКоллекцийПоИменамБазовыхТипов(); - Коллекция = ИменаКоллекций.Получить(ВРег(ИмяБазовогоТипа)); - - Если Коллекция <> Неопределено Тогда - Если Коллекция <> "Подсистемы" Тогда - ИмяОбъекта = Сред(ПолноеИмя, ПозицияТочки + 1); - ОбъектМетаданных = Метаданные[Коллекция].Найти(ИмяОбъекта); - Иначе - ИменаПодсистем = СтрРазделить(ВРег(ПолноеИмя), "."); - Количество = ИменаПодсистем.Количество(); - Подсистема = Метаданные; - ОбъектМетаданных = Неопределено; - Индекс = 0; - Пока Истина Цикл - Индекс = Индекс + 1; - Если Индекс >= Количество Тогда - Прервать; - КонецЕсли; - ИмяПодсистемы = ИменаПодсистем[Индекс]; - Подсистема = Подсистема.Подсистемы.Найти(ИмяПодсистемы); - Если Подсистема = Неопределено Тогда - Прервать; - КонецЕсли; - Индекс = Индекс + 1; - Если Индекс = Количество Тогда - ОбъектМетаданных = Подсистема; - Прервать; - КонецЕсли; - КонецЦикла; - КонецЕсли; - КонецЕсли; - - Если ОбъектМетаданных = Неопределено Тогда - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмя); - КонецЕсли; - - Возврат ОбъектМетаданных; - -КонецФункции - // Сокращает имя файла с расширением. // Сокращение имени, производится, когда имя файла с расширением превышает размер 255 байт. // Сокращение ими файла достигая за счет сокращения имени файла без расширения и @@ -6325,12 +6842,11 @@ // Функция НайтиОшибкуДоступностиРеквизитовОбъекта(ПолноеИмяОбъектаМетаданных, ПроверяемыеВыражения) - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных); - + МетаданныеОбъекта = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъектаМетаданных); Если МетаданныеОбъекта = Неопределено Тогда Возврат Новый Структура("Ошибка, ОписаниеОшибки", Истина, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка получения метаданных ""%1"".'"), ПолноеИмяОбъектаМетаданных)); + НСтр("ru = 'Несуществующий объект метаданных ""%1"".'"), ПолноеИмяОбъектаМетаданных)); КонецЕсли; // Разрешение вызова из безопасного режима внешней обработки или расширения. @@ -6553,7 +7069,7 @@ Попытка ЗаписатьОбъект(МенеджерКонстанты, ПараметрыЗаписи); Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось записать %1 по причине: %2'"), ПредставлениеДанных, ОписаниеОшибки); СостояниеОперации = "ОшибкаЗаписи"; @@ -6568,7 +7084,7 @@ Исключение ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЗаменыСсылок(), УровеньЖурналаРегистрации.Ошибка, - МетаданныеКонстанты,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + МетаданныеКонстанты,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Если СостояниеОперации = "ОшибкаЗаписи" Тогда Для Каждого Строка Из ОбрабатываемыеСтроки Цикл ЗарегистрироватьОшибкуЗамены(Результат, Строка.Ссылка, @@ -6609,7 +7125,7 @@ НСтр("ru = 'Не удалось заблокировать объект ""%1"": |%2'"), ПредставлениеДанных, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -6641,7 +7157,7 @@ КонецЕсли; Исключение СостояниеОперации = "ОшибкаЗаписи"; - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось записать %1 по причине: %2'"), ПредставлениеДанных, ОписаниеОшибки); ВызватьИсключение; @@ -6653,7 +7169,7 @@ ОтменитьТранзакцию(); Информация = ИнформацияОбОшибке(); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЗаменыСсылок(), УровеньЖурналаРегистрации.Ошибка, - МестоИспользования.Метаданные,, ПодробноеПредставлениеОшибки(Информация)); + МестоИспользования.Метаданные,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); Ошибка = ОписаниеОшибкиЗамены(СостояниеОперации, Данные, ПредставлениеДанных, ТекстОшибки); Если СостояниеОперации = "ОшибкаЗаписи" Тогда Для Каждого Строка Из ОбрабатываемыеСтроки Цикл @@ -6744,7 +7260,7 @@ Попытка ЗаписатьОбъект(НаборЗаписей, ПараметрыВыполнения); Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось записать %1 по причине: %2'"), ПредставлениеДанных, ОписаниеОшибки); СостояниеОперации = "ОшибкаЗаписи"; @@ -6761,7 +7277,7 @@ ОтменитьТранзакцию(); Информация = ИнформацияОбОшибке(); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЗаменыСсылок(), УровеньЖурналаРегистрации.Ошибка, - Мета,, ПодробноеПредставлениеОшибки(Информация)); + Мета,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); Ошибка = ОписаниеОшибкиЗамены(СостояниеОперации, Данные, ПредставлениеДанных, Ошибка); Если СостояниеОперации = "ОшибкаЗаписи" Тогда Для Каждого Строка Из ОбрабатываемыеСтроки Цикл @@ -7226,7 +7742,7 @@ Результат.ОчередьКНепосредственномуУдалению.Добавить(Объект.Ссылка); Исключение ТекстОшибки = НСтр("ru = 'Элемент не был помечен на удаление по причине:'"); - ТекстОшибки = ТекстОшибки + Символы.ПС + СокрЛП(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ТекстОшибки = ТекстОшибки + Символы.ПС + СокрЛП(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ОписаниеОшибки = ОписаниеОшибкиЗамены("ОшибкаУдаления", УдаляемаяСсылка, ПредставлениеСсылки, ТекстОшибки); ЗарегистрироватьОшибкуЗамены(Результат, УдаляемаяСсылка, ОписаниеОшибки); Успешно = Ложь; @@ -7384,7 +7900,8 @@ КонецЕсли; // Поля ссылочного типа и измерения - кандидаты. - Описание = СпискиПолейПоТипу(НаборЗаписей, Движение.Измерения, ИсключатьПоля); + // @skip-check query-in-loop - Пустой запрос для получения списка полей таблицы. + Описание = СпискиПолейОбъекта(НаборЗаписей, Движение.Измерения, ИсключатьПоля); Если Описание.СписокПолей.Количество() = 0 Тогда // Незачем обрабатывать Продолжить; @@ -7422,8 +7939,8 @@ ИмяТаблицы = Последовательность.ПолноеИмя(); - // Список полей и измерений - Описание = СпискиПолейПоТипу(ИмяТаблицы, Последовательность.Измерения, "Регистратор"); + // @skip-check query-in-loop - Пустой запрос для получения списка полей таблицы. + Описание = СпискиПолейОбъекта(ИмяТаблицы, Последовательность.Измерения, "Регистратор"); Если Описание.СписокПолей.Количество() > 0 Тогда Описание.Вставить("НаборЗаписей", Последовательности[Последовательность.Имя].СоздатьНаборЗаписей()); @@ -7553,32 +8070,26 @@ КонецФункции -Функция ОписаниеКлючаЗаписи(Знач Мета) - // можно закэшировать по Мета +Функция ОписаниеКлючаЗаписи(Знач МетаданныеТаблицы) - ИмяТаблицы = Мета.ПолноеИмя(); + ИмяТаблицы = МетаданныеТаблицы.ПолноеИмя(); // Поля ссылочного типа - кандидаты и набор измерений. - ОписаниеКлюча = СпискиПолейПоТипу(ИмяТаблицы, Мета.Измерения, "Период, Регистратор"); - - Если Метаданные.РегистрыСведений.Содержит(Мета) Тогда - НаборЗаписей = РегистрыСведений[Мета.Имя].СоздатьНаборЗаписей(); - - ИначеЕсли Метаданные.РегистрыНакопления.Содержит(Мета) Тогда - НаборЗаписей = РегистрыНакопления[Мета.Имя].СоздатьНаборЗаписей(); - - ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(Мета) Тогда - НаборЗаписей = РегистрыБухгалтерии[Мета.Имя].СоздатьНаборЗаписей(); - - ИначеЕсли Метаданные.РегистрыРасчета.Содержит(Мета) Тогда - НаборЗаписей = РегистрыРасчета[Мета.Имя].СоздатьНаборЗаписей(); - - ИначеЕсли Метаданные.Последовательности.Содержит(Мета) Тогда - НаборЗаписей = Последовательности[Мета.Имя].СоздатьНаборЗаписей(); + // @skip-check query-in-loop - Пустой запрос для получения списка полей таблицы. + ОписаниеКлюча = СпискиПолейОбъекта(ИмяТаблицы, МетаданныеТаблицы.Измерения, "Период, Регистратор"); + Если Метаданные.РегистрыСведений.Содержит(МетаданныеТаблицы) Тогда + НаборЗаписей = РегистрыСведений[МетаданныеТаблицы.Имя].СоздатьНаборЗаписей(); + ИначеЕсли Метаданные.РегистрыНакопления.Содержит(МетаданныеТаблицы) Тогда + НаборЗаписей = РегистрыНакопления[МетаданныеТаблицы.Имя].СоздатьНаборЗаписей(); + ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(МетаданныеТаблицы) Тогда + НаборЗаписей = РегистрыБухгалтерии[МетаданныеТаблицы.Имя].СоздатьНаборЗаписей(); + ИначеЕсли Метаданные.РегистрыРасчета.Содержит(МетаданныеТаблицы) Тогда + НаборЗаписей = РегистрыРасчета[МетаданныеТаблицы.Имя].СоздатьНаборЗаписей(); + ИначеЕсли Метаданные.Последовательности.Содержит(МетаданныеТаблицы) Тогда + НаборЗаписей = Последовательности[МетаданныеТаблицы.Имя].СоздатьНаборЗаписей(); Иначе НаборЗаписей = Неопределено; - КонецЕсли; ОписаниеКлюча.Вставить("НаборЗаписей", НаборЗаписей); @@ -7599,8 +8110,7 @@ КонецФункции // Возвращает описание по имени таблицы или по набору записей. -Функция СпискиПолейПоТипу(Знач ИсточникДанных, Знач МетаИзмерения, Знач ИсключатьПоля) - // можно закэшировать +Функция СпискиПолейОбъекта(Знач ИсточникДанных, Знач МетаданныеИзмеренийРегистра, Знач ИсключатьПоля) Описание = Новый Структура; Описание.Вставить("СписокПолей", Новый Структура); @@ -7629,7 +8139,7 @@ Описание.СписокПолей.Вставить(Имя); // И проверка на ведущее измерение. - Мета = МетаИзмерения.Найти(Имя); + Мета = МетаданныеИзмеренийРегистра.Найти(Имя); Если Мета <> Неопределено Тогда Описание.СтруктураИзмерений.Вставить(Имя, Мета.Тип); Тест = Новый Структура("Ведущее", Ложь); @@ -7779,7 +8289,7 @@ Если ТекстИсключения = "" Тогда ВызватьИсключение; КонецЕсли; - ВызватьИсключение СокрЛП(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + Символы.ПС + СокрЛП(ТекстИсключения)); + ВызватьИсключение СокрЛП(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + Символы.ПС + СокрЛП(ТекстИсключения)); КонецПопытки; Если СообщатьПовторно Тогда @@ -7905,7 +8415,7 @@ УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ПолноеПредставлениеДанных = Строка(Данные) + " (" + Информация.ПредставлениеЭлемента + ")"; @@ -7933,7 +8443,7 @@ НовыйШаблон = НовыйШаблон + Символы.ПС + Символы.ПС + НСтр("ru = 'Подробности в журнале регистрации.'"); - КраткоеПредставление = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + КраткоеПредставление = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); Ошибка.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НовыйШаблон, ПолноеПредставлениеДанных, КраткоеПредставление); КонецПроцедуры @@ -7942,7 +8452,7 @@ Функция ИнформацияОТипе(ПолноеИмяИлиМетаданныеИлиТип, Кэш) ТипПервогоПараметра = ТипЗнч(ПолноеИмяИлиМетаданныеИлиТип); Если ТипПервогоПараметра = Тип("Строка") Тогда - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяИлиМетаданныеИлиТип); + ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмени(ПолноеИмяИлиМетаданныеИлиТип); Иначе Если ТипПервогоПараметра = Тип("Тип") Тогда // Поиск объекта метаданных. ОбъектМетаданных = Метаданные.НайтиПоТипу(ПолноеИмяИлиМетаданныеИлиТип); @@ -8129,7 +8639,7 @@ МодульЦентрМониторинга = ОбщийМодуль("ЦентрМониторинга"); Для каждого ЭлементСтатистики Из Статистика Цикл МодульЦентрМониторинга.ЗаписатьОперациюБизнесСтатистики( - "БазоваяФункциональность.ЗаменаСсылок."+ЭлементСтатистики.Ключ, ЭлементСтатистики.Значение.КоличествоЭлементов); + "БазоваяФункциональность.ЗаменаСсылок." + ЭлементСтатистики.Ключ, ЭлементСтатистики.Значение.КоличествоЭлементов); МодульЦентрМониторинга.ЗаписатьОперациюБизнесСтатистики( "БазоваяФункциональность.ЗаменаСсылокКоличествоОшибок." + ЭлементСтатистики.Ключ, ЭлементСтатистики.Значение.КоличествоОшибок); КонецЦикла; @@ -8141,7 +8651,7 @@ Для каждого ОписаниеПодчиненногоОбъекта Из ПодчиненныеОбъекты() Цикл ПоляСвязи = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( - ОписаниеПодчиненногоОбъекта.ПоляСвязей, ",",,Истина); + ОписаниеПодчиненногоОбъекта.ПоляСвязей, ",",, Истина); ЗначениеИсключенияПоискаСсылок = Новый Массив; Для каждого ПолеСвязи Из ПоляСвязи Цикл ЗначениеИсключенияПоискаСсылок.Добавить(ПолеСвязи); @@ -8154,21 +8664,12 @@ Процедура ЗарегистрироватьОшибкиУдаления(Результат, ПрепятствующиеУдалению) + ПредставленияСсылок = ПредметыСтрокой(ПрепятствующиеУдалению.ВыгрузитьКолонку("МестоИспользования")); Для каждого ПрепятствующиеУдалению Из ПрепятствующиеУдалению Цикл - - Если ЭтоСсылка(ТипЗнч(ПрепятствующиеУдалению.ОбнаруженныйСсылка)) Тогда - ПредставлениеСсылки = ПредметСтрокой(ПрепятствующиеУдалению.ОбнаруженныйСсылка); - Иначе - // Могут быть не только ссылочные объекты - // Не описали удаление данных, добавленных в исключения поиска ссылок - ПредставлениеСсылки = Строка(ПрепятствующиеУдалению.ОбнаруженныйСсылка); - КонецЕсли; - ТекстОшибки = НСтр("ru = 'Элемент не удален, т.к. на него есть ссылки'"); - ОписаниеОшибки = ОписаниеОшибкиЗамены("ОшибкаУдаления", ПрепятствующиеУдалению.ОбнаруженныйСсылка, ПредставлениеСсылки, ТекстОшибки); - + ОписаниеОшибки = ОписаниеОшибкиЗамены("ОшибкаУдаления", ПрепятствующиеУдалению.МестоИспользования, + ПредставленияСсылок[ПрепятствующиеУдалению.МестоИспользования], ТекстОшибки); ЗарегистрироватьОшибкуЗамены(Результат, ПрепятствующиеУдалению.УдаляемыйСсылка, ОписаниеОшибки); - КонецЦикла; КонецПроцедуры @@ -8199,18 +8700,26 @@ Если ПараметрыВыполнения.УчитыватьПрикладныеПравила И ПодсистемаСуществует("СтандартныеПодсистемы.ПоискИУдалениеДублей") Тогда МодульПоискИУдалениеДублей = ОбщийМодуль("ПоискИУдалениеДублей"); Ошибки = МодульПоискИУдалениеДублей.ПроверитьВозможностьЗаменыЭлементов(ПарыЗамен, ПараметрыЗамены); + + ОригиналыОбъектов = Новый Массив; Для Каждого КлючЗначение Из Ошибки Цикл Дубль = КлючЗначение.Ключ; - Оригинал = ПарыЗамен[Дубль]; - ТекстОшибки = КлючЗначение.Значение; - Причина = ОписаниеОшибкиЗамены("ОшибкаЗаписи", Оригинал, ПредметСтрокой(Оригинал), ТекстОшибки); - ЗарегистрироватьОшибкуЗамены(Результат, Дубль, Причина); - + ОригиналыОбъектов.Добавить(ПарыЗамен[Дубль]); + Индекс = Дубли.Найти(Дубль); Если Индекс <> Неопределено Тогда Дубли.Удалить(Индекс); // пропускаем проблемный элемент. КонецЕсли; КонецЦикла; + + ПредставленияОбъектов = ПредметыСтрокой(ОригиналыОбъектов); + Для Каждого КлючЗначение Из Ошибки Цикл + Дубль = КлючЗначение.Ключ; + Оригинал = ПарыЗамен[Дубль]; + ТекстОшибки = КлючЗначение.Значение; + Причина = ОписаниеОшибкиЗамены("ОшибкаЗаписи", Оригинал, ПредставленияОбъектов[Оригинал], ТекстОшибки); + ЗарегистрироватьОшибкуЗамены(Результат, Дубль, Причина); + КонецЦикла; КонецЕсли; Возврат Дубли; @@ -8783,6 +9292,23 @@ КонецФункции +Процедура СкопироватьЗначенияТаблицыЗначений(ТаблицаЗначений, ФиксироватьДанные) + Для Каждого СтрокаТаблицыЗначений Из ТаблицаЗначений Цикл + Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл + СтрокаТаблицыЗначений[Колонка.Имя] = СкопироватьРекурсивно(СтрокаТаблицыЗначений[Колонка.Имя], ФиксироватьДанные); + КонецЦикла; + КонецЦикла; +КонецПроцедуры + +Процедура СкопироватьЗначенияСтрокиДереваЗначений(СтрокиДереваЗначений, ФиксироватьДанные); + Для Каждого СтрокаДереваЗначений Из СтрокиДереваЗначений Цикл + Для Каждого Колонка Из СтрокаДереваЗначений.Владелец().Колонки Цикл + СтрокаДереваЗначений[Колонка.Имя] = СкопироватьРекурсивно(СтрокаДереваЗначений[Колонка.Имя], ФиксироватьДанные); + КонецЦикла; + СкопироватьЗначенияСтрокиДереваЗначений(СтрокаДереваЗначений.Строки, ФиксироватьДанные); + КонецЦикла; +КонецПроцедуры + #КонецОбласти #КонецОбласти @@ -8791,7 +9317,7 @@ Процедура ПроверитьОбъектМетаданныхСуществует(ПолноеИмя) - Если Метаданные.НайтиПоПолномуИмени(ПолноеИмя) = Неопределено Тогда + Если ОбъектМетаданныхПоПолномуИмени(ПолноеИмя) = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Неизвестный тип объекта метаданных ""%1"".'"), ПолноеИмя); КонецЕсли; @@ -8868,6 +9394,7 @@ Количество = Значение.Количество(); Для Номер = 1 По Количество Цикл ОбратныйИндекс = Количество - Номер; + // @skip-check query-in-loop - выборка ссылок из разных таблиц. Если ОчиститьНесуществующиеСсылки(Значение[ОбратныйИндекс]) Тогда Значение.Удалить(ОбратныйИндекс); КонецЕсли; @@ -8879,6 +9406,7 @@ Или Тип = Тип("Соответствие") Тогда Для Каждого КлючИЗначение Из Значение Цикл + // @skip-check query-in-loop - выборка ссылок из разных таблиц. Если ОчиститьНесуществующиеСсылки(КлючИЗначение.Значение) Тогда Значение.Вставить(КлючИЗначение.Ключ, Неопределено); КонецЕсли; @@ -8934,30 +9462,63 @@ #Область БезопасноеХранилище -Функция ДанныеИзБезопасногоХранилища(Владелец, ИмяБезопасногоХранилищаДанных, Ключ) +Функция ДанныеИзБезопасногоХранилища(Владельцы, Ключи, ОбщиеДанные) - ТекстЗапроса = + ИмяБезопасногоХранилищаДанных = "РегистрСведений.БезопасноеХранилищеДанных"; + Если РазделениеВключено() И ДоступноИспользованиеРазделенныхДанных() И ОбщиеДанные <> Истина Тогда + ИмяБезопасногоХранилищаДанных = "РегистрСведений.БезопасноеХранилищеДанныхОбластейДанных"; + КонецЕсли; + + ТекстЗапроса = "ВЫБРАТЬ + | БезопасноеХранилищеДанных.Владелец КАК ВладелецДанных, | БезопасноеХранилищеДанных.Данные КАК Данные |ИЗ | #ИмяБезопасногоХранилищаДанных КАК БезопасноеХранилищеДанных |ГДЕ - | БезопасноеХранилищеДанных.Владелец = &Владелец"; + | БезопасноеХранилищеДанных.Владелец В (&Владельцы)"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ИмяБезопасногоХранилищаДанных", "РегистрСведений." + ИмяБезопасногоХранилищаДанных); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ИмяБезопасногоХранилищаДанных", ИмяБезопасногоХранилищаДанных); Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("Владелец", Владелец); + Запрос.УстановитьПараметр("Владельцы", Владельцы); РезультатЗапроса = Запрос.Выполнить().Выбрать(); - Результат = Новый Структура(Ключ); - Если РезультатЗапроса.Следующий() Тогда + Результат = Новый Соответствие(); + + НаборДанныхКлюча = ?(ЗначениеЗаполнено(Ключи) И СтрНайти(Ключи, ","), Новый Структура(Ключи), Неопределено); + Для Каждого ВладелецДанных Из Владельцы Цикл + Результат.Вставить(ВладелецДанных, НаборДанныхКлюча); + КонецЦикла; + + Пока РезультатЗапроса.Следующий() Цикл + + ДанныеВладельца = Новый Структура(Ключи); + Если ЗначениеЗаполнено(РезультатЗапроса.Данные) Тогда + СохраненныеДанные = РезультатЗапроса.Данные.Получить(); Если ЗначениеЗаполнено(СохраненныеДанные) Тогда - ЗаполнитьЗначенияСвойств(Результат, СохраненныеДанные); + + Если ЗначениеЗаполнено(Ключи) Тогда + ВладелецДанных = Результат[РезультатЗапроса.ВладелецДанных]; + ЗаполнитьЗначенияСвойств(ДанныеВладельца, СохраненныеДанные); + Иначе + ДанныеВладельца = СохраненныеДанные; + КонецЕсли; + + Если Ключи <> Неопределено + И ДанныеВладельца <> Неопределено + И ДанныеВладельца.Количество() = 1 Тогда + ЗначениеПоКлючу = ?(ДанныеВладельца.Свойство(Ключи), ДанныеВладельца[Ключи], Неопределено); + Результат.Вставить(РезультатЗапроса.ВладелецДанных, ЗначениеПоКлючу); + Иначе + Результат.Вставить(РезультатЗапроса.ВладелецДанных, ДанныеВладельца); + КонецЕсли; + КонецЕсли; + КонецЕсли; - КонецЕсли; + КонецЦикла; Возврат Результат; КонецФункции @@ -9018,7 +9579,7 @@ ВременнаяСтруктура.Вставить(ИмяМетодаОбъекта); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Безопасное выполнение метода'", КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Неправильный формат параметра %1 (передано значение: ""%2"") в %3: |Имя метода ""%4"" не соответствует требованиям образования имен процедур и функций.'"), @@ -9340,7 +9901,38 @@ Функция МинимальнаяВерсияПлатформы() Экспорт // АПК:581 - экспортная, так как используется при тестировании. - Возврат "8.3.17.2760; 8.3.18.1957; 8.3.19.1723; 8.3.20.2180; 8.3.21.1622; 8.3.22.1704"; + Возврат "8.3.21.1622; 8.3.22.1704"; + +КонецФункции + +// Выполняет проверку правильности заполнения минимальной и рекомендуемой версии платформы. +// +// Параметры: +// Минимальная - Строка - номер версия платформы. +// Рекомендуемая - Строка - номер версия платформы. +// +// Возвращаемое значение: +// Булево - Истина, если минимальная и рекомендуемая версия платформы заполнена не правильно. +// +Функция МинимальнаяИРекомендуемаяВерсияПлатформыЗаполненаНеПравильно(Минимальная, Рекомендуемая) + + // Минимальная версия платформы должна быть заполнена. + Если ПустаяСтрока(Минимальная) Тогда + Возврат Истина; + КонецЕсли; + + // Минимальная версия платформы не должна быть меньше минимальной версии платформы необходимой для правильной работы + // БСП. + МинимальнаяБСП = НомерСборкиПоТекущейВерсииПлатформы( + МинимальнаяВерсияПлатформы()); + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(МинимальнаяБСП, Минимальная) > 0 Тогда + Возврат Истина; + КонецЕсли; + + // Минимальная версия платформы не должны быть больше рекомендуемой + Возврат Не ПустаяСтрока(Минимальная) + И Не ПустаяСтрока(Рекомендуемая) + И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Минимальная, Рекомендуемая) > 0; КонецФункции @@ -9353,13 +9945,7 @@ Функция ЭтоВерсияЗащищенногоПрограммногоКомплекса(Версия) Версии = Новый Массив; - Версии.Добавить("8.3.17.2102"); - Версии.Добавить("8.3.17.2316"); - Версии.Добавить("8.3.17.2598"); - Версии.Добавить("8.3.17.2714"); - Версии.Добавить("8.3.19.1405"); Версии.Добавить("8.3.21.1676"); - Возврат Версии.Найти(Версия) <> Неопределено; КонецФункции @@ -9397,17 +9983,6 @@ ИначеЕсли СтрНайти("8.3.21.1607,8.3.21.1508,8.3.21.1484", ТекущаяСборка) Тогда Возврат "8.3.21.1624"; - ИначеЕсли СтрНайти("8.3.20.2076,8.3.20.2039", ТекущаяСборка) Тогда - Возврат "8.3.20.2184"; - - ИначеЕсли СтрНайти("8.3.19.1665,8.3.19.1659", ТекущаяСборка) Тогда - Возврат "8.3.19.1726"; - - ИначеЕсли СтрНайти("8.3.18.1902,8.3.18.1894", ТекущаяСборка) Тогда - Возврат "8.3.18.1959"; - - ИначеЕсли СтрНайти("8.3.17.2733,8.3.17.2665,8.3.17.2757", ТекущаяСборка) Тогда - Возврат "8.3.17.2760"; КонецЕсли; Возврат ""; diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl index c42d09b55..162bc74e3 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl @@ -342,6 +342,40 @@ КонецФункции +// Возвращает признак работы в режиме разделения данных по областям +// (технически это признак условного разделения). +// +// Возвращает Ложь, если конфигурация не может работать в режиме разделения данных +// (не содержит общих реквизитов, предназначенных для разделения данных). +// +// Возвращаемое значение: +// Булево - Истина, если разделение включено, +// Ложь, если разделение выключено или не поддерживается. +// +Функция РазделениеВключено() Экспорт + + Возврат СтандартныеПодсистемыКлиент.ПараметрКлиента("РазделениеВключено"); + +КонецФункции + +// Возвращает признак возможности обращения к разделенным данным (которые входят в состав разделителей). +// Признак относится к сеансу, но может меняться во время работы сеанса, если разделение было включено +// в самом сеансе, поэтому проверку следует делать непосредственно перед обращением к разделенным данным. +// +// Возвращает Истина, если конфигурация не может работать в режиме разделения данных +// (не содержит общих реквизитов, предназначенных для разделения данных). +// +// Возвращаемое значение: +// Булево - Истина, если разделение не поддерживается, либо разделение выключено, +// либо разделение включено и разделители установлены. +// Ложь, если разделение включено и разделители не установлены. +// +Функция ДоступноИспользованиеРазделенныхДанных() Экспорт + + Возврат СтандартныеПодсистемыКлиент.ПараметрКлиента("ДоступноИспользованиеРазделенныхДанных"); + +КонецФункции + #КонецОбласти #Область Даты @@ -522,8 +556,8 @@ // Для использования в обработчиках события ПередЗакрытием модулей форм объектов, // которые возможно записать в информационную базу. // Отображение вопроса зависит свойства модифицированности формы. -// Для отображения вопроса произвольной формы используйте: -// см. процедуру ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияПроизвольнойФормы(). +// +// См. также процедуру ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияПроизвольнойФормы. // // Параметры: // ОповещениеСохранитьИЗакрыть - ОписаниеОповещения - содержит имя процедуры, вызываемой при нажатии на кнопку "OK". @@ -596,8 +630,7 @@ // Задает вопрос о продолжении действия, которое приведет к закрытию формы. // Для использования в обработчиках события ПередЗакрытием модулей форм. -// Для отображения вопроса в форме, которая возможно записать в информационную базу, используйте: -// см. процедуру ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(). +// См. также процедуру ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы. // // Параметры: // Форма - ФормаКлиентскогоПриложения - форма, которая вызывает диалог предупреждения. @@ -885,7 +918,7 @@ //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для подключения и установки внешних компонент из макетов конфигурации. -// Возвращает структуру параметров для см. процедуру ПодключитьКомпонентуИзМакета. +// Возвращает структуру параметров для процедуры ПодключитьКомпонентуИзМакета. // // Возвращаемое значение: // Структура: @@ -896,6 +929,13 @@ // * ИдентификаторыСозданияОбъектов - Массив - идентификатор создания экземпляра модуля объекта, // используется только для компонент, у которых есть несколько идентификаторов создания объектов, // при задании параметр Идентификатор будет игнорироваться. +// * Изолированно - Булево, Неопределено - (по умолчанию Неопределено) если Истина, компонента будет подключена +// изолированно, в этом случае внешняя компонента загружается в отдельный процесс операционной системы; +// Ложь - в этом случае внешняя компонента будет выполняться в том же процессе операционной системы, +// который выполняет код встроенного языка; Неопределено - поддерживается поведение платформы по умолчанию: +// изолированно - если компонентой поддерживается только этот режим, не изолированно - в остальных случаях. +// См. https://its.1c.eu/db/v83doc#bookmark:dev:TI000001866 +// // // Пример: // @@ -911,6 +951,7 @@ Параметры.Вставить("ПредложитьЗагрузить", Ложь); Параметры.Вставить("ТекстПояснения", ""); Параметры.Вставить("ИдентификаторыСозданияОбъектов", Новый Массив); + Параметры.Вставить("Изолированно", Неопределено); Возврат Параметры; @@ -988,7 +1029,7 @@ КонецПроцедуры -// Возвращает структуру параметров для см. процедуру УстановитьКомпонентуИзМакета. +// Возвращает структуру параметров для процедуры УстановитьКомпонентуИзМакета. // // Возвращаемое значение: // Структура: @@ -1060,6 +1101,79 @@ КонецПроцедуры +#Область ДляВызоваИзДругихПодсистем + +// БиблиотекаПодключаемогоОборудования +// +// Устанавливает компоненту, выполненную по технологии Native API и COM асинхронном режиме. +// Компонента должна храниться в макете конфигурации в виде ZIP-архива. +// +// Параметры: +// ПолноеИмяМакета - Строка - полное имя макета, используемое как местоположение компоненты. +// ПараметрыУстановки - Структура +// - Неопределено - см. функцию ПараметрыУстановкиКомпоненты. +// +// Возвращаемое значение: +// Структура - результат установки компоненты: +// * Установлено - Булево - признак установки. +// * ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка. +// +Асинх Функция УстановитьКомпонентуИзМакетаАсинх(ПолноеИмяМакета, ПараметрыУстановки = Неопределено) Экспорт + + Параметры = ПараметрыУстановкиКомпоненты(); + Если ПараметрыУстановки <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(Параметры, ПараметрыУстановки); + КонецЕсли; + + Контекст = Новый Структура; + Контекст.Вставить("Местоположение", ПолноеИмяМакета); + Контекст.Вставить("ТекстПояснения", Параметры.ТекстПояснения); + Контекст.Вставить("Идентификатор", ПолноеИмяМакета); + + Возврат Ждать ОбщегоНазначенияСлужебныйКлиент.УстановитьКомпонентуАсинх(Контекст); + +КонецФункции + +// Подключает компоненту, выполненную по технологии Native API и COM, в асинхронном режиме. +// Компонента должна храниться в макете конфигурации в виде ZIP-архива. +// +// Параметры: +// Идентификатор - Строка - идентификатор объекта внешней компоненты. +// ПолноеИмяМакета - Строка - полное имя макета, используемое как местоположение компоненты. +// ПараметрыПодключения - Структура +// - Неопределено - см. ПараметрыПодключенияКомпоненты. +// +// Возвращаемое значение: +// Структура - результат подключения компоненты: +// * Подключено - Булево - признак подключения. +// * ПодключаемыйМодуль - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты; +// - ФиксированноеСоответствие из КлючИЗначение - экземпляры объектов внешней компоненты, +// указанные в ПараметрыПодключения.ИдентификаторыСозданияОбъектов: +// ** Ключ - Строка - идентификатор внешней компоненты; +// ** Значение - ОбъектВнешнейКомпоненты - экземпляр объекта. +// * ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка. +// +Асинх Функция ПодключитьКомпонентуИзМакетаАсинх(Идентификатор, ПолноеИмяМакета, + ПараметрыПодключения = Неопределено) Экспорт + + Параметры = ПараметрыПодключенияКомпоненты(); + Если ПараметрыПодключения <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(Параметры, ПараметрыПодключения); + КонецЕсли; + + Контекст = ОбщегоНазначенияСлужебныйКлиент.КонтекстПодключенияКомпоненты(); + ЗаполнитьЗначенияСвойств(Контекст, Параметры); + Контекст.Идентификатор = Идентификатор; + Контекст.Местоположение = ПолноеИмяМакета; + + Возврат Ждать ОбщегоНазначенияСлужебныйКлиент.ПодключитьКомпонентуАсинх(Контекст); + +КонецФункции + +// Конец БиблиотекаПодключаемогоОборудования + +#КонецОбласти + #КонецОбласти #Область ВнешнееСоединение diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиентПереопределяемый/Module.bsl index 54e791157..216b36042 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиентПереопределяемый/Module.bsl @@ -145,15 +145,15 @@ // Для того чтобы в начале заголовка программы вывести название текущего проекта, следует определить параметр // ТекущийПроект в процедуре ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиента и вписать код: // -// Если ПриЗапуске Тогда -// Возврат; -// КонецЕсли; -// ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); -// ТекущийПроект = Неопределено; -// Если ПараметрыКлиента.ДоступноИспользованиеРазделенныхДанных И ПараметрыКлиента.Свойство("ТекущийПроект", ТекущийПроект) -// И Не ПараметрыКлиента.ТекущийПроект.Пустая() Тогда -// ЗаголовокПриложения = Строка(ПараметрыКлиента.ТекущийПроект) + " / " + ЗаголовокПриложения; -// КонецЕсли; +// Если Не ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда +// Возврат; +// КонецЕсли; +// ПараметрыКлиента = ?(ПриЗапуске, СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(), +// СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента()); +// Если ПараметрыКлиента.Свойство("ТекущийПроект") +// И ЗначениеЗаполнено(ПараметрыКлиента.ТекущийПроект) Тогда +// ЗаголовокПриложения = Строка(ПараметрыКлиента.ТекущийПроект) + " / " + ЗаголовокПриложения; +// КонецЕсли; // Процедура ПриУстановкеЗаголовкаКлиентскогоПриложения(ЗаголовокПриложения, ПриЗапуске) Экспорт diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl index 1881f07dd..35747b082 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl @@ -231,6 +231,40 @@ КонецФункции +// Возвращает имя значения перечисления типа платформы. +// +// Параметры: +// ЗначениеТипаПлатформы - Неопределено - вернуть текущее имя типа платформы +// (из объекта СистемнаяИнформация). +// - ТипПлатформы - вернуть имя указанного значения типа платформы. +// Возвращаемое значение: +// Строка - например, Windows_x86_64, Linux_x86_64, MacOS_x86... +// +Функция ИмяТипаПлатформы(Знач ЗначениеТипаПлатформы = Неопределено) Экспорт + + Если ТипЗнч(ЗначениеТипаПлатформы) <> Тип("ТипПлатформы") Тогда + СистемнаяИнформация = Новый СистемнаяИнформация; + ЗначениеТипаПлатформы = СистемнаяИнформация.ТипПлатформы; + КонецЕсли; + + Если ЗначениеТипаПлатформы = ТипПлатформы.Linux_x86 Тогда + Возврат "Linux_x86"; + ИначеЕсли ЗначениеТипаПлатформы = ТипПлатформы.Linux_x86_64 Тогда + Возврат "Linux_x86_64"; + ИначеЕсли ЗначениеТипаПлатформы = ТипПлатформы.MacOS_x86 Тогда + Возврат "MacOS_x86"; + ИначеЕсли ЗначениеТипаПлатформы = ТипПлатформы.MacOS_x86_64 Тогда + Возврат "MacOS_x86_64"; + ИначеЕсли ЗначениеТипаПлатформы = ТипПлатформы.Windows_x86 Тогда + Возврат "Windows_x86"; + ИначеЕсли ЗначениеТипаПлатформы = ТипПлатформы.Windows_x86_64 Тогда + Возврат "Windows_x86_64"; + КонецЕсли; + + Возврат ""; + +КонецФункции + #КонецОбласти #Область Данные @@ -306,7 +340,7 @@ Контекст); Если ЗначениеПараметра = Неопределено Тогда - ПредставлениеЗначенияПараметра = НСтр("ru = 'Неопределено'"); + ПредставлениеЗначенияПараметра = "Неопределено"; ИначеЕсли ТипЗнч(ЗначениеПараметра) = Тип("ДвоичныеДанные") И ЗначениеПараметра.Размер() = 0 Тогда ПредставлениеЗначенияПараметра = ""; Иначе @@ -475,7 +509,8 @@ Если Заменять = Ложь Тогда Продолжить; Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Пересечение ключей источника и приемника: ""%1"".'"), Элемент.Ключ); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Пересечение ключей источника и приемника: ""%1"".'"), Элемент.Ключ); КонецЕсли КонецЕсли; Приемник.Вставить(Элемент.Ключ, Элемент.Значение); @@ -974,7 +1009,6 @@ // // Параметры: // ОбластьПоиска - ОтборКомпоновкиДанных -// - КоллекцияЭлементовОтбораКомпоновкиДанных // - ГруппаЭлементовОтбораКомпоновкиДанных - контейнер с элементами и группами отбора, // например Список.Отбор или группа в отборе. // ИмяПоля - Строка - имя поля компоновки (не используется для групп). @@ -1007,7 +1041,6 @@ // // Параметры: // КоллекцияЭлементов - ОтборКомпоновкиДанных -// - КоллекцияЭлементовОтбораКомпоновкиДанных // - ГруппаЭлементовОтбораКомпоновкиДанных - контейнер с элементами и группами отбора, // например Список.Отбор или группа в отборе. // Представление - Строка - представление группы. @@ -1044,8 +1077,9 @@ // Добавить элемент компоновки в контейнер элементов компоновки. // // Параметры: -// ОбластьДобавления - КоллекцияЭлементовОтбораКомпоновкиДанных - контейнер с элементами и группами отбора, -// например, Список.Отбор или группа в отборе. +// ОбластьДобавления - ОтборКомпоновкиДанных +// - ГруппаЭлементовОтбораКомпоновкиДанных - контейнер с элементами и группами отбора, +// например, Список.Отбор или группа в отборе. // ИмяПоля - Строка - имя поля компоновки данных (заполняется всегда). // ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения. // ПравоеЗначение - Произвольный - сравниваемое значение. @@ -1104,8 +1138,9 @@ // Изменить элемент отбора с заданным именем поля или представлением. // // Параметры: -// ОбластьПоиска - КоллекцияЭлементовОтбораКомпоновкиДанных - контейнер с элементами и группами отбора, -// например Список.Отбор или группа в отборе. +// ОбластьПоиска - ОтборКомпоновкиДанных +// - ГруппаЭлементовОтбораКомпоновкиДанных - контейнер с элементами и группами отбора, +// например Список.Отбор или группа в отборе. // ИмяПоля - Строка - имя поля компоновки данных (заполняется всегда). // Представление - Строка - представление элемента компоновки данных. // ПравоеЗначение - Произвольный - сравниваемое значение. @@ -1202,7 +1237,8 @@ // Добавить или заменить существующий элемент отбора. // // Параметры: -// ОбластьПоискаДобавления - КоллекцияЭлементовОтбораКомпоновкиДанных - контейнер с элементами и группами отбора, +// ОбластьПоискаДобавления - ОтборКомпоновкиДанных +// - ГруппаЭлементовОтбораКомпоновкиДанных - контейнер с элементами и группами отбора, // например, Список.Отбор или группа в отборе. // ИмяПоля - Строка - имя поля компоновки данных (заполняется всегда). // ПравоеЗначение - Произвольный - сравниваемое значение. @@ -1223,7 +1259,7 @@ Знач ИдентификаторПользовательскойНастройки = Неопределено) Экспорт ЧислоИзмененных = ИзменитьЭлементыОтбора(ОбластьПоискаДобавления, ИмяПоля, Представление, - ПравоеЗначение, ВидСравнения, Использование, РежимОтображения, ИдентификаторПользовательскойНастройки); + ПравоеЗначение, ВидСравнения, Использование, РежимОтображения, ИдентификаторПользовательскойНастройки); Если ЧислоИзмененных = 0 Тогда Если ВидСравнения = Неопределено Тогда @@ -1239,7 +1275,7 @@ РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; КонецЕсли; ДобавитьЭлементКомпоновки(ОбластьПоискаДобавления, ИмяПоля, ВидСравнения, - ПравоеЗначение, Представление, Использование, РежимОтображения, ИдентификаторПользовательскойНастройки); + ПравоеЗначение, Представление, Использование, РежимОтображения, ИдентификаторПользовательскойНастройки); КонецЕсли; КонецПроцедуры @@ -3126,8 +3162,8 @@ СтрокаСообщенияОбОшибке = НСтр("ru = 'Не удалось подключиться к другой программе: %1'"); Результат.ОшибкаПодключенияКомпоненты = Истина; - Результат.ПодробноеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ПодробноеПредставлениеОшибки(Информация)); - Результат.КраткоеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, КраткоеПредставлениеОшибки(Информация)); + Результат.ПодробноеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); + Результат.КраткоеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация)); Возврат Результат; КонецПопытки; @@ -3199,8 +3235,8 @@ СтрокаСообщенияОбОшибке = НСтр("ru = 'Не удалось подключиться к другой программе: %1'"); Результат.ОшибкаПодключенияКомпоненты = Истина; - Результат.ПодробноеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ПодробноеПредставлениеОшибки(Информация)); - Результат.КраткоеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, КраткоеПредставлениеОшибки(Информация)); + Результат.ПодробноеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); + Результат.КраткоеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация)); КонецПопытки; #КонецЕсли @@ -3399,7 +3435,7 @@ Функция ОперативнаяПамятьДоступнаяКлиентскомуПриложению() Экспорт #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - ДоступныйОбъем = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере(Ложь).Получить("ОперативнаяПамять"); + ДоступныйОбъем = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ОперативнаяПамять"); #Иначе СистемнаяИнформация = Новый СистемнаяИнформация; ДоступныйОбъем = Окр(СистемнаяИнформация.ОперативнаяПамять / 1024, 1); @@ -3437,7 +3473,7 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда Возврат ОбщегоНазначения.КодОсновногоЯзыка(); #Иначе - Возврат СтандартныеПодсистемыКлиент.ПараметрКлиента("КодОсновногоЯзыка"); + Возврат ОбщегоНазначенияКлиент.КодОсновногоЯзыка(); #КонецЕсли КонецФункции @@ -3501,9 +3537,10 @@ // - пустых ссылок; // - значений перечислений; // - точек маршрута бизнес-процессов. - Если ".ПУСТАЯССЫЛКА" = ВРег(Прав(ПолноеИмяПредопределенного, 13)) - Или "ПЕРЕЧИСЛЕНИЕ." = ВРег(Лев(ПолноеИмяПредопределенного, 13)) - Или "БИЗНЕСПРОЦЕСС." = ВРег(Лев(ПолноеИмяПредопределенного, 14)) Тогда + + Если СтрЗаканчиваетсяНа(ВРег(ПолноеИмяПредопределенного), ".ПУСТАЯССЫЛКА") + Или СтрНачинаетсяС(ВРег(ПолноеИмяПредопределенного), "ПЕРЕЧИСЛЕНИЕ.") + Или СтрНачинаетсяС(ВРег(ПолноеИмяПредопределенного), "БИЗНЕСПРОЦЕСС.") Тогда Возврат ПредопределенноеЗначение(ПолноеИмяПредопределенного); КонецЕсли; @@ -3550,8 +3587,9 @@ КонецФункции -// Устарела. Следует использовать ФайловаяСистемаКлиент.ПараметрыЗапускаПрограммы или ФайловаяСистема.ПараметрыЗапускаПрограммы -// Возвращает структуру параметров для см. процедуру ЗапуститьПрограмму. +// Устарела. Следует использовать ФайловаяСистемаКлиент.ПараметрыЗапускаПрограммы +// или ФайловаяСистема.ПараметрыЗапускаПрограммы. +// Возвращает структуру параметров для процедуры ЗапуститьПрограмму. // // Возвращаемое значение: // Структура: @@ -4026,6 +4064,17 @@ КонецФункции +Функция ИмяСоответствуетТребованиямИменованияСвойств(Имя) Экспорт + Буквы = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ"; // @Non-NLS, АПК:163 В данных буква допустима + Цифры = "1234567890"; // @Non-NLS + + Если Имя = "" Или СтрНайти(Буквы + "_", ВРег(Лев(Имя, 1))) = 0 Тогда + Возврат Ложь; + КонецЕсли; + + Возврат СтрРазделить(ВРег(Имя), Буквы + Цифры + "_", Ложь).Количество() = 0; +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -4293,7 +4342,7 @@ НСтр("ru = 'Не удалось удалить временный файл |%1 по причине: %2'"), ПолноеИмяФайла, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()))); #КонецЕсли // АПК:547-вкл diff --git a/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl index e234d406d..750b7bed7 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl @@ -128,12 +128,27 @@ КонецПроцедуры -// Позволяет выполнить произвольные действия перед запуском программы. -// Например, настроить начальную страницу и другие параметры интерфейса в зависимости от режима работы. +// Позволяет выполнить специальные минимальные быстрые действия перед запуском сеанса программы, +// которые невозможно выполнить на более позднем этапе. Например, настроить начальную страницу и +// другие параметры интерфейса в зависимости от режима работы. +// +// Следует вписывать вызовы в этот обработчик вместо обработчика события платформы +// УстановкаПараметровСеанса в модуле сеанса с проверкой ИменаПараметровСеанса = Неопределено. +// Вызов производится в привилегированном режиме, который устанавливает платформа перед +// вызовом обработчика события УстановкаПараметровСеанса. // // Вызывается после проверки минимальной версии платформы, заданной в процедуре // ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности. // +// Для повышения производительности не вызывается из сеансов фоновых заданий, +// кроме случая когда имя метода фонового задания указано в одном из регламентных заданий. +// +// Для проверки, что запускается клиентский сеанс следует использовать быстрое условие +// ТекущийРежимЗапуска() <> Неопределено, для проверки других видов сеанса следует использовать +// условие ПолучитьТекущийСеансИнформационнойБазы().ИмяПриложения = "<имя>", например WSConnection. +// Для определения регламентного задания следует использовать имя BackgroundJob, так как из +// сеансов фоновых заданий этот обработчик не вызывается. +// Процедура ПередЗапускомПрограммы() Экспорт КонецПроцедуры diff --git a/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/Module.bsl index 395b480b9..3ebead9a7 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/Module.bsl @@ -45,63 +45,6 @@ КонецФункции -// Сокращает имя файла с расширением. -// Сокращение имени, производится, когда имя файла с расширением превышает размер 255 байт. -// Сокращение ими файла достигая за счет сокращения имени файла без расширения и -// добавления значения хеш функции сокращенной строки. -// -// Параметры: -// ИмяФайла - Строка - имя файла с расширением -Процедура СократитьИмяФайла(ИмяФайла) Экспорт - -#Если ВебКлиент Тогда - Возврат; -#КонецЕсли - - ОграничениеВБайтах = 255; - Если РазмерСтрокиВБайтах(ИмяФайла) <= ОграничениеВБайтах Тогда - Возврат; - КонецЕсли; - - Файл = Новый Файл(ИмяФайла); - ИмяБезРасширения = Файл.ИмяБезРасширения; - - ОграничениеВБайтах = ОграничениеВБайтах - РазмерСтрокиВБайтах(Файл.Расширение); - - ДлинаСтроки = СтрДлина(ИмяБезРасширения); - ИспользуемоеКоличествоСимволов = ОграничениеВБайтах - 32; - БольшееКоличествоСимволов = Мин(ДлинаСтроки, ОграничениеВБайтах); - МеньшееКоличествоСимволов = Цел((ОграничениеВБайтах - 32)/4); - Уменьшить = Истина; - Пока Истина Цикл - Если Уменьшить Тогда - ИспользуемоеКоличествоСимволов = МеньшееКоличествоСимволов + Цел((ИспользуемоеКоличествоСимволов-МеньшееКоличествоСимволов)/2); - Иначе - ИспользуемоеКоличествоСимволов = ИспользуемоеКоличествоСимволов + Цел((БольшееКоличествоСимволов - ИспользуемоеКоличествоСимволов)/2); - КонецЕсли; - - РазмерСтрокиВБайтах = РазмерСтрокиВБайтах(ИмяБезРасширения)+32; - - Если РазмерСтрокиВБайтах = ОграничениеВБайтах Или БольшееКоличествоСимволов - МеньшееКоличествоСимволов = 1 Тогда - Прервать; - КонецЕсли; - - Если РазмерСтрокиВБайтах > ОграничениеВБайтах Тогда - Уменьшить = Истина; - БольшееКоличествоСимволов = ИспользуемоеКоличествоСимволов; - Иначе - Уменьшить = Ложь; - МеньшееКоличествоСимволов = ИспользуемоеКоличествоСимволов; - КонецЕсли; - - КонецЦикла; - - СокращеннаяСтрока = СократитьСтроку(ИмяБезРасширения, ИспользуемоеКоличествоСимволов); - - ИмяФайла = СокращеннаяСтрока+Файл.Расширение; - -КонецПроцедуры - #Область ВнешниеКомпоненты // Контекст подключения компоненты. @@ -113,14 +56,24 @@ // * Версия - Неопределено, Строка - версия компоненты. // * Местоположение - Строка - местоположение макета или ссылка на внешнюю компоненту. // * ИсходноеМестоположение - Строка - местоположение начального вызова, для хранения кэша. -// * Кэшировать - Булево - признак сохранения подключенной компоненты в кэше. +// * Кэшировать - Булево - (по умолчанию Истина) признак сохранения подключенной компоненты в кэше; +// Ложь - в память могут быть загружены одновременно несколько объектов одной компоненты, +// что может вызвать ошибки. // * ПредложитьУстановить - Булево - предлагать устанавливать компоненту. +// * БылаПопыткаУстановки - Булево - в процессе подключения была попытка установки. // * ПредложитьЗагрузить - Булево - предлагать загружать компоненту с сайта ИТС. // * ТекстПояснения - Строка - для чего нужна компонента и что не будет работать, если ее не устанавливать. // * ИдентификаторыСозданияОбъектов - Массив -идентификатор создания экземпляра модуля объекта, // используется только для компонент, у которых есть несколько идентификаторов создания объектов, // при задании параметр Идентификатор будет игнорироваться. // * ВыполненПоискНовойВерсии - Булево - поиск новой версии компоненты производился. +// * Изолированно - Булево, Неопределено - (по умолчанию Неопределено) если Истина, компонента будет подключена +// изолированно, в этом случае внешняя компонента загружается в отдельный процесс операционной системы; +// Ложь - в этом случае внешняя компонента будет выполняться в том же процессе операционной системы, +// который выполняет код встроенного языка; Неопределено - поддерживается поведение платформы по умолчанию: +// изолированно - если компонентой поддерживается только этот режим, не изолированно - в остальных случаях. +// См. https://its.1c.eu/db/v83doc#bookmark:dev:TI000001866 +// // Функция КонтекстПодключенияКомпоненты() Экспорт @@ -136,11 +89,134 @@ Контекст.Вставить("ТекстПояснения", ""); Контекст.Вставить("ИдентификаторыСозданияОбъектов", Новый Массив); Контекст.Вставить("ВыполненПоискНовойВерсии", Ложь); + Контекст.Вставить("Изолированно", Неопределено); + Контекст.Вставить("БылаПопыткаУстановки", Ложь); Возврат Контекст; КонецФункции +// Параметры: +// Контекст - см. КонтекстПодключенияКомпоненты. +// +Асинх Функция ПодключитьКомпонентуАсинх(Контекст) Экспорт + + Если ПустаяСтрока(Контекст.Идентификатор) Тогда + КомпонентаСодержитЕдинственныйКлассОбъектов = (Контекст.ИдентификаторыСозданияОбъектов.Количество() = 0); + + Если КомпонентаСодержитЕдинственныйКлассОбъектов Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось подключить внешнюю компоненту ""%1"" в клиентском приложении + |по причине: + |Недопустимо одновременно не указывать %2 и %3.'"), + Контекст.Местоположение, "Идентификатор", "ИдентификаторыСозданияОбъектов"); + Иначе + // В случае, когда в компоненте есть несколько классов объектов + // Идентификатор используется только для отображения компоненты в текстах ошибок. + // Следует собрать идентификатор для отображения. + Контекст.Идентификатор = СтрСоединить(Контекст.ИдентификаторыСозданияОбъектов, ", "); + КонецЕсли; + КонецЕсли; + + ПроверитьМестоположениеКомпоненты(Контекст.Идентификатор, Контекст.Местоположение); + + Если Не Контекст.ВыполненПоискНовойВерсии Тогда + + Если Контекст.Кэшировать Тогда + + ПодключаемыйМодуль = ПолучитьОбъектКомпонентыИзКэша(Контекст.Местоположение); + + Если ПодключаемыйМодуль <> Неопределено Тогда + Результат = РезультатПодключенияКомпоненты(); + Результат.Подключено = Истина; + Результат.ПодключаемыйМодуль = ПодключаемыйМодуль; + Возврат Результат; + КонецЕсли; + + // Проверка факта подключения внешней компоненты в этом сеансе ранее. + СимволическоеИмя = ПолучитьСимволическоеИмяКомпонентыИзКэша(Контекст.Местоположение); + + Если СимволическоеИмя <> Неопределено Тогда + // Если в кэше уже есть символическое имя - значит к этому сеансу ранее компонента уже подключалась. + Подключено = Истина; + Контекст.Вставить("СимволическоеИмя", СимволическоеИмя); + Возврат Ждать ПодключитьКомпонентуПослеПопыткиПодключенияАсинх(Подключено, Контекст); + КонецЕсли; + + КонецЕсли; + + // Поиск более свежей версии компоненты в макетах и справочнике. + Если ЭтоМакет(Контекст.Местоположение) Тогда + + РезультатПоискаВнешнейКомпоненты = Неопределено; + Контекст.ИсходноеМестоположение = Контекст.Местоположение; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда + МодульВнешниеКомпонентыСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль( + "ВнешниеКомпонентыСлужебныйКлиент"); + + КонтекстПроверкиКомпоненты = КонтекстПодключенияКомпоненты(); + КонтекстПроверкиКомпоненты.Идентификатор = Контекст.Идентификатор; + КонтекстПроверкиКомпоненты.Версия = Неопределено; + КонтекстПроверкиКомпоненты.ПредложитьУстановить = Контекст.ПредложитьУстановить; + КонтекстПроверкиКомпоненты.ПредложитьЗагрузить = Контекст.ПредложитьЗагрузить; + КонтекстПроверкиКомпоненты.ТекстПояснения = Контекст.ТекстПояснения; + КонтекстПроверкиКомпоненты.ИсходноеМестоположение = Контекст.ИсходноеМестоположение; + КонтекстПроверкиКомпоненты.ИдентификаторыСозданияОбъектов = Контекст.ИдентификаторыСозданияОбъектов; + + РезультатПоискаВнешнейКомпоненты = МодульВнешниеКомпонентыСлужебныйКлиент.РезультатПроверкиДоступностиКомпоненты( + КонтекстПроверкиКомпоненты); + + КонецЕсли; + + Контекст.ВыполненПоискНовойВерсии = Истина; + Если РезультатПоискаВнешнейКомпоненты = Неопределено Или РезультатПоискаВнешнейКомпоненты.КомпонентаПоследнейВерсии = Неопределено Тогда + КомпонентаПоследнейВерсии = СтандартныеПодсистемыВызовСервера.КомпонентаПоследнейВерсии( + Контекст.Идентификатор, Контекст.ИсходноеМестоположение, Результат); + Иначе + КомпонентаПоследнейВерсии = РезультатПоискаВнешнейКомпоненты.КомпонентаПоследнейВерсии; + КонецЕсли; + + Контекст.Местоположение = КомпонентаПоследнейВерсии.Местоположение; + Контекст.Версия = КомпонентаПоследнейВерсии.Версия; + + Возврат Ждать ПодключитьКомпонентуАсинх(Контекст); + + КонецЕсли; + КонецЕсли; + + // Генерация уникального имени. + СимволическоеИмя = "С" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", ""); + Контекст.Вставить("СимволическоеИмя", СимволическоеИмя); + + Попытка + +#Если МобильноеПриложениеКлиент ИЛИ МобильныйКлиент Тогда + Подключено = Ждать ПодключитьВнешнююКомпонентуАсинх(Контекст.Местоположение, СимволическоеИмя); +#Иначе + Подключено = Ждать ПодключитьВнешнююКомпонентуАсинх(Контекст.Местоположение, СимволическоеИмя,, + ОбщегоНазначенияСлужебныйКлиентСервер.ТипПодключенияКомпоненты(Контекст.Изолированно)); +#КонецЕсли + + Исключение + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось подключить внешнюю компоненту ""%1"" на клиенте + |%2 + |по причине: + |%3'"), + Контекст.Идентификатор, + Контекст.Местоположение, + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + Возврат ОшибкаПодключенияКомпоненты(ТекстОшибки); + + КонецПопытки; + + Возврат Ждать ПодключитьКомпонентуПослеПопыткиПодключенияАсинх(Подключено, Контекст); + +КонецФункции + // Параметры: // Контекст - см. КонтекстПодключенияКомпоненты. // @@ -166,25 +242,29 @@ ПроверитьМестоположениеКомпоненты(Контекст.Идентификатор, Контекст.Местоположение); Если Не Контекст.ВыполненПоискНовойВерсии Тогда + Если Контекст.Кэшировать Тогда + ПодключаемыйМодуль = ПолучитьОбъектКомпонентыИзКэша(Контекст.Местоположение); + Если ПодключаемыйМодуль <> Неопределено Тогда ПодключитьКомпонентуОповеститьОПодключении(ПодключаемыйМодуль, Контекст); Возврат; КонецЕсли; - КонецЕсли; - - // Проверка факта подключения внешней компоненты в этом сеансе ранее. - СимволическоеИмя = ПолучитьСимволическоеИмяКомпонентыИзКэша(Контекст.Местоположение); + + // Проверка факта подключения внешней компоненты в этом сеансе ранее. + СимволическоеИмя = ПолучитьСимволическоеИмяКомпонентыИзКэша(Контекст.Местоположение); - Если СимволическоеИмя <> Неопределено Тогда - // Если в кэше уже есть символическое имя - значит к этому сеансу ранее компонента уже подключалась. - Подключено = Истина; - Контекст.Вставить("СимволическоеИмя", СимволическоеИмя); - ПодключитьКомпонентуПослеПопыткиПодключения(Подключено, Контекст); - Возврат; + Если СимволическоеИмя <> Неопределено Тогда + // Если в кэше уже есть символическое имя - значит к этому сеансу ранее компонента уже подключалась. + Подключено = Истина; + Контекст.Вставить("СимволическоеИмя", СимволическоеИмя); + ПодключитьКомпонентуПослеПопыткиПодключения(Подключено, Контекст); + Возврат; + КонецЕсли; + КонецЕсли; - + // Поиск более свежей версии компоненты в макетах и справочнике. Если ЭтоМакет(Контекст.Местоположение) Тогда Контекст.ИсходноеМестоположение = Контекст.Местоположение; @@ -219,8 +299,13 @@ "ПодключитьКомпонентуПослеПопыткиПодключения", ЭтотОбъект, Контекст, "ПодключитьКомпонентуПриОбработкеОшибки", ЭтотОбъект); + #Если МобильноеПриложениеКлиент Или МобильныйКлиент Тогда НачатьПодключениеВнешнейКомпоненты(Оповещение, Контекст.Местоположение, СимволическоеИмя); - + #Иначе + НачатьПодключениеВнешнейКомпоненты(Оповещение, Контекст.Местоположение, СимволическоеИмя,, + ОбщегоНазначенияСлужебныйКлиентСервер.ТипПодключенияКомпоненты(Контекст.Изолированно)); + #КонецЕсли + КонецПроцедуры // Продолжение процедуры ПодключитьКомпоненту. @@ -234,9 +319,9 @@ КонецПроцедуры // Продолжение процедуры ПодключитьКомпоненту. -Процедура ПодключитьКомпонентуОповеститьОбОшибке(ОписаниеОшибки, Контекст) Экспорт +Процедура ПодключитьКомпонентуОповеститьОбОшибке(ОписаниеОшибки, Контекст, РегистрироватьОшибкуВЖурнале = Истина) Экспорт - Если Не ПустаяСтрока(ОписаниеОшибки) Тогда + Если Не ПустаяСтрока(ОписаниеОшибки) И РегистрироватьОшибкуВЖурнале Тогда ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( НСтр("ru = 'Подключение внешней компоненты на клиенте'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), "Ошибка", ОписаниеОшибки,, Истина); @@ -249,6 +334,32 @@ КонецПроцедуры +// Продолжение процедуры ПодключитьКомпоненту. +Функция РезультатПодключенияКомпоненты() Экспорт + + Результат = Новый Структура; + Результат.Вставить("Подключено", Ложь); + Результат.Вставить("ОписаниеОшибки", ""); + Результат.Вставить("ПодключаемыйМодуль", Неопределено); + + Возврат Результат; + +КонецФункции + +Функция ОшибкаПодключенияКомпоненты(ОписаниеОшибки, РегистрироватьОшибкуВЖурнале = Истина) Экспорт + + Если Не ПустаяСтрока(ОписаниеОшибки) И РегистрироватьОшибкуВЖурнале Тогда + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( + НСтр("ru = 'Подключение внешней компоненты на клиенте'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), + "Ошибка", ОписаниеОшибки,, Истина); + КонецЕсли; + + Результат = РезультатПодключенияКомпоненты(); + Результат.ОписаниеОшибки = ОписаниеОшибки; + Возврат Результат; + +КонецФункции + // Параметры: // Контекст - Структура: // * Оповещение - ОписаниеОповещения @@ -297,6 +408,74 @@ КонецПроцедуры +// Параметры: +// Контекст - см. КонтекстПодключенияКомпоненты. +// +Асинх Функция УстановитьКомпонентуАсинх(Контекст) Экспорт + + ПроверитьМестоположениеКомпоненты(Контекст.Идентификатор, Контекст.Местоположение); + + // Проверка факта подключения внешней компоненты в этом сеансе ранее. + СимволическоеИмя = ПолучитьСимволическоеИмяКомпонентыИзКэша(Контекст.Местоположение); + + Если СимволическоеИмя = Неопределено Тогда + + ТекстПояснения = ?(ПустаяСтрока(Контекст.ТекстПояснения), + НСтр("ru = 'Установить внешнюю компоненту?'"), Контекст.ТекстПояснения); + + СписокКнопок = Новый СписокЗначений; + СписокКнопок.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Установить и продолжить'")); + СписокКнопок.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Отмена'")); + + Ответ = Ждать ВопросАсинх(ТекстПояснения, СписокКнопок,, + КодВозвратаДиалога.Да, НСтр("ru = 'Установка внешней компоненты'")); + + Если Ответ = КодВозвратаДиалога.Да Тогда + Попытка + + Ждать УстановитьВнешнююКомпонентуАсинх(Контекст.Местоположение); + Результат = РезультатУстановкиКомпоненты(); + Результат.Установлено = Истина; + Возврат Результат; + + Исключение + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось установить внешнюю компоненту ""%1"" на клиенте + |%2 + |по причине: + |%3'"), + Контекст.Идентификатор, + Контекст.Местоположение, + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + Возврат ОшибкаУстановкиКомпоненты(ТекстОшибки); + + КонецПопытки; + Иначе + Возврат РезультатУстановкиКомпоненты(); + КонецЕсли; + Иначе + + // Если в кэше уже есть символическое имя - значит к этому сеансу ранее компонента уже подключалась, + // значит внешняя компонента уже установлена. + + Результат = РезультатУстановкиКомпоненты(); + Результат.Установлено = Истина; + Возврат Результат; + + КонецЕсли; + +КонецФункции + +Функция ОшибкаУстановкиКомпоненты(ОписаниеОшибки) Экспорт + + Результат = РезультатУстановкиКомпоненты(); + Результат.ОписаниеОшибки = ОписаниеОшибки; + Возврат Результат; + +КонецФункции + #КонецОбласти #Область ТабличныйДокумент @@ -373,6 +552,59 @@ #КонецОбласти +// Сокращает имя файла с расширением. +// Сокращение имени, производится, когда имя файла с расширением превышает размер 255 байт. +// Сокращение ими файла достигая за счет сокращения имени файла без расширения и +// добавления значения хеш функции сокращенной строки. +// +// Параметры: +// ИмяФайла - Строка - имя файла с расширением +// +Процедура СократитьИмяФайла(ИмяФайла) Экспорт + + ОграничениеВБайтах = 255; + Если РазмерСтрокиВБайтах(ИмяФайла) <= ОграничениеВБайтах Тогда + Возврат; + КонецЕсли; + + Файл = Новый Файл(ИмяФайла); + ИмяБезРасширения = Файл.ИмяБезРасширения; + + ОграничениеВБайтах = ОграничениеВБайтах - РазмерСтрокиВБайтах(Файл.Расширение); + + ДлинаСтроки = СтрДлина(ИмяБезРасширения); + ИспользуемоеКоличествоСимволов = ОграничениеВБайтах - 32; + БольшееКоличествоСимволов = Мин(ДлинаСтроки, ОграничениеВБайтах); + МеньшееКоличествоСимволов = Цел((ОграничениеВБайтах - 32)/4); + Уменьшить = Истина; + Пока Истина Цикл + Если Уменьшить Тогда + ИспользуемоеКоличествоСимволов = МеньшееКоличествоСимволов + Цел((ИспользуемоеКоличествоСимволов-МеньшееКоличествоСимволов)/2); + Иначе + ИспользуемоеКоличествоСимволов = ИспользуемоеКоличествоСимволов + Цел((БольшееКоличествоСимволов - ИспользуемоеКоличествоСимволов)/2); + КонецЕсли; + + РазмерСтрокиВБайтах = РазмерСтрокиВБайтах(ИмяБезРасширения)+32; + + Если РазмерСтрокиВБайтах = ОграничениеВБайтах Или БольшееКоличествоСимволов - МеньшееКоличествоСимволов = 1 Тогда + Прервать; + КонецЕсли; + + Если РазмерСтрокиВБайтах > ОграничениеВБайтах Тогда + Уменьшить = Истина; + БольшееКоличествоСимволов = ИспользуемоеКоличествоСимволов; + Иначе + Уменьшить = Ложь; + МеньшееКоличествоСимволов = ИспользуемоеКоличествоСимволов; + КонецЕсли; + + КонецЦикла; + + СокращеннаяСтрока = СократитьСтроку(ИмяБезРасширения, ИспользуемоеКоличествоСимволов); + ИмяФайла = СокращеннаяСтрока + Файл.Расширение; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -625,7 +857,7 @@ ПодключаемыйМодуль = НовыйОбъектКомпоненты(Контекст); Исключение // Текст ошибки уже скомпонован в НовыйОбъектКомпоненты, требуется только оповестить. - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); ПодключитьКомпонентуОповеститьОбОшибке(ТекстОшибки, Контекст); Возврат; КонецПопытки; @@ -638,7 +870,7 @@ Иначе - Если Контекст.ПредложитьУстановить Тогда + Если Контекст.ПредложитьУстановить И Не Контекст.БылаПопыткаУстановки Тогда ПодключитьКомпонентуНачатьУстановку(Контекст); Иначе ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -650,7 +882,7 @@ |Метод %4 вернул Ложь.'"), Контекст.Идентификатор, ВидПриложения(), Контекст.Местоположение, "НачатьПодключениеВнешнейКомпоненты"); - ПодключитьКомпонентуОповеститьОбОшибке(ТекстОшибки, Контекст); + ПодключитьКомпонентуОповеститьОбОшибке(ТекстОшибки, Контекст, Контекст.ПредложитьУстановить); КонецЕсли; КонецЕсли; @@ -694,7 +926,7 @@ Если Результат.Установлено Тогда // Одна попытка установки уже прошла, если компонента не подключится в этот раз, // то и предлагать ее установить еще раз не следует. - Контекст.ПредложитьУстановить = Ложь; + Контекст.БылаПопыткаУстановки = Истина; ПодключитьКомпоненту(Контекст); Иначе // Расшифровка ОписаниеОшибки не нужна, текст уже сформирован при установке. @@ -722,7 +954,7 @@ |%3'"), Контекст.Идентификатор, Контекст.Местоположение, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ПодключитьКомпонентуОповеститьОбОшибке(ТекстОшибки, Контекст); @@ -742,7 +974,7 @@ КонецЕсли; Исключение ПодключаемыйМодуль = Неопределено; - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Если ПодключаемыйМодуль = Неопределено Тогда @@ -770,7 +1002,7 @@ КонецЕсли; Исключение ПодключаемыйМодуль = Неопределено; - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Если ПодключаемыйМодуль = Неопределено Тогда @@ -799,18 +1031,6 @@ КонецФункции -// Продолжение процедуры ПодключитьКомпоненту. -Функция РезультатПодключенияКомпоненты() - - Результат = Новый Структура; - Результат.Вставить("Подключено", Ложь); - Результат.Вставить("ОписаниеОшибки", ""); - Результат.Вставить("ПодключаемыйМодуль", Неопределено); - - Возврат Результат; - -КонецФункции - // Продолжение процедуры УстановитьКомпоненту. Процедура УстановитьКомпонентуПослеОтветаНаВопросОбУстановке(Ответ, Контекст) Экспорт @@ -866,7 +1086,7 @@ |%3'"), Контекст.Идентификатор, Контекст.Местоположение, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Результат = РезультатУстановкиКомпоненты(); Результат.ОписаниеОшибки = ТекстОшибки; @@ -906,6 +1126,76 @@ КонецПроцедуры +Асинх Функция ПодключитьКомпонентуПослеПопыткиПодключенияАсинх(Подключено, Контекст) + + Если Подключено Тогда + + // Сохранение факта подключения внешней компоненты к этому сеансу. + + ИсходноеМестоположение = ?(ЗначениеЗаполнено(Контекст.ИсходноеМестоположение), + Контекст.ИсходноеМестоположение, Контекст.Местоположение); + + ЗаписатьСимволическоеИмяКомпонентыВКэш(ИсходноеМестоположение, Контекст.СимволическоеИмя); + + ПодключаемыйМодуль = Неопределено; + + Попытка + ПодключаемыйМодуль = НовыйОбъектКомпоненты(Контекст); + Исключение + // Текст ошибки уже скомпонован в НовыйОбъектКомпоненты, требуется только оповестить. + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Возврат ОшибкаПодключенияКомпоненты(ТекстОшибки); + КонецПопытки; + + Если Контекст.Кэшировать Тогда + ЗаписатьОбъектКомпонентыВКэш(ИсходноеМестоположение, ПодключаемыйМодуль) + КонецЕсли; + + Результат = РезультатПодключенияКомпоненты(); + Результат.Подключено = Истина; + Результат.ПодключаемыйМодуль = ПодключаемыйМодуль; + Возврат Результат; + + Иначе + + Если Контекст.ПредложитьУстановить И Не Контекст.БылаПопыткаУстановки Тогда + + КонтекстУстановки = Новый Структура; + КонтекстУстановки.Вставить("Местоположение", Контекст.Местоположение); + КонтекстУстановки.Вставить("ТекстПояснения", Контекст.ТекстПояснения); + КонтекстУстановки.Вставить("Идентификатор", Контекст.Идентификатор); + РезультатУстановки = Ждать УстановитьКомпонентуАсинх(КонтекстУстановки); + + Если РезультатУстановки.Установлено Тогда + // Одна попытка установки уже прошла, если компонента не подключится в этот раз, + // то и предлагать ее установить еще раз не следует. + Контекст.БылаПопыткаУстановки = Истина; + Возврат ПодключитьКомпонентуАсинх(Контекст); + Иначе + // Расшифровка ОписаниеОшибки не нужна, текст уже сформирован при установке. + // При отказе от установки пользователем ОписаниеОшибки - пустая строка. + + Возврат ОшибкаПодключенияКомпоненты(РезультатУстановки.ОписаниеОшибки); + КонецЕсли; + + Иначе + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось подключить внешнюю компоненту ""%1"". + |Возможно компонента не предназначена для клиентского приложения %2. + | + |Техническая информация: + |%3 + |Метод %4 вернул Ложь.'"), + Контекст.Идентификатор, ВидПриложения(), Контекст.Местоположение, "ПодключитьВнешнююКомпонентуАсинх"); + + Возврат ОшибкаПодключенияКомпоненты(ТекстОшибки, Контекст.ПредложитьУстановить); + + КонецЕсли; + + КонецЕсли; + +КонецФункции + Функция ЭтоМакет(Местоположение) Если СтрНайти(Местоположение, "/") > 0 Тогда @@ -928,7 +1218,7 @@ КонецЕсли; Для каждого ШагПути Из ШагиПути Цикл - Если Не ИмяСоответствуетТребованиямИменованияСвойств(ШагПути) Тогда + Если Не ОбщегоНазначенияКлиентСервер.ИмяСоответствуетТребованиямИменованияСвойств(ШагПути) Тогда Возврат Ложь; КонецЕсли; КонецЦикла; @@ -937,17 +1227,6 @@ КонецФункции -Функция ИмяСоответствуетТребованиямИменованияСвойств(Имя) - Буквы = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ"; - Цифры = "1234567890"; - - Если Имя = "" Или СтрНайти(Буквы + "_", ВРег(Лев(Имя, 1))) = 0 Тогда - Возврат Ложь; - КонецЕсли; - - Возврат СтрРазделить(ВРег(Имя), Буквы + Цифры + "_", Ложь).Количество() = 0; -КонецФункции - // Получает из кэша символическое имя внешней компоненты, если она была ранее подключена. Функция ПолучитьСимволическоеИмяКомпонентыИзКэша(КлючОбъекта) @@ -1057,7 +1336,7 @@ Иначе ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при регистрации компоненты comcntr. + НСтр("ru = 'Не удалось зарегистрировать компоненту comcntr. |Код ошибки regsvr32: %1'"), КодВозврата); @@ -1287,7 +1566,6 @@ #КонецОбласти - #Область ХешСтрокиПоАлгоритмуMD5 // АПК:1353-выкл, АПК:247-выкл Короткие имена математических операндов. @@ -1303,10 +1581,11 @@ // Возвращает хеш по алгоритму MD5 для произвольной строки. // // Параметры: -// Строка - Строка - произвольная строка любой длины +// Строка - строка - произвольная строка любой длины // // Возвращаемое значение: // Строка - хеш, вычисленный из строки +// Функция ВычислитьХешСтрокиПоАлгоритмуMD5(Знач Строка) a = 1732584193; // 01 23 45 67; (шестнадцатеричное представление, сначала младший байт) @@ -1521,7 +1800,6 @@ #КонецОбласти - #Область УстаревшиеПроцедурыИФункции // Устарела. Используется в ОбщегоНазначенияКлиент.ПроверитьРасширениеРаботыСФайламиПодключено. diff --git a/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиентСервер/Module.bsl index bb59c4197..cb08ad413 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиентСервер/Module.bsl @@ -212,6 +212,28 @@ КонецФункции +Функция ТипПодключенияКомпоненты(Изолированно) Экспорт + + Если Изолированно = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + #Если Не ВебКлиент И Не МобильныйКлиент Тогда + + Если Изолированно Тогда + Возврат ТипПодключенияВнешнейКомпоненты.Изолированно; + КонецЕсли; + + Возврат ТипПодключенияВнешнейКомпоненты.НеИзолированно; + + #Иначе + + Возврат Неопределено; + + #КонецЕсли + +КонецФункции + #КонецОбласти #КонецОбласти @@ -379,8 +401,8 @@ СтрокаСообщенияОбОшибке = НСтр("ru = 'Не удалось подключиться к другой программе: %1'"); Результат.ОшибкаПодключенияКомпоненты = Истина; - Результат.ПодробноеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ПодробноеПредставлениеОшибки(Информация)); - Результат.КраткоеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, КраткоеПредставлениеОшибки(Информация)); + Результат.ПодробноеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); + Результат.КраткоеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация)); Возврат Результат; КонецПопытки; @@ -452,8 +474,8 @@ СтрокаСообщенияОбОшибке = НСтр("ru = 'Не удалось подключиться к другой программе: %1'"); Результат.ОшибкаПодключенияКомпоненты = Истина; - Результат.ПодробноеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ПодробноеПредставлениеОшибки(Информация)); - Результат.КраткоеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, КраткоеПредставлениеОшибки(Информация)); + Результат.ПодробноеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); + Результат.КраткоеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация)); КонецПопытки; Возврат Результат; diff --git a/SSL/src/CommonModules/ОтправкаSMS/Module.bsl b/SSL/src/CommonModules/ОтправкаSMS/Module.bsl index 898bc66a4..af0e7ffb2 100644 --- a/SSL/src/CommonModules/ОтправкаSMS/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMS/Module.bsl @@ -181,7 +181,9 @@ // Булево - Истина, если отправка SMS настроена и у текущего пользователя достаточно прав для отправки SMS. // Функция ДоступнаОтправкаSMS() Экспорт - Возврат ПравоДоступа("Просмотр", Метаданные.ОбщиеФормы.ОтправкаSMS) И НастройкаОтправкиSMSВыполнена() Или Пользователи.ЭтоПолноправныйПользователь(); + + Возврат ОтправкаSMSПовтИсп.ДоступнаОтправкаSMS(); + КонецФункции #КонецОбласти diff --git a/SSL/src/CommonModules/ОтправкаSMSКлиент/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSКлиент/Module.bsl index c59c1195a..b1d0aa572 100644 --- a/SSL/src/CommonModules/ОтправкаSMSКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSКлиент/Module.bsl @@ -43,6 +43,17 @@ КонецПроцедуры +// Открывает форму настроек отправки SMS. +// +// Параметры: +// ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - процедура, которую нужно выполнить после закрытия формы настроек. +// +Процедура ОткрытьФормуНастроек(ОписаниеОповещенияОЗакрытии = Неопределено) Экспорт + + ОткрытьФорму("ОбщаяФорма.НастройкаОтправкиSMS", , , , , , ОписаниеОповещенияОЗакрытии); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -61,7 +72,7 @@ Иначе Если ПараметрыРаботыКлиента.ЭтоПолноправныйПользователь Тогда ОписаниеОповещения = Новый ОписаниеОповещения("ПослеНастройкиSMS", ЭтотОбъект, ОбработчикРезультата); - ОткрытьФорму("ОбщаяФорма.НастройкаОтправкиSMS",,,,,, ОписаниеОповещения); + ОткрытьФормуНастроек(ОписаниеОповещения); Иначе ТекстСообщения = НСтр("ru = 'Для отправки SMS требуется произвести настройку параметров подключения |Обратитесь к администратору.'"); @@ -119,4 +130,18 @@ КонецФункции + + + + + + + + + + + + + + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОтправкаSMSПовтИсп/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSПовтИсп/Module.bsl index 861b9309a..d9cc3fd37 100644 --- a/SSL/src/CommonModules/ОтправкаSMSПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSПовтИсп/Module.bsl @@ -35,4 +35,11 @@ КонецФункции +Функция ДоступнаОтправкаSMS() Экспорт + + Возврат ПравоДоступа("Просмотр", Метаданные.ОбщиеФормы.ОтправкаSMS) И ОтправкаSMS.НастройкаОтправкиSMSВыполнена() + Или Пользователи.ЭтоПолноправныйПользователь(); + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезSMS4B/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезSMS4B/Module.bsl index 552fb8b5c..a59541665 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезSMS4B/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезSMS4B/Module.bsl @@ -182,7 +182,7 @@ HTTPОтвет = Соединение.ОтправитьДляОбработки(HTTPЗапрос); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Отправка SMS'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Результат = ""; diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезSMSRU/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезSMSRU/Module.bsl index 696b54f08..aa56ca718 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезSMSRU/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезSMSRU/Module.bsl @@ -190,7 +190,7 @@ HTTPОтвет = Соединение.ОтправитьДляОбработки(HTTPЗапрос); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Отправка SMS'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Если HTTPОтвет <> Неопределено Тогда diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезSMSЦЕНТР/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезSMSЦЕНТР/Module.bsl index 10cb129e9..0cdd452b1 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезSMSЦЕНТР/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезSMSЦЕНТР/Module.bsl @@ -191,7 +191,7 @@ HTTPОтвет = Соединение.ОтправитьДляОбработки(HTTPЗапрос); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Отправка SMS'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат Неопределено; КонецПопытки; diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезБилайн/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезБилайн/Module.bsl index 81a3d5452..d6f521e4a 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезБилайн/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезБилайн/Module.bsl @@ -200,7 +200,7 @@ HTTPОтвет = Соединение.ОтправитьДляОбработки(HTTPЗапрос); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Отправка SMS'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Если HTTPОтвет <> Неопределено Тогда diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезМТС/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезМТС/Module.bsl index f0bea7b4a..f911c6ff1 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезМТС/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезМТС/Module.bsl @@ -209,7 +209,7 @@ HTTPОтвет = Соединение.ОтправитьДляОбработки(HTTPЗапрос); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Отправка SMS'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Если HTTPОтвет <> Неопределено Тогда diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезСМСУслуги/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезСМСУслуги/Module.bsl index f07cc6aa0..609377437 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезСМСУслуги/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезСМСУслуги/Module.bsl @@ -186,7 +186,7 @@ HTTPОтвет = Соединение.ОтправитьДляОбработки(HTTPЗапрос); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Отправка SMS'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Если HTTPОтвет <> Неопределено Тогда diff --git a/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl b/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl index 265002f4e..b879b9dd0 100644 --- a/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl @@ -39,11 +39,15 @@ Если ТипЗначения = Неопределено Тогда ТипЗначения = ОписаниеЭлементаНастройки.ТипЗначения; КонецЕсли; - + + Если ТипЗначения = Новый ОписаниеТипов("Дата") Тогда + ТипЗначения = Новый ОписаниеТипов("СтандартнаяДатаНачала"); + КонецЕсли; + СвязьПоТипу = ОписаниеЭлементаНастройки.СвязьПоТипу; СвязанныйЭлементНастройки = ЭлементНастройкиПоПолю(Настройки, ПользовательскиеНастройки, СвязьПоТипу.Поле); - Если СвязанныйЭлементНастройки = Неопределено Тогда + Если СвязанныйЭлементНастройки = Неопределено Тогда Возврат ТипЗначения; КонецЕсли; diff --git a/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl index fc93ac957..69d4db95b 100644 --- a/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl @@ -435,6 +435,15 @@ #Область СлужебныйПрограммныйИнтерфейс +// Возвращаемое значение: +// Строка +// +Функция ПрефиксИмениКомандыСПредварительнымСохранениемВариантаОтчета() Экспорт + + Возврат "СохранитьВариант" + "_"; + +КонецФункции + // Находит параметр в настройках компоновки по его имени. // Если пользовательская настройка не существует (например, если параметр не выведен в пользовательские настройки), // то ищет значение параметра в настройках варианта. diff --git a/SSL/src/CommonModules/ОтчетыСервер/Module.bsl b/SSL/src/CommonModules/ОтчетыСервер/Module.bsl index cd23b7765..f860360b1 100644 --- a/SSL/src/CommonModules/ОтчетыСервер/Module.bsl +++ b/SSL/src/CommonModules/ОтчетыСервер/Module.bsl @@ -105,7 +105,7 @@ ОбъектМетаданных = ВариантОтчета.Метаданные(); КонецЕсли; - Комментарий = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Комментарий = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации( ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, ОбъектМетаданных, ВариантОтчета, Комментарий); @@ -217,7 +217,7 @@ Кнопка = ФормаОтчета.Элементы.Вставить(Команда.Имя + "Еще", Тип("КнопкаФормы"), ГруппаЕще); Кнопка.ИмяКоманды = Команда.Имя; - Кнопка.ТолькоВоВсехДействиях = Истина; + Кнопка.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; КонецЦикла; КонецПроцедуры @@ -713,6 +713,7 @@ // Автоматическое заполнение. Если СвойстваНастройки.ЗапросЗначенийВыбора.Текст <> "" Тогда + // @skip-check query-in-loop - запрос к разным таблицам. ДобавляемыеЗначения = СвойстваНастройки.ЗапросЗначенийВыбора.Выполнить().Выгрузить().ВыгрузитьКолонку(0); Для Каждого Элемент Из ДобавляемыеЗначения Цикл ОтчетыКлиентСервер.ДобавитьУникальноеЗначениеВСписок( @@ -731,8 +732,8 @@ Функция ЭтоТехническийОбъект(Знач ПолноеИмяОбъекта) Экспорт - Возврат ПолноеИмяОбъекта = ВРег("Справочник.ПредопределенныеВариантыОтчетовРасширений") - Или ПолноеИмяОбъекта = ВРег("Справочник.ПредопределенныеВариантыОтчетов"); + Возврат ПолноеИмяОбъекта = ВРег(Метаданные.Справочники.ПредопределенныеВариантыОтчетовРасширений.ПолноеИмя()) + Или ПолноеИмяОбъекта = ВРег(Метаданные.Справочники.ПредопределенныеВариантыОтчетов.ПолноеИмя()); КонецФункции @@ -1032,7 +1033,7 @@ Возврат Ложь; КонецЕсли; - СвойстваОтбора = ВариантыОтчетовСлужебныйКлиентСервер.СвойстваОтбораОбработчикаРасшифровкиПоДетальнымЗаписям(); + СвойстваОтбора = ВариантыОтчетовСлужебный.СвойстваОтбораОбработчикаРасшифровкиПоДетальнымЗаписям(); Если Отбор.Количество() <> СвойстваОтбора.Количество() Тогда Возврат Ложь; @@ -2924,7 +2925,7 @@ Команда.Заголовок = НСтр("ru = 'Выбрать период...'"); Команда.Подсказка = Команда.Заголовок; Команда.Отображение = ОтображениеКнопки.Картинка; - Команда.Картинка = КартинкаКнопкиВыбораПериода(); + Команда.Картинка = БиблиотекаКартинок.ПолеВводаВыбрать; ИмяГруппыКнопки = СтрЗаменить(ИмяЭлемента, "ВыбратьПериод", "ГруппаВыбратьПериод"); ГруппаКнопки = ГруппаЭлементовФормыНастроек(Форма, Группа, ИмяГруппыКнопки); @@ -2954,7 +2955,7 @@ Если ЭтоСтандартноеПредставление Тогда Кнопка.Ширина = 3; Кнопка.Отображение = ОтображениеКнопки.Картинка; - Кнопка.Картинка = КартинкаКнопкиВыбораПериода(); + Кнопка.Картинка = БиблиотекаКартинок.ПолеВводаВыбрать; Кнопка.ОтображениеФигуры = ОтображениеФигурыКнопки.Авто; Иначе ЭлементПериода.Ширина = 15; @@ -2964,18 +2965,6 @@ КонецЕсли; КонецПроцедуры -Функция КартинкаКнопкиВыбораПериода() - - ВерсияРежимаСовместимости = СтандартныеПодсистемыСервер.ВерсияРежимаСовместимости(); - - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияРежимаСовместимости, "8.3.17.0") >= 0 Тогда - Возврат БиблиотекаКартинок["ПолеВводаВыбрать"]; - КонецЕсли; - - Возврат БиблиотекаКартинок["Выбрать"]; - -КонецФункции - // Устанавливает значения свойствам стандартного периода: ДатаНачала, ДатаОкончания // // Параметры: diff --git a/SSL/src/CommonModules/ОценкаПроизводительности/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительности/Module.bsl index db318396c..cf2556f97 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительности/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительности/Module.bsl @@ -97,23 +97,44 @@ // КлючевыеОперации - Массив - ключевые операции, элемент массива - Структура("ИмяКлючевойОперации, ЦелевоеВремя"). // Процедура СоздатьКлючевыеОперации(КлючевыеОперации) Экспорт - Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 - | КлючевыеОперации.Ссылка КАК Ссылка - |ИЗ - | Справочник.КлючевыеОперации КАК КлючевыеОперации - |ГДЕ - | КлючевыеОперации.Имя = &Имя - |УПОРЯДОЧИТЬ ПО - | Ссылка"; - + Таблица = Новый ТаблицаЗначений; + Таблица.Колонки.Добавить("ИмяКлючевойОперации", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(1000))); + Таблица.Колонки.Добавить("ЦелевоеВремя", Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,2))); + Для Каждого КлючеваяОперация Из КлючевыеОперации Цикл - Запрос.УстановитьПараметр("Имя", КлючеваяОперация.ИмяКлючевойОперации); - РезультатЗапроса = Запрос.Выполнить(); - Если РезультатЗапроса.Пустой() Тогда - СоздатьКлючевуюОперацию(КлючеваяОперация.ИмяКлючевойОперации, КлючеваяОперация.ЦелевоеВремя); - КонецЕсли; + ЗаполнитьЗначенияСвойств(Таблица.Добавить(), КлючеваяОперация); КонецЦикла; + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | Таблица.ИмяКлючевойОперации КАК ИмяКлючевойОперации, + | Таблица.ЦелевоеВремя КАК ЦелевоеВремя + |ПОМЕСТИТЬ Таблица + |ИЗ + | &Таблица КАК Таблица + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ЕСТЬNULL(КлючевыеОперации.Ссылка, ЗНАЧЕНИЕ(Справочник.КлючевыеОперации.ПустаяСсылка)) КАК Ссылка, + | Таблица.ИмяКлючевойОперации КАК ИмяКлючевойОперации, + | Таблица.ЦелевоеВремя КАК ЦелевоеВремя + |ИЗ + | Таблица КАК Таблица + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КлючевыеОперации КАК КлючевыеОперации + | ПО Таблица.ИмяКлючевойОперации = КлючевыеОперации.Имя"; + Запрос.УстановитьПараметр("Таблица", Таблица); + РезультатЗапроса = Запрос.Выполнить(); + Если РезультатЗапроса.Пустой() Тогда + Возврат; + КонецЕсли; + Выборка = РезультатЗапроса.Выбрать(); + + Пока Выборка.Следующий() Цикл + Если Выборка.Ссылка.Пустая() Тогда + СоздатьКлючевуюОперацию(Выборка.ИмяКлючевойОперации, Выборка.ЦелевоеВремя); // @skip-check query-in-loop - создание ключевой операции в случае отсутствия. + КонецЕсли; + КонецЦикла; КонецПроцедуры // Устанавливает ключевой операции новое целевое время. @@ -123,40 +144,55 @@ // Процедура УстановитьЦелевоеВремя (КлючевыеОперации) Экспорт + Таблица = Новый ТаблицаЗначений; + Таблица.Колонки.Добавить("ИмяКлючевойОперации", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(1000))); + Таблица.Колонки.Добавить("ЦелевоеВремя", Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,2))); + + Для Каждого КлючеваяОперация Из КлючевыеОперации Цикл + ЗаполнитьЗначенияСвойств(Таблица.Добавить(), КлючеваяОперация); + КонецЦикла; + Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 - | КлючевыеОперации.Ссылка КАК Ссылка - |ИЗ - | Справочник.КлючевыеОперации КАК КлючевыеОперации - |ГДЕ - | КлючевыеОперации.Имя = &Имя - |УПОРЯДОЧИТЬ ПО - | Ссылка"; - + Запрос.Текст = "ВЫБРАТЬ + | Таблица.ИмяКлючевойОперации КАК ИмяКлючевойОперации, + | Таблица.ЦелевоеВремя КАК ЦелевоеВремя + |ПОМЕСТИТЬ Таблица + |ИЗ + | &Таблица КАК Таблица + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | КлючевыеОперации.Ссылка КАК Ссылка, + | Таблица.ЦелевоеВремя КАК ЦелевоеВремя + |ИЗ + | Справочник.КлючевыеОперации КАК КлючевыеОперации + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица КАК Таблица + | ПО КлючевыеОперации.Имя = Таблица.ИмяКлючевойОперации + | + |УПОРЯДОЧИТЬ ПО + | Ссылка"; + Запрос.УстановитьПараметр("Таблица", Таблица); + РезультатЗапроса = Запрос.Выполнить(); + Если РезультатЗапроса.Пустой() Тогда + Возврат; + КонецЕсли; + Выборка = РезультатЗапроса.Выбрать(); + НачатьТранзакцию(); - Попытка - + Попытка Блокировка = Новый БлокировкаДанных; Для Каждого КлючеваяОперация Из КлючевыеОперации Цикл ЭлементБлокировки = Блокировка.Добавить("Справочник.КлючевыеОперации"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Имя", КлючеваяОперация.ИмяКлючевойОперации); КонецЦикла; - Блокировка.Заблокировать(); - - Для Каждого КлючеваяОперация Из КлючевыеОперации Цикл - Запрос.УстановитьПараметр("Имя", КлючеваяОперация.ИмяКлючевойОперации); - РезультатЗапроса = Запрос.Выполнить(); - Если НЕ РезультатЗапроса.Пустой() Тогда - Выборка = РезультатЗапроса.Выбрать(); - Выборка.Следующий(); - КлючеваяОперацияСсылка = Выборка.Ссылка; - КлючеваяОперацияОбъект = КлючеваяОперацияСсылка.ПолучитьОбъект(); // СправочникОбъект.КлючевыеОперации - КлючеваяОперацияОбъект.ЦелевоеВремя = КлючеваяОперация.ЦелевоеВремя; - - КлючеваяОперацияОбъект.Записать(); - КонецЕсли; - КонецЦикла; + Блокировка.Заблокировать(); + Пока Выборка.Следующий() Цикл + КлючеваяОперацияОбъект = Выборка.Ссылка.ПолучитьОбъект(); // СправочникОбъект.КлючевыеОперации + КлючеваяОперацияОбъект.ЦелевоеВремя = Выборка.ЦелевоеВремя; + КлючеваяОперацияОбъект.Записать(); + КонецЦикла; ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); @@ -176,16 +212,48 @@ // Процедура ИзменитьКлючевыеОперации(КлючевыеОперации) Экспорт + Таблица = Новый ТаблицаЗначений; + Таблица.Колонки.Добавить("ИмяКлючевойОперацииСтарое", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(1000))); + Таблица.Колонки.Добавить("ИмяКлючевойОперацииНовое", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(1000))); + Таблица.Колонки.Добавить("ЦелевоеВремя", Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,2))); + + Для Каждого КлючеваяОперация Из КлючевыеОперации Цикл + ЗаполнитьЗначенияСвойств(Таблица.Добавить(), КлючеваяОперация); + КонецЦикла; + Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 - | КлючевыеОперации.Ссылка КАК Ссылка - |ИЗ - | Справочник.КлючевыеОперации КАК КлючевыеОперации - |ГДЕ - | КлючевыеОперации.Имя = &Имя - |УПОРЯДОЧИТЬ ПО - | Ссылка"; - + Запрос.Текст = "ВЫБРАТЬ + | Таблица.ИмяКлючевойОперацииСтарое КАК ИмяКлючевойОперацииСтарое, + | Таблица.ИмяКлючевойОперацииНовое КАК ИмяКлючевойОперацииНовое, + | Таблица.ЦелевоеВремя КАК ЦелевоеВремя + |ПОМЕСТИТЬ Таблица + |ИЗ + | &Таблица КАК Таблица + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | КлючевыеОперации.Ссылка КАК Ссылка, + | Таблица.ИмяКлючевойОперацииНовое КАК ИмяКлючевойОперацииНовое, + | ВЫБОР + | КОГДА Таблица.ЦелевоеВремя = 0 + | ТОГДА КлючевыеОперации.ЦелевоеВремя + | ИНАЧЕ Таблица.ЦелевоеВремя + | КОНЕЦ КАК ЦелевоеВремя + |ИЗ + | Справочник.КлючевыеОперации КАК КлючевыеОперации + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица КАК Таблица + | ПО КлючевыеОперации.Имя = Таблица.ИмяКлючевойОперацииСтарое + | + |УПОРЯДОЧИТЬ ПО + | Ссылка"; + Запрос.УстановитьПараметр("Таблица", Таблица); + РезультатЗапроса = Запрос.Выполнить(); + Если РезультатЗапроса.Пустой() Тогда + Возврат; + КонецЕсли; + Выборка = РезультатЗапроса.Выбрать(); + НачатьТранзакцию(); Попытка @@ -200,22 +268,12 @@ КонецЦикла; Блокировка.Заблокировать(); - Для Каждого КлючеваяОперация Из КлючевыеОперации Цикл - Запрос.УстановитьПараметр("Имя", КлючеваяОперация.ИмяКлючевойОперацииСтарое); - РезультатЗапроса = Запрос.Выполнить(); - Если НЕ РезультатЗапроса.Пустой() Тогда - Выборка = РезультатЗапроса.Выбрать(); - Выборка.Следующий(); - КлючеваяОперацияСсылка = Выборка.Ссылка; - КлючеваяОперацияОбъект = КлючеваяОперацияСсылка.ПолучитьОбъект(); // СправочникОбъект.КлючевыеОперации - КлючеваяОперацияОбъект.Имя = КлючеваяОперация.ИмяКлючевойОперацииНовое; - КлючеваяОперацияОбъект.Наименование = РазложитьСтрокуПоСловам(КлючеваяОперация.ИмяКлючевойОперацииНовое); - Если КлючеваяОперация.Свойство("ЦелевоеВремя") Тогда - КлючеваяОперацияОбъект.ЦелевоеВремя = КлючеваяОперация.ЦелевоеВремя; - КонецЕсли; - - КлючеваяОперацияОбъект.Записать(); - КонецЕсли; + Пока Выборка.Следующий() Цикл + КлючеваяОперацияОбъект = Выборка.Ссылка.ПолучитьОбъект(); // СправочникОбъект.КлючевыеОперации + КлючеваяОперацияОбъект.Имя = Выборка.ИмяКлючевойОперацииНовое; + КлючеваяОперацияОбъект.Наименование = РазложитьСтрокуПоСловам(Выборка.ИмяКлючевойОперацииНовое); + КлючеваяОперацияОбъект.ЦелевоеВремя = Выборка.ЦелевоеВремя; + КлючеваяОперацияОбъект.Записать(); КонецЦикла; ЗафиксироватьТранзакцию(); Исключение @@ -425,7 +483,7 @@ Для Каждого КлючеваяОперация Из КлючевыеОперации Цикл Запрос.УстановитьПараметр("Имя", КлючеваяОперация.ИмяКлючевойОперации); - РезультатЗапроса = Запрос.Выполнить(); + РезультатЗапроса = Запрос.Выполнить(); // @skip-check query-in-loop - Устаревший код не подлежит исправлению. Если НЕ РезультатЗапроса.Пустой() Тогда Выборка = РезультатЗапроса.Выбрать(); Выборка.Следующий(); @@ -766,7 +824,7 @@ Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Оценка производительности.Ошибка сохранения замеров'", ОценкаПроизводительностиСлужебный.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,,ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,,ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; @@ -896,7 +954,7 @@ Если ЕстьУдаление Тогда ЕстьУдаление = Ложь; - Результат = ЗапросЗамерыВремени.Выполнить(); + Результат = ЗапросЗамерыВремени.Выполнить(); // @skip-check query-in-loop - порционная обработка данных. Выборка = Результат.Выбрать(); Выборка.Следующий(); ДатаЗаписиНачалоЧаса = Выборка.ДатаЗаписиНачалоЧаса; @@ -910,7 +968,7 @@ Если ЕстьУдалениеТехнологические Тогда ЕстьУдалениеТехнологические = Ложь; - Результат = ЗапросЗамерыВремениТехнологические.Выполнить(); + Результат = ЗапросЗамерыВремениТехнологические.Выполнить(); // @skip-check query-in-loop - порционная обработка данных. Выборка = Результат.Выбрать(); Выборка.Следующий(); ДатаЗаписиНачалоЧаса = Выборка.ДатаЗаписиНачалоЧаса; @@ -1223,7 +1281,7 @@ Исключение УдалитьФайлы(ФайлХранилища); УдалитьФайлы(КаталогФайлов); - ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ШаблонСтроки = НСтр("ru = 'Не удалось распаковать архив %1 %2'"); ОписаниеИсключения = ОценкаПроизводительностиКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСтроки, ИмяФайла, ОписаниеОшибки); ВызватьИсключение ОписаниеИсключения; @@ -1239,7 +1297,7 @@ ЧтениеXML.ОткрытьФайл(Файл.ПолноеИмя); ЧтениеXML.ПерейтиКСодержимому(); - ЗагрузитьФайлОценкиПроизводительностиApdexExport(ЧтениеXML, СуществующиеКлючевыеОперации, КлючевыеОперацииДляЗаписи, СырыеЗамерыДляЗаписи); + ЗагрузитьФайлОценкиПроизводительностиApdexExport(ЧтениеXML, СуществующиеКлючевыеОперации, КлючевыеОперацииДляЗаписи, СырыеЗамерыДляЗаписи); // @skip-check query-in-loop - порционная обработка данных. ЧтениеXML.Закрыть(); КонецЦикла; УдалитьФайлы(ФайлХранилища); @@ -1293,7 +1351,7 @@ КлючеваяОперацияСсылка = СуществующиеКлючевыеОперации[КлючеваяОперацияИмя]; Если КлючеваяОперацияСсылка = Неопределено Тогда - КлючеваяОперацияСсылка = СоздатьКлючевуюОперацию(КлючеваяОперацияИмя, ЦелевоеВремя, Длительная); + КлючеваяОперацияСсылка = СоздатьКлючевуюОперацию(КлючеваяОперацияИмя, ЦелевоеВремя, Длительная); // @skip-check query-in-loop - создание операции в случае отсутствия. СуществующиеКлючевыеОперации.Вставить(КлючеваяОперацияИмя, КлючеваяОперацияСсылка); КонецЕсли; diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервера/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервера/Module.bsl index 59c96dabc..4b65a834e 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервера/Module.bsl @@ -8,11 +8,11 @@ #Область СлужебныеПроцедурыИФункции -// Функция записи массива замеров -// // Параметры: -// Замеры - Структура: -// * ЗамерыЗавершенные - Массив из Структура +// ЗамерыДляЗаписи - Структура: +// * ЗамерыЗавершенные - Соответствие из КлючЗначение: +// ** Ключ - УникальныйИдентификатор - уникальный идентификатор замера. +// ** Значение - Соответствие. // * ИнформацияПрограммыПросмотра - Строка // // Возвращаемое значение: @@ -170,7 +170,7 @@ Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Оценка производительности.Ошибка сохранения замеров'", ОценкаПроизводительностиСлужебный.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,,ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,,ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; @@ -180,9 +180,9 @@ Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Не удалось сохранить технологические замеры производительности'", ОценкаПроизводительностиСлужебный.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,,ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,,ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; - КонецЕсли; + КонецЕсли; Возврат ПериодЗаписи; diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl index 012733b0d..06332a662 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl @@ -36,20 +36,16 @@ // Функция ЗамерВремени(КлючеваяОперация = Неопределено, ФиксироватьСОшибкой = Ложь, АвтоЗавершение = Истина) Экспорт - УИДЗамера = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); - - Если ВыполнятьЗамерыПроизводительности() Тогда - УИДЗамера = Новый УникальныйИдентификатор(); - Параметры = Новый Структура; - Параметры.Вставить("КлючеваяОперация", КлючеваяОперация); - Параметры.Вставить("УИДЗамера", УИДЗамера); - Параметры.Вставить("АвтоЗавершение", АвтоЗавершение); - Параметры.Вставить("ВыполненаСОшибкой", ФиксироватьСОшибкой); - - НачатьЗамерВремениНаКлиентеСлужебный(Параметры); + Если Не ВыполнятьЗамерыПроизводительности() Тогда + Возврат Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); КонецЕсли; - - Возврат УИДЗамера; + + Параметры = ПараметрыЗамераВремениНаКлиенте(КлючеваяОперация); + Параметры.АвтоЗавершение = АвтоЗавершение; + Параметры.ВыполненаСОшибкой = ФиксироватьСОшибкой; + + НачатьЗамерВремениНаКлиентеСлужебный(Параметры); + Возврат Параметры.УИДЗамера; КонецФункции @@ -71,21 +67,17 @@ // Функция НачатьЗамерВремениТехнологический(АвтоЗавершение = Истина, КлючеваяОперация = Неопределено) Экспорт - УИДЗамера = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); - - Если ВыполнятьЗамерыПроизводительности() Тогда - УИДЗамера = Новый УникальныйИдентификатор(); - Параметры = Новый Структура; - Параметры.Вставить("КлючеваяОперация", КлючеваяОперация); - Параметры.Вставить("УИДЗамера", УИДЗамера); - Параметры.Вставить("АвтоЗавершение", АвтоЗавершение); - Параметры.Вставить("Технологический", Истина); - Параметры.Вставить("ВыполненаСОшибкой", Ложь); - - НачатьЗамерВремениНаКлиентеСлужебный(Параметры); + Если Не ВыполнятьЗамерыПроизводительности() Тогда + Возврат Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); КонецЕсли; + + Параметры = ПараметрыЗамераВремениНаКлиенте(КлючеваяОперация); + Параметры.АвтоЗавершение = АвтоЗавершение; + Параметры.Технологический = Истина; + Параметры.ВыполненаСОшибкой = Ложь; - Возврат УИДЗамера; + НачатьЗамерВремениНаКлиентеСлужебный(Параметры); + Возврат Параметры.УИДЗамера; КонецФункции @@ -98,23 +90,26 @@ // Процедура ЗавершитьЗамерВремени(УИДЗамера, ВыполненСОшибкой = Ложь) Экспорт - Если ВыполнятьЗамерыПроизводительности() Тогда - ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах(); - ЗавершитьЗамерВремениСлужебный(УИДЗамера, ВремяОкончания); - - ОценкаПроизводительностиЗамерВремени = ПараметрыПриложения["СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"]; - Если ОценкаПроизводительностиЗамерВремени <> Неопределено Тогда - Замеры = ОценкаПроизводительностиЗамерВремени["Замеры"]; - Замер = Замеры[УИДЗамера]; - Если Замер <> Неопределено Тогда - Замер["ВыполненаСОшибкой"] = ВыполненСОшибкой; - ЗамерыЗавершенные = ПараметрыПриложения["СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"]["ЗамерыЗавершенные"]; - ЗамерыЗавершенные.Вставить(УИДЗамера, Замер); - Замеры.Удалить(УИДЗамера); - КонецЕсли; - КонецЕсли; - + Если Не ВыполнятьЗамерыПроизводительности() Тогда + Возврат; КонецЕсли; + + ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах(); + ЗавершитьЗамерВремениСлужебный(УИДЗамера, ВремяОкончания); + + ЗамерыВремени = ОценкаПроизводительностиЗамерВремени(); + Если ЗамерыВремени = Неопределено Тогда + Возврат; + КонецЕсли; + + Замер = ЗамерыВремени.Замеры[УИДЗамера]; + Если Замер = Неопределено Тогда + Возврат; + КонецЕсли; + + Замер["ВыполненаСОшибкой"] = ВыполненСОшибкой; + ЗамерыВремени.ЗамерыЗавершенные.Вставить(УИДЗамера, Замер); + ЗамерыВремени.Замеры.Удалить(УИДЗамера); КонецПроцедуры @@ -123,22 +118,23 @@ // Параметры: // УИДЗамера - УникальныйИдентификатор - уникальный идентификатор замера. // ПараметрыЗамера - Структура: -// * КлючеваяОперация - Строка - имя ключевой операции. -// * ВесЗамера - Число - количественный показатель сложности замера +// * КлючеваяОперация - Строка - имя ключевой операции. +// * ВесЗамера - Число - количественный показатель сложности замера. // * Комментарий - Строка -// - Соответствие - дополнительная произвольной информации замера. -// * ВыполненаСОшибкой - Булево - признак выполнения замера с ошибкой, -// см. процедуру УстановитьПризнакОшибкиЗамера. +// - Соответствие - дополнительная произвольной информации замера. +// * ВыполненаСОшибкой - Булево - признак выполнения замера с ошибкой, +// см. процедуру УстановитьПризнакОшибкиЗамера. // Процедура УстановитьПараметрыЗамера(УИДЗамера, ПараметрыЗамера) Экспорт - Если ВыполнятьЗамерыПроизводительности() Тогда - ИмяПараметра = "СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"; - Замеры = ПараметрыПриложения[ИмяПараметра]["Замеры"]; - Для Каждого Параметр Из ПараметрыЗамера Цикл - Замеры[УИДЗамера][Параметр.Ключ] = Параметр.Значение; - КонецЦикла; + Если Не ВыполнятьЗамерыПроизводительности() Тогда + Возврат; КонецЕсли; + + Замеры = ОценкаПроизводительностиЗамерВремени().Замеры; + Для Каждого Параметр Из ПараметрыЗамера Цикл + Замеры[УИДЗамера][Параметр.Ключ] = Параметр.Значение; + КонецЦикла; КонецПроцедуры @@ -170,11 +166,11 @@ // Процедура УстановитьКлючевуюОперациюЗамера(УИДЗамера, КлючеваяОперация) Экспорт - Если ВыполнятьЗамерыПроизводительности() Тогда - ИмяПараметра = "СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"; - Замеры = ПараметрыПриложения[ИмяПараметра]["Замеры"]; - Замеры[УИДЗамера]["КлючеваяОперация"] = КлючеваяОперация; + Если Не ВыполнятьЗамерыПроизводительности() Тогда + Возврат; КонецЕсли; + + ОценкаПроизводительностиЗамерВремени().Замеры[УИДЗамера]["КлючеваяОперация"] = КлючеваяОперация; КонецПроцедуры @@ -187,11 +183,10 @@ // Процедура УстановитьВесЗамера(УИДЗамера, ВесЗамера) Экспорт - Если ВыполнятьЗамерыПроизводительности() Тогда - ИмяПараметра = "СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"; - Замеры = ПараметрыПриложения[ИмяПараметра]["Замеры"]; - Замеры[УИДЗамера]["ВесЗамера"] = ВесЗамера; + Если Не ВыполнятьЗамерыПроизводительности() Тогда + Возврат; КонецЕсли; + ОценкаПроизводительностиЗамерВремени().Замеры[УИДЗамера]["ВесЗамера"] = ВесЗамера; КонецПроцедуры @@ -209,11 +204,10 @@ // Процедура УстановитьКомментарийЗамера(УИДЗамера, Комментарий) Экспорт - Если ВыполнятьЗамерыПроизводительности() Тогда - ИмяПараметра = "СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"; - Замеры = ПараметрыПриложения[ИмяПараметра]["Замеры"]; - Замеры[УИДЗамера]["Комментарий"] = Комментарий; + Если Не ВыполнятьЗамерыПроизводительности() Тогда + Возврат; КонецЕсли; + ОценкаПроизводительностиЗамерВремени().Замеры[УИДЗамера]["Комментарий"] = Комментарий; КонецПроцедуры @@ -226,11 +220,10 @@ // Процедура УстановитьПризнакОшибкиЗамера(УИДЗамера, Признак) Экспорт - Если ВыполнятьЗамерыПроизводительности() Тогда - ИмяПараметра = "СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"; - Замеры = ПараметрыПриложения[ИмяПараметра]["Замеры"]; - Замеры[УИДЗамера]["ВыполненаСОшибкой"] = Признак; + Если Не ВыполнятьЗамерыПроизводительности() Тогда + Возврат; КонецЕсли; + ОценкаПроизводительностиЗамерВремени().Замеры[УИДЗамера]["ВыполненаСОшибкой"] = Признак; КонецПроцедуры @@ -268,33 +261,26 @@ // Функция НачатьЗамерДлительнойОперации(КлючеваяОперация, ФиксироватьСОшибкой = Ложь, АвтоЗавершение = Ложь, ИмяПоследнегоШага = "ПоследнийШаг") Экспорт - УИДЗамера = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); - Замер = Новый Соответствие; - - Если ВыполнятьЗамерыПроизводительности() Тогда - УИДЗамера = Новый УникальныйИдентификатор(); - Параметры = Новый Структура; - Параметры.Вставить("КлючеваяОперация", КлючеваяОперация); - Параметры.Вставить("УИДЗамера", УИДЗамера); - Параметры.Вставить("ВыполненаСОшибкой", ФиксироватьСОшибкой); - Параметры.Вставить("АвтоЗавершение", АвтоЗавершение); - - НачатьЗамерВремениНаКлиентеСлужебный(Параметры); - - ИмяПараметра = "СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"; - Замеры = ПараметрыПриложения[ИмяПараметра]["Замеры"]; - Замер = Замеры[УИДЗамера]; - Замер.Вставить("ВремяПоследнегоЗамера", Замер["ВремяНачала"]); - Замер.Вставить("УдельноеВремя", 0.0); - Замер.Вставить("ВесЗамера", 0); - Замер.Вставить("ВложенныеЗамеры", Новый Соответствие); - Замер.Вставить("УИДЗамера", УИДЗамера); - Замер.Вставить("Клиентский", Истина); - Замер.Вставить("ИмяПоследнегоШага", ИмяПоследнегоШага); - + Если Не ВыполнятьЗамерыПроизводительности() Тогда + Возврат Новый Соответствие; КонецЕсли; - - Возврат Замер; + + Параметры = ПараметрыЗамераВремениНаКлиенте(КлючеваяОперация); + Параметры.ВыполненаСОшибкой = ФиксироватьСОшибкой; + Параметры.АвтоЗавершение = АвтоЗавершение; + + НачатьЗамерВремениНаКлиентеСлужебный(Параметры); + + ЗамерыВремени = ОценкаПроизводительностиЗамерВремени().Замеры; + ЗамерВремени = ЗамерыВремени[Параметры.УИДЗамера]; + ЗамерВремени.Вставить("ВремяПоследнегоЗамера", ЗамерВремени["ВремяНачала"]); + ЗамерВремени.Вставить("УдельноеВремя", 0.0); + ЗамерВремени.Вставить("ВесЗамера", 0); + ЗамерВремени.Вставить("ВложенныеЗамеры", Новый Соответствие); + ЗамерВремени.Вставить("УИДЗамера", Параметры.УИДЗамера); + ЗамерВремени.Вставить("Клиентский", Истина); + ЗамерВремени.Вставить("ИмяПоследнегоШага", ИмяПоследнегоШага); + Возврат ЗамерВремени; КонецФункции @@ -347,28 +333,33 @@ // Процедура ЗакончитьЗамерДлительнойОперации(ОписаниеЗамера, КоличествоДанных, ИмяШага = "", Комментарий = "") Экспорт - Если ВыполнятьЗамерыПроизводительности() Тогда + Если Не ВыполнятьЗамерыПроизводительности() Тогда + Возврат; + КонецЕсли; - Если ОписаниеЗамера["ВложенныеЗамеры"].Количество() Тогда - КоличествоДанныхШага = ?(КоличествоДанных = 0, 1, КоличествоДанных); - ЗафиксироватьЗамерДлительнойОперации(ОписаниеЗамера, КоличествоДанныхШага, ?(ПустаяСтрока(ИмяШага), "ПоследнийШаг", ИмяШага), Комментарий); - КонецЕсли; - - УИДЗамера = ОписаниеЗамера["УИДЗамера"]; - ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах(); - ЗавершитьЗамерВремениСлужебный(УИДЗамера, ВремяОкончания); - - Замеры = ПараметрыПриложения["СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"]["Замеры"]; - Замер = Замеры[УИДЗамера]; - - Если Замер <> Неопределено Тогда - ЗамерыЗавершенные = ПараметрыПриложения["СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"]["ЗамерыЗавершенные"]; - ОписаниеЗамера.Вставить("ВремяОкончания", Замер["ВремяОкончания"]); - ЗамерыЗавершенные.Вставить(УИДЗамера, ОписаниеЗамера); - Замеры.Удалить(УИДЗамера); - КонецЕсли; + Если ОписаниеЗамера["ВложенныеЗамеры"].Количество() > 0 Тогда + КоличествоДанныхШага = ?(КоличествоДанных = 0, 1, КоличествоДанных); + ЗафиксироватьЗамерДлительнойОперации(ОписаниеЗамера, КоличествоДанныхШага, + ?(ПустаяСтрока(ИмяШага), "ПоследнийШаг", ИмяШага), Комментарий); КонецЕсли; + УИДЗамера = ОписаниеЗамера["УИДЗамера"]; + ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах(); + ЗавершитьЗамерВремениСлужебный(УИДЗамера, ВремяОкончания); + + ЗамерыВремени = ОценкаПроизводительностиЗамерВремени(); + Если ЗамерыВремени = Неопределено Тогда + Возврат; + КонецЕсли; + + Замер = ЗамерыВремени.Замеры[УИДЗамера]; + Если Замер <> Неопределено Тогда + ЗамерыЗавершенные = ЗамерыВремени.ЗамерыЗавершенные; + ОписаниеЗамера.Вставить("ВремяОкончания", Замер["ВремяОкончания"]); + ЗамерыЗавершенные.Вставить(УИДЗамера, ОписаниеЗамера); + ЗамерыВремени.Замеры.Удалить(УИДЗамера); + КонецЕсли; + КонецПроцедуры #Область УстаревшиеПроцедурыИФункции @@ -397,24 +388,21 @@ // Функция НачатьЗамерВремени(АвтоЗавершение = Истина, КлючеваяОперация = Неопределено) Экспорт - УИДЗамера = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); - - Если ВыполнятьЗамерыПроизводительности() Тогда - УИДЗамера = Новый УникальныйИдентификатор(); - Параметры = Новый Структура; - Параметры.Вставить("КлючеваяОперация", КлючеваяОперация); - Параметры.Вставить("УИДЗамера", УИДЗамера); - Параметры.Вставить("АвтоЗавершение", АвтоЗавершение); - Параметры.Вставить("ВыполненаСОшибкой", Ложь); - - НачатьЗамерВремениНаКлиентеСлужебный(Параметры); + Если Не ВыполнятьЗамерыПроизводительности() Тогда + Возврат Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); КонецЕсли; - - Возврат УИДЗамера; + + Параметры = ПараметрыЗамераВремениНаКлиенте(КлючеваяОперация); + Параметры.АвтоЗавершение = АвтоЗавершение; + Параметры.ВыполненаСОшибкой = Ложь; + + НачатьЗамерВремениНаКлиентеСлужебный(Параметры); + Возврат Параметры.УИДЗамера; КонецФункции #КонецОбласти + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -480,21 +468,17 @@ // Функция НачатьЗамерВремениСоСмещением(Смещение, АвтоЗавершение = Истина, КлючеваяОперация = Неопределено) - УИДЗамера = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); - - Если ВыполнятьЗамерыПроизводительности() Тогда - УИДЗамера = Новый УникальныйИдентификатор(); - Параметры = Новый Структура; - Параметры.Вставить("КлючеваяОперация", КлючеваяОперация); - Параметры.Вставить("УИДЗамера", УИДЗамера); - Параметры.Вставить("АвтоЗавершение", АвтоЗавершение); - Параметры.Вставить("ВыполненаСОшибкой", Ложь); - Параметры.Вставить("Смещение", Смещение); - - НачатьЗамерВремениНаКлиентеСлужебный(Параметры); + Если Не ВыполнятьЗамерыПроизводительности() Тогда + Возврат Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); КонецЕсли; - - Возврат УИДЗамера; + + Параметры = ПараметрыЗамераВремениНаКлиенте(КлючеваяОперация); + Параметры.АвтоЗавершение = АвтоЗавершение; + Параметры.ВыполненаСОшибкой = Ложь; + Параметры.Смещение = Смещение; + + НачатьЗамерВремениНаКлиентеСлужебный(Параметры); + Возврат Параметры.УИДЗамера; КонецФункции @@ -518,21 +502,61 @@ КонецФункции +// Возвращаемое значение: +// Структура: +// * КлючеваяОперация - Строка +// * УИДЗамера - УникальныйИдентификатор +// * АвтоЗавершение - Булево +// * Технологический - Булево +// * ВыполненаСОшибкой - Булево +// * Смещение - Число +// * Комментарий - Строка, Неопределено +// +Функция ПараметрыЗамераВремениНаКлиенте(КлючеваяОперация) + + Параметры = Новый Структура; + Параметры.Вставить("КлючеваяОперация", КлючеваяОперация); + Параметры.Вставить("УИДЗамера", Новый УникальныйИдентификатор()); + Параметры.Вставить("АвтоЗавершение", Истина); + Параметры.Вставить("Технологический", Ложь); + Параметры.Вставить("ВыполненаСОшибкой", Ложь); + Параметры.Вставить("Смещение", 0); + Параметры.Вставить("Комментарий", Неопределено); + Возврат Параметры; + +КонецФункции + +// Возвращаемое значение: +// Структура: +// * Замеры - Соответствие +// * ЗамерыЗавершенные - Соответствие +// * ЕстьОбработчик - Булево +// * ВремяПодключенияОбработчика - Дата +// * СмещениеДатыКлиента - Число +// +Функция ОценкаПроизводительностиЗамерВремени() + Возврат ПараметрыПриложения["СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"]; +КонецФункции + +// Параметры: +// Параметры - см. ПараметрыЗамераВремениНаКлиенте +// Процедура НачатьЗамерВремениНаКлиентеСлужебный(Параметры) ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах(); - Если ПараметрыПриложения = Неопределено Тогда ПараметрыПриложения = Новый Соответствие; КонецЕсли; - ИмяПараметра = "СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"; - Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда - ПараметрыПриложения.Вставить(ИмяПараметра, Новый Структура); - ПараметрыПриложения[ИмяПараметра].Вставить("Замеры", Новый Соответствие); - ПараметрыПриложения[ИмяПараметра].Вставить("ЗамерыЗавершенные", Новый Соответствие); - ПараметрыПриложения[ИмяПараметра].Вставить("ЕстьОбработчик", Ложь); - ПараметрыПриложения[ИмяПараметра].Вставить("ВремяПодключенияОбработчика", ВремяНачала); + ЗамерыВремени = ОценкаПроизводительностиЗамерВремени(); + Если ЗамерыВремени = Неопределено Тогда + ЗамерыВремени = Новый Структура; + ЗамерыВремени.Вставить("Замеры", Новый Соответствие); + ЗамерыВремени.Вставить("ЗамерыЗавершенные", Новый Соответствие); + ЗамерыВремени.Вставить("ЕстьОбработчик", Ложь); + ЗамерыВремени.Вставить("ВремяПодключенияОбработчика", ВремяНачала); + ЗамерыВремени.Вставить("СмещениеДатыКлиента", 0); + ПараметрыПриложения["СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"] = ЗамерыВремени; ИмяПараметраСтандартныеПодсистемы = "СтандартныеПодсистемы.ПараметрыКлиента"; Если ПараметрыПриложения[ИмяПараметраСтандартныеПодсистемы] = Неопределено Тогда @@ -540,162 +564,131 @@ ТекущийПериодЗаписи = ПараметрыОценкиПроизводительности.ПериодЗаписи; ДатаИВремяНаСервере = ПараметрыОценкиПроизводительности.ДатаИВремяНаСервере; - // Получаем дату в UTC ДатаИВремяНаКлиенте = ТекущаяУниверсальнаяДатаВМиллисекундах(); - ПараметрыПриложения[ИмяПараметра].Вставить("СмещениеДатыКлиента", ДатаИВремяНаСервере - ДатаИВремяНаКлиенте); + ЗамерыВремени.СмещениеДатыКлиента = ДатаИВремяНаСервере - ДатаИВремяНаКлиенте; Иначе ТекущийПериодЗаписи = Неопределено; // Смотри ПередПериодическойОтправкойДанныхКлиентаНаСервер. ПараметрыПриложенияСтандартныеПодсистемы = ПараметрыПриложения[ИмяПараметраСтандартныеПодсистемы]; Если ПараметрыПриложенияСтандартныеПодсистемы.Свойство("ОценкаПроизводительности") Тогда - ПараметрыПриложения[ИмяПараметра].Вставить("СмещениеДатыКлиента", ПараметрыПриложенияСтандартныеПодсистемы["СмещениеДатыКлиента"]); + ЗамерыВремени.СмещениеДатыКлиента = ПараметрыПриложенияСтандартныеПодсистемы["СмещениеДатыКлиента"]; Иначе ПараметрыОценкиПроизводительности = ОценкаПроизводительностиВызовСервера.ПолучитьПараметрыНаСервере(); ДатаИВремяНаСервере = ПараметрыОценкиПроизводительности.ДатаИВремяНаСервере; - // Получаем дату в UTC ДатаИВремяНаКлиенте = ТекущаяУниверсальнаяДатаВМиллисекундах(); - ПараметрыПриложения[ИмяПараметра].Вставить("СмещениеДатыКлиента", ДатаИВремяНаСервере - ДатаИВремяНаКлиенте); + ЗамерыВремени.СмещениеДатыКлиента = ДатаИВремяНаСервере - ДатаИВремяНаКлиенте; КонецЕсли; КонецЕсли; ИнформацияПрограммыПросмотра = ""; - #Если ТолстыйКлиентУправляемоеПриложение Тогда - ИнформацияПрограммыПросмотра = "ТолстыйКлиентУправляемоеПриложение"; - #ИначеЕсли ТолстыйКлиентОбычноеПриложение Тогда - ИнформацияПрограммыПросмотра = "ТолстыйКлиент"; - #ИначеЕсли ТонкийКлиент Тогда - ИнформацияПрограммыПросмотра = "ТонкийКлиент"; - #ИначеЕсли ВебКлиент Тогда - ИнфоКлиента = Новый СистемнаяИнформация(); - ИнформацияПрограммыПросмотра = ИнфоКлиента.ИнформацияПрограммыПросмотра; - #КонецЕсли - ПараметрыПриложения[ИмяПараметра].Вставить("ИнформацияПрограммыПросмотра", ИнформацияПрограммыПросмотра); +#Если ТолстыйКлиентУправляемоеПриложение Тогда + ИнформацияПрограммыПросмотра = "ТолстыйКлиентУправляемоеПриложение"; +#ИначеЕсли ТолстыйКлиентОбычноеПриложение Тогда + ИнформацияПрограммыПросмотра = "ТолстыйКлиент"; +#ИначеЕсли ТонкийКлиент Тогда + ИнформацияПрограммыПросмотра = "ТонкийКлиент"; +#ИначеЕсли ВебКлиент Тогда + ИнфоКлиента = Новый СистемнаяИнформация(); + ИнформацияПрограммыПросмотра = ИнфоКлиента.ИнформацияПрограммыПросмотра; +#КонецЕсли + ЗамерыВремени.Вставить("ИнформацияПрограммыПросмотра", ИнформацияПрограммыПросмотра); Если ТекущийПериодЗаписи <> Неопределено Тогда ПодключитьОбработчикОжидания("ЗаписатьРезультатыАвто", ТекущийПериодЗаписи, Истина); КонецЕсли; КонецЕсли; // Фактическое начало замера времени на клиенте. - // Выше поднять нельзя, т.к. при замере времени открытия приложения ПараметрыПриложения - // еще не инициализированы. - // - - Если Параметры.Свойство("Смещение") Тогда - ВремяНачала = Параметры.Смещение + ПараметрыПриложения[ИмяПараметра]["СмещениеДатыКлиента"];; + Если Параметры.Смещение > 0 Тогда + ВремяНачала = Параметры.Смещение + ЗамерыВремени.СмещениеДатыКлиента; Иначе - ВремяНачала = ВремяНачала + ПараметрыПриложения[ИмяПараметра]["СмещениеДатыКлиента"]; + ВремяНачала = ВремяНачала + ЗамерыВремени.СмещениеДатыКлиента; КонецЕсли; - КлючеваяОперация = Параметры.КлючеваяОперация; - УИДЗамера = Параметры.УИДЗамера; - АвтоЗавершение = Параметры.АвтоЗавершение; - - Если Параметры.Свойство("Комментарий") Тогда - Комментарий = Параметры.Комментарий; - Иначе - Комментарий = Неопределено; - КонецЕсли; - - Если Параметры.Свойство("Технологический") Тогда - Технологический = Параметры.Технологический; - Иначе - Технологический = Ложь; - КонецЕсли; - - Если Параметры.Свойство("ВыполненаСОшибкой") Тогда - ВыполненаСОшибкой = Параметры.ВыполненаСОшибкой; - Иначе - ВыполненаСОшибкой = Ложь; - КонецЕсли; - - Замеры = ПараметрыПриложения[ИмяПараметра]["Замеры"]; - Замеры.Вставить(УИДЗамера, Новый Соответствие); - Замер = Замеры[УИДЗамера]; - Замер.Вставить("КлючеваяОперация", КлючеваяОперация); - Замер.Вставить("АвтоЗавершение", АвтоЗавершение); + Замер = Новый Соответствие; + Замер.Вставить("КлючеваяОперация", Параметры.КлючеваяОперация); + Замер.Вставить("АвтоЗавершение", Параметры.АвтоЗавершение); Замер.Вставить("ВремяНачала", ВремяНачала); - Замер.Вставить("Комментарий", Комментарий); - Замер.Вставить("ВыполненаСОшибкой", ВыполненаСОшибкой); - Замер.Вставить("Технологический", Технологический); + Замер.Вставить("Комментарий", Параметры.Комментарий); + Замер.Вставить("ВыполненаСОшибкой", Параметры.ВыполненаСОшибкой); + Замер.Вставить("Технологический", Параметры.Технологический); Замер.Вставить("ВесЗамера", 1); - - Если АвтоЗавершение Тогда - Если НЕ ПараметрыПриложения[ИмяПараметра]["ЕстьОбработчик"] Тогда + ЗамерыВремени.Замеры.Вставить(Параметры.УИДЗамера, Замер); + + Если Параметры.АвтоЗавершение Тогда + Если НЕ ЗамерыВремени.ЕстьОбработчик Тогда ПодключитьОбработчикОжидания("ЗакончитьЗамерВремениАвто", 0.1, Истина); - ПараметрыПриложения[ИмяПараметра]["ЕстьОбработчик"] = Истина; - ПараметрыПриложения[ИмяПараметра]["ВремяПодключенияОбработчика"] = ТекущаяУниверсальнаяДатаВМиллисекундах() + ПараметрыПриложения[ИмяПараметра]["СмещениеДатыКлиента"]; + ЗамерыВремени.ЕстьОбработчик = Истина; + ЗамерыВремени.ВремяПодключенияОбработчика = ТекущаяУниверсальнаяДатаВМиллисекундах() + ЗамерыВремени.СмещениеДатыКлиента; КонецЕсли; КонецЕсли; КонецПроцедуры -// Автоматически завершает замер времени на клиенте. -// Процедура ЗавершитьЗамерВремениНаКлиентеАвто() Экспорт ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах(); + + ЗамерыВремени = ОценкаПроизводительностиЗамерВремени(); + Если ЗамерыВремени = Неопределено Тогда + Возврат; + КонецЕсли; + + ДляУдаления = Новый Массив; + + КоличествоНеЗавершенныхАвтоЗамеров = 0; + Для Каждого ЗамерВремени Из ЗамерыВремени.Замеры Цикл + ЗамерЗначение = ЗамерВремени.Значение; + Если ЗамерЗначение["АвтоЗавершение"] Тогда + Если ЗамерЗначение["ВремяНачала"] <= ЗамерыВремени.ВремяПодключенияОбработчика + И ЗамерЗначение["ВремяОкончания"] = Неопределено Тогда + // Если есть вложенные замеры, зафиксируем последний шаг. + Если ЗамерЗначение["ВложенныеЗамеры"] <> Неопределено + И ЗамерЗначение["ВложенныеЗамеры"].Количество() > 0 Тогда + ЗафиксироватьЗамерДлительнойОперации(ЗамерЗначение, 1, ЗамерЗначение["ИмяПоследнегоШага"]); + КонецЕсли; + + // Смещение даты клиента рассчитывается внутри процедуры + ЗавершитьЗамерВремениСлужебный(ЗамерВремени.Ключ, ВремяОкончания); + Если ЗначениеЗаполнено(ЗамерВремени.Значение["КлючеваяОперация"]) Тогда + ЗамерыВремени.ЗамерыЗавершенные.Вставить(ЗамерВремени.Ключ, ЗамерВремени.Значение); + КонецЕсли; + ДляУдаления.Добавить(ЗамерВремени.Ключ); + Иначе + КоличествоНеЗавершенныхАвтоЗамеров = КоличествоНеЗавершенныхАвтоЗамеров + 1; + КонецЕсли; + КонецЕсли; + КонецЦикла; - ОценкаПроизводительностиЗамерВремени = ПараметрыПриложения["СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"]; - ВремяПодключенияОбработчика = ОценкаПроизводительностиЗамерВремени["ВремяПодключенияОбработчика"]; - - Если ОценкаПроизводительностиЗамерВремени <> Неопределено Тогда - - Замеры = ПараметрыПриложения["СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"]["Замеры"]; - ЗамерыЗавершенные = ПараметрыПриложения["СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"]["ЗамерыЗавершенные"]; - - ДляУдаления = Новый Массив; - - КоличествоНеЗавершенныхАвтоЗамеров = 0; - Для Каждого Замер Из Замеры Цикл - ЗамерЗначение = Замер.Значение; - Если ЗамерЗначение["АвтоЗавершение"] Тогда - Если ЗамерЗначение["ВремяНачала"] <= ВремяПодключенияОбработчика И ЗамерЗначение["ВремяОкончания"] = Неопределено Тогда - // Если есть вложенные замеры, зафиксируем последний шаг. - Если ЗамерЗначение["ВложенныеЗамеры"] <> Неопределено - И ЗамерЗначение["ВложенныеЗамеры"].Количество() Тогда - ЗафиксироватьЗамерДлительнойОперации(ЗамерЗначение, 1, ЗамерЗначение["ИмяПоследнегоШага"]); - КонецЕсли; - - // Смещение даты клиента рассчитывается внутри процедуры - ЗавершитьЗамерВремениСлужебный(Замер.Ключ, ВремяОкончания); - Если ЗначениеЗаполнено(Замер.Значение["КлючеваяОперация"]) Тогда - ЗамерыЗавершенные.Вставить(Замер.Ключ, Замер.Значение); - КонецЕсли; - ДляУдаления.Добавить(Замер.Ключ); - Иначе - КоличествоНеЗавершенныхАвтоЗамеров = КоличествоНеЗавершенныхАвтоЗамеров + 1; - КонецЕсли; - КонецЕсли; - КонецЦикла; - - Для Каждого ТекЗамер Из ДляУдаления Цикл - Замеры.Удалить(ТекЗамер); - КонецЦикла; - КонецЕсли; + Для Каждого ЗамерВремени Из ДляУдаления Цикл + ЗамерыВремени.Замеры.Удалить(ЗамерВремени); + КонецЦикла; Если КоличествоНеЗавершенныхАвтоЗамеров = 0 Тогда - ОценкаПроизводительностиЗамерВремени["ЕстьОбработчик"] = Ложь; + ЗамерыВремени.ЕстьОбработчик = Ложь; Иначе ПодключитьОбработчикОжидания("ЗакончитьЗамерВремениАвто", 0.1, Истина); - ОценкаПроизводительностиЗамерВремени["ЕстьОбработчик"] = Истина; - ОценкаПроизводительностиЗамерВремени["ВремяПодключенияОбработчика"] = ТекущаяУниверсальнаяДатаВМиллисекундах() + ОценкаПроизводительностиЗамерВремени["СмещениеДатыКлиента"]; + ЗамерыВремени.ЕстьОбработчик = Истина; + ЗамерыВремени.ВремяПодключенияОбработчика = ТекущаяУниверсальнаяДатаВМиллисекундах() + ЗамерыВремени.СмещениеДатыКлиента; КонецЕсли; КонецПроцедуры Процедура ЗавершитьЗамерВремениСлужебный(УИДЗамера, Знач ВремяОкончания) - Если ВыполнятьЗамерыПроизводительности() Тогда - ОценкаПроизводительностиЗамерВремени = ПараметрыПриложения["СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"]; - Если ОценкаПроизводительностиЗамерВремени <> Неопределено Тогда - СмещениеДатыКлиента = ПараметрыПриложения["СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"]["СмещениеДатыКлиента"]; - ВремяОкончания = ВремяОкончания + СмещениеДатыКлиента; - - Замеры = ПараметрыПриложения["СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"]["Замеры"]; - Замер = Замеры[УИДЗамера]; - Если Замер <> Неопределено Тогда - Замер.Вставить("ВремяОкончания", ВремяОкончания); - КонецЕсли; - КонецЕсли; + Если Не ВыполнятьЗамерыПроизводительности() Тогда + Возврат; + КонецЕсли; + + ЗамерыВремени = ОценкаПроизводительностиЗамерВремени(); + Если ЗамерыВремени = Неопределено Тогда + Возврат; + КонецЕсли; + + СмещениеДатыКлиента = ЗамерыВремени.СмещениеДатыКлиента; + ВремяОкончания = ВремяОкончания + СмещениеДатыКлиента; + + Замер = ЗамерыВремени.Замеры[УИДЗамера]; + Если Замер <> Неопределено Тогда + Замер.Вставить("ВремяОкончания", ВремяОкончания); КонецЕсли; КонецПроцедуры @@ -708,35 +701,34 @@ Процедура ЗаписатьРезультатыАвтоНеГлобальный(ПередЗавершением = Ложь) Экспорт ЗамерыДляЗаписи = ЗамерыДляЗаписи(); + Если ЗамерыДляЗаписи = Неопределено Тогда + Возврат; + КонецЕсли; + + НовыйПериодЗаписи = ОценкаПроизводительностиВызовСервера.ЗафиксироватьДлительностьКлючевыхОпераций(ЗамерыДляЗаписи); - Если ЗамерыДляЗаписи <> Неопределено Тогда - НовыйПериодЗаписи = ОценкаПроизводительностиВызовСервера.ЗафиксироватьДлительностьКлючевыхОпераций(ЗамерыДляЗаписи); - - ИмяПараметраСтандартныеПодсистемы = "СтандартныеПодсистемы.ПараметрыКлиента"; - Если ПараметрыПриложения[ИмяПараметраСтандартныеПодсистемы] = Неопределено Тогда - // Смотри также ПередПериодическойОтправкойДанныхКлиентаНаСервер. - ПодключитьОбработчикОжидания("ЗаписатьРезультатыАвто", НовыйПериодЗаписи, Истина); - КонецЕсли; + ИмяПараметраСтандартныеПодсистемы = "СтандартныеПодсистемы.ПараметрыКлиента"; + Если ПараметрыПриложения[ИмяПараметраСтандартныеПодсистемы] = Неопределено Тогда + // Смотри также ПередПериодическойОтправкойДанныхКлиентаНаСервер. + ПодключитьОбработчикОжидания("ЗаписатьРезультатыАвто", НовыйПериодЗаписи, Истина); КонецЕсли; КонецПроцедуры Функция ЗамерыДляЗаписи() - ОценкаПроизводительностиЗамерВремени = ПараметрыПриложения["СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени"]; - - Если ОценкаПроизводительностиЗамерВремени <> Неопределено Тогда - ЗамерыЗавершенные = ОценкаПроизводительностиЗамерВремени["ЗамерыЗавершенные"]; - ОценкаПроизводительностиЗамерВремени["ЗамерыЗавершенные"] = Новый Соответствие; - - ЗамерыДляЗаписи = Новый Структура; - ЗамерыДляЗаписи.Вставить("ЗамерыЗавершенные", ЗамерыЗавершенные); - ЗамерыДляЗаписи.Вставить("ИнформацияПрограммыПросмотра", ОценкаПроизводительностиЗамерВремени["ИнформацияПрограммыПросмотра"]); - Возврат ЗамерыДляЗаписи; - + ЗамерыВремени = ОценкаПроизводительностиЗамерВремени(); + Если ЗамерыВремени = Неопределено Тогда + Возврат Неопределено; КонецЕсли; + + ЗамерыЗавершенные = ЗамерыВремени.ЗамерыЗавершенные; + ЗамерыВремени.ЗамерыЗавершенные = Новый Соответствие; - Возврат Неопределено; + ЗамерыДляЗаписи = Новый Структура; + ЗамерыДляЗаписи.Вставить("ЗамерыЗавершенные", ЗамерыЗавершенные); + ЗамерыДляЗаписи.Вставить("ИнформацияПрограммыПросмотра", ЗамерыВремени.ИнформацияПрограммыПросмотра); + Возврат ЗамерыДляЗаписи; КонецФункции diff --git a/SSL/src/CommonModules/ПереводТекстаНаДругиеЯзыки/Module.bsl b/SSL/src/CommonModules/ПереводТекстаНаДругиеЯзыки/Module.bsl index 6cc843761..7efbd099b 100644 --- a/SSL/src/CommonModules/ПереводТекстаНаДругиеЯзыки/Module.bsl +++ b/SSL/src/CommonModules/ПереводТекстаНаДругиеЯзыки/Module.bsl @@ -114,12 +114,12 @@ Переводы = МодульСервисаПереводаТекста.ПеревестиТексты(Порция, ЯзыкПеревода, ИсходныйЯзык); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Перевод текста'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, - Метаданные.Перечисления.СервисыПереводаТекста, Константы.СервисПереводаТекста.Получить(), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Метаданные.Перечисления.СервисыПереводаТекста, Константы.СервисПереводаТекста.Получить(), ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Если Пользователи.ЭтоПолноправныйПользователь() Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( "ru = 'Не удалось выполнить операцию по причине: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Иначе ТекстОшибки = НСтр("ru = 'Не удалось выполнить операцию. Обратитесь к администратору.'"); КонецЕсли; @@ -161,12 +161,12 @@ ДоступныеЯзыки = МодульСервисаПереводаТекста.ДоступныеЯзыки(); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Перевод текста'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, - Метаданные.Перечисления.СервисыПереводаТекста, Константы.СервисПереводаТекста.Получить(), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Метаданные.Перечисления.СервисыПереводаТекста, Константы.СервисПереводаТекста.Получить(), ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Если Пользователи.ЭтоПолноправныйПользователь() Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( "ru = 'Не удалось выполнить операцию по причине: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Иначе ТекстОшибки = НСтр("ru = 'Не удалось выполнить операцию. Обратитесь к администратору.'"); КонецЕсли; diff --git a/SSL/src/CommonModules/ПодключаемыеКоманды/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКоманды/Module.bsl index f70d36e82..1c5e72a9c 100644 --- a/SSL/src/CommonModules/ПодключаемыеКоманды/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКоманды/Module.bsl @@ -20,40 +20,44 @@ // ПараметрыРазмещения - см. ПодключаемыеКоманды.ПараметрыРазмещения // - Неопределено // -Процедура ПриСозданииНаСервере(Форма, ПараметрыРазмещения = Неопределено) Экспорт +Процедура ПриСозданииНаСервере(Форма, Знач ПараметрыРазмещения = Неопределено) Экспорт ИмяФормы = Форма.ИмяФормы; + ПереданныеПараметрыРазмещения = ПараметрыРазмещения; + + ПараметрыРазмещения = ПараметрыРазмещения(); + Если ПереданныеПараметрыРазмещения <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(ПараметрыРазмещения, ПереданныеПараметрыРазмещения); + КонецЕсли; + ИсточникиЧерезЗапятую = ""; - Если ПараметрыРазмещения = Неопределено Тогда - ПараметрыРазмещения = ПараметрыРазмещения(); - Иначе - Если ТипЗнч(ПараметрыРазмещения.Источники) = Тип("ОписаниеТипов") Тогда - Типы = ПараметрыРазмещения.Источники.Типы(); - Для Каждого Тип Из Типы Цикл - ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); - Если ОбъектМетаданных <> Неопределено Тогда - ИсточникиЧерезЗапятую = ИсточникиЧерезЗапятую + ?(ИсточникиЧерезЗапятую = "", "", ",") + ОбъектМетаданных.ПолноеИмя(); - КонецЕсли; - КонецЦикла; - ИначеЕсли ТипЗнч(ПараметрыРазмещения.Источники) = Тип("Массив") Тогда - Для Каждого ОбъектМетаданных Из ПараметрыРазмещения.Источники Цикл - Если ТипЗнч(ОбъектМетаданных) = Тип("ОбъектМетаданных") Тогда - ИсточникиЧерезЗапятую = ИсточникиЧерезЗапятую + ?(ИсточникиЧерезЗапятую = "", "", ",") + ОбъектМетаданных.ПолноеИмя(); - ИначеЕсли ОбъектМетаданных <> Неопределено Тогда - ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( - "ПодключаемыеКоманды.ПриСозданииНаСервере", - "ПараметрыРазмещения.Источники[...]", - ОбъектМетаданных, - Новый ОписаниеТипов("ОбъектМетаданных")); - КонецЕсли; - КонецЦикла; - ИначеЕсли ПараметрыРазмещения.Источники <> Неопределено Тогда - ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( - "ПодключаемыеКоманды.ПриСозданииНаСервере", - "ПараметрыРазмещения.Источники", - ПараметрыРазмещения.Источники, - Новый ОписаниеТипов("ОписаниеТипов, Массив")); - КонецЕсли; + + Если ТипЗнч(ПараметрыРазмещения.Источники) = Тип("ОписаниеТипов") Тогда + Типы = ПараметрыРазмещения.Источники.Типы(); + Для Каждого Тип Из Типы Цикл + ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); + Если ОбъектМетаданных <> Неопределено Тогда + ИсточникиЧерезЗапятую = ИсточникиЧерезЗапятую + ?(ИсточникиЧерезЗапятую = "", "", ",") + ОбъектМетаданных.ПолноеИмя(); + КонецЕсли; + КонецЦикла; + ИначеЕсли ТипЗнч(ПараметрыРазмещения.Источники) = Тип("Массив") Тогда + Для Каждого ОбъектМетаданных Из ПараметрыРазмещения.Источники Цикл + Если ТипЗнч(ОбъектМетаданных) = Тип("ОбъектМетаданных") Тогда + ИсточникиЧерезЗапятую = ИсточникиЧерезЗапятую + ?(ИсточникиЧерезЗапятую = "", "", ",") + ОбъектМетаданных.ПолноеИмя(); + ИначеЕсли ОбъектМетаданных <> Неопределено Тогда + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( + "ПодключаемыеКоманды.ПриСозданииНаСервере", + "ПараметрыРазмещения.Источники[...]", + ОбъектМетаданных, + Новый ОписаниеТипов("ОбъектМетаданных")); + КонецЕсли; + КонецЦикла; + ИначеЕсли ПараметрыРазмещения.Источники <> Неопределено Тогда + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( + "ПодключаемыеКоманды.ПриСозданииНаСервере", + "ПараметрыРазмещения.Источники", + ПараметрыРазмещения.Источники, + Новый ОписаниеТипов("ОписаниеТипов, Массив")); КонецЕсли; ЭтоФормаОбъекта = Неопределено; @@ -112,11 +116,18 @@ // В качестве префикса рекомендуется использовать имя таблицы формы, для которой выводятся команды. // Например, если ПрефиксГрупп = "СкладскиеДокументы" (имя второстепенной таблицы формы), // то используются подменю с именами "СкладскиеДокументыПодменюПечать", "СкладскиеДокументыПодменюОтчеты" и т.д. +// * ВладелецКоманд - ДанныеФормыСтруктура, ТаблицаФормы - объект или элемент формы, для которого выводятся команды. // Функция ПараметрыРазмещения() Экспорт - Результат = Новый Структура("Источники, КоманднаяПанель, ПрефиксГрупп"); - Результат.ПрефиксГрупп = ""; + + Результат = Новый Структура; + Результат.Вставить("Источники"); + Результат.Вставить("КоманднаяПанель"); + Результат.Вставить("ПрефиксГрупп", ""); + Результат.Вставить("ВладелецКоманд"); + Возврат Результат; + КонецФункции // Обработчик команды формы, требующей контекстного вызова сервера. @@ -128,7 +139,7 @@ // - ДанныеФормыСтруктура - объект или список формы с полем "Ссылка". // Результат - Структура - результат выполнения команды. // -Процедура ВыполнитьКоманду(Знач Форма, Знач ПараметрыВызова, Знач Источник, Результат = Неопределено) Экспорт +Процедура ВыполнитьКоманду(Знач Форма, Знач ПараметрыВызова, Знач Источник = Неопределено, Результат = Неопределено) Экспорт Если ТипЗнч(ПараметрыВызова) <> Тип("Структура") Или ПараметрыВызова.Количество() <> 3 @@ -136,6 +147,10 @@ Возврат; КонецЕсли; + Если Источник = Неопределено Тогда + Источник = ПодключаемыеКомандыКлиентСервер.ВладелецКомандыПоИмениКоманды(ПараметрыВызова.ИмяКомандыВФорме, Форма); + КонецЕсли; + АдресНастроек = Форма.ПараметрыПодключаемыхКоманд.АдресТаблицыКоманд; ОписаниеКоманды = ОписаниеКоманды(ПараметрыВызова.ИмяКомандыВФорме, АдресНастроек); @@ -261,7 +276,7 @@ ПодключенныйОбъект = ПодключенныеОбъекты.Добавить(); ЗаполнитьЗначенияСвойств(ПодключенныйОбъект, НастройкиПодключаемогоОбъекта); ПодключенныйОбъект.ТипСсылкиДанных = Источник.ТипСсылкиДанных; - ПодключенныйОбъект.Метаданные = Метаданные.НайтиПоПолномуИмени(ПолноеИмя); + ПодключенныйОбъект.Метаданные = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмя); Иначе ПодключенныйОбъект.ТипСсылкиДанных = ОбъединитьТипы(ПодключенныйОбъект.ТипСсылкиДанных, Источник.ТипСсылкиДанных); КонецЕсли; @@ -323,12 +338,12 @@ Исключение ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось прочитать настройки объекта %1 из модуля менеджера:'"), ПолноеИмя); - ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ТекстОшибки + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации( НСтр("ru = 'Подключаемые команды'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, - Метаданные.НайтиПоПолномуИмени(ПолноеИмя), + ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмя), ПолноеИмя, ТекстОшибки); Возврат Неопределено; @@ -454,7 +469,7 @@ ТекстОшибки, Настройка.Ключ, Строка(Настройка.ОписаниеТипов), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение ТекстОшибки; КонецПопытки; КонецЦикла; @@ -549,7 +564,7 @@ Иначе ПолныеИменаИсточников = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИсточникиЧерезЗапятую, ",", Истина, Истина); Для Каждого ПолноеИмя Из ПолныеИменаИсточников Цикл - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмя); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмя); Источник = ЗарегистрироватьИсточник(ОбъектМетаданных, Источники, ПодключенныеОбъекты, НастройкиПрограммногоИнтерфейса); ДополнитьМассивТипов(ТипыИсточников, Источник.ТипСсылкиДанных); КонецЦикла; @@ -676,49 +691,13 @@ Возврат КэшФормы; КонецФункции -Функция ВидыКоманд() - Виды = Новый ТаблицаЗначений; - Виды.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка")); - Виды.Колонки.Добавить("ИмяПодменю", Новый ОписаниеТипов("Строка")); - Виды.Колонки.Добавить("Заголовок", Новый ОписаниеТипов("Строка")); - Виды.Колонки.Добавить("Порядок", Новый ОписаниеТипов("Число")); - Виды.Колонки.Добавить("Картинка", Новый ОписаниеТипов("Картинка")); - Виды.Колонки.Добавить("Отображение", Новый ОписаниеТипов("ОтображениеКнопки")); - Виды.Колонки.Добавить("ВидГруппыФормы"); +Процедура ПроверитьИмяВидаКоманд(ИмяВида) Экспорт - ЗаполнениеОбъектов.ПриОпределенииВидовПодключаемыхКоманд(Виды); - СозданиеНаОсновании.ПриОпределенииВидовПодключаемыхКоманд(Виды); - ИнтеграцияПодсистемБСП.ПриОпределенииВидовПодключаемыхКоманд(Виды); - ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд(Виды); - - Для Каждого Вид Из Виды Цикл - Если Не ЗначениеЗаполнено(Вид.ИмяПодменю) Тогда - Вид.ИмяПодменю = "Подменю" + Вид.Имя; - КонецЕсли; - Если Не ЗначениеЗаполнено(Вид.Заголовок) Тогда - Вид.Заголовок = Вид.Имя; - КонецЕсли; - КонецЦикла; - - // Вид с пустой группой для команд, которые следует размещать в командной панели. - Вид = Виды.Добавить(); - Вид.Имя = "КоманднаяПанель"; - Вид.ИмяПодменю = ""; - Вид.Порядок = 90; - - Виды.Сортировать("Порядок Возр"); - - Возврат Виды; -КонецФункции - -Процедура ПроверитьИмяВидаКоманд(ИмяВида) - Структура = Новый Структура; - Попытка - Структура.Вставить(ИмяВида, Неопределено); - Исключение + Если Не ОбщегоНазначенияКлиентСервер.ИмяСоответствуетТребованиямИменованияСвойств(ИмяВида) Тогда ТекстОшибки = НСтр("ru = 'Имя вида команд ""%1"" не удовлетворяет требованиям именования переменных.'"); ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, ИмяВида); - КонецПопытки; + КонецЕсли; + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -733,6 +712,20 @@ // Процедура ВывестиКоманды(Форма, Команды, ПараметрыРазмещения) + ПрефиксКоманд = ""; + Если ТипЗнч(ПараметрыРазмещения.ВладелецКоманд) = Тип("ТаблицаФормы") Тогда + ПрефиксКоманд = "Элемент_" + ПараметрыРазмещения.ВладелецКоманд.Имя; + ИначеЕсли ТипЗнч(ПараметрыРазмещения.ВладелецКоманд) = Тип("ДанныеФормыСтруктура") Тогда + Для Каждого Реквизит Из Форма.ПолучитьРеквизиты() Цикл + Если Реквизит = ПараметрыРазмещения.ВладелецКоманд Тогда + ПрефиксКоманд = "Реквизит_" + Реквизит.Имя; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ПараметрыРазмещения.ВладелецКоманд = ПрефиксКоманд; + ПодключенныеКоманды = ПодключенныеКоманды(Форма); ПодключенныеКоманды.ВводНаОснованииЧерезПодключаемыеКоманды = ПараметрыРазмещения.ВводНаОснованииЧерезПодключаемыеКоманды; @@ -764,6 +757,10 @@ КонецЦикла; КонецЕсли; + Если ЗначениеЗаполнено(ПрефиксКоманд) И ПодключенныеКоманды.ВладельцыКоманд.Найти(ПрефиксКоманд) = Неопределено Тогда + ПодключенныеКоманды.ВладельцыКоманд.Добавить(ПрефиксКоманд); + КонецЕсли; + ПодключенныеКоманды.ЕстьУсловияВидимости = ПодключенныеКоманды.ЕстьУсловияВидимости Или ПараметрыРазмещения.ЕстьУсловияВидимости; Элементы = Форма.Элементы; @@ -782,9 +779,9 @@ // Вывод команд. Команды.Сортировать("Вид, ПорядокВажности Возр, Порядок Возр, Представление Возр"); СчетчикКомандСАвтогенерируемымИменем = 0; - ВидыКоманд = ВидыКоманд(); + ВидыКоманд = ПодключаемыеКомандыПовтИсп.ВидыКоманд(); + Для Каждого ВидКоманд Из ВидыКоманд Цикл - ПроверитьИмяВидаКоманд(ВидКоманд.Имя); КомандыВида = Команды.НайтиСтроки(Новый Структура("Вид", ВидКоманд.Имя)); // Массив из СтрокаТаблицыЗначений: см. ТаблицаКоманд Если КомандыВида.Количество() = 0 И ВидКоманд.Имя <> "СозданиеНаОсновании" Тогда @@ -798,7 +795,8 @@ СведенияОПодменюПоУмолчанию = БыстрыйПоискСведенийОПодменю.Получить(НРег(ИмяПодменюПоУмолчанию)); Если СведенияОПодменюПоУмолчанию = Неопределено Тогда - СведенияОПодменюПоУмолчанию = ЗарегистрироватьПодменю(Элементы, СведенияОВсехПодменю, ИмяПодменюПоУмолчанию, ВидКоманд, КоманднаяПанель); + СведенияОПодменюПоУмолчанию = ЗарегистрироватьПодменю(Элементы, СведенияОВсехПодменю, ИмяПодменюПоУмолчанию, + ВидКоманд, КоманднаяПанель); БыстрыйПоискСведенийОПодменю.Вставить(НРег(ИмяПодменюПоУмолчанию), СведенияОПодменюПоУмолчанию); КонецЕсли; @@ -809,7 +807,8 @@ ИмяПодменю = ПрефиксГрупп + Команда.Подменю; СведенияОПодменюКоманды = БыстрыйПоискСведенийОПодменю.Получить(НРег(ИмяПодменю)); Если СведенияОПодменюКоманды = Неопределено Тогда - СведенияОПодменюКоманды = ЗарегистрироватьПодменю(Элементы, СведенияОВсехПодменю, ИмяПодменю, , , СведенияОПодменюПоУмолчанию); + СведенияОПодменюКоманды = ЗарегистрироватьПодменю(Элементы, СведенияОВсехПодменю, ИмяПодменю,,, + СведенияОПодменюПоУмолчанию); БыстрыйПоискСведенийОПодменю.Вставить(НРег(ИмяПодменю), СведенияОПодменюКоманды); КонецЕсли; КонецЕсли; @@ -820,7 +819,8 @@ ГруппаФормы = СведенияОПодменюКоманды.ГруппаПоУмолчанию; КонецЕсли; - Команда.ИмяВФорме = ОпределитьИмяКоманды(Форма, ГруппаФормы.Имя, Команда.Идентификатор, СчетчикКомандСАвтогенерируемымИменем); + Команда.ИмяВФорме = ОпределитьИмяКоманды(Форма, ГруппаФормы.Имя, Команда.Идентификатор, + СчетчикКомандСАвтогенерируемымИменем, ПрефиксКоманд); Команда.КлючПараметровРазмещения = КлючПараметровРазмещения; Подменю = СведенияОПодменюКоманды.Подменю; // ГруппаФормы @@ -843,22 +843,32 @@ И ЗначениеЗаполнено(КомандаФормы.Картинка) Тогда КомандаФормы.Отображение = ОтображениеКнопки.Картинка; КонецЕсли; - КомандаФормы.ИзменяетСохраняемыеДанные = Команда.ИзменяетВыбранныеОбъекты И ПараметрыРазмещения.ЭтоФормаОбъекта И Форма.ТолькоПросмотр; + КомандаФормы.ИзменяетСохраняемыеДанные = Команда.ИзменяетВыбранныеОбъекты + И ПараметрыРазмещения.ЭтоФормаОбъекта И Форма.ТолькоПросмотр; КнопкаФормы = Элементы.Добавить(Команда.ИмяВФорме, Тип("КнопкаФормы"), ГруппаФормы); КнопкаФормы.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; КнопкаФормы.ИмяКоманды = Команда.ИмяВФорме; - КнопкаФормы.ТолькоВоВсехДействиях = Команда.ТолькоВоВсехДействиях; + Если Команда.ТолькоВоВсехДействиях = Истина Тогда + ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; + ИначеЕсли Команда.ТолькоВоВсехДействиях = Ложь Тогда + ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели; + Иначе + ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.Авто; + КонецЕсли; + КнопкаФормы.ПоложениеВКоманднойПанели = ПоложениеВКоманднойПанели; Если ЗначениеЗаполнено(Команда.ЗначениеПометки) И ЭтоПутьДоРеквизита(Команда.ЗначениеПометки) Тогда Команда.ЗначениеПометки = ВыражениеВычислениеПометки(Команда.ЗначениеПометки); - ПодключенныеКоманды.КомандыСПометкой.Добавить(ОписаниеКомандыНаКлиенте(Команда, КнопкаФормы)); + ПодключенныеКоманды.КомандыСПометкой.Добавить(ОписаниеКомандыНаКлиенте(Команда, КнопкаФормы, ПрефиксКоманд)); КонецЕсли; СвойстваКорневогоПодменюКоманды = КорневыеПодменюИКоманды[ИмяКорневогоЭлемента]; Если СвойстваКорневогоПодменюКоманды = Неопределено Тогда СвойстваКорневогоПодменюКоманды = СвойстваКорневогоПодменюКоманды(); - СвойстваКорневогоПодменюКоманды.ЕстьВКоманднойПанели = КнопкаФормы.ПоложениеВКоманднойПанели <> ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; + СвойстваКорневогоПодменюКоманды.ЕстьВКоманднойПанели = + КнопкаФормы.ПоложениеВКоманднойПанели <> ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; + СвойстваКорневогоПодменюКоманды.ПрефиксКоманд = ПрефиксКоманд; КорневыеПодменюИКоманды.Вставить(ИмяКорневогоЭлемента, СвойстваКорневогоПодменюКоманды); КонецЕсли; @@ -866,8 +876,16 @@ СведенияОПодменюКоманды.ПоследняяКоманда = КомандаФормы; Если Команда.ЕстьУсловияВидимости Тогда СведенияОПодменюКоманды.ЕстьКомандыСУсловиямиВидимости = Истина; - СведенияОКоманде = Новый Структура("ИмяВФорме, ТипПараметра, УсловияВидимости, УсловияВидимостиПоТипамОбъектов"); + + СведенияОКоманде = Новый Структура; + СведенияОКоманде.Вставить("ИмяВФорме"); + СведенияОКоманде.Вставить("ТипПараметра"); + СведенияОКоманде.Вставить("УсловияВидимости"); + СведенияОКоманде.Вставить("УсловияВидимостиПоТипамОбъектов"); + СведенияОКоманде.Вставить("ПрефиксКоманд"); ЗаполнитьЗначенияСвойств(СведенияОКоманде, Команда); + + СведенияОКоманде.ПрефиксКоманд = ПрефиксКоманд; СведенияОПодменюКоманды.КомандыСУсловиямиВидимости.Добавить(СведенияОКоманде); ИначеЕсли Не Команда.ТолькоВоВсехДействиях Тогда СведенияОПодменюКоманды.ЕстьКомандыБезУсловийВидимости = Истина; @@ -1082,6 +1100,7 @@ Результат.Вставить("ДоступностьКоманд", Истина); Результат.Вставить("АдресТаблицыКоманд", Неопределено); Результат.Вставить("ВводНаОснованииЧерезПодключаемыеКоманды"); + Результат.Вставить("ВладельцыКоманд", Новый Массив); Форма.ПараметрыПодключаемыхКоманд = Результат; КонецЕсли; @@ -1094,6 +1113,8 @@ Результат = Новый Структура; Результат.Вставить("ЕстьВКоманднойПанели", Ложь); + Результат.Вставить("ПрефиксКоманд", ""); + Результат.Вставить("ДоступностьКоманд", Истина); Возврат Результат; @@ -1104,7 +1125,7 @@ ПутьДоРеквизита = СтрЗаменить(ПутьДоРеквизита, "НЕ ", ""); Идентификаторы = СтрРазделить(СтрЗаменить(ПутьДоРеквизита, "%ИСТОЧНИК%",""), "."); Для Каждого Элемент Из Идентификаторы Цикл - Если Не ИмяСоответствуетТребованиямИменованияСвойств(Элемент) Тогда + Если Не ОбщегоНазначенияКлиентСервер.ИмяСоответствуетТребованиямИменованияСвойств(Элемент) Тогда Возврат Ложь; КонецЕсли; КонецЦикла; @@ -1112,12 +1133,13 @@ Возврат Истина; КонецФункции -Функция ОписаниеКомандыНаКлиенте(Команда, КнопкаФормы) +Функция ОписаниеКомандыНаКлиенте(Команда, КнопкаФормы, ПрефиксКоманд) ОписаниеКоманды = Новый Структура; ОписаниеКоманды.Вставить("ИмяВФорме", КнопкаФормы.Имя); ОписаниеКоманды.Вставить("Вид", Команда.Вид); ОписаниеКоманды.Вставить("Идентификатор", Команда.Идентификатор); ОписаниеКоманды.Вставить("ЗначениеПометки", Команда.ЗначениеПометки); + ОписаниеКоманды.Вставить("ПрефиксКоманд", ПрефиксКоманд); Возврат ОписаниеКоманды; КонецФункции @@ -1133,11 +1155,13 @@ КонецЕсли; Подменю = Элементы.Добавить(ИмяПодменю, Тип("ГруппаФормы"), КоманднаяПанель); Подменю.Вид = ?(ЗначениеЗаполнено(ШаблонНового.ВидГруппыФормы), ШаблонНового.ВидГруппыФормы, ВидГруппыФормы.Подменю); + Если ЗначениеЗаполнено(ШаблонНового.Отображение) Тогда + Подменю.Отображение = ШаблонНового.Отображение; + КонецЕсли; Подменю.Заголовок = ШаблонНового.Заголовок; Если Подменю.Вид = ВидГруппыФормы.Подменю Тогда Подменю.Картинка = ШаблонНового.Картинка; КартинкаПодменю = Подменю.Картинка; - Подменю.Отображение = ШаблонНового.Отображение; КонецЕсли; Иначе ГруппаПоУмолчанию = Подменю; @@ -1201,6 +1225,7 @@ Результат.Группы = Группы; Результат.ВыведеноКоманд = ВыведеноКоманд; Результат.КартинкаПодменю = КартинкаПодменю; + Возврат Результат; КонецФункции @@ -1216,32 +1241,21 @@ Возврат Результат; КонецФункции -Функция ОпределитьИмяКоманды(Форма, ИмяГруппы, ИдентификаторКоманды, СчетчикКомандСАвтогенерируемымИменем) - Если ИмяСоответствуетТребованиямИменованияСвойств(ИдентификаторКоманды) Тогда - ИмяКоманды = ИмяГруппы + "_" + ИдентификаторКоманды; +Функция ОпределитьИмяКоманды(Форма, ИмяГруппы, ИдентификаторКоманды, СчетчикКомандСАвтогенерируемымИменем, ПрефиксКоманд) + Если ОбщегоНазначенияКлиентСервер.ИмяСоответствуетТребованиямИменованияСвойств(ИдентификаторКоманды) Тогда + ИмяКоманды = ИмяГруппы + "_" + ПрефиксКоманд + "_" + ИдентификаторКоманды; Иначе СчетчикКомандСАвтогенерируемымИменем = СчетчикКомандСАвтогенерируемымИменем + 1; - ИмяКоманды = ИмяГруппы + "_" + Формат(СчетчикКомандСАвтогенерируемымИменем, "ЧН=; ЧГ="); + ИмяКоманды = ИмяГруппы + "_" + ПрефиксКоманд + "_" + Формат(СчетчикКомандСАвтогенерируемымИменем, "ЧН=; ЧГ="); КонецЕсли; Пока Форма.Элементы.Найти(ИмяКоманды) <> Неопределено Или Форма.Команды.Найти(ИмяКоманды) <> Неопределено Цикл СчетчикКомандСАвтогенерируемымИменем = СчетчикКомандСАвтогенерируемымИменем + 1; - ИмяКоманды = ИмяГруппы + "_" + Формат(СчетчикКомандСАвтогенерируемымИменем, "ЧН=; ЧГ="); + ИмяКоманды = ИмяГруппы + "_" + ПрефиксКоманд + "_" + Формат(СчетчикКомандСАвтогенерируемымИменем, "ЧН=; ЧГ="); КонецЦикла; Возврат ИмяКоманды; КонецФункции -Функция ИмяСоответствуетТребованиямИменованияСвойств(Имя) - Буквы = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ"; - Цифры = "1234567890"; - - Если Имя = "" Или СтрНайти(Буквы + "_", ВРег(Лев(Имя, 1))) = 0 Тогда - Возврат Ложь; - КонецЕсли; - - Возврат СтрРазделить(ВРег(Имя), Буквы + Цифры + "_", Ложь).Количество() = 0; -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы. diff --git a/SSL/src/CommonModules/ПодключаемыеКомандыКлиент/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКомандыКлиент/Module.bsl index 7b455d183..f5a8df03d 100644 --- a/SSL/src/CommonModules/ПодключаемыеКомандыКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКомандыКлиент/Module.bsl @@ -16,15 +16,20 @@ // Источник - ТаблицаФормы // - ДанныеФормыСтруктура - объект или список формы с полем "Ссылка". // -Процедура НачатьВыполнениеКоманды(Форма, Команда, Источник) Экспорт +Процедура НачатьВыполнениеКоманды(Форма, Команда, Знач Источник = Неопределено) Экспорт ИмяКоманды = Команда.Имя; АдресНастроек = Форма.ПараметрыПодключаемыхКоманд.АдресТаблицыКоманд; ОписаниеКоманды = ПодключаемыеКомандыКлиентПовтИсп.ОписаниеКоманды(ИмяКоманды, АдресНастроек); + + Если Источник = Неопределено Тогда + Источник = ПодключаемыеКомандыКлиентСервер.ВладелецКомандыПоИмениКоманды(ИмяКоманды, Форма); + КонецЕсли; ПараметрыВыполнения = ПараметрыВыполненияКоманды(); ПараметрыВыполнения.ОписаниеКоманды = Новый Структура(ОписаниеКоманды); ПараметрыВыполнения.Форма = Форма; ПараметрыВыполнения.Источник = Источник; + ПараметрыВыполнения.ЭтоФормаОбъекта = ТипЗнч(Источник) = Тип("ДанныеФормыСтруктура"); // Служебные параметры. ПараметрыВыполнения.ТребуетсяЗапись = ПараметрыВыполнения.ЭтоФормаОбъекта И ОписаниеКоманды.РежимЗаписи <> "НеЗаписывать"; diff --git a/SSL/src/CommonModules/ПодключаемыеКомандыКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКомандыКлиентСервер/Module.bsl index 2824e592b..b76928b0d 100644 --- a/SSL/src/CommonModules/ПодключаемыеКомандыКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКомандыКлиентСервер/Module.bsl @@ -15,7 +15,7 @@ // Источник - ДанныеФормыСтруктура // - ТаблицаФормы - контекст для проверки условий (Форма.Объект или Форма.Элементы.Список). // -Процедура ОбновитьКоманды(Форма, Источник) Экспорт +Процедура ОбновитьКоманды(Форма, Знач Источник = Неопределено) Экспорт ПараметрыКлиента = ПараметрыПодключаемыхКоманд(Форма); Если ТипЗнч(ПараметрыКлиента) <> Тип("Структура") Тогда @@ -28,94 +28,20 @@ ПодменюСоздатьНаОсновании.Видимость = Ложь; КонецЕсли; КонецЕсли; - - Если ТипЗнч(Источник) = Тип("ТаблицаФормы") Тогда - ДоступностьКоманд = (Источник.ТекущаяСтрока <> Неопределено); - Иначе - ДоступностьКоманд = Истина; - КонецЕсли; - Если ДоступностьКоманд <> ПараметрыКлиента.ДоступностьКоманд Тогда - ПараметрыКлиента.ДоступностьКоманд = ДоступностьКоманд; - Для Каждого КорневоеПодменюИлиКоманда Из ПараметрыКлиента.КорневыеПодменюИКоманды Цикл - ИмяКнопкиИлиПодменю = КорневоеПодменюИлиКоманда.Ключ; - СвойстваКнопкиИлиПодменю = КорневоеПодменюИлиКоманда.Значение; - КнопкаИлиПодменю = Форма.Элементы[ИмяКнопкиИлиПодменю]; - КнопкаИлиПодменю.Доступность = ДоступностьКоманд; - Если ТипЗнч(КнопкаИлиПодменю) = Тип("ГруппаФормы") И КнопкаИлиПодменю.Вид = ВидГруппыФормы.Подменю Тогда - СкрытьПоказатьВсеПодчиненныеКнопки(КнопкаИлиПодменю, ДоступностьКоманд); - КомандаЗаглушка = Форма.Элементы.Найти(ИмяКнопкиИлиПодменю + "Заглушка"); - Если КомандаЗаглушка <> Неопределено Тогда - КомандаЗаглушка.Видимость = Не ДоступностьКоманд И СвойстваКнопкиИлиПодменю.ЕстьВКоманднойПанели; - КонецЕсли; - КонецЕсли; + + Если Источник = Неопределено Тогда + Для Каждого ПрефиксКоманд Из ПараметрыКлиента.ВладельцыКоманд Цикл + Источник = ВладелецКомандыПоПрефиксуКоманды(ПрефиксКоманд, Форма); + ОбновитьКомандыИсточника(Форма, Источник, ПрефиксКоманд); КонецЦикла; - КонецЕсли; - - Для каждого ОписаниеКоманды Из ПараметрыКлиента.КомандыСПометкой Цикл - Если ЗначениеЗаполнено(ОписаниеКоманды.ЗначениеПометки) Тогда - Если ТипЗнч(Источник) = Тип("ТаблицаФормы") Тогда - ВыражениеВычисленияЗначениеПометки = СтрЗаменить(ОписаниеКоманды.ЗначениеПометки, "%ИСТОЧНИК%", Источник.Имя); - Иначе - ВыражениеВычисленияЗначениеПометки = ОписаниеКоманды.ЗначениеПометки; - КонецЕсли; - - Форма.Элементы[ОписаниеКоманды.ИмяВФорме].Пометка = Вычислить(ВыражениеВычисленияЗначениеПометки); // АПК:488 Исполняемый код безопасен. - КонецЕсли; - КонецЦикла; - - Если Не ДоступностьКоманд Или Не ПараметрыКлиента.ЕстьУсловияВидимости Тогда + Возврат; + Иначе + ОбновитьКомандыИсточника(Форма, Источник); КонецЕсли; - ПроверятьОписаниеТипов = ТипЗнч(Источник) = Тип("ТаблицаФормы"); - ВыбранныеОбъекты = ВыбранныеОбъекты(Источник); + Возврат; - Для Каждого КраткиеСведенияОПодменю Из ПараметрыКлиента.ПодменюСУсловиямиВидимости Цикл - ЕстьВидимыеКоманды = Ложь; - Подменю = Форма.Элементы.Найти(КраткиеСведенияОПодменю.Имя); - ИзменятьВидимость = (ТипЗнч(Подменю) = Тип("ГруппаФормы") И Подменю.Вид = ВидГруппыФормы.Подменю); - СкрыватьКомандуРазблокировкиОбъекта = СкрыватьКомандуРазблокировкиОбъекта(Форма); - - Для Каждого Команда Из КраткиеСведенияОПодменю.КомандыСУсловиямиВидимости Цикл - КомандаЭлемент = Форма.Элементы[Команда.ИмяВФорме]; - Видимость = ВыбранныеОбъекты.Количество() > 0; - Для Каждого Объект Из ВыбранныеОбъекты Цикл - Если ПроверятьОписаниеТипов - И ТипЗнч(Команда.ТипПараметра) = Тип("ОписаниеТипов") - И Не Команда.ТипПараметра.СодержитТип(ТипЗнч(Объект.Ссылка)) Тогда - Видимость = Ложь; - Прервать; - КонецЕсли; - - Если ЗначениеЗаполнено(Команда.УсловияВидимостиПоТипамОбъектов) Тогда - УсловияВидимости = Команда.УсловияВидимостиПоТипамОбъектов[ТипЗнч(Объект.Ссылка)]; - Иначе - УсловияВидимости = Команда.УсловияВидимости; - КонецЕсли; - - Если ЗначениеЗаполнено(УсловияВидимости) И Не УсловияВыполняются(УсловияВидимости, Объект) Тогда - Видимость = Ложь; - Прервать; - КонецЕсли; - КонецЦикла; - - Если СкрыватьКомандуРазблокировкиОбъекта И ЭтоКомандаРазблокировкиОбъекта(Команда.УсловияВидимости) Тогда - КомандаЭлемент.Видимость = Ложь; - ИначеЕсли ИзменятьВидимость Тогда - КомандаЭлемент.Видимость = Видимость; - Иначе - КомандаЭлемент.Доступность = Видимость; - КонецЕсли; - ЕстьВидимыеКоманды = ЕстьВидимыеКоманды Или Видимость; - КонецЦикла; - - Если Не КраткиеСведенияОПодменю.ЕстьКомандыБезУсловийВидимости Тогда - КомандаЗаглушка = Форма.Элементы.Найти(КраткиеСведенияОПодменю.Имя + "Заглушка"); - Если КомандаЗаглушка <> Неопределено Тогда - КомандаЗаглушка.Видимость = Не ЕстьВидимыеКоманды; - КонецЕсли; - КонецЕсли; - КонецЦикла; КонецПроцедуры #КонецОбласти @@ -215,7 +141,7 @@ // ** КомандыСУсловиямиВидимости - Массив // ** ЕстьКомандыБезУсловийВидимости - Булево // * КомандыСПометкой - Массив -// * КорневыеПодменюИКоманды - Соответствие из см. ПодключаемыеКоманды.СвойстваКорневогоПодменюКоманды +// * КорневыеПодменюИКоманды - см. ПодключаемыеКоманды.СвойстваКорневогоПодменюКоманды // * ДоступностьКоманд - Булево // * АдресТаблицыКоманд - Строка // * ВводНаОснованииЧерезПодключаемыеКоманды - Булево @@ -276,4 +202,156 @@ Возврат Ложь; КонецФункции +Процедура ОбновитьКомандыИсточника(Знач Форма, Знач Источник, Знач ИмяИсточника = "") + + ПараметрыКлиента = ПараметрыПодключаемыхКоманд(Форма); + Если ТипЗнч(ПараметрыКлиента) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + Если ПараметрыКлиента.ВводНаОснованииЧерезПодключаемыеКоманды Тогда + ПодменюСоздатьНаОсновании = Форма.Элементы.Найти("ФормаСоздатьНаОсновании"); + Если ПодменюСоздатьНаОсновании <> Неопределено И ПодменюСоздатьНаОсновании.Видимость Тогда + ПодменюСоздатьНаОсновании.Видимость = Ложь; + КонецЕсли; + КонецЕсли; + + Если ТипЗнч(Источник) = Тип("ТаблицаФормы") Тогда + ДоступностьКоманд = (Источник.ТекущаяСтрока <> Неопределено); + Иначе + ДоступностьКоманд = Истина; + КонецЕсли; + + Для Каждого КорневоеПодменюИлиКоманда Из ПараметрыКлиента.КорневыеПодменюИКоманды Цикл + ИмяКнопкиИлиПодменю = КорневоеПодменюИлиКоманда.Ключ; + СвойстваКнопкиИлиПодменю = КорневоеПодменюИлиКоманда.Значение; + Если ЗначениеЗаполнено(ИмяИсточника) И СвойстваКнопкиИлиПодменю.ПрефиксКоманд <> ИмяИсточника Тогда + Продолжить; + КонецЕсли; + + КнопкаИлиПодменю = Форма.Элементы[ИмяКнопкиИлиПодменю]; + Если КнопкаИлиПодменю.Доступность = ДоступностьКоманд Тогда + Продолжить; + КонецЕсли; + + КнопкаИлиПодменю.Доступность = ДоступностьКоманд; + Если ТипЗнч(КнопкаИлиПодменю) = Тип("ГруппаФормы") И КнопкаИлиПодменю.Вид = ВидГруппыФормы.Подменю Тогда + СкрытьПоказатьВсеПодчиненныеКнопки(КнопкаИлиПодменю, ДоступностьКоманд); + КомандаЗаглушка = Форма.Элементы.Найти(ИмяКнопкиИлиПодменю + "Заглушка"); + Если КомандаЗаглушка <> Неопределено Тогда + КомандаЗаглушка.Видимость = Не ДоступностьКоманд И СвойстваКнопкиИлиПодменю.ЕстьВКоманднойПанели; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Для каждого ОписаниеКоманды Из ПараметрыКлиента.КомандыСПометкой Цикл + Если ЗначениеЗаполнено(ИмяИсточника) И ОписаниеКоманды.ПрефиксКоманд <> ИмяИсточника Тогда + Продолжить; + КонецЕсли; + Если ЗначениеЗаполнено(ОписаниеКоманды.ЗначениеПометки) Тогда + Если ТипЗнч(Источник) = Тип("ТаблицаФормы") Тогда + ВыражениеВычисленияЗначениеПометки = СтрЗаменить(ОписаниеКоманды.ЗначениеПометки, "%ИСТОЧНИК%", Источник.Имя); + Иначе + ВыражениеВычисленияЗначениеПометки = ОписаниеКоманды.ЗначениеПометки; + КонецЕсли; + + Форма.Элементы[ОписаниеКоманды.ИмяВФорме].Пометка = Вычислить(ВыражениеВычисленияЗначениеПометки); // АПК:488 Исполняемый код безопасен. + КонецЕсли; + КонецЦикла; + + Если Не ДоступностьКоманд Или Не ПараметрыКлиента.ЕстьУсловияВидимости Тогда + Возврат; + КонецЕсли; + + ПроверятьОписаниеТипов = ТипЗнч(Источник) = Тип("ТаблицаФормы"); + ВыбранныеОбъекты = ВыбранныеОбъекты(Источник); + + Для Каждого КраткиеСведенияОПодменю Из ПараметрыКлиента.ПодменюСУсловиямиВидимости Цикл + ЕстьВидимыеКоманды = Ложь; + Подменю = Форма.Элементы.Найти(КраткиеСведенияОПодменю.Имя); + ИзменятьВидимость = (ТипЗнч(Подменю) = Тип("ГруппаФормы") И Подменю.Вид = ВидГруппыФормы.Подменю); + СкрыватьКомандуРазблокировкиОбъекта = СкрыватьКомандуРазблокировкиОбъекта(Форма); + + Для Каждого Команда Из КраткиеСведенияОПодменю.КомандыСУсловиямиВидимости Цикл + Если ЗначениеЗаполнено(ИмяИсточника) И Команда.ПрефиксКоманд <> ИмяИсточника Тогда + Продолжить; + КонецЕсли; + + КомандаЭлемент = Форма.Элементы[Команда.ИмяВФорме]; + Видимость = ВыбранныеОбъекты.Количество() > 0; + Для Каждого Объект Из ВыбранныеОбъекты Цикл + Если ПроверятьОписаниеТипов + И ТипЗнч(Команда.ТипПараметра) = Тип("ОписаниеТипов") + И Не Команда.ТипПараметра.СодержитТип(ТипЗнч(Объект.Ссылка)) Тогда + Видимость = Ложь; + Прервать; + КонецЕсли; + + Если ЗначениеЗаполнено(Команда.УсловияВидимостиПоТипамОбъектов) Тогда + УсловияВидимости = Команда.УсловияВидимостиПоТипамОбъектов[ТипЗнч(Объект.Ссылка)]; + Иначе + УсловияВидимости = Команда.УсловияВидимости; + КонецЕсли; + + Если ЗначениеЗаполнено(УсловияВидимости) И Не УсловияВыполняются(УсловияВидимости, Объект) Тогда + Видимость = Ложь; + Прервать; + КонецЕсли; + КонецЦикла; + + Если СкрыватьКомандуРазблокировкиОбъекта И ЭтоКомандаРазблокировкиОбъекта(Команда.УсловияВидимости) Тогда + КомандаЭлемент.Видимость = Ложь; + ИначеЕсли ИзменятьВидимость Тогда + КомандаЭлемент.Видимость = Видимость; + Иначе + КомандаЭлемент.Доступность = Видимость; + КонецЕсли; + ЕстьВидимыеКоманды = ЕстьВидимыеКоманды Или Видимость; + КонецЦикла; + + Если Не КраткиеСведенияОПодменю.ЕстьКомандыБезУсловийВидимости Тогда + КомандаЗаглушка = Форма.Элементы.Найти(КраткиеСведенияОПодменю.Имя + "Заглушка"); + Если КомандаЗаглушка <> Неопределено Тогда + КомандаЗаглушка.Видимость = Не ЕстьВидимыеКоманды; + КонецЕсли; + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +Функция ВладелецКомандыПоИмениКоманды(ИмяКоманды, Форма) Экспорт + + Результат = Неопределено; + + ЧастиСтроки = СтрРазделить(ИмяКоманды, "_", Истина); + Если ЧастиСтроки.Количество() >= 4 Тогда + ТипВладельца = ЧастиСтроки[1]; + ИмяВладельца = ЧастиСтроки[2]; + + Результат = ВладелецКомандыПоПрефиксуКоманды(ТипВладельца + "_" + ИмяВладельца, Форма); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ВладелецКомандыПоПрефиксуКоманды(ПрефиксКоманды, Форма) + + Результат = Неопределено; + + ЧастиСтроки = СтрРазделить(ПрефиксКоманды, "_", Истина); + Если ЧастиСтроки.Количество() = 2 Тогда + ТипВладельца = ЧастиСтроки[0]; + ИмяВладельца = ЧастиСтроки[1]; + ЗначенияСвойств = Новый Структура(ИмяВладельца); + Если ТипВладельца = "Реквизит" Тогда + ЗаполнитьЗначенияСвойств(ЗначенияСвойств, Форма); + ИначеЕсли ТипВладельца = "Элемент" Тогда + ЗаполнитьЗначенияСвойств(ЗначенияСвойств, Форма.Элементы); + КонецЕсли; + Результат = ЗначенияСвойств[ИмяВладельца]; + КонецЕсли; + + Возврат Результат; + +КонецФункции #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ПодключаемыеКомандыПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКомандыПереопределяемый/Module.bsl index 482c4ae79..a76a8fd93 100644 --- a/SSL/src/CommonModules/ПодключаемыеКомандыПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКомандыПереопределяемый/Module.bsl @@ -167,6 +167,9 @@ // либо "<ИмяПроцедуры>" - в следующих случаях: // если ИмяФормы заполнено, то в модуле указанной формы ожидается клиентская процедура; // если ИмяФормы не заполнено, то в модуле менеджера этого объекта ожидается серверная процедура. +// В обработчик передаются два параметра: +// ## ПараметрКоманды - Массив из ЛюбаяСсылка - список объектов, для которых выполняется команда; +// ## ПараметрыВыполненияКоманды - см. ПодключаемыеКомандыКлиент.ПараметрыВыполненияКоманды // * ДополнительныеПараметры - Структура - параметры обработчика, указанного в Обработчик. Необязательный. // Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт diff --git a/SSL/src/CommonModules/ПодключаемыеКомандыПовтИсп/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКомандыПовтИсп/Module.bsl index d3512d6c3..5f5b9245a 100644 --- a/SSL/src/CommonModules/ПодключаемыеКомандыПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКомандыПовтИсп/Module.bsl @@ -55,4 +55,41 @@ КонецЦикла; КонецПроцедуры +Функция ВидыКоманд() Экспорт + + ВидыКоманд = Новый ТаблицаЗначений; + ВидыКоманд.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка")); + ВидыКоманд.Колонки.Добавить("ИмяПодменю", Новый ОписаниеТипов("Строка")); + ВидыКоманд.Колонки.Добавить("Заголовок", Новый ОписаниеТипов("Строка")); + ВидыКоманд.Колонки.Добавить("Порядок", Новый ОписаниеТипов("Число")); + ВидыКоманд.Колонки.Добавить("Картинка", Новый ОписаниеТипов("Картинка")); + ВидыКоманд.Колонки.Добавить("Отображение", Новый ОписаниеТипов("ОтображениеКнопки, ОтображениеГруппыКнопок")); + ВидыКоманд.Колонки.Добавить("ВидГруппыФормы"); + + ЗаполнениеОбъектов.ПриОпределенииВидовПодключаемыхКоманд(ВидыКоманд); + СозданиеНаОсновании.ПриОпределенииВидовПодключаемыхКоманд(ВидыКоманд); + ИнтеграцияПодсистемБСП.ПриОпределенииВидовПодключаемыхКоманд(ВидыКоманд); + ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд(ВидыКоманд); + + Для Каждого ВидКоманд Из ВидыКоманд Цикл + ПодключаемыеКоманды.ПроверитьИмяВидаКоманд(ВидКоманд.Имя); + Если Не ЗначениеЗаполнено(ВидКоманд.ИмяПодменю) Тогда + ВидКоманд.ИмяПодменю = "Подменю" + ВидКоманд.Имя; + КонецЕсли; + Если Не ЗначениеЗаполнено(ВидКоманд.Заголовок) Тогда + ВидКоманд.Заголовок = ВидКоманд.Имя; + КонецЕсли; + КонецЦикла; + + ВидКоманд = ВидыКоманд.Добавить(); + ВидКоманд.Имя = "КоманднаяПанель"; + ВидКоманд.ИмяПодменю = ""; + ВидКоманд.Порядок = 90; + + ВидыКоманд.Сортировать("Порядок Возр"); + + Возврат ВидыКоманд; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/ПоискИУдалениеДублей/Module.bsl b/SSL/src/CommonModules/ПоискИУдалениеДублей/Module.bsl index b2b8ddefa..e34194a2e 100644 --- a/SSL/src/CommonModules/ПоискИУдалениеДублей/Module.bsl +++ b/SSL/src/CommonModules/ПоискИУдалениеДублей/Module.bsl @@ -14,9 +14,7 @@ // ОбластьПоиска - Строка - имя таблицы данных (полное имя метаданных) области поиска. // Например, "Справочник.Номенклатура". Поддерживается поиск в справочниках, // планах видов характеристик, видах расчетов, планах счетов. -// -// ЭталонныйОбъект - Произвольный - объект с данными элемента, для которого производится поиск дублей. -// +// ЭталонныйОбъект - ЛюбаяСсылка, СправочникОбъект - элемент, для которого производится поиск дублей. // ДополнительныеПараметры - Произвольный - параметр для передачи в обработчики событий менеджера. // // Возвращаемое значение: @@ -25,8 +23,8 @@ // * Код - Строка // - Число - код элемента. // * Наименование - Строка - наименование элемента. -// * Родитель - Произвольный - родитель группы дублей. Если Родитель пустой, то элемент является -// родителем группы дублей. +// * Родитель - ЛюбаяСсылка - родитель группы дублей. Если Родитель пустой, то элемент является +// родителем группы дублей. // * ДругиеПоля - Произвольный - значение соответствующего полей отборов и критериев сравнения дублей. // Функция НайтиДублиЭлемента(Знач ОбластьПоиска, Знач ЭталонныйОбъект, Знач ДополнительныеПараметры) Экспорт @@ -43,7 +41,7 @@ // См. Обработка.ПоискИУдалениеДублей ПараметрыПоискаДублей.КомпоновщикПредварительногоОтбора = Новый КомпоновщикНастроекКомпоновкиДанных; - ОбластьПоискаМетаданные = Метаданные.НайтиПоПолномуИмени(ОбластьПоиска); + ОбластьПоискаМетаданные = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ОбластьПоиска); ДоступныеРеквизитыОтбора = ДоступныеИменаРеквизитовОтбора(ОбластьПоискаМетаданные.СтандартныеРеквизиты); ДоступныеРеквизитыОтбора = ?(ПустаяСтрока(ДоступныеРеквизитыОтбора), ",", ДоступныеРеквизитыОтбора) + ДоступныеИменаРеквизитовОтбора(ОбластьПоискаМетаданные.Реквизиты); @@ -59,14 +57,16 @@ НаборДанных.Запрос = ТекстЗапроса; НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; - ПараметрыПоискаДублей.КомпоновщикПредварительногоОтбора.Инициализировать( Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновки) ); + ПараметрыПоискаДублей.КомпоновщикПредварительногоОтбора.Инициализировать( + Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновки)); // Вызов прикладного кода ОбработкаПоиска = Обработки.ПоискИУдалениеДублей.Создать(); ИспользоватьПрикладныеПравила = ОбработкаПоиска.ЕстьПрикладныеПравилаОбластиПоискаДублей(ОбластьПоиска); Если ИспользоватьПрикладныеПравила Тогда - ПрикладныеПараметры = ПараметрыПоискаДублей(ПараметрыПоискаДублей.ПравилаПоиска, ПараметрыПоискаДублей.КомпоновщикПредварительногоОтбора); + ПрикладныеПараметры = ПараметрыПоискаДублей(ПараметрыПоискаДублей.ПравилаПоиска, + ПараметрыПоискаДублей.КомпоновщикПредварительногоОтбора); МенеджерОбластиПоиска = ОбработкаПоиска.МенеджерОбластиПоискаДублей(ОбластьПоиска); МенеджерОбластиПоиска.ПараметрыПоискаДублей(ПрикладныеПараметры, ДополнительныеПараметры); ПараметрыПоискаДублей.Вставить("ДополнительныеПараметры", ДополнительныеПараметры); @@ -117,8 +117,8 @@ КонецЕсли; ИспользуемыеСвязи.Сортировать("Ключ"); - МВТ = Новый МенеджерВременныхТаблиц; - ПоместитьТаблицыЗаменВЗапрос(МВТ, ТаблицыЗамен); + МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + ПоместитьТаблицыЗаменВЗапрос(МенеджерВременныхТаблиц, ТаблицыЗамен); ТаблицыНайденныхДублей = Новый Соответствие; ЧастиПакета = Новый Массив; @@ -129,17 +129,15 @@ ОписаниеПодчиненногоОбъекта = ОписаниеПодчиненныхОбъектов[ИмяПодчиненногоОбъекта]; Фильтр = Новый Структура("Ключ, Используется", ИмяПодчиненногоОбъекта, Истина); СвязиПодчиненногоОбъекта = СвязиПодчиненныхОбъектов.НайтиСтроки(Фильтр); - ЧастиПакета.Добавить(ТекстЗапросаОбъектовДляЗамены( - ОписаниеПодчиненногоОбъекта - ,СвязиПодчиненногоОбъекта)); + ЧастиПакета.Добавить(ТекстЗапросаОбъектовДляЗамены( ОписаниеПодчиненногоОбъекта, СвязиПодчиненногоОбъекта)); - ТаблицыНайденныхДублей.Вставить(ОписаниеПодчиненногоОбъекта.Ключ, ЧастиПакета.Количество()*3-1);// 3 - количество добавляемых пакетов + ТаблицыНайденныхДублей.Вставить(ОписаниеПодчиненногоОбъекта.Ключ, ЧастиПакета.Количество() * 3 - 1); // 3 - количество добавляемых пакетов Позиция = Позиция + СвязиПодчиненногоОбъекта.Количество(); КонецЦикла; Запрос = Новый Запрос; - Запрос.МенеджерВременныхТаблиц = МВТ; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; Запрос.Текст = СтрСоединить(ЧастиПакета, ОбщегоНазначения.РазделительПакетаЗапросов()); Результат = Запрос.ВыполнитьПакет(); @@ -153,19 +151,93 @@ Если ЗначениеЗаполнено(ОписаниеПодчиненногоОбъекта.ИмяМодуляМетодаПоиска) И НеподобранныеЗамены.Количество() > 0 Тогда - - ВыполнитьПоискПоПрикладнымПравилам( - ИспользуемыеСвязи, - НеподобранныеЗамены, - ОписаниеПодчиненногоОбъекта, + ВыполнитьПоискПоПрикладнымПравилам(ИспользуемыеСвязи, НеподобранныеЗамены, ОписаниеПодчиненногоОбъекта, ПарыЗамен); - КонецЕсли; КонецЦикла; КонецПроцедуры +// Выполняет поиск всех вхождений заданной строки в переданном массиве строк. +// +// Параметры: +// ИсходнаяСтрока - Строка - набор строк, разделенных символом разделителя (параметр Разделитель), +// в которых выполняется поиск. +// СтрокаПоиска - Строка - строка, вхождение которой необходимо найти. +// Разделитель - Строка - символ, используемый для разделения исходной строки на элементы. +// Требуется передавать, если исходная строка состоит из массива строк. +// ПараметрыПоиска - см. ПараметрыПоискаПохожихСтрок. +// +// Пример: +// ИсходнаяСтрока = "Токарный станок~Вентилятор настольный~Стол обеденный~Стул обеденный"; +// ИндексыПохожихСтрок = ПоискИУдалениеДублей.НайтиПохожиеСтроки(ИсходнаяСтрока, "Стол обеденный"); +// // Для данного набора из четырех строк при поиске строк похожих на "Стол обеденный" +// // результатом будет "2,3", т.е. строки "Стол обеденный" и "Стул обеденный". +// +// Возвращаемое значение: +// Строка - индексы дублей строк, разделенные запятыми. Нумерация начинается с 0. +// +Функция НайтиПохожиеСтроки(ИсходнаяСтрока, СтрокаПоиска, Разделитель = "~", ПараметрыПоиска = Неопределено) Экспорт + + СоздатьКомпоненту = ТипЗнч(ПараметрыПоиска) <> Тип("Структура") + Или Не ПараметрыПоиска.Свойство("КомпонентаПоиска") + Или ПараметрыПоиска.КомпонентаПоиска = Неопределено; + + СравнениеСтрокНаПодобие = ПараметрыПоискаПохожихСтрок(СоздатьКомпоненту); + + Если ТипЗнч(ПараметрыПоиска) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(СравнениеСтрокНаПодобие, ПараметрыПоиска, , ?(СоздатьКомпоненту, "КомпонентаПоиска", "")); + КонецЕсли; + + КомпонентаПоиска = СравнениеСтрокНаПодобие.КомпонентаПоиска; + + СловаИсключения = НРег(СтрСоединить(СравнениеСтрокНаПодобие.СловаИсключения, Разделитель)); + + ИндексыСтрок = КомпонентаПоиска.StringSearch(НРег(СтрокаПоиска), НРег(ИсходнаяСтрока), "~", + СравнениеСтрокНаПодобие.ДлинаНебольшихСтрок, СравнениеСтрокНаПодобие.ПроцентСовпаденияНебольшихСтрок, + СравнениеСтрокНаПодобие.ПроцентСовпаденияСтрок, СловаИсключения); + + Возврат ИндексыСтрок; + +КонецФункции + +// Возвращает параметры для функции НайтиПохожиеСтроки. +// +// Параметры: +// ПодключитьКомпоненту - Булево - если Истина, выполняется подключение компоненты поиска строк. +// Для для целей оптимизации, если планируется многократный вызов функции +// поиска похожих строк. +// +// Возвращаемое значение: +// Структура: +// * ПроцентСовпаденияСтрок - Число - по умолчанию 90 +// * ПроцентСовпаденияНебольшихСтрок - Число - по умолчанию 80 +// * ДлинаНебольшихСтрок - Число - по умолчанию 30 +// * СловаИсключения - Массив +// * КомпонентаПоиска - ОбъектВнешнейКомпоненты +// +Функция ПараметрыПоискаПохожихСтрок(ПодключитьКомпоненту = Истина) Экспорт + + СравнениеСтрокНаПодобие = Новый Структура; + СравнениеСтрокНаПодобие.Вставить("ПроцентСовпаденияСтрок", 90); + СравнениеСтрокНаПодобие.Вставить("ПроцентСовпаденияНебольшихСтрок", 80); + СравнениеСтрокНаПодобие.Вставить("ДлинаНебольшихСтрок", 30); + СравнениеСтрокНаПодобие.Вставить("СловаИсключения", Новый Массив); + Если ПодключитьКомпоненту Тогда + НечеткийПоиск = ОбщегоНазначения.ПодключитьКомпонентуИзМакета("FuzzyStringMatchExtension", "ОбщийМакет.КомпонентаПоискаСтрок"); + Если НечеткийПоиск = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Не удалось подключить компоненту нечеткого поиска. Подробнее см. в журнале регистрации.'"); + КонецЕсли; + СравнениеСтрокНаПодобие.Вставить("КомпонентаПоиска", НечеткийПоиск); + Иначе + СравнениеСтрокНаПодобие.Вставить("КомпонентаПоиска", Неопределено); + КонецЕсли; + + Возврат СравнениеСтрокНаПодобие; + +КонецФункции + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -210,12 +282,14 @@ ИмяОбъектаМетаданных = ПервыйЭлемент.Метаданные().ПолноеИмя(); СведенияОбОбъекте = ОбъектыСПоискомДублей()[ИмяОбъектаМетаданных]; - Если СведенияОбОбъекте <> Неопределено И (СведенияОбОбъекте = "" Или СтрНайти(СведенияОбОбъекте, "ВозможностьЗаменыЭлементов") > 0) Тогда + Если СведенияОбОбъекте <> Неопределено И (СведенияОбОбъекте = "" + Или СтрНайти(СведенияОбОбъекте, "ВозможностьЗаменыЭлементов") > 0) Тогда МодульМенеджера = ОбщегоНазначения.МенеджерОбъектаПоСсылке(ПервыйЭлемент); Результат = МодульМенеджера.ВозможностьЗаменыЭлементов(ПарыЗамен, ПараметрыЗамены); КонецЕсли; - ПоискИУдалениеДублейПереопределяемый.ПриОпределенииВозможностиЗаменыЭлементов(ИмяОбъектаМетаданных, ПарыЗамен, ПараметрыЗамены, Результат); + ПоискИУдалениеДублейПереопределяемый.ПриОпределенииВозможностиЗаменыЭлементов(ИмяОбъектаМетаданных, ПарыЗамен, + ПараметрыЗамены, Результат); Возврат Результат; КонецФункции @@ -790,17 +864,15 @@ ТаблицаЗамен = ТаблицыЗамен[КлючПоиска]; Если ТаблицаЗамен = Неопределено Тогда - ТекстЗапроса = "ВЫБРАТЬ - | Таб.Ссылка КАК Оригинал, - | Таб.Ссылка КАК Дубль - |ИЗ - | #ИмяТаблицыКлючевогоРеквизита КАК Таб - |ГДЕ - | ЛОЖЬ"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ИмяТаблицыКлючевогоРеквизита", ИмяТаблицыКлючевогоРеквизита); - ЗапросТаблицы = Новый Запрос(ТекстЗапроса); - ТаблицаЗамен = ЗапросТаблицы.Выполнить().Выгрузить(); - ТаблицыЗамен.Вставить(КлючПоиска, ТаблицаЗамен); + Типы = Новый Массив; + Типы.Добавить(ТипЗнч(ОригиналДубль.Ключ)); + ТипСсылкиОригинала = Новый ОписаниеТипов(Типы); + + ТаблицаЗамен = Новый ТаблицаЗначений; + ТаблицаЗамен.Колонки.Добавить("Оригинал", ТипСсылкиОригинала); + ТаблицаЗамен.Колонки.Добавить("Дубль", ТипСсылкиОригинала); + + ТаблицыЗамен.Вставить(КлючПоиска, ТаблицаЗамен); КонецЕсли; СтрокаЗамены = ТаблицаЗамен.Добавить(); @@ -809,13 +881,13 @@ КонецПроцедуры -Процедура ПоместитьТаблицыЗаменВЗапрос(МВТ, ТаблицыЗамен) +Процедура ПоместитьТаблицыЗаменВЗапрос(МенеджерВременныхТаблиц, ТаблицыЗамен) ЧастиЗапроса = Новый Массив; Разделитель = Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС; Запрос = Новый Запрос; - Запрос.МенеджерВременныхТаблиц = МВТ; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; ТекстЗапроса = " |ВЫБРАТЬ diff --git a/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl b/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl index 9bf70dbdd..e6d09d93d 100644 --- a/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl +++ b/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl @@ -391,7 +391,7 @@ "НаправлениеПоиска", "ПерваяЧасть", "ПредыдущаяЧасть", "СледующаяЧасть"); КонецЕсли; Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КодОшибки = "ОшибкаПоиска"; КонецПопытки; @@ -622,7 +622,7 @@ ТекстДляЖурнала = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстДляЖурнала, Параметр); КонецЕсли; Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда - ТекстДляЖурнала = ТекстДляЖурнала + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстДляЖурнала = ТекстДляЖурнала + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); ИначеЕсли ТипЗнч(ИнформацияОбОшибке) = Тип("Строка") Тогда ТекстДляЖурнала = ТекстДляЖурнала + Символы.ПС + ИнформацияОбОшибке; КонецЕсли; diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl index e96e2ac00..6e9363580 100644 --- a/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl @@ -223,6 +223,11 @@ АдресСервераРесурса = СтруктураСсылки.Хост; АдресСервераКонтрольнойПроверки = "google.com"; + Если Метаданные.ОбщиеМодули.Найти("ПолучениеФайловИзИнтернетаСлужебныйЛокализация") <> Неопределено Тогда + МодульПолучениеФайловИзИнтернетаСлужебныйЛокализация = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаСлужебныйЛокализация"); + АдресСервераКонтрольнойПроверки = МодульПолучениеФайловИзИнтернетаСлужебныйЛокализация.АдресСервераКонтрольнойПроверки(); + КонецЕсли; + РезультатДоступностиРесурса = ПолучениеФайловИзИнтернетаСлужебный.ПроверитьДоступностьСервера(АдресСервераРесурса); Журнал.Добавить(); diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl index c8fe07222..7d247f009 100644 --- a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl @@ -278,7 +278,7 @@ |Результат диагностики: |%5'"), URL, Сервер, Формат(Порт, "ЧГ="), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), РезультатДиагностики.ОписаниеОшибки); Если ЗаписыватьОшибку Тогда @@ -353,7 +353,7 @@ |Результат диагностики: |%4'"), Сервер, Формат(Порт, "ЧГ="), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), РезультатДиагностики.ОписаниеОшибки); ДописатьПредставлениеПеренаправлений(Перенаправления, ТекстОшибки); @@ -475,7 +475,7 @@ |по причине: |%4'"), URL, Сервер, Формат(Порт, "ЧГ="), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ДописатьПредставлениеПеренаправлений(Перенаправления, ТекстОшибки); @@ -645,7 +645,7 @@ ИначеЕсли КодСостояния = 429 Тогда // Too Many Requests Расшифровка = НСтр("ru = 'Слишком много запросов за короткое время.'"); ИначеЕсли КодСостояния = 500 Тогда // Internal Server Error - Расшифровка = НСтр("ru = 'Внутренняя ошибка сервера.'"); + Расшифровка = НСтр("ru = 'Внутренняя ошибка интернет-сервера.'"); ИначеЕсли КодСостояния = 501 Тогда // Not Implemented Расшифровка = НСтр("ru = 'Сервер не поддерживает метод запроса.'"); ИначеЕсли КодСостояния = 502 Тогда // Bad Gateway @@ -826,14 +826,17 @@ // Возвращает прокси по настройкам НастройкаПроксиСервера для заданного протокола Протокол. // // Параметры: -// НастройкаПроксиСервера - Соответствие: -// ИспользоватьПрокси - использовать ли прокси-сервер. +// НастройкаПроксиСервера - Соответствие из КлючЗначение: +// * Ключ - Строка - см. ниже список возможных ключей. +// * Значение - Произвольный +// ИспользоватьПрокси - Булево - использовать ли прокси-сервер. // НеИспользоватьПроксиДляЛокальныхАдресов - использовать ли прокси-сервер для локальных адресов. -// ИспользоватьСистемныеНастройки - использовать ли системные настройки прокси-сервера. -// Сервер - адрес прокси-сервера. -// Порт - порт прокси-сервера. -// Пользователь - имя пользователя для авторизации на прокси-сервере. -// Пароль - пароль пользователя. +// НеИспользоватьПроксиДляАдресов - Массив из Строка +// ИспользоватьСистемныеНастройки - Булево - использовать ли системные настройки прокси-сервера. +// Сервер - Строка - адрес прокси-сервера. +// Порт - Строка - порт прокси-сервера. +// Пользователь - Строка - имя пользователя для авторизации на прокси-сервере. +// Пароль - Строка - пароль пользователя. // ИспользоватьАутентификациюОС - Булево - признак использования аутентификации средствами операционной системы. // URLИлиПротокол - Строка - адрес ресурса или протокол, для которого устанавливаются параметры прокси сервера, // например "https://1c.ru", "http", "https", "ftp", "ftps". @@ -1023,7 +1026,7 @@ |%2 | |с помощью команды ""%3"".'"), - АдресСервера, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), СтрокаКоманды); + АдресСервера, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), СтрокаКоманды); Возврат Результат; КонецПопытки; diff --git a/SSL/src/CommonModules/ВызовОнлайнПоддержкиПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебныйЛокализация/Module.bsl similarity index 54% rename from SSL/src/CommonModules/ВызовОнлайнПоддержкиПереопределяемый/Module.bsl rename to SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебныйЛокализация/Module.bsl index b71beca23..fa078f653 100644 --- a/SSL/src/CommonModules/ВызовОнлайнПоддержкиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебныйЛокализация/Module.bsl @@ -6,14 +6,12 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// -#Область ПрограммныйИнтерфейс +#Область СлужебныеПроцедурыИФункции -// Вызывается при изменении настроек кнопки запуска онлайн-поддержки. -// Процедуру можно использовать для настройки видимости формы, -// на которой расположена кнопка запуска онлайн-поддержки. -// -Процедура ПриИзмененииНастроек() Экспорт +Функция АдресСервераКонтрольнойПроверки() Экспорт -КонецПроцедуры + Возврат "ya.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..2bc3631fc --- /dev/null +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебныйЛокализация/ПолучениеФайловИзИнтернетаСлужебныйЛокализация.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="b2bd5a0e-d60c-411d-a001-ecdee0152b1a"> + <name>ПолучениеФайловИзИнтернетаСлужебныйЛокализация</name> + <synonym> + <key>ru</key> + <value>Получение файлов из интернета служебный локализация</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/Пользователи/Module.bsl b/SSL/src/CommonModules/Пользователи/Module.bsl index 53b97183f..235cd2c4c 100644 --- a/SSL/src/CommonModules/Пользователи/Module.bsl +++ b/SSL/src/CommonModules/Пользователи/Module.bsl @@ -136,12 +136,12 @@ // Для текущего пользователя ИБ проверяются роли не в записанном пользователе ИБ, // а роли в текущем сеансе. Если ПроверитьРольПолныеПрава - И Не СвойстваПользователяИБ.РольДоступнаПолныеПрава Тогда // Не заменять на РолиДоступны. + И Не СвойстваПользователяИБ.РольДоступнаПолныеПрава Тогда Возврат Ложь; КонецЕсли; Если ПроверитьРольАдминистратораСистемы - И Не СвойстваПользователяИБ.РольДоступнаАдминистраторСистемы Тогда // Не заменять на РолиДоступны. + И Не СвойстваПользователяИБ.РольДоступнаАдминистраторСистемы Тогда Возврат Ложь; КонецЕсли; @@ -206,10 +206,12 @@ Если СвойстваПользователяИБ.УказанТекущийПользовательИБ Тогда Для Каждого ИмяРоли Из МассивИменРолей Цикл + // АПК:336-выкл Не заменять на РолиДоступны. Проверка ролей в функции РолиДоступны. //@skip-check using-isinrole - Если РольДоступна(СокрЛП(ИмяРоли)) Тогда // Не заменять на РолиДоступны. + Если РольДоступна(СокрЛП(ИмяРоли)) Тогда Возврат Истина; КонецЕсли; + // АПК:336-вкл КонецЦикла; Иначе Роли = СвойстваПользователяИБ.ПользовательИБ.Роли; @@ -225,13 +227,17 @@ КонецФункции // Проверяет наличие хотя бы одного вида аутентификации у пользователя ИБ. +// Поддерживается вызов из сеанса без установленных разделителей (без обращения к базе данных), +// если параметр ОписаниеПользователяИБ имеет тип ПользовательИнформационнойБазы или Структура. // // Параметры: // ОписаниеПользователяИБ - УникальныйИдентификатор - идентификатор пользователя ИБ. -// - Структура - содержит 3 свойства аутентификации: -// * АутентификацияСтандартная - Булево - аутентификация 1С:Предприятия. -// * АутентификацияОС - Булево - аутентификация операционной системы. -// * АутентификацияOpenID - Булево - аутентификация OpenID. +// - Структура - содержит свойства аутентификации: +// * АутентификацияСтандартная - Булево - аутентификация 1С:Предприятия. +// * АутентификацияОС - Булево - аутентификация операционной системы. +// * АутентификацияOpenID - Булево - аутентификация OpenID. +// * АутентификацияOpenIDConnect - Булево - аутентификация OpenID-Connect. +// * АутентификацияТокеномДоступа - Булево - аутентификация JWT-токеном. // - ПользовательИнформационнойБазы - пользователь ИБ. // - СправочникСсылка.Пользователи - пользователь. // - СправочникСсылка.ВнешниеПользователи - внешний пользователь. @@ -270,8 +276,38 @@ КонецЕсли; Возврат ПользовательИБ.АутентификацияСтандартная - ИЛИ ПользовательИБ.АутентификацияОС - ИЛИ ПользовательИБ.АутентификацияOpenID; + Или ПользовательИБ.АутентификацияOpenID + Или ПользовательИБ.АутентификацияOpenIDConnect + Или ПользовательИБ.АутентификацияТокеномДоступа + Или ПользовательИБ.АутентификацияОС; + +КонецФункции + +// Проверяет, что у пользователя ИБ есть права для входа в программу интерактивно или через COM-объект. +// Поддерживается вызов из сеанса без установленных разделителей (без обращения к базе данных). +// +// Параметры: +// ПользовательИБ - ПользовательИнформационнойБазы +// Интерактивно - Булево - когда Истина, тогда не учитываются права, например, ВнешнееСоединение, Automation. +// +// Возвращаемое значение: +// Булево +// +Функция ЕстьПраваДляВходаВПрограмму(ПользовательИБ, Интерактивно = Истина) Экспорт + + Результат = + ПравоДоступа("ТонкийКлиент", Метаданные, ПользовательИБ) + Или ПравоДоступа("ВебКлиент", Метаданные, ПользовательИБ) + Или ПравоДоступа("МобильныйКлиент", Метаданные, ПользовательИБ) + Или ПравоДоступа("ТолстыйКлиент", Метаданные, ПользовательИБ); + + Если Не Интерактивно Тогда + Результат = Результат + Или ПравоДоступа("Automation", Метаданные, ПользовательИБ) + Или ПравоДоступа("ВнешнееСоединение", Метаданные, ПользовательИБ); + КонецЕсли; + + Возврат Результат; КонецФункции @@ -304,6 +340,34 @@ КонецФункции +// Возвращает Истина, если определяемый тип ФизическоеЛицо содержит +// тип отличный от Строка и в процедуре ПриОпределенииНастроек +// общего модуля ПользователиПереопределяемый настроено +// использовать реквизит ФизическоеЛицо. +// +// Возвращаемое значение: +// Булево +// +Функция ФизическоеЛицоИспользуется() Экспорт + + Возврат ПользователиСлужебныйПовтИсп.Настройки().ФизическоеЛицоИспользуется; + +КонецФункции + +// Возвращает Истина, если определяемый тип Подразделение содержит +// тип отличный от Строка и в процедуре ПриОпределенииНастроек +// общего модуля ПользователиПереопределяемый настроено +// использовать реквизит Подразделение. +// +// Возвращаемое значение: +// Булево +// +Функция ПодразделениеИспользуется() Экспорт + + Возврат ПользователиСлужебныйПовтИсп.Настройки().ПодразделениеИспользуется; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции, используемые в работе элементов управляемых форм. @@ -335,21 +399,25 @@ ВключаяГруппы = ВключаяГруппы И ПолучитьФункциональнуюОпцию("ИспользоватьГруппыПользователей"); Запрос = Новый Запрос( - "ВЫБРАТЬ РАЗРЕШЕННЫЕ + "ВЫБРАТЬ | ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) КАК Ссылка, | """" КАК Наименование, | -1 КАК НомерКартинки |ГДЕ | ЛОЖЬ"); - Если НЕ БезПользователей Тогда + Если Не БезПользователей + И ПравоДоступа("Чтение", Метаданные.Справочники.Пользователи)Тогда + ТекстЗапроса = "ВЫБРАТЬ - | Пользователи.Ссылка, - | Пользователи.Наименование, - | 1 КАК НомерКартинки + | Пользователи.Ссылка КАК Ссылка, + | Пользователи.Наименование КАК Наименование, + | ЕСТЬNULL(СведенияОПользователях.НомерКартинкиСостояния, 0) - 1 КАК НомерКартинки |ИЗ | Справочник.Пользователи КАК Пользователи + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях + | ПО СведенияОПользователях.Пользователь = Пользователи.Ссылка |ГДЕ | Пользователи.Наименование ПОДОБНО &Текст СПЕЦСИМВОЛ ""~"" | И Пользователи.Недействителен = ЛОЖЬ @@ -360,7 +428,11 @@ |ВЫБРАТЬ | ГруппыПользователей.Ссылка, | ГруппыПользователей.Наименование, - | 3 + | ВЫБОР + | КОГДА ГруппыПользователей.ПометкаУдаления + | ТОГДА 2 + | ИНАЧЕ 3 + | КОНЕЦ |ИЗ | Справочник.ГруппыПользователей КАК ГруппыПользователей |ГДЕ @@ -382,13 +454,15 @@ Если ВключаяВнешнихПользователей Тогда ТекстЗапроса = "ВЫБРАТЬ - | ВнешниеПользователи.Ссылка, - | ВнешниеПользователи.Наименование, - | 7 КАК НомерКартинки + | ВнешниеПользователи.Ссылка КАК Ссылка, + | ВнешниеПользователи.Наименование КАК Наименование, + | ЕСТЬNULL(СведенияОПользователях.НомерКартинкиСостояния, 0) - 1 КАК НомерКартинки |ИЗ | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях + | ПО СведенияОПользователях.Пользователь = ВнешниеПользователи.Ссылка |ГДЕ - | ВнешниеПользователи.Наименование ПОДОБНО &Текст + | ВнешниеПользователи.Наименование ПОДОБНО &Текст СПЕЦСИМВОЛ ""~"" | И ВнешниеПользователи.Недействителен = ЛОЖЬ | |ОБЪЕДИНИТЬ ВСЕ @@ -396,22 +470,29 @@ |ВЫБРАТЬ | ГруппыВнешнихПользователей.Ссылка, | ГруппыВнешнихПользователей.Наименование, - | 9 + | ВЫБОР + | КОГДА ГруппыВнешнихПользователей.ПометкаУдаления + | ТОГДА 8 + | ИНАЧЕ 9 + | КОНЕЦ |ИЗ | Справочник.ГруппыВнешнихПользователей КАК ГруппыВнешнихПользователей |ГДЕ | &ВключаяГруппы - | И ГруппыВнешнихПользователей.Наименование ПОДОБНО &Текст"; + | И ГруппыВнешнихПользователей.Наименование ПОДОБНО &Текст СПЕЦСИМВОЛ ""~"""; Запрос.Текст = Запрос.Текст + " ОБЪЕДИНИТЬ ВСЕ " + ТекстЗапроса; КонецЕсли; + УстановитьПривилегированныйРежим(Истина); Выборка = Запрос.Выполнить().Выбрать(); + УстановитьПривилегированныйРежим(Ложь); ДанныеВыбора = Новый СписокЗначений; Пока Выборка.Следующий() Цикл - ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Наименование, , БиблиотекаКартинок["СостояниеПользователя" + Формат(Выборка.НомерКартинки + 1, "ЧЦ=2; ЧВН=; ЧГ=")]); + ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Наименование, , + БиблиотекаКартинок["СостояниеПользователя" + Формат(Выборка.НомерКартинки + 1, "ЧЦ=2; ЧВН=; ЧГ=")]); КонецЦикла; Возврат ДанныеВыбора; @@ -502,7 +583,8 @@ ТаблицаПользователей = ТаблицаИлиДерево.Выгрузить(МассивСтрок, ИмяПоляПользователь); КонецЕсли; - Запрос = Новый Запрос(СтрЗаменить( + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | Пользователи.ИмяПоляПользователь КАК Пользователь |ПОМЕСТИТЬ Пользователи @@ -512,16 +594,12 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | Пользователи.Пользователь, + | Пользователи.Пользователь КАК Пользователь, | ВЫБОР | КОГДА Пользователи.Пользователь = НЕОПРЕДЕЛЕНО | ТОГДА -1 | КОГДА ТИПЗНАЧЕНИЯ(Пользователи.Пользователь) = ТИП(Справочник.Пользователи) - | ТОГДА ВЫБОР - | КОГДА ВЫРАЗИТЬ(Пользователи.Пользователь КАК Справочник.Пользователи).ПометкаУдаления - | ТОГДА 0 - | ИНАЧЕ 1 - | КОНЕЦ + | ТОГДА ЕСТЬNULL(СведенияОПользователях.НомерКартинкиСостояния, 0) - 1 | КОГДА ТИПЗНАЧЕНИЯ(Пользователи.Пользователь) = ТИП(Справочник.ГруппыПользователей) | ТОГДА ВЫБОР | КОГДА ВЫРАЗИТЬ(Пользователи.Пользователь КАК Справочник.ГруппыПользователей).ПометкаУдаления @@ -529,11 +607,7 @@ | ИНАЧЕ 3 | КОНЕЦ | КОГДА ТИПЗНАЧЕНИЯ(Пользователи.Пользователь) = ТИП(Справочник.ВнешниеПользователи) - | ТОГДА ВЫБОР - | КОГДА ВЫРАЗИТЬ(Пользователи.Пользователь КАК Справочник.ВнешниеПользователи).ПометкаУдаления - | ТОГДА 6 - | ИНАЧЕ 7 - | КОНЕЦ + | ТОГДА ЕСТЬNULL(СведенияОПользователях.НомерКартинкиСостояния, 0) - 1 | КОГДА ТИПЗНАЧЕНИЯ(Пользователи.Пользователь) = ТИП(Справочник.ГруппыВнешнихПользователей) | ТОГДА ВЫБОР | КОГДА ВЫРАЗИТЬ(Пользователи.Пользователь КАК Справочник.ГруппыВнешнихПользователей).ПометкаУдаления @@ -543,7 +617,11 @@ | ИНАЧЕ -2 | КОНЕЦ КАК НомерКартинки |ИЗ - | Пользователи КАК Пользователи", "ИмяПоляПользователь", ИмяПоляПользователь)); + | Пользователи КАК Пользователи + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях + | ПО СведенияОПользователях.Пользователь = Пользователи.Пользователь"; + + Запрос.Текст = СтрЗаменить(Запрос.Текст, "ИмяПоляПользователь", ИмяПоляПользователь); Запрос.УстановитьПараметр("Пользователи", ТаблицаПользователей); НомераКартинок = Запрос.Выполнить().Выгрузить(); @@ -827,30 +905,38 @@ // * Имя - Строка - имя пользователя информационной базы. Например, "Иванов". // * ПолноеИмя - Строка - полное имя пользователя информационной базы. // Например, "Иванов Иван Иванович (менеджер по продажам)". -// * АутентификацияOpenID - Булево - разрешена ли пользователю аутентификация по протоколу OpenID. +// * АдресЭлектроннойПочты - Строка - адрес электронной почты (например, для восстановления пароля). // -// * АутентификацияСтандартная - Булево - разрешена ли стандартная аутентификация (по пользователю и паролю). -// * ПоказыватьВСпискеВыбора - Булево - показывать ли полное имя пользователя в списке для выбора при запуске. -// * Пароль - Строка -// - Неопределено - пароль, используемый при стандартной аутентификации. -// * СохраняемоеЗначениеПароля - Строка -// - Неопределено - хранимые значения пароля (хеш). -// * ПарольУстановлен - Булево - установлен ли пароль у пользователя. -// * ЗапрещеноИзменятьПароль - Булево - определяет возможность пользователя изменять свой пароль. +// * АутентификацияСтандартная - Булево - разрешена ли стандартная аутентификация (по пользователю и паролю). +// * ПоказыватьВСпискеВыбора - Булево - показывать ли полное имя пользователя в списке для выбора при запуске. +// * Пароль - Строка - пароль, используемый при стандартной аутентификации. +// - Неопределено - после чтения, при установке означает не менять пароль. +// * СохраняемоеЗначениеПароля - Строка - хранимое значение пароля (хеш). +// - Неопределено - при установке означает не менять сохраняемое значение. +// * ПарольУстановлен - Булево - установлен ли пароль у пользователя. +// * ЗапрещеноИзменятьПароль - Булево - определяет возможность пользователя изменять свой пароль. +// * ЗапрещеноВосстанавливатьПароль - Булево - определяет возможность пользователя восстанавливать свой пароль. +// +// * АутентификацияOpenID - Булево - разрешена ли аутентификация по протоколу OpenID. +// * АутентификацияOpenIDConnect - Булево - разрешена ли аутентификация по протоколу OpenID-Connect. +// * АутентификацияТокеномДоступа - Булево - разрешена ли аутентификация JWT-токеном. // // * АутентификацияОС - Булево - разрешена ли аутентификация средствами операционной системы. // * ПользовательОС - Строка - имя соответствующей учетной записи пользователя операционной системы // (не учитывается в учебной версии платформы). // -// * ОсновнойИнтерфейс - Строка -// - Неопределено - имя основного интерфейса пользователя информационной базы +// * ОсновнойИнтерфейс - Строка - имя основного интерфейса пользователя информационной базы // (из коллекции Метаданные.Интерфейсы). -// * РежимЗапуска - Строка -// - Неопределено - "Авто", "ОбычноеПриложение" или "УправляемоеПриложение". -// * Язык - Строка -// - Неопределено - имя языка из коллекции Метаданные.Языки. -// * Роли - Неопределено - роли не указаны. -// - Массив - коллекция имен ролей пользователя информационной базы. +// - Неопределено +// * РежимЗапуска - Строка - "Авто", "ОбычноеПриложение" или "УправляемоеПриложение". +// - Неопределено +// * Язык - Строка - имя языка из коллекции Метаданные.Языки. +// - Неопределено +// * Роли - Массив - коллекция имен ролей пользователя информационной базы. +// - Неопределено - роли не указаны. +// +// * ЗащитаОтОпасныхДействий - Булево - по умолчанию Истина. Соответствует +// свойству ПредупреждатьОбОпасныхДействиях типа ЗащитаОтОпасныхДействий. // Функция НовоеОписаниеПользователяИБ() Экспорт @@ -859,22 +945,22 @@ Свойства.Вставить("УникальныйИдентификатор", ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор()); - Свойства.Вставить("Имя", ""); - Свойства.Вставить("ПолноеИмя", ""); - Свойства.Вставить("АутентификацияOpenID", Ложь); - Свойства.Вставить("АутентификацияСтандартная", Ложь); - Свойства.Вставить("ПоказыватьВСпискеВыбора", Ложь); - Свойства.Вставить("СтарыйПароль", Неопределено); - Свойства.Вставить("Пароль", Неопределено); - Свойства.Вставить("СохраняемоеЗначениеПароля", Неопределено); - Свойства.Вставить("ПарольУстановлен", Ложь); - Свойства.Вставить("ЗапрещеноИзменятьПароль", Ложь); - Свойства.Вставить("АутентификацияОС", Ложь); - Свойства.Вставить("ПользовательОС", ""); - Если ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда - Свойства.Вставить("ЗапрещеноВосстанавливатьПароль", Истина); - Свойства.Вставить("АдресЭлектроннойПочты", ""); - КонецЕсли; + Свойства.Вставить("Имя", ""); + Свойства.Вставить("ПолноеИмя", ""); + Свойства.Вставить("АдресЭлектроннойПочты", ""); + Свойства.Вставить("АутентификацияСтандартная", Ложь); + Свойства.Вставить("ПоказыватьВСпискеВыбора", Ложь); + Свойства.Вставить("СтарыйПароль", Неопределено); + Свойства.Вставить("Пароль", Неопределено); + Свойства.Вставить("СохраняемоеЗначениеПароля", Неопределено); + Свойства.Вставить("ПарольУстановлен", Ложь); + Свойства.Вставить("ЗапрещеноИзменятьПароль", Ложь); + Свойства.Вставить("ЗапрещеноВосстанавливатьПароль", Истина); + Свойства.Вставить("АутентификацияOpenID", Ложь); + Свойства.Вставить("АутентификацияOpenIDConnect", Ложь); + Свойства.Вставить("АутентификацияТокеномДоступа", Ложь); + Свойства.Вставить("АутентификацияОС", Ложь); + Свойства.Вставить("ПользовательОС", ""); Свойства.Вставить("ОсновнойИнтерфейс", ?(Метаданные.ОсновнойИнтерфейс = Неопределено, "", Метаданные.ОсновнойИнтерфейс.Имя)); @@ -886,6 +972,8 @@ Свойства.Вставить("Роли", Неопределено); + Свойства.Вставить("ЗащитаОтОпасныхДействий", Истина); + Возврат Свойства; КонецФункции @@ -1018,7 +1106,7 @@ КонецЕсли; // Подготовка новых значений свойств. - ТекстОшибкиПароля = ""; + УстановитьПароль = Ложь; НовыеСвойства = ОбщегоНазначения.СкопироватьРекурсивно(СтарыеСвойства); Для Каждого КлючИЗначение Из НовыеСвойства Цикл Если Не ОбновляемыеСвойства.Свойство(КлючИЗначение.Ключ) @@ -1034,36 +1122,28 @@ Или СтандартныеПодсистемыСервер.ЭтоУчебнаяПлатформа() Тогда Продолжить; КонецЕсли; - Настройки = ПользователиСлужебныйПовтИсп.Настройки(); - ИмяДляВхода = ?(ОбновляемыеСвойства.Свойство("Имя"), ОбновляемыеСвойства.Имя, НовыеСвойства.Имя); - Если Настройки.ОбщиеНастройкиВхода Тогда - НастройкиВхода = ?(ЭтоВнешнийПользователь, Настройки.ВнешниеПользователи, Настройки.Пользователи); - ТекстОшибкиПароля = ПользователиСлужебный.ОшибкаДлиныИлиСложностиПароля( - ОбновляемыеСвойства.Пароль, - НастройкиВхода.МинимальнаяДлинаПароля, - НастройкиВхода.ПарольДолженОтвечатьТребованиямСложности, - ИмяДляВхода); - Иначе - ТекстОшибкиПароля = ПользователиСлужебный.ОшибкаДлиныИлиСложностиПароля( - ОбновляемыеСвойства.Пароль, - ПолучитьМинимальнуюДлинуПаролейПользователей(), - ПолучитьПроверкуСложностиПаролейПользователей(), - ИмяДляВхода); - КонецЕсли; - НовыеСвойства.СохраняемоеЗначениеПароля = - ПользователиСлужебный.СохраняемоеЗначениеСтрокиПароля(ОбновляемыеСвойства.Пароль, Истина); + УстановитьПароль = Истина; КонецЦикла; СкопироватьСвойстваПользователяИБ(ПользовательИБ, НовыеСвойства); - Если ЗначениеЗаполнено(ТекстОшибкиПароля) Тогда - ТекстОшибки = ОписаниеОшибкиПриЗаписиПользователяИБ( - НСтр("ru = 'Не удалось записать свойства пользователя информационной базы %1 по причине: - |%2.'"), - ПользовательИБ.Имя, - ?(ПользовательСуществует, СтарыеСвойства.УникальныйИдентификатор, Неопределено), - ТекстОшибкиПароля); - ВызватьИсключение ТекстОшибки; + ПользователиСлужебный.УстановитьПолитикуПаролей(ПользовательИБ, ЭтоВнешнийПользователь); + + Если УстановитьПароль Тогда + ТекстОшибкиПароля = ПользователиСлужебный.ОшибкаСоответствияПароляТребованиям( + ОбновляемыеСвойства.Пароль, ПользовательИБ); + + Если ЗначениеЗаполнено(ТекстОшибкиПароля) Тогда + ТекстОшибки = ОписаниеОшибкиПриЗаписиПользователяИБ( + НСтр("ru = 'Не удалось записать свойства пользователя информационной базы %1 по причине: + |%2.'"), + ПользовательИБ.Имя, + ?(ПользовательСуществует, СтарыеСвойства.УникальныйИдентификатор, Неопределено), + ТекстОшибкиПароля); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + ПользовательИБ.СохраняемоеЗначениеПароля = + ПользователиСлужебный.СохраняемоеЗначениеСтрокиПароля(ОбновляемыеСвойства.Пароль, Истина); КонецЕсли; Если ОбщегоНазначения.РазделениеВключено() Тогда @@ -1145,15 +1225,16 @@ // Свойства Пароль и СохраняемоеЗначениеПароля не копируются, если // значение в Источнике равно Неопределено. // -// Свойства АутентификацияОС, АутентификацияСтандартная, -// АутентификацияOpenID и ПользовательОС не переустанавливаются, +// Свойства АутентификацияСтандартная, АутентификацияOpenID, +// АутентификацияOpenIDConnect, АутентификацияТокеномДоступа, +// АутентификацияОС, ПользовательОС и СохраняемоеЗначениеПароля не переустанавливаются, // если совпадают, когда Приемник типа ПользовательИнформационнойБазы. // // Свойства УникальныйИдентификатор, ПарольУстановлен, СтарыйПароль // не копируются, если Приемник типа ПользовательИнформационнойБазы. // -// Преобразование выполняется только для типа Источника или Приемника. -// ПользовательИнформационнойБазы. +// Преобразование выполняется только для Источника или Приемника +// с типом ПользовательИнформационнойБазы. // // Параметры: // Приемник - Структура @@ -1219,11 +1300,11 @@ ПарольУстановлен = Ложь; - Для каждого КлючИЗначение Из ВсеСвойства Цикл + Для Каждого КлючИЗначение Из ВсеСвойства Цикл Свойство = КлючИЗначение.Ключ; Если НЕ СтруктураКопируемыхСвойств.Свойство(Свойство) - ИЛИ СтруктураИсключаемыхСвойств.Свойство(Свойство) Тогда + Или СтруктураИсключаемыхСвойств.Свойство(Свойство) Тогда Продолжить; КонецЕсли; @@ -1233,7 +1314,7 @@ Или ТипЗнч(Приемник) = Тип("ФормаКлиентскогоПриложения") ) Тогда Если Свойство = "Пароль" - ИЛИ Свойство = "СтарыйПароль" Тогда + Или Свойство = "СтарыйПароль" Тогда ЗначениеСвойства = Неопределено; @@ -1251,6 +1332,10 @@ "", Источник.Язык.Имя); + ИначеЕсли Свойство = "ЗащитаОтОпасныхДействий" Тогда + ЗначениеСвойства = + Источник.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях; + ИначеЕсли Свойство = "Роли" Тогда ВременнаяСтруктура = Новый Структура("Роли", Новый ТаблицаЗначений); @@ -1295,15 +1380,17 @@ Если ТипЗнч(Приемник) = Тип("ПользовательИнформационнойБазы") Тогда Если Свойство = "УникальныйИдентификатор" - ИЛИ Свойство = "СтарыйПароль" - ИЛИ Свойство = "ПарольУстановлен" Тогда + Или Свойство = "СтарыйПароль" + Или Свойство = "ПарольУстановлен" Тогда Продолжить; - ИначеЕсли Свойство = "АутентификацияOpenID" - ИЛИ Свойство = "АутентификацияСтандартная" - ИЛИ Свойство = "АутентификацияОС" - ИЛИ Свойство = "ПользовательОС" Тогда + ИначеЕсли Свойство = "АутентификацияСтандартная" + Или Свойство = "АутентификацияOpenID" + Или Свойство = "АутентификацияOpenIDConnect" + Или Свойство = "АутентификацияТокеномДоступа" + Или Свойство = "АутентификацияОС" + Или Свойство = "ПользовательОС" Тогда Если Приемник[Свойство] <> ЗначениеСвойства Тогда Приемник[Свойство] = ЗначениеСвойства; @@ -1317,7 +1404,8 @@ ИначеЕсли Свойство = "СохраняемоеЗначениеПароля" Тогда Если ЗначениеСвойства <> Неопределено - И НЕ ПарольУстановлен Тогда + И Не ПарольУстановлен + И Приемник.СохраняемоеЗначениеПароля <> ЗначениеСвойства Тогда Приемник.СохраняемоеЗначениеПароля = ЗначениеСвойства; КонецЕсли; @@ -1330,14 +1418,18 @@ ИначеЕсли Свойство = "РежимЗапуска" Тогда Если ЗначениеСвойства = "Авто" - ИЛИ ЗначениеСвойства = "ОбычноеПриложение" - ИЛИ ЗначениеСвойства = "УправляемоеПриложение" Тогда + Или ЗначениеСвойства = "ОбычноеПриложение" + Или ЗначениеСвойства = "УправляемоеПриложение" Тогда Приемник.РежимЗапуска = РежимЗапускаКлиентскогоПриложения[ЗначениеСвойства]; Иначе Приемник.РежимЗапуска = РежимЗапускаКлиентскогоПриложения.Авто; КонецЕсли; + ИначеЕсли Свойство = "ЗащитаОтОпасныхДействий" Тогда + Приемник.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях = + ЗначениеСвойства; + ИначеЕсли Свойство = "Язык" Тогда Если ТипЗнч(ЗначениеСвойства) = Тип("Строка") Тогда Приемник.Язык = Метаданные.Языки.Найти(ЗначениеСвойства); @@ -1348,7 +1440,7 @@ ИначеЕсли Свойство = "Роли" Тогда Приемник.Роли.Очистить(); Если ЗначениеСвойства <> Неопределено Тогда - Для каждого ИмяРоли Из ЗначениеСвойства Цикл + Для Каждого ИмяРоли Из ЗначениеСвойства Цикл Роль = Метаданные.Роли.Найти(ИмяРоли); Если Роль <> Неопределено Тогда Приемник.Роли.Добавить(Роль); @@ -1411,34 +1503,91 @@ КонецПроцедуры -// Возвращает пользователя из справочника Пользователи, с которым сопоставлен -// пользователь ИБ с указанным именем. -// Для поиска требуются административные права. Если административных прав нет, -// допустимо искать только пользователя для текущего пользователя ИБ. +// Возвращает пользователя из справочника Пользователи или ВнешниеПользователи, +// с которым сопоставлен пользователь ИБ с указанным именем. // // Параметры: // ИмяДляВхода - Строка - имя пользователя информационной базы, используемое для входа. // // Возвращаемое значение: // СправочникСсылка.Пользователи - если пользователь найден. +// СправочникСсылка.ВнешниеПользователи - если внешний пользователь найден. // Справочники.Пользователи.ПустаяСсылка() - если пользователь ИБ найден. // Неопределено - если пользователь ИБ не существует. // Функция НайтиПоИмени(Знач ИмяДляВхода) Экспорт УстановитьПривилегированныйРежим(Истина); - ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяДляВхода); + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяДляВхода); Если ПользовательИБ = Неопределено Тогда Возврат Неопределено; - Иначе - НайтиНеоднозначныхПользователейИБ(Неопределено, ПользовательИБ.УникальныйИдентификатор); - - Возврат Справочники.Пользователи.НайтиПоРеквизиту( - "ИдентификаторПользователяИБ", - ПользовательИБ.УникальныйИдентификатор); КонецЕсли; + Пользователь = НайтиПоИдентификатору(ПользовательИБ.УникальныйИдентификатор); + Если Пользователь = Неопределено Тогда + Пользователь = ПредопределенноеЗначение("Справочник.Пользователи.ПустаяСсылка"); + КонецЕсли; + + УстановитьПривилегированныйРежим(Ложь); + + Возврат Пользователь; + +КонецФункции + +// Возвращает пользователя из справочника Пользователи или ВнешниеПользователи, +// с которым сопоставлен пользователь ИБ с указанным уникальным идентификатором. +// Поиск выполняется без учета существования пользователя информационной базы. +// +// Параметры: +// ИдентификаторПользователяИБ - УникальныйИдентификатор - идентификатор пользователя информационной базы. +// +// Возвращаемое значение: +// СправочникСсылка.Пользователи - если пользователь найден. +// СправочникСсылка.ВнешниеПользователи - если внешний пользователь найден. +// Неопределено - если пользователь не найден ни в одном справочнике. +// +Функция НайтиПоИдентификатору(Знач ИдентификаторПользователяИБ) Экспорт + + Если ТипЗнч(ИдентификаторПользователяИБ) <> Тип("УникальныйИдентификатор") Тогда + Возврат Неопределено; + КонецЕсли; + + Пользователь = Неопределено; + + УстановитьПривилегированныйРежим(Истина); + ПользователиСлужебный.ПользовательПоИдентификаторуСуществует( + ИдентификаторПользователяИБ,, Пользователь); + УстановитьПривилегированныйРежим(Ложь); + + Возврат Пользователь; + +КонецФункции + +// Возвращает пользователя ИБ по ссылке справочника Пользователи или ВнешниеПользователи. +// Для поиска требуются административные права. Если административных прав нет, +// допустимо искать только пользователя для текущего пользователя ИБ. +// +// Параметры: +// Пользователь - СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи +// +// Возвращаемое значение: +// ПользовательИнформационнойБазы - если найден. +// Неопределено - если пользователь ИБ не существует. +// +Функция НайтиПоСсылке(Пользователь) Экспорт + + УстановитьПривилегированныйРежим(Истина); + ИдентификаторПользователяИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Пользователь, + "ИдентификаторПользователяИБ"); + УстановитьПривилегированныйРежим(Ложь); + + Если ТипЗнч(ИдентификаторПользователяИБ) <> Тип("УникальныйИдентификатор") Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ИдентификаторПользователяИБ); + КонецФункции // Выполняет поиск идентификаторов пользователей ИБ, используемых более одного раза, и @@ -1704,52 +1853,87 @@ // Для облегчения запоминания, пароль формируется из слогов (согласная-гласная). // // Параметры: -// НаименьшаяДлина - Число - наименьшая длина пароля. -// -// Сложный - Булево - учитывать требования сложности пароля. -// -// УчестьНастройки - Строка - -// "НеУчитыватьНастройки" - не учитывать настройки администратора, -// "ДляПользователей" - учесть настройки для пользователей (по умолчанию), -// "ДляВнешнихПользователей" - учесть настройки для внешних пользователей. -// Если настройки администратора учитываются, тогда указанные параметры -// длины и сложности пароля будут увеличены до значений, указанных в настройках. +// СвойстваПароля - см. СвойстваПароля +// - Число - устарел (наименьшая длина) +// УдалитьСложный - Булево - устарел, следует использовать СвойстваПароля. +// УдалитьУчестьНастройки - Строка - устарел, следует использовать СвойстваПароля. // // Возвращаемое значение: // Строка - новый пароль. // -Функция СоздатьПароль(НаименьшаяДлина = 7, Сложный = Ложь, УчестьНастройки = "ДляПользователей") Экспорт +Функция СоздатьПароль(Знач СвойстваПароля = 7, УдалитьСложный = Ложь, УдалитьУчестьНастройки = "ДляПользователей") Экспорт - - Если УчестьНастройки = "ДляВнешнихПользователей" Тогда - НастройкиВхода = ПользователиСлужебныйПовтИсп.Настройки().ВнешниеПользователи; - ИначеЕсли УчестьНастройки = "ДляПользователей" Тогда - НастройкиВхода = ПользователиСлужебныйПовтИсп.Настройки().Пользователи; - Иначе - НастройкиВхода = Неопределено; + Если ТипЗнч(СвойстваПароля) = Тип("Число") Тогда + НаименьшаяДлина = СвойстваПароля; + СвойстваПароля = СвойстваПароля(); + СвойстваПароля.НаименьшаяДлина = НаименьшаяДлина; + СвойстваПароля.Сложный = УдалитьСложный; + СвойстваПароля.УчестьНастройки = УдалитьУчестьНастройки; КонецЕсли; - МинимальнаяДлинаПароля = НаименьшаяДлина; - СложныйПароль = Сложный; - - Если НастройкиВхода <> Неопределено Тогда - МинимальнаяДлинаПароляИБ = ПолучитьМинимальнуюДлинуПаролейПользователей(); - Если МинимальнаяДлинаПароля < МинимальнаяДлинаПароляИБ Тогда - МинимальнаяДлинаПароля = МинимальнаяДлинаПароляИБ; - КонецЕсли; - Если МинимальнаяДлинаПароля < НастройкиВхода.МинимальнаяДлинаПароля Тогда - МинимальнаяДлинаПароля = НастройкиВхода.МинимальнаяДлинаПароля; - КонецЕсли; + Если СвойстваПароля.УчестьНастройки = "ДляВнешнихПользователей" + Или СвойстваПароля.УчестьНастройки = "ДляПользователей" Тогда - СложныйПарольИБ = ПолучитьПроверкуСложностиПаролейПользователей(); - Если СложныйПарольИБ Или НастройкиВхода.ПарольДолженОтвечатьТребованиямСложности Тогда + ИмяПолитикиПаролей = ПользователиСлужебный.ИмяПолитикиПаролей( + СвойстваПароля.УчестьНастройки = "ДляВнешнихПользователей"); + + УстановитьПривилегированныйРежим(Истина); + ПолитикаПаролей = ПолитикиПаролейПользователей.НайтиПоИмени(ИмяПолитикиПаролей); + Если ПолитикаПаролей = Неопределено Тогда + МинимальнаяДлинаПароля = ПолучитьМинимальнуюДлинуПаролейПользователей(); + СложныйПароль = ПолучитьПроверкуСложностиПаролейПользователей(); + Иначе + МинимальнаяДлинаПароля = ПолитикаПаролей.МинимальнаяДлинаПаролей; + СложныйПароль = ПолитикаПаролей.ПроверкаСложностиПаролей; + + КонецЕсли; + УстановитьПривилегированныйРежим(Ложь); + Если МинимальнаяДлинаПароля < СвойстваПароля.НаименьшаяДлина Тогда + МинимальнаяДлинаПароля = СвойстваПароля.НаименьшаяДлина; + КонецЕсли; + Если Не СложныйПароль И СвойстваПароля.Сложный Тогда СложныйПароль = Истина; КонецЕсли; + Иначе + МинимальнаяДлинаПароля = СвойстваПароля.НаименьшаяДлина; + СложныйПароль = СвойстваПароля.Сложный; КонецЕсли; ПараметрыПароля = ПользователиСлужебный.ПараметрыПароля(МинимальнаяДлинаПароля, СложныйПароль); - Возврат ПользователиСлужебный.СоздатьПароль(ПараметрыПароля); + Возврат ПользователиСлужебный.СоздатьПароль(ПараметрыПароля, СвойстваПароля.ГСЧ); + +КонецФункции + +// Описание свойств пароля, используемых в функции СоздатьПароль. +// +// Возвращаемое значение: +// Структура: +// * НаименьшаяДлина - Число - наименьшая длина пароля. +// * Сложный - Булево - учитывать требования сложности пароля. +// * УчестьНастройки - Строка - +// "НеУчитыватьНастройки" - не учитывать настройки администратора, +// "ДляПользователей" - учесть настройки для пользователей (по умолчанию), +// "ДляВнешнихПользователей" - учесть настройки для внешних пользователей. +// Если настройки администратора учитываются, тогда указанные параметры +// длины и сложности пароля будут увеличены до значений, указанных в настройках. +// * ГСЧ - ГенераторСлучайныхЧисел - если уже используется. +// - Неопределено - создать новый. +// +Функция СвойстваПароля() Экспорт + + Результат = Новый Структура; + Результат.Вставить("НаименьшаяДлина", 7); + Результат.Вставить("Сложный", Ложь); + Результат.Вставить("УчестьНастройки", "ДляПользователей"); + + Миллисекунды = ТекущаяУниверсальнаяДатаВМиллисекундах(); + НачальноеЧисло = Миллисекунды - Цел(Миллисекунды / 40) * 40; + ГСЧ = Новый ГенераторСлучайныхЧисел(НачальноеЧисло); + + Результат.Вставить("ГСЧ", ГСЧ); + + Возврат Результат; КонецФункции @@ -1900,7 +2084,76 @@ КонецПроцедуры -// Сохраняет настройки входа пользователей +// Сохраняет общие настройки входа пользователей. +// Допустимо передавать отдельные свойства. +// +// Параметры: +// ОбщиеСохраняемыеНастройки - см. Пользователи.НовоеОписаниеОбщихНастроекВхода +// +Процедура УстановитьОбщиеНастройкиВхода(ОбщиеСохраняемыеНастройки) Экспорт + + Блокировка = Новый БлокировкаДанных(); + Блокировка.Добавить("Константа.НастройкиВходаПользователей"); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + + НастройкиВхода = ПользователиСлужебный.НастройкиВхода(); + Настройки = НастройкиВхода.Общие; + + Для Каждого СохраняемаяНастройка Из ОбщиеСохраняемыеНастройки Цикл + Если Не Настройки.Свойство(СохраняемаяНастройка.Ключ) + Или ТипЗнч(Настройки[СохраняемаяНастройка.Ключ]) <> ТипЗнч(СохраняемаяНастройка.Значение) Тогда + Продолжить; + КонецЕсли; + Настройки[СохраняемаяНастройка.Ключ] = СохраняемаяНастройка.Значение; + КонецЦикла; + + Константы.НастройкиВходаПользователей.Установить(Новый ХранилищеЗначения(НастройкиВхода)); + + Если Не ОбщиеСохраняемыеНастройки.Свойство("ОбновитьТолькоКонстанту") Тогда + ПользователиСлужебный.ОбновитьОбщуюПолитикуПаролей(Настройки); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// Возвращает структуру общих настроек входа по умолчанию. +// +// Возвращаемое значение: +// Структура: +// * ОтдельныеНастройкиДляВнешнихПользователей - Булево - если Ложь, +// тогда для внешних пользователей применяются настройки обычных пользователей. +// * КоличествоПопытокВводаПароляДоБлокировки - Число - количество попыток +// ошибочного ввода пароля до срабатывания блокировки. +// * ДлительностьБлокировкиВводаПароля - Число - количество минут блокировки ввода пароля. +// * ПоказыватьВСпискеВыбора - Строка - одна из строк +// "ВключеноДляНовыхПользователей", "СкрытоИВключеноДляВсехПользователей" +// "ВыключеноДляНовыхПользователей", "СкрытоИВыключеноДляВсехПользователей". +// +Функция НовоеОписаниеОбщихНастроекВхода() Экспорт + + Настройки = Новый Структура; + Настройки.Вставить("ОтдельныеНастройкиДляВнешнихПользователей", Ложь); + Настройки.Вставить("КоличествоПопытокВводаПароляДоБлокировки", 3); + Настройки.Вставить("ДлительностьБлокировкиВводаПароля", 5); + Настройки.Вставить("ПоказыватьВСпискеВыбора", + ?(ОбщегоНазначения.РазделениеВключено() + Или ВнешниеПользователи.ИспользоватьВнешнихПользователей(), + "СкрытоИВыключеноДляВсехПользователей", "ВключеноДляНовыхПользователей")); + + Возврат Настройки; + +КонецФункции + +// Сохраняет настройки входа пользователей. +// Допустимо передавать отдельные свойства. // // Параметры: // СохраняемыеНастройки - см. Пользователи.НовоеОписаниеНастроекВхода @@ -1908,86 +2161,82 @@ // Процедура УстановитьНастройкиВхода(СохраняемыеНастройки, ДляВнешнихПользователей = Ложь) Экспорт - РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); - Блокировка = Новый БлокировкаДанных(); Блокировка.Добавить("Константа.НастройкиВходаПользователей"); - Если Не РазделениеВключено Тогда - Блокировка.Добавить("Константа.УдалитьНастройкиВходаПользователей"); - КонецЕсли; - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - - Настройки = ПользователиСлужебный.НастройкиВхода(); + НастройкиВхода = ПользователиСлужебный.НастройкиВхода(); Если ДляВнешнихПользователей Тогда - НастройкиВхода = Настройки.ВнешниеПользователи; + Настройки = НастройкиВхода.ВнешниеПользователи; Иначе - НастройкиВхода = Настройки.Пользователи; + Настройки = НастройкиВхода.Пользователи; КонецЕсли; Для Каждого СохраняемаяНастройка Из СохраняемыеНастройки Цикл - Если Не НастройкиВхода.Свойство(СохраняемаяНастройка.Ключ) - Или ТипЗнч(НастройкиВхода[СохраняемаяНастройка.Ключ]) <> ТипЗнч(СохраняемаяНастройка.Значение) Тогда + Если Не Настройки.Свойство(СохраняемаяНастройка.Ключ) + Или ТипЗнч(Настройки[СохраняемаяНастройка.Ключ]) <> ТипЗнч(СохраняемаяНастройка.Значение) + Или ВРег(СохраняемаяНастройка.Ключ) = ВРег("ПросрочкаРаботыВПрограммеДатаВключения") + И Не ЗначениеЗаполнено(Настройки[СохраняемаяНастройка.Ключ]) Тогда Продолжить; КонецЕсли; - - НастройкиВхода[СохраняемаяНастройка.Ключ] = СохраняемаяНастройка.Значение; - + Настройки[СохраняемаяНастройка.Ключ] = СохраняемаяНастройка.Значение; КонецЦикла; - Если Не ЗначениеЗаполнено(НастройкиВхода.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода) Тогда - НастройкиВхода.ПросрочкаРаботыВПрограммеДатаВключения = Дата(1, 1, 1); - ИначеЕсли Не ЗначениеЗаполнено(НастройкиВхода.ПросрочкаРаботыВПрограммеДатаВключения) Тогда - НастройкиВхода.ПросрочкаРаботыВПрограммеДатаВключения = НачалоДня(ТекущаяДатаСеанса()); + Если Не ЗначениеЗаполнено(Настройки.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода) Тогда + Настройки.ПросрочкаРаботыВПрограммеДатаВключения = Дата(1, 1, 1); + ИначеЕсли Не ЗначениеЗаполнено(Настройки.ПросрочкаРаботыВПрограммеДатаВключения) Тогда + Настройки.ПросрочкаРаботыВПрограммеДатаВключения = НачалоДня(ТекущаяДатаСеанса()); КонецЕсли; - Константы.НастройкиВходаПользователей.Установить(Новый ХранилищеЗначения(Настройки)); + Константы.НастройкиВходаПользователей.Установить(Новый ХранилищеЗначения(НастройкиВхода)); - Если Не РазделениеВключено Тогда - - СохраненныеНастройки = Константы.УдалитьНастройкиВходаПользователей.Получить().Получить(); - Если СохраненныеНастройки <> Неопределено Тогда - Константы.УдалитьНастройкиВходаПользователей.Установить(Новый ХранилищеЗначения(Неопределено)); + Если Не СохраняемыеНастройки.Свойство("ОбновитьТолькоКонстанту") Тогда + Если ДляВнешнихПользователей Тогда + Если НастройкиВхода.Общие.ОтдельныеНастройкиДляВнешнихПользователей + И ОбщиеНастройкиВходаИспользуются() Тогда + + ПользователиСлужебный.ОбновитьПолитикуПаролейВнешнихПользователей(Настройки); + Иначе + ПользователиСлужебный.ОбновитьПолитикуПаролейВнешнихПользователей(Неопределено); + КонецЕсли; + Иначе + ПользователиСлужебный.ОбновитьПолитикуПаролейПользователей(Настройки); КонецЕсли; - КонецЕсли; ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - + КонецПроцедуры // Возвращает структуру настроек входа по умолчанию. // // Возвращаемое значение: // Структура: -// * ПарольДолженОтвечатьТребованиямСложности - Булево - должен ли пароль отвечать требованиям сложности: -// длина не менее 7 символов; -// содержит любые 3 из 4-х типов символов: заглавные буквы, -// строчные буквы, цифры, специальные символы; -// не совпадает с именем (для входа). +// * ПарольДолженОтвечатьТребованиямСложности - Булево - должен ли пароль +// отвечать требованиям сложности +// длина не менее 7 символов; +// содержит любые 3 из 4-х типов символов +// заглавные буквы, строчные буквы, цифры, специальные символы; +// не совпадает с именем (для входа). // * МинимальнаяДлинаПароля - Число - минимальная длина пароля. -// * МаксимальныйСрокДействияПароля - Число - максимальный срок действия пароля. -// * МинимальныйСрокДействияПароля - Число - минимальный срок действия пароля. -// * ЗапретитьПовторениеПароляСредиПоследних - Число - количество последних паролей, -// которые запрещено использовать повторно -// * ПросрочкаРаботыВПрограммеДоЗапрещенияВхода - Число - количество дней не активности пользователя, -// после чего будет запрещен вход -// * ПросрочкаРаботыВПрограммеДатаВключения - Дата - дата включения просрочки работы в программе +// * МаксимальныйСрокДействияПароля - Число - максимальное количество дней действия пароля. +// * МинимальныйСрокДействияПароля - Число - минимальное количество дней действия пароля. +// * ЗапретитьПовторениеПароляСредиПоследних - Число - количество +// последних паролей, которые запрещено использовать повторно. +// * ПредупреждатьОбОкончанииСрокаДействияПароля - Число - количество дней +// до срока окончания действия пароля, начиная с которого нужно начать предупреждать. +// * ПросрочкаРаботыВПрограммеДоЗапрещенияВхода - Число - количество дней +// неактивности пользователя, после чего будет запрещен вход. +// * ПросрочкаРаботыВПрограммеДатаВключения - Дата - служебное, заполняется автоматически +// в момент записи ненулевого количества дней просрочки работы вместо нулевого. // Функция НовоеОписаниеНастроекВхода() Экспорт @@ -1999,6 +2248,7 @@ Настройки.Вставить("МаксимальныйСрокДействияПароля", 0); Настройки.Вставить("МинимальныйСрокДействияПароля", 0); Настройки.Вставить("ЗапретитьПовторениеПароляСредиПоследних", 0); + Настройки.Вставить("ПредупреждатьОбОкончанииСрокаДействияПароля", 0); // Требование периодической работы в программе. Настройки.Вставить("ПросрочкаРаботыВПрограммеДоЗапрещенияВхода", 0); Настройки.Вставить("ПросрочкаРаботыВПрограммеДатаВключения", '00010101'); @@ -2007,50 +2257,22 @@ КонецФункции -// Добавляет пароль в список используемых, -// если в настройках для входа заполнено свойство ЗапретитьПовторениеПароляСредиПоследних +#Область УстаревшиеПроцедурыИФункции + +// Больше не требуется, так как использованные пароли хранятся в пользователе информационной базы и +// добавляются автоматически при изменении пароля или сохраняемого значения пароля. // // Параметры: // Пользователь - СправочникСсылка.Пользователи -// - СправочникСсылка.ВнешниеПользователи - пользователь для которого добавляется пароль -// СохраняемоеЗначениеПароля - Строка - хеш пароля +// - СправочникСсылка.ВнешниеПользователи +// СохраняемоеЗначениеПароля - Строка // Процедура ДобавитьИспользованныйПароль(Пользователь, СохраняемоеЗначениеПароля) Экспорт - - ПользователиСлужебный.ДобавитьИспользованныйПароль(Пользователь, СохраняемоеЗначениеПароля); - + Возврат; КонецПроцедуры #КонецОбласти -#Область СлужебныйПрограммныйИнтерфейс - -// Возвращает пользователя ИБ по ссылке справочника Пользователи или ВнешниеПользователи. -// Для поиска требуются административные права. Если административных прав нет, -// допустимо искать только пользователя для текущего пользователя ИБ. -// -// Параметры: -// Пользователь - СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи -// -// Возвращаемое значение: -// ПользовательИнформационнойБазы - если найден. -// Неопределено - если пользователь ИБ не существует. -// -Функция НайтиПоСсылке(Пользователь) Экспорт - - УстановитьПривилегированныйРежим(Истина); - ИдентификаторПользователяИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Пользователь, - "ИдентификаторПользователяИБ"); - УстановитьПривилегированныйРежим(Ложь); - - Если ТипЗнч(ИдентификаторПользователяИБ) <> Тип("УникальныйИдентификатор") Тогда - Возврат Неопределено; - КонецЕсли; - - Возврат ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ИдентификаторПользователяИБ); - -КонецФункции - #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -2092,12 +2314,12 @@ """" + ИмяДляВхода + """ (" + ?(ЗначениеЗаполнено(ИдентификаторПользователяИБ), НСтр("ru = 'Новый'"), Строка(ИдентификаторПользователяИБ)) + ")", ?(ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке"), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке), Строка(ИнформацияОбОшибке)))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке), Строка(ИнформацияОбОшибке)))); КонецЕсли; Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, """" + ИмяДляВхода + """", ?(ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Строка(ИнформацияОбОшибке))); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Строка(ИнформацияОбОшибке))); КонецФункции diff --git a/SSL/src/CommonModules/ПользователиКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПользователиКлиентСервер/Module.bsl index feffa9462..690b1bcca 100644 --- a/SSL/src/CommonModules/ПользователиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ПользователиКлиентСервер/Module.bsl @@ -16,11 +16,13 @@ // Функция АвторизованныйПользователь() Экспорт +// АПК:547-выкл код сохранен для обратной совместимости, используется в устаревшем программном интерфейсе. #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда Возврат Пользователи.АвторизованныйПользователь(); #Иначе Возврат ПользователиКлиент.АвторизованныйПользователь(); #КонецЕсли +// АПК:547-вкл КонецФункции @@ -30,11 +32,13 @@ // Функция ТекущийПользователь() Экспорт +// АПК:547-выкл код сохранен для обратной совместимости, используется в устаревшем программном интерфейсе. #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда Возврат Пользователи.ТекущийПользователь(); #Иначе Возврат ПользователиКлиент.ТекущийПользователь(); #КонецЕсли +// АПК:547-вкл КонецФункции @@ -44,11 +48,13 @@ // Функция ТекущийВнешнийПользователь() Экспорт +// АПК:547-выкл код сохранен для обратной совместимости, используется в устаревшем программном интерфейсе. #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда Возврат ВнешниеПользователи.ТекущийВнешнийПользователь(); #Иначе Возврат ВнешниеПользователиКлиент.ТекущийВнешнийПользователь(); #КонецЕсли +// АПК:547-вкл КонецФункции @@ -58,11 +64,13 @@ // Функция ЭтоСеансВнешнегоПользователя() Экспорт +// АПК:547-выкл код сохранен для обратной совместимости, используется в устаревшем программном интерфейсе. #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда Возврат Пользователи.ЭтоСеансВнешнегоПользователя(); #Иначе Возврат ПользователиКлиент.ЭтоСеансВнешнегоПользователя(); #КонецЕсли +// АПК:547-вкл КонецФункции diff --git a/SSL/src/CommonModules/ПользователиПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПользователиПереопределяемый/Module.bsl index a7181bf0a..7721a5336 100644 --- a/SSL/src/CommonModules/ПользователиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ПользователиПереопределяемый/Module.bsl @@ -22,6 +22,12 @@ // в карточках пользователя, внешнего пользователя и группы внешних пользователей // (в том числе для администратора). По умолчанию - Истина. // +// * ФизическоеЛицоИспользуется - Булево - по умолчанию Истина. Когда Истина, тогда +// используется в подсистеме Пользователи, например, отображается в карточке Пользователя. +// +// * ПодразделениеИспользуется - Булево - по умолчанию Истина. Когда Истина, тогда +// используется в подсистеме Пользователи, например, отображается в карточке Пользователя. +// Процедура ПриОпределенииНастроек(Настройки) Экспорт КонецПроцедуры diff --git a/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl index a14d44a13..31a7e5db0 100644 --- a/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl @@ -27,20 +27,32 @@ Результат.Вставить("ОшибкаАвторизации", ""); Результат.Вставить("ТребуетсяСменитьПароль", Ложь); - ОшибкаАвторизации = АвторизоватьТекущегоПользователя(Истина, РегистрироватьВЖурнале); - - Если Не ЗначениеЗаполнено(ОшибкаАвторизации) Тогда - ОтключитьНеактивныхИПросроченныхПользователей(Истина, ОшибкаАвторизации, РегистрироватьВЖурнале); - КонецЕсли; - - Если Не ЗначениеЗаполнено(ОшибкаАвторизации) Тогда - ПроверитьВходВПрограммуРазрешен(ОшибкаАвторизации); - КонецЕсли; - - Если Не ЗначениеЗаполнено(ОшибкаАвторизации) Тогда - Результат.ТребуетсяСменитьПароль = ТребуетсяСменитьПароль(ОшибкаАвторизации, - Истина, РегистрироватьВЖурнале); - КонецЕсли; + Попытка + ОшибкаАвторизации = АвторизоватьТекущегоПользователя(Истина, РегистрироватьВЖурнале); + + Если Не ЗначениеЗаполнено(ОшибкаАвторизации) Тогда + ОтключитьНеактивныхИПросроченныхПользователей(Истина, ОшибкаАвторизации, РегистрироватьВЖурнале); + КонецЕсли; + + Если Не ЗначениеЗаполнено(ОшибкаАвторизации) Тогда + ПроверитьВходВПрограммуРазрешен(ОшибкаАвторизации); + КонецЕсли; + + Если Не ЗначениеЗаполнено(ОшибкаАвторизации) Тогда + Результат.ТребуетсяСменитьПароль = ТребуетсяСменитьПароль(ОшибкаАвторизации, + Истина, РегистрироватьВЖурнале); + КонецЕсли; + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОшибкаАвторизации = КраткоеПредставлениеОшибкиАвторизацииПослеРегистрацииВЖурнале( + ИнформацияОбОшибке,, РегистрироватьВЖурнале); + Если РегистрироватьВЖурнале Тогда + ОшибкаАвторизации = ЗаголовокСообщенияАвторизацияНеВыполненаСПереводомСтроки() + + ?(Пользователи.ЭтоПолноправныйПользователь(,, Ложь), + НСтр("ru = 'Подробнее см. в журнале регистрации.'"), + НСтр("ru = 'Обратитесь к администратору.'")); + КонецЕсли; + КонецПопытки; Результат.ОшибкаАвторизации = ОшибкаАвторизации; @@ -223,10 +235,6 @@ НастройкиСостава = Новый НастройкиСоставаИнтерфейсаКлиентскогоПриложения; ГруппаСлева = Новый ГруппаНастройкиСоставаИнтерфейсаКлиентскогоПриложения; - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СтандартныеПодсистемыСервер.ВерсияРежимаСовместимости(), "8.3.15.0") < 0 Тогда - ГруппаСлева.Добавить(Новый ЭлементНастройкиСоставаИнтерфейсаКлиентскогоПриложения("ПанельИнструментов")); - КонецЕсли; - ГруппаСлева.Добавить(Новый ЭлементНастройкиСоставаИнтерфейсаКлиентскогоПриложения("ПанельРазделов")); НастройкиСостава.Лево.Добавить(ГруппаСлева); НастройкиТакси.УстановитьСостав(НастройкиСостава); @@ -267,10 +275,12 @@ // Функция ОшибкаНедостаточноПравДляВходаВПрограмму(РегистрироватьВЖурнале = Истина) Экспорт + // АПК:336-выкл Не заменять на РолиДоступны. Это специальная проверка ролей при входе. //@skip-check using-isinrole - Если РольДоступна(Метаданные.Роли.ПолныеПрава) Тогда // Не заменять на РолиДоступны. + Если РольДоступна(Метаданные.Роли.ПолныеПрава) Тогда Возврат ""; КонецЕсли; + // АПК:336-вкл Если Пользователи.ЭтоСеансВнешнегоПользователя() Тогда ИмяРолиБазовыеПрава = Метаданные.Роли.БазовыеПраваВнешнихПользователейБСП.Имя; @@ -278,10 +288,12 @@ ИмяРолиБазовыеПрава = Метаданные.Роли.БазовыеПраваБСП.Имя; КонецЕсли; + // АПК:336-выкл Не заменять на РолиДоступны. Это специальная проверка ролей при входе. //@skip-check using-isinrole - Если РольДоступна(ИмяРолиБазовыеПрава) Тогда // Не заменять на РолиДоступны. + Если РольДоступна(ИмяРолиБазовыеПрава) Тогда Возврат ""; КонецЕсли; + // АПК:336-вкл Возврат КраткоеПредставлениеОшибкиАвторизацииПослеРегистрацииВЖурнале( НСтр("ru = 'Недостаточно прав для входа в программу. @@ -332,86 +344,6 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Восстановление паролей пользователей - -Процедура УстановитьНастройкиВосстановленияПароля(НастройкиВосстановленияПароля) Экспорт - - Если ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда - НастройкиАутентификации = Вычислить("ДополнительныеНастройкиАутентификации"); - НастройкиАутентификации.УстановитьНастройкиВосстановленияПароля(НастройкиВосстановленияПароля); - КонецЕсли; - -КонецПроцедуры - -// Возвращает настройки восстановления пароля из информационной базы -// -// Возвращаемое значение: -// Структура: -// * АдресСервераSMTP - Строка -// * ПарольSMTP - Строка -// * ПользовательSMTP - Строка -// * ПортSMTP - Число -// * Заголовок - Строка -// * ТекстСообщенияHTML - Строка -// * ИмяОтправителя - Строка -// * ИспользоватьSSL - Булево -// * НавигационнаяСсылкаПомощи - Строка -// * ОтображатьГиперссылкуПомощи - Булево -// * СпособВосстановленияПароля - СпособВосстановленияПароляПользователяИнформационнойБазы -// * ДлинаКодаПодтверждения - Число -// * ДлительностьБлокировкиЗапросаОбновленияКодаПодтверждения - Число -// * МаксимальноеКоличествоНеуспешныхПопытокПроверкиКодаПодтверждения - Число -// * НавигационнаяСсылкаВосстановленияПароля - Строка -// -Функция НастройкиВосстановленияПароля() Экспорт - - НастройкиВосстановленияПароля = Неопределено; - Если ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда - НастройкиАутентификации = Вычислить("ДополнительныеНастройкиАутентификации"); - НастройкиВосстановленияПароля = НастройкиАутентификации.ПолучитьНастройкиВосстановленияПароля(); - КонецЕсли; - - Возврат НастройкиВосстановленияПароля; - -КонецФункции - -Функция СпособВосстановленияПароляПользователяИнформационнойБазы(СпособВосстановленияПароля) Экспорт - СпособВосстановленияПароляПользователя = Вычислить("СпособВосстановленияПароляПользователяИнформационнойБазы"); - Возврат СпособВосстановленияПароляПользователя[СпособВосстановленияПароля]; -КонецФункции - -// Возвращаемое значение: -// см. НастройкиВосстановленияПароля -// -Функция НовыеНастройкиВосстановленияПароля() Экспорт - - Если ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда - НастройкиВосстановленияПароля = Вычислить("Новый НастройкиВосстановленияПароля"); - Возврат НастройкиВосстановленияПароля; - КонецЕсли; - - Возврат Неопределено; - -КонецФункции - -Процедура ЗаполнитьПочтуДляВосстановленияПароляУПользователейВФоне(ДополнительныеПараметры, АдресВоВременномХранилище) Экспорт - - СписокПользователей = ПользователиДляВключенияВосстановленияПароля(); - Для каждого ПользовательСсылка Из СписокПользователей Цикл - ОбновитьПочтуДляВосстановленияПароля(ПользовательСсылка); - КонецЦикла; - - СписокПользователей = ВнешниеПользователиДляВключенияВосстановленияПароля(); - Для каждого ВнешнийПользовательСсылка Из СписокПользователей Цикл - - ОбъектАвторизации = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВнешнийПользовательСсылка, "ОбъектАвторизации"); - ОбновитьПочтуДляВосстановленияПароля(ВнешнийПользовательСсылка, ОбъектАвторизации); - - КонецЦикла; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Для работы интерфейса ролей в управляемой форме. @@ -746,8 +678,12 @@ // ПользовательИБ - ПользовательИнформационнойБазы - объект, который требуется записать. // ЭтоВнешнийПользователь - Булево - указать Истина, если пользователь ИБ соответствует внешнему пользователю // (элементу справочника ВнешниеПользователи). +// Пользователь - Неопределено - найти по уникальному идентификатору пользователя ИБ, если потребуется. +// - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи // -Процедура ЗаписатьПользователяИнформационнойБазы(ПользовательИБ, ЭтоВнешнийПользователь = Ложь) Экспорт +Процедура ЗаписатьПользователяИнформационнойБазы(ПользовательИБ, ЭтоВнешнийПользователь = Ложь, + Пользователь = Неопределено) Экспорт ИнтеграцияПодсистемБСП.ПередЗаписьюПользователяИБ(ПользовательИБ); @@ -755,6 +691,23 @@ ОбновлениеИнформационнойБазыСлужебный.УстановитьФлагОтображенияОписанийДляНовогоПользователя(ПользовательИБ.Имя); ПользовательИБ.Записать(); + Если ПараметрыСеанса.ОбновлениеСправочниковПользователей.Получить("ИдентификаторПользователяИБ") + <> ПользовательИБ.УникальныйИдентификатор Тогда + + ОбновленныйПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( + ПользовательИБ.УникальныйИдентификатор); + Если ОбновленныйПользовательИБ <> Неопределено Тогда + ПользовательИБ = ОбновленныйПользовательИБ; + КонецЕсли; + + Если Пользователь = Неопределено Тогда + Пользователь = Пользователи.НайтиПоИдентификатору(ПользовательИБ.УникальныйИдентификатор); + КонецЕсли; + Если Пользователь <> Неопределено Тогда + РегистрыСведений.СведенияОПользователях.ОбновитьСведенияОПользователе(Пользователь,, ПользовательИБ); + КонецЕсли; + КонецЕсли; + КонецПроцедуры // Проверяет корректность заполнения назначения ролей, а также корректность прав в ролях по назначению. @@ -781,7 +734,7 @@ ТекстОшибки = ""; - Назначение = Новый Структура; + Назначение = НазначениеРолей(); Для Каждого ОписаниеНазначенияРолей Из НазначениеРолей Цикл Роли = Новый Соответствие; Для Каждого КлючИЗначение Из ОписаниеНазначенияРолей.Значение Цикл @@ -800,7 +753,8 @@ КонецЕсли; Роли.Вставить(Роль, Истина); Для Каждого ОписаниеНазначения Из Назначение Цикл - Если ОписаниеНазначения.Значение.Получить(Роль) = Неопределено Тогда + ТекущиеРоли = ОписаниеНазначения.Значение; // Соответствие + Если ТекущиеРоли.Получить(Роль) = Неопределено Тогда Продолжить; КонецЕсли; ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -1022,6 +976,57 @@ КонецФункции +// Параметры: +// Список - ДинамическийСписок +// +Процедура НастроитьПолеНомерКартинкиДинамическогоСписка(Список) Экспорт + + ОграничитьИспользованиеЗаполняемогоПоляДинамическогоСписка(Список, "НомерКартинки"); + +КонецПроцедуры + +// Параметры: +// ИмяЭлемента - Строка +// Настройки - НастройкиКомпоновкиДанных +// Строки - СтрокиДинамическогоСписка +// +Процедура ДинамическийСписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки) Экспорт + + Если Строки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Для Каждого КлючИЗначение Из Строки Цикл + Если Не КлючИЗначение.Значение.Данные.Свойство("НомерКартинки") + Или ТипЗнч(КлючИЗначение.Ключ) <> Тип("СправочникСсылка.Пользователи") + И ТипЗнч(КлючИЗначение.Ключ) <> Тип("СправочникСсылка.ВнешниеПользователи") Тогда + Возврат; + КонецЕсли; + Прервать; + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Пользователи", Строки.ПолучитьКлючи()); + Запрос.Текст = + "ВЫБРАТЬ + | СведенияОПользователях.Пользователь КАК Пользователь, + | СведенияОПользователях.НомерКартинкиСостояния - 1 КАК НомерКартинки + |ИЗ + | РегистрСведений.СведенияОПользователях КАК СведенияОПользователях + |ГДЕ + | СведенияОПользователях.Пользователь В (&Пользователи)"; + + УстановитьПривилегированныйРежим(Истина); + Выборка = Запрос.Выполнить().Выбрать(); + УстановитьПривилегированныйРежим(Ложь); + + Пока Выборка.Следующий() Цикл + Строка = Строки.Получить(Выборка.Пользователь); + Строка.Данные.НомерКартинки = Выборка.НомерКартинки; + КонецЦикла; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Универсальные процедуры и функции. @@ -1071,18 +1076,41 @@ Возврат; КонецЕсли; - РегистрироватьВЖурнале = Параметры.ПолученныеПараметрыКлиента <> Неопределено - И Не Параметры.ПолученныеПараметрыКлиента.Свойство("ОшибкаАвторизации"); - - Результат = АвторизоватьТекущегоПользователяПриВходе(РегистрироватьВЖурнале); - - Если Результат.ТребуетсяСменитьПароль Тогда - Параметры.Вставить("ТребуетсяСменитьПароль"); - СтандартныеПодсистемыВызовСервера.СкрытьРабочийСтолПриНачалеРаботыСистемы(); + Если Параметры.ПолученныеПараметрыКлиента.Свойство("АвторизацияВыполнена") Тогда + РезультатАвторизации = Параметры.ПолученныеПараметрыКлиента.АвторизацияВыполнена; + Иначе + РезультатАвторизации = Новый Структура; + + Результат = АвторизоватьТекущегоПользователяПриВходе(Истина); + + Если ЗначениеЗаполнено(Результат.ОшибкаАвторизации) Тогда + РезультатАвторизации.Вставить("ОшибкаАвторизации", Результат.ОшибкаАвторизации); + + Иначе + Если Результат.ТребуетсяСменитьПароль Тогда + РезультатАвторизации.Вставить("ТребуетсяСменитьПароль"); + СтандартныеПодсистемыВызовСервера.СкрытьРабочийСтолПриНачалеРаботыСистемы(); + КонецЕсли; + + Если Не ОбщегоНазначения.РазделениеВключено() + И Пользователи.ЭтоПолноправныйПользователь(, Истина, Ложь) + И РегистрыСведений.СведенияОПользователях.ЗадатьВопросПроОтключениеOpenIDConnect() Тогда + + РезультатАвторизации.Вставить("ЗадатьВопросПроОтключениеOpenIDConnect"); + КонецЕсли; + КонецЕсли; + + Параметры.ПолученныеПараметрыКлиента.Вставить("АвторизацияВыполнена", + ?(ЗначениеЗаполнено(РезультатАвторизации), РезультатАвторизации, Неопределено)); КонецЕсли; - Если ЗначениеЗаполнено(Результат.ОшибкаАвторизации) Тогда - Параметры.Вставить("ОшибкаАвторизации", Результат.ОшибкаАвторизации); + Если ЗначениеЗаполнено(РезультатАвторизации) Тогда + Для Каждого КлючИЗначение Из РезультатАвторизации Цикл + Параметры.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение); + КонецЦикла; + КонецЕсли; + + Если Параметры.Свойство("ОшибкаАвторизации") Тогда Отказ = Истина; КонецЕсли; @@ -1101,6 +1129,7 @@ Обработчики.Вставить("ТекущийПользователь", "ПользователиСлужебный.УстановкаПараметровСеанса"); Обработчики.Вставить("ТекущийВнешнийПользователь", "ПользователиСлужебный.УстановкаПараметровСеанса"); Обработчики.Вставить("АвторизованныйПользователь", "ПользователиСлужебный.УстановкаПараметровСеанса"); + Обработчики.Вставить("ОбновлениеСправочниковПользователей", "ПользователиСлужебный.УстановкаПараметровСеанса"); КонецПроцедуры @@ -1169,9 +1198,11 @@ Для Каждого Адресат Из ВариантПараметров.Адресаты Цикл ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Адресат.Ключ); Если ПользовательИБ = Неопределено - Или ПользовательИБ.АутентификацияСтандартная = Ложь - И ПользовательИБ.АутентификацияОС = Ложь - И ПользовательИБ.АутентификацияOpenID = Ложь Тогда + Или ПользовательИБ.АутентификацияСтандартная = Ложь + И ПользовательИБ.АутентификацияOpenID = Ложь + И ПользовательИБ.АутентификацияOpenIDConnect = Ложь + И ПользовательИБ.АутентификацияТокеномДоступа = Ложь + И ПользовательИБ.АутентификацияОС = Ложь Тогда АдресатыБлокировки.Вставить(Адресат.Ключ, Адресат.Значение); Продолжить; @@ -1226,21 +1257,47 @@ МодульЦентрМониторинга = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторинга"); АутентификацияСтандартная = 0; - АутентификацияОС = 0; АутентификацияOpenID = 0; + АутентификацияOpenIDConnect = 0; + АутентификацияТокеномДоступа = 0; + АутентификацияОС = 0; ВходВПрограммуРазрешен = 0; Для Каждого ОписаниеПользователя Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл - АутентификацияСтандартная = ?(ОписаниеПользователя.АутентификацияСтандартная, 1, 0); - АутентификацияОС = ?(ОписаниеПользователя.АутентификацияОС, 1, 0); - АутентификацияOpenID = ?(ОписаниеПользователя.АутентификацияOpenID, 1, 0); - ВходВПрограммуРазрешен = ?(ОписаниеПользователя.АутентификацияСтандартная - Или ОписаниеПользователя.АутентификацияОС Или ОписаниеПользователя.АутентификацияOpenID, 1, 0); + АутентификацияСтандартная = АутентификацияСтандартная + + ?(ОписаниеПользователя.АутентификацияСтандартная, 1, 0); + АутентификацияOpenID = АутентификацияOpenID + + ?(ОписаниеПользователя.АутентификацияOpenID, 1, 0); + АутентификацияOpenIDConnect = АутентификацияOpenIDConnect + + ?(ОписаниеПользователя.АутентификацияOpenIDConnect, 1, 0); + АутентификацияТокеномДоступа = АутентификацияТокеномДоступа + + ?(ОписаниеПользователя.АутентификацияТокеномДоступа, 1, 0); + АутентификацияОС = АутентификацияОС + + ?(ОписаниеПользователя.АутентификацияОС, 1, 0); + ВходВПрограммуРазрешен = ВходВПрограммуРазрешен + + ?(ОписаниеПользователя.АутентификацияСтандартная + Или ОписаниеПользователя.АутентификацияOpenID + Или ОписаниеПользователя.АутентификацияOpenIDConnect + Или ОписаниеПользователя.АутентификацияТокеномДоступа + Или ОписаниеПользователя.АутентификацияОС, 1, 0); КонецЦикла; - МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации("Справочник.Пользователи.АутентификацияСтандартная", АутентификацияСтандартная); - МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации("Справочник.Пользователи.АутентификацияОС", АутентификацияОС); - МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации("Справочник.Пользователи.АутентификацияOpenID", АутентификацияOpenID); - МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации("Справочник.Пользователи.ВходВПрограммуРазрешен", ВходВПрограммуРазрешен); + МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации( + "Справочник.Пользователи.АутентификацияСтандартная", АутентификацияСтандартная); + + МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации( + "Справочник.Пользователи.АутентификацияOpenID", АутентификацияOpenID); + + МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации( + "Справочник.Пользователи.АутентификацияOpenIDConnect", АутентификацияOpenIDConnect); + + МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации( + "Справочник.Пользователи.АутентификацияТокеномДоступа", АутентификацияТокеномДоступа); + + МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации( + "Справочник.Пользователи.АутентификацияОС", АутентификацияОС); + + МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации( + "Справочник.Пользователи.ВходВПрограммуРазрешен", ВходВПрограммуРазрешен); ТекстЗапроса = "ВЫБРАТЬ @@ -1254,16 +1311,17 @@ Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); - МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации("Справочник.Пользователи.Недействителен", Выборка.Количество); + МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации( + "Справочник.Пользователи.Недействителен", Выборка.Количество); - Настройки = ПользователиСлужебныйПовтИсп.Настройки().Пользователи; + Настройки = НастройкиВхода().Пользователи; ИспользованиеРасширенныхНастроекВхода = Настройки.ПарольДолженОтвечатьТребованиямСложности Или ЗначениеЗаполнено(Настройки.МинимальнаяДлинаПароля) Или ЗначениеЗаполнено(Настройки.МаксимальныйСрокДействияПароля) Или ЗначениеЗаполнено(Настройки.МинимальныйСрокДействияПароля) Или ЗначениеЗаполнено(Настройки.ЗапретитьПовторениеПароляСредиПоследних) - Или ЗначениеЗаполнено(Настройки.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода) - Или ЗначениеЗаполнено(Настройки.ПросрочкаРаботыВПрограммеДатаВключения); + Или ЗначениеЗаполнено(Настройки.ПредупреждатьОбОкончанииСрокаДействияПароля) + Или ЗначениеЗаполнено(Настройки.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода); МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации( "Справочник.Пользователи.ИспользованиеРасширенныхНастроекВхода", @@ -1282,7 +1340,8 @@ Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); - МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации("Справочник.Пользователи.Активный", Выборка.Количество); + МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации( + "Справочник.Пользователи.Активный", Выборка.Количество); ТекстЗапроса = "ВЫБРАТЬ @@ -1341,23 +1400,12 @@ Обработчик.Приоритет = 1; КонецЕсли; - Если Не ОбщегоНазначения.РазделениеВключено() Тогда - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "3.0.2.192"; - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.Процедура = "ПользователиСлужебный.ПеренестиНастройкиДлиныИСложностиПаролейКонфигуратора"; - - КонецЕсли; - Обработчик = Обработчики.Добавить(); Обработчик.НачальноеЗаполнение = Истина; Обработчик.РежимВыполнения = "Оперативно"; Обработчик.Процедура = "ПользователиСлужебный.ЗаполнитьНаименованиеПредопределенныхГруппПользователей"; - Если Не ОбщегоНазначения.РазделениеВключено() - И ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда + Если Не ОбщегоНазначения.РазделениеВключено() Тогда // Пользователи Обработчик = Обработчики.Добавить(); @@ -1424,15 +1472,24 @@ Обработчик.РежимВыполнения = "Оперативно"; Обработчик.Процедура = "Константы.ИспользоватьГруппыВнешнихПользователей.Обновить"; - Если Не ОбщегоНазначения.РазделениеВключено() Тогда - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "3.1.6.108"; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.Процедура = "Константы.УдалитьНастройкиВходаПользователей.ПеренестиНастройки"; - Обработчик.Комментарий = НСтр("ru = 'Перенос настроек входа пользователей'"); - - КонецЕсли; + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "3.1.8.31"; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.Процедура = "РегистрыСведений.СведенияОПользователях.ОбновитьСведенияОПользователяхИОтключитьАутентификацию"; + Обработчик.Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '- Перенос значений устаревших реквизитов ""(не используется) Свойства пользователя ИБ"" из справочников ""Пользователи"" и ""Внешние пользователи"" в регистр сведений ""Сведения о пользователях"". + |- Обновление значения реквизита ""Номер картинки состояния"" в регистре сведений ""Сведения о пользователях"". + |- Удаление из регистра сведения ""Сведения о пользователях"" записей с несуществующими пользователями и внешними пользователями. + |- Сброс лишней аутентификации %1 и аутентификации недействительных пользователей.'"), + "OpenID-Connect"); + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "3.1.8.198"; + Обработчик.ОбщиеДанные = ОбщегоНазначения.РазделениеВключено(); + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.Процедура = "ПользователиСлужебный.ПеренестиНастройкиДлиныИСложностиПаролейКонфигуратора"; + Обработчик.Комментарий = НСтр("ru = 'Заполнение и перенос настроек входа пользователей'"); КонецПроцедуры @@ -1623,13 +1680,19 @@ Если ИмяПараметра <> "ТекущийПользователь" И ИмяПараметра <> "ТекущийВнешнийПользователь" - И ИмяПараметра <> "АвторизованныйПользователь" Тогда + И ИмяПараметра <> "АвторизованныйПользователь" + И ИмяПараметра <> "ОбновлениеСправочниковПользователей" Тогда Возврат; КонецЕсли; УстановитьПривилегированныйРежим(Истина); + ПараметрыСеанса.ОбновлениеСправочниковПользователей = Новый ФиксированноеСоответствие(Новый Соответствие); + Если ИмяПараметра = "ОбновлениеСправочниковПользователей" Тогда + Возврат; + КонецЕсли; + Попытка Значения = ЗначенияПараметровСеансаТекущийПользователь(); Исключение @@ -1640,7 +1703,7 @@ | |Обратитесь к администратору.'"), "ТекущийПользователь", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ВызватьИсключение ТекстОшибки; КонецПопытки; @@ -1687,64 +1750,404 @@ //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции работы с настройками входа пользователей. -// См. ПользователиСлужебныйПовтИсп.Настройки +// Возвращаемое значение: +// Структура: +// * Общие - см. Пользователи.НовоеОписаниеОбщихНастроекВхода +// * Пользователи - см. Пользователи.НовоеОписаниеНастроекВхода +// * ВнешниеПользователи - см. Пользователи.НовоеОписаниеНастроекВхода +// Функция НастройкиВхода() Экспорт - Настройки = Пользователи.НовоеОписаниеНастроекВхода(); - КопияНастроек = Новый ФиксированнаяСтруктура(Настройки); + Настройки = Новый Структура; + Настройки.Вставить("Общие", Пользователи.НовоеОписаниеОбщихНастроекВхода()); + Настройки.Вставить("Пользователи", Пользователи.НовоеОписаниеНастроекВхода()); + Настройки.Вставить("ВнешниеПользователи", Пользователи.НовоеОписаниеНастроекВхода()); - ПодготовленныеНастройки = Новый Структура; - ПодготовленныеНастройки.Вставить("Пользователи", Новый Структура(КопияНастроек)); - ПодготовленныеНастройки.Вставить("ВнешниеПользователи", Настройки); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); + ОбщиеНастройкиВходаИспользуются = Пользователи.ОбщиеНастройкиВходаИспользуются(); + ОкруглятьПолитикуПаролей = Не РазделениеВключено И ОбщиеНастройкиВходаИспользуются; УстановитьПривилегированныйРежим(Истина); - Если ОбщегоНазначения.РазделениеВключено() Тогда + СохраненныеНастройки = Константы.НастройкиВходаПользователей.Получить().Получить(); + + Если ТипЗнч(СохраненныеНастройки) = Тип("Структура") Тогда - СохраненныеНастройки = Константы.НастройкиВходаПользователей.Получить().Получить(); + Для Каждого Настройка Из Настройки Цикл + + Если Не СохраненныеНастройки.Свойство(Настройка.Ключ) + Или ТипЗнч(СохраненныеНастройки[Настройка.Ключ]) <> Тип("Структура") Тогда + Продолжить; + КонецЕсли; + + НачальныеНастройки = Настройка.Значение; + ТекущиеНастройки = СохраненныеНастройки[Настройка.Ключ]; + + Для Каждого НачальнаяНастройка Из НачальныеНастройки Цикл + + Если Не ТекущиеНастройки.Свойство(НачальнаяНастройка.Ключ) + Или ТипЗнч(ТекущиеНастройки[НачальнаяНастройка.Ключ]) <> ТипЗнч(НачальнаяНастройка.Значение) Тогда + Продолжить; + КонецЕсли; + НачальныеНастройки[НачальнаяНастройка.Ключ] = ТекущиеНастройки[НачальнаяНастройка.Ключ]; + КонецЦикла; + КонецЦикла; - Иначе + КонецЕсли; + + Если РазделениеВключено + Или ВнешниеПользователи.ИспользоватьВнешнихПользователей() Тогда - СохраненныеНастройки = Константы.УдалитьНастройкиВходаПользователей.Получить().Получить(); - Если СохраненныеНастройки = Неопределено Тогда - СохраненныеНастройки = Константы.НастройкиВходаПользователей.Получить().Получить(); + Настройки.Общие.ПоказыватьВСпискеВыбора = "СкрытоИВыключеноДляВсехПользователей"; + + ИначеЕсли Настройки.Общие.ПоказыватьВСпискеВыбора <> "ВключеноДляНовыхПользователей" + И Настройки.Общие.ПоказыватьВСпискеВыбора <> "ВыключеноДляНовыхПользователей" + И Настройки.Общие.ПоказыватьВСпискеВыбора <> "СкрытоИВключеноДляВсехПользователей" + И Настройки.Общие.ПоказыватьВСпискеВыбора <> "СкрытоИВыключеноДляВсехПользователей" Тогда + + Настройки.Общие.ПоказыватьВСпискеВыбора = + Пользователи.НовоеОписаниеОбщихНастроекВхода().ПоказыватьВСпискеВыбора; + КонецЕсли; + + // Заполнение общих настроек. + ЗаполнитьОбщиеНастройкиИзОбщейПолитикиПаролей(Настройки.Общие); + Если ОкруглятьПолитикуПаролей Тогда + ОбновитьОбщуюПолитикуПаролей(Настройки.Общие); + КонецЕсли; + + // Заполнение настроек обычных пользователей. + ЗаполнитьНастройкиИзПолитикиПаролейПользователей(Настройки.Пользователи); + Если ОкруглятьПолитикуПаролей Тогда + ОбновитьПолитикуПаролейПользователей(Настройки.Пользователи); + КонецЕсли; + + // Заполнение настроек внешних пользователей. + Если Настройки.Общие.ОтдельныеНастройкиДляВнешнихПользователей Тогда + ЗаполнитьНастройкиИзПолитикиПаролейВнешнихПользователей(Настройки.ВнешниеПользователи); + КонецЕсли; + + Если Не РазделениеВключено Тогда + Если Настройки.Общие.ОтдельныеНастройкиДляВнешнихПользователей + И ОбщиеНастройкиВходаИспользуются Тогда + ОбновитьПолитикуПаролейВнешнихПользователей(Настройки.ВнешниеПользователи); + Иначе + ОбновитьПолитикуПаролейВнешнихПользователей(Неопределено); КонецЕсли; - КонецЕсли; УстановитьПривилегированныйРежим(Ложь); - Если ТипЗнч(СохраненныеНастройки) <> Тип("Структура") Тогда - Возврат ПодготовленныеНастройки; - КонецЕсли; - - Для Каждого ПодготовленнаяНастройка Из ПодготовленныеНастройки Цикл - - Если Не СохраненныеНастройки.Свойство(ПодготовленнаяНастройка.Ключ) - Или ТипЗнч(СохраненныеНастройки[ПодготовленнаяНастройка.Ключ]) <> Тип("Структура") Тогда - Продолжить; - КонецЕсли; - - НачальныеНастройки = ПодготовленнаяНастройка.Значение; - ТекущиеНастройки = СохраненныеНастройки[ПодготовленнаяНастройка.Ключ]; - - Для Каждого НачальнаяНастройка Из НачальныеНастройки Цикл - - Если Не ТекущиеНастройки.Свойство(НачальнаяНастройка.Ключ) - Или ТипЗнч(ТекущиеНастройки[НачальнаяНастройка.Ключ]) <> ТипЗнч(НачальнаяНастройка.Значение) Тогда - Продолжить; - КонецЕсли; - - НачальныеНастройки[НачальнаяНастройка.Ключ] = ТекущиеНастройки[НачальнаяНастройка.Ключ]; - - КонецЦикла; - - КонецЦикла; - - Возврат ПодготовленныеНастройки; + Возврат Настройки; КонецФункции +// Параметры: +// Настройки - см. Пользователи.НовоеОписаниеОбщихНастроекВхода +// +Процедура ЗаполнитьОбщиеНастройкиИзОбщейПолитикиПаролей(Настройки) + + НастройкиБлокировки = БлокировкаАутентификации.ПолучитьНастройки(); + + Настройки.ДлительностьБлокировкиВводаПароля = + Окр(НастройкиБлокировки.ДлительностьБлокировки / 60); + + Настройки.КоличествоПопытокВводаПароляДоБлокировки = + НастройкиБлокировки.МаксимальноеКоличествоНеуспешныхПопыток; + +КонецПроцедуры + +// Параметры: +// Настройки - см. Пользователи.НовоеОписаниеОбщихНастроекВхода +// +Процедура ОбновитьОбщуюПолитикуПаролей(Настройки) Экспорт + + НастройкиБлокировки = БлокировкаАутентификации.ПолучитьНастройки(); + Записать = Ложь; + + Если НастройкиБлокировки.ДлительностьБлокировки + <> Настройки.ДлительностьБлокировкиВводаПароля * 60 Тогда + + Записать = Истина; + НастройкиБлокировки.ДлительностьБлокировки = + Настройки.ДлительностьБлокировкиВводаПароля * 60; + КонецЕсли; + + Если НастройкиБлокировки.МаксимальноеКоличествоНеуспешныхПопыток + <> Настройки.КоличествоПопытокВводаПароляДоБлокировки Тогда + + Записать = Истина; + НастройкиБлокировки.МаксимальноеКоличествоНеуспешныхПопыток = + Настройки.КоличествоПопытокВводаПароляДоБлокировки; + КонецЕсли; + + Если Записать Тогда + БлокировкаАутентификации.УстановитьНастройки(НастройкиБлокировки); + КонецЕсли; + +КонецПроцедуры + +// Параметры: +// Настройки - см. Пользователи.НовоеОписаниеНастроекВхода +// +Процедура ЗаполнитьНастройкиИзПолитикиПаролейПользователей(Настройки) + + СекундВДне = 24*60*60; + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); + + Настройки.ПарольДолженОтвечатьТребованиямСложности = + ПолучитьПроверкуСложностиПаролейПользователей(); + + Настройки.МинимальнаяДлинаПароля = + ПолучитьМинимальнуюДлинуПаролейПользователей(); + + Если Не РазделениеВключено Тогда + Настройки.МаксимальныйСрокДействияПароля = + Окр(ПолучитьМаксимальныйСрокДействияПаролейПользователей() / СекундВДне); + КонецЕсли; + + Настройки.МинимальныйСрокДействияПароля = + Окр(ПолучитьМинимальныйСрокДействияПаролейПользователей() / СекундВДне); + + Настройки.ЗапретитьПовторениеПароляСредиПоследних = + ПолучитьОграничениеПовторенияПаролейПользователейСредиПоследних(); + + Если Не РазделениеВключено Тогда + Настройки.ПредупреждатьОбОкончанииСрокаДействияПароля = + Окр(ПолучитьСрокПредупрежденияОбИстеченииСрокаДействияПаролейПользователей() / СекундВДне); + КонецЕсли; + +КонецПроцедуры + +// Параметры: +// Настройки - см. Пользователи.НовоеОписаниеНастроекВхода +// +Процедура ОбновитьПолитикуПаролейПользователей(Настройки) Экспорт + + СекундВДне = 24*60*60; + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); + + Если ПолучитьПроверкуСложностиПаролейПользователей() + <> Настройки.ПарольДолженОтвечатьТребованиямСложности Тогда + + УстановитьПроверкуСложностиПаролейПользователей( + Настройки.ПарольДолженОтвечатьТребованиямСложности); + КонецЕсли; + + Если ПолучитьМинимальнуюДлинуПаролейПользователей() + <> Настройки.МинимальнаяДлинаПароля Тогда + + УстановитьМинимальнуюДлинуПаролейПользователей( + Настройки.МинимальнаяДлинаПароля); + КонецЕсли; + + МаксимальныйСрокДействияПароля = ?(РазделениеВключено, + 0, Настройки.МаксимальныйСрокДействияПароля); + + Если ПолучитьМаксимальныйСрокДействияПаролейПользователей() + <> МаксимальныйСрокДействияПароля * СекундВДне Тогда + + УстановитьМаксимальныйСрокДействияПаролейПользователей( + МаксимальныйСрокДействияПароля * СекундВДне); + КонецЕсли; + + Если ПолучитьМинимальныйСрокДействияПаролейПользователей() + <> Настройки.МинимальныйСрокДействияПароля * СекундВДне Тогда + + УстановитьМинимальныйСрокДействияПаролейПользователей( + Настройки.МинимальныйСрокДействияПароля * СекундВДне); + КонецЕсли; + + Если ПолучитьОграничениеПовторенияПаролейПользователейСредиПоследних() + <> Настройки.ЗапретитьПовторениеПароляСредиПоследних Тогда + + УстановитьОграничениеПовторенияПаролейПользователейСредиПоследних( + Настройки.ЗапретитьПовторениеПароляСредиПоследних); + КонецЕсли; + + ПредупреждатьОбОкончанииСрокаДействияПароля = ?(РазделениеВключено, + 0, Настройки.ПредупреждатьОбОкончанииСрокаДействияПароля); + + Если ПолучитьСрокПредупрежденияОбИстеченииСрокаДействияПаролейПользователей() + <> ПредупреждатьОбОкончанииСрокаДействияПароля * СекундВДне Тогда + + УстановитьСрокПредупрежденияОбИстеченииСрокаДействияПаролейПользователей( + ПредупреждатьОбОкончанииСрокаДействияПароля * СекундВДне); + КонецЕсли; + +КонецПроцедуры + +// Параметры: +// Настройки - см. Пользователи.НовоеОписаниеНастроекВхода +// +Процедура ЗаполнитьНастройкиИзПолитикиПаролейВнешнихПользователей(Настройки) + + ПолитикаПаролей = ПолитикиПаролейПользователей.НайтиПоИмени( + ИмяПолитикиПаролейВнешнихПользователей()); + + Если ПолитикаПаролей = Неопределено Тогда + Возврат; + КонецЕсли; + + СекундВДне = 24*60*60; + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); + + Настройки.ПарольДолженОтвечатьТребованиямСложности = + ПолитикаПаролей.ПроверкаСложностиПаролей; + + Настройки.МинимальнаяДлинаПароля = + ПолитикаПаролей.МинимальнаяДлинаПаролей; + + Если Не РазделениеВключено Тогда + Настройки.МаксимальныйСрокДействияПароля = + Окр(ПолитикаПаролей.МаксимальныйСрокДействияПаролей / СекундВДне); + КонецЕсли; + + Настройки.МинимальныйСрокДействияПароля = + Окр(ПолитикаПаролей.МинимальныйСрокДействияПаролей / СекундВДне); + + Настройки.ЗапретитьПовторениеПароляСредиПоследних = + ПолитикаПаролей.ОграничениеПовторенияПаролейСредиПоследних; + + Если Не РазделениеВключено Тогда + Настройки.ПредупреждатьОбОкончанииСрокаДействияПароля = + Окр(ПолитикаПаролей.СрокПредупрежденияОбИстеченииСрокаДействияПаролей / СекундВДне); + КонецЕсли; + +КонецПроцедуры + +// Параметры: +// Настройки - см. Пользователи.НовоеОписаниеНастроекВхода +// +Процедура ОбновитьПолитикуПаролейВнешнихПользователей(Настройки) Экспорт + + ИмяПолитики = ИмяПолитикиПаролейВнешнихПользователей(); + + ПолитикаПаролей = ПолитикиПаролейПользователей.НайтиПоИмени(ИмяПолитики); + Если Настройки = Неопределено Тогда + Если ПолитикаПаролей <> Неопределено Тогда + ПолитикаПаролей.Удалить(); + КонецЕсли; + Возврат; + КонецЕсли; + + Записать = Ложь; + Если ПолитикаПаролей = Неопределено Тогда + ПолитикаПаролей = ПолитикиПаролейПользователей.СоздатьПолитику(); + ПолитикаПаролей.Имя = ИмяПолитики; + Записать = Истина; + КонецЕсли; + + СекундВДне = 24*60*60; + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); + + ОбновитьСвойствоПолитики(ПолитикаПаролей.ПроверкаСложностиПаролей, + Настройки.ПарольДолженОтвечатьТребованиямСложности, Записать); + + ОбновитьСвойствоПолитики(ПолитикаПаролей.МинимальнаяДлинаПаролей, + Настройки.МинимальнаяДлинаПароля, Записать); + + ОбновитьСвойствоПолитики(ПолитикаПаролей.МаксимальныйСрокДействияПаролей, + ?(РазделениеВключено, 0, Настройки.МаксимальныйСрокДействияПароля * СекундВДне), Записать); + + ОбновитьСвойствоПолитики(ПолитикаПаролей.МинимальныйСрокДействияПаролей, + Настройки.МинимальныйСрокДействияПароля * СекундВДне, Записать); + + ОбновитьСвойствоПолитики(ПолитикаПаролей.ОграничениеПовторенияПаролейСредиПоследних, + Настройки.ЗапретитьПовторениеПароляСредиПоследних, Записать); + + ОбновитьСвойствоПолитики(ПолитикаПаролей.СрокПредупрежденияОбИстеченииСрокаДействияПаролей, + ?(РазделениеВключено, 0, Настройки.ПредупреждатьОбОкончанииСрокаДействияПароля * СекундВДне), Записать); + + Если Записать Тогда + ПолитикаПаролей.Записать(); + КонецЕсли; + +КонецПроцедуры + +Процедура ОбновитьСвойствоПолитики(ЗначениеПолитики, ЗначениеНастройки, Записать) + + Если ЗначениеПолитики = ЗначениеНастройки Тогда + Возврат; + КонецЕсли; + + ЗначениеПолитики = ЗначениеНастройки; + Записать = Истина; + +КонецПроцедуры + +// Параметры: +// ПользовательИБ - ПользовательИнформационнойБазы +// ЭтоВнешнийПользователь - Булево +// +Процедура УстановитьПолитикуПаролей(ПользовательИБ, ЭтоВнешнийПользователь) Экспорт + + ИмяПолитикиПаролей = ИмяПолитикиПаролей(ЭтоВнешнийПользователь); + Если ПользовательИБ.ИмяПолитикиПаролей <> ИмяПолитикиПаролей Тогда + ПользовательИБ.ИмяПолитикиПаролей = ИмяПолитикиПаролей; + КонецЕсли; + +КонецПроцедуры + +// Параметры: +// ЭтоВнешнийПользователь - Булево +// +Функция ИмяПолитикиПаролей(ЭтоВнешнийПользователь) Экспорт + + Если ЭтоВнешнийПользователь Тогда + Возврат ИмяПолитикиПаролейВнешнихПользователей(); + КонецЕсли; + + Возврат ""; + +КонецФункции + +Функция ИмяПолитикиПаролейВнешнихПользователей() + + Возврат "ExternalUsers"; + +КонецФункции + +// У всех пользователей ИБ устанавливает реквизит ПоказыватьВСпискеВыбора. +// Параметры: +// Показывать - Булево +// +Процедура УстановитьРеквизитПоказыватьВСпискеВыбораУВсехПользователейИБ(Показывать) Экспорт + + Скрытые = Новый Соответствие; + + Если Показывать Тогда + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ПустойУникальныйИдентификатор", + ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор()); + Запрос.Текст = + "ВЫБРАТЬ + | Пользователи.ИдентификаторПользователяИБ КАК ИдентификаторПользователяИБ + |ИЗ + | Справочник.Пользователи КАК Пользователи + |ГДЕ + | Пользователи.ИдентификаторПользователяИБ <> &ПустойУникальныйИдентификатор + | И (Пользователи.Служебный + | ИЛИ Пользователи.Недействителен)"; + Выборка = Запрос.Выполнить().Выбрать(); + Скрытые.Вставить(Выборка.ИдентификаторПользователяИБ, Истина); + КонецЕсли; + + ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); + Для Каждого ПользовательИБ Из ПользователиИБ Цикл + Если Не Показывать + Или Скрытые.Получить(ПользовательИБ.УникальныйИдентификатор) <> Неопределено Тогда + ПоказыватьВСпискеВыбора = Ложь; + Иначе + ПоказыватьВСпискеВыбора = ПользовательИБ.АутентификацияСтандартная; + КонецЕсли; + Если ПользовательИБ.ПоказыватьВСпискеВыбора <> ПоказыватьВСпискеВыбора Тогда + ПользовательИБ.ПоказыватьВСпискеВыбора = ПоказыватьВСпискеВыбора; + ПользовательИБ.Записать(); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции работы с паролем. @@ -1787,7 +2190,7 @@ // Создание генератора случайных чисел. Если ГСЧ = Неопределено Тогда - ГСЧ = Новый ГенераторСлучайныхЧисел(); + ГСЧ = Пользователи.СвойстваПароля().ГСЧ; КонецЕсли; Счетчик = 0; @@ -2039,44 +2442,40 @@ КонецЕсли; // Проверка минимального срока действия пароля. - Если Не ОбщегоНазначения.РазделениеВключено() И УровеньДоступа.НастройкиДляВхода Тогда + Если ПользовательИБ = Неопределено + Или Не ОбщегоНазначения.РазделениеВключено() + И УровеньДоступа.НастройкиДляВхода Тогда + Возврат Истина; КонецЕсли; - Если ТипЗнч(Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда - НастройкиВхода = ПользователиСлужебныйПовтИсп.Настройки().ВнешниеПользователи; - Иначе - НастройкиВхода = ПользователиСлужебныйПовтИсп.Настройки().Пользователи; - КонецЕсли; - - Если Не ЗначениеЗаполнено(НастройкиВхода.МинимальныйСрокДействияПароля) Тогда - Возврат Истина; - КонецЕсли; + ИмяПолитикиПаролей = ИмяПолитикиПаролей( + ТипЗнч(Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи")); УстановитьПривилегированныйРежим(Истина); - НаборЗаписей = РегистрыСведений.СведенияОПользователях.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Пользователь.Установить(Пользователь); - НаборЗаписей.Прочитать(); + ПолитикаПаролей = ПолитикиПаролейПользователей.НайтиПоИмени(ИмяПолитикиПаролей); + Если ПолитикаПаролей = Неопределено Тогда + МинимальныйСрокДействияПаролей = ПолучитьМинимальныйСрокДействияПаролейПользователей(); + Иначе + МинимальныйСрокДействияПаролей = ПолитикаПаролей.МинимальныйСрокДействияПаролей; + КонецЕсли; УстановитьПривилегированныйРежим(Ложь); - Если НаборЗаписей.Количество() = 0 Тогда - Возврат Истина; - КонецЕсли; - СведенияОПользователе = НаборЗаписей[0]; - - Если Не ЗначениеЗаполнено(СведенияОПользователе.ДатаНачалаИспользованияПароля) Тогда + Если Не ЗначениеЗаполнено(МинимальныйСрокДействияПаролей) Тогда Возврат Истина; КонецЕсли; - НачалоДняТекущейДатыСеанса = НачалоДня(ТекущаяДатаСеанса()); - ОстатокМинимальногоСрокаДействияПароля = НастройкиВхода.МинимальныйСрокДействияПароля - - (НачалоДняТекущейДатыСеанса - СведенияОПользователе.ДатаНачалаИспользованияПароля) / (24*60*60); + ОстатокМинимальногоСрокаДействияПароля = МинимальныйСрокДействияПаролей + - (ТекущаяУниверсальнаяДата() - ПользовательИБ.ДатаУстановкиПароля); Если ОстатокМинимальногоСрокаДействияПароля <= 0 Тогда Возврат Истина; КонецЕсли; - КоличествоДней = ОстатокМинимальногоСрокаДействияПароля; + КоличествоДней = Окр(ОстатокМинимальногоСрокаДействияПароля / (24*60*60)); + Если КоличествоДней = 0 Тогда + КоличествоДней = 1; + КонецЕсли; ЧислоИПредмет = Формат(КоличествоДней, "ЧГ=") + " " + ПользователиСлужебныйКлиентСервер.ПредметЦелогоЧисла(КоличествоДней, @@ -2089,109 +2488,9 @@ КонецФункции -// Для форм элементов справочников Пользователи и ВнешниеПользователи. -// -// Параметры: -// Форма - ФормаКлиентскогоПриложения: -// * Объект - СправочникОбъект.Пользователи -// - СправочникОбъект.ВнешниеПользователи -// -Процедура ПрочитатьСведенияОПользователе(Форма) Экспорт - - Если ОбщегоНазначения.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - - Пользователь = Форма.Объект.Ссылка; - - Если Не ЗначениеЗаполнено(Пользователь) Тогда - Возврат; - КонецЕсли; - - УровеньДоступа = УровеньДоступаКСвойствамПользователя(Форма.Объект); - - НаборЗаписей = РегистрыСведений.СведенияОПользователях.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Пользователь.Установить(Пользователь); - НаборЗаписей.Прочитать(); - - Форма.ПотребоватьСменуПароляПриВходе = Ложь; - Форма.СрокДействияНеОграничен = Ложь; - Форма.СрокДействия = Неопределено; - Форма.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода = 0; - - Если НаборЗаписей.Количество() > 0 Тогда - - Если УровеньДоступа.УправлениеСписком - Или УровеньДоступа.ИзменениеТекущего Тогда - - ЗаполнитьЗначенияСвойств(Форма, НаборЗаписей[0], - "ПотребоватьСменуПароляПриВходе, - |СрокДействияНеОграничен, - |СрокДействия, - |ПросрочкаРаботыВПрограммеДоЗапрещенияВхода"); - Иначе - Форма.ПотребоватьСменуПароляПриВходе = НаборЗаписей[0].ПотребоватьСменуПароляПриВходе; - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -// Для форм элементов справочников Пользователи и ВнешниеПользователи. -// -// Параметры: -// Форма - ФормаКлиентскогоПриложения -// ТекущийОбъект - СправочникОбъект.Пользователи -// - СправочникОбъект.ВнешниеПользователи -// -Процедура ЗаписатьСведенияОПользователе(Форма, ТекущийОбъект) Экспорт - - Если ОбщегоНазначения.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - - УровеньДоступа = УровеньДоступаКСвойствамПользователя(ТекущийОбъект); - - Пользователь = ТекущийОбъект.Ссылка; - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.СведенияОПользователях"); - ЭлементБлокировки.УстановитьЗначение("Пользователь", Пользователь); - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - НаборЗаписей = РегистрыСведений.СведенияОПользователях.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Пользователь.Установить(Пользователь); - НаборЗаписей.Прочитать(); - Если НаборЗаписей.Количество() = 0 Тогда - СведенияОПользователе = НаборЗаписей.Добавить(); - СведенияОПользователе.Пользователь = Пользователь; - Иначе - СведенияОПользователе = НаборЗаписей[0]; - КонецЕсли; - - Если УровеньДоступа.НастройкиДляВхода Тогда - ЗаполнитьЗначенияСвойств(СведенияОПользователе, Форма, - "ПотребоватьСменуПароляПриВходе, - |СрокДействияНеОграничен, - |СрокДействия, - |ПросрочкаРаботыВПрограммеДоЗапрещенияВхода"); - Иначе - СведенияОПользователе.ПотребоватьСменуПароляПриВходе = Форма.ПотребоватьСменуПароляПриВходе; - КонецЕсли; - - НаборЗаписей.Записать(); - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - // Для формы СменаПароля и перед записью пользователя ИБ. // Выполняет проверку нового пароля, старого пароля и в случае успеха -// регистрирует новый пароль в списке использованных паролей, -// а также устанавливает его, если вызов выполнен из формы СменаПароля. +// устанавливает его, если вызов выполнен из формы СменаПароля. // // Параметры: // Параметры - Структура: @@ -2249,7 +2548,7 @@ Если ДополнительныеПараметры.ЭтоТекущийПользовательИБ И ДополнительныеПараметры.ПарольУстановлен - И (ВызовИзФормыСменаПароля Или СтарыйПароль <> Неопределено) Тогда + И (СтарыйПароль <> Неопределено) Тогда Параметры.СтарыйПарольСовпадает = СтарыйПарольСовпадаетССохраненным( СтарыйПароль, ДополнительныеПараметры.ИдентификаторПользователяИБ); @@ -2259,29 +2558,24 @@ КонецЕсли; КонецЕсли; - Если ПользователиСлужебныйПовтИсп.Настройки().ОбщиеНастройкиВхода Тогда - Если ТипЗнч(Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда - НастройкиВхода = ПользователиСлужебныйПовтИсп.Настройки().ВнешниеПользователи; - Иначе - НастройкиВхода = ПользователиСлужебныйПовтИсп.Настройки().Пользователи; - КонецЕсли; - ТекстОшибкиПароля = ОшибкаДлиныИлиСложностиПароля(НовыйПароль, - НастройкиВхода.МинимальнаяДлинаПароля, - НастройкиВхода.ПарольДолженОтвечатьТребованиямСложности, - ИмяДляВхода); - Иначе - ТекстОшибкиПароля = ОшибкаДлиныИлиСложностиПароля(НовыйПароль, - ПолучитьМинимальнуюДлинуПаролейПользователей(), - ПолучитьПроверкуСложностиПаролейПользователей(), - ИмяДляВхода); + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( + ДополнительныеПараметры.ИдентификаторПользователяИБ); + Если ТипЗнч(ПользовательИБ) <> Тип("ПользовательИнформационнойБазы") Тогда + ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя(); КонецЕсли; + УстановитьПолитикуПаролей(ПользовательИБ, + ТипЗнч(Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи")); + ТекстОшибкиПароля = ОшибкаСоответствияПароляТребованиям(НовыйПароль, ПользовательИБ); + + УстановитьПривилегированныйРежим(Ложь); Если ЗначениеЗаполнено(ТекстОшибкиПароля) Тогда Возврат ТекстОшибкиПароля; КонецЕсли; - ТекстОшибки = ""; - СохраняемоеЗначениеПароля = СохраняемоеЗначениеСтрокиПароля(НовыйПароль); + Если ВызовИзФормыСменаПароля И Параметры.ТолькоПроверить Тогда + Возврат ""; + КонецЕсли; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(Пользователь)).ПолноеИмя()); @@ -2291,61 +2585,56 @@ НачатьТранзакцию(); Попытка Блокировка.Заблокировать(); - НаборЗаписей = РегистрыСведений.СведенияОПользователях.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Пользователь.Установить(Пользователь); - НаборЗаписей.Прочитать(); - Если НаборЗаписей.Количество() = 0 Тогда - СведенияОПользователе = НаборЗаписей.Добавить(); - СведенияОПользователе.Пользователь = Пользователь; - Иначе - СведенияОПользователе = НаборЗаписей[0]; - КонецЕсли; - ИспользованныеПароли = СведенияОПользователе.ИспользованныеПароли.Получить(); - Если ИспользованныеПароли = Неопределено Тогда - ИспользованныеПароли = Новый Массив; - КонецЕсли; - Если ПользователиСлужебныйПовтИсп.Настройки().ОбщиеНастройкиВхода - И ЗначениеЗаполнено(НастройкиВхода.ЗапретитьПовторениеПароляСредиПоследних) - И НовыйПарольИспользовалсяРанее(ИспользованныеПароли, СохраняемоеЗначениеПароля) Тогда + Если ВызовИзФормыСменаПароля Тогда + ОписаниеПользователяИБ = Новый Структура; + ОписаниеПользователяИБ.Вставить("Действие", "Записать"); + ОписаниеПользователяИБ.Вставить("Пароль", НовыйПароль); - ТекстОшибки = НСтр("ru = 'Новый пароль использовался ранее.'"); + ТекущийОбъект = Пользователь.ПолучитьОбъект(); + ТекущийОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", + ОписаниеПользователяИБ); - ИначеЕсли Не (ВызовИзФормыСменаПароля И Параметры.ТолькоПроверить) Тогда - - Если ВызовИзФормыСменаПароля Тогда - ОписаниеПользователяИБ = Новый Структура; - ОписаниеПользователяИБ.Вставить("Действие", "Записать"); - ОписаниеПользователяИБ.Вставить("Пароль", НовыйПароль); - - ТекущийОбъект = Пользователь.ПолучитьОбъект(); - ТекущийОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", - ОписаниеПользователяИБ); - - Если Параметры.ПриВходеВПрограмму Тогда - ТекущийОбъект.ДополнительныеСвойства.Вставить("СменаПароляПриВходеВПрограмму"); + Если Параметры.ПриВходеВПрограмму Тогда + ТекущийОбъект.ДополнительныеСвойства.Вставить("СменаПароляПриВходеВПрограмму"); + КонецЕсли; + Если ОбщегоНазначения.РазделениеВключено() Тогда + Если ДополнительныеПараметры.ЭтоТекущийПользовательИБ Тогда + ТекущийОбъект.ДополнительныеСвойства.Вставить("ПарольПользователяСервиса", + СтарыйПароль); + Иначе + ТекущийОбъект.ДополнительныеСвойства.Вставить("ПарольПользователяСервиса", + Параметры.ПарольПользователяСервиса); КонецЕсли; - Если ОбщегоНазначения.РазделениеВключено() Тогда - Если ДополнительныеПараметры.ЭтоТекущийПользовательИБ Тогда - ТекущийОбъект.ДополнительныеСвойства.Вставить("ПарольПользователяСервиса", - СтарыйПароль); - Иначе - ТекущийОбъект.ДополнительныеСвойства.Вставить("ПарольПользователяСервиса", - Параметры.ПарольПользователяСервиса); - КонецЕсли; - ТекущийОбъект.ДополнительныеСвойства.Вставить("СинхронизироватьССервисом", Истина); - КонецЕсли; - Попытка - ТекущийОбъект.Записать(); - Исключение - Параметры.ПарольПользователяСервиса = Неопределено; - ВызватьИсключение; - КонецПопытки; + ТекущийОбъект.ДополнительныеСвойства.Вставить("СинхронизироватьССервисом", Истина); + КонецЕсли; + Попытка + ТекущийОбъект.Записать(); + Исключение + Параметры.ПарольПользователяСервиса = Неопределено; + ВызватьИсключение; + КонецПопытки; + Иначе + НаборЗаписей = РегистрыСведений.СведенияОПользователях.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Пользователь.Установить(Пользователь); + НаборЗаписей.Прочитать(); + Записать = Ложь; + Если НаборЗаписей.Количество() = 0 Тогда + СведенияОПользователе = НаборЗаписей.Добавить(); + СведенияОПользователе.Пользователь = Пользователь; + Записать = Истина; Иначе - Если Параметры.Пользователь.ДополнительныеСвойства.Свойство("СменаПароляПриВходеВПрограмму") Тогда - СведенияОПользователе.ПотребоватьСменуПароляПриВходе = Ложь; - КонецЕсли; - ОбновитьСведенияОбИспользованииПароля(СведенияОПользователе, СохраняемоеЗначениеПароля); + СведенияОПользователе = НаборЗаписей[0]; + КонецЕсли; + Если Параметры.Пользователь.ДополнительныеСвойства.Свойство("СменаПароляПриВходеВПрограмму") Тогда + СведенияОПользователе.ПотребоватьСменуПароляПриВходе = Ложь; + Записать = Истина; + КонецЕсли; + Если ОбщегоНазначения.РазделениеВключено() Тогда + СведенияОПользователе.УдалитьДатаНачалаИспользованияПароля = НачалоДня(ТекущаяДатаСеанса()); + Записать = Истина; + КонецЕсли; + Если Записать Тогда НаборЗаписей.Записать(); КонецЕсли; КонецЕсли; @@ -2364,13 +2653,13 @@ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось сменить пароль пользователя ""%1"" по причине: |%2'"), - Пользователь, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + Пользователь, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); Параметры.Вставить("ОшибкаЗаписанаВЖурналРегистрации"); КонецЕсли; ВызватьИсключение; КонецПопытки; - Возврат ТекстОшибки; + Возврат ""; КонецФункции @@ -2406,7 +2695,7 @@ Возврат Новый ФорматированнаяСтрока(Подсказка); КонецЕсли; - Если Не ПользователиСлужебныйПовтИсп.Настройки().ОбщиеНастройкиВхода Тогда + Если Не Пользователи.ОбщиеНастройкиВходаИспользуются() Тогда Подсказка = НСтр("ru = 'Требования к длине и сложности пароля задаются отдельно. |См. Параметры информационной базы в конфигураторе в меню Администрирование.'"); @@ -2419,117 +2708,31 @@ Если ЕстьРазделАдминистрирование Тогда Подсказка = НСтр("ru = 'Требования к длине и сложности пароля задаются отдельно. - |См. <a href = ""%1"">Настройки входа внешних пользователей</a> в разделе Администрирование, - |пункт Настройки пользователей и прав.'"); + |См. <a href = ""%1"">Настройки входа</a> на вкладке <b>Для внешних пользователей</b> + |в разделе <b>Администрирование</b>, пункт <b>Настройки пользователей и прав</b>.'"); Иначе Подсказка = НСтр("ru = 'Требования к длине и сложности пароля задаются отдельно. - |См. <a href = ""%1"">Настройки входа внешних пользователей</a>.'"); + |См. <a href = ""%1"">Настройки входа</a> на вкладке <b>Для внешних пользователей</b>.'"); КонецЕсли; Иначе Если ЕстьРазделАдминистрирование Тогда Подсказка = НСтр("ru = 'Требования к длине и сложности пароля задаются отдельно. - |См. <a href = ""%1"">Настройки входа пользователей</a> в разделе Администрирование, - |пункт Настройки пользователей и прав.'"); + |См. <a href = ""%1"">Настройки входа</a> на вкладке <b>Для пользователей</b> + |в разделе <b>Администрирование</b>, пункт <b>Настройки пользователей и прав</b>.'"); Иначе Подсказка = НСтр("ru = 'Требования к длине и сложности пароля задаются отдельно. - |См. <a href = ""%1"">Настройки входа пользователей</a>.'"); + |См. <a href = ""%1"">Настройки входа</a> на вкладке <b>Для пользователей</b>.'"); КонецЕсли; КонецЕсли; - Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - СтроковыеФункции.ФорматированнаяСтрока(Подсказка), + Возврат СтроковыеФункции.ФорматированнаяСтрока(Подсказка, "НастройкиВходаПользователей"); КонецФункции -// Добавляет пароль в список используемых, -// если в настройках для входа заполнено свойство ЗапретитьПовторениеПароляСредиПоследних -// -// Параметры: -// Пользователь - СправочникСсылка.Пользователи -// - СправочникСсылка.ВнешниеПользователи - пользователь для которого добавляется пароль -// СохраняемоеЗначениеПароля - Строка - хеш пароля -// -Процедура ДобавитьИспользованныйПароль(Пользователь, СохраняемоеЗначениеПароля) Экспорт - - Блокировка = Новый БлокировкаДанных(); - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.СведенияОПользователях"); - ЭлементБлокировки.УстановитьЗначение("Пользователь", Пользователь); - - НачатьТранзакцию(); - - Попытка - - Блокировка.Заблокировать(); - - СведенияОПользователе = РегистрыСведений.СведенияОПользователях.СоздатьМенеджерЗаписи(); - СведенияОПользователе.Пользователь = Пользователь; - СведенияОПользователе.Прочитать(); - - Если Не СведенияОПользователе.Выбран() Тогда - СведенияОПользователе.Пользователь = Пользователь; - КонецЕсли; - - ОбновитьСведенияОбИспользованииПароля(СведенияОПользователе, СохраняемоеЗначениеПароля); - - СведенияОПользователе.Записать(); - - ЗафиксироватьТранзакцию(); - - Исключение - - ОтменитьТранзакцию(); - ВызватьИсключение; - - КонецПопытки; - -КонецПроцедуры - -// Обновляет данные использования пароля в записи сведений о пользователе -// -// Параметры: -// СведенияОПользователе - РегистрСведенийМенеджерЗаписи.СведенияОПользователях -// - РегистрСведенийЗапись.СведенияОПользователях - запись регистра сведений -// СохраняемоеЗначениеПароля - Строка - хеш пароля -// НастройкиВхода - см. ПользователиСлужебный.НастройкиВхода -// -Процедура ОбновитьСведенияОбИспользованииПароля(СведенияОПользователе, СохраняемоеЗначениеПароля) - - Если ТипЗнч(СведенияОПользователе.Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда - НастройкиВхода = ПользователиСлужебныйПовтИсп.Настройки().ВнешниеПользователи; - Иначе - НастройкиВхода = ПользователиСлужебныйПовтИсп.Настройки().Пользователи; - КонецЕсли; - - ИспользованныеПароли = СведенияОПользователе.ИспользованныеПароли.Получить(); - Если ИспользованныеПароли = Неопределено Тогда - ИспользованныеПароли = Новый Массив(); - КонецЕсли; - - Если Пользователи.ОбщиеНастройкиВходаИспользуются() - И ЗначениеЗаполнено(НастройкиВхода.ЗапретитьПовторениеПароляСредиПоследних) Тогда - - ИспользованныеПароли.Добавить(СохраняемоеЗначениеПароля); - Пока ИспользованныеПароли.Количество() > НастройкиВхода.ЗапретитьПовторениеПароляСредиПоследних Цикл - ИспользованныеПароли.Удалить(0); - КонецЦикла; - - Иначе - ИспользованныеПароли.Очистить(); - КонецЕсли; - - ДатаНачалаИспользованияПароля = ?(ОбщегоНазначения.РазделениеВключено(), - НачалоДня(ТекущаяДатаСеанса()), - Неопределено); - - СведенияОПользователе.ДатаНачалаИспользованияПароля = ДатаНачалаИспользованияПароля; - СведенияОПользователе.ИспользованныеПароли = Новый ХранилищеЗначения(ИспользованныеПароли); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции работы с пользователями. @@ -2615,28 +2818,6 @@ КонецФункции -// Проверяет что среди сохраняемых значений использованных ранее паролей нет ни одного значения, -// у которого первая или вторая хеш-сумма совпадает с той же хеш-суммой нового пароля. -// -// Параметры: -// ИспользованныеПароли - Массив - содержит хеш-суммы использованных паролей в формате свойства -// СохраняемоеЗначениеПароля типа ПользовательИнформационнойБазы. -// -// СохраняемоеЗначениеНовогоПароля - Строка - хеш-суммы сохраняемого пароля в формате свойства -// СохраняемоеЗначениеПароля типа ПользовательИнформационнойБазы. -// -Функция НовыйПарольИспользовалсяРанее(ИспользованныеПароли, СохраняемоеЗначениеНовогоПароля) - - Для Каждого СохраняемоеЗначение Из ИспользованныеПароли Цикл - Если ХешСуммаПароляСовпадает(СохраняемоеЗначение, СохраняемоеЗначениеНовогоПароля) Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - - Возврат Ложь; - -КонецФункции - // Проверяет что у первого и второго паролей совпадают первые или вторые хеш-суммы. // // Параметры: @@ -2690,7 +2871,8 @@ // * ИзменениеРазрешенияНаВход - Булево - изменение флажка "Вход в программу разрешен". // * ОтключениеРазрешенияНаВход - Булево - снятие флажка "Вход в программу разрешен". // * НастройкиДляВхода - Булево - изменение свойств пользователя ИБ Имя, ПользовательОС и -// свойств элемента справочника АутентификацияOpenID, АутентификацияСтандартная, +// свойств элемента справочника АутентификацияСтандартная, АутентификацияOpenID, +// АутентификацияOpenIDConnect, АутентификацияТокеномДоступа, // АутентификацияОС и Роли (если нет запрета редактирования при внедрении). // * ИзменениеТекущего - Булево - изменение свойств текущего пользователя Пароль и Язык. // * НетДоступа - Булево - нет ни одного из указанных выше уровней доступа. @@ -2837,7 +3019,7 @@ // Реквизиты справочника, которые устанавливаются автоматически (проверка неизменности). АвтоРеквизиты = Новый Структура; АвтоРеквизиты.Вставить("ИдентификаторПользователяИБ"); - АвтоРеквизиты.Вставить("СвойстваПользователяИБ"); + АвтоРеквизиты.Вставить("УдалитьСвойстваПользователяИБ"); ПараметрыОбработки.Вставить("АвтоРеквизиты", АвтоРеквизиты); // Реквизиты справочника, которые не допускается изменять в подписках на события (проверка начальных значений). @@ -3013,32 +3195,30 @@ ДопустимыеСвойства.Вставить("УникальныйИдентификатор"); // Проверено выше. Если УровеньДоступа.ИзменениеТекущего Тогда + ДопустимыеСвойства.Вставить("АдресЭлектроннойПочты"); ДопустимыеСвойства.Вставить("Пароль"); ДопустимыеСвойства.Вставить("Язык"); - Если ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда - ДопустимыеСвойства.Вставить("АдресЭлектроннойПочты"); - КонецЕсли; КонецЕсли; Если УровеньДоступа.УправлениеСписком Тогда ДопустимыеСвойства.Вставить("ПолноеИмя"); + ДопустимыеСвойства.Вставить("АдресЭлектроннойПочты"); ДопустимыеСвойства.Вставить("ПоказыватьВСпискеВыбора"); ДопустимыеСвойства.Вставить("ЗапрещеноИзменятьПароль"); + ДопустимыеСвойства.Вставить("ЗапрещеноВосстанавливатьПароль"); ДопустимыеСвойства.Вставить("Язык"); ДопустимыеСвойства.Вставить("РежимЗапуска"); - Если ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда - ДопустимыеСвойства.Вставить("АдресЭлектроннойПочты"); - ДопустимыеСвойства.Вставить("ЗапрещеноВосстанавливатьПароль"); - КонецЕсли; КонецЕсли; Если УровеньДоступа.НастройкиДляВхода Тогда ДопустимыеСвойства.Вставить("Имя"); ДопустимыеСвойства.Вставить("АутентификацияСтандартная"); ДопустимыеСвойства.Вставить("Пароль"); + ДопустимыеСвойства.Вставить("АутентификацияOpenID"); + ДопустимыеСвойства.Вставить("АутентификацияOpenIDConnect"); + ДопустимыеСвойства.Вставить("АутентификацияТокеномДоступа"); ДопустимыеСвойства.Вставить("АутентификацияОС"); ДопустимыеСвойства.Вставить("ПользовательОС"); - ДопустимыеСвойства.Вставить("АутентификацияOpenID"); ДопустимыеСвойства.Вставить("Роли"); КонецЕсли; @@ -3151,12 +3331,11 @@ // Вызывается при обработке свойства СвойстваПользователяИБ пользователя в справочнике. // // Параметры: -// ОписаниеПользователя - СправочникОбъект.Пользователи -// - СправочникОбъект.ВнешниеПользователи -// - ДанныеФормыСтруктура - содержит свойство СвойстваПользователяИБ. -// - СправочникСсылка.Пользователи -// - СправочникСсылка.ВнешниеПользователи - -// из объекта которой нужно прочитать свойство СвойстваПользователяИБ. +// ОписаниеПользователя - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// - СтрокаТаблицыЗначений +// - Структура +// // ВходВПрограммуРазрешен - Булево - если указано Ложь, а сохранено Истина, тогда свойства // аутентификации безусловно Ложь, т.к. были сняты в конфигураторе. // @@ -3166,48 +3345,65 @@ Функция ХранимыеСвойстваПользователяИБ(ОписаниеПользователя, ВходВПрограммуРазрешен = Ложь) Экспорт Свойства = Новый Структура; - Свойства.Вставить("ВходВПрограммуРазрешен", Ложь); - Свойства.Вставить("АутентификацияСтандартная", Ложь); - Свойства.Вставить("АутентификацияOpenID", Ложь); - Свойства.Вставить("АутентификацияОС", Ложь); + Свойства.Вставить("ВходВПрограммуРазрешен", Ложь); + Свойства.Вставить("АутентификацияСтандартная", Ложь); + Свойства.Вставить("АутентификацияOpenID", Ложь); + Свойства.Вставить("АутентификацияOpenIDConnect", Ложь); + Свойства.Вставить("АутентификацияТокеномДоступа", Ложь); + Свойства.Вставить("АутентификацияОС", Ложь); Если ТипЗнч(ОписаниеПользователя) = Тип("СправочникСсылка.Пользователи") Или ТипЗнч(ОписаниеПользователя) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда - ХранилищеСвойств = ОбщегоНазначения.ЗначениеРеквизитаОбъекта( - ОписаниеПользователя, "СвойстваПользователяИБ"); + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Пользователь", ОписаниеПользователя); + Запрос.Текст = + "ВЫБРАТЬ + | СведенияОПользователях.ВходВПрограммуРазрешен КАК ВходВПрограммуРазрешен, + | СведенияОПользователях.АутентификацияСтандартная КАК АутентификацияСтандартная, + | СведенияОПользователях.АутентификацияOpenID КАК АутентификацияOpenID, + | СведенияОПользователях.АутентификацияOpenIDConnect КАК АутентификацияOpenIDConnect, + | СведенияОПользователях.АутентификацияТокеномДоступа КАК АутентификацияТокеномДоступа, + | СведенияОПользователях.АутентификацияОС КАК АутентификацияОС + |ИЗ + | РегистрСведений.СведенияОПользователях КАК СведенияОПользователях + |ГДЕ + | СведенияОПользователях.Пользователь = &Пользователь"; + Выборка = Запрос.Выполнить().Выбрать(); + Если Не Выборка.Следующий() Тогда + Возврат Свойства; + КонецЕсли; Иначе - ХранилищеСвойств = ОписаниеПользователя.СвойстваПользователяИБ; + Выборка = ОписаниеПользователя; КонецЕсли; - Если ТипЗнч(ХранилищеСвойств) <> Тип("ХранилищеЗначения") Тогда - Возврат Свойства; - КонецЕсли; + СохраненныеСвойства = Новый Структура(Новый ФиксированнаяСтруктура(Свойства)); + ЗаполнитьЗначенияСвойств(СохраненныеСвойства, Выборка); - СохраненныеСвойства = ХранилищеСвойств.Получить(); - - Если ТипЗнч(СохраненныеСвойства) <> Тип("Структура") Тогда - Возврат Свойства; - КонецЕсли; - - Для каждого КлючИЗначение Из Свойства Цикл - Если СохраненныеСвойства.Свойство(КлючИЗначение.Ключ) - И ТипЗнч(СохраненныеСвойства[КлючИЗначение.Ключ]) = Тип("Булево") Тогда - + Для Каждого КлючИЗначение Из Свойства Цикл + Если ТипЗнч(СохраненныеСвойства[КлючИЗначение.Ключ]) = Тип("Булево") Тогда Свойства[КлючИЗначение.Ключ] = СохраненныеСвойства[КлючИЗначение.Ключ]; КонецЕсли; КонецЦикла; Если Свойства.ВходВПрограммуРазрешен И Не ВходВПрограммуРазрешен Тогда - Свойства.Вставить("АутентификацияСтандартная", Ложь); - Свойства.Вставить("АутентификацияOpenID", Ложь); - Свойства.Вставить("АутентификацияОС", Ложь); + Свойства.АутентификацияСтандартная = Ложь; + Свойства.АутентификацияOpenID = Ложь; + Свойства.АутентификацияOpenIDConnect = Ложь; + Свойства.АутентификацияТокеномДоступа = Ложь; + Свойства.АутентификацияОС = Ложь; КонецЕсли; Возврат Свойства; КонецФункции +Процедура УстановитьХранимыеСвойстваПользователяИБ(ПользовательОбъект, ХранимыеСвойства) + + ПользовательОбъект.ДополнительныеСвойства.Вставить("ХранимыеСвойстваПользователяИБ", ХранимыеСвойства); + +КонецПроцедуры + // Нельзя вызвать из фоновых заданий с пустым пользователем. // // Параметры: @@ -3289,10 +3485,13 @@ Если ПользовательИБ = Неопределено Или ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь() Тогда + // АПК:336-выкл Не заменять на РолиДоступны. Это специальная проверка ролей администратора. //@skip-check using-isinrole - Возврат РольДоступна(Метаданные.Роли.ПолныеПрава) // Не заменять на РолиДоступны. - И (РольДоступна(Метаданные.Роли.АдминистраторСистемы) // Не заменять на РолиДоступны. + Возврат РольДоступна(Метаданные.Роли.ПолныеПрава) + //@skip-check using-isinrole + И (РольДоступна(Метаданные.Роли.АдминистраторСистемы) Или ОбщегоНазначения.РазделениеВключено() ); + // АПК:336-вкл КонецЕсли; Возврат ПользовательИБ.Роли.Содержит(Метаданные.Роли.ПолныеПрава) @@ -3372,12 +3571,16 @@ Если Не ОписаниеПользователяИБ.Свойство("Пароль") Или Не ЗначениеЗаполнено(ОписаниеПользователяИБ.Пароль) Тогда - Если ЭтоВнешнийПользователь Тогда - НастройкиВхода = ПользователиСлужебныйПовтИсп.Настройки().ВнешниеПользователи; + ИмяПолитикиПаролей = ИмяПолитикиПаролей(ЭтоВнешнийПользователь); + УстановитьПривилегированныйРежим(Истина); + ПолитикаПаролей = ПолитикиПаролейПользователей.НайтиПоИмени(ИмяПолитикиПаролей); + Если ПолитикаПаролей = Неопределено Тогда + МинимальнаяДлинаПаролей = ПолучитьМинимальнуюДлинуПаролейПользователей(); Иначе - НастройкиВхода = ПользователиСлужебныйПовтИсп.Настройки().Пользователи; + МинимальнаяДлинаПаролей = ПолитикаПаролей.МинимальнаяДлинаПаролей; КонецЕсли; - Если ЗначениеЗаполнено(НастройкиВхода.МинимальнаяДлинаПароля) Тогда + УстановитьПривилегированныйРежим(Ложь); + Если ЗначениеЗаполнено(МинимальнаяДлинаПаролей) Тогда Если ЗначениеЗаполнено(ОписаниеПользователяИБ.ИдентификаторПользователяИБ) Тогда УстановитьПривилегированныйРежим(Истина); ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( @@ -4518,6 +4721,23 @@ //////////////////////////////////////////////////////////////////////////////// // Восстановление паролей пользователей +Процедура ЗаполнитьПочтуДляВосстановленияПароляУПользователейВФоне(ДополнительныеПараметры, АдресВоВременномХранилище) Экспорт + + СписокПользователей = ПользователиДляВключенияВосстановленияПароля(); + Для каждого ПользовательСсылка Из СписокПользователей Цикл + ОбновитьПочтуДляВосстановленияПароля(ПользовательСсылка); + КонецЦикла; + + СписокПользователей = ВнешниеПользователиДляВключенияВосстановленияПароля(); + Для каждого ВнешнийПользовательСсылка Из СписокПользователей Цикл + + ОбъектАвторизации = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВнешнийПользовательСсылка, "ОбъектАвторизации"); + ОбновитьПочтуДляВосстановленияПароля(ВнешнийПользовательСсылка, ОбъектАвторизации); + + КонецЦикла; + +КонецПроцедуры + Функция ДоступнаНастройкаВосстановленияПароля(УровеньДоступа) Экспорт Если ОбщегоНазначения.РазделениеВключено() Тогда @@ -4529,7 +4749,7 @@ Возврат Ложь; КонецЕсли; - Возврат ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей(); + Возврат Истина; КонецФункции @@ -4922,11 +5142,11 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); Результат.Статус = "Ошибка"; - Результат.ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + Результат.ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать пользователя %1 по причине: %2'"), - ПользовательСсылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ПользовательСсылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Метаданные.Справочники.Пользователи, ПользовательСсылка, ТекстСообщения); @@ -4983,16 +5203,6 @@ КонецФункции -Функция ПоляВосстановленияПаролей() Экспорт - - Если ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда - Возврат ",ЗапрещеноВосстанавливатьПароль,АдресЭлектроннойПочты"; - КонецЕсли; - - Возврат ""; - -КонецФункции - // Параметры: // ПользовательИБ - ПользовательИнформационнойБазы // @@ -5151,6 +5361,32 @@ КонецПроцедуры +// Параметры: +// Список - ДинамическийСписок +// ИмяПоля - Строка +// +Процедура ОграничитьИспользованиеЗаполняемогоПоляДинамическогоСписка(Список, ИмяПоля) Экспорт + + Поля = Список.ПолучитьОграниченияИспользованияВГруппировке(); + Если Поля.Найти(ИмяПоля) = Неопределено Тогда + Поля.Добавить(ИмяПоля); + Список.УстановитьОграниченияИспользованияВГруппировке(Поля); + КонецЕсли; + + Поля = Список.ПолучитьОграниченияИспользованияВОтборе(); + Если Поля.Найти(ИмяПоля) = Неопределено Тогда + Поля.Добавить(ИмяПоля); + Список.УстановитьОграниченияИспользованияВОтборе(Поля); + КонецЕсли; + + Поля = Список.ПолучитьОграниченияИспользованияВПорядке(); + Если Поля.Найти(ИмяПоля) = Неопределено Тогда + Поля.Добавить(ИмяПоля); + Список.УстановитьОграниченияИспользованияВПорядке(Поля); + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы. @@ -5179,45 +5415,69 @@ КонецПроцедуры -// Вызывается при переходе на новую версию конфигурации 2.3.2.30, 3.0.2.192. Процедура ПеренестиНастройкиДлиныИСложностиПаролейКонфигуратора() Экспорт - ВсеНастройки = ПользователиСлужебныйПовтИсп.Настройки(); - - Если Не ВсеНастройки.ОбщиеНастройкиВхода - Или ПолучитьМинимальнуюДлинуПаролейПользователей() = 0 - И Не ПолучитьПроверкуСложностиПаролейПользователей() - Или ВсеНастройки.Пользователи.МинимальнаяДлинаПароля <> 0 - Или ВсеНастройки.Пользователи.ПарольДолженОтвечатьТребованиямСложности <> 0 - Или ВсеНастройки.ВнешниеПользователи.МинимальнаяДлинаПароля <> 0 - Или ВсеНастройки.ВнешниеПользователи.ПарольДолженОтвечатьТребованиямСложности <> 0 Тогда - - Возврат; - КонецЕсли; - - ИмяКонстанты = ?(Метаданные.Константы.Найти("УдалитьНастройкиВходаПользователей") = Неопределено, - "НастройкиВходаПользователей", - "УдалитьНастройкиВходаПользователей"); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); Блокировка = Новый БлокировкаДанных; - Блокировка.Добавить("Константа." + ИмяКонстанты); + Блокировка.Добавить("Константа.НастройкиВходаПользователей"); + Если Не РазделениеВключено Тогда + Блокировка.Добавить("Константа.УдалитьНастройкиВходаПользователей"); + КонецЕсли; НачатьТранзакцию(); Попытка Блокировка.Заблокировать(); - НастройкиВхода = НастройкиВхода(); - - СложныйПароль = ПолучитьПроверкуСложностиПаролейПользователей(); - МинимальнаяДлинаПароля = ПолучитьМинимальнуюДлинуПаролейПользователей(); - - НастройкиВхода.Пользователи.МинимальнаяДлинаПароля = МинимальнаяДлинаПароля; - НастройкиВхода.Пользователи.ПарольДолженОтвечатьТребованиямСложности = СложныйПароль; - Если Константы.ИспользоватьВнешнихПользователей.Получить() Тогда - НастройкиВхода.ВнешниеПользователи.МинимальнаяДлинаПароля = МинимальнаяДлинаПароля; - НастройкиВхода.ВнешниеПользователи.ПарольДолженОтвечатьТребованиямСложности = СложныйПароль; + СтарыеНастройки = Неопределено; + Если Не РазделениеВключено Тогда + СтарыеНастройки = Константы.УдалитьНастройкиВходаПользователей.Получить().Получить(); + Константы.УдалитьНастройкиВходаПользователей.Установить(Новый ХранилищеЗначения(Неопределено)); + КонецЕсли; + Если СтарыеНастройки = Неопределено Тогда + СтарыеНастройки = Константы.НастройкиВходаПользователей.Получить().Получить(); КонецЕсли; - Константы[ИмяКонстанты].Установить(Новый ХранилищеЗначения(НастройкиВхода)); + НовыеНастройки = НастройкиВхода(); + + Если Не Пользователи.ОбщиеНастройкиВходаИспользуются() Тогда + НовыеНастройки.Общие.Вставить("ОбновитьТолькоКонстанту"); + НовыеНастройки.Пользователи.Вставить("ОбновитьТолькоКонстанту"); + НовыеНастройки.ВнешниеПользователи.Вставить("ОбновитьТолькоКонстанту"); + КонецЕсли; + + Если ТипЗнч(СтарыеНастройки) <> Тип("Структура") + Или Не СтарыеНастройки.Свойство("Пользователи") Тогда + ОписаниеОбщихНастроек = Пользователи.НовоеОписаниеОбщихНастроекВхода(); + НовыеНастройки.Общие.КоличествоПопытокВводаПароляДоБлокировки = + ОписаниеОбщихНастроек.КоличествоПопытокВводаПароляДоБлокировки; + НовыеНастройки.Общие.ДлительностьБлокировкиВводаПароля = + ОписаниеОбщихНастроек.ДлительностьБлокировкиВводаПароля; + КонецЕсли; + + Если ТипЗнч(СтарыеНастройки) = Тип("Структура") Тогда + Если СтарыеНастройки.Свойство("Пользователи") + И ТипЗнч(СтарыеНастройки.Пользователи) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(НовыеНастройки.Пользователи, СтарыеНастройки.Пользователи); + Пользователи.УстановитьНастройкиВхода(НовыеНастройки.Пользователи); + КонецЕсли; + Если СтарыеНастройки.Свойство("ВнешниеПользователи") + И ТипЗнч(СтарыеНастройки.ВнешниеПользователи) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(НовыеНастройки.ВнешниеПользователи, СтарыеНастройки.ВнешниеПользователи); + Пользователи.УстановитьНастройкиВхода(НовыеНастройки.ВнешниеПользователи, Истина); + КонецЕсли; + Совпадают = Истина; + Для Каждого КлючИЗначение Из НовыеНастройки.Пользователи Цикл + Если КлючИЗначение.Значение <> НовыеНастройки.ВнешниеПользователи[КлючИЗначение.Ключ] Тогда + Совпадают = Ложь; + Прервать; + КонецЕсли; + КонецЦикла; + Если Не Совпадают Тогда + НовыеНастройки.Общие.ОтдельныеНастройкиДляВнешнихПользователей = Истина; + КонецЕсли; + КонецЕсли; + + Пользователи.УстановитьОбщиеНастройкиВхода(НовыеНастройки.Общие); ЗафиксироватьТранзакцию(); Исключение @@ -5473,8 +5733,7 @@ Выборка = РезультатЗапроса.Выбрать(); Выборка.Следующий(); - Если ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() - И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда Если ЗначениеЗаполнено(Выборка.ИдентификаторПользователяИБ) Тогда @@ -5484,7 +5743,7 @@ МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); АдресЭлектроннойПочты = МодульУправлениеКонтактнойИнформацией.НовыйАдресПочтыДляВосстановленияПароля( - СсылкаНаОбъектАвторизации, ПользователяИБ.АдресЭлектроннойПочты); + СсылкаНаОбъектАвторизации, ПользователяИБ.АдресЭлектроннойПочты); Если АдресЭлектроннойПочты <> Неопределено Тогда ПользователяИБ.АдресЭлектроннойПочты = АдресЭлектроннойПочты; Пользователи.УстановитьСвойстваПользователяИБ(Выборка.ИдентификаторПользователяИБ, ПользователяИБ); @@ -5831,8 +6090,8 @@ Функция КраткоеПредставлениеОшибкиАвторизацииПослеРегистрацииВЖурнале(ИнформацияОбОшибке, ШаблонОшибки = "", РегистрироватьВЖурнале = Истина) Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда - КраткоеПредставление = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - ПодробноеПредставление = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КраткоеПредставление = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПодробноеПредставление = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); Иначе КраткоеПредставление = ИнформацияОбОшибке; ПодробноеПредставление = ИнформацияОбОшибке; @@ -5840,10 +6099,10 @@ Если ЗначениеЗаполнено(ШаблонОшибки) Тогда КраткоеПредставление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонОшибки, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ШаблонОшибки, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ПодробноеПредставление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонОшибки, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ШаблонОшибки, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецЕсли; КраткоеПредставление = ЗаголовокСообщенияАвторизацияНеВыполненаСПереводомСтроки() + КраткоеПредставление; @@ -6374,6 +6633,7 @@ Запрос.УстановитьПараметр("ГруппаПользователей", ГруппаПользователей); + // @skip-check query-in-loop - Обход иерархии элементов с обновлением порциями РезультатыЗапроса = Запрос.ВыполнитьПакет(); Если НЕ РезультатыЗапроса[2].Пустой() Тогда @@ -6830,7 +7090,7 @@ РазделенныеОбъектыМетаданных = Новый Соответствие; Для Каждого ЭлементМоделиДанных Из МодельДанных Цикл - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ЭлементМоделиДанных.Ключ); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ЭлементМоделиДанных.Ключ); РазделенныеОбъектыМетаданных.Вставить(ОбъектМетаданных, Истина); КонецЦикла; @@ -6911,6 +7171,25 @@ КонецФункции +// Возвращаемое значение: +// Структура: +// * ТолькоДляАдминистраторовСистемы - Соответствие из КлючИЗначение: +// ** Ключ - ОбъектМетаданных - роль. +// ** Значение - Булево - Истина. +// * ТолькоДляПользователейСистемы - Соответствие из КлючИЗначение: +// ** Ключ - ОбъектМетаданных - роль. +// ** Значение - Булево - Истина. +// * ТолькоДляВнешнихПользователей - Соответствие из КлючИЗначение: +// ** Ключ - ОбъектМетаданных - роль. +// ** Значение - Булево - Истина. +// * СовместноДляПользователейИВнешнихПользователей - Соответствие из КлючИЗначение: +// ** Ключ - ОбъектМетаданных - роль. +// ** Значение - Булево - Истина. +// +Функция НазначениеРолей() + Возврат Новый Структура; +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Процедуры используемые при обмене данными. @@ -6930,7 +7209,7 @@ ЭлементДанных.ИдентификаторПользователяИБ = ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор(); ЭлементДанных.Подготовлен = Ложь; - ЭлементДанных.СвойстваПользователяИБ = Новый ХранилищеЗначения(Неопределено); + ЭлементДанных.УдалитьСвойстваПользователяИБ = Новый ХранилищеЗначения(Неопределено); КонецЕсли; КонецПроцедуры @@ -6966,7 +7245,7 @@ СписокСвойств = "ИдентификаторПользователяИБ, |Подготовлен, - |СвойстваПользователяИБ"; + |УдалитьСвойстваПользователяИБ"; ЗаполнитьЗначенияСвойств(ЭлементДанных, ОбщегоНазначения.ЗначенияРеквизитовОбъекта( ЭлементДанных.Ссылка, СписокСвойств)); @@ -7017,7 +7296,7 @@ | СведенияОПользователях.Пользователь КАК Пользователь, | СведенияОПользователях.ДатаПоследнейАктивности КАК ДатаПоследнейАктивности, | СведенияОПользователях.ПоследнийИспользуемыйКлиент КАК ПоследнийИспользуемыйКлиент, - | СведенияОПользователях.ДатаНачалаИспользованияПароля КАК ДатаНачалаИспользованияПароля, + | СведенияОПользователях.УдалитьДатаНачалаИспользованияПароля КАК УдалитьДатаНачалаИспользованияПароля, | СведенияОПользователях.ДатаАвтоматическогоЗапрещенияВхода КАК ДатаАвтоматическогоЗапрещенияВхода, | СведенияОПользователях.ПотребоватьСменуПароляПриВходе КАК ПотребоватьСменуПароляПриВходе |ИЗ @@ -7028,7 +7307,7 @@ Выгрузка = Запрос.Выполнить().Выгрузить(); НачалоДняТекущейДатыСеанса = НачалоДня(ТекущаяДатаСеанса()); - ИспользуемыйКлиент = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("ИспользуемыйКлиент"); + ИспользуемыйКлиент = ОбщегоНазначения.ИспользуемыйКлиент(); Если Выгрузка.Количество() = 1 Тогда ЕстьИзменения = Ложь; @@ -7076,7 +7355,7 @@ Если ПриЗапуске И Не ПродолжитьЗапуск Тогда ОписаниеОшибки = ЗаголовокСообщенияАвторизацияНеВыполненаСПереводомСтроки() + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Если РегистрироватьВЖурнале Тогда ЗаписьЖурналаРегистрации( @@ -7086,7 +7365,7 @@ Метаданные.НайтиПоТипу(ТипЗнч(ТекущийПользователь)), ТекущийПользователь, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); КонецЕсли; Иначе Если РегистрироватьВЖурнале Тогда @@ -7097,7 +7376,7 @@ Метаданные.НайтиПоТипу(ТипЗнч(ТекущийПользователь)), ТекущийПользователь, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); КонецЕсли; КонецЕсли; Если Не ПриЗапуске Или Не ПродолжитьЗапуск Тогда @@ -7118,26 +7397,27 @@ Возврат Истина; КонецЕсли; - Если Не ПользователиСлужебныйПовтИсп.Настройки().ОбщиеНастройкиВхода Тогда + Если Не ОбщегоНазначения.РазделениеВключено() + Или Не Пользователи.ОбщиеНастройкиВходаИспользуются() Тогда Возврат Ложь; КонецЕсли; Если ТипЗнч(ТекущийПользователь) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда - НастройкиВхода = ПользователиСлужебныйПовтИсп.Настройки().ВнешниеПользователи; + НастройкиВхода = НастройкиВхода().ВнешниеПользователи; Иначе - НастройкиВхода = ПользователиСлужебныйПовтИсп.Настройки().Пользователи; + НастройкиВхода = НастройкиВхода().Пользователи; КонецЕсли; Если Не ЗначениеЗаполнено(НастройкиВхода.МаксимальныйСрокДействияПароля) Тогда Возврат Ложь; КонецЕсли; - Если Не ЗначениеЗаполнено(СведенияОПользователе.ДатаНачалаИспользованияПароля) Тогда + Если Не ЗначениеЗаполнено(СведенияОПользователе.УдалитьДатаНачалаИспользованияПароля) Тогда Возврат Ложь; КонецЕсли; ОстатокМаксимальногоСрокаДействияПароля = НастройкиВхода.МаксимальныйСрокДействияПароля - - (НачалоДняТекущейДатыСеанса - СведенияОПользователе.ДатаНачалаИспользованияПароля) / (24*60*60); + - (НачалоДняТекущейДатыСеанса - СведенияОПользователе.УдалитьДатаНачалаИспользованияПароля) / (24*60*60); Возврат ОстатокМаксимальногоСрокаДействияПароля <= 0; @@ -7171,10 +7451,16 @@ УстарелаТолькоДатаПоследнейАктивности = Ложь; КонецЕсли; - Если Не ЗначениеЗаполнено(СведенияОПользователе.ДатаНачалаИспользованияПароля) - Или СведенияОПользователе.ДатаНачалаИспользованияПароля > НачалоДняТекущейДатыСеанса Тогда + Если Не ОбщегоНазначения.РазделениеВключено() Тогда + Если ЗначениеЗаполнено(СведенияОПользователе.УдалитьДатаНачалаИспользованияПароля) Тогда + СведенияОПользователе.УдалитьДатаНачалаИспользованияПароля = Неопределено; + ЕстьИзменения = Истина; + КонецЕсли; - СведенияОПользователе.ДатаНачалаИспользованияПароля = НачалоДняТекущейДатыСеанса; + ИначеЕсли Не ЗначениеЗаполнено(СведенияОПользователе.УдалитьДатаНачалаИспользованияПароля) + Или СведенияОПользователе.УдалитьДатаНачалаИспользованияПароля > НачалоДняТекущейДатыСеанса Тогда + + СведенияОПользователе.УдалитьДатаНачалаИспользованияПароля = НачалоДняТекущейДатыСеанса; ЕстьИзменения = Истина; УстарелаТолькоДатаПоследнейАктивности = Ложь; КонецЕсли; @@ -7254,139 +7540,51 @@ Метаданные.НайтиПоТипу(ТипЗнч(ТекущийПользователь)), ТекущийПользователь, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); КонецПопытки; КонецЦикла; КонецПроцедуры -// Для функции ОбработатьНовыйПароль. +// Для функции ОбработатьНовыйПароль и +// процедуры Пользователи.УстановитьСвойстваПользователяИБ. // // Параметры: // Пароль - Строка -// МинимальнаяДлинаПароля - Число -// СложныйПароль - Булево -// ИмяДляВхода - Строка +// ПользовательИБ - ПользовательИнформационнойБазы // // Возвращаемое значение: // Строка -// Неопределено // -Функция ОшибкаДлиныИлиСложностиПароля(Пароль, Знач МинимальнаяДлинаПароля, СложныйПароль, ИмяДляВхода) Экспорт +Функция ОшибкаСоответствияПароляТребованиям(Пароль, ПользовательИБ) Экспорт - Если СложныйПароль И МинимальнаяДлинаПароля < 7 Тогда - МинимальнаяДлинаПароля = 7; - КонецЕсли; - Если СтрДлина(Пароль) < МинимальнаяДлинаПароля Тогда + ПолитикаПаролей = ПолитикиПаролейПользователей.НайтиПоИмени(ПользовательИБ.ИмяПолитикиПаролей); + + Ошибки = ПолитикиПаролейПользователей.ПроверитьСоответствиеПароляПолитике(Пароль, + ПолитикаПаролей, ПользовательИБ); + + Если Ошибки.Найти(РезультатПроверкиСоответствияПароляПолитике.НеСоответствуетТребованиямМинимальнойДлины) <> Неопределено Тогда + Если ПолитикаПаролей = Неопределено Тогда + МинимальнаяДлинаПароля = ПолучитьМинимальнуюДлинуПаролейПользователей(); + Иначе + МинимальнаяДлинаПароля = ПолитикаПаролей.МинимальнаяДлинаПаролей; + КонецЕсли; Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Количество символов нового пароля должно быть не менее %1.'"), Формат(МинимальнаяДлинаПароля, "ЧГ=")); КонецЕсли; - Если СложныйПароль И Не ПарольОтвечаетТребованиямСложности(Пароль) Тогда + Если Ошибки.Найти(РезультатПроверкиСоответствияПароляПолитике.НеСоответствуетТребованиямСложности) <> Неопределено Тогда Возврат НСтр("ru = 'Пароль не отвечает требованиям сложности.'") + Символы.ПС + Символы.ПС + ПодсказкаДляНовогоПароля(); КонецЕсли; - Если СложныйПароль И СтрНайти(ВРег(Пароль), ВРег(ИмяДляВхода)) Тогда - Возврат НСтр("ru = 'Пароль содержит Имя (для входа).'") - + Символы.ПС + Символы.ПС - + ПодсказкаДляНовогоПароля(); + Если Ошибки.Найти(РезультатПроверкиСоответствияПароляПолитике.НеСоответствуетТребованиямОграниченияПовторенияСредиПоследних) <> Неопределено Тогда + Возврат НСтр("ru = 'Новый пароль использовался ранее.'"); КонецЕсли; -КонецФункции - -// Для функции ОшибкаДлиныИлиСложностиПароля. -// Проверяет пароль на требования сложности, как реализованные в 1С:Предприятии. -// -// Параметры: -// Пароль - Строка - проверяемый пароль. -// -// Возвращаемое значение: -// Булево - Истина, если соответствует. -// -Функция ПарольОтвечаетТребованиямСложности(Пароль) - - ДлинаПароля = СтрДлина(Пароль); - - Если ДлинаПароля < 7 Тогда - Возврат Ложь; - КонецЕсли; - - ЕстьСимволВВерхнемРегистре = 0; - ЕстьСимволВНижнемРегистре = 0; - ЕстьСимволЦифры = 0; - ЕстьСимволСпециальный = 0; - - ЕстьПоследовательность = Истина; - СостояниеСимвола = "Первый"; - ПредыдущийСимвол = ""; - - Для НомерСимвола = 1 По ДлинаПароля Цикл - Символ = Сред(Пароль, НомерСимвола, 1); - КодСимвола = КодСимвола(Символ); - - Если КодСимвола > 31 И КодСимвола <> 127 Тогда - Если СтрНайти("0123456789", Символ) > 0 Тогда - ЕстьСимволЦифры = 1; - - ИначеЕсли НРег(Символ) <> ВРег(Символ) Тогда - Если Символ = ВРег(Символ) Тогда - ЕстьСимволВВерхнемРегистре = 1; - Иначе - ЕстьСимволВНижнемРегистре = 1; - КонецЕсли; - Иначе - ЕстьСимволСпециальный = 1; - КонецЕсли; - КонецЕсли; - - Если Не ЕстьПоследовательность Тогда - Продолжить; - КонецЕсли; - - Если СостояниеСимвола = "Первый" Тогда - СостояниеСимвола = "Второй"; - - ИначеЕсли СостояниеСимвола = "Второй" Тогда - - Если ПредыдущийСимвол = Символ Тогда - СостояниеСимвола = "ТотЖе"; - - ИначеЕсли КодСимвола(ПредыдущийСимвол) = КодСимвола(Символ) - 1 Тогда - СостояниеСимвола = "Убывает"; - - ИначеЕсли КодСимвола(ПредыдущийСимвол) = КодСимвола(Символ) + 1 Тогда - СостояниеСимвола = "Возрастает"; - Иначе - ЕстьПоследовательность = Ложь; - КонецЕсли; - - ИначеЕсли СостояниеСимвола = "ТотЖе" Тогда - Если ПредыдущийСимвол <> Символ Тогда - ЕстьПоследовательность = Ложь; - КонецЕсли; - - ИначеЕсли СостояниеСимвола = "Убывает" Тогда - Если КодСимвола(ПредыдущийСимвол) <> КодСимвола(Символ) - 1 Тогда - ЕстьПоследовательность = Ложь; - КонецЕсли; - - ИначеЕсли СостояниеСимвола = "Возрастает" Тогда - Если КодСимвола(ПредыдущийСимвол) <> КодСимвола(Символ) + 1 Тогда - ЕстьПоследовательность = Ложь; - КонецЕсли; - КонецЕсли; - - ПредыдущийСимвол = Символ; - КонецЦикла; - - Возврат Не ЕстьПоследовательность - И ЕстьСимволВВерхнемРегистре - + ЕстьСимволВНижнемРегистре - + ЕстьСимволЦифры - + ЕстьСимволСпециальный > 2; + Возврат ""; КонецФункции @@ -7399,7 +7597,7 @@ "Ссылка, |ИдентификаторПользователяИБ, |ИдентификаторПользователяСервиса, - |СвойстваПользователяИБ, + |УдалитьСвойстваПользователяИБ, |Подготовлен, |ПометкаУдаления, |Недействителен"; @@ -7418,7 +7616,7 @@ Если ПользовательОбъект.ЭтоНовый() Или ПользовательОбъект.Ссылка <> СтарыйПользователь.Ссылка Тогда СтарыйПользователь.ИдентификаторПользователяИБ = ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор(); СтарыйПользователь.ИдентификаторПользователяСервиса = ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор(); - СтарыйПользователь.СвойстваПользователяИБ = Новый ХранилищеЗначения(Неопределено); + СтарыйПользователь.УдалитьСвойстваПользователяИБ = Новый ХранилищеЗначения(Неопределено); СтарыйПользователь.Подготовлен = Ложь; СтарыйПользователь.ПометкаУдаления = Ложь; СтарыйПользователь.Недействителен = Ложь; @@ -7456,7 +7654,6 @@ ДополнительныеСвойства = ПользовательОбъект.ДополнительныеСвойства; ОписаниеПользователяИБ = ДополнительныеСвойства.ОписаниеПользователяИБ; СтарыйПользователь = ПараметрыОбработки.СтарыйПользователь; - АвтоРеквизиты = ПараметрыОбработки.АвтоРеквизиты; Если ОписаниеПользователяИБ.Количество() = 0 Тогда Возврат; @@ -7491,44 +7688,55 @@ // Заполнение автоматических свойств пользователя ИБ. ОписаниеПользователяИБ.Вставить("ПолноеИмя", ПользовательОбъект.Наименование); - ХранимыеСвойства = ХранимыеСвойстваПользователяИБ(ПользовательОбъект); + ХранимыеСвойства = ХранимыеСвойстваПользователяИБ(СсылкаОбъекта(ПользовательОбъект)); Если ПараметрыОбработки.СтарыйПользовательИБСуществует Тогда СтараяАутентификация = ПараметрыОбработки.ОписаниеСтарогоПользователяИБ; Если Пользователи.ВходВПрограммуРазрешен(СтараяАутентификация) Тогда - ХранимыеСвойства.АутентификацияСтандартная = СтараяАутентификация.АутентификацияСтандартная; - ХранимыеСвойства.АутентификацияOpenID = СтараяАутентификация.АутентификацияOpenID; - ХранимыеСвойства.АутентификацияОС = СтараяАутентификация.АутентификацияОС; - ПользовательОбъект.СвойстваПользователяИБ = Новый ХранилищеЗначения(ХранимыеСвойства); - АвтоРеквизиты.СвойстваПользователяИБ = ПользовательОбъект.СвойстваПользователяИБ; + ХранимыеСвойства.АутентификацияСтандартная = СтараяАутентификация.АутентификацияСтандартная; + ХранимыеСвойства.АутентификацияOpenID = СтараяАутентификация.АутентификацияOpenID; + ХранимыеСвойства.АутентификацияOpenIDConnect = СтараяАутентификация.АутентификацияOpenIDConnect; + ХранимыеСвойства.АутентификацияТокеномДоступа = СтараяАутентификация.АутентификацияТокеномДоступа; + ХранимыеСвойства.АутентификацияОС = СтараяАутентификация.АутентификацияОС; + УстановитьХранимыеСвойстваПользователяИБ(ПользовательОбъект, ХранимыеСвойства); КонецЕсли; Иначе СтараяАутентификация = Новый Структура; - СтараяАутентификация.Вставить("АутентификацияСтандартная", Ложь); - СтараяАутентификация.Вставить("АутентификацияОС", Ложь); - СтараяАутентификация.Вставить("АутентификацияOpenID", Ложь); - ХранимыеСвойства.АутентификацияСтандартная = Ложь; - ХранимыеСвойства.АутентификацияOpenID = Ложь; - ХранимыеСвойства.АутентификацияОС = Ложь; - ПользовательОбъект.СвойстваПользователяИБ = Новый ХранилищеЗначения(ХранимыеСвойства); - АвтоРеквизиты.СвойстваПользователяИБ = ПользовательОбъект.СвойстваПользователяИБ; + СтараяАутентификация.Вставить("АутентификацияСтандартная", Ложь); + СтараяАутентификация.Вставить("АутентификацияOpenID", Ложь); + СтараяАутентификация.Вставить("АутентификацияOpenIDConnect", Ложь); + СтараяАутентификация.Вставить("АутентификацияТокеномДоступа", Ложь); + СтараяАутентификация.Вставить("АутентификацияОС", Ложь); + ХранимыеСвойства.АутентификацияСтандартная = Ложь; + ХранимыеСвойства.АутентификацияOpenID = Ложь; + ХранимыеСвойства.АутентификацияOpenIDConnect = Ложь; + ХранимыеСвойства.АутентификацияТокеномДоступа = Ложь; + ХранимыеСвойства.АутентификацияОС = Ложь; + УстановитьХранимыеСвойстваПользователяИБ(ПользовательОбъект, ХранимыеСвойства); КонецЕсли; Если ОписаниеПользователяИБ.Свойство("АутентификацияСтандартная") Тогда ХранимыеСвойства.АутентификацияСтандартная = ОписаниеПользователяИБ.АутентификацияСтандартная; - ПользовательОбъект.СвойстваПользователяИБ = Новый ХранилищеЗначения(ХранимыеСвойства); - АвтоРеквизиты.СвойстваПользователяИБ = ПользовательОбъект.СвойстваПользователяИБ; - КонецЕсли; - - Если ОписаниеПользователяИБ.Свойство("АутентификацияОС") Тогда - ХранимыеСвойства.АутентификацияОС = ОписаниеПользователяИБ.АутентификацияОС; - ПользовательОбъект.СвойстваПользователяИБ = Новый ХранилищеЗначения(ХранимыеСвойства); - АвтоРеквизиты.СвойстваПользователяИБ = ПользовательОбъект.СвойстваПользователяИБ; + УстановитьХранимыеСвойстваПользователяИБ(ПользовательОбъект, ХранимыеСвойства); КонецЕсли; Если ОписаниеПользователяИБ.Свойство("АутентификацияOpenID") Тогда ХранимыеСвойства.АутентификацияOpenID = ОписаниеПользователяИБ.АутентификацияOpenID; - ПользовательОбъект.СвойстваПользователяИБ = Новый ХранилищеЗначения(ХранимыеСвойства); - АвтоРеквизиты.СвойстваПользователяИБ = ПользовательОбъект.СвойстваПользователяИБ; + УстановитьХранимыеСвойстваПользователяИБ(ПользовательОбъект, ХранимыеСвойства); + КонецЕсли; + + Если ОписаниеПользователяИБ.Свойство("АутентификацияOpenIDConnect") Тогда + ХранимыеСвойства.АутентификацияOpenIDConnect = ОписаниеПользователяИБ.АутентификацияOpenIDConnect; + УстановитьХранимыеСвойстваПользователяИБ(ПользовательОбъект, ХранимыеСвойства); + КонецЕсли; + + Если ОписаниеПользователяИБ.Свойство("АутентификацияТокеномДоступа") Тогда + ХранимыеСвойства.АутентификацияТокеномДоступа = ОписаниеПользователяИБ.АутентификацияТокеномДоступа; + УстановитьХранимыеСвойстваПользователяИБ(ПользовательОбъект, ХранимыеСвойства); + КонецЕсли; + + Если ОписаниеПользователяИБ.Свойство("АутентификацияОС") Тогда + ХранимыеСвойства.АутентификацияОС = ОписаниеПользователяИБ.АутентификацияОС; + УстановитьХранимыеСвойстваПользователяИБ(ПользовательОбъект, ХранимыеСвойства); КонецЕсли; УстановитьХранимуюАутентификацию = Неопределено; @@ -7537,10 +7745,14 @@ ИначеЕсли ОписаниеПользователяИБ.Свойство("АутентификацияСтандартная") И ОписаниеПользователяИБ.АутентификацияСтандартная = Истина - ИЛИ ОписаниеПользователяИБ.Свойство("АутентификацияОС") - И ОписаниеПользователяИБ.АутентификацияОС = Истина - ИЛИ ОписаниеПользователяИБ.Свойство("АутентификацияOpenID") - И ОписаниеПользователяИБ.АутентификацияOpenID = Истина Тогда + Или ОписаниеПользователяИБ.Свойство("АутентификацияOpenID") + И ОписаниеПользователяИБ.АутентификацияOpenID = Истина + Или ОписаниеПользователяИБ.Свойство("АутентификацияOpenIDConnect") + И ОписаниеПользователяИБ.АутентификацияOpenIDConnect = Истина + Или ОписаниеПользователяИБ.Свойство("АутентификацияТокеномДоступа") + И ОписаниеПользователяИБ.АутентификацияТокеномДоступа = Истина + Или ОписаниеПользователяИБ.Свойство("АутентификацияОС") + И ОписаниеПользователяИБ.АутентификацияОС = Истина Тогда УстановитьХранимуюАутентификацию = Истина; КонецЕсли; @@ -7549,21 +7761,24 @@ НоваяАутентификация = СтараяАутентификация; Иначе Если УстановитьХранимуюАутентификацию Тогда - ОписаниеПользователяИБ.Вставить("АутентификацияСтандартная", ХранимыеСвойства.АутентификацияСтандартная); - ОписаниеПользователяИБ.Вставить("АутентификацияOpenID", ХранимыеСвойства.АутентификацияOpenID); - ОписаниеПользователяИБ.Вставить("АутентификацияОС", ХранимыеСвойства.АутентификацияОС); + ОписаниеПользователяИБ.Вставить("АутентификацияСтандартная", ХранимыеСвойства.АутентификацияСтандартная); + ОписаниеПользователяИБ.Вставить("АутентификацияOpenID", ХранимыеСвойства.АутентификацияOpenID); + ОписаниеПользователяИБ.Вставить("АутентификацияOpenIDConnect", ХранимыеСвойства.АутентификацияOpenIDConnect); + ОписаниеПользователяИБ.Вставить("АутентификацияТокеномДоступа", ХранимыеСвойства.АутентификацияТокеномДоступа); + ОписаниеПользователяИБ.Вставить("АутентификацияОС", ХранимыеСвойства.АутентификацияОС); Иначе - ОписаниеПользователяИБ.Вставить("АутентификацияСтандартная", Ложь); - ОписаниеПользователяИБ.Вставить("АутентификацияОС", Ложь); - ОписаниеПользователяИБ.Вставить("АутентификацияOpenID", Ложь); + ОписаниеПользователяИБ.Вставить("АутентификацияСтандартная", Ложь); + ОписаниеПользователяИБ.Вставить("АутентификацияOpenID", Ложь); + ОписаниеПользователяИБ.Вставить("АутентификацияOpenIDConnect", Ложь); + ОписаниеПользователяИБ.Вставить("АутентификацияТокеномДоступа", Ложь); + ОписаниеПользователяИБ.Вставить("АутентификацияОС", Ложь); КонецЕсли; НоваяАутентификация = ОписаниеПользователяИБ; КонецЕсли; Если ХранимыеСвойства.ВходВПрограммуРазрешен <> Пользователи.ВходВПрограммуРазрешен(НоваяАутентификация) Тогда ХранимыеСвойства.ВходВПрограммуРазрешен = Пользователи.ВходВПрограммуРазрешен(НоваяАутентификация); - ПользовательОбъект.СвойстваПользователяИБ = Новый ХранилищеЗначения(ХранимыеСвойства); - АвтоРеквизиты.СвойстваПользователяИБ = ПользовательОбъект.СвойстваПользователяИБ; + УстановитьХранимыеСвойстваПользователяИБ(ПользовательОбъект, ХранимыеСвойства); КонецЕсли; // Проверка прав на изменение разрешения входа в программу. @@ -7612,9 +7827,19 @@ КонецЕсли; // Попытка записи пользователя ИБ. - Пользователи.УстановитьСвойстваПользователяИБ(ИдентификаторПользователяИБ, ОписаниеПользователяИБ, - СоздатьНовогоПользователяИБ, ТипЗнч(ПользовательОбъект) = Тип("СправочникОбъект.ВнешниеПользователи")); - ПользовательИБ = ОписаниеПользователяИБ.ПользовательИБ; + ПараметрыОбновления = Новый Соответствие(ПараметрыСеанса.ОбновлениеСправочниковПользователей); + ПараметрыОбновления.Вставить("ИдентификаторПользователяИБ", ИдентификаторПользователяИБ); + ПараметрыСеанса.ОбновлениеСправочниковПользователей = Новый ФиксированноеСоответствие(ПараметрыОбновления); + ПараметрыОбновления.Удалить("ИдентификаторПользователяИБ"); + Попытка + Пользователи.УстановитьСвойстваПользователяИБ(ИдентификаторПользователяИБ, ОписаниеПользователяИБ, + СоздатьНовогоПользователяИБ, ТипЗнч(ПользовательОбъект) = Тип("СправочникОбъект.ВнешниеПользователи")); + ПользовательИБ = ОписаниеПользователяИБ.ПользовательИБ; + Исключение + ПараметрыСеанса.ОбновлениеСправочниковПользователей = Новый ФиксированноеСоответствие(ПараметрыОбновления); + ВызватьИсключение; + КонецПопытки; + ПараметрыСеанса.ОбновлениеСправочниковПользователей = Новый ФиксированноеСоответствие(ПараметрыОбновления); Если ПользовательОбъект.ДополнительныеСвойства.Свойство("СозданиеАдминистратора") И ЗначениеЗаполнено(ПользовательОбъект.ДополнительныеСвойства.СозданиеАдминистратора) @@ -7740,15 +7965,15 @@ ВызватьИсключение ТекстОшибки; КонецЕсли; - Если Не ОбщегоНазначения.ДанныеСовпадают(АвтоРеквизиты.СвойстваПользователяИБ, - ПользовательОбъект.СвойстваПользователяИБ) Тогда + Если Не ОбщегоНазначения.ДанныеСовпадают(АвтоРеквизиты.УдалитьСвойстваПользователяИБ, + ПользовательОбъект.УдалитьСвойстваПользователяИБ) Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка при записи пользователя ""%1"". |Реквизит %2 не допускается изменять. |Обновление реквизита выполняется автоматически.'"), ПользовательОбъект.Ссылка, - "СвойстваПользователяИБ"); + "УдалитьСвойстваПользователяИБ"); ВызватьИсключение ТекстОшибки; КонецЕсли; @@ -7830,15 +8055,15 @@ Процедура ОтключитьНеактивныхИПросроченныхПользователей(ТолькоДляАвторизованногоПользователя = Ложь, ОписаниеОшибки = "", РегистрироватьВЖурнале = Истина) - Если ОбщегоНазначения.РазделениеВключено() Тогда + Если ОбщегоНазначения.РазделениеВключено() + Или Не Пользователи.ОбщиеНастройкиВходаИспользуются() Тогда Возврат; КонецЕсли; УстановитьПривилегированныйРежим(Истина); - Настройки = ПользователиСлужебныйПовтИсп.Настройки(); - Если Не Настройки.ОбщиеНастройкиВхода - Или Не ЗначениеЗаполнено(Настройки.Пользователи.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода) + Настройки = НастройкиВхода(); + Если Не ЗначениеЗаполнено(Настройки.Пользователи.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода) И Не ЗначениеЗаполнено(Настройки.ВнешниеПользователи.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода) Тогда Возврат; КонецЕсли; @@ -7978,13 +8203,17 @@ КонецЕсли; Если ПользовательИБ <> Неопределено И ( ПользовательИБ.АутентификацияСтандартная - Или ПользовательИБ.АутентификацияОС - Или ПользовательИБ.АутентификацияOpenID) Тогда + Или ПользовательИБ.АутентификацияOpenID + Или ПользовательИБ.АутентификацияOpenIDConnect + Или ПользовательИБ.АутентификацияТокеномДоступа + Или ПользовательИБ.АутентификацияОС) Тогда ОбновляемыеСвойства = Новый Структура; - ОбновляемыеСвойства.Вставить("АутентификацияСтандартная", Ложь); - ОбновляемыеСвойства.Вставить("АутентификацияОС", Ложь); - ОбновляемыеСвойства.Вставить("АутентификацияOpenID", Ложь); + ОбновляемыеСвойства.Вставить("АутентификацияСтандартная", Ложь); + ОбновляемыеСвойства.Вставить("АутентификацияOpenID", Ложь); + ОбновляемыеСвойства.Вставить("АутентификацияOpenIDConnect", Ложь); + ОбновляемыеСвойства.Вставить("АутентификацияТокеномДоступа", Ложь); + ОбновляемыеСвойства.Вставить("АутентификацияОС", Ложь); Пользователи.УстановитьСвойстваПользователяИБ(ПользовательИБ.УникальныйИдентификатор, ОбновляемыеСвойства, Ложь, ТипЗнч(Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи")); @@ -8008,7 +8237,7 @@ ШаблонТекстаОшибки = ШаблонТекстаОшибкиЗаписиСведенийОТекущемПользователе(); ОписаниеОшибки = ЗаголовокСообщенияАвторизацияНеВыполненаСПереводомСтроки() + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Если РегистрироватьВЖурнале Тогда Если Выборка.СрокДействияИстек Тогда @@ -8030,7 +8259,7 @@ Метаданные.НайтиПоТипу(ТипЗнч(Пользователь)), Пользователь, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонКомментария, - Пользователь, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + Пользователь, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); КонецЕсли; КонецПопытки; КонецЦикла; diff --git a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl index 712a43729..b1412e0c2 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl @@ -178,6 +178,45 @@ КонецПроцедуры +// Отправляет сообщение менеджеру сервиса об изменении наличия прав для входа в программу. +// +// Параметры: +// Пользователь - СправочникСсылка.Пользователи +// ЕстьПрава - Булево - новое наличие прав на запуск. +// +Процедура СообщитьЕстьПраваДляВходаВПрограмму(Пользователь, ЕстьПрава) Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") + Или Не ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ОбменСообщениями") + Или Не ПоддерживаютсяСообщенияЕстьПраваДляВходаВПрограмму() Тогда + Возврат; + КонецЕсли; + + Реквизиты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Пользователь, + "ИдентификаторПользователяИБ, ИдентификаторПользователяСервиса"); + + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульОбменСообщениями = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениями"); + + ИнфоПользователя = Новый Структура; + ИнфоПользователя.Вставить("ОбластьДанных", МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); + ИнфоПользователя.Вставить("ИдентификаторПользователяИБ", Реквизиты.ИдентификаторПользователяИБ); + ИнфоПользователя.Вставить("ИдентификаторПользователяСервиса", Реквизиты.ИдентификаторПользователяСервиса); + ИнфоПользователя.Вставить("ЕстьПрава", ЕстьПрава); + ИнфоПользователя.Вставить("ДатаUTC", ТекущаяУниверсальнаяДата()); + + НачатьТранзакцию(); + Попытка + МодульОбменСообщениями.ОтправитьСообщение("UserHandler/LaunchSwitch", ОбщегоНазначения.ЗначениеВСтрокуXML( + ИнфоПользователя), МодульРаботаВМоделиСервиса.КонечнаяТочкаМенеджераСервиса()); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + #Область РаботаСНеразделеннымиПользователямиИнформационнойБазы // Вызывается перед запуском программы до вызова всех остальных обработчиков. @@ -393,8 +432,7 @@ Если ЗначениеЗаполнено(СтарыйПользователь.ИдентификаторПользователяСервиса) Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при записи пользователя ""%1"". - |Запрещено изменять уже установленный идентификатор пользователя сервиса в элементе справочника.'"), + НСтр("ru = 'Запрещено изменять идентификатор пользователя сервиса для ""%1"".'"), ПользовательОбъект.Наименование); ВызватьИсключение ТекстОшибки; КонецЕсли; @@ -408,11 +446,10 @@ Истина) Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при записи пользователя ""%1"". - |Запрещено устанавливать идентификатор пользователя сервиса ""%2"" - |в этот элемент справочника, т.к. он уже используется в другом элементе ""%3"".'"), - ПользовательОбъект.Наименование, + НСтр("ru = 'Запрещено устанавливать идентификатор пользователя сервиса ""%1"" для ""%2"", + |т.к. он уже указан в другом ""%3"".'"), АвтоРеквизиты.ИдентификаторПользователяСервиса, + ПользовательОбъект.Наименование, НайденныйПользователь); ВызватьИсключение ТекстОшибки; КонецЕсли; @@ -465,15 +502,12 @@ Возврат; КонецЕсли; - АвтоРеквизиты = ПараметрыОбработки.АвтоРеквизиты; - + АвтоРеквизиты = ПараметрыОбработки.АвтоРеквизиты; Если АвтоРеквизиты.ИдентификаторПользователяСервиса <> ПользовательОбъект.ИдентификаторПользователяСервиса Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при записи пользователя ""%1"". - |Реквизит %2 не допускается изменять. - |Обновление реквизита выполняется автоматически.'"), - ПользовательОбъект.Ссылка, - "ИдентификаторПользователяСервиса"); + НСтр("ru = 'Не допускается изменять реквизит %1 для ""%2"". + |Значение реквизита обновится автоматически.'"), + "ИдентификаторПользователяСервиса", ПользовательОбъект.Ссылка); ВызватьИсключение ТекстОшибки; КонецЕсли; @@ -1101,6 +1135,31 @@ КонецПроцедуры +// Для процедуры СообщитьЕстьПраваДляВходаВПрограмму. +Функция ПоддерживаютсяСообщенияЕстьПраваДляВходаВПрограмму() + + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульНастройкиТранспортаОбменаСообщениями = ОбщегоНазначения.ОбщийМодуль( + "РегистрыСведений.НастройкиТранспортаОбменаСообщениями"); + + СтруктураНастроек = МодульНастройкиТранспортаОбменаСообщениями.НастройкиТранспортаWS( + МодульРаботаВМоделиСервиса.КонечнаяТочкаМенеджераСервиса()); + + ПараметрыПодключенияКМС = Новый Структура; + ПараметрыПодключенияКМС.Вставить("URL", СтруктураНастроек.WSURLВебСервиса); + ПараметрыПодключенияКМС.Вставить("UserName", СтруктураНастроек.WSИмяПользователя); + ПараметрыПодключенияКМС.Вставить("Password", СтруктураНастроек.WSПароль); + + ПоддерживаемыеВерсии = ОбщегоНазначения.ПолучитьВерсииИнтерфейса(ПараметрыПодключенияКМС, "UserHandler"); + Если Не ЗначениеЗаполнено(ПоддерживаемыеВерсии) Тогда + Возврат Ложь; + КонецЕсли; + ТекущаяВерсия = ПоддерживаемыеВерсии[ПоддерживаемыеВерсии.ВГраница()]; + + Возврат ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ТекущаяВерсия, "1.0.0.2") >= 0 + +КонецФункции + #КонецОбласти #Область РаботаСНеразделеннымиПользователямиИБ diff --git a/SSL/src/CommonModules/ПользователиСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйКлиент/Module.bsl index eb0dafe4b..0964f63a7 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйКлиент/Module.bsl @@ -130,7 +130,6 @@ ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыКлиента.Свойство("ОшибкаАвторизации") Тогда - Параметры.ПолученныеПараметрыКлиента.Вставить("ОшибкаАвторизации"); Параметры.Отказ = Истина; Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения("ПоказатьПредупреждениеИПродолжить", СтандартныеПодсистемыКлиент, ПараметрыКлиента.ОшибкаАвторизации); @@ -163,6 +162,10 @@ ПодключитьОбработчикОжидания("ПоказатьПредупреждениеБезопасностиПослеЗапуска", 0.3, Истина); КонецЕсли; + Если ПараметрыРаботыКлиента.Свойство("ЗадатьВопросПроОтключениеOpenIDConnect") Тогда + ПодключитьОбработчикОжидания("ЗадатьВопросПроОтключениеOpenIDConnectОбработчикОжидания", 1, Истина); + КонецЕсли; + КонецПроцедуры // См. СтандартныеПодсистемыКлиент.ПриПолученииСерверногоОповещения. @@ -229,6 +232,45 @@ КонецПроцедуры +// Предлагает отключить аутентификацию OpenID-Connect после запуска. +Процедура ЗадатьВопросПроОтключениеOpenIDConnect() Экспорт + + ОбработкаЗавершения = Новый ОписаниеОповещения( + "ЗадатьВопросПроОтключениеOpenIDConnectЗавершение", ЭтотОбъект); + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для пользователей включена аутентификация %1. + |Если такой вид аутентификации не используется, рекомендуется его отключить.'"), + "OpenID-Connect"); + + Кнопки = Новый СписокЗначений; + Кнопки.Добавить("ОтключитьУВсехПользователей", НСтр("ru = 'Отключить у всех пользователей'")); + Кнопки.Добавить("НеОтключать", НСтр("ru = 'Не отключать'")); + Кнопки.Добавить("НапомнитьПозже", НСтр("ru = 'Напомнить позже'")); + + ДополнительныеПараметры = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю(); + ДополнительныеПараметры.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Аутентификация по протоколу %1'"), "OpenID-Connect"); + ДополнительныеПараметры.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь; + + СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(ОбработкаЗавершения, + ТекстВопроса, Кнопки, ДополнительныеПараметры); + +КонецПроцедуры + +// Продолжение процедуры ЗадатьВопросПроОтключениеOpenIDConnect. +Процедура ЗадатьВопросПроОтключениеOpenIDConnectЗавершение(Результат, Параметры) Экспорт + + Ответ = ?(Результат <> Неопределено, Результат.Значение, "НапомнитьПозже"); + + Если Ответ = "ОтключитьУВсехПользователей" Тогда + СтандартныеПодсистемыВызовСервера.ОбработатьОтветПроОтключениеOpenIDConnect(Истина); + ИначеЕсли Ответ = "НеОтключать" Тогда + СтандартныеПодсистемыВызовСервера.ОбработатьОтветПроОтключениеOpenIDConnect(Ложь); + КонецЕсли; + +КонецПроцедуры + // Записывает в форму результат выбора назначения. // // Параметры: diff --git a/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl index af139cddf..572cc1023 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl @@ -87,38 +87,23 @@ КонецФункции -// Проверяет доступность восстановления пароля пользователя. -// -// Возвращаемое значение: -// Булево - Истина, если платформа поддерживает восстановления пароля пользователя. -// -Функция ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Экспорт - - Свойства = Новый Структура("ЗапрещеноВосстанавливатьПароль, CannotRecoveryPassword"); - ЗаполнитьЗначенияСвойств(Свойства, ПользователиИнформационнойБазы.ТекущийПользователь()); - - Возврат Свойства.ЗапрещеноВосстанавливатьПароль <> Неопределено - Или Свойства.CannotRecoveryPassword <> Неопределено; - -КонецФункции - // Возвращает назначение ролей, определенное разработчиком. // См. комментарий к процедуре ПриОпределенииНазначенияРолей общего модуля ПользователиПереопределяемый. // // Возвращаемое значение: // ФиксированнаяСтруктура: // * ТолькоДляАдминистраторовСистемы - ФиксированноеСоответствие из КлючИЗначение: -// * Ключ - Строка - имя роли. -// * Значение - Булево - Истина. +// ** Ключ - Строка - имя роли. +// ** Значение - Булево - Истина. // * ТолькоДляПользователейСистемы - ФиксированноеСоответствие из КлючИЗначение: -// * Ключ - Строка - имя роли. -// * Значение - Булево - Истина. +// ** Ключ - Строка - имя роли. +// ** Значение - Булево - Истина. // * ТолькоДляВнешнихПользователей - ФиксированноеСоответствие из КлючИЗначение: -// * Ключ - Строка - имя роли. -// * Значение - Булево - Истина. +// ** Ключ - Строка - имя роли. +// ** Значение - Булево - Истина. // * СовместноДляПользователейИВнешнихПользователей - ФиксированноеСоответствие из КлючИЗначение: -// * Ключ - Строка - имя роли. -// * Значение - Булево - Истина. +// ** Ключ - Строка - имя роли. +// ** Значение - Булево - Истина. // Функция НазначениеРолей() Экспорт @@ -205,40 +190,42 @@ // интерфейс изменения ролей в карточках пользователя, внешнего пользователя и // группы внешних пользователей будет скрыт (в том числе для администратора). // -// * ВнешниеПользователи - Структура - со свойствами, как у свойства Пользователи (см. далее). -// * Пользователи - Структура: +// * ФизическоеЛицоИспользуется - Булево - по умолчанию Истина. Когда Истина, тогда +// отображается в карточке Пользователя. // -// * ПарольДолженОтвечатьТребованиямСложности - Булево - проверять сложность нового пароля. -// * МинимальнаяДлинаПароля - Число - проверять длину нового пароля. -// -// * МаксимальныйСрокДействияПароля - Число - дней после первого входа с новым паролем, после -// которого пользователю потребуется сменить пароль. -// * МинимальныйСрокДействияПароля - Число - дней после первого входа с новым паролем, в течение -// которого пользователь не сможет сменить пароль. -// * ЗапретитьПовторениеПароляСредиПоследних - Число - паролей, хеши которых будут храниться для проверки. -// -// * ПросрочкаРаботыВПрограммеДоЗапрещенияВхода - Число - дней относительно последней активности пользователя, -// после которых вход в программу будет запрещен. -// * ПросрочкаРаботыВПрограммеДатаВключения - Дата - момент записи ненулевого количества дней -// просрочки вместо нулевого. +// * ПодразделениеИспользуется - Булево - по умолчанию Истина. Когда Истина, тогда +// отображается в карточке Пользователя. // Функция Настройки() Экспорт Настройки = Новый Структура; Настройки.Вставить("ОбщиеНастройкиВхода", Истина); Настройки.Вставить("РедактированиеРолей", Истина); + Настройки.Вставить("ФизическоеЛицоИспользуется", Истина); + Настройки.Вставить("ПодразделениеИспользуется", Истина); ИнтеграцияПодсистемБСП.ПриОпределенииНастроек(Настройки); ПользователиПереопределяемый.ПриОпределенииНастроек(Настройки); + Если Метаданные.ОпределяемыеТипы.Подразделение.Тип.Типы().Количество() = 1 + И Метаданные.ОпределяемыеТипы.Подразделение.Тип.Типы()[0] = Тип("Строка") Тогда + + Настройки.ПодразделениеИспользуется = Ложь; + КонецЕсли; + + Если Метаданные.ОпределяемыеТипы.ФизическоеЛицо.Тип.Типы().Количество() = 1 + И Метаданные.ОпределяемыеТипы.ФизическоеЛицо.Тип.Типы()[0] = Тип("Строка") Тогда + + Настройки.ФизическоеЛицоИспользуется = Ложь; + КонецЕсли; + Если ОбщегоНазначения.РазделениеВключено() Тогда Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ПользователиСервиса") Тогда МодульПользователиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСервиса"); - Настройки.Вставить( - "ОбщиеНастройкиВхода", + Настройки.Вставить("ОбщиеНастройкиВхода", МодульПользователиСервиса.ИспользоватьОбщиеНастройкиВходаПользователейСервиса()); Иначе @@ -246,15 +233,17 @@ КонецЕсли; ИначеЕсли СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() - Или ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда + Или ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда Настройки.Вставить("ОбщиеНастройкиВхода", Ложь); КонецЕсли; - ВсеНастройки = ПользователиСлужебный.НастройкиВхода(); - ВсеНастройки.Вставить("ОбщиеНастройкиВхода", Настройки.ОбщиеНастройкиВхода); - ВсеНастройки.Вставить("РедактированиеРолей", Настройки.РедактированиеРолей); + ВсеНастройки = Новый Структура; + ВсеНастройки.Вставить("ОбщиеНастройкиВхода", Настройки.ОбщиеНастройкиВхода); + ВсеНастройки.Вставить("РедактированиеРолей", Настройки.РедактированиеРолей); + ВсеНастройки.Вставить("ФизическоеЛицоИспользуется", Настройки.ФизическоеЛицоИспользуется); + ВсеНастройки.Вставить("ПодразделениеИспользуется", Настройки.ПодразделениеИспользуется); Возврат ОбщегоНазначения.ФиксированныеДанные(ВсеНастройки); @@ -329,13 +318,17 @@ ПравоДоступа("Администрирование", Метаданные, ПользовательИБ), ПравоДоступа("Администрирование", Метаданные))); + // АПК:336-выкл Не заменять на РолиДоступны. Это специальная проверка ролей администратора. + //@skip-check using-isinrole Свойства.Вставить("РольДоступнаАдминистраторСистемы", - РольДоступна(Метаданные.Роли.АдминистраторСистемы)); // Не заменять на РолиДоступны. + РольДоступна(Метаданные.Роли.АдминистраторСистемы)); //@skip-check using-isinrole Свойства.Вставить("РольДоступнаПолныеПрава", - РольДоступна(Метаданные.Роли.ПолныеПрава)); // Не заменять на РолиДоступны. + РольДоступна(Метаданные.Роли.ПолныеПрава)); + + // АПК:336-вкл Возврат Новый ФиксированнаяСтруктура(Свойства); diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовСлужебный/Module.bsl b/SSL/src/CommonModules/ПрефиксацияОбъектовСлужебный/Module.bsl index ab12f90d9..6b7ab5d26 100644 --- a/SSL/src/CommonModules/ПрефиксацияОбъектовСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовСлужебный/Module.bsl @@ -8,6 +8,38 @@ #Область СлужебныйПрограммныйИнтерфейс +// Добавляет в схему компоновки данных, в вычисляемое поле Номер.СПрефиксом +// +// Параметры: +// СхемаКомпоновкиДанных - СхемаКомпоновкиДанных +// +Процедура ДобавитьРасширениеПоляНомер(СхемаКомпоновкиДанных) Экспорт + НайденоПолеНомер = Ложь; + Для Каждого НаборДанных Из СхемаКомпоновкиДанных.НаборыДанных Цикл + Если Не НаборДанных.Поля.Количество() Тогда + СхемаЗапроса = Новый СхемаЗапроса; + СхемаЗапроса.УстановитьТекстЗапроса(НаборДанных.Запрос); + ПоляЗапроса = СхемаЗапроса.ПакетЗапросов[СхемаЗапроса.ПакетЗапросов.Количество()-1].Колонки; + Если ПоляЗапроса.Найти("Номер") <> Неопределено Тогда + НайденоПолеНомер = Истина; + Прервать; + КонецЕсли; + ИначеЕсли НаборДанных.Поля.Найти("Номер") <> Неопределено Тогда + НайденоПолеНомер = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Если НайденоПолеНомер И СхемаКомпоновкиДанных.ВычисляемыеПоля.Найти("Номер.СПрефиксом") = Неопределено Тогда + НовоеПоле = СхемаКомпоновкиДанных.ВычисляемыеПоля.Добавить(); + НовоеПоле.Выражение = "Номер"; + НовоеПоле.Заголовок = НСтр("ru='Номер.С префиксом'"); + НовоеПоле.ПутьКДанным = "Номер.СПрефиксом"; + НовоеПоле.ТипЗначения = Новый ОписаниеТипов("Строка"); + КонецЕсли; + +КонецПроцедуры + // Выполняет действия по изменению префикса информационной базы // Дополнительно позволяет выполнить обработку данных для продолжения нумерации. // @@ -48,7 +80,7 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииПерепрефиксацияОбъектов(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение НСтр("ru = 'Не удалось изменить префикс.'"); @@ -313,6 +345,7 @@ КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Локальные служебные процедуры и функции. @@ -345,15 +378,14 @@ Для Каждого ОписаниеОбъекта Из ОписаниеМетаданныхИспользующихПрефиксы Цикл Если Не РежимАнализаДанных Тогда - // Устанавливаем исключительную блокировку на читаемые и впоследствии изменяемые виды данных. БлокировкаДанных = Новый БлокировкаДанных; - ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(ОписаниеОбъекта.ПолноеИмя); + БлокировкаДанных.Добавить(ОписаниеОбъекта.ПолноеИмя); БлокировкаДанных.Заблокировать(); КонецЕсли; + // @skip-check query-in-loop - Порционная обработка большого объема данных. ДанныеОбъектовДляПеренумерацииПоследнегоЭлемента = ДанныеОбъектовОдногоВидаДляПеренумерацииПоследнихЭлементов( ОписаниеОбъекта, ТекущийПрефиксИБ); - Если ДанныеОбъектовДляПеренумерацииПоследнегоЭлемента.Пустой() Тогда Продолжить; КонецЕсли; diff --git a/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl index 5abc0b456..a30f44867 100644 --- a/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl @@ -393,14 +393,14 @@ УдалитьФайлы(КаталогРаспаковки); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Работа в безопасном режиме.Не удалось удалить временный файл'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Попытка УдалитьФайлы(ВременныйФайл); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Работа в безопасном режиме.Не удалось удалить временный файл'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Возврат Новый ФиксированноеСоответствие(Результат); diff --git a/SSL/src/CommonModules/РаботаСАдресами/Module.bsl b/SSL/src/CommonModules/РаботаСАдресами/Module.bsl index 30de8db72..af20f1fe5 100644 --- a/SSL/src/CommonModules/РаботаСАдресами/Module.bsl +++ b/SSL/src/CommonModules/РаботаСАдресами/Module.bsl @@ -38,7 +38,7 @@ КонецЕсли; - СубъектРФ = СокрЛП(Адрес.Area + " " + Адрес.AreaType); + СубъектРФ = СокрЛП(Адрес.area + " " + Адрес.areaType); Возврат СубъектРФ; КонецФункции @@ -73,7 +73,7 @@ КонецЕсли; - Регион = СокрЛП(Адрес.Area + " " + Адрес.AreaType); + Регион = СокрЛП(Адрес.area + " " + Адрес.areaType); Если ЭтоГородФедеральногоЗначения(Регион) Или СтрСравнить(Адрес.AddressType, УправлениеКонтактнойИнформациейКлиентСервер.ИностранныйАдрес()) = 0 Тогда @@ -183,7 +183,8 @@ // ДополнительныеПараметры.ПолноеНаименованиеСокращений = ИСТИНА. // * КодМуниципальногоРайона - Строка - код муниципального района: // 1- муниципальный район; 2- городской округ; 3 - внутригородская территория -// города федерального значения; 4 - муниципальный округ. +// города федерального значения; 4 - муниципальный округ; +// 5 - федеральная территория. // Если не удалось определить код, то возвращается пустая строка. // * Город - Строка - текстовое представление города у адресов по административно-территориальному делению. // * ГородТипПолный - Строка - полное наименование типа города у адресов по административно-территориальному делению. @@ -398,7 +399,7 @@ // ТолькоНациональныйАдрес - Булево - адрес должен быть только российским. По умолчанию Истина. // ФорматАдреса - Строка - устарело. По какому классификатору проверять. // Возвращаемое значение: -// Структура - содержит структуру с полями: +// Структура: // * Результат - Строка - результат проверки: "Корректный", "НеПроверен", "СодержитОшибки". // * СписокОшибок - СписокЗначений - информация о ошибках. // @@ -543,10 +544,10 @@ Результат.ZIPcode = ПоляАдреса.Индекс; - Результат.AreaCode = ПоляАдреса.КодРегиона; + Результат.areaCode = ПоляАдреса.КодРегиона; - Результат.Area = ПоляАдреса.Регион; - Результат.AreaType = ПоляАдреса.РегионСокращение; + Результат.area = ПоляАдреса.Регион; + Результат.areaType = ПоляАдреса.РегионСокращение; Результат.City = ПоляАдреса.Город; Результат.CityType = ПоляАдреса.ГородСокращение; @@ -580,8 +581,8 @@ Если ПоляАдреса.Свойство("Идентификаторы") Тогда Если ТипЗнч(ПоляАдреса.Идентификаторы.РегионИдентификатор) = ТипУникальныйИдентификатор И ЗначениеЗаполнено(ПоляАдреса.Идентификаторы.РегионИдентификатор) Тогда - Результат.AreaID = Формат(ПоляАдреса.Идентификаторы.РегионИдентификатор, "ЧРГ=' '; ЧГ=0"); - Результат.ID = Результат.AreaID; + Результат.areaID = Формат(ПоляАдреса.Идентификаторы.РегионИдентификатор, "ЧРГ=' '; ЧГ=0"); + Результат.ID = Результат.areaID; КонецЕсли; Если ТипЗнч(ПоляАдреса.Идентификаторы.РайонИдентификатор) = ТипУникальныйИдентификатор @@ -1588,10 +1589,6 @@ КонецПроцедуры -Процедура ОпределитьФорматКонтактнойИнформации(ФорматКонтактнойИнформации) Экспорт - ФорматКонтактнойИнформации.Вставить("ФорматАдреса", "ФИАС"); -КонецПроцедуры - // Возвращает массив вариантов наименований по типу (по признаку владения, строения, и т.п). // // Параметры: @@ -1675,7 +1672,7 @@ КонецЕсли; ИначеЕсли ИмяПоля = "AREA" Тогда - НациональныйАдрес.СубъектРФ = ЭлементСписка.Значение + " " + ЗначенияПолей.AreaType; + НациональныйАдрес.СубъектРФ = ЭлементСписка.Значение + " " + ЗначенияПолей.areaType; ИначеЕсли ИмяПоля = "DISTRICT" Тогда Если НациональныйАдрес.СвРайМО = Неопределено Тогда @@ -1862,7 +1859,7 @@ Или XDTOТип = ФабрикаXDTO.Тип(УправлениеКонтактнойИнформациейЛокализация.ПространствоИмен(), "НомерФакса") Тогда Результат.CountryCode = Состав.КодСтраны; - Результат.AreaCode = Состав.КодГорода; + Результат.areaCode = Состав.КодГорода; Результат.Number = Состав.Номер; Результат.ExtNumber = Состав.Добавочный; @@ -1890,8 +1887,8 @@ Результат.ZIPCode = ЧастиАдреса[1]; НаименованиеСокращение = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(ЧастиАдреса[2]); - Результат.Area = НаименованиеСокращение.Наименование; - Результат.AreaType = НаименованиеСокращение.Сокращение; + Результат.area = НаименованиеСокращение.Наименование; + Результат.areaType = НаименованиеСокращение.Сокращение; НаименованиеСокращение = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(ЧастиАдреса[3]); Результат.District = НаименованиеСокращение.Наименование; @@ -1939,8 +1936,8 @@ Результат.OKATO = Формат(АдресРФ.ОКАТО, "ЧГ=0"); СубъектРФ = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(АдресРФ.СубъектРФ); - Результат.Area = Строка(СубъектРФ.Наименование); - Результат.AreaType = Строка(СубъектРФ.Сокращение); + Результат.area = Строка(СубъектРФ.Наименование); + Результат.areaType = Строка(СубъектРФ.Сокращение); РайонАдреса = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(РайонАдреса(АдресРФ)); Результат.District = Строка(РайонАдреса.Наименование); @@ -2454,8 +2451,10 @@ ИдентификаторТекущегоУровня = АдресИзJSON[ЧастьАдреса.Ключ + "Id"]; + // АПК:1297-выкл НСтр не требуется, т.к. данные ГАР не переводятся. Если ЧастьАдреса.Ключ = "area" И СтрНачинаетсяС(АдресИзJSON[ЧастьАдреса.Ключ], "Кемеровская область -") Тогда НаименованиеУровня = "Кемеровская область - Кузбасс"; + // АПК:1297-вкл ТипКраткий = "обл"; Иначе ТипКраткий = АдресИзJSON[ЧастьАдреса.Ключ + "Type"]; @@ -2567,7 +2566,9 @@ КонецЕсли; + // АПК:1297-выкл НСтр не требуется, т.к. данные ГАР не переводятся. АдресПоПолям.Регион = СтрЗаменить(АдресПоПолям.Регион, "Кемеровская область - Кузбасс обл", "Кемеровская область - Кузбасс"); + // АПК:1297-вкл УправлениеКонтактнойИнформациейСлужебный.ЗаменитьВСтруктуреНеопределеноНаПустуюСтроку(АдресПоПолям); СтрокаАдреса.Адрес = АдресПоПолям; @@ -2585,8 +2586,10 @@ Процедура УстановкаТипаОбластьКемеровскойОбласти(КонтактнаяИнформацияПоПолям) Экспорт + // АПК:1297-выкл НСтр не требуется, т.к. данные ГАР не переводятся. Если СтрСравнить(КонтактнаяИнформацияПоПолям.area, "Кемеровская область -") = 0 Тогда КонтактнаяИнформацияПоПолям.area = "Кемеровская область - Кузбасс"; + // АПК:1297-вкл КонтактнаяИнформацияПоПолям.areaType= "обл"; КонецЕсли; @@ -2992,7 +2995,7 @@ КонецЕсли; Если СтрДлина(КодКЛАДР) = 13 Тогда - Если ЗначениеЗаполнено(Адрес.Area) Тогда + Если ЗначениеЗаполнено(Адрес.area) Тогда КодыКЛАДР.Регион = Лев(КодКЛАДР, 2) + "00000000000"; КонецЕсли; Если ЗначениеЗаполнено(Адрес.District) Тогда @@ -3098,17 +3101,20 @@ КонецФункции Функция НаборБуквВНижнемРегистре() Экспорт - Возврат "абвгдеёжзийклмнопрстуфхцчшщыъьэюяabcdefghijklmnopqrstuvwxyz"; + + Возврат "абвгдеёжзийклмнопрстуфхцчшщыъьэюяabcdefghijklmnopqrstuvwxyz"; // АПК:163, АПК:216 Адреса могут содержать латиницу и все буквы русского алфавита. + КонецФункции Функция НаборБуквВВерхнемРегистре() Экспорт - Возврат "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЪЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + Возврат "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЪЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ"; // АПК:163, АПК:216 Адреса могут содержать латиницу и все буквы русского алфавита. + КонецФункции Процедура ДополнитьНастройкиПроверкиАдреса(ПараметрыВида, ВидКонтактнойИнформации) Экспорт - НастройкиПроверки = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВидКонтактнойИнформации, "ПроверятьПоФИАС, УказыватьОКТМО"); - ПараметрыВида.НастройкиПроверки.ПроверятьПоФИАС = НастройкиПроверки.ПроверятьПоФИАС; + НастройкиПроверки = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВидКонтактнойИнформации, "УказыватьОКТМО"); ПараметрыВида.НастройкиПроверки.УказыватьОКТМО = НастройкиПроверки.УказыватьОКТМО; КонецПроцедуры @@ -3490,12 +3496,12 @@ | &ПолноеИмяОбъектаCКонтактнойИнформацией КАК КонтактнаяИнформация |ГДЕ | КонтактнаяИнформация.Тип = &Тип - | И КонтактнаяИнформация.Представление ПОДОБНО &ТипЗдания"; + | И КонтактнаяИнформация.Представление ПОДОБНО &ТипЗдания СПЕЦСИМВОЛ ""~"""; Для каждого Объект Из ОбъектыМетаданных Цикл ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "&ПолноеИмяОбъектаCКонтактнойИнформацией", Объект.Метаданные().ПолноеИмя() + ".КонтактнаяИнформация"); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяОбъекта", Объект.Метаданные().Представление()); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяОбъекта", Объект.Метаданные().Представление()); НаборТекстаЗапроса.Добавить(ТекстЗапроса); КонецЦикла; @@ -3552,20 +3558,20 @@ Если Не ЗначениеЗаполнено(Проверка) Тогда Возврат; КонецЕсли; - ВидКонтактнойИнформации = ВидПроверки.Свойство2; + ВидКонтактнойИнформации = ВидПроверки.Свойство2; // СправочникСсылка.ВидыКонтактнойИнформации ВключатьСтрануВПредставление = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВидКонтактнойИнформации, "ВключатьСтрануВПредставление"); ПроблемныеОбъекты = МодульКонтрольВеденияУчета.ПроблемныеОбъектыПоВидуПроверки(ВидПроверки); - ВсегоОбъектов = 0; - ИсправленоОбъектов = 0; + ВсегоЭлементов = 0; + ИсправленоЭлементов = 0; Пока ПроблемныеОбъекты.Количество() > 0 Цикл ПоследнийПроблемныйОбъект = ПроблемныеОбъекты.Получить(ПроблемныеОбъекты.Количество() - 1).ПроблемныйОбъект; - ВсегоОбъектов = ВсегоОбъектов + ПроблемныеОбъекты.Количество(); + ВсегоЭлементов = ВсегоЭлементов + ПроблемныеОбъекты.Количество(); Для каждого ОписаниеОбъекта Из ПроблемныеОбъекты Цикл Если ИсправитьТипЗданияЛитерВАдресахОбъекта(ОписаниеОбъекта, ВидКонтактнойИнформации, ВключатьСтрануВПредставление) Тогда - ИсправленоОбъектов = ИсправленоОбъектов + 1; + ИсправленоЭлементов = ИсправленоЭлементов + 1; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтрольВеденияУчета") Тогда МодульКонтрольВеденияУчета = ОбщегоНазначения.ОбщийМодуль("КонтрольВеденияУчета"); @@ -3575,12 +3581,12 @@ КонецЕсли; КонецЦикла; - ПроблемныеОбъекты = МодульКонтрольВеденияУчета.ПроблемныеОбъекты(Проверка, ПоследнийПроблемныйОбъект); + ПроблемныеОбъекты = МодульКонтрольВеденияУчета.ПроблемныеОбъектыПоВидуПроверки(ВидПроверки, ПоследнийПроблемныйОбъект); КонецЦикла; Результат = Новый Структура; - Результат.Вставить("ВсегоОбъектов", ВсегоОбъектов); - Результат.Вставить("ИсправленоОбъектов", ИсправленоОбъектов); + Результат.Вставить("ВсегоЭлементов", ВсегоЭлементов); + Результат.Вставить("ИсправленоЭлементов", ИсправленоЭлементов); ПоместитьВоВременноеХранилище(Результат, АдресХранилища); @@ -3588,7 +3594,6 @@ Функция ИсправитьТипЗданияЛитерВАдресахОбъекта(ОписаниеОбъекта, Знач ВидКонтактнойИнформации, Знач ВключатьСтрануВПредставление) - КоличествоИсправленныхАдресов = 0; ОбъектБылИсправлен = Ложь; СвойстваВида = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВидКонтактнойИнформации, "ВключатьСтрануВПредставление, ХранитьИсториюИзменений, Ссылка"); @@ -3635,7 +3640,7 @@ Если СтрСравнить(ПоляСтроений.type, "Литер") = 0 Тогда ПоляСтроений.type = "Литера"; АдресБылИзменен = Истина; - КоличествоИсправленныхАдресов = КоличествоИсправленныхАдресов + 1; + КонецЕсли; КонецЦикла; @@ -3659,7 +3664,7 @@ Исключение ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(УправлениеКонтактнойИнформациейСлужебный.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -3690,24 +3695,28 @@ КонецЕсли; ПроблемныеОбъекты = МодульКонтрольВеденияУчета.ПроблемныеОбъектыПоВидуПроверки(ВидПроверки); - ВсегоОбъектов = 0; - ИсправленоОбъектов = 0; - + ВсегоЭлементов = 0; + ИсправленоАдресов = 0; + ИсправленоЭлементов = 0; + Пока ПроблемныеОбъекты.Количество() > 0 Цикл ПоследнийПроблемныйОбъект = ПроблемныеОбъекты.Получить(ПроблемныеОбъекты.Количество() - 1).ПроблемныйОбъект; - ВсегоОбъектов = ВсегоОбъектов + ПроблемныеОбъекты.Количество(); - //@skip-check query-in-loop Порционное исправление проблемных объектов - КоличествоИсправленных = ИсправитьПорциюНекорректныхАдресовКонтактнойИнформации(ПроблемныеОбъекты, Проверка, ВидПроверки); - ИсправленоОбъектов = ИсправленоОбъектов + КоличествоИсправленных; + ВсегоЭлементов = ВсегоЭлементов + ПроблемныеОбъекты.Количество(); + //@skip-check query-in-loop - Порционное исправление некорректны адресов (контроль ведения учета). + РезультатыИсправления = ИсправитьПорциюНекорректныхАдресовКонтактнойИнформации(ПроблемныеОбъекты, Проверка, ВидПроверки); + ИсправленоАдресов = ИсправленоАдресов + РезультатыИсправления.ИсправленоАдресов; + ИсправленоЭлементов = ИсправленоЭлементов + РезультатыИсправления.ИсправленоЭлементов; - ПроблемныеОбъекты = МодульКонтрольВеденияУчета.ПроблемныеОбъекты(Проверка, ПоследнийПроблемныйОбъект); + ПроблемныеОбъекты = МодульКонтрольВеденияУчета.ПроблемныеОбъектыПоВидуПроверки(ВидПроверки, ПоследнийПроблемныйОбъект); КонецЦикла; + Результат = Новый Структура; - Результат.Вставить("ВсегоОбъектов", ВсегоОбъектов); - Результат.Вставить("ИсправленоОбъектов", ИсправленоОбъектов); + Результат.Вставить("ВсегоЭлементов", ВсегоЭлементов); + Результат.Вставить("ИсправленоАдресов", ИсправленоАдресов); + Результат.Вставить("ИсправленоЭлементов", ИсправленоЭлементов); ПоместитьВоВременноеХранилище(Результат, АдресХранилища); @@ -3716,10 +3725,12 @@ Функция ИсправитьПорциюНекорректныхАдресовКонтактнойИнформации(Знач ПроблемныеОбъекты, Проверка, ВидПроверки) - ИсправленоОбъектов = 0; + РезультатыИсправления = Новый Структура(); + РезультатыИсправления.Вставить("ИсправленоАдресов", 0); + РезультатыИсправления.Вставить("ИсправленоЭлементов", 0); Если ПроблемныеОбъекты.Количество() = 0 Тогда - Возврат ИсправленоОбъектов; + Возврат РезультатыИсправления; КонецЕсли; ПолноеИмяОбъектаCКонтактнойИнформацией = ПроблемныеОбъекты[0].ПроблемныйОбъект.Метаданные().ПолноеИмя(); @@ -3744,16 +3755,18 @@ | КонтактнаяИнформация.НомерСтроки КАК НомерСтроки |ИЗ | ПроблемныеОбъекты КАК ПроблемныеОбъекты - | ЛЕВОЕ СОЕДИНЕНИЕ &ПолноеИмяОбъектаCКонтактнойИнформацией КАК КонтактнаяИнформация + | ЛЕВОЕ СОЕДИНЕНИЕ #ПолноеИмяОбъектаCКонтактнойИнформацией КАК КонтактнаяИнформация | ПО ПроблемныеОбъекты.Ссылка = КонтактнаяИнформация.Ссылка |ГДЕ - | КонтактнаяИнформация.Тип = &Тип + | КонтактнаяИнформация.Тип = &Тип | | УПОРЯДОЧИТЬ ПО Ссылка"; Запрос = Новый Запрос; - Запрос.Текст = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъектаCКонтактнойИнформацией", + Запрос.Текст = СтрЗаменить(ТекстЗапроса, "#ПолноеИмяОбъектаCКонтактнойИнформацией", ПолноеИмяОбъектаCКонтактнойИнформацией + ".КонтактнаяИнформация"); + + ПроблемныеОбъекты.Свернуть("ПроблемныйОбъект"); Запрос.Параметры.Вставить("ПроблемныеОбъекты", ПроблемныеОбъекты); Запрос.Параметры.Вставить("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес); @@ -3761,19 +3774,22 @@ РезультатЗапроса = Запрос.Выполнить(); Если РезультатЗапроса.Пустой() Тогда - Возврат ИсправленоОбъектов; + Возврат РезультатыИсправления; КонецЕсли; ТаблицаАдресов = Новый ТаблицаЗначений; ТаблицаАдресов.Колонки.Добавить("Ссылка"); ТаблицаАдресов.Колонки.Добавить("Представление", ОбщегоНазначения.ОписаниеТипаСтрока(1000)); ТаблицаАдресов.Колонки.Добавить("Результат"); - ТаблицаАдресов.Колонки.Добавить("Счетчик", ОбщегоНазначения.ОписаниеТипаЧисло(10)); + ТаблицаАдресов.Колонки.Добавить("УникальныйНомер", ОбщегоНазначения.ОписаниеТипаЧисло(10)); + ТаблицаАдресов.Колонки.Добавить("НомерСтроки", ОбщегоНазначения.ОписаниеТипаЧисло(10)); + ТаблицаАдресов.Индексы.Добавить("Ссылка"); - Счетчик = 1; + УникальныйНомер = 1; АдресаДляПроверки = Новый Соответствие; ГруппировкаПоОбъекту = Новый Соответствие; + ВидыКонтактнойИнформации = Новый Массив; СтрокаЗапроса = РезультатЗапроса.Выбрать(); @@ -3784,21 +3800,40 @@ АдресВJSON = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВJSON(СтрокаЗапроса.ЗначенияПолей, СтрокаЗапроса.Вид); КонецЕсли; + РезультатИсправления = ИсправитьНекорректныеПоляАдресаКонтактнойИнформации(АдресВJSON, СтрокаЗапроса.Вид); + НоваяСтрока = ТаблицаАдресов.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаЗапроса, "Ссылка, Представление"); - НоваяСтрока.Счетчик = Счетчик; - АдресаДляПроверки.Вставить(Счетчик, АдресВJSON); + ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаЗапроса, "Ссылка, Представление, НомерСтроки"); + НоваяСтрока.Результат = РезультатИсправления; + НоваяСтрока.УникальныйНомер = УникальныйНомер; + АдресаДляПроверки.Вставить(УникальныйНомер, РезультатИсправления.Адрес); - ГруппировкаПоОбъекту.Вставить(СтрокаЗапроса.Ссылка, Истина); + ГруппировкаПоОбъекту.Вставить(СтрокаЗапроса.Ссылка, Истина); - Счетчик = Счетчик + 1; + Если ВидыКонтактнойИнформации.Найти(СтрокаЗапроса.Вид) = Неопределено Тогда + ВидыКонтактнойИнформации.Добавить(СтрокаЗапроса.Вид); + КонецЕсли; + + УникальныйНомер = УникальныйНомер + 1; КонецЦикла; - Для каждого СтрокаТаблицы Из ГруппировкаПоОбъекту Цикл - СсылкаНаОбъект = СтрокаТаблицы.Ключ; + РезультатАнализа = Новый Соответствие; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - ИсправленийВОбъекте = 0; + МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); + РезультатАнализа = МодульАдресныйКлассификаторСлужебный.АнализАдресовПоКлассификатору(АдресаДляПроверки, Истина); + + КонецЕсли; + + СвойстваВидовКИ = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(ВидыКонтактнойИнформации, "ВключатьСтрануВПредставление, ХранитьИсториюИзменений, Ссылка"); + + Для каждого ДанныеОбъекта Из ГруппировкаПоОбъекту Цикл + + СсылкаНаОбъект = ДанныеОбъекта.Ключ; + + ТребуетсяЗаписьОбъекта = Ложь; + ЕстьДействуетС = СсылкаНаОбъект.Метаданные().ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ДействуетС") <> Неопределено; НачатьТранзакцию(); @@ -3815,61 +3850,46 @@ Продолжить; КонецЕсли; - СтрокиВидаКИ = ОбъектКИ.КонтактнаяИнформация.НайтиСтроки(Новый Структура("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес)); - Для каждого СтрокаТаблицы Из СтрокиВидаКИ Цикл + АдресаОбъекта = ТаблицаАдресов.НайтиСтроки(Новый Структура("Ссылка", СсылкаНаОбъект)); + Для Каждого АдресОбъекта Из АдресаОбъекта Цикл - Адрес = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(СтрокаТаблицы.Значение, Перечисления.ТипыКонтактнойИнформации.Адрес); + СтрокиВидаКИ = ОбъектКИ.КонтактнаяИнформация.Найти(АдресОбъекта.НомерСтроки, "НомерСтроки"); + СвойстваВидаКИ = СвойстваВидовКИ[СтрокиВидаКИ.Вид]; - Если Не Адрес.Свойство("Area") Или ПустаяСтрока(Адрес.Area) Тогда - Продолжить; - КонецЕсли; - - Регион = СокрЛП(Адрес.area); - ВключатьСтрануВПредставление = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаТаблицы.Вид, "ВключатьСтрануВПредставление"); - - Если ЗначениеЗаполнено(Адрес.AreaType) Тогда - Если СтрСравнить(Адрес.AreaType, "обл.") = 0 - Или СтрСравнить(Адрес.AreaType, "г.") = 0 Тогда - Адрес.areaType = СтрЗаменить(Адрес.AreaType, ".", ""); - РаботаСАдресамиКлиентСервер.ОбновитьПредставлениеАдреса(Адрес, ВключатьСтрануВПредставление); - ИсправленийВОбъекте = ИсправленийВОбъекте + 1; - ИначеЕсли СтрСравнить(Регион, "Чувашская Республика") = 0 Тогда - // АПК: 1297-выкл Данные адресного классификатора, не локализуются - Адрес.area = "Чувашская Республика -"; - // АПК: 1297-вкл - Адрес.areaType = "Чувашия"; - РаботаСАдресамиКлиентСервер.ОбновитьПредставлениеАдреса(Адрес, ВключатьСтрануВПредставление); - ИсправленийВОбъекте = ИсправленийВОбъекте + 1; - КонецЕсли; - Иначе + Если СтрокиВидаКИ <> Неопределено Тогда - Если СтрНачинаетсяС(ВРег(Регион), "Г.") Тогда - Адрес.Вставить("areaType", "г"); - Адрес.area = Сред(Регион, 3); - РаботаСАдресамиКлиентСервер.ОбновитьПредставлениеАдреса(Адрес, ВключатьСтрануВПредставление); - ИсправленийВОбъекте = ИсправленийВОбъекте + 1; - ИначеЕсли СтрЗаканчиваетсяНа(ВРег(Регион), "ОБЛАСТЬ") Тогда - Адрес.Вставить("areaType", "обл"); - Адрес.area = СокрЛП(Сред(Регион, 1, СтрДлина(Регион) - 7)); - РаботаСАдресамиКлиентСервер.ОбновитьПредставлениеАдреса(Адрес, ВключатьСтрануВПредставление); - ИсправленийВОбъекте = ИсправленийВОбъекте + 1; - ИначеЕсли СтрНачинаетсяС(ВРег(Регион), "РЕСПУБЛИКА") Тогда - Адрес.area = СокрЛП(Сред(Регион, 11)); - Адрес.Вставить("areaType", "Респ"); - РаботаСАдресамиКлиентСервер.ОбновитьПредставлениеАдреса(Адрес, ВключатьСтрануВПредставление); - ИсправленийВОбъекте = ИсправленийВОбъекте + 1; + АдресПоПолям = Неопределено; + + РезультатПроверки = РезультатАнализа[АдресОбъекта.УникальныйНомер]; + + ЗаменаУстаревшего = Ложь; + + Если РезультатПроверки <> Неопределено И Не РезультатПроверки.АдресКорректный Тогда + + Если РезультатПроверки.Варианты.Количество() > 0 Тогда + АдресПоПолям = РезультатПроверки.Варианты[0]; + КонецЕсли; + + ЗаменаУстаревшего = РезультатПроверки.АдресУстарел; + + ИначеЕсли АдресОбъекта.Результат.Изменен Тогда + + АдресПоПолям = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям( + АдресОбъекта.Результат.Адрес, Перечисления.ТипыКонтактнойИнформации.Адрес); + + КонецЕсли; + + Если АдресПоПолям <> Неопределено Тогда + ЗаменитьАдресНаАктуальный(ОбъектКИ, СтрокиВидаКИ, АдресПоПолям, СвойстваВидаКИ, ЕстьДействуетС, ЗаменаУстаревшего); + РезультатыИсправления.ИсправленоАдресов = РезультатыИсправления.ИсправленоАдресов + 1; + ТребуетсяЗаписьОбъекта = Истина; КонецЕсли; КонецЕсли; - - СтрокаТаблицы.Представление = Адрес.value; - СтрокаТаблицы.Значение = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(Адрес); - КонецЦикла; - Если ИсправленийВОбъекте > 0 Тогда + Если ТребуетсяЗаписьОбъекта Тогда ОбновлениеИнформационнойБазы.ЗаписатьДанные(ОбъектКИ); - ИсправленоОбъектов = ИсправленоОбъектов + ИсправленийВОбъекте; - + РезультатыИсправления.ИсправленоЭлементов = РезультатыИсправления.ИсправленоЭлементов + 1; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтрольВеденияУчета") Тогда МодульКонтрольВеденияУчета = ОбщегоНазначения.ОбщийМодуль("КонтрольВеденияУчета"); МодульКонтрольВеденияУчета.ОчиститьРезультатПоВидуПроверки(СсылкаНаОбъект, ВидПроверки); @@ -3881,17 +3901,87 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(УправлениеКонтактнойИнформациейСлужебный.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; - + КонецЦикла; - - Возврат ИсправленоОбъектов; + Возврат РезультатыИсправления; КонецФункции +// Параметры: +// АдресВJSON - Строка +// Вид - СправочникСсылка.ВидыКонтактнойИнформации +// +// Возвращаемое значение: +// Структура: +// * Адрес - Строка +// * Изменен - Булево +// * Корректный - Булево +// +Функция ИсправитьНекорректныеПоляАдресаКонтактнойИнформации(АдресВJSON, Вид) + + Результат = Новый Структура; + Результат.Вставить("Адрес", АдресВJSON); + Результат.Вставить("Изменен", Ложь); + Результат.Вставить("Корректный", Истина); + + Адрес = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(АдресВJSON, Перечисления.ТипыКонтактнойИнформации.Адрес); + + Если Не Адрес.Свойство("Area") Или ПустаяСтрока(Адрес.Area) Тогда + Результат.Корректный = Ложь; + Возврат Результат; + КонецЕсли; + + Регион = СокрЛП(Адрес.area); + ВключатьСтрануВПредставление = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Вид, "ВключатьСтрануВПредставление"); + + Если ЗначениеЗаполнено(Адрес.areaType) Тогда + Если СтрСравнить(Адрес.areaType, "обл.") = 0 + Или СтрСравнить(Адрес.areaType, "г.") = 0 Тогда + Адрес.areaType = СтрЗаменить(Адрес.areaType, ".", ""); + РаботаСАдресамиКлиентСервер.ОбновитьПредставлениеАдреса(Адрес, ВключатьСтрануВПредставление); + Результат.Изменен = Истина; + ИначеЕсли СтрСравнить(Регион, "Чувашская Республика") = 0 Тогда + // АПК: 1297-выкл Данные адресного классификатора, не локализуются + Адрес.area = "Чувашская Республика -"; + // АПК: 1297-вкл + Адрес.areaType = "Чувашия"; + РаботаСАдресамиКлиентСервер.ОбновитьПредставлениеАдреса(Адрес, ВключатьСтрануВПредставление); + Результат.Изменен = Истина; + ИначеЕсли СтрСравнить(СокрЛП(Адрес.areaType), "ОБЛАСТЬ") = 0 Тогда + Адрес.areaType = "обл"; + РаботаСАдресамиКлиентСервер.ОбновитьПредставлениеАдреса(Адрес, ВключатьСтрануВПредставление); + Результат.Изменен = Истина; + КонецЕсли; + + Иначе + + Если СтрНачинаетсяС(ВРег(Регион), "Г.") Тогда + Адрес.Вставить("areaType", "г"); + Адрес.area = Сред(Регион, 3); + РаботаСАдресамиКлиентСервер.ОбновитьПредставлениеАдреса(Адрес, ВключатьСтрануВПредставление); + Результат.Изменен = Истина; + ИначеЕсли СтрЗаканчиваетсяНа(ВРег(Регион), "ОБЛАСТЬ") Тогда + Адрес.Вставить("areaType", "обл"); + Адрес.area = СокрЛП(Сред(Регион, 1, СтрДлина(Регион) - СтрДлина("ОБЛАСТЬ"))); + РаботаСАдресамиКлиентСервер.ОбновитьПредставлениеАдреса(Адрес, ВключатьСтрануВПредставление); + Результат.Изменен = Истина; + ИначеЕсли СтрНачинаетсяС(ВРег(Регион), "РЕСПУБЛИКА") Тогда + Адрес.area = СокрЛП(Сред(Регион, СтрДлина("РЕСПУБЛИКА"))); + Адрес.Вставить("areaType", "Респ"); + РаботаСАдресамиКлиентСервер.ОбновитьПредставлениеАдреса(Адрес, ВключатьСтрануВПредставление); + Результат.Изменен = Истина; + КонецЕсли; + КонецЕсли; + + Результат.Адрес = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(Адрес); + + Возврат Результат; + +КонецФункции // Устаревшие адреса @@ -3923,17 +4013,17 @@ ПоследнийПроблемныйОбъект = ПроблемныеОбъекты.Получить(ПроблемныеОбъекты.Количество() - 1).ПроблемныйОбъект; ВсегоОбъектов = ВсегоОбъектов + ПроблемныеОбъекты.Количество(); + //@skip-check query-in-loop - Порционное исправление некорректны адресов (контроль ведения учета). ИсправленоОбъектов = ИсправленоОбъектов + ИсправитьПорциюУстаревшихАдресовКонтактнойИнформации(ПроблемныеОбъекты, Проверка, ВидПроверки); - ПроблемныеОбъекты = МодульКонтрольВеденияУчета.ПроблемныеОбъекты(Проверка, ПоследнийПроблемныйОбъект); + ПроблемныеОбъекты = МодульКонтрольВеденияУчета.ПроблемныеОбъектыПоВидуПроверки(ВидПроверки, ПоследнийПроблемныйОбъект); КонецЦикла; Результат = Новый Структура; - Результат.Вставить("ВсегоОбъектов", ВсегоОбъектов); - Результат.Вставить("ИсправленоОбъектов", ИсправленоОбъектов); + Результат.Вставить("ВсегоЭлементов", ВсегоОбъектов); + Результат.Вставить("ИсправленоЭлементов", ИсправленоОбъектов); ПоместитьВоВременноеХранилище(Результат, АдресХранилища); - КонецПроцедуры Процедура ВыявитьУстаревшиеАдреса(Проверка, ПараметрыПроверки) Экспорт @@ -4153,7 +4243,7 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(УправлениеКонтактнойИнформациейСлужебный.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -4163,14 +4253,20 @@ КонецФункции -Процедура ЗаменитьАдресНаАктуальный(ОбъектКИ, СтрокаВидаКИ, АдресПоПолям, СвойстваВида, ЕстьДействуетС) +Процедура ЗаменитьАдресНаАктуальный(ОбъектКИ, СтрокаВидаКИ, АдресПоПолям, СвойстваВида, ЕстьДействуетС, ЗаменаУстаревшего = Истина) НовоеПредставление = РаботаСАдресамиКлиентСервер.ПредставлениеАдреса(АдресПоПолям, СвойстваВида.ВключатьСтрануВПредставление); АдресПоПолям.value = НовоеПредставление; НовыйАдресВJSON = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(АдресПоПолям); - ТекстКомментария = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Адрес ""%1"" устарел и был переименован в ""%2""'"), - СтрокаВидаКИ.Представление, НовоеПредставление); + Если ЗаменаУстаревшего Тогда + ТекстКомментария = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Адрес ""%1"" устарел и был переименован в ""%2""'"), + СтрокаВидаКИ.Представление, НовоеПредставление); + Иначе + ТекстКомментария = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Адрес ""%1"" был изменен автоматически на ""%2""'"), + СтрокаВидаКИ.Представление, НовоеПредставление); + КонецЕсли; + Если ЗначениеЗаполнено(АдресПоПолям.comment) Тогда ТекстКомментария = АдресПоПолям.comment + Символы.ПС + ТекстКомментария; КонецЕсли; @@ -4251,7 +4347,7 @@ ПорцияАдресов = Новый Соответствие; Проверки = Новый Соответствие; СоответствиеАдресаИСсылки = Новый Соответствие; - Счетчик = 1; + УникальныйНомер = 1; ОписаниеОбъекта = ОписаниеОбъекта(); @@ -4272,19 +4368,19 @@ АдресВJSON = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВJSON(СтрокаСАдресом.ЗначенияПолей, СтрокаСАдресом.Вид); КонецЕсли; - ПорцияАдресов.Вставить(Счетчик, АдресВJSON); + ПорцияАдресов.Вставить(УникальныйНомер, АдресВJSON); ОписаниеОбъекта = ОписаниеОбъекта(); ЗаполнитьЗначенияСвойств(ОписаниеОбъекта, СтрокаСАдресом); - СоответствиеАдресаИСсылки.Вставить(Счетчик, ОписаниеОбъекта); - Если Счетчик = 100 Тогда + СоответствиеАдресаИСсылки.Вставить(УникальныйНомер, ОписаниеОбъекта); + Если УникальныйНомер = 100 Тогда Результат = МодульАдресныйКлассификаторСлужебный.АнализАдресовПоКлассификатору(ПорцияАдресов, Истина); ОбработкаАдресаПослеПроверки(Результат, СоответствиеАдресаИСсылки, Проверка, ПараметрыПроверки, Проверки); ПорцияАдресов = Новый Соответствие; СоответствиеАдресаИСсылки = Новый Соответствие; - Счетчик = 1; + УникальныйНомер = 1; Иначе - Счетчик = Счетчик + 1; + УникальныйНомер = УникальныйНомер + 1; КонецЕсли; КонецЦикла; @@ -4352,8 +4448,17 @@ ВидПроверки = Проверки[ОписаниеАдреса.ИмяОбъекта]; Если ПроверенныйАдрес.Ошибки.Количество() > 0 Тогда - УточнениеПроблемы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '%1 ""%2"" не соответствует адресному классификатору, по причине: %3'"), Строка(ОписаниеАдреса.Вид), ОписаниеАдреса.Представление, ПроверенныйАдрес.Ошибки[0].Текст); + + Если ЗначениеЗаполнено(ОписаниеАдреса.Представление) Тогда + УточнениеПроблемы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 ""%2"" не соответствует адресному классификатору, по причине: %3'"), + Строка(ОписаниеАдреса.Вид), ОписаниеАдреса.Представление, ПроверенныйАдрес.Ошибки[0].Текст); + Иначе + УточнениеПроблемы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 не соответствует адресному классификатору, по причине: %2'"), + Строка(ОписаниеАдреса.Вид), ПроверенныйАдрес.Ошибки[0].Текст); + КонецЕсли; + Иначе УточнениеПроблемы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '%1 ""%2"" не соответствует адресному классификатору'"), Строка(ОписаниеАдреса.Вид), ОписаниеАдреса.Представление); @@ -4469,7 +4574,7 @@ Запрос.УстановитьПараметр("Виды", ОбъектДляПроверки.Значение); Запрос.УстановитьПараметр("Ссылка", ПоследнийОбъект); - + //@skip-check query-in-loop - Порционное исправление некорректны адресов (контроль ведения учета). РезультатЗапроса = Запрос.Выполнить(); Если РезультатЗапроса.Пустой() Тогда @@ -4592,7 +4697,7 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(УправлениеКонтактнойИнформациейСлужебный.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; diff --git a/SSL/src/CommonModules/РаботаСАдресамиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСАдресамиКлиент/Module.bsl index 0d2aeac52..02d3f54e7 100644 --- a/SSL/src/CommonModules/РаботаСАдресамиКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСАдресамиКлиент/Module.bsl @@ -8,22 +8,6 @@ #Область СлужебныеПроцедурыИФункции -// Преобразует введенные английские буквы к русской раскладке при подборе адреса -// -Процедура ПреобразоватьВводАдреса(Текст) Экспорт - РусскиеКлавиши = "ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЁ"; - АнглийскиеКлавиши = "QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,`"; - Текст = ВРег(Текст); - Для Позиция = 0 По СтрДлина(Текст) Цикл - Символ = Сред(Текст, Позиция, 1); - ПозицияСимвола = СтрНайти(АнглийскиеКлавиши, Символ); - Если ПозицияСимвола > 0 Тогда - Текст = СтрЗаменить(Текст, Символ, Сред(РусскиеКлавиши, ПозицияСимвола, 1)); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - Процедура ПоказатьКлассификатор(ПараметрыОткрытия, ВладелецФормы, РежимОткрытияОкна = Неопределено) Экспорт ОткрытьФорму("Справочник.СтраныМира.Форма.Классификатор", ПараметрыОткрытия, ВладелецФормы,,,,, РежимОткрытияОкна); @@ -81,7 +65,4 @@ КонецПроцедуры -#КонецОбласти - - - +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/Module.bsl b/SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/Module.bsl index 78f212abd..d0752a06f 100644 --- a/SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/Module.bsl @@ -889,13 +889,6 @@ СтруктураАдреса.Вставить("ТипКвартиры",""); СтруктураАдреса.Вставить("НаименованиеВида",""); - Если ВРег(ФорматАдреса) = "ФИАС" Тогда - СтруктураАдреса.Вставить("Округ",""); - СтруктураАдреса.Вставить("ОкругСокращение",""); - СтруктураАдреса.Вставить("ВнутригородскойРайон",""); - СтруктураАдреса.Вставить("ВнутригородскойРайонСокращение",""); - КонецЕсли; - Возврат СтруктураАдреса; КонецФункции @@ -957,4 +950,4 @@ #КонецОбласти -#КонецОбласти +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/РаботаСБанками/Module.bsl b/SSL/src/CommonModules/РаботаСБанками/Module.bsl index 90e66bc5c..514bfe568 100644 --- a/SSL/src/CommonModules/РаботаСБанками/Module.bsl +++ b/SSL/src/CommonModules/РаботаСБанками/Module.bsl @@ -238,11 +238,15 @@ Для Каждого Раздел Из Разделы Цикл ИдентификаторБанки = "КлассификаторБанков" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); + + ЕстьДела = Результат.КлассификаторПросрочен + Или Результат.ДоступноОбновление <> Неопределено И Результат.ДоступноОбновление; + Дело = ТекущиеДела.Добавить(); Дело.Идентификатор = ИдентификаторБанки; - Дело.ЕстьДела = Результат.КлассификаторУстарел; + Дело.ЕстьДела = ЕстьДела; Дело.Важное = Результат.КлассификаторПросрочен; - Дело.Представление = НСтр("ru = 'Классификатор банков устарел'"); + Дело.Представление = НСтр("ru = 'Справочник БИК устарел'"); Дело.Подсказка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Последнее обновление %1 назад'"), Результат.ВеличинаПросрочкиСтрокой); Дело.Форма = "Обработка.ЗагрузкаКлассификатораБанков.Форма"; Дело.Владелец = Раздел; diff --git a/SSL/src/CommonModules/РаботаСБанкамиВызовСервера/Module.bsl b/SSL/src/CommonModules/РаботаСБанкамиВызовСервера/Module.bsl new file mode 100644 index 000000000..e93f01114 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСБанкамиВызовСервера/Module.bsl @@ -0,0 +1,17 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 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 similarity index 50% rename from SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/ВызовОнлайнПоддержкиВызовСервера.mdo rename to SSL/src/CommonModules/РаботаСБанкамиВызовСервера/РаботаСБанкамиВызовСервера.mdo index e9c80c703..57eba0f4a 100644 --- a/SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/ВызовОнлайнПоддержкиВызовСервера.mdo +++ b/SSL/src/CommonModules/РаботаСБанкамиВызовСервера/РаботаСБанкамиВызовСервера.mdo @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="d065c02e-9991-468a-ae32-b8c29d078d03"> - <name>ВызовОнлайнПоддержкиВызовСервера</name> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="447da3d4-5d94-4cd2-8540-53c0836e6173"> + <name>РаботаСБанкамиВызовСервера</name> <synonym> <key>ru</key> - <value>Вызов онлайн-поддержки вызов сервера</value> + <value>Работа с банками вызов сервера</value> </synonym> <server>true</server> <serverCall>true</serverCall> diff --git a/SSL/src/CommonModules/РаботаСБанкамиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСБанкамиКлиент/Module.bsl index bbf4f6b41..edfc7e7f7 100644 --- a/SSL/src/CommonModules/РаботаСБанкамиКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСБанкамиКлиент/Module.bsl @@ -40,7 +40,7 @@ ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыКлиента.Свойство("Банки") И ПараметрыКлиента.Банки.ВыводитьОповещениеОНеактуальности Тогда - ПодключитьОбработчикОжидания("РаботаСБанкамиВывестиОповещениеОНеактуальности", 45, Истина); + ПодключитьОбработчикОжидания("РаботаСБанкамиВывестиОповещениеОНеактуальности", 180, Истина); КонецЕсли; КонецПроцедуры @@ -56,6 +56,10 @@ // Процедура ОповеститьКлассификаторУстарел() Экспорт + Если РаботаСБанкамиВызовСервера.КлассификаторАктуален() Тогда + Возврат; + КонецЕсли; + ПоказатьОповещениеПользователя( НСтр("ru = 'Классификатор банков устарел'"), НавигационнаяСсылкаФормыЗагрузки(), diff --git a/SSL/src/CommonModules/РаботаСБанкамиПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСБанкамиПереопределяемый/Module.bsl index 617467704..53b947726 100644 --- a/SSL/src/CommonModules/РаботаСБанкамиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаСБанкамиПереопределяемый/Module.bsl @@ -17,4 +17,22 @@ КонецПроцедуры +// Определяет настройки загрузки классификатора банков. +// +// Параметры: +// Настройки - Структура: +// * ОбрабатыватьОбластиДанных - Булево - включает выполнение процедуры ПриОбработкеОбластиДанных при обновлении +// классификатора. +// +Процедура ПриОпределенииНастроекЗагрузкиКлассификатораБанков(Настройки) Экспорт + +КонецПроцедуры + +// Используется только в разделенном режиме. Вызывается после загрузки классификатора для выполнения дополнительных +// действий в областях данных. Выполнение процедуры необходимо включить в ПриОпределенииНастроек, по умолчанию выключена. +// +Процедура ПриОбработкеОбластиДанных() Экспорт + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl index 67ff4b876..7ccab4109 100644 --- a/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl @@ -227,8 +227,14 @@ // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиентаПриЗапуске. Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт + ОповещатьОНеобходимостиОбновленияКурсовВалют = ОповещатьОНеобходимостиОбновленияКурсовВалют(); + Параметры.Вставить("Валюты", Новый ФиксированнаяСтруктура("ТребуетсяОбновитьКурсыВалют", - ОповещатьОНеобходимостиОбновленияКурсовВалют() И Не КурсыАктуальны())); + ОповещатьОНеобходимостиОбновленияКурсовВалют И Не КурсыАктуальны())); + + Если ОповещатьОНеобходимостиОбновленияКурсовВалют Тогда + УстановитьДатуСледующегоОповещения(); + КонецЕсли; КонецПроцедуры @@ -252,11 +258,10 @@ // См. СтандартныеПодсистемыСервер.ПриОтправкеСерверногоОповещения Процедура ПриОтправкеСерверногоОповещения(ИмяОповещения, ВариантыПараметров) Экспорт - ТекущаяДатаСеанса = ТекущаяДатаСеанса(); ДатаСледующегоОповещения = ОбщегоНазначения.ХранилищеСистемныхНастроекЗагрузить( "СтандартныеПодсистемы.Валюты", "ДатаСледующегоОповещения", '00010101',, ""); - Если ДатаСледующегоОповещения > ТекущаяДатаСеанса Тогда + Если Не ЗначениеЗаполнено(ДатаСледующегоОповещения) Или ДатаСледующегоОповещения > ТекущаяДатаСеанса() Тогда Возврат; КонецЕсли; @@ -264,8 +269,7 @@ СерверныеОповещения.ОтправитьСерверноеОповещение(ИмяОповещения, "", ВариантыПараметров[0].Адресаты); КонецЕсли; - ОбщегоНазначения.ХранилищеСистемныхНастроекСохранить( - "СтандартныеПодсистемы.Валюты", "ДатаСледующегоОповещения", КонецДня(ТекущаяДатаСеанса) + 1,, ""); + УстановитьДатуСледующегоОповещения(); КонецПроцедуры @@ -353,7 +357,6 @@ ДополнительныеПараметры) Экспорт Если ИдентификаторСхемыКомпоновкиДанных = "ДанныеПечатиСуммаПрописью" Тогда - ДополнительныеПараметры.ДанныеИсточниковСгруппированыПоВладельцуИсточникаДанных = Истина; ВнешниеНаборыДанных.Вставить("Данные", ДанныеПечатиСуммаПрописью(ДополнительныеПараметры.ОписанияИсточниковДанных, КодЯзыка)); Возврат; КонецЕсли; @@ -582,8 +585,7 @@ Возврат Запрос.Выполнить().Пустой(); КонецФункции -// Для процедур ПриДобавленииПараметровРаботыКлиентаПриЗапуске и -// ПриДобавленииСерверныхОповещений. +// Для процедуры ПриДобавленииПараметровРаботыКлиентаПриЗапуске // Функция ОповещатьОНеобходимостиОбновленияКурсовВалют() @@ -612,6 +614,11 @@ Поле.Представление = НСтр("ru = 'Ссылка'"); Поле.ТипЗначения = Новый ОписаниеТипов(); + Поле = СписокПолей.Добавить(); + Поле.Идентификатор = "Валюта"; + Поле.Представление = НСтр("ru = 'Валюта'"); + Поле.ТипЗначения = Новый ОписаниеТипов(); + Поле = СписокПолей.Добавить(); Поле.Идентификатор = "ЧислоПрописью"; Поле.Представление = НСтр("ru = 'Число прописью'"); @@ -626,17 +633,37 @@ ДанныеПечати = Новый ТаблицаЗначений(); ДанныеПечати.Колонки.Добавить("Ссылка"); + ДанныеПечати.Колонки.Добавить("Валюта"); ДанныеПечати.Колонки.Добавить("ЧислоПрописью"); Для Каждого ОписаниеИсточника Из ОписанияИсточниковДанных Цикл СтрокаТаблицы = ДанныеПечати.Добавить(); - СтрокаТаблицы.Ссылка = ОписаниеИсточника.Владелец; - СтрокаТаблицы.ЧислоПрописью = СформироватьСуммуПрописью( - ОписаниеИсточника.Значение, ОписаниеИсточника.Владелец.ВалютаДокумента, , КодЯзыка); + СтрокаТаблицы.Ссылка = ОписаниеИсточника.Значение; + Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ОписаниеИсточника.Владелец)) Тогда + ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(ОписаниеИсточника.Владелец)); + Для Каждого Реквизит Из ОбъектМетаданных.Реквизиты Цикл + Если Реквизит.Тип.СодержитТип(Тип("СправочникСсылка.Валюты")) Тогда + Валюта = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОписаниеИсточника.Владелец, Реквизит.Имя); + Если ЗначениеЗаполнено(Валюта) Тогда + СтрокаТаблицы.Валюта = Валюта; + СтрокаТаблицы.ЧислоПрописью = СформироватьСуммуПрописью( + ОписаниеИсточника.Значение, Валюта, , КодЯзыка); + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЕсли; КонецЦикла; Возврат ДанныеПечати; КонецФункции +Процедура УстановитьДатуСледующегоОповещения() + + ОбщегоНазначения.ХранилищеСистемныхНастроекСохранить( + "СтандартныеПодсистемы.Валюты", "ДатаСледующегоОповещения", КонецДня(ТекущаяДатаСеанса()) + 1 + 7*60*60,, ""); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютВызовСервера/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалютВызовСервера/Module.bsl new file mode 100644 index 000000000..2376dc4e1 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютВызовСервера/Module.bsl @@ -0,0 +1,17 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 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..b0f972728 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютВызовСервера/РаботаСКурсамиВалютВызовСервера.mdo @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="56730848-3bef-4b8c-b449-fe9d09c9c374"> + <name>РаботаСКурсамиВалютВызовСервера</name> + <synonym> + <key>ru</key> + <value>Работа с курсами валют вызов сервера</value> + </synonym> + <server>true</server> + <serverCall>true</serverCall> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютГлобальный/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалютГлобальный/Module.bsl index 725580563..f9b88a15d 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 0286a8113..49a60cd4a 100644 --- a/SSL/src/CommonModules/РаботаСКурсамиВалютКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютКлиент/Module.bsl @@ -8,6 +8,14 @@ #Область СлужебныйПрограммныйИнтерфейс +Процедура ПоказатьЗагрузкуКурсовВалют(ПараметрыФормы = Неопределено) Экспорт + + // Локализация + ОткрытьФорму("Обработка.ЗагрузкаКурсовВалют.Форма", ПараметрыФормы); + // Конец Локализация + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем конфигурации. @@ -16,7 +24,7 @@ ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Если ПараметрыКлиента.Свойство("Валюты") И ПараметрыКлиента.Валюты.ТребуетсяОбновитьКурсыВалют Тогда - ПодключитьОбработчикОжидания("РаботаСКурсамиВалютВывестиОповещениеОНеактуальности", 15, Истина); + ПодключитьОбработчикОжидания("РаботаСКурсамиВалютВывестиОповещениеОНеактуальности", 180, Истина); КонецЕсли; КонецПроцедуры @@ -54,7 +62,11 @@ КонецФункции -Процедура ОповеститьКурсыУстарели() Экспорт +Процедура ОповеститьКурсыУстарели(Знач ПроверитьАктуальность = Ложь) Экспорт + + Если ПроверитьАктуальность И РаботаСКурсамиВалютВызовСервера.КурсыАктуальны() Тогда + Возврат; + КонецЕсли; ДатаНачалаДня = НачалоДня(ОбщегоНазначенияКлиент.ДатаСеанса()); Настройки = НастройкиНаКлиенте(); @@ -90,7 +102,7 @@ // Процедура ОповеститьКурсыАктуальны() Экспорт - ПоказатьПредупреждение(,НСтр("ru = 'Курсы валют актуальны.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Актуальные курсы валют успешно загружены.'")); КонецПроцедуры diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалютСлужебный/Module.bsl index 2c76056b0..51218dc9d 100644 --- a/SSL/src/CommonModules/РаботаСКурсамиВалютСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютСлужебный/Module.bsl @@ -351,6 +351,8 @@ Чтение.Закрыть(); ТаблицаКурсов.Индексы.Добавить("Код"); + ТаблицаКурсов.Сортировать("Дата Убыв"); + Возврат ТаблицаКурсов; КонецФункции @@ -519,7 +521,7 @@ ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось установить разделение сеанса %1 по причине: |%2'", ОбщегоНазначения.КодОсновногоЯзыка()), Формат(ОбластьДанных, "ЧН=0; ЧГ=0"), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(НСтр("ru = 'Поставляемые данные.Распространение курсов валют по областям данных'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, @@ -534,7 +536,7 @@ НачатьТранзакцию(); Попытка - + // @skip-check query-in-loop - обработка областей данных. ОбработатьКурсыОбластиВТранзакции(ЗапросОбщий, ВалютыОбластей, ТаблицаКурсов); МодульРаботаВМоделиСервиса.ВыйтиИзОбластиДанных(); МодульПоставляемыеДанные.ОбластьОбработана(ИдентификаторФайла, КодОбработчика, ОбластьДанных); @@ -551,7 +553,7 @@ ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось обновить курсы валют в области %1 по причине: |%2'", ОбщегоНазначения.КодОсновногоЯзыка()), Формат(ОбластьДанных, "ЧН=0; ЧГ=0"), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(НСтр("ru = 'Поставляемые данные.Распространение курсов валют по областям данных'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки); @@ -650,6 +652,7 @@ ЗапросОбщий.УстановитьПараметр("Валюта", ВыборкаВалюты.Ссылка); ЗапросОбщий.УстановитьПараметр("КодВалюты", ВыборкаВалюты.Код); + // @skip-check query-in-loop - добавляется временная таблица в запрос из уже имеющейся временной таблицы. СвойстваВалюты = СвойстваПоставляемойВалюты(ВалютыОбластей, ВыборкаВалюты.Код, ТаблицаКурсов, ЗапросОбщий); Если НЕ СвойстваВалюты.Поставляемая Тогда @@ -701,11 +704,12 @@ | МАКСИМУМ(Сравнение.ВФайле) <> МАКСИМУМ(Сравнение.ВДанных) | |УПОРЯДОЧИТЬ ПО - | Дата, + | Дата УБЫВ, | ВДанных"; ЗапросОбщий.Текст = СтрЗаменить(ТекстЗапроса, "NNN", СвойстваВалюты.ПорядковыйНомер); + // @skip-check query-in-loop - порционная выборка для упрощения запроса. РезультатОбщий = ЗапросОбщий.Выполнить(); ВыборкаОбщий = РезультатОбщий.Выбрать(); @@ -747,11 +751,8 @@ Записывать = Истина; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда - МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); - Если МодульДатыЗапретаИзмененияСлужебный.ЗапретИзмененияПроверяется(Метаданные.РегистрыСведений.КурсыВалют) Тогда - МодульДатыЗапретаИзменения = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзменения"); - Записывать = Не МодульДатыЗапретаИзменения.ИзменениеЗапрещено(НаборЗаписей); - КонецЕсли; + МодульДатыЗапретаИзменения = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзменения"); + Записывать = Не МодульДатыЗапретаИзменения.ИзменениеЗапрещено(НаборЗаписей); КонецЕсли; Если Записывать Тогда @@ -761,6 +762,7 @@ Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Комментарий, ВыборкаВалюты.Код, ВыборкаОбщий.Дата); ИмяСобытия = НСтр("ru = 'Поставляемые данные.Отмена загрузки курсов валюты'", ОбщегоНазначения.КодОсновногоЯзыка()); ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация,, ВыборкаВалюты.Ссылка, Комментарий); + Прервать; КонецЕсли; КонецЦикла; diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl index c9069e823..ae85f3196 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl @@ -170,6 +170,7 @@ // * РежимТестирования - Булево - используется для проверки подключения к серверу. // * ПолучениеЗаголовков - Булево - если Истина, то в возвращаемом наборе есть только // заголовки писем. +// * Отбор - Структура - соответствует параметру ПараметрыОтбора встроенной функции ИнтернетПочта.ПолучитьЗаголовки. // * ЗаголовкиИдентификаторы - Массив - заголовки или идентификаторы сообщений, полные // сообщения по которым требуется получить. // * ПриводитьСообщенияКТипу - Булево - возвращать набор полученных почтовых сообщений diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl index 3d3efa244..c91a725f9 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl @@ -146,7 +146,20 @@ Процедура ПерейтиКДокументацииПоВводуУчетнойЗаписиЭлектроннойПочты() Экспорт - ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("https://its.1c.ru/bmk/bsp_email_account"); + ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("https://its.1c.eu/bmk/bsp_email_account"); + +КонецПроцедуры + +Процедура ПолеПароляНачалоВыбора(Элемент, Реквизит, СтандартнаяОбработка) Экспорт + + СтандартнаяОбработка = Ложь; + Реквизит = Элемент.ТекстРедактирования; + Элемент.РежимПароля = Не Элемент.РежимПароля; + Если Элемент.РежимПароля Тогда + Элемент.КартинкаКнопкиВыбора = БиблиотекаКартинок.ВводимыеСимволыВидны; + Иначе + Элемент.КартинкаКнопкиВыбора = БиблиотекаКартинок.ВводимыеСимволыСкрыты; + КонецЕсли; КонецПроцедуры @@ -229,19 +242,6 @@ КонецПроцедуры -Процедура ПолеПароляНачалоВыбора(Элемент, Реквизит, СтандартнаяОбработка) Экспорт - - СтандартнаяОбработка = Ложь; - Реквизит = Элемент.ТекстРедактирования; - Элемент.РежимПароля = Не Элемент.РежимПароля; - Если Элемент.РежимПароля Тогда - Элемент.КартинкаКнопкиВыбора = БиблиотекаКартинок.ВводимыеСимволыСкрыты; - Иначе - Элемент.КартинкаКнопкиВыбора = БиблиотекаКартинок.ВводимыеСимволыВидны; - КонецЕсли; - -КонецПроцедуры - Функция СписокПолучателейИзСтроки(Знач Получатели) Результат = Новый СписокЗначений; diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиПереопределяемый/Module.bsl index 6d447d952..8a1288df6 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиПереопределяемый/Module.bsl @@ -75,6 +75,35 @@ +КонецПроцедуры + +// Определяет список писем, для которых необходимо получить статус доставки/прочтения. +// Пример определения списка писем см. в РассылкаОтчетов.ПередПолучениемСтатусовПисем +// +// Параметры: +// ИдентификаторыПисем - ТаблицаЗначений: +// * Отправитель - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты +// * ИдентификаторПисьма - Строка +// * АдресПолучателя - Строка - электронная почта получателя письма +// +Процедура ПередПолучениемСтатусовПисем(ИдентификаторыПисем) Экспорт + +КонецПроцедуры + +// Возвращает сведения только об известных статусах доставки (если были получены соответствующие письма). +// Пример обработки полученных статусов писем см. в РассылкаОтчетов.ПослеПолученияСтатусовПисем +// +// Параметры: +// СтатусыДоставки - ТаблицаЗначений: +// * Отправитель - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты +// * ИдентификаторПисьма - Строка +// * АдресПолучателя - Строка - электронная почта получателя письма +// * Статус - ПеречислениеСсылка.СтатусыЭлектронныхПисем +// * ДатаИзмененияСтатуса - Дата +// * Причина - Строка - причина недоставки письма +// +Процедура ПослеПолученияСтатусовПисем(СтатусыДоставки) Экспорт + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl index 1d082d314..059e8cffa 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl @@ -91,7 +91,17 @@ КонецЕсли; КонецЕсли; ТребуемыеСвойства = ТребуемыеСвойства + ",Таймаут"; - ЗаполнитьЗначенияСвойств(Результат, Выборка, ТребуемыеСвойства); + + СтруктураТребуемыхСвойств = Новый Структура(ТребуемыеСвойства); + ЗаполнитьЗначенияСвойств(СтруктураТребуемыхСвойств, Выборка); + Для Каждого СвойствоПрофиля Из СтруктураТребуемыхСвойств Цикл + Если СтрНайти(СвойствоПрофиля.Ключ, "Сервер") <> 0 + Или СтрНачинаетсяС(СвойствоПрофиля.Ключ, "Пользователь") Тогда + СтруктураТребуемыхСвойств.Вставить(СвойствоПрофиля.Ключ, СтрокаВPunycode(СвойствоПрофиля.Значение)); + КонецЕсли; + КонецЦикла; + + ЗаполнитьЗначенияСвойств(Результат, СтруктураТребуемыхСвойств); Если Результат.ПользовательSMTP = "" Тогда Результат.ПарольSMTP = ""; КонецЕсли; @@ -257,20 +267,17 @@ Возврат; КонецЕсли; - НастройкиВосстановленияПароля = ПользователиСлужебный.НастройкиВосстановленияПароля(); - Если НастройкиВосстановленияПароля = Неопределено Тогда - Возврат; - КонецЕсли; + НастройкиВосстановленияПароля = ДополнительныеНастройкиАутентификации.ПолучитьНастройкиВосстановленияПароля(); - ВнешнийПочтовыйСервер = ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("ОтправкаКодаПодтвержденияПоЗаданнымПараметрам"); - Если НастройкиВосстановленияПароля.СпособВосстановленияПароля <> ВнешнийПочтовыйСервер Тогда + Если НастройкиВосстановленияПароля.СпособВосстановленияПароля + <> СпособВосстановленияПароляПользователяИнформационнойБазы.ОтправкаКодаПодтвержденияПоЗаданнымПараметрам Тогда Возврат; КонецЕсли; НастройкиУчетнойЗаписиДляОтправкиПочта = НастройкиУчетнойЗаписиДляОтправкиПочта(Ссылка); ЗаполнитьЗначенияСвойств(НастройкиВосстановленияПароля, НастройкиУчетнойЗаписиДляОтправкиПочта); - ПользователиСлужебный.УстановитьНастройкиВосстановленияПароля(НастройкиВосстановленияПароля); + ДополнительныеНастройкиАутентификации.УстановитьНастройкиВосстановленияПароля(НастройкиВосстановленияПароля); КонецПроцедуры @@ -469,6 +476,48 @@ КонецПроцедуры +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. +Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт + + СоответствиеИменПсевдонимам.Вставить(Метаданные.РегламентныеЗадания.ПолучениеСтатусовЭлектронныхПисем.ИмяМетода); + +КонецПроцедуры + +// Кодирует строку по алгоритму Punycode +// +// Параметры: +// Строка - Строка - исходная строка +// +// Возвращаемое значение: +// Строка - кодированная строка +// +Функция СтрокаВPunycode(Знач Строка) Экспорт + Строка = НРег(Строка); + СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(Строка); + АдресХоста = СтруктураURI.Хост; + КодированныйАдресХоста = КодироватьСтрокуСРазделителем(АдресХоста); + Результат = СтрЗаменить(Строка, АдресХоста, КодированныйАдресХоста); + + Логин = СтруктураURI.Логин; + КодированныйЛогин = КодироватьСтрокуСРазделителем(Логин); + Результат = СтрЗаменить(Результат, Логин, КодированныйЛогин); + + Возврат Результат; +КонецФункции + +// Декодирует адреса электронной почты по алгоритму Punycode +// +// Параметры: +// Письмо - ИнтернетПочтовоеСообщение - обрабатываемое письмо +// +Процедура ДекодироватьАдресаВПисьме(Письмо) Экспорт + ДекодироватьКоллекциюАдресов(Письмо.АдресаУведомленияОПрочтении); + ДекодироватьКоллекциюАдресов(Письмо.ОбратныйАдрес); + ДекодироватьКоллекциюАдресов(Письмо.Получатели); + ДекодироватьКоллекциюАдресов(Письмо.СлепыеКопии); + Письмо.Отправитель.Адрес = PunycodeВСтроку(Письмо.Отправитель.Адрес); +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -623,31 +672,42 @@ ЗаголовкиИдентификаторы = Новый Массив; КонецЕсли; + Если ПараметрыЗагрузки.Свойство("Отбор") Тогда + Отбор = ПараметрыЗагрузки.Отбор; + Иначе + Отбор = Новый Структура; + КонецЕсли; + НаборСообщенийДляУдаления = Новый Массив; Протокол = ПротоколИнтернетПочты.POP3; - Если ОбщегоНазначения.ЗначениеРеквизитаОбъекта(УчетнаяЗапись, "ПротоколВходящейПочты") = "IMAP" Тогда + НастройкиТранспорта = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(УчетнаяЗапись, "ПротоколВходящейПочты,ОставлятьКопииСообщенийНаСервере,ПериодХраненияСообщенийНаСервере"); + Если НастройкиТранспорта.ПротоколВходящейПочты = "IMAP" Тогда + НастройкиТранспорта.ОставлятьКопииСообщенийНаСервере = Истина; + НастройкиТранспорта.ПериодХраненияСообщенийНаСервере = 0; Протокол = ПротоколИнтернетПочты.IMAP; КонецЕсли; УстановитьОтключениеБезопасногоРежима(Истина); Соединение = Новый ИнтернетПочта; Соединение.Подключиться(Профиль, Протокол); + + Если РежимТестирования Тогда + Соединение.Отключиться(); + Возврат Истина; + КонецЕсли; + Попытка - Если ПолучениеЗаголовков Тогда - НаборПисем = Соединение.ПолучитьЗаголовки(); - ИначеЕсли Не РежимТестирования Тогда - НастройкиТранспорта = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(УчетнаяЗапись, "ПротоколВходящейПочты,ОставлятьКопииСообщенийНаСервере,ПериодХраненияСообщенийНаСервере"); - Если НастройкиТранспорта.ПротоколВходящейПочты = "IMAP" Тогда - НастройкиТранспорта.ОставлятьКопииСообщенийНаСервере = Истина; - НастройкиТранспорта.ПериодХраненияСообщенийНаСервере = 0; - КонецЕсли; - + Если ПолучениеЗаголовков Или ЗаголовкиИдентификаторы.Количество() = 0 Тогда + ЗаголовкиИдентификаторы = Соединение.ПолучитьЗаголовки(Отбор); + НаборПисем = ЗаголовкиИдентификаторы; + КонецЕсли; + + Если Не ПолучениеЗаголовков И Не (ЗначениеЗаполнено(Отбор) И ЗаголовкиИдентификаторы.Количество() = 0) Тогда Если НастройкиТранспорта.ОставлятьКопииСообщенийНаСервере Тогда - Если ЗаголовкиИдентификаторы.Количество() = 0 И НастройкиТранспорта.ПериодХраненияСообщенийНаСервере > 0 Тогда - Заголовки = Соединение.ПолучитьЗаголовки(); + Если НастройкиТранспорта.ПериодХраненияСообщенийНаСервере > 0 Тогда НаборСообщенийДляУдаления = Новый Массив; - Для Каждого ЭлементЗаголовок Из Заголовки Цикл + Для Каждого ЭлементЗаголовок Из ЗаголовкиИдентификаторы Цикл ТекущаяДата = ТекущаяДатаСеанса(); РазницаДат = (ТекущаяДата - ЭлементЗаголовок.ДатаОтправления) / (3600*24); Если РазницаДат >= НастройкиТранспорта.ПериодХраненияСообщенийНаСервере Тогда @@ -688,17 +748,17 @@ Иначе ПриводитьСообщенияКТипу = Истина; КонецЕсли; - - НаборСообщений = НаборПисем; - Если ПриводитьСообщенияКТипу Тогда - Если ПараметрыЗагрузки.Свойство("Колонки") Тогда - НаборСообщений = АдаптированныйНаборПисем(НаборПисем, ПараметрыЗагрузки.Колонки); - Иначе - НаборСообщений = АдаптированныйНаборПисем(НаборПисем); - КонецЕсли; + + Колонки = Неопределено; + Если ПараметрыЗагрузки.Свойство("Колонки") Тогда + Колонки = ПараметрыЗагрузки.Колонки; КонецЕсли; - Возврат НаборСообщений; + Если ПриводитьСообщенияКТипу Тогда + Возврат АдаптированныйНаборПисем(НаборПисем, Колонки); + КонецЕсли; + + Возврат НаборПисем; КонецФункции @@ -755,7 +815,7 @@ КонецФункции Функция ПредставлениеАдреса(ИнтернетПочтовыйАдрес) - Результат = ИнтернетПочтовыйАдрес.Адрес; + Результат = PunycodeВСтроку(ИнтернетПочтовыйАдрес.Адрес); Если Не ПустаяСтрока(ИнтернетПочтовыйАдрес.ОтображаемоеИмя) Тогда Результат = ИнтернетПочтовыйАдрес.ОтображаемоеИмя + " <" + Результат + ">"; КонецЕсли; @@ -1426,6 +1486,8 @@ РезультатОтправкиПисьма.Вставить("ИдентификаторПисьмаSMTP", ""); РезультатОтправкиПисьма.Вставить("ИдентификаторПисьмаIMAP", ""); + КодироватьАдресаВПисьме(Письмо); + Если ПротоколПолученияПочты = ПротоколИнтернетПочты.IMAP Тогда Соединение.Послать(Письмо, ОбрабатыватьТексты, ПротоколИнтернетПочты.IMAP); РезультатОтправкиПисьма.Вставить("ИдентификаторПисьмаIMAP", Письмо.ИдентификаторСообщения); @@ -1442,7 +1504,7 @@ ОшибочныеПолучатели = Соединение.Послать(Письмо, ОбрабатыватьТексты, ПротоколИнтернетПочты.SMTP); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); Если ПолучательПисьмаОтклоненСервером(ТекстОшибки) Тогда Для Каждого Получатель Из Письмо.Получатели Цикл ОшибочныеПолучатели.Вставить(Получатель.Адрес, ТекстОшибки); @@ -1481,7 +1543,7 @@ ТекстОшибки = РасширенноеПредставлениеОшибки(ИнформацияОбОшибке(), ОбщегоНазначения.КодОсновногоЯзыка()); ЗаписьЖурналаРегистрации(ИмяСобытияОтправкаПочты(), УровеньЖурналаРегистрации.Ошибка, , УчетнаяЗапись, ТекстОшибки); - ТекстИсключения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстИсключения = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Если РезультатыОтправкиПисем.Количество() = 0 Тогда ВызватьИсключение; @@ -1686,7 +1748,7 @@ Функция Разрешения() Экспорт Протокол = "HTTPS"; - Адрес = "downloads.v8.1c.ru"; + Адрес = АдресВнешнегоРесурса(); Порт = Неопределено; Описание = НСтр("ru = 'Поиск настроек почты и диагностика ошибок подключения.'"); @@ -1696,6 +1758,23 @@ Разрешения.Добавить( МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); + Для Каждого Адрес Из АдресаСерверовDNS() Цикл + Протокол = "TCP"; + Порт = 53; + Описание = НСтр("ru = 'Поиск настроек почты.'"); + + Разрешения.Добавить( + МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание)); + КонецЦикла; + + Если ОбщегоНазначения.ЭтоWindowsСервер() Тогда + ШаблонКоманды = "cmd /S /C ""%(nslookup -type=mx % %)%"""; + ИначеЕсли ОбщегоНазначения.ЭтоLinuxСервер() Тогда + ШаблонКоманды = "nslookup -type=mx % %"; + КонецЕсли; + Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеПриложенияОперационнойСистемы(ШаблонКоманды, + НСтр("ru = 'Разрешение для nslookup.'", ОбщегоНазначения.КодОсновногоЯзыка()))); + Возврат Разрешения; КонецФункции @@ -1718,7 +1797,7 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета"); - АдресФайла = "https://downloads.v8.1c.ru/content/common/settings/mailerrors.json"; + АдресФайла = АдресФайлаСОписаниемОшибок(); ЗагруженныйФайл = МодульПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(АдресФайла); Если ЗагруженныйФайл.Статус Тогда ЧтениеJSON = Новый ЧтениеJSON(); @@ -1856,8 +1935,8 @@ Функция РасширенноеПредставлениеОшибки(ИнформацияОбОшибке, КодЯзыка, ВключитьПодробноеПредставлениеОшибки = Истина) Экспорт - КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КраткоеПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПодробноеПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); ПоясненияПоОшибке = ПоясненияПоОшибке(КраткоеПредставлениеОшибки, КодЯзыка); Шаблон = НСтр("ru = '%1 @@ -1973,7 +2052,7 @@ КонецЕсли; Исключение ЗаписьЖурналаРегистрации(ИмяСобытияАвторизацияПоПротоколуOAuth(), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Если HTTPОтвет <> Неопределено Тогда @@ -2155,9 +2234,520 @@ Процедура ОформитьПолеПароля(Элемент) Экспорт Элемент.РежимПароля = Истина; - Элемент.КартинкаКнопкиВыбора = БиблиотекаКартинок.ВводимыеСимволыСкрыты; + Элемент.КартинкаКнопкиВыбора = БиблиотекаКартинок.ВводимыеСимволыВидны; Элемент.КнопкаВыбора = Ложь; КонецПроцедуры +Процедура ПолучениеСтатусовЭлектронныхПисем() Экспорт + + ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ПолучениеСтатусовЭлектронныхПисем); + + ИдентификаторыПисем = Новый ТаблицаЗначений; + ИдентификаторыПисем.Колонки.Добавить("Отправитель", Новый ОписаниеТипов("СправочникСсылка.УчетныеЗаписиЭлектроннойПочты")); + ИдентификаторыПисем.Колонки.Добавить("ИдентификаторПисьма", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(255))); + ИдентификаторыПисем.Колонки.Добавить("АдресПолучателя", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(100))); + + ПередПолучениемСтатусовПисем(ИдентификаторыПисем); + + Если ИдентификаторыПисем.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ИдентификаторыПисем.Отправитель КАК Отправитель, + | ИдентификаторыПисем.ИдентификаторПисьма КАК ИдентификаторПисьма, + | ИдентификаторыПисем.АдресПолучателя КАК АдресПолучателя + |ПОМЕСТИТЬ ИдентификаторыПисем + |ИЗ + | &ИдентификаторыПисем КАК ИдентификаторыПисем + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ИдентификаторыПисем.Отправитель КАК Отправитель, + | ИдентификаторыПисем.ИдентификаторПисьма КАК ИдентификаторПисьма, + | ИдентификаторыПисем.АдресПолучателя КАК АдресПолучателя + |ИЗ + | ИдентификаторыПисем КАК ИдентификаторыПисем + |ИТОГИ ПО + | Отправитель"; + + Запрос.УстановитьПараметр("ИдентификаторыПисем", ИдентификаторыПисем); + + РезультатЗапроса = Запрос.Выполнить(); + + ВыборкаОтправитель = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + + ПараметрыЗагрузкиСообщений = Новый Структура; + КолонкиТаблицыСообщений = Новый Массив; + КолонкиТаблицыСообщений.Добавить("Заголовок"); + КолонкиТаблицыСообщений.Добавить("ДатаОтправления"); + КолонкиТаблицыСообщений.Добавить("Тексты"); + КолонкиТаблицыСообщений.Добавить("Отправитель"); + ПараметрыЗагрузкиСообщений.Вставить("Колонки", КолонкиТаблицыСообщений); + + СтатусыДоставки = Новый ТаблицаЗначений; + СтатусыДоставки.Колонки.Добавить("Отправитель", Новый ОписаниеТипов("СправочникСсылка.УчетныеЗаписиЭлектроннойПочты")); + СтатусыДоставки.Колонки.Добавить("ИдентификаторПисьма", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(255))); + СтатусыДоставки.Колонки.Добавить("АдресПолучателя", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(100))); + СтатусыДоставки.Колонки.Добавить("Статус", Новый ОписаниеТипов("ПеречислениеСсылка.СтатусыЭлектронныхПисем")); + СтатусыДоставки.Колонки.Добавить("ДатаИзмененияСтатуса", Новый ОписаниеТипов("Дата")); + СтатусыДоставки.Колонки.Добавить("Причина", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(500))); + + Пока ВыборкаОтправитель.Следующий() Цикл + + Сообщения = РаботаСПочтовымиСообщениями.ЗагрузитьПочтовыеСообщения(ВыборкаОтправитель.Отправитель, ПараметрыЗагрузкиСообщений); + + Выборка = ВыборкаОтправитель.Выбрать(); + + Пока Выборка.Следующий() Цикл + Для Каждого Сообщение Из Сообщения Цикл + Если СтрНайти(Сообщение.Заголовок, Выборка.АдресПолучателя) = 0 + И СтрНайти(Сообщение.Заголовок, Выборка.ИдентификаторПисьма) = 0 + И СтрНайти(Сообщение.Отправитель, "mailer-daemon")= 0 Тогда + Продолжить; + КонецЕсли; + Если СтрНайти(Сообщение.Заголовок, Выборка.ИдентификаторПисьма) > 0 Тогда + Если СтрНайти(Сообщение.Заголовок, Выборка.АдресПолучателя) > 0 И СтрНайти(Сообщение.Заголовок, "X-Failed-Recipients") > 0 Тогда + ОтборСтрок = Новый Структура("ИдентификаторПисьма, АдресПолучателя", Выборка.ИдентификаторПисьма, Выборка.АдресПолучателя); + СуществующиеСтрокиСтатусов = СтатусыДоставки.НайтиСтроки(ОтборСтрок); + Если СуществующиеСтрокиСтатусов.Количество() > 0 Тогда + СтрокаСтатусыДоставки = СуществующиеСтрокиСтатусов[0]; + Иначе + СтрокаСтатусыДоставки = СтатусыДоставки.Добавить(); + КонецЕсли; + СтрокаСтатусыДоставки.Отправитель = ВыборкаОтправитель.Отправитель; + СтрокаСтатусыДоставки.ИдентификаторПисьма = Выборка.ИдентификаторПисьма; + СтрокаСтатусыДоставки.АдресПолучателя = Выборка.АдресПолучателя; + СтрокаСтатусыДоставки.Статус = Перечисления.СтатусыЭлектронныхПисем.НеДоставлено; + + НомерСимволаСтрокаПричины = СтрНайти(Сообщение.Заголовок, "X-Mailer-Daemon-Error"); + Если НомерСимволаСтрокаПричины > 0 Тогда + НомерСимволаНачалоПричины = НомерСимволаСтрокаПричины + СтрДлина("X-Mailer-Daemon-Error:"); + Причина = Сред(Сообщение.Заголовок, НомерСимволаНачалоПричины); + НомерСимволаПереносСтроки = СтрНайти(Причина, Символы.Пс); + Причина = СокрЛП(Лев(Причина, НомерСимволаПереносСтроки)); + Причина = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Письмо не доставлено по причине: %1.'"), Причина); + Иначе + Причина = НСтр("ru = 'Письмо не доставлено.'"); + КонецЕсли; + + СтрокаСтатусыДоставки.Причина = Причина; + СтрокаСтатусыДоставки.ДатаИзмененияСтатуса = Сообщение.ДатаОтправления; + Прервать; + ИначеЕсли СтрНайти(Сообщение.Заголовок, "Delivery Status Notification") > 0 Или СтрНайти( + Сообщение.Заголовок, "Disposition-Notification-To") > 0 Тогда + + ОтборСтрок = Новый Структура("ИдентификаторПисьма, АдресПолучателя", Выборка.ИдентификаторПисьма, Выборка.АдресПолучателя); + СуществующиеСтрокиСтатусов = СтатусыДоставки.НайтиСтроки(ОтборСтрок); + Если СуществующиеСтрокиСтатусов.Количество() > 0 Тогда + Продолжить; + КонецЕсли; + + СтрокаСтатусыДоставки = СтатусыДоставки.Добавить(); + СтрокаСтатусыДоставки.Отправитель = ВыборкаОтправитель.Отправитель; + СтрокаСтатусыДоставки.ИдентификаторПисьма = Выборка.ИдентификаторПисьма; + СтрокаСтатусыДоставки.АдресПолучателя = Выборка.АдресПолучателя; + СтрокаСтатусыДоставки.Статус = Перечисления.СтатусыЭлектронныхПисем.Доставлено; + СтрокаСтатусыДоставки.ДатаИзмененияСтатуса = Сообщение.ДатаОтправления; + Продолжить; + КонецЕсли; + Иначе + Если Сообщение.Тексты.Количество() > 0 Тогда + Для Каждого ТекстПисьма Из Сообщение.Тексты Цикл + Если ТекстПисьма["ТипТекста"] = "HTML" Тогда + Продолжить; + КонецЕсли; + Если СтрНайти(ТекстПисьма["Текст"], Выборка.ИдентификаторПисьма) > 0 + И СтрНайти(ТекстПисьма["Текст"], Выборка.АдресПолучателя) > 0 Тогда + + ОтборСтрок = Новый Структура("ИдентификаторПисьма, АдресПолучателя", Выборка.ИдентификаторПисьма, Выборка.АдресПолучателя); + СуществующиеСтрокиСтатусов = СтатусыДоставки.НайтиСтроки(ОтборСтрок); + Если СуществующиеСтрокиСтатусов.Количество() > 0 Тогда + Прервать; + КонецЕсли; + + СтрокаСтатусыДоставки = СтатусыДоставки.Добавить(); + СтрокаСтатусыДоставки.Отправитель = ВыборкаОтправитель.Отправитель; + СтрокаСтатусыДоставки.ИдентификаторПисьма = Выборка.ИдентификаторПисьма; + СтрокаСтатусыДоставки.АдресПолучателя = Выборка.АдресПолучателя; + СтрокаСтатусыДоставки.Статус = Перечисления.СтатусыЭлектронныхПисем.Доставлено; + СтрокаСтатусыДоставки.ДатаИзмененияСтатуса = Сообщение.ДатаОтправления; + КонецЕсли; + Продолжить; + КонецЦикла; + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + КонецЦикла; + + ПослеПолученияСтатусовПисем(СтатусыДоставки); + +КонецПроцедуры + +// См. РаботаСПочтовымиСообщениямиПереопределяемый.ПередПолучениемСтатусовПисем +Процедура ПередПолучениемСтатусовПисем(ИдентификаторыПисем) + + ИнтеграцияПодсистемБСП.ПередПолучениемСтатусовПисем(ИдентификаторыПисем); + РаботаСПочтовымиСообщениямиПереопределяемый.ПередПолучениемСтатусовПисем(ИдентификаторыПисем); + +КонецПроцедуры + +// См. РаботаСПочтовымиСообщениямиПереопределяемый.ПослеПолученияСтатусовПисем +Процедура ПослеПолученияСтатусовПисем(СтатусыДоставки) + + ИнтеграцияПодсистемБСП.ПослеПолученияСтатусовПисем(СтатусыДоставки); + РаботаСПочтовымиСообщениямиПереопределяемый.ПослеПолученияСтатусовПисем(СтатусыДоставки); + +КонецПроцедуры + +#Область Punycode + +Функция КодироватьСтрокуСРазделителем(Строка, Разделители = ".") + МассивПодстрок = СтрРазделить(Строка, Разделители); + КодированныйАдресХоста = ""; + ПозицияРазделителя = 0; + Для Каждого Подстрока Из МассивПодстрок Цикл + ПозицияРазделителя = ПозицияРазделителя + СтрДлина(Подстрока)+1; + КодированныйАдресХоста = КодированныйАдресХоста + КодироватьСтрокуPunycode(Подстрока); + КодированныйАдресХоста = КодированныйАдресХоста + Сред(Строка, ПозицияРазделителя, 1); + КонецЦикла; + Возврат КодированныйАдресХоста; +КонецФункции + +Функция ДекодироватьСтрокуСРазделителем(Строка, Разделители = ".") + МассивПодстрок = СтрРазделить(Строка, Разделители); + ДекодированныйАдресХоста = ""; + ПозицияРазделителя = 0; + Для Каждого Подстрока Из МассивПодстрок Цикл + ПозицияРазделителя = ПозицияРазделителя + СтрДлина(Подстрока)+1; + ДекодированныйАдресХоста = ДекодированныйАдресХоста + ДекодироватьСтрокуPunycode(Подстрока); + ДекодированныйАдресХоста = ДекодированныйАдресХоста + Сред(Строка, ПозицияРазделителя, 1); + КонецЦикла; + Возврат ДекодированныйАдресХоста; +КонецФункции + +// Параметры: +// Письмо - ИнтернетПочтовоеСообщение +// +Процедура КодироватьАдресаВПисьме(Письмо) + КодироватьКоллекциюАдресов(Письмо.АдресаУведомленияОПрочтении); + КодироватьКоллекциюАдресов(Письмо.ОбратныйАдрес); + КодироватьКоллекциюАдресов(Письмо.Получатели); + КодироватьКоллекциюАдресов(Письмо.СлепыеКопии); + Письмо.Отправитель.Адрес = СтрокаВPunycode(Письмо.Отправитель.Адрес); +КонецПроцедуры + +// Параметры: +// КоллекцияАдресов - ИнтернетПочтовыеАдреса +// +Процедура КодироватьКоллекциюАдресов(КоллекцияАдресов) + Если КоллекцияАдресов <> Неопределено Тогда + Для Каждого Адрес Из КоллекцияАдресов Цикл + Адрес.Адрес = СтрокаВPunycode(Адрес.Адрес); + КонецЦикла; + КонецЕсли; +КонецПроцедуры + +// Параметры: +// КоллекцияАдресов - ИнтернетПочтовыеАдреса +// +Процедура ДекодироватьКоллекциюАдресов(КоллекцияАдресов) + Если КоллекцияАдресов <> Неопределено Тогда + Для Каждого Адрес Из КоллекцияАдресов Цикл + Адрес.Адрес = PunycodeВСтроку(Адрес.Адрес); + КонецЦикла; + КонецЕсли; +КонецПроцедуры + +Функция ЭтоСимволASCII(Знач Символ) + Возврат КодСимвола(Символ) < 128; +КонецФункции + +Функция ПорядковыйНомерВСимвол(Знач ПорядковыйНомер) + Возврат Символ(ПорядковыйНомер + 22 + 75 * (ПорядковыйНомер < 26)); +КонецФункции + +Функция КодСимволаВПорядковыйНомер(Знач Код) + Код0 = КодСимвола("0"); + КодA = КодСимвола("a"); + + Если Код - Код0 < 10 Тогда + Возврат Код - Код0 + 26; + ИначеЕсли Код - КодA < 26 Тогда + Возврат Код - КодA; + Иначе + ВызватьИсключение НСтр("ru='Плохие данные на вход'"); + КонецЕсли; +КонецФункции + +Функция АдаптацияСмещения(Знач Дельта, Знач ПозицияСимвола, Знач ПерваяАдаптация) + Дельта = Цел(?(ПерваяАдаптация, Дельта / 700, Дельта / 2)); + Дельта = Дельта + Цел(Дельта / ПозицияСимвола); + + ДелительДельты = 36 - 1; + Порог = Цел(ДелительДельты * 26 / 2); + Перемещение = 0; + + Пока Дельта > Порог Цикл + Дельта = Цел(Дельта / ДелительДельты); + Перемещение = Перемещение + 36; + КонецЦикла; + + Возврат Перемещение + Цел((ДелительДельты + 1) * Дельта / (Дельта + 38)); +КонецФункции + +Функция КодироватьСтрокуPunycode(Знач ВходящаяСтрока) + Результат = Новый Массив; + + Дельта = 0; + ТекущаяПозиция = 0; + СимволовНаВывод = 0; + ТекущийНаибольший = 0; + СкорректированнаяДельта = 0; + Перемещение = 0; + + Наибольший = 128; + Смещение = 72; + ДлинаСтроки = СтрДлина(ВходящаяСтрока); + + Для ИндексСимвола = 1 По ДлинаСтроки Цикл + ОчереднойСимвол = Сред(ВходящаяСтрока, ИндексСимвола, 1); + Если ЭтоСимволASCII(ОчереднойСимвол) Тогда + Результат.Добавить(ОчереднойСимвол); + СимволовНаВывод = СимволовНаВывод + 1; + КонецЕсли; + КонецЦикла; + + ТекущаяПозиция = СимволовНаВывод; + Начало = СимволовНаВывод; + + Если СимволовНаВывод = ДлинаСтроки Тогда + Возврат ВходящаяСтрока; + КонецЕсли; + + Результат.Добавить("-"); + СимволовНаВывод = СимволовНаВывод + 1; + + Пока ТекущаяПозиция < ДлинаСтроки Цикл + ТекущийНаибольший = 9999999999; + Для ИндексСимвола = 1 По ДлинаСтроки Цикл + Код = КодСимвола(ВходящаяСтрока, ИндексСимвола); + Если Код >= Наибольший И Код < ТекущийНаибольший Тогда + ТекущийНаибольший = Код; + КонецЕсли; + КонецЦикла; + + Если ТекущийНаибольший - Наибольший > Цел((9999999999 - Дельта) / (ТекущаяПозиция + 1)) Тогда + ВызватьИсключение "Переполнение"; + КонецЕсли; + + Дельта = Дельта + (ТекущийНаибольший - Наибольший) * (ТекущаяПозиция + 1); + Наибольший = ТекущийНаибольший; + + Для ИндексСимвола = 1 По ДлинаСтроки Цикл + Код = КодСимвола(ВходящаяСтрока, ИндексСимвола); + Если Код < Наибольший Тогда + Дельта = Дельта + 1; + Если Дельта = 0 Тогда + ВызватьИсключение "Переполнение"; + КонецЕсли; + ИначеЕсли Код = Наибольший Тогда + СкорректированнаяДельта = Дельта; + Перемещение = 36; + + Пока Истина Цикл + ПредполагаемыйПорядковыйНомер = ?(Перемещение <= Смещение, 1, + ?(Перемещение >= Смещение + 26, 26, Перемещение - Смещение)); + Если СкорректированнаяДельта < ПредполагаемыйПорядковыйНомер Тогда + Прервать; + КонецЕсли; + + КодированныйСимвол = ПорядковыйНомерВСимвол(ПредполагаемыйПорядковыйНомер + + (СкорректированнаяДельта - ПредполагаемыйПорядковыйНомер) % (36 - ПредполагаемыйПорядковыйНомер)); + Результат.Добавить(КодированныйСимвол); + + СкорректированнаяДельта = Цел((СкорректированнаяДельта - ПредполагаемыйПорядковыйНомер) / (36 - ПредполагаемыйПорядковыйНомер)); + Перемещение = Перемещение + 36; + КонецЦикла; + + Результат.Добавить(ПорядковыйНомерВСимвол(СкорректированнаяДельта)); + + Смещение = АдаптацияСмещения(Дельта, ТекущаяПозиция + 1, ТекущаяПозиция = Начало); + Дельта = 0; + ТекущаяПозиция = ТекущаяПозиция + 1; + КонецЕсли; + КонецЦикла; + + Дельта = Дельта + 1; + Наибольший = Наибольший + 1; + КонецЦикла; + КодированнаяСтрока = "xn--" + СтрСоединить(Результат); + КодированнаяСтрока = СтрЗаменить(КодированнаяСтрока, "---", "--"); + Возврат КодированнаяСтрока; +КонецФункции + +Функция ДекодироватьСтрокуPunycode(Знач КодированнаяСтрока) + Если Не СтрНачинаетсяС(КодированнаяСтрока, "xn--") Тогда + Возврат КодированнаяСтрока; + Иначе + Если СтрЧислоВхождений(КодированнаяСтрока, "-") = 3 Тогда + КодированнаяСтрока = СтрЗаменить(КодированнаяСтрока, "xn--", ""); + Иначе + КодированнаяСтрока = СтрЗаменить(КодированнаяСтрока, "xn-", ""); + КонецЕсли; + КонецЕсли; + Результат = Новый Массив; + Код = 128; + ПозицияВставки = 0; + Смещение = 72; + + ПозицияЧтения = СтрНайти(КодированнаяСтрока, "-", НаправлениеПоиска.СКонца); + Если ПозицияЧтения > 0 Тогда + Для ИндексСимвола = 1 По ПозицияЧтения-1 Цикл + ОчереднойСимвол = Сред(КодированнаяСтрока, ИндексСимвола, 1); + Если НЕ ЭтоСимволASCII(ОчереднойСимвол) Тогда + ВызватьИсключение НСтр("ru='Плохие данные на вход'"); + КонецЕсли; + Результат.Добавить(ОчереднойСимвол); + КонецЦикла; + КонецЕсли; + ПозицияЧтения = ПозицияЧтения + 1; + + Пока ПозицияЧтения <= СтрДлина(КодированнаяСтрока) Цикл + ПредыдущаяПозицияВставки = ПозицияВставки; + МультипликаторПозицииВставки = 1; + Перемещение = 36; + + Пока Истина Цикл + Если ПозицияЧтения > СтрДлина(КодированнаяСтрока) Тогда + ВызватьИсключение НСтр("ru='Плохие данные на вход'"); + КонецЕсли; + + КодОчередногоСимвола = КодСимвола(Сред(КодированнаяСтрока, ПозицияЧтения, 1)); + ПозицияЧтения = ПозицияЧтения + 1; + + ПорядковыйНомерОчередногоСимвола = КодСимволаВПорядковыйНомер(КодОчередногоСимвола); + Если ПорядковыйНомерОчередногоСимвола > (9999999999 - ПозицияВставки) / МультипликаторПозицииВставки Тогда + ВызватьИсключение НСтр("ru='Переполнение'"); + КонецЕсли; + + ПозицияВставки = ПозицияВставки + ПорядковыйНомерОчередногоСимвола * МультипликаторПозицииВставки; + + ПорядковыйНомер = 0; + Если Перемещение <= Смещение Тогда + ПорядковыйНомер = 1; + ИначеЕсли Перемещение >= Смещение + 26 Тогда + ПорядковыйНомер = 26; + Иначе + ПорядковыйНомер = Перемещение - Смещение; + КонецЕсли; + Если ПорядковыйНомерОчередногоСимвола < ПорядковыйНомер Тогда + Прервать; + КонецЕсли; + + МультипликаторПозицииВставки = МультипликаторПозицииВставки * (36 - ПорядковыйНомер); + Перемещение = Перемещение + 36; + КонецЦикла; + + Если (ПозицияВставки / (Результат.Количество() + 1)) > (9999999999 - Код) Тогда + ВызватьИсключение НСтр("ru='Переполнение'"); + КонецЕсли; + + Смещение = АдаптацияСмещения(ПозицияВставки - ПредыдущаяПозицияВставки, Результат.Количество() + 1, ПредыдущаяПозицияВставки = 0); + + Код = Код + цел(ПозицияВставки / (Результат.Количество() + 1)); + ПозицияВставки = ПозицияВставки % (Результат.Количество() + 1); + Результат.Вставить(ПозицияВставки, Символ(Код)); + ПозицияВставки = ПозицияВставки + 1; + КонецЦикла; + + Возврат СтрСоединить(Результат); +КонецФункции + +// Декодирует строку по алгоритму Punycode +// +// Параметры: +// Строка - Строка - кодированная строка +// +// Возвращаемое значение: +// Строка - декодированная строка +// +Функция PunycodeВСтроку(Знач Строка) Экспорт + СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(Строка); + АдресХоста = СтруктураURI.Хост; + ДекодированныйАдресХоста = ДекодироватьСтрокуСРазделителем(АдресХоста); + Результат = СтрЗаменить(Строка, АдресХоста, ДекодированныйАдресХоста); + + Логин = СтруктураURI.Логин; + ДекодированныйЛогин = ДекодироватьСтрокуСРазделителем(Логин); + Результат = СтрЗаменить(Результат, Логин, ДекодированныйЛогин); + + Возврат Результат; +КонецФункции + +Функция АдресаСерверовDNS() Экспорт + + Результат = Новый Массив; + + Если Метаданные.ОбщиеМодули.Найти("РаботаСПочтовымиСообщениямиСлужебныйЛокализация") <> Неопределено Тогда + МодульРаботаСПочтовымиСообщениямиСлужебныйЛокализация = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебныйЛокализация"); + МодульРаботаСПочтовымиСообщениямиСлужебныйЛокализация.ПриПолученииАдресовСерверовDNS(Результат); + Возврат Результат; + КонецЕсли; + + Результат.Добавить("8.8.8.8"); // dns.google + Результат.Добавить("8.8.4.4"); // dns.google + + Возврат Результат; + +КонецФункции + +Функция АдресФайлаСНастройками() Экспорт + + АдресФайла = "https://downloads.v8.1c.eu/content/common/settings/mailservers.json"; + + Если Метаданные.ОбщиеМодули.Найти("РаботаСПочтовымиСообщениямиСлужебныйЛокализация") <> Неопределено Тогда + МодульРаботаСПочтовымиСообщениямиСлужебныйЛокализация = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебныйЛокализация"); + МодульРаботаСПочтовымиСообщениямиСлужебныйЛокализация.ПриПолученииАдресаФайлаСНастройками(АдресФайла); + КонецЕсли; + + Возврат АдресФайла; + +КонецФункции + +Функция АдресФайлаСОписаниемОшибок() + + АдресФайла = "https://downloads.v8.1c.eu/content/common/settings/mailerrors.json"; + + Если Метаданные.ОбщиеМодули.Найти("РаботаСПочтовымиСообщениямиСлужебныйЛокализация") <> Неопределено Тогда + МодульРаботаСПочтовымиСообщениямиСлужебныйЛокализация = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебныйЛокализация"); + МодульРаботаСПочтовымиСообщениямиСлужебныйЛокализация.ПриПолученииАдресаФайлаСОписаниемОшибок(АдресФайла); + КонецЕсли; + + Возврат АдресФайла; + +КонецФункции + +Функция АдресВнешнегоРесурса() + + АдресВнешнегоРесурса = "downloads.v8.1c.eu"; + + Если Метаданные.ОбщиеМодули.Найти("РаботаСПочтовымиСообщениямиСлужебныйЛокализация") <> Неопределено Тогда + МодульРаботаСПочтовымиСообщениямиСлужебныйЛокализация = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебныйЛокализация"); + МодульРаботаСПочтовымиСообщениямиСлужебныйЛокализация.ПриПолученииАдресаВнешнегоРесурса(АдресВнешнегоРесурса); + КонецЕсли; + + Возврат АдресВнешнегоРесурса; + +КонецФункции + +#КонецОбласти + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебныйЛокализация/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебныйЛокализация/Module.bsl new file mode 100644 index 000000000..25059a7e3 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебныйЛокализация/Module.bsl @@ -0,0 +1,36 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +Процедура ПриПолученииАдресовСерверовDNS(АдресаСерверовDNS) Экспорт + + АдресаСерверовDNS.Добавить("78.88.8.8"); // dns.yandex + АдресаСерверовDNS.Добавить("78.8.8.1"); // dns.yandex + +КонецПроцедуры + +Процедура ПриПолученииАдресаФайлаСНастройками(АдресФайла) Экспорт + + АдресФайла = "https://downloads.v8.1c.ru/content/common/settings/mailservers.json"; + +КонецПроцедуры + +Процедура ПриПолученииАдресаФайлаСОписаниемОшибок(АдресФайла) Экспорт + + АдресФайла = "https://downloads.v8.1c.ru/content/common/settings/mailerrors.json"; + +КонецПроцедуры + +Процедура ПриПолученииАдресаВнешнегоРесурса(АдресВнешнегоРесурса) Экспорт + + АдресВнешнегоРесурса = "downloads.v8.1c.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..b2377cca4 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебныйЛокализация/РаботаСПочтовымиСообщениямиСлужебныйЛокализация.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="6fbc9a01-ddcb-47ab-84c0-f08b103be12b"> + <name>РаботаСПочтовымиСообщениямиСлужебныйЛокализация</name> + <synonym> + <key>ru</key> + <value>Работа с почтовыми сообщениями служебный локализация</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/РаботаСФайлами/Module.bsl b/SSL/src/CommonModules/РаботаСФайлами/Module.bsl index 740dc64e0..34f6aed25 100644 --- a/SSL/src/CommonModules/РаботаСФайлами/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайлами/Module.bsl @@ -277,8 +277,8 @@ Возврат; КонецЕсли; - ПрисоединенныеФайлы = РаботаСФайламиСлужебный.ПрисоединенныеФайлыКОбъекту(ВладелецФайла); - Для Каждого ПрисоединенныйФайл Из ПрисоединенныеФайлы Цикл + ПрисоединенныеФайлыКОбъекту = РаботаСФайламиСлужебный.ПрисоединенныеФайлыКОбъекту(ВладелецФайла); + Для Каждого ПрисоединенныйФайл Из ПрисоединенныеФайлыКОбъекту Цикл Файлы.Добавить(ПрисоединенныйФайл); КонецЦикла; @@ -302,10 +302,8 @@ // Функция НоваяСсылкаНаФайл(ВладелецФайлов, ИмяСправочника = Неопределено) Экспорт - ЗаголовокОшибки = НСтр("ru = 'Ошибка при получении новой ссылки на присоединенный файл.'"); ИмяСправочника = РаботаСФайламиСлужебный.ИмяСправочникаХраненияФайлов( - ВладелецФайлов, ИмяСправочника, ЗаголовокОшибки); - + ВладелецФайлов, ИмяСправочника); Возврат Справочники[ИмяСправочника].ПолучитьСсылку(); КонецФункции @@ -355,7 +353,7 @@ ПолноеИмяОМ = "Справочник." + ИмяСправочника; - МетаданныеПрисоединенныхФайлов = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОМ); + МетаданныеПрисоединенныхФайлов = Метаданные.Справочники.Найти(ИмяСправочника); Если МетаданныеПрисоединенныхФайлов.ОсновнаяФормаОбъекта = Неопределено Тогда ИмяФормы = ПолноеИмяОМ + ".ФормаОбъекта"; @@ -547,8 +545,8 @@ Знач НоваяСсылкаНаФайл = Неопределено) Экспорт ВладелецФайлов = ПараметрыФайла.ВладелецФайлов; - ИмяБезРасширения = ПараметрыФайла.ИмяБезРасширения; - РасширениеБезТочки = ПараметрыФайла.РасширениеБезТочки; + ИмяБезРасширения = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ПараметрыФайла.ИмяБезРасширения); + РасширениеБезТочки = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ПараметрыФайла.РасширениеБезТочки); Если Не ЗначениеЗаполнено(ВладелецФайлов) Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -632,11 +630,11 @@ ПрисоединенныйФайл.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); ПрисоединенныйФайл.ПутьКФайлу = ""; ПрисоединенныйФайл.Заполнить(Неопределено); - + ИспользованиеПолнотекстовогоПоиска = Метаданные.СвойстваОбъектов.ИспользованиеПолнотекстовогоПоиска.Использовать; ИзвлекатьТекст = Метаданные.Справочники[ИмяСправочника].ПолнотекстовыйПоиск = ИспользованиеПолнотекстовогоПоиска; - Если ИзвлекатьТекст Тогда + Если ИзвлекатьТекст И ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыФайла, "Зашифрован", Ложь) <> Истина Тогда РезультатИзвлеченияТекста = РаботаСФайламиСлужебный.ИзвлечьТекст(АдресВременногоХранилищаТекста, ДвоичныеДанные, ПрисоединенныйФайл.Расширение); @@ -703,7 +701,7 @@ КомментарийЖурналаРегистрации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ШаблонСообщения, ИмяБезРасширения + "." + РасширениеБезТочки, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации( НСтр("ru = 'Файлы.Добавление присоединенного файла'", @@ -718,7 +716,7 @@ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ШаблонСообщения, ИмяБезРасширения + "." + РасширениеБезТочки, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; @@ -941,8 +939,9 @@ КонецЕсли; Если СсылкаКорректная Тогда - - СсылкаНаПрисоединенныйФайл = СоздатьПрисоединенныйФайлНаОснованииФайла(ВладелецФайлов, МенеджерПрисоединенныхФайлов, ТекущаяВерсияОбъект, ФайлИсточникОбъект); + // @skip-check query-in-loop - по-объектная запись файлов в транзакции + СсылкаНаПрисоединенныйФайл = СоздатьПрисоединенныйФайлНаОснованииФайла(ВладелецФайлов, + МенеджерПрисоединенныхФайлов, ТекущаяВерсияОбъект, ФайлИсточникОбъект); Если ЗначениеЗаполнено(ФайлИсточникОбъект.ТекущаяВерсия) Тогда ТекущаяВерсияОбъект.ДополнительныеСвойства.Вставить("КонвертацияФайлов", Истина); @@ -973,14 +972,26 @@ // Отказ - Булево - стандартный параметр события формы. // ТекущийОбъект - ОпределяемыйТип.ВладелецПрисоединенныхФайловОбъект - стандартный параметр события формы. // ПараметрыЗаписи - Структура - стандартный параметр события формы. -// Параметры - ДанныеФормыСтруктура - свойство формы Параметры. +// Форма - ФормаКлиентскогоПриложения - форма записываемого объекта. // -Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи, Параметры) Экспорт +Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи, Форма) Экспорт - Если Не ЗначениеЗаполнено(Параметры.Ключ) И ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда + Если ТипЗнч(Форма) = Тип("ФормаКлиентскогоПриложения") Тогда + ПараметрыРаботыСФайлами = Форма.ПараметрыРаботыСФайлами; + НастройкиРаботыСФайламиВФорме = ПараметрыРаботыСФайлами.НастройкиРаботыСФайламиВФорме; + Иначе + НастройкиРаботыСФайламиВФорме = НастройкиРаботыСФайламиВФорме(); + НастройкиРаботыСФайламиВФорме.КопироватьПрисоединенныеФайлы = Не ЗначениеЗаполнено(Форма.Ключ) + И Форма.Свойство("ЗначениеКопирования") И ЗначениеЗаполнено(Форма.ЗначениеКопирования); + Если НастройкиРаботыСФайламиВФорме.КопироватьПрисоединенныеФайлы Тогда + НастройкиРаботыСФайламиВФорме.Вставить("ЗначениеКопирования", Форма.ЗначениеКопирования); + КонецЕсли; + КонецЕсли; + + Если НастройкиРаботыСФайламиВФорме.КопироватьПрисоединенныеФайлы Тогда РаботаСФайламиСлужебный.СкопироватьПрисоединенныеФайлы( - Параметры.ЗначениеКопирования, ТекущийОбъект); + НастройкиРаботыСФайламиВФорме.ЗначениеКопирования, ТекущийОбъект); КонецЕсли; КонецПроцедуры @@ -994,6 +1005,8 @@ // присоединенными файлами для размещения на форме или массив // таких структур. Свойства: см. РаботаСФайлами.ГиперссылкаФайлов // и РаботаСФайлами.ПолеФайла. +// НастройкиРаботыСФайламиВФорме - см. РаботаСФайлами.НастройкиРаботыСФайламиВФорме. +// // // Пример: // 1. Добавление гиперссылки присоединенных файлов: @@ -1013,11 +1026,24 @@ // ДобавляемыеЭлементы.Добавить(ПараметрыПоля); // РаботаСФайлами.ПриСозданииНаСервере(ЭтотОбъект, ДобавляемыеЭлементы); // -Процедура ПриСозданииНаСервере(Форма, ДобавляемыеЭлементы = Неопределено) Экспорт +Процедура ПриСозданииНаСервере(Форма, ДобавляемыеЭлементы = Неопределено, НастройкиРаботыСФайламиВФорме = Неопределено) Экспорт Если ДобавляемыеЭлементы = Неопределено Тогда Возврат; КонецЕсли; + + Если НастройкиРаботыСФайламиВФорме = Неопределено Тогда + НастройкиРаботыСФайламиВФормеРасширенные = НастройкиРаботыСФайламиВФорме(); + Иначе + НастройкиРаботыСФайламиВФормеРасширенные = ОбщегоНазначения.СкопироватьРекурсивно(НастройкиРаботыСФайламиВФорме); + КонецЕсли; + + Если Не Форма.Параметры.Свойство("ЗначениеКопирования") И (Не Форма.Параметры.Свойство("Ключ") + Или Не ЗначениеЗаполнено(Форма.Параметры.Ключ)) Тогда + НастройкиРаботыСФайламиВФормеРасширенные.КопироватьПрисоединенныеФайлы = Ложь; + Иначе + НастройкиРаботыСФайламиВФормеРасширенные.Вставить("ЗначениеКопирования", Форма.Параметры.ЗначениеКопирования); + КонецЕсли; Если ТипЗнч(ДобавляемыеЭлементы) = Тип("Структура") Тогда ПараметрыЭлемента = ДобавляемыеЭлементы; @@ -1051,59 +1077,56 @@ НомерЭлемента = Формат(Индекс, "ЧН=0; ЧГ="); ДобавляемыйЭлемент = ДобавляемыеЭлементы[Индекс]; + Если Не ДобавляемыйЭлемент.Свойство("ПутьКДанным") Тогда + Продолжить; + КонецЕсли; - Если ДобавляемыйЭлемент.Свойство("ПутьКДанным") Тогда + Если СтрНайти(ДобавляемыйЭлемент.ПутьКДанным, ".") Тогда + ПолныйПутьКДанным = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + ДобавляемыйЭлемент.ПутьКДанным, ".", Истина, Истина); + Иначе + ПолныйПутьКДанным = Новый Массив; + ПолныйПутьКДанным.Добавить(ДобавляемыйЭлемент.ПутьКДанным); + КонецЕсли; + + РеквизитРазмещения = РеквизитФормыПоИмени(РеквизитыФормы, ПолныйПутьКДанным[0]); + Если РеквизитРазмещения <> Неопределено Тогда - Если СтрНайти(ДобавляемыйЭлемент.ПутьКДанным, ".") Тогда - ПолныйПутьКДанным = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( - ДобавляемыйЭлемент.ПутьКДанным, ".", Истина, Истина); - Иначе - ПолныйПутьКДанным = Новый Массив; - ПолныйПутьКДанным.Добавить(ДобавляемыйЭлемент.ПутьКДанным); - КонецЕсли; - - РеквизитРазмещения = РеквизитФормыПоИмени(РеквизитыФормы, ПолныйПутьКДанным[0]); - Если РеквизитРазмещения <> Неопределено Тогда + ПутьКРеквизиту = ПолныйПутьКДанным[0]; + Для ИндексРеквизита = 1 По ПолныйПутьКДанным.ВГраница() Цикл - ПутьКРеквизиту = ПолныйПутьКДанным[0]; - Для ИндексРеквизита = 1 По ПолныйПутьКДанным.ВГраница() Цикл - - ПодчиненныеРеквизиты = Форма.ПолучитьРеквизиты(ПутьКРеквизиту); - РеквизитРазмещения = РеквизитФормыПоИмени(ПодчиненныеРеквизиты, ПолныйПутьКДанным[ИндексРеквизита]); - Если РеквизитРазмещения = Неопределено Тогда - Прервать; - КонецЕсли; - - ПутьКРеквизиту = ПутьКРеквизиту + "." + ПолныйПутьКДанным[ИндексРеквизита]; - - КонецЦикла; - - КонецЕсли; - - Если РеквизитРазмещения = Неопределено Тогда - - ТипПрисоединенныеФайлы = Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип; - РеквизитРазмещения = Новый РеквизитФормы("ПолеПрисоединенногоФайла" + НомерЭлемента, ТипПрисоединенныеФайлы); - ДобавляемыеРеквизиты.Добавить(РеквизитРазмещения); - - РеквизитРазмещения = Форма["ПолеПрисоединенногоФайла" + НомерЭлемента]; - ДобавляемыйЭлемент.ПутьКДанным = "ПолеПрисоединенногоФайла" + НомерЭлемента; - - КонецЕсли; - - Если ДобавляемыйЭлемент.Свойство("ПоказыватьПредпросмотр") - И ДобавляемыйЭлемент.ПоказыватьПредпросмотр Тогда - - Если РеквизитФормыПоИмени(РеквизитыФормы, ДобавляемыйЭлемент.ПутьКДаннымИзображения) = Неопределено Тогда - - РеквизитКартинки = Новый РеквизитФормы("ПолеКартинкиПрисоединенногоФайла" + НомерЭлемента, - Новый ОписаниеТипов("Строка")); - ДобавляемыеРеквизиты.Добавить(РеквизитКартинки); - - ДобавляемыйЭлемент.ПутьКДаннымИзображения = "ПолеКартинкиПрисоединенногоФайла" + НомерЭлемента; - + ПодчиненныеРеквизиты = Форма.ПолучитьРеквизиты(ПутьКРеквизиту); + РеквизитРазмещения = РеквизитФормыПоИмени(ПодчиненныеРеквизиты, ПолныйПутьКДанным[ИндексРеквизита]); + Если РеквизитРазмещения = Неопределено Тогда + Прервать; КонецЕсли; + ПутьКРеквизиту = ПутьКРеквизиту + "." + ПолныйПутьКДанным[ИндексРеквизита]; + КонецЦикла; + + КонецЕсли; + + Если РеквизитРазмещения = Неопределено Тогда + + ТипПрисоединенныеФайлы = Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип; + РеквизитРазмещения = Новый РеквизитФормы("ПолеПрисоединенногоФайла" + НомерЭлемента, ТипПрисоединенныеФайлы); + ДобавляемыеРеквизиты.Добавить(РеквизитРазмещения); + + РеквизитРазмещения = Форма["ПолеПрисоединенногоФайла" + НомерЭлемента]; + ДобавляемыйЭлемент.ПутьКДанным = "ПолеПрисоединенногоФайла" + НомерЭлемента; + + КонецЕсли; + + Если ДобавляемыйЭлемент.Свойство("ПоказыватьПредпросмотр") + И ДобавляемыйЭлемент.ПоказыватьПредпросмотр Тогда + + Если РеквизитФормыПоИмени(РеквизитыФормы, ДобавляемыйЭлемент.ПутьКДаннымИзображения) = Неопределено Тогда + + РеквизитКартинки = Новый РеквизитФормы("ПолеКартинкиПрисоединенногоФайла" + НомерЭлемента, + Новый ОписаниеТипов("Строка")); + ДобавляемыеРеквизиты.Добавить(РеквизитКартинки); + + ДобавляемыйЭлемент.ПутьКДаннымИзображения = "ПолеКартинкиПрисоединенногоФайла" + НомерЭлемента; КонецЕсли; КонецЕсли; @@ -1114,7 +1137,7 @@ Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); КонецЕсли; - ПараметрыРаботыСФайлами = Новый Массив; + ОписанияЭлементовФормы = Новый Массив; Для Индекс = 0 По ДобавляемыеЭлементы.ВГраница() Цикл НомерЭлемента = Формат(Индекс, "ЧН=0; ЧГ="); @@ -1181,6 +1204,11 @@ ПараметрыЭлементаФормы.Вставить("ДоступноИзменение", ДоступноИзменение); ПараметрыЭлементаФормы.Вставить("ДоступноДобавление", ДоступноДобавление); + Если НастройкиРаботыСФайламиВФормеРасширенные.КопироватьПрисоединенныеФайлы + И ЗначениеЗаполнено(НастройкиРаботыСФайламиВФормеРасширенные.ЗначениеКопирования) Тогда + ВладелецПрисоединенныхФайлов = НастройкиРаботыСФайламиВФормеРасширенные.ЗначениеКопирования; + КонецЕсли; + Если ДобавляемыйЭлемент.Свойство("ПутьКДанным") Тогда ПараметрыЭлемента.ПутьКРеквизитуРазмещения = ДобавляемыйЭлемент.ПутьКДанным; @@ -1191,11 +1219,13 @@ КонецЕсли; ПараметрыЭлемента.Вставить("ПутьКДаннымВладельца", ДобавляемыйЭлемент.Владелец); - ПараметрыРаботыСФайлами.Добавить(ПараметрыЭлемента); + ОписанияЭлементовФормы.Добавить(ПараметрыЭлемента); КонецЦикла; + ПараметрыРаботыСФайлами = Новый Структура("ОписанияЭлементовФормы", Новый ФиксированныйМассив(ОписанияЭлементовФормы)); + ПараметрыРаботыСФайлами.Вставить("НастройкиРаботыСФайламиВФорме", Новый ФиксированнаяСтруктура(НастройкиРаботыСФайламиВФормеРасширенные)); - Форма["ПараметрыРаботыСФайлами"] = Новый ФиксированныйМассив(ПараметрыРаботыСФайлами); + Форма["ПараметрыРаботыСФайлами"] = Новый ФиксированнаяСтруктура(ПараметрыРаботыСФайлами); КонецПроцедуры @@ -1413,6 +1443,23 @@ КонецПроцедуры +// Инициализирует структуру параметров для настройки работы с файлами в форме. +// +// Возвращаемое значение: +// Структура - параметры копирования файлов. Свойства: +// * КопироватьПрисоединенныеФайлы - Булево - признак копирования присоединенных файлов при копировании объекта-владельца +// Значение по умолчанию - Ложь. +// +Функция НастройкиРаботыСФайламиВФорме() Экспорт + + НастройкиРаботыСФайламиВФорме = Новый Структура; + НастройкиРаботыСФайламиВФорме.Вставить("КопироватьПрисоединенныеФайлы", Ложь); + + Возврат НастройкиРаботыСФайламиВФорме; + +КонецФункции + + #Область ДляВызоваИзДругихПодсистем // ЭлектронноеВзаимодействие @@ -1571,6 +1618,7 @@ ПрисоединенныйФайл.Записать(); Если ПрисоединенныйФайл.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + // @skip-check query-in-loop - по-объектная запись данных ХранилищеФайла = ХранилищеФайлаИзИнформационнойБазы(ТекущаяВерсияОбъект.Ссылка); МенеджерЗаписи = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьМенеджерЗаписи(); @@ -1623,7 +1671,7 @@ // Функция СоздатьПрисоединенныйФайлНаОснованииФайла(ВладелецФайлов, МенеджерПрисоединенныхФайлов, ТекущаяВерсияОбъект, ФайлИсточникОбъект) - СсылкаНового = МенеджерПрисоединенныхФайлов.ПолучитьСсылку(); // СправочникСсылка + СсылкаНового = МенеджерПрисоединенныхФайлов.ПолучитьСсылку(); // ОпределяемыйТип.ПрисоединенныйФайл ПрисоединенныйФайл = МенеджерПрисоединенныхФайлов.СоздатьЭлемент(); // ОпределяемыйТип.ПрисоединенныйФайлОбъект ПрисоединенныйФайл.УстановитьСсылкуНового(СсылкаНового); @@ -1732,8 +1780,7 @@ Возврат; КонецЕсли; - ИсточникСсылкаПометкаУдаления = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Ссылка, "ПометкаУдаления"); - + ИсточникСсылкаПометкаУдаления = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Ссылка, "ПометкаУдаления"); Если Источник.ПометкаУдаления = ИсточникСсылкаПометкаУдаления Тогда Возврат; КонецЕсли; @@ -1741,19 +1788,14 @@ УстановитьПривилегированныйРежим(Истина); Попытка - ИменаСправочников = РаботаСФайламиСлужебный.ИменаСправочниковХраненияФайлов( - ТипЗнч(Источник.Ссылка)); + ИменаСправочников = РаботаСФайламиСлужебный.ИменаСправочниковХраненияФайлов(ТипЗнч(Источник.Ссылка)); Исключение - ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); ВызватьИсключение НСтр("ru = 'Ошибка при пометке на удаление присоединенных файлов.'") - + Символы.ПС - + ПредставлениеОшибки; + + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("ВладелецФайла", Источник.Ссылка); - - ТекстЗапроса = + ТекстыЗапроса = Новый Массив; + ШаблонЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | Файлы.Ссылка КАК Ссылка, | Файлы.Редактирует КАК Редактирует @@ -1765,23 +1807,44 @@ Для каждого ОписаниеИмениСправочника Из ИменаСправочников Цикл ПолноеИмяСправочника = "Справочник." + ОписаниеИмениСправочника.Ключ; - Запрос.Текст = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", ПолноеИмяСправочника); + ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "&ИмяСправочника", ПолноеИмяСправочника); + Если ТекстыЗапроса.Количество() > 0 Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); // @query-part-1, @query-part-2 + КонецЕсли; + ТекстыЗапроса.Добавить(ТекстЗапроса); - Выборка = Запрос.Выполнить().Выбрать(); + КонецЦикла; + + Запрос = Новый Запрос(СтрСоединить(ТекстыЗапроса, "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС + Символы.ПС)); // @query-part + Запрос.УстановитьПараметр("ВладелецФайла", Источник.Ссылка); + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Если Источник.ПометкаУдаления И ЗначениеЗаполнено(Выборка.Редактирует) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '""%1"" не может быть удален, + |т.к. содержит занятый для редактирования присоединенный файл ""%2"".'"), + ОбщегоНазначения.ПредметСтрокой(Источник.Ссылка), + Строка(Выборка.Ссылка)); + КонецЕсли; - Пока Выборка.Следующий() Цикл - Если Источник.ПометкаУдаления И ЗначениеЗаполнено(Выборка.Редактирует) Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '""%1"" не может быть удален, - |т.к. содержит присоединенный файл ""%2"", - |занятый для редактирования.'"), - Строка(Источник.Ссылка), - Строка(Выборка.Ссылка)); - КонецЕсли; + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных(); + ЭлементБлокировки = Блокировка.Добавить(Выборка.Ссылка.Метаданные().ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка); + Блокировка.Заблокировать(); + ФайлОбъект = Выборка.Ссылка.ПолучитьОбъект(); ФайлОбъект.Заблокировать(); ФайлОбъект.УстановитьПометкуУдаления(Источник.ПометкаУдаления); - КонецЦикла; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки + КонецЦикла; КонецПроцедуры @@ -2243,8 +2306,7 @@ ГиперссылкаПерехода.Заголовок = ДобавляемыйЭлемент.Заголовок; Если ДобавляемыйЭлемент.ОтображатьКоличество Тогда - Владелец = ?(Форма.Параметры.Свойство("ЗначениеКопирования") И ЗначениеЗаполнено(Форма.Параметры.ЗначениеКопирования), Форма.Параметры.ЗначениеКопирования, ВладелецПрисоединенныхФайлов); - КоличествоПрисоединенныхФайлов = РаботаСФайламиСлужебныйВызовСервера.КоличествоПрисоединенныхФайлов(Владелец); + КоличествоПрисоединенныхФайлов = РаботаСФайламиСлужебныйВызовСервера.КоличествоПрисоединенныхФайлов(ВладелецПрисоединенныхФайлов); Если КоличествоПрисоединенныхФайлов > 0 Тогда ГиперссылкаПерехода.Заголовок = ГиперссылкаПерехода.Заголовок + " (" + Формат(КоличествоПрисоединенныхФайлов, "ЧГ=") + ")"; @@ -2713,5 +2775,5 @@ Возврат Неопределено; КонецФункции - + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/РаботаСФайламиВТомахСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиВТомахСлужебный/Module.bsl index c3bb6389a..c0643a1f6 100644 --- a/SSL/src/CommonModules/РаботаСФайламиВТомахСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиВТомахСлужебный/Module.bsl @@ -319,13 +319,13 @@ Результат.Успешно = Ложь; Ошибка= ИнформацияОбОшибке(); - Результат.ИнформацияОбОшибке = КраткоеПредставлениеОшибки(Ошибка); + Результат.ИнформацияОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(Ошибка); ЗаписьЖурналаРегистрации( НСтр("ru = 'Файлы.Удаление файлов в томе'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(Ошибка)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(Ошибка)); КонецПопытки; @@ -495,11 +495,12 @@ ДатаРазмещения = ?(ЗначениеЗаполнено(ДатаДляРазмещенияВТоме), ДатаДляРазмещенияВТоме, ТекущаяДатаСеанса()); КорневойКаталог = КорневойКаталог + Формат(ДатаРазмещения, "ДФ=ггггММдд") + Разделитель; - ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(СвойстваФайла.Наименование - + ?(ЗначениеЗаполнено(СвойстваФайла.НомерВерсии), "." + СвойстваФайла.НомерВерсии, ""), СвойстваФайла.Расширение); - - ОбщегоНазначения.СократитьИмяФайла(ИмяФайла); + ИмяФайла = СвойстваФайла.Наименование + + ?(ЗначениеЗаполнено(СвойстваФайла.НомерВерсии), "." + СвойстваФайла.НомерВерсии, "") + + ?(СтрНайти(СвойстваФайла.Расширение, ".") > 0, СвойстваФайла.Расширение, "." + СвойстваФайла.Расширение); + ОбщегоНазначения.СократитьИмяФайла(ИмяФайла); + Попытка Возврат КорневойКаталог + РаботаСФайламиСлужебныйКлиентСервер.УникальноеИмяСПутем(КорневойКаталог, ИмяФайла); @@ -669,6 +670,7 @@ Если Не ПроверитьОбъектПрисоединенныхФайлов(ОбъектМетаданных) Тогда Продолжить; КонецЕсли; + // @skip-check query-in-loop - Порционная обработка большого объема данных. ПоискСсылокНаНесуществующиеФайлыВТомах(ОбъектМетаданных, ПараметрыПроверки, ДоступныеТома); КонецЦикла; КонецЦикла; @@ -732,6 +734,87 @@ #Область СлужебныеПроцедурыИФункции +// Возвращает соответствие томов и суммарных размеров всех файлов в томе в байтах. +// +// Параметры: +// Тома - Массив из СправочникСсылка.ТомаХраненияФайлов - том, размер которого необходимо посчитать. +// +// Возвращаемое значение: +// Соответствие - размер томов . +// +Функция ОбъемыТомов(Тома) + + Результат = Новый Соответствие; + Для Каждого Том Из Тома Цикл + Результат.Вставить(Том, 0); + КонецЦикла; + + Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Возврат Результат; + КонецЕсли; + + ТипыПрисоединенныхФайлов = Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип.Типы(); + + ТекстЗапросаПрисоединенныхФайлов = + "ВЫБРАТЬ + | Версии.Том КАК Том, + | ЕСТЬNULL(Версии.Размер, 0) КАК РазмерФайлов + |ИЗ + | Справочник.ВерсииФайлов КАК Версии + |ГДЕ + | Версии.Том В (&Тома)"; + + Для Каждого Тип Из ТипыПрисоединенныхФайлов Цикл + + Если Тип = Тип("СправочникСсылка.ВерсииФайлов") + Или Тип = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда + + Продолжить; + КонецЕсли; + + МетаданныеСправочника = Метаданные.НайтиПоТипу(Тип); + Если МетаданныеСправочника.Реквизиты.Найти("ТекущаяВерсия") <> Неопределено Тогда + Продолжить; + КонецЕсли; + + ТекстЗапросаПоСправочнику = "ВЫБРАТЬ + | ПрисоединенныеФайлы.Том, + | ЕСТЬNULL(ПрисоединенныеФайлы.Размер, 0) + |ИЗ + | &ИмяСправочника КАК ПрисоединенныеФайлы + |ГДЕ + | ПрисоединенныеФайлы.Том В (&Тома)"; + + ТекстЗапросаПрисоединенныхФайлов = ТекстЗапросаПрисоединенныхФайлов + " + | + |ОБЪЕДИНИТЬ ВСЕ + | + |" + СтрЗаменить(ТекстЗапросаПоСправочнику, "&ИмяСправочника", + Метаданные.НайтиПоТипу(Тип).ПолноеИмя()); + + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ВложенныйЗапрос.Том, + | СУММА(ВложенныйЗапрос.РазмерФайлов) КАК РазмерФайлов + |ИЗ + | &ТекстЗапросаПрисоединенныхФайлов КАК ВложенныйЗапрос + |СГРУППИРОВАТЬ ПО + | ВложенныйЗапрос.Том"; + + Запрос.Текст = СтрЗаменить(Запрос.Текст, "ТекстЗапросаПрисоединенныхФайлов", ТекстЗапросаПрисоединенныхФайлов); + + Запрос.Параметры.Вставить("Тома", Тома); + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Результат.Вставить(Выборка.Том, Выборка.РазмерФайлов); + КонецЦикла; + + Возврат Результат; + +КонецФункции + // Для функции см. ПолныйПутьТома. // // Возвращаемое значение: @@ -806,7 +889,7 @@ ПрисоединенныйФайл.Наименование + "." + ПрисоединенныйФайл.Расширение, Строка(ПрисоединенныйФайл.Том), ПутьКТому, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); Если Пользователи.ЭтоПолноправныйПользователь() Тогда @@ -815,7 +898,7 @@ ПрисоединенныйФайл.Наименование + "." + ПрисоединенныйФайл.Расширение, Строка(ПрисоединенныйФайл.Том), ПутьКТому, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Иначе @@ -863,6 +946,7 @@ КонецЦикла; Для Каждого Том Из ОбрабатываемыеКаталоги Цикл + // @skip-check query-in-loop - Незначительное количество вызовов. ОчиститьУдаленныеФайлыВТоме(Том.Значение); КонецЦикла; КонецПроцедуры @@ -968,7 +1052,7 @@ УровеньЖурналаРегистрации.Ошибка, Метаданные.Справочники.ТомаХраненияФайлов, Том.Ссылка, - ПодробноеПредставлениеОшибки(Ошибка)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(Ошибка)); КонецПопытки; КонецПроцедуры @@ -1308,7 +1392,6 @@ ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(Объект.Наименование, Объект.Расширение); ОбщегоНазначения.СократитьИмяФайла(ИмяФайла); ПолныйПутьНовый = ФайлИсходный.Путь + ИмяФайла; - ПереместитьФайл(ПолныйПутьФайлаНаДиске, ПолныйПутьНовый); ДобавитьФайл(Объект, ПолныйПутьНовый); @@ -1560,7 +1643,7 @@ | |Указанный сетевой каталог мог быть отключен или к нему отсутствуют права доступа. |Невозможна работа со всеми файлами, хранящимися в этом томе.'"), - Путь, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Путь, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); УточнениеПроблемы = УточнениеПроблемы + Символы.ПС; ЗафиксироватьПроблемуСТомом(Том, УточнениеПроблемы, ПараметрыПроверки); Возврат Ложь; @@ -1596,7 +1679,8 @@ | ПРЕДСТАВЛЕНИЕССЫЛКИ(ОбъектМетаданных.Ссылка) КАК Файл, | ПРЕДСТАВЛЕНИЕССЫЛКИ(ОбъектМетаданных.Том) КАК Том, | ОбъектМетаданных.ПутьКФайлу КАК ПутьКФайлу, - | ОбъектМетаданных.Том КАК ТомСсылка + | ОбъектМетаданных.Том КАК ТомСсылка, + | &Автор КАК Автор |ИЗ | &ОбъектМетаданных КАК ОбъектМетаданных |ГДЕ @@ -1610,6 +1694,12 @@ ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОбъектМетаданных", ПолноеИмя); + Если ОбъектМетаданных.Реквизиты.Найти("Автор") <> Неопределено Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Автор", "ОбъектМетаданных.Автор"); + Иначе + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Автор", "NULL"); + КонецЕсли; + // @query-part-2 ПолеВладельца = ?(ПолноеИмя = "Справочник.ВерсииФайлов", "ПРЕДСТАВЛЕНИЕССЫЛКИ(ОбъектМетаданных.Владелец) ","Неопределено "); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеВладельца", ПолеВладельца); @@ -1647,8 +1737,8 @@ Проблема = МодульКонтрольВеденияУчета.ОписаниеПроблемы(СсылкаНаОбъект, ПараметрыПроверки); Проблема.УточнениеПроблемы = УточнениеПроблемы; - Если ОбъектМетаданных.Реквизиты.Найти("Ответственный") <> Неопределено Тогда - Проблема.Вставить("Ответственный", ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаОбъект, "Ответственный")); + Если ЗначениеЗаполнено(СтрокаРезультата.Автор) Тогда + Проблема.Вставить("Ответственный", СтрокаРезультата.Автор); КонецЕсли; МодульКонтрольВеденияУчета.ЗаписатьПроблему(Проблема, ПараметрыПроверки); @@ -1656,6 +1746,7 @@ КонецЦикла; Запрос.УстановитьПараметр("Ссылка", СтрокаРезультата.ПроблемныйОбъект); + // @skip-check query-in-loop - Порционная обработка данных Результат = Запрос.Выполнить().Выгрузить(); КонецЦикла; @@ -1729,7 +1820,7 @@ |ИЗ | Справочник.ТомаХраненияФайлов КАК ТомаХраненияФайлов |ГДЕ - | ТомаХраненияФайлов.ПолныйПутьLinux ПОДОБНО ""%/\"""; + | ТомаХраненияФайлов.ПолныйПутьLinux ПОДОБНО ""%/\"" СПЕЦСИМВОЛ ""~"""; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл @@ -1755,7 +1846,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать том хранения файлов %1 по причине: |%2'"), - Выборка.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Выборка.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Выборка.Ссылка.Метаданные(), Выборка.Ссылка, ТекстСообщения); @@ -1873,18 +1964,23 @@ ВызватьИсключение НСтр("ru = 'Нет ни одного тома для размещения файла.'"); КонецЕсли; + МассивТомов = Результат.Выгрузить().ВыгрузитьКолонку("Ссылка"); + ОбъемыТомов = Неопределено; + ВыборкаТомов = Результат.Выбрать(); Пока ВыборкаТомов.Следующий() Цикл Если ВыборкаТомов.МаксимальныйРазмер = 0 Тогда Возврат ВыборкаТомов.Ссылка; Иначе - - ОбъемТома = ОбъемТома(ВыборкаТомов.Ссылка); + Если ОбъемыТомов = Неопределено Тогда + // @skip-check query-in-loop - Разовый вызов + ОбъемыТомов = ОбъемыТомов(МассивТомов); + КонецЕсли; + ОбъемТома = ОбъемыТомов[ВыборкаТомов.Ссылка]; Если ОбъемТома + РазмерФайла <= ВыборкаТомов.МаксимальныйРазмер * 1024 * 1024 Тогда Возврат ВыборкаТомов.Ссылка; КонецЕсли; - КонецЕсли; КонецЦикла; diff --git a/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl index 81d652fbe..a5e7c08a4 100644 --- a/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl @@ -353,6 +353,21 @@ КонецПроцедуры +// Открывает форму списка файлов. +// +// Параметры: +// ВладелецФайлов - ОпределяемыйТип.ВладелецПрисоединенныхФайлов - папка файлов или объект, +// к которому прикреплены выбираемые файлы. +// +Процедура ОткрытьФормуСпискаФайлов(Знач ВладелецФайлов) Экспорт + + ПараметрыФормы = Новый Структура(); + ПараметрыФормы.Вставить("ВладелецФайла", ВладелецФайлов); + ПараметрыФормы.Вставить("СкрыватьВладельца", Ложь); + ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныеФайлы", ПараметрыФормы); + +КонецПроцедуры + // Открывает форму файла. // Может использоваться как обработчик открытия файла. // @@ -419,11 +434,13 @@ // // Параметры: // ПрисоединенныйФайл - ОпределяемыйТип.ПрисоединенныйФайл - ссылка на элемент справочника с файлом. +// - Массив из ОпределяемыйТип.ПрисоединенныйФайл // ИдентификаторФормы - УникальныйИдентификатор - уникальный идентификатор формы, // который используется для блокировки файла. // ДополнительныеПараметры - Неопределено - стандартное поведение (см. ниже). // - Структура: -// * ДанныеФайла - Структура - данные файла, если свойства нет, будет вставлено. +// * ДанныеФайла - см. РаботаСФайлами.ДанныеФайла +// - Массив из см. РаботаСФайлами.ДанныеФайла // * ОбработкаРезультата - ОписаниеОповещения - при вызове передается значение типа Булево, // если Истина - файл успешно подписан, иначе не подписан, // если свойства нет, оповещение не будет вызвано. @@ -454,8 +471,8 @@ КонецЕсли; Если Не ДополнительныеПараметры.Свойство("ДанныеФайла") Тогда - ДополнительныеПараметры.Вставить("ДанныеФайла", РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла( - ПрисоединенныйФайл,, ИдентификаторФормы)); + ДополнительныеПараметры.Вставить("ДанныеФайла", РаботаСФайламиСлужебныйВызовСервера.ДанныеФайловДляПодписания( + ПрисоединенныйФайл, ИдентификаторФормы)); КонецЕсли; ОбработкаРезультата = Неопределено; @@ -606,9 +623,9 @@ Возврат; КонецЕсли; - Для НомерЭлемента = 0 По Форма.ПараметрыРаботыСФайлами.ВГраница() Цикл + Для НомерЭлемента = 0 По Форма.ПараметрыРаботыСФайлами.ОписанияЭлементовФормы.ВГраница() Цикл - ОтображатьКоличество = Форма.ПараметрыРаботыСФайлами[НомерЭлемента].ОтображатьКоличество; + ОтображатьКоличество = Форма.ПараметрыРаботыСФайлами.ОписанияЭлементовФормы[НомерЭлемента].ОтображатьКоличество; Если Не ОтображатьКоличество Тогда Продолжить; КонецЕсли; @@ -686,7 +703,7 @@ КонецЕсли; НомерЭлемента = Число(СтрЗаменить(Элемент.Имя, "ПолеКартинкиПрисоединенногоФайла", "")); - ТолькоОдинФайл = Форма.ПараметрыРаботыСФайлами[НомерЭлемента].ТолькоОдинФайл; + ТолькоОдинФайл = Форма.ПараметрыРаботыСФайлами.ОписанияЭлементовФормы[НомерЭлемента].ТолькоОдинФайл; ВладелецПрисоединенныхФайлов = ЗначениеПараметраПрисоединенногоФайла(Форма, Число(НомерЭлемента), "ПутьКДаннымВладельца"); Если Не ЗначениеЗаполнено(ВладелецПрисоединенныхФайлов) Тогда @@ -725,7 +742,7 @@ КонецЕсли; НомерЭлемента = Число(СтрЗаменить(Элемент.Имя, "ПолеКартинкиПрисоединенногоФайла", "")); - ТолькоОдинФайл = Форма.ПараметрыРаботыСФайлами[НомерЭлемента].ТолькоОдинФайл; + ТолькоОдинФайл = Форма.ПараметрыРаботыСФайлами.ОписанияЭлементовФормы[НомерЭлемента].ТолькоОдинФайл; ВладелецПрисоединенныхФайлов = ЗначениеПараметраПрисоединенногоФайла(Форма, Число(НомерЭлемента), "ПутьКДаннымВладельца"); ПараметрыОбработчика = Новый Структура; @@ -847,7 +864,7 @@ Исключение ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось распечатать файл по причине: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке()))); + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; #КонецЕсли @@ -941,231 +958,10 @@ // Процедура НапечататьИзПриложенияПоИмениФайла(ИмяОткрываемогоФайла) - Если Не ЗначениеЗаполнено(ИмяОткрываемогоФайла) Тогда - Возврат; - КонецЕсли; - -#Если Не МобильныйКлиент Тогда - Если ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда - Shell = Новый COMОбъект("Shell.Application"); - Shell.ShellExecute(ИмяОткрываемогоФайла, "", "", "print", 1); - ИначеЕсли ОбщегоНазначенияКлиент.ЭтоLinuxКлиент() Тогда - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ИмяОткрываемогоФайла", ИмяОткрываемогоФайла); - ОписаниеОповещения = Новый ОписаниеОповещения("НапечататьИзПриложенияПоИмениФайлаLinux", - ЭтотОбъект, ДополнительныеПараметры); - ПроверитьПрограммаLinuxУстановлена("Unoconv", ОписаниеОповещения); - Иначе - ПоказатьПредупреждение(, НСтр("ru = 'Печать файлов данного типа возможна только из приложения для Windows или Linux.'")); - Возврат; - КонецЕсли; -#КонецЕсли + ФайловаяСистемаКлиент.НапечататьИзПриложенияПоИмениФайла(ИмяОткрываемогоФайла); КонецПроцедуры -Процедура ПроверитьПрограммаLinuxУстановлена(ИмяПрограммы, Оповещение) - - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("Оповещение", Оповещение); - ПрограммаLinuxУстановленаЗавершение = Новый ОписаниеОповещения("ПроверитьПрограммаLinuxУстановленаЗавершение", - ЭтотОбъект, ДополнительныеПараметры); - - ПараметрыЗапускаПрограммы = ФайловаяСистемаКлиент.ПараметрыЗапускаПрограммы(); - ПараметрыЗапускаПрограммы.Вставить("ДождатьсяЗавершения", Истина); - ПараметрыЗапускаПрограммы.Вставить("ПолучитьПотокВывода", Истина); - ПараметрыЗапускаПрограммы.Вставить("ПолучитьПотокОшибок", Истина); - ПараметрыЗапускаПрограммы.Вставить("Оповещение", ПрограммаLinuxУстановленаЗавершение); - - ФайловаяСистемаКлиент.ЗапуститьПрограмму(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - "dpkg -s '%1'", Строка(ИмяПрограммы)), ПараметрыЗапускаПрограммы); - -КонецПроцедуры - -Процедура ПроверитьПрограммаLinuxУстановленаЗавершение(Результат, Параметры) Экспорт - - Если Результат = Неопределено Тогда - Возврат; - КонецЕсли; - - РезультатПроцедуры = СтрНайти(Результат.ПотокВывода, "Status: install ok installed") <> Ложь; - ВыполнитьОбработкуОповещения(Параметры.Оповещение, РезультатПроцедуры); - -КонецПроцедуры - -Процедура НапечататьИзПриложенияПоИмениФайлаLinux(Результат, Параметры) Экспорт - - Если Результат = Неопределено Тогда - Возврат; - КонецЕсли; - - Если Результат = Ложь Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Требуется установка программы ""Unoconv"" в системе'")); - Возврат; - КонецЕсли; - - ОписаниеОповещения = Новый ОписаниеОповещения("НапечататьИзПриложенияПоИмениФайлаLinuxЗапускUnoconv", - ЭтотОбъект, Параметры); - ПолучитьПолноеИмяВременногоФайла(ОписаниеОповещения); - -КонецПроцедуры - -Процедура НапечататьИзПриложенияПоИмениФайлаLinuxЗапускUnoconv(ИмяВременногоФайла, Параметры) Экспорт - - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ФайлКонвертируемыхДанных", ИмяВременногоФайла); - - ОписаниеОповещения = Новый ОписаниеОповещения("НапечататьИзПриложенияПоИмениФайлаLinuxЗапускLpr", - ЭтотОбъект, ДополнительныеПараметры); - - ПараметрыЗапускаПрограммы = ФайловаяСистемаКлиент.ПараметрыЗапускаПрограммы(); - ПараметрыЗапускаПрограммы.Вставить("ДождатьсяЗавершения", Истина); - ПараметрыЗапускаПрограммы.Вставить("ПолучитьПотокОшибок", Истина); - ПараметрыЗапускаПрограммы.Вставить("Оповещение", ОписаниеОповещения); - - СтрокаКоманды = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("unoconv --stdout '%1' >""%2""", - Параметры.ИмяОткрываемогоФайла, ИмяВременногоФайла); - ФайловаяСистемаКлиент.ЗапуститьПрограмму(СтрокаКоманды, ПараметрыЗапускаПрограммы); - -КонецПроцедуры - -Процедура НапечататьИзПриложенияПоИмениФайлаLinuxЗапускLpr(Результат, Параметры) Экспорт - - Если Результат = Неопределено Тогда - Возврат; - КонецЕсли; - - Если Не Результат.ПриложениеЗапущено Тогда - ПоказатьПредупреждение(, Результат.ОписаниеОшибки); - Иначе - - Параметры.Вставить("ОписаниеОшибки", Результат.ОписаниеОшибки); - - ОписаниеОповещения = Новый ОписаниеОповещения("НапечататьИзПриложенияПоИмениФайлаLinuxЗавершение", ЭтотОбъект, Параметры); - ПараметрыЗапускаПрограммы = ФайловаяСистемаКлиент.ПараметрыЗапускаПрограммы(); - ПараметрыЗапускаПрограммы.Вставить("ДождатьсяЗавершения", Истина); - ПараметрыЗапускаПрограммы.Вставить("ПолучитьПотокОшибок", Истина); - ПараметрыЗапускаПрограммы.Вставить("Оповещение", ОписаниеОповещения); - - ФайловаяСистемаКлиент.ЗапуститьПрограмму( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("lpr %1", Параметры.ФайлКонвертируемыхДанных), - ПараметрыЗапускаПрограммы); - - КонецЕсли; - -КонецПроцедуры - -Процедура НапечататьИзПриложенияПоИмениФайлаLinuxЗавершение(Результат, Параметры) Экспорт - - Если Результат = Неопределено Тогда - Возврат; - КонецЕсли; - - Файл = Новый Файл(Параметры.ФайлКонвертируемыхДанных); - Если Файл.Существует() Тогда - УдалитьФайлы(Параметры.ФайлКонвертируемыхДанных); - КонецЕсли; - - Если Не Результат.ПриложениеЗапущено Или ЗначениеЗаполнено(Результат.ОписаниеОшибки) Или ЗначениеЗаполнено(Результат.ПотокОшибок) Тогда - ПоказатьПредупреждение(, ?(ЗначениеЗаполнено(Результат.ОписаниеОшибки),Результат.ОписаниеОшибки + Символы.ПС, "") + Результат.ПотокОшибок); - КонецЕсли; - -КонецПроцедуры - -#Область ПолучитьПолноеИмяВременногоФайла - -// Получение имени временного файла. -// -// Параметры: -// Оповещение - ОписаниеОповещения - оповещение о результате получения со следующими параметрами. -// -- ИмяВременногоФайла - Строка - путь к временному файлу. -// -- ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения. -// Расширение - Строка - расширение временного файла. -// -Процедура ПолучитьПолноеИмяВременногоФайла(Знач Оповещение, Расширение = "") - - Контекст = Новый Структура; - Контекст.Вставить("Оповещение", Оповещение); - Контекст.Вставить("Расширение", Расширение); - - Оповещение = Новый ОписаниеОповещения("ПолучитьИмяВременногоФайлаПослеПроверкиРасширенияРаботыСФайлами", - ЭтотОбъект, Контекст); - ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(Оповещение, - НСтр("ru = 'Для получения имени временного файла установите расширение для работы с 1С:Предприятием.'"), Ложь); - -КонецПроцедуры - -// Продолжение процедуры ПолучитьПолноеИмяВременногоФайла. -// -// Параметры: -// РасширениеПодключено - Булево -// Контекст - Структура: -// * Оповещение - ОписаниеОповещения -// * Расширение - Строка -// -Процедура ПолучитьИмяВременногоФайлаПослеПроверкиРасширенияРаботыСФайлами(РасширениеПодключено, Контекст) Экспорт - - Если РасширениеПодключено Тогда -#Если ВебКлиент Тогда - Оповещение = Новый ОписаниеОповещения( - "ПолучитьИмяВременногоФайлаПослеПолученияВременногоКаталога", ЭтотОбъект, Контекст, - "ПолучитьИмяВременногоФайлаПриОбработкеОшибки", ЭтотОбъект); - НачатьПолучениеКаталогаВременныхФайлов(Оповещение); -#Иначе - ПолучитьИмяВременногоФайлаПослеПолученияВременногоКаталога("", Контекст); -#КонецЕсли - Иначе - ПолучитьИмяВременногоФайлаОповеститьОбОшибке(НСтр("ru = 'Не удалось установить расширение для работы с 1С:Предприятием.'"), Контекст); - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ПолучитьПолноеИмяВременногоФайла. -// -// Параметры: -// ИмяКаталогаВременныхФайлов - Строка -// Контекст - Структура: -// * Оповещение - ОписаниеОповещения -// * Расширение - Строка -// -Процедура ПолучитьИмяВременногоФайлаПослеПолученияВременногоКаталога(ИмяКаталогаВременныхФайлов, Контекст) Экспорт - - Оповещение = Контекст.Оповещение; - Расширение = Контекст.Расширение; - -#Если ВебКлиент Тогда - ИмяВременногоФайла = ИмяКаталогаВременныхФайлов + Строка(Новый УникальныйИдентификатор); -#Иначе - ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение); // АПК:441 Функция для получения имени временного файла. -#КонецЕсли - - Если Не ПустаяСтрока(Расширение) Тогда - ИмяВременногоФайла = ИмяВременногоФайла + "." + Расширение; - КонецЕсли; - - ВыполнитьОбработкуОповещения(Оповещение, ИмяВременногоФайла); - -КонецПроцедуры - -// Продолжение процедуры ПолучитьПолноеИмяВременногоФайла. -Процедура ПолучитьИмяВременногоФайлаПриОбработкеОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт - - СтандартнаяОбработка = Ложь; - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - ПолучитьИмяВременногоФайлаОповеститьОбОшибке(ОписаниеОшибки, Контекст); - -КонецПроцедуры - -// Продолжение процедуры ПолучитьПолноеИмяВременногоФайла. -Процедура ПолучитьИмяВременногоФайлаОповеститьОбОшибке(ОписаниеОшибки, Контекст) - - ПоказатьПредупреждение(, ОписаниеОшибки); - ИмяВременногоФайла = ""; - ВыполнитьОбработкуОповещения(Контекст.Оповещение, ИмяВременногоФайла); - -КонецПроцедуры - -#КонецОбласти - Процедура ПоказатьВопросУстановкиКомпонентыСканирования(Результат, КомпонентаУстановлена) Экспорт Если Результат = КодВозвратаДиалога.Да Тогда @@ -1219,7 +1015,7 @@ НомерЭлемента = Число(НомерЭлемента); КонецЕсли; - ПутьКДанным = Форма.ПараметрыРаботыСФайлами[НомерЭлемента][ИмяПараметра]; + ПутьКДанным = Форма.ПараметрыРаботыСФайлами.ОписанияЭлементовФормы[НомерЭлемента][ИмяПараметра]; ЧастиПутиКДанным = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПутьКДанным, ".", Истина, Истина); Если ЧастиПутиКДанным.Количество() > 0 Тогда @@ -1299,9 +1095,9 @@ НомерЭлемента = ТипЧисло.ПривестиЗначение(ПараметрыВыполнения.НомерЭлемента); ПараметрыДобавленияФайла = Новый Структура; ПараметрыДобавленияФайла.Вставить("МаксимальныйРазмер", - Форма.ПараметрыРаботыСФайлами[НомерЭлемента].МаксимальныйРазмер); + Форма.ПараметрыРаботыСФайлами.ОписанияЭлементовФормы[НомерЭлемента].МаксимальныйРазмер); ПараметрыДобавленияФайла.Вставить("ФильтрДиалогаВыбора", - Форма.ПараметрыРаботыСФайлами[НомерЭлемента].ФильтрДиалогаВыбора); + Форма.ПараметрыРаботыСФайлами.ОписанияЭлементовФормы[НомерЭлемента].ФильтрДиалогаВыбора); ПараметрыДобавленияФайла.Вставить("НеОткрыватьКарточку", Истина); Если СтрНачинаетсяС(ИмяКоманды, "ОткрытьСписок") Тогда @@ -1379,20 +1175,27 @@ ТипЧисло = Новый ОписаниеТипов("Число"); НомерЭлемента = ТипЧисло.ПривестиЗначение(ПараметрыВыполнения.НомерЭлемента); + ПараметрыРаботыСФайлом = Форма.ПараметрыРаботыСФайлами.ОписанияЭлементовФормы[НомерЭлемента]; ПараметрыДобавленияФайла = Новый Структура; - ПараметрыДобавленияФайла.Вставить("МаксимальныйРазмер", - Форма.ПараметрыРаботыСФайлами[НомерЭлемента].МаксимальныйРазмер); - ПараметрыДобавленияФайла.Вставить("ФильтрДиалогаВыбора", - Форма.ПараметрыРаботыСФайлами[НомерЭлемента].ФильтрДиалогаВыбора); + ПараметрыДобавленияФайла.Вставить("МаксимальныйРазмер", ПараметрыРаботыСФайлом.МаксимальныйРазмер); + ПараметрыДобавленияФайла.Вставить("ФильтрДиалогаВыбора", ПараметрыРаботыСФайлом.ФильтрДиалогаВыбора); + + ПараметрыДобавленияФайла.Вставить("НеОткрыватьКарточку", Истина); + РеквизитРазмещения = Неопределено; + Если ПараметрыРаботыСФайлом.Свойство("ПутьКДаннымИзображения") И ЗначениеЗаполнено(ПараметрыРаботыСФайлом.ПутьКРеквизитуРазмещения) Тогда + ПутьКРеквизитуРазмещения = ПараметрыРаботыСФайлом.ПутьКРеквизитуРазмещения; + ЭлементыПути = СтрРазделить(ПутьКРеквизитуРазмещения, ".", Ложь); + РеквизитРазмещения = ЭлементыПути[ЭлементыПути.ВГраница()]; + КонецЕсли; - ПараметрыДобавленияИзображения = РаботаСФайламиСлужебныйВызовСервера.ПараметрыДобавленияИзображения(ВладелецПрисоединенныхФайлов); + ПараметрыДобавленияИзображения = РаботаСФайламиСлужебныйВызовСервера.ПараметрыДобавленияИзображения(ВладелецПрисоединенныхФайлов, РеквизитРазмещения); Если Просмотр - Или Не ПараметрыДобавленияИзображения.ПравоДобавления Тогда + Или (Не ПараметрыДобавленияИзображения.ПравоДобавления И Не ПараметрыДобавленияИзображения.ПравоИзменения) Тогда ПараметрыВыполнения.Действие = "ПросмотретьФайл"; ВыполнитьДействиеСФайлом(ПараметрыВыполнения, Неопределено); - + Иначе ОбработчикЗавершения = Новый ОписаниеОповещения("ЗавершениеВыполненияКомандыСОповещением", @@ -1463,9 +1266,9 @@ ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Истина); ПараметрыДобавления.Вставить("ИмяСоздаваемогоФайла", Файл.ИмяБезРасширения); ПараметрыДобавления.Вставить("МаксимальныйРазмер", - Форма.ПараметрыРаботыСФайлами[НомерЭлемента].МаксимальныйРазмер); + Форма.ПараметрыРаботыСФайлами.ОписанияЭлементовФормы[НомерЭлемента].МаксимальныйРазмер); ПараметрыДобавления.Вставить("ФильтрДиалогаВыбора", - Форма.ПараметрыРаботыСФайлами[НомерЭлемента].ФильтрДиалогаВыбора); + Форма.ПараметрыРаботыСФайлами.ОписанияЭлементовФормы[НомерЭлемента].ФильтрДиалогаВыбора); РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширением(ПараметрыДобавления); @@ -1479,7 +1282,7 @@ НомерЭлемента = Число(НомерЭлемента); КонецЕсли; - ПутьКДанным = Форма.ПараметрыРаботыСФайлами[НомерЭлемента].ПутьКРеквизитуРазмещения; + ПутьКДанным = Форма.ПараметрыРаботыСФайлами.ОписанияЭлементовФормы[НомерЭлемента].ПутьКРеквизитуРазмещения; ЧастиПутиКДанным = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПутьКДанным, ".", Истина, Истина); Если ЧастиПутиКДанным.Количество() > 0 Тогда @@ -1511,7 +1314,7 @@ НомерЭлементаСтрокой = Формат(НомерЭлемента, "ЧГ=;"); КонецЕсли; - ИмяРеквизита = Форма.ПараметрыРаботыСФайлами[НомерЭлементаЧислом].ПутьКДаннымИзображения; + ИмяРеквизита = Форма.ПараметрыРаботыСФайлами.ОписанияЭлементовФормы[НомерЭлементаЧислом].ПутьКДаннымИзображения; ЭлементКартинки = Форма.Элементы.Найти("ПолеКартинкиПрисоединенногоФайла" + НомерЭлементаСтрокой); ЭлементЗаголовка = Форма.Элементы.Найти("ЗаголовокПрисоединенногоФайла" + НомерЭлементаСтрокой); @@ -1525,7 +1328,7 @@ ДанныеФайла = ДанныеОбновления.ДанныеФайла; Если ЭлементКартинки <> Неопределено Тогда - ТекстНевыбраннойКартинки = Форма.ПараметрыРаботыСФайлами[НомерЭлементаЧислом].ТекстНевыбраннойКартинки; + ТекстНевыбраннойКартинки = Форма.ПараметрыРаботыСФайлами.ОписанияЭлементовФормы[НомерЭлементаЧислом].ТекстНевыбраннойКартинки; Если ДанныеФайла = Неопределено Тогда Форма[ИмяРеквизита] = Неопределено; ЭлементКартинки.ТекстНевыбраннойКартинки = ТекстНевыбраннойКартинки; @@ -1647,7 +1450,18 @@ Процедура ИзменитьВидимостьДополнительныхКоманд(Форма) - Для ИндексЭлемента = 0 По Форма.ПараметрыРаботыСФайлами.ВГраница() Цикл + Попытка + ЕстьПараметрыРаботыСФайлами = ТипЗнч(Форма["ПараметрыРаботыСФайлами"]) = Тип("ФиксированнаяСтруктура"); + Исключение + // Реквизита ПараметрыРаботыСФайлами нет на форме, либо он не проинициализирован. + ЕстьПараметрыРаботыСФайлами = Ложь; + КонецПопытки; + + Если Не ЕстьПараметрыРаботыСФайлами Тогда + Возврат; + КонецЕсли; + + Для ИндексЭлемента = 0 По Форма.ПараметрыРаботыСФайлами.ОписанияЭлементовФормы.ВГраница() Цикл ПодменюКоманд = Форма.Элементы.Найти("ПодменюДобавленияФайла" + ИндексЭлемента); КнопкаКомандыВыбрать = Форма.Элементы.Найти("УправлениеПрисоединеннымиФайламиВыбратьФайл" + ИндексЭлемента); @@ -1657,18 +1471,20 @@ Если КнопкаКомандыСканировать <> Неопределено Тогда КнопкаКомандыСканировать.Видимость = Ложь; - ЭлементКонтекстногоМеню = Форма.Элементы["УправлениеПрисоединеннымиФайламиСканироватьИзКонтекстногоМеню" - + ИндексЭлемента]; - - ЭлементКонтекстногоМеню.Видимость = Ложь; + КнопкаКомандыСканироватьИзКонтекстногоМеню = Форма.Элементы.Найти("УправлениеПрисоединеннымиФайламиСканироватьИзКонтекстногоМеню" + + ИндексЭлемента); + Если КнопкаКомандыСканироватьИзКонтекстногоМеню <> Неопределено Тогда + КнопкаКомандыСканироватьИзКонтекстногоМеню.Видимость = Ложь; + КонецЕсли; КонецЕсли; Если КнопкаКомандыСоздатьИзШаблона <> Неопределено Тогда КнопкаКомандыСоздатьИзШаблона.Видимость = Ложь; - ЭлементКонтекстногоМеню = Форма.Элементы["УправлениеПрисоединеннымиФайламиСоздатьПоШаблонуИзКонтекстногоМеню" - + ИндексЭлемента]; - - ЭлементКонтекстногоМеню.Видимость = Ложь; + КнопкаКомандыСоздатьИзШаблонаИзКонтекстногоМеню = Форма.Элементы.Найти("УправлениеПрисоединеннымиФайламиСоздатьПоШаблонуИзКонтекстногоМеню" + + ИндексЭлемента); + Если КнопкаКомандыСоздатьИзШаблонаИзКонтекстногоМеню <> Неопределено Тогда + КнопкаКомандыСоздатьИзШаблонаИзКонтекстногоМеню.Видимость = Ложь; + КонецЕсли; КонецЕсли; ВидимостьПодменю = Ложь; diff --git a/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl index de2790c0e..56360e9c7 100644 --- a/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl @@ -70,7 +70,7 @@ КонецПроцедуры // Вызывается после копирования файла из исходного файла для заполнения таких реквизитов нового файла, -// которые не предусмотрены в БСП и были добавлены к справочнику Файлы или ВерсииФайлов в конфигурации. +// которые самостоятельно добавлены к справочнику Файлы или ВерсииФайлов в конфигурации. // // Параметры: // НовыйФайл - СправочникСсылка.Файлы - ссылка на новый файл, который надо заполнить. @@ -115,8 +115,7 @@ КонецПроцедуры -// Позволяет определить параметры штампов электронной подписи в подписанном -// табличном документе. +// Позволяет определить параметры штампов электронной подписи в подписанном табличном документе. // // Параметры: // ПараметрыШтампа - Структура - возвращаемый параметр, со свойствами: @@ -128,7 +127,7 @@ КонецПроцедуры -// Позволяет изменить стандартную форму списка файлов +// Позволяет изменить стандартную форму списка файлов. // // Параметры: // Форма - ФормаКлиентскогоПриложения - форма списка файлов. @@ -137,7 +136,7 @@ КонецПроцедуры -// Позволяет изменить стандартную форму файла +// Позволяет изменить стандартную форму файла. // // Параметры: // Форма - ФормаКлиентскогоПриложения - форма файла. diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl index 06fd1031d..e79ac073b 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl @@ -385,6 +385,27 @@ Возврат; // Не используется КонецПроцедуры +// Возвращает массив адресов файлов и открепленных подписей. +// +// Параметры: +// МассивФайлов - Массив из ОпределяемыйТип.ПрисоединенныйФайл - ссылка на элемент справочника с файлом. +// ИдентификаторФормы - УникальныйИдентификатор. +// +// Возвращаемое значение: +// Массив из Структура: +// * Представление - Строка - имя файла. +// * АдресВоВременномХранилище - Строка +// +Функция ПоместитьФайлыВоВременноеХранилище(МассивФайлов, ИдентификаторФормы) Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("МассивФайлов", МассивФайлов); + Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); + + Возврат РаботаСФайламиСлужебныйВызовСервера.ПоместитьФайлыВоВременноеХранилище(Параметры); + +КонецФункции + #Область ПроцедурыОбменаДанными // Возвращает массив справочников, выступающих в роли владельцев файлов. @@ -512,7 +533,15 @@ // Записывает вложения в папку. // // Параметры: -// см. описание процедуры "ВыполнитьДоставку" модуля "РассылкаОтчетов". +// ПараметрыДоставки - Структура: +// * Папка - СправочникСсылка.ПапкиФайлов +// * Рассылка - ЛюбаяСсылка +// * ДатаВыполнения - Дата +// * ДобавлятьСсылки - Строка +// * ПредставлениеОтчетовПолучателя - Строка +// Вложения - Соответствие из КлючИЗначение: +// * Ключ - Строка +// * Значение - Строка // Процедура ПриВыполненииДоставкиВПапку(ПараметрыДоставки, Вложения) Экспорт @@ -569,15 +598,13 @@ СведенияОФайле.ИмяБезРасширения = Вложение.ИмяФайлаБезРасширения; СведенияОФайле.Комментарий = Комментарий; - // Запись Если ЗначениеЗаполнено(Вложение.ФайлСсылка) Тогда - ВерсияСсылка = СоздатьВерсию(Вложение.ФайлСсылка, СведенияОФайле); + ВерсияСсылка = СоздатьВерсию(Вложение.ФайлСсылка, СведенияОФайле); // @skip-check query-in-loop - по-объектная запись данных. ОбновитьВерсиюВФайле(Вложение.ФайлСсылка, ВерсияСсылка, СведенияОФайле.АдресВременногоХранилищаТекста); Иначе Вложение.ФайлСсылка = РаботаСФайламиСлужебныйВызовСервера.СоздатьФайлСВерсией(ПараметрыДоставки.Папка, СведенияОФайле); КонецЕсли; - // Заполнение ссылки на файл Если ПараметрыДоставки.ДобавлятьСсылки <> "" Тогда ПараметрыДоставки.ПредставлениеОтчетовПолучателя = СтрЗаменить( ПараметрыДоставки.ПредставлениеОтчетовПолучателя, @@ -585,7 +612,6 @@ ПолучитьНавигационнуюСсылкуИнформационнойБазы() + "#" + ПолучитьНавигационнуюСсылку(Вложение.ФайлСсылка)); КонецЕсли; - // Очистка УдалитьИзВременногоХранилища(СведенияОФайле.АдресВременногоХранилищаФайла); КонецЦикла; @@ -1014,7 +1040,8 @@ Шифрование = Ложь; ПросмотрЗашифрованных = Ложь; ДоступнаУсовершенствованнаяПодпись = Ложь; - + ВидимостьИнструкции = Ложь; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); @@ -1024,12 +1051,13 @@ Шифрование = МодульЭлектроннаяПодпись.ШифрованиеИРасшифровкаДанных(); ПросмотрЗашифрованных = МодульЭлектроннаяПодпись.РасшифровкаДанных(); ДоступнаУсовершенствованнаяПодпись = МодульЭлектроннаяПодпись.ДоступнаУсовершенствованнаяПодпись(); + ВидимостьИнструкции = МодульЭлектроннаяПодписьСлужебный.ВидимостьСсылкиНаИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами(); КонецЕсли; КонецЕсли; Если ЭтоФормаСписка Тогда - Если ОбщегоНазначения.ЭтоСправочник(Метаданные.НайтиПоПолномуИмени(Форма.Список.ОсновнаяТаблица)) Тогда + Если ОбщегоНазначения.ЭтоСправочник(ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Форма.Список.ОсновнаяТаблица)) Тогда ТаблицаФайлов = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(Форма.Список.ОсновнаяТаблица); Доступна = ДоступнаЭлектроннаяПодпись(ТипЗнч(ТаблицаФайлов.ПустаяСсылка())); Иначе @@ -1063,6 +1091,7 @@ Элементы.ЭлектронныеПодписиУдалить.Видимость = Подписание; Элементы.ГруппаЭлектронныеПодписи.Видимость = Доступна; Элементы.ГруппаСертификатыШифрования.Видимость = ПросмотрЗашифрованных И Доступна; + Элементы.Инструкция.Видимость = Подписание И ВидимостьИнструкции; КонецЕсли; КонецЕсли; @@ -1183,27 +1212,46 @@ КонецПроцедуры +// Параметры записи информации о шифровании. +// +// Возвращаемое значение: +// Структура - параметры записи информации о шифровании: +// * Зашифровать - Булево - Истина (по умолчанию) - зашифровать файл, Ложь - расшифровать. +// * МассивДанныхДляЗанесенияВБазу - Массив из Структура +// * УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы. +// * ИмяРабочегоКаталога - Строка - рабочий каталог. +// * МассивФайловВРабочемКаталогеДляУдаления - Массив - файлы, которые надо удалить из регистра. +// * МассивОтпечатков - Массив - массив отпечатков сертификатов, использованных для шифрования. +// * СведенияОФайле - см. РаботаСФайламиКлиентСервер.СведенияОФайле +// +Функция ПараметрыЗаписиИнформацииОШифровании() Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("Зашифровать", Истина); + Параметры.Вставить("МассивДанныхДляЗанесенияВБазу", Новый Массив); + Параметры.Вставить("УникальныйИдентификатор", Неопределено); + Параметры.Вставить("ИмяРабочегоКаталога", ""); + Параметры.Вставить("МассивФайловВРабочемКаталогеДляУдаления", Новый Массив); + Параметры.Вставить("МассивОтпечатков", Новый Массив); + Параметры.Вставить("СведенияОФайле", Неопределено); + + Возврат Параметры; + +КонецФункции + // Помещает шифрованные файлы в базу и ставит признак Зашифрован файлу и всем версиям. // // Параметры: // ФайлСсылка - СправочникСсылка.Файлы - файл. -// Зашифровать - Булево - зашифровать файл, если Истина - иначе расшифровать. -// МассивДанныхДляЗанесенияВБазу - Массив из Структура -// УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы. -// ИмяРабочегоКаталога - Строка - рабочий каталог. -// МассивФайловВРабочемКаталогеДляУдаления - Массив - файлы, которые надо удалить из регистра. -// МассивОтпечатков - Массив - массив отпечатков сертификатов, использованных для шифрования. -// СведенияОФайлеДляЗаписи - см. РаботаСФайламиКлиентСервер.СведенияОФайле, Неопределено - по умолчанию Неопределено, -// структура используется только при синхронизации с облаком. +// ПараметрыЗаписиИнформацииОШифровании - см. ПараметрыЗаписиИнформацииОШифровании // -Процедура ЗаписатьИнформациюОШифровании(ФайлСсылка, Зашифровать, МассивДанныхДляЗанесенияВБазу, УникальныйИдентификатор, - ИмяРабочегоКаталога, МассивФайловВРабочемКаталогеДляУдаления, МассивОтпечатков, СведенияОФайлеДляЗаписи = Неопределено) Экспорт +Процедура ЗаписатьИнформациюОШифровании(ФайлСсылка, ПараметрыЗаписиИнформацииОШифровании) Экспорт НачатьТранзакцию(); Попытка АдресВременногоХранилищаТекстаТекущейВерсии = ""; АдресВременногоХранилищаОсновногоФайла = ""; - Для Каждого ДанныеДляЗаписиНаСервере Из МассивДанныхДляЗанесенияВБазу Цикл + Для Каждого ДанныеДляЗаписиНаСервере Из ПараметрыЗаписиИнформацииОШифровании.МассивДанныхДляЗанесенияВБазу Цикл Если ТипЗнч(ДанныеДляЗаписиНаСервере.ВерсияСсылка) <> Тип("СправочникСсылка.ВерсииФайлов") Тогда АдресВременногоХранилищаОсновногоФайла = ДанныеДляЗаписиНаСервере.АдресВременногоХранилища; @@ -1219,20 +1267,20 @@ КонецЕсли; ПолноеИмяФайлаВРабочемКаталоге = ""; - Если ЗначениеЗаполнено(ИмяРабочегоКаталога) Тогда + Если ЗначениеЗаполнено(ПараметрыЗаписиИнформацииОШифровании.ИмяРабочегоКаталога) Тогда ВРабочемКаталогеНаЧтение = Истина; // не используется ВРабочемКаталогеВладельца = Истина; ПолноеИмяФайлаВРабочемКаталоге = РаботаСФайламиСлужебныйВызовСервера.ПолноеИмяФайлаВРабочемКаталоге(ВерсияСсылка, - ИмяРабочегоКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + ПараметрыЗаписиИнформацииОШифровании.ИмяРабочегоКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); КонецЕсли; Если Не ПустаяСтрока(ПолноеИмяФайлаВРабочемКаталоге) Тогда - МассивФайловВРабочемКаталогеДляУдаления.Добавить(ПолноеИмяФайлаВРабочемКаталоге); + ПараметрыЗаписиИнформацииОШифровании.МассивФайловВРабочемКаталогеДляУдаления.Добавить(ПолноеИмяФайлаВРабочемКаталоге); КонецЕсли; РаботаСФайламиСлужебныйВызовСервера.УдалитьИзРегистра(ВерсияСсылка); - Если СведенияОФайлеДляЗаписи = Неопределено Тогда + Если ПараметрыЗаписиИнформацииОШифровании.СведенияОФайле = Неопределено Тогда РеквизитыВерсии = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВерсияСсылка, "Наименование, Комментарий, |Расширение, ДатаСоздания, ДатаМодификацииУниверсальная, Размер"); @@ -1244,16 +1292,17 @@ СведенияОФайле.РасширениеБезТочки = РеквизитыВерсии.Расширение; СведенияОФайле.ВремяИзменения = РеквизитыВерсии.ДатаСоздания; СведенияОФайле.ВремяИзмененияУниверсальное = РеквизитыВерсии.ДатаМодификацииУниверсальная; - СведенияОФайле.Размер = РеквизитыВерсии.Размер; + СведенияОФайле.Размер = ВерсияСсылка.Размер; СведенияОФайле.ВремяИзмененияУниверсальное = РеквизитыВерсии.ДатаМодификацииУниверсальная; СведенияОФайле.НовыйСтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; - СведенияОФайле.Зашифрован = Зашифровать; + СведенияОФайле.Зашифрован = ПараметрыЗаписиИнформацииОШифровании.Зашифровать; СведенияОФайле.ХранитьВерсии = Ложь; Иначе - СведенияОФайле = СведенияОФайлеДляЗаписи; + СведенияОФайле = ПараметрыЗаписиИнформацииОШифровании.СведенияОФайле; КонецЕсли; + // @skip-check query-in-loop - По-объектная запись данных. - ОбновитьВерсиюФайла(ФайлСсылка, СведенияОФайле, ВерсияСсылка, УникальныйИдентификатор); + ОбновитьВерсиюФайла(ФайлСсылка, СведенияОФайле, ВерсияСсылка, ПараметрыЗаписиИнформацииОШифровании.УникальныйИдентификатор); // Для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения. Если Не ПустаяСтрока(ДанныеДляЗаписиНаСервере.АдресФайла) И ЭтоАдресВременногоХранилища(ДанныеДляЗаписиНаСервере.АдресФайла) Тогда @@ -1268,19 +1317,19 @@ БлокировкаДанных.Заблокировать(); ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); - ЗаблокироватьДанныеДляРедактирования(ФайлСсылка, , УникальныйИдентификатор); + ЗаблокироватьДанныеДляРедактирования(ФайлСсылка, , ПараметрыЗаписиИнформацииОШифровании.УникальныйИдентификатор); - ФайлОбъект.Зашифрован = Зашифровать; + ФайлОбъект.Зашифрован = ПараметрыЗаписиИнформацииОШифровании.Зашифровать; ФайлОбъект.ТекстХранилище = Новый ХранилищеЗначения(""); ФайлОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; // Чтобы прошла запись ранее подписанного объекта. ФайлОбъект.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина); - Если Зашифровать Тогда + Если ПараметрыЗаписиИнформацииОШифровании.Зашифровать Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); - МодульЭлектроннаяПодписьСлужебный.ДобавитьСертификатыШифрования(ФайлСсылка, МассивОтпечатков); + МодульЭлектроннаяПодписьСлужебный.ДобавитьСертификатыШифрования(ФайлСсылка, ПараметрыЗаписиИнформацииОШифровании.МассивОтпечатков); КонецЕсли; Иначе Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда @@ -1292,7 +1341,7 @@ МетаданныеФайла = Метаданные.НайтиПоТипу(ТипЗнч(ФайлСсылка)); ИспользованиеПолнотекстовогоПоиска = Метаданные.СвойстваОбъектов.ИспользованиеПолнотекстовогоПоиска.Использовать; - Если Не Зашифровать И АдресВременногоХранилищаТекстаТекущейВерсии <> "" Тогда + Если Не ПараметрыЗаписиИнформацииОШифровании.Зашифровать И АдресВременногоХранилищаТекстаТекущейВерсии <> "" Тогда Если МетаданныеФайла.ПолнотекстовыйПоиск = ИспользованиеПолнотекстовогоПоиска Тогда РезультатИзвлеченияТекста = ИзвлечьТекст(АдресВременногоХранилищаТекстаТекущейВерсии); @@ -1312,11 +1361,11 @@ КонецЕсли; ФайлОбъект.Записать(); - РазблокироватьДанныеДляРедактирования(ФайлСсылка, УникальныйИдентификатор); + РазблокироватьДанныеДляРедактирования(ФайлСсылка, ПараметрыЗаписиИнформацииОШифровании.УникальныйИдентификатор); ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - РазблокироватьДанныеДляРедактирования(ФайлСсылка, УникальныйИдентификатор); + РазблокироватьДанныеДляРедактирования(ФайлСсылка, ПараметрыЗаписиИнформацииОШифровании.УникальныйИдентификатор); ВызватьИсключение; КонецПопытки; @@ -1377,7 +1426,7 @@ |по причине: |""%2"".'"), ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ПоляФайла.Наименование, ПоляФайла.Расширение), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) )); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) )); КонецЕсли; КонецПопытки; @@ -1388,7 +1437,7 @@ УдалитьФайлы(ИмяФайлаСДвоичнымиДанными); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Извлечение текста'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; КонецЕсли; @@ -2742,10 +2791,19 @@ ОчиститьДанныеНенужныхФайлов(НенужныеФайлы); КонецПроцедуры +// Параметры: +// ВладелецФайла - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// Настройка - см. РегистрыСведений.НастройкиОчисткиФайлов.ТекущиеНастройкиОчистки +// МассивИсключений - Массив из ОпределяемыйТип.ВладелецФайлов +// ЭлементИсключение - Тип - тип ОпределяемыйТип.ВладелецФайлов. +// +// Возвращаемое значение: +// Строка +// Функция ТекстЗапросаДляОчисткиФайлов(ВладелецФайла, Настройка, МассивИсключений, ЭлементИсключение) ПолноеИмяСправочникаФайлов = Настройка.ТипВладельцаФайла.ПолноеИмя; - МетаданныеОбъектаФайлов = Метаданные.НайтиПоПолномуИмени(ПолноеИмяСправочникаФайлов); + МетаданныеОбъектаФайлов = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяСправочникаФайлов); ЕстьВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеОбъектаФайлов); Если ЕстьВозможностьХранитьВерсии Тогда СправочникВерсийФайлов = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(МетаданныеОбъектаФайлов.Реквизиты.ТекущаяВерсия.Тип.Типы()[0]); @@ -3209,7 +3267,7 @@ Исключение СообщениеОбОшибке = НСтр("ru='Не удалось скопировать данные файла во временный каталог.'") + Символы.ПС + Символы.ПС - + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииДляОбмена(), УровеньЖурналаРегистрации.Предупреждение, @@ -3474,6 +3532,86 @@ КонецПроцедуры +// Сохраняет в регистре сведений рабочий каталог папки. +// Параметры: +// СсылкаПапки - СправочникСсылка.ПапкиФайлов - владелец файла. +// РабочийКаталогВладельца - Строка - рабочий каталог папки. +// +Процедура СохранитьРабочийКаталогПапки(СсылкаПапки, РабочийКаталогПапки) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + НаборЗаписей = РегистрыСведений.РабочиеКаталогиФайлов.СоздатьНаборЗаписей(); + + НаборЗаписей.Отбор.Папка.Установить(СсылкаПапки); + НаборЗаписей.Отбор.Пользователь.Установить(Пользователи.АвторизованныйПользователь()); + + НоваяЗапись = НаборЗаписей.Добавить(); + НоваяЗапись.Папка = СсылкаПапки; + НоваяЗапись.Пользователь = Пользователи.АвторизованныйПользователь(); + НоваяЗапись.Путь = РабочийКаталогПапки; + + НаборЗаписей.Записать(); + +КонецПроцедуры + +// Очищает в регистре сведений рабочий каталог папки. +// Параметры: +// СсылкаПапки - СправочникСсылка.ПапкиФайлов - владелец файла. +// +Процедура ОчиститьРабочийКаталог(СсылкаПапки) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ТекущийПользователь = Пользователи.АвторизованныйПользователь(); + + Блокировка = Новый БлокировкаДанных; + + ЭлементБлокировки = Блокировка.Добавить("Справочник.ПапкиФайлов"); + ЭлементБлокировки.УстановитьЗначение("Родитель", СсылкаПапки); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; + + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.РабочиеКаталогиФайлов"); + ЭлементБлокировки.УстановитьЗначение("Пользователь", ТекущийПользователь); + + НачатьТранзакцию(); + Попытка + + Блокировка.Заблокировать(); + + НаборЗаписей = РегистрыСведений.РабочиеКаталогиФайлов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Папка.Установить(СсылкаПапки); + НаборЗаписей.Отбор.Пользователь.Установить(ТекущийПользователь); + НаборЗаписей.Записать(); // удаляем записи + + // Для дочерних папок очищаем рабочие каталоги. + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ПапкиФайлов.Ссылка КАК Ссылка + |ИЗ + | Справочник.ПапкиФайлов КАК ПапкиФайлов + |ГДЕ + | ПапкиФайлов.Родитель = &Ссылка"; + + Запрос.УстановитьПараметр("Ссылка", СсылкаПапки); + + Результат = Запрос.Выполнить(); + Выборка = Результат.Выбрать(); + Пока Выборка.Следующий() Цикл + ОчиститьРабочийКаталог(Выборка.Ссылка); // @skip-check query-in-loop - Рекурсивное удаление записей о файлах. + КонецЦикла; + + ЗафиксироватьТранзакцию(); + + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + + #Область ДругиеПроцедурыИФункции // Возвращает имя справочника для указанного владельца или вызывает исключение, @@ -4311,32 +4449,8 @@ // * Представление - Строка - например "ibm852 (Центральноевропейская DOS)". // Функция Кодировки() Экспорт - - СписокКодировок = Новый СписокЗначений; - СписокКодировок.Добавить("ibm852", НСтр("ru = 'IBM852 (Центральноевропейская DOS)'")); - СписокКодировок.Добавить("ibm866", НСтр("ru = 'IBM866 (Кириллица DOS)'")); - СписокКодировок.Добавить("iso-8859-1", НСтр("ru = 'ISO-8859-1 (Западноевропейская ISO)'")); - СписокКодировок.Добавить("iso-8859-2", НСтр("ru = 'ISO-8859-2 (Центральноевропейская ISO)'")); - СписокКодировок.Добавить("iso-8859-3", НСтр("ru = 'ISO-8859-3 (Латиница 3 ISO)'")); - СписокКодировок.Добавить("iso-8859-4", НСтр("ru = 'ISO-8859-4 (Балтийская ISO)'")); - СписокКодировок.Добавить("iso-8859-5", НСтр("ru = 'ISO-8859-5 (Кириллица ISO)'")); - СписокКодировок.Добавить("iso-8859-7", НСтр("ru = 'ISO-8859-7 (Греческая ISO)'")); - СписокКодировок.Добавить("iso-8859-9", НСтр("ru = 'ISO-8859-9 (Турецкая ISO)'")); - СписокКодировок.Добавить("iso-8859-15", НСтр("ru = 'ISO-8859-15 (Латиница 9 ISO)'")); - СписокКодировок.Добавить("koi8-r", НСтр("ru = 'KOI8-R (Кириллица KOI8-R)'")); - СписокКодировок.Добавить("koi8-u", НСтр("ru = 'KOI8-U (Кириллица KOI8-U)'")); - СписокКодировок.Добавить("us-ascii", НСтр("ru = 'US-ASCII (США)'")); - СписокКодировок.Добавить("utf-8", НСтр("ru = 'UTF-8 (Юникод UTF-8)'")); - СписокКодировок.Добавить("utf-8_WithoutBOM", НСтр("ru = 'UTF-8 (Юникод UTF-8 без BOM)'")); - СписокКодировок.Добавить("windows-1250", НСтр("ru = 'Windows-1250 (Центральноевропейская Windows)'")); - СписокКодировок.Добавить("windows-1251", НСтр("ru = 'windows-1251 (Кириллица Windows)'")); - СписокКодировок.Добавить("windows-1252", НСтр("ru = 'Windows-1252 (Западноевропейская Windows)'")); - СписокКодировок.Добавить("windows-1253", НСтр("ru = 'Windows-1253 (Греческая Windows)'")); - СписокКодировок.Добавить("windows-1254", НСтр("ru = 'Windows-1254 (Турецкая Windows)'")); - СписокКодировок.Добавить("windows-1257", НСтр("ru = 'Windows-1257 (Балтийская Windows)'")); - - Возврат СписокКодировок; + Возврат РаботаСФайламиСлужебныйКлиентСервер.Кодировки(); КонецФункции @@ -4442,7 +4556,7 @@ // АПК:154-выкл - отсутствие данных файла штатная ситуация. ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииДляОбмена(), УровеньЖурналаРегистрации.Предупреждение,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); // АПК:154-вкл ЭлементДанных.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); КонецПопытки; @@ -5706,7 +5820,7 @@ ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - ЗаписатьВЖурналСобытийОчисткиФайлов(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ЗаписатьВЖурналСобытийОчисткиФайлов(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), УровеньЖурналаРегистрации.Ошибка, ПрисоединенныйФайл); КонецПопытки; @@ -5714,7 +5828,7 @@ КонецФункции // Параметры: -// ОписаниеПрисоединенногоФайла - СтрокаДереваЗначения из см. ВыбратьНенужныеФайлы +// ОписаниеПрисоединенногоФайла - см. ВыбратьНенужныеФайлы // Процедура УдалитьНенужныеФайлы(ОписаниеПрисоединенногоФайла) @@ -5792,7 +5906,7 @@ ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - ЗаписатьВЖурналСобытийОчисткиФайлов(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ЗаписатьВЖурналСобытийОчисткиФайлов(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), УровеньЖурналаРегистрации.Ошибка, ПрисоединенныйФайл); ВызватьИсключение; КонецПопытки; @@ -5808,7 +5922,7 @@ // ДеревоЗначений: // * ФайлСсылка - ОпределяемыйТип.ПрисоединенныйФайл // * ВладелецФайла - Тип - тип ОпределяемыйТип.ВладелецФайлов. -// * Размер - Число - размер в Мб. +// * Размер - Число - размер в Мб. // Функция ВыбратьНенужныеФайлы(НастройкаОчистки, МассивИсключений) Экспорт @@ -5917,19 +6031,15 @@ Функция РеквизитыВладельцаФайлов(ВладелецФайла) РеквизитыЗапроса = ""; - ВсеСправочники = Справочники.ТипВсеСсылки(); - ВсеДокументы = Документы.ТипВсеСсылки(); - Если ВсеСправочники.СодержитТип(ТипЗнч(ВладелецФайла.ЗначениеПустойСсылки)) Тогда - Справочник = Метаданные.Справочники[ВладелецФайла.Имя]; - Для Каждого Реквизит Из Справочник.Реквизиты Цикл + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ВладелецФайла); + Если ОбщегоНазначения.ЭтоСправочник(ОбъектМетаданных) Тогда + Для Каждого Реквизит Из ОбъектМетаданных.Реквизиты Цикл РеквизитыЗапроса = РеквизитыЗапроса + Символы.ПС + "СправочникВладелецФайла." + Реквизит.Имя + ","; КонецЦикла; - ИначеЕсли - ВсеДокументы.СодержитТип(ТипЗнч(ВладелецФайла.ЗначениеПустойСсылки)) Тогда - Документ = Метаданные.Документы[ВладелецФайла.Имя]; + ИначеЕсли ОбщегоНазначения.ЭтоДокумент(ОбъектМетаданных) Тогда ШаблонЗапроса = "РАЗНОСТЬДАТ(&ИмяРеквизитаДата, &ТекущаяДата, ДЕНЬ) Как ДнейДоУдаленияОтДаты"; // @query-part - Для Каждого Реквизит Из Документ.Реквизиты Цикл + Для Каждого Реквизит Из ОбъектМетаданных.Реквизиты Цикл Если Реквизит.Тип = Новый ОписаниеТипов("Дата") Тогда ФрагментЗапроса = СтрЗаменить(ШаблонЗапроса, "&ИмяРеквизитаДата", "СправочникВладелецФайла." + Реквизит.Имя); ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "ДнейДоУдаленияОтДаты", "ДнейДоУдаленияОт" + Реквизит.Имя); @@ -6033,7 +6143,7 @@ ПредставлениеТипаВладельца = ОбщегоНазначения.ВидОбъектаПоТипу(ТипЗнч(ВладелецФайла.ЗначениеПустойСсылки)); ПолноеИмяСправочникаФайлов = НастройкаСинхронизации.ТипВладельцаФайла.ПолноеИмя; - МетаданныеОбъектаФайлов = Метаданные.НайтиПоПолномуИмени(ПолноеИмяСправочникаФайлов); + МетаданныеОбъектаФайлов = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяСправочникаФайлов); ЕстьВозможностьХранитьВерсии = ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеОбъектаФайлов); ТекстЗапроса = ""; @@ -6612,7 +6722,6 @@ КонецЕсли; Если ПараметрыФайла.Зашифрован <> Зашифрован Тогда - МассивДанныхДляЗанесенияВБазу = Новый Массив; ДанныеДляЗаписиНаСервере = Новый Структура; ДанныеДляЗаписиНаСервере.Вставить("АдресВременногоХранилища", АдресЗагруженногоФайла); @@ -6620,13 +6729,12 @@ ДанныеДляЗаписиНаСервере.Вставить("АдресВременногоХранилищаТекста", ""); ДанныеДляЗаписиНаСервере.Вставить("АдресФайла", ""); - МассивДанныхДляЗанесенияВБазу.Добавить(ДанныеДляЗаписиНаСервере); + ПараметрыЗаписиИнформацииОШифровании = ПараметрыЗаписиИнформацииОШифровании(); + ПараметрыЗаписиИнформацииОШифровании.Зашифровать = Зашифрован; + ПараметрыЗаписиИнформацииОШифровании.МассивДанныхДляЗанесенияВБазу.Добавить(ДанныеДляЗаписиНаСервере); + ПараметрыЗаписиИнформацииОШифровании.СведенияОФайле = СведенияОФайле; - МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; - МассивОтпечатков = Новый Массив; - - ЗаписатьИнформациюОШифровании(СсылкаСуществующегоФайла, Зашифрован, МассивДанныхДляЗанесенияВБазу, Неопределено, - "", МассивФайловВРабочемКаталогеДляУдаления, МассивОтпечатков, СведенияОФайле); + ЗаписатьИнформациюОШифровании(СсылкаСуществующегоФайла, ПараметрыЗаписиИнформацииОШифровании); Иначе РаботаСФайламиСлужебныйВызовСервера.СохранитьИзмененияФайла(СсылкаСуществующегоФайла, СведенияОФайле, Истина, "", "", Ложь); КонецЕсли; @@ -6764,7 +6872,7 @@ КонецЦикла; Исключение - ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); РезультатПроверки.РезультатТекст = РезультатПроверки.РезультатТекст + ?(ПустаяСтрока(РезультатПроверки.РезультатТекст), "", Символы.ПС) + ОписаниеОшибки; ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОписаниеОшибки, СтруктураОбмена.УчетнаяЗапись, УровеньЖурналаРегистрации.Ошибка); РезультатПроверки.Отказ = Истина; @@ -7277,7 +7385,7 @@ КонецЦикла; Исключение - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПараметрыСинхронизации.УчетнаяЗапись, УровеньЖурналаРегистрации.Ошибка); Отказ = Истина; КонецПопытки; @@ -7367,7 +7475,7 @@ ПараметрыСинхронизации.УчетнаяЗапись); Исключение - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПараметрыСинхронизации.УчетнаяЗапись, УровеньЖурналаРегистрации.Ошибка); КонецПопытки; @@ -7451,50 +7559,44 @@ Попытка - Попытка - - ПараметрыФайла = Новый Структура; - ПараметрыФайла.Вставить("ИмяФайла", СтрокаДереваФайлов.ИмяФайла); - ПараметрыФайла.Вставить("Href", СтрокаДереваФайлов.Href); - ПараметрыФайла.Вставить("Etag", СтрокаДереваФайлов.Etag); - ПараметрыФайла.Вставить("ДатаМодификацииФайла", СтрокаДереваФайлов.ДатаМодификации); - ПараметрыФайла.Вставить("ДлинаФайла", СтрокаДереваФайлов.Длина); - ПараметрыФайла.Вставить("ДляПользователя", ПараметрыСинхронизации.АвторФайлов); - ПараметрыФайла.Вставить("ОбъектВладелец", ОбъектВладелец); - ПараметрыФайла.Вставить("СсылкаСуществующегоФайла", Неопределено); - ПараметрыФайла.Вставить("ПараметрыСинхронизации", ПараметрыСинхронизации); - ПараметрыФайла.Вставить("Зашифрован", Ложь); - - СсылкаСуществующегоФайла = ЗагрузитьФайлССервера(ПараметрыФайла); - - СтрокаДереваФайлов.UID1C = Строка(СсылкаСуществующегоФайла.Ссылка.УникальныйИдентификатор()); - - НоваяСтрокаТаблицыФайлов = ТаблицаФайлов.Добавить(); - НоваяСтрокаТаблицыФайлов.ФайлСсылка = СсылкаСуществующегоФайла; - НоваяСтрокаТаблицыФайлов.ПометкаУдаления = Ложь; - НоваяСтрокаТаблицыФайлов.Родитель = ОбъектВладелец; - НоваяСтрокаТаблицыФайлов.ЭтоПапка = Ложь; - НоваяСтрокаТаблицыФайлов.UID1C = СтрокаДереваФайлов.UID1C; - НоваяСтрокаТаблицыФайлов.ЕстьВБазе = Ложь; - НоваяСтрокаТаблицыФайлов.ЕстьНаСервере = Истина; - НоваяСтрокаТаблицыФайлов.ИзмененНаСервере = Ложь; - НоваяСтрокаТаблицыФайлов.Href = ""; - НоваяСтрокаТаблицыФайлов.Etag = ""; - НоваяСтрокаТаблицыФайлов.ToHref = СтрокаДереваФайлов.Href; - НоваяСтрокаТаблицыФайлов.ToEtag = СтрокаДереваФайлов.Etag; - НоваяСтрокаТаблицыФайлов.РодительСервер = ОбъектВладелец; - НоваяСтрокаТаблицыФайлов.Наименование = ПараметрыФайла.ИмяФайла; - НоваяСтрокаТаблицыФайлов.НаименованиеСервер = ПараметрыФайла.ИмяФайла; - НоваяСтрокаТаблицыФайлов.Обработан = Истина; - НоваяСтрокаТаблицыФайлов.ЭтоФайл = Истина; - НоваяСтрокаТаблицыФайлов.Зашифрован = ПараметрыФайла.Зашифрован; - - Исключение - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПараметрыСинхронизации.УчетнаяЗапись, УровеньЖурналаРегистрации.Ошибка); - КонецПопытки; + ПараметрыФайла = Новый Структура; + ПараметрыФайла.Вставить("ИмяФайла", СтрокаДереваФайлов.ИмяФайла); + ПараметрыФайла.Вставить("Href", СтрокаДереваФайлов.Href); + ПараметрыФайла.Вставить("Etag", СтрокаДереваФайлов.Etag); + ПараметрыФайла.Вставить("ДатаМодификацииФайла", СтрокаДереваФайлов.ДатаМодификации); + ПараметрыФайла.Вставить("ДлинаФайла", СтрокаДереваФайлов.Длина); + ПараметрыФайла.Вставить("ДляПользователя", ПараметрыСинхронизации.АвторФайлов); + ПараметрыФайла.Вставить("ОбъектВладелец", ОбъектВладелец); + ПараметрыФайла.Вставить("СсылкаСуществующегоФайла", Неопределено); + ПараметрыФайла.Вставить("ПараметрыСинхронизации", ПараметрыСинхронизации); + ПараметрыФайла.Вставить("Зашифрован", Ложь); + + СсылкаСуществующегоФайла = ЗагрузитьФайлССервера(ПараметрыФайла); + + СтрокаДереваФайлов.UID1C = Строка(СсылкаСуществующегоФайла.Ссылка.УникальныйИдентификатор()); + + НоваяСтрокаТаблицыФайлов = ТаблицаФайлов.Добавить(); + НоваяСтрокаТаблицыФайлов.ФайлСсылка = СсылкаСуществующегоФайла; + НоваяСтрокаТаблицыФайлов.ПометкаУдаления = Ложь; + НоваяСтрокаТаблицыФайлов.Родитель = ОбъектВладелец; + НоваяСтрокаТаблицыФайлов.ЭтоПапка = Ложь; + НоваяСтрокаТаблицыФайлов.UID1C = СтрокаДереваФайлов.UID1C; + НоваяСтрокаТаблицыФайлов.ЕстьВБазе = Ложь; + НоваяСтрокаТаблицыФайлов.ЕстьНаСервере = Истина; + НоваяСтрокаТаблицыФайлов.ИзмененНаСервере = Ложь; + НоваяСтрокаТаблицыФайлов.Href = ""; + НоваяСтрокаТаблицыФайлов.Etag = ""; + НоваяСтрокаТаблицыФайлов.ToHref = СтрокаДереваФайлов.Href; + НоваяСтрокаТаблицыФайлов.ToEtag = СтрокаДереваФайлов.Etag; + НоваяСтрокаТаблицыФайлов.РодительСервер = ОбъектВладелец; + НоваяСтрокаТаблицыФайлов.Наименование = ПараметрыФайла.ИмяФайла; + НоваяСтрокаТаблицыФайлов.НаименованиеСервер = ПараметрыФайла.ИмяФайла; + НоваяСтрокаТаблицыФайлов.Обработан = Истина; + НоваяСтрокаТаблицыФайлов.ЭтоФайл = Истина; + НоваяСтрокаТаблицыФайлов.Зашифрован = ПараметрыФайла.Зашифрован; Исключение - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПараметрыСинхронизации.УчетнаяЗапись, УровеньЖурналаРегистрации.Ошибка); КонецПопытки; @@ -8017,7 +8119,7 @@ СинхронизацияВыполнена = Ложь; ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось синхронизировать файл ""%1"" по причине:'"), Строка(СтрокаТаблицы.ФайлСсылка)) - + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписатьВЖурналСобытийСинхронизацииФайлов(ТекстОшибки, ПараметрыСинхронизации.УчетнаяЗапись, УровеньЖурналаРегистрации.Ошибка); КонецПопытки; @@ -8299,12 +8401,18 @@ КонецЕсли; ИначеЕсли Не СтрокаТаблицы.ЭтоПапка И Не ОбъектЯвляетсяГруппой Тогда ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(СтрокаТаблицы.ФайлСсылка); + Если СтрокаТаблицы.ПодписанЭП Тогда ДополнительныеСвойства = Новый Структура("ЗаписьПодписанногоОбъекта", Истина); Иначе ДополнительныеСвойства = Неопределено; КонецЕсли; - РаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ДанныеФайла, , , ПараметрыСинхронизации.АвторФайлов, ДополнительныеСвойства); + + ПараметрыЗанятияФайла = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыЗанятияФайла(); + ПараметрыЗанятияФайла.Пользователь = ПараметрыСинхронизации.АвторФайлов; + ПараметрыЗанятияФайла.ДополнительныеСвойства = ДополнительныеСвойства; + + РаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ДанныеФайла, , ПараметрыЗанятияФайла); КонецЕсли; ТекстСобытия = НСтр("ru = 'Создан объект в облачном сервисе %1'"); @@ -8841,7 +8949,7 @@ ТекстСобытия = НСтр("ru = 'Объект не был удален в облачном сервисе %1 по причине: |%2'"); ЗаписатьВЖурналСобытийСинхронизацииФайлов(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ТекстСобытия, СтрокаТаблицы.НаименованиеСервер, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())), + ТекстСобытия, СтрокаТаблицы.НаименованиеСервер, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())), ПараметрыСинхронизации.УчетнаяЗапись, УровеньЖурналаРегистрации.Ошибка); КонецПопытки; @@ -8849,7 +8957,7 @@ КонецЕсли; Исключение - ЗаписатьВЖурналСобытийСинхронизацииФайлов(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ЗаписатьВЖурналСобытийСинхронизацииФайлов(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПараметрыСинхронизации.УчетнаяЗапись, УровеньЖурналаРегистрации.Ошибка); КонецПопытки; @@ -9150,7 +9258,7 @@ УдалитьФайлы(ИмяВременногоФайла); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Извлечение текста'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Возврат Результат; @@ -9243,7 +9351,7 @@ УдалитьФайлы(ИмяВременногоФайла); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Извлечение текста'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Возврат Текст; @@ -9475,7 +9583,6 @@ Функция ЕстьФайлыУВладельца(Знач ВладелецФайлов, Знач ФайлИсключение = Неопределено) - Запрос = Новый Запрос; ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1 | ПрисоединенныеФайлы.Ссылка @@ -9486,6 +9593,7 @@ | И ПрисоединенныеФайлы.ВладелецФайла = &ВладелецФайлов | И &ФайлИсключение"; + Запрос = Новый Запрос; Запрос.Параметры.Вставить("ВладелецФайлов", ВладелецФайлов); Если ФайлИсключение <> Неопределено Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ФайлИсключение", "ПрисоединенныеФайлы.Ссылка <> &ФайлИсключение"); // @Query-part-2 @@ -9494,18 +9602,14 @@ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ФайлИсключение", "ИСТИНА"); // @Query-part-2 КонецЕсли; - ИменаСправочников = ИменаСправочниковХраненияФайлов(ВладелецФайлов); - Для каждого КлючИЗначение Из ИменаСправочников Цикл - Запрос.Текст = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", "Справочник." + КлючИЗначение.Ключ); - - УстановитьПривилегированныйРежим(Истина); - Если НЕ Запрос.Выполнить().Пустой() Тогда - Возврат Истина; - КонецЕсли; - УстановитьПривилегированныйРежим(Ложь); + ТекстыЗапроса = Новый Массив; + Для каждого КлючИЗначение Из ИменаСправочниковХраненияФайлов(ВладелецФайлов) Цикл + ТекстыЗапроса.Добавить(СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", "Справочник." + КлючИЗначение.Ключ)); КонецЦикла; - Возврат Ложь; + Запрос.Текст = СтрСоединить(ТекстыЗапроса, Символы.ПС + "ОБЪЕДИНИТЬ" + Символы.ПС); + УстановитьПривилегированныйРежим(Истина); + Возврат НЕ Запрос.Выполнить().Пустой(); КонецФункции @@ -9586,18 +9690,10 @@ КонецПроцедуры -// Получает количество версий с неизвлеченным текстом. -Процедура ПолучитьКоличествоВерсийСНеизвлеченнымТекстом(ДополнительныеПараметры, АдресВоВременномХранилище) Экспорт +Функция КоличествоВерсийСНеизвлеченнымТекстом() Экспорт - КоличествоФайлов = 0; - - ТипыФайлов = Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип.Типы(); - - Для Каждого Тип Из ТипыФайлов Цикл - - МетаданныеСправочникаФайлов = Метаданные.НайтиПоТипу(Тип); - - Запрос = Новый Запрос; + ТекстыЗапроса = Новый Массив; + Для Каждого Тип Из Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип.Типы() Цикл ТекстЗапроса = "ВЫБРАТЬ @@ -9605,7 +9701,8 @@ |ИЗ | &ИмяСправочника КАК Файлы |ГДЕ - | Файлы.СтатусИзвлеченияТекста В (ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен), ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.ПустаяСсылка))"; + | Файлы.СтатусИзвлеченияТекста В (ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен), + | ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.ПустаяСсылка))"; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда Если Тип = Тип("СправочникСсылка.ВерсииФайлов") Тогда @@ -9617,19 +9714,22 @@ КонецЕсли; КонецЕсли; + МетаданныеСправочникаФайлов = Метаданные.НайтиПоТипу(Тип); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", "Справочник." + МетаданныеСправочникаФайлов.Имя); - Запрос.Текст = ТекстЗапроса; - - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - КоличествоФайлов = КоличествоФайлов + Выборка.КоличествоФайлов; - КонецЕсли + ТекстыЗапроса.Добавить(ТекстЗапроса); КонецЦикла; - ПоместитьВоВременноеХранилище(КоличествоФайлов, АдресВоВременномХранилище); + КоличествоФайлов = 0; + Запрос = Новый Запрос(СтрСоединить(ТекстыЗапроса, Символы.ПС + "ОБЪЕДИНИТЬ" + Символы.ПС)); + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + КоличествоФайлов = КоличествоФайлов + Выборка.КоличествоФайлов; + КонецЕсли; -КонецПроцедуры + Возврат КоличествоФайлов; + +КонецФункции // Регистрирует на плане обмена ОбновлениеИнформационнойБазы объекты, // для которых необходимо обновить записи в реестре. @@ -9686,10 +9786,8 @@ | УдалитьЭлектронныеПодписи.Ссылка = Файлы.Ссылка)"; Запрос = Новый Запрос; - ПолныеИменаСправочников = ПолныеИменаСправочниковПрисоединенныхФайлов(); - - Для Каждого ПолноеИмя Из ПолныеИменаСправочников Цикл - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмя); + Для Каждого ПолноеИмя Из ПолныеИменаСправочниковПрисоединенныхФайлов() Цикл + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмя); ЕстьТЧУдалитьСертификатыШифрования = ОбъектМетаданных.ТабличныеЧасти.Найти("УдалитьСертификатыШифрования") <> Неопределено; @@ -9729,7 +9827,6 @@ КонецЦикла; МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); - ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, МассивСсылок); КонецПроцедуры @@ -9737,14 +9834,11 @@ Процедура ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведений(Параметры) Экспорт ОбработкаЗавершена = Истина; - - ПолныеИменаСправочников = ПолныеИменаСправочниковПрисоединенныхФайлов(); - - Для Каждого ПолноеИмяСправочника Из ПолныеИменаСправочников Цикл + Для Каждого ПолноеИмяСправочника Из ПолныеИменаСправочниковПрисоединенныхФайлов() Цикл + // @skip-check query-in-loop - Порционная обработка больших объемов данных. ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведенийДляТаблицы(Параметры, ПолноеИмяСправочника, ОбработкаЗавершена); КонецЦикла; - Параметры.ОбработкаЗавершена = ОбработкаЗавершена; КонецПроцедуры @@ -9759,9 +9853,10 @@ // УдалитьЭлектронныеПодписи и УдалитьСертификатыШифрования. // ОбработкаЗавершена - Булево - Истина, если обработаны все данные при обновлении ИБ. // -Процедура ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведенийДляТаблицы(ПараметрыОбновления, ПолноеИмяОбъектаМетаданных, ОбработкаЗавершена) +Процедура ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведенийДляТаблицы(ПараметрыОбновления, + ПолноеИмяОбъектаМетаданных, ОбработкаЗавершена) - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъектаМетаданных); Если ОбъектМетаданных = Неопределено Тогда ВызватьИсключение НСтр("ru = 'Не указан объект для обработки электронных подписей и сертификатов шифрования.'"); @@ -9807,7 +9902,7 @@ НСтр("ru = 'Не удалось обработать объект %1 по причине: |%2'"), ОбъектМетаданных, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, ОбъектМетаданных, , ТекстСообщения); @@ -9896,12 +9991,11 @@ Если Не ЗначениеЗаполнено(Строка.ПодписанныйОбъект) Тогда Продолжить; КонецЕсли; - НаборЗаписей = РегистрыСведений["ЭлектронныеПодписи"].СоздатьНаборЗаписей(); //РегистрСведенийНаборЗаписей + НаборЗаписей = РегистрыСведений["ЭлектронныеПодписи"].СоздатьНаборЗаписей(); // РегистрСведенийНаборЗаписей НаборЗаписей.Отбор.ПодписанныйОбъект.Установить(Строка.ПодписанныйОбъект); Для Каждого Подстрока Из Строка.Строки Цикл ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), Подстрока); КонецЦикла; - // Используется параллельное обновление с нестандартной отметкой выполнения обработанных данных. НаборЗаписей.ОбменДанными.Загрузка = Истина; НаборЗаписей.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов"); НаборЗаписей.ОбменДанными.Получатели.АвтоЗаполнение = Ложь; @@ -9955,12 +10049,11 @@ Выгрузка = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); Для Каждого Строка Из Выгрузка.Строки Цикл - НаборЗаписей = РегистрыСведений["СертификатыШифрования"].СоздатьНаборЗаписей(); //РегистрСведенийНаборЗаписей + НаборЗаписей = РегистрыСведений["СертификатыШифрования"].СоздатьНаборЗаписей(); // РегистрСведенийНаборЗаписей НаборЗаписей.Отбор.ЗашифрованныйОбъект.Установить(Строка.ЗашифрованныйОбъект); Для Каждого Подстрока Из Строка.Строки Цикл ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), Подстрока); КонецЦикла; - // Используется параллельное обновление с нестандартной отметкой выполнения обработанных данных. НаборЗаписей.ОбменДанными.Загрузка = Истина; НаборЗаписей.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов"); НаборЗаписей.ОбменДанными.Получатели.АвтоЗаполнение = Ложь; @@ -10009,4 +10102,4 @@ #КонецОбласти -#КонецОбласти +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВМоделиСервиса/Module.bsl index fb73a1695..cf42c3f28 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВМоделиСервиса/Module.bsl @@ -90,7 +90,7 @@ ИсключаемыеТипы = ПрочитатьКэшВыгрузкиЗагрузкиФайловыхФункций().ОбъектыХранения; Для Каждого ИсключаемыйТип Из ИсключаемыеТипы Цикл - Типы.Добавить(Метаданные.НайтиПоПолномуИмени(ИсключаемыйТип.Ключ)); + Типы.Добавить(ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИсключаемыйТип.Ключ)); КонецЦикла; КонецПроцедуры @@ -102,7 +102,7 @@ Для Каждого СправочникФайлов Из СправочникиФайлов Цикл НовыйОбработчик = ТаблицаОбработчиков.Добавить(); - НовыйОбработчик.ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(СправочникФайлов.Ключ); + НовыйОбработчик.ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(СправочникФайлов.Ключ); НовыйОбработчик.Обработчик = РаботаСФайламиСлужебныйВМоделиСервиса; НовыйОбработчик.ПередВыгрузкойОбъекта = Истина; НовыйОбработчик.Версия = "1.0.0.1"; @@ -128,7 +128,7 @@ Для Каждого СправочникФайлов Из СправочникиФайлов Цикл НовыйОбработчик = ТаблицаОбработчиков.Добавить(); - НовыйОбработчик.ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(СправочникФайлов.Ключ); + НовыйОбработчик.ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(СправочникФайлов.Ключ); НовыйОбработчик.Обработчик = РаботаСФайламиСлужебныйВМоделиСервиса; НовыйОбработчик.ПередЗагрузкойОбъекта = Истина; НовыйОбработчик.Версия = "1.0.0.1"; @@ -213,7 +213,7 @@ |%3'"), Объект, Объект.Метаданные().ПолноеИмя(), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Контейнер.ДобавитьПредупреждение(Предупреждение); КонецЕсли; @@ -225,7 +225,7 @@ УровеньЖурналаРегистрации.Ошибка, Объект.Метаданные(), Объект.Ссылка, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); Контейнер.ИсключитьФайл(ИмяФайла); diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl index 463a9a990..c4c44a3c5 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl @@ -124,7 +124,7 @@ Папка.Записать(); Если ЗначениеЗаполнено(РабочийКаталог) Тогда - СохранитьРабочийКаталогПапки(Папка.Ссылка, РабочийКаталог); + РаботаСФайламиСлужебный.СохранитьРабочийКаталогПапки(Папка.Ссылка, РабочийКаталог); КонецЕсли; Возврат Папка.Ссылка; @@ -232,14 +232,17 @@ // ДанныеФайла - Структура - выходной параметр. // СтрокаОшибки - Строка - в которой возвращается причина ошибки в случае неуспеха, например, // "Файл занят другим пользователем". -// УникальныйИдентификатор - уникальный идентификатор формы. -// Пользователь - СправочникСсылка.Пользователи +// ДополнительныеПараметры - см. РаботаСФайламиСлужебныйКлиентСервер.ПараметрыЗанятияФайла +// // // Возвращаемое значение: // Булево - успешно ли выполнена операция. // -Функция ЗанятьФайл(ДанныеФайла, СтрокаОшибки = "", - Знач УникальныйИдентификатор = Неопределено, Знач Пользователь = Неопределено, ДополнительныеСвойства = Неопределено) Экспорт +Функция ЗанятьФайл(ДанныеФайла, СтрокаОшибки = "", ДополнительныеПараметры = Неопределено) Экспорт + + Если ДополнительныеПараметры = Неопределено Тогда + ДополнительныеПараметры = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыЗанятияФайла(); + КонецЕсли; СтрокаОшибки = ""; РаботаСФайламиПереопределяемый.ПриПопыткеЗанятьФайл(ДанныеФайла, СтрокаОшибки); @@ -256,14 +259,14 @@ ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект(); - ЗаблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, , УникальныйИдентификатор); - Если Пользователь = Неопределено Тогда + ЗаблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, , ДополнительныеПараметры.УникальныйИдентификатор); + Если ДополнительныеПараметры.Пользователь = Неопределено Тогда ФайлОбъект.Редактирует = Пользователи.АвторизованныйПользователь(); Иначе - ФайлОбъект.Редактирует = Пользователь; + ФайлОбъект.Редактирует = ДополнительныеПараметры.Пользователь; КонецЕсли; - Если ТипЗнч(ДополнительныеСвойства) = Тип("Структура") Тогда - ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ФайлОбъект.ДополнительныеСвойства, ДополнительныеСвойства, Ложь); + Если ТипЗнч(ДополнительныеПараметры.ДополнительныеСвойства) = Тип("Структура") Тогда + ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ФайлОбъект.ДополнительныеСвойства, ДополнительныеПараметры.ДополнительныеСвойства, Ложь); КонецЕсли; ФайлОбъект.ДатаЗаема = ТекущаяДатаСеанса(); ФайлОбъект.Записать(); @@ -275,14 +278,14 @@ ДанныеФайла.НавигационнаяСсылкаТекущейВерсии = НавигационнаяСсылкаТекущейВерсии; ДанныеФайла.РабочийКаталогВладельца = РабочийКаталогВладельца; - РаботаСФайламиПереопределяемый.ПриЗахватеФайла(ДанныеФайла, УникальныйИдентификатор); + РаботаСФайламиПереопределяемый.ПриЗахватеФайла(ДанныеФайла, ДополнительныеПараметры.УникальныйИдентификатор); - РазблокироватьДанныеДляРедактирования(ДанныеФайла.Ссылка, УникальныйИдентификатор); + РазблокироватьДанныеДляРедактирования(ДанныеФайла.Ссылка, ДополнительныеПараметры.УникальныйИдентификатор); ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - РазблокироватьДанныеДляРедактирования(ДанныеФайла.Ссылка, УникальныйИдентификатор); + РазблокироватьДанныеДляРедактирования(ДанныеФайла.Ссылка, ДополнительныеПараметры.УникальныйИдентификатор); ВызватьИсключение; КонецПопытки; @@ -290,6 +293,35 @@ КонецФункции +// Возвращает массив структур или структуру (в зависимости от переданных данных), +// содержащих различные сведения о файле. +// +// Параметры: +// Файлы - Массив из: +// - СправочникСсылка.Файлы +// ИдентификаторФормы - УникальныйИдентификатор - уникальный идентификатор формы, во временное хранилище +// которой надо поместить файл и вернуть адрес в свойстве СсылкаНаДвоичныеДанныеФайла. +// +// Возвращаемое значение: +// - Массив из см. РаботаСФайлами.ДанныеФайла +// см. РаботаСФайлами.ДанныеФайла +// +// +Функция ДанныеФайловДляПодписания(Знач Файлы, ИдентификаторФормы = Неопределено) Экспорт + + Если ТипЗнч(Файлы) <> Тип("Массив") Тогда + Возврат ДанныеФайла(Файлы,,ИдентификаторФормы); + КонецЕсли; + + ДанныеФайлов = Новый Массив; + Для Каждого Файл Из Файлы Цикл + ДанныеФайлов.Добавить(ДанныеФайла(Файл,,ИдентификаторФормы)); + КонецЦикла; + + Возврат ДанныеФайлов; + +КонецФункции + // Возвращает структуру, содержащую различные сведения о файле и версии. // // Параметры: @@ -456,7 +488,7 @@ Если ДанныеФайла.РабочийКаталогВладельца <> "" Тогда ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); - ОбщегоНазначения.СократитьИмяФайла(ИмяФайла); + ОбщегоНазначения.СократитьИмяФайла(ИмяФайла); ПолноеИмяФайлаВРабочемКаталоге = РабочийКаталогВладельца + ИмяФайла; ДанныеФайла.Вставить("ПолноеИмяФайлаВРабочемКаталоге", ПолноеИмяФайлаВРабочемКаталоге); КонецЕсли; @@ -528,7 +560,7 @@ КонецПроцедуры -Функция КоличествоПрисоединенныхФайлов(ВладелецФайлов, ВозвращатьДанныеФайлов = Ложь) Экспорт +Функция КоличествоПрисоединенныхФайлов(ВладелецФайлов, ВозвращатьДанныеФайлов = Ложь, РеквизитРазмещения = Неопределено) Экспорт ФайлыВладельца = Новый Структура; ФайлыВладельца.Вставить("КоличествоФайлов", 0); @@ -564,7 +596,11 @@ ФайлыВладельца.КоличествоФайлов = КоличествоФайлов; Если ВозвращатьДанныеФайлов И КоличествоФайлов > 0 Тогда - ФайлыВладельца.ДанныеФайла = ДанныеФайла(ТаблицаФайлов[0].Файл, , , Ложь); + Если РеквизитРазмещения = Неопределено Или Не ЗначениеЗаполнено(ВладелецФайлов[РеквизитРазмещения]) Тогда + ФайлыВладельца.ДанныеФайла = ДанныеФайла(ТаблицаФайлов[0].Файл, , , Ложь); + Иначе + ФайлыВладельца.ДанныеФайла = ДанныеФайла(ВладелецФайлов[РеквизитРазмещения], , , Ложь); + КонецЕсли; КонецЕсли; КонецЕсли; @@ -1215,8 +1251,11 @@ Если Не ЗначениеЗаполнено(ДанныеФайла.Редактирует) Тогда + ПараметрыЗанятияФайла = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыЗанятияФайла(); + ПараметрыЗанятияФайла.УникальныйИдентификатор = УникальныйИдентификатор; + СтрокаОшибки = ""; - Если Не ЗанятьФайл(ДанныеФайла, СтрокаОшибки, УникальныйИдентификатор) Тогда + Если Не ЗанятьФайл(ДанныеФайла, СтрокаОшибки, ПараметрыЗанятияФайла) Тогда Возврат Ложь; КонецЕсли; КонецЕсли; @@ -1269,9 +1308,12 @@ Возврат Результат; КонецЕсли; + ПараметрыЗанятияФайла = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыЗанятияФайла(); + ПараметрыЗанятияФайла.УникальныйИдентификатор = УникальныйИдентификатор; + Результат.ФайлУжеРедактируетТекущийПользователь = Результат.ДанныеФайла.ФайлРедактируетТекущийПользователь; Если Не ЗначениеЗаполнено(Результат.ДанныеФайла.Редактирует) - И Не ЗанятьФайл(Результат.ДанныеФайла, Результат.ТекстСообщения, УникальныйИдентификатор) Тогда + И Не ЗанятьФайл(Результат.ДанныеФайла, Результат.ТекстСообщения, ПараметрыЗанятияФайла) Тогда Возврат Результат; КонецЕсли; @@ -1455,29 +1497,6 @@ КонецФункции -// Сохраняет в регистре сведений рабочий каталог папки. -// Параметры: -// СсылкаПапки - СправочникСсылка.ПапкиФайлов - владелец файла. -// РабочийКаталогВладельца - Строка - рабочий каталог папки. -// -Процедура СохранитьРабочийКаталогПапки(СсылкаПапки, РабочийКаталогПапки) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - НаборЗаписей = РегистрыСведений.РабочиеКаталогиФайлов.СоздатьНаборЗаписей(); - - НаборЗаписей.Отбор.Папка.Установить(СсылкаПапки); - НаборЗаписей.Отбор.Пользователь.Установить(Пользователи.АвторизованныйПользователь()); - - НоваяЗапись = НаборЗаписей.Добавить(); - НоваяЗапись.Папка = СсылкаПапки; - НоваяЗапись.Пользователь = Пользователи.АвторизованныйПользователь(); - НоваяЗапись.Путь = РабочийКаталогПапки; - - НаборЗаписей.Записать(); - -КонецПроцедуры - // Возвращаемое значение: // Структура: // * Файл - ОпределяемыйТип.ПрисоединенныйФайл @@ -1503,7 +1522,7 @@ Процедура СохранитьРабочийКаталогПапкиИЗаменитьПутиВРегистре(СсылкаПапки, РабочийКаталогПапки, ИмяКаталогаПрежнееЗначение) Экспорт - СохранитьРабочийКаталогПапки(СсылкаПапки, РабочийКаталогПапки); + РаботаСФайламиСлужебный.СохранитьРабочийКаталогПапки(СсылкаПапки, РабочийКаталогПапки); Запрос = Новый Запрос; Запрос.Текст = @@ -1606,62 +1625,6 @@ КонецПроцедуры -// Очищает в регистре сведений рабочий каталог папки. -// Параметры: -// СсылкаПапки - СправочникСсылка.ПапкиФайлов - владелец файла. -// -Процедура ОчиститьРабочийКаталог(СсылкаПапки) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - ТекущийПользователь = Пользователи.АвторизованныйПользователь(); - - Блокировка = Новый БлокировкаДанных; - - ЭлементБлокировки = Блокировка.Добавить("Справочник.ПапкиФайлов"); - ЭлементБлокировки.УстановитьЗначение("Родитель", СсылкаПапки); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; - - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.РабочиеКаталогиФайлов"); - ЭлементБлокировки.УстановитьЗначение("Пользователь", ТекущийПользователь); - - НачатьТранзакцию(); - Попытка - - Блокировка.Заблокировать(); - - НаборЗаписей = РегистрыСведений.РабочиеКаталогиФайлов.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Папка.Установить(СсылкаПапки); - НаборЗаписей.Отбор.Пользователь.Установить(ТекущийПользователь); - НаборЗаписей.Записать(); // удаляем записи - - // Для дочерних папок очищаем рабочие каталоги. - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ПапкиФайлов.Ссылка КАК Ссылка - |ИЗ - | Справочник.ПапкиФайлов КАК ПапкиФайлов - |ГДЕ - | ПапкиФайлов.Родитель = &Ссылка"; - - Запрос.УстановитьПараметр("Ссылка", СсылкаПапки); - - Результат = Запрос.Выполнить(); - Выборка = Результат.Выбрать(); - Пока Выборка.Следующий() Цикл - ОчиститьРабочийКаталог(Выборка.Ссылка); - КонецЦикла; - - ЗафиксироватьТранзакцию(); - - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - // Находит запись в регистре сведений ФайлыВРабочемКаталоге по пути файла на диске (относительному). // // Параметры: @@ -1785,7 +1748,7 @@ ВРабочемКаталогеВладельца = СтруктураРесурсов.ВРабочемКаталогеВладельца; Если ПолноеИмяФайла <> "" И ВРабочемКаталогеВладельца = Ложь Тогда ОбщегоНазначения.СократитьИмяФайла(ПолноеИмяФайла); - ПолноеИмяФайла = ИмяКаталога + ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ПолноеИмяФайла, ""); + ПолноеИмяФайла = ИмяКаталога + ПолноеИмяФайла; КонецЕсли; Возврат ПолноеИмяФайла; @@ -2514,12 +2477,12 @@ КонецФункции -Функция ПараметрыДобавленияИзображения(ВладелецФайлов) Экспорт +Функция ПараметрыДобавленияИзображения(ВладелецФайлов, РеквизитРазмещения = Неопределено) Экспорт ПараметрыДобавления = Новый Структура; ПараметрыДобавления.Вставить("ПравоДобавления", ЕстьПравоДоступа("Добавление", ВладелецФайлов)); // @Access-right-2 - ПараметрыДобавления.Вставить("ФайлыВладельца" , КоличествоПрисоединенныхФайлов(ВладелецФайлов, Истина)); - + ПараметрыДобавления.Вставить("ПравоИзменения", ЕстьПравоДоступа("Изменение", ВладелецФайлов)); // @Access-right-2 + ПараметрыДобавления.Вставить("ФайлыВладельца" , КоличествоПрисоединенныхФайлов(ВладелецФайлов, Истина, РеквизитРазмещения)); Возврат ПараметрыДобавления; КонецФункции @@ -2909,9 +2872,19 @@ Возврат ТабличныйДокумент; КонецФункции -Функция СократитьСтрокуКонтрольнойСуммой(ИмяБезРасширения, ИспользуемоеКоличествоСимволов) Экспорт +/////////////////////////////////////////////////////////////////////////////////// +// Печать офисного документа со штампом электронной подписи. + +Функция ОфисныйДокументСоШтампом(СсылкаНаФайл, Ссылка) Экспорт - Возврат ОбщегоНазначения.СократитьСтрокуКонтрольнойСуммой(ИмяБезРасширения, ИспользуемоеКоличествоСимволов); + ДанныеФайла = РаботаСФайлами.ДанныеФайла(СсылкаНаФайл); + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + ЭлектронныеПодписи = МодульЭлектроннаяПодпись.УстановленныеПодписи(Ссылка); + + МодульУправлениеПечатью.ДобавитьШтампыВОфисныйДокумент(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, ЭлектронныеПодписи); + + Возврат ДанныеФайла.СсылкаНаДвоичныеДанныеФайла; КонецФункции diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl index 3a169d8ca..484d2560a 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl @@ -949,7 +949,7 @@ УдалитьФайлы(ИмяВременногоФайла); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), - "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; КонецЕсли; Иначе @@ -964,7 +964,7 @@ УдалитьФайлы(ИмяФайлаСПутем); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), - "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; РаботаСФайламиСлужебныйВызовСервера.ЗаписатьРезультатИзвлеченияТекста( @@ -1110,7 +1110,7 @@ Результат.Вставить("Каталог", ""); Результат.Вставить("ОписаниеОшибки", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось получить рабочий каталог данных пользователя по причине: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); @@ -1324,7 +1324,7 @@ // тогда установка настроек по умолчанию. Контекст.Каталог = Неопределено; ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), - "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; КонецЕсли; @@ -1521,9 +1521,7 @@ Если НЕ ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ИдентификаторФормы) Тогда ОбщегоНазначенияКлиент.СообщитьПользователю( СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при помещении файла - |""%1"" - |в программу.'"), + НСтр("ru = 'Не удалось поместить в программу файл ""%1"".'"), Файл.ПолноеИмя) ); Продолжить; КонецЕсли; @@ -1634,9 +1632,7 @@ ИмяБезРасширения = СтруктураПути.ИмяБезРасширения; Иначе ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при помещении файла - |""%1"" - |в программу.'"), + НСтр("ru = 'Не удалось поместить в программу файл ""%1"".'"), ВыбранноеИмяФайла); КонецЕсли; @@ -1835,7 +1831,7 @@ УдалитьФайлы(ИмяВременногоФайла); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), - "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; #КонецЕсли @@ -1863,10 +1859,9 @@ Функция ОшибкаСозданияНовогоФайла(ИнформацияОбОшибке) Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка создания нового файла. - | + НСтр("ru = 'Не удалось создать файл по причине: |%1'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецФункции @@ -2034,7 +2029,7 @@ НСтр("ru = 'Не удалось поместить файл ""%1"" в рабочий каталог на компьютер, |так как возможно он заблокирован другой программой.'"), Строка(ДанныеФайла.Ссылка)); - ВызватьИсключение ТекстОшибки + Символы.ПС + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ВызватьИсключение ТекстОшибки + Символы.ПС + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; // Запрос комментария и признака хранения версии. @@ -2158,7 +2153,7 @@ |""%1"". | |Повторить операцию?'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Оповещение = Новый ОписаниеОповещения("ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрованПовтор", ЭтотОбъект, ПараметрыВыполнения); ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ПовторитьОтмена); @@ -2295,7 +2290,7 @@ |с диска на компьютере в программу по причине: |%2.'"), Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ТекстСообщения,, Истина); ТекстВопроса = ТекстСообщения + Символы.ПС + Символы.ПС + НСтр("ru = 'Повторить операцию?'"); @@ -2584,7 +2579,7 @@ | |Повторить операцию?'"), Строка(ПараметрыВыполнения.ОбъектСсылка), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеБезРасширенияПослеОтветаНаВопросПовторить", ЭтотОбъект, ПараметрыВыполнения); ПоказатьВопрос(Обработчик, ТекстОшибки, РежимДиалогаВопрос.ПовторитьОтмена); @@ -2948,8 +2943,12 @@ КонецЕсли; ТекстОшибки = ""; + + ПараметрыЗанятияФайла = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыЗанятияФайла(); + ПараметрыЗанятияФайла.УникальныйИдентификатор = ПараметрыВыполнения.ИдентификаторФормы; + ФайлЗанят = РаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ПараметрыВыполнения.ДанныеФайла, ТекстОшибки, - ПараметрыВыполнения.ИдентификаторФормы); + ПараметрыЗанятияФайла); Если Не ФайлЗанят Тогда ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Неопределено); Возврат; @@ -3323,6 +3322,7 @@ // Продолжение процедуры (см. выше). // // Параметры: +// ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия // @@ -3408,6 +3408,7 @@ ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, ПараметрыВыполнения.ДанныеФайла.Расширение); + ПолучитьФайл(Адрес, ИмяФайла, Истина); ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); @@ -4273,8 +4274,12 @@ КонецЕсли; ТекстОшибки = ""; + + ПараметрыЗанятияФайла = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыЗанятияФайла(); + ПараметрыЗанятияФайла.УникальныйИдентификатор = ПараметрыВыполнения.УникальныйИдентификатор; + ФайлЗанят = РаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ПараметрыВыполнения.ДанныеФайла, - ТекстОшибки, ПараметрыВыполнения.УникальныйИдентификатор); + ТекстОшибки, ПараметрыЗанятияФайла); Если Не ФайлЗанят Тогда ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Неопределено); @@ -4369,7 +4374,7 @@ |Возможно он занят другим приложением. | |%2'"), - ПолноеИмяФайла, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ПолноеИмяФайла, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ТекстСообщения,, Истина); КонецПопытки; @@ -4862,7 +4867,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + Символы.ПС - + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); @@ -5017,7 +5022,7 @@ УдалитьФайлы(ПутьСПодкаталогом); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), - "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; КонецЕсли; КонецЕсли; @@ -5188,7 +5193,7 @@ УдалитьФайлы(ПутьСПодкаталогом); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), - "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; КонецЕсли; КонецЕсли; @@ -5251,7 +5256,6 @@ ОбщегоНазначенияСлужебныйКлиент.СократитьИмяФайла(ПараметрыВыполнения.ИмяФайла); - ПараметрыВыполнения.ПолноеИмяФайла = ""; Если Не ПустаяСтрока(ПараметрыВыполнения.ИмяФайла) Тогда ПараметрыВыполнения.ПолноеИмяФайла = ПараметрыВыполнения.ИмяКаталога @@ -5264,15 +5268,10 @@ Возврат; КонецЕсли; - Если ОбщегоНазначенияКлиент.ЭтоLinuxКлиент() Тогда - ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути = 10000; - Иначе - ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути = 260; - - Если НРег(ПараметрыВыполнения.ДанныеФайла.Расширение) = "xls" Или НРег(ПараметрыВыполнения.ДанныеФайла.Расширение) = "xlsx" Тогда - // Для Excel длина имени файла вместе с путем не должна превышать 218 знака. - ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути = 218; - КонецЕсли; + ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути = 260; + Если НРег(ПараметрыВыполнения.ДанныеФайла.Расширение) = "xls" Или НРег(ПараметрыВыполнения.ДанныеФайла.Расширение) = "xlsx" Тогда + // Для Excel длина имени файла вместе с путем не должна превышать 218 знака. + ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути = 218; КонецЕсли; МаксимальнаяДлинаИмениФайла = ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути - 5; // 5 - минимум для "C:\1\" @@ -5283,7 +5282,7 @@ ПутьКаталогаПользователя = КаталогДанныхПользователя(); МаксимальнаяДлинаИмениФайла = ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути - СтрДлина(ПутьКаталогаПользователя); - // Если имя файла плюс 5 превышает МаксимальнаяДлинаПолногоПути - пишем "Измените имя файла на более короткое. ОК" и выходим. + // Если имя файла плюс 5 превышает 260 - пишем "Измените имя файла на более короткое. ОК" и выходим. Если СтрДлина(ПараметрыВыполнения.ИмяФайла) > МаксимальнаяДлинаИмениФайла Тогда ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -5456,6 +5455,8 @@ Если ТипЗнч(ОписаниеДанных.РасшифрованныеДанные) = Тип("ДвоичныеДанные") Тогда АдресФайла = ПоместитьВоВременноеХранилище(ОписаниеДанных.РасшифрованныеДанные, ПараметрыВыполнения.ИдентификаторФормы); + ДанныеФайла = ПараметрыВыполнения.ОбработчикРезультата.ДополнительныеПараметры.ДанныеФайла; + ДанныеФайла.Кодировка = РаботаСФайламиСлужебныйКлиентСервер.ОпределитьКодировкуДвоичныхДанных(ОписаниеДанных.РасшифрованныеДанные, ДанныеФайла.Расширение); Иначе АдресФайла = ОписаниеДанных.РасшифрованныеДанные; КонецЕсли; @@ -6233,7 +6234,7 @@ |Возможно он занят другим приложением. | |%2'"), - Путь, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Путь, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ТекстСообщения,, Истина); КонецПопытки; @@ -6471,7 +6472,7 @@ |Возможно он занят другим приложением. | |%2'"), - ВыбранныйФайл.ПолноеИмя, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВыбранныйФайл.ПолноеИмя, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ТекстСообщения,, Истина); КонецПопытки; @@ -6712,7 +6713,7 @@ УдалитьФайлы(ВыборФайла.ПолноеИмяФайла); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), - "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; КонецЕсли; КонецЕсли; @@ -6818,7 +6819,7 @@ ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, Расширение); - + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Новый Структура("ПолноеИмяФайла", ИмяФайла)); КонецПроцедуры @@ -7836,7 +7837,7 @@ УдалитьФайлы(ПолныйПутьКФайлу); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), - "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; КонецЕсли; #КонецЕсли @@ -8238,7 +8239,7 @@ ПрочитатьСертификатыПодписейЦиклНачало(Контекст); Возврат; КонецПопытки; - + Контекст.Вставить("Сертификат", Сертификат); Сертификат.НачатьВыгрузку(Новый ОписаниеОповещения( "ПрочитатьСертификатыПодписейЦиклПослеВыгрузкиСертификата", ЭтотОбъект, Контекст, @@ -8341,17 +8342,60 @@ КонецЕсли; ОписаниеДанных = Новый Структура; - ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файла'")); - ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); - ОписаниеДанных.Вставить("Представление", ПрисоединенныйФайл); ОписаниеДанных.Вставить("ПоказатьКомментарий", Истина); - ОписаниеДанных.Вставить("Данные", ПараметрыВыполнения.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); + ПодписьМассиваФайлов = ТипЗнч(ПрисоединенныйФайл) = Тип("Массив"); - Если ОбработчикПриПолученииПодписи = Неопределено Тогда - ОписаниеДанных.Вставить("Объект", ПрисоединенныйФайл); + Если ПодписьМассиваФайлов И ПрисоединенныйФайл.Количество() > 1 Тогда + + ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файлов'")); + ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файлы'")); + + НаборДанных = Новый Массив; + ИндексФайла = 0; + Для Каждого Файл Из ПрисоединенныйФайл Цикл + + ОписаниеДанныхФайла = Новый Структура; + ОписаниеДанныхФайла.Вставить("Представление", Файл); + ОписаниеДанныхФайла.Вставить("Данные", ПараметрыВыполнения.ДанныеФайла[ИндексФайла].СсылкаНаДвоичныеДанныеФайла); + + Если ОбработчикПриПолученииПодписи = Неопределено Тогда + ОписаниеДанныхФайла.Вставить("Объект", Файл); + Иначе + ОписаниеДанныхФайла.Вставить("Объект", ОбработчикПриПолученииПодписи); + КонецЕсли; + + НаборДанных.Добавить(ОписаниеДанныхФайла); + ИндексФайла = ИндексФайла + 1; + + КонецЦикла; + + ОписаниеДанных.Вставить("НаборДанных", НаборДанных); + ОписаниеДанных.Вставить("ПредставлениеНабора", "Файлы (%1)"); + Иначе - ОписаниеДанных.Вставить("Объект", ОбработчикПриПолученииПодписи); + + ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файла'")); + ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); + + Если ПодписьМассиваФайлов Тогда + ОписаниеДанных.Вставить("Представление", ПрисоединенныйФайл[0]); + ОписаниеДанных.Вставить("Данные", ПараметрыВыполнения.ДанныеФайла[0].СсылкаНаДвоичныеДанныеФайла); + Если ОбработчикПриПолученииПодписи = Неопределено Тогда + ОписаниеДанных.Вставить("Объект", ПрисоединенныйФайл[0]); + Иначе + ОписаниеДанных.Вставить("Объект", ОбработчикПриПолученииПодписи); + КонецЕсли; + Иначе + ОписаниеДанных.Вставить("Представление", ПрисоединенныйФайл); + ОписаниеДанных.Вставить("Данные", ПараметрыВыполнения.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); + Если ОбработчикПриПолученииПодписи = Неопределено Тогда + ОписаниеДанных.Вставить("Объект", ПрисоединенныйФайл); + Иначе + ОписаниеДанных.Вставить("Объект", ОбработчикПриПолученииПодписи); + КонецЕсли; + КонецЕсли; + КонецЕсли; МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); @@ -8370,8 +8414,17 @@ КонецЕсли; Если ОписаниеДанных.Успех Тогда - ОповеститьОбИзменении(ПараметрыВыполнения.ПрисоединенныйФайл); - Оповестить("Запись_Файл", Новый Структура, ПараметрыВыполнения.ПрисоединенныйФайл); + Если ТипЗнч(ПараметрыВыполнения.ПрисоединенныйФайл) = Тип("Массив") Тогда + + Для Каждого Файл Из ПараметрыВыполнения.ПрисоединенныйФайл Цикл + ОповеститьОбИзменении(Файл); + Оповестить("Запись_Файл", Новый Структура, Файл); + КонецЦикла; + + Иначе + ОповеститьОбИзменении(ПараметрыВыполнения.ПрисоединенныйФайл); + Оповестить("Запись_Файл", Новый Структура, ПараметрыВыполнения.ПрисоединенныйФайл); + КонецЕсли; КонецЕсли; Если ПараметрыВыполнения.ОбработчикЗавершения <> Неопределено Тогда @@ -8519,16 +8572,40 @@ Возврат Ложь; КонецЕсли; - Если ЗначениеЗаполнено(ДанныеФайла.Редактирует) Тогда - ТекстПредупреждения = РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗанятогоФайла(); - ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, ТекстПредупреждения, ПараметрыВыполнения); - Возврат Ложь; - КонецЕсли; + Если ТипЗнч(ДанныеФайла) = Тип("Массив") Тогда + + Предупреждения = Новый Массив; + Для Каждого Файл Из ДанныеФайла Цикл + Если ЗначениеЗаполнено(Файл.Редактирует) Тогда + Предупреждения.Добавить(РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗанятогоФайла(Файл.Ссылка)); + Продолжить; + КонецЕсли; + + Если Файл.Зашифрован Тогда + Предупреждения.Добавить(РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗашифрованногоФайла(Файл.Ссылка)); + Продолжить; + КонецЕсли; + КонецЦикла; + + Если Предупреждения.Количество() > 0 Тогда + ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, СтрСоединить(Предупреждения, Символы.ПС), ПараметрыВыполнения); + Возврат Ложь; + КонецЕсли; + + Иначе + + Если ЗначениеЗаполнено(ДанныеФайла.Редактирует) Тогда + ТекстПредупреждения = РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗанятогоФайла(); + ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, ТекстПредупреждения, ПараметрыВыполнения); + Возврат Ложь; + КонецЕсли; + + Если ДанныеФайла.Зашифрован Тогда + ТекстПредупреждения = РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗашифрованногоФайла(); + ВернутьРезультатПослеПоказаПредупреждения(ОбработчикЗавершения, ТекстПредупреждения, ПараметрыВыполнения); + Возврат Ложь; + КонецЕсли; - Если ДанныеФайла.Зашифрован Тогда - ТекстПредупреждения = РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗашифрованногоФайла(); - ВернутьРезультатПослеПоказаПредупреждения(ОбработчикЗавершения, ТекстПредупреждения, ПараметрыВыполнения); - Возврат Ложь; КонецЕсли; Возврат Истина; @@ -8783,13 +8860,10 @@ Описание = Новый ОписаниеПередаваемогоФайла(ВыбранныйФайл.ПолноеИмя, ""); ПомещаемыеФайлы.Добавить(Описание); - ПомещенныеФайлы = Новый Массив; - + ПомещенныеФайлы = Новый Массив; Если Не ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ПараметрыВыполнения.ИдентификаторФормы) Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка помещения файла - |""%1"" - |во временное хранилище.'"), + НСтр("ru = 'Не удалось поместить файл во временное хранилище ""%1"".'"), ВыбранныйФайл.ПолноеИмя); КонецЕсли; @@ -8810,10 +8884,10 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); ОбщегоНазначенияКлиент.СообщитьПользователю(СообщениеОбОшибке); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), - "Ошибка", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке),,Истина); + "Ошибка", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке),,Истина); Запись = Новый Структура; Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя); @@ -9194,7 +9268,10 @@ // Формирование имени файла с расширением. ИмяФайла = ДанныеФайла.ПолноеНаименованиеВерсии; Расширение = ДанныеФайла.Расширение; - ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ИмяФайла, Расширение); + Если Не ПустаяСтрока(Расширение) Тогда + ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ИмяФайла, Расширение); + КонецЕсли; + ОбщегоНазначенияСлужебныйКлиент.СократитьИмяФайла(ИмяФайла); ПолноеИмяФайла = ""; @@ -9320,7 +9397,7 @@ УдалитьФайлы(ИмяКаталогаТестовое); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), - "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); // Нет прав на создание каталога, или такой путь отсутствует. ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -9656,7 +9733,7 @@ Исключение СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось сравнить файлы по причине: %1'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( НСтр("ru = 'Файлы.Сравнение файлов'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), "Ошибка", СообщениеОбОшибке, , Истина); @@ -9684,8 +9761,8 @@ Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( НСтр("ru = 'Файлы.Сравнение файлов'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), - "Ошибка", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); - ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + Символы.ПС + "Ошибка", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + ВызватьИсключение ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + Символы.ПС + НСтр("ru = 'Установите (переустановите) приложение OpenOffice.org Writer.'"); КонецПопытки; @@ -9724,8 +9801,8 @@ Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( НСтр("ru = 'Файлы.Сравнение файлов'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), - "Ошибка", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); - ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + Символы.ПС + "Ошибка", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + ВызватьИсключение ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + Символы.ПС + НСтр("ru = 'Установите (переустановите) приложение Microsoft Word.'"); КонецПопытки; ОбъектWord.Visible = 0; @@ -9738,8 +9815,8 @@ Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( НСтр("ru = 'Файлы.Сравнение файлов'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), - "Ошибка", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); - ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + "Ошибка", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + ВызватьИсключение ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; ОбъектWord.Visible = 1; @@ -10100,7 +10177,7 @@ СтандартнаяОбработка = Ложь; Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда - Контекст.РезультатДействий.ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + Контекст.РезультатДействий.ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); Иначе Контекст.РезультатДействий.ОписаниеОшибки = ИнформацияОбОшибке; КонецЕсли; @@ -10766,7 +10843,7 @@ Попытка СоздатьКаталог(КаталогСохранения); Исключение - СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); СообщениеОбОшибке = НСтр("ru = 'Ошибка создания каталога на диске:'") + " " + СообщениеОбОшибке; ОбщегоНазначенияКлиент.СообщитьПользователю(СообщениеОбОшибке); Возврат Ложь; @@ -10779,7 +10856,7 @@ УдалитьФайлы(КаталогСохранения + ИмяФайла); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), - "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; КонецЕсли; @@ -10832,7 +10909,7 @@ УдалитьФайлы(ИмяФайлаСПутем); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), - "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); Результат = Неопределено; КонецПопытки; Результат = Истина; diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентСервер/Module.bsl index 82224dd27..8ee3c014f 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентСервер/Module.bsl @@ -93,7 +93,7 @@ НСтр("ru = 'Не удалось создать каталог ""%1"": |""%2"".'"), ПолныйПодКаталог, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) ); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) ); КонецПопытки; КонецЕсли; @@ -327,10 +327,12 @@ АдресОбъекта = Href; Если Не ПустаяСтрока(Сервис) Тогда - Если Сервис = "https://webdav.yandex.ru" Тогда - АдресОбъекта = СтрЗаменить(Href, "https://webdav.yandex.ru", "https://disk.yandex.ru/client/disk"); - ИначеЕсли Сервис = "https://webdav.yandex.com" Тогда + Если Сервис = "https://webdav.yandex.com" Тогда АдресОбъекта = СтрЗаменить(Href, "https://webdav.yandex.com", "https://disk.yandex.com/client/disk"); + // Локализация + ИначеЕсли Сервис = "https://webdav.yandex.ru" Тогда + АдресОбъекта = СтрЗаменить(Href, "https://webdav.yandex.ru", "https://disk.yandex.ru/client/disk"); + // Конец Локализация ИначеЕсли Сервис = "https://dav.box.com/dav" Тогда АдресОбъекта = "https://app.box.com/files/0/"; ИначеЕсли Сервис = "https://dav.dropdav.com" Тогда @@ -342,6 +344,25 @@ КонецФункции +// Параметры занятия файла на редактирование. +// +// Возвращаемое значение: +// Структура +// * УникальныйИдентификатор - уникальный идентификатор формы. +// * Пользователь - СправочникСсылка.Пользователи +// * ДополнительныеСвойства - Структура - дополнительные свойства для записи файла. + +Функция ПараметрыЗанятияФайла() Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("УникальныйИдентификатор"); + Параметры.Вставить("Пользователь"); + Параметры.Вставить("ДополнительныеСвойства"); + + Возврат Параметры; + +КонецФункции + #Область ИзвлечениеТекста // Извлекает текст в соответствии с кодировкой. @@ -415,7 +436,7 @@ КонецФункции -#КонецОбласти +#КонецОбласти #КонецОбласти @@ -573,4 +594,313 @@ КонецПроцедуры +// Автоматически определяет и возвращает кодировку текстового файла. +// +// Параметры: +// ДвоичныеДанные - ОпределяемыйТип.ДвоичныеДанные +// Расширение - Строка - расширение файла. +// +// Возвращаемое значение: +// Строка +// +Функция ОпределитьКодировкуДвоичныхДанных(ДвоичныеДанные, Расширение) Экспорт + + Кодировка = Неопределено; + + Если ДвоичныеДанные <> Неопределено Тогда + Кодировка = КодировкаИзДвоичныхДанных(ДвоичныеДанные); + Если Не ЗначениеЗаполнено(Кодировка) Тогда + Если СтрЗаканчиваетсяНа(НРег(Расширение), "xml") Тогда + Кодировка = КодировкаИзОбъявленияXML(ДвоичныеДанные); + Иначе + Кодировка = КодировкаИзСоответствияАлфавиту(ДвоичныеДанные); + КонецЕсли; + + Если НРег(Кодировка) = "utf-8" Тогда + Кодировка = НРег(Кодировка) + "_WithoutBOM"; + КонецЕсли; + + КонецЕсли; + КонецЕсли; + Возврат Кодировка; + +КонецФункции + +// Возвращает кодировку, полученную из двоичных данных файла, если +// файл содержит сигнатуру BOM в начале. +// +// Параметры: +// ДвоичныеДанные - ДвоичныеДанные - двоичные данные файла. +// +// Возвращаемое значение: +// Строка - кодировка файла. Если файл не содержит сигнатуру BOM, +// возвращает пустую строку. +// +Функция КодировкаИзДвоичныхДанных(ДвоичныеДанные) + + ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные); + БуферДвоичныхДанных = ЧтениеДанных.ПрочитатьВБуферДвоичныхДанных(5); + + Возврат КодировкаBOM(БуферДвоичныхДанных); + +КонецФункции + +// Возвращает кодировку, полученную из двоичных данных файла, если +// файл содержит объявление XML. +// +// Параметры: +// ДвоичныеДанные - ДвоичныеДанные- двоичные данные файла. +// +// Возвращаемое значение: +// Строка - кодировка файла. Если невозможно прочитать +// объявление XML, возвращает пустую строку. +// +Функция КодировкаИзОбъявленияXML(ДвоичныеДанные) + +#Если ВебКлиент Тогда + Строка = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные); + ПервыйТег = СтрРазделить(Строка, ">", Ложь)[0]; + Кодировка = Сред(ПервыйТег, СтрНайти(ПервыйТег, "encoding") + 10); + КодировкаXML = СтрРазделить(Кодировка, """")[0]; +#Иначе + БуферДвоичныхДанных = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ДвоичныеДанные); + ПотокВПамяти = Новый ПотокВПамяти(БуферДвоичныхДанных); + КодировкаXML = ""; + + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.ОткрытьПоток(ПотокВПамяти); + Попытка + ЧтениеXML.ПерейтиКСодержимому(); + КодировкаXML = ЧтениеXML.КодировкаXML; + Исключение + КодировкаXML = ""; + КонецПопытки; + ЧтениеXML.Закрыть(); + ПотокВПамяти.Закрыть(); +#КонецЕсли + Возврат КодировкаXML; + +КонецФункции + +// Возвращает кодировку текста, полученную из сигнатуры BOM в начале. +// +// Параметры: +// БуферДвоичныхДанных - Число - коллекция байтов для определения кодировки. +// +// Возвращаемое значение: +// Строка - кодировка файла. Если файл не содержит сигнатуру BOM, +// возвращает пустую строку. +// +Функция КодировкаBOM(БуферДвоичныхДанных) + + ПрочитанныеБайты = Новый Массив(5); + Для Индекс = 0 По 4 Цикл + Если Индекс < БуферДвоичныхДанных.Размер Тогда + ПрочитанныеБайты[Индекс] = БуферДвоичныхДанных[Индекс]; + Иначе + ПрочитанныеБайты[Индекс] = ЧислоИзШестнадцатеричнойСтроки("0xA5"); + КонецЕсли; + КонецЦикла; + + Если ПрочитанныеБайты[0] = ЧислоИзШестнадцатеричнойСтроки("0xFE") + И ПрочитанныеБайты[1] = ЧислоИзШестнадцатеричнойСтроки("0xFF") Тогда + Кодировка = "UTF-16BE"; + ИначеЕсли ПрочитанныеБайты[0] = ЧислоИзШестнадцатеричнойСтроки("0xFF") + И ПрочитанныеБайты[1] = ЧислоИзШестнадцатеричнойСтроки("0xFE") Тогда + Если ПрочитанныеБайты[2] = ЧислоИзШестнадцатеричнойСтроки("0x00") + И ПрочитанныеБайты[3] = ЧислоИзШестнадцатеричнойСтроки("0x00") Тогда + Кодировка = "UTF-32LE"; + Иначе + Кодировка = "UTF-16LE"; + КонецЕсли; + ИначеЕсли ПрочитанныеБайты[0] = ЧислоИзШестнадцатеричнойСтроки("0xEF") + И ПрочитанныеБайты[1] = ЧислоИзШестнадцатеричнойСтроки("0xBB") + И ПрочитанныеБайты[2] = ЧислоИзШестнадцатеричнойСтроки("0xBF") Тогда + Кодировка = "UTF-8"; + ИначеЕсли ПрочитанныеБайты[0] = ЧислоИзШестнадцатеричнойСтроки("0x00") + И ПрочитанныеБайты[1] = ЧислоИзШестнадцатеричнойСтроки("0x00") + И ПрочитанныеБайты[2] = ЧислоИзШестнадцатеричнойСтроки("0xFE") + И ПрочитанныеБайты[3] = ЧислоИзШестнадцатеричнойСтроки("0xFF") Тогда + Кодировка = "UTF-32BE"; + ИначеЕсли ПрочитанныеБайты[0] = ЧислоИзШестнадцатеричнойСтроки("0x0E") + И ПрочитанныеБайты[1] = ЧислоИзШестнадцатеричнойСтроки("0xFE") + И ПрочитанныеБайты[2] = ЧислоИзШестнадцатеричнойСтроки("0xFF") Тогда + Кодировка = "SCSU"; + ИначеЕсли ПрочитанныеБайты[0] = ЧислоИзШестнадцатеричнойСтроки("0xFB") + И ПрочитанныеБайты[1] = ЧислоИзШестнадцатеричнойСтроки("0xEE") + И ПрочитанныеБайты[2] = ЧислоИзШестнадцатеричнойСтроки("0x28") Тогда + Кодировка = "BOCU-1"; + ИначеЕсли ПрочитанныеБайты[0] = ЧислоИзШестнадцатеричнойСтроки("0x2B") + И ПрочитанныеБайты[1] = ЧислоИзШестнадцатеричнойСтроки("0x2F") + И ПрочитанныеБайты[2] = ЧислоИзШестнадцатеричнойСтроки("0x76") + И (ПрочитанныеБайты[3] = ЧислоИзШестнадцатеричнойСтроки("0x38") + Или ПрочитанныеБайты[3] = ЧислоИзШестнадцатеричнойСтроки("0x39") + Или ПрочитанныеБайты[3] = ЧислоИзШестнадцатеричнойСтроки("0x2B") + Или ПрочитанныеБайты[3] = ЧислоИзШестнадцатеричнойСтроки("0x2F")) Тогда + Кодировка = "UTF-7"; + ИначеЕсли ПрочитанныеБайты[0] = ЧислоИзШестнадцатеричнойСтроки("0xDD") + И ПрочитанныеБайты[1] = ЧислоИзШестнадцатеричнойСтроки("0x73") + И ПрочитанныеБайты[2] = ЧислоИзШестнадцатеричнойСтроки("0x66") + И ПрочитанныеБайты[3] = ЧислоИзШестнадцатеричнойСтроки("0x73") Тогда + Кодировка = "UTF-EBCDIC"; + Иначе + Кодировка = ""; + КонецЕсли; + + Возврат Кодировка; + +КонецФункции + +// Возвращает наиболее подходящую кодировку текста, полученную путем сравнения с алфавитом. +// +// Параметры: +// ДанныеТекста - ДвоичныеДанные - двоичные данные файла. +// +// Возвращаемое значение: +// Строка - кодировка файла. +// +Функция КодировкаИзСоответствияАлфавиту(ДанныеТекста) + + Кодировки = Кодировки(); + Кодировки.Удалить(Кодировки.НайтиПоЗначению("utf-8_WithoutBOM")); + + КодировкаKOI8R = Кодировки.НайтиПоЗначению("koi8-r"); + Кодировки.Сдвинуть(КодировкаKOI8R, -Кодировки.Индекс(КодировкаKOI8R)); + + КодировкаWin1251 = Кодировки.НайтиПоЗначению("windows-1251"); + Кодировки.Сдвинуть(КодировкаWin1251, -Кодировки.Индекс(КодировкаWin1251)); + + КодировкаUTF8 = Кодировки.НайтиПоЗначению("utf-8"); + Кодировки.Сдвинуть(КодировкаUTF8, -Кодировки.Индекс(КодировкаUTF8)); + + СоответствующаяКодировка = ""; + МаксимальноеСоответствиеКодировки = 0; + Для Каждого Кодировка Из Кодировки Цикл + + СоответствиеКодировки = ПроцентСоответствияАлфавиту(ДанныеТекста, Кодировка.Значение); + Если СоответствиеКодировки > 0.95 Тогда + Возврат Кодировка.Значение; + КонецЕсли; + + Если СоответствиеКодировки > МаксимальноеСоответствиеКодировки Тогда + СоответствующаяКодировка = Кодировка.Значение; + МаксимальноеСоответствиеКодировки = СоответствиеКодировки; + КонецЕсли; + + КонецЦикла; + + Возврат СоответствующаяКодировка; + +КонецФункции + +Функция ПроцентСоответствияАлфавиту(ДвоичныеДанные, ПроверяемаяКодировка) + + // АПК:1036-выкл, АПК:163-выкл - алфавит не требует проверки орфографии. + Алфавит = "АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя" + + "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz" + + "1234567890 "; + // АПК:1036-вкл, АПК:163-вкл + + ПотокАлфавита = Новый ПотокВПамяти(); + ЗаписьАлфавита = Новый ЗаписьДанных(ПотокАлфавита); + ЗаписьАлфавита.ЗаписатьСтроку(Алфавит, ПроверяемаяКодировка); + ЗаписьАлфавита.Закрыть(); + + ДанныеАлфавита = ПотокАлфавита.ЗакрытьИПолучитьДвоичныеДанные(); + ЧтениеДанныхАлфавита = Новый ЧтениеДанных(ДанныеАлфавита); + БуферАлфавитаВКодировке = ЧтениеДанныхАлфавита.ПрочитатьВБуферДвоичныхДанных(); + + Индекс = 0; + СимволыАлфавита = Новый Массив; + Пока Индекс <= БуферАлфавитаВКодировке.Размер - 1 Цикл + + ТекущийСимвол = БуферАлфавитаВКодировке[Индекс]; + + // Символы кириллицы в кодировке UTF-8 - двухбайтовые. + Если ПроверяемаяКодировка = "utf-8" + И (ТекущийСимвол = 208 + Или ТекущийСимвол = 209) Тогда + + Индекс = Индекс + 1; + ТекущийСимвол = Формат(ТекущийСимвол, "ЧН=0; ЧГ=") + Формат(БуферАлфавитаВКодировке[Индекс], "ЧН=0; ЧГ="); + КонецЕсли; + + Индекс = Индекс + 1; + СимволыАлфавита.Добавить(ТекущийСимвол); + + КонецЦикла; + + ЧтениеДанныхТекста = Новый ЧтениеДанных(ДвоичныеДанные); + БуферДанныхТекста = ЧтениеДанныхТекста.ПрочитатьВБуферДвоичныхДанных(?(ПроверяемаяКодировка = "utf-8", 200, 100)); + РазмерБуфераТекста = БуферДанныхТекста.Размер; + КоличествоСимволов = РазмерБуфераТекста; + + Индекс = 0; + КоличествоВхождений = 0; + Пока Индекс <= РазмерБуфераТекста - 1 Цикл + + ТекущийСимвол = БуферДанныхТекста[Индекс]; + Если ПроверяемаяКодировка = "utf-8" + И (ТекущийСимвол = 208 + Или ТекущийСимвол = 209) Тогда + + // Если последний байт в буфере является первым байтом двухбайтового символа, игнорируем его. + Если Индекс = РазмерБуфераТекста - 1 Тогда + Прервать; + КонецЕсли; + + Индекс = Индекс + 1; + КоличествоСимволов = КоличествоСимволов - 1; + ТекущийСимвол = Формат(ТекущийСимвол, "ЧН=0; ЧГ=") + Формат(БуферДанныхТекста[Индекс], "ЧН=0; ЧГ="); + + КонецЕсли; + + Индекс = Индекс + 1; + Если СимволыАлфавита.Найти(ТекущийСимвол) <> Неопределено Тогда + КоличествоВхождений = КоличествоВхождений + 1; + КонецЕсли; + + КонецЦикла; + + Возврат ?(КоличествоСимволов = 0, 100, КоличествоВхождений/КоличествоСимволов); + +КонецФункции + +// Возвращает таблицу имен кодировок. +// +// Возвращаемое значение: +// СписокЗначений: +// * Значение - Строка - например "ibm852". +// * Представление - Строка - например "ibm852 (Центральноевропейская DOS)". +// +Функция Кодировки() Экспорт + + СписокКодировок = Новый СписокЗначений; + + СписокКодировок.Добавить("ibm852", НСтр("ru = 'IBM852 (Центральноевропейская DOS)'")); + СписокКодировок.Добавить("ibm866", НСтр("ru = 'IBM866 (Кириллица DOS)'")); + СписокКодировок.Добавить("iso-8859-1", НСтр("ru = 'ISO-8859-1 (Западноевропейская ISO)'")); + СписокКодировок.Добавить("iso-8859-2", НСтр("ru = 'ISO-8859-2 (Центральноевропейская ISO)'")); + СписокКодировок.Добавить("iso-8859-3", НСтр("ru = 'ISO-8859-3 (Латиница 3 ISO)'")); + СписокКодировок.Добавить("iso-8859-4", НСтр("ru = 'ISO-8859-4 (Балтийская ISO)'")); + СписокКодировок.Добавить("iso-8859-5", НСтр("ru = 'ISO-8859-5 (Кириллица ISO)'")); + СписокКодировок.Добавить("iso-8859-7", НСтр("ru = 'ISO-8859-7 (Греческая ISO)'")); + СписокКодировок.Добавить("iso-8859-9", НСтр("ru = 'ISO-8859-9 (Турецкая ISO)'")); + СписокКодировок.Добавить("iso-8859-15", НСтр("ru = 'ISO-8859-15 (Латиница 9 ISO)'")); + СписокКодировок.Добавить("koi8-r", НСтр("ru = 'KOI8-R (Кириллица KOI8-R)'")); + СписокКодировок.Добавить("koi8-u", НСтр("ru = 'KOI8-U (Кириллица KOI8-U)'")); + СписокКодировок.Добавить("us-ascii", НСтр("ru = 'US-ASCII (США)'")); + СписокКодировок.Добавить("utf-8", НСтр("ru = 'UTF-8 (Юникод UTF-8)'")); + СписокКодировок.Добавить("utf-8_WithoutBOM", НСтр("ru = 'UTF-8 (Юникод UTF-8 без BOM)'")); + СписокКодировок.Добавить("windows-1250", НСтр("ru = 'Windows-1250 (Центральноевропейская Windows)'")); + СписокКодировок.Добавить("windows-1251", НСтр("ru = 'windows-1251 (Кириллица Windows)'")); + СписокКодировок.Добавить("windows-1252", НСтр("ru = 'Windows-1252 (Западноевропейская Windows)'")); + СписокКодировок.Добавить("windows-1253", НСтр("ru = 'Windows-1253 (Греческая Windows)'")); + СписокКодировок.Добавить("windows-1254", НСтр("ru = 'Windows-1254 (Турецкая Windows)'")); + СписокКодировок.Добавить("windows-1257", НСтр("ru = 'Windows-1257 (Балтийская Windows)'")); + + Возврат СписокКодировок; + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйПовтИсп/Module.bsl index 73388f792..1a6affa7f 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйПовтИсп/Module.bsl @@ -200,7 +200,7 @@ // Функция ЭтоУзелРаспределеннойИнформационнойБазы(ПолноеИмяПланаОбмена) Экспорт - Возврат Метаданные.НайтиПоПолномуИмени(ПолноеИмяПланаОбмена).РаспределеннаяИнформационнаяБаза; + Возврат ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяПланаОбмена).РаспределеннаяИнформационнаяБаза; КонецФункции diff --git a/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl index b7899f24d..c33cb2eb0 100644 --- a/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl @@ -35,15 +35,17 @@ Возврат Ложь; КонецЕсли; + РассылкаОбъект = Рассылка.ПолучитьОбъект(); + // Проверка базовых реквизитов рассылки. - Если Не Рассылка.Подготовлена - Или Рассылка.ПометкаУдаления Тогда + Если Не РассылкаОбъект.Подготовлена + Или РассылкаОбъект.ПометкаУдаления Тогда Причина = ""; - Если Не Рассылка.Подготовлена Тогда + Если Не РассылкаОбъект.Подготовлена Тогда Причина = Причина + Символы.ПС + НСтр("ru = 'Рассылка не подготовлена'"); КонецЕсли; - Если Рассылка.ПометкаУдаления Тогда + Если РассылкаОбъект.ПометкаУдаления Тогда Причина = Причина + Символы.ПС + НСтр("ru = 'Рассылка помечена на удаление'"); КонецЕсли; @@ -61,7 +63,7 @@ // Форматы по умолчанию ФорматыПоУмолчанию = Новый Массив; - Найденные = Рассылка.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", ПустоеЗначениеОтчета())); + Найденные = РассылкаОбъект.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", ПустоеЗначениеОтчета())); Для Каждого СтрокаФормат Из Найденные Цикл ФорматыПоУмолчанию.Добавить(СтрокаФормат.Формат); КонецЦикла; @@ -79,7 +81,7 @@ // Заполнение таблицы отчетов ТаблицаОтчетов = ОтчетыДляРассылки(); - Для Каждого СтрокаОтчет Из Рассылка.Отчеты Цикл + Для Каждого СтрокаОтчет Из РассылкаОбъект.Отчеты Цикл Стр = ТаблицаОтчетов.Добавить(); Стр.Отчет = СтрокаОтчет.Отчет; Стр.ОтправлятьЕслиПустой = СтрокаОтчет.ОтправлятьЕслиПустой; @@ -97,7 +99,7 @@ КонецЕсли; // Форматы - Найденные = Рассылка.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", СтрокаОтчет.Отчет)); + Найденные = РассылкаОбъект.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", СтрокаОтчет.Отчет)); Если Найденные.Количество() = 0 Тогда Стр.Форматы = ФорматыПоУмолчанию; Иначе @@ -109,11 +111,12 @@ // Подготовка параметров доставки. ПараметрыДоставки = ПараметрыДоставки(); - ПараметрыДоставки.ИспользоватьПапку = Рассылка.ИспользоватьПапку; - ПараметрыДоставки.ИспользоватьСетевойКаталог = Рассылка.ИспользоватьСетевойКаталог; - ПараметрыДоставки.ИспользоватьFTPРесурс = Рассылка.ИспользоватьFTPРесурс; - ПараметрыДоставки.ИспользоватьЭлектроннуюПочту = Рассылка.ИспользоватьЭлектроннуюПочту; - ПараметрыДоставки.ТранслитерироватьИменаФайлов = Рассылка.ТранслитерироватьИменаФайлов; + ПараметрыДоставки.ИспользоватьПапку = РассылкаОбъект.ИспользоватьПапку; + ПараметрыДоставки.ИспользоватьСетевойКаталог = РассылкаОбъект.ИспользоватьСетевойКаталог; + ПараметрыДоставки.ИспользоватьFTPРесурс = РассылкаОбъект.ИспользоватьFTPРесурс; + ПараметрыДоставки.ИспользоватьЭлектроннуюПочту = РассылкаОбъект.ИспользоватьЭлектроннуюПочту; + ПараметрыДоставки.ТранслитерироватьИменаФайлов = РассылкаОбъект.ТранслитерироватьИменаФайлов; + ПараметрыДоставки.Личная = РассылкаОбъект.Личная; // Проверки отмеченных способов доставки. Если Не ПараметрыДоставки.ИспользоватьПапку @@ -124,51 +127,48 @@ Возврат Ложь; КонецЕсли; - ПараметрыДоставки.Персонализирована = Рассылка.Персонализирована; - ПараметрыДоставки.Архивировать = Рассылка.Архивировать; - ПараметрыДоставки.ИмяАрхива = Рассылка.ИмяАрхива; - - УстановитьПривилегированныйРежим(Истина); - ПараметрыДоставки.ПарольАрхива = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Рассылка, "ПарольАрхива"); - УстановитьПривилегированныйРежим(Ложь); + ПараметрыДоставки.Персонализирована = РассылкаОбъект.Персонализирована; + ПараметрыДоставки.Архивировать = РассылкаОбъект.Архивировать; + ПараметрыДоставки.ИмяАрхива = РассылкаОбъект.ИмяАрхива; // Подготовка параметров доставки в папку. Если ПараметрыДоставки.ИспользоватьПапку Тогда - ПараметрыДоставки.Папка = Рассылка.Папка; + ПараметрыДоставки.Папка = РассылкаОбъект.Папка; КонецЕсли; // Подготовка параметров доставки в сетевой каталог. Если ПараметрыДоставки.ИспользоватьСетевойКаталог Тогда - ПараметрыДоставки.СетевойКаталогWindows = Рассылка.СетевойКаталогWindows; - ПараметрыДоставки.СетевойКаталогLinux = Рассылка.СетевойКаталогLinux; + ПараметрыДоставки.СетевойКаталогWindows = РассылкаОбъект.СетевойКаталогWindows; + ПараметрыДоставки.СетевойКаталогLinux = РассылкаОбъект.СетевойКаталогLinux; КонецЕсли; // Подготовка параметров доставки на FTP ресурс. Если ПараметрыДоставки.ИспользоватьFTPРесурс Тогда - ПараметрыДоставки.Сервер = Рассылка.FTPСервер; - ПараметрыДоставки.Порт = Рассылка.FTPПорт; - ПараметрыДоставки.Логин = Рассылка.FTPЛогин; + ПараметрыДоставки.Сервер = РассылкаОбъект.FTPСервер; + ПараметрыДоставки.Порт = РассылкаОбъект.FTPПорт; + ПараметрыДоставки.Логин = РассылкаОбъект.FTPЛогин; УстановитьПривилегированныйРежим(Истина); ПараметрыДоставки.Пароль = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Рассылка, "FTPПароль"); УстановитьПривилегированныйРежим(Ложь); - ПараметрыДоставки.Каталог = Рассылка.FTPКаталог; - ПараметрыДоставки.ПассивноеСоединение = Рассылка.FTPПассивноеСоединение; + ПараметрыДоставки.Каталог = РассылкаОбъект.FTPКаталог; + ПараметрыДоставки.ПассивноеСоединение = РассылкаОбъект.FTPПассивноеСоединение; КонецЕсли; - ПараметрыДоставки.ВключатьДатуВИмяФайла = Рассылка.ВключатьДатуВИмяФайла + ПараметрыДоставки.ВключатьДатуВИмяФайла = РассылкаОбъект.ВключатьДатуВИмяФайла И (ПараметрыДоставки.ИспользоватьПапку Или ПараметрыДоставки.ИспользоватьСетевойКаталог Или ПараметрыДоставки.ИспользоватьFTPРесурс); // Подготовка параметров доставки по электронной почте. Если ПараметрыДоставки.ИспользоватьЭлектроннуюПочту Тогда - ПараметрыДоставки.УчетнаяЗапись = Рассылка.УчетнаяЗапись; - ПараметрыДоставки.ТолькоУведомить = Рассылка.ТолькоУведомить; - ПараметрыДоставки.СкрытыеКопии = Рассылка.СкрытыеКопии; - ПараметрыДоставки.ШаблонТемы = Рассылка.ТемаПисьма; - ПараметрыДоставки.ШаблонТекста = ?(Рассылка.ПисьмоВФорматеHTML, Рассылка.ТекстПисьмаВФорматеHTML, Рассылка.ТекстПисьма); + ПараметрыДоставки.УчетнаяЗапись = РассылкаОбъект.УчетнаяЗапись; + ПараметрыДоставки.ТолькоУведомить = РассылкаОбъект.ТолькоУведомить; + ПараметрыДоставки.СкрытыеКопии = РассылкаОбъект.СкрытыеКопии; + ПараметрыДоставки.ШаблонТемы = РассылкаОбъект.ТемаПисьма; + ПараметрыДоставки.ШаблонТекста = ?(РассылкаОбъект.ПисьмоВФорматеHTML, + РассылкаОбъект.ТекстПисьмаВФорматеHTML, РассылкаОбъект.ТекстПисьма); ПолучателиРассылкиВыбранны = ПолучателиРассылкиВыбранны( Рассылка, ПараметрыДоставки, ПараметрыЖурнала, ДополнительныеНастройки); @@ -177,23 +177,16 @@ Возврат Ложь; КонецЕсли; - ТипТекста = ?(Рассылка.ПисьмоВФорматеHTML, "HTML", "ПростойТекст"); - Картинки = Новый Структура; - - ПараметрыПисьма = Новый Структура; - ПараметрыПисьма.Вставить("ТипТекста", ТипТекста); - ПараметрыПисьма.Вставить("Картинки", Картинки); + ПараметрыДоставки.ПараметрыПисьма.ТипТекста = ?(РассылкаОбъект.ПисьмоВФорматеHTML, "HTML", "ПростойТекст"); + ПараметрыДоставки.ПараметрыПисьма.АдресОтвета = РассылкаОбъект.АдресОтвета; Если Рассылка.ПисьмоВФорматеHTML Тогда - ПараметрыПисьма.Картинки = Рассылка.КартинкиПисьмаВФорматеHTML.Получить(); + КартинкиПисьмаВФорматеHTML = Рассылка.КартинкиПисьмаВФорматеHTML.Получить(); + Если КартинкиПисьмаВФорматеHTML <> Неопределено Тогда + ПараметрыДоставки.Картинки = КартинкиПисьмаВФорматеHTML; + КонецЕсли; КонецЕсли; - Если ЗначениеЗаполнено(Рассылка.АдресОтвета) Тогда - ПараметрыПисьма.Вставить("АдресОтвета", Рассылка.АдресОтвета); - КонецЕсли; - - ПараметрыДоставки.ПараметрыПисьма = ПараметрыПисьма; - КонецЕсли; Если Не ПараметрыДоставки.ЗапускЗафиксирован Тогда @@ -302,7 +295,8 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Отчет ''%1'' не сформирован:'"), ПредставлениеОтчета); - ЗаписьЖурнала(ПараметрыЖурнала,, ТекстСообщения, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурнала(ПараметрыЖурнала, , ТекстСообщения, ОбработкаОшибок.ПодробноеПредставлениеОшибки( + ИнформацияОбОшибке())); КонецПопытки; КонецЦикла; @@ -330,6 +324,25 @@ ОтправлятьСкрытыеКопииОтправителю = Ложь; КонецЕсли; + // Подготовка к отправке личных отчетов (персонализированных). + СписокПолучателей = Новый Массив(); + Для Каждого СтрокаПолучатель Из ДеревоОтчетов.Строки Цикл + Если СтрокаПолучатель = ПараметрыДоставки.СтрокаОбщихОтчетов Тогда + Продолжить; // Пропустить строку дерева общих отчетов. + КонецЕсли; + СписокПолучателей.Добавить(СтрокаПолучатель.Ключ); + КонецЦикла; + + Если СписокПолучателей.Количество() > 0 Тогда + УстановитьПривилегированныйРежим(Истина); + ПаролиАрхивовПолучателей = ОбщегоНазначения.ПрочитатьДанныеВладельцевИзБезопасногоХранилища(СписокПолучателей, + "ПарольАрхива"); + УстановитьПривилегированныйРежим(Ложь); + Если ДоступноШифрованиеВложений() Тогда + СертификатыШифрованияПолучателей = ПолучитьСертификатыШифрованияПолучателейРассылки(СписокПолучателей); + КонецЕсли; + КонецЕсли; + ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Примечание, НСтр("ru = 'Начало доставки отчетов получателям.'")); @@ -350,38 +363,77 @@ // Объединение общих и личных вложений. ВложенияПолучателя = ОбъединитьМассивы(ОбщиеВложения, ЛичныеВложения); - + // Формирование представления отчетов. СформироватьПредставлениеОтчетовДляПолучателя(ПараметрыДоставки, СтрокаПолучатель); + + // Получение индивидуального пароля на архив и сертификата для шифрования + Если ПараметрыДоставки.Архивировать Тогда + ПарольАрхива = ПаролиАрхивовПолучателей.Получить(СтрокаПолучатель.Ключ); + ПараметрыДоставки.ПарольАрхива = ""; + Если ПарольАрхива <> Неопределено Тогда + ПараметрыДоставки.ПарольАрхива = ПарольАрхива; + КонецЕсли; + КонецЕсли; + + Если ДоступноШифрованиеВложений() Тогда + ПараметрыОтбора = Новый Структура("ПолучательРассылки", СтрокаПолучатель.Ключ); + НайденныеСтроки = СертификатыШифрованияПолучателей.НайтиСтроки(ПараметрыОтбора); + ПараметрыДоставки.СертификатДляШифрования = ?(НайденныеСтроки.Количество() > 0, + НайденныеСтроки[0].СертификатДляШифрования, Неопределено); + КонецЕсли; + // Шифрование каждого файла, если не выбрано архивирование + Если ЗначениеЗаполнено(ПараметрыДоставки.СертификатДляШифрования) И НЕ ПараметрыДоставки.Архивировать Тогда + Для Каждого Вложение Из ВложенияПолучателя Цикл + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + ВложениеДвоичныеДанные = МодульЭлектроннаяПодпись.Зашифровать(Новый ДвоичныеДанные(Вложение.Значение), + ПараметрыДоставки.СертификатДляШифрования); + ВложениеДвоичныеДанные.Записать(Вложение.Значение); + КонецЦикла; + КонецЕсли; + // Архивация вложений. АрхивацияВложений(ВложенияПолучателя, ПараметрыДоставки, СтрокаПолучатель.Значение); - + АдресПолучателя = ПараметрыДоставки.Получатели[СтрокаПолучатель.Ключ]; ПредставлениеПолучателя = Строка(СтрокаПолучатель.Ключ) + " (" + АдресПолучателя + ")"; // Доставка. Попытка - ОтправитьОтчетыПолучателю(ВложенияПолучателя, ПараметрыДоставки, СтрокаПолучатель); + ОтправитьОтчетыПолучателю(ВложенияПолучателя, ПараметрыДоставки, ПараметрыЖурнала, СтрокаПолучатель); РассылкаВыполнена = Истина; ПараметрыДоставки.ВыполненаПоЭлектроннойПочте = Истина; - + ДополнительныеСведения = ""; - Если ОтправлятьСкрытыеКопииОтправителю Тогда + Если ОтправлятьСкрытыеКопииОтправителю Тогда ДополнительныеСведения = НСтр("ru = 'Копия направлена отправителю.'"); КонецЕсли; - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Отчеты отправлены ''%1'' от %2. %3'"), - ПредставлениеПолучателя, ПредставлениеОтправителя, ДополнительныеСведения); - - ЗаписьЖурнала(ПараметрыЖурнала,, ТекстСообщения); + НСтр("ru = 'Отчеты отправлены ''%1'' от %2. %3'"), ПредставлениеПолучателя, ПредставлениеОтправителя, + ДополнительныеСведения); + + ЗаписьЖурнала(ПараметрыЖурнала, , ТекстСообщения); + Исключение ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось отправить отчеты получателю ''%1'':'"), ПредставлениеПолучателя); РасширенноеПредставлениеОшибки = РаботаСПочтовымиСообщениями.РасширенноеПредставлениеОшибки( ИнформацияОбОшибке(), ОбщегоНазначения.КодОсновногоЯзыка()); ЗаписьЖурнала(ПараметрыЖурнала,, ТекстСообщения, РасширенноеПредставлениеОшибки); + + Если НЕ ИспользуетсяПочтовыйКлиент() Тогда + ПоляИстории = ПоляИсторииРассылкиОтчетов(ПараметрыЖурнала.Данные, СтрокаПолучатель.Ключ, ПараметрыДоставки.ДатаВыполнения); + ПоляИстории.УчетнаяЗапись = ПараметрыДоставки.УчетнаяЗапись; + ПоляИстории.АдресЭП = СтрокаПолучатель.Значение; + ПоляИстории.Комментарий = ТекстСообщения; + ПоляИстории.Выполнена = Ложь; + ПоляИстории.СпособПолучения = СпособПолученияРассылки(ПараметрыДоставки, СтрокаПолучатель.Ключ, СтрокаПолучатель.Значение); + ПоляИстории.ИдентификаторПисьма = ""; + ПоляИстории.Период = ТекущаяДатаСеанса(); + + РегистрыСведений.ИсторияРассылкиОтчетов.ЗафиксироватьРезультатВыполненияРассылкиПолучателю(ПоляИстории); + КонецЕсли; КонецПопытки; Если РассылкаВыполнена Тогда @@ -394,6 +446,31 @@ // Представление отчетов. СформироватьПредставлениеОтчетовДляПолучателя(ПараметрыДоставки, СтрокаПолучатель); + УстановитьПривилегированныйРежим(Истина); + ПараметрыДоставки.ПарольАрхива = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища( + ПараметрыЖурнала.Данные, "ПарольАрхива"); + УстановитьПривилегированныйРежим(Ложь); + + Если ДоступноШифрованиеВложений() И ПараметрыДоставки.Личная Тогда + СписокПолучателей = Новый Массив(); + Для Каждого СтрокаПолучатель Из ПараметрыДоставки.Получатели Цикл + СписокПолучателей.Добавить(СтрокаПолучатель.Ключ); + КонецЦикла; + СертификатыШифрованияПолучателей = ПолучитьСертификатыШифрованияПолучателейРассылки(СписокПолучателей); + ПараметрыДоставки.СертификатДляШифрования = ?( СертификатыШифрованияПолучателей.Количество() > 0, + СертификатыШифрованияПолучателей[0].СертификатДляШифрования, Неопределено); + + Если Не ПараметрыДоставки.Архивировать Тогда + // Шифрование каждого файла, если не выбрано архивирование + Для Каждого Вложение Из ОбщиеВложения Цикл + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + ВложениеДвоичныеДанные = МодульЭлектроннаяПодпись.Зашифровать( + Новый ДвоичныеДанные(Вложение.Значение), ПараметрыДоставки.СертификатДляШифрования); + ВложениеДвоичныеДанные.Записать(Вложение.Значение); + КонецЦикла; + КонецЕсли; + КонецЕсли; + // Архивация вложений. АрхивацияВложений(ОбщиеВложения, ПараметрыДоставки, ПараметрыДоставки.КаталогВременныхФайлов); @@ -418,7 +495,7 @@ |%4'"), ПараметрыДоставки.Получатели.Количество(), ПредставлениеОтправителя, ДополнительныеСведения, ПредставлениеПолучателя); - ЗаписьЖурнала(ПараметрыЖурнала,, ТекстСообщения); + ЗаписьЖурнала(ПараметрыЖурнала,, ТекстСообщения); КонецЕсли; КонецЕсли; КонецЕсли; @@ -518,6 +595,7 @@ // * СетевойКаталогLinux - Строка - каталог файловой системы (локальный на сервере или сетевой). // // Свойства, когда ИспользоватьFTPРесурс = Истина: +// * Владелец - СправочникСсылка.РассылкиОтчетов // * Сервер - Строка - имя FTP сервера. // * Порт - Число - порт FTP сервера. // * Логин - Строка - имя пользователя FTP сервера. @@ -537,6 +615,8 @@ // * ИмяАрхива - Строка - имя архива. // * ПарольАрхива - Строка - пароль архива. // * ТранслитерироватьИменаФайлов - Булево - признак необходимости транслитерации имен файлов отчетов рассылки. +// * СертификатДляШифрования - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - если внедрена +// подсистема ЭлектроннаяПодпись - Неопределено // // Необязательные свойства, когда ИспользоватьЭлектроннуюПочту = Истина: // * Персонализирована - Булево - рассылка персонализирована получателями. @@ -555,82 +635,53 @@ // *** Расширение - Строка // *** ТипФайла - ТипФайлаТабличногоДокумента // *** Имя - Строка -// * ПараметрыПисьма - Структура - параметры сообщения, которые будут переданы подсистеме -// РаботаСПочтовымиСообщениями напрямую. Их обработку см. в процедуре -// РаботаСПочтовымиСообщениямиСлужебный.ОтправитьСообщение. -// Подсистемой "РассылкаОтчетов" могут использоваться: -// ** ТипТекста - ТипТекстаПочтовогоСообщения -// - Строка -// - ПеречислениеСсылка.ТипыТекстовЭлектронныхПисем - тип текста письма. -// ** Вложения - Соответствие из КлючИЗначение: -// *** Ключ - Строка - наименование. -// *** Значение - Строка - адрес во временном хранилище, по которому размещена картинка. -// - ДвоичныеДанные - двоичные данные картинки. -// - Картинка - данные картинки. -// ** АдресОтвета - Строка - email-адрес ответа. +// * ПараметрыПисьма - Структура - содержит всю необходимую информацию о письме: +// ** Кому - Массив +// - Строка - интернет адреса получателей письма. +// - Массив - коллекция структур адресов: +// *** Адрес - Строка - почтовый адрес (должно быть обязательно заполнено). +// *** Представление - Строка - имя адресата. +// - Строка - интернет-адреса получателей письма, разделитель - ";". +// ** ПолучателиСообщения - Массив - массив структур, описывающий получателей: +// *** Адрес - Строка - почтовый адрес получателя сообщения. +// *** Представление - Строка - представление адресата. +// ** Копии - Массив +// - Строка - адреса получателей копий письма. См. описание поля Кому. +// ** СкрытыеКопии - Массив +// - Строка - адреса получателей скрытых копий письма. См. описание поля Кому. +// ** Тема - Строка - (обязательный) тема почтового сообщения. +// ** Тело - Строка - (обязательный) текст почтового сообщения (простой текст в кодировке win-1251). +// ** Вложения - Массив - файлы, которые необходимо приложить к письму (описания в виде структур): +// *** Представление - Строка - имя файла вложения; +// *** АдресВоВременномХранилище - Строка - адрес двоичных данных вложения во временном хранилище. +// *** Кодировка - Строка - кодировка вложения (используется, если отличается от кодировки письма). +// *** Идентификатор - Строка - (необязательный) используется для отметки картинок, отображаемых в теле письма. +// ** АдресОтвета - Соответствие +// - Строка - см. описание поля Кому. +// ** ИдентификаторыОснований - Строка - идентификаторы оснований данного письма. +// ** ОбрабатыватьТексты - Булево - необходимость обрабатывать тексты письма при отправке. +// ** УведомитьОДоставке - Булево - необходимость запроса уведомления о доставке. +// ** УведомитьОПрочтении - Булево - необходимость запроса уведомления о прочтении. +// ** ТипТекста - Строка +// - ПеречислениеСсылка.ТипыТекстовЭлектронныхПисем +// - ТипТекстаПочтовогоСообщения - определяет тип переданного теста допустимые значения: +// HTML/ТипыТекстовЭлектронныхПисем.HTML - текст почтового сообщения в формате HTML. +// ПростойТекст/ТипыТекстовЭлектронныхПисем.ПростойТекст - простой текст почтового сообщения. +// Отображается "как есть" (значение по умолчанию). +// РазмеченныйТекст/ТипыТекстовЭлектронныхПисем.РазмеченныйТекст - текст почтового сообщения +// в формате Rich Text. // Функция ПараметрыДоставки() Экспорт - ПараметрыДоставки = Новый Структура; - ПараметрыДоставки.Вставить("ДатаВыполнения", ТекущаяДатаСеанса()); - ПараметрыДоставки.Вставить("Соединение", Неопределено); - ПараметрыДоставки.Вставить("ЗапускЗафиксирован", Истина); - ПараметрыДоставки.Вставить("Автор", Пользователи.ТекущийПользователь()); - ПараметрыДоставки.Вставить("ПараметрыПисьма", Новый Структура); + ПараметрыДоставки = РассылкаОтчетовКлиентСервер.ПараметрыДоставки(); + ПараметрыДоставки.ДатаВыполнения = ТекущаяДатаСеанса(); + ПараметрыДоставки.Автор = Пользователи.ТекущийПользователь(); + ПараметрыДоставки.КаталогВременныхФайлов = ФайловаяСистема.СоздатьВременныйКаталог("RP"); - ПараметрыДоставки.Вставить("НастройкиПолучателей", Новый Соответствие); - ПараметрыДоставки.Вставить("Получатели", Неопределено); - ПараметрыДоставки.Вставить("УчетнаяЗапись", Неопределено); - ПараметрыДоставки.Вставить("Рассылка", ""); - - ПараметрыДоставки.Вставить("ПисьмоВФорматеHTML", Ложь); - ПараметрыДоставки.Вставить("Персонализирована", Ложь); - ПараметрыДоставки.Вставить("ТранслитерироватьИменаФайлов", Ложь); - ПараметрыДоставки.Вставить("ТолькоУведомить", Ложь); - ПараметрыДоставки.Вставить("СкрытыеКопии", Ложь); - - ПараметрыДоставки.Вставить("ИспользоватьЭлектроннуюПочту", Ложь); - ПараметрыДоставки.Вставить("ИспользоватьПапку", Ложь); - ПараметрыДоставки.Вставить("ИспользоватьСетевойКаталог", Ложь); - ПараметрыДоставки.Вставить("ИспользоватьFTPРесурс", Ложь); - - ПараметрыДоставки.Вставить("Каталог", Неопределено); - ПараметрыДоставки.Вставить("СетевойКаталогWindows", Неопределено); - ПараметрыДоставки.Вставить("СетевойКаталогLinux", Неопределено); - ПараметрыДоставки.Вставить("КаталогВременныхФайлов", ФайловаяСистема.СоздатьВременныйКаталог("RP")); - ПараметрыДоставки.Вставить("ВключатьДатуВИмяФайла", Ложь); - - ПараметрыДоставки.Вставить("Сервер", Неопределено); - ПараметрыДоставки.Вставить("Порт", Неопределено); - ПараметрыДоставки.Вставить("ПассивноеСоединение", Ложь); - ПараметрыДоставки.Вставить("Логин", Неопределено); - ПараметрыДоставки.Вставить("Пароль", Неопределено); - - ПараметрыДоставки.Вставить("Папка", Неопределено); - ПараметрыДоставки.Вставить("Архивировать", Ложь); - ПараметрыДоставки.Вставить("ИмяАрхива", ШаблонИмениАрхива()); - ПараметрыДоставки.Вставить("ПарольАрхива", Неопределено); - - ПараметрыДоставки.Вставить("ЗаполнитьПолучателяВШаблонеТемы", Ложь); - ПараметрыДоставки.Вставить("ЗаполнитьПолучателяВШаблонеСообщения", Ложь); - ПараметрыДоставки.Вставить("ЗаполнитьСформированныеОтчетыВШаблонеСообщения", Ложь); - ПараметрыДоставки.Вставить("ЗаполнитьСпособДоставкиВШаблонеСообщения", Ложь); - ПараметрыДоставки.Вставить("ПредставлениеОтчетовПолучателя", ""); - ПараметрыДоставки.Вставить("ШаблонТемы", ШаблонТемы()); - ПараметрыДоставки.Вставить("ШаблонТекста", ""); - - ПараметрыДоставки.Вставить("ПараметрыФорматов", Новый Соответствие); - ПараметрыДоставки.Вставить("ТранслитерироватьИменаФайлов", Ложь); - ПараметрыДоставки.Вставить("СтрокаОбщихОтчетов", Неопределено); - ПараметрыДоставки.Вставить("ДобавлятьСсылки", ""); - - ПараметрыДоставки.Вставить("БылиОшибки", Ложь); - ПараметрыДоставки.Вставить("БылиПредупреждения", Ложь); - ПараметрыДоставки.Вставить("ВыполненаВПапку", Ложь); - ПараметрыДоставки.Вставить("ВыполненаВСетевойКаталог", Ложь); - ПараметрыДоставки.Вставить("ВыполненаНаFTP", Ложь); - ПараметрыДоставки.Вставить("ВыполненаПоЭлектроннойПочте", Ложь); - ПараметрыДоставки.Вставить("ВыполненныеСпособыПубликации", ""); + Если ПолучитьФункциональнуюОпцию("ХранитьИсториюРассылкиОтчетов") Тогда + ПараметрыДоставки.ПараметрыПисьма.УведомитьОДоставке = Истина; + ПараметрыДоставки.ПараметрыПисьма.УведомитьОПрочтении = Истина; + КонецЕсли; Возврат ПараметрыДоставки; @@ -837,7 +888,7 @@ ИначеЕсли Не СтрокаТаблицы.Выполнена Тогда ШаблонСообщения = НСтр("ru = 'Рассылка ""%1"" не выполнена.'"); ИначеЕсли СтрокаТаблицы.СОшибками Тогда - ШаблонСообщения = НСтр("ru = 'Рассылка ""%1"" выполнена с ошибками.'"); + ШаблонСообщения = НСтр("ru = 'Рассылка ""%1"" выполнена частично'"); Иначе ШаблонСообщения = НСтр("ru = 'Рассылка ""%1"" выполнена.'"); КонецЕсли; @@ -853,7 +904,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Подготовлено рассылок: %1 из %2 |Выполнено: %3 - |С ошибками: %4 + |Частично: %4 |Не выполнено: %5'"), Формат(Подготовлено, "ЧН=0; ЧГ=0"), Формат(Всего, "ЧН=0; ЧГ=0"), Формат(Выполнено, "ЧН=0; ЧГ=0"), @@ -917,10 +968,12 @@ Возврат; КонецЕсли; + ПрефиксИмени = ОтчетыКлиентСервер.ПрефиксИмениКомандыСПредварительнымСохранениемВариантаОтчета(); + // Добавление команд и кнопок Команды = Новый Массив; - КомандаСоздать = Форма.Команды.Добавить("РассылкаОтчетовСоздатьНовую"); + КомандаСоздать = Форма.Команды.Добавить(ПрефиксИмени + "РассылкаОтчетовСоздатьНовую"); КомандаСоздать.Действие = "РассылкаОтчетовКлиент.СоздатьНовуюРассылкуИзОтчета"; КомандаСоздать.Картинка = БиблиотекаКартинок.РассылкаОтчетов; КомандаСоздать.Заголовок = НСтр("ru = 'Создать рассылку отчетов...'"); @@ -1073,6 +1126,14 @@ Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.РассылкаОтчетов; Зависимость.РаботаетСВнешнимиРесурсами = Истина; Зависимость.Параметризуется = Истина; +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. +Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт + + СоответствиеИменПсевдонимам.Вставить(Метаданные.РегламентныеЗадания.РассылкаОтчетов.ИмяМетода); + СоответствиеИменПсевдонимам.Вставить(Метаданные.РегламентныеЗадания.ОчисткаИсторииРассылкиОтчетов.ИмяМетода); + КонецПроцедуры // См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. @@ -1093,6 +1154,137 @@ КонецПроцедуры +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "3.1.8.98"; + Обработчик.Процедура = "РассылкаОтчетов.УстановитьКоличествоМесяцевХраненияИсторииРассылкиОтчетов"; + Обработчик.РежимВыполнения = "Оперативно"; + Обработчик.ОбщиеДанные = Ложь; + Обработчик.НачальноеЗаполнение = Истина; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "3.1.8.59"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("0c8c6c46-5ae3-4893-af67-a0c930ab2d50"); + Обработчик.Процедура = "Справочники.РассылкиОтчетов.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.РассылкиОтчетов.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; + Обработчик.ИзменяемыеОбъекты = "Справочник.РассылкиОтчетов"; + Обработчик.БлокируемыеОбъекты = "Справочник.РассылкиОтчетов"; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; + Обработчик.Комментарий = НСтр("ru = 'Обновление форматов рассылок отчетов с HTML4 на HTML5.'"); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); + НоваяСтрока = Обработчик.ПриоритетыВыполнения.Добавить(); + НоваяСтрока.Процедура = "МультиязычностьСервер.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + НоваяСтрока.Порядок = "До"; + КонецЕсли; + +КонецПроцедуры + +// См. РаботаСПочтовымиСообщениямиПереопределяемый.ПередПолучениемСтатусовПисем +Процедура ПередПолучениемСтатусовПисем(ИдентификаторыПисем) Экспорт + + Если НЕ ПолучитьФункциональнуюОпцию("ХранитьИсториюРассылкиОтчетов") Тогда + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ИсторияРассылкиОтчетов.ИдентификаторПисьма КАК ИдентификаторПисьма, + | ИсторияРассылкиОтчетов.УчетнаяЗапись КАК Отправитель, + | ИсторияРассылкиОтчетов.АдресЭП КАК АдресПолучателя + |ИЗ + | РегистрСведений.ИсторияРассылкиОтчетов КАК ИсторияРассылкиОтчетов + |ГДЕ + | ИсторияРассылкиОтчетов.Статус = &ПустойСтатус + | И ИсторияРассылкиОтчетов.Период >= &ПериодПроверки + | И ИсторияРассылкиОтчетов.ИдентификаторПисьма <> """""; + + Запрос.УстановитьПараметр("ПериодПроверки", ТекущаяДатаСеанса() - 259200); // Проверять последние отправленные за 3 дня + Запрос.УстановитьПараметр("ПустойСтатус", Перечисления.СтатусыЭлектронныхПисем.ПустаяСсылка()); + + РезультатЗапроса = Запрос.Выполнить(); + + Выборка = РезультатЗапроса.Выбрать(); + + Пока Выборка.Следующий() Цикл + СтрокаИдентификаторыПисем = ИдентификаторыПисем.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаИдентификаторыПисем, Выборка); + КонецЦикла; + +КонецПроцедуры + +// См. РаботаСПочтовымиСообщениямиПереопределяемый.ПослеПолученияСтатусовПисем +Процедура ПослеПолученияСтатусовПисем(СтатусыДоставки) Экспорт + + Если НЕ ПолучитьФункциональнуюОпцию("ХранитьИсториюРассылкиОтчетов") Тогда + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | СтатусыДоставки.ДатаИзмененияСтатуса КАК ДатаИзмененияСтатуса, + | СтатусыДоставки.Статус КАК Статус, + | СтатусыДоставки.Причина КАК Причина, + | СтатусыДоставки.ИдентификаторПисьма КАК ИдентификаторПисьма, + | СтатусыДоставки.АдресПолучателя КАК АдресПолучателя, + | СтатусыДоставки.Отправитель КАК Отправитель + |ПОМЕСТИТЬ СтатусыДоставки + |ИЗ + | &СтатусыДоставки КАК СтатусыДоставки + | + |ИНДЕКСИРОВАТЬ ПО + | ИдентификаторПисьма + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ИсторияРассылкиОтчетов.РассылкаОтчетов КАК РассылкаОтчетов, + | ИсторияРассылкиОтчетов.Получатель КАК Получатель, + | ИсторияРассылкиОтчетов.ЗапускРассылки КАК ЗапускРассылки, + | ИсторияРассылкиОтчетов.Период КАК Период, + | ИсторияРассылкиОтчетов.ИдентификаторПисьма КАК ИдентификаторПисьма, + | СтатусыДоставки.ДатаИзмененияСтатуса КАК ДатаИзмененияСтатуса, + | СтатусыДоставки.Статус КАК Статус, + | СтатусыДоставки.Причина КАК Комментарий, + | ИсторияРассылкиОтчетов.УчетнаяЗапись КАК УчетнаяЗапись, + | ИсторияРассылкиОтчетов.АдресЭП КАК АдресЭП, + | ИсторияРассылкиОтчетов.ЭлектронноеПисьмоИсходящее КАК ЭлектронноеПисьмоИсходящее, + | ИсторияРассылкиОтчетов.НомерСеанса КАК НомерСеанса, + | ИсторияРассылкиОтчетов.СпособПолучения КАК СпособПолучения, + | ИсторияРассылкиОтчетов.Выполнена КАК Выполнена + |ИЗ + | РегистрСведений.ИсторияРассылкиОтчетов КАК ИсторияРассылкиОтчетов + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ СтатусыДоставки КАК СтатусыДоставки + | ПО ИсторияРассылкиОтчетов.ИдентификаторПисьма = СтатусыДоставки.ИдентификаторПисьма + | И ИсторияРассылкиОтчетов.АдресЭП = СтатусыДоставки.АдресПолучателя + | И ИсторияРассылкиОтчетов.УчетнаяЗапись = СтатусыДоставки.Отправитель"; + + Запрос.УстановитьПараметр("СтатусыДоставки", СтатусыДоставки); + РезультатЗапроса = Запрос.Выполнить(); + + Выборка = РезультатЗапроса.Выбрать(); + + Пока Выборка.Следующий() Цикл + ПоляИстории = ПоляИсторииРассылкиОтчетов(Выборка.РассылкаОтчетов, Выборка.Получатель, Выборка.ЗапускРассылки); + ЗаполнитьЗначенияСвойств(ПоляИстории, Выборка); + ПоляИстории.Выполнена = ?(Выборка.Статус = Перечисления.СтатусыЭлектронныхПисем.НеДоставлено, Ложь, ПоляИстории.Выполнена); + ПоляИстории.Статус = Выборка.Статус; + ПоляИстории.Комментарий = Выборка.Комментарий; + Если Выборка.Статус = Перечисления.СтатусыЭлектронныхПисем.Доставлено Тогда + ПоляИстории.ДатаДоставки = Выборка.ДатаИзмененияСтатуса; + КонецЕсли; + + РегистрыСведений.ИсторияРассылкиОтчетов.ЗафиксироватьРезультатВыполненияРассылкиПолучателю(ПоляИстории); + КонецЦикла; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -1341,6 +1533,154 @@ Возврат СписокПолучателей; КонецФункции +// Формирует массив получателей из табличной части "Получатели" рассылки. +// +// Параметры: +// Рассылка - СправочникСсылка.РассылкиОтчетов +// ПараметрыЖурнала - см. ПараметрыЖурнала +// +// Возвращаемое значение: +// Массив из СправочникСсылка.РассылкиОтчетов +// +Функция СформироватьМассивПолучателейРассылки(Рассылка, ПараметрыЖурнала) + + Если Рассылка.Личная Тогда + + ТипПолучателей = ТипЗнч(Рассылка.Автор); + ПолучателиМетаданные = Метаданные.НайтиПоТипу(ТипПолучателей); + + ТаблицаПолучателей = Новый ТаблицаЗначений; + Для Каждого Реквизит Из Метаданные.Справочники.РассылкиОтчетов.ТабличныеЧасти.Получатели.Реквизиты Цикл + ТаблицаПолучателей.Колонки.Добавить(Реквизит.Имя, Реквизит.Тип); + КонецЦикла; + ТаблицаПолучателей.Добавить().Получатель = Рассылка.Автор; + + Иначе + ПолучателиМетаданные = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(Рассылка.ТипПолучателейРассылки, Ложь); + ТипПолучателей = Рассылка.ТипПолучателейРассылки.КлючОбъектаМетаданных.Получить(); + ТаблицаПолучателей = Рассылка.Получатели.Выгрузить(); + КонецЕсли; + + Запрос = Новый Запрос; + Если ТипПолучателей = Тип("СправочникСсылка.Пользователи") Тогда + + ТекстЗапроса = + "ВЫБРАТЬ + | ТаблицаПолучателей.Получатель, + | ТаблицаПолучателей.Исключен + |ПОМЕСТИТЬ ТаблицаПолучателей + |ИЗ + | &ТаблицаПолучателей КАК ТаблицаПолучателей + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | Пользователь.Ссылка КАК Получатель + |ИЗ + | ТаблицаПолучателей КАК ТаблицаПолучателей + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ПО СоставыГруппПользователей.ГруппаПользователей = ТаблицаПолучателей.Получатель + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи + | ПО Пользователи.Ссылка = СоставыГруппПользователей.Пользователь + |ГДЕ + | НЕ Пользователи.ПометкаУдаления + | И НЕ Пользователи.Недействителен + | И НЕ Пользователи.Служебный + | И НЕ ТаблицаПолучателей.Исключен + |СГРУППИРОВАТЬ ПО + | Пользователь.Ссылка"; + + Иначе + + ТекстЗапроса = + "ВЫБРАТЬ + | ТаблицаПолучателей.Получатель, + | ТаблицаПолучателей.Исключен + |ПОМЕСТИТЬ ТаблицаПолучателей + |ИЗ + | &ТаблицаПолучателей КАК ТаблицаПолучателей + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | Получатели.Ссылка КАК Получатель + |ИЗ + | Справочник.Пользователи КАК Получатели + |ГДЕ + | Получатели.Ссылка В ИЕРАРХИИ + | (ВЫБРАТЬ + | Получатель + | ИЗ + | ТаблицаПолучателей + | ГДЕ + | НЕ Исключен) + | И НЕ Получатели.Ссылка В ИЕРАРХИИ + | (ВЫБРАТЬ + | Получатель + | ИЗ + | ТаблицаПолучателей + | ГДЕ + | Исключен) + | И НЕ Получатели.ПометкаУдаления + | И &ЭтоНеГруппа"; + + Если Не ПолучателиМетаданные.Иерархический Тогда + // Не иерархический + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "В ИЕРАРХИИ", "В"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ЭтоНеГруппа", ""); + ИначеЕсли ПолучателиМетаданные.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияЭлементов Тогда + // Иерархия элементов + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ЭтоНеГруппа", ""); + Иначе + // Иерархия групп + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ЭтоНеГруппа", "И НЕ Получатели.ЭтоГруппа"); + КонецЕсли; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Справочник.Пользователи", ПолучателиМетаданные.ПолноеИмя()); + + КонецЕсли; + + Запрос.УстановитьПараметр("ТаблицаПолучателей", ТаблицаПолучателей); + Запрос.Текст = ТекстЗапроса; + + ТекстСообщенияОбОшибкеДляЖурналаРегистрации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось сформировать список получателей ""%1"" по причине:'"), Строка(ТипПолучателей)); + + МассивПолучателей = Новый Массив; + + + // Механизм расширения + СписокПолучателей = Новый Соответствие; + Попытка + СтандартнаяОбработка = Истина; + РассылкаОтчетовПереопределяемый.ПередФормированиемСпискаПолучателейРассылки(Рассылка, Запрос, СтандартнаяОбработка, СписокПолучателей); + Если СтандартнаяОбработка <> Истина Тогда + Для Каждого Получатель Из СписокПолучателей Цикл + МассивПолучателей.Добавить(Получатель.Ключ); + КонецЦикла; + Возврат МассивПолучателей; + КонецЕсли; + Исключение + ЗаписьЖурнала(ПараметрыЖурнала,, ТекстСообщенияОбОшибкеДляЖурналаРегистрации, ИнформацияОбОшибке()); + Возврат МассивПолучателей; + КонецПопытки; + + // Стандартная обработка + Попытка + ПолучателиРассылки = Запрос.Выполнить().Выгрузить(); + Исключение + ЗаписьЖурнала(ПараметрыЖурнала,, ТекстСообщенияОбОшибкеДляЖурналаРегистрации, ИнформацияОбОшибке()); + Возврат МассивПолучателей; + КонецПопытки; + + Для Каждого ПолучательРассылки Из ПолучателиРассылки Цикл + МассивПолучателей.Добавить(ПолучательРассылки.Получатель); + КонецЦикла; + + Возврат МассивПолучателей; + +КонецФункции + Функция ПолучателиРассылкиВыбранны(Рассылка, ПараметрыДоставки, ПараметрыЖурнала, ДополнительныеНастройки) Получатели = СформироватьСписокПолучателейРассылки(Рассылка, ПараметрыЖурнала); @@ -1553,7 +1893,7 @@ // Формирует отчет, проверяя что результат пустой. // // Параметры: -// ПараметрыЖурнала - Структура - параметры записи в журнал регистрации. См. ЗаписьЖурнала(). +// ПараметрыЖурнала - Структура - параметры записи в журнал регистрации. См. ЗаписьЖурнала. // ПараметрыОтчета - см. ИнициализироватьОтчет // Получатель - СправочникСсылка - ссылка получателя. // @@ -1636,9 +1976,11 @@ // Выполняет транспортировку вложений для всех способов доставки. // // Параметры: -// Автор - СправочникСсылка - автор рассылки. +// ПараметрыЖурнала - см. ПараметрыЖурнала // ПараметрыДоставки - см. ВыполнитьРассылку -// Вложения - Соответствие - см. ДобавитьОтчетыВоВложения(). +// Вложения - Соответствие из КлючИЗначение: +// * Ключ - Строка - имя файла +// * Значение - Строка - полное имя файла // // Возвращаемое значение: // Структура: @@ -1664,6 +2006,7 @@ СетевойКаталогСервера = ПараметрыДоставки.СетевойКаталогLinux; КонецЕсли; + ВсеПолучатели = СформироватьМассивПолучателейРассылки(ПараметрыЖурнала.Данные, ПараметрыЖурнала); Попытка Для Каждого Вложение Из Вложения Цикл КопироватьФайл(Вложение.Значение, СетевойКаталогСервера + Вложение.Ключ); @@ -1682,9 +2025,36 @@ УдалитьФайлы(СетевойКаталогСервера + Вложение.Ключ); КонецЦикла; КонецЕсли; + + Если ПолучитьФункциональнуюОпцию("ХранитьИсториюРассылкиОтчетов") Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = 'Отчеты помещены в сетевой каталог ''%1''.'"), СетевойКаталогСервера); + Для Каждого Получатель Из ВсеПолучатели Цикл + ПоляИстории = ПоляИсторииРассылкиОтчетов(ПараметрыЖурнала.Данные, Получатель, ПараметрыДоставки.ДатаВыполнения); + ПоляИстории.УчетнаяЗапись = ПараметрыДоставки.УчетнаяЗапись; + ПоляИстории.Комментарий = ТекстСообщения; + ПоляИстории.Выполнена = Истина; + ПоляИстории.ДатаДоставки = ТекущаяДатаСеанса(); + ПоляИстории.СпособПолучения = СпособПолученияРассылки(ПараметрыДоставки, Получатель); + ПоляИстории.ИдентификаторПисьма = ""; + + РегистрыСведений.ИсторияРассылкиОтчетов.ЗафиксироватьРезультатВыполненияРассылкиПолучателю(ПоляИстории); + КонецЦикла; + КонецЕсли; Исключение - ЗаписьЖурнала(ПараметрыЖурнала, , - ШаблонСообщенияОбОшибке, ИнформацияОбОшибке()); + ЗаписьЖурнала(ПараметрыЖурнала, , ШаблонСообщенияОбОшибке, ИнформацияОбОшибке()); + Если ПолучитьФункциональнуюОпцию("ХранитьИсториюРассылкиОтчетов") Тогда + Для Каждого Получатель Из ВсеПолучатели Цикл + ПоляИстории = ПоляИсторииРассылкиОтчетов(ПараметрыЖурнала.Данные, Получатель, ПараметрыДоставки.ДатаВыполнения); + ПоляИстории.УчетнаяЗапись = ПараметрыДоставки.УчетнаяЗапись; + ПоляИстории.Комментарий = ШаблонСообщенияОбОшибке; + ПоляИстории.Выполнена = Ложь; + ПоляИстории.СпособПолучения = СпособПолученияРассылки(ПараметрыДоставки, Получатель); + ПоляИстории.ИдентификаторПисьма = ""; + + РегистрыСведений.ИсторияРассылкиОтчетов.ЗафиксироватьРезультатВыполненияРассылкиПолучателю(ПоляИстории); + КонецЦикла; + КонецЕсли; КонецПопытки; КонецЕсли; @@ -1695,7 +2065,7 @@ Если ПараметрыДоставки.ИспользоватьFTPРесурс Тогда Цель = "ftp://"+ ПараметрыДоставки.Сервер +":"+ Формат(ПараметрыДоставки.Порт, "ЧН=0; ЧГ=0") + ПараметрыДоставки.Каталог; - + ВсеПолучатели = СформироватьМассивПолучателейРассылки(ПараметрыЖурнала.Данные, ПараметрыЖурнала); Попытка Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета"); @@ -1738,9 +2108,36 @@ Соединение.Удалить(ПараметрыДоставки.Каталог + Вложение.Ключ); КонецЦикла; КонецЕсли; + + Если ПолучитьФункциональнуюОпцию("ХранитьИсториюРассылкиОтчетов") Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = 'Отчеты опубликованы на ''%1''.'"), Цель); + Для Каждого Получатель Из ВсеПолучатели Цикл + ПоляИстории = ПоляИсторииРассылкиОтчетов(ПараметрыЖурнала.Данные, Получатель, ПараметрыДоставки.ДатаВыполнения); + ПоляИстории.УчетнаяЗапись = ПараметрыДоставки.УчетнаяЗапись; + ПоляИстории.Комментарий = ТекстСообщения; + ПоляИстории.Выполнена = Истина; + ПоляИстории.ДатаДоставки = ТекущаяДатаСеанса(); + ПоляИстории.СпособПолучения = СпособПолученияРассылки(ПараметрыДоставки, Получатель); + ПоляИстории.ИдентификаторПисьма = ""; + + РегистрыСведений.ИсторияРассылкиОтчетов.ЗафиксироватьРезультатВыполненияРассылкиПолучателю(ПоляИстории); + КонецЦикла; + КонецЕсли; Исключение - ЗаписьЖурнала(ПараметрыЖурнала, , - ШаблонСообщенияОбОшибке, ИнформацияОбОшибке()); + ЗаписьЖурнала(ПараметрыЖурнала, , ШаблонСообщенияОбОшибке, ИнформацияОбОшибке()); + Если ПолучитьФункциональнуюОпцию("ХранитьИсториюРассылкиОтчетов") Тогда + Для Каждого Получатель Из ВсеПолучатели Цикл + ПоляИстории = ПоляИсторииРассылкиОтчетов(ПараметрыЖурнала.Данные, Получатель, ПараметрыДоставки.ДатаВыполнения); + ПоляИстории.УчетнаяЗапись = ПараметрыДоставки.УчетнаяЗапись; + ПоляИстории.Комментарий = ШаблонСообщенияОбОшибке; + ПоляИстории.Выполнена = Ложь; + ПоляИстории.СпособПолучения = СпособПолученияРассылки(ПараметрыДоставки, Получатель); + ПоляИстории.ИдентификаторПисьма = ""; + + РегистрыСведений.ИсторияРассылкиОтчетов.ЗафиксироватьРезультатВыполненияРассылкиПолучателю(ПоляИстории); + КонецЦикла; + КонецЕсли; КонецПопытки; КонецЕсли; @@ -1749,16 +2146,44 @@ // В папку. Если ПараметрыДоставки.ИспользоватьПапку Тогда - + ВсеПолучатели = СформироватьМассивПолучателейРассылки(ПараметрыЖурнала.Данные, ПараметрыЖурнала); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); Попытка МодульРаботаСФайламиСлужебный.ПриВыполненииДоставкиВПапку(ПараметрыДоставки, Вложения); Результат = Истина; - ПараметрыДоставки.ВыполненаВПапку = Истина; + ПараметрыДоставки.ВыполненаВПапку = Истина; + Если ПолучитьФункциональнуюОпцию("ХранитьИсториюРассылкиОтчетов") Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = 'Отчеты помещены в папку ''%1''.'"), Строка(ПараметрыДоставки.Папка)); + Для Каждого Получатель Из ВсеПолучатели Цикл + ПоляИстории = ПоляИсторииРассылкиОтчетов(ПараметрыЖурнала.Данные, Получатель, ПараметрыДоставки.ДатаВыполнения); + ПоляИстории.УчетнаяЗапись = ПараметрыДоставки.УчетнаяЗапись; + ПоляИстории.Комментарий = ТекстСообщения; + ПоляИстории.Выполнена = Истина; + ПоляИстории.ДатаДоставки = ТекущаяДатаСеанса(); + ПоляИстории.СпособПолучения = СпособПолученияРассылки(ПараметрыДоставки, Получатель); + ПоляИстории.ИдентификаторПисьма = ""; + + РегистрыСведений.ИсторияРассылкиОтчетов.ЗафиксироватьРезультатВыполненияРассылкиПолучателю( + ПоляИстории); + КонецЦикла; + КонецЕсли; Исключение - ЗаписьЖурнала(ПараметрыЖурнала, , - ШаблонСообщенияОбОшибке, ИнформацияОбОшибке()); + ЗаписьЖурнала(ПараметрыЖурнала, , ШаблонСообщенияОбОшибке, ИнформацияОбОшибке()); + Если ПолучитьФункциональнуюОпцию("ХранитьИсториюРассылкиОтчетов") Тогда + Для Каждого Получатель Из ВсеПолучатели Цикл + ПоляИстории = ПоляИсторииРассылкиОтчетов(ПараметрыЖурнала.Данные, Получатель, ПараметрыДоставки.ДатаВыполнения); + ПоляИстории.УчетнаяЗапись = ПараметрыДоставки.УчетнаяЗапись; + ПоляИстории.Комментарий = ШаблонСообщенияОбОшибке; + ПоляИстории.Выполнена = Ложь; + ПоляИстории.СпособПолучения = СпособПолученияРассылки(ПараметрыДоставки, Получатель); + ПоляИстории.ИдентификаторПисьма = ""; + + РегистрыСведений.ИсторияРассылкиОтчетов.ЗафиксироватьРезультатВыполненияРассылкиПолучателю( + ПоляИстории); + КонецЦикла; + КонецЕсли; КонецПопытки; КонецЕсли; @@ -1778,19 +2203,40 @@ КонецЕсли; Попытка - ОтправитьОтчетыПолучателю(ВложенияПисьма, ПараметрыДоставки); + ОтправитьОтчетыПолучателю(ВложенияПисьма, ПараметрыДоставки, ПараметрыЖурнала); Если Не ПараметрыДоставки.ТолькоУведомить Тогда Результат = Истина; КонецЕсли; Если Результат = Истина Тогда ПараметрыДоставки.ВыполненаПоЭлектроннойПочте = Истина; КонецЕсли; + Исключение РасширенноеПредставлениеОшибки = РаботаСПочтовымиСообщениями.РасширенноеПредставлениеОшибки( ИнформацияОбОшибке(), ОбщегоНазначения.КодОсновногоЯзыка()); ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Ошибка, ШаблонСообщенияОбОшибке, РасширенноеПредставлениеОшибки); + + Если ПолучитьФункциональнуюОпцию("ХранитьИсториюРассылкиОтчетов") И НЕ ИспользуетсяПочтовыйКлиент() Тогда + Для Каждого СтрокаПолучатель Из ПараметрыДоставки.Получатели Цикл + АдресаПолучателя = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(СтрокаПолучатель.Значение); + Для Каждого АдресЭП Из АдресаПолучателя Цикл + ПоляИстории = ПоляИсторииРассылкиОтчетов(ПараметрыЖурнала.Данные, СтрокаПолучатель.Ключ, ПараметрыДоставки.ДатаВыполнения); + ПоляИстории.УчетнаяЗапись = ПараметрыДоставки.УчетнаяЗапись; + ПоляИстории.АдресЭП = АдресЭП; + ПоляИстории.Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + "%1 %2", ШаблонСообщенияОбОшибке, РасширенноеПредставлениеОшибки); + ПоляИстории.Выполнена = Ложь; + ПоляИстории.СпособПолучения = СпособПолученияРассылки(ПараметрыДоставки, СтрокаПолучатель.Ключ, + АдресЭП); + ПоляИстории.ИдентификаторПисьма = ""; + + РегистрыСведений.ИсторияРассылкиОтчетов.ЗафиксироватьРезультатВыполненияРассылкиПолучателю(ПоляИстории); + КонецЦикла; + + КонецЦикла; + КонецЕсли; КонецПопытки; КонецЕсли; @@ -1808,7 +2254,7 @@ // Функция ИмяПользователяИБ(Пользователь) Экспорт Если Не ЗначениеЗаполнено(Пользователь) Тогда - Возврат Неопределено; + Возврат ""; КонецЕсли; УстановитьПривилегированныйРежим(Истина); @@ -1816,7 +2262,7 @@ ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Пользователь, "ИдентификаторПользователяИБ")); Если ПользовательИБ = Неопределено Тогда - Возврат Неопределено; + Возврат ""; КонецЕсли; Возврат ПользовательИБ.Имя; @@ -1864,9 +2310,9 @@ ТекстДляПользователя = Текст; Если ТипЗнч(ОписаниеПроблемы) = Тип("ИнформацияОбОшибке") Тогда Если ЗаписатьВЖурнал Тогда - ТекстДляЖурнала = ТекстДляЖурнала + Символы.ПС + ПодробноеПредставлениеОшибки(ОписаниеПроблемы); + ТекстДляЖурнала = ТекстДляЖурнала + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ОписаниеПроблемы); КонецЕсли; - ТекстДляПользователя = ТекстДляПользователя + Символы.ПС + КраткоеПредставлениеОшибки(ОписаниеПроблемы); + ТекстДляПользователя = ТекстДляПользователя + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ОписаниеПроблемы); ИначеЕсли ТипЗнч(ОписаниеПроблемы) = Тип("Строка") Тогда Если ЗаписатьВЖурнал Тогда ТекстДляЖурнала = ТекстДляЖурнала + Символы.ПС + ОписаниеПроблемы; @@ -1975,6 +2421,26 @@ Возврат Результат; КонецФункции +Функция ПолучитьСертификатыШифрованияПолучателейРассылки(СписокПолучателей) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | СертификатыПолучателейРассылкиОтчетов.ПолучательРассылки, + | СертификатыПолучателейРассылкиОтчетов.СертификатДляШифрования + |ИЗ + | РегистрСведений.СертификатыПолучателейРассылкиОтчетов КАК СертификатыПолучателейРассылкиОтчетов + |ГДЕ + | СертификатыПолучателейРассылкиОтчетов.ПолучательРассылки В (&СписокПолучателей)"; + + Запрос.УстановитьПараметр("СписокПолучателей", СписокПолучателей); + + РезультатЗапроса = Запрос.Выполнить(); + + Возврат РезультатЗапроса.Выгрузить(); + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Локальные служебные процедуры и функции. @@ -1989,7 +2455,7 @@ // ПараметрыОтчета - Структура - см. ВыполнитьРассылку(), параметр ТаблицаОтчетов. // ДеревоОтчетов - ДеревоЗначений - отчеты и результат формирования. // ПараметрыДоставки - см. ПараметрыДоставки -// Получатель - СправочникСсылка - ссылка получателя. +// ПолучательСсылка - СправочникСсылка - ссылка получателя. // // Результат выполнения записывается в ДеревоОтчетов. // Ошибки записываются в журнал регистрации и в сообщения сеанса пользователя. @@ -2003,13 +2469,57 @@ // Настройки - представление сформированных отчетов. СтрокаПолучатель = ОпределитьСтрокуДереваДляПолучателя(ДеревоОтчетов, ПолучательСсылка, ПараметрыДоставки); КаталогПолучателя = СтрокаПолучатель.Значение; - + // Формирование отчета для получателя. Результат = СформироватьОтчет(ПараметрыЖурнала, ПараметрыОтчета, ПолучательСсылка); // Проверка результата Если Не Результат.Сформирован Или (Результат.Пустой И Не ПараметрыОтчета.ОтправлятьЕслиПустой) Тогда + + Если ПолучитьФункциональнуюОпцию("ХранитьИсториюРассылкиОтчетов") Тогда + Если Результат.Сформирован Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = '- ""%1"" не был отправлен, так как пустой.'"), Строка(ПараметрыОтчета.Отчет)); + Иначе + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = '- ""%1"" не был отправлен, так как не сформирован из-за некорректно указанных параметров.'"), + Строка(ПараметрыОтчета.Отчет)); + КонецЕсли; + + Если ЗначениеЗаполнено(ПолучательСсылка) Тогда + АдресаПолучателя = ПараметрыДоставки.Получатели.Получить(ПолучательСсылка); + Если АдресаПолучателя <> Неопределено Тогда + АдресаПолучателя = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(АдресаПолучателя); + Для Каждого Кому Из АдресаПолучателя Цикл + ПоляИстории = ПоляИсторииРассылкиОтчетов(ПараметрыЖурнала.Данные, ПолучательСсылка, ПараметрыДоставки.ДатаВыполнения); + ПоляИстории.УчетнаяЗапись = ПараметрыДоставки.УчетнаяЗапись; + ПоляИстории.АдресЭП = Кому.Адрес; + ПоляИстории.Комментарий = ТекстСообщения; + ПоляИстории.Выполнена = Ложь; + ПоляИстории.СпособПолучения = СпособПолученияРассылки(ПараметрыДоставки, ПолучательСсылка, Кому.Адрес); + + РегистрыСведений.ИсторияРассылкиОтчетов.ЗафиксироватьРезультатВыполненияРассылкиПолучателю(ПоляИстории); + КонецЦикла; + КонецЕсли; + Иначе + Для Каждого Получатель Из ПараметрыДоставки.Получатели Цикл + АдресаПолучателя = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(Получатель.Значение); + Для Каждого Кому Из АдресаПолучателя Цикл + ПоляИстории = ПоляИсторииРассылкиОтчетов(ПараметрыЖурнала.Данные, Получатель.Ключ, ПараметрыДоставки.ДатаВыполнения); + ПоляИстории.УчетнаяЗапись = ПараметрыДоставки.УчетнаяЗапись; + ПоляИстории.АдресЭП = Кому.Адрес; + ПоляИстории.Комментарий = ТекстСообщения; + ПоляИстории.Выполнена = Ложь; + ПоляИстории.СпособПолучения = СпособПолученияРассылки(ПараметрыДоставки, Получатель.Ключ, Кому.Адрес); + + РегистрыСведений.ИсторияРассылкиОтчетов.ЗафиксироватьРезультатВыполненияРассылкиПолучателю(ПоляИстории); + КонецЦикла; + КонецЦикла; + КонецЕсли; + КонецЕсли; + Возврат; + КонецЕсли; // Регистрация промежуточного результата. @@ -2056,7 +2566,7 @@ Если ПараметрыФормата.ТипФайла = Неопределено Тогда ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Ошибка, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ЗаголовокОшибки, СтрокаОтчет.Ключ, ПараметрыФормата.Имя), - НСтр("ru = 'Формат не поддерживается'")); + НСтр("ru = 'Формат не поддерживается.'")); Продолжить; КонецЕсли; @@ -2200,7 +2710,7 @@ Если Не ЗначениеЗаполнено(ПараметрыДоставки.Папка) Тогда ПараметрыДоставки.ИспользоватьПапку = Ложь; ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Предупреждение, - НСтр("ru = 'Папка не заполнена, доставка в папку отключена'")); + НСтр("ru = 'Папка не заполнена, доставка в папку отключена.'")); Иначе Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); @@ -2234,7 +2744,7 @@ ПараметрыДоставки.ИспользоватьСетевойКаталог = Ложь; ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Ошибка, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Сетевой каталог %1 не выбран, доставка в сетевой каталог отключена'"), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Сетевой каталог %1 не выбран, доставка в сетевой каталог отключена.'"), ЗначениеПодстановки)); Иначе @@ -2250,19 +2760,19 @@ Если ПараметрыДоставки.ИспользоватьFTPРесурс И Не ЗначениеЗаполнено(ПараметрыДоставки.Сервер) Тогда ПараметрыДоставки.ИспользоватьFTPРесурс = Ложь; ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Ошибка, - НСтр("ru = 'FTP сервер не заполнен, доставка в папку на FTP ресурс отключена'")); + НСтр("ru = 'FTP сервер не заполнен, доставка в папку на FTP ресурс отключена.'")); КонецЕсли; Если ПараметрыДоставки.ИспользоватьЭлектроннуюПочту И Не ЗначениеЗаполнено(ПараметрыДоставки.УчетнаяЗапись) Тогда ПараметрыДоставки.ИспользоватьЭлектроннуюПочту = Ложь; ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Ошибка, - НСтр("ru = 'Учетная запись не выбрана, доставка по электронной почте отключена'")); + НСтр("ru = 'Учетная запись не выбрана, доставка по электронной почте отключена.'")); КонецЕсли; Если ПараметрыДоставки.Персонализирована Тогда Если Не ПараметрыДоставки.ИспользоватьЭлектроннуюПочту Тогда ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Ошибка, - НСтр("ru = 'Персонализированная рассылка может быть отправлена только по электронной почте'")); + НСтр("ru = 'Персонализированная рассылка может быть отправлена только по электронной почте.'")); Возврат Ложь; КонецЕсли; @@ -2278,24 +2788,23 @@ И Не ПараметрыДоставки.ИспользоватьСетевойКаталог И Не ПараметрыДоставки.ИспользоватьFTPРесурс Тогда ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Предупреждение, - НСтр("ru = 'Использование уведомлений по электронной почте возможно только совместно с другими способами доставки'")); + НСтр("ru = 'Использование уведомлений по электронной почте возможно только совместно с другими способами доставки.'")); Возврат Ложь; КонецЕсли; ПараметрыПисьма = ПараметрыДоставки.ПараметрыПисьма; - ПараметрыПисьма.Вставить("ОбрабатыватьТексты", Ложь); // Тип текста почтового сообщения. - Если Не ПараметрыПисьма.Свойство("ТипТекста") Или Не ЗначениеЗаполнено(ПараметрыПисьма.ТипТекста) Тогда - ПараметрыПисьма.Вставить("ТипТекста", ТипТекстаПочтовогоСообщения.ПростойТекст); + Если Не ЗначениеЗаполнено(ПараметрыПисьма.ТипТекста) Тогда + ПараметрыПисьма.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст; КонецЕсли; ПараметрыДоставки.ПисьмоВФорматеHTML = ПараметрыПисьма.ТипТекста = "HTML" Или ПараметрыПисьма.ТипТекста = ТипТекстаПочтовогоСообщения.HTML; // Для обратной совместимости. - Если ПараметрыПисьма.Свойство("Вложения") Тогда - ПараметрыПисьма.Вставить("Картинки", ПараметрыПисьма.Вложения); + Если ПараметрыПисьма.Вложения.Количество() > 0 Тогда + ПараметрыДоставки.Картинки = ПараметрыПисьма.Вложения; КонецЕсли; // Шаблон сообщения @@ -2385,50 +2894,28 @@ Возврат Истина; КонецФункции -// Возвращает шаблон темы по умолчанию для доставки по электронной почте. -Функция ШаблонТемы() Экспорт - Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '%1 от %2'"), "[НаименованиеРассылки]", "[ДатаВыполнения(ДЛФ='D')]"); -КонецФункции - -// Возвращает шаблон тела сообщения по умолчанию для доставки по электронной почте. -Функция ШаблонТекста() Экспорт - Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = 'Сформированы отчеты: - | - |%1'"), - "[СформированныеОтчеты] - | - |[СпособДоставки] - | - |[ЗаголовокСистемы] - |[ДатаВыполнения(ДЛФ='DD')]"); -КонецФункции - -// Возвращает шаблон наименования архива по умолчанию. -Функция ШаблонИмениАрхива() Экспорт - - Возврат "[НаименованиеРассылки]_[ДатаВыполнения(ДФ='yyyy-MM-dd')]"; - -КонецФункции - // Формирует список рассылки из списка получателей, подготавливает все параметры письма // и передает управление подсистеме "РаботаСПочтовымиСообщениями". // Для контроля за выполнением рекомендуется вызывать в конструкции "Попытка ... Исключение". // // Параметры: -// Вложения - Соответствие - см. СохранитьОтчетыВФорматы(), параметр Результат. +// Вложения - Соответствие из КлючИЗначение: +// * Ключ - Строка - имя файла +// * Значение - Строка - полное имя файла // ПараметрыДоставки - см. ВыполнитьРассылку.ПараметрыДоставки +// ПараметрыЖурнала - см. ПараметрыЖурнала // СтрокаПолучатель - настройки получателя: // - Неопределено - используется весь список получателей из "ПараметрыДоставки.Получатели". // - СтрокаДереваЗначений - используется свойство строки "Получатель". // -Процедура ОтправитьОтчетыПолучателю(Вложения, ПараметрыДоставки, СтрокаПолучатель = Неопределено) +Процедура ОтправитьОтчетыПолучателю(Вложения, ПараметрыДоставки, ПараметрыЖурнала, СтрокаПолучатель = Неопределено) Получатель = ?(СтрокаПолучатель = Неопределено, Неопределено, СтрокаПолучатель.Ключ); ПараметрыПисьма = ПараметрыДоставки.ПараметрыПисьма; + ПараметрыДоставки.Получатель = Получатель; + // Вложения - отчеты - ПараметрыПисьма.Вставить("Вложения", ПреобразоватьВСоответствие(Вложения, "Ключ", "Значение")); + ПараметрыПисьма.Вложения = ПреобразоватьВСоответствие(Вложения, "Ключ", "Значение"); // Шаблоны тема и тела ШаблонТемы = ПараметрыДоставки.ШаблонТемы; @@ -2451,8 +2938,8 @@ КонецЕсли; // Тема и тело сообщения - ПараметрыПисьма.Вставить("Тема", ШаблонТемы); - ПараметрыПисьма.Вставить("Тело", ШаблонТекста); + ПараметрыПисьма.Тема = ШаблонТемы; + ПараметрыПисьма.Тело = ШаблонТекста; // Тема и тело сообщения КлючАдресаДоставки = ?(ПараметрыДоставки.СкрытыеКопии, "СкрытыеКопии", "Кому"); @@ -2492,7 +2979,7 @@ ПараметрыПисьма.Вставить(КлючАдресаДоставки, Кому); // Отправляем письмо - ОтправитьПочтовоеСообщение(ПараметрыДоставки, ПараметрыПисьма); + ОтправитьПочтовоеСообщение(ПараметрыДоставки, ПараметрыПисьма, СтрокаПолучатель, ПараметрыЖурнала); КонецЕсли; Иначе // Доставка конкретному получателю. @@ -2509,25 +2996,272 @@ ПараметрыПисьма.Вставить(КлючАдресаДоставки, ПараметрыДоставки.Получатели[Получатель]); // Отправляем письмо - ОтправитьПочтовоеСообщение(ПараметрыДоставки, ПараметрыПисьма); - КонецЕсли; - + ОтправитьПочтовоеСообщение(ПараметрыДоставки, ПараметрыПисьма, СтрокаПолучатель, ПараметрыЖурнала); + КонецЕсли; + КонецПроцедуры -Процедура ОтправитьПочтовоеСообщение(ПараметрыДоставки, ПараметрыПисьма) - - Письмо = ПодготовитьПисьмо(ПараметрыДоставки, ПараметрыПисьма); - РаботаСПочтовымиСообщениями.ОтправитьПисьмо(ПараметрыДоставки.УчетнаяЗапись, Письмо); +Процедура ОтправитьПочтовоеСообщение(ПараметрыДоставки, ПараметрыПисьма, СтрокаПолучатель, ПараметрыЖурнала) + Если ИспользуетсяПочтовыйКлиент() И ПолучитьФункциональнуюОпцию("ХранитьИсториюРассылкиОтчетов") Тогда + ОтправитьПисьмоВзаимодействие(ПараметрыДоставки, ПараметрыПисьма, СтрокаПолучатель, ПараметрыЖурнала); + Иначе + Письмо = ПодготовитьПисьмо(ПараметрыДоставки, ПараметрыПисьма); + РезультатОтправки = РаботаСПочтовымиСообщениями.ОтправитьПисьмо(ПараметрыДоставки.УчетнаяЗапись, Письмо); + + Если ПолучитьФункциональнуюОпцию("ХранитьИсториюРассылкиОтчетов") Тогда + ПредставлениеОтправителя = Строка(ПараметрыДоставки.УчетнаяЗапись); + + Если ПараметрыДоставки.Получатель <> Неопределено Тогда + + Для Каждого Кому Из ПараметрыПисьма.Кому Цикл + ПредставлениеПолучателя = Строка(ПараметрыДоставки.Получатель) + " (" + Кому.Адрес + ")"; + + ПоляИстории = ПоляИсторииРассылкиОтчетов(ПараметрыЖурнала.Данные, ПараметрыДоставки.Получатель, ПараметрыДоставки.ДатаВыполнения); + ПоляИстории.УчетнаяЗапись = ПараметрыДоставки.УчетнаяЗапись; + ПоляИстории.АдресЭП = Кому.Адрес; + ТекстОшибкиПолучателя = РезультатОтправки.ОшибочныеПолучатели.Получить(Кому.Адрес); + Если ТекстОшибкиПолучателя <> Неопределено Тогда + ПоляИстории.Комментарий = ТекстОшибкиПолучателя; + ПоляИстории.Выполнена = Ложь; + Иначе + ПоляИстории.Комментарий = ТекстУспешнойОтправкиОтчетов(ПараметрыДоставки, СтрокаПолучатель, ПредставлениеПолучателя, ПредставлениеОтправителя); + ПоляИстории.Выполнена = Истина; + КонецЕсли; + ПоляИстории.СпособПолучения = СпособПолученияРассылки(ПараметрыДоставки, ПараметрыДоставки.Получатель, + Кому.Адрес); + ПоляИстории.ИдентификаторПисьма = РезультатОтправки.ИдентификаторПисьмаSMTP; + + РегистрыСведений.ИсторияРассылкиОтчетов.ЗафиксироватьРезультатВыполненияРассылкиПолучателю(ПоляИстории); + КонецЦикла; + ИначеЕсли ПараметрыДоставки.Получатели <> Неопределено Тогда + Для Каждого Получатель Из ПараметрыДоставки.Получатели Цикл + Если ПараметрыДоставки.ТолькоУведомить Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Уведомления отправлены ''%1'' от %2. %3'"), ПредставлениеПолучателя, + ПредставлениеОтправителя); + Иначе + ТекстСообщения = ТекстУспешнойОтправкиОтчетов(ПараметрыДоставки, СтрокаПолучатель, ПредставлениеПолучателя, ПредставлениеОтправителя); + КонецЕсли; + АдресаПолучателя = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(Получатель.Значение); + Для Каждого Кому Из АдресаПолучателя Цикл + ПредставлениеПолучателя = Строка(Получатель.Ключ) + " (" + Кому.Адрес + ")"; + ПоляИстории = ПоляИсторииРассылкиОтчетов(ПараметрыЖурнала.Данные, Получатель.Ключ, ПараметрыДоставки.ДатаВыполнения); + ПоляИстории.УчетнаяЗапись = ПараметрыДоставки.УчетнаяЗапись; + ПоляИстории.АдресЭП = Кому.Адрес; + ТекстОшибкиПолучателя = РезультатОтправки.ОшибочныеПолучатели.Получить(Кому.Адрес); + Если ТекстОшибкиПолучателя <> Неопределено Тогда + ПоляИстории.Комментарий = ТекстОшибкиПолучателя; + ПоляИстории.Выполнена = Ложь; + Иначе + ПоляИстории.Комментарий = ТекстСообщения; + ПоляИстории.Выполнена = Истина; + КонецЕсли; + ПоляИстории.СпособПолучения = СпособПолученияРассылки(ПараметрыДоставки, Получатель.Ключ, Кому.Адрес); + ПоляИстории.ИдентификаторПисьма = РезультатОтправки.ИдентификаторПисьмаSMTP; + РегистрыСведений.ИсторияРассылкиОтчетов.ЗафиксироватьРезультатВыполненияРассылкиПолучателю(ПоляИстории); + КонецЦикла; + КонецЦикла; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + КонецПроцедуры +Процедура ОтправитьПисьмоВзаимодействие(ПараметрыДоставки, ПараметрыПисьма, СтрокаПолучатель, ПараметрыЖурнала) + + МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); + + Сообщение = ПараметрыСообщенияДляПодсистемыВзаимодействия(ПараметрыДоставки, ПараметрыПисьма); + + РезультатОтправки = МодульВзаимодействия.СоздатьПисьмо(Сообщение, ПараметрыДоставки.УчетнаяЗапись, Истина); + + Если РезультатОтправки.Отправлено Тогда + + Если ЗначениеЗаполнено(ПараметрыДоставки.УчетнаяЗапись) Тогда + ПредставлениеОтправителя = Строка(ПараметрыДоставки.УчетнаяЗапись); + ОтправлятьСкрытыеКопииОтправителю = ОбщегоНазначения.ЗначениеРеквизитаОбъекта( + ПараметрыДоставки.УчетнаяЗапись, "ОтправлятьСкрытыеКопииПисемНаЭтотАдрес"); + Иначе + ПредставлениеОтправителя = ""; + ОтправлятьСкрытыеКопииОтправителю = Ложь; + КонецЕсли; + + ДополнительныеСведения = ""; + Если ОтправлятьСкрытыеКопииОтправителю Тогда + ДополнительныеСведения = НСтр("ru = 'Копия направлена отправителю.'"); + КонецЕсли; + + Если ПараметрыДоставки.Получатель <> Неопределено Тогда + + АдресаПолучателя = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(ПараметрыПисьма.Кому); + Для Каждого Кому Из АдресаПолучателя Цикл + ПредставлениеПолучателя = Строка(ПараметрыДоставки.Получатель) + " (" + Кому.Адрес + ")"; + + ПоляИстории = ПоляИсторииРассылкиОтчетов(ПараметрыЖурнала.Данные, ПараметрыДоставки.Получатель, ПараметрыДоставки.ДатаВыполнения); + ПоляИстории.УчетнаяЗапись = ПараметрыДоставки.УчетнаяЗапись; + ПоляИстории.АдресЭП = Кому.Адрес; + ТекстОшибкиПолучателя = РезультатОтправки.ОшибочныеПолучатели.Получить(Кому.Адрес); + Если ТекстОшибкиПолучателя <> Неопределено Тогда + ПоляИстории.Комментарий = ТекстОшибкиПолучателя; + ПоляИстории.Выполнена = Ложь; + Иначе + ПоляИстории.Комментарий = ТекстУспешнойОтправкиОтчетов(ПараметрыДоставки, СтрокаПолучатель, ПредставлениеПолучателя, ПредставлениеОтправителя, ДополнительныеСведения); + ПоляИстории.Выполнена = Истина; + КонецЕсли; + ПоляИстории.СпособПолучения = СпособПолученияРассылки(ПараметрыДоставки, ПараметрыДоставки.Получатель, Кому.Адрес); + ПоляИстории.ЭлектронноеПисьмоИсходящее = РезультатОтправки.СсылкаНаПисьмо; + ПоляИстории.ИдентификаторПисьма = РезультатОтправки.ИдентификаторПисьма; + + РегистрыСведений.ИсторияРассылкиОтчетов.ЗафиксироватьРезультатВыполненияРассылкиПолучателю(ПоляИстории); + КонецЦикла; + ИначеЕсли ПараметрыДоставки.Получатели <> Неопределено Тогда + Для Каждого Получатель Из ПараметрыДоставки.Получатели Цикл + АдресаПолучателя = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(Получатель.Значение); + Для Каждого Кому Из АдресаПолучателя Цикл + + ПредставлениеПолучателя = Строка(Получатель.Ключ) + " (" + Кому.Адрес + ")"; + Если ПараметрыДоставки.ТолькоУведомить Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Уведомления отправлены ''%1'' от %2. %3'"), ПредставлениеПолучателя, + ПредставлениеОтправителя, ДополнительныеСведения); + Иначе + ТекстСообщения = ТекстУспешнойОтправкиОтчетов(ПараметрыДоставки, СтрокаПолучатель, ПредставлениеПолучателя, ПредставлениеОтправителя, ДополнительныеСведения); + КонецЕсли; + ПоляИстории = ПоляИсторииРассылкиОтчетов(ПараметрыЖурнала.Данные, Получатель.Ключ, ПараметрыДоставки.ДатаВыполнения); + ПоляИстории.УчетнаяЗапись = ПараметрыДоставки.УчетнаяЗапись; + ПоляИстории.АдресЭП = Кому.Адрес; + ТекстОшибкиПолучателя = РезультатОтправки.ОшибочныеПолучатели.Получить(Кому.Адрес); + Если ТекстОшибкиПолучателя <> Неопределено Тогда + ПоляИстории.Комментарий = ТекстОшибкиПолучателя; + ПоляИстории.Выполнена = Ложь; + Иначе + ПоляИстории.Комментарий = ТекстСообщения; + ПоляИстории.Выполнена = Истина; + КонецЕсли; + ПоляИстории.СпособПолучения = СпособПолученияРассылки(ПараметрыДоставки, Получатель.Ключ, Кому.Адрес); + ПоляИстории.ЭлектронноеПисьмоИсходящее = РезультатОтправки.СсылкаНаПисьмо; + ПоляИстории.ИдентификаторПисьма = РезультатОтправки.ИдентификаторПисьма; + + РегистрыСведений.ИсторияРассылкиОтчетов.ЗафиксироватьРезультатВыполненияРассылкиПолучателю(ПоляИстории); + КонецЦикла; + КонецЦикла; + КонецЕсли; + + Иначе + Если ПараметрыДоставки.Получатель <> Неопределено Тогда + АдресаПолучателя = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(ПараметрыПисьма.Кому); + Для Каждого Кому Из АдресаПолучателя Цикл + + ПоляИстории = ПоляИсторииРассылкиОтчетов(ПараметрыЖурнала.Данные, ПараметрыДоставки.Получатель, ПараметрыДоставки.ДатаВыполнения); + ПоляИстории.УчетнаяЗапись = ПараметрыДоставки.УчетнаяЗапись; + ПоляИстории.АдресЭП = Кому.Адрес; + ПоляИстории.Комментарий = РезультатОтправки.ОписаниеОшибки; + ПоляИстории.Выполнена = Ложь; + ПоляИстории.СпособПолучения = СпособПолученияРассылки(ПараметрыДоставки, ПараметрыДоставки.Получатель, Кому.Адрес); + ПоляИстории.ЭлектронноеПисьмоИсходящее = РезультатОтправки.СсылкаНаПисьмо; + ПоляИстории.ИдентификаторПисьма = РезультатОтправки.ИдентификаторПисьма; + + РегистрыСведений.ИсторияРассылкиОтчетов.ЗафиксироватьРезультатВыполненияРассылкиПолучателю(ПоляИстории); + КонецЦикла; + Иначе + Для Каждого Получатель Из ПараметрыДоставки.Получатели Цикл + АдресаПолучателя = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(Получатель.Значение); + Для Каждого Кому Из АдресаПолучателя Цикл + + ПоляИстории = ПоляИсторииРассылкиОтчетов(ПараметрыЖурнала.Данные, Получатель.Ключ, ПараметрыДоставки.ДатаВыполнения); + ПоляИстории.УчетнаяЗапись = ПараметрыДоставки.УчетнаяЗапись; + ПоляИстории.АдресЭП = Кому.Адрес; + ПоляИстории.Комментарий = РезультатОтправки.ОписаниеОшибки; + ПоляИстории.Выполнена = Ложь; + ПоляИстории.СпособПолучения = СпособПолученияРассылки(ПараметрыДоставки, Получатель.Ключ, Кому.Адрес); + ПоляИстории.ЭлектронноеПисьмоИсходящее = РезультатОтправки.СсылкаНаПисьмо; + ПоляИстории.ИдентификаторПисьма = РезультатОтправки.ИдентификаторПисьма; + + РегистрыСведений.ИсторияРассылкиОтчетов.ЗафиксироватьРезультатВыполненияРассылкиПолучателю(ПоляИстории); + КонецЦикла; + КонецЦикла; + КонецЕсли; + + ВызватьИсключение (РезультатОтправки.ОписаниеОшибки); + + КонецЕсли; + +КонецПроцедуры + +Функция ПараметрыСообщенияДляПодсистемыВзаимодействия(ПараметрыДоставки, ПараметрыПисьма) + + МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); + Сообщение = МодульВзаимодействия.ПараметрыПисьма(); + Сообщение.Тема = ПараметрыПисьма.Тема; + Сообщение.Текст = ПараметрыПисьма.Тело; + Сообщение.ДополнительныеПараметры.УведомитьОДоставке = ПараметрыПисьма.УведомитьОДоставке; + Сообщение.ДополнительныеПараметры.УведомитьОПрочтении = ПараметрыПисьма.УведомитьОПрочтении; + + Если ПараметрыПисьма.ТипТекста = "ПростойТекст" ИЛИ ПараметрыПисьма.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст Тогда + Сообщение.ДополнительныеПараметры.ФорматПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст; + Иначе + Сообщение.ДополнительныеПараметры.ФорматПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML; + КонецЕсли; + + Если ЗначениеЗаполнено(ПараметрыДоставки.Получатель) Тогда + ПредставлениеПолучателя = Строка(ПараметрыДоставки.Получатель); + АдресаПолучателя = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(ПараметрыПисьма.Кому); + Для Каждого Кому Из АдресаПолучателя Цикл + НоваяСтрока = Сообщение.Получатели.Добавить(); + НоваяСтрока.Адрес = Кому.Адрес; + НоваяСтрока.Представление = ПредставлениеПолучателя + " (" + Кому.Адрес + ")"; + НоваяСтрока.ИсточникКонтактнойИнформации = ПараметрыДоставки.Получатель; + КонецЦикла; + Иначе + Для Каждого Получатель Из ПараметрыДоставки.Получатели Цикл + ПредставлениеПолучателя = Строка(Получатель.Ключ); + АдресаПолучателя = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(Получатель.Значение); + Для Каждого Кому Из АдресаПолучателя Цикл + НоваяСтрока = Сообщение.Получатели.Добавить(); + НоваяСтрока.Адрес = Кому.Адрес; + НоваяСтрока.Представление = ПредставлениеПолучателя + " (" + Кому.Адрес + ")"; + НоваяСтрока.ИсточникКонтактнойИнформации = Получатель.Ключ; + КонецЦикла; + КонецЦикла; + КонецЕсли; + + Для Каждого Картинка Из ПараметрыДоставки.Картинки Цикл + СтрокаВложение = Сообщение.Вложения.Добавить(); + ФайлКартинка = Картинка.Значение.ПолучитьДвоичныеДанные(); + СтрокаВложение.АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ФайлКартинка); + СтрокаВложение.Представление = Картинка.Ключ; + СтрокаВложение.Идентификатор = Картинка.Ключ; + КонецЦикла; + + Для Каждого Вложение Из ПараметрыПисьма.Вложения Цикл + СтрокаВложение = Сообщение.Вложения.Добавить(); + ФайлВложение = Новый ДвоичныеДанные(Вложение.Значение); + СтрокаВложение.АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ФайлВложение); + СтрокаВложение.Представление = Вложение.Ключ; + КонецЦикла; + + Возврат Сообщение; + +КонецФункции + +Функция ИспользуетсяПочтовыйКлиент() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда + МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); + Возврат МодульВзаимодействия.ИспользуетсяПочтовыйКлиент(); + КонецЕсли; + + Возврат Ложь; + +КонецФункции + Функция ПодготовитьПисьмо(ПараметрыДоставки, ПараметрыПисьма) - Если ПараметрыПисьма.Свойство("Картинки") - И ПараметрыПисьма.Картинки <> Неопределено - И ПараметрыПисьма.Картинки.Количество() > 0 Тогда + Если ПараметрыДоставки.Картинки.Количество() > 0 Тогда ФорматированныйДокумент = Новый ФорматированныйДокумент; - ФорматированныйДокумент.УстановитьHTML(ПараметрыПисьма.Тело, ПараметрыПисьма.Картинки); + ФорматированныйДокумент.УстановитьHTML(ПараметрыПисьма.Тело, ПараметрыДоставки.Картинки); ПараметрыПисьма.Тело = ФорматированныйДокумент; КонецЕсли; @@ -2589,9 +3323,16 @@ ЗаписьZipФайла.Записать(); + Если ЗначениеЗаполнено(ПараметрыДоставки.СертификатДляШифрования) Тогда + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + АрхивДвоичныеДанные = МодульЭлектроннаяПодпись.Зашифровать(Новый ДвоичныеДанные(ПолноеИмяФайла), + ПараметрыДоставки.СертификатДляШифрования); + АрхивДвоичныеДанные.Записать(ПолноеИмяФайла); + КонецЕсли; + Вложения = Новый Соответствие; Вложения.Вставить(ПараметрыДоставки.ИмяАрхива, ПолноеИмяФайла); - + Если ПараметрыДоставки.ИспользоватьЭлектроннуюПочту Тогда Если ПараметрыДоставки.ЗаполнитьСформированныеОтчетыВШаблонеСообщения Тогда ПараметрыДоставки.ПредставлениеОтчетовПолучателя = @@ -2659,7 +3400,7 @@ ИначеЕсли Формат = Перечисления.ФорматыСохраненияОтчетов.HTML Тогда Результат.Расширение = ".html"; - Результат.ТипФайла = ТипФайлаТабличногоДокумента.HTML; + Результат.ТипФайла = ТипФайлаТабличногоДокумента.HTML5; ИначеЕсли Формат = Перечисления.ФорматыСохраненияОтчетов.HTML4 Тогда Результат.Расширение = ".html"; @@ -2932,7 +3673,57 @@ ПараметрыДоставки.ПредставлениеОтчетовПолучателя = СокрЛП(СформированныеОтчеты); -КонецПроцедуры +КонецПроцедуры + +// Формирует текст о успешной отправки отчетов для записи в РегистрСведений.ИсторияРассылкиОтчетов. +Функция ТекстУспешнойОтправкиОтчетов(ПараметрыДоставки, СтрокаПолучатель, ПредставлениеПолучателя, ПредставлениеОтправителя, ДополнительныеСведения = "") + + СформированныеОтчеты = Новый Массив; + + Если ПараметрыДоставки.ИспользоватьЭлектроннуюПочту И ПараметрыДоставки.ЗаполнитьСформированныеОтчетыВШаблонеСообщения Тогда + + Для Каждого СтрокаОтчет Из ПараметрыДоставки.СтрокаОбщихОтчетов.Строки Цикл + СформированныеОтчеты.Добавить(СтрокаОтчет.Настройки.ПредставлениеВПисьме); + КонецЦикла; + + Если СтрокаПолучатель <> Неопределено И СтрокаПолучатель <> ПараметрыДоставки.СтрокаОбщихОтчетов Тогда + Для Каждого СтрокаОтчет Из СтрокаПолучатель.Строки Цикл + СформированныеОтчеты.Добавить(СтрокаОтчет.Настройки.ПредставлениеВПисьме); + КонецЦикла; + КонецЕсли; + + КонецЕсли; + + Если СформированныеОтчеты.Количество() = 1 Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '- ""%1"" отправлен от %2. %3'"), СформированныеОтчеты[0], + ПредставлениеОтправителя, ДополнительныеСведения); + Иначе + + ОтчетыСтрокой = ""; + + Для Каждого СтрокаОтчет Из СформированныеОтчеты Цикл + ОтчетыСтрокой = ОтчетыСтрокой + + ?(ЗначениеЗаполнено(ОтчетыСтрокой), Символы.ПС, "") + + "- """ + + СтрокаОтчет + + """"; + КонецЦикла; + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 отправлены от %2. %3'"), ОтчетыСтрокой, ПредставлениеОтправителя, + ДополнительныеСведения); + + КонецЕсли; + + Если ПараметрыДоставки.Архивировать Тогда + УпакованоВАрхив = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Упаковано в архив ""%1""'"), ПараметрыДоставки.ИмяАрхива); + ТекстСообщения = ТекстСообщения + Символы.ПС + УпакованоВАрхив; + КонецЕсли; + + Возврат ТекстСообщения; + +КонецФункции // Проверяет наличие внешних наборов данных. // @@ -3012,7 +3803,7 @@ Функция СписокФорматов() Экспорт СписокФорматов = Новый СписокЗначений; - УстановитьПараметрыФормата(СписокФорматов, "HTML4", БиблиотекаКартинок.ФорматHTML, Истина); + УстановитьПараметрыФормата(СписокФорматов, "HTML", БиблиотекаКартинок.ФорматHTML, Истина); УстановитьПараметрыФормата(СписокФорматов, "PDF" , БиблиотекаКартинок.ФорматPDF); УстановитьПараметрыФормата(СписокФорматов, "XLSX" , БиблиотекаКартинок.ФорматExcel2007); УстановитьПараметрыФормата(СписокФорматов, "XLS" , БиблиотекаКартинок.ФорматExcel); @@ -3025,18 +3816,11 @@ РассылкаОтчетовПереопределяемый.ПереопределитьПараметрыФорматов(СписокФорматов); // Оставшиеся форматы - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | Форматы.Ссылка - |ИЗ - | Перечисление.ФорматыСохраненияОтчетов КАК Форматы - |ГДЕ - | (НЕ Форматы.Ссылка В (&МассивФорматов))"; - Запрос.УстановитьПараметр("МассивФорматов", СписокФорматов.ВыгрузитьЗначения()); - Выборка = Запрос.Выполнить().Выбрать(); - Пока Выборка.Следующий() Цикл - УстановитьПараметрыФормата(СписокФорматов, Выборка.Ссылка); + Для каждого ФорматСсылка Из Перечисления.ФорматыСохраненияОтчетов Цикл + Если ФорматСсылка = Перечисления.ФорматыСохраненияОтчетов.HTML4 Тогда // Пропустить HTML4 + Продолжить; + КонецЕсли; + УстановитьПараметрыФормата(СписокФорматов, ФорматСсылка); КонецЦикла; Возврат СписокФорматов; @@ -3118,4 +3902,248 @@ КонецФункции +// Выполняет рассылки SMS с паролями архивов и размещает результат по адресу АдресРезультата. +// +// Параметры: +// ПараметрыВыполнения - Структура - выполняемые рассылки и их параметры: +// * ПодготовленныеSMS - Массив из Структура: +// ** НомераТелефонов - Массив из строк +// ** ТекстSMS - Строка +// ** Получатель - ОпределяемыйТип.ПолучательРассылки +// АдресРезультата - Строка - адрес во временном хранилище, по которому будет размещен результат. +// +Процедура ВыполнитьРассылкиSMSСПаролямиАрхивовРассылкиОтчетовВФоновомЗадании(Параметры, АдресРезультата) Экспорт + + МодульОтправкаSMS = ОбщегоНазначения.ОбщийМодуль("ОтправкаSMS"); + СообщенияОшибокРассылки = Новый Массив; + КоличествоОтправлено = 0; + РезультатПоПолучателям = Новый Массив; + Для Каждого ПодготовкаSMS Из Параметры.ПодготовленныеSMS Цикл + РезультатОтправки = МодульОтправкаSMS.ОтправитьSMS(ПодготовкаSMS.НомераТелефонов, ПодготовкаSMS.ТекстSMS); + РезультатПолучателя = Новый Структура("Получатель, НеОтправлено, Комментарий"); + РезультатПолучателя.Получатель = ПодготовкаSMS.Получатель; + Если ЗначениеЗаполнено(РезультатОтправки.ОписаниеОшибки) Тогда + СообщенияОшибокРассылки.Добавить(РезультатОтправки.ОписаниеОшибки); + РезультатПолучателя.Комментарий = РезультатОтправки.ОписаниеОшибки; + РезультатПолучателя.НеОтправлено = Истина; + Иначе + КоличествоОтправлено = КоличествоОтправлено + 1; + РезультатПолучателя.Комментарий = НСтр("ru = 'SMS отправлено.'"); + КонецЕсли; + РезультатПоПолучателям.Добавить(РезультатПолучателя); + КонецЦикла; + + КоличествоНеОтправлено = Параметры.КоличествоНеОтправлено + СообщенияОшибокРассылки.Количество(); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Отправлены SMS с паролями архивов. Отправлено: %1; не отправлено: %2.'"), КоличествоОтправлено, + КоличествоНеОтправлено); + + Результат = Новый Структура; + Результат.Вставить("Текст", ТекстСообщения); + Результат.Вставить("Подробно", СтрокаСообщенийПользователю(СообщенияОшибокРассылки)); + Результат.Вставить("РезультатПоПолучателям", РезультатПоПолучателям); + Результат.Вставить("КоличествоОтправлено", КоличествоОтправлено); + Результат.Вставить("КоличествоНеОтправлено", КоличествоНеОтправлено); + ПоместитьВоВременноеХранилище(Результат, АдресРезультата); + +КонецПроцедуры + +Функция ПоляИсторииРассылкиОтчетов(РассылкаОтчетов, Получатель, ЗапускРассылки) + + ПоляИстории = Новый Структура; + ПоляИстории.Вставить("РассылкаОтчетов", РассылкаОтчетов); + ПоляИстории.Вставить("Получатель", Получатель); + ПоляИстории.Вставить("ЗапускРассылки", ЗапускРассылки); + ПоляИстории.Вставить("Период", ТекущаяДатаСеанса()); + ПоляИстории.Вставить("УчетнаяЗапись", ""); + ПоляИстории.Вставить("АдресЭП", ""); + ПоляИстории.Вставить("Комментарий", ""); + ПоляИстории.Вставить("Выполнена", Ложь); + ПоляИстории.Вставить("ЭлектронноеПисьмоИсходящее", ""); + ПоляИстории.Вставить("СпособПолучения", ""); + ПоляИстории.Вставить("ИдентификаторПисьма", ""); + ПоляИстории.Вставить("ДатаДоставки", '00010101'); + ПоляИстории.Вставить("Статус", Перечисления.СтатусыЭлектронныхПисем.ПустаяСсылка()); + ПоляИстории.Вставить("НомерСеанса", НомерСеансаИнформационнойБазы()); + + Возврат ПоляИстории; + +КонецФункции + +// Формирует строку способа получения рассылки +// +// Параметры: +// ПараметрыДоставки - см. РассылкаОтчетов.ПараметрыДоставки. +// Получатель - ОпределяемыйТип.ПолучательРассылки +// АдресПочты - Строка +// +// +// Возвращаемое значение: +// Строка +// +Функция СпособПолученияРассылки(ПараметрыДоставки, Получатель, АдресПочты = "") + + СпособПолучения = ""; + + Если ПараметрыДоставки.ИспользоватьСетевойКаталог Тогда + СетевойКаталогСервера = ПараметрыДоставки.СетевойКаталогWindows; + СистемнаяИнфо = Новый СистемнаяИнформация; + ТипПлатформыСервера = СистемнаяИнфо.ТипПлатформы; + + Если ТипПлатформыСервера = ТипПлатформы.Linux_x86 Или ТипПлатформыСервера = ТипПлатформы.Linux_x86_64 Тогда + СетевойКаталогСервера = ПараметрыДоставки.СетевойКаталогLinux; + КонецЕсли; + + СпособПолучения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = 'Публиковать в сетевой каталог: ""%1"".'"), СетевойКаталогСервера); + КонецЕсли; + + Если ПараметрыДоставки.ИспользоватьFTPРесурс Тогда + РесурсFTP = "ftp://" + ПараметрыДоставки.Сервер + ":" + Формат(ПараметрыДоставки.Порт, "ЧН=0; ЧГ=0") + + ПараметрыДоставки.Каталог; + СпособПолучения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = 'Публиковать на FTP ресурс: ""%1"".'"), РесурсFTP); + КонецЕсли; + + Если ПараметрыДоставки.ИспользоватьПапку Тогда + СпособПолучения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = 'Публиковать в папку: ""%1"".'"), Строка(ПараметрыДоставки.Папка)); + КонецЕсли; + + Если ПараметрыДоставки.ИспользоватьЭлектроннуюПочту Тогда + Если НЕ ЗначениеЗаполнено(АдресПочты) Тогда + Если ПараметрыДоставки.Получатели <> Неопределено Тогда + Адрес = ПараметрыДоставки.Получатели.Получить(Получатель); + АдресПочты = ?(Адрес <> Неопределено, Адрес, НСтр("ru = 'Адрес электронной почты не указан.'")); + Иначе + АдресПочты = НСтр("ru = 'Адрес электронной почты не указан.'"); + КонецЕсли; + КонецЕсли; + Если ПараметрыДоставки.ТолькоУведомить Тогда + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = 'Отправить уведомление по электронной почте: ""%1"".'"), АдресПочты); + СпособПолучения = ?(ЗначениеЗаполнено(СпособПолучения), СпособПолучения + " " + Текст, Текст); + Иначе + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = 'Отправить по электронной почте: ""%1"".'"), АдресПочты); + СпособПолучения = ?(ЗначениеЗаполнено(СпособПолучения), СпособПолучения + " " + Текст, Текст); + КонецЕсли; + + КонецЕсли; + + Возврат СпособПолучения; + +КонецФункции + +// Только для служебного использования. +Процедура ОчиститьУстаревшиеЗаписиИсторииРассылкиОтчетов() Экспорт + + ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ОчисткаИсторииРассылкиОтчетов); + + РезультатУдаленияУстаревшихЗаписейИсторииРассылкиОтчетов(); + +КонецПроцедуры + +Функция РезультатУдаленияУстаревшихЗаписейИсторииРассылкиОтчетов() + + РезультатУдаления = Новый Структура("КоличествоУдалено", 0); + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ИсторияРассылкиОтчетов.РассылкаОтчетов КАК РассылкаОтчетов, + | ИсторияРассылкиОтчетов.Получатель КАК Получатель, + | ИсторияРассылкиОтчетов.ЗапускРассылки КАК ЗапускРассылки + |ИЗ + | РегистрСведений.ИсторияРассылкиОтчетов КАК ИсторияРассылкиОтчетов + |ГДЕ + | ИсторияРассылкиОтчетов.ЗапускРассылки < &НачальнаяДатаХраненияИстории"; + + КоличествоМесяцев = Константы.КоличествоМесяцевХраненияИсторииРассылкиОтчетов.Получить(); + НачальнаяДатаХраненияИстории = ?(ПолучитьФункциональнуюОпцию("ХранитьИсториюРассылкиОтчетов"), + ТекущаяДатаСеанса() - КоличествоМесяцев * 2592000, ТекущаяДатаСеанса()); + + Запрос.УстановитьПараметр("НачальнаяДатаХраненияИстории", НачальнаяДатаХраненияИстории); + + НачатьТранзакцию(); + Попытка + + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить("РегистрСведений.ИсторияРассылкиОтчетов"); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Разделяемый; + БлокировкаДанных.Заблокировать(); + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + НаборЗаписей = РегистрыСведений.ИсторияРассылкиОтчетов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.РассылкаОтчетов.Установить(Выборка.РассылкаОтчетов); + НаборЗаписей.Отбор.Получатель.Установить(Выборка.Получатель); + НаборЗаписей.Отбор.ЗапускРассылки.Установить(Выборка.ЗапускРассылки); + НаборЗаписей.Записать(); + РезультатУдаления.КоличествоУдалено = РезультатУдаления.КоличествоУдалено + 1; + КонецЦикла; + + ЗафиксироватьТранзакцию(); + + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + УстановитьПривилегированныйРежим(Ложь); + + Возврат РезультатУдаления; + +КонецФункции + +Процедура ВыполнитьОчисткуИсторииРассылкиОтчетовВФоновомЗадании(Параметры, АдресРезультата) Экспорт + + РезультатУдаления = РезультатУдаленияУстаревшихЗаписейИсторииРассылкиОтчетов(); + + ТекстСообщения = СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(НСтр( + "ru = ';Очищена %1 запись истории рассылки отчетов;;Очищено %1 записи истории рассылки отчетов; + |Очищено %1 записей истории рассылки отчетов;Очищено %1 записи истории рассылки отчетов'"), + РезультатУдаления.КоличествоУдалено); + + Результат = Новый Структура; + Результат.Вставить("Текст", ТекстСообщения); + ПоместитьВоВременноеХранилище(Результат, АдресРезультата); + +КонецПроцедуры + +// Устанавливает значение количества месяцев хранения истории рассылки по умолчанию +// +Процедура УстановитьКоличествоМесяцевХраненияИсторииРассылкиОтчетов() Экспорт + + Константы.КоличествоМесяцевХраненияИсторииРассылкиОтчетов.Установить(3); + +КонецПроцедуры + +Функция ДоступноШифрованиеВложений() Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + Возврат Ложь; + Иначе + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + Возврат МодульЭлектроннаяПодпись.ИспользоватьШифрование(); + КонецЕсли; + +КонецФункции + +// Возвращает шаблон тела сообщения по умолчанию для доставки по электронной почте. +Функция ШаблонТекста() Экспорт + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = 'Сформированы отчеты: + | + |%1'"), + "[СформированныеОтчеты] + | + |[СпособДоставки] + | + |[ЗаголовокСистемы] + |[ДатаВыполнения(ДЛФ='DD')]"); +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/РассылкаОтчетовВызовСервера/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовВызовСервера/Module.bsl index 932063621..a80026597 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовВызовСервера/Module.bsl @@ -6,6 +6,21 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ПриИзмененииХранитьИсториюРассылкиОтчетов() Экспорт + + Если ПолучитьФункциональнуюОпцию("ХранитьИсториюРассылкиОтчетов") Тогда + УстановитьИспользованиеРегламентногоЗадания(Метаданные.РегламентныеЗадания.ПолучениеСтатусовЭлектронныхПисем, Истина); + УстановитьИспользованиеРегламентногоЗадания(Метаданные.РегламентныеЗадания.ОчисткаИсторииРассылкиОтчетов, Истина); + Иначе + УстановитьИспользованиеРегламентногоЗадания(Метаданные.РегламентныеЗадания.ОчисткаИсторииРассылкиОтчетов, Ложь); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + #Область СлужебныеПроцедурыИФункции // Для внутреннего использования. @@ -49,4 +64,48 @@ Возврат ДлительныеОперации.ВыполнитьВФоне(ИмяМетода, ПараметрыМетода, НастройкиЗапуска); КонецФункции +// Запускает фоновое задание для рассылки SMS с паролями архивов, для открытия вложений рассылки отчетов. +Функция ЗапуститьФоновоеЗаданиеРассылкиSMSСПаролями(Знач ПараметрыМетода, Знач УникальныйИдентификатор) Экспорт + ИмяМетода = "РассылкаОтчетов.ВыполнитьРассылкиSMSСПаролямиАрхивовРассылкиОтчетовВФоновомЗадании"; + + НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); + НастройкиЗапуска.НаименованиеФоновогоЗадания = НСтр("ru = 'Рассылки отчетов: Выполнение SMS-рассылок с паролями в фоне'"); + + Возврат ДлительныеОперации.ВыполнитьВФоне(ИмяМетода, ПараметрыМетода, НастройкиЗапуска); +КонецФункции + +// Запускает фоновое задание для очистки истории рассылки отчетов +Функция ЗапуститьФоновоеЗаданиеОчисткиИсторииРассылкиОтчетов(Знач ПараметрыМетода, Знач УникальныйИдентификатор) Экспорт + ИмяМетода = "РассылкаОтчетов.ВыполнитьОчисткуИсторииРассылкиОтчетовВФоновомЗадании"; + + НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); + НастройкиЗапуска.НаименованиеФоновогоЗадания = НСтр("ru = 'Рассылки отчетов: Очистка истории рассылки отчетов'"); + + Возврат ДлительныеОперации.ВыполнитьВФоне(ИмяМетода, ПараметрыМетода, НастройкиЗапуска); +КонецФункции + +Процедура УстановитьИспользованиеРегламентногоЗадания(МетаданныеЗадание, Использование) + + ПараметрыЗадания = Новый Структура; + ПараметрыЗадания.Вставить("Метаданные", МетаданныеЗадание); + + УстановитьПривилегированныйРежим(Истина); + + СписокЗаданий = РегламентныеЗаданияСервер.НайтиЗадания(ПараметрыЗадания); + Если СписокЗаданий.Количество() = 0 Тогда + ПараметрыЗадания = Новый Структура; + ПараметрыЗадания.Вставить("Использование", Использование); + ПараметрыЗадания.Вставить("Метаданные", МетаданныеЗадание); + РегламентныеЗаданияСервер.ДобавитьЗадание(ПараметрыЗадания); + Иначе + ПараметрыЗадания = Новый Структура("Использование", Использование); + Для Каждого Задание Из СписокЗаданий Цикл + РегламентныеЗаданияСервер.ИзменитьЗадание(Задание, ПараметрыЗадания); + КонецЦикла; + КонецЕсли; + + УстановитьПривилегированныйРежим(Ложь); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/РассылкаОтчетовКлиент/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовКлиент/Module.bsl index 87e0fe316..5084d2d0a 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовКлиент/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовКлиент/Module.bsl @@ -83,6 +83,23 @@ КонецПроцедуры +Процедура ОчиститьИсториюРассылкиОтчетов(Форма) Экспорт + + Если Форма.НаборКонстант.ХранитьИсториюРассылкиОтчетов Тогда + ТекстВопроса = СтроковыеФункцииКлиент.ФорматированнаяСтрока(НСтр( + "ru = 'Очистить устаревшую историю рассылки отчетов?'")); + Иначе + ТекстВопроса = СтроковыеФункцииКлиент.ФорматированнаяСтрока(НСтр( + "ru = 'Очистить историю рассылки отчетов?'")); + КонецЕсли; + + Параметры = Новый Структура("Форма", Форма); + + ПоказатьВопрос(Новый ОписаниеОповещения("ОтветОчиститьИсториюРассылкиОтчетов", ЭтотОбъект, Параметры), ТекстВопроса, + РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -179,7 +196,7 @@ Если Параметры.ЭтоФормаЭлемента Тогда Объект = Параметры.Форма.Объект; Если Не Объект.Подготовлена Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Рассылка не подготовлена'")); + ПоказатьПредупреждение(, НСтр("ru = 'Рассылка не подготовлена.'")); Возврат; КонецЕсли; Если Объект.ИспользоватьЭлектроннуюПочту Тогда @@ -368,4 +385,120 @@ КонецФункции +// Выполняет рассылку SMS с паролями рассылки в фоне. +Процедура ВыполнитьРассылкуSMS(Параметры) Экспорт + Обработчик = Новый ОписаниеОповещения("ВыполнитьРассылкуSMSВФоне", ЭтотОбъект, Параметры); + ВыполнитьОбработкуОповещения(Обработчик, Неопределено); +КонецПроцедуры + +// Запускает фоновое задание, вызывается когда все параметры уже готовы. +Процедура ВыполнитьРассылкуSMSВФоне(Получатели, Параметры) Экспорт + + ПараметрыМетода = Новый Структура; + ПараметрыМетода.Вставить("ПодготовленныеSMS", Параметры.ПодготовленныеSMS); + ПараметрыМетода.Вставить("КоличествоНеОтправлено", Параметры.КоличествоНеОтправлено); + + Задание = РассылкаОтчетовВызовСервера.ЗапуститьФоновоеЗаданиеРассылкиSMSСПаролями(ПараметрыМетода, + Параметры.Форма.УникальныйИдентификатор); + + НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Параметры.Форма); + НастройкиОжидания.ВыводитьОкноОжидания = Истина; + НастройкиОжидания.ТекстСообщения = НСтр("ru = 'Выполняется рассылка SMS с паролями для рассылки отчетов.'"); + + Обработчик = Новый ОписаниеОповещения("ВыполнитьРассылкуSMSВФонеЗавершение", ЭтотОбъект, Параметры); + ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания); + +КонецПроцедуры + +// Принимает результат выполнения фонового задания. +// +// Параметры: +// Задание - см. ДлительныеОперации.ВыполнитьВФоне +// Параметры - Структура: +// * КоличествоНеОтправлено - Число +// * ПодготовленныеSMS - Массив из Структура: +// ** НомераТелефонов - Массив из строк +// ** ТекстSMS - Строка +// ** Получатель - ОпределяемыйТип.ПолучательРассылки +// * Форма - ФормаКлиентскогоПриложения: +// ** Элементы - ВсеЭлементыФормы +// ** РезультатРассылкиSMS - ДанныеФормыКоллекция +// ** РезультатРассылкиSMSБезОтборов - ДанныеФормыКоллекция +// +Процедура ВыполнитьРассылкуSMSВФонеЗавершение(Задание, Параметры) Экспорт + + Если Задание = Неопределено Тогда + Возврат; // Отменено. + КонецЕсли; + + Форма = Параметры.Форма; + + Если НЕ Форма.Элементы.Закрыть.Видимость Тогда + Форма.Элементы.Закрыть.Видимость = Истина; + КонецЕсли; + + Если Задание.Статус = "Выполнено" Тогда + Результат = ПолучитьИзВременногоХранилища(Задание.АдресРезультата); + ПоказатьОповещениеПользователя(,, Результат.Текст, БиблиотекаКартинок.РассылкаОтчетов, СтатусОповещенияПользователя.Информация); + Для Каждого РезультатПолучателя Из Результат.РезультатПоПолучателям Цикл + СтрокаРезультата = Форма.РезультатРассылкиSMS.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаРезультата, РезультатПолучателя); + СтрокаРезультатБезОтборов = Форма.РезультатРассылкиSMSБезОтборов.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаРезультатБезОтборов, СтрокаРезультата); + КонецЦикла; + Форма.КоличествоОтправлено = Результат.КоличествоОтправлено; + Форма.КоличествоНеОтправлено = Результат.КоличествоНеОтправлено; + Форма.Автозаголовок = Ложь; + Форма.Заголовок = НСтр("ru = 'Результат отправки SMS с паролями архивов'"); + Форма.Элементы.Страницы.ТекущаяСтраница = Форма.Элементы.СтраницаИнформация; + Иначе + Форма.Элементы.Страницы.ТекущаяСтраница = Форма.Элементы.СтраницаИнформация; + ВызватьИсключение НСтр("ru = 'Не удалось выполнить SMS-рассылку с паролями для получения рассылки отчетов.'") + + Символы.ПС + Задание.КраткоеПредставлениеОшибки; + КонецЕсли; + +КонецПроцедуры + +Процедура ОтветОчиститьИсториюРассылкиОтчетов(Результат, Параметры) Экспорт + + Если Результат = КодВозвратаДиалога.Да Тогда + Обработчик = Новый ОписаниеОповещения("ВыполнитьОчисткуИсторииРассылкиОтчетовВФоне", ЭтотОбъект, Параметры); + ВыполнитьОбработкуОповещения(Обработчик, Неопределено); + КонецЕсли; + +КонецПроцедуры + +// Запускает фоновое задание, вызывается когда все параметры уже готовы. +Процедура ВыполнитьОчисткуИсторииРассылкиОтчетовВФоне(Параметры, ДополнительныеПараметры) Экспорт + + ПараметрыМетода = Новый Структура; + + Задание = РассылкаОтчетовВызовСервера.ЗапуститьФоновоеЗаданиеОчисткиИсторииРассылкиОтчетов(ПараметрыМетода, + ДополнительныеПараметры.Форма.УникальныйИдентификатор); + + НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ДополнительныеПараметры.Форма); + НастройкиОжидания.ВыводитьОкноОжидания = Истина; + НастройкиОжидания.ТекстСообщения = НСтр("ru = 'Выполняется очистка истории рассылки отчетов.'"); + + Обработчик = Новый ОписаниеОповещения("ВыполнитьОчисткуИсторииРассылкиОтчетовЗавершение", ЭтотОбъект, ДополнительныеПараметры); + ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания); + +КонецПроцедуры + +Процедура ВыполнитьОчисткуИсторииРассылкиОтчетовЗавершение(Задание, Параметры) Экспорт + + Если Задание = Неопределено Тогда + Возврат; // Отменено. + КонецЕсли; + + Если Задание.Статус = "Выполнено" Тогда + Результат = ПолучитьИзВременногоХранилища(Задание.АдресРезультата); + ПоказатьОповещениеПользователя(,, Результат.Текст, , СтатусОповещенияПользователя.Информация); + Иначе + ВызватьИсключение НСтр("ru = 'Не удалось выполнить очистку истории рассылки отчетов.'") + + Символы.ПС + Задание.КраткоеПредставлениеОшибки; + КонецЕсли; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/РассылкаОтчетовКлиентСервер/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовКлиентСервер/Module.bsl index 2f2d13331..3d2783dc6 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовКлиентСервер/Module.bsl @@ -203,4 +203,219 @@ Возврат Результат; КонецФункции -#КонецОбласти +// Возвращает шаблон темы по умолчанию для доставки по электронной почте. +Функция ШаблонТемы() Экспорт + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 от %2'"), "[НаименованиеРассылки]", "[ДатаВыполнения(ДЛФ='D')]"); +КонецФункции + +// Возвращает шаблон наименования архива по умолчанию. +Функция ШаблонИмениАрхива() Экспорт + + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 от %2'"), "[НаименованиеРассылки]", "[ДатаВыполнения(ДФ='yyyy-MM-dd')]"); + +КонецФункции + +// Конструктор для значения параметра ПараметрыДоставки функции ВыполнитьРассылку. +// +// Возвращаемое значение: +// Структура - настройки способа доставки отчетов. Состав свойств может отличаться для разных способов доставки. +// Общие свойства: +// * Автор - СправочникСсылка.Пользователи - автор рассылки. +// * ИспользоватьПапку - Булево - доставлять отчеты в папку подсистемы "Работа с файлами". +// * ИспользоватьСетевойКаталог - Булево - доставлять отчеты в папку файловой системы. +// * ИспользоватьFTPРесурс - Булево - доставлять отчеты на FTP. +// * ИспользоватьЭлектроннуюПочту - Булево - доставлять отчеты по электронной почте. +// +// Свойства, когда ИспользоватьПапку = Истина: +// * Папка - СправочникСсылка.ПапкиФайлов - папка подсистемы "Работа с файлами". +// +// Свойства, когда ИспользоватьСетевойКаталог = Истина: +// * СетевойКаталогWindows - Строка - каталог файловой системы (локальный на сервере или сетевой). +// * СетевойКаталогLinux - Строка - каталог файловой системы (локальный на сервере или сетевой). +// +// Свойства, когда ИспользоватьFTPРесурс = Истина: +// * Владелец - СправочникСсылка.РассылкиОтчетов +// * Сервер - Строка - имя FTP сервера. +// * Порт - Число - порт FTP сервера. +// * Логин - Строка - имя пользователя FTP сервера. +// * Пароль - Строка - пароль пользователя FTP сервера. +// * Каталог - Строка - путь к каталогу на FTP сервере. +// * ПассивноеСоединение - Булево - использовать пассивное соединение. +// +// Свойства, когда ИспользоватьЭлектроннуюПочту = Истина: +// * УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - для отправки почтового сообщения. +// * Получатели - Соответствие из КлючИЗначение - набор получателей и их e-mail адресов: +// ** Ключ - СправочникСсылка - получатель. +// ** Значение - Строка - email-адреса получателя, разделенные запятыми. +// +// Дополнительные свойства: +// * Архивировать - Булево - архивировать все файлы сформированных отчетов в один архив. +// Архивация может потребоваться, например, при рассылке графиков в формате html. +// * ИмяАрхива - Строка - имя архива. +// * ПарольАрхива - Строка - пароль архива. +// * ТранслитерироватьИменаФайлов - Булево - признак необходимости транслитерации имен файлов отчетов рассылки. +// * СертификатДляШифрования - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - если внедрена +// подсистема ЭлектроннаяПодпись - Неопределено +// +// Необязательные свойства, когда ИспользоватьЭлектроннуюПочту = Истина: +// * Персонализирована - Булево - рассылка персонализирована получателями. +// Значение по умолчанию Ложь. +// Если установить значение Истина, то каждый получатель получит отчет с отбором по нему. +// Для этого в отчетах следует установить отбор "[Получатель]" по реквизиту, совпадающем с типом получателя. +// Применимо только только при доставке по почте, +// поэтому когда устанавливается в Истина, то другие способы доставки отключаются. +// * ТолькоУведомить - Булево - Ложь - отправлять только уведомления (не присоединять сформированные отчеты). +// * СкрытыеКопии - Булево - Ложь - если Истина, то при отправке вместо "Кому" заполняется "СкрытыеКопии". +// * ШаблонТемы - Строка - тема письма. +// * ШаблонТекста - Строка - тело письма. +// * ПараметрыФорматов - Соответствие из КлючИЗначение: +// ** Ключ - ПеречислениеСсылка.ФорматыСохраненияОтчетов +// ** Значение - Структура: +// *** Расширение - Строка +// *** ТипФайла - ТипФайлаТабличногоДокумента +// *** Имя - Строка +// * ПараметрыПисьма - см. ПараметрыОтправкиПисьма +// +Функция ПараметрыДоставки() Экспорт + + ПараметрыДоставки = Новый Структура; + ПараметрыДоставки.Вставить("ДатаВыполнения", Неопределено); + ПараметрыДоставки.Вставить("Соединение", Неопределено); + ПараметрыДоставки.Вставить("ЗапускЗафиксирован", Истина); + ПараметрыДоставки.Вставить("Автор", Неопределено); + ПараметрыДоставки.Вставить("ПараметрыПисьма", ПараметрыОтправкиПисьма()); + + ПараметрыДоставки.Вставить("НастройкиПолучателей", Новый Соответствие); + ПараметрыДоставки.Вставить("Получатели", Неопределено); + ПараметрыДоставки.Вставить("УчетнаяЗапись", Неопределено); + ПараметрыДоставки.Вставить("Рассылка", ""); + + ПараметрыДоставки.Вставить("ПисьмоВФорматеHTML", Ложь); + ПараметрыДоставки.Вставить("Персонализирована", Ложь); + ПараметрыДоставки.Вставить("ТранслитерироватьИменаФайлов", Ложь); + ПараметрыДоставки.Вставить("ТолькоУведомить", Ложь); + ПараметрыДоставки.Вставить("СкрытыеКопии", Ложь); + + ПараметрыДоставки.Вставить("ИспользоватьЭлектроннуюПочту", Ложь); + ПараметрыДоставки.Вставить("ИспользоватьПапку", Ложь); + ПараметрыДоставки.Вставить("ИспользоватьСетевойКаталог", Ложь); + ПараметрыДоставки.Вставить("ИспользоватьFTPРесурс", Ложь); + + ПараметрыДоставки.Вставить("Каталог", Неопределено); + ПараметрыДоставки.Вставить("СетевойКаталогWindows", Неопределено); + ПараметрыДоставки.Вставить("СетевойКаталогLinux", Неопределено); + ПараметрыДоставки.Вставить("КаталогВременныхФайлов", ""); + ПараметрыДоставки.Вставить("ВключатьДатуВИмяФайла", Ложь); + + ПараметрыДоставки.Вставить("Владелец", Неопределено); + ПараметрыДоставки.Вставить("Сервер", Неопределено); + ПараметрыДоставки.Вставить("Порт", Неопределено); + ПараметрыДоставки.Вставить("ПассивноеСоединение", Ложь); + ПараметрыДоставки.Вставить("Логин", Неопределено); + ПараметрыДоставки.Вставить("Пароль", Неопределено); + + ПараметрыДоставки.Вставить("Папка", Неопределено); + ПараметрыДоставки.Вставить("Архивировать", Ложь); + ПараметрыДоставки.Вставить("ИмяАрхива", ШаблонИмениАрхива()); + ПараметрыДоставки.Вставить("ПарольАрхива", Неопределено); + ПараметрыДоставки.Вставить("СертификатДляШифрования", Неопределено); + + ПараметрыДоставки.Вставить("ЗаполнитьПолучателяВШаблонеТемы", Ложь); + ПараметрыДоставки.Вставить("ЗаполнитьПолучателяВШаблонеСообщения", Ложь); + ПараметрыДоставки.Вставить("ЗаполнитьСформированныеОтчетыВШаблонеСообщения", Ложь); + ПараметрыДоставки.Вставить("ЗаполнитьСпособДоставкиВШаблонеСообщения", Ложь); + ПараметрыДоставки.Вставить("ПредставлениеОтчетовПолучателя", ""); + ПараметрыДоставки.Вставить("ШаблонТемы", ШаблонТемы()); + ПараметрыДоставки.Вставить("ШаблонТекста", ""); + + ПараметрыДоставки.Вставить("ПараметрыФорматов", Новый Соответствие); + ПараметрыДоставки.Вставить("ТранслитерироватьИменаФайлов", Ложь); + ПараметрыДоставки.Вставить("СтрокаОбщихОтчетов", Неопределено); + ПараметрыДоставки.Вставить("ДобавлятьСсылки", ""); + + ПараметрыДоставки.Вставить("РежимТестирования", Ложь); + ПараметрыДоставки.Вставить("БылиОшибки", Ложь); + ПараметрыДоставки.Вставить("БылиПредупреждения", Ложь); + ПараметрыДоставки.Вставить("ВыполненаВПапку", Ложь); + ПараметрыДоставки.Вставить("ВыполненаВСетевойКаталог", Ложь); + ПараметрыДоставки.Вставить("ВыполненаНаFTP", Ложь); + ПараметрыДоставки.Вставить("ВыполненаПоЭлектроннойПочте", Ложь); + ПараметрыДоставки.Вставить("ВыполненныеСпособыПубликации", ""); + ПараметрыДоставки.Вставить("Получатель", Неопределено); + ПараметрыДоставки.Вставить("Картинки", Новый Структура); + ПараметрыДоставки.Вставить("Личная", Ложь); + + Возврат ПараметрыДоставки; + +КонецФункции + +// Конструктор структуры с параметрами отправки письма. +// +// Возвращаемое значение: +// Структура - содержит всю необходимую информацию о письме: +// * Кому - Массив +// - Строка - интернет адреса получателей письма. +// - Массив - коллекция структур адресов: +// * Адрес - Строка - почтовый адрес (должно быть обязательно заполнено). +// * Представление - Строка - имя адресата. +// - Строка - интернет-адреса получателей письма, разделитель - ";". +// +// * ПолучателиСообщения - Массив - массив структур, описывающий получателей: +// ** Адрес - Строка - почтовый адрес получателя сообщения. +// ** Представление - Строка - представление адресата. +// +// * Копии - Массив +// - Строка - адреса получателей копий письма. См. описание поля Кому. +// +// * СкрытыеКопии - Массив +// - Строка - адреса получателей скрытых копий письма. См. описание поля Кому. +// +// * Тема - Строка - (обязательный) тема почтового сообщения. +// * Тело - Строка - (обязательный) текст почтового сообщения (простой текст в кодировке win-1251). +// +// * Вложения - Массив - файлы, которые необходимо приложить к письму (описания в виде структур): +// ** Представление - Строка - имя файла вложения; +// ** АдресВоВременномХранилище - Строка - адрес двоичных данных вложения во временном хранилище. +// ** Кодировка - Строка - кодировка вложения (используется, если отличается от кодировки письма). +// ** Идентификатор - Строка - (необязательный) используется для отметки картинок, отображаемых в теле письма. +// +// * АдресОтвета - Соответствие +// - Строка - см. описание поля Кому. +// * ИдентификаторыОснований - Строка - идентификаторы оснований данного письма. +// * ОбрабатыватьТексты - Булево - необходимость обрабатывать тексты письма при отправке. +// * УведомитьОДоставке - Булево - необходимость запроса уведомления о доставке. +// * УведомитьОПрочтении - Булево - необходимость запроса уведомления о прочтении. +// * ТипТекста - Строка +// - ПеречислениеСсылка.ТипыТекстовЭлектронныхПисем +// - ТипТекстаПочтовогоСообщения - определяет тип +// переданного теста допустимые значения: +// HTML/ТипыТекстовЭлектронныхПисем.HTML - текст почтового сообщения в формате HTML. +// ПростойТекст/ТипыТекстовЭлектронныхПисем.ПростойТекст - простой текст почтового сообщения. +// Отображается "как есть" (значение по умолчанию). +// РазмеченныйТекст/ТипыТекстовЭлектронныхПисем.РазмеченныйТекст - текст почтового сообщения в формате +// Rich Text. +// +Функция ПараметрыОтправкиПисьма() Экспорт + + ПараметрыПисьма = Новый Структура; + ПараметрыПисьма.Вставить("Кому", Новый Массив); + ПараметрыПисьма.Вставить("ПолучателиСообщения", Новый Массив); + ПараметрыПисьма.Вставить("Копии", Новый Массив); + ПараметрыПисьма.Вставить("СкрытыеКопии", Новый Массив); + ПараметрыПисьма.Вставить("Тема", ""); + ПараметрыПисьма.Вставить("Тело", ""); + ПараметрыПисьма.Вставить("Вложения", Новый Соответствие); + ПараметрыПисьма.Вставить("АдресОтвета", ""); + ПараметрыПисьма.Вставить("ИдентификаторыОснований", ""); + ПараметрыПисьма.Вставить("ОбрабатыватьТексты", Ложь); + ПараметрыПисьма.Вставить("УведомитьОДоставке", Ложь); + ПараметрыПисьма.Вставить("УведомитьОПрочтении", Ложь); + ПараметрыПисьма.Вставить("ТипТекста", "ПростойТекст"); + + Возврат ПараметрыПисьма; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/РассылкаОтчетовПереопределяемый/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовПереопределяемый/Module.bsl index d0df413e4..137eecb6a 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовПереопределяемый/Module.bsl @@ -19,7 +19,7 @@ // * Картинка - Картинка - картинка формата. // // Пример: -// РассылкаОтчетов.УстановитьПараметрыФормата(СписокФорматов, "HTML4", , Ложь); +// РассылкаОтчетов.УстановитьПараметрыФормата(СписокФорматов, "HTML", , Ложь); // РассылкаОтчетов.УстановитьПараметрыФормата(СписокФорматов, "XLS" , , Истина); // Процедура ПереопределитьПараметрыФорматов(СписокФорматов) Экспорт @@ -68,10 +68,10 @@ // Передается без расширения, если формат был добавлен в прикладной конфигурации. // // Пример: -// Если Формат = Перечисления.ФорматыСохраненияОтчетов.HTML4 Тогда +// Если Формат = Перечисления.ФорматыСохраненияОтчетов.HTML Тогда // СтандартнаяОбработка = Ложь; // ПолноеИмяФайла = ПолноеИмяФайла +".html"; -// ТабличныйДокумент.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.HTML4); +// ТабличныйДокумент.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.HTML5); // КонецЕсли; // Процедура ПередСохранениемТабличногоДокументаВФормат(СтандартнаяОбработка, ТабличныйДокумент, Формат, ПолноеИмяФайла) Экспорт diff --git a/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl index 7f3dd8879..9d500d2c4 100644 --- a/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl +++ b/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl @@ -21,8 +21,9 @@ // режиме работы или идентификатор ссылки задания очереди в модели сервиса. // - СправочникСсылка.ОчередьЗаданий - идентификатор задания // очереди в модели сервиса. +// - СтрокаТаблицыЗначений: см. НайтиЗадания // * Метаданные - ОбъектМетаданныхРегламентноеЗадание - метаданные регламентного задания. -// - Строка - имя регламентного задания. +// - Строка - имя метаданных регламентного задания. // * Использование - Булево - если Истина, задание включено. // * Ключ - Строка - прикладной идентификатор задания. // 2) Возможные ключи только локального режима: @@ -67,57 +68,58 @@ Если ОбщегоНазначения.РазделениеВключено() Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ОчередьЗаданий") Тогда - Если КопияОтбора.Свойство("УникальныйИдентификатор") И НЕ КопияОтбора.Свойство("Идентификатор") Тогда - КопияОтбора.Вставить("Идентификатор", КопияОтбора.УникальныйИдентификатор); + Если КопияОтбора.Свойство("УникальныйИдентификатор") Тогда + Если Не КопияОтбора.Свойство("Идентификатор") Тогда + КопияОтбора.Вставить("Идентификатор", КопияОтбора.УникальныйИдентификатор); + КонецЕсли; КопияОтбора.Удалить("УникальныйИдентификатор"); КонецЕсли; Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + // АПК:1386-выкл - модуль входит в подсистему ТехнологияСервиса.БазоваяФункциональность + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + // АПК:1386-вкл. ОбластьДанных = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); КопияОтбора.Вставить("ОбластьДанных", ОбластьДанных); КонецЕсли; МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); - ШаблоныЗаданийОчереди = МодульОчередьЗаданий.ШаблоныЗаданийОчереди(); Если КопияОтбора.Свойство("Метаданные") Тогда Если ТипЗнч(КопияОтбора.Метаданные) = Тип("ОбъектМетаданных") Тогда - Если ШаблоныЗаданийОчереди.Найти(КопияОтбора.Метаданные.Имя) <> Неопределено Тогда + МетаданныеРегламентноеЗадание = КопияОтбора.Метаданные; + Иначе + МетаданныеРегламентноеЗадание = Метаданные.РегламентныеЗадания.Найти(КопияОтбора.Метаданные); + КонецЕсли; + КопияОтбора.Удалить("Метаданные"); + КопияОтбора.Удалить("ИмяМетода"); + КопияОтбора.Удалить("Шаблон"); + Если МетаданныеРегламентноеЗадание <> Неопределено Тогда + ШаблоныЗаданийОчереди = СтандартныеПодсистемыПовтИсп.ШаблоныЗаданийОчереди(); + Если ШаблоныЗаданийОчереди.Получить(МетаданныеРегламентноеЗадание.Имя) <> Неопределено Тогда УстановитьПривилегированныйРежим(Истина); - Шаблон = МодульОчередьЗаданий.ШаблонПоИмени(КопияОтбора.Метаданные.Имя); + Шаблон = МодульОчередьЗаданий.ШаблонПоИмени(МетаданныеРегламентноеЗадание.Имя); УстановитьПривилегированныйРежим(Ложь); КопияОтбора.Вставить("Шаблон", Шаблон); Иначе - КопияОтбора.Вставить("ИмяМетода", КопияОтбора.Метаданные.ИмяМетода); + КопияОтбора.Вставить("ИмяМетода", МетаданныеРегламентноеЗадание.ИмяМетода); КонецЕсли; Иначе - МетаданныеРегламентноеЗадание = Метаданные.РегламентныеЗадания.Найти(КопияОтбора.Метаданные); - Если МетаданныеРегламентноеЗадание <> Неопределено Тогда - Если ШаблоныЗаданийОчереди.Найти(МетаданныеРегламентноеЗадание.Имя) <> Неопределено Тогда - УстановитьПривилегированныйРежим(Истина); - Шаблон = МодульОчередьЗаданий.ШаблонПоИмени(МетаданныеРегламентноеЗадание.Имя); - УстановитьПривилегированныйРежим(Ложь); - КопияОтбора.Вставить("Шаблон", Шаблон); - Иначе - КопияОтбора.Вставить("ИмяМетода", МетаданныеРегламентноеЗадание.ИмяМетода); - КонецЕсли; - КонецЕсли; + КопияОтбора.Вставить("ИмяМетода", Строка(Новый УникальныйИдентификатор)); КонецЕсли; - ИначеЕсли КопияОтбора.Свойство("Идентификатор") - И (ТипЗнч(КопияОтбора.Идентификатор) = Тип("УникальныйИдентификатор") - ИЛИ ТипЗнч(КопияОтбора.Идентификатор) = Тип("Строка")) Тогда - + ИначеЕсли КопияОтбора.Свойство("Идентификатор") Тогда Если ТипЗнч(КопияОтбора.Идентификатор) = Тип("Строка") Тогда КопияОтбора.Идентификатор = Новый УникальныйИдентификатор(КопияОтбора.Идентификатор); КонецЕсли; - - КопияОтбора.Вставить("Идентификатор", СсылкаЗаданияОчереди(КопияОтбора.Идентификатор, КопияОтбора)); + Если ТипЗнч(КопияОтбора.Идентификатор) = Тип("УникальныйИдентификатор") Тогда + КопияОтбора.Идентификатор = СсылкаЗаданияОчереди(КопияОтбора.Идентификатор, КопияОтбора); + ИначеЕсли ТипЗнч(КопияОтбора.Идентификатор) = Тип("СтрокаТаблицыЗначений") Тогда + КопияОтбора.Идентификатор = КопияОтбора.Идентификатор.Идентификатор; + КонецЕсли; КонецЕсли; - КопияОтбора.Удалить("Метаданные"); Возврат УточненныйСписокЗаданий(МодульОчередьЗаданий.ПолучитьЗадания(КопияОтбора)); КонецЕсли; @@ -160,41 +162,18 @@ Если ОбщегоНазначения.РазделениеВключено() Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ОчередьЗаданий") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + Отбор = ?(ТипЗнч(Идентификатор) = Тип("ОбъектМетаданных"), + Новый Структура("Метаданные", Идентификатор), + Новый Структура("УникальныйИдентификатор", Идентификатор)); - ПараметрыЗадания = Новый Структура; - Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - ОбластьДанных = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); - ПараметрыЗадания.Вставить("ОбластьДанных", ОбластьДанных); - КонецЕсли; - - МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); - - Если ТипЗнч(Идентификатор) = Тип("ОбъектМетаданных") Тогда - Если Идентификатор.Предопределенное Тогда - УстановитьПривилегированныйРежим(Истина); - ПараметрыЗадания.Вставить("Шаблон", МодульОчередьЗаданий.ШаблонПоИмени(Идентификатор.Имя)); - УстановитьПривилегированныйРежим(Ложь); - Иначе - ПараметрыЗадания.Вставить("ИмяМетода", Идентификатор.ИмяМетода); - КонецЕсли; - ИначеЕсли ТипЗнч(Идентификатор) = Тип("УникальныйИдентификатор") Тогда - ПараметрыЗадания.Вставить("Идентификатор", СсылкаЗаданияОчереди(Идентификатор, ПараметрыЗадания)); - - ИначеЕсли ТипЗнч(Идентификатор) = Тип("СтрокаТаблицыЗначений") Тогда - ПараметрыЗадания.Вставить("Идентификатор", Идентификатор.Идентификатор); - Иначе - ПараметрыЗадания.Вставить("Идентификатор", Идентификатор); - КонецЕсли; - - СписокЗаданий = УточненныйСписокЗаданий(МодульОчередьЗаданий.ПолучитьЗадания(ПараметрыЗадания)); + СписокЗаданий = НайтиЗадания(Отбор); Для Каждого Задание Из СписокЗаданий Цикл РегламентноеЗадание = Задание; Прервать; КонецЦикла; КонецЕсли; + Иначе Если ТипЗнч(Идентификатор) = Тип("ОбъектМетаданных") Тогда @@ -245,7 +224,9 @@ ПараметрыЗадания = ОбщегоНазначения.СкопироватьРекурсивно(Параметры); Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + // АПК:1386-выкл - модуль входит в подсистему ТехнологияСервиса.БазоваяФункциональность МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + // АПК:1386-вкл. ОбластьДанных = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); ПараметрыЗадания.Вставить("ОбластьДанных", ОбластьДанных); КонецЕсли; @@ -297,35 +278,16 @@ Идентификатор = УточненныйИдентификаторЗадания(Идентификатор); Если ОбщегоНазначения.РазделениеВключено() Тогда - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ОчередьЗаданий") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); - - ПараметрыЗадания = Новый Структура; - Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - ОбластьДанных = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); - ПараметрыЗадания.Вставить("ОбластьДанных", ОбластьДанных); - КонецЕсли; - - Если ТипЗнч(Идентификатор) = Тип("ОбъектМетаданных") Тогда - ИмяМетода = Идентификатор.ИмяМетода; - ПараметрыЗадания.Вставить("ИмяМетода", ИмяМетода); - - ИначеЕсли ТипЗнч(Идентификатор) = Тип("УникальныйИдентификатор") Тогда - ПараметрыЗадания.Вставить("Идентификатор", СсылкаЗаданияОчереди(Идентификатор, ПараметрыЗадания)); - - ИначеЕсли ТипЗнч(Идентификатор) = Тип("СтрокаТаблицыЗначений") Тогда - - МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); - МодульОчередьЗаданий.УдалитьЗадание(Идентификатор.Идентификатор); - Возврат; - + Если ТипЗнч(Идентификатор) = Тип("СтрокаТаблицыЗначений") Тогда + СписокЗаданий = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Идентификатор); Иначе - ПараметрыЗадания.Вставить("Идентификатор", Идентификатор); + Отбор = ?(ТипЗнч(Идентификатор) = Тип("ОбъектМетаданных"), + Новый Структура("ИмяМетода", Идентификатор.ИмяМетода), + Новый Структура("УникальныйИдентификатор", Идентификатор)); + СписокЗаданий = НайтиЗадания(Отбор); КонецЕсли; - МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); - СписокЗаданий = МодульОчередьЗаданий.ПолучитьЗадания(ПараметрыЗадания); Для Каждого Задание Из СписокЗаданий Цикл МодульОчередьЗаданий.УдалитьЗадание(Задание.Идентификатор); КонецЦикла; @@ -346,8 +308,7 @@ // отдельно для каждой области оно не сохраняется. // // Параметры: -// Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска -// непредопределенного регламентного задания. +// Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска. // - Строка - имя метаданных предопределенного регламентного задания в любом режиме работы // или строка уникального идентификатора регламентного задания в локальном режиме работы // или строка уникального идентификатора ссылки задания очереди в модели сервиса. @@ -374,98 +335,39 @@ Идентификатор = УточненныйИдентификаторЗадания(Идентификатор); Если ОбщегоНазначения.РазделениеВключено() Тогда - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ОчередьЗаданий") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); - ПараметрыЗадания = ОбщегоНазначения.СкопироватьРекурсивно(Параметры); - ПараметрыПоиска = Новый Структура; - ПараметрыЗадания.Удалить("Наименование"); Если ПараметрыЗадания.Количество() = 0 Тогда Возврат; - КонецЕсли; - - Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - ОбластьДанных = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); - ПараметрыПоиска.Вставить("ОбластьДанных", ОбластьДанных); КонецЕсли; - Если ТипЗнч(Идентификатор) = Тип("ОбъектМетаданных") Тогда - ИмяМетода = Идентификатор.ИмяМетода; - - // Если рег.задание предопределенное и есть шаблон очереди - можно изменять только "Использование". - Если Идентификатор.Предопределенное Тогда - - МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); - Шаблоны = МодульОчередьЗаданий.ШаблоныЗаданийОчереди(); - - Если Шаблоны.Найти(Идентификатор.Имя) <> Неопределено Тогда - УстановитьПривилегированныйРежим(Истина); - ПараметрыПоиска.Вставить("Шаблон", МодульОчередьЗаданий.ШаблонПоИмени(Идентификатор.Имя)); - УстановитьПривилегированныйРежим(Ложь); - - Если ПараметрыЗадания.Количество() > 1 - Или Не ПараметрыЗадания.Свойство("Использование") Тогда - - Для каждого ПараметрЗадания Из ОбщегоНазначения.СкопироватьРекурсивно(ПараметрыЗадания) Цикл - - Если ПараметрЗадания.Ключ = "Использование" Тогда - Продолжить; - КонецЕсли; - - ПараметрыЗадания.Удалить(ПараметрЗадания.Ключ); - КонецЦикла; - КонецЕсли; - Иначе - ПараметрыПоиска.Вставить("ИмяМетода", ИмяМетода); - КонецЕсли; - Иначе - ПараметрыПоиска.Вставить("ИмяМетода", ИмяМетода); - КонецЕсли; - - ИначеЕсли ТипЗнч(Идентификатор) = Тип("УникальныйИдентификатор") Тогда - ПараметрыПоиска.Вставить("Идентификатор", СсылкаЗаданияОчереди(Идентификатор, ПараметрыЗадания)); - - ИначеЕсли ТипЗнч(Идентификатор) = Тип("СтрокаТаблицыЗначений") Тогда - - Если ЗначениеЗаполнено(Идентификатор.Шаблон) - И (ПараметрыЗадания.Количество() > 1 - ИЛИ НЕ ПараметрыЗадания.Свойство("Использование")) Тогда - - Для Каждого ПараметрЗадания Из ОбщегоНазначения.СкопироватьРекурсивно(ПараметрыЗадания) Цикл - - Если ПараметрЗадания.Ключ = "Использование" Тогда - Продолжить; - КонецЕсли; - - ПараметрыЗадания.Удалить(ПараметрЗадания.Ключ); - КонецЦикла; - КонецЕсли; - - Если ПараметрыЗадания.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); - МодульОчередьЗаданий.ИзменитьЗадание(Идентификатор.Идентификатор, ПараметрыЗадания); - Возврат; - + Если ТипЗнч(Идентификатор) = Тип("СтрокаТаблицыЗначений") Тогда + СписокЗаданий = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Идентификатор); Иначе - ПараметрыПоиска.Вставить("Идентификатор", Идентификатор); + Отбор = ?(ТипЗнч(Идентификатор) = Тип("ОбъектМетаданных"), + Новый Структура("Метаданные", Идентификатор), + Новый Структура("УникальныйИдентификатор", Идентификатор)); + СписокЗаданий = НайтиЗадания(Отбор); КонецЕсли; - Если ПараметрыЗадания.Количество() = 0 Тогда - Возврат; + // Если регламентное задание предопределенное и есть шаблон очереди, + // тогда можно изменять только "Использование". + ПараметрыПредопределенногоЗадания = Новый Структура; + Если ПараметрыЗадания.Свойство("Использование") Тогда + ПараметрыПредопределенногоЗадания.Вставить("Использование", + ПараметрыЗадания.Использование); КонецЕсли; МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); - СписокЗаданий = МодульОчередьЗаданий.ПолучитьЗадания(ПараметрыПоиска); Для Каждого Задание Из СписокЗаданий Цикл - МодульОчередьЗаданий.ИзменитьЗадание(Задание.Идентификатор, ПараметрыЗадания); + Если Не ЗначениеЗаполнено(Задание.Шаблон) Тогда + МодульОчередьЗаданий.ИзменитьЗадание(Задание.Идентификатор, ПараметрыЗадания); + ИначеЕсли ЗначениеЗаполнено(ПараметрыПредопределенногоЗадания) Тогда + МодульОчередьЗаданий.ИзменитьЗадание(Задание.Идентификатор, ПараметрыПредопределенногоЗадания); + КонецЕсли; КонецЦикла; КонецЕсли; - Иначе ИзменитьРегламентноеЗадание(Идентификатор, Параметры); КонецЕсли; @@ -688,6 +590,62 @@ КонецФункции +// Возвращает результаты последнего запуска указанного регламентного задания. +// В том числе, если оно было запущено вручную из обработки "Регламентные и фоновые задания". +// +// Параметры: +// Задание - РегламентноеЗадание - для указанного регламентного задания будут получены +// результаты последнего запуска. +// - Строка - уникальный идентификатор регламентного задания +// +// Возвращаемое значение: +// Неопределено +// Структура: +// * Идентификатор - Строка +// * Наименование - Строка +// * Ключ - Строка +// * Конец - Дата +// * ИдентификаторРегламентногоЗадания - Строка +// * Состояние - СостояниеФоновогоЗадания +// * ИмяМетода - Строка +// * Расположение - Строка +// * ОписаниеИнформацииОбОшибке - Строка +// * ПопыткаЗапуска - Число +// * СообщенияПользователю - Массив +// * НомерСеанса - Число +// * НачалоСеанса - Дата +// +Функция СвойстваПоследнегоЗадания(Знач Задание) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + УстановитьПривилегированныйРежим(Истина); + + Если ТипЗнч(Задание) = Тип("РегламентноеЗадание") Тогда + Задание = Задание.УникальныйИдентификатор; + КонецЕсли; + + Если ТипЗнч(Задание) = Тип("Строка") Тогда + Задание = Новый УникальныйИдентификатор(Задание); + КонецЕсли; + + РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Задание); + ТекущийОтбор = Новый Структура("ИмяМетода", РегламентноеЗадание.Метаданные.ИмяМетода); + Результат = ФоновыеЗадания.ПолучитьФоновыеЗадания(ТекущийОтбор); + Если Результат.Количество() = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + ПоследнееФоновое = ПоследнееФоновоеЗаданиеВМассиве(Результат); + + СвойстваФоновогоЗадания = НовыеСвойстваФоновыхЗаданий(); + ЗаполнитьЗначенияСвойств(СвойстваФоновогоЗадания, ПоследнееФоновое); + + СвойстваФоновогоЗадания.Идентификатор = ПоследнееФоновое.УникальныйИдентификатор; + СвойстваФоновогоЗадания.ИдентификаторРегламентногоЗадания = Задание; + Возврат СвойстваФоновогоЗадания; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Прочие процедуры и функции. @@ -774,10 +732,10 @@ Отбор = Новый Структура; Отбор.Вставить("Метаданные", ЗаданиеМетаданные); Параметры = Новый Структура; - Параметры.Вставить("Использование", Истина); + Параметры.Вставить("Использование", Использование); Задания = НайтиЗадания(Отбор); Для Каждого Задание Из Задания Цикл - ИзменитьЗадание(Задание.УникальныйИдентификатор, Параметры); + ИзменитьЗадание(Задание, Параметры); Прервать; КонецЦикла; Иначе @@ -845,11 +803,7 @@ Функция ПараметрРегламентногоЗадания(РегламентноеЗадание, ИмяСвойства, ЗначениеПоУмолчанию) Экспорт ПараметрыЗадания = Новый Структура; - Если ОбщегоНазначения.РазделениеВключено() Тогда - ПараметрыЗадания.Вставить("ИмяМетода", РегламентноеЗадание.ИмяМетода); - Иначе - ПараметрыЗадания.Вставить("Метаданные", РегламентноеЗадание); - КонецЕсли; + ПараметрыЗадания.Вставить("Метаданные", РегламентноеЗадание); УстановитьПривилегированныйРежим(Истина); @@ -957,7 +911,7 @@ КонецФункции -// Удаляет регламентное задание (без учета очереди заданий модели сервиса). +// Удаляет непредопределенное регламентное задание (без учета очереди заданий модели сервиса). // // Параметры: // Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска @@ -976,10 +930,9 @@ СписокЗаданий = Новый Массив; // Массив из РегламентноеЗадание. - Если ТипЗнч(Идентификатор) = Тип("ОбъектМетаданных") И Идентификатор.Предопределенное Тогда - ВызватьИсключение( НСтр("ru = 'Предопределенное регламентное задание удалить невозможно.'") ); - ИначеЕсли ТипЗнч(Идентификатор) = Тип("ОбъектМетаданных") И Не Идентификатор.Предопределенное Тогда - СписокЗаданий = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Новый Структура("Метаданные", Идентификатор)); + Если ТипЗнч(Идентификатор) = Тип("ОбъектМетаданных") Тогда + Отбор = Новый Структура("Метаданные, Предопределенное", Идентификатор, Ложь); + СписокЗаданий = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор); Иначе РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Идентификатор); Если РегламентноеЗадание <> Неопределено Тогда @@ -1080,6 +1033,37 @@ КонецПроцедуры +// Параметры: +// МассивФоновыхЗаданий - Массив из ФоновоеЗадание +// ПоследнееФоновоеЗадание - ФоновоеЗадание +// - Неопределено +// Возвращаемое значение: +// ФоновоеЗадание, Неопределено +// +Функция ПоследнееФоновоеЗаданиеВМассиве(МассивФоновыхЗаданий, ПоследнееФоновоеЗадание = Неопределено) Экспорт + + Для каждого ТекущееФоновоеЗадание Из МассивФоновыхЗаданий Цикл + Если ПоследнееФоновоеЗадание = Неопределено Тогда + ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание; + Продолжить; + КонецЕсли; + Если ЗначениеЗаполнено(ПоследнееФоновоеЗадание.Конец) Тогда + Если НЕ ЗначениеЗаполнено(ТекущееФоновоеЗадание.Конец) + ИЛИ ПоследнееФоновоеЗадание.Конец < ТекущееФоновоеЗадание.Конец Тогда + ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание; + КонецЕсли; + Иначе + Если НЕ ЗначениеЗаполнено(ТекущееФоновоеЗадание.Конец) + И ПоследнееФоновоеЗадание.Начало < ТекущееФоновоеЗадание.Начало Тогда + ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат ПоследнееФоновоеЗадание; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -1217,4 +1201,24 @@ КонецПроцедуры +Функция НовыеСвойстваФоновыхЗаданий() + + СвойстваФоновыхЗаданий = Новый Структура; + СвойстваФоновыхЗаданий.Вставить("Идентификатор"); + СвойстваФоновыхЗаданий.Вставить("Ключ"); + СвойстваФоновыхЗаданий.Вставить("Начало"); + СвойстваФоновыхЗаданий.Вставить("Конец"); + СвойстваФоновыхЗаданий.Вставить("ИдентификаторРегламентногоЗадания"); + СвойстваФоновыхЗаданий.Вставить("Состояние"); + СвойстваФоновыхЗаданий.Вставить("ИмяМетода"); + СвойстваФоновыхЗаданий.Вставить("Расположение"); + СвойстваФоновыхЗаданий.Вставить("ПопыткаЗапуска"); + СвойстваФоновыхЗаданий.Вставить("СообщенияПользователю"); + СвойстваФоновыхЗаданий.Вставить("НомерСеанса"); + СвойстваФоновыхЗаданий.Вставить("НачалоСеанса"); + + Возврат СвойстваФоновыхЗаданий; + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl index ba7b2292f..b266c675f 100644 --- a/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl @@ -192,6 +192,158 @@ КонецПроцедуры +// Возвращает таблицу свойств фоновых заданий. +// Структуру таблицы смотри в функции ПустаяТаблицаСвойствФоновыхЗаданий(). +// +// Параметры: +// Отбор - Структура - допустимые поля: +// Идентификатор, Ключ, Состояние, Начало, Конец, +// Наименование, ИмяМетода, РегламентноеЗадание. +// +// Возвращаемое значение: +// см. НовыеСвойстваФоновыхЗаданий +// +Функция СвойстваФоновыхЗаданий(Отбор = Неопределено) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + УстановитьПривилегированныйРежим(Истина); + + Таблица = НовыеСвойстваФоновыхЗаданий(); + + Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания") Тогда + Отбор.Удалить("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания"); + ПолучитьПоследнее = Истина; + Иначе + ПолучитьПоследнее = Ложь; + КонецЕсли; + + РегламентноеЗадание = Неопределено; + + // Добавление истории фоновых заданий, полученных с сервера. + Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ИдентификаторРегламентногоЗадания") Тогда + Если Отбор.ИдентификаторРегламентногоЗадания <> "" Тогда + РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору( + Новый УникальныйИдентификатор(Отбор.ИдентификаторРегламентногоЗадания)); + ТекущийОтбор = Новый Структура("ИмяМетода", РегламентноеЗадание.Метаданные.ИмяМетода); + ВсеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(ТекущийОтбор); + + Если РегламентноеЗадание <> Неопределено Тогда + ПоследнееФоновоеЗадание = РегламентноеЗадание.ПоследнееЗадание; + КонецЕсли; + + Если ПолучитьПоследнее Тогда + ПоследнееФоновоеЗадание = РегламентныеЗаданияСервер.ПоследнееФоновоеЗаданиеВМассиве(ВсеФоновыеЗадания); + + Если ПоследнееФоновоеЗадание <> Неопределено Тогда + МассивФоновыхЗаданий = Новый Массив; + МассивФоновыхЗаданий.Добавить(ПоследнееФоновоеЗадание); + ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица); + КонецЕсли; + Возврат Таблица; + КонецЕсли; + ДобавитьСвойстваФоновыхЗаданий(ВсеФоновыеЗадания, Таблица); + Иначе + МассивФоновыхЗаданий = Новый Массив; + ВсеИдентификаторыРегламентныхЗаданий = Новый Соответствие; + Для каждого ТекущееЗадание Из РегламентныеЗадания.ПолучитьРегламентныеЗадания() Цикл + ВсеИдентификаторыРегламентныхЗаданий.Вставить( + Строка(ТекущееЗадание.УникальныйИдентификатор), Истина); + КонецЦикла; + ВсеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(); + Для каждого ТекущееЗадание Из ВсеФоновыеЗадания Цикл + Если ТекущееЗадание.РегламентноеЗадание = Неопределено + И ВсеИдентификаторыРегламентныхЗаданий[ТекущееЗадание.Ключ] = Неопределено Тогда + + МассивФоновыхЗаданий.Добавить(ТекущееЗадание); + КонецЕсли; + КонецЦикла; + ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица); + КонецЕсли; + Иначе + Если НЕ ЗначениеЗаполнено(Отбор) Тогда + МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(); + Иначе + Если Отбор.Свойство("Идентификатор") Тогда + Отбор.Вставить("УникальныйИдентификатор", Новый УникальныйИдентификатор(Отбор.Идентификатор)); + Отбор.Удалить("Идентификатор"); + КонецЕсли; + МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); + Если Отбор.Свойство("УникальныйИдентификатор") Тогда + Отбор.Вставить("Идентификатор", Строка(Отбор.УникальныйИдентификатор)); + Отбор.Удалить("УникальныйИдентификатор"); + КонецЕсли; + КонецЕсли; + ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица); + КонецЕсли; + + Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ИдентификаторРегламентногоЗадания") Тогда + РегламентныеЗаданияДляОбработки = Новый Массив; + Если Отбор.ИдентификаторРегламентногоЗадания <> "" Тогда + Если РегламентноеЗадание = Неопределено Тогда + РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору( + Новый УникальныйИдентификатор(Отбор.ИдентификаторРегламентногоЗадания)); + КонецЕсли; + Если РегламентноеЗадание <> Неопределено Тогда + РегламентныеЗаданияДляОбработки.Добавить(РегламентноеЗадание); + КонецЕсли; + КонецЕсли; + Иначе + РегламентныеЗаданияДляОбработки = РегламентныеЗадания.ПолучитьРегламентныеЗадания(); + КонецЕсли; + + Таблица.Сортировать("Начало Убыв, Конец Убыв"); + + // Отбор фоновых заданий. + Если ЗначениеЗаполнено(Отбор) Тогда + Начало = Неопределено; + Конец = Неопределено; + Состояние = Неопределено; + Если Отбор.Свойство("Начало") Тогда + Начало = ?(ЗначениеЗаполнено(Отбор.Начало), Отбор.Начало, Неопределено); + Отбор.Удалить("Начало"); + КонецЕсли; + Если Отбор.Свойство("Конец") Тогда + Конец = ?(ЗначениеЗаполнено(Отбор.Конец), Отбор.Конец, Неопределено); + Отбор.Удалить("Конец"); + КонецЕсли; + Если Отбор.Свойство("Состояние") Тогда + Если ТипЗнч(Отбор.Состояние) = Тип("Массив") Тогда + Состояние = Отбор.Состояние; + Отбор.Удалить("Состояние"); + КонецЕсли; + КонецЕсли; + + Если Отбор.Количество() <> 0 Тогда + Строки = Таблица.НайтиСтроки(Отбор); + Иначе + Строки = Таблица; + КонецЕсли; + // Выполнение дополнительного отбора по периоду и состоянию (если отбор определен). + НомерЭлемента = Строки.Количество() - 1; + Пока НомерЭлемента >= 0 Цикл + Если Начало <> Неопределено И Начало > Строки[НомерЭлемента].Начало + Или Конец <> Неопределено И Конец < ?(ЗначениеЗаполнено(Строки[НомерЭлемента].Конец), Строки[НомерЭлемента].Конец, ТекущаяДатаСеанса()) + Или Состояние <> Неопределено И Состояние.Найти(Строки[НомерЭлемента].Состояние) = Неопределено Тогда + Строки.Удалить(НомерЭлемента); + КонецЕсли; + НомерЭлемента = НомерЭлемента - 1; + КонецЦикла; + // Удаление лишних строк из таблицы. + Если ТипЗнч(Строки) = Тип("Массив") Тогда + НомерСтроки = Таблица.Количество() - 1; + Пока НомерСтроки >= 0 Цикл + Если Строки.Найти(Таблица[НомерСтроки]) = Неопределено Тогда + Таблица.Удалить(Таблица[НомерСтроки]); + КонецЕсли; + НомерСтроки = НомерСтроки - 1; + КонецЦикла; + КонецЕсли; + КонецЕсли; + + Возврат Таблица; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Обработчики подписок на события. @@ -501,7 +653,7 @@ Иначе НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Запуск вручную: %1'"), ПредставлениеРегламентногоЗадания(Задание)); // Не используются длительные операции, т.к. делается вызов метода регламентного задания. - ФоновоеЗадание = ФоновыеЗадания.Выполнить(Задание.Метаданные.ИмяМетода, Задание.Параметры, Строка(Задание.УникальныйИдентификатор), НаименованиеФоновогоЗадания); + ФоновоеЗадание = РасширенияКонфигурации.ВыполнитьФоновоеЗаданиеСРасширениямиБазыДанных(Задание.Метаданные.ИмяМетода, Задание.Параметры, Строка(Задание.УникальныйИдентификатор), НаименованиеФоновогоЗадания); ПараметрыВыполнения.ИдентификаторФоновогоЗадания = Строка(ФоновоеЗадание.УникальныйИдентификатор); ПараметрыВыполнения.МоментЗапуска = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ФоновоеЗадание.УникальныйИдентификатор).Начало; ПараметрыВыполнения.ЗапускВыполнен = Истина; @@ -643,166 +795,6 @@ КонецПроцедуры -// Возвращает таблицу свойств фоновых заданий. -// Структуру таблицы смотри в функции ПустаяТаблицаСвойствФоновыхЗаданий(). -// -// Параметры: -// Отбор - Структура - допустимые поля: -// Идентификатор, Ключ, Состояние, Начало, Конец, -// Наименование, ИмяМетода, РегламентноеЗадание. -// -// Возвращаемое значение: -// см. НовыеСвойстваФоновыхЗаданий -// -Функция СвойстваФоновыхЗаданий(Отбор = Неопределено) Экспорт - - ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); - - Таблица = НовыеСвойстваФоновыхЗаданий(); - - Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания") Тогда - Отбор.Удалить("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания"); - ПолучитьПоследнее = Истина; - Иначе - ПолучитьПоследнее = Ложь; - КонецЕсли; - - РегламентноеЗадание = Неопределено; - - // Добавление истории фоновых заданий, полученных с сервера. - Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ИдентификаторРегламентногоЗадания") Тогда - Если Отбор.ИдентификаторРегламентногоЗадания <> "" Тогда - РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору( - Новый УникальныйИдентификатор(Отбор.ИдентификаторРегламентногоЗадания)); - ТекущийОтбор = Новый Структура("Ключ", Отбор.ИдентификаторРегламентногоЗадания); - ФоновыеЗаданияЗапущенныеВручную = ФоновыеЗадания.ПолучитьФоновыеЗадания(ТекущийОтбор); - Если РегламентноеЗадание <> Неопределено Тогда - ПоследнееФоновоеЗадание = РегламентноеЗадание.ПоследнееЗадание; - КонецЕсли; - Если НЕ ПолучитьПоследнее ИЛИ ПоследнееФоновоеЗадание = Неопределено Тогда - ТекущийОтбор = Новый Структура("РегламентноеЗадание", РегламентноеЗадание); - АвтоматическиеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(ТекущийОтбор); - КонецЕсли; - Если ПолучитьПоследнее Тогда - Если ПоследнееФоновоеЗадание = Неопределено Тогда - ПоследнееФоновоеЗадание = ПоследнееФоновоеЗаданиеВМассиве(АвтоматическиеФоновыеЗадания); - КонецЕсли; - - ПоследнееФоновоеЗадание = ПоследнееФоновоеЗаданиеВМассиве( - ФоновыеЗаданияЗапущенныеВручную, ПоследнееФоновоеЗадание); - - Если ПоследнееФоновоеЗадание <> Неопределено Тогда - МассивФоновыхЗаданий = Новый Массив; - МассивФоновыхЗаданий.Добавить(ПоследнееФоновоеЗадание); - ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица); - КонецЕсли; - Возврат Таблица; - КонецЕсли; - ДобавитьСвойстваФоновыхЗаданий(ФоновыеЗаданияЗапущенныеВручную, Таблица); - ДобавитьСвойстваФоновыхЗаданий(АвтоматическиеФоновыеЗадания, Таблица); - Иначе - МассивФоновыхЗаданий = Новый Массив; - ВсеИдентификаторыРегламентныхЗаданий = Новый Соответствие; - Для каждого ТекущееЗадание Из РегламентныеЗадания.ПолучитьРегламентныеЗадания() Цикл - ВсеИдентификаторыРегламентныхЗаданий.Вставить( - Строка(ТекущееЗадание.УникальныйИдентификатор), Истина); - КонецЦикла; - ВсеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(); - Для каждого ТекущееЗадание Из ВсеФоновыеЗадания Цикл - Если ТекущееЗадание.РегламентноеЗадание = Неопределено - И ВсеИдентификаторыРегламентныхЗаданий[ТекущееЗадание.Ключ] = Неопределено Тогда - - МассивФоновыхЗаданий.Добавить(ТекущееЗадание); - КонецЕсли; - КонецЦикла; - ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица); - КонецЕсли; - Иначе - Если НЕ ЗначениеЗаполнено(Отбор) Тогда - МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(); - Иначе - Если Отбор.Свойство("Идентификатор") Тогда - Отбор.Вставить("УникальныйИдентификатор", Новый УникальныйИдентификатор(Отбор.Идентификатор)); - Отбор.Удалить("Идентификатор"); - КонецЕсли; - МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); - Если Отбор.Свойство("УникальныйИдентификатор") Тогда - Отбор.Вставить("Идентификатор", Строка(Отбор.УникальныйИдентификатор)); - Отбор.Удалить("УникальныйИдентификатор"); - КонецЕсли; - КонецЕсли; - ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица); - КонецЕсли; - - Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ИдентификаторРегламентногоЗадания") Тогда - РегламентныеЗаданияДляОбработки = Новый Массив; - Если Отбор.ИдентификаторРегламентногоЗадания <> "" Тогда - Если РегламентноеЗадание = Неопределено Тогда - РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору( - Новый УникальныйИдентификатор(Отбор.ИдентификаторРегламентногоЗадания)); - КонецЕсли; - Если РегламентноеЗадание <> Неопределено Тогда - РегламентныеЗаданияДляОбработки.Добавить(РегламентноеЗадание); - КонецЕсли; - КонецЕсли; - Иначе - РегламентныеЗаданияДляОбработки = РегламентныеЗадания.ПолучитьРегламентныеЗадания(); - КонецЕсли; - - Таблица.Сортировать("Начало Убыв, Конец Убыв"); - - // Отбор фоновых заданий. - Если ЗначениеЗаполнено(Отбор) Тогда - Начало = Неопределено; - Конец = Неопределено; - Состояние = Неопределено; - Если Отбор.Свойство("Начало") Тогда - Начало = ?(ЗначениеЗаполнено(Отбор.Начало), Отбор.Начало, Неопределено); - Отбор.Удалить("Начало"); - КонецЕсли; - Если Отбор.Свойство("Конец") Тогда - Конец = ?(ЗначениеЗаполнено(Отбор.Конец), Отбор.Конец, Неопределено); - Отбор.Удалить("Конец"); - КонецЕсли; - Если Отбор.Свойство("Состояние") Тогда - Если ТипЗнч(Отбор.Состояние) = Тип("Массив") Тогда - Состояние = Отбор.Состояние; - Отбор.Удалить("Состояние"); - КонецЕсли; - КонецЕсли; - - Если Отбор.Количество() <> 0 Тогда - Строки = Таблица.НайтиСтроки(Отбор); - Иначе - Строки = Таблица; - КонецЕсли; - // Выполнение дополнительного отбора по периоду и состоянию (если отбор определен). - НомерЭлемента = Строки.Количество() - 1; - Пока НомерЭлемента >= 0 Цикл - Если Начало <> Неопределено И Начало > Строки[НомерЭлемента].Начало - Или Конец <> Неопределено И Конец < ?(ЗначениеЗаполнено(Строки[НомерЭлемента].Конец), Строки[НомерЭлемента].Конец, ТекущаяДатаСеанса()) - Или Состояние <> Неопределено И Состояние.Найти(Строки[НомерЭлемента].Состояние) = Неопределено Тогда - Строки.Удалить(НомерЭлемента); - КонецЕсли; - НомерЭлемента = НомерЭлемента - 1; - КонецЦикла; - // Удаление лишних строк из таблицы. - Если ТипЗнч(Строки) = Тип("Массив") Тогда - НомерСтроки = Таблица.Количество() - 1; - Пока НомерСтроки >= 0 Цикл - Если Строки.Найти(Таблица[НомерСтроки]) = Неопределено Тогда - Таблица.Удалить(Таблица[НомерСтроки]); - КонецЕсли; - НомерСтроки = НомерСтроки - 1; - КонецЦикла; - КонецЕсли; - КонецЕсли; - - Возврат Таблица; - -КонецФункции - // Возвращает свойства ФоновогоЗадания по строке уникального идентификатора. // // Параметры: @@ -1091,42 +1083,11 @@ Строка.ОписаниеИнформацииОбОшибке = ?( ФоновоеЗадание.ИнформацияОбОшибке = Неопределено, "", - ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке)); Индекс = Индекс - 1; КонецЦикла; КонецПроцедуры -// Параметры: -// МассивФоновыхЗаданий - Массив из ФоновоеЗадание -// ПоследнееФоновоеЗадание - ФоновоеЗадание -// - Неопределено -// Возвращаемое значение: -// ФоновоеЗадание, Неопределено -// -Функция ПоследнееФоновоеЗаданиеВМассиве(МассивФоновыхЗаданий, ПоследнееФоновоеЗадание = Неопределено) - - Для каждого ТекущееФоновоеЗадание Из МассивФоновыхЗаданий Цикл - Если ПоследнееФоновоеЗадание = Неопределено Тогда - ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание; - Продолжить; - КонецЕсли; - Если ЗначениеЗаполнено(ПоследнееФоновоеЗадание.Конец) Тогда - Если НЕ ЗначениеЗаполнено(ТекущееФоновоеЗадание.Конец) - ИЛИ ПоследнееФоновоеЗадание.Конец < ТекущееФоновоеЗадание.Конец Тогда - ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание; - КонецЕсли; - Иначе - Если НЕ ЗначениеЗаполнено(ТекущееФоновоеЗадание.Конец) - И ПоследнееФоновоеЗадание.Начало < ТекущееФоновоеЗадание.Начало Тогда - ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание; - КонецЕсли; - КонецЕсли; - КонецЦикла; - - Возврат ПоследнееФоновоеЗадание; - -КонецФункции - #КонецОбласти diff --git a/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl index 23c1375c3..e3a4aaf8b 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl @@ -29,16 +29,12 @@ // См. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы. Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт - Если Не ДоступноРезервноеКопирование() Тогда + Если ОбщегоНазначенияКлиент.РазделениеВключено() + Или Не ДоступноРезервноеКопирование() Тогда Возврат; КонецЕсли; - ПараметрыРаботы = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); - Если ПараметрыРаботы.РазделениеВключено Тогда - Возврат; - КонецЕсли; - - Настройки = ПараметрыРаботы.РезервноеКопированиеИБ; + Настройки = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске().РезервноеКопированиеИБ; Если Не ЗначениеЗаполнено(Настройки) Тогда Возврат; КонецЕсли; @@ -81,14 +77,13 @@ Возврат; #КонецЕсли - Если Не ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда + Если Не ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() + Или Не ОбщегоНазначенияКлиент.ИнформационнаяБазаФайловая() + Или ОбщегоНазначенияКлиент.РазделениеВключено() Тогда Возврат; КонецЕсли; Параметры = СтандартныеПодсистемыКлиент.ПараметрКлиента(); - Если Параметры.РазделениеВключено Или Не Параметры.ИнформационнаяБазаФайловая Тогда - Возврат; - КонецЕсли; Если Не Параметры.РезервноеКопированиеИБПриЗавершенииРаботы.ДоступностьРолейОповещения Или Не Параметры.РезервноеКопированиеИБПриЗавершенииРаботы.ВыполнятьПриЗавершенииРаботы Тогда @@ -489,14 +484,14 @@ Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", НСтр("ru = 'Не удалось провести очистку каталога с резервными копиями.'") + Символы.ПС - + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); + + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); КонецПопытки; КонецЦикла; Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", НСтр("ru = 'Не удалось провести очистку каталога с резервными копиями.'") + Символы.ПС - + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); + + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); КонецПопытки; // АПК:566-вкл diff --git a/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl index f0de17654..c37c5cbd3 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl @@ -369,16 +369,18 @@ // Определение варианта оповещения пользователя. ВариантОповещения = "НеОповещать"; ОповещатьОНеобходимостиРезервногоКопирования = ТекущаяДатаСеанса() >= (Результат.ДатаПоследнегоОповещения + 3600 * 24); - Если Результат.ВыполнятьАвтоматическоеРезервноеКопирование Тогда - ВариантОповещения = ?(НеобходимостьАвтоматическогоРезервногоКопирования(), "Просрочено", "Настроено"); - ИначеЕсли Не Результат.РезервноеКопированиеНастроено Тогда - Если ОповещатьОНеобходимостиРезервногоКопирования Тогда - НастройкиРезервногоКопирования = Константы.ПараметрыРезервногоКопирования.Получить().Получить(); - Если НастройкиРезервногоКопирования <> Неопределено - И НастройкиРезервногоКопирования.Пользователь <> Пользователи.ТекущийПользователь() Тогда - ВариантОповещения = "НеОповещать"; - Иначе - ВариантОповещения = "ЕщеНеНастроено"; + Если ИспользуетсяПодсистемаРезервногоКопированияИБ() Тогда + Если Результат.ВыполнятьАвтоматическоеРезервноеКопирование Тогда + ВариантОповещения = ?(НеобходимостьАвтоматическогоРезервногоКопирования(), "Просрочено", "Настроено"); + ИначеЕсли Не Результат.РезервноеКопированиеНастроено Тогда + Если ОповещатьОНеобходимостиРезервногоКопирования Тогда + НастройкиРезервногоКопирования = Константы.ПараметрыРезервногоКопирования.Получить().Получить(); + Если НастройкиРезервногоКопирования <> Неопределено + И НастройкиРезервногоКопирования.Пользователь <> Пользователи.ТекущийПользователь() Тогда + ВариантОповещения = "НеОповещать"; + Иначе + ВариантОповещения = "ЕщеНеНастроено"; + КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; @@ -406,6 +408,23 @@ КонецФункции +// Возвращает признак того, что подсистема РезервноеКопированиеИБ выбрана в качестве основой подсистемы резервного +// копирования. +// +// Возвращаемое значение: +// Булево +// +Функция ИспользуетсяПодсистемаРезервногоКопированияИБ() + + Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив20") Тогда + МодульОблачныйАрхив20 = ОбщегоНазначения.ОбщийМодуль("ОблачныйАрхив20"); + Возврат МодульОблачныйАрхив20.ИспользуетсяПодсистемаРезервногоКопированияИБ(); + КонецЕсли; + + Возврат Истина; + +КонецФункции + Процедура ОбновитьРезультатВосстановления() Настройки = ПараметрыРезервногоКопирования(); @@ -560,7 +579,7 @@ Сообщения["[СообщениеОтказПриВызовеЗавершитьРезервноеКопирование]"] = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Исключение при вызове %1: {0}, {1}'"), "РезервноеКопированиеИБСервер.ЗавершитьРезервноеКопирование"); Сообщения["[СообщениеРезультатРезервногоКопированияБазы]"] = НСтр("ru = 'Резервное копирование базы выполнено успешно.'"); - Сообщения["[СообщениеОтказРезервногоКопированияБазы]"] = НСтр("ru = 'Ошибка при резервном копировании информационной базы.'"); + Сообщения["[СообщениеОтказРезервногоКопированияБазы]"] = НСтр("ru = 'Непредвиденная ситуация при резервном копировании информационной базы.'"); Сообщения["[СообщениеПараметрыБазы]"] = НСтр("ru = 'Параметры информационной базы: {0}.'"); Сообщения["[СообщениеРезервноеКопированиеЛогирование1С]"] = НСтр("ru = 'Протокол резервного копирования сохранен в журнал регистрации.'"); Сообщения["[СообщениеОтказЛогирования]"] = НСтр("ru = 'Исключение при записи в журнал: {0}, {1}'"); @@ -572,7 +591,7 @@ Сообщения["[СообщениеОтказСозданияРезервнойКопииБазыПодробно]"] = НСтр("ru = 'Исключение при создании резервной копии базы: {0}, {1}'"); Сообщения["[СообщениеПредположениеОшибкиРезервногоКопированияБазы]"] = НСтр("ru = 'За 15 минут файл резервной копии все еще не начал создаваться (размер {0} байт), предположительно, из-за возникшей ошибки. Резервное копирование прервано.'"); Сообщения["[СообщениеОшибкаУдаленияФайлаБлокировок]"] = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при удалении файла блокировок %1: {0}, {1}'"), "1Cv8.CDN"); + НСтр("ru = 'Не был удален файл блокировок %1: {0}, {1}'"), "1Cv8.CDN"); // Сообщения в макетах ЗаставкаРезервногоКопирования и ЗаставкаВосстановления. Сообщения["[СообщениеЗаставкиОшибкаШага]"] = НСтр("ru = 'Завершение с ошибкой. Код ошибки: {0}. Подробности см. в предыдущей записи.'"); @@ -581,9 +600,9 @@ Сообщения["[СообщениеОтказПриВызовеЗавершитьВосстановление]"] = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Исключение при вызове %1: {0}, {1}'"), "РезервноеКопированиеИБСервер.ЗавершитьВосстановление"); Сообщения["[СообщениеРезультатВосстановленияБазы]"] = НСтр("ru = 'Восстановление информационной базы прошло успешно.'"); - Сообщения["[СообщениеОтказВосстановленияБазы]"] = НСтр("ru = 'Ошибка при восстановлении информационной базы.'"); + Сообщения["[СообщениеОтказВосстановленияБазы]"] = НСтр("ru = 'Непредвиденная ситуация при восстановлении информационной базы.'"); Сообщения["[СообщениеВосстановлениеЛогирование1С]"] = НСтр("ru = 'Протокол восстановления сохранен в журнал регистрации.'"); - Сообщения["[СообщениеОтказПереносаФайлаБазыВоВременныйКаталог]"] = НСтр("ru = 'Ошибка переноса файла базы во временный каталог (возможно в программе есть активные сеансы): {0}, {1}.'"); + Сообщения["[СообщениеОтказПереносаФайлаБазыВоВременныйКаталог]"] = НСтр("ru = 'Файл базы не был перенесен во временный каталог (возможно в программе есть активные сеансы): {0}, {1}.'"); Сообщения["[СообщениеПопыткаПереносаФайлаБазыВоВременныйКаталог]"] = НСтр("ru = 'Попытка переноса файла базы во временный каталог ({0} из 5): {1}, {2}.'"); Сообщения["[СообщениеОтказВосстановленияБазыПодробно]"] = НСтр("ru = 'Исключение при восстановлении базы из резервной копии: {0}, {1}.'"); diff --git a/SSL/src/CommonModules/СерверныеОповещения/Module.bsl b/SSL/src/CommonModules/СерверныеОповещения/Module.bsl index c8bb0c924..4f2896879 100644 --- a/SSL/src/CommonModules/СерверныеОповещения/Module.bsl +++ b/SSL/src/CommonModules/СерверныеОповещения/Module.bsl @@ -114,7 +114,7 @@ НСтр("ru = 'Серверные оповещения.Ошибка получения или обработки оповещений'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры @@ -958,10 +958,10 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При вызове процедуры ""%1"" возникла ошибка: + НСтр("ru = 'Процедура ""%1"" не выполнена по причине: |%2'"), Оповещение.ИмяМодуляОтправки + ".ПриОтправкеСерверногоОповещения", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации( НСтр("ru = 'Серверные оповещения.Ошибка работы фонового задания'", ОбщегоНазначения.КодОсновногоЯзыка()), @@ -1472,7 +1472,7 @@ КонецПроцедуры // Параметры: -// ХранилищеОповещений - ХранилищеЗначений +// ХранилищеОповещений - ХранилищеЗначения // // Возвращаемое значение: // Соответствие из КлючИЗначение: @@ -1589,7 +1589,7 @@ НСтр("ru = 'Не удалось установить константу %1 по причине: |%2'"), "СостояниеОтправкиСерверныхОповещений", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации( НСтр("ru = 'Серверные оповещения.Ошибка работы фонового задания'", ОбщегоНазначения.КодОсновногоЯзыка()), @@ -1638,7 +1638,7 @@ НСтр("ru = 'Не удалось установить константу %1 по причине: |%2'"), "СостояниеОтправкиСерверныхОповещений", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации( НСтр("ru = 'Серверные оповещения.Ошибка запуска фонового задания'", ОбщегоНазначения.КодОсновногоЯзыка()), @@ -2093,7 +2093,7 @@ |""%1"" по причине: |%2'"), Метаданные.РегламентныеЗадания.ОтправкаСерверныхОповещенийКлиентам.Имя, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации( НСтр("ru = 'Серверные оповещения.Ошибка настройки регламентного задания'", ОбщегоНазначения.КодОсновногоЯзыка()), @@ -2116,7 +2116,7 @@ НСтр("ru = 'Не удалось создать служебного пользователя ""%1"" по причине: |%2'"), ИмяСлужебногоПользователя(), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ВызватьИсключение ТекстОшибки; КонецПопытки; Если ПользовательИБ <> Неопределено Тогда @@ -2247,7 +2247,7 @@ |""%1"" по причине: |%2'"), Метаданные.РегламентныеЗадания.ОтправкаСерверныхОповещенийКлиентам.Имя, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации( НСтр("ru = 'Серверные оповещения.Ошибка настройки регламентного задания'", ОбщегоНазначения.КодОсновногоЯзыка()), @@ -2351,7 +2351,7 @@ |%3'"), ПользовательИБ.Имя, НРег(ПользовательИБ.УникальныйИдентификатор), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации( НСтр("ru = 'Серверные оповещения.Ошибка регистрации пользователя в системе взаимодействия'", ОбщегоНазначения.КодОсновногоЯзыка()), @@ -2425,7 +2425,7 @@ НСтр("ru = 'Серверные оповещения.Система взаимодействия недоступна'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Предупреждение,,, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецЕсли; Возврат Истина; @@ -2672,7 +2672,7 @@ |%3'"), ПользователиИнформационнойБазы.ТекущийПользователь().Имя, НРег(ИдентификаторПользователяИБ), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации( НСтр("ru = 'Серверные оповещения.Ошибка создания личного обсуждения'", ОбщегоНазначения.КодОсновногоЯзыка()), @@ -2724,7 +2724,7 @@ НСтр("ru = 'Серверные оповещения.Ошибка создания общего обсуждения'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрацииОшибкиСВ(ИнформацияОбОшибке),,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат Неопределено; КонецПопытки; УстановитьПривилегированныйРежим(Ложь); @@ -2763,7 +2763,7 @@ НСтр("ru = 'Не удалось отправить сообщение в обсуждение %1 по причине: |%2'"), НРег(ИдентификаторОбсуждения), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации( НСтр("ru = 'Серверные оповещения.Ошибка отправки сообщения'", ОбщегоНазначения.КодОсновногоЯзыка()), @@ -2811,7 +2811,7 @@ НСтр("ru = 'Серверные оповещения.Ошибка очистки устаревших сообщений'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрацииОшибкиСВ(ИнформацияОбОшибке),,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; КонецПроцедуры diff --git a/SSL/src/CommonModules/СерверныеОповещенияКлиент/Module.bsl b/SSL/src/CommonModules/СерверныеОповещенияКлиент/Module.bsl index 55438705f..5eb748dcc 100644 --- a/SSL/src/CommonModules/СерверныеОповещенияКлиент/Module.bsl +++ b/SSL/src/CommonModules/СерверныеОповещенияКлиент/Module.bsl @@ -76,7 +76,7 @@ НСтр("ru = 'Серверные оповещения.Ошибка получения или обработки оповещений'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), "Ошибка", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры @@ -505,10 +505,10 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При вызове процедуры ""%1"" возникла ошибка: + НСтр("ru = 'Процедура ""%1"" не выполнена по причине: |%2'"), Оповещение.ИмяМодуляПолучения + ".ПриПолученииСерверногоОповещения", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( НСтр("ru = 'Серверные оповещения.Ошибка обработки полученного оповещения'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), @@ -695,7 +695,7 @@ НСтр("ru = 'Серверные оповещения.Ошибка подключения обработчика новых личных сообщений'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), "Ошибка", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры @@ -713,7 +713,7 @@ НСтр("ru = 'Серверные оповещения.Ошибка получения нового личного сообщения'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), "Ошибка", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры @@ -734,7 +734,7 @@ НСтр("ru = 'Серверные оповещения.Ошибка подключения обработчика новых общих сообщений'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), "Ошибка", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры @@ -752,10 +752,15 @@ НСтр("ru = 'Серверные оповещения.Ошибка получения нового общего сообщения'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), "Ошибка", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры +// Параметры: +// Сообщение - СообщениеСистемыВзаимодействия +// Контекст - Структура: +// * СостояниеПолучения - см. НовоеСостояниеПолучения +// Процедура ПриПолученииНовогоСообщенияСистемыВзаимодействия(Сообщение, Контекст) СостояниеПолучения = Контекст.СостояниеПолучения; @@ -777,7 +782,7 @@ Описание.Вставить("Обсуждение", Строка(Сообщение.Обсуждение)); Описание.Вставить("Текст", СокрЛП(Сообщение.Текст)); Описание.Вставить("ПодробноеПредставлениеОшибки", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); СерверныеОповещенияСлужебныйВызовСервера.ЗарегистрироватьОшибкуПолученияДанныхИзСообщения(Описание); Возврат; КонецПопытки; diff --git a/SSL/src/CommonModules/СервисКриптографииDSS/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSS/Module.bsl index 5212f883b..f8e1762d5 100644 --- a/SSL/src/CommonModules/СервисКриптографииDSS/Module.bsl +++ b/SSL/src/CommonModules/СервисКриптографииDSS/Module.bsl @@ -73,7 +73,7 @@ СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(РезультатЗапроса, "ПараметрыЗашифрования"); КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "Зашифровать", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "Зашифровать", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -107,7 +107,7 @@ РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СертификатыШифрования", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СертификатыШифрования", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -166,7 +166,7 @@ РезультатЗапроса.Результат = СервисКриптографииDSSСлужебный.ПодготовитьРезультатЗапроса(РезультатЗапроса.Результат, ТипРезультата); КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "Расшифровать", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "Расшифровать", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -220,7 +220,7 @@ КонецЕсли; КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ХешированиеДанных", ДанныеЗаголовка); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ХешированиеДанных", ДанныеЗаголовка, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -320,7 +320,7 @@ РезультатЗапроса.Результат = СервисКриптографииDSSСлужебный.ПодготовитьРезультатЗапроса(РезультатЗапроса.Результат, ТипРезультата); КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "Подписать", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "Подписать", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -423,7 +423,7 @@ РезультатЗапроса.Вставить("Результат", Результат); КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПодписатьПакет", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПодписатьПакет", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -477,7 +477,7 @@ РезультатЗапроса.Результат = СервисКриптографииDSSСлужебный.ПодготовитьРезультатЗапроса(РезультатЗапроса.Результат, СтруктураДокумента.ТипДокумента); КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "УсовершенствоватьПодпись", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "УсовершенствоватьПодпись", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -516,7 +516,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПроверитьСертификат", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПроверитьСертификат", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -575,7 +575,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПроверитьСертификат", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПроверитьСертификат", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -662,7 +662,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПроверитьПодпись", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПроверитьПодпись", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -698,11 +698,11 @@ СвойстваПодключения = СервисКриптографииDSSСлужебный.ПодготовитьСвойстваПодключения(НастройкиПользователя.Подключение, АдресПодключения); Соединение = СервисКриптографииDSSСлужебный.ПодготовитьПодключение(СвойстваПодключения, Неопределено, ПараметрыОперации); - РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыЗапроса, "POST"); + РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыЗапроса, "POST", , , ПараметрыОперации); СохранитьНастройки = Ложь; Если РезультатЗапроса.Выполнено Тогда - РезультатЗапроса = ПроверитьМаркерДоступа(НастройкиПользователя, РезультатЗапроса); + РезультатЗапроса = ПроверитьМаркерДоступа(НастройкиПользователя, РезультатЗапроса, ПараметрыОперации); Если РезультатЗапроса.Выполнено Тогда СохранитьНастройки = Истина; РезультатЗапроса = ОбновитьПолитикуПользователя(НастройкиПользователя, Принудительно, ВходящиеПараметры); @@ -716,7 +716,7 @@ СервисКриптографииDSSСлужебный.УстановитьНастройкиПользователя(КлючНастроек, НастройкиПользователя, ИсточникНастроек); КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "АутентификацияПоЛогину", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "АутентификацияПоЛогину", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -765,7 +765,7 @@ СвойстваПодключения = СервисКриптографииDSSСлужебный.ПодготовитьСвойстваПодключения(НастройкиПользователя.Подключение, АдресПодключения); Соединение = СервисКриптографииDSSСлужебный.ПодготовитьПодключение(СвойстваПодключения, СертификатКлиента, ПараметрыОперации); - РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыЗапроса, "GET"); + РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыЗапроса, "GET" , , , ПараметрыОперации); УдалитьФайлы(ВременныйФайл); @@ -783,7 +783,7 @@ Результат = РезультатЗапроса; КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(Результат, "АутентификацияПоСертификату", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(Результат, "АутентификацияПоСертификату", ПараметрыЗапроса, , ПараметрыОперации); Возврат Результат; @@ -854,11 +854,11 @@ ПараметрыЗапроса.Вставить("redirect_uri", НастройкиПользователя.Подключение.Заглушка); Соединение = СервисКриптографииDSSСлужебный.ПодготовитьПодключение(СвойстваПодключения, Неопределено, ПараметрыОперации); - РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыЗапроса, "POST"); + РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыЗапроса, "POST", , , ПараметрыОперации); СохранитьНастройки = Ложь; Если РезультатЗапроса.Выполнено Тогда - РезультатЗапроса = ПроверитьМаркерДоступа(НастройкиПользователя, РезультатЗапроса); + РезультатЗапроса = ПроверитьМаркерДоступа(НастройкиПользователя, РезультатЗапроса, ПараметрыОперации); Если РезультатЗапроса.Выполнено Тогда СохранитьНастройки = Истина; РезультатЗапроса = ОбновитьПолитикуПользователя(НастройкиПользователя, Принудительно, ВходящиеПараметры); @@ -872,7 +872,7 @@ СервисКриптографииDSSСлужебный.УстановитьНастройкиПользователя(КлючНастроек, НастройкиПользователя, ИсточникНастроек); КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьТокенПоКодуАвторизации", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьТокенПоКодуАвторизации", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -903,11 +903,11 @@ ПараметрыЗапроса.Вставить("refresh_token", ТокенОбновления); Соединение = СервисКриптографииDSSСлужебный.ПодготовитьПодключение(СвойстваПодключения, Неопределено, ПараметрыОперации); - РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыЗапроса, "POST"); + РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыЗапроса, "POST", , , ПараметрыОперации); СохранитьНастройки = Ложь; Если РезультатЗапроса.Выполнено Тогда - РезультатЗапроса = ПроверитьМаркерДоступа(НастройкиПользователя, РезультатЗапроса); + РезультатЗапроса = ПроверитьМаркерДоступа(НастройкиПользователя, РезультатЗапроса, ПараметрыОперации); Если РезультатЗапроса.Выполнено Тогда СохранитьНастройки = Истина; РезультатЗапроса.МаркерОбновлен = Истина; @@ -921,7 +921,7 @@ СервисКриптографииDSSСлужебный.УстановитьНастройкиПользователя(КлючНастроек, НастройкиПользователя, ИсточникНастроек); КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ОбновитьТокенАутентификации", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ОбновитьТокенАутентификации", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -960,7 +960,7 @@ РезультатЗапроса = ПроверитьТокенАутентификации(НастройкиПользователя, Принудительно, ПараметрыОперации); - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПроверкаАутентификации", Неопределено); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПроверкаАутентификации", Неопределено, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -974,11 +974,12 @@ // * Выполнено - Булево - приравнивает Ложь // * Ошибка - Строка - заполняет описание ошибки // * КодОшибки - Строка - заполняет код ошибки +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. // // Возвращаемое значение: // Булево - Истина, если проверка пройдена // -Функция ПроверитьМаркерДоступа(НастройкиПользователя, РезультатЗапроса) Экспорт +Функция ПроверитьМаркерДоступа(НастройкиПользователя, РезультатЗапроса, ПараметрыОперации = Неопределено) Экспорт Результат = РезультатЗапроса; НовыеДанные = РезультатЗапроса.Результат; @@ -1000,7 +1001,7 @@ ТокенОбновления = СвойствоСтруктуры(НовыеДанные, "Refresh_Token", ""); КонецЕсли; - ДанныеТокена = РазобратьТокенАвторизации(Токен); + ДанныеТокена = РазобратьТокенАвторизации(Токен, ПараметрыОперации); // добавить проверку на сервис ЦИ и логин, актуально для веб-авторизации Если ВРег(ДанныеТокена.Логин) = ВРег(НастройкиПользователя.Логин) Тогда ТокенАвторизации.Токен = СервисКриптографииDSSКлиентСервер.ОбъектПароля(Токен, 0); @@ -1058,7 +1059,7 @@ РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "УстановитьСертификат", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "УстановитьСертификат", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -1164,7 +1165,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатВыполнения, "ПолучитьДанныеСертификатов", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатВыполнения, "ПолучитьДанныеСертификатов", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатВыполнения; @@ -1212,7 +1213,7 @@ КонецЕсли; КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ВалидацияПинКодаСертификата", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ВалидацияПинКодаСертификата", ПараметрыЗапроса, , ПараметрыОперации); ПараметрыЗапроса = Неопределено; @@ -1278,7 +1279,7 @@ РезультатЗапроса.Результат = РезультатОперации; КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СменитьПинКодСертификата", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СменитьПинКодСертификата", ПараметрыЗапроса, , ПараметрыОперации); ПараметрыЗапроса = Неопределено; @@ -1314,7 +1315,7 @@ РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "НазначитьОсновнымСертификат", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "НазначитьОсновнымСертификат", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -1383,7 +1384,7 @@ РезультатЗапроса.Результат = СервисКриптографииDSSСлужебный.ЗаполнитьСведенияСертификатаXMLОписание(РезультатЗапроса.Результат); КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьСвойстваСертификата", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьСвойстваСертификата", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -1478,7 +1479,7 @@ РезультатЗапроса.Результат = СвойстваЗапросаНаСертификат(РезультатЗапроса.Результат); КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьЗапросНаСертификат", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьЗапросНаСертификат", ПараметрыЗапроса, , ПараметрыОперации); ПараметрыЗапроса = Неопределено; ЗначениеПинКода = Неопределено; @@ -1528,7 +1529,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьЗапросНаСертификат", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьЗапросНаСертификат", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -1566,7 +1567,7 @@ РезультатЗапроса.Результат = Результат; КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьЗапросНаСертификат", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьЗапросНаСертификат", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -1605,7 +1606,7 @@ РезультатЗапроса.Результат = Ложь; КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьЗапросНаСертификат", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьЗапросНаСертификат", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -1637,9 +1638,9 @@ + Токен); Соединение = СервисКриптографииDSSСлужебный.ПодготовитьПодключение(СвойстваПодключения, Неопределено, ПараметрыОперации); - РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыЗапроса, "GET", Заголовки, "json_list"); + РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыЗапроса, "GET", Заголовки, "json_list", ПараметрыОперации); - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьПараметрыПолитики", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьПараметрыПолитики", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -1710,7 +1711,7 @@ РезультатЗапроса.Вставить("ТипРезультата", ВозвращатьКак); КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьТранзакцию", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьТранзакцию", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -1755,7 +1756,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатВызова, "ОбновитьПолитикуПользователя", ""); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатВызова, "ОбновитьПолитикуПользователя", "", , ПараметрыОперации); Возврат РезультатВызова; @@ -1785,14 +1786,14 @@ ПараметрыЗапроса.Вставить("resource", АдресСервера); Соединение = СервисКриптографииDSSСлужебный.ПодготовитьПодключение(СвойстваПодключения, Неопределено, ПараметрыОперации); - РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, АдресПодключения, ПараметрыЗапроса, "GET", , "text"); + РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, АдресПодключения, ПараметрыЗапроса, "GET", , "text", ПараметрыОперации); Если РезультатЗапроса.Выполнено Тогда Результат = СервисКриптографииDSSСлужебный.РазобратьОтветСервисаОбнаружения(РезультатЗапроса.Результат); РезультатЗапроса.Результат = Результат; КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьОписаниеСервиса", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьОписаниеСервиса", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -1828,9 +1829,10 @@ ПараметрыЗапроса, HTTPМетод, Заголовки, - ТипСодержания); + ТипСодержания, + ПараметрыОперации); - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ВыполнитьЗапросКСервису", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ВыполнитьЗапросКСервису", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -1927,7 +1929,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ЗапросЗаписейАудита", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ЗапросЗаписейАудита", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -2005,7 +2007,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ЗагрузитьДокумент", ПараметрыДокумента); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ЗагрузитьДокумент", ПараметрыДокумента, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -2043,7 +2045,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ЗагрузитьПакетДокументов", ПараметрыДокументов); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ЗагрузитьПакетДокументов", ПараметрыДокументов, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -2079,7 +2081,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ИнформацияОДокументеПоИдентификатору", ИдентификаторДокумента); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ИнформацияОДокументеПоИдентификатору", ИдентификаторДокумента, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -2115,7 +2117,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ИнформацияОДокументеПоИдентификатору", ХешДокумента); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ИнформацияОДокументеПоИдентификатору", ХешДокумента, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -2149,7 +2151,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьОбработанныйДокумент", ИдентификаторДокумента); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьОбработанныйДокумент", ИдентификаторДокумента, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -2249,7 +2251,7 @@ РезультатЗапроса.Результат = СписокДокументов; КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьОбработанныйДокумент", ИдентификаторыДокументов); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьОбработанныйДокумент", ИдентификаторыДокументов, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -2285,7 +2287,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ИзменитьИнформациюОДокументе", ПараметрыДокумента); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ИзменитьИнформациюОДокументе", ПараметрыДокумента, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -2322,7 +2324,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПривязатьДокумент", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПривязатьДокумент", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -2366,7 +2368,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СконвертироватьДокумент", ИдентификаторПользователя); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СконвертироватьДокумент", ИдентификаторПользователя, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -2411,7 +2413,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьИнформациюДокументаКонвертации", ИдентификаторПользователя); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьИнформациюДокументаКонвертации", ИдентификаторПользователя, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -2447,7 +2449,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "УдалитьДокумент", ПараметрыДокумента); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "УдалитьДокумент", ПараметрыДокумента, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -2518,7 +2520,7 @@ КонецЕсли; КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьЗакрытыйКлюч", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьЗакрытыйКлюч", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -2561,7 +2563,7 @@ КонецЕсли; КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "УстановитьПараметрЗакрытогоКлюча", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "УстановитьПараметрЗакрытогоКлюча", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -2600,7 +2602,7 @@ КонецЕсли; КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьПараметрЗакрытогоКлюча", ИмяПараметра); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьПараметрЗакрытогоКлюча", ИмяПараметра, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -2690,10 +2692,8 @@ ИдентификаторПрофиля, ИдентификаторыСвязанныхДокументов); - //@skip-warning ПараметрыЗапроса.Вставить("IsAsync", АсинхронныйРежим); Если АсинхронныйРежим И ЗначениеЗаполнено(ОбратныйВызов) Тогда - //@skip-warning ПараметрыЗапроса.Вставить("Callback", ОбратныйВызов); КонецЕсли; Если ПодтверждениеОперации = Истина Тогда @@ -2782,7 +2782,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПодписатьАсинхронно", СвойствоПодписи); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПодписатьАсинхронно", СвойствоПодписи, , ПараметрыОперации); ЗначениеПинКода = Неопределено; ПараметрыЗапроса = Неопределено; @@ -2937,7 +2937,7 @@ КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "РасшифроватьАсинхронно", ИдентификаторСертификата); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "РасшифроватьАсинхронно", ИдентификаторСертификата, , ПараметрыОперации); ЗначениеПинКода = Неопределено; ПараметрыЗапроса = Неопределено; @@ -3024,7 +3024,7 @@ РезультатЗапроса.Результат = РезультатЗапроса.Результат[0]; КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СертификатыРасшифрованияАсинхронно", ДанныеДокумента); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СертификатыРасшифрованияАсинхронно", ДанныеДокумента, , ПараметрыОперации); ПараметрыЗапроса = Неопределено; @@ -3140,7 +3140,7 @@ КонецЕсли; КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ЗашифроватьСинхронно", ПараметрыЗапроса); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ЗашифроватьСинхронно", ПараметрыЗапроса, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -3183,7 +3183,7 @@ КонецЕсли; КонецЕсли; - СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СведенияОбОперации", ИдентификаторОперации); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СведенияОбОперации", ИдентификаторОперации, , ПараметрыОперации); Возврат РезультатЗапроса; @@ -3685,9 +3685,7 @@ СвойстваСертификата.Вставить("ИдентификаторСубъекта", РасширенныеСвойства.ИдентификаторСубъекта); Если ДвоичныеДанныеКакHEX Тогда - //@skip-warning СвойстваСертификата.СерийныйНомер = НРег(ПолучитьHexСтрокуИзДвоичныхДанных(СвойстваСертификата.СерийныйНомер)); - //@skip-warning СвойстваСертификата.Отпечаток = НРег(ПолучитьHexСтрокуИзДвоичныхДанных(СвойстваСертификата.Отпечаток)); КонецЕсли; @@ -4158,7 +4156,7 @@ Заголовки.Вставить("Authorization", НастройкиПользователя.ТокенАвторизации.ТипТокена + " " + Токен); КонецЕсли; КонецЕсли; - РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыМетода, МетодHTTP, Заголовки, ТипСодержания); + РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыМетода, МетодHTTP, Заголовки, ТипСодержания, ПараметрыОперации); Если РезультатЗапроса.Выполнено ИЛИ НЕ СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатЗапроса.Ошибка) Тогда Прервать; КонецЕсли; @@ -4264,12 +4262,6 @@ КонецПопытки; - Если 1 = 0 Тогда - СервисКриптографииDSSСлужебный.ДоступныНовыеДанные(Неопределено, Ложь); - СервисКриптографииDSSСлужебный.ОбработатьНовыеДанные(Неопределено, ""); - СервисКриптографииDSSСлужебный.ОбработкаДанныхОтменена(Неопределено); - КонецЕсли; - Возврат Результат; КонецФункции @@ -4672,7 +4664,8 @@ // Служебная функция технического разбора маркера безопасности в формате JWT // // Параметры: -// СодержимоеТокена - Строка - строка в формате Base64 +// СодержимоеТокена - Строка - строка в формате Base64 +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. // // Возвращаемое значение: // Структура: @@ -4682,7 +4675,7 @@ // * ЭлектроннаяПочта- Строка // * ИдентификаторЦИ - Строка // -Функция РазобратьТокенАвторизации(СодержимоеТокена) +Функция РазобратьТокенАвторизации(СодержимоеТокена, ПараметрыОперации = Неопределено) Результат = Новый Структура(); Результат.Вставить("Логин", ""); @@ -4709,10 +4702,11 @@ Исключение ОбъектОшибки = ИнформацияОбОшибке(); СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове( - ПодробноеПредставлениеОшибки(ОбъектОшибки), + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ОбъектОшибки), НСтр("ru = 'Разобрать токен авторизации'"), СодержимоеТокена, - ОбъектОшибки); + ОбъектОшибки, + ПараметрыОперации); КонецПопытки; diff --git a/SSL/src/CommonModules/СервисКриптографииDSSASNКлиентСервер/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSSASNКлиентСервер/Module.bsl index 0995ac6e1..e6163b15a 100644 --- a/SSL/src/CommonModules/СервисКриптографииDSSASNКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/СервисКриптографииDSSASNКлиентСервер/Module.bsl @@ -1794,7 +1794,7 @@ Если ОпределениеASN.ОтображатьОшибки Тогда ОбъектСообщения = Новый СообщениеПользователю(); - ОбъектСообщения.Текст = ПодробноеПредставлениеОшибки(ТекущаяОшибка); + ОбъектСообщения.Текст = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ТекущаяОшибка); ОбъектСообщения.Сообщить(); КонецЕсли; diff --git a/SSL/src/CommonModules/СервисКриптографииDSSКлиентСервер/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSSКлиентСервер/Module.bsl index 73928185a..f82c738e7 100644 --- a/SSL/src/CommonModules/СервисКриптографииDSSКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/СервисКриптографииDSSКлиентСервер/Module.bsl @@ -1520,7 +1520,7 @@ Попытка СертификатТекст = ПолучитьСтрокуИзДвоичныхДанных(Сертификат); Исключение - СервисКриптографииDSSСлужебныйВызовСервера.ЗаписатьОшибкуВЖурналРегистрации(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + СервисКриптографииDSSСлужебныйВызовСервера.ЗаписатьОшибкуВЖурналРегистрации(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Если СтрНайти(СертификатТекст, "-----BEGIN CERTIFICATE-----") > 0 Тогда @@ -1599,6 +1599,7 @@ // * КодОшибки - Строка - содержит учетный код ошибки в подсистеме // * ИсходнаяОшибка - Строка - содержит текст ошибки, сформированный сервером // * ИсходныйКод - Строка - содержит код ошибки, сформированный сервером +// * ПолныйТекст - Строка - содержит текст ошибки платформы // Функция СтатусОшибки() Экспорт @@ -1607,6 +1608,7 @@ Результат.Вставить("Представление", ""); Результат.Вставить("ИсходныйТекст", ""); Результат.Вставить("ИсходныйКод", ""); + Результат.Вставить("ПолныйТекст", ""); Возврат Результат; @@ -2375,7 +2377,7 @@ Функция ОписаниеОшибки_УстановкаРасширенияСФайлами() Результат = ОбщееОписаниеОшибки("300046", - НСтр("ru = 'Не удалось установить расширения работы с файлами в Веб-клиенте.'")); + НСтр("ru = 'Не удалось установить расширение работы с файлами в веб-клиенте.'")); Возврат Результат; @@ -2389,7 +2391,7 @@ Функция ОписаниеОшибки_ПолучениеФайла() Результат = ОбщееОписаниеОшибки("300047", - НСтр("ru = 'Возникла ошибка при получении данных файла.'")); + НСтр("ru = 'Не удалось получить данные файла.'")); Возврат Результат; diff --git a/SSL/src/CommonModules/СервисКриптографииDSSПереопределяемый/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSSПереопределяемый/Module.bsl index 68eb18c1d..46f7a1327 100644 --- a/SSL/src/CommonModules/СервисКриптографииDSSПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/СервисКриптографииDSSПереопределяемый/Module.bsl @@ -13,11 +13,8 @@ // Параметры: // МассивСпособов - Массив из ПеречислениеСсылка.СпособыАвторизацииDSS // -//@skip-warning Пустой метод -// Процедура СписокПервичнойАвторизации(МассивСпособов) Экспорт - КонецПроцедуры // Процедура позволяет переопределить список способов вторичной авторизация, доступный пользователю @@ -25,17 +22,12 @@ // Параметры: // МассивСпособов - Массив из ПеречислениеСсылка.СпособыАвторизацииDSS // -//@skip-warning Пустой метод -// Процедура СписокВторичнойАвторизации(МассивСпособов) Экспорт - КонецПроцедуры // Процедура вызывается при изменении значения константы ИспользоватьСервисDSS // -//@skip-warning Пустой метод -// Процедура ПриВключенииСервисаОблачнойПодписи() Экспорт КонецПроцедуры @@ -45,8 +37,6 @@ // Параметры: // ТекущийРежим - Булево - для ВебКлиента Ложь, для остальных Истина // -//@skip-warning Пустой метод -// Процедура ИспользоватьСинхронныйРежим(ТекущийРежим) Экспорт КонецПроцедуры diff --git a/SSL/src/CommonModules/СервисКриптографииDSSПодтверждениеКлиент/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSSПодтверждениеКлиент/Module.bsl index d03939eb1..d6e47a6bd 100644 --- a/SSL/src/CommonModules/СервисКриптографииDSSПодтверждениеКлиент/Module.bsl +++ b/SSL/src/CommonModules/СервисКриптографииDSSПодтверждениеКлиент/Module.bsl @@ -88,7 +88,7 @@ СервисКриптографииDSSСлужебныйКлиент.ДатаСеанса()); Если ДанныеПодтверждения.ЭтапЦикла = "Ошибка" Тогда - ПредставлениеОшибки = НСтр("ru = 'Ошибка при выполнении этапа:'") + " " + ТекущийЭтап + Символы.ПС + ПредставлениеОшибки = НСтр("ru = 'Не выполнен этап:'") + " " + ТекущийЭтап + Символы.ПС + ДанныеПодтверждения.КодОшибки + ": " + ДанныеПодтверждения.Ошибка; СервисКриптографииDSSСлужебныйВызовСервера.ЗаписатьОшибкуВЖурналРегистрации(ПредставлениеОшибки); diff --git a/SSL/src/CommonModules/СервисКриптографииDSSСлужебный/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSSСлужебный/Module.bsl index 0b8a57ed4..ff5339dc8 100644 --- a/SSL/src/CommonModules/СервисКриптографииDSSСлужебный/Module.bsl +++ b/SSL/src/CommonModules/СервисКриптографииDSSСлужебный/Module.bsl @@ -193,16 +193,6 @@ #Область ПоставляемыеДанные -// См. ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных. -Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.ВидДанных = ВидПоставляемыхДанных(); - Обработчик.КодОбработчика = "СервисОблачнойПодписи"; - Обработчик.Обработчик = СервисКриптографииDSSСлужебный; - -КонецПроцедуры - // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт @@ -211,56 +201,6 @@ КонецПроцедуры -// Вызывается при получении уведомления о новых данных. -// В теле следует проверить, необходимы ли эти данные приложению, -// и если да - установить флажок Загружать. -// -// Параметры: -// Дескриптор - ОбъектXDTO - дескриптор. -// Загружать - Булево - Истина, если загружать, Ложь - иначе. -// -Процедура ДоступныНовыеДанные(Знач Дескриптор, Загружать) Экспорт - - Если Дескриптор.DataType = ВидПоставляемыхДанных() Тогда - - Загружать = Истина; - - КонецЕсли; - -КонецПроцедуры - -// Вызывается после вызова ДоступныНовыеДанные, позволяет разобрать данные. -// -// Параметры: -// Дескриптор - ОбъектXDTO - дескриптор. -// ПутьКФайлу - Строка - полное имя извлеченного файла. Файл будет автоматически удален -// после завершения процедуры. Если в менеджере сервиса не был -// указан файл - значение аргумента равно Неопределено. -// -Процедура ОбработатьНовыеДанные(Знач Дескриптор, Знач ПутьКФайлу) Экспорт - - Если Дескриптор.DataType = ВидПоставляемыхДанных() Тогда - ОбработатьПоставляемыеСервера(ПутьКФайлу); - КонецЕсли; - -КонецПроцедуры - -// Вызывается при отмене обработки данных в случае сбоя. -// -// Параметры: -// Дескриптор - ОбъектXDTO - дескриптор. -// -Процедура ОбработкаДанныхОтменена(Знач Дескриптор) Экспорт - - МодульПоставляемыеДанные = ОбщегоНазначения.ОбщийМодуль("ПоставляемыеДанные"); - - ПротоколОшибкиПриВызове(НСтр("ru = 'Обработка данных отменена.'"), - "ПоставляемыеДанные", - МодульПоставляемыеДанные.ПолучитьОписаниеДанных(Дескриптор)); - - -КонецПроцедуры - #КонецОбласти #Область ИнтеграцияВПодсистемуЭлектроннаяПодпись @@ -848,23 +788,6 @@ КонецФункции -// Служебная функция проверки версии платформы. -// -// Параметры: -// ОжидаемаяВерсия - Строка -// -// Возвращаемое значение: -// Булево - Истина, если версия платформы равно или больше ожидаемой -// -Функция НужнаяВерсияПлатформы(ОжидаемаяВерсия) Экспорт - - СистемнаяИнформация = Новый СистемнаяИнформация; - Результат = ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, ОжидаемаяВерсия) >= 0; - - Возврат Результат; - -КонецФункции - // Формирует параметризированное описание ошибки, по переданном ключевому слову. // Параметры: // РезультатОперации - Структура - структура со стандартным содержанием ответа сервиса @@ -912,8 +835,9 @@ // Параметры: // ТекстОшибки - Строка - описание ошибки // ПараметрыВызова - Структура - значения полей которые вызвали ошибку +// РегистрироватьОшибку - Булево // -Процедура ЗаписатьОшибкуВЖурналРегистрации(ТекстОшибки, ПараметрыВызова = Неопределено) Экспорт +Процедура ЗаписатьОшибкуВЖурналРегистрации(ТекстОшибки, ПараметрыВызова = Неопределено, РегистрироватьОшибку = Истина) Экспорт ДанныеВызова = ""; Если ТипЗнч(ПараметрыВызова) = Тип("Строка") Тогда @@ -934,9 +858,15 @@ ДанныеВызова, СокрЛП(ТекстОшибки)); - ЗаписьЖурналаРегистрации(СервисКриптографииDSSКлиентСервер.ИмяСобытияЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка,,, - СодержаниеОшибки); + Если РегистрироватьОшибку Тогда + ЗаписьЖурналаРегистрации(СервисКриптографииDSSКлиентСервер.ИмяСобытияЖурналаРегистрации(), + УровеньЖурналаРегистрации.Ошибка,,, + СодержаниеОшибки); + Иначе + ЗаписьЖурналаРегистрации(СервисКриптографииDSSКлиентСервер.ИмяСобытияЖурналаРегистрации(), + УровеньЖурналаРегистрации.Информация,,, + СодержаниеОшибки); + КонецЕсли; КонецПроцедуры @@ -3674,8 +3604,7 @@ // Функция ПодготовитьСвойстваПодключения(СвойстваПользователя, АдресПодключения) Экспорт - Результат = СкопироватьСтруктуру(СвойстваПользователя); - //@skip-warning + Результат = СкопироватьСтруктуру(СвойстваПользователя); Результат.Вставить("АдресПодключения", АдресПодключения); Позиция = СтрНайти(АдресПодключения, "://"); @@ -3755,10 +3684,11 @@ Исключение Результат.Выполнено = Ложь; ПолучитьОписаниеОшибки(Результат, "Подключение"); - ПротоколОшибкиПриВызове(Результат.Ошибка, + Результат.СтатусОшибки.ПолныйТекст = ПротоколОшибкиПриВызове(Результат.Ошибка, "Подключение", "", - ИнформацияОбОшибке()); + ИнформацияОбОшибке(), + ПараметрыОперации); КонецПопытки; @@ -3818,7 +3748,8 @@ // text - передать структуру как форматированную строку, // json_list - передать как json и вернуть как Соответствие, // json - передать как json. -// ПодписыватьЗапрос - Булево - использовать усиленный протокол обмена с сервисом, с использованием HMAC +// ПараметрыОперации - Неопределено +// - Структура // // Возвращаемое значение: // см. ОтветСервисаПоУмолчанию @@ -3829,7 +3760,7 @@ МетодHTTP, Заголовки = Неопределено, ТипСодержания = "text", - ПодписыватьЗапрос = Ложь) Экспорт + ПараметрыОперации = Неопределено) Экспорт Если Соединение.Выполнено Тогда @@ -3881,11 +3812,12 @@ Ответ = Соединение.Результат.ВызватьHTTPМетод(МетодHTTP, Запрос); Исключение ОтветМетода = ОтветСервисаПоУмолчанию(Ложь); - ПолучитьОписаниеОшибки(ОтветМетода, "ВыполнениеМетода", КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); - ПротоколОшибкиПриВызове(ОтветМетода.Ошибка, + ПолучитьОписаниеОшибки(ОтветМетода, "ВыполнениеМетода", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОтветМетода.СтатусОшибки.ПолныйТекст = ПротоколОшибкиПриВызове(ОтветМетода.Ошибка, "ВыполнениеМетода", ПараметрыМетода, - ИнформацияОбОшибке()); + ИнформацияОбОшибке(), + ПараметрыОперации); Возврат ОтветМетода; КонецПопытки; @@ -4113,8 +4045,12 @@ // ВходящийКонтекст - Строка, Структура - желательно структуру фильтровать на критичные данные и их размер // см. СервисКриптографииDSSКлиентСервер.ФильтроватьПараметрыВызова() // КонтекстОшибки - ИнформацияОбОшибке +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. // -Процедура ПротоколОшибкиПриВызове(РезультатВызова, ВидОперации, ВходящийКонтекст, КонтекстОшибки = Неопределено) Экспорт +// Возвращаемое значение: +// Строка - текст ошибки, возникший при исключении в платформе +// +Функция ПротоколОшибкиПриВызове(РезультатВызова, ВидОперации, ВходящийКонтекст, КонтекстОшибки = Неопределено, ПараметрыОперации = Неопределено) Экспорт НоваяОшибка = ""; ПодробнаяОшибка = ""; @@ -4126,7 +4062,7 @@ КонецЕсли; Если КонтекстОшибки <> Неопределено Тогда - ПодробнаяОшибка = ПодробноеПредставлениеОшибки(КонтекстОшибки); + ПодробнаяОшибка = ОбработкаОшибок.ПодробноеПредставлениеОшибки(КонтекстОшибки); КонецЕсли; Если ЗначениеЗаполнено(НоваяОшибка) Тогда @@ -4145,10 +4081,12 @@ КонецЕсли; НовыйОбъект = СервисКриптографииDSSКлиентСервер.ФильтроватьПараметрыВызова(ВходящийКонтекст); - ЗаписатьОшибкуВЖурналРегистрации(ТекстОшибки, НовыйОбъект); + ЗаписатьОшибкуВЖурналРегистрации(ТекстОшибки, НовыйОбъект, ПолучитьПолеСтруктуры(ПараметрыОперации, "РегистрироватьОшибку", Истина)); КонецЕсли; -КонецПроцедуры + Возврат ПодробнаяОшибка; + +КонецФункции // Подготавливает данные перед возвратом "клиенту" // @@ -4200,7 +4138,7 @@ Исключение ОбъектОшибки = ИнформацияОбОшибке(); ПротоколОшибкиПриВызове( - ПодробноеПредставлениеОшибки(ОбъектОшибки), + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ОбъектОшибки), НСтр("ru = 'Проверить ошибку выполнения метода'"), ДанныеОтвета, ОбъектОшибки); @@ -5764,7 +5702,7 @@ РезультатЗапроса.Вставить("НастройкиПользователя", НастройкиПользователя); КонецЕсли; - ПротоколОшибкиПриВызове(РезультатЗапроса, "ПодготовитьТранзакцию", ПараметрыВыполнения); + ПротоколОшибкиПриВызове(РезультатЗапроса, "ПодготовитьТранзакцию", ПараметрыВыполнения, , ВходящиеПараметры); Возврат РезультатЗапроса; @@ -5893,6 +5831,7 @@ ВходящиеПараметры.Вставить("ДатаСеанса", ДатаСеанса); ВходящиеПараметры.Вставить("ИсточникНастроек", ИсточникНастроек); ВходящиеПараметры.Вставить("ПодтверждатьПринудительно", ПодтверждатьПринудительно); + ВходящиеПараметры.Вставить("РегистрироватьОшибку", ПолучитьПолеСтруктуры(ПараметрыОперации, "РегистрироватьОшибку", Истина)); РезультатЗапроса = ПакетнаяОперацияПользователя(НастройкиПользователя, ПараметрыВыполнения, ВходящиеПараметры); Если РезультатЗапроса.МаркерОбновлен Тогда @@ -7159,176 +7098,6 @@ КонецФункции -// Служебная функция для определения идентификатора поставляемых данных для загрузки в справочник ЭкземплярыСервераDSS. -// -Функция ВидПоставляемыхДанных() - - Возврат "СервисОблачнойПодписи"; - -КонецФункции - -// Служебная универсальная функция для обработки содержимого архива -// -// Параметры: -// ПутьКФайлу - Строка - путь к файлу с архивом -// ТипСодержимого - Строка - один из фиксированных вариантов: ДвоичныеДанные, ВременноеХранилище -// -// Возвращаемое значение: -// Соответствие из КлючИЗначение: -// * Ключ - Строка - имя файла -// * Значение - Строка - адрес временного хранилища -// - ДвоичныеДанные -// -Функция ПолучитьДанныеАрхива(ПутьКФайлу, ТипСодержимого = "ДвоичныеДанные") - - Результат = Новый Соответствие; - - КаталогРаспаковки = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла()); - СоздатьКаталог(КаталогРаспаковки); - - Попытка - - Архиватор = Новый ЧтениеZipФайла(ПутьКФайлу); - Архиватор.ИзвлечьВсе(КаталогРаспаковки, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); - Архиватор.Закрыть(); - - Исключение - - ПротоколОшибкиПриВызове( - НСтр("ru = 'Не удалось распаковать архив с поставляемыми данными.'"), - "ПоставляемыеДанные", - ПутьКФайлу, - ИнформацияОбОшибке()); - Возврат Результат; - - КонецПопытки; - - ИмеющиесяФайлы = НайтиФайлы(КаталогРаспаковки, "*"); - - ПозицияОбхода = 0; - КоличествоФайлов = ИмеющиесяФайлы.Количество(); - Пока ПозицияОбхода < КоличествоФайлов Цикл - - Файл = ИмеющиесяФайлы[ПозицияОбхода]; - - ДанныеФайла = Новый ДвоичныеДанные(Файл.ПолноеИмя); - Если ТипСодержимого = "ВременноеХранилище" Тогда - ДанныеФайла = ПоместитьВоВременноеХранилище(ДанныеФайла); - КонецЕсли; - - Результат.Вставить(Файл.Имя, ДанныеФайла); - - ПозицияОбхода = ПозицияОбхода + 1; - КонецЦикла; - - УдалитьФайлы(КаталогРаспаковки); - - Возврат Результат; - -КонецФункции - -// Служебная процедура служит для обработки получения реестра серверов облачной подписи -// через механизм "Поставляемые данные". -// -Процедура ОбработатьПоставляемыеСервера(ПутьКФайлу) - - Удачно = Истина; - КоличествоСерверов = 0; - КодЯзыка = КодЯзыка(); - ВсеДанные = ПолучитьДанныеАрхива(ПутьКФайлу, "ДвоичныеДанные"); - - Если ВсеДанные.Количество() <> 1 Тогда - ПротоколОшибкиПриВызове( - НСтр("ru = 'Поставляемые данные не содержат нужной информации.'", КодЯзыка), - "ПоставляемыеДанные", - ПутьКФайлу, - ИнформацияОбОшибке()); - Удачно = Ложь; - КонецЕсли; - - ИспользоватьСервисОблачнойПодписи = Ложь; - ЭтоМассивСерверов = Ложь; - ЭтоПереключатель = Ложь; - ТекущиеДанные = Неопределено; - - Для Каждого СтрокаКлюча Из ВсеДанные Цикл - ДанныеФайла = ПолучитьСтрокуИзДвоичныхДанных(СтрокаКлюча.Значение); - ТекущиеДанные = JsonВСтруктуру(ДанныеФайла); - КонецЦикла; - - Если Удачно Тогда - - ЭтоМассивСерверов = Тип("Массив") = ТипЗнч(ТекущиеДанные); - ЭтоПереключатель = Тип("Структура") = ТипЗнч(ТекущиеДанные); - - КонецЕсли; - - Удачно = ЭтоМассивСерверов ИЛИ ЭтоПереключатель; - - Если ЭтоМассивСерверов Тогда - - Для Каждого СтрокаМассива Из ТекущиеДанные Цикл - СерверОблачнойПодписи = Неопределено; - - Если ЗначениеЗаполнено(СтрокаМассива) Тогда - НастройкиСервиса = РазобратьФайлНастроекСервера(СтрокаМассива); - СерверОблачнойПодписи = СоздатьСерверОблачнойПодписи(НастройкиСервиса); - КонецЕсли; - - Если ЗначениеЗаполнено(СерверОблачнойПодписи) Тогда - КоличествоСерверов = КоличествоСерверов + 1; - КонецЕсли; - - КонецЦикла; - - Если КоличествоСерверов = 0 - ИЛИ КоличествоСерверов <> ТекущиеДанные.Количество() Тогда - ПротоколОшибкиПриВызове( - НСтр("ru = 'Запись поставляемых данных завершилась с ошибками.'", КодЯзыка), - "ПоставляемыеДанные", - ПутьКФайлу, - ИнформацияОбОшибке()); - Удачно = Ложь; - Иначе - ИспользоватьСервисОблачнойПодписи = Истина; - КонецЕсли; - - КонецЕсли; - - Если ЭтоПереключатель Тогда - Удачно = ТекущиеДанные.Свойство("ИспользоватьСервисОблачнойПодписи"); - ИспользоватьСервисОблачнойПодписи = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ТекущиеДанные, "ИспользоватьСервисОблачнойПодписи", Ложь); - КонецЕсли; - - Если Удачно Тогда - - Попытка - ИзменитьРежимИспользоватьСервисОблачнойПодписи(ИспользоватьСервисОблачнойПодписи); - Исключение - ПротоколОшибкиПриВызове( - НСтр("ru = 'Запись поставляемых данных завершилась с ошибками.'", КодЯзыка), - "ПоставляемыеДанные", - ПутьКФайлу, - ИнформацияОбОшибке()); - Удачно = Ложь; - КонецПопытки; - - КонецЕсли; - -КонецПроцедуры - -// Служебная процедура необходима для изменения константы подсистемы// -// -Процедура ИзменитьРежимИспользоватьСервисОблачнойПодписи(НовоеЗначение) - - Если СервисКриптографииDSS.ИспользоватьСервисОблачнойПодписи() <> НовоеЗначение Тогда - УстановитьПривилегированныйРежим(Истина); - Константы.ИспользоватьСервисDSS.Установить(НовоеЗначение); - УстановитьПривилегированныйРежим(Ложь); - КонецЕсли; - -КонецПроцедуры - // Служебная, для упрощения проверки данных. // // Параметры: diff --git a/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйВызовСервера/Module.bsl index ad7b34a3c..d50d0a525 100644 --- a/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйВызовСервера/Module.bsl @@ -48,12 +48,7 @@ // Процедура НачальныеНастройкиФормы(ИмяФормы) Экспорт - РежимСовместимости = СтандартныеПодсистемыСервер.ВерсияРежимаСовместимости(); - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(РежимСовместимости, "8.3.18.0") < 0 Тогда - СуффиксКлючаНастроек = "НастройкиОкна"; - Иначе - СуффиксКлючаНастроек = "НастройкиОкнаТонкогоКлиента"; - КонецЕсли; + СуффиксКлючаНастроек = "НастройкиОкнаТонкогоКлиента"; Если СтрНайти(ИмяФормы, ".") = 0 Тогда ПутьФормы = "Обработка.УправлениеПодключениемDSS.Форма." + ИмяФормы + "/НастройкиФормы"; @@ -1501,9 +1496,9 @@ // Делает запись в журнал регистрации, обычно при возникновении ошибки // см. СервисКриптографииDSSСлужебный.ЗаписатьОшибкуВЖурналРегистрации() // -Процедура ЗаписатьОшибкуВЖурналРегистрации(ИнформацияОбОшибке, ПараметрыВызова = Неопределено) Экспорт +Процедура ЗаписатьОшибкуВЖурналРегистрации(ИнформацияОбОшибке, ПараметрыВызова = Неопределено, РегистрироватьОшибку = Истина) Экспорт - СервисКриптографииDSSСлужебный.ЗаписатьОшибкуВЖурналРегистрации(ИнформацияОбОшибке, ПараметрыВызова); + СервисКриптографииDSSСлужебный.ЗаписатьОшибкуВЖурналРегистрации(ИнформацияОбОшибке, ПараметрыВызова, РегистрироватьОшибку); КонецПроцедуры @@ -1534,7 +1529,7 @@ Функция ПроверитьМаркерДоступа(НастройкиПользователя, РезультатЗапроса, ПараметрыОперации = Неопределено) Экспорт ПодготовленныеНастройки = ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); - Результат = СервисКриптографииDSS.ПроверитьМаркерДоступа(ПодготовленныеНастройки, РезультатЗапроса); + Результат = СервисКриптографииDSS.ПроверитьМаркерДоступа(ПодготовленныеНастройки, РезультатЗапроса, ПараметрыОперации); ИсточникНастроек = СервисКриптографииDSSСлужебный.ПолучитьИсточникНастроек(ПараметрыОперации); КлючНастроек = СервисКриптографииDSSКлиентСервер.КлючНастроекПользователя(ПодготовленныеНастройки); СервисКриптографииDSSСлужебный.УстановитьНастройкиПользователя(КлючНастроек, ПодготовленныеНастройки, ИсточникНастроек); @@ -1725,7 +1720,6 @@ КонецЕсли; Если ПараметрыВызова <> Неопределено Тогда - //@skip-warning ТрансформироватьРезультат.Вставить("АдресаВременногоХранилища", МассивАдресов); ПараметрыВызова.Вставить("ТрансформироватьРезультат", ТрансформироватьРезультат); КонецЕсли; diff --git a/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйКлиент/Module.bsl index c960c6f67..1468cef16 100644 --- a/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйКлиент/Module.bsl @@ -2131,7 +2131,7 @@ ОбъектОповещения = Новый ОписаниеОповещения("ПодписатьАсинхронноПодтверждение", ЭтотОбъект); СледующееОповещение = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); - ПараметрыОперации = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(ВходящийКонтекст.ПараметрыОперации); + ПараметрыОперации = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(ВходящийКонтекст.ПараметрыОперации); // Структура ПараметрыОперации.Вставить("Сертификат", ВходящийКонтекст.ПредставлениеСертификата); ПараметрыОперации.Вставить("ПодтверждатьПринудительно", Истина); @@ -2150,10 +2150,10 @@ ОбъектОповещения = Новый ОписаниеОповещения("ПодписатьФоновымЗаданием", ЭтотОбъект); СледующееОповещение = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); ОписаниеСертификата = ВходящийКонтекст.ОписаниеСертификата; - СвойствоПодписи = СервисКриптографииDSSКлиентСервер.СвойстваТранзакцииПодписания(ВходящийКонтекст.СвойствоПодписи, ОписаниеСертификата.Идентификатор); + СвойствоПодписи = СервисКриптографииDSSКлиентСервер.СвойстваТранзакцииПодписания( + ВходящийКонтекст.СвойствоПодписи, ОписаниеСертификата.Идентификатор); - ПараметрыОперации = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(ВходящийКонтекст.ПараметрыОперации); - //@skip-warning + ПараметрыОперации = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(ВходящийКонтекст.ПараметрыОперации); // Структура ПараметрыОперации.Вставить("Сертификат", ВходящийКонтекст.ПредставлениеСертификата); СоздатьТранзакцию(НастройкиПользователя, @@ -6330,10 +6330,11 @@ СтандартнаяОбработка= Ложь; ОтветВызова = ОтветСервисаПоУмолчанию(Ложь); - ТекстПользователя = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - ТекстЖурнала = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстПользователя = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстЖурнала = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); КодОшибки = СервисКриптографииDSSКлиентСервер.ПолучитьКодОшибки(ТекстПользователя); ВидОперации = СвойствоСтруктуры(ВходящийКонтекст, "ВидОперации"); + РегистрироватьОшибку= СвойствоСтруктуры(ВходящийКонтекст, "ПараметрыОперации.РегистрироватьОшибку", Истина); Если ЗначениеЗаполнено(ВидОперации) Тогда ТекстПользователя = ТекстПользователя + Символы.ПС + НСтр("ru = 'Вид операции:'", КодЯзыка()) + " " + ВидОперации; @@ -6346,7 +6347,7 @@ КонецЕсли; НовыйОбъект = СервисКриптографииDSSКлиентСервер.ФильтроватьПараметрыВызова(ВходящийКонтекст); - СервисКриптографииDSSСлужебныйВызовСервера.ЗаписатьОшибкуВЖурналРегистрации(ТекстЖурнала, НовыйОбъект); + СервисКриптографииDSSСлужебныйВызовСервера.ЗаписатьОшибкуВЖурналРегистрации(ТекстЖурнала, НовыйОбъект, РегистрироватьОшибку); ВернутьРезультатВызова(ВходящийКонтекст, ОтветВызова); diff --git a/SSL/src/CommonModules/СклонениеПредставленийОбъектов/Module.bsl b/SSL/src/CommonModules/СклонениеПредставленийОбъектов/Module.bsl index 15ca11040..ddadae0b5 100644 --- a/SSL/src/CommonModules/СклонениеПредставленийОбъектов/Module.bsl +++ b/SSL/src/CommonModules/СклонениеПредставленийОбъектов/Module.bsl @@ -216,6 +216,21 @@ #Область СлужебныйПрограммныйИнтерфейс +#Область СклонениеСервисомMorpher + +// Возвращает значение константы "ИспользоватьСервисСклоненияMorpher". +// +// Возвращаемое значение: +// Булево +// +Функция ИспользоватьСервисСклоненияMorpher() Экспорт + + Возврат Константы.ИспользоватьСервисСклоненияMorpher.Получить(); + +КонецФункции + +#КонецОбласти + // См. УправлениеПечатьюПереопределяемый.ПриПодготовкеДанныхПечати Процедура ПриПодготовкеДанныхПечати(ИсточникиДанных, ВнешниеНаборыДанных, ИдентификаторСхемыКомпоновкиДанных, КодЯзыка, ДополнительныеПараметры) Экспорт @@ -276,19 +291,12 @@ // Склоняет переданную фразу по всем падежам. // // Параметры: -// Представление - Строка - строка для склонения. -// ЭтоФИО - Булево - признак склонения ФИО. -// Пол - Число - пол физического лица (в случае склонения ФИО): 1 - мужской, 2 - женский. +// Представление - Строка - строка для склонения. +// ПараметрыСклонения - см. СклонениеПредставленийОбъектовКлиентСервер.ПараметрыСклонения // ПоказыватьСообщения - Булево - признак, определяющий нужно ли показывать пользователю сообщения об ошибках. // -// Возвращаемое значение: -// Структура: -// * Именительный - Строка. -// * Родительный - Строка. -// * Дательный - Строка. -// * Винительный - Строка. -// * Творительный - Строка. -// * Предложный - Строка. +// Возвращаемое значение: +// см. СклонениеПредставленийОбъектовКлиентСервер.СтруктураСклонения // Функция ПросклонятьПредставлениеПоВсемПадежам(Представление, ПараметрыСклонения = Неопределено, ПоказыватьСообщения = Ложь) @@ -304,6 +312,32 @@ КонецФункции +// Склоняет переданные фразы по всем падежам. +// +// Параметры: +// Представления - Массив из строк - строки для склонения. +// ПараметрыСклонения - см. СклонениеПредставленийОбъектовКлиентСервер.ПараметрыСклонения +// ПоказыватьСообщения - Булево - признак, определяющий нужно ли показывать пользователю сообщения об ошибках. +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - Строка - строка для склонения. +// * Значение - см. СклонениеПредставленийОбъектовКлиентСервер.СтруктураСклонения +// +Функция ПросклонятьПредставленияПоВсемПадежам(Представления) + + Склонения = СклоненияСтрокИзРегистра(Представления); + + Для Каждого ЭлементПредставление Из Представления Цикл + Если Склонения.Получить(ЭлементПредставление) = Неопределено Тогда + Склонения.Вставить(ЭлементПредставление, ДанныеСклонения(ЭлементПредставление, Неопределено, Ложь)); + КонецЕсли; + КонецЦикла; + + Возврат Склонения; + +КонецФункции + // Получает данные склонения по всем падежам. // // Параметры: @@ -482,7 +516,7 @@ | |Результат диагностики: |%2'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), РезультатДиагностики.ОписаниеОшибки); Иначе ВызватьИсключение; @@ -492,7 +526,7 @@ Если Ответ.КодСостояния <> 200 Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при обработке запроса к ресурсу: + НСтр("ru = 'Непредвиденная ситуация при обращении к сервису склонения: |%1'"), Ответ.ПолучитьТелоКакСтроку()); КонецЕсли; @@ -518,7 +552,7 @@ ИмяСобытия = НСтр("ru = 'Склонение.Вызов веб-сервиса'", ОбщегоНазначения.КодОсновногоЯзыка()); ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Предупреждение,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); // АПК:154-вкл @@ -530,7 +564,7 @@ НСтр("ru = 'Ошибка при вызове сервиса склонения. Обратитесь к администратору. |Техническая информация: |%1'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ВызватьИсключение ТекстСообщения; @@ -571,8 +605,7 @@ Процедура ЗарегистрироватьОшибкуВстроенногоМетодаСклонения(ИнформацияОбОшибке, ПоказыватьСообщения) - ПодробноеПредставление = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); - ДополнитьПредставлениеПроблемыРекомендацией(ПодробноеПредставление); + ПодробноеПредставление = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); ЗаписьЖурналаРегистрации( НСтр("ru = 'Склонение.Получение склонения строки'", ОбщегоНазначения.КодОсновногоЯзыка()), @@ -583,8 +616,7 @@ Возврат; КонецЕсли; - КраткоеПредставление = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - ДополнитьПредставлениеПроблемыРекомендацией(КраткоеПредставление); + КраткоеПредставление = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); ВызватьИсключение КраткоеПредставление; КонецПроцедуры @@ -609,37 +641,6 @@ КонецПроцедуры -Процедура ДополнитьПредставлениеПроблемыРекомендацией(Представление) - - Если Не ВерсияПлатформыНижеРекомендуемой() Тогда - Возврат; - КонецЕсли; - - Если Не ПустаяСтрока(Представление) Тогда - Представление = Представление + Символы.ПС + Символы.ПС; - КонецЕсли; - - Представление = Представление + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для корректной работы склонения представлений рекомендуется: - |* или обновить технологическую платформу ""1С:Предприятие"" до версии %1 или более новой, - |* или включить альтернативный сервис склонения Морфер (в разделе Администрирование).'"), - РекомендуемаяВерсия()); - -КонецПроцедуры - -Функция ВерсияПлатформыНижеРекомендуемой() - - СистемнаяИнформация = Новый СистемнаяИнформация(); - ВерсияПлатформы = СистемнаяИнформация.ВерсияПриложения; - - Возврат ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияПлатформы, РекомендуемаяВерсия()) < 0; - -КонецФункции - -Функция РекомендуемаяВерсия() - Возврат "8.3.18.1128"; -КонецФункции - Функция ПредставлениеСлова() Структура = Новый Структура; @@ -802,6 +803,7 @@ | Приоритет"; Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда СтруктураСклонения = СклонениеПредставленийОбъектовКлиентСервер.СтруктураСклонения(); ЗаполнитьЗначенияСвойств(СтруктураСклонения, Выборка); @@ -811,6 +813,53 @@ КонецФункции +Функция СклоненияСтрокИзРегистра(Представления) + + УстановитьОтключениеБезопасногоРежима(Истина); + УстановитьПривилегированныйРежим(Истина); + + ХешиПредставлений = Новый СписокЗначений; + Для Каждого ЭлементПредставление Из Представления Цикл + ХешПредставления = ОбщегоНазначения.КонтрольнаяСуммаСтрокой(ЭлементПредставление); + ХешиПредставлений.Добавить(ХешПредставления, ЭлементПредставление); + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ХешПредставления", ХешиПредставлений); + + Запрос.Текст = + "ВЫБРАТЬ + | + | СклоненияПредставленийОбъектов.ИменительныйПадеж КАК Именительный, + | СклоненияПредставленийОбъектов.РодительныйПадеж КАК Родительный, + | СклоненияПредставленийОбъектов.ДательныйПадеж КАК Дательный, + | СклоненияПредставленийОбъектов.ВинительныйПадеж КАК Винительный, + | СклоненияПредставленийОбъектов.ТворительныйПадеж КАК Творительный, + | СклоненияПредставленийОбъектов.ПредложныйПадеж КАК Предложный, + | СклоненияПредставленийОбъектов.ХешПредставления КАК ХешПредставления + |ИЗ + | РегистрСведений.СклоненияПредставленийОбъектов КАК СклоненияПредставленийОбъектов + |ГДЕ + | СклоненияПредставленийОбъектов.ХешПредставления В (&ХешПредставления)"; + + Выборка = Запрос.Выполнить().Выбрать(); + + СклоненияПредставлений = Новый Соответствие; + + Для Каждого ЭлементПредставление Из ХешиПредставлений Цикл + Выборка.Сбросить(); + ПараметрыПоиска = Новый Структура("ХешПредставления", ЭлементПредставление.Значение); + Если Выборка.НайтиСледующий(ПараметрыПоиска) Тогда + СтруктураСклонения = СклонениеПредставленийОбъектовКлиентСервер.СтруктураСклонения(); + ЗаполнитьЗначенияСвойств(СтруктураСклонения, Выборка); + СклоненияПредставлений.Вставить(ЭлементПредставление.Представление, СтруктураСклонения); + КонецЕсли; + КонецЦикла; + + Возврат СклоненияПредставлений; + +КонецФункции + Функция СоответствиеПадежей() СоответствиеПадежей = Новый Соответствие; @@ -926,12 +975,14 @@ ДанныеПечати.Колонки.Добавить("Дательный"); ДанныеПечати.Колонки.Добавить("Винительный"); ДанныеПечати.Колонки.Добавить("Творительный"); - ДанныеПечати.Колонки.Добавить("Предложный"); - + ДанныеПечати.Колонки.Добавить("Предложный"); + + СклоненияСтрок = ПросклонятьПредставленияПоВсемПадежам(Объекты); + Для Каждого Объект Из Объекты Цикл НоваяСтрока = ДанныеПечати.Добавить(); НоваяСтрока.Ссылка = Объект; - СклоненияСтроки = ПросклонятьПредставлениеПоВсемПадежам(Объект); + СклоненияСтроки = СклоненияСтрок.Получить(Объект); ЗаполнитьЗначенияСвойств(НоваяСтрока, СклоненияСтроки); КонецЦикла; diff --git a/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиент/Module.bsl b/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиент/Module.bsl index 429d634f9..71e46999f 100644 --- a/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиент/Module.bsl +++ b/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиент/Module.bsl @@ -113,6 +113,16 @@ #КонецОбласти +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ПоказатьНастройкиДоступаКСервисуMorpher() Экспорт + + ОткрытьФорму("ОбщаяФорма.НастройкаДоступаКСервисуMorpher"); + +КонецПроцедуры + +#КонецОбласти + #Область СлужебныеПроцедурыИФункции // Завершение процедуры ОбработатьКомандуСклонения. diff --git a/SSL/src/CommonModules/СоединенияИБ/Module.bsl b/SSL/src/CommonModules/СоединенияИБ/Module.bsl index cc2b57cdc..dd8dff160 100644 --- a/SSL/src/CommonModules/СоединенияИБ/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБ/Module.bsl @@ -32,8 +32,8 @@ // Булево - Истина, если блокировка установлена успешно. // Ложь, если для выполнения блокировки недостаточно прав. // -Функция УстановитьБлокировкуСоединений(Знач ТекстСообщения = "", Знач КодРазрешения = "КодРазрешения", - Знач ОжиданиеНачалаБлокировки = 0, Знач ДлительностьБлокировки = 0) Экспорт // АПК:142 расширен программный интерфейс с сохранением обратной совместимости. +Функция УстановитьБлокировкуСоединений(Знач ТекстСообщения = "", Знач КодРазрешения = "КодРазрешения", // АПК:142 Для сохранения обратной совместимости. + Знач ОжиданиеНачалаБлокировки = 0, Знач ДлительностьБлокировки = 0) Экспорт Если ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда @@ -724,7 +724,7 @@ КонецЕсли; ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры diff --git a/SSL/src/CommonModules/СоединенияИБВызовСервера/Module.bsl b/SSL/src/CommonModules/СоединенияИБВызовСервера/Module.bsl index dab7bf9f9..d4d822a00 100644 --- a/SSL/src/CommonModules/СоединенияИБВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБВызовСервера/Module.bsl @@ -36,8 +36,8 @@ // Булево - Истина, если блокировка установлена успешно. // Ложь, если для выполнения блокировки недостаточно прав. // -Функция УстановитьБлокировкуСоединений(ТекстСообщения = "", КодРазрешения = "КодРазрешения", - ОжиданиеНачалаБлокировки = 0, ДлительностьБлокировки = 0) Экспорт // АПК:142 расширен программный интерфейс с сохранением обратной совместимости. +Функция УстановитьБлокировкуСоединений(ТекстСообщения = "", КодРазрешения = "КодРазрешения", // АПК:142 Для сохранения обратной совместимости. + ОжиданиеНачалаБлокировки = 0, ДлительностьБлокировки = 0) Экспорт Возврат СоединенияИБ.УстановитьБлокировкуСоединений( ТекстСообщения, КодРазрешения, ОжиданиеНачалаБлокировки, ДлительностьБлокировки); diff --git a/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl b/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl index 4ca7d847a..1616de4e8 100644 --- a/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl @@ -122,20 +122,13 @@ // См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы. Процедура ПослеНачалаРаботыСистемы() Экспорт - Если Не ПодсистемаИспользуется() Тогда + Если Не ПодсистемаИспользуется() + Или Не ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() + Или ПолучитьСкоростьКлиентскогоСоединения() <> СкоростьКлиентскогоСоединения.Обычная Тогда Возврат; КонецЕсли; - ПараметрыРаботы = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); - Если НЕ ПараметрыРаботы.ДоступноИспользованиеРазделенныхДанных Тогда - Возврат; - КонецЕсли; - - Если ПолучитьСкоростьКлиентскогоСоединения() <> СкоростьКлиентскогоСоединения.Обычная Тогда - Возврат; - КонецЕсли; - - РежимБлокировки = ПараметрыРаботы.ПараметрыБлокировкиСеансов; + РежимБлокировки = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске().ПараметрыБлокировкиСеансов; ТекущееВремя = РежимБлокировки.ТекущаяДатаСеанса; Если РежимБлокировки.Установлена И (НЕ ЗначениеЗаполнено(РежимБлокировки.Начало) ИЛИ ТекущееВремя >= РежимБлокировки.Начало) @@ -298,7 +291,7 @@ Функция ПодсистемаИспользуется() // См. также функцию СоединенияИБ.ПодсистемаИспользуется - Возврат Не СтандартныеПодсистемыКлиент.ПараметрКлиента("РазделениеВключено"); + Возврат Не ОбщегоНазначенияКлиент.РазделениеВключено(); КонецФункции @@ -395,7 +388,7 @@ |%3'"); ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, ДатаВремениНачалаБлокировки, ВремяВремениНачалаБлокировки, ТекстСообщения); - РазделениеВключено = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено; + РазделениеВключено = ОбщегоНазначенияКлиент.РазделениеВключено(); Если Не РазделениеВключено И (Не ЗначениеЗаполнено(ВремяНачалаБлокировки) Или ВремяНачалаБлокировки - ТекущийМомент < ИнтервалПрекратить) Тогда @@ -458,7 +451,7 @@ КонецЕсли; // Если информационная база файловая, то часть соединений не может быть завершена принудительно. - Если СтандартныеПодсистемыКлиент.ПараметрКлиента("ИнформационнаяБазаФайловая") Тогда + Если ОбщегоНазначенияКлиент.ИнформационнаяБазаФайловая() Тогда Оповестить("ЗавершениеРаботыПользователей", Новый Структура("Статус, КоличествоСеансов", "Обновление", КоличествоСеансов)); Возврат; @@ -482,7 +475,7 @@ НСтр("ru = 'Завершение сеансов не выполнено. Подробности см. в Журнале регистрации.'"), БиблиотекаКартинок.Предупреждение32); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), - "Ошибка", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + "Ошибка", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); Оповестить("ЗавершениеРаботыПользователей", Новый Структура("Статус,КоличествоСеансов", "Ошибка", КоличествоСеансов)); Возврат; @@ -750,8 +743,7 @@ // Функция ОбработатьПараметрыЗапуска(Знач ПараметрыЗапуска) - ПараметрыРаботы = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); - Если НЕ ПараметрыРаботы.ДоступноИспользованиеРазделенныхДанных Тогда + Если Не ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат Ложь; КонецЕсли; diff --git a/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеИнтерфейс/Module.bsl b/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеИнтерфейс/Module.bsl index 725273267..211a469a5 100644 --- a/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеИнтерфейс/Module.bsl +++ b/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеИнтерфейс/Module.bsl @@ -15,7 +15,7 @@ // Функция Пакет() Экспорт - Возврат "http://www.1c.ru/SaaS/ExchangeAdministration/Manage"; + Возврат "http://www.1c.ru/SaaS/ExchangeAdministration/Manage/" + Версия(); КонецФункции @@ -26,7 +26,7 @@ // Функция Версия() Экспорт - Возврат "2.1.2.1"; + Возврат "3.0.1.1"; КонецФункции @@ -49,6 +49,7 @@ Процедура ОбработчикиКаналовСообщений(Знач МассивОбработчиков) Экспорт МассивОбработчиков.Добавить(СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_2_1_2_1); + МассивОбработчиков.Добавить(СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1); КонецПроцедуры @@ -59,6 +60,8 @@ // Процедура ОбработчикиТрансляцииСообщений(Знач МассивОбработчиков) Экспорт + МассивОбработчиков.Добавить(СообщенияАдминистрированиеОбменаДаннымиУправлениеТрансляция_2_1_2_1); + КонецПроцедуры // Возвращает тип сообщения {http://www.1c.ru/SaaS/ExchangeAdministration/Manage/a.b.c.d}ConnectCorrespondent @@ -196,6 +199,21 @@ КонецФункции +// Возвращает тип сообщения {http://www.1c.ru/SaaS/ExchangeAdministration/Manage/a.b.c.d}DisableSyncInSM +// +// Параметры: +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой +// получается тип сообщения. +// +// Возвращаемое значение: +// ТипXDTO +// +Функция СообщениеОтключитьСинхронизациюЧерезМС(Знач ИспользуемыйПакет = Неопределено) Экспорт + + Возврат СоздатьТипСообщения(ИспользуемыйПакет, "DisableSyncInSM"); + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции diff --git a/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1/Module.bsl b/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1/Module.bsl new file mode 100644 index 000000000..97e4149c1 --- /dev/null +++ b/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1/Module.bsl @@ -0,0 +1,343 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +// Пространство имен версии интерфейса сообщений. +// +// Возвращаемое значение: +// Строка - пространство имен. +// +Функция Пакет() Экспорт + + Возврат "http://www.1c.ru/SaaS/ExchangeAdministration/Manage/" + Версия(); + +КонецФункции + +// Версия интерфейса сообщений, обслуживаемая обработчиком. +// +// Возвращаемое значение: +// Строка - версия интерфейса сообщений. +// +Функция Версия() Экспорт + + Возврат "3.0.1.1"; + +КонецФункции + +// Базовый тип для сообщений версии. +// +// Возвращаемое значение: +// ТипОбъектаXDTO - базовый тип тела сообщения. +// +Функция БазовыйТип() Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса") Тогда + ВызватьИсключение НСтр("ru = 'Отсутствует менеджер сервиса.'"); + КонецЕсли; + + МодульСообщенияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервиса"); + + Возврат МодульСообщенияВМоделиСервиса.ТипТело(); + +КонецФункции + +// Выполняет обработку входящих сообщений модели сервиса +// +// Параметры: +// Сообщение - ОбъектXDTO - входящее сообщение. +// Отправитель - ПланОбменаСсылка.ОбменСообщениями - узел плана обмена, соответствующий отправителю сообщения. +// СообщениеОбработано - Булево - флаг успешной обработки сообщения. Значение данного параметра необходимо +// установить равным Истина в том случае, если сообщение было успешно прочитано в данном обработчике. +// +Процедура ОбработатьСообщениеМоделиСервиса(Знач Сообщение, Знач Отправитель, СообщениеОбработано) Экспорт + + СообщениеОбработано = Истина; + + Словарь = СообщенияАдминистрированиеОбменаДаннымиУправлениеИнтерфейс; + ТипСообщения = Сообщение.Body.Тип(); + + Если ТипСообщения = Словарь.СообщениеПодключитьКорреспондента(Пакет()) Тогда + ПодключитьКорреспондента(Сообщение, Отправитель); + ИначеЕсли ТипСообщения = Словарь.СообщениеУстановитьНастройкиТранспорта(Пакет()) Тогда + УстановитьНастройкиТранспорта(Сообщение, Отправитель); + ИначеЕсли ТипСообщения = Словарь.СообщениеУдалитьНастройкуСинхронизации(Пакет()) Тогда + УдалитьНастройкуСинхронизации(Сообщение, Отправитель); + ИначеЕсли ТипСообщения = Словарь.СообщениеВыполнитьСинхронизацию(Пакет()) Тогда + ВыполнитьСинхронизацию(Сообщение, Отправитель); + Иначе + СообщениеОбработано = Ложь; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ПодключитьКорреспондента(Сообщение, Отправитель) + + Если Не ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса") Тогда + Возврат; + КонецЕсли; + + ИмяПланаОбменаСообщениями = "ОбменСообщениями"; + МодульОбменСообщениями = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениями"); + МодульСообщенияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервиса"); + МенеджерПланаОбменСообщениями = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени("ПланОбмена." + + ИмяПланаОбменаСообщениями); + + ЭтотУзелОбменаСообщениями = МенеджерПланаОбменСообщениями.ЭтотУзел(); + + Тело = Сообщение.Body; + + // Проверяем эту конечную точку. + ЭтаКонечнаяТочка = ОбменДаннымиВМоделиСервиса.МенеджерПланаОбменаКонечныхТочек().НайтиПоКоду(Тело.SenderId); + + Если ЭтаКонечнаяТочка.Пустая() + ИЛИ ЭтаКонечнаяТочка <> ЭтотУзелОбменаСообщениями Тогда + + // Отправляем сообщение в менеджер сервиса об ошибке. + ПредставлениеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Конечная точка не соответствует ожидаемой. Код ожидаемой конечной точки %1. Код текущей конечной точки %2.'"), + Тело.SenderId, + ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЭтотУзелОбменаСообщениями, "Код")); + + ОтправитьОтветноеСообщениеОбОшибкеПодключения(Сообщение, Отправитель, ПредставлениеОшибки); + Возврат; + + КонецЕсли; + + // Проверяем то, что корреспондент уже был подключен ранее. + Корреспондент = ОбменДаннымиВМоделиСервиса.МенеджерПланаОбменаКонечныхТочек().НайтиПоКоду(Тело.RecipientId); + + Если Корреспондент.Пустая() Тогда // Подключаем конечную точку корреспондента. + + Отказ = Ложь; + ПодключенныйКорреспондент = Неопределено; + + НастройкиПодключенияОтправителя = ОбменДаннымиСервер.СтруктураПараметровWS(); + НастройкиПодключенияОтправителя.WSURLВебСервиса = Тело.RecipientURL; + НастройкиПодключенияОтправителя.WSИмяПользователя = Тело.RecipientUser; + НастройкиПодключенияОтправителя.WSПароль = Тело.RecipientPassword; + + НастройкиПодключенияПолучателя = ОбменДаннымиСервер.СтруктураПараметровWS(); + НастройкиПодключенияПолучателя.WSURLВебСервиса = Тело.SenderURL; + НастройкиПодключенияПолучателя.WSИмяПользователя = Тело.SenderUser; + НастройкиПодключенияПолучателя.WSПароль = Тело.SenderPassword; + + МодульОбменСообщениями.ПодключитьКонечнуюТочку( + Отказ, + НастройкиПодключенияОтправителя, + НастройкиПодключенияПолучателя, + ПодключенныйКорреспондент, + Тело.RecipientName, + Тело.SenderName); + + Если Отказ Тогда // Отправляем сообщение в менеджер сервиса об ошибке. + + ПредставлениеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка подключения конечной точки корреспондента обмена. Код конечной точки корреспондента обмена %1.'"), + Тело.RecipientId); + + ОтправитьОтветноеСообщениеОбОшибкеПодключения(Сообщение, Отправитель, ПредставлениеОшибки); + Возврат; + + КонецЕсли; + + ПодключенныйКорреспондентКод = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПодключенныйКорреспондент, "Код"); + + Если ПодключенныйКорреспондентКод <> Тело.RecipientId Тогда + + // Подключили не того корреспондента обмена. + // Отправляем сообщение в менеджер сервиса об ошибке. + ПредставлениеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при подключении конечной точки корреспондента обмена. + |Настройки подключения веб-сервиса не соответствуют ожидаемым. + |Код ожидаемой конечной точки корреспондента обмена %1. + |Код подключенной конечной точки корреспондента обмена %2.'"), + Тело.RecipientId, + ПодключенныйКорреспондентКод); + + ОтправитьОтветноеСообщениеОбОшибкеПодключения(Сообщение, Отправитель, ПредставлениеОшибки); + Возврат; + + КонецЕсли; + + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(ОбщегоНазначения.ИмяТаблицыПоСсылке(ПодключенныйКорреспондент)); + ЭлементБлокировки.УстановитьЗначение("Ссылка", ПодключенныйКорреспондент); + Блокировка.Заблокировать(); + + ЗаблокироватьДанныеДляРедактирования(ПодключенныйКорреспондент); + КорреспондентОбъект = ПодключенныйКорреспондент.ПолучитьОбъект(); // ПланОбменаОбъект.ОбменСообщениями + + КорреспондентОбъект.Заблокирована = Истина; + + КорреспондентОбъект.Записать(); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + Иначе // Обновляем настройки подключения этой конечной точки и корреспондента. + + Отказ = Ложь; + + НастройкиПодключенияОтправителя = ОбменДаннымиСервер.СтруктураПараметровWS(); + НастройкиПодключенияОтправителя.WSURLВебСервиса = Тело.RecipientURL; + НастройкиПодключенияОтправителя.WSИмяПользователя = Тело.RecipientUser; + НастройкиПодключенияОтправителя.WSПароль = Тело.RecipientPassword; + + НастройкиПодключенияПолучателя = ОбменДаннымиСервер.СтруктураПараметровWS(); + НастройкиПодключенияПолучателя.WSURLВебСервиса = Тело.SenderURL; + НастройкиПодключенияПолучателя.WSИмяПользователя = Тело.SenderUser; + НастройкиПодключенияПолучателя.WSПароль = Тело.SenderPassword; + + МодульОбменСообщениями.ОбновитьНастройкиПодключенияКонечнойТочки( + Отказ, + Корреспондент, + НастройкиПодключенияОтправителя, + НастройкиПодключенияПолучателя); + + Если Отказ Тогда // Отправляем сообщение в менеджер сервиса об ошибке. + + ПредставлениеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка обновления параметров подключения этой конечной точки и конечной точки корреспондента обмена. + |Код этой конечной токи %1 + |Код конечной точки корреспондента обмена %2'"), + ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЭтотУзелОбменаСообщениями, "Код"), + Тело.RecipientId); + + ОтправитьОтветноеСообщениеОбОшибкеПодключения(Сообщение, Отправитель, ПредставлениеОшибки); + Возврат; + + КонецЕсли; + + КорреспондентОбъект = Корреспондент.ПолучитьОбъект(); + КорреспондентОбъект.Заблокирована = Истина; + КорреспондентОбъект.Записать(); + + КонецЕсли; + + // Отправляем сообщение в менеджер сервиса об успешном выполнении операции. + НачатьТранзакцию(); + Попытка + ОтветноеСообщение = МодульСообщенияВМоделиСервиса.НовоеСообщение( + СообщенияАдминистрированиеОбменаДаннымиКонтрольИнтерфейс.СообщениеКорреспондентУспешноПодключен()); + ОтветноеСообщение.Body.RecipientId = Тело.RecipientId; + ОтветноеСообщение.Body.SenderId = Тело.SenderId; + МодульСообщенияВМоделиСервиса.ОтправитьСообщение(ОтветноеСообщение, Отправитель); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +Процедура УстановитьНастройкиТранспорта(Сообщение, Отправитель) + + Тело = Сообщение.Body; + + Корреспондент = ОбменДаннымиВМоделиСервиса.МенеджерПланаОбменаКонечныхТочек().НайтиПоКоду(Тело.RecipientId); + + Если Корреспондент.Пустая() Тогда + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не найдена конечная точка корреспондента с кодом ""%1"".'"), + Тело.RecipientId); + ВызватьИсключение СтрокаСообщения; + КонецЕсли; + + ОбменДаннымиСервер.УстановитьКоличествоЭлементовВТранзакцииЗагрузкиДанных(Тело.ImportTransactionQuantity); + + СтруктураЗаписи = Новый Структура; + СтруктураЗаписи.Вставить("КонечнаяТочкаКорреспондента", Корреспондент); + + СтруктураЗаписи.Вставить("FILEКаталогОбменаИнформацией", Тело.FILE_ExchangeFolder); + СтруктураЗаписи.Вставить("FILEСжиматьФайлИсходящегоСообщения", Тело.FILE_CompressExchangeMessage); + + СтруктураЗаписи.Вставить("FTPСжиматьФайлИсходящегоСообщения", Тело.FTP_CompressExchangeMessage); + СтруктураЗаписи.Вставить("FTPСоединениеМаксимальныйДопустимыйРазмерСообщения", Тело.FTP_MaxExchangeMessageSize); + СтруктураЗаписи.Вставить("FTPСоединениеПассивноеСоединение", Тело.FTP_PassiveMode); + СтруктураЗаписи.Вставить("FTPСоединениеПользователь", Тело.FTP_User); + СтруктураЗаписи.Вставить("FTPСоединениеПорт", Тело.FTP_Port); + СтруктураЗаписи.Вставить("FTPСоединениеПуть", Тело.FTP_ExchangeFolder); + + СтруктураЗаписи.Вставить("ВидТранспортаСообщенийОбменаПоУмолчанию", Перечисления.ВидыТранспортаСообщенийОбмена[Тело.ExchangeTransport]); + + + УстановитьПривилегированныйРежим(Истина); + ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(Корреспондент, Тело.FTP_Password, "FTPСоединениеПарольОбластейДанных"); + ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(Корреспондент, Тело.ExchangeMessagePassword, "ПарольАрхиваСообщенияОбменаОбластейДанных"); + УстановитьПривилегированныйРежим(Ложь); + + РегистрыСведений.НастройкиТранспортаОбменаОбластейДанных.ОбновитьЗапись(СтруктураЗаписи); + +КонецПроцедуры + +Процедура УдалитьНастройкуСинхронизации(Сообщение, Отправитель) + + Тело = Сообщение.Body; + ОбменДаннымиВМоделиСервиса.УдалитьНастройкуСинхронизации(Тело.ExchangePlan, Формат(Тело.CorrespondentZone, "ЧЦ=7; ЧВН=; ЧГ=0")); + +КонецПроцедуры + +Процедура ВыполнитьСинхронизацию(Сообщение, Отправитель) + + СценарийОбменаДанными = СериализаторXDTO.ПрочитатьXDTO(Сообщение.Body.Scenario); + + ОбменДаннымиВМоделиСервиса.ВыполнитьОбменДанными(СценарийОбменаДанными); + +КонецПроцедуры + +Функция СобытиеЖурналаРегистрацииПодключениеКорреспондента() + + Возврат НСтр("ru = 'Обмен данными.Подключение корреспондента обмена'", ОбщегоНазначения.КодОсновногоЯзыка()); + +КонецФункции + +Процедура ОтправитьОтветноеСообщениеОбОшибкеПодключения(Сообщение, Отправитель, ПредставлениеОшибки) + + НомерПопытки = Неопределено; + Если Сообщение.Установлено("AdditionalInfo") Тогда + ДополнительныеСвойства = СериализаторXDTO.ПрочитатьXDTO(Сообщение.AdditionalInfo); + ДополнительныеСвойства.Свойство("НомерПопытки", НомерПопытки); + КонецЕсли; + + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииПодключениеКорреспондента(), + УровеньЖурналаРегистрации.Ошибка,,, ПредставлениеОшибки); + + МодульСообщенияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервиса"); + + ОтветноеСообщение = МодульСообщенияВМоделиСервиса.НовоеСообщение( + СообщенияАдминистрированиеОбменаДаннымиКонтрольИнтерфейс.СообщениеОшибкаПодключенияКорреспондента()); + + ДополнительныеСвойства = Новый Структура; + ДополнительныеСвойства.Вставить("НомерПопытки", НомерПопытки); + ОтветноеСообщение.AdditionalInfo = СериализаторXDTO.ЗаписатьXDTO(ДополнительныеСвойства); + ОтветноеСообщение.Body.RecipientId = Сообщение.Body.RecipientId; + ОтветноеСообщение.Body.SenderId = Сообщение.Body.SenderId; + ОтветноеСообщение.Body.ErrorDescription = ПредставлениеОшибки; + + НачатьТранзакцию(); + Попытка + МодульСообщенияВМоделиСервиса.ОтправитьСообщение(ОтветноеСообщение, Отправитель); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1/СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1.mdo b/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1/СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1.mdo new file mode 100644 index 000000000..ee4815633 --- /dev/null +++ b/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1/СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="8568b969-4d05-42ab-b30a-c937619c7c93"> + <name>СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1</name> + <synonym> + <key>ru</key> + <value>Сообщения администрирование обмена данными управление обработчик сообщения 3 0 1 1</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеТрансляция_2_1_2_1/Module.bsl b/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеТрансляция_2_1_2_1/Module.bsl new file mode 100644 index 000000000..b53c8b5ba --- /dev/null +++ b/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеТрансляция_2_1_2_1/Module.bsl @@ -0,0 +1,86 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +// Возвращает номер версии, для трансляции с которой предназначен обработчик. +// +// Возвращаемое значение: +// Строка +// +Функция ИсходнаяВерсия() Экспорт + + Возврат "3.0.1.1"; + +КонецФункции + +// Возвращает пространство имен версии, для трансляции с которой предназначен обработчик. +// +// Возвращаемое значение: +// Строка +// +Функция ПакетИсходнойВерсии() Экспорт + + Возврат "http://www.1c.ru/SaaS/ExchangeAdministration/Manage/" + ИсходнаяВерсия(); + +КонецФункции + +// Возвращает номер версии, для трансляции в которую предназначен обработчик. +// +// Возвращаемое значение: +// Строка +// +Функция РезультирующаяВерсия() Экспорт + + Возврат "2.1.2.1"; + +КонецФункции + +// Возвращает пространство имен версии, для трансляции в которую предназначен обработчик. +// +// Возвращаемое значение: +// Строка +// +Функция ПакетРезультирующейВерсии() Экспорт + + Возврат "http://www.1c.ru/SaaS/ExchangeAdministration/Manage"; + +КонецФункции + +// Обработчик проверки выполнения стандартной обработки трансляции +// +// Параметры: +// ИсходноеСообщение - ОбъектXDTO - транслируемое сообщение, +// СтандартнаяОбработка - Булево - для отмены выполнения стандартной обработки трансляции +// этому параметру внутри данной процедуры необходимо установить значение Ложь. +// При этом вместо выполнения стандартной обработки трансляции будет вызвана функция +// ТрансляцияСообщения() обработчика трансляции. +// +Процедура ПередТрансляцией(Знач ИсходноеСообщение, СтандартнаяОбработка) Экспорт + +КонецПроцедуры + +// Обработчик выполнения произвольной трансляции сообщения. Вызывается только в том случае, +// если при выполнении процедуры ПередТрансляцией значению параметра СтандартнаяОбработка +// было установлено значение Ложь. +// +// Параметры: +// ИсходноеСообщение - ОбъектXDTO - транслируемое сообщение. +// +// Возвращаемое значение: +// ОбъектXDTO - результат произвольной трансляции сообщения. +// +Функция ТрансляцияСообщения(Знач ИсходноеСообщение) Экспорт + +КонецФункции + +#КонецОбласти + + + + diff --git a/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеТрансляция_2_1_2_1/СообщенияАдминистрированиеОбменаДаннымиУправлениеТрансляция_2_1_2_1.mdo b/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеТрансляция_2_1_2_1/СообщенияАдминистрированиеОбменаДаннымиУправлениеТрансляция_2_1_2_1.mdo new file mode 100644 index 000000000..5bf385284 --- /dev/null +++ b/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеТрансляция_2_1_2_1/СообщенияАдминистрированиеОбменаДаннымиУправлениеТрансляция_2_1_2_1.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="1afea577-b99e-41de-b613-47dd0b480a91"> + <name>СообщенияАдминистрированиеОбменаДаннымиУправлениеТрансляция_2_1_2_1</name> + <synonym> + <key>ru</key> + <value>Сообщения контроль удаленного администрирования обработчик трансляции 1.0.0.1</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/СообщенияКонтрольДополнительныхОтчетовИОбработокИнтерфейс/Module.bsl b/SSL/src/CommonModules/СообщенияКонтрольДополнительныхОтчетовИОбработокИнтерфейс/Module.bsl index b885c737f..9391966c8 100644 --- a/SSL/src/CommonModules/СообщенияКонтрольДополнительныхОтчетовИОбработокИнтерфейс/Module.bsl +++ b/SSL/src/CommonModules/СообщенияКонтрольДополнительныхОтчетовИОбработокИнтерфейс/Module.bsl @@ -6,6 +6,25 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// Возвращает текущую (используемую вызывающим кодом) версию интерфейса сообщений. +// +// Возвращаемое значение: +// Строка +// +Функция Версия() Экспорт + + Возврат "1.0.1.1"; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + #Область СлужебныеПроцедурыИФункции // Возвращает пространство имен текущей (используемой вызывающим кодом) версии интерфейса сообщений. @@ -19,17 +38,6 @@ КонецФункции -// Возвращает текущую (используемую вызывающим кодом) версию интерфейса сообщений. -// -// Возвращаемое значение: -// Строка -// -Функция Версия() Экспорт - - Возврат "1.0.1.1"; - -КонецФункции - // Возвращает название программного интерфейса сообщений. // // Возвращаемое значение: diff --git a/SSL/src/CommonModules/СообщенияОбменаДаннымиОбработчикСообщения/Module.bsl b/SSL/src/CommonModules/СообщенияОбменаДаннымиОбработчикСообщения/Module.bsl index 8ecae97ae..794b1b5d5 100644 --- a/SSL/src/CommonModules/СообщенияОбменаДаннымиОбработчикСообщения/Module.bsl +++ b/SSL/src/CommonModules/СообщенияОбменаДаннымиОбработчикСообщения/Module.bsl @@ -81,10 +81,10 @@ Исключение // Отмечаем в управляющем приложении ошибку выполнения операции - ОтправитьСообщениеОшибкаПриСозданииОбмена(Число(КодЭтогоУзла), Число(КодНовогоУзла), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Отправитель); + ОтправитьСообщениеОшибкаПриСозданииОбмена(Число(КодЭтогоУзла), Число(КодНовогоУзла), ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Отправитель); ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат; КонецПопытки; КонецЕсли; @@ -143,10 +143,10 @@ ОтменитьТранзакцию(); // Отмечаем в управляющем приложении ошибку выполнения операции - ОтправитьСообщениеОшибкаПриСозданииОбмена(Число(КодЭтогоУзла), Число(КодНовогоУзла), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Отправитель); + ОтправитьСообщениеОшибкаПриСозданииОбмена(Число(КодЭтогоУзла), Число(КодНовогоУзла), ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Отправитель); ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат; КонецПопытки; @@ -226,7 +226,7 @@ Исключение ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОтправкаСообщений(), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -251,7 +251,7 @@ Исключение ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОтправкаСообщений(), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; diff --git a/SSL/src/CommonModules/СообщенияОбменаДаннымиУправлениеОбработчикСообщения_2_1_2_1/Module.bsl b/SSL/src/CommonModules/СообщенияОбменаДаннымиУправлениеОбработчикСообщения_2_1_2_1/Module.bsl index f50913157..6cd90d1af 100644 --- a/SSL/src/CommonModules/СообщенияОбменаДаннымиУправлениеОбработчикСообщения_2_1_2_1/Module.bsl +++ b/SSL/src/CommonModules/СообщенияОбменаДаннымиУправлениеОбработчикСообщения_2_1_2_1/Module.bsl @@ -207,7 +207,7 @@ ОбменДаннымиВМоделиСервиса.УдалитьУзелПланаОбмена(Корреспондент); - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка,,, ПредставлениеОшибки); @@ -266,7 +266,7 @@ Исключение ОтменитьТранзакцию(); - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка,,, ПредставлениеОшибки); @@ -332,7 +332,7 @@ Исключение - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка,,, ПредставлениеОшибки); @@ -393,7 +393,7 @@ Исключение ОтменитьТранзакцию(); - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка,,, ПредставлениеОшибки); @@ -455,7 +455,7 @@ Исключение ОтменитьТранзакцию(); - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка,,, ПредставлениеОшибки); @@ -530,7 +530,7 @@ Исключение ОтменитьТранзакцию(); - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка,,, ПредставлениеОшибки); diff --git a/SSL/src/CommonModules/СообщенияОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1/Module.bsl b/SSL/src/CommonModules/СообщенияОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1/Module.bsl index 70bb028e8..dd46fe959 100644 --- a/SSL/src/CommonModules/СообщенияОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1/Module.bsl +++ b/SSL/src/CommonModules/СообщенияОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1/Module.bsl @@ -194,7 +194,7 @@ Исключение ОтменитьТранзакцию(); - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка, , , ПредставлениеОшибки); @@ -265,7 +265,7 @@ ОтветноеСообщение.Body.CorrespondentZone = Тело.CorrespondentZone; ОтветноеСообщение.Body.SessionId = Тело.SessionId; Исключение - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка, , , ПредставлениеОшибки); @@ -326,7 +326,7 @@ Исключение ОтменитьТранзакцию(); - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка,,, ПредставлениеОшибки); @@ -385,7 +385,7 @@ Исключение ОтменитьТранзакцию(); - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка,,, ПредставлениеОшибки); @@ -451,7 +451,7 @@ Исключение ОтменитьТранзакцию(); - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка,,, ПредставлениеОшибки); diff --git a/SSL/src/CommonModules/СообщенияУправленияДОИООбработчикСообщения_1_0_1_1/Module.bsl b/SSL/src/CommonModules/СообщенияУправленияДОИООбработчикСообщения_1_0_1_1/Module.bsl index b0fa92c1c..aafd9139c 100644 --- a/SSL/src/CommonModules/СообщенияУправленияДОИООбработчикСообщения_1_0_1_1/Module.bsl +++ b/SSL/src/CommonModules/СообщенияУправленияДОИООбработчикСообщения_1_0_1_1/Module.bsl @@ -142,7 +142,7 @@ Исключение - ТекстИсключения = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстИсключения = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПоставляемаяОбработка = Справочники.ПоставляемыеДополнительныеОтчетыИОбработки.ПолучитьСсылку(ТелоСообщения.Extension); ДополнительныеОтчетыИОбработкиВМоделиСервиса.ОбработатьОшибкуУстановкиДополнительнойОбработкиВОбластьДанных( ПоставляемаяОбработка, ТелоСообщения.Installation, ТекстИсключения); diff --git a/SSL/src/CommonModules/СообщенияУправленияДОИООбработчикСообщения_1_0_1_2/Module.bsl b/SSL/src/CommonModules/СообщенияУправленияДОИООбработчикСообщения_1_0_1_2/Module.bsl index bb00d4541..a4eeda3ef 100644 --- a/SSL/src/CommonModules/СообщенияУправленияДОИООбработчикСообщения_1_0_1_2/Module.bsl +++ b/SSL/src/CommonModules/СообщенияУправленияДОИООбработчикСообщения_1_0_1_2/Module.bsl @@ -141,7 +141,7 @@ НастройкиНазначения, НастройкиВариантов, ТелоСообщения.InitiatorServiceID); Исключение - ТекстИсключения = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстИсключения = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПоставляемаяОбработка = Справочники.ПоставляемыеДополнительныеОтчетыИОбработки.ПолучитьСсылку(ТелоСообщения.Extension); ДополнительныеОтчетыИОбработкиВМоделиСервиса.ОбработатьОшибкуУстановкиДополнительнойОбработкиВОбластьДанных( ПоставляемаяОбработка, ТелоСообщения.Installation, ТекстИсключения); diff --git a/SSL/src/CommonModules/СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация/Module.bsl b/SSL/src/CommonModules/СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация/Module.bsl index f1827788a..f5fe0f978 100644 --- a/SSL/src/CommonModules/СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация/Module.bsl +++ b/SSL/src/CommonModules/СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация/Module.bsl @@ -53,50 +53,43 @@ Задания.Колонки.Добавить("РегламентноеЗаданиеРасписание", Новый ОписаниеТипов("СписокЗначений")); Задания.Колонки.Добавить("РегламентноеЗаданиеИспользование", Новый ОписаниеТипов("Булево")); + ИдентификаторыПользователей = Новый Массив; Для Каждого НастройкаКоманды Из НастройкиКоманд Цикл - Если ЗначениеЗаполнено(НастройкаКоманды.БыстрыйДоступ) Тогда - Для Каждого ИдентификаторПользователя Из НастройкаКоманды.БыстрыйДоступ Цикл - - ТекстЗапроса = "ВЫБРАТЬ - | Пользователи.Ссылка - |ИЗ - | Справочник.Пользователи КАК Пользователи - |ГДЕ - | Пользователи.ИдентификаторПользователяСервиса = &ИдентификаторПользователяСервиса"; - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("ИдентификаторПользователяСервиса", ИдентификаторПользователя); - Результат = Запрос.Выполнить(); - Если Результат.Пустой() Тогда - - Продолжить; - - Иначе - - Выборка = Результат.Выбрать(); - Выборка.Следующий(); - ЭлементБыстрогоДоступа = БыстрыйДоступ.Добавить(); - ЭлементБыстрогоДоступа.ИдентификаторКоманды = НастройкаКоманды.Идентификатор; - ЭлементБыстрогоДоступа.Пользователь = Выборка.Ссылка; - - КонецЕсли; - + ИдентификаторыПользователей.Добавить(ИдентификаторПользователя); + КонецЦикла; + КонецЕсли; + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ИдентификаторыПользователейСервиса", ИдентификаторыПользователей); + Запрос.Текст = + "ВЫБРАТЬ + | Пользователи.Ссылка + |ИЗ + | Справочник.Пользователи КАК Пользователи + |ГДЕ + | Пользователи.ИдентификаторПользователяСервиса В (&ИдентификаторыПользователейСервиса)"; + ПользователиБыстрогоДоступа = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + + Для Каждого НастройкаКоманды Из НастройкиКоманд Цикл + Если ЗначениеЗаполнено(НастройкаКоманды.БыстрыйДоступ) Тогда + Для Каждого Пользователь Из ПользователиБыстрогоДоступа Цикл + ЭлементБыстрогоДоступа = БыстрыйДоступ.Добавить(); + ЭлементБыстрогоДоступа.ИдентификаторКоманды = НастройкаКоманды.Идентификатор; + ЭлементБыстрогоДоступа.Пользователь = Пользователь; КонецЦикла; - КонецЕсли; Если НастройкаКоманды.Расписание <> Неопределено Тогда - Задание = Задания.Добавить(); Задание.Идентификатор = НастройкаКоманды.Идентификатор; РегламентноеЗаданиеРасписание = Новый СписокЗначений(); РегламентноеЗаданиеРасписание.Добавить(НастройкаКоманды.Расписание); Задание.РегламентноеЗаданиеРасписание= РегламентноеЗаданиеРасписание; Задание.РегламентноеЗаданиеИспользование = Истина; - КонецЕсли; - КонецЦикла; ДополнительныеОтчетыИОбработкиВМоделиСервиса.УстановитьПоставляемуюОбработкуВОбластьДанных( diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl index 57fe7630c..c80928e26 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl @@ -97,6 +97,16 @@ КонецФункции +// См. РегистрыСведений.СведенияОПользователях.ОбработатьОтветПроОтключениеOpenIDConnect +Процедура ОбработатьОтветПроОтключениеOpenIDConnect(Отключить) Экспорт + + // АПК:277-выкл Используется модуль СтандартныеПодсистемыВызовСервера, + // чтобы не создавать ПользователиВызовСервера из-за одной процедуры. + РегистрыСведений.СведенияОПользователях.ОбработатьОтветПроОтключениеOpenIDConnect(Отключить); + // АПК:277-вкл + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -127,15 +137,19 @@ Возврат ФиксированныеПараметрыКлиентаБезВременныхПараметров(Параметры); КонецЕсли; - ПользователиСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры, Неопределено, Ложь); + Если Параметры.ДоступноИспользованиеРазделенныхДанных Тогда + ПользователиСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры, Неопределено, Ложь); + КонецЕсли; ИнтеграцияПодсистемБСП.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); - ПрикладныеПараметры = Новый Структура; - ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(ПрикладныеПараметры); - Для Каждого Параметр Из ПрикладныеПараметры Цикл - Параметры.Вставить(Параметр.Ключ, Параметр.Значение); - КонецЦикла; + Если Параметры.ДоступноИспользованиеРазделенныхДанных Тогда + ПрикладныеПараметры = Новый Структура; + ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(ПрикладныеПараметры); + Для Каждого Параметр Из ПрикладныеПараметры Цикл + Параметры.Вставить(Параметр.Ключ, Параметр.Значение); + КонецЦикла; + КонецЕсли; Возврат ФиксированныеПараметрыКлиентаБезВременныхПараметров(Параметры); @@ -338,6 +352,7 @@ ПараметрыКлиента.Вставить("КаталогПрограммы", Параметры.КаталогПрограммы); ПараметрыКлиента.Вставить("ИдентификаторКлиента", Параметры.ИдентификаторКлиента); ПараметрыКлиента.Вставить("РазрешениеОсновногоЭкрана", Параметры.РазрешениеОсновногоЭкрана); + ПараметрыКлиента.Вставить("СистемнаяИнформация", Параметры.СистемнаяИнформация); ПараметрыСеанса.ПараметрыКлиентаНаСервере = Новый ФиксированноеСоответствие(ПараметрыКлиента); diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl index 807a64f2e..736a68883 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl @@ -42,6 +42,16 @@ ПользователиСлужебныйКлиент.ПоказатьПредупреждениеБезопасности(); КонецПроцедуры +// Вызывается после запуска конфигурации, открывает окно предупреждения безопасности. +Процедура ЗадатьВопросПроОтключениеOpenIDConnectОбработчикОжидания() Экспорт + + // АПК:277-выкл Используется модуль СтандартныеПодсистемыГлобальный, + // чтобы не создавать ПользователиГлобальный из-за одной процедуры. + ПользователиСлужебныйКлиент.ЗадатьВопросПроОтключениеOpenIDConnect(); + // АПК:277-вкл + +КонецПроцедуры + // Показывает сообщение пользователю о недостаточном объеме оперативной памяти. Процедура ПоказатьРекомендациюПоОбъемуОперативнойПамяти() Экспорт СтандартныеПодсистемыКлиент.ОповеститьОНехваткеПамяти(); diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl index 5f624f132..101d192bd 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl @@ -19,7 +19,7 @@ ПараметрыКлиента = ?(ПриЗапуске, ПараметрыРаботыКлиентаПриЗапуске(), ПараметрыРаботыКлиента()); - Если ПараметрыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда + Если ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда ПредставлениеЗаголовка = ПараметрыКлиента.ЗаголовокПриложения; ПредставлениеКонфигурации = ПараметрыКлиента.ПодробнаяИнформация; @@ -42,9 +42,8 @@ ЗаголовокПриложения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗаголовка, НСтр("ru = 'Не установлены разделители'"), ПараметрыКлиента.ПодробнаяИнформация); КонецЕсли; - Если ПараметрыКлиента.Свойство("РаботаСВнешнимиРесурсамиЗаблокирована") - И ПараметрыКлиента.Свойство("РазделениеВключено") - И Не ПараметрыКлиента.РазделениеВключено Тогда + Если Не ОбщегоНазначенияКлиент.РазделениеВключено() + И ПараметрыКлиента.Свойство("РаботаСВнешнимиРесурсамиЗаблокирована") Тогда ЗаголовокПриложения = "[" + НСтр("ru = 'КОПИЯ'") + "]" + " " + ЗаголовокПриложения; КонецЕсли; @@ -250,69 +249,30 @@ ВойтиВОбластьДанных(); - Параметры = ПараметрыОбработкиПередНачаломРаботыСистемы(); + ДействияПередНачаломРаботыСистемы(ОповещениеЗавершения); - // Внешние параметры описания результата. - Параметры.Вставить("Отказ", Ложь); - Параметры.Вставить("Перезапустить", Ложь); - Параметры.Вставить("ДополнительныеПараметрыКоманднойСтроки", ""); + Если Не ОтключенаЛогикаНачалаРаботыСистемы() + И Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.БазоваяФункциональностьБИП") Тогда + Возврат; + КонецЕсли; - // Внешние параметры управления выполнением. - Параметры.Вставить("ИнтерактивнаяОбработка", Неопределено); // ОписаниеОповещения. - Параметры.Вставить("ОбработкаПродолжения", Неопределено); // ОписаниеОповещения. - Параметры.Вставить("НепрерывноеВыполнение", Истина); - Параметры.Вставить("ПолученныеПараметрыКлиента", Новый Структура); - Параметры.Вставить("МодульПоследнейПроцедуры", ""); - Параметры.Вставить("ИмяПоследнейПроцедуры", ""); - УстановитьПоследнююПроцедуру(Параметры, "СтандартныеПодсистемыКлиент", "ПередНачаломРаботыСистемы"); - - // Внутренние параметры. - Параметры.Вставить("ОповещениеЗавершения", ОповещениеЗавершения); - Параметры.Вставить("ОбработкаЗавершения", Новый ОписаниеОповещения( - "ДействияПередНачаломРаботыСистемыОбработкаЗавершения", ЭтотОбъект)); - - ОбновитьПараметрыРаботыКлиента(Параметры, Истина, ОповещениеЗавершения <> Неопределено); - - // Подготовка перехода к следующей процедуре. - Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( - "ДействияПередНачаломРаботыСистемыВИнтеграционнойПроцедуре", ЭтотОбъект)); - - Если ОтключенаЛогикаНачалаРаботыСистемы() Тогда - Попытка - // Проверка права отключения и заполнение параметров работы клиента на сервере. - СвойстваКлиента = Новый Структура; - ЗаполнитьПараметрыРаботыКлиентаНаСервере(СвойстваКлиента); - СтандартныеПодсистемыВызовСервера.ПроверитьПравоОтключитьЛогикуНачалаРаботыСистемы(СвойстваКлиента); - Если СвойстваКлиента.Свойство("ОшибкаНетПраваОтключитьЛогикуНачалаРаботыСистемы") Тогда - ПользователиСлужебныйКлиент.УстановитьИнтерактивнуюОбработкуПриОшибкеНедостаточноПравДляВходаВПрограмму( - Параметры, СвойстваКлиента.ОшибкаНетПраваОтключитьЛогикуНачалаРаботыСистемы); - КонецЕсли; - Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - СтандартныеПодсистемыВызовСервера.ЗаписатьОшибкуВЖурналРегистрацииПриЗапускеИлиЗавершении( - Ложь, "Запуск", ТекстОшибки); - ПользователиСлужебныйКлиент.УстановитьИнтерактивнуюОбработкуПриОшибкеНедостаточноПравДляВходаВПрограмму( - Параметры, ТекстОшибки); - КонецПопытки; - Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Попытка + МодульИнтернетПоддержкаПользователейКлиентСервер = + ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтернетПоддержкаПользователейКлиентСервер"); + Исключение + Если ОтключенаЛогикаНачалаРаботыСистемы() Тогда Возврат; КонецЕсли; - СкрытьРабочийСтолПриНачалеРаботыСистемы(Истина, Истина); - Возврат; - КонецЕсли; - - // Стандартный первый серверный вызов с целью предварительного - // заполнения параметров работы клиента на сервере. - Попытка - ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность"); - Исключение - ОбработатьОшибкуПередНачаломРаботыСистемы(Параметры, ИнформацияОбОшибке(), Истина); + ВызватьИсключение; КонецПопытки; - Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + ВерсияБИП = МодульИнтернетПоддержкаПользователейКлиентСервер.ВерсияБиблиотеки(); + // Подключение обработчика запроса настроек клиента лицензирования + // для корректной проверки легальности обновления. + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияБИП, "2.7.1.0") > 0 Тогда + МодульКлиентЛицензированияКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КлиентЛицензированияКлиент"); + МодульКлиентЛицензированияКлиент.ПодключитьЗапросНастроекКлиентаЛицензирования(); + КонецЕсли; КонецПроцедуры @@ -351,62 +311,7 @@ ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы", "НепрерывноеВыполнение", НепрерывноеВыполнение, Тип("Булево")); - Параметры = ПараметрыОбработкиПриНачалеРаботыСистемы(); - - // Внешние параметры описания результата. - Параметры.Вставить("Отказ", Ложь); - Параметры.Вставить("Перезапустить", Ложь); - Параметры.Вставить("ДополнительныеПараметрыКоманднойСтроки", ""); - - // Внешние параметры управления выполнением. - Параметры.Вставить("ИнтерактивнаяОбработка", Неопределено); // ОписаниеОповещения. - Параметры.Вставить("ОбработкаПродолжения", Неопределено); // ОписаниеОповещения. - Параметры.Вставить("НепрерывноеВыполнение", НепрерывноеВыполнение); - - // Внутренние параметры. - Параметры.Вставить("ОповещениеЗавершения", ОповещениеЗавершения); - Параметры.Вставить("ОбработкаЗавершения", Новый ОписаниеОповещения( - "ДействияПриНачалеРаботыСистемыОбработкаЗавершения", ЭтотОбъект)); - - // Подготовка перехода к следующей процедуре. - Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( - "ДействияПриНачалеРаботыСистемыВИнтеграционнойПроцедуре", ЭтотОбъект)); - - Если Не ЗапускПрограммыЗавершен() Тогда - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Недопустимый вызов %1 при запуске программы. - |Сначала должна быть завершена процедура %2. - |Предположительно, один из обработчиков события не вызвал оповещение для продолжения. - |Последняя вызванная процедура %3.'"), - "СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы", - "СтандартныеПодсистемыКлиент.ПередНачаломРаботыСистемы", - ПолноеИмяПоследнейПроцедурыПередНачаломРаботыСистемы()); - Попытка - ВызватьИсключение ТекстОшибки; - Исключение - ОбработатьОшибкуПриНачалеРаботыСистемы(Параметры, ИнформацияОбОшибке(), Истина); - КонецПопытки; - Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - КонецЕсли; - - Попытка - УстановитьРасширенныйЗаголовокПриложения(Истина); // Для главного окна. - - Если НЕ ОбработатьПараметрыЗапуска() Тогда - Параметры.Отказ = Истина; - ВыполнитьОбработкуОповещения(Параметры.ОбработкаЗавершения); - Возврат; - КонецЕсли; - Исключение - ОбработатьОшибкуПриНачалеРаботыСистемы(Параметры, ИнформацияОбОшибке(), Истина); - КонецПопытки; - Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + ДействияПриНачалеРаботыСистемы(ОповещениеЗавершения, НепрерывноеВыполнение); КонецПроцедуры @@ -427,7 +332,7 @@ Если Не ВыводитьПредупрежденияПередЗавершениемРаботыСистемы(Отказ) Тогда Возврат; КонецЕсли; - + Предупреждения = ПредупрежденияПередЗавершениемРаботыСистемы(Отказ); Если Предупреждения.Количество() = 0 Тогда Если Не ПараметрКлиента("ЗапрашиватьПодтверждениеПриЗавершенииПрограммы") Тогда @@ -451,6 +356,29 @@ КонецПроцедуры +// Выполнить стандартные действия при обработке получения формы выбора пользователей системы взаимодействия. +// +// Параметры: +// НазначениеВыбора - НазначениеВыбораПользователейСистемыВзаимодействия +// Форма - ФормаКлиентскогоПриложения +// ИдентификаторОбсуждения - ИдентификаторОбсужденияСистемыВзаимодействия +// Параметры - Структура +// ВыбраннаяФорма - Строка +// СтандартнаяОбработка - Булево +// +Процедура ОбработкаПолученияФормыВыбораПользователейСистемыВзаимодействия(НазначениеВыбора, + Форма, ИдентификаторОбсуждения, Параметры, ВыбраннаяФорма, СтандартнаяОбработка) Экспорт + + // СтандартныеПодсистемы.Обсуждения + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда + МодульОбсужденияСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбсужденияСлужебныйКлиент"); + МодульОбсужденияСлужебныйКлиент.ПриПолученииФормыВыбораПользователейСистемыВзаимодействия(НазначениеВыбора, + Форма, ИдентификаторОбсуждения, Параметры, ВыбраннаяФорма, СтандартнаяОбработка); + КонецЕсли; + // Конец СтандартныеПодсистемы.Обсуждения + +КонецПроцедуры + // Возвращает новую структуру параметров для вывода предупреждения перед завершением работы программы. // Для использования в ОбщегоНазначенияКлиентПереопределяемый.ПередЗавершениемРаботыСистемы. // @@ -790,11 +718,11 @@ Возврат СтрНайти(ПараметрЗапуска, "ОтключитьЛогикуНачалаРаботыСистемы") > 0; КонецФункции -// Коллекция элементов стиля. +// Возвращает элементы стиля конфигурации. // // Возвращаемое значение: // Структура: -// * Ключ - Строка - имя элемента стиля. +// * Ключ - Строка - имя элемента стиля, например, "ГиперссылкаЦвет". // * Значение - ОбъектМетаданныхЭлементСтиля. // Функция ЭлементыСтиля() Экспорт @@ -803,13 +731,11 @@ ПараметрыРаботыКлиента = ПараметрыРаботыКлиента(); Для каждого ЭлементСтиля Из ПараметрыРаботыКлиента.ЭлементыСтиля Цикл - - #Если ТолстыйКлиентОбычноеПриложение Тогда +#Если ТолстыйКлиентОбычноеПриложение Тогда ЭлементыСтиля.Вставить(ЭлементСтиля.Ключ, ЭлементСтиля.Значение.Получить()); - #Иначе +#Иначе ЭлементыСтиля.Вставить(ЭлементСтиля.Ключ, ЭлементСтиля.Значение); - #КонецЕсли - +#КонецЕсли КонецЦикла; Возврат ЭлементыСтиля; @@ -1051,6 +977,75 @@ //////////////////////////////////////////////////////////////////////////////// // ПередНачаломРаботыСистемы +// Продолжение процедуры ПередНачаломРаботыСистемы. +Процедура ДействияПередНачаломРаботыСистемы(ОповещениеЗавершения) + + Параметры = ПараметрыОбработкиПередНачаломРаботыСистемы(); + + // Внешние параметры описания результата. + Параметры.Вставить("Отказ", Ложь); + Параметры.Вставить("Перезапустить", Ложь); + Параметры.Вставить("ДополнительныеПараметрыКоманднойСтроки", ""); + + // Внешние параметры управления выполнением. + Параметры.Вставить("ИнтерактивнаяОбработка", Неопределено); // ОписаниеОповещения. + Параметры.Вставить("ОбработкаПродолжения", Неопределено); // ОписаниеОповещения. + Параметры.Вставить("НепрерывноеВыполнение", Истина); + Параметры.Вставить("ПолученныеПараметрыКлиента", Новый Структура); + Параметры.Вставить("МодульПоследнейПроцедуры", ""); + Параметры.Вставить("ИмяПоследнейПроцедуры", ""); + УстановитьПоследнююПроцедуру(Параметры, "СтандартныеПодсистемыКлиент", "ПередНачаломРаботыСистемы"); + + // Внутренние параметры. + Параметры.Вставить("ОповещениеЗавершения", ОповещениеЗавершения); + Параметры.Вставить("ОбработкаЗавершения", Новый ОписаниеОповещения( + "ДействияПередНачаломРаботыСистемыОбработкаЗавершения", ЭтотОбъект)); + + ОбновитьПараметрыРаботыКлиента(Параметры, Истина, ОповещениеЗавершения <> Неопределено); + + // Подготовка перехода к следующей процедуре. + Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( + "ДействияПередНачаломРаботыСистемыВИнтеграционнойПроцедуре", ЭтотОбъект)); + + Если ОтключенаЛогикаНачалаРаботыСистемы() Тогда + Попытка + // Проверка права отключения и заполнение параметров работы клиента на сервере. + СвойстваКлиента = Новый Структура; + ЗаполнитьПараметрыРаботыКлиентаНаСервере(СвойстваКлиента); + СтандартныеПодсистемыВызовСервера.ПроверитьПравоОтключитьЛогикуНачалаРаботыСистемы(СвойстваКлиента); + Если СвойстваКлиента.Свойство("ОшибкаНетПраваОтключитьЛогикуНачалаРаботыСистемы") Тогда + ПользователиСлужебныйКлиент.УстановитьИнтерактивнуюОбработкуПриОшибкеНедостаточноПравДляВходаВПрограмму( + Параметры, СвойстваКлиента.ОшибкаНетПраваОтключитьЛогикуНачалаРаботыСистемы); + КонецЕсли; + Исключение + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СтандартныеПодсистемыВызовСервера.ЗаписатьОшибкуВЖурналРегистрацииПриЗапускеИлиЗавершении( + Ложь, "Запуск", ТекстОшибки); + ПользователиСлужебныйКлиент.УстановитьИнтерактивнуюОбработкуПриОшибкеНедостаточноПравДляВходаВПрограмму( + Параметры, ТекстОшибки); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + СкрытьРабочийСтолПриНачалеРаботыСистемы(Истина, Истина); + Возврат; + КонецЕсли; + + // Стандартный первый серверный вызов с целью предварительного + // заполнения параметров работы клиента на сервере. + Попытка + ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность"); + Исключение + ОбработатьОшибкуПередНачаломРаботыСистемы(Параметры, ИнформацияОбОшибке(), Истина); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + // Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. Процедура ДействияПередНачаломРаботыСистемыВИнтеграционнойПроцедуре(Неопределен, Контекст) Экспорт @@ -1150,8 +1145,7 @@ Параметры.Вставить("ИндексТекущегоМодуля", 0); Параметры.Вставить("ДобавленныеМодули", Новый Массив); - ПараметрыКлиента = ПараметрыРаботыКлиентаПриЗапуске(); - Если ПараметрыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда + Если ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда Попытка Параметры.Вставить("Модули", Новый Массив); ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы(Параметры); @@ -1297,6 +1291,70 @@ //////////////////////////////////////////////////////////////////////////////// // ПриНачалеРаботыСистемы +// Продолжение процедуры ПриНачалеРаботыСистемы. +Процедура ДействияПриНачалеРаботыСистемы(ОповещениеЗавершения, НепрерывноеВыполнение) + + Параметры = ПараметрыОбработкиПриНачалеРаботыСистемы(); + + // Внешние параметры описания результата. + Параметры.Вставить("Отказ", Ложь); + Параметры.Вставить("Перезапустить", Ложь); + Параметры.Вставить("ДополнительныеПараметрыКоманднойСтроки", ""); + + // Внешние параметры управления выполнением. + Параметры.Вставить("ИнтерактивнаяОбработка", Неопределено); // ОписаниеОповещения. + Параметры.Вставить("ОбработкаПродолжения", Неопределено); // ОписаниеОповещения. + Параметры.Вставить("НепрерывноеВыполнение", НепрерывноеВыполнение); + + // Внутренние параметры. + Параметры.Вставить("ОповещениеЗавершения", ОповещениеЗавершения); + Параметры.Вставить("ОбработкаЗавершения", Новый ОписаниеОповещения( + "ДействияПриНачалеРаботыСистемыОбработкаЗавершения", ЭтотОбъект)); + + // Подготовка перехода к следующей процедуре. + Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( + "ДействияПриНачалеРаботыСистемыВИнтеграционнойПроцедуре", ЭтотОбъект)); + + Если Не ЗапускПрограммыЗавершен() Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Возникла непредвиденная ситуация при запуске программы. + | + |Техническая информация: + |Недопустимый вызов %1 при запуске программы. Сначала должна быть завершена процедура %2. + |Предположительно, один из обработчиков события не вызвал оповещение для продолжения. + |Последняя вызванная процедура %3.'"), + "СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы", + "СтандартныеПодсистемыКлиент.ПередНачаломРаботыСистемы", + ПолноеИмяПоследнейПроцедурыПередНачаломРаботыСистемы()); + Попытка + ВызватьИсключение ТекстОшибки; + Исключение + ОбработатьОшибкуПриНачалеРаботыСистемы(Параметры, ИнформацияОбОшибке(), Истина); + КонецПопытки; + Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + Попытка + УстановитьРасширенныйЗаголовокПриложения(Истина); // Для главного окна. + + Если НЕ ОбработатьПараметрыЗапуска() Тогда + Параметры.Отказ = Истина; + ВыполнитьОбработкуОповещения(Параметры.ОбработкаЗавершения); + Возврат; + КонецЕсли; + Исключение + ОбработатьОшибкуПриНачалеРаботыСистемы(Параметры, ИнформацияОбОшибке(), Истина); + КонецПопытки; + Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + // Только для внутреннего использования. Продолжение процедуры ПриНачалеРаботыСистемы. Процедура ДействияПриНачалеРаботыСистемыВИнтеграционнойПроцедуре(Неопределен, Контекст) Экспорт @@ -1588,8 +1646,7 @@ Параметры.Вставить("ОбработкаПродолжения", Параметры.ОбработкаЗавершения); - ПараметрыКлиента = ПараметрыРаботыКлиента(); - Если ПараметрыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда + Если ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда Попытка ОткрытьФормуПредупрежденийПриЗавершенииРаботы(Параметры); Исключение @@ -1664,7 +1721,7 @@ Если ПараметрыКлиента.Свойство("ПоказатьНерекомендуемуюВерсиюПлатформы") Тогда Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( - "ИнтерактивнаяОбработкаПроверкиВерсииПлатформыПриЗапуске", ЭтотОбъект); + "ПроверитьВерсиюПлатформыПриЗапуске", ЭтотОбъект); ИначеЕсли ПараметрыКлиента.Свойство("ИспользуетсяНедопустимаяВерсияПлатформы") Тогда Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( "ПредупредитьОНедопустимойВерсииПлатформы", ЭтотОбъект); @@ -1672,8 +1729,8 @@ КонецПроцедуры -// Только для внутреннего использования. Продолжение процедуры ПроверитьВерсиюПлатформыПриЗапуске. -Процедура ИнтерактивнаяОбработкаПроверкиВерсииПлатформыПриЗапуске(Параметры, Контекст) Экспорт +// Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы2. +Процедура ПроверитьВерсиюПлатформыПриЗапуске(Параметры, Контекст) Экспорт ПараметрыКлиента = ПараметрыРаботыКлиентаПриЗапуске(); @@ -1737,8 +1794,7 @@ ПараметрыФормы.Вставить("ПропуститьЗавершениеРаботы", Истина); Форма = ОткрытьФорму("Обработка.НерекомендуемаяВерсияПлатформы.Форма.НерекомендуемаяВерсияПлатформы", ПараметрыФормы, - , , , , ОповещениеОЗакрытии); - + , , , , ОповещениеОЗакрытии); Если Форма = Неопределено Тогда ПослеЗакрытияФормыНерекомендуемойВерсииПлатформы("Продолжить", Параметры); КонецЕсли; @@ -2036,7 +2092,7 @@ Возврат Ложь; КонецЕсли; - Если Не ПараметрКлиента("ДоступноИспользованиеРазделенныхДанных") Тогда + Если Не ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат Ложь; КонецЕсли; Возврат Истина; @@ -2107,6 +2163,7 @@ Параметры.Вставить("СкрытьРабочийСтолПриНачалеРаботыСистемы", Ложь); Параметры.Вставить("ОперативнаяПамять", ОбщегоНазначенияКлиент.ОперативнаяПамятьДоступнаяКлиентскомуПриложению()); Параметры.Вставить("РазрешениеОсновногоЭкрана", РазрешениеОсновногоЭкрана()); + Параметры.Вставить("СистемнаяИнформация", СистемнаяИнформацияКлиента()); // Установка даты клиента непосредственно перед вызовом, чтобы уменьшить погрешность. Параметры.Вставить("ТекущаяДатаНаКлиенте", ТекущаяДата()); // АПК:143 Требуется ТекущаяДата() для расчета ПоправкаКВремениСеанса @@ -2114,6 +2171,9 @@ КонецПроцедуры +// Возвращаемое значение: +// см. ОбщегоНазначения.ИспользуемыйКлиент +// Функция ИспользуемыйКлиент() ИспользуемыйКлиент = ""; @@ -2297,6 +2357,28 @@ КонецФункции +// Возвращаемое значение: +// см. ОбщегоНазначения.СистемнаяИнформацияКлиента +// +Функция СистемнаяИнформацияКлиента() + + Результат = Новый Структура( + "ВерсияОС, + |ВерсияПриложения, + |ИдентификаторКлиента, + |ИнформацияПрограммыПросмотра, + |ОперативнаяПамять, + |Процессор, + |ТипПлатформы"); + + СистемнаяИнформация = Новый СистемнаяИнформация; + ЗаполнитьЗначенияСвойств(Результат, СистемнаяИнформация); + Результат.ТипПлатформы = ОбщегоНазначенияКлиентСервер.ИмяТипаПлатформы(СистемнаяИнформация.ТипПлатформы); + + Возврат Новый ФиксированнаяСтруктура(Результат); + +КонецФункции + #КонецОбласти //////////////////////////////////////////////////////////////////////////////// @@ -2309,6 +2391,11 @@ КонецЕсли; ПараметрыЗапуска = СтрРазделить(ПараметрЗапуска, ";", Ложь); + + Если ПараметрыЗапуска.Количество() = 0 Тогда + Возврат; + КонецЕсли; + ЗначениеПараметраЗапуска = ВРег(ПараметрыЗапуска[0]); Если ЗначениеПараметраЗапуска <> ВРег("ВойтиВОбластьДанных") Тогда @@ -2561,8 +2648,18 @@ Функция ВыполняетсяИнтерактивнаяОбработкаПередНачаломРаботыСистемы() + Если ПараметрыПриложения = Неопределено Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Возникла непредвиденная ситуация при запуске программы. + | + |Техническая информация: + |Недопустимый вызов %1 при запуске программы. Сначала должна быть завершена процедура %2.'"), + "СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы", + "СтандартныеПодсистемыКлиент.ПередНачаломРаботыСистемы"); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + ПараметрыПриЗапускеПрограммы = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПриЗапускеПрограммы"]; // Структура - Если Не ПараметрыПриЗапускеПрограммы.Свойство("ПараметрыОбработки") Тогда Возврат Ложь; КонецЕсли; @@ -2789,9 +2886,9 @@ КонецЕсли; СтандартныеПодсистемыВызовСервера.ЗаписатьОшибкуВЖурналРегистрацииПриЗапускеИлиЗавершении( - ПрекратитьРаботу, Событие, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ПрекратитьРаботу, Событие, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - ТекстПредупреждения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке) + Символы.ПС + Символы.ПС + ТекстПредупреждения = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке) + Символы.ПС + Символы.ПС + НСтр("ru = 'Техническая информация записана в журнал регистрации.'"); Если Событие = "Запуск" И ПрекратитьРаботу Тогда diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl index 3e81d5506..bf55e3c0d 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl @@ -83,7 +83,10 @@ ИмяПараметра = "СтандартныеПодсистемы.ЗапускПрограммыЗавершен"; Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Недопустимый вызов %1 при запуске программы. + НСтр("ru = 'Возникла непредвиденная ситуация при запуске программы. + | + |Техническая информация о проблеме: + |Недопустимый вызов %1 при запуске программы. |Первой процедурой, которая вызывается из обработчика события %2, должна быть процедура %3.'"), "СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента", "ПередНачаломРаботыСистемы", @@ -102,9 +105,11 @@ "ОтключитьЛогикуНачалаРаботыСистемы"); Иначе ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Недопустимый вызов %1 при запуске программы. - |Следует вызывать %2, пока процедура %3 еще не завершена. - |Последняя вызванная процедура %4.'"), + НСтр("ru = 'Возникла непредвиденная ситуация при запуске программы. + | + |Техническая информация о проблеме: + |Недопустимый вызов %1 при запуске программы. Следует вызывать %2, пока процедура %3 еще не завершена. + |Последняя вызванная процедура %4.'"), "СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента", "СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске", "СтандартныеПодсистемыКлиент.ПередНачаломРаботыСистемы", diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl index 8f1af1f65..67de7eca1 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl @@ -290,6 +290,7 @@ | НЕ ПланОбмена.ЭтотУзел | И НЕ ПланОбмена.ПометкаУдаления"; Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИмяПланаОбмена", "ПланОбмена" + "." + ИмяПланаОбмена); + // @skip-check query-in-loop - выборка ссылок из разных таблиц. ВыборкаУзлов = Запрос.Выполнить().Выбрать(); Пока ВыборкаУзлов.Следующий() Цикл СписокУзлов.Добавить(ВыборкаУзлов.Ссылка); @@ -315,7 +316,7 @@ Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл - Если Лев(ПланОбмена.Имя, 7) = "Удалить" Тогда + Если СтрНачинаетсяС(ПланОбмена.Имя, "Удалить") Тогда Продолжить; КонецЕсли; @@ -340,7 +341,7 @@ Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл - Если Лев(ПланОбмена.Имя, 7) = "Удалить" Тогда + Если СтрНачинаетсяС(ПланОбмена.Имя, "Удалить") Тогда Продолжить; КонецЕсли; @@ -375,7 +376,7 @@ // Функция РежимРегистрацииДанныхДляПланаОбмена(ПолноеИмяОбъекта, ИмяПланаОбмена) Экспорт - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); ЭлементСоставаПланаОбмена = Метаданные.ПланыОбмена[ИмяПланаОбмена].Состав.Найти(ОбъектМетаданных); Если ЭлементСоставаПланаОбмена = Неопределено Тогда @@ -696,6 +697,28 @@ КонецФункции +// Возвращаемое значение: +// ФиксированноеСоответствие из КлючИЗначение: +// * Ключ - Строка - имя предопределенного неразделенного регламентного задания, +// которое используются в качестве шаблона для задания очереди. +// * Значение - Булево - значение Истина. +// +Функция ШаблоныЗаданийОчереди() Экспорт + + Шаблоны = Новый Соответствие; + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ОчередьЗаданий") Тогда + МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); + ШаблоныЗаданийОчереди = МодульОчередьЗаданий.ШаблоныЗаданийОчереди(); + Для Каждого Шаблон Из ШаблоныЗаданийОчереди Цикл + Шаблоны.Вставить(Шаблон, Истина); + КонецЦикла; + КонецЕсли; + + Возврат Новый ФиксированноеСоответствие(Шаблоны); + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Для справочника ИдентификаторыОбъектовМетаданных. @@ -766,7 +789,7 @@ ПредопределенныеЗначения = Новый Соответствие; - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъектаМетаданных); // Если метаданных не существует. Если МетаданныеОбъекта = Неопределено Тогда diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl index 581e20591..dd91c97e2 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl @@ -629,7 +629,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); КонецПопытки; - КомментарийСоСтекомВызовов = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КомментарийСоСтекомВызовов = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); ИмяСобытия = НСтр("ru = 'Не заполнены параметры клиента на сервере'", ОбщегоНазначения.КодОсновногоЯзыка()); @@ -805,7 +805,7 @@ Возврат ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") И ЗначениеЗаполнено(ТекстОшибки) - И СтрНачинаетсяС(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), ТекстОшибки); + И СтрНачинаетсяС(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), ТекстОшибки); КонецФункции @@ -975,20 +975,21 @@ КонецПроцедуры -Функция ЭтоПредопределенныеДанные(Знач Элемент, ИмяРеквизита = "", ЗначениеРеквизита = "") Экспорт - - ИмяРеквизита = ""; +Функция РеквизитыПредопределенныхДанных() Экспорт + Результат = Новый Структура; + Результат.Вставить("ИмяПредопределенныхДанных", ""); + Результат.Вставить("ИмяПредопределенногоНабора", ""); + Результат.Вставить("ИмяПредопределенногоВида", ""); + Результат.Вставить("ПредопределеннаяПапка", Ложь); + Возврат Результат; +КонецФункции +Функция ЭтоПредопределенныеДанные(Знач Элемент, ИмяРеквизита = "", ЗначениеРеквизита = "") Экспорт // АПК:581 Экспортная для автотестов. + // Для определения предопределенных элементов в подсистемах Свойства, КонтактнаяИнформация и Взаимодействия // зачитываются реквизиты ИмяПредопределенногоНабора, ИмяПредопределенногоВида и ПредопределеннаяПапка. - ЗначенияРеквизитов = Новый Структура; - ЗначенияРеквизитов.Вставить("ИмяПредопределенныхДанных", ""); - ЗначенияРеквизитов.Вставить("ИмяПредопределенногоНабора", ""); - ЗначенияРеквизитов.Вставить("ИмяПредопределенногоВида", ""); - ЗначенияРеквизитов.Вставить("ПредопределеннаяПапка", Ложь); - + ЗначенияРеквизитов = РеквизитыПредопределенныхДанных(); ЗаполнитьЗначенияСвойств(ЗначенияРеквизитов, Элемент); - Если ЗначенияРеквизитов.ИмяПредопределенныхДанных = "" И ЗначенияРеквизитов.ИмяПредопределенногоНабора = "" И ЗначенияРеквизитов.ИмяПредопределенногоВида = "" @@ -996,6 +997,7 @@ Возврат Ложь; КонецЕсли; + ИмяРеквизита = ""; Если ЗначенияРеквизитов.ИмяПредопределенногоНабора <> "" Тогда ИмяРеквизита = "ИмяПредопределенногоНабора"; ИначеЕсли ЗначенияРеквизитов.ИмяПредопределенногоВида <> "" Тогда @@ -1011,6 +1013,116 @@ КонецФункции +// Параметры: +// Ссылки - Массив из ЛюбаяСсылка +// - ФиксированныйМассив из ЛюбаяСсылка - ссылки на объекты. +// Если массив пуст, то результатом будет пустое соответствие. +// Реквизиты - Массив из Строка +// - ФиксированныйМассив из Строка - имена реквизитов в формате требований к свойствам структуры. +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение - список объектов и значений их реквизитов: +// * Ключ - ЛюбаяСсылка - ссылка на объект; +// * Значение - Структура: +// ** Ключ - Строка - имя реквизита; +// ** Значение - Произвольный - значение реквизита. Неопределено, если реквизит не существует у объекта. +// +Функция ЗначенияРеквизитовОбъектовЕслиСуществуют(Ссылки, Знач Реквизиты) Экспорт + + ЗначенияРеквизитов = Новый Соответствие; + Если Ссылки.Количество() = 0 Тогда + Возврат ЗначенияРеквизитов; + КонецЕсли; + + РеквизитыТипов = Новый Соответствие; + СсылкиПоТипам = Новый Соответствие; + Для Каждого Ссылка Из Ссылки Цикл + Тип = ТипЗнч(Ссылка); + Если Не ОбщегоНазначения.ЭтоСсылка(Тип) Тогда + Продолжить; + КонецЕсли; + + Если СсылкиПоТипам[Тип] = Неопределено Тогда + СсылкиПоТипам[Тип] = Новый Массив; + КонецЕсли; + ЭлементПоТипу = СсылкиПоТипам[Тип]; // Массив + ЭлементПоТипу.Добавить(Ссылка); + + Если РеквизитыТипов[Тип] = Неопределено Тогда + + ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); // ОбъектМетаданныхСправочник + Если ОбъектМетаданных = Неопределено Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неверный первый параметр %1 в функции %2: + |Значения массива должны быть ссылками.'"), + "Ссылки", "ОбщегоНазначения.ЗначенияРеквизитовОбъектовЕслиСуществуют"); + КонецЕсли; + РеквизитыТипа = Новый Массив; + СтандартныеРеквизиты = Новый Соответствие; + Для каждого СтандартныйРеквизит Из ОбъектМетаданных.СтандартныеРеквизиты Цикл + СтандартныеРеквизиты[СтандартныйРеквизит.Имя] = Истина; + КонецЦикла; + Для каждого ИмяРеквизита Из Реквизиты Цикл + Если СтандартныеРеквизиты[ИмяРеквизита] <> Неопределено + Или ОбъектМетаданных.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда + РеквизитыТипа.Добавить(ИмяРеквизита); + Иначе + РеквизитыТипа.Добавить("НЕОПРЕДЕЛЕНО КАК" + " " + ИмяРеквизита); // @query-part + КонецЕсли; + КонецЦикла; + РеквизитыТипов[Тип] = РеквизитыТипа; + + КонецЕсли; + КонецЦикла; + + + Если СсылкиПоТипам.Количество() = 0 Тогда + Возврат ЗначенияРеквизитов; + КонецЕсли; + + ТекстыЗапросов = Новый Массив; + Запрос = Новый Запрос; + + Для Каждого СсылкиПоТипу Из СсылкиПоТипам Цикл + Тип = СсылкиПоТипу.Ключ; + ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); + ПолноеИмяОбъектаМетаданных = ОбъектМетаданных.ПолноеИмя(); + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Ссылка, + | &Реквизиты + |ИЗ + | &ПолноеИмяОбъектаМетаданных КАК ПсевдонимЗаданнойТаблицы + |ГДЕ + | ПсевдонимЗаданнойТаблицы.Ссылка В (&Ссылки)"; + Если ТекстыЗапросов.Количество() > 0 Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "РАЗРЕШЕННЫЕ", ""); // @query-part-1 + КонецЕсли; + РеквизитыТекстЗапроса = СтрСоединить(РеквизитыТипов[Тип], ","); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Реквизиты", РеквизитыТекстЗапроса); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъектаМетаданных", ПолноеИмяОбъектаМетаданных); + ИмяПараметра = "Ссылки" + СтрЗаменить(ПолноеИмяОбъектаМетаданных, ".", ""); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Ссылки", "&" + ИмяПараметра); // @query-part-1 + Запрос.УстановитьПараметр(ИмяПараметра, СсылкиПоТипу.Значение); + + ТекстыЗапросов.Добавить(ТекстЗапроса); + КонецЦикла; + + ИменаРеквизитов = СтрСоединить(Реквизиты, ","); + ТекстЗапроса = СтрСоединить(ТекстыЗапросов, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС); // @query-part + Запрос.Текст = ТекстЗапроса; + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Результат = Новый Структура(ИменаРеквизитов); + ЗаполнитьЗначенияСвойств(Результат, Выборка); + ЗначенияРеквизитов[Выборка.Ссылка] = Результат; + КонецЦикла; + + Возврат ЗначенияРеквизитов; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Процедуры для установки/получения параметров работы расширений (кэшей). @@ -1513,17 +1625,11 @@ ГраницаУстаревания = НачалоДня - 2*24*60*60; Ключи = ХранилищеСистемныхНастроек.Загрузить(КлючОбъектаХранения); - РежимСовместимости = ВерсияРежимаСовместимости(); Если ТипЗнч(Ключи) = Тип("Соответствие") Тогда ИменаНастроек = Новый Массив; - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(РежимСовместимости, "8.3.18.0") < 0 Тогда - ИменаНастроек.Добавить("/НастройкиОкна"); - ИменаНастроек.Добавить("/Такси/НастройкиОкна"); - Иначе - ИменаНастроек.Добавить("/НастройкиОкнаТонкогоКлиента"); - ИменаНастроек.Добавить("/Такси/НастройкиОкнаТонкогоКлиента"); - КонецЕсли; + ИменаНастроек.Добавить("/НастройкиОкнаТонкогоКлиента"); + ИменаНастроек.Добавить("/Такси/НастройкиОкнаТонкогоКлиента"); ИменаНастроек.Добавить("/НастройкиОкнаВебКлиента"); ИменаНастроек.Добавить("/НастройкиОкнаМобильногоКлиента"); ИменаНастроек.Добавить("/Такси/НастройкиОкнаВебКлиента"); @@ -1573,13 +1679,8 @@ Отбор = Новый Структура("Пользователь", ИмяПользователя); Выборка = ХранилищеСистемныхНастроек.Выбрать(Отбор); - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(РежимСовместимости, "8.3.18.0") < 0 Тогда - КлючПоискаРусский = "НастройкиОкна"; // @Non-NLS - КлючПоискаАнглийский = "WindowSettings"; - Иначе - КлючПоискаРусский = "НастройкиОкнаТонкогоКлиента"; // @Non-NLS - КлючПоискаАнглийский = "ThinClientWindowSettings"; - КонецЕсли; + КлючПоискаРусский = "НастройкиОкнаТонкогоКлиента"; // @Non-NLS + КлючПоискаАнглийский = "ThinClientWindowSettings"; Пока Истина Цикл Попытка ЕстьСледующей = Выборка.Следующий(); @@ -1588,7 +1689,7 @@ ЗаписьЖурналаРегистрации( НСтр("ru = 'Ошибка выполнения'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); Прервать; КонецПопытки; Если Не ЕстьСледующей Тогда @@ -2575,8 +2676,8 @@ МодульРаботаВБезопасномРежимеСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - Если Параметры.РазделениеВключено И Не Параметры.ДоступноИспользованиеРазделенныхДанных Тогда - Возврат Ложь; + Если Не Параметры.ДоступноИспользованиеРазделенныхДанных Тогда + Возврат Истина; КонецЕсли; // Параметры для работы в локальном режиме или @@ -2746,14 +2847,7 @@ Возврат; КонецЕсли; - РежимСовместимости = ВерсияРежимаСовместимости(); - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(РежимСовместимости, "8.3.17.0") < 0 Тогда - Возврат; - КонецЕсли; - - // АПК:487-выкл - нет выполнения произвольного кода. - Выполнить("СервисыИнтеграции.ВыполнитьОбработку()"); - // АПК:487-вкл + СервисыИнтеграции.ВыполнитьОбработку(); КонецПроцедуры // Параметры: @@ -3161,6 +3255,7 @@ КонецЕсли; // АПК:1328-выкл - №648.1.1 В вызывающей процедуре установлена исключительная блокировка. + // @skip-check query-in-loop - Порционная обработка данных ТаблицаИмен = Запрос.Выполнить().Выгрузить(); // АПК:1328-вкл. ТаблицаИмен.Индексы.Добавить("Имя"); @@ -3177,6 +3272,7 @@ Запрос.Текст = ОписаниеСохраненных.ТекстЗапроса; // АПК:1328-выкл - №648.1.1 В вызывающей процедуре установлена исключительная блокировка. + // @skip-check query-in-loop - Порционная обработка данных ТаблицаИмен = Запрос.Выполнить().Выгрузить(); // АПК:1328-вкл. ТаблицаИмен.Индексы.Добавить("Имя"); @@ -3365,8 +3461,10 @@ // Проверка настройки совместимости конфигурации с версией платформы. СистемнаяИнформация = Новый СистемнаяИнформация; - МинимальнаяВерсияПлатформы = "8.3.17.1851"; + ВерсияПлатформы = ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(СистемнаяИнформация.ВерсияПриложения); + МинимальнаяВерсияПлатформы = ?(ВерсияПлатформы = "8.3.21", "8.3.21.1622", "8.3.22.1704"); Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, МинимальнаяВерсияПлатформы) < 0 Тогда + МинимальнаяВерсияПлатформы = "8.3.21.1622, 8.3.22.1704"; ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Для запуска необходима версия платформы 1С:Предприятие %1 или выше.'"), МинимальнаяВерсияПлатформы); КонецЕсли; @@ -3374,11 +3472,10 @@ Режимы = Метаданные.СвойстваОбъектов.РежимСовместимости; ТекущийРежим = Метаданные.РежимСовместимости; - ПоддерживаемаяВерсияПлатформы = "8.3.16"; - ВерсияПлатформы = ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(СистемнаяИнформация.ВерсияПриложения); + ПоддерживаемаяВерсияПлатформы = "8.3.21"; Если ТекущийРежим = Режимы.НеИспользовать Тогда - ПоддерживаемыеВерсииПлатформы = СтрРазделить("8.3.14, 8.3.15, 8.3.16, 8.3.17, 8.3.18, 8.3.19, 8.3.20, 8.3.21", ", ", Ложь); + ПоддерживаемыеВерсииПлатформы = СтрРазделить("8.3.21", ", ", Ложь); Если ПоддерживаемыеВерсииПлатформы.Найти(ВерсияПлатформы) <> Неопределено Тогда НеПоддерживаемаяВерсияПлатформы = ""; @@ -3388,14 +3485,7 @@ Иначе ТекущийРежимСтрокой = Строка(ТекущийРежим); - Если СтрЗаканчиваетсяНа(ТекущийРежимСтрокой, "8_3_14") - Или СтрЗаканчиваетсяНа(ТекущийРежимСтрокой, "8_3_15") - Или СтрЗаканчиваетсяНа(ТекущийРежимСтрокой, "8_3_16") - Или СтрЗаканчиваетсяНа(ТекущийРежимСтрокой, "8_3_17") - Или СтрЗаканчиваетсяНа(ТекущийРежимСтрокой, "8_3_18") - Или СтрЗаканчиваетсяНа(ТекущийРежимСтрокой, "8_3_19") - Или СтрЗаканчиваетсяНа(ТекущийРежимСтрокой, "8_3_20") - Или СтрЗаканчиваетсяНа(ТекущийРежимСтрокой, "8_3_21") Тогда + Если СтрЗаканчиваетсяНа(ТекущийРежимСтрокой, "8_3_21") Тогда НеПоддерживаемаяВерсияПлатформы = ""; Иначе @@ -3431,14 +3521,6 @@ КонецЕсли; КонецЕсли; - ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь(); - Если Не ТекущийПользовательИБ.АутентификацияСтандартная - И Не ТекущийПользовательИБ.АутентификацияОС - И Не ТекущийПользовательИБ.АутентификацияOpenID - И ПолучитьТекущийСеансИнформационнойБазы().ИмяПриложения <> "BackgroundJob" Тогда - ВызватьИсключение НСтр("ru = 'Вход в программу запрещен. Обратитесь к администратору.'"); - КонецЕсли; - Если Не Метаданные.ОсновныеРоли.Содержит(Метаданные.Роли.АдминистраторСистемы) Или Не Метаданные.ОсновныеРоли.Содержит(Метаданные.Роли.ПолныеПрава) Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -3870,7 +3952,7 @@ НСтр("ru = 'Невозможно установить параметры сеанса по причине: %1. | |Возможно, для информационной базы через консоль кластера был установлен профиль безопасности, не допускающий выполнения внешних модулей без установки безопасного режима. В этом случае для восстановления работоспособности программы отключите использование профиля безопасности через консоль кластера и заново настройте профили безопасности с помощью интерфейса конфигурации (соответствующие команды находятся в разделе настроек программы). При этом программа будет автоматически корректно настроена на использование совместно с включенными профилями безопасности.'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; @@ -3932,6 +4014,7 @@ |ГДЕ | ТекущаяТаблица.Предопределенный"; Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекущаяТаблица", ОбъектМетаданных.ПолноеИмя()); + // @skip-check query-in-loop - Порционная обработка данных Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл @@ -3994,27 +4077,15 @@ Возврат; КонецЕсли; - РежимСовместимости = ВерсияРежимаСовместимости(); - ТипыНастроек = Новый Массив; // Русский вариант. - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(РежимСовместимости, "8.3.18.0") < 0 Тогда - ТипыНастроек.Добавить("/НастройкиОкна"); // @Non-NLS - ТипыНастроек.Добавить("/Такси/НастройкиОкна"); // @Non-NLS - Иначе - ТипыНастроек.Добавить("/НастройкиОкнаТонкогоКлиента"); // @Non-NLS - ТипыНастроек.Добавить("/Такси/НастройкиОкнаТонкогоКлиента"); // @Non-NLS - КонецЕсли; + ТипыНастроек.Добавить("/НастройкиОкнаТонкогоКлиента"); // @Non-NLS + ТипыНастроек.Добавить("/Такси/НастройкиОкнаТонкогоКлиента"); // @Non-NLS ТипыНастроек.Добавить("/НастройкиОкнаВебКлиента"); // @Non-NLS ТипыНастроек.Добавить("/Такси/НастройкиОкнаВебКлиента"); // @Non-NLS // Английский вариант. - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(РежимСовместимости, "8.3.18.0") < 0 Тогда - ТипыНастроек.Добавить("/WindowSettings"); - ТипыНастроек.Добавить("/Taxi/WindowSettings"); - Иначе - ТипыНастроек.Добавить("/ThinClientWindowSettings"); - ТипыНастроек.Добавить("/Taxi/ThinClientWindowSettings"); - КонецЕсли; + ТипыНастроек.Добавить("/ThinClientWindowSettings"); + ТипыНастроек.Добавить("/Taxi/ThinClientWindowSettings"); ТипыНастроек.Добавить("/WebClientWindowSettings"); ТипыНастроек.Добавить("/Taxi/WebClientWindowSettings"); diff --git a/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl b/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl index 660cc4df3..10361ecc9 100644 --- a/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl @@ -1055,8 +1055,8 @@ // |en=';%1 day left;;;;%1 days left'"), // 0.05,, "ЧДЦ=1"); // -Функция СтрокаСЧисломДляЛюбогоЯзыка(Шаблон, Число, Вид = Неопределено, ФорматнаяСтрока = Неопределено) Экспорт - +Функция СтрокаСЧисломДляЛюбогоЯзыка(Шаблон, Число, Вид = Неопределено, ФорматнаяСтрока = "ЧН=0;") Экспорт + Если ПустаяСтрока(Шаблон) Тогда Возврат Формат(Число, ФорматнаяСтрока); КонецЕсли; @@ -1344,25 +1344,39 @@ ТекущаяСсылка = Неопределено; ФрагментыСтроки = СтрРазделить(HTMLСтрока, "<", Истина); + + ИменаТэгов = Новый Соответствие; + ИменаТэгов.Вставить("SPAN", Истина); + ИменаТэгов.Вставить("IMG", Истина); + ИменаТэгов.Вставить("B", Истина); + ИменаТэгов.Вставить("A", Истина); + + СимволНачалаФрагмента = ""; Для каждого Фрагмент Из ФрагментыСтроки Цикл ТелоСтроки = ""; - ПозицияТэг = СтрНайти(Фрагмент, ">"); + ПозицияКонецТэга = СтрНайти(Фрагмент, ">"); - Если ПозицияТэг = 0 Тогда - ТелоСтроки = Фрагмент; + Если ПозицияКонецТэга = 0 Тогда + ТелоСтроки = СимволНачалаФрагмента + Фрагмент; ИначеЕсли СтрНачинаетсяС(Фрагмент, "/") Тогда - ТелоСтроки = Сред(Фрагмент, ПозицияТэг + 1); - ТекущийШрифт = Неопределено; - ТекущийЦвет = Неопределено; - ТекущийФон = Неопределено; - ТекущаяСсылка = Неопределено; + ИмяТега = Сред(Фрагмент, 2, ПозицияКонецТэга - 2); + + Если ИменаТэгов.Получить(ВРег(ИмяТега)) = Истина Тогда + ТелоСтроки = Сред(Фрагмент, ПозицияКонецТэга + 1); + ТекущийШрифт = Неопределено; + ТекущийЦвет = Неопределено; + ТекущийФон = Неопределено; + ТекущаяСсылка = Неопределено; + Иначе + ТелоСтроки = СимволНачалаФрагмента + Фрагмент; + КонецЕсли; Иначе - ОписаниеТэга = Лев(Фрагмент, ПозицияТэг - 1); + ОписаниеТэга = Лев(Фрагмент, ПозицияКонецТэга - 1); ПервыйПробел = СтрНайти(ОписаниеТэга, " "); Если ПервыйПробел > 0 Тогда @@ -1383,14 +1397,14 @@ Если ПозицияВтораяКавычка = 0 Тогда ПозицияВтораяКавычка = СтрДлина(ОписаниеАтрибутов) + 1; КонецЕсли; - ЗначениеАтрибута = СокрЛП(Сред(ОписаниеАтрибутов, ПозицияПерваяКавычка + 1, ПозицияВтораяКавычка - ПозицияПерваяКавычка - 1)); + ЗначениеАтрибута = СокрЛП(Сред(ОписаниеАтрибутов, ПозицияПерваяКавычка + 1, ПозицияВтораяКавычка - ПозицияПерваяКавычка - 1)); - Если СтрСравнить(ИмяАтрибута, "style") = 0 Тогда + Если СтрСравнить(ИмяАтрибута, "style") = 0 И ЗначениеЗаполнено(ЗначениеАтрибута) Тогда УстановитьСтилиПоЗначениюАтрибута(ЗначениеАтрибута, ЭлементыСтиля, ТекущийФон, ТекущийЦвет, ТекущийШрифт); ИначеЕсли СтрСравнить(ИмяАтрибута, "href") = 0 И СтрСравнить(ИмяТега, "a") = 0 Тогда ТекущаяСсылка = ЗначениеАтрибута; ИначеЕсли СтрСравнить(ИмяАтрибута, "src") = 0 И СтрСравнить(ИмяТега, "img") = 0 Тогда - НаборСтрок.Добавить(Новый ФорматированнаяСтрока(БиблиотекаКартинок[ЗначениеАтрибута], ТекущийШрифт, ТекущийЦвет, ТекущийФон, ТекущаяСсылка)); + НаборСтрок.Добавить(ФорматированнаяСтрокаБезИзмененияРазмераШрифта(Новый ФорматированнаяСтрока(БиблиотекаКартинок[ЗначениеАтрибута], ТекущийШрифт, ТекущийЦвет, ТекущийФон, ТекущаяСсылка))); КонецЕсли; ОписаниеАтрибутов = Сред(ОписаниеАтрибутов, ПозицияВтораяКавычка + 1); @@ -1401,18 +1415,25 @@ ИмяТега = ОписаниеТэга; КонецЕсли; - Если ИмяТега = "b" Тогда - ТекущийШрифт = ЭлементыСтиля["ВажнаяНадписьШрифт"]; + Если ИменаТэгов.Получить(ВРег(ИмяТега)) = Истина Тогда + + Если ВРег(ИмяТега) = "B" Тогда + ТекущийШрифт = ЭлементыСтиля["ВажнаяНадписьШрифт"]; + КонецЕсли; + + ТелоСтроки = Сред(Фрагмент, ПозицияКонецТэга + 1); + Иначе + ТелоСтроки = СимволНачалаФрагмента + Фрагмент; КонецЕсли; - ТелоСтроки = Сред(Фрагмент, ПозицияТэг + 1); - КонецЕсли; ТелоСтроки = СтрЗаменить(ТелоСтроки, "<", "<"); Если СтрДлина(ТелоСтроки) > 0 Тогда - НаборСтрок.Добавить(Новый ФорматированнаяСтрока(ТелоСтроки, ТекущийШрифт, ТекущийЦвет, ТекущийФон, ТекущаяСсылка)); - КонецЕсли; + НаборСтрок.Добавить(ФорматированнаяСтрокаБезИзмененияРазмераШрифта(Новый ФорматированнаяСтрока(ТелоСтроки, ТекущийШрифт, ТекущийЦвет, ТекущийФон, ТекущаяСсылка))); + КонецЕсли; + + СимволНачалаФрагмента = "<" ; КонецЦикла; @@ -1443,6 +1464,12 @@ КонецПроцедуры +Функция ФорматированнаяСтрокаБезИзмененияРазмераШрифта(Строка) + ФорматированныйДокумент = Новый ФорматированныйДокумент; + ФорматированныйДокумент.УстановитьФорматированнуюСтроку(Строка); + Возврат ФорматированныйДокумент.ПолучитьФорматированнуюСтроку(); +КонецФункции + #КонецОбласти #Область ПреобразоватьЧислоВРимскуюНотацию diff --git a/SSL/src/CommonModules/ТекущиеДелаСервер/Module.bsl b/SSL/src/CommonModules/ТекущиеДелаСервер/Module.bsl index 5c48d6595..c0c16ab8b 100644 --- a/SSL/src/CommonModules/ТекущиеДелаСервер/Module.bsl +++ b/SSL/src/CommonModules/ТекущиеДелаСервер/Module.bsl @@ -48,6 +48,7 @@ ДелаПользователя.Колонки.Добавить("Владелец"); ДелаПользователя.Колонки.Добавить("Подсказка", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(250))); ДелаПользователя.Колонки.Добавить("ОбъектВладелецДел", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(256))); + ДелаПользователя.Колонки.Добавить("ЕстьДелаПользователя"); // Обратная совместимость Возврат ДелаПользователя; @@ -69,7 +70,7 @@ ИменаПодсистем = ПринадлежностьОбъектов.Получить(ИмяОбъектаМетаданных); Если ИменаПодсистем <> Неопределено Тогда Для Каждого ИмяПодсистемы Из ИменаПодсистем Цикл - ПодсистемыКомандногоИнтерфейса.Добавить(Метаданные.НайтиПоПолномуИмени(ИмяПодсистемы)); + ПодсистемыКомандногоИнтерфейса.Добавить(ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяПодсистемы)); КонецЦикла; КонецЕсли; diff --git a/SSL/src/CommonModules/ТекущиеДелаСлужебный/Module.bsl b/SSL/src/CommonModules/ТекущиеДелаСлужебный/Module.bsl index c923bad31..54a6da3d4 100644 --- a/SSL/src/CommonModules/ТекущиеДелаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ТекущиеДелаСлужебный/Module.bsl @@ -302,6 +302,11 @@ КонецЕсли; КонецЕсли; + // Обратная совместимость + Если ТипЗнч(Дело.ЕстьДелаПользователя) = Тип("Булево") Тогда + Дело.ЕстьДела = Дело.ЕстьДелаПользователя; + КонецЕсли; + КонецЦикла; Если ОтключенныеОбъекты.Количество() > 0 Тогда diff --git a/SSL/src/CommonModules/УдалениеПомеченныхОбъектов/Module.bsl b/SSL/src/CommonModules/УдалениеПомеченныхОбъектов/Module.bsl index 6350a7acc..7be3c77cf 100644 --- a/SSL/src/CommonModules/УдалениеПомеченныхОбъектов/Module.bsl +++ b/SSL/src/CommonModules/УдалениеПомеченныхОбъектов/Module.bsl @@ -66,43 +66,55 @@ // Массив из ЛюбаяСсылка // Функция ПомеченныеНаУдаление(Знач ОтборМетаданных = Неопределено, ИскатьТехнологическиеОбъекты = Ложь) Экспорт - ИсключенияПоискаУдаляемых = Новый Массив; - Результат = Новый Массив; ЭтоМодельСервиса = ОбщегоНазначения.РазделениеВключено(); ВОбластиДанных = ?(ЭтоМодельСервиса, ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(), Ложь); ОтборМетаданных = ?(ОтборМетаданных <> Неопределено И ОтборМетаданных.Количество() > 0, ОтборМетаданных.ВыгрузитьЗначения(), Неопределено); + ИсключенияПоискаУдаляемых = Новый Массив; + ИсключенияПоиска = Новый Соответствие; Если НЕ ИскатьТехнологическиеОбъекты Тогда ИсключенияПоискаСсылок = ОбщегоНазначения.ИсключенияПоискаСсылок(); - Для Каждого ИсключенияПоиска Из ИсключенияПоискаСсылок Цикл - Если ИсключенияПоиска.Значение = "*" Тогда - ИсключенияПоискаУдаляемых.Добавить(ИсключенияПоиска.Ключ); + Для Каждого ИсключениеПоиска Из ИсключенияПоискаСсылок Цикл + Если ИсключениеПоиска.Значение = "*" Тогда + ИсключенияПоискаУдаляемых.Добавить(ИсключениеПоиска.Ключ); + ИсключенияПоиска[ИсключениеПоиска.Ключ] = Истина; КонецЕсли; КонецЦикла; КонецЕсли; - КешИнформацииОТипе = Новый Соответствие; + ПомеченныеНаУдаление = Новый Массив; Для Каждого Элемент Из НайтиПомеченныеНаУдаление( , ОтборМетаданных, ИсключенияПоискаУдаляемых) Цикл - Если СоответствуетОтборуМетаданных(ОтборМетаданных, Элемент) - И ИсключенияПоискаУдаляемых.Найти(Элемент.Метаданные()) = Неопределено Тогда - - Информация = УдалениеПомеченныхОбъектовСлужебный.ИнформацияОТипе( - ТипЗнч(Элемент), КешИнформацииОТипе); - ЭтоПредопределенный = Информация.ЕстьПредопределенные - И Информация.Предопределенные.Найти(Элемент) <> Неопределено; - ЭтоНеразделенныйОбъектВОбластиДанных = ВОбластиДанных И Не Информация.Разделенный; - - ОбъектПодлежитУдалению = НЕ ЭтоПредопределенный - И НЕ ЭтоНеразделенныйОбъектВОбластиДанных - И (НЕ Информация.Технический - ИЛИ ИскатьТехнологическиеОбъекты); - - Если ОбъектПодлежитУдалению Тогда - Результат.Добавить(Элемент); - КонецЕсли; + Если Не СоответствуетОтборуМетаданных(ОтборМетаданных, Элемент) + Или ИсключенияПоиска[Элемент.Метаданные()] <> Неопределено Тогда + Продолжить; КонецЕсли; + + ПомеченныеНаУдаление.Добавить(Элемент); + КонецЦикла; + + Результат = Новый Массив; + ЭтоПредопределенныеЭлементы = ОбщегоНазначения.ЭтоПредопределенныеЭлементы(ПомеченныеНаУдаление); + ИнформацияОТипах = УдалениеПомеченныхОбъектовСлужебный.ИнформацияОТипах(ПомеченныеНаУдаление); + + Для Каждого Элемент Из ПомеченныеНаУдаление Цикл + + Если Не СоответствуетОтборуМетаданных(ОтборМетаданных, Элемент) + Или ИсключенияПоиска[Элемент.Метаданные()] <> Неопределено Тогда + Продолжить; + КонецЕсли; + + Информация = ИнформацияОТипах[ТипЗнч(Элемент)]; + ЭтоПредопределенный = ЭтоПредопределенныеЭлементы[Элемент]; + ЭтоНеразделенныйОбъектВОбластиДанных = ВОбластиДанных И Не Информация.Разделенный; + + ОбъектПодлежитУдалению = НЕ ЭтоПредопределенный И НЕ ЭтоНеразделенныйОбъектВОбластиДанных + И (НЕ Информация.Технический ИЛИ ИскатьТехнологическиеОбъекты); + Если ОбъектПодлежитУдалению Тогда + Результат.Добавить(Элемент); + КонецЕсли; + КонецЦикла; Возврат Результат; @@ -214,8 +226,7 @@ МетаданныеИсточника = Источник.Метаданные(); Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Источник, "Ссылка") Тогда - ОписанияСсылок = СсылкаНаУдаляемыеОбъектыВОбъекте( - ОписаниеОбъекта(Источник, МетаданныеИсточника), + ОписанияСсылок = СсылкаНаУдаляемыеОбъектыВОбъекте(ОписаниеОбъекта(Источник, МетаданныеИсточника), МетаданныеИсточника); ИначеЕсли ОбщегоНазначения.ЭтоКонстанта(МетаданныеИсточника) Тогда ЗначениеКонстанты = Источник.Значение; @@ -234,16 +245,10 @@ Возврат Новый Соответствие; КонецЕсли; - УдаляемыеСсылки = УдаляемыеСсылкиВКоллекции( - ОписанияСсылок.ВыгрузитьКолонку("Ссылка")); - УдаляемыеСсылкиПометкиУдаления = ОбщегоНазначения.ЗначениеРеквизитаОбъектов( - УдаляемыеСсылки, - "ПометкаУдаления"); - - ДобавленныеСсылки = СсылкиДобавленныеПриИзмененииОбъекта( - ОписанияСсылок, - УдаляемыеСсылкиПометкиУдаления); + УдаляемыеСсылки = ЗаблокированныеУдаляемыеСсылки(ОписанияСсылок.ВыгрузитьКолонку("Ссылка")); + УдаляемыеСсылкиПометкиУдаления = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(УдаляемыеСсылки, "ПометкаУдаления"); + ДобавленныеСсылки = СсылкиДобавленныеПриИзмененииОбъекта(ОписанияСсылок, УдаляемыеСсылкиПометкиУдаления); Для каждого ОписаниеСсылки Из ДобавленныеСсылки Цикл СсылкиНаУдаляемыеОбъекты.Вставить(ОписаниеСсылки.Ссылка, ОписаниеСсылки.Представление); КонецЦикла; @@ -334,7 +339,7 @@ КонецПроцедуры // Параметры: -// Форма - ФормаКлиентскогоПриложения +// Форма - ФормаКлиентскогоПриложения: // * ПараметрыУдаленияПомеченных - Структура // Процедура СоздатьРеквизитХраненияНастроек(Форма) @@ -733,7 +738,7 @@ Возврат Результат; КонецФункции -Функция УдаляемыеСсылкиВКоллекции(ЗначенияСсылочныхТипов) +Функция ЗаблокированныеУдаляемыеСсылки(УдаляемыеСсылки) ВремяСнятияБлокировки = ТекущаяДатаСеанса() - УдалениеПомеченныхОбъектовСлужебный.ВремяЖизниБлокировки(); Запрос = Новый Запрос("ВЫБРАТЬ @@ -742,9 +747,9 @@ | РегистрСведений.УдаляемыеОбъекты КАК УдаляемыеОбъекты |ГДЕ | УдаляемыеОбъекты.Объект В(&УдаляемыеОбъекты) - | И УдаляемыеОбъекты.ВремяБлокировки >= &ВремяСнятияБлокировки"); + | И УдаляемыеОбъекты.Период >= &ВремяСнятияБлокировки"); - Запрос.УстановитьПараметр("УдаляемыеОбъекты", ЗначенияСсылочныхТипов); + Запрос.УстановитьПараметр("УдаляемыеОбъекты", УдаляемыеСсылки); Запрос.УстановитьПараметр("ВремяСнятияБлокировки", ВремяСнятияБлокировки); Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ССылка"); diff --git a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовКлиент/Module.bsl b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовКлиент/Module.bsl index 0542025af..4906118ea 100644 --- a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовКлиент/Module.bsl +++ b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовКлиент/Module.bsl @@ -120,7 +120,7 @@ ОписаниеРегламентногоЗадания = СведенияОРегламентномЗаданииУдаленияПомеченных.Расписание; Расписание = Новый РасписаниеРегламентногоЗадания; ЗаполнитьЗначенияСвойств(Расписание, ОписаниеРегламентногоЗадания); - Диалог = Новый ДиалогРасписанияРегламентногоЗадания(Расписание); // АПК: 574 Процедура не поддерживается на мобильном клиенте. + Диалог = Новый ДиалогРасписанияРегламентногоЗадания(Расписание); Диалог.Показать(Обработчик); КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовПовтИсп/Module.bsl b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовПовтИсп/Module.bsl index c911ff250..fdd479847 100644 --- a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовПовтИсп/Module.bsl @@ -19,4 +19,29 @@ Возврат Результат; КонецФункции +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Возвращаемое значение: +// Строка +// +Функция ВедущиеИзмеренияРегистра(Знач ПолноеИмяРегистра) Экспорт + + МетаданныеРегистра = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяРегистра); + Результат = Новый Массив; + Контейнер = Новый Структура("Измерения", Новый Массив); + ЗаполнитьЗначенияСвойств(Контейнер, МетаданныеРегистра); + Измерения = Контейнер.Измерения; // КоллекцияОбъектовМетаданных + Для каждого Измерение Из Измерения Цикл + Контейнер = Новый Структура("Ведущее", Ложь); + ЗаполнитьЗначенияСвойств(Контейнер, Измерение); + Если Контейнер.Ведущее Тогда + Результат.Добавить(Измерение.Имя); + КонецЕсли; + КонецЦикла; + Возврат СтрСоединить(Результат, ","); + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебный/Module.bsl b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебный/Module.bsl index b8f1c6ad1..5446d4693 100644 --- a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебный/Module.bsl @@ -215,6 +215,10 @@ #КонецОбласти +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + #Область ОбработчикиПодписок Процедура ЗапретитьИспользованиеУдаляемыхОбъектовВСправочникахПриЗаписи(Источник, Отказ) Экспорт @@ -282,11 +286,7 @@ ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.УдалениеПомеченныхОбъектов); УдаляемыеОбъекты = УдалениеПомеченныхОбъектов.ПомеченныеНаУдаление(,Истина); - УдалитьПомеченныеОбъектыСлужебный( - УдаляемыеОбъекты, - "Стандартный", - Неопределено, - Истина); + УдалитьПомеченныеОбъектыСлужебный(УдаляемыеОбъекты, "Стандартный",, Истина); КонецПроцедуры @@ -299,8 +299,8 @@ // Булево // Функция ЭтоПростойТип(Тип) Экспорт - Возврат (Тип = Неопределено Или Тип = Тип("Строка") Или Тип = Тип("Число") Или Тип = Тип("Булево") Или Тип = Тип( - "Дата")); + Возврат (Тип = Неопределено Или Тип = Тип("Строка") Или Тип = Тип("Число") Или Тип = Тип("Булево") + Или Тип = Тип("Дата")); КонецФункции // Формирует список объектов метаданных, в которых разрешено наличие битых ссылок. @@ -328,61 +328,62 @@ ВремяЖизниБлокировки = ВремяЖизниБлокировки(); ВремяСнятияБлокировки = ТекущаяДатаСеанса() - ВремяЖизниБлокировки; - НачалоКонтроляУдаленияПомеченных = ТекущаяДатаСеанса(); - ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1000 | УдаляемыеОбъекты.ИдентификаторСеанса КАК ИдентификаторСеанса, - | УдаляемыеОбъекты.ВремяБлокировки КАК ВремяБлокировки + | УдаляемыеОбъекты.Период КАК ВремяБлокировки |ИЗ | РегистрСведений.УдаляемыеОбъекты КАК УдаляемыеОбъекты |ГДЕ - | &Условие + | УдаляемыеОбъекты.Период <= &ВремяСнятияБлокировки + | И &Условие | |УПОРЯДОЧИТЬ ПО | ВремяБлокировки"; - УсловиеПоВремени = "УдаляемыеОбъекты.ВремяБлокировки > &ВремяБлокировки"; + УсловиеПоВремени = "УдаляемыеОбъекты.Период > &ВремяБлокировки"; ТекстЗапросаСУсловием = СтрЗаменить(ТекстЗапроса, "&Условие", УсловиеПоВремени); - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", "ИСТИНА"); + Запрос = Новый Запрос(СтрЗаменить(ТекстЗапроса, "&Условие", "ИСТИНА")); + Запрос.УстановитьПараметр("ВремяСнятияБлокировки", ВремяСнятияБлокировки); РезультатЗапроса = Запрос.Выполнить().Выгрузить(); - ОбработанныеСеансы = Новый Массив; + ОбработанныеСеансы = Новый Соответствие; Пока РезультатЗапроса.Количество() > 0 Цикл Для Каждого ВыборкаДетальныеЗаписи Из РезультатЗапроса Цикл - Если ОбработанныеСеансы.Найти(ВыборкаДетальныеЗаписи.ИдентификаторСеанса) <> Неопределено Тогда + СеансУдаленияОбработан = ОбработанныеСеансы[ВыборкаДетальныеЗаписи.ИдентификаторСеанса]; + Если СеансУдаленияОбработан = Истина Тогда Продолжить; КонецЕсли; + Если СеансУдаленияОбработан = Неопределено Тогда + ЕстьСеансУдаления = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ВыборкаДетальныеЗаписи.ИдентификаторСеанса) <> Неопределено; + ОбработанныеСеансы[ВыборкаДетальныеЗаписи.ИдентификаторСеанса] = Не ЕстьСеансУдаления; + Иначе + ЕстьСеансУдаления = Истина; + КонецЕсли; Попытка - Если ВыборкаДетальныеЗаписи.ВремяБлокировки <= ВремяСнятияБлокировки - ИЛИ ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ВыборкаДетальныеЗаписи.ИдентификаторСеанса) = Неопределено Тогда - СнятьБлокировкуИспользованияУдаляемыхОбъектов(ВыборкаДетальныеЗаписи.ИдентификаторСеанса); - ОбработанныеСеансы.Добавить(ВыборкаДетальныеЗаписи.ИдентификаторСеанса); - КонецЕсли; + // @skip-check query-in-loop - Порционная обработка больших объемов данных. + СнятьБлокировкуИспользованияУдаляемыхОбъектов(ВыборкаДетальныеЗаписи.ИдентификаторСеанса, + ?(ЕстьСеансУдаления, ВыборкаДетальныеЗаписи.ВремяБлокировки, Неопределено)); Исключение ЗаписьЖурналаРегистрации( НСтр("ru = 'Удаление помеченных'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , НСтр("ru='Не удалось отключить проверку удаляемых объектов по причине:'") - + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЦикла; - Если ВыборкаДетальныеЗаписи.ВремяБлокировки > НачалоКонтроляУдаленияПомеченных Тогда - // Если параллельно работает удаление помеченных и дошли до новых записей, то прерываем выполнение. - Прервать; - КонецЕсли; - - ОбработанныеСеансы = Новый Массив; + ОбработанныеСеансы = Новый Соответствие; Запрос.Текст = ТекстЗапросаСУсловием; Запрос.УстановитьПараметр("ВремяБлокировки", ВыборкаДетальныеЗаписи.ВремяБлокировки); - РезультатЗапроса = Запрос.Выполнить().Выгрузить(); + Запрос.УстановитьПараметр("ВремяСнятияБлокировки", ВремяСнятияБлокировки); + РезультатЗапроса = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - Порционная обработка больших объемов данных. КонецЦикла; + + ПопробоватьОтключитьКонтрольУдаленияПомеченныхОбъектов(); КонецПроцедуры @@ -401,132 +402,57 @@ // Формирует строковый ключ для сохранения настроек отображения помеченных на удаления. // // Параметры: -// ИмяФормы - Строка - имя формы -// ИмяСписка - Строка - имя списка +// ИмяФормы - Строка +// ИмяСписка - Строка // // Возвращаемое значение: // Строка // Функция КлючНастроек(ИмяФормы, ИмяСписка) Экспорт - Ключ = "ПоказыватьПомеченныеНаУдаление/"+ИмяФормы+"/"+ИмяСписка; + Ключ = "ПоказыватьПомеченныеНаУдаление/" + ИмяФормы + "/" + ИмяСписка; Возврат Ключ; КонецФункции -// Формирует дополнительную информацию о типе. -// // Параметры: -// Тип - Тип -// КешИнформацииОТипах - Соответствие +// ТипОбъекта - Тип // // Возвращаемое значение: -// Структура: -// * ПолноеИмя - Строка -// * ПредставлениеЭлемента - Строка -// * ПредставлениеСписка - Строка -// * Вид -Строка -// * Ссылочный - Булево -// * Технический -Булево -// * Разделенный -Булево -// * Иерархический -Булево -// * ТекстЗапросаПоИерархии - Строка -// * ЕстьПодчиненные -Булево -// * ТекстЗапросаПоПодчиненным - Строка -// * ЕстьПредопределенные - Булево -// * Предопределенные - Массив из ЛюбаяСсылка +// Структура: +// * ПолноеИмя - Строка - полное имя объекта метаданных в верхнем регистре. Например, "СПРАВОЧНИК.ВАЛЮТЫ". +// * ПредставлениеЭлемента - Строка - например, "Валюта". +// * ПредставлениеСписка - Строка - например, "Валюты". +// * Вид - Строка - вид объекта метаданных в верхнем регистре. Например, "СПРАВОЧНИК". +// * Ссылочный - Булево - Истина, если объект ссылочного типа. +// * Технический - Булево - Истина, если это объект, который не нужно выводить в списке. +// * Разделенный - Булево - заполняется только при работе в модели сервиса. // -Функция ИнформацияОТипе(Тип, КешИнформацииОТипах) Экспорт - Информация = КешИнформацииОТипах.Получить(Тип); // Кэш. +Функция ИнформацияОТипе(ТипОбъекта, ДополняемаяИнформацияОТипах = Неопределено) Экспорт + + Если ДополняемаяИнформацияОТипах = Неопределено Тогда + ДополняемаяИнформацияОТипах = Новый Соответствие; + КонецЕсли; + + Информация = ДополняемаяИнформацияОТипах[ТипОбъекта]; Если Информация <> Неопределено Тогда Возврат Информация; КонецЕсли; - - МодельСервиса = ОбщегоНазначения.РазделениеВключено(); - + Информация = Новый Структура("ПолноеИмя, ПредставлениеЭлемента, ПредставлениеСписка, - |Вид, Ссылочный, Технический, Разделенный, - |Иерархический, ТекстЗапросаПоИерархии, - |ЕстьПодчиненные, ТекстЗапросаПоПодчиненным, - |ЕстьПредопределенные, Предопределенные"); + |Вид, Ссылочный, Технический, Разделенный"); + ДополняемаяИнформацияОТипах[ТипОбъекта] = Информация; + + ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипОбъекта); - // Поиск объекта метаданных. - ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); - - // Заполнение базовой информации. Информация.ПолноеИмя = ВРег(ОбъектМетаданных.ПолноеИмя()); - - // Представления: элемента и списка. + Информация.Вид = Лев(Информация.ПолноеИмя, СтрНайти(Информация.ПолноеИмя, ".") - 1); Информация.ПредставлениеЭлемента = ОбщегоНазначения.ПредставлениеОбъекта(ОбъектМетаданных); Информация.ПредставлениеСписка = ОбщегоНазначения.ПредставлениеСписка(ОбъектМетаданных); - - // Вид и его свойства. - Информация.Вид = Лев(Информация.ПолноеИмя, СтрНайти(Информация.ПолноеИмя, ".") - 1); - ЭтоСправочник = Ложь; - ЭтоДокумент = Ложь; - ЭтоПеречисление = Ложь; - ЭтоПланВидовХарактеристик = Ложь; - ЭтоПланСчетов = Ложь; - ЭтоПланВидовРасчета = Ложь; - ЭтоБизнесПроцесс = Ложь; - ЭтоЗадача = Ложь; - ЭтоПланОбмена = Ложь; - Если Информация.Вид = "СПРАВОЧНИК" Тогда - ЭтоСправочник = Истина; - ИначеЕсли Информация.Вид = "ДОКУМЕНТ" Тогда - ЭтоДокумент = Истина; - ИначеЕсли Информация.Вид = "ПЕРЕЧИСЛЕНИЕ" Тогда - ЭтоПеречисление = Истина; - ИначеЕсли Информация.Вид = "ПЛАНВИДОВХАРАКТЕРИСТИК" Тогда - ЭтоПланВидовХарактеристик = Истина; - ИначеЕсли Информация.Вид = "ПЛАНСЧЕТОВ" Тогда - ЭтоПланСчетов = Истина; - ИначеЕсли Информация.Вид = "ПЛАНВИДОВРАСЧЕТА" Тогда - ЭтоПланВидовРасчета = Истина; - ИначеЕсли Информация.Вид = "БИЗНЕСПРОЦЕСС" Тогда - ЭтоБизнесПроцесс = Истина; - ИначеЕсли Информация.Вид = "ЗАДАЧА" Тогда - ЭтоЗадача = Истина; - ИначеЕсли Информация.Вид = "ПЛАНОБМЕНА" Тогда - ЭтоПланОбмена = Истина; - КонецЕсли; - - Информация.Ссылочный = (ЭтоСправочник Или ЭтоДокумент Или ЭтоПеречисление Или ЭтоПланВидовХарактеристик - Или ЭтоПланСчетов Или ЭтоПланВидовРасчета Или ЭтоБизнесПроцесс Или ЭтоЗадача Или ЭтоПланОбмена); - Если ЭтоСправочник Или ЭтоПланВидовХарактеристик Тогда - Информация.Иерархический = ОбъектМетаданных.Иерархический; - Иначе - Информация.Иерархический = ЭтоПланСчетов; - КонецЕсли; - Если Информация.Иерархический Тогда - ШаблонЗапроса = "ВЫБРАТЬ Ссылка, ПометкаУдаления ИЗ &ПолноеИмя ГДЕ Родитель = &УдаляемыйСсылка"; - Информация.ТекстЗапросаПоИерархии = СтрЗаменить(ШаблонЗапроса, "&ПолноеИмя", Информация.ПолноеИмя); - КонецЕсли; - - Информация.ЕстьПодчиненные = Ложь; - Информация.ТекстЗапросаПоПодчиненным = ""; - Если ЭтоСправочник Или ЭтоПланВидовХарактеристик Или ЭтоПланОбмена Или ЭтоПланСчетов Или ЭтоПланВидовРасчета Тогда - - ШаблонЗапроса = "ВЫБРАТЬ Ссылка, ПометкаУдаления ИЗ #Таблица ГДЕ Владелец = &УдаляемыйСсылка"; - ТекстЗапроса = ""; - - Для Каждого Справочник Из Метаданные.Справочники Цикл - Если Не Справочник.Владельцы.Содержит(ОбъектМетаданных) Тогда - Продолжить; - КонецЕсли; - Если Информация.ЕстьПодчиненные = Ложь Тогда - Информация.ЕстьПодчиненные = Истина; - Иначе - ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС; - КонецЕсли; - ТекстЗапроса = ТекстЗапроса + СтрЗаменить(ШаблонЗапроса, "#Таблица", "Справочник." + Справочник.Имя); - КонецЦикла; - - Информация.ТекстЗапросаПоПодчиненным = ТекстЗапроса; - КонецЕсли; - + Информация.Ссылочный = ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(ОбъектМетаданных); Информация.Технический = ЭтоТехническийОбъект(Информация.ПолноеИмя); - Если МодельСервиса Тогда + + Если ОбщегоНазначения.РазделениеВключено() Тогда Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); @@ -537,20 +463,32 @@ Информация.Разделенный = ЭтоРазделенныйОбъектМетаданных; КонецЕсли; - - Если ЭтоСправочник Или ЭтоПланВидовХарактеристик Или ЭтоПланСчетов Или ЭтоПланВидовРасчета Тогда - ТекстЗапроса = "ВЫБРАТЬ Ссылка ИЗ &ИмяТаблицы ГДЕ Предопределенный И ПометкаУдаления"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", Информация.ПолноеИмя); - Запрос = Новый Запрос(ТекстЗапроса); - Информация.Предопределенные = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); - Информация.ЕстьПредопределенные = Информация.Предопределенные.Количество() > 0; - Иначе - Информация.ЕстьПредопределенные = Ложь; - КонецЕсли; - - КешИнформацииОТипах.Вставить(Тип, Информация); - Возврат Информация; + +КонецФункции + +// Параметры: +// Объекты - Массив из ЛюбаяСсылка +// ДополняемаяИнформацияОТипах - см. ИнформацияОТипах +// +// Возвращаемое значение: +// Соответствие из КлючЗначение: +// Ключ - Тип - тип объекта метаданных. Например, МетаданныеСправочник.Валюты. +// Значение - см. ИнформацияОТипе +// +Функция ИнформацияОТипах(Объекты, ДополняемаяИнформацияОТипах = Неопределено) Экспорт + + Результат = ?(ТипЗнч(ДополняемаяИнформацияОТипах) = Тип("Соответствие"), ДополняемаяИнформацияОТипах, + Новый Соответствие); + + Для каждого ОбъектСсылка Из Объекты Цикл + ТипОбъекта = ТипЗнч(ОбъектСсылка); + Если Результат[ТипОбъекта] = Неопределено Тогда + Результат[ТипОбъекта] = ИнформацияОТипе(ТипОбъекта); + КонецЕсли; + КонецЦикла; + Возврат Результат; + КонецФункции Функция ОбъединениеТаблиц(Таблица1, Таблица2, СохранятьПорядок = Ложь) Экспорт @@ -569,22 +507,6 @@ Возврат Приемник; КонецФункции -Функция ОбъединениеМассивов(Массив1, Массив2) Экспорт - Если Массив1.Количество() > Массив2.Количество() Тогда - Приемник = Новый Массив(Новый ФиксированныйМассив(Массив1)); - Источник = Массив2; - Иначе - Приемник = Новый Массив(Новый ФиксированныйМассив(Массив2)); - Источник = Массив1; - КонецЕсли; - - Для Каждого Элемент Из Источник Цикл - Приемник.Добавить(Элемент); - КонецЦикла; - - Возврат Приемник; -КонецФункции - // Параметры: // Настройки - ТаблицаЗначений: // * Реквизит - Строка @@ -623,6 +545,7 @@ // см. РезультатОбработкиУдаляемыхОбъектов // Функция ВыполнитьОбработкуПричинНеудаления(ТаблицаДействий) Экспорт + Результат = РезультатОбработкиУдаляемыхОбъектов(); ПарыЗамен = Новый Соответствие; @@ -655,9 +578,7 @@ КонецЦикла; Если ОчередьПометкиКУдалению.Количество() > 0 Тогда - Результат = ОбъединениеТаблиц( - Результат, - ОбработатьОчередьПометокНаУдаление(ОчередьПометкиКУдалению)); + Результат = ОбъединениеТаблиц(Результат, ОбработатьОчередьПометокНаУдаление(ОчередьПометкиКУдалению)); КонецЕсли; Если ПарыЗамен.Количество() > 0 Тогда @@ -671,6 +592,7 @@ КонецЕсли; Возврат Результат; + КонецФункции // Удаляет отмеченные на форме Обработки.УдалениеПомеченныхОбъектов.ОсновнаяФорма объекты @@ -681,14 +603,14 @@ // // Параметры: // ИсточникУдаляемыхОбъектов - ДеревоЗначений: -// * УдаляемыйСсылка - ЛюбаяСсылка -// - СписокЗначений из ЛюбаяСсылка +// * УдаляемыйСсылка - ЛюбаяСсылка +// - СписокЗначений из ЛюбаяСсылка // РежимУдаления - Строка // НастройкиДополнительныхРеквизитов - ТаблицаЗначений // РезультатПредыдущегоШага - см. РезультатОбработкиУдаляемыхОбъектов // ИдентификаторЗадания - УникальныйИдентификатор - уникальный идентификатор формы, из которой запущено задание. -// используется для отмены блокировки при прерывания фонового задания -// и закрытия формы. +// Используется для отмены блокировки при прерывании фонового задания +// и закрытии формы. // // Возвращаемое значение: // см. ДанныеФормыИзРезультатаУдаления @@ -697,78 +619,32 @@ РезультатПредыдущегоШага, ИдентификаторЗадания) Экспорт Если ТипЗнч(ИсточникУдаляемыхОбъектов) = Тип("СписокЗначений") Тогда - ИсточникУдаляемыхОбъектов = ДеревоПомеченныхНаУдаление(ИсточникУдаляемыхОбъектов.ВыгрузитьЗначения(), НастройкиДополнительныхРеквизитов, Новый Массив); + ИсточникУдаляемыхОбъектов = ДеревоПомеченныхНаУдаление(ИсточникУдаляемыхОбъектов.ВыгрузитьЗначения(), + НастройкиДополнительныхРеквизитов, Новый Массив); ИначеЕсли ИсточникУдаляемыхОбъектов = Неопределено Тогда - ИсточникУдаляемыхОбъектов = ДеревоПомеченныхНаУдаление(УдалениеПомеченныхОбъектов.ПомеченныеНаУдаление(,Истина), НастройкиДополнительныхРеквизитов, Новый Массив); + ИсточникУдаляемыхОбъектов = ДеревоПомеченныхНаУдаление(УдалениеПомеченныхОбъектов.ПомеченныеНаУдаление(, Истина), + НастройкиДополнительныхРеквизитов, Новый Массив); КонецЕсли; РезультатПредыдущегоШага = РезультатШагаДополнительнойОбработки(РезультатПредыдущегоШага); + УдаляемыеОбъекты = УдаляемыеОбъектыИзРезультатаДополнительнойОбработки(РезультатПредыдущегоШага); + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(УдаляемыеОбъекты, + УдаляемыеОбъектыИзДанныхФормы(ИсточникУдаляемыхОбъектов, РезультатПредыдущегоШага)); - УдаляемыеОбъекты = ОбъединениеМассивов( - УдаляемыеОбъектыИзРезультатаДополнительнойОбработки(РезультатПредыдущегоШага), - УдаляемыеОбъектыИзДанныхФормы(ИсточникУдаляемыхОбъектов, РезультатПредыдущегоШага)); - - РезультатУдаления = УдалитьПомеченныеОбъектыСлужебный(УдаляемыеОбъекты, РежимУдаления, ИдентификаторЗадания); - - Результат = ДанныеФормыИзРезультатаУдаления( - ИсточникУдаляемыхОбъектов, РезультатУдаления, НастройкиДополнительныхРеквизитов, РезультатПредыдущегоШага); + РезультатУдаления = УдалитьПомеченныеОбъектыСлужебный(УдаляемыеОбъекты, РежимУдаления, ИдентификаторЗадания); + Результат = ДанныеФормыИзРезультатаУдаления(ИсточникУдаляемыхОбъектов, РезультатУдаления, + НастройкиДополнительныхРеквизитов, РезультатПредыдущегоШага); Возврат Результат; КонецФункции #КонецОбласти -// Отключает контроль использования удаляемых объектов. -// Отключает регламентное задание, если обработаны все удаляемые объекты. -// Не используется для неразделенного сеанса в модели сервиса. -// -// Параметры: -// Идентификатор - УникальныйИдентификатор -// -Процедура СнятьБлокировкуИспользованияУдаляемыхОбъектов(Идентификатор) Экспорт - Если ОбщегоНазначения.РазделениеВключено() И НЕ ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - Возврат; - КонецЕсли; - - Набор = РегистрыСведений.УдаляемыеОбъекты.СоздатьНаборЗаписей(); - Набор.Отбор.ИдентификаторСеанса.Установить(Идентификатор); - Набор.Записать(); - - НачатьТранзакцию(); - Попытка - Блокировка = Новый БлокировкаДанных(); - Блокировка.Добавить("Константа.ПроверятьИспользованиеУдаляемыхОбъектов"); - Блокировка.Заблокировать(); - Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 Таб.ИдентификаторСеанса ИЗ РегистрСведений.УдаляемыеОбъекты КАК Таб"); - Если Запрос.Выполнить().Пустой() Тогда - Константы.ПроверятьИспользованиеУдаляемыхОбъектов.Установить(Ложь); - - Фильтр = Новый Структура( - "Метаданные", - Метаданные.РегламентныеЗадания.КонтрольУдаленияПомеченныхОбъектов); - - УстановитьПривилегированныйРежим(Истина); - - ЗаданиеПроверки = РегламентныеЗаданияСервер.НайтиЗадания(Фильтр); - - Для Каждого Задание Из ЗаданиеПроверки Цикл - РегламентныеЗаданияСервер.ИзменитьЗадание( - Задание.УникальныйИдентификатор, - Новый Структура("Использование", Ложь)); - КонецЦикла; - КонецЕсли; - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; -КонецПроцедуры - -// Записывает информацию необходимую для блокировки удаляемых объектов и включает регламентное задание +// Записывает информацию, необходимую для блокировки удаляемых объектов, и включает регламентное задание // проверки использования удаляемых объектов. // Не используется для неразделенного сеанса в модели сервиса. // -Процедура УстановитьБлокировкуИспользованияУдаляемыхОбъектов(Пакет, Идентификатор) Экспорт +Процедура УстановитьБлокировкуИспользованияУдаляемыхОбъектов(Пакет, ИдентификаторСеанса) Экспорт ЭтоМодельСервиса = ОбщегоНазначения.РазделениеВключено(); ВОбластиДанных = ?(ЭтоМодельСервиса, ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(), Ложь); @@ -776,33 +652,32 @@ Возврат; КонецЕсли; - Набор = РегистрыСведений.УдаляемыеОбъекты.СоздатьНаборЗаписей(); - Набор.Отбор.ИдентификаторСеанса.Установить(Идентификатор); + НаборЗаписей = РегистрыСведений.УдаляемыеОбъекты.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ИдентификаторСеанса.Установить(ИдентификаторСеанса); ВремяНачалаУдаления = ТекущаяДатаСеанса(); Для Каждого Элемент Из Пакет Цикл - Запись = Набор.Добавить(); - Запись.ИдентификаторСеанса = Идентификатор; + Запись = НаборЗаписей.Добавить(); + Запись.ИдентификаторСеанса = ИдентификаторСеанса; Запись.Объект = Элемент.УдаляемыйСсылка; - Запись.ВремяБлокировки = ВремяНачалаУдаления; + Запись.Период = ВремяНачалаУдаления; КонецЦикла; НачатьТранзакцию(); Попытка - Константы.ПроверятьИспользованиеУдаляемыхОбъектов.Установить(Истина); - Набор.Записать(); + Блокировка = Новый БлокировкаДанных(); + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.УдаляемыеОбъекты"); + ЭлементБлокировки.УстановитьЗначение("ИдентификаторСеанса", ИдентификаторСеанса); + Блокировка.Заблокировать(); - Фильтр = Новый Структура( - "Метаданные", - Метаданные.РегламентныеЗадания.КонтрольУдаленияПомеченныхОбъектов); - + Константы.ПроверятьИспользованиеУдаляемыхОбъектов.Установить(Истина); + НаборЗаписей.Записать(); + + Фильтр = Новый Структура("Метаданные", Метаданные.РегламентныеЗадания.КонтрольУдаленияПомеченныхОбъектов); УстановитьПривилегированныйРежим(Истина); - ЗаданиеПроверки = РегламентныеЗаданияСервер.НайтиЗадания(Фильтр); - Для Каждого Задание Из ЗаданиеПроверки Цикл - РегламентныеЗаданияСервер.ИзменитьЗадание( - Задание.УникальныйИдентификатор, + РегламентныеЗаданияСервер.ИзменитьЗадание(Задание.УникальныйИдентификатор, Новый Структура("Использование", Истина)); КонецЦикла; ЗафиксироватьТранзакцию(); @@ -812,6 +687,62 @@ КонецПопытки; КонецПроцедуры +// Отключает контроль использования удаляемых объектов. +// Отключает регламентное задание, если обработаны все удаляемые объекты. +// Не используется для неразделенного сеанса в модели сервиса. +// +// Параметры: +// ИдентификаторСеанса - УникальныйИдентификатор +// ВремяСнятияБлокировки - Дата +// +Процедура СнятьБлокировкуИспользованияУдаляемыхОбъектов(ИдентификаторСеанса, ВремяСнятияБлокировки = Неопределено) Экспорт + Если ОбщегоНазначения.РазделениеВключено() И НЕ ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Возврат; + КонецЕсли; + + НаборЗаписей = РегистрыСведений.УдаляемыеОбъекты.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ИдентификаторСеанса.Установить(ИдентификаторСеанса); + Если ВремяСнятияБлокировки <> Неопределено Тогда + НаборЗаписей.Отбор.Период.Установить(ВремяСнятияБлокировки); + КонецЕсли; + НаборЗаписей.Записать(); + + Если ВремяСнятияБлокировки = Неопределено Тогда + ПопробоватьОтключитьКонтрольУдаленияПомеченныхОбъектов(); + КонецЕсли; + +КонецПроцедуры + +Процедура ПопробоватьОтключитьКонтрольУдаленияПомеченныхОбъектов() + + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных(); + Блокировка.Добавить("Константа.ПроверятьИспользованиеУдаляемыхОбъектов"); + Блокировка.Заблокировать(); + + Если Константы.ПроверятьИспользованиеУдаляемыхОбъектов.Получить() Тогда + Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 Таб.ИдентификаторСеанса ИЗ РегистрСведений.УдаляемыеОбъекты КАК Таб"); + Если Запрос.Выполнить().Пустой() Тогда + Константы.ПроверятьИспользованиеУдаляемыхОбъектов.Установить(Ложь); + + Фильтр = Новый Структура("Метаданные", Метаданные.РегламентныеЗадания.КонтрольУдаленияПомеченныхОбъектов); + УстановитьПривилегированныйРежим(Истина); + ЗаданиеПроверки = РегламентныеЗаданияСервер.НайтиЗадания(Фильтр); + Для Каждого Задание Из ЗаданиеПроверки Цикл + РегламентныеЗаданияСервер.ИзменитьЗадание(Задание.УникальныйИдентификатор, + Новый Структура("Использование", Ложь)); + КонецЦикла; + КонецЕсли; + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + // Получить значение настроек отображения помеченных объектов из хранилища. // // Параметры: @@ -825,10 +756,6 @@ Возврат ОбщегоНазначения.ХранилищеНастроекДанныхФормЗагрузить(ИмяФормы, КлючНастроек, Ложь); КонецФункции -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - // Снимает с элементов пометку на удаление, если есть хотя бы один помеченный на удаление объект. // Если все объекты не помечены на удаление, то устанавливает пометку на удаление. // @@ -897,40 +824,41 @@ // Отмеченные - Массив из ЛюбаяСсылка // // Возвращаемое значение: -// см. УниверсальноеДеревоУдаляемыхОбъектов +// см. НовоеДеревоУдаляемыхОбъектов // Функция ДеревоПомеченныхНаУдаление(УдаляемыеОбъекты, Настройки, Отмеченные) ПометкиУстанавливаютсяВыборочно = (Отмеченные.Количество() > 0); - ДеревоЗначений = УниверсальноеДеревоУдаляемыхОбъектов(ЧислоДополнительныхРеквизитов(Настройки)); + ДеревоЗначений = НовоеДеревоУдаляемыхОбъектов(ЧислоДополнительныхРеквизитов(Настройки)); УзлыПервогоУровня = Новый Соответствие; - КешТиповУдаляемыхОбъектов = Новый Соответствие; + ИнформацияОТипах = ИнформацияОТипах(УдаляемыеОбъекты); Для Каждого УдаляемыйСсылка Из УдаляемыеОбъекты Цикл - ТипУдаляемого = ТипЗнч(УдаляемыйСсылка); - УдаляемыйИнформация = ИнформацияОТипе(ТипУдаляемого, КешТиповУдаляемыхОбъектов); + ТипУдаляемогоОбъекта = ТипЗнч(УдаляемыйСсылка); + ИнформацияОТипе = ИнформацияОТипах[ТипУдаляемогоОбъекта]; // см. ИнформацияОТипе - УзелТипа = УзлыПервогоУровня.Получить(ТипУдаляемого); + УзелТипа = УзлыПервогоУровня[ТипУдаляемогоОбъекта]; Если УзелТипа = Неопределено Тогда УзелТипа = ДеревоЗначений.Строки.Добавить(); - УзелТипа.УдаляемыйСсылка = УдаляемыйИнформация.ПолноеИмя; - УзелТипа.Представление = УдаляемыйИнформация.ПредставлениеСписка; + УзелТипа.УдаляемыйСсылка = ИнформацияОТипе.ПолноеИмя; + УзелТипа.Представление = ИнформацияОТипе.ПредставлениеСписка; УзелТипа.Пометка = Истина; УзелТипа.Количество = 0; УзелТипа.НомерКартинки = -1; УзелТипа.ЭтоОписаниеОбъектаМетаданных = Истина; - ЗаполнитьОписаниеДополнительныхРеквизитов(Настройки, УдаляемыйИнформация, УзелТипа); - УзлыПервогоУровня.Вставить(ТипУдаляемого, УзелТипа); + УзелТипа.Технический = ИнформацияОТипе.Технический; + ЗаполнитьОписаниеДополнительныхРеквизитов(Настройки, ИнформацияОТипе.ПолноеИмя, УзелТипа); + УзлыПервогоУровня[ТипУдаляемогоОбъекта] = УзелТипа; КонецЕсли; УзелТипа.Количество = УзелТипа.Количество + 1; - УзелТипа.Представление = УдаляемыйИнформация.ПредставлениеСписка + " (" + УзелТипа.Количество + ")"; + УзелТипа.Представление = ИнформацияОТипе.ПредставлениеСписка + " (" + УзелТипа.Количество + ")"; УзелУдаляемого = УзелТипа.Строки.Добавить(); - УзелУдаляемого.УдаляемыйСсылка = УдаляемыйСсылка; + УзелУдаляемого.УдаляемыйСсылка = УдаляемыйСсылка; УзелУдаляемого.Представление = Строка(УдаляемыйСсылка); УзелУдаляемого.Пометка = Истина; - УзелУдаляемого.НомерКартинки = НомерКартинки(УдаляемыйСсылка, - Истина, УдаляемыйИнформация.Вид, "Удален"); + УзелУдаляемого.НомерКартинки = НомерКартинки(УдаляемыйСсылка, Истина, ИнформацияОТипе.Вид, "Удален"); + УзелТипа.Технический = ИнформацияОТипе.Технический; Если ПометкиУстанавливаютсяВыборочно И Отмеченные.Найти(УдаляемыйСсылка) = Неопределено Тогда УзелУдаляемого.Пометка = Ложь; @@ -947,14 +875,12 @@ Возврат ДеревоЗначений; КонецФункции -Процедура ЗаполнитьОписаниеДополнительныхРеквизитов(Знач Настройки, УдаляемыйИнформация, Знач УзелТипа) - Перем Настройка; - Перем Сч; - Сч = 1; +Процедура ЗаполнитьОписаниеДополнительныхРеквизитов(Знач Настройки, Знач ПолноеИмяОбъекта, Знач УзелТипа) + Индекс = 1; Для Каждого Настройка Из Настройки Цикл - Если ВРег(Настройка.Метаданные) = УдаляемыйИнформация.ПолноеИмя Тогда - УзелТипа["Реквизит" + (Сч)] = Настройка.Представление; - Сч = Сч + 1; + Если ВРег(Настройка.Метаданные) = ПолноеИмяОбъекта Тогда + УзелТипа["Реквизит" + (Индекс)] = Настройка.Представление; + Индекс = Индекс + 1; КонецЕсли; КонецЦикла; КонецПроцедуры @@ -992,12 +918,12 @@ КонецФункции Процедура ЗаполнитьЗначениеДополнительныхРеквизитов(Знач ПомеченныйОбъектРезультат, Знач ДополнительныеРеквизиты) - Сч = 1; + Индекс = 1; ЗначениеДополнительныхРеквизитов = ДополнительныеРеквизиты[ПомеченныйОбъектРезультат.УдаляемыйСсылка]; Если ЗначениеДополнительныхРеквизитов <> Неопределено Тогда Для Каждого ЗначениеРеквизита Из ЗначениеДополнительныхРеквизитов Цикл - ПомеченныйОбъектРезультат["Реквизит" + Сч] = ЗначениеРеквизита.Значение; - Сч = Сч + 1; + ПомеченныйОбъектРезультат["Реквизит" + Индекс] = ЗначениеРеквизита.Значение; + Индекс = Индекс + 1; КонецЦикла; КонецЕсли; КонецПроцедуры @@ -1032,11 +958,14 @@ Функция ОбработатьОчередьПометокНаУдаление(ОчередьПометкиКУдалению) Результат = РезультатОбработкиУдаляемыхОбъектов(); - Для Каждого Элемент Из ОчередьПометкиКУдалению Цикл - УдаляемыйОбъект = Элемент.ПолучитьОбъект(); - УдаляемыйОбъект.ДополнительныеСвойства.Вставить("НеВыполнятьКонтрольУдаляемых"); + ПредставленияОшибок = Новый Соответствие; + ОбъектыСОшибками = Новый Массив; - Ошибки = Новый Соответствие; + Для Каждого Элемент Из ОчередьПометкиКУдалению Цикл + + Описание = Результат.Добавить(); + Описание.УдаляемыйСсылка = Элемент; + Описание.ТребуетсяУдаление = Истина; НачатьТранзакцию(); Попытка @@ -1045,34 +974,35 @@ ЭлементБлокировки.УстановитьЗначение("Ссылка", Элемент); Блокировка.Заблокировать(); + УдаляемыйОбъект = Элемент.ПолучитьОбъект(); + УдаляемыйОбъект.ДополнительныеСвойства.Вставить("НеВыполнятьКонтрольУдаляемых"); УдаляемыйОбъект.УстановитьПометкуУдаления(Истина); ЗафиксироватьТранзакцию(); - Описание = Результат.Добавить(); - Описание.УдаляемыйСсылка = Элемент; - Описание.ТребуетсяУдаление = Истина; - Исключение ОтменитьТранзакцию(); - Описание = Результат.Добавить(); - Описание.УдаляемыйСсылка = Элемент; Ошибка = ИнформацияОбОшибке(); - Описание.ТекстОшибки =КраткоеПредставлениеОшибки(Ошибка); - Ошибки.Вставить(Элемент, ПодробноеПредставлениеОшибки(Ошибка)); + Описание.ТребуетсяУдаление = Ложь; + Описание.ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(Ошибка); + + ПредставленияОшибок[Элемент] = ОбработкаОшибок.ПодробноеПредставлениеОшибки(Ошибка); + ОбъектыСОшибками.Добавить(Элемент); КонецПопытки; + КонецЦикла; - Если Ошибки.Количество() > 0 Тогда + Если ПредставленияОшибок.Количество() > 0 Тогда ТекстОшибки = Новый Массив; - Для каждого Ошибка Из Ошибки Цикл - ТекстОшибки.Добавить( - ОбщегоНазначения.ПредметСтрокой(Ошибка.Ключ) + ":" + Символы.ПС + Ошибка.Значение); + ПредставленияОбъектов = ОбщегоНазначения.ПредметыСтрокой(ОбъектыСОшибками); + Для каждого Объект Из ОбъектыСОшибками Цикл + ТекстОшибки.Добавить(ПредставленияОбъектов[Объект] + ":" + Символы.ПС + ПредставленияОшибок[Объект]); КонецЦикла; ЗаписьЖурналаРегистрации( НСтр("ru = 'Удаление помеченных'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , - НСтр("ru='Не удалось установить пометку удаления для объектов:'") + Символы.ПС + СтрСоединить(ТекстОшибки, Символы.ПС + Символы.ПС)); + НСтр("ru='Не удалось установить пометку удаления для объектов:'") + Символы.ПС + + СтрСоединить(ТекстОшибки, Символы.ПС + Символы.ПС)); КонецЕсли; @@ -1129,7 +1059,7 @@ ЗаписьЖурналаРегистрации( НСтр("ru = 'Удаление помеченных'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , - НСтр("ru='Не удалось выполнить контроль удаляемых объектов:'") + ПодробноеПредставлениеОшибки(Ошибка)); + НСтр("ru='Не удалось выполнить контроль удаляемых объектов:'") + ОбработкаОшибок.ПодробноеПредставлениеОшибки(Ошибка)); КонецПопытки; ТекстСообщения = ""; @@ -1176,28 +1106,37 @@ // * КоличествоНеУдаленных - Число // * КоличествоУдаленных - Число // * СвязиНеудаленных - см. СвязиНеудаленных -// * ДеревоПомеченныхНаУдаление - см. УниверсальноеДеревоУдаляемыхОбъектов -// * НеУдаленные - см. УниверсальноеДеревоУдаляемыхОбъектов +// * ДеревоПомеченныхНаУдаление - см. НовоеДеревоУдаляемыхОбъектов +// * НеУдаленные - см. НовоеДеревоУдаляемыхОбъектов // -Функция ДанныеФормыИзРезультатаУдаления(ДеревоУдаляемых, РезультатУдаления, НастройкиДополнительныхРеквизитов, РезультатПредыдущегоШага) - ДеревоПомеченныхНаУдаление = ДеревоФормыВУниверсальноеДерево(ДеревоУдаляемых, ЧислоДополнительныхРеквизитов( - НастройкиДополнительныхРеквизитов)); +Функция ДанныеФормыИзРезультатаУдаления(ДеревоУдаляемых, РезультатУдаления, НастройкиДополнительныхРеквизитов, + РезультатПредыдущегоШага) + + ДеревоПомеченныхНаУдаление = ДеревоФормыВУниверсальноеДерево(ДеревоУдаляемых, + ЧислоДополнительныхРеквизитов(НастройкиДополнительныхРеквизитов)); Результат = Новый Структура; Результат.Вставить("Удаленные", Новый Массив(Новый ФиксированныйМассив(РезультатУдаления.Удаленные))); - Результат.Вставить("НеУдаленные", УниверсальноеДеревоУдаляемыхОбъектов()); + Результат.Вставить("НеУдаленные", НовоеДеревоУдаляемыхОбъектов()); Результат.Вставить("ДеревоПомеченныхНаУдаление", ДеревоПомеченныхНаУдаление); Результат.Вставить("СвязиНеудаленных", СвязиНеудаленных()); Результат.Вставить("КоличествоУдаленных", 0); Результат.Вставить("КоличествоНеУдаленных", 0); - КешИнформацииОТипах = Новый Соответствие; + ПрепятствующиеУдалению = РезультатУдаления.ПрепятствующиеУдалению.ВыгрузитьКолонку("УдаляемыйСсылка"); + ИнформацияОТипах = ИнформацияОТипах(ПрепятствующиеУдалению); + + ИменаРеквизитов = Новый Массив; + ИменаРеквизитов.Добавить("ПометкаУдаления"); + ИменаРеквизитов.Добавить("Проведен"); + Реквизиты = СтандартныеПодсистемыСервер.ЗначенияРеквизитовОбъектовЕслиСуществуют( + РезультатУдаления.ПрепятствующиеУдалению.ВыгрузитьКолонку("МестоИспользования"), ИменаРеквизитов); + Для Каждого ПрепятствующийУдалению Из РезультатУдаления.ПрепятствующиеУдалению Цикл - ДобавитьСтрокуУниверсальногоДерева(Результат.НеУдаленные, ПрепятствующийУдалению.УдаляемыйСсылка, - КешИнформацииОТипах); - ДобавитьСтрокуУниверсальногоДерева(Результат.ДеревоПомеченныхНаУдаление, ПрепятствующийУдалению.УдаляемыйСсылка, - КешИнформацииОТипах); - ДобавитьСтрокуСвязейНеудаленных(Результат.СвязиНеудаленных, ПрепятствующийУдалению, КешИнформацииОТипах); + ДобавитьСтрокуДерева(Результат.НеУдаленные, ПрепятствующийУдалению.УдаляемыйСсылка, ИнформацияОТипах); + ДобавитьСтрокуДерева(Результат.ДеревоПомеченныхНаУдаление, ПрепятствующийУдалению.УдаляемыйСсылка, + ИнформацияОТипах); + ДобавитьСтрокуСвязейНеудаленных(Результат.СвязиНеудаленных, ПрепятствующийУдалению, ИнформацияОТипах, Реквизиты); КонецЦикла; Результат.ДеревоПомеченныхНаУдаление.Строки.Сортировать("Представление", Истина); @@ -1234,7 +1173,7 @@ КонецФункции Функция ДеревоФормыВУниверсальноеДерево(ДеревоУдаляемых, КоличествоДополнительныхРеквизитов) - Результат = УниверсальноеДеревоУдаляемыхОбъектов(КоличествоДополнительныхРеквизитов); + Результат = НовоеДеревоУдаляемыхОбъектов(КоличествоДополнительныхРеквизитов); СкопироватьСтроки(Результат.Строки, ДеревоУдаляемых.Строки); Возврат Результат; КонецФункции @@ -1283,46 +1222,43 @@ // Функция УдаляемыеОбъектыИзДанныхФормы(ИсточникУдаляемыхОбъектов, РезультатОбработкиОшибок = Неопределено) - Результат = Новый Массив; - Если РезультатОбработкиОшибок = Неопределено Тогда ЗапрещенныеКУдалению = РезультатОбработкиУдаляемыхОбъектов(); Иначе ЗапрещенныеКУдалению = РезультатОбработкиОшибок.Скопировать(Новый Структура("ТребуетсяУдаление", Ложь)); КонецЕсли; + Результат = Новый Массив; Найденные = ИсточникУдаляемыхОбъектов.Строки.НайтиСтроки(Новый Структура("Пометка", 1), Истина); Для Каждого СтрокаДерева Из Найденные Цикл Если ТипЗнч(СтрокаДерева.УдаляемыйСсылка) <> Тип("Строка") И ЗапрещенныеКУдалению.Найти( СтрокаДерева.УдаляемыйСсылка, "ОбнаруженныйСсылка") = Неопределено Тогда - Результат.Добавить(СтрокаДерева.УдаляемыйСсылка); КонецЕсли; КонецЦикла; Возврат Результат; + КонецФункции Функция УдаляемыеОбъектыИзРезультатаДополнительнойОбработки(РезультатОбработкиОшибок) - Результат = Новый Массив; + Результат = Новый Массив; Для Каждого Элемент Из РезультатОбработкиОшибок.НайтиСтроки(Новый Структура("ТребуетсяУдаление", Истина)) Цикл Результат.Добавить(Элемент.УдаляемыйСсылка); КонецЦикла; - Возврат Результат; + КонецФункции Функция ДеревоПомеченныхНаУдалениеБезУдаленных(ПомеченныеНаУдаление, Удаленные) Результат = ПомеченныеНаУдаление.Скопировать(); - Кеш = Новый Соответствие; - МодифицированныеРодители = Новый Соответствие; УдаляемыеОбъекты = Результат.Строки.НайтиСтроки(Новый Структура("Пометка", 1), Истина); Для Каждого Элемент Из УдаляемыеОбъекты Цикл Если Элемент.Родитель <> Неопределено И (Удаленные.Найти(Элемент.УдаляемыйСсылка) <> Неопределено - ИЛИ НЕ Элемент.ЭтоОписаниеОбъектаМетаданных И ИнформацияОТипе(ТипЗнч(Элемент.УдаляемыйСсылка), Кеш).Технический) Тогда + ИЛИ НЕ Элемент.ЭтоОписаниеОбъектаМетаданных И Элемент.Технический) Тогда МодифицированныеРодители.Вставить(Элемент.Родитель); Элемент.Родитель.Строки.Удалить(Элемент); КонецЕсли; @@ -1340,15 +1276,16 @@ Возврат Результат; КонецФункции -Процедура ДобавитьСтрокуУниверсальногоДерева(ДеревоНеУдаленные, УдаляемыйСсылка, КешИнформацииОТипах) - УдаляемыйИнформация = ИнформацияОТипе(ТипЗнч(УдаляемыйСсылка), КешИнформацииОТипах); +Процедура ДобавитьСтрокуДерева(ДеревоНеУдаленные, УдаляемыйСсылка, ИнформацияОТипах) + + ИнформацияОТипе = ИнформацияОТипах[ТипЗнч(УдаляемыйСсылка)]; // см. ИнформацияОТипе СтрокиУдаляемых = ДеревоНеУдаленные.Строки.НайтиСтроки(Новый Структура("УдаляемыйСсылка", УдаляемыйСсылка), Истина); - СтрокаНеУдаленного = ?(СтрокиУдаляемых.Количество() = 0, Неопределено, СтрокиУдаляемых[0]); + СтрокаДерева = ?(СтрокиУдаляемых.Количество() = 0, Неопределено, СтрокиУдаляемых[0]); - Если СтрокаНеУдаленного = Неопределено И Не УдаляемыйИнформация.Технический Тогда + Если СтрокаДерева = Неопределено И Не ИнформацияОТипе.Технический Тогда ГруппаНеУдаленного = ДеревоНеУдаленные.Строки.НайтиСтроки( - Новый Структура("УдаляемыйСсылка", УдаляемыйИнформация.ПолноеИмя)); + Новый Структура("УдаляемыйСсылка", ИнформацияОТипе.ПолноеИмя)); ГруппаНеУдаленного = ?(ГруппаНеУдаленного.Количество() = 0, Неопределено, ГруппаНеУдаленного[0]); @@ -1356,89 +1293,112 @@ Если ГруппаНеУдаленного = Неопределено Тогда ГруппаНеУдаленного = ДеревоНеУдаленные.Строки.Добавить(); ГруппаНеУдаленного.НомерКартинки = -1; - ГруппаНеУдаленного.УдаляемыйСсылка = УдаляемыйИнформация.ПолноеИмя; - ГруппаНеУдаленного.Представление = УдаляемыйИнформация.ПредставлениеСписка; + ГруппаНеУдаленного.УдаляемыйСсылка = ИнформацияОТипе.ПолноеИмя; + ГруппаНеУдаленного.Представление = ИнформацияОТипе.ПредставлениеСписка; КонецЕсли; ГруппаНеУдаленного.КоличествоСвязей = ГруппаНеУдаленного.КоличествоСвязей + 1; ГруппаНеУдаленного.Модифицированность = Истина; - СтрокаНеУдаленного = ГруппаНеУдаленного.Строки.Добавить(); - СтрокаНеУдаленного.УдаляемыйСсылка = УдаляемыйСсылка; - СтрокаНеУдаленного.Представление = Строка(УдаляемыйСсылка); - СтрокаНеУдаленного.НомерКартинки = НомерКартинки( - СтрокаНеУдаленного.УдаляемыйСсылка, Истина, УдаляемыйИнформация.Вид, "Удален"); + СтрокаДерева = ГруппаНеУдаленного.Строки.Добавить(); + СтрокаДерева.УдаляемыйСсылка = УдаляемыйСсылка; + СтрокаДерева.Представление = Строка(УдаляемыйСсылка); + СтрокаДерева.НомерКартинки = НомерКартинки( + СтрокаДерева.УдаляемыйСсылка, Истина, ИнформацияОТипе.Вид, "Удален"); КонецЕсли; - Если СтрокаНеУдаленного <> Неопределено Тогда - СтрокаНеУдаленного.Пометка = Истина; - СтрокаНеУдаленного.КоличествоСвязей = СтрокаНеУдаленного.КоличествоСвязей + 1; + Если СтрокаДерева <> Неопределено Тогда + СтрокаДерева.Пометка = Истина; + СтрокаДерева.КоличествоСвязей = СтрокаДерева.КоличествоСвязей + 1; КонецЕсли; + КонецПроцедуры -Процедура ДобавитьСтрокуСвязейНеудаленных(ТаблицаСвязиНеУдаленных, Причина, КешИнформацииОТипах) +Процедура ДобавитьСтрокуСвязейНеудаленных(ТаблицаСвязиНеУдаленных, Причина, ИнформацияОТипах, Реквизиты) + НомерКартинки = 0; Вид = ""; ОбнаруженныйСтатус = ""; Если Причина.Метаданные <> Неопределено И Метаданные.Константы.Содержит(Причина.Метаданные) Тогда - ОбнаруженныйТип = Тип("КонстантаМенеджерЗначения." + Причина.Метаданные.Имя); + ТипОбъекта = Тип("КонстантаМенеджерЗначения." + Причина.Метаданные.Имя); Иначе - ОбнаруженныйТип = ТипЗнч(Причина.МестоИспользования); + ТипОбъекта = ТипЗнч(Причина.МестоИспользования); КонецЕсли; - СтрокаПрепятствующегоУдалению = ТаблицаСвязиНеУдаленных.Добавить(); - СтрокаПрепятствующегоУдалению.УдаляемыйСсылка = Причина.УдаляемыйСсылка; - СтрокаПрепятствующегоУдалению.ЭтоОшибка = ЗначениеЗаполнено(Причина.ОписаниеОшибки); - СтрокаПрепятствующегоУдалению.ОбнаруженныйСсылка = ?(СтрокаПрепятствующегоУдалению.ЭтоОшибка, - Причина.ОписаниеОшибки, - Причина.МестоИспользования); + СтрокаТаблицы = ТаблицаСвязиНеУдаленных.Добавить(); + СтрокаТаблицы.УдаляемыйСсылка = Причина.УдаляемыйСсылка; + СтрокаТаблицы.ЭтоОшибка = ЗначениеЗаполнено(Причина.ОписаниеОшибки); + СтрокаТаблицы.ОбнаруженныйСсылка = ?(СтрокаТаблицы.ЭтоОшибка, + Причина.ОписаниеОшибки, Причина.МестоИспользования); - Если СтрокаПрепятствующегоУдалению.ЭтоОшибка ИЛИ Причина.Метаданные = Неопределено Тогда - СтрокаПрепятствующегоУдалению.Представление = Причина.ПодробноеОписаниеОшибки; - СтрокаПрепятствующегоУдалению.НомерКартинки = 11; + Если СтрокаТаблицы.ЭтоОшибка ИЛИ Причина.Метаданные = Неопределено Тогда + СтрокаТаблицы.Представление = Причина.ПодробноеОписаниеОшибки; + СтрокаТаблицы.НомерКартинки = 11; ИначеЕсли Причина.МестоИспользования = Неопределено Тогда - СтрокаПрепятствующегоУдалению.ОбнаруженныйСсылка = Причина.Метаданные.ПолноеИмя(); - СтрокаПрепятствующегоУдалению.ЭтоКонстанта = Истина; - СтрокаПрепятствующегоУдалению.СсылочногоТипа = Ложь; - СтрокаПрепятствующегоУдалению.Представление = ОбщегоНазначения.ПредставлениеОбъекта(Причина.Метаданные) + СтрокаТаблицы.ОбнаруженныйСсылка = Причина.Метаданные.ПолноеИмя(); + СтрокаТаблицы.ЭтоКонстанта = Истина; + СтрокаТаблицы.СсылочногоТипа = Ложь; + СтрокаТаблицы.Представление = ОбщегоНазначения.ПредставлениеОбъекта(Причина.Метаданные) + " (" + НСтр("ru = 'Константа'") + ")"; Вид = "КОНСТАНТА"; Иначе - ОбнаруженныйИнформация = ИнформацияОТипе(ОбнаруженныйТип, КешИнформацииОТипах); - - Если ОбнаруженныйИнформация.Вид = "ДОКУМЕНТ" Тогда - Значения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Причина.МестоИспользования, - "ПометкаУдаления, Проведен"); + ИнформацияОТипе = ИнформацияОТипе(ТипОбъекта, ИнформацияОТипах); + Если ИнформацияОТипе.Вид = "ДОКУМЕНТ" Тогда + Значения = Реквизиты[Причина.МестоИспользования]; ОбнаруженныйСтатус = ?(Значения.ПометкаУдаления, "Удален", ?(Значения.Проведен, "Проведен", "")); - ИначеЕсли ОбнаруженныйИнформация.Ссылочный Тогда - ОбнаруженныйСтатус = ?(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Причина.МестоИспользования, - "ПометкаУдаления"), "Удален", ""); + ИначеЕсли ИнформацияОТипе.Ссылочный Тогда + Значения = Реквизиты[Причина.МестоИспользования]; + ОбнаруженныйСтатус = ?(Значения.ПометкаУдаления, "Удален", ""); КонецЕсли; - СтрокаПрепятствующегоУдалению.СсылочногоТипа = ОбнаруженныйИнформация.Ссылочный; - - СтрокаПрепятствующегоУдалению.ПредставлениеУдаляемый = Строка(Причина.УдаляемыйСсылка); + СтрокаТаблицы.СсылочногоТипа = ИнформацияОТипе.Ссылочный; Если ОбщегоНазначения.ЭтоРегистр(Причина.Метаданные) Тогда - СтрокаПрепятствующегоУдалению.Представление = ОбщегоНазначения.ПредставлениеОбъекта(Причина.Метаданные) + СтрокаТаблицы.Представление = ОбщегоНазначения.ПредставлениеОбъекта(Причина.Метаданные) + " (" + НСтр("ru = 'Регистр'") + ")"; Иначе - СтрокаПрепятствующегоУдалению.Представление = Строка(Причина.МестоИспользования) + " (" - + ОбнаруженныйИнформация.ПредставлениеЭлемента + ")"; + СтрокаТаблицы.Представление = Строка(Причина.МестоИспользования) + " (" + + ИнформацияОТипе.ПредставлениеЭлемента + ")"; + КонецЕсли; + ИнформацияОбУдаляемом = ИнформацияОТипе(ТипЗнч(Причина.УдаляемыйСсылка), ИнформацияОТипах); + Если ИнформацияОбУдаляемом.Технический Тогда // для оптимизации + СтрокаТаблицы.ПредставлениеУдаляемый = ИнформацияОбУдаляемом.ПредставлениеЭлемента; + Иначе + СтрокаТаблицы.ПредставлениеУдаляемый = Строка(Причина.УдаляемыйСсылка); КонецЕсли; - Вид = ОбнаруженныйИнформация.Вид; + Вид = ИнформацияОТипе.Вид; КонецЕсли; - НомерКартинки = СтрокаПрепятствующегоУдалению.НомерКартинки; - СтрокаПрепятствующегоУдалению.НомерКартинки = ?(НомерКартинки <> 0, НомерКартинки, НомерКартинки( - СтрокаПрепятствующегоУдалению.ОбнаруженныйСсылка, СтрокаПрепятствующегоУдалению.СсылочногоТипа, - Вид, ОбнаруженныйСтатус)); + + НомерКартинки = СтрокаТаблицы.НомерКартинки; + СтрокаТаблицы.НомерКартинки = ?(НомерКартинки <> 0, НомерКартинки, + НомерКартинки(СтрокаТаблицы.ОбнаруженныйСсылка, СтрокаТаблицы.СсылочногоТипа, + Вид, ОбнаруженныйСтатус)); КонецПроцедуры -Функция УдалитьПомеченныеОбъектыСлужебный(УдаляемыеОбъекты, РежимУдаления = "Стандартный", ИдентификаторЗадания = Неопределено, ЭтоРегламентноеЗадание = Ложь) Экспорт +// Параметры: +// УдаляемыеОбъекты - Массив из ЛюбаяСсылка +// РежимУдаления - Строка +// ИдентификаторЗадания - УникальныйИдентификатор +// ЭтоРегламентноеЗадание - Булево +// +// Возвращаемое значение: +// Структура: +// * ПрепятствующиеУдалению - ТаблицаЗначений: +// ** УдаляемыйСсылка - ЛюбаяСсылка +// ** МестоИспользования - ЛюбаяСсылка +// ** ОбнаруженныйСтатус - Строка +// ** ПодробноеОписаниеОшибки - Строка +// ** ОписаниеОшибки - Строка +// * Удаленные - Массив из ЛюбаяСсылка +// * НеУдаленные - Массив из ЛюбаяСсылка +// * Успешно - Булево +// +Функция УдалитьПомеченныеОбъектыСлужебный(УдаляемыеОбъекты, РежимУдаления = "Стандартный", + ИдентификаторЗадания = Неопределено, ЭтоРегламентноеЗадание = Ложь) Экспорт + ДопустимыеРежимы = ДопустимыеРежимыУдаления(); - Если ДопустимыеРежимы.Найти(РежимУдаления) = Неопределено Тогда ТекстОшибки = НСтр("ru = 'Недопустимое значение параметра %1 в %2. |Ожидалось: %3; @@ -1455,15 +1415,16 @@ Результат = Новый Структура("ПрепятствующиеУдалению, Удаленные, НеУдаленные, Успешно"); - ПараметрыУдаления = Новый Структура("ПользовательскиеОбъекты", УдаляемыеОбъекты); + ПараметрыУдаления = Обработки.УдалениеПомеченныхОбъектов.ПараметрыУдаления(); + ПараметрыУдаления.ПользовательскиеОбъекты = УдаляемыеОбъекты; Если РежимУдаления = "Монопольный" Тогда УстановитьМонопольныйРежимПриНеобходимости(Истина, ИдентификаторЗадания); - ПараметрыУдаления.Вставить("Монопольно", Истина); + ПараметрыУдаления.Монопольно = Истина; ИначеЕсли РежимУдаления = "Упрощенный" Тогда - ПараметрыУдаления.Вставить("ОчищатьСсылкиВМестахИспользования", Истина); + ПараметрыУдаления.ОчищатьСсылкиВМестахИспользования = Истина; КонецЕсли; - ПараметрыУдаления.Вставить("Режим", РежимУдаления); - ПараметрыУдаления.Вставить("ЭтоРегламентноеЗадание", ЭтоРегламентноеЗадание); + ПараметрыУдаления.Режим = РежимУдаления; + ПараметрыУдаления.ЭтоРегламентноеЗадание = ЭтоРегламентноеЗадание; Попытка РезультатУдаления = Обработки.УдалениеПомеченныхОбъектов.УдалитьПомеченныеОбъекты(ПараметрыУдаления, ИдентификаторЗадания); @@ -1508,26 +1469,30 @@ Функция ЭтоТехническийОбъект(Знач ПолноеИмяОбъекта) - ЭтоТехническийОбъект = Ложь; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульОтчетыСервер = ОбщегоНазначения.ОбщийМодуль("ОтчетыСервер"); - ЭтоТехническийОбъект = МодульОтчетыСервер.ЭтоТехническийОбъект(ПолноеИмяОбъекта); + Если МодульОтчетыСервер.ЭтоТехническийОбъект(ПолноеИмяОбъекта) Тогда + Возврат Истина; + КонецЕсли; КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); - ЭтоТехническийОбъект = МодульРаботаСФайламиСлужебный.ЭтоТехническийОбъект(ПолноеИмяОбъекта); + Если МодульРаботаСФайламиСлужебный.ЭтоТехническийОбъект(ПолноеИмяОбъекта) Тогда + Возврат Истина; + КонецЕсли; КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); - ЭтоТехническийОбъект = МодульОбменДаннымиСервер.ЭтоТехническийОбъект(ПолноеИмяОбъекта); + Если МодульОбменДаннымиСервер.ЭтоТехническийОбъект(ПолноеИмяОбъекта) Тогда + Возврат Истина; + КонецЕсли; КонецЕсли; - Возврат ЭтоТехническийОбъект Или ПолноеИмяОбъекта = ВРег("Справочник.ИдентификаторыОбъектовМетаданных") - Или ПолноеИмяОбъекта = ВРег("Справочник.ИдентификаторыОбъектовРасширений") Или ПолноеИмяОбъекта = ВРег( - "Справочник.ВерсииРасширений"); + Возврат ПолноеИмяОбъекта = ВРег("Справочник.ИдентификаторыОбъектовМетаданных") + Или ПолноеИмяОбъекта = ВРег("Справочник.ИдентификаторыОбъектовРасширений") + Или ПолноеИмяОбъекта = ВРег("Справочник.ВерсииРасширений"); КонецФункции @@ -1640,14 +1605,12 @@ Возврат Ошибки КонецФункции -// Представление коллекция ДеревоПомеченныхНаУдаление и НеУдаленные -// // Параметры: // ЧислоДополнительныхРеквизитов - Число // // Возвращаемое значение: // ДеревоЗначений: -// * Пометка - Булево +// * Пометка - Число // * УдаляемыйСсылка - ЛюбаяСсылка // - Строка // * Представление - Строка @@ -1658,25 +1621,29 @@ // * КоличествоСвязей - Число // * Количество - Число - количество элементов в узле объекта метаданных (для представления) // * Модифицированность - Булево - изменялся состав группы +// * Технический - Булево - Истина, если это объект, который не нужно выводить в списке. +// * Реквизит1 - Произвольный - значение дополнительного реквизита. +// Может быть несколько колонок: Реквизит2, Реквизит3 и т.п. // -Функция УниверсальноеДеревоУдаляемыхОбъектов(ЧислоДополнительныхРеквизитов = 0) - УниверсальноеДерево = Новый ДеревоЗначений; - УниверсальноеДерево.Колонки.Добавить("Пометка", Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(1,0))); - УниверсальноеДерево.Колонки.Добавить("УдаляемыйСсылка"); - УниверсальноеДерево.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); - УниверсальноеДерево.Колонки.Добавить("ПредставлениеУдаляемый", Новый ОписаниеТипов("Строка")); - УниверсальноеДерево.Колонки.Добавить("НомерКартинки", Новый ОписаниеТипов("Число")); - УниверсальноеДерево.Колонки.Добавить("БылиОшибкиПриУдалении", Новый ОписаниеТипов("Булево")); - УниверсальноеДерево.Колонки.Добавить("ЭтоОписаниеОбъектаМетаданных", Новый ОписаниеТипов("Булево")); - УниверсальноеДерево.Колонки.Добавить("КоличествоСвязей", Новый ОписаниеТипов("Число")); - УниверсальноеДерево.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число")); - УниверсальноеДерево.Колонки.Добавить("Модифицированность", Новый ОписаниеТипов("Булево")); +Функция НовоеДеревоУдаляемыхОбъектов(ЧислоДополнительныхРеквизитов = 0) + Результат = Новый ДеревоЗначений; + Результат.Колонки.Добавить("Пометка", Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(1,0))); + Результат.Колонки.Добавить("УдаляемыйСсылка"); + Результат.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); + Результат.Колонки.Добавить("ПредставлениеУдаляемый", Новый ОписаниеТипов("Строка")); + Результат.Колонки.Добавить("НомерКартинки", Новый ОписаниеТипов("Число")); + Результат.Колонки.Добавить("БылиОшибкиПриУдалении", Новый ОписаниеТипов("Булево")); + Результат.Колонки.Добавить("ЭтоОписаниеОбъектаМетаданных", Новый ОписаниеТипов("Булево")); + Результат.Колонки.Добавить("КоличествоСвязей", Новый ОписаниеТипов("Число")); + Результат.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число")); + Результат.Колонки.Добавить("Модифицированность", Новый ОписаниеТипов("Булево")); + Результат.Колонки.Добавить("Технический", Новый ОписаниеТипов("Булево")); - Для Сч = 1 По ЧислоДополнительныхРеквизитов Цикл - УниверсальноеДерево.Колонки.Добавить("Реквизит" + Сч); + Для Индекс = 1 По ЧислоДополнительныхРеквизитов Цикл + Результат.Колонки.Добавить("Реквизит" + Индекс); КонецЦикла; - Возврат УниверсальноеДерево; + Возврат Результат; КонецФункции // Возвращаемое значение: diff --git a/SSL/src/CommonModules/УправлениеДоступом/Module.bsl b/SSL/src/CommonModules/УправлениеДоступом/Module.bsl index 2cba84d0a..42fad7ed1 100644 --- a/SSL/src/CommonModules/УправлениеДоступом/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступом/Module.bsl @@ -784,7 +784,7 @@ |%3'"), "СозданиеНового", "Объект.Ссылка", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ВызватьИсключение ТекстОшибки; КонецПопытки; КонецЕсли; @@ -801,7 +801,7 @@ |%3'"), "ТипЗначения", "Объект.Ссылка", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ВызватьИсключение ТекстОшибки; КонецПопытки; Иначе @@ -830,7 +830,7 @@ |%3'"), "Реквизит", "Объект.ГруппаДоступа", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ВызватьИсключение ТекстОшибки; КонецПопытки; Иначе @@ -846,7 +846,7 @@ |%3'"), Реквизит, "Реквизит", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ВызватьИсключение ТекстОшибки; КонецПопытки; Иначе @@ -860,7 +860,7 @@ |%3'"), Реквизит, "Реквизит", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ВызватьИсключение ТекстОшибки; КонецПопытки; КонецЕсли; @@ -1243,8 +1243,8 @@ // Соответствие из КлючИЗначение: // * Ключ - СправочникСсылка.ИдентификаторыОбъектовМетаданных - идентификатор типа; // * Значение - Структура: -// * Ключ - Строка - имя права доступа ("Чтение", "Изменение", "Добавление"); -// * Значение - Булево - если Истина, тогда право есть, иначе нет. +// ** Ключ - Строка - имя права доступа ("Чтение", "Изменение", "Добавление"); +// ** Значение - Булево - если Истина, тогда право есть, иначе нет. // Функция ПраваПоИдентификаторам(Идентификаторы = Неопределено) Экспорт @@ -1404,7 +1404,7 @@ |%3'"), ТипЗнч(СсылкаНаОбъект), Объект, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ВызватьИсключение ТекстОшибки; КонецПопытки; @@ -1624,15 +1624,15 @@ // пользователей. Если пустой, значит, назначение для пользователей. // Должны быть в пределах состава определяемого типа Пользователь. // * ВидыДоступа - СписокЗначений: -// * Значение - Строка - имя вида доступа, указанного в переопределяемом -// модуле УправлениеДоступомПереопределяемый в процедуре ПриЗаполненииВидовДоступа. -// * Представление - Строка - допустимы строки "ВначалеВсеЗапрещены" (или пустая строка), -// "ВначалеВсеРазрешены", "Предустановленный". +// ** Значение - Строка - имя вида доступа, указанного в переопределяемом +// модуле УправлениеДоступомПереопределяемый в процедуре ПриЗаполненииВидовДоступа. +// ** Представление - Строка - допустимы строки "ВначалеВсеЗапрещены" (или пустая строка), +// "ВначалеВсеРазрешены", "Предустановленный". // // * ЗначенияДоступа - СписокЗначений: -// * Значение - Строка - имя вида доступа, указанного в параметре ВидыДоступа. -// * Представление - Строка - имя предопределенного элемента, например -// "Справочник.ГруппыПользователей.ВсеПользователи". +// ** Значение - Строка - имя вида доступа, указанного в параметре ВидыДоступа. +// ** Представление - Строка - имя предопределенного элемента, например +// "Справочник.ГруппыПользователей.ВсеПользователи". // // Пример: // @@ -2253,7 +2253,7 @@ УстановитьОтключениеБезопасногоРежима(Истина); УстановитьПривилегированныйРежим(Истина); - ОтключениеОбновления = ПараметрыСеанса.ОтключениеОбновленияКлючейДоступа; + ОтключениеОбновления = ПараметрыСеанса.ОтключениеОбновленияКлючейДоступа; // См. УправлениеДоступомСлужебный.НовоеОтключениеОбновленияКлючейДоступа Стандартное = Отключить И ПланироватьОбновление; Полное = Отключить И Не ПланироватьОбновление; diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl index 0c0e159cd..f67fca2d9 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl @@ -266,6 +266,7 @@ КонецЕсли; ДобавитьТекущегоПользователя = Ложь; ЕстьИспользуемыеВидыДоступа = Ложь; + ИспользуемыеВидыДоступа = ИспользуемыеВидыДоступа(); Для Каждого ТекущийТип Из ТипыЗначений Цикл Свойства = СвойстваВидовДоступа.ПоТипамЗначений.Получить(ТекущийТип); // См. СвойстваВидаДоступа @@ -274,7 +275,7 @@ НСтр("ru = 'Тип ""%1"" не является типом значений доступа'"), Строка(ТекущийТип)); ВызватьИсключение ТекстОшибки; КонецЕсли; - Если Не ВидДоступаИспользуется(Свойства.Имя) Тогда + Если ИспользуемыеВидыДоступа.Получить(Свойства.Ссылка) = Неопределено Тогда ТекущийТекстЗапроса = ТекстЗапросаВсеЗначения; Иначе Если СвойстваВидовДоступа.ТипыЗначенийДоступаСГруппами.Получить(ТекущийТип) = Неопределено Тогда @@ -557,6 +558,7 @@ // Будущий итог после цикла. НовыеАдминистраторыИБ = Новый Соответствие; ОбновляемыеПользователиИБ = Новый Соответствие; + НекорректныеРоли = НовыеНекорректныеРоли(НовыеРолиПользователей); Для Каждого ОписаниеПользователя Из ИдентификаторыПользователейИБ Цикл @@ -630,20 +632,19 @@ Если СтарыеРоли[Строка.Роль] <> Неопределено Тогда Если РазделениеВключено И НедоступныеРоли.Получить(Строка.Роль) <> Неопределено Тогда - - ЗарегистрироватьНедоступнуюРоль(Строка, ТекущийПользователь); + ДобавитьНекорректнуюРоль(НекорректныеРоли, Строка, ТекущийПользователь, Ложь); РолиДляУдаления.Вставить(Строка.Роль, Истина); КонецЕсли; Продолжить; КонецЕсли; Если ВсеРоли.Получить(Строка.Роль) = Неопределено Тогда - ЗарегистрироватьНенайденнуюРоль(Строка, ТекущийПользователь); + ДобавитьНекорректнуюРоль(НекорректныеРоли, Строка, ТекущийПользователь, Истина); Продолжить; КонецЕсли; Если НедоступныеРоли.Получить(Строка.Роль) <> Неопределено Тогда - ЗарегистрироватьНедоступнуюРоль(Строка, ТекущийПользователь); + ДобавитьНекорректнуюРоль(НекорректныеРоли, Строка, ТекущийПользователь, Ложь); Продолжить; КонецЕсли; @@ -675,6 +676,8 @@ ЕстьИзменения = Истина; КонецЦикла; + ЗарегистрироватьНекорректныеРоли(НекорректныеРоли); + // Добавление новых администраторов. Если НовыеАдминистраторыИБ.Количество() > 0 Тогда ОбновитьРолиПользователейИБ(НовыеАдминистраторыИБ, ПарольПользователяСервиса); @@ -846,7 +849,7 @@ |%3'"), "ПриЗаполненииСписковСОграничениемДоступа", "УправлениеДоступомПереопределяемый", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ОбъектОшибки = "ОбщийМодуль.УправлениеДоступомПереопределяемый"; Ошибки.Добавить(Новый Структура("ПолноеИмя, ТекстОшибки", ОбъектОшибки, ТекстОшибки)); Возврат Ошибки; @@ -862,7 +865,7 @@ ТекстОшибки = ОшибкаОграниченияДоступа(ОбщийКонтекст, ПолноеИмя); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Если ЗначениеЗаполнено(ТекстОшибки) И ТекстыОшибок.Получить(ТекстОшибки) = Неопределено Тогда ТекстыОшибок.Вставить(ТекстОшибки, Истина); @@ -962,7 +965,7 @@ Если ДействующиеПараметры = Неопределено Тогда ОбщийКонтекст = ОбщийКонтекстРасчетаПараметровОграничения(, Истина); НовыеХранимыеПараметры = ХранимыеПараметрыОграниченияДоступа(ОбщийКонтекст); - ДействующиеПараметры = Новый Структура(НовыеХранимыеПараметры.ДляЗаписиОбъектовИПроверкиПрав.Получить()); + ДействующиеПараметры = Новый Структура(НовыеХранимыеПараметры.ДляЗаписиОбъектовИПроверкиПрав.Получить()); // см. НоваяСтруктураХранимыхПараметровЗаписи КонецЕсли; ДобавленныеСписки = Новый Соответствие; @@ -1043,29 +1046,29 @@ // когда Истина - в модуле менеджера, иначе в переопределяемом модуле. // // * ДляПользователей - Структура: -// * ПроверяемоеОграничение - Неопределено -// - Строка - проверенный текст ограничения. -// * ОписаниеОшибок - см. ОписаниеОшибок -// * ОшибкаФормированияПараметровОграничения - Неопределено -// - Строка - текст ошибки. -// * ОшибкаФормированияТекстовЗапросов - Неопределено -// - Строка - текст ошибки. -// * ОграничениеПоВладельцуВозможно - Неопределено -// - Булево - свойство проверенного ограничения. -// * ОграничениеПоВладельцуИспользуется - Неопределено -// - Булево - когда УчитыватьЗависимости указано Истина. -// * ОграниченияВРолях - Неопределено -// - Структура: -// * ШаблонДляОбъекта - Булево - если Истина, тогда используется шаблон #ДляОбъекта, -// если Ложь, тогда используется шаблон #ДляРегистра. -// * Параметры - Массив - параметры шаблона (для объекта 1, для регистра 6). -// * Значение - Строка - например, имя поля "Владелец" или -// опорного поля регистра "Организация". -// * ОграничениеВМодуле - Неопределено -// - Строка - текст ограничения, который установлен в конфигурации. -// * ПоВладельцуБезЗаписиКлючейДоступа - Неопределено -// - Булево - настройка ограничения, -// установленная в конфигурации. +// ** ПроверяемоеОграничение - Неопределено +// - Строка - проверенный текст ограничения. +// ** ОписаниеОшибок - см. ОписаниеОшибок +// ** ОшибкаФормированияПараметровОграничения - Неопределено +// - Строка - текст ошибки. +// ** ОшибкаФормированияТекстовЗапросов - Неопределено +// - Строка - текст ошибки. +// ** ОграничениеПоВладельцуВозможно - Неопределено +// - Булево - свойство проверенного ограничения. +// ** ОграничениеПоВладельцуИспользуется - Неопределено +// - Булево - когда УчитыватьЗависимости указано Истина. +// ** ОграниченияВРолях - Неопределено +// - Структура: +// *** ШаблонДляОбъекта - Булево - если Истина, тогда используется шаблон #ДляОбъекта, +// если Ложь, тогда используется шаблон #ДляРегистра. +// *** Параметры - Массив - параметры шаблона (для объекта 1, для регистра 6): +// **** Значение - Строка - например, имя поля "Владелец" или +// опорного поля регистра "Организация". +// ** ОграничениеВМодуле - Неопределено +// - Строка - текст ограничения, который установлен в конфигурации. +// ** ПоВладельцуБезЗаписиКлючейДоступа - Неопределено +// - Булево - настройка ограничения, +// установленная в конфигурации. // // * ДляВнешнихПользователей - Структура - со свойствами, как ДляПользователей. // @@ -1078,13 +1081,13 @@ // // * ТипыИзмеренийОтдельногоРегистраКлючей - Неопределено // - Структура: -// * ИмяРегистраСведений - Строка - имя регистра ключей доступа. -// * ТипыИзмерений - Строка - типы для соответствующих измерений регистра. +// ** ИмяРегистраСведений - Строка - имя регистра ключей доступа. +// ** ТипыИзмерений - Строка - типы для соответствующих измерений регистра. // // * ПредопределенныйИдентификатор - Неопределено // - Структура: -// * ИмяСправочника - Строка - имя справочника идентификаторы объектов метаданных (или расширений). -// * ИмяПредопределенного - Строка - имя предопределенного в справочнике. +// ** ИмяСправочника - Строка - имя справочника идентификаторы объектов метаданных (или расширений). +// ** ИмяПредопределенного - Строка - имя предопределенного в справочнике. // Функция РезультатПроверкиОграниченияДоступа(ПолноеИмя, ДополнительныеПараметры = Неопределено) Экспорт @@ -1092,22 +1095,6 @@ КонецФункции -// Возвращает структуру указанного текста ограничения для объекта метаданных. -// -// Параметры: -// ПолноеИмя - Строка - полное имя объекта метаданных. -// ТекстОграничения - Строка - текст ограничения, который будет разобран. -// -// Возвращаемое значение: -// см. УправлениеДоступом.СтруктураОграничения -// -Функция СтруктураОграниченияИзОписания(ПолноеИмя, ТекстОграничения) Экспорт - - Возврат РассчитаннаяСтруктураОграничения(ПолноеИмя, - ТекстОграничения, Неопределено, Неопределено, Истина); - -КонецФункции - // Добавляет обновление доступа для указанных списков или всех списков. // // Параметры: @@ -1736,7 +1723,7 @@ Обработчик.ЗапускатьИВПодчиненномУзлеРИБСФильтрами = Истина; Обработчик.Комментарий = НСтр("ru = 'Устраняет некорректное скрытие данных в некоторых списках при включенном ограничении на уровне записей.'"); Обработчик.Идентификатор = Новый УникальныйИдентификатор("b73c2481-f789-4b2d-b705-8219aea0e75d"); - Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена"; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.ГруппыДоступа.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; Обработчик.ОчередьОтложеннойОбработки = 1; Обработчик.ЧитаемыеОбъекты = "Справочник.ГруппыДоступа"; @@ -1780,6 +1767,7 @@ // Процедура ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты) Экспорт + Объекты.Добавить(Метаданные.Справочники.ПрофилиГруппДоступа); Объекты.Добавить(Метаданные.Справочники.ГруппыДоступа); КонецПроцедуры @@ -2913,12 +2901,7 @@ КонецЕсли; Если ИмяПараметра = "ОтключениеОбновленияКлючейДоступа" Тогда - Свойства = Новый Структура; - Свойства.Вставить("Стандартное", Ложь); - Свойства.Вставить("Полное", Ложь); - Свойства.Вставить("ВложенныеОтключения", Новый ФиксированныйМассив(Новый Массив)); - Свойства.Вставить("ИзмененныеСписки", Новый ХранилищеЗначения(Новый Соответствие)); - ПараметрыСеанса.ОтключениеОбновленияКлючейДоступа = Новый ФиксированнаяСтруктура(Свойства); + ПараметрыСеанса.ОтключениеОбновленияКлючейДоступа = НовоеОтключениеОбновленияКлючейДоступа(); УстановленныеПараметры.Добавить("ОтключениеОбновленияКлючейДоступа"); Возврат; КонецЕсли; @@ -3062,12 +3045,13 @@ ВидыДоступаСОтключеннымИспользованием = Новый Массив; СвойстваВидовДоступа = СвойстваВидовДоступа(); + ИспользуемыеВидыДоступа = ИспользуемыеВидыДоступа(); - Для каждого СвойстваВидаДоступа Из СвойстваВидовДоступа.Массив Цикл + Для Каждого СвойстваВидаДоступа Из СвойстваВидовДоступа.Массив Цикл ВсеВидыДоступаКромеСпециальных.Добавить(СвойстваВидаДоступа.Имя); - Если НЕ ВидДоступаИспользуется(СвойстваВидаДоступа.Ссылка) - ИЛИ ТипыЗначенийВсеРазрешеныБезИсключений.Найти(СвойстваВидаДоступа.Ссылка) <> Неопределено Тогда + Если ИспользуемыеВидыДоступа.Получить(СвойстваВидаДоступа.Ссылка) = Неопределено + Или ТипыЗначенийВсеРазрешеныБезИсключений.Найти(СвойстваВидаДоступа.Ссылка) <> Неопределено Тогда ВидыДоступаСОтключеннымИспользованием.Добавить(СвойстваВидаДоступа.Имя); КонецЕсли; @@ -3138,6 +3122,25 @@ КонецПроцедуры +// Возвращаемое значение: +// ФиксированнаяСтруктура: +// * Стандартное - Булево +// * Полное - Булево +// * ВложенныеОтключения - ФиксированныйМассив +// * ИзмененныеСписки - ХранилищеЗначения +// +Функция НовоеОтключениеОбновленияКлючейДоступа() Экспорт + + Свойства = Новый Структура; + Свойства.Вставить("Стандартное", Ложь); + Свойства.Вставить("Полное", Ложь); + Свойства.Вставить("ВложенныеОтключения", Новый ФиксированныйМассив(Новый Массив)); + Свойства.Вставить("ИзмененныеСписки", Новый ХранилищеЗначения(Новый Соответствие)); + + Возврат Новый ФиксированнаяСтруктура(Свойства); + +КонецФункции + // Только для внутреннего использования. Процедура ОбновитьПараметрыСеанса() Экспорт @@ -3622,6 +3625,7 @@ Запрос.Текст = СтрЗаменить(Запрос.Текст, "Справочник.Пользователи", ИмяТаблицы); Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекущаяТаблица", ИмяТаблицы); + // @skip-check query-in-loop - Порционная обработка данных Значения = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьГруппыЗначенийДоступа(Значения, ЕстьИзменения); @@ -3653,10 +3657,12 @@ |ГДЕ | РегистрСведенийНаборыЗначенийДоступа.Объект ЕСТЬ NULL "; Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекущаяТаблица", Метаданные.НайтиПоТипу(Тип).ПолноеИмя()); + // @skip-check query-in-loop - Порционная обработка данных Выборка = Запрос.Выполнить().Выбрать(); КоличествоДанных = КоличествоДанных + Выборка.Количество(); Пока Выборка.Следующий() Цикл + // @skip-check query-in-loop - Порционная обработка данных ОбновитьНаборыЗначенийДоступа(Выборка.Ссылка, ЕстьИзменения); КонецЦикла; КонецЕсли; @@ -3839,6 +3845,47 @@ КонецФункции +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - ОпределяемыйТип.ЗначениеДоступа - пустая ссылка основного типа вида доступа. +// * Значение - Булево - значение Истина. +// +Функция ИспользуемыеВидыДоступа() Экспорт + + Результат = Новый Соответствие; + + Если Не УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() Тогда + Возврат Результат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ИспользуемыеВидыДоступа.ТипЗначенийДоступа КАК ТипЗначенийДоступа + |ИЗ + | РегистрСведений.ИспользуемыеВидыДоступа КАК ИспользуемыеВидыДоступа"; + + УстановитьОтключениеБезопасногоРежима(Истина); + УстановитьПривилегированныйРежим(Истина); + + Выборка = Запрос.Выполнить().Выбрать(); + + УстановитьПривилегированныйРежим(Ложь); + УстановитьОтключениеБезопасногоРежима(Ложь); + + СвойстваВидовДоступа = СвойстваВидовДоступа(); + + Пока Выборка.Следующий() Цикл + Если СвойстваВидовДоступа.ПоСсылкам.Получить(Выборка.ТипЗначенийДоступа) = Неопределено Тогда + Продолжить; + КонецЕсли; + Результат.Вставить(Выборка.ТипЗначенийДоступа, Истина); + КонецЦикла; + + Возврат Результат; + +КонецФункции + // Возвращает свойства вида доступа или всех видов доступа. // // Параметры: @@ -4684,6 +4731,7 @@ Если Данные.ИмяТретьегоИзмерения = Неопределено Тогда ЗаписьНесколькимиНаборами = Ложь; Иначе + // @skip-check query-in-loop - Порционная обработка данных ЗаписьНесколькимиНаборами = ЗаписьНесколькимиНаборами(Данные, Отбор, Данные.ИмяВторогоИзмерения, Данные.ЗначенияВторогоИзмерения); КонецЕсли; @@ -5340,7 +5388,7 @@ УстановитьНовыеПраваРолейРасширений = Ложь; Если ЗначениеЗаполнено(ПараметрыСеанса.ПодключенныеРасширения) Тогда ХранилищеПравРолейРасширений = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения( - "СтандартныеПодсистемы.УправлениеДоступом.ПраваРолей"); + "СтандартныеПодсистемы.УправлениеДоступом.ПраваРолей"); // ХранилищеЗначения Если ХранилищеПравРолейРасширений = Неопределено Тогда ПраваРолейРасширений = Неопределено; @@ -5504,6 +5552,7 @@ Если СсылкаНаЗависимыйОбъект.Метаданные().ТабличныеЧасти.Найти("НаборыЗначенийДоступа") = Неопределено Тогда // Изменение объекта не требуется. + // @skip-check query-in-loop - Порционная обработка данных ЗаписатьНаборыЗначенийДоступа(СсылкаНаЗависимыйОбъект, , ОбновлениеИБ); Иначе // Изменение объекта требуется. @@ -5534,12 +5583,12 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При обновлении зависимого набора значений доступа объекта - |""%1"" возникла ошибка: + НСтр("ru = 'Не удалось обновить зависимый набор значений доступа объекта + |""%1"" по причине: | |%2'"), Строка(СсылкаНаЗависимыйОбъект), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ВызватьИсключение ТекстОшибки; КонецПопытки; КонецЕсли; @@ -6514,73 +6563,133 @@ КонецФункции -Процедура ЗарегистрироватьНедоступнуюРоль(ОписаниеРоли, Пользователь) +// Параметры: +// НовыеРолиПользователей - ТаблицаЗначений +// +// Возвращаемое значение: +// ТаблицаЗначений: +// * Пользователь - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// * РольСсылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// - СправочникСсылка.ИдентификаторыОбъектовРасширений +// * Роль - Строка - имя роли. +// +Функция НовыеНекорректныеРоли(НовыеРолиПользователей) - // Недоступные роли в профилях. - Профили = ПрофилиПользователяСРолью(Пользователь, ОписаниеРоли.РольСсылка); + Результат = НовыеРолиПользователей.Скопировать( + Новый Массив, "Пользователь, Роль, РольСсылка"); - Для Каждого Профиль Из Профили Цикл - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Управление доступом.Роль не доступна пользователю'", - ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - Метаданные.Справочники.ПрофилиГруппДоступа, - Профиль, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При обновлении ролей пользователя ""%1"" - |роль ""%2"" - |%3 - |профиля групп доступа ""%4"" - |%5 - |недоступна пользователю.'"), - Строка(Пользователь), - ОписаниеРоли.Роль, - ПолучитьНавигационнуюСсылку(ОписаниеРоли.РольСсылка), - Строка(Профиль), - ПолучитьНавигационнуюСсылку(Профиль)), - РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); + Результат.Колонки.Добавить("ЭтоНенайденнаяРоль", Новый ОписаниеТипов("Булево")); + + Возврат Результат; + +КонецФункции + +// Параметры: +// НекорректныеРоли - см. НовыеНекорректныеРоли +// ОписаниеРоли - СтрокаТаблицыЗначений +// Пользователь - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// +Процедура ДобавитьНекорректнуюРоль(НекорректныеРоли, ОписаниеРоли, Пользователь, ЭтоНенайденнаяРоль) + + НоваяСтрока = НекорректныеРоли.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ОписаниеРоли); + НоваяСтрока.Пользователь = Пользователь; + НоваяСтрока.ЭтоНенайденнаяРоль = ЭтоНенайденнаяРоль; + +КонецПроцедуры + +// Параметры: +// НекорректныеРоли - см. НовыеНекорректныеРоли +// +Процедура ЗарегистрироватьНекорректныеРоли(НекорректныеРоли) + + Если Не ЗначениеЗаполнено(НекорректныеРоли) Тогда + Возврат; + КонецЕсли; + + ПрофилиНекорректныхРолей = ПрофилиПользователейСРолями(НекорректныеРоли); + ПрофилиНекорректныхРолей.Индексы.Добавить("Пользователь, РольСсылка"); + Отбор = Новый Структура("Пользователь, РольСсылка"); + + Для Каждого НекорректнаяРоль Из НекорректныеРоли Цикл + ЗаполнитьЗначенияСвойств(Отбор, НекорректнаяРоль); + Строки = ПрофилиНекорректныхРолей.НайтиСтроки(Отбор); + Для Каждого Строка Из Строки Цикл + Если НекорректнаяРоль.ЭтоНенайденнаяРоль Тогда + ЗарегистрироватьНенайденнуюРоль(НекорректнаяРоль, Строка.Профиль); + Иначе + ЗарегистрироватьНедоступнуюРоль(НекорректнаяРоль, Строка.Профиль); + КонецЕсли; + КонецЦикла; КонецЦикла; КонецПроцедуры -Процедура ЗарегистрироватьНенайденнуюРоль(ОписаниеРоли, Пользователь) +Процедура ЗарегистрироватьНедоступнуюРоль(ОписаниеРоли, Профиль) - // Новые роли, отсутствующие в метаданных. - Профили = ПрофилиПользователяСРолью(Пользователь, ОписаниеРоли.РольСсылка); + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Управление доступом.Роль недоступна пользователю'", + ОбщегоНазначения.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + Метаданные.Справочники.ПрофилиГруппДоступа, + Профиль, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'При обновлении ролей пользователя ""%1"" + |роль ""%2"" + |%3 + |профиля групп доступа ""%4"" + |%5 + |недоступна пользователю.'"), + Строка(ОписаниеРоли.Пользователь), + ОписаниеРоли.Роль, + ПолучитьНавигационнуюСсылку(ОписаниеРоли.РольСсылка), + Строка(Профиль), + ПолучитьНавигационнуюСсылку(Профиль)), + РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); - Для Каждого Профиль Из Профили Цикл - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Управление доступом.Роль не найдена в метаданных'", - ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - Метаданные.Справочники.ПрофилиГруппДоступа, - Профиль, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При обновлении ролей пользователя ""%1"" - |роль ""%2"" - |%3 - |профиля групп доступа ""%4"" - |%5 - |не существует в метаданных.'"), - Строка(Пользователь), - ОписаниеРоли.Роль, - ПолучитьНавигационнуюСсылку(ОписаниеРоли.РольСсылка), - Строка(Профиль), - ПолучитьНавигационнуюСсылку(Профиль)), - РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); - КонецЦикла; +КонецПроцедуры + +Процедура ЗарегистрироватьНенайденнуюРоль(ОписаниеРоли, Профиль) + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Управление доступом.Роль не найдена в метаданных'", + ОбщегоНазначения.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + Метаданные.Справочники.ПрофилиГруппДоступа, + Профиль, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'При обновлении ролей пользователя ""%1"" + |роль ""%2"" + |%3 + |профиля групп доступа ""%4"" + |%5 + |не существует в метаданных.'"), + Строка(ОписаниеРоли.Пользователь), + ОписаниеРоли.Роль, + ПолучитьНавигационнуюСсылку(ОписаниеРоли.РольСсылка), + Строка(Профиль), + ПолучитьНавигационнуюСсылку(Профиль)), + РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); КонецПроцедуры Процедура ОбновитьРолиПользователейИБ(ОбновляемыеПользователиИБ, ПарольПользователяСервиса) + СообщатьВМенеджерСервиса = ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса"); + Для Каждого КлючИЗначение Из ОбновляемыеПользователиИБ Цикл РолиДляДобавления = КлючИЗначение.Значение.РолиДляДобавления; РолиДляУдаления = КлючИЗначение.Значение.РолиДляУдаления; ПользовательИБ = КлючИЗначение.Значение.ПользовательИБ; ПользовательСсылка = КлючИЗначение.Значение.ПользовательСсылка; - БылиПолныеПрава = ПользовательИБ.Роли.Содержит(Метаданные.Роли.ПолныеПрава); + Если СообщатьВМенеджерСервиса Тогда + БылиПолныеПрава = ПользовательИБ.Роли.Содержит(Метаданные.Роли.ПолныеПрава); + БылиПраваНаВход = Пользователи.ЕстьПраваДляВходаВПрограмму(ПользовательИБ); + КонецЕсли; Для Каждого КлючИЗначение Из РолиДляДобавления Цикл ПользовательИБ.Роли.Добавить(Метаданные.Роли[КлючИЗначение.Ключ]); @@ -6598,7 +6707,7 @@ НачатьТранзакцию(); Попытка ЗаписатьПользователяПриОбновленииРолей(ПользовательСсылка, - ПользовательИБ, БылиПолныеПрава, ПарольПользователяСервиса); + ПользовательИБ, БылиПолныеПрава, БылиПраваНаВход, ПарольПользователяСервиса); ЗафиксироватьТранзакцию(); Исключение @@ -6639,72 +6748,104 @@ КонецПроцедуры -// Для процедур ЗарегистрироватьНедоступнуюРоль, ЗарегистрироватьНенайденнуюРоль. -Функция ПрофилиПользователяСРолью(Пользователь, Роль) +// Параметры: +// НекорректныеРоли - см. НовыеНекорректныеРоли +// +// Возвращаемое значение: +// ТаблицаЗначений: +// * Пользователь - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// * РольСсылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// - СправочникСсылка.ИдентификаторыОбъектовРасширений +// * Профиль - СправочникСсылка.ПрофилиГруппДоступа +// +Функция ПрофилиПользователейСРолями(НекорректныеРоли) Запрос = Новый Запрос; - Запрос.УстановитьПараметр("ТекущийПользователь", Пользователь); - Запрос.УстановитьПараметр("Роль", Роль); - + Запрос.УстановитьПараметр("НекорректныеРоли", НекорректныеРоли); Запрос.УстановитьПараметр("ПустойИдентификатор", ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор()); Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ + | НекорректныеРоли.Пользователь КАК Пользователь, + | НекорректныеРоли.РольСсылка КАК РольСсылка + |ПОМЕСТИТЬ НекорректныеРоли + |ИЗ + | &НекорректныеРоли КАК НекорректныеРоли + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | НекорректныеРоли.Пользователь КАК Пользователь, + | НекорректныеРоли.РольСсылка КАК РольСсылка, | Роли.Ссылка КАК Профиль |ИЗ - | РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи - | ПО (СоставыГруппПользователей.Пользователь = &ТекущийПользователь) - | И СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь + | НекорректныеРоли КАК НекорректныеРоли + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ПО (СоставыГруппПользователей.Пользователь = НекорректныеРоли.Пользователь) | И (СоставыГруппПользователей.Используется) + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ПО (ГруппыДоступаПользователи.Пользователь = СоставыГруппПользователей.ГруппаПользователей) | И (НЕ ГруппыДоступаПользователи.Ссылка.ПометкаУдаления) | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК Роли | ПО (Роли.Ссылка = ГруппыДоступаПользователи.Ссылка.Профиль) | И (НЕ Роли.Ссылка.ПометкаУдаления) - | И (Роли.Роль = &Роль)"; + | И (Роли.Роль = НекорректныеРоли.РольСсылка)"; - Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Профиль"); + Возврат Запрос.Выполнить().Выгрузить(); КонецФункции // Для процедуры ОбновитьРолиПользователейИБ. -Процедура ЗаписатьПользователяПриОбновленииРолей(ПользовательСсылка, ПользовательИБ, БылиПолныеПрава, ПарольПользователяСервиса) +Процедура ЗаписатьПользователяПриОбновленииРолей(ПользовательСсылка, ПользовательИБ, + БылиПолныеПрава, БылиПраваНаВход, ПарольПользователяСервиса) - ПользователиСлужебный.ЗаписатьПользователяИнформационнойБазы(ПользовательИБ, - ТипЗнч(ПользовательСсылка) = Тип("СправочникСсылка.ВнешниеПользователи")); + ПользователиСлужебный.ЗаписатьПользователяИнформационнойБазы(ПользовательИБ, + ТипЗнч(ПользовательСсылка) = Тип("СправочникСсылка.ВнешниеПользователи"), + ПользовательСсылка); - Если Не ОбщегоНазначения.РазделениеВключено() Тогда + Если БылиПолныеПрава = Неопределено Тогда Возврат; КонецЕсли; ЕстьПолныеПрава = ПользовательИБ.Роли.Содержит(Метаданные.Роли.ПолныеПрава); - Если ЕстьПолныеПрава = БылиПолныеПрава Тогда + ЕстьПраваНаВход = Пользователи.ЕстьПраваДляВходаВПрограмму(ПользовательИБ); + + Если ЕстьПолныеПрава = БылиПолныеПрава + И ЕстьПраваНаВход = БылиПраваНаВход Тогда Возврат; КонецЕсли; - Если ПарольПользователяСервиса = Неопределено Тогда - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); - СеансЗапущенБезРазделителей = МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей(); + МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); + + Если ЕстьПолныеПрава <> БылиПолныеПрава Тогда + Если ПарольПользователяСервиса = Неопределено Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + СеансЗапущенБезРазделителей = МодульРаботаВМоделиСервиса.СеансЗапущенБезРазделителей(); + Иначе + СеансЗапущенБезРазделителей = Истина; + КонецЕсли; + Если СеансЗапущенБезРазделителей Тогда + Возврат; + КонецЕсли; + + ТекстОшибки = + НСтр("ru = 'Для изменения административного доступа + |требуется пароль пользователя сервиса. + | + |Операция может быть выполнена только интерактивно.'"); + ВызватьИсключение ТекстОшибки; Иначе - СеансЗапущенБезРазделителей = Истина; + МодульПользователиСлужебныйВМоделиСервиса.ЗаписатьПользователяСервиса(ПользовательСсылка, + Ложь, ПарольПользователяСервиса); КонецЕсли; - Если СеансЗапущенБезРазделителей Тогда - Возврат; - КонецЕсли; - - ТекстОшибки = - НСтр("ru = 'Для изменения административного доступа - |требуется пароль пользователя сервиса. - | - |Операция может быть выполнена только интерактивно.'"); - ВызватьИсключение ТекстОшибки; КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда - МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); - МодульПользователиСлужебныйВМоделиСервиса.ЗаписатьПользователяСервиса(ПользовательСсылка, Ложь, ПарольПользователяСервиса); + Если ЕстьПраваНаВход <> БылиПраваНаВход Тогда + МодульПользователиСлужебныйВМоделиСервиса.СообщитьЕстьПраваДляВходаВПрограмму(ПользовательСсылка, + ЕстьПраваНаВход); КонецЕсли; КонецПроцедуры @@ -7286,21 +7427,19 @@ СвойстваВидовДоступа = СвойстваВидовДоступа(); ВсеВидыДоступа = Форма.ВсеВидыДоступа; + ИспользуемыеВидыДоступа = ИспользуемыеВидыДоступа(); Для Каждого СвойстваВидаДоступа Из СвойстваВидовДоступа.Массив Цикл Строка = ВсеВидыДоступа.Добавить(); Строка.Ссылка = СвойстваВидаДоступа.Ссылка; - Строка.Используется = ВидДоступаИспользуется(Строка.Ссылка); + Строка.Используется = ИспользуемыеВидыДоступа.Получить(Строка.Ссылка) <> Неопределено; // Обеспечение уникальности представлений. Представление = ПредставлениеВидаДоступа(СвойстваВидаДоступа); - Если Не ЗначениеЗаполнено(Представление) Тогда - Представление = Строка.Имя; - КонецЕсли; Отбор = Новый Структура("Представление", Представление); Пока ВсеВидыДоступа.НайтиСтроки(Отбор).Количество() > 0 Цикл Отбор.Представление = Отбор.Представление + " "; КонецЦикла; - Строка.Представление = Представление; + Строка.Представление = Отбор.Представление; КонецЦикла; КонецПроцедуры @@ -7771,28 +7910,28 @@ // ФиксированнаяСтруктура: // * Массив - ФиксированныйМассив из см. СвойстваВидаДоступа // * ПоИменам - ФиксированноеСоответствие из КлючИЗначение: -// * Ключ - Строка -// * Значение - см. СвойстваВидаДоступа +// ** Ключ - Строка +// ** Значение - см. СвойстваВидаДоступа // * ПоСсылкам - ФиксированноеСоответствие из КлючИЗначение: -// * Ключ - СправочникСсылка -// * Значение - см. СвойстваВидаДоступа +// ** Ключ - СправочникСсылка +// ** Значение - см. СвойстваВидаДоступа // * ПоТипамЗначений - ФиксированноеСоответствие из КлючИЗначение: -// * Ключ - Тип -// * Значение - см. СвойстваВидаДоступа +// ** Ключ - Тип +// ** Значение - см. СвойстваВидаДоступа // * ПоТипамГруппИЗначений - ФиксированноеСоответствие из КлючИЗначение: -// * Ключ - Тип -// * Значение - см. СвойстваВидаДоступа +// ** Ключ - Тип +// ** Значение - см. СвойстваВидаДоступа // * ПоТипамЗначенийСИерархией - ФиксированноеСоответствие из КлючИЗначение: -// * Ключ - Тип -// * Значение - см. СвойстваВидаДоступа +// ** Ключ - Тип +// ** Значение - см. СвойстваВидаДоступа // * ЗначенияДоступаСГруппами - ФиксированноеСоответствие из КлючИЗначение: -// * Ключ - Тип -// * Значение - см. ЗначенияДоступаСГруппами +// ** Ключ - Тип +// ** Значение - см. ЗначенияДоступаСГруппами // * БезГруппДляЗначенияДоступа - ФиксированныйМассив из Строка // * СОднойГруппойДляЗначенияДоступа - ФиксированныйМассив из Строка // * ТипыЗначенийДоступаСГруппами - ФиксированноеСоответствие из КлючИЗначение: -// * Ключ - Тип -// * Значение - СправочникСсылка +// ** Ключ - Тип +// ** Значение - СправочникСсылка // Функция СвойстваВидовДоступа() Экспорт @@ -8053,18 +8192,18 @@ // Возвращаемое значение: // Структура: // * ПоТипам - Соответствие из КлючИЗначение: -// * Ключ - Тип -// * Значение - см. СвойстваВидаДоступа +// ** Ключ - Тип +// ** Значение - см. СвойстваВидаДоступа // * ПоТипамСсылок - Соответствие из КлючИЗначение: -// * Ключ - Тип -// * Значение - см. СвойстваВидаДоступа +// ** Ключ - Тип +// ** Значение - см. СвойстваВидаДоступа // * ИменаТаблицДляОбновления - Массив из Строка // * ТипыГруппЗначенийДляОбновления - Соответствие из КлючИЗначение: -// * Ключ - Тип -// * Значение - СправочникСсылка +// ** Ключ - Тип +// ** Значение - СправочникСсылка // * ПоТипамСсылокДляОбновления - Соответствие из КлючИЗначение: -// * Ключ - Тип -// * Значение - см. СвойстваВидаДоступа +// ** Ключ - Тип +// ** Значение - см. СвойстваВидаДоступа // Функция ЗначенияДоступаСГруппами() @@ -8512,7 +8651,7 @@ // * ВидДоступа - ЛюбаяСсылка - пустая ссылка основного типа значений вида доступа, // пустая ссылка владельца настроек прав. // * Право - Строка - "Чтение", "Изменение". -// - Неопределено - для вида доступа Объект. +// - Неопределено - для вида доступа Объект. // * ТаблицаОбъекта - ЛюбаяСсылка - пустая ссылка объекта метаданных, через который ограничивается доступ, // используя наборы значений доступа, например, Справочник.ПапкиФайлов. // - Неопределено - если ВидДоступа <> Неопределено. @@ -8906,24 +9045,24 @@ // Возвращаемое значение: // Структура: // * ПоТипам - ФиксированноеСоответствие из КлючИЗначение: -// * Ключ - Тип - тип ссылки или объекта из ОпределяемыйТип.ВладельцыНастроекПрав -// * Значение - ФиксированноеСоответствие из КлючИЗначение: -// ** Ключ - Строка - имя возможного права -// ** Значение - см. РегистрыСведений.НастройкиПравОбъектов.СвойстваВозможногоПрава +// ** Ключ - Тип - тип ссылки или объекта из ОпределяемыйТип.ВладельцыНастроекПрав +// ** Значение - ФиксированноеСоответствие из КлючИЗначение: +// *** Ключ - Строка - имя возможного права +// *** Значение - см. РегистрыСведений.НастройкиПравОбъектов.СвойстваВозможногоПрава // * ПоТипамСсылок - ФиксированноеСоответствие из КлючИЗначение: -// * Ключ - Тип - тип ссылки из ОпределяемыйТип.ВладельцыНастроекПрав -// * Значение - ФиксированныйМассив из см. РегистрыСведений.НастройкиПравОбъектов.СвойстваВозможногоПрава +// ** Ключ - Тип - тип ссылки из ОпределяемыйТип.ВладельцыНастроекПрав +// ** Значение - ФиксированныйМассив из см. РегистрыСведений.НастройкиПравОбъектов.СвойстваВозможногоПрава // * ПоПолнымИменам - ФиксированноеСоответствие из КлючИЗначение: -// * Ключ - Строка - владелец прав (полное имя таблицы) -// * Значение - см. РегистрыСведений.НастройкиПравОбъектов.СвойстваВозможногоПрава +// ** Ключ - Строка - владелец прав (полное имя таблицы) +// ** Значение - см. РегистрыСведений.НастройкиПравОбъектов.СвойстваВозможногоПрава // * ТипыВладельцев - ФиксированныйМассив из ОпределяемыйТип.ВладелецНастроекПрав // * ОтдельныеТаблицы - ФиксированноеСоответствие из КлючИЗначение: -// * Ключ - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// ** Ключ - СправочникСсылка.ИдентификаторыОбъектовМетаданных // - СправочникСсылка.ИдентификаторыОбъектовРасширений - идентификатор таблицы -// * Значение - Строка - полное имя таблицы +// ** Значение - Строка - полное имя таблицы // * ИерархическиеТаблицы - ФиксированноеСоответствие из КлючИЗначение: -// * Ключ - Тип - тип ссылки или объекта из ОпределяемыйТип.ВладельцыНастроекПрав -// * Значение - Булево - Истина. +// ** Ключ - Тип - тип ссылки или объекта из ОпределяемыйТип.ВладельцыНастроекПрав +// ** Значение - Булево - Истина. // Функция ВозможныеПраваДляНастройкиПравОбъектов() Экспорт @@ -9729,7 +9868,7 @@ ТипыИзмерений.ПоляРегистров.Вставить(ИмяИсходногоРегистра, ПоляРегистра); Для Каждого ИмяПоля Из ОпорныеПоля.Все Цикл - ХранилищеТиповПоля = ОпорныеПоля.ТипыВсех[ОпорныеПоля.Все.Найти(ИмяПоля)]; + ХранилищеТиповПоля = ОпорныеПоля.ТипыВсех[ОпорныеПоля.Все.Найти(ИмяПоля)]; // ХранилищеЗначения ТипыПоля = ХранилищеТиповПоля.Получить(); ПоляРегистра.Добавить(Новый Структура("Поле, Тип", ИмяПоля, ТипыПоля)); Для Каждого Тип Из ТипыПоля.Типы() Цикл @@ -9901,7 +10040,7 @@ Возврат Истина; КонецЕсли; - ОтключениеОбновления = ПараметрыСеанса.ОтключениеОбновленияКлючейДоступа; + ОтключениеОбновления = ПараметрыСеанса.ОтключениеОбновленияКлючейДоступа; // См. НовоеОтключениеОбновленияКлючейДоступа Если ОтключениеОбновления.Полное Тогда Возврат Истина; КонецЕсли; @@ -10068,6 +10207,10 @@ КонецПроцедуры // Для процедуры ПроверитьДоступКИсточнику. +// +// Возвращаемое значение: +// см. РассчитанныеПараметрыОграничения +// Функция ПараметрыОграниченияПриПроверкеДоступа(Источник, ПолноеИмя, ИдентификаторТранзакции) Возврат ПараметрыОграничения(ПолноеИмя, ИдентификаторТранзакции, Null); @@ -10693,6 +10836,10 @@ КонецЦикла; КонецЕсли; + Если Описание = "ЗаполнитьКэшПараметровОграниченияДоступа" Тогда + Возврат; + КонецЕсли; + ПараметрыПланирования = ПараметрыПланированияОбновленияДоступа(Ложь); ПараметрыПланирования.РазрешенныеКлючиДоступа = Ложь; ПараметрыПланирования.Описание = Описание; @@ -10772,6 +10919,7 @@ РезультатЗапроса = ?(РезультатыЗапроса = Неопределено, Неопределено, РезультатыЗапроса[Индекс]); ИзмененияПоЗначениямПолей.ИзмененнаяТаблица = ПолноеИмя + "." + ОписаниеТабличнойЧасти.Имя; НовыеЗначения = НовыеЗначенияТабличнойЧасти(Источник, ОписаниеТабличнойЧасти, Удаление); + // @skip-check query-in-loop - В вызываемом варианте ветка с запросом не используется ЗапланироватьОбновлениеЗависимыхУстаревшихКлючейДоступаПоЗначениямПолей(РезультатЗапроса, НовыеЗначения, ОписаниеТабличнойЧасти.НаборыПолей, ПараметрыПланирования); Индекс = Индекс + 1; @@ -10865,6 +11013,7 @@ ТекущийСоставИзменений.Свернуть(ОписаниеЗависимыхТаблиц.Ключ); КонецЕсли; ПараметрыПланирования.ВедущийОбъект.ПоЗначениямПолей.СоставИзменений = ТекущийСоставИзменений; + // @skip-check query-in-loop - В вызываемом варианте ветка с запросом не используется ЗапланироватьОбновлениеДоступа(ОписаниеЗависимыхТаблиц.Значение, ПараметрыПланирования); КонецЦикла; КонецЦикла; @@ -11335,7 +11484,7 @@ И Не Контекст.ПриИзмененииУчастниковГруппыДоступа Тогда СредиИзмененныхТиповЗначенийДоступаНетИспользуемых = Истина; - ИспользуемыеТипыЗначенийДоступа = СвойстваОграничения.ИспользуемыеТипыЗначенийДоступа.Получить(); + ИспользуемыеТипыЗначенийДоступа = СвойстваОграничения.ИспользуемыеТипыЗначенийДоступа.Получить(); // Массив из Тип Для Каждого Строка Из Контекст.ТипыЗначенийДоступа Цикл Если ИспользуемыеТипыЗначенийДоступа.Найти(Строка.ТипЗначенийДоступа) <> Неопределено Тогда СредиИзмененныхТиповЗначенийДоступаНетИспользуемых = Ложь; @@ -11502,9 +11651,9 @@ // // * СвойстваСеанса - Неопределено - если запуска не было или фоновое задание только добавлено в очередь. // - Структура - со свойствами сеанса, если обновление уже выполняется: -// * ИмяКомпьютера - Строка - одноименное свойства объекта СеансИнформационнойБазы. -// * НомерСеанса - Число - одноименное свойства объекта СеансИнформационнойБазы. -// * НачалоСеанса - Строка - одноименное свойства объекта СеансИнформационнойБазы. +// ** ИмяКомпьютера - Строка - одноименное свойства объекта СеансИнформационнойБазы. +// ** НомерСеанса - Число - одноименное свойства объекта СеансИнформационнойБазы. +// ** НачалоСеанса - Строка - одноименное свойства объекта СеансИнформационнойБазы. // // * ТекстПредупреждения - Неопределено - если запуска не было или запущено новое фоновое задание. // - Строка - описание, что обновление доступа уже запущено. @@ -11555,7 +11704,7 @@ // выполняется с той же версией динамического поколения конфигурации. СтандартныеПодсистемыСервер.ПроверитьДинамическоеОбновлениеВерсииПрограммы(); Исключение - Результат.ТекстПредупреждения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Результат.ТекстПредупреждения = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Возврат Результат; КонецПопытки; КонецЕсли; @@ -11715,7 +11864,7 @@ Если ВключитьЗадание = Задание.Использование Тогда Продолжить; КонецЕсли; - РегламентныеЗаданияСервер.ИзменитьЗадание(Задание.УникальныйИдентификатор, + РегламентныеЗаданияСервер.ИзменитьЗадание(Задание, Новый Структура("Использование", ВключитьЗадание)); КонецЦикла; УстановитьПривилегированныйРежим(Ложь); @@ -11954,7 +12103,7 @@ ВызватьИсключение; КонецЕсли; ИнформацияОбОшибке = ИнформацияОбОшибке(); - ТекстВсехОшибок = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстВсехОшибок = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); Если ПерезапускВозможен И СтандартныеПодсистемыСервер.ЭтоОшибкаТребованияПерезапускаСеанса(ИнформацияОбОшибке) Тогда ТекстВсехОшибок = ""; @@ -11968,7 +12117,7 @@ ДобавитьТекстОшибкиЗавершения(ТекстВсехОшибок, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось завершить потоки обновления доступа по причине: |%1'"), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); КонецПопытки; Попытка @@ -11978,7 +12127,7 @@ ДобавитьТекстОшибкиЗавершения(ТекстВсехОшибок, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось отменить фоновые задания потоков обновления доступа по причине: |%1'"), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); КонецПопытки; ДобавитьТекстОшибкиЗавершения(ТекстВсехОшибок, ТекстОшибкиПланирования); @@ -12477,7 +12626,7 @@ ОбновитьВсе = Ложь; КонецЕсли; - Контекст = Новый Структура; + Контекст = НовыйКонтекстОбновленияДоступа(); Контекст.Вставить("ОписаниеОсновногоСеанса", ОписаниеОсновногоСеанса); Контекст.Вставить("ТекущееФоновоеЗадание", ОписаниеОсновногоСеанса.ФоновоеЗадание); Контекст.Вставить("Задания", ТаблицаЗаданийОбновления()); @@ -12534,6 +12683,7 @@ Контекст.ОбработкаЗавершена = Истина; ЗаполнитьКоличествоПотоков(Контекст); + // @skip-check query-in-loop - Порционная обработка данных ОбработатьВыполненныеЗадания(Контекст); Если Контекст.ОбновлениеОтменено Или Контекст.ТребуетсяПерезапускСеанса Тогда @@ -12579,6 +12729,7 @@ Для Каждого Задание Из ЗаданияДляЗапуска Цикл Пока ЗанятыеПотоки.Количество() >= Контекст.КоличествоПотоков Цикл + // @skip-check query-in-loop - Порционная обработка данных ОбработатьВыполненныеЗадания(Контекст); Если Контекст.ОбновлениеОтменено Или Контекст.ТребуетсяПерезапускСеанса Тогда @@ -12592,6 +12743,7 @@ ПрерватьПроход = Истина; Прервать; КонецЕсли; + // @skip-check query-in-loop - Порционная обработка данных ПодождатьОсвобожденияПотока(Контекст, Истина); Если Не Контекст.ПервыйПроход И ТекущаяУниверсальнаяДатаВМиллисекундах() > МоментПрерыванияПрохода Тогда @@ -12604,6 +12756,7 @@ Прервать; КонецЕсли; Если ЗанятыеПотоки.Количество() < Контекст.КоличествоПотоков Тогда + // @skip-check query-in-loop - Порционная обработка данных ЗапуститьОбновлениеДоступаСписка(Задание, Контекст); Если ЗначениеЗаполнено(Контекст.ТекстОшибкиЗавершения) Или Контекст.ОбновлениеОтменено @@ -12615,9 +12768,10 @@ Если Не Контекст.ЕстьЗапущенноеЗадание И (ЗанятыеПотоки.Количество() >= Контекст.КоличествоПотоков Или Не Контекст.ЕстьОтложенныеЗадания) Тогда - + // @skip-check query-in-loop - Порционная обработка данных ПодождатьОсвобожденияПотока(Контекст, Истина); КонецЕсли; + // @skip-check query-in-loop - Порционная обработка данных ОбработатьВыполненныеЗадания(Контекст); Контекст.ПервыйПроход = Ложь; КонецЦикла; @@ -12639,6 +12793,40 @@ КонецПроцедуры +// Возвращаемое значение: +// Структура: +// * ОписаниеОсновногоСеанса - см. ОписаниеОсновногоСеанса +// * ТекущееФоновоеЗадание - ФоновоеЗадание +// * Задания - см. ТаблицаЗаданийОбновления +// * ЗаданияДляЗапуска - Массив из СтрокаТаблицыЗначений: см. ТаблицаЗаданийОбновления +// * ЗанятыеПотоки - Соответствие из КлючИЗначение: +// ** Ключ - УникальныйИдентификатор +// ** Значение - см. НовыйПоток +// * СвободныеПотоки - Массив из см. НовыйПоток +// * ГраницаОбновленияЗаданий - Дата +// * ОбщиеПараметрыОбновления - см. ОписаниеОбщихПараметровОбновления +// * ОбновлениеВЭтомСеансе - Булево +// * КоличествоПотоков - Число +// * ДатаПолногоЗавершения - Дата +// * ТекстОшибкиЗавершения - Строка +// * ЕстьОтложенныеЗадания - Булево +// * ЕстьЗапущенноеЗадание - Булево +// * ОбработкаЗавершена - Булево +// * ОбновлениеОтменено - Булево +// * ТребуетсяПерезапускСеанса - Булево +// * МаксимумПорцийИзИсходной - Число +// * КоличествоДополнительныхПорций - Число +// * ЕстьДлительноеЗаданиеПолученияПорцийЭлементовДанных - Булево +// * МаксимальноеКоличествоСекундБыстрогоПолученияПорцийЭлементовДанных - Число +// * ИдентификаторыОтключенныхОбъектовМетаданных - Соответствие +// * ИдентификаторСправочникаНаборыГруппДоступа - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// +Функция НовыйКонтекстОбновленияДоступа() + + Возврат Новый Структура; + +КонецФункции + // Для процедуры ВыполнитьОбновлениеДоступаНаУровнеЗаписей. Процедура ЗапланироватьОбработкуУстаревшихЭлементов(ТекстОшибкиПланирования, ПоследнееПланированиеОбработкиУстаревшихЭлементов) @@ -12660,7 +12848,7 @@ ТекстОшибкиПланирования = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось запланировать обработку устаревших элементов ограничения доступа по причине: |%1'"), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; КонецПроцедуры @@ -12716,6 +12904,38 @@ КонецПроцедуры // Для процедуры ВыполнитьОбновлениеДоступа. +// Возвращаемое значение: +// ТаблицаЗначений: +// * ЕстьТочечноеЗадание - Булево +// * ЕстьНачальноеОбновлениеТочечногоЗадания - Дата +// * ДатаПоследнегоЗапускаТочечногоЗадания - Дата +// * ДатаДобавленияТочечногоЗадания - Дата +// * УровеньЗависимости - Число +// * ЗависимыеСписки - Массив +// - Строка +// * ЕстьНачальноеОбновление - Булево +// * ЕстьПерезапуск - Булево +// * ДатаПоследнегоЗапускаОбщегоЗадания - Дата +// * ЕстьДатаПоследнегоОбновленногоЭлемента - Булево +// * ДатаПоследнегоОбновленногоЭлемента - Дата +// * ДатаДобавленияОбщегоЗадания - Дата +// * ИдентификаторСписка - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// - СправочникСсылка.ИдентификаторыОбъектовРасширений +// * ДляВнешнихПользователей - Булево +// * ЭтоОбновлениеПрав - Булево +// * Запускать - Булево +// * ЗанятыеПотоки - Соответствие из КлючИЗначение: +// ** Ключ - УникальныйИдентификатор +// ** Значение - см. НовыйПоток +// * НаборПорций - Массив из см. ПорцияИзНабора +// * КоличествоПорцийДляОбработки - Число +// * ИндексСледующейПорцииДляОбработки - Число +// * Пропустить - Булево +// * Удалить - Булево +// * ПорядокВидаКлючаДанных - Число +// * ЭтоОбработкаУстаревшихЭлементов - Булево +// * ОбновитьУровеньЗависимости - Булево +// Функция ТаблицаЗаданийОбновления() ТипыИдентификаторов = Новый Массив; @@ -12788,6 +13008,16 @@ КонецФункции // Для процедуры ВыполнитьОбновлениеДоступа. +// +// Возвращаемое значение: +// Структура: +// * ИдентификаторПотока - УникальныйИдентификатор +// * ФоновоеЗадание - ФоновоеЗадание +// * Задание - СтрокаТаблицыЗначений: см. ТаблицаЗаданийОбновления +// * ОтменитьЗадание - Булево +// * ПорцияИзНабора - см. ПорцияИзНабора +// * ДатаОсвобождения - Дата +// Функция НовыйПоток() Поток = Новый Структура; @@ -12817,7 +13047,7 @@ // * ОбработкаЗавершена - Булево // * МаксимумМиллисекундОбработки - Число // * ИдентификаторСправочникаНаборыГруппДоступа - СправочникСсылка.ИдентификаторыОбъектовМетаданных -// * Кэш - Структура +// * Кэш - см. НовыйКэшКонтекста // * МаксимумПорцийИзИсходной - Число // Функция ОписаниеОбщихПараметровОбновления(Контекст = Неопределено) @@ -12970,9 +13200,9 @@ Процедура ДобавитьЗаданияОбновленияДоступа(РезультатыЗапроса, Контекст) Если Контекст.Свойство("Кэш") Тогда - Кэш = Контекст.Кэш; + Кэш = Контекст.Кэш; // см. НовыйКэшКонтекста Иначе - Кэш = Новый Структура; + Кэш = НовыйКэшКонтекста(); Контекст.Вставить("Кэш", Кэш); Контекст.Вставить("ИдентификаторыПоПолнымИменам", Новый Соответствие); Контекст.Вставить("ВерсияПараметровОграничения"); @@ -13074,6 +13304,18 @@ КонецПроцедуры +// Для функции ДобавитьЗаданияОбновленияДоступа. +// +// Возвращаемое значение: +// Структура: +// * ОбъектыМетаданныхПоИдентификаторам - Соответствие +// +Функция НовыйКэшКонтекста() + + Возврат Новый Структура; + +КонецФункции + // Для процедур ДобавитьЗаданияОбновленияДоступа, ОбновитьСвойстваЗадания и // функции ЗапуститьОбновлениеДоступаСписка. // @@ -13122,8 +13364,11 @@ Или СвойстваВедущегоСписка.ПоКлючамДоступа = Неопределено Тогда Продолжить; КонецЕсли; - ЗависимыеСписки = СвойстваВедущегоСписка.ПоКлючамДоступа[?(Задание.ДляВнешнихПользователей, - "ДляВнешнихПользователей", "ДляПользователей")]; + Если Задание.ДляВнешнихПользователей Тогда + ЗависимыеСписки = СвойстваВедущегоСписка.ПоКлючамДоступа.ДляВнешнихПользователей; + Иначе + ЗависимыеСписки = СвойстваВедущегоСписка.ПоКлючамДоступа.ДляПользователей; + КонецЕсли; Если ЗависимыеСписки = Неопределено Тогда Продолжить; КонецЕсли; @@ -13133,7 +13378,7 @@ Если Задание.ЗависимыеСписки = Неопределено Тогда Задание.ЗависимыеСписки = Новый Массив; КонецЕсли; - ЗаданиеЗависимыеСписки = Задание.ЗависимыеСписки; // Массив + ЗаданиеЗависимыеСписки = Задание.ЗависимыеСписки; ЗаданиеЗависимыеСписки.Добавить(ИдентификаторЗависимого); ОтборЗадания.ИдентификаторСписка = ИдентификаторЗависимого; Найденные = ВедущиеСпискиПоЗависимым.НайтиСтроки(ОтборЗадания); @@ -13501,7 +13746,9 @@ ГраницаОжидания = ТекущаяДатаСеанса() + 15; КонецЕсли; Пока Контекст.ЗанятыеПотоки.Количество() > 0 Цикл + // @skip-check query-in-loop - Порционная обработка данных ПодождатьОсвобожденияПотока(Контекст); + // @skip-check query-in-loop - Порционная обработка данных ОбработатьВыполненныеЗадания(Контекст); Если ТекущаяДатаСеанса() > ГраницаОжидания Тогда Прервать; @@ -13924,6 +14171,7 @@ Или Контекст.ЗанятыеПотоки.Количество() = 0 Тогда Прервать; КонецЕсли; + // @skip-check query-in-loop - Порционная обработка данных Если Не Запрос.Выполнить().Пустой() Тогда Прервать; КонецЕсли; @@ -13983,7 +14231,7 @@ Исключение ПредставлениеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось отменить фоновое задание потока по причине: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ЗарегистрироватьОшибкуОбновленияДоступа(ТекстОшибкиОбновленияСКонтекстом( ПредставлениеОшибки, Поток.Задание, Истина), Контекст); КонецПопытки; @@ -14506,7 +14754,7 @@ Результат.Вставить("ОбработкаЗавершена", Ложь); Результат.Вставить("ТекстОшибкиЗавершения", ""); Попытка - ОбщиеПараметрыОбновления = Выборка.Параметры.Получить(); + ОбщиеПараметрыОбновления = Выборка.Параметры.Получить(); // см. ОписаниеОбщихПараметровОбновления ЗаполнитьЗначенияСвойств(Результат, ОбщиеПараметрыОбновления); ОбщиеПараметрыОбновления.Вставить("Кэш", Кэш); Контекст.КоличествоСекундОжиданияДоПоискаНовогоЗадания = @@ -14528,7 +14776,7 @@ КонецЕсли; Исключение ДобавитьТекстОшибкиЗавершения(Результат.ТекстОшибкиЗавершения, ТекстОшибкиОбновленияСКонтекстом( - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Результат)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Результат)); КонецПопытки; ЗаписатьРезультатОбновленияДоступаСпискаВФоне(Результат, Выборка.Параметры, Контекст); КонецЦикла; @@ -15107,7 +15355,7 @@ Функция ТекстОшибкиОбновленияСКонтекстом(ИнформацияОбОшибке, ОбщиеПараметрыОбновления, УстранимаяОшибка = Ложь) Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); Иначе ПредставлениеОшибки = Строка(ИнформацияОбОшибке); КонецЕсли; @@ -15123,17 +15371,17 @@ Если ОбщиеПараметрыОбновления.ДляВнешнихПользователей Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При обновлении ключей доступа к элементам данных списка + НСтр("ru = 'Не удалось обновить ключи доступа к элементам данных списка |""%1"" (для внешних пользователей) - |возникла ошибка: + |по причине: |%2'"), Строка(ОбщиеПараметрыОбновления.ИдентификаторСписка), ПредставлениеОшибки); Иначе ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При обновлении ключей доступа к элементам данных списка + НСтр("ru = 'Не удалось обновить ключи доступа к элементам данных списка |""%1"" (для пользователей) - |возникла ошибка: + |по причине: |%2'"), Строка(ОбщиеПараметрыОбновления.ИдентификаторСписка), ПредставлениеОшибки); @@ -15143,17 +15391,17 @@ Если ОбщиеПараметрыОбновления.ДляВнешнихПользователей Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При обновлении ключей доступа внешних пользователей списка + НСтр("ru = 'Не удалось обновить ключи доступа внешних пользователей списка |""%1"" - |возникла ошибка: + |по причине: |%2'"), Строка(ОбщиеПараметрыОбновления.ИдентификаторСписка), ПредставлениеОшибки); Иначе ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При обновлении ключей доступа пользователей списка + НСтр("ru = 'Не удалось обновить ключи доступа пользователей списка |""%1"" - |возникла ошибка: + |по причине: |%2'"), Строка(ОбщиеПараметрыОбновления.ИдентификаторСписка), ПредставлениеОшибки); @@ -15214,7 +15462,7 @@ ВызватьИсключение; КонецЕсли; ИнформацияОбОшибке = ИнформацияОбОшибке(); - ТекстОшибкиТекущейПопытки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстОшибкиТекущейПопытки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Если Показатели <> Неопределено И Не ЗначениеЗаполнено(ТекстОшибкиТекущейПопытки) Тогда СнятьПоказателиВыполненияЗадания(Показатели); @@ -15232,6 +15480,7 @@ ПопыткаВыполнения = ПопыткаВыполнения + 1; Если ПопыткаВыполнения < 9 И Не ЗначениеЗаполнено(ТекстОшибкиТребуетсяПерезапуск) Тогда Для Счетчик = 1 По ПопыткаВыполнения Цикл + // @skip-check query-in-loop - Порционная обработка данных Если ОбновлениеДоступаОтменено() Тогда Прервать; КонецЕсли; @@ -15244,6 +15493,7 @@ КонецЦикла; КонецЕсли; КонецЦикла; + // @skip-check query-in-loop - Порционная обработка данных Если Не ОбновлениеДоступаОтменено() Тогда Продолжить; КонецЕсли; @@ -15330,6 +15580,7 @@ ПараметрыОбновления.Вставить("ЕстьЗадания", Истина); ПараметрыОбновления.Вставить("ТочечноеЗадание", Неопределено); ПараметрыОбновления.Вставить("ПоследнийОбновленныйЭлемент", НачальныйЭлемент(ПараметрыОбновления)); + // @skip-check query-in-loop - Порционная обработка данных ПодготовитьПланОбновления(ПараметрыОбновления, ПодготовкаЗавершена); КонецЦикла; @@ -15500,6 +15751,125 @@ КонецФункции // Для процедура ВыполнитьОбновлениеДоступаСписка. +// +// Возвращаемое значение: +// Структура: +// * ЭтоОбновлениеПрав - Булево +// * ИдентификаторСписка - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// - СправочникСсылка.ИдентификаторыОбъектовРасширений +// * ДляВнешнихПользователей - Булево +// * Кэш - см. НовыйКэшКонтекста +// * ДатаНачала - Дата +// * ДатаОкончания - Дата +// * МаксимумПорцийИзИсходной - Число +// * ИдентификаторСправочникаНаборыГруппДоступа - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// * ГраницаВремениОбработки - Дата +// +// Свойства, если ЭтоСправочникНаборыГруппДоступа. +// * СписокСДатой - Булево +// * СписокСПериодом - Булево +// * ЭтоСсылочныйТип - Булево +// * ПустойНаборГруппДоступа - СправочникСсылка.НаборыГруппДоступа +// +// Свойства, если не ЭтоСправочникНаборыГруппДоступа. +// * ИдентификаторТранзакции - УникальныйИдентификатор +// * ЗависимыеСпискиПоКлючамДоступа - Массив из Строка - полные имена списков +// +// Свойства добавляемые в процессе работы. +// * ЕстьИзмененияПрав - Булево +// * ОбновитьПраваНаКлючи - Булево +// * ПоследнийОбновленныйЭлемент - см. НачальныйЭлемент +// * НовыйПоследнийОбновленныйЭлемент - см. НачальныйЭлемент +// * ПерезапускОбновления - Булево +// * ЕстьЗадания - Булево +// * ТочечноеЗадание - см. ПодготовленноеТочечноеЗадание +// * НаборПорций - Массив из см. ПорцияИзНабора +// * ТипПользователя - Тип +// * ТипГруппыПользователей - Тип +// * ТипГруппыДоступа - Тип +// * ПустаяГруппаДоступа - СправочникСсылка.ГруппыДоступа +// * ПраваГруппДоступаСписка - см. НовыеПраваГруппДоступаСписка +// * ПользователиГруппПользователей - см. НовыеПользователиГруппПользователей +// * ГруппыПользователейКакЗначенияДоступа - см. НовыеГруппыПользователейКакЗначенияДоступа +// * УчастникиГруппДоступа - см. НовыеУчастникиГруппДоступа +// * ГруппыПользователейГруппДоступа - см. НовыеГруппыПользователейГруппДоступа +// * ЗначенияГруппДоступа - см. НовыеЗначенияГруппДоступа +// * РолиПрофилейГруппДоступа - см. НовыеРолиПрофилейГруппДоступа +// * ГруппыДоступаПрофилей - см. НовыеГруппыДоступаПрофилей +// * ПраваНаСпискиВедущихКлючейДоступа - см. НовыеПраваНаСпискиВедущихКлючейДоступа +// * ПраваНаВедущиеКлючиДоступа - см. НовыеПраваНаВедущиеКлючиДоступа +// * ПраваНаВедущиеСписки - см. НовыеПраваНаВедущиеСписки +// * ПраваПоВладельцамНастроекПрав - см. НовыеПраваПоВладельцамНастроекПрав +// * МодельОбъектовВПамяти - см. МодельОбъектовВПамяти +// +// Копия свойств из ПараметрыОграниченияПоСтруктуреОграничения. +// * Список - Строка +// * ДляВнешнихПользователей - Булево +// * Версия - Строка +// * ВедущиеСписки - см. НовыеВедущиеСписки +// * ДоступЗапрещен - Булево +// * ОграничениеОтключено - Булево +// * ОграничениеЧтенияОтключено - Булево +// * ПолеВладельца - см. НовоеПолеВладельца +// * ТребуетсяОграничениеПоВладельцу - Булево +// * ИспользуетсяОграничениеПоВладельцу - Булево +// * РассчитыватьПраваПользователей - Булево +// * ЕстьЗависимыеСпискиБезЗаписиКлючейДоступа +// * ЧтениеРазрешеноДляВсехПользователей - Булево +// * ИзменениеРазрешеноДляВсехПользователей - Булево +// * ЕстьВедущиеКлючиДоступа - Булево +// * ЕстьВедущиеСпискиПоПравам - Булево +// * ЕстьФункцияПравоДоступаИлиРольДоступна - Булево +// * ТипыВладельцевНастроекПрав - ФиксированноеСоответствие +// * ИдентификаторТаблицыНастроекПрав - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// * ЕстьВладельцыНастроекПрав - Булево +// * ИспользуемыеТипыЗначенийДоступа - Массив из Тип +// * ВсеВидыОграниченийПрав - Соответствие +// * ПоляТаблицОбъекта - Массив из см. НовыеПоляТаблицыОбъекта +// * ИмяОтдельногоРегистраКлючей - Строка +// * ОпорныеПоля - см. НовоеОписаниеОпорныхПолей +// * ВариантДоступа - Число +// * СоставПолей - Число +// * ЕстьОграничениеЧтения - Булево +// * ЕстьОграничениеИзменения - Булево +// * ЕстьОграничениеПоПользователям - Булево +// * СтруктураРасчетаПраваЧтение - см. СтруктураРасчетаПрава +// * СтруктураРасчетаПраваИзменение - см. СтруктураРасчетаПрава +// * Контекст - см. КонтекстПараметровПоСтруктуреОграничения +// +// Свойства, добавляемые в процедуре ДобавитьТекстыЗапросовВПараметрыОграничения. +// * ТекстЗапросаПроверкиПравЧтениеИзменение - Строка +// * ТекстЗапросаПроверкиПраваЧтение - Строка +// * ПолеОбъектаВладельцаВЗапросеПроверкиПрав - Строка +// * ТекстЗапросаУстаревшихЭлементовДанных - Строка +// * ТаблицыКлюча - Массив из Строка +// * РеквизитыТаблицКлюча - см. НовыеРеквизитыТаблицКлюча +// * ТекстЗапросаЭлементовДанныхСУстаревшимиКлючами - Строка +// * ТекстЗапросаЭлементовДанныхБезКлючейДоступа - Строка +// * ТекстЗапросаНовыхКомбинацийЗначенийОпорныхПолейСуществующихЗаписей - Строка +// * ТекстЗапросаНовыхКомбинацийЗначенийОпорныхПолейНовыхЗаписей - Строка +// * ОписаниеЗапросовУстаревшихКлючейДоступаПоВедущимОбъектам - Соответствие из КлючИЗначение: +// ** Ключ - Строка +// ** Значение - Соответствие из КлючИЗначение: +// *** Ключ - Строка +// *** Значение - Соответствие +// - Структура: +// *** ТипСсылки - ХранилищеЗначения +// *** КлючиЗапросовПоТипам - Соответствие +// *** ТекстыЗапросовПоКлючам - Соответствие +// *** ТекстЗапросаПараметров - Строка +// - Строка +// * ТекстЗапросаТекущихКлючейДоступаРегистра - Строка +// * ТекстЗапросаЗначенийЭлементовДанныхДляКлючейДоступа - Строка +// * ТекстЗапросаЗначенийОбъектовВПамятиДляКлючейДоступа - Строка +// * ТекстЗапросаЗначенийИзИспользуемыхКлючейДоступаДляСравнения - Строка +// * ТекстЗапросаЗначенийИзВсехКлючейДоступаДляСравнения - Строка +// * ТекстЗапросаСуществованияКлючейДляСравнения - Строка +// * ТекстЗапросаКлючейДоступаДляОбновленияПрав - Строка +// * ТекстЗапросаКлючейПоВедущимКлючамДляОбновленияПрав - Строка +// * ТекстЗапросаЗначенийИзКлючейДоступаДляРасчетаПрав - Строка +// * ТекстЗапросаУстаревшихКлючейДоступа - Строка +// Функция ПараметрыОбновления(ОбщиеПараметрыОбновления, ОбъектМетаданных) ПараметрыОбновления = Новый Структура("ЭтоОбновлениеПрав, @@ -17412,13 +17782,16 @@ Для Каждого ЭлементДанных Из ЭлементыДанных Цикл Если ЭлементДанных.ЭтоНаборГруппДоступа Тогда + // @skip-check query-in-loop - Порционная обработка данных ОбновитьКлючиДоступаНаборовГрупп(ПараметрыОбновления, ЭлементДанных.ТекущаяСсылка, "КлючиДоступаНаборовГруппДоступа", "ГруппыДоступа", "НаборГруппДоступа"); ИначеЕсли Не ПараметрыОбновления.ДляВнешнихПользователей Тогда + // @skip-check query-in-loop - Порционная обработка данных ОбновитьКлючиДоступаНаборовГрупп(ПараметрыОбновления, ЭлементДанных.ТекущаяСсылка, "КлючиДоступаПользователей", "ГруппыПользователей", "Пользователь"); Иначе + // @skip-check query-in-loop - Порционная обработка данных ОбновитьКлючиДоступаНаборовГрупп(ПараметрыОбновления, ЭлементДанных.ТекущаяСсылка, "КлючиДоступаВнешнихПользователей", "ГруппыВнешнихПользователей", "ВнешнийПользователь"); КонецЕсли; @@ -17713,6 +18086,7 @@ НачатьТранзакцию(); Попытка Блокировка.Заблокировать(); + // @skip-check query-in-loop - Порционная обработка данных Выборка = Запрос.Выполнить().Выбрать(); УдалениеЗавершено = Ложь; @@ -18347,6 +18721,7 @@ Если Строка.НаборГрупп = Неопределено Тогда НаборГрупп = НовыеНаборыГрупп.Получить(Строка.ИдентификаторГрупп); Если НаборГрупп = Неопределено Тогда + // @skip-check query-in-loop - Порционная обработка данных Строка.НаборГрупп = НовыйНаборГрупп(Строка.ГруппыНабора, ПараметрыОбновления.ДляВнешнихПользователей, ТипЭлементовНабора, @@ -18643,18 +19018,21 @@ Выборка = РезультатыЗапроса[0].Выбрать(); Пока Выборка.Следующий() Цикл + // @skip-check query-in-loop - Порционная обработка данных УдалитьЗаписиРегистраДляНабора(Выборка.Набор, "КлючиДоступаНаборовГруппДоступа", "НаборГруппДоступа"); КонецЦикла; Выборка = РезультатыЗапроса[1].Выбрать(); Пока Выборка.Следующий() Цикл + // @skip-check query-in-loop - Порционная обработка данных УдалитьЗаписиРегистраДляНабора(Выборка.Набор, "КлючиДоступаПользователей", "Пользователь"); КонецЦикла; Выборка = РезультатыЗапроса[2].Выбрать(); Пока Выборка.Следующий() Цикл + // @skip-check query-in-loop - Порционная обработка данных УдалитьЗаписиРегистраДляНабора(Выборка.Набор, "КлючиДоступаВнешнихПользователей", "ВнешнийПользователь"); КонецЦикла; @@ -18809,8 +19187,11 @@ КонецПопытки; Если Не Строка.Используется И Строка.Удалить Тогда + // @skip-check query-in-loop - Порционная обработка данных УдалитьЗаписиРегистраДляНабора(Строка.ТекущаяСсылка, "КлючиДоступаНаборовГруппДоступа", "НаборГруппДоступа"); + // @skip-check query-in-loop - Порционная обработка данных УдалитьЗаписиРегистраДляНабора(Строка.ТекущаяСсылка, "КлючиДоступаПользователей", "Пользователь"); + // @skip-check query-in-loop - Порционная обработка данных УдалитьЗаписиРегистраДляНабора(Строка.ТекущаяСсылка, "КлючиДоступаВнешнихПользователей", "ВнешнийПользователь"); НачатьТранзакцию(); @@ -19152,6 +19533,7 @@ Блокировка.Заблокировать(); БлокировкаУстановлена = Истина; Если ТребуетсяПроверка Тогда + // @skip-check query-in-loop - Порционная обработка данных Выгрузка = Запрос.Выполнить().Выгрузить(); Если ОтборИзмерений = Неопределено Тогда ИменаПроверяемыхИзмерений = Новый Массив; @@ -19227,6 +19609,7 @@ Продолжить; КонецЕсли; Запрос.УстановитьПараметр("Тип", Выборка.ТипСсылки); + // @skip-check query-in-loop - Порционная обработка данных Объекты = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Объект"); Для Каждого Объект Из Объекты Цикл НаборЗаписей.Отбор.Объект.Установить(Объект); @@ -19308,6 +19691,7 @@ КонецЕсли; Если ПорцияЭлементовДанных.Количество() > 0 Тогда + // @skip-check query-in-loop - Порционная обработка данных ОбновитьКлючиДоступаПорцииЭлементовДанныхСписка(ПорцияЭлементовДанных, ПараметрыОбновления); КонецЕсли; @@ -19728,6 +20112,15 @@ Возврат; КонецЕсли; + СпискиДляОбновления = Новый Структура("ИменаСписков, ДляВнешнихПользователей", + ПараметрыОбновления.ЗависимыеСпискиПоКлючамДоступа, + ПараметрыОбновления.ДляВнешнихПользователей); + + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + ЗапланироватьОбновлениеУстаревшихКлючейДоступа(СпискиДляОбновления, + ПараметрыОбновления.ИдентификаторТранзакции, "ЗаполнитьКэшПараметровОграниченияДоступа"); + КонецЕсли; + НачатьТранзакцию(); Попытка ПередБлокировкойДанных(ПараметрыОбновления); @@ -19761,10 +20154,6 @@ КонецЦикла; ПослеЗаписиСтрок(ПараметрыОбновления, ОписаниеКлючейДоступаОбъектов.Количество()); - СпискиДляОбновления = Новый Структура("ИменаСписков, ДляВнешнихПользователей", - ПараметрыОбновления.ЗависимыеСпискиПоКлючамДоступа, - ПараметрыОбновления.ДляВнешнихПользователей); - ПередПланированиемОбновления(ПараметрыОбновления); ЗапланироватьОбновлениеУстаревшихКлючейДоступа(СпискиДляОбновления, ПараметрыОбновления.ИдентификаторТранзакции, @@ -20191,7 +20580,7 @@ ПараметрыОбновления.Вставить("ТипГруппыДоступа", Тип("СправочникСсылка.ГруппыДоступа")); ПараметрыОбновления.Вставить("ПустаяГруппаДоступа", Справочники.ГруппыДоступа.ПустаяСсылка()); - ЗначенияТаблицКлючей = Новый Соответствие; + ЗначенияТаблицКлючей = НовыеЗначенияТаблицКлючей(); Для Каждого ТаблицаКлюча Из ПараметрыОбновления.ТаблицыКлюча Цикл НомерТаблицы = НомерТаблицы + 1; ЗначенияТаблицКлючей.Вставить(ТаблицаКлюча, @@ -20221,7 +20610,7 @@ ИндексПоследнегоКлюча = ЗначенияПервойТаблицы.Строки.Количество() - 1; Для ИндексКлюча = 0 По ИндексПоследнегоКлюча Цикл - ЗначенияТаблицКлюча = Новый Структура; + ЗначенияТаблицКлюча = НовыеЗначенияТаблицКлюча(); Для Каждого ТаблицаКлюча Из ПараметрыОбновления.ТаблицыКлюча Цикл ЗначенияТаблицы = ЗначенияТаблицКлючей.Получить(ТаблицаКлюча).Строки[ИндексКлюча].Строки; Если СтрНачинаетсяС(ТаблицаКлюча, "Шапка") Тогда @@ -20233,6 +20622,7 @@ КлючДоступа = СтрокаЗначений.Ссылка; ПраваНаКлюч = ПраваНаКлючДоступаСписка(ЗначенияТаблицКлюча, ПараметрыОбновления); + // @skip-check query-in-loop - Порционная обработка данных ОбновитьПраваНаКлючДоступаСписка(КлючДоступа, ПраваНаКлюч, ?(ЭтоНовыеКлючи, ОписаниеКлючейДоступа, Неопределено), ПараметрыОбновления); @@ -20243,6 +20633,33 @@ КонецПроцедуры +// Возвращаемое значение: +// Структура из КлючИЗначение: +// * Ключ - Строка - имя таблицы ключа +// * Значение - ДеревоЗначений +// +Функция НовыеЗначенияТаблицКлючей() + Возврат Новый Соответствие; +КонецФункции + +// Возвращаемое значение: +// Структура из КлючИЗначение: +// * Ключ - Строка - имя таблицы ключа +// * Значение - см. НовыеЗначенияТаблицыКлюча +// +Функция НовыеЗначенияТаблицКлюча() + Возврат Новый Структура; +КонецФункции + +// Возвращаемое значение: +// - КоллекцияСтрокДереваЗначений +// - ТаблицаЗначений +// - СтрокаДереваЗначений +// +Функция НовыеЗначенияТаблицыКлюча() + Возврат Новый ТаблицаЗначений; +КонецФункции + // Для процедуры ОбновитьПорциюЭлементов. Процедура ОбработатьУстаревшиеКлючиДоступаСписка(ЭлементыДанных, ПараметрыОбновления) @@ -20307,6 +20724,7 @@ Ссылка = СтрокаЗначений.Ссылка; Если Не ЭтоОчисткаВыбранныхКлючей И Строка.Используется Тогда ЗапросИспользованияКлюча.УстановитьПараметр("Ссылка", Ссылка); + // @skip-check query-in-loop - Порционная обработка данных Если Не ЗапросИспользованияКлюча.Выполнить().Пустой() Тогда Если ТребуетсяПрерватьОбработкуЭлементов(ПараметрыОбновления, 1) Тогда Прервать; @@ -20351,6 +20769,7 @@ КонецЕсли; Если УдалитьКлюч Тогда Запрос.УстановитьПараметр("КлючДоступа", Ссылка); + // @skip-check query-in-loop - Порционная обработка данных РезультатыЗапроса = Запрос.ВыполнитьПакет(); Если Не РезультатыЗапроса[0].Пустой() Тогда НаборЗаписейГруппДоступаКлюча.Отбор.КлючДоступа.Установить(Ссылка); @@ -20393,21 +20812,18 @@ // // Возвращаемое значение: // Структура: -// * ПраваГруппДоступаСписков - Соответствие -// * ЗначенияГруппДоступа - Соответствие -// - Неопределено -// * УчастникиГруппДоступа - Соответствие -// - Неопределено -// * ПользователиГруппПользователей - Соответствие -// - Неопределено -// * ГруппыПользователейГруппДоступа - Соответствие -// - Неопределено -// * ГруппыПользователейКакЗначенияДоступа - Соответствие -// - Неопределено -// * РолиПрофилейГруппДоступа - ТаблицаЗначений -// - Неопределено -// * ГруппыДоступаПрофилей - ТаблицаЗначений -// - Неопределено +// * ПраваГруппДоступаСписков - Соответствие из КлючИЗначение: +// ** Ключ - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// - СправочникСсылка.ИдентификаторыОбъектовРасширений - идентификатор списка +// ** Значение - см. ПраваГруппДоступаСписка +// +// * ЗначенияГруппДоступа - см. НовыеЗначенияГруппДоступа +// * УчастникиГруппДоступа - см. НовыеУчастникиГруппДоступа +// * ПользователиГруппПользователей - см. НовыеПользователиГруппПользователей +// * ГруппыПользователейГруппДоступа - см. НовыеГруппыПользователейГруппДоступа +// * ГруппыПользователейКакЗначенияДоступа - см. НовыеГруппыПользователейКакЗначенияДоступа +// * РолиПрофилейГруппДоступа - см. НовыеРолиПрофилейГруппДоступа +// * ГруппыДоступаПрофилей - см. НовыеГруппыДоступаПрофилей // Функция КэшРасчетаПравДляВидаПользователей(ДляВнешнихПользователей) Экспорт @@ -20453,7 +20869,11 @@ Кэш.ВерсияДанных.ГруппыДоступаПрофилей = ВерсияДанных.ГруппыДоступаПрофилей; КонецЕсли; - Возврат Кэш[?(ДляВнешнихПользователей, "ДляВнешнихПользователей", "ДляПользователей")]; + Если ДляВнешнихПользователей Тогда + Возврат Кэш.ДляВнешнихПользователей; + Иначе + Возврат Кэш.ДляПользователей; + КонецЕсли; КонецФункции @@ -20495,6 +20915,22 @@ КонецФункции +// Параметры: +// Права - ТаблицаЗначений +// +// Возвращаемое значение: +// ТаблицаЗначений: +// * ГруппаДоступа - СправочникСсылка.ГруппыДоступа +// * ПравоИзменение - Булево +// * ПравоДобавление - Булево +// * ПравоЧтениеБезОграничения - Булево +// * ПравоИзменениеБезОграничения - Булево +// * ПравоДобавлениеБезОграничения - Булево +// +Функция НовыеПраваГруппДоступаСписка(Права) + Возврат Права; +КонецФункции + // Для процедуры ОбновитьПраваПорцииКлючейДоступаСписка. Процедура ЗаполнитьПраваГруппДоступаСписка(ПараметрыОбновления, Кэш) @@ -20532,16 +20968,31 @@ Запрос.Текст = ТекстЗапросаНазначенияПрофилей() + ОбщегоНазначения.РазделительПакетаЗапросов() + Запрос.Текст; - ПраваГруппДоступаСписка = Запрос.Выполнить().Выгрузить(); + ПраваГруппДоступаСписка = НовыеПраваГруппДоступаСписка(Запрос.Выполнить().Выгрузить()); Кэш.ПраваГруппДоступаСписков.Вставить(ИдентификаторСписка, ПраваГруппДоступаСписка); ПараметрыОбновления.Вставить("ПраваГруппДоступаСписка", ПраваГруппДоступаСписка); КонецПроцедуры +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.ГруппыПользователей +// - СправочникСсылка.ГруппыВнешнихПользователей +// - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// * Значение - Соответствие из КлючИЗначение: +// ** Ключ - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// ** Значение - Булево - Истина +// +Функция НовыеПользователиГруппПользователей() + Возврат Новый Соответствие; +КонецФункции + // Для процедуры ОбновитьПраваПорцииКлючейДоступаСписка. Процедура ЗаполнитьПользователейГруппПользователей(ПараметрыОбновления, Кэш) - ПараметрыОбновления.Вставить("ПользователиГруппПользователей", Новый Соответствие); + ПараметрыОбновления.Вставить("ПользователиГруппПользователей", НовыеПользователиГруппПользователей()); Если Не ПараметрыОбновления.РассчитыватьПраваПользователей Тогда Возврат; @@ -20586,10 +21037,24 @@ КонецПроцедуры +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.ГруппыПользователей +// - СправочникСсылка.ГруппыВнешнихПользователей +// * Значение - Соответствие из КлючИЗначение: +// ** Ключ - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// ** Значение - Булево - Истина +// +Функция НовыеГруппыПользователейКакЗначенияДоступа() + Возврат Новый Соответствие; +КонецФункции + // Для процедуры ОбновитьПраваПорцииКлючейДоступаСписка. Процедура ЗаполнитьГруппыПользователейКакЗначенияДоступа(ПараметрыОбновления, Кэш) - ПараметрыОбновления.Вставить("ГруппыПользователейКакЗначенияДоступа", Новый Соответствие); + ПараметрыОбновления.Вставить("ГруппыПользователейКакЗначенияДоступа", + НовыеГруппыПользователейКакЗначенияДоступа()); Если Не ПараметрыОбновления.РассчитыватьПраваПользователей Тогда Возврат; @@ -20628,11 +21093,40 @@ КонецПроцедуры +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.ГруппыДоступа +// * Значение - Соответствие из КлючИЗначение: +// ** Ключ - СправочникСсылка.Пользователи +// - СправочникСсылка.ГруппыПользователей +// - СправочникСсылка.ВнешниеПользователи +// - СправочникСсылка.ГруппыВнешнихПользователей +// ** Значение - Булево - Истина +// +Функция НовыеУчастникиГруппДоступа() + Возврат Новый Соответствие; +КонецФункции + +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.ГруппыДоступа +// * Значение - Соответствие из КлючИЗначение: +// ** Ключ - СправочникСсылка.ГруппыПользователей +// - СправочникСсылка.ГруппыВнешнихПользователей +// ** Значение - Соответствие из КлючИЗначение: +// *** Ключ - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// *** Значение - Булево - Истина +// +Функция НовыеГруппыПользователейГруппДоступа() + Возврат Новый Соответствие; +КонецФункции + // Для процедуры ОбновитьПраваПорцииКлючейДоступаСписка. Процедура ЗаполнитьУчастниковГруппДоступаСписка(ПараметрыОбновления, Кэш) - ПараметрыОбновления.Вставить("УчастникиГруппДоступа", Новый Соответствие); - ПараметрыОбновления.Вставить("ГруппыПользователейГруппДоступа", Новый Соответствие); + ПараметрыОбновления.Вставить("УчастникиГруппДоступа", НовыеУчастникиГруппДоступа()); + ПараметрыОбновления.Вставить("ГруппыПользователейГруппДоступа", НовыеГруппыПользователейГруппДоступа()); Если Не ПараметрыОбновления.РассчитыватьПраваПользователей Тогда Возврат; @@ -20734,6 +21228,28 @@ КонецПроцедуры +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - Тип - тип значений доступа +// * Значение - Структура: +// ** ВсеРазрешены - Булево +// ** Значения - Соответствие из КлючИЗначение: +// *** Ключ - ОпределяемыйТип.ЗначениеДоступа +// *** Значение - Булево - Истина +// +Функция НовыеЗначенияГруппыДоступа() + Возврат Новый Соответствие; +КонецФункции + +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.ГруппыДоступа +// * Значение - см. НовыеЗначенияГруппыДоступа +// +Функция НовыеЗначенияГруппДоступа() + Возврат Новый Соответствие; +КонецФункции + // Для процедуры ОбновитьПраваПорцииКлючейДоступаСписка. Процедура ЗаполнитьЗначенияГруппДоступаДляРасчетаПрав(ПараметрыОбновления, Кэш) @@ -20768,11 +21284,11 @@ | ТипЗначенийДоступа"; РезультатыЗапроса = Запрос.ВыполнитьПакет(); - ЗначенияГруппДоступа = Новый Соответствие; + ЗначенияГруппДоступа = НовыеЗначенияГруппДоступа(); Дерево = РезультатыЗапроса[0].Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); Для Каждого Строка Из Дерево.Строки Цикл - ЗначенияГруппыДоступа = Новый Соответствие; + ЗначенияГруппыДоступа = НовыеЗначенияГруппыДоступа(); Для Каждого Подстрока Из Строка.Строки Цикл ЗначенияОдногоТипа = Новый Структура; ЗначенияОдногоТипа.Вставить("ВсеРазрешены", Подстрока.ВсеРазрешены); @@ -20805,11 +21321,32 @@ КонецПроцедуры +// Возвращаемое значение: +// ТаблицаЗначений: +// * Профиль - СправочникСсылка.ПрофилиГруппДоступа +// * Роль - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// - СправочникСсылка.ИдентификаторыОбъектовРасширений +// * ИмяРоли - Строка +// * ИмяРолиВерхнийРегистр - Строка +// +Функция НовыеРолиПрофилейГруппДоступа() + Возврат Новый ТаблицаЗначений; +КонецФункции + +// Возвращаемое значение: +// ТаблицаЗначений: +// * Профиль - СправочникСсылка.ПрофилиГруппДоступа +// * ГруппаДоступа - СправочникСсылка.ГруппыДоступа +// +Функция НовыеГруппыДоступаПрофилей() + Возврат Новый ТаблицаЗначений; +КонецФункции + // Для процедуры ОбновитьПраваПорцииКлючейДоступаСписка. Процедура ЗаполнитьРолиИГруппыДоступаПрофилей(ПараметрыОбновления, Кэш) - ПараметрыОбновления.Вставить("РолиПрофилейГруппДоступа", Новый ТаблицаЗначений); - ПараметрыОбновления.Вставить("ГруппыДоступаПрофилей", Новый ТаблицаЗначений); + ПараметрыОбновления.Вставить("РолиПрофилейГруппДоступа", НовыеРолиПрофилейГруппДоступа()); + ПараметрыОбновления.Вставить("ГруппыДоступаПрофилей", НовыеГруппыДоступаПрофилей()); Если Не ПараметрыОбновления.ЕстьФункцияПравоДоступаИлиРольДоступна Тогда Возврат; @@ -20903,11 +21440,53 @@ КонецПроцедуры +// Возвращаемое значение: +// ФиксированноеСоответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.КлючиДоступа +// * Значение - ФиксированнаяСтруктура: +// ** ОграничениеЧтенияОтключено - Булево +// ** ОграничениеОтключено - Булево +// ** ПоГруппамДоступа - ФиксированноеСоответствие из КлючИЗначение: +// *** Ключ - СправочникСсылка.ГруппыДоступа +// *** Значение - Булево - право изменение +// +Функция НовыеПраваНаСпискиВедущихКлючейДоступа() + Возврат Новый Соответствие; +КонецФункции + +// Возвращаемое значение: +// ФиксированноеСоответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.КлючиДоступа +// * Значение - ФиксированноеСоответствие из КлючИЗначение: +// ** Ключ - СправочникСсылка.ГруппыДоступа +// - СправочникСсылка.ГруппыПользователей +// - СправочникСсылка.ГруппыВнешнихПользователей +// ** Значение - Булево - право изменение +// +Функция НовыеПраваНаВедущиеКлючиДоступа() + Возврат Новый Соответствие; +КонецФункции + +// Возвращаемое значение: +// ФиксированноеСоответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// - СправочникСсылка.ИдентификаторыОбъектовРасширений - идентификатор списка +// - Тип - тип значений списка +// * Значение - ФиксированноеСоответствие из КлючИЗначение: +// ** Ключ - СправочникСсылка.ГруппыДоступа +// - СправочникСсылка.ГруппыПользователей +// - СправочникСсылка.ГруппыВнешнихПользователей +// ** Значение - Булево - право изменение +// +Функция НовыеПраваНаВедущиеСписки() + Возврат Новый Соответствие; +КонецФункции + // Для процедуры ОбновитьПраваПорцииКлючейДоступаСписка. Процедура ЗаполнитьПраваНаВедущиеКлючиДоступаИВедущиеСписки(РезультатыЗапроса, НомерТаблицы, ПараметрыОбновления) - ПраваНаСпискиВедущихКлючейДоступа = Новый Соответствие; - ПраваНаВедущиеКлючиДоступа = Новый Соответствие; + ПраваНаСпискиВедущихКлючейДоступа = НовыеПраваНаСпискиВедущихКлючейДоступа(); + ПраваНаВедущиеКлючиДоступа = НовыеПраваНаВедущиеКлючиДоступа(); Если ПараметрыОбновления.ЕстьВедущиеКлючиДоступа Тогда ДействующиеПараметры = ДействующиеПараметрыОграниченияДоступа(ПараметрыОбновления.ИдентификаторТранзакции, Неопределено, Ложь); Если ПараметрыОбновления.ДляВнешнихПользователей Тогда @@ -20976,7 +21555,7 @@ ПараметрыОбновления.Вставить("ПраваНаВедущиеКлючиДоступа", Новый ФиксированноеСоответствие(ПраваНаВедущиеКлючиДоступа)); - ПраваНаВедущиеСписки = Новый Соответствие; + ПраваНаВедущиеСписки = НовыеПраваНаВедущиеСписки(); Если ПараметрыОбновления.ЕстьВедущиеСпискиПоПравам Тогда НомерТаблицы = НомерТаблицы + 1; Дерево = РезультатыЗапроса[НомерТаблицы].Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); @@ -21002,10 +21581,24 @@ КонецПроцедуры +// Возвращаемое значение: +// ФиксированноеСоответствие из КлючИЗначение: +// * Ключ - ОпределяемыйТип.ВладелецНастроекПрав +// * Значение - ФиксированноеСоответствие из КлючИЗначение: +// ** Ключ - СправочникСсылка.Пользователи +// - СправочникСсылка.ГруппыПользователей +// - СправочникСсылка.ВнешниеПользователи +// - СправочникСсылка.ГруппыВнешнихПользователей +// ** Значение - Булево - право изменение +// +Функция НовыеПраваПоВладельцамНастроекПрав() + Возврат Новый Соответствие; +КонецФункции + // Для процедуры ОбновитьПраваПорцииКлючейДоступаСписка. Процедура ЗаполнитьПраваПоВладельцамНастроекПрав(РезультатыЗапроса, НомерТаблицы, ПараметрыОбновления) - ПраваПоВладельцамНастроекПрав = Новый Соответствие; + ПраваПоВладельцамНастроекПрав = НовыеПраваПоВладельцамНастроекПрав(); Если ПараметрыОбновления.ЕстьВладельцыНастроекПрав Тогда НомерТаблицы = НомерТаблицы + 5; Дерево = РезультатыЗапроса[НомерТаблицы].Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); @@ -21023,6 +21616,43 @@ КонецПроцедуры +// Возвращаемое значение: +// Структура: +// * ЗначенияТаблицКлюча - см. НовыеЗначенияТаблицКлюча +// * БезЗаписиПраваЧтение - Булево +// * РеквизитыТаблицКлюча - см. НовыеРеквизитыТаблицКлюча +// * УчастникиГруппДоступа - см. НовыеУчастникиГруппДоступа +// * ГруппыПользователейГруппДоступа - см. НовыеГруппыПользователейГруппДоступа +// * ГруппыПользователейКакЗначенияДоступа - см. НовыеГруппыПользователейКакЗначенияДоступа +// * ПользователиГруппПользователей - см. НовыеПользователиГруппПользователей +// * ПраваНаСпискиВедущихКлючейДоступа - см. НовыеПраваНаСпискиВедущихКлючейДоступа +// * ПраваНаВедущиеКлючиДоступа - см. НовыеПраваНаВедущиеКлючиДоступа +// * ПраваНаВедущиеСписки - см. НовыеПраваНаВедущиеСписки +// * ПраваПоВладельцамНастроекПрав - см. НовыеПраваПоВладельцамНастроекПрав +// * ТипГруппыДоступа - Тип +// * ПустаяГруппаДоступа - СправочникСсылка.ГруппыДоступа +// * ТипПользователя - Тип +// * ТипГруппыПользователей - Тип +// * ТипыВладельцевНастроекПрав - ФиксированноеСоответствие +// * ПраваРолейФункцииПравоДоступа - Соответствие +// * ОбъектыМетаданныхФункцииПравоДоступа - Соответствие +// * ПраваПрофилейФункцииПравоДоступа - Соответствие +// * РолиПрофилейГруппДоступа - см. РолиПрофилейГруппДоступа +// * ГруппыДоступаПрофилей - см. ГруппыДоступаПрофилей +// * ГруппаДоступа - СправочникСсылка.ГруппыДоступа - текущее значение +// * ЗначенияГруппыДоступа - см. НовыеЗначенияГруппыДоступа +// * ОписанияТребуемыхТаблицКлюча - Массив из Структура: +// ** РеквизитыТаблиц - Соответствие из КлючИЗначение: +// *** Ключ - Строка - имя таблицы ключа +// *** Значение - Массив из Строка - имя реквизита таблицы ключа +// ** ЗначенияТаблиц - см. ТекущиеЗначенияТаблицКлюча +// ** ИндексыСтрокТаблиц - Соответствие +// * ТекущиеСтрокиТаблицКлюча - см. НовыеЗначенияТаблицКлюча +// +Функция НовыйКонтекстРасчетаПрав() + Возврат Новый Структура; +КонецФункции + // Для процедуры ОбновитьПраваНаКлючиДоступаСписка. Функция ПраваНаКлючДоступаСписка(ЗначенияТаблицКлюча, ПараметрыОбновления) @@ -21041,7 +21671,7 @@ БезЗаписиПраваЧтение = ПараметрыОбновления.ОграничениеЧтенияОтключено И Не ПараметрыОбновления.ЕстьЗависимыеСпискиБезЗаписиКлючейДоступа; - Контекст = Новый Структура; + Контекст = НовыйКонтекстРасчетаПрав(); Контекст.Вставить("ЗначенияТаблицКлюча", ЗначенияТаблицКлюча); Контекст.Вставить("БезЗаписиПраваЧтение", БезЗаписиПраваЧтение); Контекст.Вставить("РеквизитыТаблицКлюча", ПараметрыОбновления.РеквизитыТаблицКлюча); @@ -21506,6 +22136,12 @@ КонецПроцедуры // Для функции РассчитанноеУсловиеДляСтрок. +// +// Возвращаемое значение: +// Структура из КлючИЗначение: +// * Ключ - Строка - имя таблицы ключа +// * Значение - см. ЗначенияТаблицыКлюча +// Функция ТекущиеЗначенияТаблицКлюча(Контекст, ТребуемыеРеквизитыТабличныхЧастейКлюча) ТекущиеЗначенияТаблицКлюча = Новый Структура; @@ -21532,7 +22168,7 @@ Если ЗначениеЗаполнено(Отбор) Тогда Строки = Строки.НайтиСтроки(Отбор); КонецЕсли; - ЗначенияТаблицы = Новый ТаблицаЗначений; + ЗначенияТаблицы = НовыеЗначенияТаблицыКлюча(); Для Каждого ИмяРеквизита Из Реквизиты Цикл ЗначенияТаблицы.Колонки.Добавить(ИмяРеквизита); КонецЦикла; @@ -22751,7 +23387,7 @@ Попытка ВызватьИсключение НСтр("ru = 'Стек вызовов'"); Исключение - СтекВызовов = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СтекВызовов = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; КомментарийДляЖурнала = КомментарийДляЖурнала + Символы.ПС + Символы.ПС + СтекВызовов; @@ -23129,18 +23765,18 @@ // необходимости обновления ключей доступа к элементам данных. // // Параметры: -// ПолноеИмя - Строка - полное имя списка -// ИдентификаторТранзакции - УникальныйИдентификатор -// ПовторныйВызов - Булево - только при вызове из самой же функции +// ПолноеИмя - Строка - полное имя списка +// ИдентификаторТранзакции - УникальныйИдентификатор +// ПовторныйВызов - Булево - только при вызове из самой же функции // // Возвращаемое значение: -// Структура: -// * ЗависимыеСписки - Соответствие из КлючИЗначение: -// ** Ключ - Строка - полное имя списка -// ** Значение - Булево - Истина -// * ПоЗначениямПолей - см. ВедущийСписокПоЗначениямПолей -// * ПоКлючамДоступа - см. ВедущийСписокПоКлючамДоступаИлиЗначениямСГруппами -// * ПоЗначениямСГруппами - см. ВедущийСписокПоКлючамДоступаИлиЗначениямСГруппами +// Структура: +// * ЗависимыеСписки - Соответствие из КлючИЗначение: +// ** Ключ - Строка - полное имя списка. +// ** Значение - Булево - Истина. +// * ПоЗначениямПолей - см. ВедущийСписокПоЗначениямПолей +// * ПоКлючамДоступа - см. ВедущийСписокПоКлючамДоступаИлиЗначениямСГруппами +// * ПоЗначениямСГруппами - см. ВедущийСписокПоКлючамДоступаИлиЗначениямСГруппами // Функция СвойстваСпискаКакВедущего(ПолноеИмя, ИдентификаторТранзакции = Неопределено, ПовторныйВызов = Ложь) Экспорт @@ -23377,7 +24013,6 @@ // // Возвращаемое значение: // см. ПараметрыОграниченияПоСтруктуреОграничения -// см. РассчитанныеПараметрыОграничения // Функция ПараметрыОграничения(ПолноеИмя, ИдентификаторТранзакции = Неопределено, ДляВнешнихПользователей = Неопределено) Экспорт @@ -23699,7 +24334,7 @@ ОписаниеОграничения = ОписаниеОграниченияДанных(ОбщийКонтекст, ПолноеИмя, Истина); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - Возврат ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + Возврат ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Если ТипЗнч(ОписаниеОграничения) = Тип("Строка") Тогда Возврат ОписаниеОграничения; @@ -23730,7 +24365,7 @@ Иначе ТекстОшибкиДляПользователей = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось сформировать параметры ограничения доступа для пользователей по причине: - |%1'"), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + |%1'"), ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецЕсли; КонецПопытки; @@ -23749,7 +24384,7 @@ ТекстОшибкиДляПользователей = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось сформировать тексты запросов на основе параметров ограничения доступа |для пользователей по причине: - |%1'"), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + |%1'"), ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецЕсли; КонецПопытки; КонецЕсли; @@ -23780,7 +24415,7 @@ Иначе ТекстОшибкиДляВнешнихПользователей = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось сформировать параметры ограничения доступа для внешних пользователей по причине: - |%1'"), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + |%1'"), ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецЕсли; КонецПопытки; @@ -23788,6 +24423,7 @@ РезультатДляВнешнихПользователей.Контекст.СпискиСЗаписьюКлючейДляЗависимыхСписковБезКлючей = Новый Соответствие; УстановитьСвойстваЗаписиКлючейДоступа(РезультатДляВнешнихПользователей); РезультатДляВнешнихПользователей.Вставить("БезЗаписиКлючейДоступаДляПользователейИВнешнихПользователей", Ложь); + РезультатДляВнешнихПользователей.Контекст.Вставить("ПропуститьПроверкуОпределяемыхТипов"); Попытка ДобавитьТекстыЗапросовВПараметрыОграничения(РезультатДляВнешнихПользователей); Исключение @@ -23798,7 +24434,7 @@ ТекстОшибкиДляВнешнихПользователей = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось сформировать тексты запросов на основе параметров ограничения доступа |для внешних пользователей по причине: - |%1'"), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + |%1'"), ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецЕсли; КонецПопытки; КонецЕсли; @@ -23837,7 +24473,7 @@ ОбщийКонтекст = ОбщийКонтекстРасчетаПараметровОграничения(, Параметры.ВсеВидыДоступаИспользуются, Ложь); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - Результат.ОшибкаОписанияОграничения = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + Результат.ОшибкаОписанияОграничения = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Если ОбщийКонтекст = Неопределено Тогда @@ -23850,7 +24486,7 @@ СпискиСОграничением = УправлениеДоступомСлужебныйПовтИсп.СпискиСОграничением(); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - Результат.ОшибкаОписанияОграничения = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + Результат.ОшибкаОписанияОграничения = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); УчетЗависимостейДоступен = Ложь; КонецПопытки; @@ -23866,7 +24502,7 @@ Попытка ОписаниеОграничения = ОписаниеОграниченияДанных(ОбщийКонтекст, ПолноеИмя, Истина); Исключение - Результат.ОшибкаОписанияОграничения = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + Результат.ОшибкаОписанияОграничения = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); УчетЗависимостейДоступен = Ложь; КонецПопытки; Если ТипЗнч(ОписаниеОграничения) = Тип("Строка") Тогда @@ -23928,7 +24564,7 @@ ОбщийКонтекст.Вставить("СпециальноеОписаниеОграничения", ОписаниеОграничения); ОбщийКонтекст.Вставить("СпискиСОграничением", Новый ФиксированноеСоответствие(СпискиСОграничением)); НовыеХранимыеПараметры = ХранимыеПараметрыОграниченияДоступа(ОбщийКонтекст); - ДействующиеПараметры = Новый Структура(НовыеХранимыеПараметры.ДляЗаписиОбъектовИПроверкиПрав.Получить()); + ДействующиеПараметры = Новый Структура(НовыеХранимыеПараметры.ДляЗаписиОбъектовИПроверкиПрав.Получить()); // см. НоваяСтруктураХранимыхПараметровЗаписи Если ДействующиеПараметры.ВерсииОграниченийСписков.Получить(ПолноеИмя) = Неопределено Тогда Контекст.ВерсииОграниченийСписков.Вставить(ПолноеИмя, Истина); Иначе @@ -24138,7 +24774,7 @@ Результат.ОшибкаФормированияПараметровОграничения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось сформировать параметры ограничения доступа по причине: - |%1'"), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + |%1'"), ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецЕсли; Контекст.УчетЗависимостейДоступен = Ложь; КонецПопытки; @@ -24165,7 +24801,7 @@ Результат.ОшибкаФормированияТекстовЗапросов = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось сформировать тексты запросов на основе параметров ограничения доступа по причине: - |%1'"), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + |%1'"), ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецЕсли; Контекст.УчетЗависимостейДоступен = Ложь; КонецПопытки; @@ -24290,7 +24926,7 @@ "ПриЗаполненииСписковСОграничениемДоступа", "УправлениеДоступомПереопределяемый", "ПриЗаполненииОграниченияДоступа", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); Если БезВызоваИсключения Тогда Возврат ТекстОшибки; @@ -24316,7 +24952,7 @@ "УправлениеДоступомПереопределяемый", "УправлениеДоступомПереопределяемый", "ПриЗаполненииОграниченияДоступа", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); Если БезВызоваИсключения Тогда Возврат ТекстОшибки; @@ -24427,7 +25063,7 @@ // ЗаполнитьПараметрыОграничения, ДобавитьПараметрыОграниченияСписка. // // Возвращаемое значение: -// Структура +// см. НоваяСтруктураХранимыхПараметровЗаписи // Функция ДействующиеПараметрыОграниченияДоступа(ИдентификаторТранзакции, ОбщийКонтекст, Обновить, УстановкаПараметровСеансаДляШаблонов = Ложь, @@ -24746,7 +25382,7 @@ Если ФоновоеЗадание.Состояние <> СостояниеФоновогоЗадания.Завершено Тогда Если ТипЗнч(ФоновоеЗадание.ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда ТекстОшибки = ЗаголовокОшибки + Символы.ПС - + ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке); + + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке); Иначе ТекстОшибки = ЗаголовокОшибки + Символы.ПС + НСтр("ru = 'Фоновое задание завершилось аварийно.'"); @@ -24850,7 +25486,7 @@ КонецЕсли; Если Не Результат.ТребуетсяПерезапускСеанса Или Не СтандартныеПодсистемыСервер.ЭтоОшибкаТребованияПерезапускаСеанса(ИнформацияОбОшибке) Тогда - Результат.ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + Результат.ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); КонецЕсли; КонецПопытки; УстановитьПривилегированныйРежим(Ложь); @@ -25091,12 +25727,12 @@ НСтр("ru = 'Не удалось проверить или обновить права доступа по причине: |%1 | - |Повторите операцию через минуту, если ошибка повторится, перезапустите сеанс.'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + |Повторите операцию через минуту, и если проблема останется, перезапустите сеанс.'"), + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение ТекстОшибки; КонецПопытки; Исключение - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); СтандартныеПодсистемыСервер.УстановитьТребуетсяПерезапускСеанса(ТекстОшибки); ПриОшибкеПроверкиАктуальностиМетаданных(ТекстОшибки); ВызватьИсключение; @@ -25290,8 +25926,10 @@ Для Каждого ПолноеИмя Из ПолныеИмена Цикл ИмяПараметра = "ПолноеИмя" + Формат(НомерПараметра, "ЧГ="); Запрос.УстановитьПараметр(ИмяПараметра, ПолноеИмя); - УсловияОтбораИОМ.Добавить("Идентификаторы.ПолноеИмя ПОДОБНО &" + ИмяПараметра); // @query-part-1 - УсловияОтбораИОР.Добавить("Идентификаторы.ПолноеИмяОбъекта ПОДОБНО &" + ИмяПараметра); // @query-part-1 + УсловияОтбораИОМ.Добавить(СтрЗаменить("Идентификаторы.ПолноеИмя ПОДОБНО &ИмяПараметра СПЕЦСИМВОЛ ""~""", + "ИмяПараметра", ИмяПараметра)); // @query-part-1 + УсловияОтбораИОР.Добавить(СтрЗаменить("Идентификаторы.ПолноеИмяОбъекта ПОДОБНО &ИмяПараметра СПЕЦСИМВОЛ ""~""", + "ИмяПараметра", ИмяПараметра)); // @query-part-1 НомерПараметра = НомерПараметра + 1; КонецЦикла; @@ -25714,12 +26352,12 @@ // Возвращаемое значение: // Структура: // * ДатаСоздания - Дата -// * ДляЗаписиОбъектовИПроверкиПрав - см. НоваяСтруктураХранимыхПараметровЗаписи -// * ДляОтчетаПоПравамДоступа - см. НоваяСтруктураХранимыхПараметровОтчета +// * ДляЗаписиОбъектовИПроверкиПрав - ХранилищеЗначения - содержит тип НоваяСтруктураХранимыхПараметровЗаписи +// * ДляОтчетаПоПравамДоступа - ХранилищеЗначения - содержит тип НоваяСтруктураХранимыхПараметровОтчета // * ХешСуммаПостоянныхПараметров - Строка -// * ДляШаблоновВСеансахПользователей - см. НоваяСтруктураХранимыхПараметровШаблонов -// * ДляШаблоновВСеансахВнешнихПользователей - см. НоваяСтруктураХранимыхПараметровШаблонов -// * ВерсииПараметровШаблонов - см. НоваяСтруктураХранимыхВерсийПараметровШаблонов +// * ДляШаблоновВСеансахПользователей - ХранилищеЗначения - содержит тип НоваяСтруктураХранимыхПараметровШаблонов +// * ДляШаблоновВСеансахВнешнихПользователей - ХранилищеЗначения - содержит тип НоваяСтруктураХранимыхПараметровШаблонов +// * ВерсииПараметровШаблонов - ХранилищеЗначения - содержит тип НоваяСтруктураХранимыхВерсийПараметровШаблонов // * ХешСуммаПараметровШаблонов - Строка - заполняется при записи после обновления // параметра ВерсииПараметровШаблонов и заполнения свойства СпискиСОграничениемПоПолям // параметров ДляШаблоновВСеансахПользователей, ДляШаблоновВСеансахВнешнихПользователей. @@ -26492,7 +27130,7 @@ // * ОпорныеПоля - см. НовоеОписаниеОпорныхПолей // * ИмяОтдельногоРегистраКлючей - Строка // * РассчитыватьПраваПользователей - Булево -// * ИспользуемыеТипыЗначенийДоступа - Булево +// * ИспользуемыеТипыЗначенийДоступа - ХранилищеЗначения - содержит тип Массив из Тип // * ОграничениеВШаблонахЧерезКлючиДоступаПользователей - Булево // * ОграничениеВШаблонахЧерезКлючиДоступаПользователейИГруппДоступа - Булево // @@ -26601,10 +27239,12 @@ // Возвращаемое значение: // Структура: // * ВсеПоля - Массив -// * ТипыВсехПолей - Соответствие +// * ТипыВсехПолей - Соответствие из КлючИЗначение: +// ** Ключ - Строка - имя поля. +// ** Значение - ХранилищеЗначения - содержит тип ОписаниеТипов - тип поля. // * НаборыПолей - Структура: -// * ДляПользователей - Булево -// * ДляВнешнихПользователей - Булево +// ** ДляПользователей - Булево +// ** ДляВнешнихПользователей - Булево // * Имя - Строка - имя табличной части (есть только у полей табличной части) // Функция ОписаниеПолейВедущегоСписка() @@ -26649,8 +27289,8 @@ // Возвращаемое значение: // Структура: // * ЗависимыеСписки - Соответствие из КлючИЗначение: -// * Ключ - Строка - полное имя списка -// * Значение - Булево - Истина +// ** Ключ - Строка - полное имя списка +// ** Значение - Булево - Истина // * ПоЗначениямПолей - Структура - похожая на см. ВедущийСписокПоПоЗначениямПолей // * ПоКлючамДоступа - см. ВедущийСписокПоКлючамДоступаИлиЗначениямСГруппами // * ПоЗначениямСГруппами - см. ВедущийСписокПоКлючамДоступаИлиЗначениямСГруппами @@ -28640,9 +29280,9 @@ // Структура: // * Список - СписокЗначений // * Все - Массив -// * ТипыВсех - Массив +// * ТипыВсех - Массив из ХранилищеЗначения - содержит тип ОписаниеТипов // * Используемые - Массив -// * ТипыИспользуемых - Массив +// * ТипыИспользуемых - Массив из ХранилищеЗначения - содержит тип ОписаниеТипов // * МаксимальноеКоличество - Число // * МаксимальноДопустимоеКоличество - Число // * ТипыПоИменамПолей - Соответствие из КлючИЗначение: @@ -32157,6 +32797,15 @@ #Область ПараметрыОграниченияДоступаТекстыЗапросовДляСписка +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - Строка +// * Значение - Массив из Строка +// +Функция НовыеРеквизитыТаблицКлюча() + Возврат Новый Соответствие; +КонецФункции + // Основная функция области, которая является второй частью // функции ПараметрыОграниченияПоСтруктуреОграничения, но // не используется при подготовке хранимых параметров ограничения доступа, @@ -32236,7 +32885,7 @@ Контекст.Вставить("ОтдельныйРегистр", Истина); // Уточнение регистра ключей для нессылочных типов. Контекст.Вставить("ТаблицыКлюча", Новый Массив); - Контекст.Вставить("РеквизитыТаблицКлюча", Новый Соответствие); + Контекст.Вставить("РеквизитыТаблицКлюча", НовыеРеквизитыТаблицКлюча()); Контекст.Вставить("ЧастиУсловияПроверки", Новый Массив); Контекст.Вставить("ЧастиЗапросаЗначенийИзОбъектов", Новый Массив); Контекст.Вставить("ЧастиЗапросаЗначенийИзОбъектовВПамяти", Новый Массив); @@ -39430,7 +40079,7 @@ // Параметры: // Контекст - Структура: // * Строка - Структура: -// ** Строки - см. ТаблицаНаборовСимволов +// ** Строки - см. ТаблицаНаборовСимволов // Процедура РазобратьВыбор(Контекст) @@ -40022,8 +40671,8 @@ // * Приоритет - Число // * Уточнение - Строка // * ИсходнаяСтрока - Структура: -// ** Строки - Массив из см. ТаблицаНаборовСимволов -// ** Уточнение - Строка +// ** Строки - Массив из см. ТаблицаНаборовСимволов +// ** Уточнение - Строка // * Строки - Массив из см. ТаблицаНаборовСимволов // * КонечнаяСтрока - СтрокаТаблицыЗначений: см. ТаблицаНаборовСимволов // * ПозицияОшибки - Число @@ -40330,7 +40979,7 @@ ПравоДоступа(ИмяПрава, ОбъектМетаданных, , ИмяСтандартногоРеквизита); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Если ЗначениеЗаполнено(ТекстОшибки) Тогда @@ -41479,6 +42128,42 @@ #Область ОбновлениеПрогрессаОбновленияДоступа +// Возвращаемое значение: +// Структура: +// * СтрокиСписков - Соответствие +// * СвойстваСписков - Соответствие +// * КоличествоКлючей - Число +// * ДатаПоследнегоОбновления - Дата +// +Функция НовыеХранимыеДанныеОбновленияПрогресса() Экспорт + + ХранимыеДанные = Новый Структура; + ХранимыеДанные.Вставить("СтрокиСписков", Новый Соответствие); + ХранимыеДанные.Вставить("СвойстваСписков", Новый Соответствие); + ХранимыеДанные.Вставить("КоличествоКлючей", 0); + ХранимыеДанные.Вставить("ДатаПоследнегоОбновления", '00010101'); + + Возврат ХранимыеДанные; + +КонецФункции + +// Параметры: +// Контекст - Структура: +// * Версия - Число +// * ХранимыеДанные - см. НовыеХранимыеДанныеОбновленияПрогресса +// * РассчитыватьПоКоличествуДанных - Булево +// * ПоказыватьОбработанныеСписки - Булево +// * ЭтоПовторноеОбновлениеПрогресса - Булево +// * ВсегоОбновлено - Число +// * ПериодОбновленияПрогресса - Число +// * АвтообновлениеПрогресса - Булево +// * ДобавленныеСтроки - Массив +// * УдаленныеСтроки - Соответствие +// * ИзмененныеСтроки - Соответствие +// * ОбновлениеДоступаВыполняется - Булево +// +// АдресРезультата - Строка +// Процедура ОбновитьПрогрессВФоне(Контекст, АдресРезультата) Экспорт Если Контекст.Свойство("Версия") И Контекст.Версия = 1 Тогда @@ -41487,9 +42172,9 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); Если СтандартныеПодсистемыСервер.ЭтоОшибкаТребованияПерезапускаСеанса(ИнформацияОбОшибке) Тогда - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); Иначе - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); КонецЕсли; Контекст.Вставить("ТекстОшибки", ТекстОшибки); КонецПопытки; @@ -41513,7 +42198,7 @@ Контекст.ХранимыеДанные.ДатаПоследнегоОбновления = '00010101'; КонецЕсли; - ДействующиеПараметры = Неопределено; + ДействующиеПараметры = Неопределено; // См. ДействующиеПараметрыОграниченияДоступа ИдентификаторыТаблиц = ИдентификаторыСписковСОграничением(ДействующиеПараметры); Если Контекст.ПоказыватьОбработанныеСписки Тогда @@ -42030,6 +42715,21 @@ КонецПроцедуры +// Параметры: +// Контекст - Структура: +// * ДобавленныеСтроки - Массив +// * ИзмененныеСтроки - Соответствие +// * СвойстваСписков - Соответствие +// * СтрокиСписков - Соответствие +// * ДействующиеПараметры - см. ДействующиеПараметрыОграниченияДоступа +// * СтрокиОбновленияКоличестваЭлементов - Массив +// * СтрокиОбновленияКоличестваКлючейДоступа - Массив +// * ИдентификаторыТаблиц - см. ОбщегоНазначения.ИдентификаторыОбъектовМетаданных +// * ХранимыеДанные - см. НовыеХранимыеДанныеОбновленияПрогресса +// * ТипыТаблицПоИменам - Соответствие +// +// ВсегоОбновлено - Число +// Процедура РассчитатьВсегоОбновленоПоКоличествуДанных(Контекст, ВсегоОбновлено) ТипыТаблицПоИменам = УправлениеДоступомСлужебныйПовтИсп.СинтаксисЯзыка().ТипыТаблиц.ПоИменам; @@ -42417,6 +43117,7 @@ ТекстыПорцииЗапросов = Новый Массив; Для Каждого ТекстЗапроса Из ОписаниеЗапроса.ТекстыПакетаЗапросов Цикл Если ТекстыПорцииЗапросов.Количество() = 200 Тогда + // @skip-check query-in-loop - Порционная обработка данных ДобавитьРезультатыЗапроса(РезультатыПакетаЗапросов, ТекстыПорцииЗапросов, ОписаниеЗапроса); ТекстыПорцииЗапросов = Новый Массив; КонецЕсли; @@ -42490,8 +43191,12 @@ Функция ТекстЗапросаКоличестваЭлементовРегистра(Контекст, Строка, Индекс, ДляВнешнихПользователей) - Свойства = Контекст.ДействующиеПараметры.ДополнительныйКонтекст[?(ДляВнешнихПользователей, - "ДляВнешнихПользователей", "ДляПользователей")].СвойстваОграниченияСписков.Получить(Строка.ИмяТаблицы); + Если ДляВнешнихПользователей Тогда + ДополнительныйКонтекст = Контекст.ДействующиеПараметры.ДополнительныйКонтекст.ДляВнешнихПользователей; + Иначе + ДополнительныйКонтекст = Контекст.ДействующиеПараметры.ДополнительныйКонтекст.ДляПользователей; + КонецЕсли; + Свойства = ДополнительныйКонтекст.СвойстваОграниченияСписков.Получить(Строка.ИмяТаблицы); Если Свойства = Неопределено Или Свойства.ОпорныеПоля = Неопределено @@ -42617,8 +43322,11 @@ ЗаполнитьДолиКоличествоЭлементовСсылочногоТипа(ДолиКоличестваЭлементов, ПоследнийОбновленныйЭлемент, Строка.ИмяТаблицы); Иначе - ДополнительныйКонтекст = Контекст.ДействующиеПараметры.ДополнительныйКонтекст[?(ДляВнешнихПользователей, - "ДляВнешнихПользователей", "ДляПользователей")]; + Если ДляВнешнихПользователей Тогда + ДополнительныйКонтекст = Контекст.ДействующиеПараметры.ДополнительныйКонтекст.ДляВнешнихПользователей; + Иначе + ДополнительныйКонтекст = Контекст.ДействующиеПараметры.ДополнительныйКонтекст.ДляПользователей; + КонецЕсли; СвойстваОграничения = ДополнительныйКонтекст.СвойстваОграниченияСписков.Получить(Строка.ИмяТаблицы); Если СвойстваОграничения <> Неопределено Тогда @@ -42992,6 +43700,12 @@ КонецПроцедуры +// Параметры: +// ДействующиеПараметры - см. ДействующиеПараметрыОграниченияДоступа +// +// Возвращаемое значение: +// см. ОбщегоНазначения.ИдентификаторыОбъектовМетаданных +// Функция ИдентификаторыСписковСОграничением(ДействующиеПараметры) ДействующиеПараметры = ДействующиеПараметрыОграниченияДоступа(Неопределено, Неопределено, Ложь); diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl index 8a909bd45..de9a41bc9 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl @@ -284,7 +284,7 @@ // Только для внутреннего использования. // // Возвращаемое значение: -// ХранилищеЗначения Из ТаблицаЗначений +// ХранилищеЗначения - содержит тип ТаблицаЗначений // Функция ТаблицаПустыхСсылокУказанныхТипов(ПолноеИмяРеквизита) Экспорт @@ -578,7 +578,9 @@ Функция КэшИзмененныхСписковПриОтключенномОбновленииКлючейДоступа() Экспорт - Возврат ПараметрыСеанса.ОтключениеОбновленияКлючейДоступа.ИзмененныеСписки.Получить(); + ОтключениеОбновления = ПараметрыСеанса.ОтключениеОбновленияКлючейДоступа; // См. УправлениеДоступомСлужебный.НовоеОтключениеОбновленияКлючейДоступа + + Возврат ОтключениеОбновления.ИзмененныеСписки.Получить(); КонецФункции diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl index 1faaf3beb..1f8a33dd0 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl @@ -1702,14 +1702,9 @@ // - ДокументОбъект - объект-владелец контактной информации. // Если это ссылка, то контактная информация // будет получена из объекта по ссылке, иначе из таблицы КонтактнаяИнформация объекта. -// ДополнительныеПараметры - Структура - описание настроек контактной информации - см. ПараметрыКонтактнойИнформации. -// Предыдущее название параметра ИмяЭлементаДляРазмещения. Устарел, следует -// использовать ДополнительныеПараметры. Группа, куда будут размещены элементы -// контактной информации. +// ДополнительныеПараметры - см. ПараметрыКонтактнойИнформации. +// - Строка - устарел. // УдалитьПоложениеЗаголовкаКИ - ПоложениеЗаголовкаЭлементаФормы - устарел, следует использовать ДополнительныеПараметры. -// Может принимать значения: -// ПоложениеЗаголовкаЭлементаФормы.Верх или -// ПоложениеЗаголовкаЭлементаФормы.Лево (по умолчанию). // УдалитьИсключаемыеВиды - Массив - устарел,следует использовать ДополнительныеПараметры. // УдалитьОтложеннаяИнициализация - Массив - устарел,следует использовать ДополнительныеПараметры. // @@ -1725,6 +1720,8 @@ ИсключаемыеВиды = ?(ДополнительныеПараметры.Свойство("ИсключаемыеВиды"), ДополнительныеПараметры.ИсключаемыеВиды, Неопределено); СкрываемыеВиды = ?(ДополнительныеПараметры.Свойство("СкрываемыеВиды"), ДополнительныеПараметры.СкрываемыеВиды, Неопределено); ИмяЭлементаДляРазмещения = ?(ДополнительныеПараметры.Свойство("ИмяЭлементаДляРазмещения"), ДополнительныеПараметры.ИмяЭлементаДляРазмещения, "ГруппаКонтактнаяИнформация"); + РазрешитьДобавлениеПолей = ?(ДополнительныеПараметры.Свойство("РазрешитьДобавлениеПолей"), ДополнительныеПараметры.РазрешитьДобавлениеПолей, Истина); + РазмещеныНаФорме = ?(ДополнительныеПараметры.Свойство("РазмещеныНаФорме"), ДополнительныеПараметры.РазмещеныНаФорме, Неопределено); ОбработкаНавигационнойСсылки = ?(ДополнительныеПараметры.Свойство("ОбработкаНавигационнойСсылки"), ДополнительныеПараметры.ОбработкаНавигационнойСсылки, Ложь); Иначе ИмяЭлементаДляРазмещения = ?(ДополнительныеПараметры = Неопределено, "ГруппаКонтактнаяИнформация", ДополнительныеПараметры); @@ -1732,12 +1729,32 @@ ИсключаемыеВиды = УдалитьИсключаемыеВиды; СкрываемыеВиды = Неопределено; ПоложениеЗаголовкаКИ = УдалитьПоложениеЗаголовкаКИ; + РазрешитьДобавлениеПолей = Истина; + РазмещеныНаФорме = Неопределено; ОбработкаНавигационнойСсылки = Ложь; КонецЕсли; Если ИсключаемыеВиды = Неопределено Тогда ИсключаемыеВиды = Новый Массив; КонецЕсли; + + Если РазмещеныНаФорме = Неопределено Тогда + РазмещеныНаФорме = Новый Соответствие; + Для Каждого ИсключаемыйВид Из ИсключаемыеВиды Цикл + РазмещеныНаФорме.Вставить(ИсключаемыйВид, Истина); + КонецЦикла; + Иначе + РазмещеныНаФормеСсылки = Новый Соответствие(); + Виды = УправлениеКонтактнойИнформациейСлужебныйПовтИсп.ВидыКонтактнойИнформацииПоИмени(); + Для Каждого ЭлементНаФорме Из РазмещеныНаФорме Цикл + Если ТипЗнч(ЭлементНаФорме.Ключ) = Тип("Строка") Тогда + РазмещеныНаФормеСсылки.Вставить(Виды.Получить(ЭлементНаФорме.Ключ), Истина); + Иначе + РазмещеныНаФормеСсылки.Вставить(ЭлементНаФорме.Ключ, Истина); + КонецЕсли; + КонецЦикла; + РазмещеныНаФорме = РазмещеныНаФормеСсылки; + КонецЕсли; Если СкрываемыеВиды = Неопределено Тогда СкрываемыеВиды = Новый Массив; @@ -1753,6 +1770,8 @@ ИмяОбъекта = МетаданныеОбъекта.Имя; ЭтоОсновнойЯзык = ОбщегоНазначения.ЭтоОсновнойЯзык(); + НастройкиКИ = НастройкиПодсистемы(Объект.Ссылка); + ГруппаВидовКонтактнойИнформации = ГруппаВидовКонтактнойИнформацииОбъекта(ПолноеИмяОбъектаМетаданных); ИспользуетсяКонтактнаяИнформация = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ГруппаВидовКонтактнойИнформации, "Используется"); Если ИспользуетсяКонтактнаяИнформация = Ложь Тогда @@ -1764,6 +1783,11 @@ ПараметрыВыводаКонтактнойИнформации.Вставить("ИсключаемыеВиды", ИсключаемыеВиды); ПараметрыВыводаКонтактнойИнформации.Вставить("СкрываемыеВиды", СкрываемыеВиды); ПараметрыВыводаКонтактнойИнформации.Вставить("СсылкаНаОбъект", СсылкаНаОбъект); + ПараметрыВыводаКонтактнойИнформации.Вставить("ОписаниеКоманд", НастройкиКИ.ОписаниеКоманд); + ПараметрыВыводаКонтактнойИнформации.Вставить("ОтображатьИконки", НастройкиКИ.ОтображатьИконки); + ПараметрыВыводаКонтактнойИнформации.Вставить("РазмещеныНаФорме", РазмещеныНаФорме); + ПараметрыВыводаКонтактнойИнформации.Вставить("РазрешитьДобавлениеПолей", РазрешитьДобавлениеПолей); + ПараметрыВыводаКонтактнойИнформации.Вставить("ОбработкаНавигационнойСсылки", ОбработкаНавигационнойСсылки); СкрытьКонтактнуюИнформацию(Форма, ДобавляемыеРеквизиты, ПараметрыВыводаКонтактнойИнформации); @@ -1791,7 +1815,7 @@ | ПО (КонтактнаяИнформация.Вид = ВидыКонтактнойИнформации.Ссылка) |ГДЕ | КонтактнаяИнформация.Ссылка = &Ссылка УПОРЯДОЧИТЬ ПО Вид, ДействуетС"; - + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПутьКТаблицеКонтактнойИнформации", ПолноеИмяОбъектаМетаданных + ".КонтактнаяИнформация"); Если ЕстьКолонкаИдентификаторСтрокиТабличнойЧасти Тогда @@ -1859,10 +1883,14 @@ КонвертацияКонтактнойИнформацииВJSON(КонтактнаяИнформация); КонтактнаяИнформация.Сортировать("РеквизитДопУпорядочивания, НомерСтроки"); - СоздатьРеквизитыКонтактнойИнформации(Форма, ДобавляемыеРеквизиты, ИмяОбъекта, ИсключаемыеВиды, КонтактнаяИнформация, ОтложеннаяИнициализация, ОбработкаНавигационнойСсылки); + СоздатьРеквизитыКонтактнойИнформации(Форма, ДобавляемыеРеквизиты, ИмяОбъекта, РазмещеныНаФорме, КонтактнаяИнформация, + ОтложеннаяИнициализация, ОбработкаНавигационнойСсылки); - ПараметрыКонтактнойИнформации = ПараметрыВыводаКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ, - ОтложеннаяИнициализация, ИсключаемыеВиды, СкрываемыеВиды); + ДополнительныеПараметры = ДополнительныеПараметрыВыводаКонтактнойИнформации(НастройкиКИ.ОписаниеКоманд, + НастройкиКИ.ОтображатьИконки, РазмещеныНаФорме, РазрешитьДобавлениеПолей, ИсключаемыеВиды, СкрываемыеВиды); + + ПараметрыКонтактнойИнформации = ПараметрыВыводаКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения, + ПоложениеЗаголовкаКИ, ОтложеннаяИнициализация, ДополнительныеПараметры); ПараметрыКонтактнойИнформации.Владелец = СсылкаНаОбъект; ПараметрыКонтактнойИнформации.ПараметрыАдреса.ТипПомещения = ТипПомещения; ПараметрыКонтактнойИнформации.ОбработкаНавигационнойСсылки = ОбработкаНавигационнойСсылки; @@ -1871,13 +1899,47 @@ КоличествоАдресов = КонтактнаяИнформация.НайтиСтроки(Отбор).Количество(); // Создадим элементы на форме и заполним значения реквизитов. - СозданныеЭлементы = ОбщегоНазначения.СкопироватьРекурсивно(ИсключаемыеВиды); + СозданныеЭлементы = ОбщегоНазначения.СкопироватьРекурсивно(РазмещеныНаФорме); ПредыдущийВид = Неопределено; + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + Форма.Элементы[ИмяЭлементаДляРазмещения].ШрифтЗаголовка = ШрифтыСтиля.ВажнаяНадписьШрифт; + КонецЕсли; + + ИмяГруппы = "ГруппаЗначенияКомандыКИ" + ИмяЭлементаДляРазмещения; + ГруппаЗначенияКомандыКИ = Форма.Элементы.Найти(ИмяГруппы); + + Если ГруппаЗначенияКомандыКИ = Неопределено Тогда + Родитель = Родитель(Форма, ИмяЭлементаДляРазмещения); + ГруппаЗначенияКомандыКИ = Форма.Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"), Родитель); + ГруппаЗначенияКомандыКИ.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ГруппаЗначенияКомандыКИ.Заголовок = НСтр("ru='Значения контактной информации'"); + ГруппаЗначенияКомандыКИ.ОтображатьЗаголовок = Ложь; + ГруппаЗначенияКомандыКИ.РазрешитьИзменениеСостава = Ложь; + ГруппаЗначенияКомандыКИ.Отображение = ОтображениеОбычнойГруппы.Нет; + ГруппаЗначенияКомандыКИ.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + ГруппаЗначенияКомандыКИ.ГоризонтальноеПоложениеВГруппе = ГоризонтальноеПоложениеЭлемента.Право; + ГруппаЗначенияКомандыКИ.РастягиватьПоГоризонтали = Ложь; + ГруппаЗначенияКомандыКИ.Объединенная = Ложь; + КонецЕсли; + + ИмяГруппы = "ГруппаЗначенияКИ"+ИмяЭлементаДляРазмещения; + ГруппаЗначенияКИ = Форма.Элементы.Найти(ИмяГруппы); + + Если ГруппаЗначенияКИ = Неопределено Тогда + ГруппаЗначенияКИ = Форма.Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"), ГруппаЗначенияКомандыКИ); + ГруппаЗначенияКИ.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ГруппаЗначенияКИ.Заголовок = НСтр("ru='Значения и команды контактной информации'"); + ГруппаЗначенияКИ.ОтображатьЗаголовок = Ложь; + ГруппаЗначенияКИ.РазрешитьИзменениеСостава = Ложь; + ГруппаЗначенияКИ.Отображение = ОтображениеОбычнойГруппы.Нет; + ГруппаЗначенияКИ.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + КонецЕсли; + Для Каждого СтрокаКИ Из КонтактнаяИнформация Цикл ДанныеВидаКонтактнойИнформации = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(СтрокаКИ); - + Если СтрокаКИ.ЭтоРеквизитТабличнойЧасти Тогда СоздатьЭлементыТабличнойЧасти(Форма, ИмяОбъекта, ИмяЭлементаДляРазмещения, СтрокаКИ, ДанныеВидаКонтактнойИнформации); Продолжить; @@ -1887,16 +1949,38 @@ Продолжить; КонецЕсли; - ИндексЭлемента = СозданныеЭлементы.Найти(СтрокаКИ.Вид); - СтатическийЭлемент = ИндексЭлемента <> Неопределено; + СозданныйЭлемент = СозданныеЭлементы.Получить(СтрокаКИ.Вид); + Если СозданныйЭлемент <> Неопределено Тогда + СозданныйЭлемент = СтрокаКИ.Вид; + КонецЕсли; + СтатическийЭлемент = СозданныйЭлемент <> Неопределено; ЭтоНовыйВидКИ = (СтрокаКИ.Вид <> ПредыдущийВид); + Если НЕ СтрокаКИ.ЭтоИсторическаяКонтактнаяИнформация Тогда + ПредыдущийВид = СтрокаКИ.Вид; + КонецЕсли; + + Если НЕ СтрокаКИ.ОтображатьВсегда И ПустаяСтрока(СтрокаКИ.Значение) И НЕ СтатическийЭлемент Тогда + Если ЭтоНовыйВидКИ И Не СтрокаКИ.ПометкаУдаления Тогда + Вид = СтрокаКИ.Вид; // СправочникСсылка.ВидыКонтактнойИнформации + ДанныеВидаКонтактнойИнформации.Вставить("Ссылка", СтрокаКИ.Вид); + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + ПараметрыКонтактнойИнформации.СписокДобавляемыхЭлементов.Добавить(ДанныеВидаКонтактнойИнформации, Строка(Вид)); + Иначе + КартинкаТипа = КартинкаТипаКонтактнойИнформации(ДанныеВидаКонтактнойИнформации.Тип); + ПараметрыКонтактнойИнформации.СписокДобавляемыхЭлементов.Добавить(ДанныеВидаКонтактнойИнформации, Строка(Вид),,КартинкаТипа); + КонецЕсли; + КонецЕсли; + Продолжить; + КонецЕсли; + Если ОтложеннаяИнициализация Тогда ДобавитьРеквизитВОписание(Форма, СтрокаКИ, ДанныеВидаКонтактнойИнформации, ЭтоНовыйВидКИ,, СтатическийЭлемент, ИмяЭлементаДляРазмещения); Если СтатическийЭлемент Тогда - ПодготовитьСтатическийЭлемент(Форма, СтрокаКИ, СозданныеЭлементы, ИндексЭлемента); + ПодготовитьСтатическийЭлемент(Форма, СтрокаКИ, СозданныеЭлементы, СозданныйЭлемент, + ПараметрыКонтактнойИнформации.ОтображатьИконки, ИмяЭлементаДляРазмещения); КонецЕсли; Продолжить; КонецЕсли; @@ -1905,7 +1989,8 @@ НЕ СтрокаКИ.ЭтоИсторическаяКонтактнаяИнформация, ИмяЭлементаДляРазмещения); Если СтатическийЭлемент Тогда - ПодготовитьСтатическийЭлемент(Форма, СтрокаКИ, СозданныеЭлементы, ИндексЭлемента); + ПодготовитьСтатическийЭлемент(Форма, СтрокаКИ, СозданныеЭлементы, СозданныйЭлемент, + ПараметрыКонтактнойИнформации.ОтображатьИконки, ИмяЭлементаДляРазмещения); Иначе СледующаяСтрока = ?(СозданныеЭлементы.Количество() = 0, Неопределено, ОпределитьСледующуюСтроку(Форма, КонтактнаяИнформация, СтрокаКИ)); @@ -1916,15 +2001,16 @@ КонецЕсли; - Если НЕ СтрокаКИ.ЭтоИсторическаяКонтактнаяИнформация Тогда - ПредыдущийВид = СтрокаКИ.Вид; - КонецЕсли; - КонецЦикла; ОбновитьКонтекстноеМеню(Форма, ИмяЭлементаДляРазмещения); - Если Не ОтложеннаяИнициализация + Если ПравоДоступа("Изменение",Метаданные.Справочники.ВидыКонтактнойИнформации) Тогда + ПараметрыКонтактнойИнформации.СписокДобавляемыхЭлементов.Добавить(Новый Структура("Ссылка", + Справочники.ВидыКонтактнойИнформации.ПустаяСсылка()), НСтр("ru = 'Настроить...'")); + КонецЕсли; + + Если Не ОтложеннаяИнициализация И РазрешитьДобавлениеПолей И Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].СписокДобавляемыхЭлементов.Количество() > 0 Тогда ДобавитьКнопкуДополнительногоПоляКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения); Иначе @@ -1982,7 +2068,7 @@ МассивУдаляемыхРеквизитов = Новый Массив; ИмяОбъекта = Объект.Ссылка.Метаданные().Имя; - СтатическиеРеквизиты = ОбщегоНазначения.СкопироватьРекурсивно(Параметры.ИсключаемыеВиды); + СтатическиеРеквизиты = ОбщегоНазначения.СкопироватьРекурсивно(Параметры.РазмещеныНаФорме); ИменаТабличныхЧастейПоВидамКИ = Неопределено; Отбор = Новый Структура("ИмяЭлементаДляРазмещения", ИмяЭлементаДляРазмещения); @@ -1994,6 +2080,7 @@ Если ИменаТабличныхЧастейПоВидамКИ = Неопределено Тогда Отбор = Новый Структура("ЭтоРеквизитТабличнойЧасти", Истина); ВидыКИТабличнойЧасти = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).Выгрузить(Отбор, "Вид"); + // @skip-check query-in-loop - Выполняется только в одной итерации, при первом появлении реквизита табличной части ИменаТабличныхЧастейПоВидамКИ = ИменаТабличныхЧастейПоВидамКИ(ВидыКИТабличнойЧасти, ИмяОбъекта); КонецЕсли; @@ -2004,14 +2091,20 @@ ИначеЕсли НЕ РеквизитФормы.Свойство("ЭтоИсторическаяКонтактнаяИнформация") ИЛИ НЕ РеквизитФормы.ЭтоИсторическаяКонтактнаяИнформация Тогда - Индекс = СтатическиеРеквизиты.Найти(РеквизитФормы.Вид); + СтатическийРеквизит = СтатическиеРеквизиты.Получить(РеквизитФормы.Вид); + Если СтатическийРеквизит <> Неопределено Тогда + СтатическийРеквизит = РеквизитФормы.Вид; + КонецЕсли; - Если Индекс = Неопределено Тогда // Реквизит создается динамически. + Если СтатическийРеквизит = Неопределено Тогда // Реквизит создается динамически. Если Не ОтложеннаяИнициализация И ЗначениеЗаполнено(РеквизитФормы.ИмяРеквизита) Тогда МассивУдаляемыхРеквизитов.Добавить(РеквизитФормы.ИмяРеквизита); + Если ДляТипаКонтактнойИнформацииЕстьПолеКомментарий(РеквизитФормы.Тип, Параметры.ОбработкаНавигационнойСсылки) Тогда + МассивУдаляемыхРеквизитов.Добавить("Комментарий" + РеквизитФормы.ИмяРеквизита); + КонецЕсли; КонецЕсли; Иначе - СтатическиеРеквизиты.Удалить(Индекс); + СтатическиеРеквизиты.Удалить(СтатическийРеквизит); КонецЕсли; КонецЕсли; @@ -2023,10 +2116,9 @@ Форма.ИзменитьРеквизиты(, МассивУдаляемыхРеквизитов); ДополнительныеПараметры = ПараметрыКонтактнойИнформации(); + ЗаполнитьЗначенияСвойств(ДополнительныеПараметры, Параметры); ДополнительныеПараметры.ИмяЭлементаДляРазмещения = ИмяЭлементаДляРазмещения; ДополнительныеПараметры.ПоложениеЗаголовкаКИ = ПоложениеЗаголовкаКИ; - ДополнительныеПараметры.ИсключаемыеВиды = Параметры.ИсключаемыеВиды; - ДополнительныеПараметры.СкрываемыеВиды = Параметры.СкрываемыеВиды; ДополнительныеПараметры.ОтложеннаяИнициализация = ОтложеннаяИнициализация; ПриСозданииНаСервере(Форма, Объект, ДополнительныеПараметры); @@ -2113,6 +2205,7 @@ Если ИменаТабличныхЧастейПоВидамКИ = Неопределено Тогда Отбор = Новый Структура("ЭтоРеквизитТабличнойЧасти", Истина); ВидыКИТабличнойЧасти = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).Выгрузить(Отбор , "Вид"); + // @skip-check query-in-loop - Выполняется только в одной итерации, при первом появлении реквизита табличной части ИменаТабличныхЧастейПоВидамКИ = ИменаТабличныхЧастейПоВидамКИ(ВидыКИТабличнойЧасти, ИмяОбъекта); КонецЕсли; @@ -2266,6 +2359,7 @@ // * ОбновитьКонтекстноеМеню - Булево - при обновлении контекстного меню // * ИмяЭлементаДляРазмещения - Строка - если добавляет новый элемент, комментарий или обновляется контекстное меню // * Комментарий - Строка - при обновлении контекстного меню +// * Перечитать - Булево - если нужно полностью обновить контактную информацию в рамках элемента для размещения. // // Возвращаемое значение: // Неопределено - значение не используется, обратная совместимость. @@ -2277,9 +2371,9 @@ КонецЕсли; Если Результат.Свойство("ЭтоДобавлениеКомментария") Тогда - ИзменитьКомментарий(Форма, Результат.ИмяРеквизита, Результат.ИмяЭлементаДляРазмещения); + ИзменитьКомментарий(Форма, Результат.ИмяРеквизита, Результат.ИмяЭлементаДляРазмещения, Результат.ТипКонтактнойИнформации); ИначеЕсли Результат.Свойство("ДобавляемыйВид") Тогда - ДобавитьСтрокуКонтактнойИнформации(Форма, Результат, Результат.ИмяЭлементаДляРазмещения); + ДобавитьСтрокуКонтактнойИнформации(Форма, Результат, Результат.ИмяЭлементаДляРазмещения); ИначеЕсли Результат.Свойство("ПоменятьМестамиЭлементы") Тогда Отбор = Новый Структура("ИмяРеквизита", Результат.ПервыйЭлемент); @@ -2295,13 +2389,48 @@ ЗаполнитьЗначенияСвойств(ПервыйЭлемент, ВторойЭлемент, СписокПереносимыхСвойств); ЗаполнитьЗначенияСвойств(ВторойЭлемент, ВременныйБуфер); - Форма[Результат.ПервыйЭлемент] = ПервыйЭлемент.Представление; - Форма[Результат.ВторойЭлемент] = ВторойЭлемент.Представление; - - ПервыйЭлементКомментарий = Форма.Элементы[Результат.ПервыйЭлемент]; // ДекорацияФормы - ПервыйЭлементКомментарий.РасширеннаяПодсказка.Заголовок = ПервыйЭлемент.Комментарий; - ВторойЭлементКомментарий = Форма.Элементы[Результат.ВторойЭлемент]; // ДекорацияФормы - ВторойЭлементКомментарий.РасширеннаяПодсказка.Заголовок = ВторойЭлемент.Комментарий; + ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, + Результат.ИмяЭлементаДляРазмещения); + ОбработкаНавигационнойСсылки = ПараметрыКонтактнойИнформации.ОбработкаНавигационнойСсылки; + + ЭтоАдресГиперссылкой = ПервыйЭлемент.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес И ТипЗнч( + Форма.Элементы[Результат.ПервыйЭлемент].РасширеннаяПодсказка.Заголовок) = Тип("ФорматированнаяСтрока"); + + Если ПервыйЭлемент.Тип = Перечисления.ТипыКонтактнойИнформации.ВебСтраница И ОбработкаНавигационнойСсылки Тогда + Форма[Результат.ПервыйЭлемент] = УправлениеКонтактнойИнформациейКлиентСервер.АдресСайта( + ПервыйЭлемент.Представление, ПервыйЭлемент.Значение, Форма.ТолькоПросмотр); + Форма[Результат.ВторойЭлемент] = УправлениеКонтактнойИнформациейКлиентСервер.АдресСайта( + ВторойЭлемент.Представление, ВторойЭлемент.Значение, Форма.ТолькоПросмотр); + ИначеЕсли ЭтоАдресГиперссылкой Тогда + Форма[Результат.ПервыйЭлемент] = ?(ЗначениеЗаполнено(ПервыйЭлемент.Представление), ПервыйЭлемент.Представление, + УправлениеКонтактнойИнформациейКлиентСервер.ТекстПустогоАдресаВВидеГиперссылки()); + Форма[Результат.ВторойЭлемент] = ?(ЗначениеЗаполнено(ВторойЭлемент.Представление), ВторойЭлемент.Представление, + УправлениеКонтактнойИнформациейКлиентСервер.ТекстПустогоАдресаВВидеГиперссылки()); + Иначе + Форма[Результат.ПервыйЭлемент] = ПервыйЭлемент.Представление; + Форма[Результат.ВторойЭлемент] = ВторойЭлемент.Представление; + КонецЕсли; + + Если ДляТипаКонтактнойИнформацииЕстьПолеКомментарий(ПервыйЭлемент.Тип, ОбработкаНавигационнойСсылки) Тогда + Форма["Комментарий" + Результат.ПервыйЭлемент] = ПервыйЭлемент.Комментарий; + Форма["Комментарий" + Результат.ВторойЭлемент] = ВторойЭлемент.Комментарий; + ИначеЕсли ЭтоАдресГиперссылкой Тогда + КомандыДляВывода = УправлениеКонтактнойИнформациейКлиентСервер.КомандыДляВыводаНаФорму( + ПараметрыКонтактнойИнформации, ПервыйЭлемент.Тип, ПервыйЭлемент.Вид, ПервыйЭлемент.ХранитьИсториюИзменений); + + ПервыйЭлементКомментарий = Форма.Элементы[Результат.ПервыйЭлемент]; // ДекорацияФормы + ПервыйЭлементКомментарий.РасширеннаяПодсказка.Заголовок = УправлениеКонтактнойИнформациейКлиентСервер.РасширеннаяПодсказкаАдреса( + КомандыДляВывода, ПервыйЭлемент.Представление, ПервыйЭлемент.Комментарий); + + ВторойЭлементКомментарий = Форма.Элементы[Результат.ВторойЭлемент]; // ДекорацияФормы + ВторойЭлементКомментарий.РасширеннаяПодсказка.Заголовок = УправлениеКонтактнойИнформациейКлиентСервер.РасширеннаяПодсказкаАдреса( + КомандыДляВывода, ВторойЭлемент.Представление, ВторойЭлемент.Комментарий); + Иначе + ПервыйЭлементКомментарий = Форма.Элементы[Результат.ПервыйЭлемент]; // ДекорацияФормы + ПервыйЭлементКомментарий.РасширеннаяПодсказка.Заголовок = ПервыйЭлемент.Комментарий; + ВторойЭлементКомментарий = Форма.Элементы[Результат.ВторойЭлемент]; // ДекорацияФормы + ВторойЭлементКомментарий.РасширеннаяПодсказка.Заголовок = ВторойЭлемент.Комментарий; + КонецЕсли; КонецЕсли; @@ -2331,6 +2460,52 @@ КонецЕсли; КонецЕсли; + Если Результат.Свойство("Перечитать") И Результат.Свойство("ИмяЭлементаДляРазмещения") Тогда + ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, + Результат.ИмяЭлементаДляРазмещения); + + ОписаниеКонтактнойИнформации = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма); + КопияОписанияКИ = ДанныеФормыВЗначение(ОписаниеКонтактнойИнформации, Тип("ТаблицаЗначений")); + + ПриЧтенииНаСервере(Форма, ПараметрыКонтактнойИнформации.Владелец, Результат.ИмяЭлементаДляРазмещения); + + ОписаниеКонтактнойИнформации = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма); + Для Каждого Строка Из ОписаниеКонтактнойИнформации Цикл + Отбор = Новый Структура("ИмяРеквизита", Строка.ИмяРеквизита); + НайденныеСтроки = КопияОписанияКИ.НайтиСтроки(Отбор); + Если НайденныеСтроки.Количество() > 0 Тогда + НайденнаяСтрока = НайденныеСтроки[0]; + Если Строка.Комментарий <> НайденнаяСтрока.Комментарий И ДляТипаКонтактнойИнформацииЕстьПолеКомментарий( + Строка.Тип, ПараметрыКонтактнойИнформации.ОбработкаНавигационнойСсылки) Тогда + Форма["Комментарий"+Строка.ИмяРеквизита] = НайденнаяСтрока.Комментарий; + КонецЕсли; + Если Строка.Значение <> НайденнаяСтрока.Значение Тогда + Строка.Значение = НайденнаяСтрока.Значение; + Строка.Представление = НайденнаяСтрока.Представление; + Строка.Комментарий = НайденнаяСтрока.Комментарий; + Форма[Строка.ИмяРеквизита] = НайденнаяСтрока.Представление; + ЭтоАдресГиперссылкой = Строка.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес И ТипЗнч( + Форма.Элементы[Строка.ИмяРеквизита].РасширеннаяПодсказка.Заголовок) = Тип("ФорматированнаяСтрока"); + Если ЭтоАдресГиперссылкой Тогда + Форма[Строка.ИмяРеквизита] = ?(ЗначениеЗаполнено(НайденнаяСтрока.Представление), + НайденнаяСтрока.Представление, + УправлениеКонтактнойИнформациейКлиентСервер.ТекстПустогоАдресаВВидеГиперссылки()); + + КомандыДляВывода = УправлениеКонтактнойИнформациейКлиентСервер.КомандыДляВыводаНаФорму( + ПараметрыКонтактнойИнформации, Строка.Тип, Строка.Вид, Строка.ХранитьИсториюИзменений); + Форма.Элементы[Строка.ИмяРеквизита].РасширеннаяПодсказка.Заголовок = + УправлениеКонтактнойИнформациейКлиентСервер.РасширеннаяПодсказкаАдреса( + КомандыДляВывода, Строка.Представление, Строка.Комментарий); + Иначе + Форма[Строка.ИмяРеквизита] = НайденнаяСтрока.Представление; + Форма.Элементы[Строка.ИмяРеквизита].РасширеннаяПодсказка.Заголовок = Строка.Комментарий; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + Возврат Неопределено; КонецФункции @@ -2402,12 +2577,18 @@ УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).Очистить(); ПоложениеЗаголовкаКИ = ?(ЗначениеЗаполнено(ПараметрыКонтактнойИнформации.ПоложениеЗаголовка), ПредопределенноеЗначение(ПараметрыКонтактнойИнформации.ПоложениеЗаголовка), ПоложениеЗаголовкаЭлементаФормы.Лево); - ПриСозданииНаСервере(Форма, Объект, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ, ПараметрыКонтактнойИнформации.ИсключаемыеВиды); + + ДополнительныеПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформации(); + ДополнительныеПараметрыКонтактнойИнформации.ИмяЭлементаДляРазмещения = ИмяЭлементаДляРазмещения; + ДополнительныеПараметрыКонтактнойИнформации.ПоложениеЗаголовкаКИ = ПоложениеЗаголовкаКИ; + ДополнительныеПараметрыКонтактнойИнформации.РазмещеныНаФорме = ПараметрыКонтактнойИнформации.РазмещеныНаФорме; + + ПриСозданииНаСервере(Форма, Объект, ДополнительныеПараметрыКонтактнойИнформации); ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения); - Для Каждого ВидКонтактнойИнформации Из ПараметрыКонтактнойИнформации.ИсключаемыеВиды Цикл + Для Каждого ВидКонтактнойИнформации Из ПараметрыКонтактнойИнформации.РазмещеныНаФорме Цикл - Отбор = Новый Структура("Вид", ВидКонтактнойИнформации); + Отбор = Новый Структура("Вид", ВидКонтактнойИнформации.Ключ); МассивСтрок = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).НайтиСтроки(Отбор); Если МассивСтрок.Количество() > 0 Тогда @@ -2578,13 +2759,22 @@ // * ТипПомещения - Строка - наименование типа помещения, который будет установлен // в форме ввода нового адреса. По умолчанию, "Квартира". // * ИмяЭлементаДляРазмещения - Строка - группа, куда будут размещены элементы контактной информации. -// * ИсключаемыеВиды - Массив - виды контактной информации, которые при отложенной инициализации будут созданы на форме, -// только после вызова процедуры УправлениеКонтактнойИнформацией.ВыполнитьОтложеннуюИнициализацию. -// * СкрываемыеВиды - Массив - виды контактной информации, которые не требуется отображать на форме. +// * СкрываемыеВиды - Массив - виды контактной информации, которые не требуется отображать на форме. // * ОтложеннаяИнициализация - Булево - если Истина, то создание полей контактной информации на форме будет отложено. // * ПоложениеЗаголовкаКИ - ПоложениеЗаголовкаЭлементаФормы - может принимать значения: // ПоложениеЗаголовкаЭлементаФормы.Верх или // ПоложениеЗаголовкаЭлементаФормы.Лево (по умолчанию). +// * РазрешитьДобавлениеПолей - Булево - если Истина, то на форме владельца контактной информации, будет отображена кнопка +// для добавления дополнительной контактной информации +// * РазмещеныНаФорме - Соответствие из КлючИЗначение - виды контактной информации, которые были размещены на +// форме интерактивно, при отложенной инициализации будут созданы на форме +// после вызова процедуры УправлениеКонтактнойИнформацией.ВыполнитьОтложеннуюИнициализацию: +// ** Ключ - Строка - имя предопределенного вида контактной информации +// - СправочникСсылка.ВидыКонтактнойИнформации +// ** Значение - Булево - Истина +// * ОбработкаНавигационнойСсылки - Булево - если истина, то отображение контактной информации с типом ВебСтраница +// будет в виде гиперссылки +// * ИсключаемыеВиды - Массив - устарело. Следует использовать РазмещеныНаФорме. // Функция ПараметрыКонтактнойИнформации() Экспорт @@ -2594,14 +2784,220 @@ Результат.Вставить("Страна", Неопределено); Результат.Вставить("ОтложеннаяИнициализация", Ложь); Результат.Вставить("ПоложениеЗаголовкаКИ", ""); - Результат.Вставить("ИсключаемыеВиды", Неопределено); Результат.Вставить("СкрываемыеВиды", Неопределено); Результат.Вставить("ИмяЭлементаДляРазмещения", "ГруппаКонтактнаяИнформация"); + Результат.Вставить("ОбработкаНавигационнойСсылки", Ложь); + Результат.Вставить("РазрешитьДобавлениеПолей", Истина); + Результат.Вставить("РазмещеныНаФорме", Неопределено); + Результат.Вставить("ИсключаемыеВиды", Неопределено); Возврат Результат; КонецФункции +// Возвращает описание команд, разбитое по типам контактной информации. +// Полученное соответствие используется в УправлениеКонтактнойИнформациейПереопределяемый.ПриОпределенииНастроек +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - ПеречислениеСсылка.ТипыКонтактнойИнформации +// * Значение - см. КомандыТипаКонтактнойИнформации +// +Функция ОписаниеКоманд() Экспорт + + ОписаниеКоманд = Новый Соответствие; + ОписаниеКоманд.Вставить(Перечисления.ТипыКонтактнойИнформации.Адрес, КомандыТипаКонтактнойИнформации( + Перечисления.ТипыКонтактнойИнформации.Адрес)); + ОписаниеКоманд.Вставить(Перечисления.ТипыКонтактнойИнформации.Телефон, КомандыТипаКонтактнойИнформации( + Перечисления.ТипыКонтактнойИнформации.Телефон)); + ОписаниеКоманд.Вставить(Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты, + КомандыТипаКонтактнойИнформации(Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)); + ОписаниеКоманд.Вставить(Перечисления.ТипыКонтактнойИнформации.Skype, КомандыТипаКонтактнойИнформации( + Перечисления.ТипыКонтактнойИнформации.Skype)); + ОписаниеКоманд.Вставить(Перечисления.ТипыКонтактнойИнформации.ВебСтраница, КомандыТипаКонтактнойИнформации( + Перечисления.ТипыКонтактнойИнформации.ВебСтраница)); + ОписаниеКоманд.Вставить(Перечисления.ТипыКонтактнойИнформации.Факс, КомандыТипаКонтактнойИнформации( + Перечисления.ТипыКонтактнойИнформации.Факс)); + ОписаниеКоманд.Вставить(Перечисления.ТипыКонтактнойИнформации.Другое, КомандыТипаКонтактнойИнформации( + Перечисления.ТипыКонтактнойИнформации.Другое)); + + Возврат ОписаниеКоманд; + +КонецФункции + +// Возвращает описание команд, предназначенные для типа контактной информации, переданного в качестве параметра. +// Полученное соответствие используется в УправлениеКонтактнойИнформациейПереопределяемый.ПриОпределенииНастроек +// +// Параметры: +// Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации +// +// Возвращаемое значение: +// Структура - состав полей зависит от типа контактной информации. Для типа Адрес: ВвестиКомментарийКАдресу, +// ПоказатьНаКартеЯндекс, ПоказатьНаКартеGoogle, ЗапланироватьВстречу, ПоказатьИсториюИзменений. +// Для типа Телефон: ПозвонитьПоТелефону, ОтправитьSMS, ПоказатьИсториюИзменений. +// Для типа Факс: ОтправитьФакс, ПоказатьИсториюИзменений. +// Для типа АдресЭлектронной почты: НаписатьЭлектронноеПисьмо. +// Для типа Skype: ПозвонитьSkype, НачатьЧатSkype. +// Для типа ВебСтраница: ОткрытьВебСтраницу. +// Для типа Другое: ОткрытьОкноДругое. +// Состав полей: +// * ВвестиКомментарийКАдресу - см. ОписаниеКомандыПоИмени +// * ПоказатьНаКартеЯндекс - см. ОписаниеКомандыПоИмени +// * ПоказатьНаКартеGoogle - см. ОписаниеКомандыПоИмени +// * ЗапланироватьВстречу - см. ОписаниеКомандыПоИмени +// * ПоказатьИсториюИзменений - см. ОписаниеКомандыПоИмени +// * ПозвонитьПоТелефону - см. ОписаниеКомандыПоИмени +// * ОтправитьSMS - см. ОписаниеКомандыПоИмени +// * ОтправитьФакс - см. ОписаниеКомандыПоИмени +// * НаписатьЭлектронноеПисьмо - см. ОписаниеКомандыПоИмени +// * ПозвонитьSkype - см. ОписаниеКомандыПоИмени +// * НачатьЧатSkype - см. ОписаниеКомандыПоИмени +// * ОткрытьВебСтраницу - см. ОписаниеКомандыПоИмени +// * ОткрытьОкноДругое - см. ОписаниеКомандыПоИмени +// +Функция КомандыТипаКонтактнойИнформации(Тип) Экспорт + + Возврат УправлениеКонтактнойИнформациейСлужебныйПовтИсп.КомандыТипаКонтактнойИнформации(Тип); + +КонецФункции + +// Возвращает структуру с описанием команды контактной информации. +// Полученное соответствие используется в УправлениеКонтактнойИнформациейПереопределяемый.ПриОпределенииНастроек +// +// Параметры: +// ИмяКоманды - Строка - имя команды, описание которой нужно получить. +// +// Возвращаемое значение: +// см. СвойстваКоманды +// +Функция ОписаниеКомандыПоИмени(ИмяКоманды) Экспорт + + // Команда для типа Адрес, Телефон, Факс + Если ИмяКоманды = "ПоказатьИсториюИзменений" Тогда + Возврат СвойстваКоманды( + НСтр("ru = 'История изменений...'"), + НСтр("ru = 'Показывает историю изменения контактной информации'"), + БиблиотекаКартинок.ИсторияИзменений, + "УправлениеКонтактнойИнформациейКлиент.ПередОткрытиемФормыИсторииИзменений", + Истина); + КонецЕсли; + + // Команды для типа Адрес + Если ИмяКоманды = "ВвестиКомментарийКАдресу" Тогда + Возврат СвойстваКоманды( + НСтр("ru = 'Ввести комментарий'"), + НСтр("ru = 'Ввести комментарий'"), + БиблиотекаКартинок.Комментарий, + "УправлениеКонтактнойИнформациейКлиент.ПередВводомКомментария", + Истина); + ИначеЕсли ИмяКоманды = "ПоказатьНаКартеЯндекс" Тогда + Возврат СвойстваКоманды( + НСтр("ru = 'Адрес на Яндекс.Картах'"), + НСтр("ru = 'Показывает адрес на картах Яндекс.Карты'"), + БиблиотекаКартинок.ЯндексКарты, + "УправлениеКонтактнойИнформациейКлиент.ПередПоказомАдресаНаКартеЯндекс"); + ИначеЕсли ИмяКоманды = "ПоказатьНаКартеGoogle" Тогда + Возврат СвойстваКоманды( + НСтр("ru = 'Адрес на Google Maps'"), + НСтр("ru = 'Показывает адрес на карте Google Maps'"), + БиблиотекаКартинок.GoogleMaps, + "УправлениеКонтактнойИнформациейКлиент.ПередПоказомАдресаНаКартеGoogle"); + ИначеЕсли ИмяКоманды = "ЗапланироватьВстречу" Тогда + Возврат СвойстваКоманды("", ""); + КонецЕсли; + + // Команды для типа Телефон + Если ИмяКоманды = "ПозвонитьПоТелефону" Тогда + Возврат СвойстваКоманды( + НСтр("ru = 'Позвонить'"), + НСтр("ru = 'Позвонить по телефону'"), + БиблиотекаКартинок.Позвонить, + "УправлениеКонтактнойИнформациейКлиент.ПередТелефоннымЗвонком"); + ИначеЕсли ИмяКоманды = "ОтправитьSMS" Тогда + Возврат СвойстваКоманды( + НСтр("ru = 'Отправить SMS'"), + НСтр("ru = 'Отправить SMS'"), + БиблиотекаКартинок.ОтправитьSMS, + "УправлениеКонтактнойИнформациейКлиент.ПередСозданиемSMS"); + КонецЕсли; + + // Команды для типа Факс + Если ИмяКоманды = "ОтправитьФакс" Тогда + Возврат СвойстваКоманды("", ""); + КонецЕсли; + + // Команды для типа АдресЭлектроннойПочты + Если ИмяКоманды = "НаписатьЭлектронноеПисьмо" Тогда + Возврат СвойстваКоманды( + НСтр("ru = 'Написать письмо'"), + НСтр("ru = 'Написать письмо на указанный адрес'"), + БиблиотекаКартинок.ОтправитьЭлектронноеПисьмо, + "УправлениеКонтактнойИнформациейКлиент.ПередСозданиемЭлектронногоПисьма"); + КонецЕсли; + + // Команды для типа Skype + Если ИмяКоманды = "ПозвонитьSkype" Тогда + Возврат СвойстваКоманды( + НСтр("ru = 'Позвонить'"), + НСтр("ru = 'Позвонить на Skype'"), + БиблиотекаКартинок.Позвонить, + "УправлениеКонтактнойИнформациейКлиент.ПередЗвонкомНаSkype"); + ИначеЕсли ИмяКоманды = "НачатьЧатSkype" Тогда + Возврат СвойстваКоманды( + НСтр("ru = 'Начать чат'"), + НСтр("ru = 'Начать чат в Skype'"), + БиблиотекаКартинок.ОтправитьSMS, + "УправлениеКонтактнойИнформациейКлиент.ПередНачаломБеседыВSkype"); + КонецЕсли; + + // Команды для типа ВебСтраница + Если ИмяКоманды = "ОткрытьВебСтраницу" Тогда + Возврат СвойстваКоманды( + НСтр("ru = 'Перейти'"), + НСтр("ru = 'Перейти по ссылке'"), + БиблиотекаКартинок.КонтактнаяИнформацияПерейтиПоСсылке, + "УправлениеКонтактнойИнформациейКлиент.ПередПереходомПоВебСсылке"); + КонецЕсли; + + // Команды типа Другое + Если ИмяКоманды = "ОткрытьОкноДругое" Тогда + Возврат СвойстваКоманды("", ""); + КонецЕсли; + +КонецФункции + +// Возвращает структуру для описания команд контактной информации. +// Полученная структура используется в УправлениеКонтактнойИнформациейПереопределяемый.ПриОпределенииНастроек +// +// Параметры: +// Заголовок - Строка - заголовок команды. +// Подсказка - Строка - подсказка команды. +// Картинка - Картинка - картинка команды. +// Действие - Строка - полный путь к процедуре, которую необходимо выполнить. +// Например, "_ДемоСтандартныеПодсистемыКлиент.ОткрытьФормуДокументаВстреча". +// ИзменяетСохраняемыеДанные - Булево +// +// Возвращаемое значение: +// Структура: +// * Заголовок - Строка +// * Подсказка - Строка +// * Картинка - Картинка +// * Действие - Строка +// * ИзменяетСохраняемыеДанные - Булево +// +Функция СвойстваКоманды(Заголовок, Подсказка, Картинка = "", Действие = "", ИзменяетСохраняемыеДанные = Ложь) Экспорт + + Свойства = Новый Структура; + Свойства.Вставить("Заголовок", Заголовок); + Свойства.Вставить("Подсказка", Подсказка); + Свойства.Вставить("Картинка", ?(Картинка="", Новый Картинка(), Картинка)); + Свойства.Вставить("Действие", Действие); + Свойства.Вставить("ИзменяетСохраняемыеДанные", ИзменяетСохраняемыеДанные); + + Возврат Свойства; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Проверка и сведения об адресе @@ -2661,7 +3057,7 @@ // Устанавливает свойства группы контактной информации. // // Параметры: -// Параметры - Структура - содержит структуру с полями: +// Параметры - Структура: // * Код - Строка - код вида контактной информации для идентификации элемента. // * Наименование - Строка - наименование вида контактной информации. // * Имя - Строка - имя предопределенного вида контактной информации; @@ -2758,7 +3154,7 @@ // ** ТелефонCДобавочнымНомером - Булево - для типа Телефон или Факс. Если Истина, то телефон/факс содержит // добавочный номер. // ** ВводитьНомерПоМаске - Булево - для типа Телефон или Факс. Если Истина, если требуется ввод телефона по маске. -// ** МаскаНомераТелефон - Строка - для типа Телефон или Факс. Содержит посимвольную строку маски +// ** МаскаНомераТелефона - Строка - для типа Телефон или Факс. Содержит посимвольную строку маски // интерактивного ввода текста в поле. Формат маски соответствует // платформенной маске для поля ввода. // ** ЗапрещатьВводНекорректного - Булево - устарел. Все переданные значения игнорируются. @@ -2785,7 +3181,7 @@ КонецЕсли; ЗаполнитьЗначенияСвойств(Объект, Параметры, "Тип, МожноИзменятьСпособРедактирования, - |ВидРедактирования, ОбязательноеЗаполнение, РазрешитьВводНесколькихЗначений, + |ВидРедактирования, ОбязательноеЗаполнение, РазрешитьВводНесколькихЗначений, ОтображатьВсегда, |ЗапретитьРедактированиеПользователем, Используется, ХранитьИсториюИзменений ,МеждународныйФорматАдреса, ИсправлятьУстаревшиеАдреса"); Если ЗначениеЗаполнено(Параметры.Имя) Тогда @@ -2876,7 +3272,7 @@ // ГруппаКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации- группа контактной информации. // // Возвращаемое значение: -// Структура - содержит структуру с полями: +// Структура: // * Имя - Строка - уникальное имя вида контактной информации. // * Наименование - Строка - наименование вида контактной информации. // * Группа - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на группу(родителя) элемента справочника. @@ -3329,7 +3725,7 @@ // Параметры: // Форма - ФормаКлиентскогоПриложения - передаваемая форма. // Элементы - Соответствие из КлючИЗначение - список видов контактной информации, для которых устанавливается доступ: -// * Ключ - ОбъектМетаданных - подсистема, в которой размещается отчет или вариант отчета. +// * Ключ - ОбъектМетаданных - подсистема, в которой размещается отчет или вариант отчета; // * Значение - Булево - если ЛОЖЬ, то элемент доступен только для просмотра. // ИмяЭлементаДляРазмещения - Строка - имя группы, где размещена контактная информация. // @@ -3568,8 +3964,9 @@ // Форма - ФормаКлиентскогоПриложения // ДобавляемыеРеквизиты - Массив из РеквизитФормы // ИмяОбъекта - Строка -// ИсключаемыеВиды - Массив -// - Неопределено +// РазмещеныНаФорме - Соответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.ВидыКонтактнойИнформации +// * Значение - Булево // КонтактнаяИнформация - КоллекцияСтрокДереваЗначений: // * Вид - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации. // * ИмяПредопределенногоВида - Строка @@ -3600,13 +3997,13 @@ // - Массив // ОбработкаНавигационнойСсылки - Булево // -Процедура СоздатьРеквизитыКонтактнойИнформации(Знач Форма, Знач ДобавляемыеРеквизиты, Знач ИмяОбъекта, Знач ИсключаемыеВиды, +Процедура СоздатьРеквизитыКонтактнойИнформации(Знач Форма, Знач ДобавляемыеРеквизиты, Знач ИмяОбъекта, Знач РазмещеныНаФорме, Знач КонтактнаяИнформация, Знач ОтложеннаяИнициализация, Знач ОбработкаНавигационнойСсылки) - Строка1500 = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(1500)); + Строка1500 = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(1500)); ФорматированнаяСтрока = Новый ОписаниеТипов("ФорматированнаяСтрока"); - СозданныеРеквизиты = ОбщегоНазначения.СкопироватьРекурсивно(ИсключаемыеВиды); + СозданныеРеквизиты = ОбщегоНазначения.СкопироватьРекурсивно(РазмещеныНаФорме); ПредыдущийВид = Неопределено; ПорядковыйНомер = 1; @@ -3615,7 +4012,7 @@ Если ОбъектКонтактнойИнформации.ПометкаУдаления И ПустаяСтрока(ОбъектКонтактнойИнформации.Значение) Тогда Продолжить; КонецЕсли; - + Если ОбъектКонтактнойИнформации.ЭтоРеквизитТабличнойЧасти Тогда ИмяВидаКИ = ОбъектКонтактнойИнформации.ИмяПредопределенногоВида; @@ -3647,7 +4044,7 @@ КонецЦикла; Иначе - + Если ОбъектКонтактнойИнформации.ЭтоИсторическаяКонтактнаяИнформация Тогда СкорректироватьКонтактнуюИнформацию(Форма, ОбъектКонтактнойИнформации); Продолжить; @@ -3655,6 +4052,15 @@ ТекущийВид = ОбъектКонтактнойИнформации.Вид; + СозданныйРеквизит = СозданныеРеквизиты.Получить(ТекущийВид); + Если СозданныйРеквизит <> Неопределено Тогда + СозданныйРеквизит = ТекущийВид; + КонецЕсли; + + Если НЕ ОбъектКонтактнойИнформации.ОтображатьВсегда И ПустаяСтрока(ОбъектКонтактнойИнформации.Значение) И СозданныйРеквизит = Неопределено Тогда + Продолжить; + КонецЕсли; + Если ТекущийВид <> ПредыдущийВид Тогда ПредыдущийВид = ТекущийВид; ПорядковыйНомер = 1; @@ -3662,10 +4068,15 @@ ПорядковыйНомер = ПорядковыйНомер + 1; КонецЕсли; - Индекс = СозданныеРеквизиты.Найти(ТекущийВид); - Если Индекс = Неопределено Тогда + ЕстьПолеКомментарий = ДляТипаКонтактнойИнформацииЕстьПолеКомментарий(ОбъектКонтактнойИнформации.Тип, ОбработкаНавигационнойСсылки); + + Если СозданныйРеквизит = Неопределено Тогда ОбъектКонтактнойИнформации.ИмяРеквизита = "КонтактнаяИнформацияПоле" + СтрЗаменить(ТекущийВид.УникальныйИдентификатор(), "-", "x") + ПорядковыйНомер; + Если ЕстьПолеКомментарий Тогда + ОбъектКонтактнойИнформации.ИмяРеквизитаКомментарий = "КомментарийКонтактнаяИнформацияПоле" + СтрЗаменить( + ТекущийВид.УникальныйИдентификатор(), "-", "x") + ПорядковыйНомер; + КонецЕсли; Если Не ОтложеннаяИнициализация Тогда ТипРеквизита = Строка1500; @@ -3675,10 +4086,17 @@ ДобавляемыеРеквизиты.Добавить( Новый РеквизитФормы(ОбъектКонтактнойИнформации.ИмяРеквизита, ТипРеквизита,, ОбъектКонтактнойИнформации.Наименование, Истина)); + Если ЕстьПолеКомментарий Тогда + ДобавляемыеРеквизиты.Добавить( + Новый РеквизитФормы(ОбъектКонтактнойИнформации.ИмяРеквизитаКомментарий, ТипРеквизита,, ОбъектКонтактнойИнформации.Наименование, Истина)); + КонецЕсли; КонецЕсли; Иначе ОбъектКонтактнойИнформации.ИмяРеквизита = "КонтактнаяИнформацияПоле" + ОбъектКонтактнойИнформации.ИмяПредопределенногоВида; - СозданныеРеквизиты.Удалить(Индекс); + Если ЕстьПолеКомментарий Тогда + ОбъектКонтактнойИнформации.ИмяРеквизитаКомментарий = "КомментарийКонтактнаяИнформацияПоле" + ОбъектКонтактнойИнформации.ИмяПредопределенногоВида; + КонецЕсли; + СозданныеРеквизиты.Удалить(СозданныйРеквизит); КонецЕсли; СкорректироватьКонтактнуюИнформацию(Форма, ОбъектКонтактнойИнформации); @@ -3704,9 +4122,11 @@ КонецЕсли; КонецЦикла; - ПараметрыКонтактнойИнформации = ПараметрыВыводаКонтактнойИнформации(Форма, ПараметрыВывода.ИмяЭлементаДляРазмещения, - ПараметрыВывода.ПоложениеЗаголовкаКИ, ПараметрыВывода.ОтложеннаяИнициализация, + ДополнительныеПараметры = ДополнительныеПараметрыВыводаКонтактнойИнформации(ПараметрыВывода.ОписаниеКоманд, + ПараметрыВывода.ОтображатьИконки, ПараметрыВывода.РазмещеныНаФорме, ПараметрыВывода.РазрешитьДобавлениеПолей, ПараметрыВывода.ИсключаемыеВиды, ПараметрыВывода.СкрываемыеВиды); + ПараметрыКонтактнойИнформации = ПараметрыВыводаКонтактнойИнформации(Форма, ПараметрыВывода.ИмяЭлементаДляРазмещения, + ПараметрыВывода.ПоложениеЗаголовкаКИ, ПараметрыВывода.ОтложеннаяИнициализация, ДополнительныеПараметры); ПараметрыКонтактнойИнформации.ДобавленныеРеквизиты = ДобавленныеРеквизиты; ПараметрыКонтактнойИнформации.Владелец = ПараметрыВывода.СсылкаНаОбъект; @@ -3720,14 +4140,18 @@ Процедура ДобавитьКнопкуДополнительногоПоляКонтактнойИнформации(Знач Форма, Знач ИмяЭлементаДляРазмещения) Описание = НСтр("ru = 'Добавить дополнительное поле контактной информации'"); - ГруппаКоманды = Группа("ГруппаКонтактнаяИнформацияДобавитьПолеВвода" + ИмяЭлементаДляРазмещения, Форма, Описание, ИмяЭлементаДляРазмещения); + ГруппаКоманды = Группа("ГруппаКонтактнаяИнформацияДобавитьПолеВвода" + ИмяЭлементаДляРазмещения, + Форма, Описание, ИмяЭлементаДляРазмещения, "ГруппаЗначенияКомандыКИ"+ИмяЭлементаДляРазмещения); ГруппаКоманды.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение; + ГруппаКоманды.ГоризонтальноеПоложениеВГруппе = ГоризонтальноеПоложениеЭлемента.Право; ИмяКоманды = "КонтактнаяИнформацияДобавитьПолеВвода" + ИмяЭлементаДляРазмещения; Команда = Форма.Команды.Добавить(ИмяКоманды); Команда.Подсказка = Описание; Команда.Отображение = ОтображениеКнопки.КартинкаИТекст; - Команда.Картинка = БиблиотекаКартинок.ДобавитьЭлементСписка; + Если НЕ ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + Команда.Картинка = БиблиотекаКартинок.ВыпадающийСписок; + КонецЕсли; Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; ПараметрыКонтактнойИнформацииЭлемента = Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения]; // см. ПараметрыВыводаКонтактнойИнформации @@ -3735,11 +4159,48 @@ Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаКоманды); Кнопка.Доступность = НЕ Форма.Элементы[ИмяЭлементаДляРазмещения].ТолькоПросмотр; - Кнопка.Заголовок = НСтр("ru = 'Добавить'"); - Команда.ИзменяетСохраняемыеДанные = Истина; - Кнопка.ИмяКоманды = ИмяКоманды; + Кнопка.Заголовок = "+ " + НСтр("ru = 'Телефон, адрес'"); + Команда.ИзменяетСохраняемыеДанные = Истина; + Кнопка.ИмяКоманды = ИмяКоманды; + Кнопка.ГоризонтальноеПоложениеВГруппе = ГоризонтальноеПоложениеЭлемента.Право; + Кнопка.ПоложениеКартинки = ПоложениеКартинкиКнопкиФормы.Право; ПараметрыКонтактнойИнформацииЭлемента.ДобавленныеЭлементы.Добавить(ИмяКоманды, 2, Ложь); - + + Если НЕ ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + // Определение варианта отображения кнопки (Слева, с отступом, без отступа) + // Обработка ситуации, когда на форме выводится одновременно динамическая и статическая контактная информация. + ЭлементыГруппыДляРазмещения = Форма.Элементы[ИмяЭлементаДляРазмещения].ПодчиненныеЭлементы; + КоличествоГруппВОсновной = ЭлементыГруппыДляРазмещения.Количество(); + ЭлементыГруппыЗначенияКИ = Форма.Элементы["ГруппаЗначенияКИ"+ИмяЭлементаДляРазмещения].ПодчиненныеЭлементы; + КоличествоГрупп = ЭлементыГруппыЗначенияКИ.Количество(); + + Если КоличествоГрупп = 0 И КоличествоГруппВОсновной = 1 Тогда + ГруппаКоманды.ГоризонтальноеПоложениеВГруппе = ГоризонтальноеПоложениеЭлемента.Лево; + Кнопка.ГоризонтальноеПоложениеВГруппе = ГоризонтальноеПоложениеЭлемента.Лево; + Иначе + Если КоличествоГрупп = 0 И КоличествоГруппВОсновной > 1 Тогда + ПоследняяГруппа = ЭлементыГруппыДляРазмещения[КоличествоГруппВОсновной - 2]; + ИначеЕсли КоличествоГрупп > 0 Тогда + ПоследняяГруппа = ЭлементыГруппыЗначенияКИ[КоличествоГрупп - 1]; + КонецЕсли; + + ЕстьСтатическиеКнопкаКИ = ЕстьКнопкаКонтактнойИнформации(ЭлементыГруппыДляРазмещения, Ложь); + ЕстьДинамическаяКнопкаКИ = ЕстьКнопкаКонтактнойИнформации(ЭлементыГруппыЗначенияКИ, Ложь); + + Если ПоследняяГруппа <> Неопределено И ЕстьГиперссылка(ПоследняяГруппа) Тогда + ГруппаКоманды.ГоризонтальноеПоложениеВГруппе = ГоризонтальноеПоложениеЭлемента.Лево; + Кнопка.ГоризонтальноеПоложениеВГруппе = ГоризонтальноеПоложениеЭлемента.Лево; + ИначеЕсли ПоследняяГруппа <> Неопределено И НЕ ЕстьКнопкаКонтактнойИнформации(ПоследняяГруппа, Истина) + И (ЕстьСтатическиеКнопкаКИ ИЛИ ЕстьДинамическаяКнопкаКИ) Тогда + Декорация = Форма.Элементы.Добавить("ОтступДобавить", Тип("ДекорацияФормы"), ГруппаКоманды); + Декорация.Вид = ВидДекорацииФормы.Картинка; + Декорация.Ширина = 3; + Декорация.Заголовок = НСтр("ru='Отступ'"); + Декорация.Высота = 1; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецПроцедуры Процедура ДобавитьПояснениеПоСбросуНастроекФормы(Знач Форма, Знач ИмяЭлементаДляРазмещения, Знач ОтложеннаяИнициализация) @@ -3784,12 +4245,7 @@ КонецФункции -Процедура ИзменитьКомментарий(Форма, ИмяРеквизита, ИмяЭлементаДляРазмещения) - - ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения); - Если ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.НайтиПоЗначению(ИмяРеквизита) = Неопределено Тогда - Возврат; - КонецЕсли; +Процедура ИзменитьКомментарий(Форма, ИмяРеквизита, ИмяЭлементаДляРазмещения, ТипКонтактнойИнформации) ОписаниеКонтактнойИнформации = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма); @@ -3803,8 +4259,20 @@ НайденнаяСтрока.Значение = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(КонтактнаяИнформацияПоПолям); КонецЕсли; - ПолеВвода = Форма.Элементы.Найти(ИмяРеквизита); // ДополнениеЭлементаФормы - ПолеВвода.РасширеннаяПодсказка.Заголовок = НайденнаяСтрока.Комментарий; + ПараметрыКИ = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения); + ОбработкаНавигационнойСсылки = ПараметрыКИ.ОбработкаНавигационнойСсылки; + Если НЕ ДляТипаКонтактнойИнформацииЕстьПолеКомментарий(ТипКонтактнойИнформации, ОбработкаНавигационнойСсылки) Тогда + ПолеВвода = Форма.Элементы.Найти(ИмяРеквизита); // ДополнениеЭлементаФормы + Если ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Адрес + И ТипЗнч(ПолеВвода.РасширеннаяПодсказка.Заголовок) = Тип("ФорматированнаяСтрока") Тогда + КомандыДляВывода = УправлениеКонтактнойИнформациейКлиентСервер.КомандыДляВыводаНаФорму(ПараметрыКИ, + ТипКонтактнойИнформации, НайденнаяСтрока.Вид, НайденнаяСтрока.ХранитьИсториюИзменений); + ПолеВвода.РасширеннаяПодсказка.Заголовок = УправлениеКонтактнойИнформациейКлиентСервер.РасширеннаяПодсказкаАдреса( + КомандыДляВывода, НайденнаяСтрока.Представление, НайденнаяСтрока.Комментарий); + Иначе + ПолеВвода.РасширеннаяПодсказка.Заголовок = НайденнаяСтрока.Комментарий; + КонецЕсли; + КонецЕсли; КонецПроцедуры @@ -3830,6 +4298,10 @@ ТаблицаКонтактнойИнформации = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма); ОтборПоВиду = Новый Структура("Вид, ЭтоИсторическаяКонтактнаяИнформация", ДобавляемыйВид, Ложь); + ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения); + ОбработкаНавигационнойСсылки = ПараметрыКонтактнойИнформации.ОбработкаНавигационнойСсылки; + ЕстьПолеКомментарий = ДляТипаКонтактнойИнформацииЕстьПолеКомментарий(ИнформацияОВидеКИ.Тип, ОбработкаНавигационнойСсылки); + Если ДобавлениеНовогоЗначения Тогда НайденныеСтроки = ТаблицаКонтактнойИнформации.НайтиСтроки(ОтборПоВиду); @@ -3839,7 +4311,7 @@ ПоследняяСтрока = НайденныеСтроки.Получить(КоличествоСтрокВида - 1); ИндексДобавляемойСтроки = ТаблицаКонтактнойИнформации.Индекс(ПоследняяСтрока) + 1; Иначе - ИндексДобавляемойСтроки = 0; + ИндексДобавляемойСтроки = ТаблицаКонтактнойИнформации.Количество(); КонецЕсли; ЭтоПоследняяСтрока = Ложь; @@ -3852,14 +4324,19 @@ "КонтактнаяИнформацияПоле", СтрЗаменить(ДобавляемыйВид.УникальныйИдентификатор(), "-", "x"), КоличествоСтрокВида + 1); + ИмяРеквизитаКомментарий = ""; + Если ЕстьПолеКомментарий Тогда + ИмяРеквизитаКомментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1%2%3%4", + "Комментарий", "КонтактнаяИнформацияПоле", + СтрЗаменить(ДобавляемыйВид.УникальныйИдентификатор(), "-", "x"), + КоличествоСтрокВида + 1); + КонецЕсли; НоваяСтрока.ИмяРеквизита = ИмяРеквизита; + НоваяСтрока.ИмяРеквизитаКомментарий = ИмяРеквизитаКомментарий; НоваяСтрока.Вид = ДобавляемыйВид; НоваяСтрока.Тип = ИнформацияОВидеКИ.Тип; НоваяСтрока.ИмяЭлементаДляРазмещения = ИмяЭлементаДляРазмещения; - НоваяСтрока.ЭтоРеквизитТабличнойЧасти = Ложь; - - ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения); - ОбработкаНавигационнойСсылки = ПараметрыКонтактнойИнформации.ОбработкаНавигационнойСсылки; + НоваяСтрока.ЭтоРеквизитТабличнойЧасти = Ложь; Если ОбработкаНавигационнойСсылки = Истина И ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда ОписаниеТипаРеквизита = Новый ОписаниеТипов("ФорматированнаяСтрока"); @@ -3869,6 +4346,9 @@ МассивДобавляемыхРеквизитов = Новый Массив; МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяРеквизита, ОписаниеТипаРеквизита,, ИнформацияОВидеКИ.Наименование, Истина)); + Если ЕстьПолеКомментарий Тогда + МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяРеквизитаКомментарий, ОписаниеТипаРеквизита,, ИнформацияОВидеКИ.Наименование, Истина)); + КонецЕсли; Форма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); ЕстьКомментарий = Ложь; @@ -3876,39 +4356,71 @@ Иначе ЭтоПоследняяСтрока = СледующаяСтрока = Неопределено; ИмяРеквизита = ИнформацияОВидеКИ.ИмяРеквизита; + ИмяРеквизитаКомментарий = ИнформацияОВидеКИ.ИмяРеквизитаКомментарий; ЕстьКомментарий = ЗначениеЗаполнено(ИнформацияОВидеКИ.Комментарий); ОбязательноеЗаполнение = ИнформацияОВидеКИ.ОбязательноеЗаполнение; КонецЕсли; // Отрисовка на форме - ГруппаСтроки = Группа("Группа" + ИмяРеквизита, Форма, ДобавляемыйВид.Наименование, ИмяЭлементаДляРазмещения); + Если ОбщегоНазначения.ЭтоМобильныйКлиент() И ПараметрыКонтактнойИнформации.ОтображатьИконки Тогда + ГруппаСтрокиЗаголовок = Группа("ГруппаЗаголовок" + ИмяРеквизита, Форма, ДобавляемыйВид.Наименование, ИмяЭлементаДляРазмещения, "ГруппаЗначенияКИ"+ИмяЭлементаДляРазмещения, 6); + ГруппаСтрокиЗаголовок.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + ГруппаСтрокиЗаголовок.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение; + ГруппаСтрокиЗаголовокКартинка = Группа("ГруппаЗаголовокКартинка" + ИмяРеквизита, Форма, ДобавляемыйВид.Наименование, ИмяЭлементаДляРазмещения, "ГруппаЗаголовок" + ИмяРеквизита); + Декорация = Форма.Элементы.Добавить("Картинка" + ИмяРеквизита, Тип("ДекорацияФормы"), ГруппаСтрокиЗаголовокКартинка); + Декорация.Заголовок = НСтр("ru='Картинка'"); + Декорация.Вид = ВидДекорацииФормы.Картинка; + Декорация.Ширина = 2; + Декорация.Картинка = КартинкаТипаКонтактнойИнформации(ИнформацияОВидеКИ.Тип); + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить("Картинка" + ИмяРеквизита, 2, Ложь); + ДекорацияЗаголовок = Форма.Элементы.Добавить("Заголовок" + ИмяРеквизита, Тип("ДекорацияФормы"), ГруппаСтрокиЗаголовокКартинка); + ДекорацияЗаголовок.Заголовок = ВРег(ДобавляемыйВид.Наименование); + ДекорацияЗаголовок.Вид = ВидДекорацииФормы.Надпись; + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить("Заголовок" + ИмяРеквизита, 2, Ложь); + ИмяГруппыРодителя = "ГруппаЗаголовок" + ИмяРеквизита; + Иначе + ИмяГруппыРодителя = "ГруппаЗначенияКИ"+ИмяЭлементаДляРазмещения; + КонецЕсли; + + ГруппаСтроки = Группа("Группа" + ИмяРеквизита, Форма, ДобавляемыйВид.Наименование, ИмяЭлементаДляРазмещения, + ИмяГруппыРодителя); + - Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + Если ОбщегоНазначения.ЭтоМобильныйКлиент() И НЕ ПараметрыКонтактнойИнформации.ОтображатьИконки Тогда ГруппаСтроки.ОтображатьЗаголовок = Истина; КонецЕсли; - Родитель = Родитель(Форма, ИмяЭлементаДляРазмещения); - Если Не ЭтоПоследняяСтрока Тогда - Если СледующаяСтрока = Неопределено Тогда + Родитель = Форма.Элементы["ГруппаЗначенияКИ" + ИмяЭлементаДляРазмещения]; + Если ОбщегоНазначения.ЭтоМобильныйКлиент() И ПараметрыКонтактнойИнформации.ОтображатьИконки Тогда + + Если Не ЭтоПоследняяСтрока И СледующаяСтрока = Неопределено Тогда + ИмяСледующейГруппы = "ГруппаЗаголовок" + ПоследняяСтрока.ИмяРеквизита; + Если Форма.Элементы.Найти(ИмяСледующейГруппы) <> Неопределено Тогда + ИндексСледующейГруппы = Родитель.ПодчиненныеЭлементы.Индекс(Форма.Элементы[ИмяСледующейГруппы]) + 1; + СледующаяГруппа = Родитель.ПодчиненныеЭлементы.Получить(ИндексСледующейГруппы); + Форма.Элементы.Переместить(ГруппаСтрокиЗаголовок, Родитель, СледующаяГруппа); + КонецЕсли; + КонецЕсли; + + Иначе + Если Не ЭтоПоследняяСтрока И СледующаяСтрока = Неопределено Тогда ИмяСледующейГруппы = "Группа" + ПоследняяСтрока.ИмяРеквизита; Если Форма.Элементы.Найти(ИмяСледующейГруппы) <> Неопределено Тогда ИндексСледующейГруппы = Родитель.ПодчиненныеЭлементы.Индекс(Форма.Элементы[ИмяСледующейГруппы]) + 1; СледующаяГруппа = Родитель.ПодчиненныеЭлементы.Получить(ИндексСледующейГруппы); - КонецЕсли; - Иначе - ИмяГруппы = "Группа" + СледующаяСтрока.ИмяРеквизита; - Если Форма.Элементы.Найти(ИмяГруппы) <> Неопределено Тогда - СледующаяГруппа = Форма.Элементы[ИмяГруппы]; + Форма.Элементы.Переместить(ГруппаСтроки, Родитель, СледующаяГруппа); КонецЕсли; КонецЕсли; - Форма.Элементы.Переместить(ГруппаСтроки, Родитель, СледующаяГруппа); - ИначеЕсли ДобавлениеНовогоЗначения Тогда - СледующаяГруппа = Форма.Элементы[Результат.ИмяКоманды].Родитель; - Форма.Элементы.Переместить(ГруппаСтроки, Родитель, СледующаяГруппа); + + КонецЕсли; + + Если ОбщегоНазначения.ЭтоМобильныйКлиент() И ПараметрыКонтактнойИнформации.ОтображатьИконки Тогда + ИмяСледующейГруппыТекущегоВида = "ГруппаЗаголовок" + ИмяРеквизита; + Иначе + ИмяСледующейГруппыТекущегоВида = "Группа" + ИмяРеквизита; КонецЕсли; // Обработка ситуации, когда на форме выводится одновременно множественная динамическая и статическая контактная информация. - ИмяСледующейГруппыТекущегоВида = "Группа" + ИмяРеквизита; Если Форма.Элементы.Найти(ИмяСледующейГруппыТекущегоВида) <> Неопределено Тогда Отбор = Новый Структура("ИмяРеквизита", ИмяРеквизита); @@ -3920,31 +4432,76 @@ ИндексПредыдущейГруппыВида = Родитель.ПодчиненныеЭлементы.Индекс(Форма.Элементы[ИмяСледующейГруппыТекущегоВида]) - 1; Если ИндексПредыдущейГруппыВида >= 0 Тогда ПредыдущаяГруппаВида = Родитель.ПодчиненныеЭлементы.Получить(ИндексПредыдущейГруппыВида); - + Если ПредыдущаяГруппаВида <> Неопределено Тогда - - Отбор = Новый Структура("ИмяРеквизита", СтрЗаменить(ПредыдущаяГруппаВида.Имя, "Группа", "")); - НайденныеСтрокиПредыдущегоВида = ТаблицаКонтактнойИнформации.НайтиСтроки(Отбор); - Если НайденныеСтрокиПредыдущегоВида.Количество() > 0 Тогда - ПредыдущийВид = НайденныеСтрокиПредыдущегоВида[0].Вид; - КонецЕсли; - - Если ТекущийВид <> ПредыдущийВид Тогда - ЭтоНовыйВидКИ = Истина; - КонецЕсли; + + Если ОбщегоНазначения.ЭтоМобильныйКлиент() И ПараметрыКонтактнойИнформации.ОтображатьИконки Тогда + Отбор = Новый Структура("ИмяРеквизита", СтрЗаменить(ПредыдущаяГруппаВида.Имя, "ГруппаЗаголовок", "")); + Иначе + Отбор = Новый Структура("ИмяРеквизита", СтрЗаменить(ПредыдущаяГруппаВида.Имя, "Группа", "")); + КонецЕсли; + НайденныеСтрокиПредыдущегоВида = ТаблицаКонтактнойИнформации.НайтиСтроки(Отбор); + Если НайденныеСтрокиПредыдущегоВида.Количество() > 0 Тогда + ПредыдущийВид = НайденныеСтрокиПредыдущегоВида[0].Вид; + КонецЕсли; + + Если ТекущийВид <> ПредыдущийВид Тогда + ЭтоНовыйВидКИ = Истина; + КонецЕсли; КонецЕсли; Иначе ЭтоНовыйВидКИ = Истина; КонецЕсли; КонецЕсли; + + Если ПараметрыКонтактнойИнформации.ОтображатьИконки И НЕ ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + ГруппаСтроки.Объединенная = Ложь; + Декорация = Форма.Элементы.Добавить("Картинка" + ИмяРеквизита, Тип("ДекорацияФормы"), ГруппаСтроки); + Декорация.Заголовок = НСтр("ru='Картинка'"); + Декорация.Вид = ВидДекорацииФормы.Картинка; + Декорация.Ширина = 2; + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить("Картинка" + ИмяРеквизита, 2, Ложь); + Если ЭтоНовыйВидКИ Тогда + Декорация.Картинка = КартинкаТипаКонтактнойИнформации(ИнформацияОВидеКИ.Тип); + Иначе + Декорация.Заголовок = НСтр("ru='Отступ'"); + Декорация.Высота = 1; + КонецЕсли; + КонецЕсли; - ПолеВвода = СоздатьПолеВвода(Форма, ГруппаСтроки, ИнформацияОВидеКИ, ИмяРеквизита, ИмяЭлементаДляРазмещения, ЭтоНовыйВидКИ, ОбязательноеЗаполнение); + Если ЕстьПолеКомментарий Тогда + ГруппаПолеКомментарий = Группа("ГруппаКомментарий" + ИмяРеквизита, Форма, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 поле, комментарий'"), + ДобавляемыйВид.Наименование), ИмяЭлементаДляРазмещения, "Группа" + ИмяРеквизита, 4); + Иначе + ГруппаПолеКомментарий = ГруппаСтроки; + КонецЕсли; + + ПолеВвода = СоздатьПолеВвода(Форма, ГруппаПолеКомментарий, ИнформацияОВидеКИ, ИмяРеквизита, ИмяЭлементаДляРазмещения, ЭтоНовыйВидКИ, ОбязательноеЗаполнение); Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда ПолеВвода.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; КонецЕсли; - Если ЕстьКомментарий Тогда + Если ЕстьПолеКомментарий Тогда + ПолеКомментарий = Форма.Элементы.Добавить(ИмяРеквизитаКомментарий, Тип("ПолеФормы"), ГруппаПолеКомментарий); + ПолеКомментарий.Вид = ВидПоляФормы.ПолеВвода; + ПолеКомментарий.Заголовок = НСтр("ru='Комментарий'"); + ПолеКомментарий.ПутьКДанным = ИмяРеквизитаКомментарий; + ПолеКомментарий.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + ПолеКомментарий.ПропускатьПриВводе = Истина; + ПолеКомментарий.ПодсказкаВвода = НСтр("ru='Примечание'"); + ПолеКомментарий.АвтоМаксимальнаяШирина = Ложь; + ПолеКомментарий.МаксимальнаяШирина = 30; + ПолеКомментарий.Ширина = 30; + ПолеКомментарий.РастягиватьПоГоризонтали = Ложь; + ПолеКомментарий.РастягиватьПоВертикали = Ложь; + ПолеКомментарий.УстановитьДействие("ПриИзменении", "Подключаемый_КонтактнаяИнформацияПриИзменении"); + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяРеквизитаКомментарий, 2, Ложь); + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + ПолеКомментарий.МногострочныйРежим = Истина; + КонецЕсли; + ИначеЕсли ЕстьКомментарий Тогда ПолеВвода.РасширеннаяПодсказка.Заголовок = ИнформацияОВидеКИ.Комментарий; ПолеВвода.РасширеннаяПодсказка.АвтоМаксимальнаяШирина = Ложь; ПолеВвода.РасширеннаяПодсказка.МаксимальнаяШирина = ПолеВвода.Ширина; @@ -3956,7 +4513,7 @@ КоличествоАдресов = ТаблицаКонтактнойИнформации.НайтиСтроки(ОтборПоТипу).Количество(); КонецЕсли; - СоздатьДействие(Форма, ИнформацияОВидеКИ, ИмяРеквизита, ГруппаСтроки, КоличествоАдресов, ЕстьКомментарий, ИмяЭлементаДляРазмещения); + СоздатьДействие(Форма, ИнформацияОВидеКИ, ИмяРеквизита, ГруппаСтроки, ИмяЭлементаДляРазмещения); Если Не ЭтоНовыйВидКИ Тогда Если ТаблицаКонтактнойИнформации.Количество() > 1 И ТаблицаКонтактнойИнформации[0].Свойство("ЭтоИсторическаяКонтактнаяИнформация") Тогда @@ -4036,19 +4593,30 @@ Элемент.РастягиватьПоГоризонтали = Ложь; Элемент.РастягиватьПоВертикали = Ложь; - Элемент.ВысотаЗаголовка = ?(ОбщегоНазначения.ЭтоМобильныйКлиент(), 1, 2); + Элемент.ВысотаЗаголовка = ?(ОбщегоНазначения.ЭтоМобильныйКлиент(), 1, 3); Если ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда Если ИнформацияОВидеКИ.ВидРедактирования = "ПолеВвода" Тогда - Элемент.Ширина = 72; - Иначе + Элемент.КнопкаВыпадающегоСписка = Истина; Элемент.Ширина = 70; + ИначеЕсли ИнформацияОВидеКИ.ВидРедактирования = "Диалог" Тогда + Элемент.Ширина = 73; + Иначе + Элемент.КнопкаВыпадающегоСписка = Истина; + Элемент.Ширина = 68; КонецЕсли; ИначеЕсли ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Или ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Факс Тогда - Если ИнформацияОВидеКИ.ВводитьНомерПоМаске Тогда - Если ПустаяСтрока(Форма[ИмяРеквизита]) Тогда + Если ИнформацияОВидеКИ.ВидРедактирования = "ПолеВвода" Тогда + Элемент.Ширина = 40; + Иначе + Элемент.Ширина = 38; + КонецЕсли; + + Если ИнформацияОВидеКИ.ВводитьНомерПоМаске Тогда + НомерТелефонаСоответствуетМаске = УправлениеКонтактнойИнформациейСлужебный.НомерТелефонаСоответствуетМаске(Форма[ИмяРеквизита], ИнформацияОВидеКИ.МаскаНомераТелефона); + Если ПустаяСтрока(Форма[ИмяРеквизита]) ИЛИ НомерТелефонаСоответствуетМаске Тогда Элемент.Маска = ИнформацияОВидеКИ.МаскаНомераТелефона; КонецЕсли; @@ -4063,19 +4631,31 @@ ИначеЕсли ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Другое Тогда Если ИнформацияОВидеКИ.ВидПоляДругое = "МногострочноеШирокое" Тогда Элемент.Высота = 3; - Элемент.Ширина = 70; + Элемент.Ширина = 72; Элемент.МногострочныйРежим = Истина; ИначеЕсли ИнформацияОВидеКИ.ВидПоляДругое = "ОднострочноеШирокое" Тогда Элемент.Высота = 1; - Элемент.Ширина = 70; + Элемент.Ширина = 72; Элемент.МногострочныйРежим = Ложь; Иначе // ОднострочноеУзкое Элемент.Высота = 1; Элемент.Ширина = 35; Элемент.МногострочныйРежим = Ложь; КонецЕсли; + ИначеЕсли ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда + Если ОбработкаНавигационнойСсылки Тогда + Элемент.Ширина = 73; + Иначе + Элемент.Ширина = 40; + КонецЕсли; + ИначеЕсли ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Skype Тогда + Элемент.Ширина = 40; Иначе - Элемент.Ширина = 35; + Если ИнформацияОВидеКИ.ВидРедактирования = "ПолеВвода" Тогда + Элемент.Ширина = 40; + Иначе + Элемент.Ширина = 35; + КонецЕсли; КонецЕсли; Если Не ЭтоНовыйВидКИ Тогда @@ -4092,78 +4672,13 @@ ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяРеквизита, 2, Ложь); - // Устанавливаем свойства поля ввода. - Если ИнформацияОВидеКИ.Тип <> Перечисления.ТипыКонтактнойИнформации.Другое И Не ИнформацияОВидеКИ.ПометкаУдаления Тогда - // Ввод комментария через контекстное меню. - ИмяКоманды = "КонтекстноеМеню" + ИмяРеквизита; - Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), Элемент.КонтекстноеМеню); - Кнопка.Заголовок = НСтр("ru = 'Ввести комментарий'"); - Команда = Форма.Команды.Добавить(ИмяКоманды); - Команда.Подсказка = НСтр("ru = 'Ввести комментарий'"); - Команда.Картинка = БиблиотекаКартинок.Комментарий; - Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; - Команда.ИзменяетСохраняемыеДанные = Истина; - Кнопка.ИмяКоманды = ИмяКоманды; - - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1); - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); - КонецЕсли; - - Если ИнформацияОВидеКИ.ХранитьИсториюИзменений И Не ИнформацияОВидеКИ.ПометкаУдаления Тогда - // Вывод истории контактной информации через контекстное меню. - ИмяКоманды = "КонтекстноеМенюИстория" + ИмяРеквизита; - Кнопка = Форма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), Элемент.КонтекстноеМеню); - Кнопка.Заголовок = НСтр("ru = 'История изменений...'"); - Команда = Форма.Команды.Добавить(ИмяКоманды); - Команда.Картинка = БиблиотекаКартинок.ИсторияИзменений; - Команда.Подсказка = НСтр("ru = 'Показывает историю изменения контактной информации'"); - Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; - Команда.ИзменяетСохраняемыеДанные = Ложь; - Кнопка.ИмяКоманды = ИмяКоманды; - - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1); - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); - КонецЕсли; - - Если ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда - ГруппаРазделительКарты = Форма.Элементы.Добавить("ПодменюРазделительКонтекстКарты" + ИмяРеквизита, Тип("ГруппаФормы"), Элемент.КонтекстноеМеню); - ГруппаРазделительКарты.Вид = ВидГруппыФормы.ГруппаКнопок; - - ИмяКоманды = "КонтекстноеМенюКартаЯндекс" + ИмяРеквизита; - Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаРазделительКарты); - Кнопка.Заголовок = НСтр("ru = 'Адрес на Яндекс.Картах'"); - Команда = Форма.Команды.Добавить(ИмяКоманды); - Команда.Картинка = БиблиотекаКартинок.ЯндексКарты; - Команда.Подсказка = НСтр("ru = 'Показывает адрес на картах Яндекс.Карты'"); - Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; - Кнопка.ИмяКоманды = ИмяКоманды; - - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1); - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); - - ИмяКоманды = "КонтекстноеМенюКартаGoogle" + ИмяРеквизита; - Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаРазделительКарты); - Кнопка.Заголовок = НСтр("ru = 'Адрес на Google Maps'"); - Команда = Форма.Команды.Добавить(ИмяКоманды); - Команда.Картинка = БиблиотекаКартинок.GoogleMaps; - Команда.Подсказка = НСтр("ru = 'Показывает адрес на карте Google Maps'"); - Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; - Кнопка.ИмяКоманды = ИмяКоманды; - - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1); - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); - - ГруппКнопокРазделитель = Форма.Элементы.Добавить("ПодменюРазделительКарты" + ИмяРеквизита, Тип("ГруппаФормы"), Элемент.КонтекстноеМеню); - ГруппКнопокРазделитель.Вид = ВидГруппыФормы.ГруппаКнопок; - - Если Не ИнформацияОВидеКИ.ПометкаУдаления Тогда - // Заполнить - ГруппаПодменюАдреса = Форма.Элементы.Добавить("КонтекстноеПодменюКопироватьАдреса" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппКнопокРазделитель); - ГруппаПодменюАдреса.Вид = ВидГруппыФормы.Подменю; - ГруппаПодменюАдреса.Отображение = ОтображениеКнопки.Текст; - ГруппаПодменюАдреса.Заголовок = НСтр("ru = 'Заполнить'"); - КонецЕсли; - + Если ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес И Не ИнформацияОВидеКИ.ПометкаУдаления Тогда + // Заполнить + ГруппаПодменюАдреса = Форма.Элементы.Добавить("КонтекстноеПодменюКопироватьАдреса" + ИмяРеквизита, Тип( + "ГруппаФормы"), Элемент.КонтекстноеМеню); + ГруппаПодменюАдреса.Вид = ВидГруппыФормы.Подменю; + ГруппаПодменюАдреса.Отображение = ОтображениеКнопки.Текст; + ГруппаПодменюАдреса.Заголовок = НСтр("ru = 'Заполнить'"); КонецЕсли; Если ОбязательноеЗаполнение И ЭтоНовыйВидКИ И Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда @@ -4172,7 +4687,7 @@ // Редактирование в диалоге Если ДляТипаКонтактнойИнформацииДоступноРедактированиеВДиалоге(ИнформацияОВидеКИ.Тип) - И Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда + И Элемент.Вид = ВидПоляФормы.ПолеВвода И ИнформацияОВидеКИ.ВидРедактирования <> "ПолеВвода" Тогда ДоступенВыбор = Не ИнформацияОВидеКИ.ПометкаУдаления И ИнформацияОВидеКИ.ВидРедактирования <> "ПолеВвода"; @@ -4197,6 +4712,7 @@ Если Не ИнформацияОВидеКИ.ВидРедактирования = "Диалог" Тогда Элемент.КнопкаОчистки = Истина; Элемент.РедактированиеТекста = Ложь; + Элемент.Ширина = Элемент.Ширина - 2; Иначе Элемент.ТолькоПросмотр = Истина; КонецЕсли; @@ -4207,9 +4723,9 @@ КонецФункции -Процедура ПодготовитьСтатическийЭлемент(Форма, СтрокаКИ, СозданныеЭлементы, ИндексЭлемента) +Процедура ПодготовитьСтатическийЭлемент(Форма, СтрокаКИ, СозданныеЭлементы, СозданныйЭлемент, ОтображатьИконки, ИмяЭлементаДляРазмещения) - СозданныеЭлементы.Удалить(ИндексЭлемента); + СозданныеЭлементы.Удалить(СозданныйЭлемент); Если Форма.ТолькоПросмотр Тогда ЭлементНаФорме = Форма.Элементы[СтрокаКИ.ИмяРеквизита]; @@ -4226,6 +4742,159 @@ КонецЕсли; КонецЕсли; + УстановитьДействияДляСтатическихЭлементов(Форма, СтрокаКИ, ИмяЭлементаДляРазмещения); + + ИмяЭлементаГруппаСтроки = "Группа" + СтрокаКИ.ИмяРеквизита; + Если Форма.Элементы.Найти(ИмяЭлементаГруппаСтроки) <> Неопределено Тогда + ГруппаСтроки = Форма.Элементы[ИмяЭлементаГруппаСтроки]; + Если ГруппаСтроки.Родитель = Форма.Элементы[ИмяЭлементаДляРазмещения] + ИЛИ ГруппаСтроки.Родитель = Форма.Элементы["ГруппаЗначенияКИ"+ИмяЭлементаДляРазмещения] Тогда + Форма.Элементы.Переместить(ГруппаСтроки, Форма.Элементы["ГруппаЗначенияКИ"+ИмяЭлементаДляРазмещения]); + КонецЕсли; + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + + Если Форма.Элементы.Найти(СтрокаКИ.ИмяРеквизита) <> Неопределено Тогда + ПолеВвода = Форма.Элементы[СтрокаКИ.ИмяРеквизита]; + ПолеВвода.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + ПолеВвода.МногострочныйРежим = Истина; + КонецЕсли; + + Если ОтображатьИконки Тогда + ГруппаСтрокиЗаголовок = Группа("ГруппаЗаголовок" + СтрокаКИ.ИмяРеквизита, Форма, ГруппаСтроки.Заголовок, ИмяЭлементаДляРазмещения, "ГруппаЗначенияКИ"+ИмяЭлементаДляРазмещения, 6); + ГруппаСтрокиЗаголовок.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + ГруппаСтрокиЗаголовок.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение; + + ГруппаСтрокиЗаголовокКартинка = Группа("ГруппаЗаголовокКартинка" + СтрокаКИ.ИмяРеквизита, Форма, ГруппаСтроки.Заголовок, ИмяЭлементаДляРазмещения, "ГруппаЗаголовок" + СтрокаКИ.ИмяРеквизита); + + ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения); + + ИмяЭлементаКартинка = "Картинка" + СтрокаКИ.ИмяРеквизита; + Если Форма.Элементы.Найти(ИмяЭлементаКартинка) <> Неопределено Тогда + ЭлементКартинка = Форма.Элементы[ИмяЭлементаКартинка]; + Форма.Элементы.Переместить(ЭлементКартинка, ГруппаСтрокиЗаголовокКартинка); + Иначе + ЭлементКартинка = Форма.Элементы.Добавить(ИмяЭлементаКартинка, Тип("ДекорацияФормы"), ГруппаСтрокиЗаголовокКартинка); + ЭлементКартинка.Заголовок = НСтр("ru='Картинка'"); + ЭлементКартинка.Вид = ВидДекорацииФормы.Картинка; + ЭлементКартинка.Ширина = 2; + ЭлементКартинка.Картинка = КартинкаТипаКонтактнойИнформации(СтрокаКИ.Тип); + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить("Картинка" + СтрокаКИ.ИмяРеквизита, 2, Ложь); + КонецЕсли; + + ИмяЭлементаЗаголовок = "Заголовок" + СтрокаКИ.ИмяРеквизита; + Если Форма.Элементы.Найти(ИмяЭлементаЗаголовок) <> Неопределено Тогда + ЭлементЗаголовок = Форма.Элементы[ИмяЭлементаЗаголовок]; + Форма.Элементы.Переместить(ЭлементЗаголовок, ГруппаСтрокиЗаголовокКартинка); + Иначе + ДекорацияЗаголовок = Форма.Элементы.Добавить(ИмяЭлементаЗаголовок, Тип("ДекорацияФормы"), ГруппаСтрокиЗаголовокКартинка); + ДекорацияЗаголовок.Заголовок = ВРег(ГруппаСтроки.Заголовок); + ДекорацияЗаголовок.Вид = ВидДекорацииФормы.Надпись; + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить("Заголовок" + СтрокаКИ.ИмяРеквизита, 2, Ложь); + КонецЕсли; + + Форма.Элементы.Переместить(ГруппаСтроки, ГруппаСтрокиЗаголовок); + + Иначе + ГруппаСтроки.ОтображатьЗаголовок = Истина; + КонецЕсли; + + Иначе + + ИмяЭлементаКартинка = "Картинка" + СтрокаКИ.ИмяРеквизита; + Если ОтображатьИконки И Форма.Элементы.Найти(ИмяЭлементаКартинка) = Неопределено Тогда + Если ГруппаСтроки.Родитель = Форма.Элементы["ГруппаЗначенияКИ"+ИмяЭлементаДляРазмещения] Тогда + ГруппаСтроки.Объединенная = Ложь; + КонецЕсли; + Декорация = Форма.Элементы.Добавить(ИмяЭлементаКартинка, Тип("ДекорацияФормы"), ГруппаСтроки); + Декорация.Заголовок = НСтр("ru='Картинка'"); + Декорация.Вид = ВидДекорацииФормы.Картинка; + Декорация.Ширина = 2; + Декорация.Картинка = КартинкаТипаКонтактнойИнформации(СтрокаКИ.Тип); + Если Форма.Элементы.Найти(СтрокаКИ.ИмяРеквизита) <> Неопределено Тогда + Форма.Элементы.Переместить(Декорация, ГруппаСтроки, Форма.Элементы[СтрокаКИ.ИмяРеквизита]); + КонецЕсли; + КонецЕсли; + + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьДействияДляСтатическихЭлементов(Форма, СтрокаКИ, ИмяЭлементаДляРазмещения) + + Элемент = Форма.Элементы[СтрокаКИ.ИмяРеквизита]; + Тип = СтрокаКи.Тип; + + ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, + ИмяЭлементаДляРазмещения); + ОбработкаНавигационнойСсылки = ПараметрыКонтактнойИнформации.ОбработкаНавигационнойСсылки; + + Если СтрокаКИ.ВидРедактирования = "Диалог" И СтрокаКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес + И Элемент.Вид = ВидПоляФормы.ПолеНадписи Тогда + + Если НЕ ЗначениеЗаполнено(Элемент.ПолучитьДействие("Нажатие")) Тогда + Элемент.УстановитьДействие("Нажатие", "Подключаемый_КонтактнаяИнформацияПриНажатии"); + КонецЕсли; + + ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.ВебСтраница И ОбработкаНавигационнойСсылки И Элемент.Вид = ВидПоляФормы.ПолеНадписи Тогда + + Если Не ЗначениеЗаполнено(Элемент.ПолучитьДействие("ОбработкаНавигационнойСсылки")) Тогда + Элемент.УстановитьДействие("ОбработкаНавигационнойСсылки", "Подключаемый_КонтактнаяИнформацияОбработкаНавигационнойСсылки"); + КонецЕсли; + + ИначеЕсли Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда + + Если Не ЗначениеЗаполнено(Элемент.ПолучитьДействие("Очистка")) Тогда + Элемент.УстановитьДействие("Очистка", "Подключаемый_КонтактнаяИнформацияОчистка"); + КонецЕсли; + + Если Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда + Если Не ЗначениеЗаполнено(Элемент.ПолучитьДействие("Автоподбор")) Тогда + Элемент.УстановитьДействие("Автоподбор", "Подключаемый_КонтактнаяИнформацияАвтоподбор"); + КонецЕсли; + Если Не ЗначениеЗаполнено(Элемент.ПолучитьДействие("ОбработкаВыбора")) Тогда + Элемент.УстановитьДействие("ОбработкаВыбора", "Подключаемый_КонтактнаяИнформацияОбработкаВыбора"); + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + // Редактирование в диалоге + Если ДляТипаКонтактнойИнформацииДоступноРедактированиеВДиалоге(Тип) И Элемент.Вид = ВидПоляФормы.ПолеВвода + И Не СтрокаКИ.ВидРедактирования = "ПолеВвода" Тогда + + ДоступенВыбор = Не СтрокаКИ.ПометкаУдаления И СтрокаКИ.ВидРедактирования <> "ПолеВвода"; + + Если ДоступенВыбор И Не Форма.ТолькоПросмотр Тогда + Элемент.КнопкаВыбора = Истина; + Если Не ЗначениеЗаполнено(Элемент.ПолучитьДействие("НачалоВыбора")) Тогда + Элемент.УстановитьДействие("НачалоВыбора", "Подключаемый_КонтактнаяИнформацияНачалоВыбора"); + КонецЕсли; + Иначе + Элемент.КнопкаВыбора = Ложь; + Если ЗначениеЗаполнено(Форма[СтрокаКИ.ИмяРеквизита]) Тогда + Элемент.КнопкаОткрытия = Истина; + Если Не ЗначениеЗаполнено(Элемент.ПолучитьДействие("Открытие")) Тогда + Элемент.УстановитьДействие("Открытие", "Подключаемый_КонтактнаяИнформацияПриНажатии"); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + Если Не ЗначениеЗаполнено(Элемент.ПолучитьДействие("ПриИзменении")) Тогда + Элемент.УстановитьДействие("ПриИзменении", "Подключаемый_КонтактнаяИнформацияПриИзменении"); + КонецЕсли; + + Если ДляТипаКонтактнойИнформацииЕстьПолеКомментарий(Тип, ОбработкаНавигационнойСсылки) Тогда + ИмяЭлементаКомментарий = "Комментарий" + СтрокаКИ.ИмяРеквизита; + Если Форма.Элементы.Найти(ИмяЭлементаКомментарий) <> Неопределено Тогда + Если Не ЗначениеЗаполнено(Форма.Элементы[ИмяЭлементаКомментарий].ПолучитьДействие("ПриИзменении")) Тогда + Форма.Элементы[ИмяЭлементаКомментарий].УстановитьДействие("ПриИзменении", "Подключаемый_КонтактнаяИнформацияПриИзменении"); + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецПроцедуры Процедура ПунктКонтекстногоМенюПеремещения(ПредыдущийЭлемент, Форма, Направление, ИмяЭлементаДляРазмещения) @@ -4258,15 +4927,13 @@ КонецПроцедуры -Функция Группа(ИмяГруппы, Форма, Заголовок, ИмяЭлементаДляРазмещения) +Функция Группа(ИмяГруппы, Форма, Заголовок, ИмяЭлементаДляРазмещения, ИмяГруппыРодителя = "", ПорядокУдаления = 5) Группа = Форма.Элементы.Найти(ИмяГруппы); Если Группа = Неопределено Тогда - Родитель = Родитель(Форма, ИмяЭлементаДляРазмещения); - Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда - Родитель.ШрифтЗаголовка = ШрифтыСтиля.ВажнаяНадписьШрифт; - КонецЕсли; + ИмяРодителя = ?(ЗначениеЗаполнено(ИмяГруппыРодителя), ИмяГруппыРодителя, ИмяЭлементаДляРазмещения); + Родитель = Родитель(Форма, ИмяРодителя); Группа = Форма.Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"), Родитель); Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа; Группа.Заголовок = Заголовок; @@ -4275,7 +4942,7 @@ Группа.Отображение = ОтображениеОбычнойГруппы.Нет; Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда; ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения); - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяГруппы, 5); + ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяГруппы, ПорядокУдаления); КонецЕсли; Возврат Группа; @@ -4305,6 +4972,7 @@ ИмяОписания = "КонтактнаяИнформацияОписаниеДополнительныхРеквизитов"; МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяОписания, Новый ОписаниеТипов("ТаблицаЗначений"))); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ИмяРеквизита", Строка500, ИмяОписания)); + МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ИмяРеквизитаКомментарий", Строка500, ИмяОписания)); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Вид", Новый ОписаниеТипов("СправочникСсылка.ВидыКонтактнойИнформации"), ИмяОписания)); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Тип", Новый ОписаниеТипов("ПеречислениеСсылка.ТипыКонтактнойИнформации"), ИмяОписания)); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Значение", Новый ОписаниеТипов("Строка"), ИмяОписания)); @@ -4321,6 +4989,7 @@ РеквизитыТаблицы = Форма.ПолучитьРеквизиты("КонтактнаяИнформацияОписаниеДополнительныхРеквизитов"); РеквизитыДляСоздания = Новый Соответствие; РеквизитыДляСоздания.Вставить("ИмяЭлементаДляРазмещения", Истина); + РеквизитыДляСоздания.Вставить("ИмяРеквизитаКомментарий", Истина); РеквизитыДляСоздания.Вставить("ХранитьИсториюИзменений", Истина); РеквизитыДляСоздания.Вставить("ДействуетС", Истина); РеквизитыДляСоздания.Вставить("ЭтоИсторическаяКонтактнаяИнформация", Истина); @@ -4346,6 +5015,10 @@ МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ИмяЭлементаДляРазмещения", Строка500, ИмяОписания)); КонецЕсли; + Если РеквизитыДляСоздания["ИмяРеквизитаКомментарий"] Тогда + МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ИмяРеквизитаКомментарий", Строка500, ИмяОписания)); + КонецЕсли; + Если РеквизитыДляСоздания["ХранитьИсториюИзменений"] Тогда МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ХранитьИсториюИзменений", Новый ОписаниеТипов("Булево"), ИмяОписания)); КонецЕсли; @@ -4428,14 +5101,29 @@ Форма[СтрокаКонтактнойИнформации.ИмяРеквизита] = СтрокаКонтактнойИнформации.Представление; КонецЕсли; + ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения); + ОбработкаНавигационнойСсылки = ПараметрыКонтактнойИнформации.ОбработкаНавигационнойСсылки; + Если ДляТипаКонтактнойИнформацииЕстьПолеКомментарий(СтрокаКонтактнойИнформации.Тип, ОбработкаНавигационнойСсылки) Тогда + РеквизитыДляЗаполнения = Новый Структура(); + РеквизитыДляЗаполнения.Вставить("Комментарий" + СтрокаКонтактнойИнформации.ИмяРеквизита, СтрокаКонтактнойИнформации.Комментарий); + ЗаполнитьЗначенияСвойств(Форма, РеквизитыДляЗаполнения); + КонецЕсли; + КонецЕсли; ДанныеВидаКонтактнойИнформации.Вставить("Ссылка", СтрокаКонтактнойИнформации.Вид); Если ЭтоНовыйВидКИ И ДанныеВидаКонтактнойИнформации.РазрешитьВводНесколькихЗначений И Не ЭтоРеквизитТабличнойЧасти И Не ДанныеВидаКонтактнойИнформации.ПометкаУдаления Тогда - ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения); + ПараметрыКонтактнойИнформации = ?(ПараметрыКонтактнойИнформации = Неопределено, + ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения), + ПараметрыКонтактнойИнформации); Вид = СтрокаКонтактнойИнформации.Вид; // СправочникСсылка.ВидыКонтактнойИнформации - ПараметрыКонтактнойИнформации.СписокДобавляемыхЭлементов.Добавить(ДанныеВидаКонтактнойИнформации, Строка(Вид)); + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + ПараметрыКонтактнойИнформации.СписокДобавляемыхЭлементов.Добавить(ДанныеВидаКонтактнойИнформации, Строка(Вид)); + Иначе + КартинкаТипа = КартинкаТипаКонтактнойИнформации(ДанныеВидаКонтактнойИнформации.Тип); + ПараметрыКонтактнойИнформации.СписокДобавляемыхЭлементов.Добавить(ДанныеВидаКонтактнойИнформации, Строка(Вид),,КартинкаТипа); + КонецЕсли; КонецЕсли; КонецПроцедуры @@ -4649,6 +5337,7 @@ КонецПроцедуры + Процедура КонвертацияКонтактнойИнформацииВJSON(КонтактнаяИнформация) // Конвертация @@ -4670,7 +5359,8 @@ Если ПустаяСтрока(СтрокаКИ.Наименование) Тогда СтрокаКИ.Наименование = СтрокаКИ.ПредставлениеНаОсновномЯзыке; - КонецЕсли; + КонецЕсли; + КонецЦикла; КонецПроцедуры @@ -4777,7 +5467,7 @@ СтрокаОшибки = Результат[0].ОписаниеОшибки; КонецЕсли; Исключение - СтрокаОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + СтрокаОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Если Не ПустаяСтрока(СтрокаОшибки) Тогда @@ -5041,10 +5731,18 @@ // - ПоложениеЗаголовкаЭлементаФормы // ОтложеннаяИнициализация - Массив // - Булево -// ИсключаемыеВиды - Массив -// - Неопределено -// СкрываемыеВиды - Массив -// - Неопределено +// ДополнительныеПараметры - Структура: +// * ОписаниеКоманд - см. ОписаниеКоманд +// * ОтображатьИконки - Булево +// * РазмещеныНаФорме - Соответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.ВидыКонтактнойИнформации +// * Значение - Булево. +// - Неопределено +// * РазрешитьДобавлениеПолей - Булево +// * ИсключаемыеВиды - Массив +// - Неопределено +// * СкрываемыеВиды - Массив +// - Неопределено // // Возвращаемое значение: // Структура: @@ -5053,6 +5751,7 @@ // * ДобавленныеРеквизиты - СписокЗначений // * ОтложеннаяИнициализация - Булево // * ИсключаемыеВиды - Массив +// - Неопределено // * ВыполненаОтложеннаяИнициализация - Булево // * ДобавленныеЭлементы - СписокЗначений // * СписокДобавляемыхЭлементов - СписокЗначений: @@ -5063,8 +5762,17 @@ // * Владелец - ЛюбаяСсылка // * ОбработкаНавигационнойСсылки - Булево // * СкрываемыеВиды - Массив +// - Неопределено +// * ОписаниеКоманд - см. ОписаниеКоманд +// * ОтображатьИконки - Булево +// * РазмещеныНаФорме - Соответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.ВидыКонтактнойИнформации +// * Значение - Булево +// - Неопределено +// * РазрешитьДобавлениеПолей - Булево // -Функция ПараметрыВыводаКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ, ОтложеннаяИнициализация, ИсключаемыеВиды, СкрываемыеВиды) +Функция ПараметрыВыводаКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ, + ОтложеннаяИнициализация, ДополнительныеПараметры) Если ТипЗнч(Форма.ПараметрыКонтактнойИнформации) <> Тип("Структура") Тогда Форма.ПараметрыКонтактнойИнформации = Новый Структура; @@ -5082,14 +5790,18 @@ ПараметрыКонтактнойИнформации.Вставить("ПоложениеЗаголовка", ЗначениеПоложенияЗаголовкаКИ(ПоложениеЗаголовкаКИ)); ПараметрыКонтактнойИнформации.Вставить("ДобавленныеРеквизиты", Новый СписокЗначений); ПараметрыКонтактнойИнформации.Вставить("ОтложеннаяИнициализация", ОтложеннаяИнициализация); - ПараметрыКонтактнойИнформации.Вставить("ИсключаемыеВиды", ИсключаемыеВиды); + ПараметрыКонтактнойИнформации.Вставить("ИсключаемыеВиды", ДополнительныеПараметры.ИсключаемыеВиды); ПараметрыКонтактнойИнформации.Вставить("ВыполненаОтложеннаяИнициализация", Ложь); ПараметрыКонтактнойИнформации.Вставить("ДобавленныеЭлементы", Новый СписокЗначений); ПараметрыКонтактнойИнформации.Вставить("СписокДобавляемыхЭлементов", Новый СписокЗначений); ПараметрыКонтактнойИнформации.Вставить("МожноОтправлятьSMS", МожноОтправлятьSMS); ПараметрыКонтактнойИнформации.Вставить("Владелец", Неопределено); ПараметрыКонтактнойИнформации.Вставить("ОбработкаНавигационнойСсылки", Ложь); - ПараметрыКонтактнойИнформации.Вставить("СкрываемыеВиды", СкрываемыеВиды); + ПараметрыКонтактнойИнформации.Вставить("СкрываемыеВиды", ДополнительныеПараметры.СкрываемыеВиды); + ПараметрыКонтактнойИнформации.Вставить("ОписаниеКоманд", ДополнительныеПараметры.ОписаниеКоманд); + ПараметрыКонтактнойИнформации.Вставить("ОтображатьИконки", ДополнительныеПараметры.ОтображатьИконки); + ПараметрыКонтактнойИнформации.Вставить("РазмещеныНаФорме", ДополнительныеПараметры.РазмещеныНаФорме); + ПараметрыКонтактнойИнформации.Вставить("РазрешитьДобавлениеПолей", ДополнительныеПараметры.РазрешитьДобавлениеПолей); ПараметрыАдреса = Новый Структура("ТипПомещения, Страна, Индекс", "Квартира"); ПараметрыКонтактнойИнформации.Вставить("ПараметрыАдреса", ПараметрыАдреса); @@ -5099,6 +5811,50 @@ КонецФункции +// Описание дополнительных параметров вывода контактной информации +// +// Параметры: +// ОписаниеКоманд - см. ОписаниеКоманд +// ОтображатьИконки - Булево +// РазмещеныНаФорме - Соответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.ВидыКонтактнойИнформации +// * Значение - Булево +// - Неопределено +// РазрешитьДобавлениеПолей - Булево +// ИсключаемыеВиды - Массив +// - Неопределено +// СкрываемыеВиды - Массив +// - Неопределено +// +// Возвращаемое значение: +// Структура: +// * ОписаниеКоманд - см. ОписаниеКоманд +// * ОтображатьИконки - Булево +// * РазмещеныНаФорме - Соответствие из КлючИЗначение: +// ** Ключ - СправочникСсылка.ВидыКонтактнойИнформации +// ** Значение - Булево +// - Неопределено +// * РазрешитьДобавлениеПолей - Булево +// * ИсключаемыеВиды - Массив +// - Неопределено +// * СкрываемыеВиды - Массив +// - Неопределено +// +Функция ДополнительныеПараметрыВыводаКонтактнойИнформации(ОписаниеКоманд, ОтображатьИконки, РазмещеныНаФорме, + РазрешитьДобавлениеПолей, ИсключаемыеВиды, СкрываемыеВиды) + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ОписаниеКоманд", ОписаниеКоманд); + ДополнительныеПараметры.Вставить("ОтображатьИконки", ОтображатьИконки); + ДополнительныеПараметры.Вставить("РазмещеныНаФорме", РазмещеныНаФорме); + ДополнительныеПараметры.Вставить("РазрешитьДобавлениеПолей", РазрешитьДобавлениеПолей); + ДополнительныеПараметры.Вставить("ИсключаемыеВиды", ИсключаемыеВиды); + ДополнительныеПараметры.Вставить("СкрываемыеВиды", СкрываемыеВиды); + + Возврат ДополнительныеПараметры; + +КонецФункции + Функция ГруппаВидовКонтактнойИнформацииОбъекта(Знач ПолноеИмяОбъектаМетаданных) Возврат ВидКонтактнойИнформацииПоИмени(СтрЗаменить(ПолноеИмяОбъектаМетаданных, ".", "")); @@ -5164,186 +5920,47 @@ КонецФункции -Процедура СоздатьДействие(Форма, ВидКонтактнойИнформации, ИмяРеквизита, ГруппаДействий, КоличествоАдресов, ЕстьКомментарий = Ложь, ИмяЭлементаДляРазмещения = "ГруппаКонтактнаяИнформация") - - ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения); - ОбработкаНавигационнойСсылки = ПараметрыКонтактнойИнформации.ОбработкаНавигационнойСсылки; - +Процедура СоздатьДействие(Форма, ВидКонтактнойИнформации, ИмяРеквизита, ГруппаДействий, ИмяЭлементаДляРазмещения = "ГруппаКонтактнаяИнформация") + Тип = ВидКонтактнойИнформации.Тип; - СоздаватьДействиеДляТипа = Новый Соответствие(); - Если Не ОбработкаНавигационнойСсылки Тогда - СоздаватьДействиеДляТипа.Вставить(Перечисления.ТипыКонтактнойИнформации.ВебСтраница, Истина); + + ПараметрыКИ = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения); + + ОтображатьИсторию = ВидКонтактнойИнформации.ХранитьИсториюИзменений И Не ВидКонтактнойИнформации.ПометкаУдаления; + КомандыДляВывода = УправлениеКонтактнойИнформациейКлиентСервер.КомандыДляВыводаНаФорму(ПараметрыКИ, Тип, + ВидКонтактнойИнформации.Вид, ОтображатьИсторию); + + КоличествоКоманд = КомандыДляВывода.Количество(); + Если КоличествоКоманд = 0 Тогда + Возврат; КонецЕсли; - СоздаватьДействиеДляТипа.Вставить(Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты, Истина); - СоздаватьДействиеДляТипа.Вставить(Перечисления.ТипыКонтактнойИнформации.Телефон, Истина); - СоздаватьДействиеДляТипа.Вставить(Перечисления.ТипыКонтактнойИнформации.Адрес, ?(КоличествоАдресов > 1, Истина, Ложь)); - СоздаватьДействиеДляТипа.Вставить(Перечисления.ТипыКонтактнойИнформации.Skype, Истина); + Если Тип = Перечисления.ТипыКонтактнойИнформации.Адрес И ВидКонтактнойИнформации.ВидРедактирования = "Диалог" Тогда + ПолеВвода = Форма.Элементы[ИмяРеквизита]; + ПолеВвода.РасширеннаяПодсказка.Заголовок = УправлениеКонтактнойИнформациейКлиентСервер.РасширеннаяПодсказкаАдреса( + КомандыДляВывода, ВидКонтактнойИнформации.Представление, ВидКонтактнойИнформации.Комментарий); + ПолеВвода.РасширеннаяПодсказка.УстановитьДействие("ОбработкаНавигационнойСсылки", + "Подключаемый_КонтактнаяИнформацияОбработкаНавигационнойСсылки"); + Возврат; + КонецЕсли; - Если Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - МодульРаботаСПочтовымиСообщениями = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениями"); - Если НЕ МодульРаботаСПочтовымиСообщениями.ДоступнаОтправкаПисем() Тогда - СоздаватьДействиеДляТипа[Тип] = Ложь; - КонецЕсли; - Иначе - СоздаватьДействиеДляТипа[Тип] = Ложь; - КонецЕсли; - ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Адрес И ВидКонтактнойИнформации.ВидРедактирования = "Диалог" Тогда - СоздаватьДействиеДляТипа[Тип] = Ложь; + ИмяКоманды = "Команда" + ИмяРеквизита; + Команда = Форма.Команды.Добавить(ИмяКоманды); + ПараметрыКИ.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); + Команда.Отображение = ОтображениеКнопки.Картинка; + Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; + Элемент = Форма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ГруппаДействий); + ПараметрыКИ.ДобавленныеЭлементы.Добавить(ИмяКоманды, 2); + Элемент.ИмяКоманды = ИмяКоманды; + + Если КоличествоКоманд = 1 Тогда + Для Каждого КомандаВывода Из КомандыДляВывода Цикл + ЗаполнитьЗначенияСвойств(Команда, КомандаВывода.Значение, , "Действие"); + КонецЦикла; + ИначеЕсли КоличествоКоманд > 1 Тогда + Команда.Картинка = БиблиотекаКартинок.МенюДополнительныеФункции; КонецЕсли; - - Если СоздаватьДействиеДляТипа[Тип] = Истина Тогда - - Если Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда - ГруппаПодменюВерхнийУровень = Форма.Элементы.Добавить("КоманднаяПанель" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппаДействий); - ГруппаПодменюВерхнийУровень.Вид = ВидГруппыФормы.КоманднаяПанель; - - ГруппаПодменю = Форма.Элементы.Добавить("Подменю" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппаПодменюВерхнийУровень); - ГруппаПодменю.Заголовок = НСтр("ru = 'Контактная информация'"); - ГруппаПодменю.Вид = ВидГруппыФормы.Подменю; - ГруппаПодменю.Картинка = БиблиотекаКартинок.МенюДополнительныеФункции; - ГруппаПодменю.Отображение = ОтображениеКнопки.Картинка; - ГруппаПодменю.РастягиватьПоГоризонтали = Ложь; - - - Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда - ГруппаДействий.ОтображатьЗаголовок = Истина; - - ГруппаПодменюВерхнийУровень.РастягиватьПоГоризонтали = Ложь; - ГруппаПодменюВерхнийУровень.Ширина = 5; - ГруппаПодменюВерхнийУровень.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Право; - ГруппаПодменюВерхнийУровень.ВертикальноеПоложениеВГруппе = ВертикальноеПоложениеЭлемента.Центр; - КонецЕсли; - - Иначе - ГруппаПодменю = ГруппаДействий; - - // Есть действие - ИмяКоманды = "Команда" + ИмяРеквизита; - Команда = Форма.Команды.Добавить(ИмяКоманды); - - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); - Команда.Отображение = ОтображениеКнопки.Картинка; - Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; - - Элемент = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаПодменю); - - Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда - Элемент.ВертикальноеПоложениеВГруппе = ВертикальноеПоложениеЭлемента.Центр; - Элемент.Ширина = 5; - КонецЕсли; - - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 2); - Элемент.ИмяКоманды = ИмяКоманды; - КонецЕсли; - - Если Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда - - Если Не ВидКонтактнойИнформации.ПометкаУдаления Тогда - // Ввод комментария через контекстное меню. - ИмяКоманды = "КонтекстноеМенюПодменю" + ИмяРеквизита; - Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаПодменю); - Кнопка.Заголовок = НСтр("ru = 'Ввести комментарий'"); - Команда = Форма.Команды.Добавить(ИмяКоманды); - Команда.Подсказка = НСтр("ru = 'Ввести комментарий'"); - Команда.Картинка = БиблиотекаКартинок.Комментарий; - Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; - Команда.ИзменяетСохраняемыеДанные = Истина; - Кнопка.ИмяКоманды = ИмяКоманды; - - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1); - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); - КонецЕсли; - - // История изменений - Если ВидКонтактнойИнформации.ХранитьИсториюИзменений И Не ВидКонтактнойИнформации.ПометкаУдаления Тогда - - ИмяКоманды = "КонтекстноеМенюПодменюИстория" + ИмяРеквизита; - Кнопка = Форма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ГруппаПодменю); - Кнопка.Заголовок = НСтр("ru = 'История изменений...'"); - Команда = Форма.Команды.Добавить(ИмяКоманды); - Команда.Картинка = БиблиотекаКартинок.ИсторияИзменений; - Команда.Подсказка = НСтр("ru = 'Показывает историю изменения контактной информации'"); - Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; - Команда.ИзменяетСохраняемыеДанные = Ложь; - Кнопка.ИмяКоманды = ИмяКоманды; - - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1); - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); - КонецЕсли; - - // Устанавливаем свойства поля ввода. - ГруппаРазделитель = Форма.Элементы.Добавить("ПодменюРазделительАдрес" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппаПодменю); - ГруппаРазделитель.Вид = ВидГруппыФормы.ГруппаКнопок; - - ИмяКоманды = "КартаЯндексМеню" + ИмяРеквизита; - Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаРазделитель); - Кнопка.Заголовок = НСтр("ru = 'Адрес на Яндекс.Картах'"); - Команда = Форма.Команды.Добавить(ИмяКоманды); - Команда.Картинка = БиблиотекаКартинок.ЯндексКарты; - Команда.Подсказка = НСтр("ru = 'Показывает адрес на картах Яндекс.Карты'"); - Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; - Кнопка.ИмяКоманды = ИмяКоманды; - - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1); - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); - - ИмяКоманды = "КартаGoogleМеню" + ИмяРеквизита; - Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаРазделитель); - Кнопка.Заголовок = НСтр("ru = 'Адрес на Google Maps'"); - Команда = Форма.Команды.Добавить(ИмяКоманды); - Команда.Картинка = БиблиотекаКартинок.GoogleMaps; - Команда.Подсказка = НСтр("ru = 'Показывает адрес на карте Google Maps'"); - Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; - Кнопка.ИмяКоманды = ИмяКоманды; - - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1); - ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); - - Если Не ВидКонтактнойИнформации.ПометкаУдаления Тогда - - ГруппаРазделитель = Форма.Элементы.Добавить("ПодменюРазделитель" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппаРазделитель); - ГруппаРазделитель.Вид = ВидГруппыФормы.ГруппаКнопок; - - ГруппаПодменюАдреса = Форма.Элементы.Добавить("ПодменюКопироватьАдреса" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппаРазделитель); - ГруппаПодменюАдреса.Вид = ВидГруппыФормы.Подменю; - ГруппаПодменюАдреса.Отображение = ОтображениеКнопки.Текст; - ГруппаПодменюАдреса.Заголовок = НСтр("ru = 'Заполнить'"); - - КонецЕсли; - - ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда - - Элемент.Заголовок = НСтр("ru = 'Написать письмо'"); - Команда.Подсказка = НСтр("ru = 'Написать письмо'"); - Команда.Картинка = БиблиотекаКартинок.ОтправитьЭлектронноеПисьмо; - - ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда - - Элемент.Заголовок = НСтр("ru = 'Перейти'"); - Команда.Подсказка = НСтр("ru = 'Перейти по ссылке'"); - Команда.Картинка = БиблиотекаКартинок.КонтактнаяИнформацияПерейтиПоСсылке; - - ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда - Если Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].МожноОтправлятьSMS Тогда - Элемент.Заголовок = НСтр("ru = 'Позвонить или отправить SMS'"); - Команда.Подсказка = НСтр("ru = 'Позвонить или отправить SMS'"); - Команда.Картинка = БиблиотекаКартинок.ПозвонитьИлиОтправитьSMS; - Иначе - Элемент.Заголовок = НСтр("ru = 'Позвонить'"); - Команда.Подсказка = НСтр("ru = 'Позвонить по телефону'"); - Команда.Картинка = БиблиотекаКартинок.Позвонить; - КонецЕсли; - - ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Skype Тогда - Элемент.Заголовок = НСтр("ru = 'Skype'"); - Команда.Подсказка = НСтр("ru = 'Skype'"); - Команда.Картинка = БиблиотекаКартинок.Skype; - КонецЕсли; - - КонецЕсли; - + КонецПроцедуры // Возвращает параметры контактной информации на форме @@ -5410,15 +6027,7 @@ КонецЕсли; Если ПустоеПредставление Тогда - - ФорматКонтактнойИнформации = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СтрокаКонтактнойИнформации.Вид, - "Тип, ВключатьСтрануВПредставление"); - - Если УправлениеКонтактнойИнформациейСлужебныйПовтИсп.ДоступныМодулиРаботаСАдресами() Тогда - МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); - МодульРаботаСАдресами.ОпределитьФорматКонтактнойИнформации(ФорматКонтактнойИнформации); - КонецЕсли; - + ИсточникЗначений = ?(ПустыеЗначенияПолей, СтрокаКонтактнойИнформации.Значение, СтрокаКонтактнойИнформации.ЗначенияПолей); СтрокаКонтактнойИнформации.Представление = УправлениеКонтактнойИнформациейСлужебный.ПредставлениеКонтактнойИнформации( @@ -5491,15 +6100,15 @@ Продолжить; КонецЕсли; - ПодменюКопироватьАдреса = Форма.Элементы.Найти("ПодменюКопироватьАдреса" + СтрокаКИ.ИмяРеквизита); КонтекстноеПодменюКопироватьАдреса = Форма.Элементы.Найти("КонтекстноеПодменюКопироватьАдреса" + СтрокаКИ.ИмяРеквизита); - Если ПодменюКопироватьАдреса <> Неопределено И КонтекстноеПодменюКопироватьАдреса = Неопределено Тогда + Если КонтекстноеПодменюКопироватьАдреса = Неопределено Тогда Продолжить; КонецЕсли; КоличествоКомандВПодменю = 0; СписокАдресовВПодменю = Новый Соответствие(); - СписокАдресовВПодменю.Вставить(ВРег(СтрокаКИ.Представление), Истина); + ДанныеАдреса = Новый Структура("Представление, Адрес", СтрокаКИ.Представление, СтрокаКИ.Значение); + СписокАдресовВПодменю.Вставить(ВРег(СтрокаКИ.Представление), ДанныеАдреса); Для Каждого Адрес Из НайденныеСтроки Цикл @@ -5511,6 +6120,10 @@ Продолжить; КонецЕсли; + Если НЕ ЗначениеЗаполнено(Адрес.Представление) Тогда + Продолжить; + КонецЕсли; + ИмяКоманды = "МенюПодменюАдрес" + СтрокаКИ.ИмяРеквизита + "_" + Адрес.ИмяРеквизита; Команда = Форма.Команды.Найти(ИмяКоманды); Если Команда = Неопределено Тогда @@ -5529,20 +6142,29 @@ Если СписокАдресовВПодменю[ВРег(Адрес.Представление)] <> Неопределено Тогда ПредставлениеАдреса = ""; Иначе - СписокАдресовВПодменю.Вставить(ВРег(Адрес.Представление), Истина); - КонецЕсли; - - Если ПодменюКопироватьАдреса <> Неопределено Тогда - ДобавитьКнопкуСкопироватьАдрес(Форма, ИмяКоманды, - ПредставлениеАдреса, ПараметрыКонтактнойИнформации, ПодменюКопироватьАдреса); + ДанныеАдреса = Новый Структура("Представление, Адрес", ПредставлениеАдреса, Адрес.Значение); + Если СтрокаКИ.МеждународныйФорматАдреса Тогда + ДанныеАдреса.Адрес = КонтактнаяИнформацияПоПредставлению(ПредставлениеАдреса, Адрес.Тип); КонецЕсли; - - Если КонтекстноеПодменюКопироватьАдреса <> Неопределено Тогда - ДобавитьКнопкуСкопироватьАдрес(Форма, ИмяКоманды, - ПредставлениеАдреса, ПараметрыКонтактнойИнформации, КонтекстноеПодменюКопироватьАдреса); + СписокАдресовВПодменю.Вставить(ВРег(Адрес.Представление), ДанныеАдреса); КонецЕсли; - + + ДобавитьКнопкуСкопироватьАдрес(Форма, ИмяКоманды, ПредставлениеАдреса, ПараметрыКонтактнойИнформации, + КонтекстноеПодменюКопироватьАдреса); + КонецЦикла; + + Поле = Форма.Элементы[СтрокаКИ.ИмяРеквизита]; + Если Поле.Вид = ВидПоляФормы.ПолеВвода Тогда + Поле.СписокВыбора.Очистить(); + ПредставлениеДляПоиска = ВРег(СтрокаКИ.Представление); + Для Каждого ДанныеАдреса Из СписокАдресовВПодменю Цикл + Если ДанныеАдреса.Ключ <> ПредставлениеДляПоиска Тогда + Поле.СписокВыбора.Добавить(ДанныеАдреса.Значение, ДанныеАдреса.Значение.Представление); + КонецЕсли; + КонецЦикла; + КонецЕсли; + ОбщееКоличествоКоманд = ОбщееКоличествоКоманд + КоличествоКомандВПодменю; КонецЦикла; @@ -5605,6 +6227,7 @@ Если ИменаТабличныхЧастейПоВидамКИ = Неопределено Тогда Отбор = Новый Структура("ЭтоРеквизитТабличнойЧасти", Истина); ВидыКИТабличнойЧасти = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).Выгрузить(Отбор, "Вид"); + // @skip-check query-in-loop - Выполняется только в одной итерации, при первом появлении реквизита табличной части ИменаТабличныхЧастейПоВидамКИ = ИменаТабличныхЧастейПоВидамКИ(ВидыКИТабличнойЧасти, ИмяОбъектаМетаданных); КонецЕсли; @@ -5706,7 +6329,8 @@ | ВидыКонтактнойИнформации.Тип КАК Тип, | ВидыКонтактнойИнформации.ХранитьИсториюИзменений КАК ХранитьИсториюИзменений, | ВидыКонтактнойИнформации.ИмяПредопределенногоВида КАК Имя, - | ВидыКонтактнойИнформации.МеждународныйФорматАдреса КАК МеждународныйФорматАдреса + | ВидыКонтактнойИнформации.МеждународныйФорматАдреса КАК МеждународныйФорматАдреса, + | ВидыКонтактнойИнформации.ОтображатьВсегда КАК ОтображатьВсегда |ИЗ | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации |ГДЕ @@ -5830,7 +6454,7 @@ // ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации. // // Возвращаемое значение: -// Структура - содержит структуру с полями: +// Структура: // * Имя - Строка - уникальное имя вида контактной информации. // * Наименование - Строка - наименование вида контактной информации. // * Вид - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на вид контактной информации. @@ -5906,6 +6530,7 @@ ПараметрыВида.Вставить("ХранитьИсториюИзменений", Ложь); ПараметрыВида.Вставить("МеждународныйФорматАдреса", Ложь); ПараметрыВида.Вставить("ИсправлятьУстаревшиеАдреса", Ложь); + ПараметрыВида.Вставить("ОтображатьВсегда", Истина); ВидПоляДругое = ?(ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Другое, "ОднострочноеШирокое", ""); @@ -6004,7 +6629,7 @@ Функция СформироватьТекстЗапроса(Знач ЕстьКолонкаИдентификаторСтрокиТабличнойЧасти, Знач ТекстЗапросаИсторическаяИнформация, Знач ЭтоОсновнойЯзык) - ТекстЗапроса = "ВЫБРАТЬ + ТекстЗапроса = "ВЫБРАТЬ | КонтактнаяИнформация.Представление КАК Представление, | КонтактнаяИнформация.Значение КАК Значение, | КонтактнаяИнформация.ЗначенияПолей КАК ЗначенияПолей, @@ -6030,6 +6655,7 @@ |КОНЕЦ КАК ИмяПредопределенногоВида, | ВидыКонтактнойИнформации.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных, | ВидыКонтактнойИнформации.Тип КАК Тип, + | ВидыКонтактнойИнформации.ОтображатьВсегда КАК ОтображатьВсегда, | ВидыКонтактнойИнформации.ОбязательноеЗаполнение КАК ОбязательноеЗаполнение, | ВидыКонтактнойИнформации.ВидПоляДругое КАК ВидПоляДругое, | ВидыКонтактнойИнформации.РазрешитьВводНесколькихЗначений КАК РазрешитьВводНесколькихЗначений, @@ -6050,6 +6676,7 @@ | ЕСТЬNULL(КонтактнаяИнформация.НомерСтроки, 0) КАК НомерСтроки, | ЕСТЬNULL(КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти, 0) КАК ИдентификаторСтрокиТабличнойЧасти, | ВЫРАЗИТЬ("""" КАК СТРОКА(200)) КАК ИмяРеквизита, + | ВЫРАЗИТЬ("""" КАК СТРОКА(200)) КАК ИмяРеквизитаКомментарий, | ВидыКонтактнойИнформации.ПометкаУдаления КАК ПометкаУдаления, | ВЫРАЗИТЬ("""" КАК СТРОКА) КАК Комментарий |ИЗ @@ -6138,4 +6765,113 @@ КонецФункции +Функция НастройкиПодсистемы(ВладелецКонтактнойИнформации) + + Настройки = Новый Структура; + Настройки.Вставить("ОтображатьИконки", Ложь); + Настройки.Вставить("ОписаниеКоманд", ОписаниеКоманд()); + + УправлениеКонтактнойИнформациейПереопределяемый.ПриОпределенииНастроек(Настройки); + + Возврат Настройки; + +КонецФункции + +// Определяет наличие кнопки в группах контактной информации +// +// Параметры: +// Группа - ГруппаФормы +// - ЭлементыФормы +// ЭтоГруппаСтроки - Булево - если Истина, то выполняется поиск кнопки среди элементов внутри группы +// +// Возвращаемое значение: +// Булево +// +Функция ЕстьКнопкаКонтактнойИнформации(Группа, ЭтоГруппаСтроки) + + Если ЭтоГруппаСтроки Тогда + Если ТипЗнч(Группа) = Тип("ГруппаФормы") Тогда + Для Каждого ЭлементГруппы Из Группа.ПодчиненныеЭлементы Цикл + Если ЭлементГруппы.Вид = ВидКнопкиФормы.ОбычнаяКнопка Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + КонецЕсли; + Иначе + Для Каждого ГруппаПоля Из Группа Цикл + Если ТипЗнч(ГруппаПоля) <> Тип("ГруппаФормы") Тогда + Продолжить; + КонецЕсли; + Для Каждого ЭлементГруппы Из ГруппаПоля.ПодчиненныеЭлементы Цикл + Если ЭлементГруппы.Вид = ВидКнопкиФормы.ОбычнаяКнопка Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + КонецЦикла; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Возвращает картинку, иллюстрирующую тип контактной информации +// +// Параметры: +// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации +// +// Возвращаемое значение: +// Картинка - картинка, иллюстрирующая тип контактной информации +// +Функция КартинкаТипаКонтактнойИнформации(ТипКонтактнойИнформации) + + Возврат УправлениеКонтактнойИнформациейСлужебныйПовтИсп.КартинкиТиповКонтактнойИнформации()[ТипКонтактнойИнформации]; + +КонецФункции + +// Проверяет предполагаемое наличие поля "Комментарий" для типа контактной информации +// +// Параметры: +// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации +// ОбработкаНавигационнойСсылки - Булево +// +// Возвращаемое значение: +// Булево - признак наличия поля комментария на форме +// +Функция ДляТипаКонтактнойИнформацииЕстьПолеКомментарий(ТипКонтактнойИнформации, ОбработкаНавигационнойСсылки) + + Если ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Адрес + ИЛИ ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Другое + ИЛИ (ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.ВебСтраница И ОбработкаНавигационнойСсылки) Тогда + Возврат Ложь; + Иначе + Возврат Истина; + КонецЕсли; + +КонецФункции + +// Определяет наличие гиперссылки +// +// Параметры: +// Элемент - ГруппаФормы +// - ПолеФормы +// +// Возвращаемое значение: +// Булево +// +Функция ЕстьГиперссылка(Элемент) + + Если ТипЗнч(Элемент) = Тип("ГруппаФормы") Тогда + Для Каждого ЭлементГруппы Из Элемент.ПодчиненныеЭлементы Цикл + Если ЭлементГруппы.Вид = ВидПоляФормы.ПолеНадписи Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + ИначеЕсли ТипЗнч(Элемент) = Тип("ПолеФормы") И Элемент.Вид = ВидПоляФормы.ПолеНадписи Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl index aa24a78b0..bb26b520e 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl @@ -137,10 +137,10 @@ // Вызывается из подключаемых действий при внедрении подсистемы "Контактная информация". // // Параметры: -// Форма - ФормаКлиентскогоПриложения - форма владельца контактной информации. -// ВыбранноеЗначение - Строка - выбранное значение, которое будет установлено как значение поля ввода +// Форма - ФормаКлиентскогоПриложения - форма владельца контактной информации. +// ВыбранноеЗначение - Строка - выбранное значение, которое будет установлено как значение поля ввода // контактной информации. -// ИмяРеквизита - Строка - имя реквизита формы, связанного с представление контактной информации. +// ИмяРеквизита - Строка - имя реквизита формы, связанного с представление контактной информации. // СтандартнаяОбработка - Булево - в данный параметр передается признак выполнения стандартной // (системной) обработки события. Если в теле процедуры-обработчика // установить данному параметру значение Ложь, стандартная обработка события @@ -326,8 +326,9 @@ // - ПеречислениеСсылка.ТипыКонтактнойИнформации // - Структура - используется для определения типа, если его невозможно вычислить по полю ЗначенияПолей. // ИсточникКонтактнойИнформации - Произвольный - объект владелец контактной информации. +// ИмяРеквизита - Строка // -Процедура СоздатьЭлектронноеПисьмо(Знач ЗначенияПолей, Знач Представление = "", ОжидаемыйВид = Неопределено, ИсточникКонтактнойИнформации = Неопределено) Экспорт +Процедура СоздатьЭлектронноеПисьмо(Знач ЗначенияПолей, Знач Представление = "", ОжидаемыйВид = Неопределено, ИсточникКонтактнойИнформации = Неопределено, ИмяРеквизита = "") Экспорт ОписаниеКонтактнойИнформации = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформации( ЗначенияПолей, Представление, ОжидаемыйВид); @@ -340,7 +341,12 @@ КонецЕсли; Если ЗначенияПолей = "" И ПустаяСтрока(Представление) Тогда - ПоказатьПредупреждение(,НСтр("ru = 'Для отправки письма введите адрес электронной почты.'")); + Если ЗначениеЗаполнено(ИмяРеквизита) Тогда + ОбщегоНазначенияКлиент.СообщитьПользователю( + НСтр("ru = 'Для отправки письма введите адрес электронной почты.'"), , ИмяРеквизита); + Иначе + ПоказатьПредупреждение( , НСтр("ru = 'Для отправки письма введите адрес электронной почты.'")); + КонецЕсли; Возврат; КонецЕсли; @@ -385,24 +391,31 @@ ВызватьИсключение НСтр("ru = 'Отправка SMS недоступна.'"); КонецЕсли; - КонтактнаяИнформация = УправлениеКонтактнойИнформациейСлужебныйВызовСервера.ПривестиКонтактнуюИнформациюXML( - Новый Структура("ЗначенияПолей, Представление, ВидКонтактнойИнформации", ЗначенияПолей, Представление, ОжидаемыйВид)); + НомерПолучателя = ""; + + Если ПустаяСтрока(Представление) Тогда - ТипИнформации = КонтактнаяИнформация.ТипКонтактнойИнформации; - Если ТипИнформации <> ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Телефон") Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Нельзя отправить SMS по контактной информацию с типом ""%1""'"), ТипИнформации); + КонтактнаяИнформация = УправлениеКонтактнойИнформациейСлужебныйВызовСервера.ПривестиКонтактнуюИнформациюXML( + Новый Структура("ЗначенияПолей, Представление, ВидКонтактнойИнформации", ЗначенияПолей, Представление, ОжидаемыйВид)); + + ТипИнформации = КонтактнаяИнформация.ТипКонтактнойИнформации; + Если ТипИнформации <> ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Телефон") Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Нельзя отправить SMS по контактной информацию с типом ""%1""'"), ТипИнформации); + КонецЕсли; + + Если ЗначенияПолей = "" И ПустаяСтрока(Представление) Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Для отправки SMS введите номер телефона.'")); + Возврат; + КонецЕсли; + + XMLДанные = КонтактнаяИнформация.ДанныеXML; + Если ЗначениеЗаполнено(XMLДанные) Тогда + НомерПолучателя = УправлениеКонтактнойИнформациейСлужебныйВызовСервера.СтрокаСоставаКонтактнойИнформации(XMLДанные); + КонецЕсли; + КонецЕсли; - Если ЗначенияПолей = "" И ПустаяСтрока(Представление) Тогда - ПоказатьПредупреждение(,НСтр("ru = 'Для отправки SMS введите номер телефона.'")); - Возврат; - КонецЕсли; - - XMLДанные = КонтактнаяИнформация.ДанныеXML; - Если ЗначениеЗаполнено(XMLДанные) Тогда - НомерПолучателя = УправлениеКонтактнойИнформациейСлужебныйВызовСервера.СтрокаСоставаКонтактнойИнформации(XMLДанные); - КонецЕсли; - Если НЕ ЗначениеЗаполнено(НомерПолучателя) Тогда + Если ПустаяСтрока(НомерПолучателя) Тогда НомерПолучателя = СокрЛП(Представление); КонецЕсли; @@ -537,9 +550,9 @@ Процедура ПоказатьАдресНаКарте(Адрес, ИмяКартографическогоСервиса) Экспорт АдресКодированный = ДекодированиеСтроки(Адрес); Если ИмяКартографическогоСервиса = "GoogleMaps" Тогда - СтрокаЗапуска = "https://maps.google.ru/?q=" + АдресКодированный; + СтрокаЗапуска = "https://maps.google.com/?q=" + АдресКодированный; Иначе - СтрокаЗапуска = "https://maps.yandex.ru/?text=" + АдресКодированный; + СтрокаЗапуска = "https://maps.yandex.com/?text=" + АдресКодированный; КонецЕсли; ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(СтрокаЗапуска); @@ -769,6 +782,26 @@ КонецЕсли; КонецПроцедуры +// Обработчик после закрытия формы списка справочника ВидыКонтактнойИнформации с отбором по владельцу контактной информации +// +// Параметры: +// Результат - Структура +// - Неопределено +// ДополнительныеПараметры - Структура: +// * Форма - ФормаКлиентскогоПриложения +// * ИмяЭлементаДляРазмещения - Строка +// * АсинхронныйВызов - Булево +// +Процедура ПослеЗакрытияФормыСпискаВидыКонтактнойИнформации(Результат, ДополнительныеПараметры) Экспорт + + Форма = ДополнительныеПараметры.Форма; + ПараметрыОбновления = Новый Структура; + ПараметрыОбновления.Вставить("Перечитать", Истина); + ПараметрыОбновления.Вставить("ИмяЭлементаДляРазмещения", ДополнительныеПараметры.ИмяЭлементаДляРазмещения); + ОбновитьКонтактнуюИнформациюФормы(Форма, ПараметрыОбновления, ДополнительныеПараметры.АсинхронныйВызов); + +КонецПроцедуры + // Продолжение вызова ПредставлениеНачалоВыбора // // Параметры: @@ -854,11 +887,25 @@ КонецЕсли; Если ДополнительныеПараметры.ЭтоТабличнаяЧасть Тогда - ДанныеЗаполнения[Элемент.Имя + "Значение"] = РезультатЗакрытия.Значение; - + ДанныеЗаполнения[Элемент.Имя + "Значение"] = РезультатЗакрытия.Значение; Иначе - ЭлементФормыПредставление = Форма.Элементы.Найти(Элемент.Имя); // ДекорацияФормы - ЭлементФормыПредставление.РасширеннаяПодсказка.Заголовок = Комментарий; + ИмяРеквизитаКомментарий = "Комментарий" + Элемент.Имя; + Если Форма.Элементы.Найти(ИмяРеквизитаКомментарий) <> Неопределено Тогда + Форма[ИмяРеквизитаКомментарий] = Комментарий; + Иначе + ЭлементФормыПредставление = Форма.Элементы.Найти(Элемент.Имя); // ДекорацияФормы + Если РезультатЗакрытия.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес") + И РезультатЗакрытия.ВВидеГиперссылки Тогда + ПараметрыКИ = Форма.ПараметрыКонтактнойИнформации[ДополнительныеПараметры.ИмяЭлементаРазмещения]; + ХранитьИсториюИзменений = ?(ДанныеНаФорме.Свойство("ХранитьИсториюИзменений"), ДанныеНаФорме.ХранитьИсториюИзменений, Ложь); + КомандыДляВывода = УправлениеКонтактнойИнформациейКлиентСервер.КомандыДляВыводаНаФорму(ПараметрыКИ, + РезультатЗакрытия.Тип, РезультатЗакрытия.Вид, ХранитьИсториюИзменений); + ЭлементФормыПредставление.РасширеннаяПодсказка.Заголовок = УправлениеКонтактнойИнформациейКлиентСервер.РасширеннаяПодсказкаАдреса( + КомандыДляВывода, ДанныеНаФорме.Представление, Комментарий); + Иначе + ЭлементФормыПредставление.РасширеннаяПодсказка.Заголовок = Комментарий; + КонецЕсли; + КонецЕсли; Если РезультатЗакрытия.Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.ВебСтраница") Тогда ТекстПредставления = УправлениеКонтактнойИнформациейКлиентСервер.АдресСайта(ТекстПредставления, РезультатЗакрытия.Адрес, Форма.ТолькоПросмотр); @@ -891,6 +938,23 @@ Возврат; КонецЕсли; + Если НЕ ЗначениеЗаполнено(ВыбранныйЭлемент.Значение.Ссылка) Тогда + Форма = ДополнительныеПараметры.Форма; + ИмяЭлементаДляРазмещения = ДополнительныеПараметры.ИмяЭлементаДляРазмещения; + ПараметрыКИ = Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения]; + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("ВладелецКонтактнойИнформации", ПараметрыКИ.Владелец); + ПараметрыЗакрытияФормы = Новый Структура; + ПараметрыЗакрытияФормы.Вставить("Форма", ДополнительныеПараметры.Форма); + ПараметрыЗакрытияФормы.Вставить("ИмяЭлементаДляРазмещения", ИмяЭлементаДляРазмещения); + ПараметрыЗакрытияФормы.Вставить("АсинхронныйВызов", ДополнительныеПараметры.АсинхронныйВызов); + Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияФормыСпискаВидыКонтактнойИнформации", + УправлениеКонтактнойИнформациейКлиент, ПараметрыЗакрытияФормы); + ОткрытьФорму("Справочник.ВидыКонтактнойИнформации.Форма.ФормаСписка",ПараметрыОткрытияФормы, + ДополнительныеПараметры.Форма,,,,Оповещение,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + Возврат; + КонецЕсли; + Результат = Новый Структура(); Результат.Вставить("ДобавляемыйВид", ВыбранныйЭлемент.Значение); Результат.Вставить("ИмяЭлементаДляРазмещения", ДополнительныеПараметры.ИмяЭлементаДляРазмещения); @@ -899,6 +963,10 @@ Результат.Вставить("ОбновитьКонтекстноеМеню", Истина); КонецЕсли; + Если Не ВыбранныйЭлемент.Значение.РазрешитьВводНесколькихЗначений Тогда + ДополнительныеПараметры.Форма.ПараметрыКонтактнойИнформации[Результат.ИмяЭлементаДляРазмещения].СписокДобавляемыхЭлементов.Удалить(ВыбранныйЭлемент); + КонецЕсли; + ОбновитьКонтактнуюИнформациюФормы(ДополнительныеПараметры.Форма, Результат, ДополнительныеПараметры.АсинхронныйВызов); КонецПроцедуры @@ -1000,7 +1068,12 @@ Процедура ПриОчистке(Знач Форма, Знач ИмяРеквизита, АсинхронныйВызов) Результат = Новый Структура("ИмяРеквизита", ИмяРеквизита); - НайденнаяСтрока = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).НайтиСтроки(Результат)[0]; + НайденныеСтроки = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме( + Форма).НайтиСтроки(Результат); + Если НайденныеСтроки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + НайденнаяСтрока = НайденныеСтроки[0]; НайденнаяСтрока.Значение = ""; НайденнаяСтрока.Представление = ""; НайденнаяСтрока.Комментарий = ""; @@ -1025,164 +1098,163 @@ КонецПроцедуры Процедура ПриВыполненииКоманды(Знач Форма, Знач ИмяКоманды, АсинхронныйВызов) - + Если СтрНачинаетсяС(ИмяКоманды, "КонтактнаяИнформацияДобавитьПолеВвода") Тогда - + ДополнительныеПараметры = Новый Структура; - + ИмяЭлементаДляРазмещения = Сред(ИмяКоманды, СтрДлина("КонтактнаяИнформацияДобавитьПолеВвода") + 1); ДополнительныеПараметры.Вставить("АсинхронныйВызов", АсинхронныйВызов); ДополнительныеПараметры.Вставить("Форма", Форма); ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", ИмяЭлементаДляРазмещения); ДополнительныеПараметры.Вставить("ИмяКоманды", ИмяКоманды); - Оповещение = Новый ОписаниеОповещения("КонтактнаяИнформацияДобавитьПолеВводаЗавершение", ЭтотОбъект, ДополнительныеПараметры); + Оповещение = Новый ОписаниеОповещения("КонтактнаяИнформацияДобавитьПолеВводаЗавершение", ЭтотОбъект, + ДополнительныеПараметры); Форма.ПоказатьВыборИзМеню(Оповещение, - Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].СписокДобавляемыхЭлементов, + Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].СписокДобавляемыхЭлементов, Форма.Элементы[ИмяКоманды]); - + Возврат; - + ИначеЕсли СтрНачинаетсяС(ИмяКоманды, "Команда") Тогда - - ИмяРеквизита = СтрЗаменить(ИмяКоманды, "Команда", ""); + + ИмяРеквизита = УдалитьПрефиксСтроки(ИмяКоманды, "Команда"); КомандаКонтекстногоМеню = Неопределено; ИначеЕсли СтрНачинаетсяС(ИмяКоманды, "МенюПодменюАдрес") Тогда - ИмяРеквизита = СтрЗаменить(ИмяКоманды, "МенюПодменюАдрес", ""); + ИмяРеквизита = УдалитьПрефиксСтроки(ИмяКоманды, "МенюПодменюАдрес"); Позиция = СтрНайти(ИмяРеквизита, "_КонтактнаяИнформацияПоле"); ИмяРеквизитаИсточник = Лев(ИмяРеквизита, Позиция -1); ИмяРеквизита = Сред(ИмяРеквизита, Позиция + 1); КомандаКонтекстногоМеню = Неопределено; - ИначеЕсли СтрНачинаетсяС(ИмяКоманды, "КартаЯндексМеню") - ИЛИ СтрНачинаетсяС(ИмяКоманды, "КартаGoogleМеню") Тогда - - КомандаКонтекстногоМеню = КомандаКонтекстногоМеню(ИмяКоманды); - ИмяРеквизита = Сред(КомандаКонтекстногоМеню.ИмяРеквизита, СтрДлина("Меню") + 1); - Иначе - + КомандаКонтекстногоМеню = КомандаКонтекстногоМеню(ИмяКоманды); ИмяРеквизита = КомандаКонтекстногоМеню.ИмяРеквизита; - + КонецЕсли; - + Результат = Новый Структура("ИмяРеквизита", ИмяРеквизита); - НайденныеСтроки = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).НайтиСтроки(Результат); + НайденныеСтроки = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме( + Форма).НайтиСтроки(Результат); Если НайденныеСтроки.Количество() = 0 Тогда Возврат; КонецЕсли; - + НайденнаяСтрока = НайденныеСтроки[0]; ТипКонтактнойИнформации = НайденнаяСтрока.Тип; ИмяЭлементаДляРазмещения = НайденнаяСтрока.ИмяЭлементаДляРазмещения; Результат.Вставить("ИмяЭлементаДляРазмещения", ИмяЭлементаДляРазмещения); + Результат.Вставить("ТипКонтактнойИнформации", НайденнаяСтрока.Тип); - Если КомандаКонтекстногоМеню <> Неопределено Тогда - Если КомандаКонтекстногоМеню.Команда = "Комментарий" Тогда - ВвестиКомментарий(Форма, КомандаКонтекстногоМеню.ИмяРеквизита, НайденнаяСтрока, Результат, АсинхронныйВызов); - ИначеЕсли КомандаКонтекстногоМеню.Команда = "История" Тогда - ОткрытьФормуИсторииИзменений(Форма, НайденнаяСтрока, АсинхронныйВызов); - ИначеЕсли КомандаКонтекстногоМеню.Команда = "КартаЯндекс" Тогда - ПоказатьАдресНаКарте(НайденнаяСтрока.Представление, "Яндекс.Карты"); - ИначеЕсли КомандаКонтекстногоМеню.Команда = "КартаGoogle" Тогда - ПоказатьАдресНаКарте(НайденнаяСтрока.Представление, "GoogleMaps"); + Если КомандаКонтекстногоМеню <> Неопределено Тогда + ПервыйЭлемент = НайденнаяСтрока.ИмяРеквизита; + ОписаниеКонтактнойИнформацииНаФорме = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме( + Форма); + Индекс = ОписаниеКонтактнойИнформацииНаФорме.Индекс(НайденнаяСтрока); + Если КомандаКонтекстногоМеню.НаправлениеПеремещения = 1 Тогда + Если Индекс < ОписаниеКонтактнойИнформацииНаФорме.Количество() - 1 Тогда + ВторойЭлемент = ОписаниеКонтактнойИнформацииНаФорме.Получить(Индекс + 1).ИмяРеквизита; + КонецЕсли; Иначе - ПервыйЭлемент = НайденнаяСтрока.ИмяРеквизита; - ОписаниеКонтактнойИнформацииНаФорме = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма); - Индекс = ОписаниеКонтактнойИнформацииНаФорме.Индекс(НайденнаяСтрока); - Если КомандаКонтекстногоМеню.НаправлениеПеремещения = 1 Тогда - Если Индекс < ОписаниеКонтактнойИнформацииНаФорме.Количество() - 1 Тогда - ВторойЭлемент = ОписаниеКонтактнойИнформацииНаФорме.Получить(Индекс + 1).ИмяРеквизита; - КонецЕсли; - Иначе - Если Индекс > 0 Тогда - ВторойЭлемент = ОписаниеКонтактнойИнформацииНаФорме.Получить(Индекс - 1).ИмяРеквизита; - КонецЕсли; + Если Индекс > 0 Тогда + ВторойЭлемент = ОписаниеКонтактнойИнформацииНаФорме.Получить(Индекс - 1).ИмяРеквизита; КонецЕсли; - Результат = Новый Структура("ПоменятьМестамиЭлементы, ПервыйЭлемент, ВторойЭлемент", Истина, ПервыйЭлемент, ВторойЭлемент); - Форма.ТекущийЭлемент = Форма.Элементы[ВторойЭлемент]; - ОбновитьКонтактнуюИнформациюФормы(Форма, Результат, АсинхронныйВызов); КонецЕсли; + Результат = Новый Структура; + Результат.Вставить("ПоменятьМестамиЭлементы", Истина); + Результат.Вставить("ПервыйЭлемент", ПервыйЭлемент); + Результат.Вставить("ВторойЭлемент", ВторойЭлемент); + Результат.Вставить("ИмяЭлементаДляРазмещения", ИмяЭлементаДляРазмещения); + Форма.ТекущийЭлемент = Форма.Элементы[ВторойЭлемент]; + ОбновитьКонтактнуюИнформациюФормы(Форма, Результат, АсинхронныйВызов); - ИначеЕсли ТипКонтактнойИнформации = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес") Тогда - - Результат = Новый Структура("ИмяРеквизита", ИмяРеквизитаИсточник); - СтрокаПотребитель = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).НайтиСтроки(Результат)[0]; - + ИначеЕсли СтрНачинаетсяС(ИмяКоманды, "МенюПодменюАдрес") И ТипКонтактнойИнформации = ПредопределенноеЗначение( + "Перечисление.ТипыКонтактнойИнформации.Адрес") Тогда + + Результат = Новый Структура("ИмяРеквизита", ИмяРеквизитаИсточник); + НайденныеСтроки = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме( + Форма).НайтиСтроки(Результат); + Если НайденныеСтроки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + СтрокаПотребитель = НайденныеСтроки[0]; Комментарий = СтрокаПотребитель.Комментарий; // Сохраняем старый комментарий. Если СтрокаПотребитель.Свойство("МеждународныйФорматАдреса") И СтрокаПотребитель.МеждународныйФорматАдреса Тогда - + ЗаполнитьЗначенияСвойств(СтрокаПотребитель, НайденнаяСтрока, "Комментарий"); ПредставлениеАдреса = СтроковыеФункцииКлиент.СтрокаЛатиницей(НайденнаяСтрока.Представление); СтрокаПотребитель.Представление = ПредставлениеАдреса; Форма[СтрокаПотребитель.ИмяРеквизита] = ПредставлениеАдреса; - СтрокаПотребитель.Значение = УправлениеКонтактнойИнформациейСлужебныйВызовСервера.КонтактнаяИнформацияПоПредставлению(ПредставлениеАдреса, ТипКонтактнойИнформации); - + СтрокаПотребитель.Значение = УправлениеКонтактнойИнформациейСлужебныйВызовСервера.КонтактнаяИнформацияПоПредставлению( + ПредставлениеАдреса, ТипКонтактнойИнформации); + Иначе - + ЗаполнитьЗначенияСвойств(СтрокаПотребитель, НайденнаяСтрока, "Значение, Представление,Комментарий"); Форма[СтрокаПотребитель.ИмяРеквизита] = НайденнаяСтрока.Представление; - + КонецЕсли; - + Форма.Модифицированность = Истина; - Результат = Новый Структура(); - Результат.Вставить("ОбновитьКонтекстноеМеню", Истина); - Результат.Вставить("ИмяРеквизита", СтрокаПотребитель.ИмяРеквизита); - Результат.Вставить("Комментарий", Комментарий); + Результат = Новый Структура; + Результат.Вставить("ОбновитьКонтекстноеМеню", Истина); + Результат.Вставить("ИмяРеквизита", СтрокаПотребитель.ИмяРеквизита); + Результат.Вставить("Комментарий", Комментарий); Результат.Вставить("ИмяЭлементаДляРазмещения", НайденнаяСтрока.ИмяЭлементаДляРазмещения); ОбновитьКонтактнуюИнформациюФормы(Форма, Результат, АсинхронныйВызов); - ИначеЕсли ТипКонтактнойИнформации = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты") Тогда - АдресПочты = Форма.Элементы[ИмяРеквизита].ТекстРедактирования; - ИсточникКонтактнойИнформации = Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].Владелец; - СоздатьЭлектронноеПисьмо("", АдресПочты, ТипКонтактнойИнформации, ИсточникКонтактнойИнформации); - ИначеЕсли ТипКонтактнойИнформации = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Телефон") Тогда - МожноОтправлятьSMS = Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].МожноОтправлятьSMS; - - Параметры = Новый Структура("НомерТелефона, ТипКонтактнойИнформации, ИсточникКонтактнойИнформации"); - Параметры.НомерТелефона = Форма[ИмяРеквизита]; - Параметры.ТипКонтактнойИнформации = ТипКонтактнойИнформации; - Параметры.ИсточникКонтактнойИнформации = Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].Владелец; - - Если ПустаяСтрока(Параметры.НомерТелефона) Тогда - Если МожноОтправлятьSMS Тогда - ТекстПредупреждения = НСтр("ru = 'Для совершения звонка или отправки SMS введите номер телефона.'"); - Иначе - ТекстПредупреждения = НСтр("ru = 'Для совершения звонка введите номер телефона.'"); - КонецЕсли; - ПоказатьПредупреждение(, ТекстПредупреждения); - ИначеЕсли МожноОтправлятьSMS Тогда - Список = Новый СписокЗначений; - Список.Добавить("Позвонить", НСтр("ru = 'Позвонить'"),, БиблиотекаКартинок.Позвонить); - Список.Добавить("ОтправитьSMS", НСтр("ru = 'Отправить SMS...'"),, БиблиотекаКартинок.ОтправитьSMS); - ОповещениеМеню = Новый ОписаниеОповещения("ПослеВыбораИзМенюТелефон", ЭтотОбъект, Параметры); - Форма.ПоказатьВыборИзМеню(ОповещениеМеню, Список, Форма.Элементы[ИмяКоманды]); - Иначе - ПозвонитьПоТелефону(Параметры.НомерТелефона); - КонецЕсли; - - ИначеЕсли ТипКонтактнойИнформации = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Skype") Тогда - Параметры = Новый Структура("ЛогинSkype"); - Параметры.ЛогинSkype = Форма.Элементы[ИмяРеквизита].ТекстРедактирования; - Список = Новый СписокЗначений; - Список.Добавить("Позвонить", НСтр("ru = 'Позвонить'")); - Список.Добавить("НачатьЧат", НСтр("ru = 'Начать чат'")); - ОповещениеМеню = Новый ОписаниеОповещения("ПослеВыбораИзМенюSkype", ЭтотОбъект, Параметры); - Форма.ПоказатьВыборИзМеню(ОповещениеМеню, Список, Форма.Элементы[ИмяКоманды]); - - ИначеЕсли ТипКонтактнойИнформации = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.ВебСтраница") Тогда - АдресСсылки = Форма.Элементы[ИмяРеквизита].ТекстРедактирования; - ПерейтиПоВебСсылке("", АдресСсылки, ТипКонтактнойИнформации); - КонецЕсли; + Иначе + ПараметрыКИ = Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения]; + ВладелецКИ = ПараметрыКИ.Владелец; + КомандыДляВывода = УправлениеКонтактнойИнформациейКлиентСервер.КомандыДляВыводаНаФорму(ПараметрыКИ, + ТипКонтактнойИнформации, НайденнаяСтрока.Вид, НайденнаяСтрока.ХранитьИсториюИзменений); + + КоличествоКоманд = КомандыДляВывода.Количество(); + + Если КоличествоКоманд = 0 Тогда + Возврат; + КонецЕсли; + + КонтактнаяИнформация = ПараметрКонтактнаяИнформацияДляВыполненияКоманд(НайденнаяСтрока.Представление, + НайденнаяСтрока.Значение, НайденнаяСтрока.Тип, НайденнаяСтрока.Вид); + ДополнительныеПараметры = ДополнительныеПараметрыДляВыполненияКоманд(ВладелецКИ, Форма, НайденнаяСтрока.ИмяРеквизита, АсинхронныйВызов); + Параметры = Новый Структура("КонтактнаяИнформация, ДополнительныеПараметры", КонтактнаяИнформация, ДополнительныеПараметры); + + Если КоличествоКоманд = 1 Тогда + + Для Каждого Команда Из КомандыДляВывода Цикл + ВыполнитьКомандуКонтактнойИнформации(Команда.Значение.Действие, Параметры); + КонецЦикла; + + ИначеЕсли КоличествоКоманд > 1 Тогда + Список = Новый СписокЗначений; + Для Каждого Команда Из КомандыДляВывода Цикл + Список.Добавить(Команда.Значение.Действие, Команда.Значение.Заголовок, , Команда.Значение.Картинка); + КонецЦикла; + + ОповещениеМеню = Новый ОписаниеОповещения("ПослеВыбораИзМеню", ЭтотОбъект, Параметры); + Форма.ПоказатьВыборИзМеню(ОповещениеМеню, Список, Форма.Элементы[ИмяКоманды]); + КонецЕсли; + КонецЕсли; + КонецПроцедуры Процедура ПриОбработкеНавигационнойСсылки(Форма, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка, АсинхронныйВызов) СтандартнаяОбработка = Ложь; + + Если СтрЗаканчиваетсяНа(Элемент.Имя, "РасширеннаяПодсказка") Тогда + ИмяКоманды = НавигационнаяСсылкаФорматированнойСтроки; + ИмяРеквизита = УдалитьПостфиксСтроки(Элемент.Имя, "РасширеннаяПодсказка"); + ПередВыполнениемКомандыИзРасширеннойПодсказкиАдреса(Форма, Элемент, ИмяРеквизита, ИмяКоманды, АсинхронныйВызов); + Возврат; + КонецЕсли; + АдресСсылки = Форма[Элемент.Имя]; Если НавигационнаяСсылкаФорматированнойСтроки = УправлениеКонтактнойИнформациейКлиентСервер.НавигационнаяСсылкаВебСайта() Или СокрЛП(Строка(АдресСсылки)) = УправлениеКонтактнойИнформациейКлиентСервер.ТекстПустогоАдресаВВидеГиперссылки() Тогда @@ -1254,6 +1326,25 @@ Процедура ПриИзмененииКонтактнойИнформации(Форма, Элемент, ЭтоТабличнаяЧасть, ОбновитьФорму, АсинхронныйВызов) + Префикс = "Комментарий"; + Если СтрНачинаетсяС(Элемент.Имя, Префикс) Тогда + ИмяРеквизита = УдалитьПрефиксСтроки(Элемент.Имя, Префикс); + Результат = Новый Структура; + Результат.Вставить("ИмяРеквизита", ИмяРеквизита); + НайденныеСтроки = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).НайтиСтроки(Результат); + Если НайденныеСтроки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + НайденнаяСтрока = НайденныеСтроки[0]; + ИмяЭлементаДляРазмещения = НайденнаяСтрока.ИмяЭлементаДляРазмещения; + НайденнаяСтрока.Комментарий = Элемент.ТекстРедактирования; + Результат.Вставить("ИмяЭлементаДляРазмещения", ИмяЭлементаДляРазмещения); + Результат.Вставить("ТипКонтактнойИнформации", НайденнаяСтрока.Тип); + Результат.Вставить("ЭтоДобавлениеКомментария", Истина); + ОбновитьКонтактнуюИнформациюФормы(Форма, Результат, АсинхронныйВызов); + Возврат; + КонецЕсли; + ЭтоТабличнаяЧасть = ЭтоТабличнаяЧасть(Элемент); Если ЭтоТабличнаяЧасть Тогда @@ -1283,7 +1374,10 @@ Результат = Новый Структура("ОбновитьКонтекстноеМеню, ИмяЭлементаДляРазмещения", Истина, ДанныеСтроки.ИмяЭлементаДляРазмещения); Если ОбновитьФорму Тогда ОбновитьКонтекстноеМеню(Форма, ДанныеСтроки.ИмяЭлементаДляРазмещения); - КонецЕсли; + КонецЕсли; + Если ЗначениеЗаполнено(ДанныеСтроки.Маска) И Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда + Элемент.Маска = ДанныеСтроки.Маска; + КонецЕсли; Возврат; КонецЕсли; @@ -1384,22 +1478,10 @@ Результат.ИмяРеквизита = СтрЗаменить(ИмяРеквизита, "Вверх", ""); Результат.НаправлениеПеремещения = -1; Результат.Команда = "Вверх"; - ИначеЕсли СтрНачинаетсяС(ИмяРеквизита, "История") Тогда - Результат.ИмяРеквизита = СтрЗаменить(ИмяРеквизита, "История", ""); - Результат.Команда = "История"; ИначеЕсли СтрНачинаетсяС(ИмяРеквизита, "Вниз") Тогда Результат.ИмяРеквизита = СтрЗаменить(ИмяРеквизита, "Вниз", ""); Результат.НаправлениеПеремещения = 1; Результат.Команда = "Вниз"; - ИначеЕсли СтрНачинаетсяС(ИмяРеквизита, "КартаЯндекс") Тогда - Результат.ИмяРеквизита = СтрЗаменить(ИмяРеквизита, "КартаЯндекс", ""); - Результат.Команда = "КартаЯндекс"; - ИначеЕсли СтрНачинаетсяС(ИмяРеквизита, "КартаGoogle") Тогда - Результат.ИмяРеквизита = СтрЗаменить(ИмяРеквизита, "КартаGoogle", ""); - Результат.Команда = "КартаGoogle"; - Иначе - Результат.ИмяРеквизита = СтрЗаменить(ИмяРеквизита, "Комментарий", ""); - Результат.Команда = "Комментарий"; КонецЕсли; Возврат Результат; @@ -1457,29 +1539,12 @@ КонецФункции -Процедура ПослеВыбораИзМенюТелефон(ВыбранныйЭлемент, Параметры) Экспорт +Процедура ПослеВыбораИзМеню(ВыбранныйЭлемент, Параметры) Экспорт Если ВыбранныйЭлемент <> Неопределено Тогда - Если ВыбранныйЭлемент.Значение = "ОтправитьSMS" Тогда - СоздатьSMS("", Параметры.НомерТелефона, Параметры.ТипКонтактнойИнформации, Параметры.ИсточникКонтактнойИнформации); - Иначе - ПозвонитьПоТелефону(Параметры.НомерТелефона); - КонецЕсли; - КонецЕсли; -КонецПроцедуры - -Процедура ПослеВыбораИзМенюSkype(ВыбранныйЭлемент, Параметры) Экспорт - - Если ВыбранныйЭлемент = Неопределено Тогда - Возврат; + ВыполнитьКомандуКонтактнойИнформации(ВыбранныйЭлемент.Значение, Параметры); КонецЕсли; - Если ВыбранныйЭлемент.Значение = "Позвонить" Тогда - ПозвонитьНаSkype(Параметры.ЛогинSkype); - ИначеЕсли ВыбранныйЭлемент.Значение = "НачатьЧат" Тогда - НачатьБеседуВSkype(Параметры.ЛогинSkype); - КонецЕсли; - КонецПроцедуры Процедура ОткрытьSkype(СтрокаЗапуска) @@ -1693,15 +1758,15 @@ Продолжить; КонецЕсли; - ПодменюКопироватьАдреса = Форма.Элементы.Найти("ПодменюКопироватьАдреса" + СтрокаКИ.ИмяРеквизита); КонтекстноеПодменюКопироватьАдреса = Форма.Элементы.Найти("КонтекстноеПодменюКопироватьАдреса" + СтрокаКИ.ИмяРеквизита); - Если ПодменюКопироватьАдреса <> Неопределено И КонтекстноеПодменюКопироватьАдреса = Неопределено Тогда + Если КонтекстноеПодменюКопироватьАдреса = Неопределено Тогда Продолжить; КонецЕсли; КоличествоКомандВПодменю = 0; СписокАдресовВПодменю = Новый Соответствие(); - СписокАдресовВПодменю.Вставить(ВРег(СтрокаКИ.Представление), Истина); + ДанныеАдреса = Новый Структура("Представление, Адрес", СтрокаКИ.Представление, СтрокаКИ.Значение); + СписокАдресовВПодменю.Вставить(ВРег(СтрокаКИ.Представление), ДанныеАдреса); Для Каждого Адрес Из НайденныеСтроки Цикл @@ -1713,17 +1778,14 @@ Продолжить; КонецЕсли; + Если НЕ ЗначениеЗаполнено(Адрес.Представление) Тогда + Продолжить; + КонецЕсли; + ИмяКоманды = "МенюПодменюАдрес" + СтрокаКИ.ИмяРеквизита + "_" + Адрес.ИмяРеквизита; Команда = Форма.Команды.Найти(ИмяКоманды); Если Команда = Неопределено Тогда - Команда = Форма.Команды.Добавить(ИмяКоманды); - Команда.Подсказка = НСтр("ru = 'Скопировать адрес'"); - Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; - Команда.ИзменяетСохраняемыеДанные = Истина; - - ДобавленныеЭлементы = ПараметрыКонтактнойИнформации.ДобавленныеЭлементы; // СписокЗначений - ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина); - КоличествоКомандВПодменю = КоличествоКомандВПодменю + 1; + Продолжить; КонецЕсли; ПредставлениеАдреса = ?(СтрокаКИ.МеждународныйФорматАдреса, @@ -1732,20 +1794,30 @@ Если СписокАдресовВПодменю[ВРег(Адрес.Представление)] <> Неопределено Тогда ПредставлениеАдреса = ""; Иначе - СписокАдресовВПодменю.Вставить(ВРег(Адрес.Представление), Истина); - КонецЕсли; - - Если ПодменюКопироватьАдреса <> Неопределено Тогда - ДобавитьКнопкуСкопироватьАдрес(Форма, ИмяКоманды, - ПредставлениеАдреса, ПараметрыКонтактнойИнформации, ПодменюКопироватьАдреса); + ДанныеАдреса = Новый Структура("Представление, Адрес", ПредставлениеАдреса, Адрес.Значение); + Если СтрокаКИ.МеждународныйФорматАдреса Тогда + ДанныеАдреса.Адрес = УправлениеКонтактнойИнформациейСлужебныйВызовСервера.КонтактнаяИнформацияПоПредставлению( + ПредставлениеАдреса, Адрес.Тип); КонецЕсли; - - Если КонтекстноеПодменюКопироватьАдреса <> Неопределено Тогда - ДобавитьКнопкуСкопироватьАдрес(Форма, ИмяКоманды, - ПредставлениеАдреса, ПараметрыКонтактнойИнформации, КонтекстноеПодменюКопироватьАдреса); + СписокАдресовВПодменю.Вставить(ВРег(Адрес.Представление), ДанныеАдреса); КонецЕсли; + + ДобавитьКнопкуСкопироватьАдрес(Форма, ИмяКоманды, ПредставлениеАдреса, ПараметрыКонтактнойИнформации, + КонтекстноеПодменюКопироватьАдреса); КонецЦикла; + + Поле = Форма.Элементы[СтрокаКИ.ИмяРеквизита]; + Если Поле.Вид = ВидПоляФормы.ПолеВвода Тогда + Поле.СписокВыбора.Очистить(); + ПредставлениеДляПоиска = ВРег(СтрокаКИ.Представление); + Для Каждого ДанныеАдреса Из СписокАдресовВПодменю Цикл + Если ДанныеАдреса.Ключ <> ПредставлениеДляПоиска Тогда + Поле.СписокВыбора.Добавить(ДанныеАдреса.Значение, ДанныеАдреса.Значение.Представление); + КонецЕсли; + КонецЦикла; + КонецЕсли; + ОбщееКоличествоКоманд = ОбщееКоличествоКоманд + КоличествоКомандВПодменю; КонецЦикла; @@ -1766,4 +1838,265 @@ КонецПроцедуры +// Конструктор параметра КонтактнаяИнформация для выполнения команд контактной информации +// +// Параметры: +// Представление - Строка - представление контактной информации. +// Значение - Строка - значение полей контактной информации в формате JSON или ХML. +// Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации +// Вид - СправочникСсылка.ВидыКонтактнойИнформации +// +// Возвращаемое значение: +// Структура: +// * Представление - Строка - представление контактной информации. +// * Значение - Строка - значение полей контактной информации в формате JSON или ХML. +// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации +// * Вид - СправочникСсылка.ВидыКонтактнойИнформации +// +Функция ПараметрКонтактнаяИнформацияДляВыполненияКоманд(Представление, Значение, Тип, Вид) + + КонтактнаяИнформация = Новый Структура; + КонтактнаяИнформация.Вставить("Представление", Представление); + КонтактнаяИнформация.Вставить("Значение", Значение); + КонтактнаяИнформация.Вставить("Тип", Тип); + КонтактнаяИнформация.Вставить("Вид", Вид); + + Возврат КонтактнаяИнформация; + +КонецФункции + +// Конструктор дополнительных параметров для выполнения команд контактной информации +// +// Параметры: +// ВладелецКонтактнойИнформации - ОпределяемыйТип.ВладелецКонтактнойИнформации +// Форма - ФормаКлиентскогоПриложения +// ИмяРеквизита - Строка +// +// Возвращаемое значение: +// Структура: +// * ВладелецКонтактнойИнформации - ОпределяемыйТип.ВладелецКонтактнойИнформации +// * Форма - ФормаКлиентскогоПриложения +// * ИмяРеквизита - Строка - служебный параметр, не предназначен для использования +// * АсинхронныйВызов - Булево - служебный параметр, не предназначен для использования +// +Функция ДополнительныеПараметрыДляВыполненияКоманд(ВладелецКонтактнойИнформации, Форма, ИмяРеквизита = "", АсинхронныйВызов = Ложь) + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ВладелецКонтактнойИнформации", ВладелецКонтактнойИнформации); + ДополнительныеПараметры.Вставить("Форма", Форма); + // Для служебного использования + ДополнительныеПараметры.Вставить("ИмяРеквизита", ИмяРеквизита); + ДополнительныеПараметры.Вставить("АсинхронныйВызов", АсинхронныйВызов); + + Возврат ДополнительныеПараметры; + +КонецФункции + +// Параметры: +// ИмяОбработчика - Строка - полный путь к функции, которую необходимо выполнить. +// Например, "_ДемоСтандартныеПодсистемыКлиент.ОткрытьФормуДокументаВстреча". +// Параметры - Структура: +// * КонтактнаяИнформация - см. ПараметрКонтактнаяИнформацияДляВыполненияКоманд +// * ДополнительныеПараметры - см. ДополнительныеПараметрыДляВыполненияКоманд +// +Процедура ВыполнитьКомандуКонтактнойИнформации(ИмяОбработчика, Параметры) + + НачалоИмениПроцедуры = СтрНайти(ИмяОбработчика, ".", НаправлениеПоиска.СКонца); + + Если НачалоИмениПроцедуры = 0 Тогда + Возврат; + КонецЕсли; + + ИмяПроцедуры = СокрЛП(Сред(ИмяОбработчика, НачалоИмениПроцедуры + 1)); + ИмяМодуля = СокрЛП(Лев(ИмяОбработчика, НачалоИмениПроцедуры - 1)); + + ВыполнитьОбработкуОповещения(Новый ОписаниеОповещения(ИмяПроцедуры, ОбщегоНазначенияКлиент.ОбщийМодуль(ИмяМодуля), + Параметры.ДополнительныеПараметры), Параметры.КонтактнаяИнформация); + +КонецПроцедуры + +Процедура ПередТелефоннымЗвонком(КонтактнаяИнформация, ДополнительныеПараметры) Экспорт + + Если ПустаяСтрока(КонтактнаяИнформация.Представление) Тогда + ОбщегоНазначенияКлиент.СообщитьПользователю( + НСтр("ru = 'Для совершения звонка введите номер телефона.'"), , ДополнительныеПараметры.ИмяРеквизита); + Иначе + ПозвонитьПоТелефону(КонтактнаяИнформация.Представление); + КонецЕсли; + +КонецПроцедуры + +Процедура ПередСозданиемSMS(КонтактнаяИнформация, ДополнительныеПараметры) Экспорт + + Если ПустаяСтрока(КонтактнаяИнформация.Представление) Тогда + ОбщегоНазначенияКлиент.СообщитьПользователю( + НСтр("ru = 'Для отправки SMS введите номер телефона.'"), , ДополнительныеПараметры.ИмяРеквизита); + Иначе + СоздатьSMS("", КонтактнаяИнформация.Представление, КонтактнаяИнформация.Тип, + ДополнительныеПараметры.ВладелецКонтактнойИнформации); + КонецЕсли; + +КонецПроцедуры + +Процедура ПередЗвонкомНаSkype(КонтактнаяИнформация, ДополнительныеПараметры) Экспорт + + ПозвонитьНаSkype(КонтактнаяИнформация.Представление); + +КонецПроцедуры + +Процедура ПередНачаломБеседыВSkype(КонтактнаяИнформация, ДополнительныеПараметры) Экспорт + + НачатьБеседуВSkype(КонтактнаяИнформация.Представление); + +КонецПроцедуры + +Процедура ПередПереходомПоВебСсылке(КонтактнаяИнформация, ДополнительныеПараметры) Экспорт + + ПерейтиПоВебСсылке("", КонтактнаяИнформация.Представление, КонтактнаяИнформация.Тип); + +КонецПроцедуры + +Процедура ПередСозданиемЭлектронногоПисьма(КонтактнаяИнформация, ДополнительныеПараметры) Экспорт + + СоздатьЭлектронноеПисьмо("", КонтактнаяИнформация.Представление, КонтактнаяИнформация.Тип, + ДополнительныеПараметры.ВладелецКонтактнойИнформации, ДополнительныеПараметры.ИмяРеквизита); + +КонецПроцедуры + +Процедура ПередПоказомАдресаНаКартеGoogle(КонтактнаяИнформация, ДополнительныеПараметры) Экспорт + + АдресКодированный = ДекодированиеСтроки(КонтактнаяИнформация.Представление); + СтрокаЗапуска = "https://maps.google.com/?q=" + АдресКодированный; + ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(СтрокаЗапуска); + +КонецПроцедуры + +Процедура ПередПоказомАдресаНаКартеЯндекс(КонтактнаяИнформация, ДополнительныеПараметры) Экспорт + + АдресКодированный = ДекодированиеСтроки(КонтактнаяИнформация.Представление); + СтрокаЗапуска = "https://maps.yandex.com/?text=" + АдресКодированный; + ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(СтрокаЗапуска); + +КонецПроцедуры + +Процедура ПередВводомКомментария(КонтактнаяИнформация, ДополнительныеПараметры) Экспорт + + Результат = Новый Структура("ИмяРеквизита", ДополнительныеПараметры.ИмяРеквизита); + НайденныеСтроки = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме( + ДополнительныеПараметры.Форма).НайтиСтроки(Результат); + Если НайденныеСтроки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + НайденнаяСтрока = НайденныеСтроки[0]; + Результат.Вставить("ИмяЭлементаДляРазмещения", НайденнаяСтрока.ИмяЭлементаДляРазмещения); + Результат.Вставить("ТипКонтактнойИнформации", НайденнаяСтрока.Тип); + + ВвестиКомментарий(ДополнительныеПараметры.Форма, ДополнительныеПараметры.ИмяРеквизита, НайденнаяСтрока, Результат, + ДополнительныеПараметры.АсинхронныйВызов); + +КонецПроцедуры + +Процедура ПередОткрытиемФормыИсторииИзменений(КонтактнаяИнформация, ДополнительныеПараметры) Экспорт + + Результат = Новый Структура("ИмяРеквизита", ДополнительныеПараметры.ИмяРеквизита); + НайденныеСтроки = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме( + ДополнительныеПараметры.Форма).НайтиСтроки(Результат); + Если НайденныеСтроки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + НайденнаяСтрока = НайденныеСтроки[0]; + + ОткрытьФормуИсторииИзменений(ДополнительныеПараметры.Форма, НайденнаяСтрока, ДополнительныеПараметры.АсинхронныйВызов); + +КонецПроцедуры + +Процедура ПередВыполнениемКомандыИзРасширеннойПодсказкиАдреса(Форма, Элемент, ИмяРеквизита, ИмяКоманды, АсинхронныйВызов) + + Результат = Новый Структура("ИмяРеквизита", ИмяРеквизита); + НайденныеСтроки = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме( + Форма).НайтиСтроки(Результат); + Если НайденныеСтроки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + НайденнаяСтрока = НайденныеСтроки[0]; + ИмяЭлементаДляРазмещения = НайденнаяСтрока.ИмяЭлементаДляРазмещения; + + ПараметрыКИ = Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения]; + ВладелецКИ = ПараметрыКИ.Владелец; + + КомандыДляВывода = УправлениеКонтактнойИнформациейКлиентСервер.КомандыДляВыводаНаФорму(ПараметрыКИ, + НайденнаяСтрока.Тип, НайденнаяСтрока.Вид, НайденнаяСтрока.ХранитьИсториюИзменений); + + КонтактнаяИнформация = ПараметрКонтактнаяИнформацияДляВыполненияКоманд(НайденнаяСтрока.Представление, + НайденнаяСтрока.Значение, НайденнаяСтрока.Тип, НайденнаяСтрока.Вид); + ДополнительныеПараметры = ДополнительныеПараметрыДляВыполненияКоманд(ВладелецКИ, Форма, ИмяРеквизита, АсинхронныйВызов); + Параметры = Новый Структура("КонтактнаяИнформация, ДополнительныеПараметры", КонтактнаяИнформация, + ДополнительныеПараметры); + + Если ИмяКоманды = "ПоказатьНаКарте" Тогда + Список = Новый СписокЗначений; + ПоказатьНаКартеЯндекс = КомандыДляВывода.ПоказатьНаКартеЯндекс; + Список.Добавить(ПоказатьНаКартеЯндекс.Действие, ПоказатьНаКартеЯндекс.Заголовок, , + ПоказатьНаКартеЯндекс.Картинка); + ПоказатьНаКартеGoogle = КомандыДляВывода.ПоказатьНаКартеGoogle; + Список.Добавить(ПоказатьНаКартеGoogle.Действие, ПоказатьНаКартеGoogle.Заголовок, , + ПоказатьНаКартеGoogle.Картинка); + ОповещениеМеню = Новый ОписаниеОповещения("ПослеВыбораИзМеню", ЭтотОбъект, Параметры); + Форма.ПоказатьВыборИзМеню(ОповещениеМеню, Список, Элемент); + Иначе + Если КомандыДляВывода.Свойство(ИмяКоманды) Тогда + ВыполнитьКомандуКонтактнойИнформации(КомандыДляВывода[ИмяКоманды].Действие, Параметры); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Удаляет префикс строки. +// +// Параметры: +// ИсходнаяСтрока - Строка; +// Префикс - Строка. +// +// Возвращаемое значение: +// Строка +// +Функция УдалитьПрефиксСтроки(ИсходнаяСтрока, Префикс) + + Если Не СтрНачинаетсяС(ВРег(ИсходнаяСтрока), ВРег(Префикс)) Тогда + Возврат ИсходнаяСтрока; + КонецЕсли; + + ДлинаПрефикса = СтрДлина(Префикс); + СтрокаБезПрефикса = Сред(ИсходнаяСтрока, ДлинаПрефикса + 1); + + Возврат СтрокаБезПрефикса; + +КонецФункции + +// Удаляет постфикс строки. +// +// Параметры: +// ИсходнаяСтрока - Строка; +// Постфикс - Строка. +// +// Возвращаемое значение: +// Строка +// +Функция УдалитьПостфиксСтроки(ИсходнаяСтрока, Постфикс) + + Если Не СтрЗаканчиваетсяНа(ВРег(ИсходнаяСтрока), ВРег(Постфикс)) Тогда + Возврат ИсходнаяСтрока; + КонецЕсли; + + ДлинаПостфикса = СтрДлина(Постфикс); + ДлинаСтроки = СтрДлина(ИсходнаяСтрока); + КоличествоСимволов = ДлинаСтроки - ДлинаПостфикса; + СтрокаБезПостфикса = Лев(ИсходнаяСтрока, КоличествоСимволов); + + Возврат СтрокаБезПостфикса; + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl index ce60ee119..ed74d6a6b 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl @@ -366,6 +366,160 @@ КонецФункции +// Возвращает структуру, содержащую описание команд, которые будут выведены для вида контактной информации +// +// Параметры: +// ПараметрыКонтактнойИнформации - Структура: +// * ГруппаДляРазмещения - Строка +// * ПоложениеЗаголовка - Строка +// * ДобавленныеРеквизиты - СписокЗначений +// * ОтложеннаяИнициализация - Булево +// * ВыполненаОтложеннаяИнициализация - Булево +// * ДобавленныеЭлементы - СписокЗначений +// * СписокДобавляемыхЭлементов - СписокЗначений: +// * Значение - Структура: +// ** Ссылка - СправочникСсылка.ВидыКонтактнойИнформации +// * Ключ - Строка +// * МожноОтправлятьSMS - Булево +// * Владелец - ЛюбаяСсылка +// * ОбработкаНавигационнойСсылки - Булево +// * СкрываемыеВиды - Массив - виды контактной информации, которые не требуется отображать на форме +// * ОписаниеКоманд - см. УправлениеКонтактнойИнформацией.ОписаниеКоманд +// * ОтображатьИконки - Булево +// * РазмещеныНаФорме - Соответствие из КлючИЗначение - виды контактной информации, которые были размещены на форме интерактивно, +// при отложенной инициализации будут созданы на форме после вызова +// процедуры УправлениеКонтактнойИнформацией.ВыполнитьОтложеннуюИнициализацию: +// * Ключ - СправочникСсылка.ВидыКонтактнойИнформации +// * Значение - Булево +// * ИсключаемыеВиды - Массив - устарело. Следует использовать РазмещеныНаФорме. +// * РазрешитьДобавлениеПолей - Булево +// Тип - ПеречислениеСсылка.ТипКонтактнойИнформации +// Вид - СправочникСсылка.ВидыКонтактнойИнформации +// ХранитьИсторию - Булево +// +// Возвращаемое значение: +// см. УправлениеКонтактнойИнформацией.КомандыТипаКонтактнойИнформации +// +Функция КомандыДляВыводаНаФорму(ПараметрыКонтактнойИнформации, Тип, Вид, ХранитьИсторию) Экспорт + + ОписаниеКоманд = ПараметрыКонтактнойИнформации.ОписаниеКоманд; + + Если ЗначениеЗаполнено(Вид) Тогда + КомандыВида = ОписаниеКоманд[Вид]; + Иначе + КомандыВида = Неопределено; + КонецЕсли; + + КомандыТипа = ОписаниеКоманд[Тип]; + + КомандыДляВывода = Новый Структура; + Если КомандыВида = Неопределено Тогда + Для Каждого КомандаТипа Из КомандыТипа Цикл + Если ЗначениеЗаполнено(КомандаТипа.Значение.Действие) Тогда + КомандыДляВывода.Вставить(КомандаТипа.Ключ, КомандаТипа.Значение); + КонецЕсли; + КонецЦикла; + Иначе + Для Каждого КомандаТипа Из КомандыТипа Цикл + КомандаВидаЗначение = КомандыВида[КомандаТипа.Ключ]; + Если КомандаВидаЗначение = Неопределено Тогда + Если ЗначениеЗаполнено(КомандаТипа.Значение.Действие) Тогда + КомандыДляВывода.Вставить(КомандаТипа.Ключ, КомандаТипа.Значение); + КонецЕсли; + Иначе + Если ЗначениеЗаполнено(КомандаВидаЗначение.Действие) Тогда + КомандыДляВывода.Вставить(КомандаТипа.Ключ, КомандаВидаЗначение); + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Телефон") Тогда + Если Не ПараметрыКонтактнойИнформации.МожноОтправлятьSMS Тогда + КомандыДляВывода.Удалить("ОтправитьSMS"); + КонецЕсли; + ИначеЕсли Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.ВебСтраница") Тогда + Если ПараметрыКонтактнойИнформации.ОбработкаНавигационнойСсылки Тогда + КомандыДляВывода.Удалить("ОткрытьВебСтраницу"); + КонецЕсли; + КонецЕсли; + + Если НЕ ХранитьИсторию И (Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес") + ИЛИ Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Телефон") + ИЛИ Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Факс")) Тогда + КомандыДляВывода.Удалить("ПоказатьИсториюИзменений"); + КонецЕсли; + + Возврат КомандыДляВывода; + +КонецФункции + +// Возвращает расширенную подсказку для адреса. +// +// Параметры: +// КомандыДляВывода - Структура: +// * ВвестиКомментарийКАдресу - см. УправлениеКонтактнойИнформацией.СвойстваКоманды +// * ПоказатьНаКартеЯндекс - см. УправлениеКонтактнойИнформацией.СвойстваКоманды +// * ПоказатьНаКартеGoogle - см. УправлениеКонтактнойИнформацией.СвойстваКоманды +// * ЗапланироватьВстречу - см. УправлениеКонтактнойИнформацией.СвойстваКоманды +// * ПоказатьИсториюИзменений - см. УправлениеКонтактнойИнформацией.СвойстваКоманды +// ПредставлениеАдреса - Строка +// Комментарий - Строка +// +// Возвращаемое значение: +// ФорматированнаяСтрока +// +Функция РасширеннаяПодсказкаАдреса(КомандыДляВывода, ПредставлениеАдреса, Комментарий) Экспорт + + Если КомандыДляВывода.Свойство("ВвестиКомментарийКАдресу") И ЗначениеЗаполнено(ПредставлениеАдреса) Тогда + ИзменитьКомментарий = Новый ФорматированнаяСтрока(КомандыДляВывода.ВвестиКомментарийКАдресу.Картинка, , , , + "ВвестиКомментарийКАдресу"); + Иначе + ИзменитьКомментарий = ""; + КонецЕсли; + + Если КомандыДляВывода.Свойство("ПоказатьНаКартеЯндекс") И КомандыДляВывода.Свойство("ПоказатьНаКартеGoogle") Тогда + ПоказатьНаКарте = Новый ФорматированнаяСтрока(НСтр("ru='На карте'"),,WebЦвета.Серый, , "ПоказатьНаКарте"); + ИначеЕсли КомандыДляВывода.Свойство("ПоказатьНаКартеЯндекс") Тогда + ПоказатьНаКарте = Новый ФорматированнаяСтрока(КомандыДляВывода.ПоказатьНаКартеЯндекс.Заголовок, ,WebЦвета.Серый, , "ПоказатьНаКартеЯндекс"); + ИначеЕсли КомандыДляВывода.Свойство("ПоказатьНаКартеGoogle") Тогда + ПоказатьНаКарте = Новый ФорматированнаяСтрока(КомандыДляВывода.ПоказатьНаКартеGoogle.Заголовок, ,WebЦвета.Серый, , "ПоказатьНаКартеGoogle"); + Иначе + ПоказатьНаКарте = ""; + КонецЕсли; + + Если КомандыДляВывода.Свойство("ПоказатьИсториюИзменений") Тогда + ПоказатьИсторию = Новый ФорматированнаяСтрока("История", ,WebЦвета.Серый, , "ПоказатьИсториюИзменений"); + Иначе + ПоказатьИсторию = ""; + КонецЕсли; + + Если КомандыДляВывода.Свойство("ЗапланироватьВстречу") Тогда + ЗапланироватьВстречу = Новый ФорматированнаяСтрока(КомандыДляВывода.ЗапланироватьВстречу.Заголовок, ,WebЦвета.Серый , , "ЗапланироватьВстречу"); + Иначе + ЗапланироватьВстречу = ""; + КонецЕсли; + + Отступ = ?(ЗначениеЗаполнено(ПоказатьИсторию) И ЗначениеЗаполнено(ПоказатьНаКарте), " ", ""); + СтрокаКоманд = Новый ФорматированнаяСтрока(ПоказатьИсторию, Отступ, ПоказатьНаКарте); + + Отступ = ?(ЗначениеЗаполнено(СтрокаКоманд) И ЗначениеЗаполнено(ЗапланироватьВстречу), " ", ""); + СтрокаКоманд = Новый ФорматированнаяСтрока(СтрокаКоманд, Отступ, ЗапланироватьВстречу); + + Если ЗначениеЗаполнено(Комментарий) Тогда + ИзменитьКомментарий = ?(ЗначениеЗаполнено(ИзменитьКомментарий), ИзменитьКомментарий, ""); + Отступ = ?(ЗначениеЗаполнено(ИзменитьКомментарий), " ", ""); + ОтступПередКомандами = ?(ЗначениеЗаполнено(СтрокаКоманд), " ", ""); + РасширеннаяПодсказкаАдреса = Новый ФорматированнаяСтрока(ИзменитьКомментарий, Отступ, СокрЛП(Комментарий), ОтступПередКомандами, СтрокаКоманд); + Иначе + Отступ = ?(ЗначениеЗаполнено(СтрокаКоманд) И ЗначениеЗаполнено(ИзменитьКомментарий), " ", ""); + РасширеннаяПодсказкаАдреса = Новый ФорматированнаяСтрока(ИзменитьКомментарий, Отступ, СтрокаКоманд); + КонецЕсли; + + Возврат РасширеннаяПодсказкаАдреса; + +КонецФункции + #Область СлужебныеПроцедурыИФункцииПоРаботеСXMLАдресами // Возвращает структуру с наименованием и сокращением от значения. diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейЛокализация/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейЛокализация/Module.bsl index f03ed4374..deac157dc 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейЛокализация/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейЛокализация/Module.bsl @@ -857,7 +857,7 @@ // Данные2 - ОбъектXDTO // - Строка // - Структура - смотри описание параметра Данные1. -// Результат - ТаблицаЗначений +// Результат - ТаблицаЗначений: // * Путь - Строка - XPath, идентифицирующий отличающееся значение. Значение "ТипКонтактнойИнформации" // означает, что переданные экземпляры контактной информации различаются типом. // * Описание - Строка - описание отличающегося реквизита в терминах предметной области. diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейПереопределяемый/Module.bsl index d1717308c..40ce21b97 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейПереопределяемый/Module.bsl @@ -8,6 +8,59 @@ #Область ПрограммныйИнтерфейс +// Изменяет, добавляет, удаляет стандартные команды контактной информации, отображаемые в справочниках и документах, +// Вкл./Выкл. отображение иконок контактной информации слева от заголовка вида контактной информации +// +// Параметры: +// Настройки - Структура: +// * ОтображатьИконки - Булево +// * ОписаниеКоманд - см. УправлениеКонтактнойИнформацией.ОписаниеКоманд +// +// Пример: +// Настройки.ОтображатьИконки = Истина; +// Адрес = Перечисления.ТипыКонтактнойИнформации.Адрес; +// Настройки.ОписаниеКоманд[Адрес].ЗапланироватьВстречу.Заголовок = НСтр("ru='Встреча'"); +// Настройки.ОписаниеКоманд[Адрес].ЗапланироватьВстречу.Подсказка = НСтр("ru='Создать событие встречи'"); +// Настройки.ОписаниеКоманд[Адрес].ЗапланироватьВстречу.Картинка = БиблиотекаКартинок.ЗапланированноеВзаимодействие; +// Настройки.ОписаниеКоманд[Адрес].ЗапланироватьВстречу.Действие = "_ДемоСтандартныеПодсистемыКлиент.ОткрытьФормуДокументаВстреча"; +// +// _ДемоФактическийАдресОрганизации = УправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени("_ДемоФактическийАдресОрганизации"); +// Настройки.ОписаниеКоманд[_ДемоФактическийАдресОрганизации] = +// УправлениеКонтактнойИнформацией.КомандыТипаКонтактнойИнформации(Перечисления.ТипыКонтактнойИнформации.Адрес); +// Настройки.ОписаниеКоманд[_ДемоФактическийАдресОрганизации].ЗапланироватьВстречу.Действие = ""; // Отключение действия команды для вида +// +// Процедурам, указанных в свойстве Действие, передаются 2 параметра: +// КонтактнаяИнформация - Структура: +// * Представление - Строка +// * Значение - Строка +// * Тип - ПеречислениеСсылка.ТипКонтактнойИнформации +// * Вид - СправочникСсылка.ВидыКонтактнойИнформации +// ДополнительныеПараметры - Структура: +// * ВладелецКонтактнойИнформации - ОпределяемыйТип.ВладелецКонтактнойИнформации. +// * Форма - ФормаКлиентскогоПриложения - форма объекта-владельца, предназначенная для вывода контактной информации. +// +// Пример: +// Процедура ОткрытьФормуДокументаВстреча(КонтактнаяИнформация, ДополнительныеПараметры) Экспорт +// ЗначенияЗаполнения = Новый Структура; +// ЗначенияЗаполнения.Вставить("МестоПроведенияВстречи", КонтактнаяИнформация.Представление); +// Если ТипЗнч(ДополнительныеПараметры.ВладелецКонтактнойИнформации) = Тип("ДокументСсылка._ДемоЗаказПокупателя") Тогда +// ЗначенияЗаполнения.Вставить("Предмет", ДополнительныеПараметры.ВладелецКонтактнойИнформации); +// ЗначенияЗаполнения.Вставить("Контакт", ""); +// Иначе +// ЗначенияЗаполнения.Вставить("Контакт", ДополнительныеПараметры.ВладелецКонтактнойИнформации); +// ЗначенияЗаполнения.Вставить("Предмет", ""); +// КонецЕсли; +// +// ОткрытьФорму("Документ.Встреча.ФормаОбъекта", Новый Структура("ЗначенияЗаполнения", ЗначенияЗаполнения), +// ДополнительныеПараметры.Форма); +// КонецПроцедуры +// +Процедура ПриОпределенииНастроек(Настройки) Экспорт + + + +КонецПроцедуры + // Получает наименования видов контактной информации на разных языках. // // Параметры: diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl index 1168f1015..04c8d2904 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl @@ -8,70 +8,6 @@ #Область СлужебныйПрограммныйИнтерфейс -// Параметры: -// Ссылка - СправочникСсылка -// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации -// Дата - Дата -// Возвращаемое значение: -// Строка -// -Функция ПервоеЗначениеКонтактнойИнформацииОбъектаПоТипу(Ссылка, ТипКонтактнойИнформации, Дата) Экспорт - - Результат = ""; - ПолноеИмя = Ссылка.Метаданные().ПолноеИмя(); - - Если СтрНачинаетсяС(ПолноеИмя, "Справочник") Тогда - ИмяГруппыКонтактнойИнформации = "Справочник" + Ссылка.Метаданные().Имя; - ИначеЕсли СтрНачинаетсяС(ПолноеИмя, "Документ") Тогда - ИмяГруппыКонтактнойИнформации = "Документ" + Ссылка.Метаданные().Имя; - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - |ВЫБОР - | КОГДА ВидыКонтактнойИнформации.ИмяПредопределенногоВида <> """" - | ТОГДА ВидыКонтактнойИнформации.ИмяПредопределенногоВида - | ИНАЧЕ ВидыКонтактнойИнформации.ИмяПредопределенныхДанных - |КОНЕЦ КАК Наименование - |ИЗ - | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации - |ГДЕ - | ВидыКонтактнойИнформации.ЭтоГруппа = ИСТИНА"; - - РезультатЗапроса = Запрос.Выполнить().Выбрать(); - Пока РезультатЗапроса.Следующий() Цикл - Если РезультатЗапроса.Наименование = ИмяГруппыКонтактнойИнформации Тогда - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ВидыКонтактнойИнформацииПодчиненный.Ссылка КАК Ссылка - |ИЗ - | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформацииПодчиненный - | ПО (ВидыКонтактнойИнформацииПодчиненный.Родитель = ВидыКонтактнойИнформации.Ссылка) - |ГДЕ - | ВидыКонтактнойИнформации.ИмяПредопределенногоВида = &ИмяПредопределенногоВида - | И ВидыКонтактнойИнформации.ЭтоГруппа = ИСТИНА - | И ВидыКонтактнойИнформацииПодчиненный.Тип = &Тип"; - - Запрос.УстановитьПараметр("ИмяПредопределенногоВида", ИмяГруппыКонтактнойИнформации); - Запрос.УстановитьПараметр("Тип", ТипКонтактнойИнформации); - - РезультатЗапроса = Запрос.Выполнить().Выбрать(); - Если РезультатЗапроса.Следующий() Тогда - КонтактнаяИнформацияОбъекта = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(Ссылка, - РезультатЗапроса.Ссылка, Дата, Ложь); - Если КонтактнаяИнформацияОбъекта.Количество() > 0 Тогда - Результат = КонтактнаяИнформацияОбъекта[0].Представление; - КонецЕсли; - КонецЕсли; - КонецЕсли; - КонецЦикла; - Возврат Результат; - -КонецФункции - Функция ПроверитьАдрес(Адрес, ПараметрыПроверкиАдреса = Неопределено) Экспорт РезультатПроверки = РезультатПроверки(); @@ -136,10 +72,10 @@ | И (ТаблицаКонтактнаяИнформация.АдресЭП <> """") |ГДЕ | НЕ СправочникКонтакт.ПометкаУдаления - | И (СправочникКонтакт.Наименование ПОДОБНО &ВведеннаяСтрока - | ИЛИ ТаблицаКонтактнаяИнформация.АдресЭП ПОДОБНО &ВведеннаяСтрока - | ИЛИ ТаблицаКонтактнаяИнформация.ДоменноеИмяСервера ПОДОБНО &ВведеннаяСтрока - | ИЛИ ТаблицаКонтактнаяИнформация.Представление ПОДОБНО &ВведеннаяСтрока)"; + | И (СправочникКонтакт.Наименование ПОДОБНО &ВведеннаяСтрока СПЕЦСИМВОЛ ""~"" + | ИЛИ ТаблицаКонтактнаяИнформация.АдресЭП ПОДОБНО &ВведеннаяСтрока СПЕЦСИМВОЛ ""~"" + | ИЛИ ТаблицаКонтактнаяИнформация.ДоменноеИмяСервера ПОДОБНО &ВведеннаяСтрока СПЕЦСИМВОЛ ""~"" + | ИЛИ ТаблицаКонтактнаяИнформация.Представление ПОДОБНО &ВведеннаяСтрока СПЕЦСИМВОЛ ""~"")"; Для каждого ОписаниеКонтакта Из ОписанияКонтактов Цикл @@ -162,7 +98,10 @@ КонецЕсли; КонецЕсли; Если ПолеСтроковогоТипа Тогда - УсловиеПолейВводаПоСтроке = УсловиеПолейВводаПоСтроке + " ИЛИ СправочникКонтакт." + Поле.Имя + " ПОДОБНО &ВведеннаяСтрока"; + УсловиеПолейВводаПоСтроке = УсловиеПолейВводаПоСтроке + " " + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + "ИЛИ СправочникКонтакт.%1 ПОДОБНО &ВведеннаяСтрока СПЕЦСИМВОЛ ""~""", + Поле.Имя); КонецЕсли; КонецЦикла; @@ -171,7 +110,7 @@ |"; ТекстЗапроса = ТекстЗапроса + " - |ВЫБРАТЬ ПЕРВЫЕ 20 + |ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 20 | СправочникКонтакт.Ссылка КАК Контакт, | &ПолеНаименование КАК Наименование, | &ПолеНаименованиеВладельца КАК НаименованиеВладельца, @@ -180,25 +119,29 @@ | &ТаблицаСправочник КАК СправочникКонтакт | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИмяТаблицаКонтактнаяИнформация КАК ТаблицаКонтактнаяИнформация | ПО (ТаблицаКонтактнаяИнформация.Ссылка = СправочникКонтакт.Ссылка) - | И (ТаблицаКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты) И (ТаблицаКонтактнаяИнформация.АдресЭП <> """")) + | И (ТаблицаКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты) + | И (ТаблицаКонтактнаяИнформация.АдресЭП <> """")) |ГДЕ | НЕ СправочникКонтакт.ПометкаУдаления - | И (ТаблицаКонтактнаяИнформация.АдресЭП ПОДОБНО &ВведеннаяСтрока - | ИЛИ ТаблицаКонтактнаяИнформация.ДоменноеИмяСервера ПОДОБНО &ВведеннаяСтрока - | ИЛИ ТаблицаКонтактнаяИнформация.Представление ПОДОБНО &ВведеннаяСтрока + | И (ТаблицаКонтактнаяИнформация.АдресЭП ПОДОБНО &ВведеннаяСтрока СПЕЦСИМВОЛ ""~"" + | ИЛИ ТаблицаКонтактнаяИнформация.ДоменноеИмяСервера ПОДОБНО &ВведеннаяСтрока СПЕЦСИМВОЛ ""~"" + | ИЛИ ТаблицаКонтактнаяИнформация.Представление ПОДОБНО &ВведеннаяСтрока СПЕЦСИМВОЛ ""~"" | И &УсловиеПолейВводаПоСтроке) |"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеНаименованиеВладельца" , ?(ОписаниеКонтакта.ЕстьВладелец, "ПРЕДСТАВЛЕНИЕ(СправочникКонтакт.Владелец)", """""")); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеНаименование" , "СправочникКонтакт." + ОписаниеКонтакта.ИмяРеквизитаПредставлениеКонтакта); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеНаименованиеВладельца" , ?(ОписаниеКонтакта.ЕстьВладелец, + "ПРЕДСТАВЛЕНИЕ(СправочникКонтакт.Владелец)", """""")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеНаименование" , "СправочникКонтакт." + + ОписаниеКонтакта.ИмяРеквизитаПредставлениеКонтакта); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСправочник" ,"Справочник." + ОписаниеКонтакта.Имя); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИмяТаблицаКонтактнаяИнформация" ,"Справочник." + ОписаниеКонтакта.Имя + ".КонтактнаяИнформация"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИмяТаблицаКонтактнаяИнформация" ,"Справочник." + + ОписаниеКонтакта.Имя + ".КонтактнаяИнформация"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеПолейВводаПоСтроке" , УсловиеПолейВводаПоСтроке); КонецЦикла; Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("ВведеннаяСтрока", "%" + СтрокаПоиска + "%"); + Запрос.УстановитьПараметр("ВведеннаяСтрока", "%" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(СтрокаПоиска) + "%"); Возврат Запрос.Выполнить().Выгрузить(); КонецФункции @@ -291,7 +234,7 @@ Обработчик.НачальноеЗаполнение = Истина; Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "3.1.3.69"; + Обработчик.Версия = "3.1.8.270"; Обработчик.Идентификатор = Новый УникальныйИдентификатор("22f43dca-ac4f-3289-81a9-e110cd56f8b2"); Обработчик.Процедура = "Справочники.ВидыКонтактнойИнформации.ОбработатьДанныеДляПереходаНаНовуюВерсию"; Обработчик.РежимВыполнения = "Отложенно"; @@ -399,6 +342,11 @@ СоответствиеИменПсевдонимам.Вставить("УправлениеКонтактнойИнформациейСлужебный.ИсправлениеУстаревшихАдресов"); КонецПроцедуры +// См. МультиязычностьСервер.ОбъектыСТЧПредставления +Процедура ПриОпределенииОбъектовСТабличнойЧастьюПредставление(Объекты) Экспорт + Объекты.Добавить("Справочник.ВидыКонтактнойИнформации"); +КонецПроцедуры + Функция ВидыКонтактнойИнформацииОбновляются(Очередь) Экспорт Возврат ОбновлениеИнформационнойБазы.ЕстьЗаблокированныеПредыдущимиОчередямиДанные(Очередь, "Справочник.ВидыКонтактнойИнформации"); КонецФункции @@ -543,6 +491,10 @@ Процедура ФорматированиеРезультатовАвтоподбора(ДанныеВыбора, Знач Текст, ВыделятьУстаревшиеАдреса = Истина) Экспорт + Если Не УправлениеКонтактнойИнформациейСлужебныйПовтИсп.ДоступныМодулиРаботаСАдресами() Тогда + Возврат; + КонецЕсли; + МодульРаботаСАдресамиКлиентСервер = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресамиКлиентСервер"); // Оформление списка поиска @@ -553,7 +505,7 @@ Если ТипЗнч(СтрокаДанных.Значение) = Тип("Структура") И СтрокаДанных.Значение.Свойство("Адрес") Тогда - Если ТипЗнч(СтрокаДанных.Значение.Адрес) = Тип("Строка") И ЗначениеЗаполнено(СтрокаДанных.Значение.Адрес) Тогда + Если ЗначениеЗаполнено(СтрокаДанных.Значение.Адрес) И ТипЗнч(СтрокаДанных.Значение.Адрес) = Тип("Строка") Тогда Адрес = JSONВКонтактнуюИнформациюПоПолям(СтрокаДанных.Значение.Адрес, Перечисления.ТипыКонтактнойИнформации.Адрес); СтрокаДанных.Значение.Представление = МодульРаботаСАдресамиКлиентСервер.ПредставлениеАдреса(Адрес, Ложь); КонецЕсли; @@ -565,23 +517,13 @@ КонецЕсли; Представление = СтрокаДанных.Представление; - Для каждого ФрагментТекстаПоиска Из ФрагментыТекстаПоиска Цикл - Позиция = СтрНайти(ВРег(Представление), ВРег(ФрагментТекстаПоиска)); - Если Позиция > 0 Тогда - Представление = Лев(Представление, Позиция - 1) + Символы.ПС + Символы.ВТаб + Сред(Представление, Позиция, СтрДлина(ФрагментТекстаПоиска)) - + Символы.ПС + Сред(Представление, Позиция + СтрДлина(ФрагментТекстаПоиска)); + ПредставлениеСВыделением = СтрНайтиИВыделитьОформлением(Представление, ФрагментТекстаПоиска); + Если ПредставлениеСВыделением <> Неопределено Тогда + Представление = ПредставлениеСВыделением; КонецЕсли; КонецЦикла; - Набор = СтрРазделить(Представление, Символы.ПС); - Для Счетчик = 0 По Набор.Количество() - 1 Цикл - Если СтрНачинаетсяС(Набор[Счетчик], Символы.ВТаб) Тогда - Набор[Счетчик] = Новый ФорматированнаяСтрока(СокрЛП(Набор[Счетчик]), ШрифтыСтиля.ВажнаяНадписьШрифт, ЦветаСтиля.РезультатУспехЦвет); - ИначеЕсли УстаревшийАдрес Тогда - Набор[Счетчик] = Новый ФорматированнаяСтрока(Набор[Счетчик],, ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); - КонецЕсли; - КонецЦикла; - СтрокаДанных.Представление = Новый ФорматированнаяСтрока(Набор); + СтрокаДанных.Представление = Представление; КонецЦикла; @@ -702,7 +644,7 @@ ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Продолжить; КонецПопытки; @@ -775,6 +717,7 @@ ПоследнийПроблемныйОбъект = ПроблемныеОбъекты.Получить(ПроблемныеОбъекты.Количество() - 1).ПроблемныйОбъект; ВсегоОбъектов = ВсегоОбъектов + ПроблемныеОбъекты.Количество(); + // @skip-check query-in-loop - Порционная обработка больших объемов данных. ИсправленоОбъектов = ИсправленоОбъектов + ИсправитьПорциюВидовКонтактнойИнформации(ПроблемныеОбъекты, Проверка); ПроблемныеОбъекты = МодульКонтрольВеденияУчета.ПроблемныеОбъекты(Проверка, ПоследнийПроблемныйОбъект); @@ -908,10 +851,10 @@ ОтменитьТранзакцию(); Инфо = ИнформацияОбОшибке(); ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка записи страны мира %1 (код %2) при обновлении классификатора, %3'"), - Выборка.Код, Выборка.Наименование, КраткоеПредставлениеОшибки(Инфо)); + Выборка.Код, Выборка.Наименование, ОбработкаОшибок.КраткоеПредставлениеОшибки(Инфо)); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, - ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(Инфо)); + ТекстОшибки + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(Инфо)); ВсеОшибки = ВсеОшибки + Символы.ПС + ТекстОшибки; КонецПопытки; @@ -1179,9 +1122,9 @@ Иначе - КонтактнойИнформации = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеНовойКонтактнойИнформации(ОжидаемыйТип); - КонтактнойИнформации.Value = Представление; - Возврат КонтактнойИнформации; + КонтактнаяИнформация = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеНовойКонтактнойИнформации(ОжидаемыйТип); + КонтактнаяИнформация.Value = Представление; + Возврат КонтактнаяИнформация; КонецЕсли; @@ -1314,16 +1257,16 @@ СписокЗаполненныхУровней = Новый Массив; - Если ВключатьСтрануВПредставление И Адрес.Свойство("Country") И НЕ ПустаяСтрока(Адрес.Country) Тогда + Если ВключатьСтрануВПредставление И Адрес.Свойство("country") И НЕ ПустаяСтрока(Адрес.Country) Тогда СписокЗаполненныхУровней.Добавить(Адрес.Country); КонецЕсли; - Если Адрес.Свойство("ZipCode") И НЕ ПустаяСтрока(Адрес.ZipCode) Тогда + Если Адрес.Свойство("zipCode") И НЕ ПустаяСтрока(Адрес.ZipCode) Тогда СписокЗаполненныхУровней.Добавить(Адрес.ZipCode); КонецЕсли; - СписокЗаполненныхУровней.Добавить(СокрЛП(Адрес["Area"] + " " + Адрес["AreaType"])); - СписокЗаполненныхУровней.Добавить(СокрЛП(Адрес["City"] + " " + Адрес["CityType"])); + СписокЗаполненныхУровней.Добавить(СокрЛП(Адрес["area"] + " " + Адрес["areaType"])); + СписокЗаполненныхУровней.Добавить(СокрЛП(Адрес["city"] + " " + Адрес["cityType"])); Адрес.Value = СтрСоединить(СписокЗаполненныхУровней, ", "); @@ -1359,8 +1302,8 @@ Функция ЧастиАдресаТаблицей(Знач Текст) ТипыАдресныхОбъектов = ТипыАдресныхОбъектов(); - Результат = ЧастиАдреса(); - КодРегиона = Неопределено; + Результат = ЧастиАдреса(); + КодРегиона = Неопределено; Номер = 1; Для Каждого Часть Из СловаТекстаТаблицей(Текст, "," + Символы.ПС) Цикл @@ -1415,10 +1358,11 @@ Если КодРегиона = Неопределено И ЗначениеЗаполнено(Значение) Тогда КодРегиона = МодульАдресныйКлассификатор.КодРегионаПоНаименованию(Значение); КонецЕсли; - + + Если КодРегиона <> Неопределено Тогда Строка.Значение = МодульАдресныйКлассификатор.НаименованиеРегионаПоКоду(КодРегиона); - Строка.Уровень = 1; + Строка.Уровень = 1; КонецЕсли; КонецЕсли; // Конец Локализация @@ -1428,12 +1372,12 @@ КонецЕсли; ЧастиАдресногоОбъекта = СтрРазделить(Значение, " " + Символы.ПС + Символы.Таб); - + Строка.ТипОбъекта = ЧастиАдресногоОбъекта[0]; ЧастиАдресногоОбъекта.Удалить(0); Строка.Наименование = СокрЛП(СтрСоединить(ЧастиАдресногоОбъекта, " ")); Строка.Значение = УправлениеКонтактнойИнформациейКлиентСервер.СоединитьНаименованиеИТипАдресногоОбъекта(Строка.Наименование, Строка.ТипОбъекта); - + КонецЦикла; Возврат Результат; @@ -1444,8 +1388,8 @@ // ТаблицаЗначений: // * Сокращение - Строка // * Длина - Число -// * ТипОбъектаВНачале - Строка -// * ТипОбъектаВКонце - Строка +// * СокращениеВНачале - Строка +// * СокращениеВКонце - Строка // Функция ТипыАдресныхОбъектов() @@ -1975,7 +1919,7 @@ | КонтактнаяИнформация.Представление ИТОГИ ПО Вид"; Запрос.УстановитьПараметр("КонтактнаяИнформация", КонтактнаяИнформация); - РезультатЗапроса = Запрос.Выполнить(); + РезультатЗапроса = Запрос.Выполнить(); // @skip-check query-in-loop - Запросы к разным таблицам. ВыборкаВид = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаВид.Следующий() Цикл @@ -3056,6 +3000,7 @@ Если ПустаяСтрока(ПроверяемоеЗначение) Тогда ЭлементСтруктуры.Значение.Удалить(Индекс); КонецЕсли; + Индекс = Индекс - 1; КонецЦикла; @@ -3116,6 +3061,13 @@ Результат = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеНовойКонтактнойИнформации(ТипКонтактнойИнформации); КонецЕсли; + Если КонтактнаяИнформация.Свойство("area") И УправлениеКонтактнойИнформациейСлужебныйПовтИсп.ДоступныМодулиРаботаСАдресами() Тогда + + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); + МодульРаботаСАдресами.УстановкаТипаОбластьКемеровскойОбласти(КонтактнаяИнформация); + + КонецЕсли; + ЗаполнитьЗначенияСвойств(Результат, КонтактнаяИнформация); Возврат Результат; @@ -3181,4 +3133,50 @@ КонецФункции +Функция НомерТелефонаСоответствуетМаске(НомерТелефона, Маска) Экспорт + + КоличествоСимволов = СтрДлина(НомерТелефона); + + Если КоличествоСимволов <> СтрДлина(Маска) Тогда + Возврат Ложь; + КонецЕсли; + + ПроверяемыеСимволыМаски = ПроверяемыеСимволыМаски(); + + Для НомерСимвола = 1 По КоличествоСимволов Цикл + СимволМаски = Сред(Маска, НомерСимвола, 1); + СимволНомераТелефона = Сред(НомерТелефона, НомерСимвола, 1); + Если СимволМаски = "9" Тогда + Если НЕ СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(СимволНомераТелефона,,Ложь) Тогда + Возврат Ложь; + Иначе + Продолжить; + КонецЕсли; + КонецЕсли; + + Если ПроверяемыеСимволыМаски.Получить(СимволМаски) = Неопределено И СимволМаски <> СимволНомераТелефона Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +Функция ПроверяемыеСимволыМаски() + + СимволыМаски = Новый Соответствие; + + СимволыМаски.Вставить( "!", Истина); + СимволыМаски.Вставить( "#", Истина); + СимволыМаски.Вставить( "N", Истина); + СимволыМаски.Вставить( "U", Истина); + СимволыМаски.Вставить( "X", Истина); + СимволыМаски.Вставить( "h", Истина); + СимволыМаски.Вставить( "@", Истина); + + Возврат СимволыМаски; + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйПовтИсп/Module.bsl index b7c19eed3..77dd58bff 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйПовтИсп/Module.bsl @@ -140,4 +140,67 @@ КонецФункции +Функция КартинкиТиповКонтактнойИнформации() Экспорт + + КартинкиТиповКонтактнойИнформации = Новый Соответствие; + + КартинкиТиповКонтактнойИнформации.Вставить(Перечисления.ТипыКонтактнойИнформации.Skype, БиблиотекаКартинок.Skype); + КартинкиТиповКонтактнойИнформации.Вставить(Перечисления.ТипыКонтактнойИнформации.Адрес, БиблиотекаКартинок.Адрес); + КартинкиТиповКонтактнойИнформации.Вставить(Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты, БиблиотекаКартинок.ЭлектроннаяПочта); + КартинкиТиповКонтактнойИнформации.Вставить(Перечисления.ТипыКонтактнойИнформации.ВебСтраница, БиблиотекаКартинок.ВебСтраница); + КартинкиТиповКонтактнойИнформации.Вставить(Перечисления.ТипыКонтактнойИнформации.Другое, БиблиотекаКартинок.Другое); + КартинкиТиповКонтактнойИнформации.Вставить(Перечисления.ТипыКонтактнойИнформации.Телефон, БиблиотекаКартинок.ТелефонныйЗвонок); + КартинкиТиповКонтактнойИнформации.Вставить(Перечисления.ТипыКонтактнойИнформации.Факс, БиблиотекаКартинок.Факс); + + Возврат Новый ФиксированноеСоответствие(КартинкиТиповКонтактнойИнформации); + +КонецФункции + +// См. УправлениеКонтактнойИнформацией.КомандыТипаКонтактнойИнформации +Функция КомандыТипаКонтактнойИнформации(Тип) Экспорт + + КомандыТипа = Новый Структура; + + Если Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда + + КомандыТипа.Вставить("ВвестиКомментарийКАдресу", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ВвестиКомментарийКАдресу")); + КомандыТипа.Вставить("ПоказатьНаКартеЯндекс", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ПоказатьНаКартеЯндекс")); + КомандыТипа.Вставить("ПоказатьНаКартеGoogle", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ПоказатьНаКартеGoogle")); + КомандыТипа.Вставить("ЗапланироватьВстречу", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ЗапланироватьВстречу")); + КомандыТипа.Вставить("ПоказатьИсториюИзменений", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ПоказатьИсториюИзменений")); + + ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда + + КомандыТипа.Вставить("ПозвонитьПоТелефону", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ПозвонитьПоТелефону")); + КомандыТипа.Вставить("ОтправитьSMS", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ОтправитьSMS")); + КомандыТипа.Вставить("ПоказатьИсториюИзменений", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ПоказатьИсториюИзменений")); + + ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Факс Тогда + + КомандыТипа.Вставить("ОтправитьФакс", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ОтправитьФакс")); + КомандыТипа.Вставить("ПоказатьИсториюИзменений", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ПоказатьИсториюИзменений")); + + ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда + + КомандыТипа.Вставить("НаписатьЭлектронноеПисьмо", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("НаписатьЭлектронноеПисьмо")); + + ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Skype Тогда + + КомандыТипа.Вставить("ПозвонитьSkype", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ПозвонитьSkype")); + КомандыТипа.Вставить("НачатьЧатSkype", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("НачатьЧатSkype")); + + ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда + + КомандыТипа.Вставить("ОткрытьВебСтраницу", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ОткрытьВебСтраницу")); + + ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Другое Тогда + + КомандыТипа.Вставить("ОткрытьОкноДругое", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ОткрытьОкноДругое")); + + КонецЕсли; + + Возврат КомандыТипа; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеПечатью/Module.bsl b/SSL/src/CommonModules/УправлениеПечатью/Module.bsl index 0df155afa..7dab7d5d7 100644 --- a/SSL/src/CommonModules/УправлениеПечатью/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатью/Module.bsl @@ -165,7 +165,7 @@ ВызватьИсключение ТекстСообщения; Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Печать'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Возврат; КонецЕсли; @@ -284,32 +284,7 @@ ЗаполнитьКомандыПечатиДляСпискаОбъектов(ОбъектМетаданных.РегистрируемыеДокументы, КомандыПечати); КонецЕсли; Иначе - МенеджерПечати = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()); - ДобавляемыеКомандыПечати = СоздатьКоллекциюКомандПечати(); - МенеджерПечати.ДобавитьКомандыПечати(ДобавляемыеКомандыПечати); - ДобавитьКомандыПечати(ДобавляемыеКомандыПечати, ОбъектМетаданных); - - Для Каждого КомандаПечати Из ДобавляемыеКомандыПечати Цикл - Если КомандаПечати.МенеджерПечати = Неопределено Тогда - КомандаПечати.МенеджерПечати = ОбъектМетаданных.ПолноеИмя(); - КонецЕсли; - ЗаполнитьЗначенияСвойств(КомандыПечати.Добавить(), КомандаПечати); - КонецЦикла; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - МодульДополнительныеОтчетыИОбработки.ПриПолученииКомандПечати(КомандыПечати, ОбъектМетаданных.ПолноеИмя()); - КонецЕсли; - - ПодключенныеОтчетыИОбработки = ПодключаемыеКоманды.ПодключенныеОбъекты(СсылкаОМ); - Найденные = ПодключенныеОтчетыИОбработки.НайтиСтроки(Новый Структура("ДобавитьКомандыПечати", Истина)); - Для Каждого ПодключенныйОбъект Из Найденные Цикл - ПодключенныйОбъект.Менеджер.ДобавитьКомандыПечати(КомандыПечати); - ДобавленныеКоманды = КомандыПечати.НайтиСтроки(Новый Структура("МенеджерПечати", Неопределено)); - Для Каждого Команда Из ДобавленныеКоманды Цикл - Команда.МенеджерПечати = ПодключенныйОбъект.ПолноеИмя; - КонецЦикла; - КонецЦикла; + КомандыПечати = КомандыПечатиОбъекта(ОбъектМетаданных); КонецЕсли; КонецЕсли; КонецЕсли; @@ -534,7 +509,7 @@ Результат.Колонки.Добавить("УсловияВидимости", Новый ОписаниеТипов("Массив")); // проверка проведения - Результат.Колонки.Добавить("ПроверкаПроведенияПередПечатью", Новый ОписаниеТипов("Булево")); + Результат.Колонки.Добавить("ПроверкаПроведенияПередПечатью"); // вывод Результат.Колонки.Добавить("СразуНаПринтер", Новый ОписаниеТипов("Булево")); @@ -811,11 +786,11 @@ | РегистрСведений.ПользовательскиеМакетыПечати КАК ПользовательскиеМакетыПечати |ГДЕ | ПользовательскиеМакетыПечати.Объект = &Объект - | И ПользовательскиеМакетыПечати.ИмяМакета ПОДОБНО &ИмяМакета"; + | И ПользовательскиеМакетыПечати.ИмяМакета ПОДОБНО &ИмяМакета СПЕЦСИМВОЛ ""~"""; Запрос = Новый Запрос(ТекстЗапроса); Запрос.Параметры.Вставить("Объект", ИмяОбъекта); - Запрос.Параметры.Вставить("ИмяМакета", ИмяМакета + "%"); + Запрос.Параметры.Вставить("ИмяМакета", ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(ИмяМакета) + "%"); Выборка = Запрос.Выполнить().Выбрать(); @@ -870,7 +845,7 @@ | РегистрСведений.ОбщиеПоставляемыеМакетыПечати КАК ПоставляемыеМакетыПечати |ГДЕ | ПоставляемыеМакетыПечати.Объект = &Объект - | И ПоставляемыеМакетыПечати.ИмяМакета ПОДОБНО &ИмяМакета + | И ПоставляемыеМакетыПечати.ИмяМакета ПОДОБНО &ИмяМакета СПЕЦСИМВОЛ ""~"" | И ПоставляемыеМакетыПечати.ВерсияМакета = &ВерсияМакета | |ОБЪЕДИНИТЬ ВСЕ @@ -883,13 +858,13 @@ | РегистрСведений.ПоставляемыеМакетыПечати КАК ПоставляемыеМакетыПечати |ГДЕ | ПоставляемыеМакетыПечати.Объект = &Объект - | И ПоставляемыеМакетыПечати.ИмяМакета ПОДОБНО &ИмяМакета + | И ПоставляемыеМакетыПечати.ИмяМакета ПОДОБНО &ИмяМакета СПЕЦСИМВОЛ ""~"" | И ПоставляемыеМакетыПечати.ВерсияМакета = &ВерсияМакета"; Запрос = Новый Запрос(ТекстЗапроса); Запрос.Параметры.Вставить("Объект", ОбъектМетаданных); - Запрос.Параметры.Вставить("ИмяМакета", ИмяМакета + "%"); + Запрос.Параметры.Вставить("ИмяМакета", ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(ИмяМакета) + "%"); Запрос.Параметры.Вставить("ВерсияМакета", Метаданные.Версия); Выборка = Запрос.Выполнить().Выбрать(); @@ -1078,6 +1053,54 @@ КонецФункции +// Определяет тип параметра Настройки в процедурах ПриОпределенииНастроекПечати модулей менеджеров объектов. +// Возвращает настройки печати объекта, подключенного к подсистеме печати. +// +// Параметры: +// МенеджерОбъекта - СправочникМенеджер, ДокументМенеджер, ОбработкаМенеджер, РегистрСведенийМенеджер - менеджер объекта. +// +// Возвращаемое значение: +// Структура: +// * ПриОпределенииПолучателей - Булево - при установке значения Истина будет вызвана процедура модуля менеджера +// объекта ПриОпределенииПолучателей, +// где определяются получатели для отправки печатной формы. +// * ПриДобавленииКомандПечати - Булево, Неопределено - при установке значения Истина будет вызвана процедура модуля +// менеджера объекта ДобавитьКомандыПечати, +// где добавляются команды печати. Неопределено - объект не подключен к подсистеме печати. +// +Функция НастройкиПечатиОбъекта(МенеджерОбъекта) Экспорт + + НастройкиОбъекта = Новый Структура; + НастройкиОбъекта.Вставить("ПриОпределенииПолучателей", Ложь); + НастройкиОбъекта.Вставить("ПриДобавленииКомандПечати", Ложь); + + НастройкиПечати = НастройкиПечати(); + + Если НастройкиПечати.ОбъектыПечати.Найти(МенеджерОбъекта) <> Неопределено Тогда + МенеджерОбъекта.ПриОпределенииНастроекПечати(НастройкиОбъекта); + Возврат НастройкиОбъекта; + КонецЕсли; + + // Поддержка обратной совместимости + + ОбъектыСКомандамиПечати = Новый Массив; + + СписокОбъектов = Новый Массив; + ИнтеграцияПодсистемБСП.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов); // АПК:222 Вызов устаревшей процедуры для обратной совместимости. + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ОбъектыСКомандамиПечати, СписокОбъектов, Истина); + + СписокОбъектов = Новый Массив; + УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов); // АПК:222 Вызов устаревшей процедуры для обратной совместимости. + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ОбъектыСКомандамиПечати, СписокОбъектов, Истина); + + Если ОбъектыСКомандамиПечати.Найти(МенеджерОбъекта) <> Неопределено Тогда + НастройкиОбъекта.ПриДобавленииКомандПечати = Истина; + КонецЕсли; + + Возврат НастройкиОбъекта; + +КонецФункции + #Область РаботаСМакетамиОфисныхДокументов //////////////////////////////////////////////////////////////////////////////// @@ -1170,6 +1193,7 @@ КонецФункции + // Удаляет временные файлы, образовавшиеся после раскрытия xml-структуры макета. // Необходимо вызывать каждый раз после завершения формирования макета и печатной формы, // а также в случае аварийного завершения формирования. @@ -1290,9 +1314,10 @@ ПечатнаяФорма.ПоследняяВыведеннаяОбласть = ОписаниеОбласти; Исключение - СообщениеОбОшибке = СокрЛП(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + СообщениеОбОшибке = СокрЛП(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); СообщениеОбОшибке = ?(Прав(СообщениеОбОшибке, 1) = ".", СообщениеОбОшибке, СообщениеОбОшибке + "."); - СообщениеОбОшибке = СообщениеОбОшибке + " " + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при попытке вывести область ""%1"" из макета.'"), + СообщениеОбОшибке = СообщениеОбОшибке + " " + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при попытке вывести область ""%1"" из макета.'"), ОбластьМакета.ОписаниеОбласти.ИмяОбласти); ВызватьИсключение СообщениеОбОшибке; КонецПопытки; @@ -1380,6 +1405,7 @@ КонецПроцедуры + #КонецОбласти #Область УстаревшиеПроцедурыИФункции @@ -1534,7 +1560,7 @@ ДвоичныеДанныеКартинки = ГенераторQRКода.GenerateQRCode(QRСтрока, УровеньКоррекции, Размер); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Формирование QR-кода'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Возврат ДвоичныеДанныеКартинки; @@ -1547,6 +1573,179 @@ #Область СлужебныйПрограммныйИнтерфейс +#Область РаботаСМакетамиОфисныхДокументовССКД + + +// Подготавливает макет офисного документа для использования в процедурах формирования печатной формы. +// +// Параметры: +// ДвоичныеДанныеМакета - ДвоичныеДанные - двоичные данные макета +// +// Возвращаемое значение: +// см. УправлениеПечатьюСлужебный.МакетИзДвоичныхДанныхСКД +// +Функция ИнициализироватьМакетОфисногоДокументаСКД(ДвоичныеДанныеМакета) Экспорт + + ДеревоМакета = УправлениеПечатьюСлужебный.МакетИзДвоичныхДанныхСКД(ДвоичныеДанныеМакета); + СтруктураДокумента = ДеревоМакета.СтруктураДокумента; + + УзелНачалаТекста = УправлениеПечатьюСлужебный.ПолучитьУзел(СтруктураДокумента.ДеревоДокумента, "w:document/w:body"); + СобратьСтроки(УзелНачалаТекста); + УправлениеПечатьюСлужебный.ВосстановитьПолныйТекст(СтруктураДокумента.ДеревоДокумента, СтруктураДокумента.Гиперссылки); + + Возврат ДеревоМакета; + +КонецФункции + +// Размещает штампы в переданном офисный документ. +// +// Параметры: +// АдресДокумента - Строка - адрес документа во временном хранилище +// ЭлектронныеПодписи - см. ЭлектроннаяПодпись.УстановленныеПодписи +// +Процедура ДобавитьШтампыВОфисныйДокумент(АдресДокумента, ЭлектронныеПодписи) Экспорт + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресДокумента); + ДеревоМакета = ИнициализироватьМакетОфисногоДокументаСКД(ДвоичныеДанные); + СтруктураДокумента = ДеревоМакета.СтруктураДокумента; + + МакетШтампа = ПолучитьОбщийМакет("МакетШтемпеляЭЦПOfficeOpen"); + ТекстМакетаШтампа = МакетШтампа.ПолучитьТекст(); + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.ИгнорироватьПробелы = Истина; + ЧтениеXML.УстановитьСтроку(ТекстМакетаШтампа); + + ДеревоМакетаШтампа = УправлениеПечатьюСлужебный.ПрочитатьXMLВДерево(ЧтениеXML); + УдалитьНезначащиеАтрибуты(ДеревоМакетаШтампа); + + УзелДокумента = ДеревоМакетаШтампа.Строки[0]; + УзелШтампа = УзелДокумента.Строки[0]; + + МассивЗакладок = Новый Массив; + ПараметрыПоискаУзлов = УправлениеПечатьюСлужебный.ПараметрыПоискаУзлов(); + ПараметрыПоискаУзлов.ИмяАтрибута = "w:name"; + ПараметрыПоискаУзлов.ЗначенияАтрибута = "V8DSStamp"; + УправлениеПечатьюСлужебный.НайтиУзлыПоСодержимому(СтруктураДокумента.ДеревоДокумента, "w:bookmarkStart", МассивЗакладок, ПараметрыПоискаУзлов); + + Если Не МассивЗакладок.Количество() Тогда + Возврат; + КонецЕсли; + + УзелЗакладкиШтампа = МассивЗакладок[МассивЗакладок.ВГраница()]; + РодительУзлаШтампа = УзелЗакладкиШтампа; + + УправлениеПечатьюСлужебный.ПеренестиПараметрыФорматирования(УзелШтампа, УзелЗакладкиШтампа); + + ИндексРазмещения = Неопределено; + УправлениеПечатьюСлужебный.НайтиУзелРазмещенияШтампа(РодительУзлаШтампа, ИндексРазмещения); + + + ЗначенияДляЗаполнения = Новый Соответствие; + ЗначенияДляЗаполнения.Вставить("[Заголовок]", НСтр("ru = 'ДОКУМЕНТ ПОДПИСАН ЭЛЕКТРОННОЙ ПОДПИСЬЮ'")); + ЗначенияДляЗаполнения.Вставить("[ЗаголовокСертификат]", "Сертификат"); + ЗначенияДляЗаполнения.Вставить("[ЗаголовокВладелец]", "Владелец"); + ЗначенияДляЗаполнения.Вставить("[ЗаголовокПериодДействия]", "Действителен"); + + Для Каждого Подпись Из ЭлектронныеПодписи Цикл + Сертификат = Подпись.Сертификат; + СертификатКриптографии = Новый СертификатКриптографии(Сертификат.Получить()); + + ЗначенияДляЗаполнения.Вставить("[Владелец]", Подпись.КомуВыданСертификат); + ЗначенияДляЗаполнения.Вставить("[Сертификат]", СертификатКриптографии.СерийныйНомер); + + ПериодДействия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'с %1 по %2'"), + Формат(СертификатКриптографии.ДатаНачала, "ДЛФ=D"), + Формат(СертификатКриптографии.ДатаОкончания, "ДЛФ=D")); + + ЗначенияДляЗаполнения.Вставить("[ПериодДействия]", ПериодДействия); + + ИндексРазмещения = ИндексРазмещения + 1; + УзелРазмещенияШтампа = УправлениеПечатьюСлужебный.СкопироватьУзел(РодительУзлаШтампа, ИндексРазмещения, УзелШтампа); + УправлениеПечатьюСлужебный.СоздатьПоследующие(УзелРазмещенияШтампа, УзелШтампа); + УстановитьПараметрыВДереве(ЗначенияДляЗаполнения, УзелРазмещенияШтампа, ДеревоМакета); + КонецЦикла; + ПутьКДокументу = УправлениеПечатьюСлужебный.СобратьФайлОфисногоДокумента(ДеревоМакета); + ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКДокументу); + УдалитьФайлы(ПутьКДокументу); + УдалитьФайлы(ДеревоМакета.ИмяКаталога); + ПоместитьВоВременноеХранилище(ДвоичныеДанные, АдресДокумента); +КонецПроцедуры + +// Преобразует параметры Office Open XML, в текст в квадратных скобках. +// +// Параметры: +// Дерево - см. УправлениеПечатьюСлужебный.ПрочитатьXMLВДерево +// +Процедура КонвертироватьПараметры(Дерево) Экспорт + + УправлениеПечатьюСлужебный.КонвертироватьПараметры(Дерево); + +КонецПроцедуры + + +// Удаляет из дерева значений не используемые атрибуты. +// +// Параметры: +// Дерево - см. УправлениеПечатьюСлужебный.ПрочитатьXMLВДерево +// +Процедура УдалитьНезначащиеАтрибуты(Дерево) Экспорт + + НезначащиеАтрибуты = СтрРазделить("w:rsidR,w:rsidRPr,w:rsidRDefault,w:rsidP,w:rsidTr", ","); + УправлениеПечатьюСлужебный.УдалитьНезначащиеАтрибуты(Дерево, НезначащиеАтрибуты); + +КонецПроцедуры + +// Параметры заполнения области. +// +// Возвращаемое значение: +// Структура - параметры заполнения области: +// * СобратьСтроки - Булево - собрать разбитые строки условий +// * СтруктураОбласти - см. УправлениеПечатьюСлужебный.ПрочитатьXMLВДерево +// * ЗаполнятьКолонтитулы - Булево +// * ДобавлятьСвязи - Булево - добавлять связи контента +// +Функция ПараметрыЗаполненияОбласти() Экспорт + СтруктураПараметров = Новый Структура; + СтруктураПараметров.Вставить("СобратьСтроки", Истина); + СтруктураПараметров.Вставить("СтруктураОбласти", Неопределено); + СтруктураПараметров.Вставить("ЗаполнятьКолонтитулы", Истина); + СтруктураПараметров.Вставить("ДобавлятьСвязи", Истина); + Возврат СтруктураПараметров; +КонецФункции + +// Установить параметры. +// +// Параметры: +// ДеревоМакета - см. УправлениеПечатьюСлужебный.ПрочитатьXMLВДерево +// СоответствиеЗамен - Соответствие из КлючИЗначение - содержит правила перестановки +// ПараметрыЗаполненияОбласти - см. ПараметрыЗаполненияОбласти +// +Процедура УстановитьПараметры(ДеревоМакета, СоответствиеЗамен, ПараметрыЗаполненияОбласти) Экспорт + + СобратьСтроки = ПараметрыЗаполненияОбласти.СобратьСтроки; + СтруктураОбласти = ПараметрыЗаполненияОбласти.СтруктураОбласти; + ЗаполнятьКолонтитулы = ПараметрыЗаполненияОбласти.ЗаполнятьКолонтитулы; + ДобавлятьСвязи = ПараметрыЗаполненияОбласти.ДобавлятьСвязи; + + СтруктураДокумента = ДеревоМакета.СтруктураДокумента; + ДеревоДокумента = ?(СтруктураОбласти = Неопределено, СтруктураДокумента.ДеревоДокумента, СтруктураОбласти.ДеревоОбласти); + + Если СобратьСтроки Тогда + СобратьСтрокиУсловныхОбластей(ДеревоДокумента, СтруктураДокумента.Гиперссылки); + КонецЕсли; + + Если ЗаполнятьКолонтитулы Тогда + Для Каждого Колонтитул Из СтруктураДокумента.Колонтитулы Цикл + УстановитьПараметрыВДереве(СоответствиеЗамен, Колонтитул.Значение, ДеревоМакета, ДобавлятьСвязи); + КонецЦикла; + КонецЕсли; + + УстановитьПараметрыВДереве(СоответствиеЗамен, ДеревоДокумента, ДеревоМакета, ДобавлятьСвязи); + +КонецПроцедуры + +#КонецОбласти + // Возвращает таблицу возможных форматов для сохранения табличного документа. // // Возвращаемое значение @@ -1642,12 +1841,15 @@ Функция ИсточникиКомандПечати() Экспорт ОбъектыСКомандамиПечати = Новый Массив; + Настройки = НастройкиПечати(); + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ОбъектыСКомандамиПечати, Настройки.ОбъектыПечати, Истина); + СписокОбъектов = Новый Массив; - ИнтеграцияПодсистемБСП.ПриОпределенииОбъектовСКомандамиПечати(ОбъектыСКомандамиПечати); + ИнтеграцияПодсистемБСП.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов); // АПК:222 Вызов устаревшей процедуры для обратной совместимости. ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ОбъектыСКомандамиПечати, СписокОбъектов, Истина); СписокОбъектов = Новый Массив; - УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов); + УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов); // АПК:222 Вызов устаревшей процедуры для обратной совместимости. ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ОбъектыСКомандамиПечати, СписокОбъектов, Истина); Результат = Новый Массив; @@ -1658,12 +1860,33 @@ Возврат Результат; КонецФункции + +// Определяет объекты конфигурации, в модулях менеджеров которых размещена процедура ПриОпределенииНастроекПечати, +// определяющая наличие процедур подсистемы см. УправлениеПечатью.НастройкиПечатиОбъекта. +// +// Параметры: +// Настройки - Структура: +// * ИспользоватьПодписиИПечати - Булево - при установке значения Ложь отключается возможность установки подписей +// и печатей в печатных формах. +// * СкрыватьПодписиИПечатиДляРедактирования - Булево - удалять рисунки подписей и печатей табличных документов при +// снятии флажка "Подписи и печати" в форме "Печать документов", для того, +// чтобы они не мешали редактировать текст, находящийся под ними. +// * ОбъектыПечати - Массив - менеджеры объектов с процедурой ПриОпределенииНастроекПечати +// * ПроверкаПроведенияПередПечатью - Булево - признак необходимости проверки проведенности +// документов перед печатью, является значением по умолчанию для команды печати +// см. УправлениеПечатью.СоздатьКоллекциюКомандПечати. +// Для непроведенных документов команда печати не выполняется. +// Если параметр не указан, то проверка проведенности не выполняется. +// Функция НастройкиПечати() Экспорт Настройки = Новый Структура; Настройки.Вставить("ИспользоватьПодписиИПечати", Истина); Настройки.Вставить("СкрыватьПодписиИПечатиДляРедактирования", Ложь); + Настройки.Вставить("ОбъектыПечати", Новый Массив); + Настройки.Вставить("ПроверкаПроведенияПередПечатью", Ложь); + ИнтеграцияПодсистемБСП.ПриОпределенииНастроекПечати(Настройки); УправлениеПечатьюПереопределяемый.ПриОпределенииНастроекПечати(Настройки); Возврат Настройки; @@ -1680,6 +1903,154 @@ КонецФункции +Процедура ЗаписатьМакетыНаДополнительныхЯзыках(ПараметрыМакета) Экспорт + + ИдентификаторКопируемогоМакета = ПараметрыМакета.ИдентификаторКопируемогоМакета; + ТекущийЯзык = ПараметрыМакета.ТекущийЯзык; + УникальныйИдентификатор = ПараметрыМакета.УникальныйИдентификатор; + ИдентификаторМакета = ПараметрыМакета.ИдентификаторМакета; + ВладелецМакета = ПараметрыМакета.ВладелецМакета; + ИмяДокумента = ПараметрыМакета.ИмяДокумента; + СсылкаМакета = ПараметрыМакета.СсылкаМакета; + ТипМакета = ПараметрыМакета.ТипМакета; + + Если ИдентификаторКопируемогоМакета = "" Тогда + Возврат; + КонецЕсли; + + МассивСловИдентификатора = СтрРазделить(ИдентификаторКопируемогоМакета, ".", Ложь); + Если МассивСловИдентификатора.Количество() > 1 Тогда + ИдентификаторКопируемогоМакета = ""; + ИмяКопируемогоМакета = МассивСловИдентификатора[МассивСловИдентификатора.ВГраница()]; + МассивСловИдентификатора.Удалить(МассивСловИдентификатора.ВГраница()); + ИмяКопируемогоОбъекта = СтрСоединить(МассивСловИдентификатора, "."); + + ТекстЗапроса = + "ВЫБРАТЬ + | ПользовательскиеМакетыПечати.Макет, + | ПользовательскиеМакетыПечати.ИмяМакета, + | """" КАК КодЯзыка + |ИЗ + | РегистрСведений.ПользовательскиеМакетыПечати КАК ПользовательскиеМакетыПечати + |ГДЕ + | ПользовательскиеМакетыПечати.Объект = &Объект + | И ПользовательскиеМакетыПечати.ИмяМакета ПОДОБНО &ИмяМакета + | И ПользовательскиеМакетыПечати.Использование"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.Параметры.Вставить("Объект", ИмяКопируемогоОбъекта); + Запрос.Параметры.Вставить("ИмяМакета", ИмяКопируемогоМакета + "_%"); + Иначе + ТекстЗапроса = + "ВЫБРАТЬ + | МакетыПечатныхФормПредставления.Макет, + | МакетыПечатныхФормПредставления.КодЯзыка + |ИЗ + | Справочник.МакетыПечатныхФорм.Представления КАК МакетыПечатныхФормПредставления + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.МакетыПечатныхФорм КАК МакетыПечатныхФорм + | ПО МакетыПечатныхФормПредставления.Ссылка = МакетыПечатныхФорм.Ссылка + |ГДЕ + | МакетыПечатныхФорм.Идентификатор = &Идентификатор + | И МакетыПечатныхФормПредставления.КодЯзыка <> &КодЯзыка"; + + Запрос = Новый Запрос(ТекстЗапроса); + УникальныйИдентификаторКопируемогоМакета = Справочники.МакетыПечатныхФорм.ИдентификаторМакета(ИдентификаторКопируемогоМакета); + Запрос.УстановитьПараметр("Идентификатор", УникальныйИдентификаторКопируемогоМакета); + Запрос.УстановитьПараметр("КодЯзыка", ТекущийЯзык); + КонецЕсли; + + Результат = Запрос.Выполнить(); + Выборка = Результат.Выбрать(); + + Пока Выборка.Следующий() Цикл + + Если Выборка.КодЯзыка = "" Тогда + МассивСловИмениМакета = СтрРазделить(Выборка.ИмяМакета, "_"); + КодЯзыкаМакета = МассивСловИмениМакета[МассивСловИмениМакета.ВГраница()]; + Если КодЯзыкаМакета = ТекущийЯзык Тогда + Продолжить; + КонецЕсли; + Иначе + КодЯзыкаМакета = Выборка.КодЯзыка; + КонецЕсли; + + АдресМакетаВоВременномХранилище = ПоместитьВоВременноеХранилище(Выборка.Макет.Получить(), УникальныйИдентификатор); + + ОписаниеМакета = ОписаниеМакета(); + ОписаниеМакета.ИмяОбъектаМетаданныхМакета = ИдентификаторМакета; + ОписаниеМакета.АдресМакетаВоВременномХранилище = АдресМакетаВоВременномХранилище; + ОписаниеМакета.КодЯзыка = КодЯзыкаМакета; + ОписаниеМакета.Владелец = ВладелецМакета; + ОписаниеМакета.Наименование = ИмяДокумента; + ОписаниеМакета.Ссылка = СсылкаМакета; + ОписаниеМакета.ТипМакета = ТипМакета; + + ЗаписатьМакет(ОписаниеМакета); + + КонецЦикла; + +КонецПроцедуры + +Функция СформироватьПечатныеФормыВФоне(ИменаМакетов, Параметры, ПараметрыВывода, ТекущийЯзык, ОбъектыПечати) Экспорт + Результат = Неопределено; + // Формирование табличных документов. + Если ЗначениеЗаполнено(Параметры.ИсточникДанных) Тогда + Если ТипЗнч(ПараметрыВывода) = Тип("Структура") И ПараметрыВывода.Свойство("КодЯзыка") Тогда + ПараметрыВывода.КодЯзыка = ТекущийЯзык; + КонецЕсли; + ПечатьПоВнешнемуИсточнику( + Параметры.ИсточникДанных, + Параметры.ПараметрыИсточника, + Результат, + ОбъектыПечати, + ПараметрыВывода); + Иначе + ТипыОбъектовПечати = Новый Массив; + Параметры.ПараметрыПечати.Свойство("ТипыОбъектовПечати", ТипыОбъектовПечати); + + ДополнительныеПараметры = Неопределено; + Параметры.ПараметрыПечати.Свойство("ДополнительныеПараметры", ДополнительныеПараметры); + + ПечатныеФормы = СформироватьПечатныеФормы(Параметры.ИмяМенеджераПечати, ИменаМакетов, + Параметры.ПараметрКоманды, ДополнительныеПараметры, ТипыОбъектовПечати, ТекущийЯзык); + ОбъектыПечати = ПечатныеФормы.ОбъектыПечати; + ПараметрыВывода = ПечатныеФормы.ПараметрыВывода; + Результат = ПечатныеФормы.КоллекцияПечатныхФорм; + КонецЕсли; + + // Установка признака сохранения печатной формы в файл (не открывать форму, сразу сохранять в файл). + Если ТипЗнч(Параметры.ПараметрыПечати) = Тип("Структура") И Параметры.ПараметрыПечати.Свойство("ФорматСохранения") + И ЗначениеЗаполнено(Параметры.ПараметрыПечати.ФорматСохранения) Тогда + НайденныйФормат = НастройкиФорматовСохраненияТабличногоДокумента().Найти(ТипФайлаТабличногоДокумента[Параметры.ПараметрыПечати.ФорматСохранения], "ТипФайлаТабличногоДокумента"); + Если НайденныйФормат <> Неопределено Тогда + НастройкиФорматаСохранения = Новый Структура("ТипФайлаТабличногоДокумента,Представление,Расширение,Фильтр"); + ЗаполнитьЗначенияСвойств(НастройкиФорматаСохранения, НайденныйФормат); + НастройкиФорматаСохранения.Фильтр = НастройкиФорматаСохранения.Представление + "|*." + НастройкиФорматаСохранения.Расширение; + НастройкиФорматаСохранения.ТипФайлаТабличногоДокумента = Параметры.ПараметрыПечати.ФорматСохранения; + КонецЕсли; + КонецЕсли; + + РезультатФормирования = Новый Структура("КоллекцияПечатныхФорм, ПараметрыФоновогоЗадания,ОфисныеДокументы,ОбъектыПечати,ПараметрыВывода"); + РезультатФормирования.КоллекцияПечатныхФорм = Результат; + РезультатФормирования.ПараметрыВывода = ПараметрыВывода; + РезультатФормирования.ПараметрыФоновогоЗадания = Параметры; + ОфисныеДокументы = Новый Соответствие(); + + Для Каждого СтрокаРезультата Из Результат Цикл + Если ЗначениеЗаполнено(СтрокаРезультата.ОфисныеДокументы) Тогда + Для Каждого ОфисныйДокумент Из СтрокаРезультата.ОфисныеДокументы Цикл + ОфисныеДокументы.Вставить(ОфисныйДокумент.Ключ, ПолучитьИзВременногоХранилища(ОфисныйДокумент.Ключ)); + КонецЦикла; + КонецЕсли; + КонецЦикла; + РезультатФормирования.ОфисныеДокументы = ОфисныеДокументы; + РезультатФормирования.ОбъектыПечати = ОбъектыПечати; + + Возврат РезультатФормирования; + +КонецФункции + + // Формирует печатную форму по внешнему источнику. // // Параметры: @@ -1843,6 +2214,8 @@ МодульУправлениеПечатьюМультиязычность.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; + Справочники.МакетыПечатныхФорм.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецПроцедуры // См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. @@ -1928,6 +2301,13 @@ КонецПроцедуры +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. +Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт + + Объекты.Вставить(Метаданные.Справочники.МакетыПечатныхФорм.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + +КонецПроцедуры + // Определяет, какие поставляемые макеты печатных форм конфигурации изменились по отношению к предыдущей версии. Процедура ОбновитьКонтрольнуюСуммуМакетов() Экспорт @@ -1956,7 +2336,7 @@ КоллекцияМакетов = Метаданные.ОбщиеМакеты; Если Не ЭтоОбщийМакет Тогда - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъекта); Если ОбъектМетаданных = Неопределено Тогда Возврат Неопределено; КонецЕсли; @@ -1967,24 +2347,94 @@ КонецФункции +Процедура ДобавитьЯзыкиПечатныхФорм(КодыЯзыков) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда + МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); + МодульУправлениеПечатьюМультиязычность.ДобавитьЯзыкиПечатныхФорм(КодыЯзыков); + КонецЕсли; + +КонецПроцедуры + #Область РедактированиеТабличногоДокумента -Функция ДоступныеПоляОбъекта(ИмяОбъектаМетаданных) Экспорт +Функция КоллекцииПолейИсточниковДанных(ИсточникиДанных) Экспорт - КоллекцииПолей = Новый Массив; - Для Каждого Элемент Из СхемыКомпоновкиДанныхИсточникаПолей(ИмяОбъектаМетаданных, Истина) Цикл - СхемаКомпоновкиДанных = Элемент.Значение; - КоллекцииПолей.Добавить(КонструкторФормул.КоллекцияПолей(СхемаКомпоновкиДанных)); + Результат = Новый СписокЗначений; + ОписанияОбъектов = ОбщегоНазначения.ОбъектыМетаданныхПоИдентификаторам(ИсточникиДанных); + + ИмяИсточникаДанных = "КоллекцияДоступныхПолей"; + + Для Каждого ОписаниеОбъекта Из ОписанияОбъектов Цикл + ИмяОбъектаМетаданных = ОписаниеОбъекта.Значение.ПолноеИмя(); + Для Каждого СхемаКомпоновкиДанных Из СхемыКомпоновкиДанныхИсточникаПолей(ИмяОбъектаМетаданных, Ложь) Цикл + Результат.Добавить(КонструкторФормул.КоллекцияПолей(СхемаКомпоновкиДанных.Значение), ИмяИсточникаДанных); + КонецЦикла; КонецЦикла; - - Возврат КоллекцииПолей; + Результат.Добавить(КоллекцияПолейОбщиеРеквизиты(), ИмяИсточникаДанных); + + Возврат Результат; + КонецФункции -Функция СписокОператоров() Экспорт +Функция ОбщиеПоляИсточниковДанных(ИсточникиДанных) Экспорт + + Результат = Неопределено; + ОписанияОбъектов = ОбщегоНазначения.ОбъектыМетаданныхПоИдентификаторам(ИсточникиДанных); + + Для Каждого ОписаниеОбъекта Из ОписанияОбъектов Цикл + ИмяОбъектаМетаданных = ОписаниеОбъекта.Значение.ПолноеИмя(); + ПоляКоллекции = Новый Массив; + Для Каждого СхемаКомпоновкиДанных Из СхемыКомпоновкиДанныхИсточникаПолей(ИмяОбъектаМетаданных, Ложь) Цикл + КоллекцияПолей = КонструкторФормул.КоллекцияПолей(СхемаКомпоновкиДанных.Значение); + Для Каждого Поле Из ПоляКоллекции(КоллекцияПолей) Цикл + ПоляКоллекции.Добавить(Поле); + КонецЦикла; + КонецЦикла; + Если Результат = Неопределено Тогда + Результат = ПересечениеМножеств(ПоляКоллекции, ПоляКоллекции); // Свертка повторяющихся элементов. + Иначе + Результат = ПересечениеМножеств(Результат, ПоляКоллекции); + КонецЕсли; + КонецЦикла; + + Если Результат = Неопределено Тогда + Результат = Новый Массив; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Процедура ОбновитьСписокДоступныхПолей(Форма, КоллекцииПолей, ИмяСпискаПолей) Экспорт + + КонструкторФормул.ОбновитьКоллекцииПолей(Форма, КоллекцииПолей, ИмяСпискаПолей); + +КонецПроцедуры + +Функция СписокОператоров(ДополнительныеПоля = Неопределено) Экспорт СписокОператоров = КонструкторФормул.СписокОператоров(); + Если ДополнительныеПоля <> Неопределено Тогда + Для Каждого ГруппаДополнительногоПоля Из ДополнительныеПоля Цикл + Группа = СписокОператоров.Строки.Найти(ГруппаДополнительногоПоля.Ключ); + + Если Группа = Неопределено Тогда + Группа = СписокОператоров.Строки.Добавить(); + ЗаполнитьЗначенияСвойств(Группа, ГруппаДополнительногоПоля.Значение); + Группа.Идентификатор = ГруппаДополнительногоПоля.Ключ; + КонецЕсли; + + Для Каждого ДополнительноеПоле Из ГруппаДополнительногоПоля.Значение.Элементы Цикл + Оператор = Группа.Строки.Добавить(); + ЗаполнитьЗначенияСвойств(Оператор, ДополнительноеПоле.Значение); + Оператор.Идентификатор = ДополнительноеПоле.Ключ; + КонецЦикла; + КонецЦикла; + КонецЕсли; + Группа = СписокОператоров.Строки.Найти("СтроковыеФункции"); Если Группа = Неопределено Тогда Группа = СписокОператоров.Строки.Добавить(); @@ -1994,11 +2444,7 @@ Группа.Картинка = БиблиотекаКартинок.ТипФункция; КонецЕсли; - Оператор = Группа.Строки.Добавить(); - Оператор.Идентификатор = "УправлениеПечатью_СтрокаЛатиницей"; - Оператор.Представление = НСтр("ru = 'СтрокаЛатиницей'"); - Оператор.ТипЗначения = Новый ОписаниеТипов("Строка"); - Оператор.ЭтоФункция = Истина; + ДобавитьОператорВГруппу(Группа, "УправлениеПечатью_СтрокаЛатиницей", НСтр("ru = 'Строка латиницей'"), Новый ОписаниеТипов("Строка"), Истина); Группа = СписокОператоров.Строки.Найти("ПрочиеФункции"); Если Группа = Неопределено Тогда @@ -2009,12 +2455,6 @@ Группа.Картинка = БиблиотекаКартинок.ТипФункция; КонецЕсли; - Оператор = Группа.Строки.Добавить(); - Оператор.Идентификатор = "УправлениеПечатью_КоличествоСтрок"; - Оператор.Представление = НСтр("ru = 'КоличествоСтрок'"); - Оператор.ТипЗначения = Новый ОписаниеТипов("Число"); - Оператор.ЭтоФункция = Истина; - Возврат КонструкторФормул.КоллекцияПолей(СписокОператоров); КонецФункции @@ -2068,28 +2508,48 @@ КонецФункции -Функция ВладелецМакета(ПутьКМакету) Экспорт - - ВладелецМакета = Справочники.МакетыПечатныхФорм.ВладелецМакета(ПутьКМакету); - Если ВладелецМакета <> Неопределено Тогда - Возврат ВладелецМакета; +Функция ИсточникиДанныхМакета(ПутьКМакету) Экспорт + + ИсточникиДанныхМакета = Справочники.МакетыПечатныхФорм.ИсточникиДанныхМакета(ПутьКМакету); + Если ИсточникиДанныхМакета <> Неопределено Тогда + Возврат ИсточникиДанныхМакета; КонецЕсли; + ИсточникиДанныхМакета = Новый Массив; + ЧастиПути = СтрРазделить(ПутьКМакету, ".", Истина); Если ЧастиПути.Количество() <> 2 И ЧастиПути.Количество() <> 3 Тогда - Возврат Неопределено; + Возврат ИсточникиДанныхМакета; КонецЕсли; ЧастиПути.Удалить(ЧастиПути.ВГраница()); ИмяОбъекта = СтрСоединить(ЧастиПути, "."); - ВладелецМакета = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ИмяОбъекта, Ложь); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъекта); + Если ОбъектМетаданных = Неопределено Тогда + Возврат ИсточникиДанныхМакета; + КонецЕсли; - Возврат ВладелецМакета; + Если Метаданные.Обработки.Содержит(ОбъектМетаданных) Тогда + НастройкиПодключаемогоОбъекта = ПодключаемыеКоманды.НастройкиПодключаемогоОбъекта(ИмяОбъекта); + Если ЗначениеЗаполнено(НастройкиПодключаемогоОбъекта) Тогда + ИдентификаторыОбъектовМетаданных = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(НастройкиПодключаемогоОбъекта.Размещение, Ложь); + Для Каждого Элемент Из ИдентификаторыОбъектовМетаданных Цикл + ИсточникиДанныхМакета.Добавить(Элемент.Значение); + КонецЦикла; + КонецЕсли; + Иначе + ВладелецМакета = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ИмяОбъекта, Ложь); + Если ВладелецМакета <> Неопределено Тогда + ИсточникиДанныхМакета.Добавить(ВладелецМакета); + КонецЕсли; + КонецЕсли; + + Возврат ИсточникиДанныхМакета; КонецФункции -Функция ЭтоПечатнаяФорма(Знач ИдентификаторМакета, Владелец) Экспорт +Функция ЭтоПечатнаяФорма(Знач ИдентификаторМакета, Знач Владелец = Неопределено) Экспорт Если Не ЗначениеЗаполнено(Владелец) Тогда Возврат Ложь; @@ -2203,7 +2663,7 @@ Владелец = ИерархияПолей[ОписаниеПоля.Владелец]; КонецЕсли; Владелец.Вставить(ОписаниеПоля.Поле, Новый Соответствие); - КонецЦикла; + КонецЦикла; ЗаполнитьДанныеПечати(ДанныеПечати, ОписаниеПолей, ИерархияПолей, Объекты, КодЯзыка); @@ -2368,7 +2828,11 @@ Продолжить; КонецЕсли; СсылкаНаКартинку = ВычислитьВыражение(Рисунок.ПараметрРасшифровки, ИсточникДанных, НастройкиФорматаПолей, КодЯзыка); - Рисунок.Картинка = КартинкаИзФайла(СсылкаНаКартинку); + Если ТипЗнч(СсылкаНаКартинку) = Тип("Картинка") Тогда + Рисунок.Картинка = СсылкаНаКартинку; + Иначе + Рисунок.Картинка = КартинкаИзФайла(СсылкаНаКартинку); + КонецЕсли; КонецЦикла; ВыведеноРисунков = ТабличныйДокумент.Рисунки.Количество(); КонецЦикла; @@ -2423,12 +2887,12 @@ |ГДЕ | ПользовательскиеМакетыПечати.Объект = &Объект | И (ПользовательскиеМакетыПечати.ИмяМакета = &ИмяМакета - | ИЛИ ПользовательскиеМакетыПечати.ИмяМакета ПОДОБНО &ШаблонИмениМакета)"; + | ИЛИ ПользовательскиеМакетыПечати.ИмяМакета ПОДОБНО &ШаблонИмениМакета СПЕЦСИМВОЛ ""~"")"; Запрос = Новый Запрос(ТекстЗапроса); Запрос.Параметры.Вставить("Объект", ИмяОбъекта); Запрос.Параметры.Вставить("ИмяМакета", ИмяМакета); - Запрос.Параметры.Вставить("ШаблонИмениМакета", ИмяМакета + "_%"); + Запрос.Параметры.Вставить("ШаблонИмениМакета", ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(ИмяМакета) + "_%"); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ПользовательскиеМакетыПечати"); @@ -2495,6 +2959,7 @@ // - СправочникСсылка.ИдентификаторыОбъектовРасширений // * Наименование - Строка // * ТипМакета - Строка +// * ИсточникиДанных - Строка // Функция ОписаниеМакета() Экспорт @@ -2506,6 +2971,7 @@ Результат.Вставить("Владелец"); Результат.Вставить("Наименование"); Результат.Вставить("ТипМакета"); + Результат.Вставить("ИсточникиДанных"); Возврат Результат; @@ -2558,6 +3024,185 @@ #КонецОбласти +Функция СформироватьОфисныйДокумент(Макет, МассивОбъектов, ОбъектыПечати, КодЯзыка, ПараметрыПечати) Экспорт + + ДеревоМакета = ИнициализироватьМакетОфисногоДокументаСКД(Макет); + СтруктураДокумента = ДеревоМакета.СтруктураДокумента; + + ПоляМакета = Новый Массив; + + Для Каждого Элемент Из СтруктураДокумента.ПараметрыТекста Цикл + Текст = Элемент; + ПараметрыТекста = НайтиПараметрыВТексте(Текст); + + Для Каждого Выражение Из ПараметрыТекста Цикл + Выражение = Сред(Выражение, 2, СтрДлина(Выражение) - 2); + ЭлементыФормулы = КонструкторФормулСлужебный.ЭлементыФормулы(Выражение); + Для Каждого ОписаниеЭлемента Из ЭлементыФормулы.ОперандыИФункции Цикл + ЭтоФункция = ОписаниеЭлемента.Значение; + Если ЭтоФункция Тогда + Продолжить; + КонецЕсли; + + Операнд = ЭлементыФормулы.ВсеЭлементы[ОписаниеЭлемента.Ключ]; + Операнд = ОчиститьКвадратныеСкобки(Операнд); + Если ЗначениеЗаполнено(Операнд) Тогда + ПоляМакета.Добавить(Операнд); + КонецЕсли; + КонецЦикла; + КонецЦикла; + КонецЦикла; + + ДанныеПечати = ДанныеПечати(МассивОбъектов, ПоляМакета, КодЯзыка); + + + ИменаТабличныхЧастейОбъекта = ДанныеПечати.Получить("ИменаТабличныхЧастейОбъекта"); + + СобратьСтрокиУсловныхОбластей(СтруктураДокумента.ДеревоДокумента, СтруктураДокумента.Гиперссылки); + УправлениеПечатьюСлужебный.ПроиндексироватьУзлы(СтруктураДокумента.ДеревоДокумента); + УправлениеПечатьюСлужебный.НайтиОбласти(СтруктураДокумента, ИменаТабличныхЧастейОбъекта); + + ПараметрыДляЗаполненияШапки = Новый Массив; + Для Каждого Область Из СтруктураДокумента.Области Цикл + Если Не ЗначениеЗаполнено(Область.Коллекция) Тогда + ПараметрыДляДополнения = Область.Параметры; + Иначе + ПараметрыДляДополнения = Новый Массив; + Для Каждого Параметр Из Область.Параметры Цикл + ЭлементыФормулы = КонструкторФормулСлужебный.ЭлементыФормулы(Параметр); + Для Каждого ЭлементФормулы Из ЭлементыФормулы.ВсеЭлементы Цикл + Если СтрЧислоВхождений(ЭлементФормулы, Область.Коллекция+".") = 0 Тогда + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ПараметрыДляЗаполненияШапки, + ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ЭлементФормулы), Истина); + КонецЕсли; + КонецЦикла; + КонецЦикла; + КонецЕсли; + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ПараметрыДляЗаполненияШапки, ПараметрыДляДополнения, Истина); + КонецЦикла; + + Для Каждого Колонтитул Из СтруктураДокумента.Колонтитулы Цикл + Для Каждого СтрокаКолонтитула Из Колонтитул.Значение.Строки Цикл + ПараметрыКолонтитула = НайтиПараметрыВТексте(СтрокаКолонтитула.ПолныйТекст); + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ПараметрыДляЗаполненияШапки, ПараметрыКолонтитула, Истина); + КонецЦикла; + КонецЦикла; + + ОфисныеДокументы = Новый Соответствие; + Для Каждого ОбъектПечати Из МассивОбъектов Цикл + ДеревоМакетаДляЗаполнения = КопияДереваМакета(ДеревоМакета); + ЗначенияПараметров = ПолучитьЗначениеПараметровОбъекта(ДанныеПечати, ОбъектПечати, ДеревоМакетаДляЗаполнения, КодЯзыка, ПараметрыПечати, ПараметрыДляЗаполненияШапки); + ДеревоДокумента = ДеревоМакетаДляЗаполнения.СтруктураДокумента.ДеревоДокумента; + ДанныеОбъекта = ДанныеПечати[ОбъектПечати]; + НастройкиФорматаПолей = ДанныеПечати["НастройкиФорматаПолей"]; + ЗаполнитьКолонтитулы = Истина; + + Для ИндексОбласти = 0 По СтруктураДокумента.Области.Количество()-1 Цикл + ТекущаяОбласть = СтруктураДокумента.Области[ИндексОбласти]; + Если ЗначениеЗаполнено(ТекущаяОбласть.УсловиеОбласти) Тогда + УстановленБезопасныйРежим = БезопасныйРежим(); + УстановитьБезопасныйРежим(Истина); + ВыводитьОбласть = ВычислитьВыражение(ТекущаяОбласть.УсловиеОбласти, ДанныеОбъекта, НастройкиФорматаПолей, КодЯзыка, Ложь); + + Если Не УстановленБезопасныйРежим Тогда + УстановитьБезопасныйРежим(Ложь); + КонецЕсли; + + Если ТипЗнч(ВыводитьОбласть) <> Тип("Булево") Или Не ВыводитьОбласть Тогда + Продолжить; + КонецЕсли; + КонецЕсли; + + СтруктураОбласти = Новый Структура("ДеревоОбласти,Параметры"); + ЗаполнитьЗначенияСвойств(СтруктураОбласти, ТекущаяОбласть); + Если ЗначениеЗаполнено(ТекущаяОбласть.Коллекция) Тогда + МассивКоллекции = ПолучитьДанныеОбласти(ДанныеПечати, ОбъектПечати, ТекущаяОбласть, ДеревоМакетаДляЗаполнения, КодЯзыка, ПараметрыПечати); + Для Каждого ЭлементКоллекции Из МассивКоллекции Цикл + СтруктураОбластиСтроки = ОбщегоНазначения.СкопироватьРекурсивно(СтруктураОбласти); + ПараметрыЗаполненияОбласти = ПараметрыЗаполненияОбласти(); + ПараметрыЗаполненияОбласти.СобратьСтроки = Ложь; + ПараметрыЗаполненияОбласти.СтруктураОбласти = СтруктураОбластиСтроки; + ПараметрыЗаполненияОбласти.ЗаполнятьКолонтитулы = Ложь; + УстановитьПараметры(ДеревоМакетаДляЗаполнения, ЭлементКоллекции, ПараметрыЗаполненияОбласти); + ДеревоМакетаДляЗаполнения.ОбластиДляВывода.Добавить(СтруктураОбластиСтроки.ДеревоОбласти); + КонецЦикла; + Иначе + СтруктураОбластиСтроки = ОбщегоНазначения.СкопироватьРекурсивно(СтруктураОбласти); + ПараметрыЗаполненияОбласти = ПараметрыЗаполненияОбласти(); + ПараметрыЗаполненияОбласти.СобратьСтроки = Ложь; + ПараметрыЗаполненияОбласти.СтруктураОбласти = СтруктураОбластиСтроки; + ПараметрыЗаполненияОбласти.ЗаполнятьКолонтитулы = ЗаполнитьКолонтитулы; + ЗаполнитьКолонтитулы = Ложь; + УстановитьПараметры(ДеревоМакетаДляЗаполнения, ЗначенияПараметров, ПараметрыЗаполненияОбласти); + ДеревоМакетаДляЗаполнения.ОбластиДляВывода.Добавить(СтруктураОбластиСтроки.ДеревоОбласти); + КонецЕсли; + КонецЦикла; + + УказателиНаОбласти = Новый Соответствие; + Для ИндексОбласти = 0 По ДеревоМакетаДляЗаполнения.ОбластиДляВывода.ВГраница() Цикл + ОбластьДляВывода = ДеревоМакетаДляЗаполнения.ОбластиДляВывода[ИндексОбласти]; + Если ОбластьДляВывода.Строки[0].Индекс = 0 Тогда + ДеревоДляВывода = ОбластьДляВывода; + УказателиНаОбласти.Вставить(ОбластьДляВывода.Строки[0].Индекс, ОбластьДляВывода); + Иначе + ПоследнееДобавление = УказателиНаОбласти[ОбластьДляВывода.Строки[0].Индекс]; + Если ПоследнееДобавление <> Неопределено Тогда + РодительДобавления = ?(ПоследнееДобавление.Родитель = Неопределено, ДеревоДляВывода, ПоследнееДобавление.Родитель); + ИндексДобавления = РодительДобавления.Строки.Индекс(ПоследнееДобавление) + ОбластьДляВывода.Строки.Количество(); + Иначе + СтрокаДобавления = ДеревоДокумента.Строки.Найти(ОбластьДляВывода.Строки[0].Индекс, "Индекс", Истина); + РодительДобавления = ДеревоДляВывода.Строки.Найти(СтрокаДобавления.Родитель.Индекс, "Индекс", Истина); + Если РодительДобавления <> Неопределено Тогда + ИндексДобавления = РодительДобавления.Строки.Количество(); + Иначе + РодительДобавления = ПолучитьПропущенногоРодителя(СтрокаДобавления, ДеревоДляВывода); + ИндексДобавления = 0; + КонецЕсли; + + КонецЕсли; + + Для Каждого УзелДобавления Из ОбластьДляВывода.Строки Цикл + НовыйУзел = УправлениеПечатьюСлужебный.СкопироватьУзел(РодительДобавления, ИндексДобавления, УзелДобавления); + УказателиНаОбласти.Вставить(НовыйУзел.Индекс, НовыйУзел); + УправлениеПечатьюСлужебный.СоздатьПоследующие(НовыйУзел, УзелДобавления); + ИндексДобавления = ИндексДобавления + 1; + КонецЦикла; + КонецЕсли; + КонецЦикла; + + ДеревоМакетаДляЗаполнения.СтруктураДокумента.ДеревоДокумента = ДеревоДляВывода; + + АдресХранилищаПечатнойФормы = УправлениеПечатьюСлужебный.ПолучитьПечатнуюФорму(ДеревоМакетаДляЗаполнения); + ОфисныеДокументы.Вставить(АдресХранилищаПечатнойФормы, ОбъектПечати); + + КонецЦикла; + + Возврат ОфисныеДокументы; + +КонецФункции + +Функция ПолучитьПечатнуюФорму(ДеревоМакета, АдресХранилища = Неопределено) Экспорт + + Возврат УправлениеПечатьюСлужебный.ПолучитьПечатнуюФорму(ДеревоМакета, АдресХранилища); + +КонецФункции + +Функция ИмяТегаУсловие() Экспорт + + Возврат УправлениеПечатьюКлиентСервер.ИмяТегаУсловие(); + +КонецФункции + +Функция ПолучитьУзлыТекстов(УзелДокумента, СоответствиеУзлов = Неопределено) Экспорт + + Возврат УправлениеПечатьюСлужебный.ПолучитьУзлыТекстов(УзелДокумента, СоответствиеУзлов); + +КонецФункции + +Функция ПолучитьКлючЗаписиМакета(ИдентификаторМакета) Экспорт + Возврат РегистрыСведений.ПользовательскиеМакетыПечати.ПолучитьКлючЗаписиМакета(ИдентификаторМакета); +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -2708,6 +3353,7 @@ КонецЕсли; КонецЕсли; КонецЕсли; + УправлениеПечатьюПереопределяемый.ПередПечатью(Идентификатор, ОбъектыСоответствующиеПечатнойФорме, ПараметрыПечати); ВременнаяКоллекцияДляОднойПечатнойФормы = ПодготовитьКоллекциюПечатныхФорм(Идентификатор); @@ -2726,8 +3372,9 @@ Если ОбъектыСоответствующиеПечатнойФорме <> Неопределено Тогда ЭтоПечатнаяФормаСКД = ИспользуемыйМенеджерПечати = "УправлениеПечатью"; Если ЭтоПечатнаяФормаСКД Тогда + // @skip-check query-in-loop - Малый цикл Печать(ОбъектыСоответствующиеПечатнойФорме, ПараметрыПечати, ВременнаяКоллекцияДляОднойПечатнойФормы, - ОбъектыПечати, ПараметрыВывода); + ОбъектыПечати, ПараметрыВывода); Иначе МенеджерПечати = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИспользуемыйМенеджерПечати); МенеджерПечати.Печать(ОбъектыСоответствующиеПечатнойФорме, ПараметрыПечати, ВременнаяКоллекцияДляОднойПечатнойФормы, @@ -2777,7 +3424,7 @@ // Вызов исключения при возникновении ошибки. Если Отказ Тогда ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = 'При формировании печатной формы ""%1"" возникла ошибка. Обратитесь к администратору.'"), ИмяМакета); + "ru = 'Не удалось сформировать печатную форму ""%1"". Обратитесь к администратору.'"), ИмяМакета); ВызватьИсключение ТекстСообщенияОбОшибке; КонецЕсли; @@ -2974,8 +3621,7 @@ Если ИсточникиКомандПечати[ОбъектМетаданных] = Неопределено Тогда Продолжить; КонецЕсли; - - КомандыПечатиФормы = КомандыПечатиОбъекта(ОбъектМетаданных); + КомандыПечатиФормы = КомандыПечатиОбъекта(ОбъектМетаданных); // @skip-check query-in-loop - Малый цикл Для Каждого ДобавляемаяКомандаПечати Из КомандыПечатиФормы Цикл Если ДобавляемаяКомандаПечати.Отключена Тогда @@ -3049,7 +3695,9 @@ СписокОтключенных = Новый Соответствие; Пока Выборка.Следующий() Цикл СписокОтключенных.Вставить(Выборка.УникальныйИдентификатор, Истина); - КонецЦикла; + КонецЦикла; + + ПроверкаПроведенияПередПечатью = НастройкиПечати().ПроверкаПроведенияПередПечатью; Для Каждого КомандаПечати Из КомандыПечати Цикл КомандаПечати.УникальныйИдентификатор = УникальныйИдентификаторКомандыПечати(КомандаПечати); @@ -3057,6 +3705,11 @@ КомандаПечати.Отключена = Истина; КонецЕсли; КомандаПечати.ФорматСохранения = Строка(КомандаПечати.ФорматСохранения); + + Если КомандаПечати.ПроверкаПроведенияПередПечатью = Неопределено Тогда + КомандаПечати.ПроверкаПроведенияПередПечатью = ПроверкаПроведенияПередПечатью; + КонецЕсли; + КонецЦикла; КонецПроцедуры @@ -3105,7 +3758,9 @@ КонецЕсли; ДобавляемыеКомандыПечати = СоздатьКоллекциюКомандПечати(); - Источник.Менеджер.ДобавитьКомандыПечати(ДобавляемыеКомандыПечати); + Если НастройкиПечатиОбъекта(Источник.Менеджер).ПриДобавленииКомандПечати Тогда + Источник.Менеджер.ДобавитьКомандыПечати(ДобавляемыеКомандыПечати); + КонецЕсли; Если СПечатнымиФормами Тогда ДобавитьКомандыПечати(ДобавляемыеКомандыПечати, ОбъектМетаданных); @@ -3126,6 +3781,8 @@ МодульДополнительныеОтчетыИОбработки.ПриПолученииКомандПечати(КомандыПечати, Источник.ПолноеИмя); КонецЕсли; + УправлениеПечатьюПереопределяемый.ПриПолученииКомандПечати(Источник.ПолноеИмя, КомандыПечати); + КомандыПечати.Индексы.Добавить("МенеджерПечати"); Найденные = ПодключенныеОтчетыИОбработки.НайтиСтроки(Новый Структура("ДобавитьКомандыПечати", Истина)); Для Каждого ПодключенныйОбъект Из Найденные Цикл @@ -3483,6 +4140,7 @@ КонецЕсли; ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла); + УдалитьФайлы(ИмяВременногоФайла); Возврат ДвоичныеДанные; @@ -3918,7 +4576,7 @@ КоллекцияМакетов = Метаданные.ОбщиеМакеты; Если Не ЭтоОбщийМакет Тогда - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъекта); Если ОбъектМетаданных = Неопределено Тогда ВызватьИсключение ТекстОшибки; КонецЕсли; @@ -3976,15 +4634,25 @@ КодЯзыка = ПараметрыВывода.КодЯзыка; + МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоСсылке(МассивОбъектов[0]); + Если НастройкиПечатиОбъекта(МенеджерОбъекта).ПриОпределенииПолучателей Тогда + МенеджерОбъекта.ПриОпределенииПолучателей(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов, КоллекцияПечатныхФорм); + КонецЕсли; + Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл ПечатнаяФорма.ДоступенВыводНаДругихЯзыках = Истина; ПечатнаяФорма.ПолныйПутьКМакету = ПечатнаяФорма.ИмяМакета; ПечатнаяФорма.СинонимМакета = ПредставлениеМакета(ПечатнаяФорма.ПолныйПутьКМакету, КодЯзыка); + // @skip-check query-in-loop - Небольшое количество итераций цикла с запросом к таблице РегистрСведений.ПользовательскиеМакетыПечати + // с заведомо небольшим количеством записей + Макет = МакетПечатнойФормы(ПечатнаяФорма.ПолныйПутьКМакету, КодЯзыка); - Макет = МакетПечатнойФормы(ПечатнаяФорма.ПолныйПутьКМакету, КодЯзыка); - - ТабличныйДокумент = СформироватьТабличныйДокумент(Макет, МассивОбъектов, ОбъектыПечати, КодЯзыка); - ПечатнаяФорма.ТабличныйДокумент = ТабличныйДокумент; + Если ТипЗнч(Макет) = Тип("ДвоичныеДанные") Тогда + ПечатнаяФорма.ОфисныеДокументы = СформироватьОфисныйДокумент(Макет, МассивОбъектов, ОбъектыПечати, КодЯзыка, ПараметрыПечати); + Иначе + ТабличныйДокумент = СформироватьТабличныйДокумент(Макет, МассивОбъектов, ОбъектыПечати, КодЯзыка); + ПечатнаяФорма.ТабличныйДокумент = ТабличныйДокумент; + КонецЕсли; КонецЦикла; КонецПроцедуры @@ -4195,7 +4863,11 @@ Если ВладелецИсточникаВТабличнойЧасти Тогда ИсточникДанных = ДанныеПечати[Объект][ПутьКДаннымТабличнойЧасти][НомерСтроки][ПутьКДаннымВладельцаИсточника]; Иначе - ИсточникДанных = ДанныеПечати[Объект][ПутьКДаннымВладельцаИсточника]; + Если ЗначениеЗаполнено(ПутьКДаннымВладельцаИсточника) Тогда + ИсточникДанных = ДанныеПечати[Объект][ПутьКДаннымВладельцаИсточника]; + Иначе + ИсточникДанных = Объект; + КонецЕсли; КонецЕсли; Иначе ИсточникДанных = ДанныеПечати[Объект][ПутьКДаннымТабличнойЧасти][НомерСтроки][ПутьКДаннымИсточникаПолей]; @@ -4366,6 +5038,8 @@ КонецЦикла; КонецЦикла; + ПериодическиеЗначения = Новый Соответствие; + Для Каждого ЭлементРасшифровки Из ДанныеРасшифровки.Элементы Цикл Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда @@ -4392,6 +5066,10 @@ ДанныеПечати = Результат[Ссылка]; КонецЕсли; + Если ПериодическиеЗначения[Ссылка] = Неопределено Тогда + ПериодическиеЗначения[Ссылка] = Новый Соответствие; + КонецЕсли; + Если Таблицы.Найти(ИмяТаблицы) <> Неопределено Тогда Таблица = ДанныеПечати[ИмяТаблицы]; Если Таблица = Неопределено Тогда @@ -4408,10 +5086,97 @@ СтрокаТаблицы.Вставить(ИмяПоля, ПараметрыРасшифровки.СписокПолей[ПараметрыРасшифровки.ИмяПоляРасшифровки]); Иначе - ДанныеПечати.Вставить(ПараметрыРасшифровки.ИмяПоляРасшифровки, ПараметрыРасшифровки.СписокПолей[ПараметрыРасшифровки.ИмяПоляРасшифровки]); + ИмяПоля = ПараметрыРасшифровки.ИмяПоляРасшифровки; + Если ПараметрыРасшифровки.СписокПолей["Период"] <> Неопределено И ИмяПоля <> "Ссылка" И ИмяПоля <> "Период" Тогда + Если ПериодическиеЗначения[Ссылка][ИмяПоля] = Неопределено Тогда + ТаблицаЗначений = Новый ТаблицаЗначений; + ТаблицаЗначений.Колонки.Добавить("Период", Новый ОписаниеТипов("Дата")); + ТаблицаЗначений.Колонки.Добавить("Значение"); + ПериодическиеЗначения[Ссылка][ИмяПоля] = ТаблицаЗначений; + КонецЕсли; + СтрокаТаблицы = ПериодическиеЗначения[Ссылка][ИмяПоля].Добавить(); + СтрокаТаблицы.Период = ПараметрыРасшифровки.СписокПолей["Период"]; + СтрокаТаблицы.Значение = ПараметрыРасшифровки.СписокПолей[ИмяПоля]; + КонецЕсли; + + Если ИмяПоля = "Номер" И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрефиксацияОбъектов") Тогда + МодульПрефиксацияОбъектовКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПрефиксацияОбъектовКлиентСервер"); + Значение = МодульПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ПараметрыРасшифровки.СписокПолей[ИмяПоля]); + ДанныеПечати.Вставить(ИмяПоля, Значение); + Иначе + ДанныеПечати.Вставить(ИмяПоля, ПараметрыРасшифровки.СписокПолей[ИмяПоля]); + КонецЕсли; КонецЕсли; КонецЦикла; + + ЕстьПериодическиеЗначения = Ложь; + Для Каждого Элемент Из ПериодическиеЗначения Цикл + Если ЗначениеЗаполнено(Элемент.Значение) Тогда + ЕстьПериодическиеЗначения = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Если Параметры.ДанныеИсточниковСгруппированыПоВладельцуИсточникаДанных Или Не ЕстьПериодическиеЗначения Тогда + Возврат Результат; + КонецЕсли; + + ВладельцыИсточников = Параметры.ОписанияИсточниковДанных.ВыгрузитьКолонку("Владелец"); + + ТипыСсылок = Новый Соответствие; + Для Каждого Ссылка Из ВладельцыИсточников Цикл + Если Ссылка = Неопределено Тогда + Продолжить; + КонецЕсли; + Тип = ТипЗнч(Ссылка); + Если ТипыСсылок[Тип] = Неопределено Тогда + ТипыСсылок[Тип] = Новый Массив; + КонецЕсли; + ТипыСсылок[Тип].Добавить(Ссылка); + КонецЦикла; + + Если Не ЗначениеЗаполнено(ТипыСсылок) Тогда + Возврат Результат; + КонецЕсли; + + ЗначенияПериода = Новый Соответствие; + Для Каждого ТипСсылок Из ТипыСсылок Цикл + ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипСсылок.Ключ); + Если ОбъектМетаданных <> Неопределено И ОбщегоНазначения.ЭтоДокумент(ОбъектМетаданных) Тогда + ЗначенияДаты = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(ТипСсылок.Значение, "Дата"); + Для Каждого Ссылка Из ТипСсылок.Значение Цикл + ЗначенияПериода.Вставить(Ссылка, ЗначенияДаты[Ссылка]); + КонецЦикла; + КонецЕсли; + КонецЦикла; + + Параметры.ДанныеИсточниковСгруппированыПоВладельцуИсточникаДанных = Истина; + + Для Каждого ОписаниеИсточникаДанных Из Параметры.ОписанияИсточниковДанных Цикл + Ссылка = ОписаниеИсточникаДанных.Значение; + ДанныеПечати = Результат[Ссылка]; + Если ДанныеПечати = Неопределено Тогда + Продолжить; + КонецЕсли; + + Владелец = ОписаниеИсточникаДанных.Владелец; + Результат[Владелец] = Новый Соответствие; + Для Каждого Поле Из ДанныеПечати Цикл + Результат[Владелец][Поле.Ключ] = Поле.Значение; + Период = ЗначенияПериода[Владелец]; + Если Период <> Неопределено И ПериодическиеЗначения[Ссылка] <> Неопределено И ПериодическиеЗначения[Ссылка][Поле.Ключ] <> Неопределено Тогда + Результат[Владелец][Поле.Ключ] = Неопределено; + Для Каждого ОписаниеЗначения Из ПериодическиеЗначения[Ссылка][Поле.Ключ] Цикл + Если ОписаниеЗначения.Период <= Период Тогда + Результат[Владелец][Поле.Ключ] = ОписаниеЗначения.Значение; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЦикла; + КонецЦикла; + Возврат Результат; КонецФункции @@ -4438,7 +5203,7 @@ Функция СкомпоноватьДанные(Параметры) Объекты = Параметры.ИсточникиДанных; - ПоляМакета = Параметры.ПоляСхемы; + ПоляМакета = ОбщегоНазначения.СкопироватьРекурсивно(Параметры.ПоляСхемы); КодЯзыка = Параметры.КодЯзыка; СхемаКомпоновкиДанных = Параметры.СхемаКомпоновкиДанных; ИдентификаторСхемыКомпоновкиДанных = Параметры.ИдентификаторСхемыКомпоновкиДанных; @@ -4530,18 +5295,22 @@ "УправлениеПечатьюПереопределяемый.ПриОпределенииИсточниковДанныхПечати"); КонецЕсли; - ГруппировкаПоСсылке = НастройкиКомпоновщика.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); + Группировка = НастройкиКомпоновщика.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); - Поле = ГруппировкаПоСсылке.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); + Поле = Группировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); Поле.Поле = КлючевоеПоле; Поле.Использование = Истина; - ГруппировкаПоСсылке.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); - - ТаблицаКомпоновкиДанных = ГруппировкаПоСсылке.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных")); + Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); + + ТаблицаКомпоновкиДанных = Группировка.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных")); Шапка = ТаблицаКомпоновкиДанных.Строки.Добавить(); Шапка.ПоляГруппировки.Элементы.Добавить(Тип("АвтоПолеГруппировкиКомпоновкиДанных")); + + Если ПоляМакета.Найти("Период") = Неопределено Тогда + ПоляМакета.Добавить("Период"); + КонецЕсли; Для Каждого ПутьКДанным Из ПоляМакета Цикл Если Таблицы.Найти(СтрРазделить(ПутьКДанным, ".", Истина)[0]) <> Неопределено Тогда @@ -4563,7 +5332,7 @@ КонецЦикла; Для Каждого ИмяТабличнойЧасти Из Таблицы Цикл - ТаблицаКомпоновкиДанных = ГруппировкаПоСсылке.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных")); + ТаблицаКомпоновкиДанных = Группировка.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных")); ГруппировкаПоНомеруСтроки = ТаблицаКомпоновкиДанных.Строки.Добавить(); ГруппировкаПоНомеруСтроки.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); @@ -4595,7 +5364,7 @@ КонецЦикла; КонецЦикла; - ГруппировкаПоСсылке.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных")); + Группировка.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных")); ЭлементОтбора = НастройкиКомпоновщика.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = КлючевоеПоле; @@ -4653,7 +5422,7 @@ КоллекцияМакетов = Метаданные.ОбщиеМакеты; Если Не ЭтоОбщийМакет Тогда - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъекта); Если ОбъектМетаданных = Неопределено Тогда Возврат Ложь; КонецЕсли; @@ -4730,25 +5499,30 @@ КонецФункции -Функция ВычислитьВыражение(Знач ИсходноеВыражение, ДанныеПечати, НастройкиФорматаПолей, КодЯзыка) +Функция ВычислитьВыражение(Знач ИсходноеВыражение, ДанныеПечати, НастройкиФорматаПолей, КодЯзыка, ПрименятьФорматирование = Неопределено) Выражение = ИсходноеВыражение; Выражение = Сред(Выражение, 2, СтрДлина(Выражение) - 2); ЭлементыФормулы = КонструкторФормулСлужебный.ЭлементыФормулы(Выражение); + ВыделитьИмяКолонкиТабличнойЧасти(Выражение, ЭлементыФормулы); + Параметры = Новый Массив; - ПрименятьФорматирование = Ложь; - Если ЭлементыФормулы.ОперандыИФункции.Количество() = 1 Тогда - Для Каждого ОписаниеЭлемента Из ЭлементыФормулы.ОперандыИФункции Цикл - ЭтоФункция = ОписаниеЭлемента.Значение; - Если ЭтоФункция Тогда + Если ПрименятьФорматирование = Неопределено Тогда + ПрименятьФорматирование = Ложь; + + Если ЭлементыФормулы.ОперандыИФункции.Количество() = 1 Тогда + Для Каждого ОписаниеЭлемента Из ЭлементыФормулы.ОперандыИФункции Цикл + ЭтоФункция = ОписаниеЭлемента.Значение; + Если ЭтоФункция Тогда + Прервать; + КонецЕсли; + Операнд = ЭлементыФормулы.ВсеЭлементы[ОписаниеЭлемента.Ключ]; + ПрименятьФорматирование = Операнд = Выражение; Прервать; - КонецЕсли; - Операнд = ЭлементыФормулы.ВсеЭлементы[ОписаниеЭлемента.Ключ]; - ПрименятьФорматирование = Операнд = Выражение; - Прервать; - КонецЦикла; + КонецЦикла; + КонецЕсли; КонецЕсли; Для Каждого ОписаниеЭлемента Из ЭлементыФормулы.ОперандыИФункции Цикл @@ -4757,6 +5531,10 @@ КоллекцияДанных = ДанныеПечати; Если Не ЭтоФункция Тогда + Если СтрНайти("И,ИЛИ,НЕ,ИСТИНА,ЛОЖЬ", ВРег(Операнд)) Тогда + Продолжить; + КонецЕсли; + Значение = КоллекцияДанных[ОчиститьКвадратныеСкобки(Операнд) + "." + СтрРазделить(КодЯзыка, "_")[0]]; Если Не ЗначениеЗаполнено(Значение) Тогда Значение = КоллекцияДанных[ОчиститьКвадратныеСкобки(Операнд)]; @@ -4785,7 +5563,7 @@ Попытка Результат = ОбщегоНазначения.ВычислитьВБезопасномРежиме(Выражение, Параметры); Исключение - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); ОбщегоНазначения.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Выражение ""%1"" содержит ошибки: |%2'"), ИсходноеВыражение, ТекстОшибки)); Результат = ""; @@ -4795,6 +5573,45 @@ КонецФункции +Процедура ВыделитьИмяКолонкиТабличнойЧасти(Выражение, ЭлементыФормулы) + ФункцииСРазделениемПараметров = СтрРазделить("УправлениеПечатью_СуммаПоКолонке,УправлениеПечатью_КоличествоСтрок,УправлениеПечатью_Максимум,УправлениеПечатью_Минимум,УправлениеПечатью_Среднее",",", Ложь); + ФункцияНайдена = Ложь; + Для Каждого ИмяФункции Из ФункцииСРазделениемПараметров Цикл + Если СтрНайти(Выражение, ИмяФункции) Тогда + ФункцияНайдена = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + + Если ФункцияНайдена Тогда + Результат = Новый Массив; + ВсеЭлементыВыражения = ЭлементыФормулы.ВсеЭлементы; + Для Индекс = 0 По ВсеЭлементыВыражения.ВГраница() Цикл + Элемент = ВсеЭлементыВыражения[Индекс]; + Результат.Добавить(Элемент); + Если СтрНачинаетсяС(Элемент, "УправлениеПечатью_") Тогда + Результат.Добавить(ВсеЭлементыВыражения[Индекс+1]); + МассивИменПараметра = СтрРазделить(ВсеЭлементыВыражения[Индекс+2], ".", Ложь); + Результат.Добавить(МассивИменПараметра[0]); + Результат.Добавить(","); + Если МассивИменПараметра.Количество() = 2 Тогда + Результат.Добавить(""""); + ИмяКолонки = МассивИменПараметра[1]; + Для Позиция = 1 По СтрДлина(ИмяКолонки) Цикл + Результат.Добавить(Сред(ИмяКолонки, Позиция, 1)); + КонецЦикла; + Результат.Добавить(""""); + КонецЕсли; + Результат.Добавить(ВсеЭлементыВыражения[Индекс+3]); + Индекс = Индекс + 3; + КонецЕсли; + КонецЦикла; + ЭлементыФормулы.ВсеЭлементы = Результат; + КонецЕсли; + +КонецПроцедуры + Функция ОчиститьКвадратныеСкобки(Строка) Если СтрНачинаетсяС(Строка, "[") И СтрЗаканчиваетсяНа(Строка, "]") Тогда @@ -5001,7 +5818,7 @@ КонецФункции -Функция КоличествоСтрок(Таблица) Экспорт +Функция КоличествоСтрок(Таблица, ИмяКолонки = Неопределено) Экспорт Если ТипЗнч(Таблица) = Тип("Соответствие") Тогда Возврат Таблица.Количество(); @@ -5011,6 +5828,78 @@ КонецФункции +Функция СуммаПоКолонке(Таблица, ИмяКолонки = Неопределено) Экспорт // АПК:299 - обработчик функций конструктора формул + + Если ТипЗнч(Таблица) = Тип("Соответствие") Тогда + Значение = 0; + ТипЧисло = Новый ОписаниеТипов("Число"); + Для Каждого СоответствиеСтроки Из Таблица Цикл + СтрокаТаблицы = СоответствиеСтроки.Значение; + Значение = Значение + ТипЧисло.ПривестиЗначение(СтрокаТаблицы[ИмяКолонки]); + КонецЦикла; + + Возврат Значение; + КонецЕсли; + + ВызватьИсключение НСтр("ru = 'Неверно указана колонка таблицы'"); + +КонецФункции + +Функция МаксимумПоКолонке(Таблица, ИмяКолонки = Неопределено) Экспорт // АПК:299 - обработчик функций конструктора формул + + Если ТипЗнч(Таблица) = Тип("Соответствие") Тогда + Значение = Неопределено; + ТипЧисло = Новый ОписаниеТипов("Число"); + Для Каждого СоответствиеСтроки Из Таблица Цикл + СтрокаТаблицы = СоответствиеСтроки.Значение; + ЗначениеСтроки = ТипЧисло.ПривестиЗначение(СтрокаТаблицы[ИмяКолонки]); + Значение = ?(Значение = Неопределено, ЗначениеСтроки, Значение); + Значение = Макс(Значение, ЗначениеСтроки); + КонецЦикла; + + Возврат Значение; + КонецЕсли; + + ВызватьИсключение НСтр("ru = 'Неверно указана колонка таблицы'"); + +КонецФункции + +Функция МинимумПоКолонке(Таблица, ИмяКолонки = Неопределено) Экспорт // АПК:299 - обработчик функций конструктора формул + + Если ТипЗнч(Таблица) = Тип("Соответствие") Тогда + Значение = Неопределено; + ТипЧисло = Новый ОписаниеТипов("Число"); + Для Каждого СоответствиеСтроки Из Таблица Цикл + СтрокаТаблицы = СоответствиеСтроки.Значение; + ЗначениеСтроки = ТипЧисло.ПривестиЗначение(СтрокаТаблицы[ИмяКолонки]); + Значение = ?(Значение = Неопределено, ЗначениеСтроки, Значение); + Значение = Мин(Значение, ЗначениеСтроки); + КонецЦикла; + + Возврат Значение; + КонецЕсли; + + ВызватьИсключение НСтр("ru = 'Неверно указана колонка таблицы'"); + +КонецФункции + +Функция СреднееПоКолонке(Таблица, ИмяКолонки = Неопределено) Экспорт // АПК:299 - обработчик функций конструктора формул + + Если ТипЗнч(Таблица) = Тип("Соответствие") Тогда + Значение = 0; + ТипЧисло = Новый ОписаниеТипов("Число"); + Для Каждого СоответствиеСтроки Из Таблица Цикл + СтрокаТаблицы = СоответствиеСтроки.Значение; + Значение = Значение + ТипЧисло.ПривестиЗначение(СтрокаТаблицы[ИмяКолонки]); + КонецЦикла; + + Возврат ?(Таблица.Количество(), Значение/Таблица.Количество(), 0); + КонецЕсли; + + ВызватьИсключение НСтр("ru = 'Неверно указана колонка таблицы'"); + +КонецФункции + // Возвращаемое значение: // см. КонструкторФормулСлужебный.ОписаниеСписковПолей // @@ -5050,16 +5939,17 @@ // Параметры: // ИмяИсточникаПолей - Строка // ИсточникиДоступныхПолей - ТаблицаЗначений +// УникальныйИдентификаторФормы - УникальныйИдентификатор // -Процедура ПриОпределенииИсточниковДоступныхПолей(ИмяИсточникаПолей, ИсточникиДоступныхПолей) Экспорт +Процедура ПриОпределенииИсточниковДоступныхПолей(ИмяИсточникаПолей, ТипИсточникаПолей, ИсточникиДоступныхПолей, УникальныйИдентификаторФормы) Экспорт - СхемыКомпоновкиДанных = СхемыКомпоновкиДанныхИсточникаПолей(ИмяИсточникаПолей); + СхемыКомпоновкиДанных = СхемыКомпоновкиДанныхИсточникаПолей(ИмяИсточникаПолей, , ТипИсточникаПолей); Для Каждого Элемент Из СхемыКомпоновкиДанных Цикл СхемаКомпоновкиДанных = Элемент.Значение; ИдентификаторСхемыКомпоновкиДанных = Элемент.Представление; ИсточникДоступныхПолей = ИсточникиДоступныхПолей.Добавить(); ИсточникДоступныхПолей.ИсточникДанных = ИмяИсточникаПолей; - ИсточникДоступныхПолей.СхемаКомпоновкиДанных = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных); + ИсточникДоступныхПолей.СхемаКомпоновкиДанных = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификаторФормы); ИсточникДоступныхПолей.ИдентификаторСхемыКомпоновкиДанных = ИдентификаторСхемыКомпоновкиДанных; ИсточникДоступныхПолей.КоллекцияПолей = КонструкторФормул.КоллекцияПолей(СхемаКомпоновкиДанных); ИсточникДоступныхПолей.Замещать = Истина; @@ -5067,20 +5957,35 @@ КонецПроцедуры -Функция СхемыКомпоновкиДанныхИсточникаПолей(ИмяИсточникаПолей, ВерхнийУровень = Ложь) +Функция СхемыКомпоновкиДанныхИсточникаПолей(ИмяИсточникаПолей, ДобавитьОбщиеРеквизиты = Ложь, ТипИсточникаПолей = Неопределено) ИсточникиПолей = Новый СписокЗначений; - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяИсточникаПолей); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяИсточникаПолей); Если ОбъектМетаданных <> Неопределено Тогда Если ОбъектМетаданных.Макеты.Найти("ДанныеПечати") <> Неопределено Тогда МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()); СхемаКомпоновкиДанных = МенеджерОбъекта.ПолучитьМакет("ДанныеПечати"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрефиксацияОбъектов") Тогда + МодульПрефиксацияОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("ПрефиксацияОбъектовСлужебный"); + МодульПрефиксацияОбъектовСлужебный.ДобавитьРасширениеПоляНомер(СхемаКомпоновкиДанных); + КонецЕсли; + ИсточникиПолей.Добавить(СхемаКомпоновкиДанных, ОбъектМетаданных.ПолноеИмя()); Иначе ТекстЗапроса = ТекстЗапроса(ОбъектМетаданных.ПолноеИмя()); СхемаКомпоновкиДанных= СхемаКомпоновкиДанных(ТекстЗапроса); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрефиксацияОбъектов") Тогда + МодульПрефиксацияОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("ПрефиксацияОбъектовСлужебный"); + МодульПрефиксацияОбъектовСлужебный.ДобавитьРасширениеПоляНомер(СхемаКомпоновкиДанных); + КонецЕсли; + ИсточникиПолей.Добавить(СхемаКомпоновкиДанных, ОбъектМетаданных.ПолноеИмя()); + + Если ОбъектМетаданных.Макеты.Найти("ДополнительныеДанныеПечати") <> Неопределено Тогда + МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()); + СхемаКомпоновкиДанных = МенеджерОбъекта.ПолучитьМакет("ДополнительныеДанныеПечати"); + ИсточникиПолей.Добавить(СхемаКомпоновкиДанных, ОбъектМетаданных.ПолноеИмя()); + КонецЕсли; КонецЕсли; - ИсточникиПолей.Добавить(СхемаКомпоновкиДанных, ОбъектМетаданных.ПолноеИмя()); СхемаКомпоновкиДанных = СхемаКомпоновкиДанныхКонтактнойИнформации(ОбъектМетаданных.ПолноеИмя()); Если СхемаКомпоновкиДанных <> Неопределено Тогда @@ -5094,7 +5999,7 @@ КонецЕсли; - Если ВерхнийУровень Тогда + Если ДобавитьОбщиеРеквизиты Тогда ИсточникиПолей.Добавить(ПолучитьОбщийМакет("ДанныеПечатиОбщиеРеквизиты"), "ОбщиеРеквизиты"); КонецЕсли; @@ -5102,6 +6007,14 @@ ИсточникиПолей.Добавить(ПолучитьОбщийМакет("ДанныеПечатиРегистрСимволов"), "ДанныеПечатиРегистрСимволов"); КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда + Если ТипИсточникаПолей = Метаданные.ОпределяемыеТипы.ДенежнаяСуммаЛюбогоЗнака.Тип + Или ТипИсточникаПолей = Метаданные.ОпределяемыеТипы.ДенежнаяСуммаНеотрицательная.Тип Тогда + МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют"); + МодульРаботаСКурсамиВалют.ПодключитьИсточникДанныхПечатиЧислоПрописью(ИсточникиПолей); + КонецЕсли; + КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); МодульУправлениеПечатьюМультиязычность.ПриОпределенииИсточниковДанныхПечати(ИмяИсточникаПолей, ИсточникиПолей); @@ -5138,6 +6051,7 @@ Возврат; КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); МодульУправлениеПечатьюМультиязычность.ПриПодготовкеДанныхПечати( @@ -5199,7 +6113,7 @@ ОбъектыМетаданных = Новый Массив; Для Каждого ИмяОбъекта Из СтрРазделить(ТипыИзменяемыхОбъектов, ",", Ложь) Цикл - ОбъектыМетаданных.Добавить(Метаданные.НайтиПоПолномуИмени(ИмяОбъекта)); + ОбъектыМетаданных.Добавить(ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъекта)); КонецЦикла; СтруктураОбъектов = ОбщиеРеквизитыОбъектов(ТипыИзменяемыхОбъектов); @@ -5254,7 +6168,7 @@ ОбъектыМетаданных = Новый Массив; Для Каждого ИмяОбъекта Из СтрРазделить(ТипыОбъектов, ",", Ложь) Цикл - ОбъектыМетаданных.Добавить(Метаданные.НайтиПоПолномуИмени(ИмяОбъекта)); + ОбъектыМетаданных.Добавить(ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъекта)); КонецЦикла; Результат = Новый Структура; @@ -5304,14 +6218,23 @@ КонецФункции - Функция ПересечениеМножеств(Множество1, Множество2) Экспорт - Результат = Новый Массив; + Индекс = Новый Соответствие; + Для Каждого Элемент Из Множество1 Цикл + Индекс[Элемент] = Ложь; + КонецЦикла; Для Каждого Элемент Из Множество2 Цикл - Индекс = Множество1.Найти(Элемент); - Если Индекс <> Неопределено Тогда + Если Индекс[Элемент] <> Неопределено Тогда + Индекс[Элемент] = Истина; + КонецЕсли; + КонецЦикла; + + Результат = Новый Массив; + + Для Каждого Элемент Из Множество1 Цикл + Если Индекс[Элемент] = Истина Тогда Результат.Добавить(Элемент); КонецЕсли; КонецЦикла; @@ -5378,9 +6301,11 @@ | МакетыПечатныхФорм.Представление КАК Представление, | МакетыПечатныхФорм.УсловиеВидимости КАК УсловияВидимости |ИЗ - | Справочник.МакетыПечатныхФорм КАК МакетыПечатныхФорм + | Справочник.МакетыПечатныхФорм.ИсточникиДанных КАК МакетыПечатныхФормИсточникиДанных + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.МакетыПечатныхФорм КАК МакетыПечатныхФорм + | ПО МакетыПечатныхФормИсточникиДанных.Ссылка = МакетыПечатныхФорм.Ссылка |ГДЕ - | МакетыПечатныхФорм.ИсточникДанных = &Владелец + | МакетыПечатныхФормИсточникиДанных.ИсточникДанных = &Владелец | И МакетыПечатныхФорм.Используется | И НЕ МакетыПечатныхФорм.ПометкаУдаления"; @@ -5491,7 +6416,7 @@ КоллекцияМакетов = Метаданные.ОбщиеМакеты; Если Не ЭтоОбщийМакет Тогда - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъекта); Если ОбъектМетаданных = Неопределено Тогда ВызватьИсключение ТекстОшибки; КонецЕсли; @@ -5565,6 +6490,10 @@ Поле.ТипЗначения = Новый ОписаниеТипов("Строка"); КонецЦикла; + Если СписокПолей.Количество() = 1 Тогда + Возврат Неопределено; + КонецЕсли; + Возврат СхемаКомпоновкиДанныхПечати(СписокПолей); КонецФункции @@ -5595,6 +6524,11 @@ КонецЕсли; Свойства = СписокПолей.ВыгрузитьКолонку("Свойство"); + + Если Свойства.Количество() = 0 Тогда + Возврат Неопределено; + КонецЕсли; + ИдентификаторыДляФормул = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(Свойства, "ИдентификаторДляФормул"); Для Каждого СтрокаТаблицы Из СписокПолей Цикл @@ -5786,4 +6720,325 @@ КонецФункции +Процедура СобратьСтрокиУсловныхОбластей(ДеревоXML, Гиперссылки) + ТаблицаСортировки = Новый ТаблицаЗначений(); + ТаблицаСортировки.Колонки.Добавить("Ключ"); + ТаблицаСортировки.Колонки.Добавить("Значение"); + ТаблицаСортировки.Колонки.Добавить("Длина"); + + ПолныйТекст = ДеревоXML.Строки[0].ПолныйТекст; + ИмяТега = ИмяТегаУсловие(); + + + МассивФрагментовТекста = СтрРазделить(ПолныйТекст, "{",); + Для Каждого ФрагментТекста Из МассивФрагментовТекста Цикл + ПозицияИмениТега = СтрНайти(ФрагментТекста, ИмяТега); + Если ПозицияИмениТега И ПозицияИмениТега < 3 Тогда + МассивФрагментовСтрок = СтрРазделить(ФрагментТекста, "}"); + + НоваяСтрока = ТаблицаСортировки.Добавить(); + НоваяСтрока.Ключ = "{"+МассивФрагментовСтрок[0]+"}"; + НоваяСтрока.Длина = НоваяСтрока.Ключ; + НоваяСтрока.Значение = НоваяСтрока.Ключ; + КонецЕсли; + КонецЦикла; + + ТаблицаСортировки.Сортировать("Длина Убыв"); + + Для Каждого СоответствиеЗамены Из ТаблицаСортировки Цикл + МассивУзлов = Новый Массив; + УправлениеПечатьюСлужебный.НайтиУзлы(ДеревоXML, СоответствиеЗамены.Ключ, МассивУзлов); + + Для Каждого Узел Из МассивУзлов Цикл + Если Узел.Строки.Количество() Тогда + СобратьСтроки(Узел); + КонецЕсли; + КонецЦикла; + КонецЦикла; + УправлениеПечатьюСлужебный.ВосстановитьПолныйТекст(ДеревоXML, Гиперссылки); +КонецПроцедуры + +Функция СобратьСтроки(Узел, УзелСборки = Неопределено, УзлыСборки = Неопределено, Открытых = 0) + + Если Узел.ИмяТега = "w:t" Тогда + + МассивФрагментов = СтрРазделить(Узел.Текст, "[{", Истина); + ТекстУзла = Узел.Текст; + Отрывающихся = МассивФрагментов.ВГраница(); + Закрывающихся = 0; + + Для Каждого ФрагментНачала Из МассивФрагментов Цикл + ФрагментНачала = СтрРазделить(ФрагментНачала, "}]", истина); + Закрывающихся = Закрывающихся + ФрагментНачала.ВГраница(); + КонецЦикла; + + Если УзелСборки = Неопределено Тогда + Если Отрывающихся > 0 Тогда + УзелСборки = Узел; + УзелСборки.Текст =""; + Если УзлыСборки = Неопределено Тогда + УзлыСборки = Новый Массив(); + КонецЕсли; + УзлыСборки.Добавить(Узел); + КонецЕсли; + Иначе + Узел.Текст = ""; + КонецЕсли; + + Если УзелСборки = Неопределено Тогда + Узел.Текст = ТекстУзла; + Иначе + УзелСборки.Текст = УзелСборки.Текст + ТекстУзла; + КонецЕсли; + + Если УзелСборки <> Неопределено И Открытых + Отрывающихся - Закрывающихся = 0 Тогда + УзелСборки = Неопределено; + КонецЕсли; + + Открытых = Открытых + Отрывающихся - Закрывающихся; + Иначе + Для Каждого СтрокаУзла Из Узел.Строки Цикл + СобратьСтроки(СтрокаУзла, УзелСборки, УзлыСборки, Открытых); + КонецЦикла; + КонецЕсли; + Возврат УзлыСборки; +КонецФункции + +Функция КопияДереваМакета(ДеревоМакета) + ДеревоМакетаДляЗаполнения = ОбщегоНазначения.СкопироватьРекурсивно(ДеревоМакета); + КаталогПриемник = ФайловаяСистема.СоздатьВременныйКаталог(); + СтруктураДокумента = ДеревоМакетаДляЗаполнения.СтруктураДокумента; + КаталогКартинок = СтруктураДокумента.КаталогКартинок; + КаталогКартинок = СтрЗаменить(КаталогКартинок, ДеревоМакетаДляЗаполнения.ИмяКаталога, КаталогПриемник); + КаталогИсточник = ДеревоМакетаДляЗаполнения.ИмяКаталога; + ДеревоМакетаДляЗаполнения.ИмяКаталога = КаталогПриемник; + СтруктураДокумента.КаталогКартинок = КаталогКартинок; + УправлениеПечатьюСлужебный.КопироватьСодержимоеКаталога(КаталогИсточник, КаталогПриемник); + ДеревоМакетаДляЗаполнения.Вставить("ОбластиДляВывода", Новый Массив); + Возврат ДеревоМакетаДляЗаполнения; +КонецФункции + +Функция ПолучитьЗначениеПараметровОбъекта(ДанныеПечати, ОбъектПечати, ДеревоМакета, КодЯзыка, ПараметрыПечати, ПараметрыТекста) + + ДанныеОбъекта = ДанныеПечати[ОбъектПечати]; + НастройкиФорматаПолей = ДанныеПечати["НастройкиФорматаПолей"]; + СтруктураДокумента = ДеревоМакета.СтруктураДокумента; + + СоответствиеСтроки = Новый Соответствие(); + Для Каждого ПараметрОбласти Из ПараметрыТекста Цикл + Представление = УстановитьПредставлениеКартинку(КодЯзыка, ПараметрОбласти, НастройкиФорматаПолей, ДанныеОбъекта, ПараметрыПечати); + СоответствиеСтроки.Вставить(ПараметрОбласти, Представление); + КонецЦикла; + Возврат СоответствиеСтроки; + +КонецФункции + +Функция ПолучитьДанныеОбласти(ДанныеПечати, ОбъектПечати, Область, ДеревоМакета, КодЯзыка, ПараметрыПечати) + + НастройкиФорматаПолей = ДанныеПечати["НастройкиФорматаПолей"]; + Результат = Новый Массив(); + + МассивПараметровОбласти = Область.Параметры; + + Ссылка = ОбъектПечати; + ИмяТаблицы = Область.Коллекция; + + СоответствиеСтрок = ДанныеПечати[Ссылка][ИмяТаблицы]; + Для НомерСтрокиТабличнойЧасти = 1 По СоответствиеСтрок.Количество() Цикл + ИсточникДанных = Новый Соответствие; + ОбщегоНазначенияКлиентСервер.ДополнитьСоответствие(ИсточникДанных, ДанныеПечати[Ссылка]); + Если ЗначениеЗаполнено(ИмяТаблицы) Тогда + ДанныеСтрокиТабличнойЧасти = ДанныеПечати[Ссылка][ИмяТаблицы][НомерСтрокиТабличнойЧасти]; + Для Каждого КлючИЗначение Из ДанныеСтрокиТабличнойЧасти Цикл + ИсточникДанных[ИмяТаблицы + "." + КлючИЗначение.Ключ] = КлючИЗначение.Значение; + КонецЦикла; + КонецЕсли; + + СоответствиеСтроки = Новый Соответствие(); + Для Каждого ПараметрОбласти Из МассивПараметровОбласти Цикл + + Представление = УстановитьПредставлениеКартинку(КодЯзыка, ПараметрОбласти, НастройкиФорматаПолей, ИсточникДанных, ПараметрыПечати); + СоответствиеСтроки.Вставить(ПараметрОбласти, Представление); + + КонецЦикла; + + Результат.Добавить(СоответствиеСтроки); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция УстановитьПредставлениеКартинку(КодЯзыка, ПараметрОбласти, НастройкиФорматаПолей, Источник, ПараметрыПечати) + + ПараметрыТекста = НайтиПараметрыВТексте(Строка(ПараметрОбласти)); + ЗначенияПараметров = ЗначенияПараметров(ПараметрыТекста, Источник, НастройкиФорматаПолей, КодЯзыка); + Представление = ПараметрОбласти; + ЗначениеПервогоПараметра = ЗначенияПараметров[ПараметрыТекста[0]]; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + ТипПрисоединенныйФайл = МодульРаботаСФайламиСлужебный.ТипыПрисоединенныхФайлов(); + Иначе + ТипПрисоединенныйФайл = Новый ОписаниеТипов(); + КонецЕсли; + + Если ЗначениеПервогоПараметра <> Неопределено И ТипПрисоединенныйФайл.СодержитТип(ТипЗнч(ЗначениеПервогоПараметра)) Тогда + Если ЗначениеЗаполнено(ЗначениеПервогоПараметра) Тогда + Представление = Новый Структура("Ширина,Высота,АдресКартинки"); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); + + ТипыПрисоединенныхФайлов = МодульРаботаСФайламиСлужебный.ТипыПрисоединенныхФайлов(); + Если ЗначениеЗаполнено(ЗначениеПервогоПараметра) И ТипыПрисоединенныхФайлов.СодержитТип(ТипЗнч(ЗначениеПервогоПараметра)) Тогда + ДвоичныеДанные = МодульРаботаСФайлами.ДвоичныеДанныеФайла(ЗначениеПервогоПараметра, Ложь); + Представление.АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, Новый УникальныйИдентификатор()); + КонецЕсли; + КонецЕсли; + + ВыводитьПодписьИПечать = Неопределено; + ПараметрыПечати.Свойство("ПодписьИПечать", ВыводитьПодписьИПечать); + + Если СтрНайти(ПараметрыТекста[0], "Подпись") Тогда + Если ВыводитьПодписьИПечать = Ложь Тогда + Представление.АдресКартинки = ""; + КонецЕсли; + Представление.Ширина = 30; + Представление.Высота = 10; + ИначеЕсли СтрНайти(ПараметрыТекста[0], "Печать") Тогда + Если ВыводитьПодписьИПечать = Ложь Тогда + Представление.АдресКартинки = ""; + КонецЕсли; + Представление.Ширина = 40; + Представление.Высота = 40; + КонецЕсли; + Иначе + Представление = ""; + КонецЕсли; + ИначеЕсли ТипЗнч(ЗначениеПервогоПараметра) = Тип("Картинка") Тогда + Если ЗначениеЗаполнено(ЗначениеПервогоПараметра) Тогда + Представление = Новый Структура("Ширина,Высота,АдресКартинки"); + ДвоичныеДанные = ЗначениеПервогоПараметра.ПолучитьДвоичныеДанные(); + Представление.АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, Новый УникальныйИдентификатор()); + КонецЕсли; + Иначе + Представление = ЗаменитьВСтроке(ПараметрОбласти, ЗначенияПараметров); + КонецЕсли; + + Возврат Представление; + +КонецФункции + +Процедура ДобавитьОператорВГруппу(Группа, Идентификатор, Знач Представление = Неопределено, Тип = Неопределено, ЭтоФункция = Ложь) + + Если Представление = Неопределено Тогда + Представление = Идентификатор; + КонецЕсли; + + Оператор = Группа.Строки.Добавить(); + Оператор.Идентификатор = Идентификатор; + Если СтрРазделить(Представление, " ").Количество() > 1 Тогда + Оператор.Представление = СтрЗаменить(ТРег(Представление), " ", ""); + Иначе + Оператор.Представление = Представление; + КонецЕсли; + Оператор.ТипЗначения = Тип; + Оператор.Картинка = БиблиотекаКартинок.Пустая; + Оператор.ЭтоФункция = ЭтоФункция; + +КонецПроцедуры + +// Установить параметры в дереве. +// +// Параметры: +// СоответствиеЗамен - Соответствие из КлючИЗначение - содержит правила перестановки. +// ДеревоXML - см. УправлениеПечатьюСлужебный.ПрочитатьXMLВДерево +// ДеревоМакета - см. ИнициализироватьМакетОфисногоДокументаСКД +// ДобавлятьСвязи - Булево - добавлять связи +// +Процедура УстановитьПараметрыВДереве(Знач СоответствиеЗамен, ДеревоXML, ДеревоМакета = Неопределено, ДобавлятьСвязи = Истина) + + ТаблицаСортировки = Новый ТаблицаЗначений(); + ТаблицаСортировки.Колонки.Добавить("Ключ"); + ТаблицаСортировки.Колонки.Добавить("Значение"); + ТаблицаСортировки.Колонки.Добавить("Длина"); + Для Каждого СоответствиеЗамены Из СоответствиеЗамен Цикл + НоваяСтрока = ТаблицаСортировки.Добавить(); + НоваяСтрока.Ключ = СоответствиеЗамены.Ключ; + НоваяСтрока.Длина = СтрДлина(СоответствиеЗамены.Ключ); + НоваяСтрока.Значение = СоответствиеЗамены.Значение; + КонецЦикла; + + ТаблицаСортировки.Сортировать("Длина Убыв"); + + Для Каждого СоответствиеЗамены Из ТаблицаСортировки Цикл + МассивУзлов = Новый Массив; + УправлениеПечатьюСлужебный.НайтиУзлы(ДеревоXML, СоответствиеЗамены.Ключ, МассивУзлов); + + Для Каждого Узел Из МассивУзлов Цикл + Если Узел.Строки.Количество() = 0 ИЛИ Узел.ИмяТега = "w:hyperlink" Тогда + УправлениеПечатьюСлужебный.УстановитьЗначениеВДокумент(Узел, СоответствиеЗамены, ДеревоМакета, ДобавлятьСвязи); + Иначе + МассивСобранныхУзлов = СобратьСтроки(Узел); + Если МассивСобранныхУзлов = Неопределено Тогда + Продолжить; + КонецЕсли; + + Для Каждого СобранныйУзел Из МассивСобранныхУзлов Цикл + УправлениеПечатьюСлужебный.УстановитьЗначениеВДокумент(СобранныйУзел, СоответствиеЗамены, ДеревоМакета, ДобавлятьСвязи); + КонецЦикла; + КонецЕсли; + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +// Параметры: +// КоллекцияПолей - см. КонструкторФормул.КоллекцияПолей +// +Функция ПоляКоллекции(КоллекцияПолей) + + Результат = Новый Массив; + + Для Каждого ОписаниеПоля Из КоллекцияПолей.Элементы Цикл + Результат.Добавить(ОписаниеПоля.Поле); + Если ОписаниеПоля.Папка Или ОписаниеПоля.Таблица Тогда + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, ПоляКоллекции(ОписаниеПоля)); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция КоллекцияПолейОбщиеРеквизиты() + + Возврат КонструкторФормул.КоллекцияПолей(ПолучитьОбщийМакет("ДанныеПечатиОбщиеРеквизиты")); + +КонецФункции + +Функция ПолучитьПропущенногоРодителя(СтрокаДобавления, ДеревоДляВывода) + Родители = Новый Массив; + НайтиПропущенныхРодителей(Родители, ДеревоДляВывода, СтрокаДобавления); + РодительДобавления = ДеревоДляВывода.Строки.Найти(Родители[0].Родитель.Индекс, "Индекс", Истина); + ИндексДобавления = Родители[0].Родитель.Строки.Индекс(Родители[0]); + + Для Каждого Родитель Из Родители Цикл + РодительДобавления = УправлениеПечатьюСлужебный.СкопироватьУзел(РодительДобавления, ИндексДобавления, Родитель); + ИндексДобавления = 0; + КонецЦикла; + + Возврат РодительДобавления; +КонецФункции + +Процедура НайтиПропущенныхРодителей(Родители, ДеревоДляВывода, СтрокаДобавления) + Если ДеревоДляВывода.Строки.Найти(СтрокаДобавления.Родитель.Индекс, "Индекс", Истина) = Неопределено Тогда + Родители.Вставить(0, СтрокаДобавления.Родитель); + НайтиПропущенныхРодителей(Родители, ДеревоДляВывода, СтрокаДобавления.Родитель); + КонецЕсли; +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl index 15d668299..1e0ae4d0e 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl @@ -39,7 +39,7 @@ COMОбъект = Новый COMОбъект("Word.Application"); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); НеУдалосьСформироватьПечатнуюФорму(ИнформацияОбОшибке()); КонецПопытки; @@ -50,7 +50,7 @@ COMОбъект.Quit(0); COMОбъект = 0; ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); НеУдалосьСформироватьПечатнуюФорму(ИнформацияОбОшибке()); КонецПопытки; @@ -101,7 +101,7 @@ COMОбъект = Новый COMОбъект("Word.Application"); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); НеУдалосьСформироватьПечатнуюФорму(ИнформацияОбОшибке()); КонецПопытки; @@ -126,9 +126,9 @@ COMОбъект = 0; УдалитьФайлы(ИмяВременногоФайла); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); - ВызватьИсключение(НСтр("ru = 'Ошибка при открытии файла шаблона.'") + Символы.ПС - + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); + ВызватьИсключение(НСтр("ru = 'Не удалось открыть файл шаблона по причине:'") + Символы.ПС + + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Handler.Вставить("COMСоединение", COMОбъект); @@ -620,7 +620,7 @@ ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось сформировать печатную форму: %1. |%2'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке), ТекстУточнения); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), ТекстУточнения); ВызватьИсключение ТекстИсключения; КонецПроцедуры diff --git a/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/УправлениеПечатьюMSWordКлиент.mdo b/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/УправлениеПечатьюMSWordКлиент.mdo index 8cdff9fa0..79d0a5841 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/УправлениеПечатьюMSWordКлиент.mdo +++ b/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/УправлениеПечатьюMSWordКлиент.mdo @@ -5,7 +5,7 @@ <key>ru</key> <value>Управление печатью MS Word клиент</value> </synonym> - <comment>АПК:566 АПК:1353 устаревший код, исправление не требуется.</comment> + <comment>АПК:566 АПК:1353 АПК:441 устаревший код, исправление не требуется.</comment> <clientManagedApplication>true</clientManagedApplication> <clientOrdinaryApplication>true</clientOrdinaryApplication> </mdclass:CommonModule> diff --git a/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl index a4c6677c8..80caf715e 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl @@ -35,7 +35,7 @@ Исключение ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка при связи с сервисом ""%1"".'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), ИмяОбъекта) - + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ТекстОшибки, , Истина); @@ -49,7 +49,7 @@ Исключение ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка при запуске сервиса ""%1"".'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), ИмяОбъекта) - + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ТекстОшибки,,Истина); @@ -110,7 +110,7 @@ Исключение ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка при связи с сервисом ""%1"".'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), ИмяОбъекта) - + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ТекстОшибки, , Истина); @@ -123,7 +123,7 @@ Исключение ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка при запуске сервиса ""%1"".'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), ИмяОбъекта) - + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ТекстОшибки,,Истина); @@ -542,7 +542,7 @@ ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось сформировать печатную форму: %1. |%2'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке), ТекстУточнения); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), ТекстУточнения); ВызватьИсключение ТекстИсключения; КонецПроцедуры diff --git a/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/УправлениеПечатьюOOWriterКлиент.mdo b/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/УправлениеПечатьюOOWriterКлиент.mdo index d0b4f4029..b3310d92d 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/УправлениеПечатьюOOWriterКлиент.mdo +++ b/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/УправлениеПечатьюOOWriterКлиент.mdo @@ -5,7 +5,7 @@ <key>ru</key> <value>Управление печатью OpenOffice.org Writer клиент</value> </synonym> - <comment>АПК:566 АПК:1353 устаревший код, исправление не требуется.</comment> + <comment>АПК:566 АПК:1353 АПК:441 устаревший код, исправление не требуется.</comment> <clientManagedApplication>true</clientManagedApplication> <clientOrdinaryApplication>true</clientOrdinaryApplication> </mdclass:CommonModule> diff --git a/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl index a6445bcfe..4e0836f99 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl @@ -304,7 +304,7 @@ Возврат Результат; КонецФункции -// Используется для улучшения документирующих комментариев. Не предназначена для использования в других целях. +// Определяет тип параметра ПараметрыПечати в обработчиках команд печати. // // Возвращаемое значение: // Структура: @@ -706,7 +706,7 @@ ПечатнаяФорма.ПоследняяВыведеннаяОбласть = ОписаниеОбласти; КонецЕсли; Исключение - СообщениеОбОшибке = СокрЛП(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + СообщениеОбОшибке = СокрЛП(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); СообщениеОбОшибке = ?(Прав(СообщениеОбОшибке, 1) = ".", СообщениеОбОшибке, СообщениеОбОшибке + "."); СообщениеОбОшибке = СообщениеОбОшибке + " " + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при попытке вывести область ""%1"" из макета.'"), ОбластьМакета.ОписаниеОбласти.ИмяОбласти); @@ -870,10 +870,15 @@ Параметры = Новый Структура; Параметры.Вставить("Форма", Форма); - Параметры.Вставить("ВыбранныйЯзык", Сред(Команда.Имя, СтрДлина("Язык_") + 1)); + МассивСловЯзыка = СтрРазделить(Команда.Имя, "_", Ложь); + МассивСловЯзыка.Удалить(0); + ВыбранныйЯзык = СтрСоединить(МассивСловЯзыка, "_"); + + Параметры.Вставить("ВыбранныйЯзык", ВыбранныйЯзык); КнопкаФормы = Форма.Элементы[Команда.Имя]; // КнопкаФормы - Параметры.Вставить("Заголовок", КнопкаФормы.Заголовок); + Параметры.Вставить("Заголовок", Форма.Элементы["Язык_"+ВыбранныйЯзык].Заголовок); + Параметры.Вставить("КнопкаФормы", КнопкаФормы); Если Форма.Модифицированность Тогда ОписаниеОповещения = Новый ОписаниеОповещения("ПриПереключенииЯзыка", ЭтотОбъект, Параметры); @@ -896,6 +901,61 @@ КонецФункции +// Возвращаемое значение: +// Структура: +// * ОписанияФайлов - Массив из Структура +// * ИмяКаталога - Строка +// * ОбработчикЗавершения - ОписаниеОповещения +// * Индекс - Число +// * Счетчик - Число +// * ИмяФайла - Строка +// +Функция ПараметрыПодготовкиИменФайлов(ОписанияФайлов, ИмяКаталога, ОбработчикЗавершения) Экспорт + + Результат = Новый Структура; + + Результат.Вставить("ОписанияФайлов", ОписанияФайлов); + Результат.Вставить("ИмяКаталога", ИмяКаталога); + Результат.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); + Результат.Вставить("Индекс", Неопределено); + Результат.Вставить("Счетчик", 1); + Результат.Вставить("ИмяФайла", ""); + + Возврат Результат; + +КонецФункции + +// Параметры: +// ПараметрыПодготовки - см. ПараметрыПодготовкиИменФайлов +// +Процедура ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки) Экспорт + + ОписанияФайлов = ПараметрыПодготовки.ОписанияФайлов; + + Если ПараметрыПодготовки.Индекс = Неопределено Тогда + Для Каждого ОписаниеФайла Из ОписанияФайлов Цикл + ОписаниеФайла.Представление = ПараметрыПодготовки.ИмяКаталога + ОписаниеФайла.Представление; + КонецЦикла; + ПараметрыПодготовки.Индекс = 0; + КонецЕсли; + + Если ПараметрыПодготовки.Индекс > ОписанияФайлов.ВГраница() Тогда + ВыполнитьОбработкуОповещения(ПараметрыПодготовки.ОбработчикЗавершения, ОписанияФайлов); + Возврат; + КонецЕсли; + + ОписаниеФайла = ОписанияФайлов[ПараметрыПодготовки.Индекс]; + Файл = Новый Файл(ОписаниеФайла.Представление); + Если ПараметрыПодготовки.Счетчик > 1 Тогда + Файл = Новый Файл(Файл.Путь + Файл.ИмяБезРасширения + " (" + ПараметрыПодготовки.Счетчик + ")" + Файл.Расширение); + КонецЕсли; + + ПараметрыПодготовки.ИмяФайла = Файл.Имя; + ОписаниеОповещения = Новый ОписаниеОповещения("ПриПроверкеСуществованияФайла", ЭтотОбъект, ПараметрыПодготовки); + Файл.НачатьПроверкуСуществования(ОписаниеОповещения); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -926,9 +986,60 @@ Форма = Параметры.Форма; // ФормаКлиентскогоПриложения - ВыбранныйЯзык = Параметры.ВыбранныйЯзык; Заголовок = Параметры.Заголовок; + Форма.Элементы.Язык.Заголовок = Заголовок; + КнопкаФормы = Параметры.КнопкаФормы; + + ЭтоФормаРедактирования = СтрНачинаетсяС(Форма.ИмяФормы, "ОбщаяФорма.Редактирование"); + + Если ЭтоФормаРедактирования Тогда + МакетСоздан = Форма.СохраненныеЯзыкиМакета.НайтиПоЗначению(Форма.ТекущийЯзык)<>Неопределено; + КонецЕсли; + + ПереключаемыйЯзык = Форма.ТекущийЯзык; Форма.ТекущийЯзык = ВыбранныйЯзык; - Форма.Элементы.Язык.Заголовок = Заголовок; + МенюЯзык = Форма.Элементы.Язык; + + Для Каждого КнопкаЯзыка Из МенюЯзык.ПодчиненныеЭлементы Цикл + Если ТипЗнч(КнопкаЯзыка) = Тип("КнопкаФормы") Тогда + КнопкаЯзыка.Пометка = Ложь; + Если КнопкаФормы.ИмяКоманды = "Добавить"+КнопкаЯзыка.ИмяКоманды Тогда + КнопкаЯзыка.Видимость = Истина; + КнопкаЯзыка.Пометка = Истина; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если КнопкаФормы.Родитель = МенюЯзык Тогда + КнопкаФормы.Пометка = Истина; + Иначе + КнопкаФормы.Видимость = Ложь; + КонецЕсли; + + Если ЭтоФормаРедактирования Тогда + + Если Не МакетСоздан Тогда + ДобавляемыеЯзыки = Форма.Элементы.ДобавляемыеЯзыки; + Для Каждого КнопкаЯзыка Из ДобавляемыеЯзыки.ПодчиненныеЭлементы Цикл + Если СтрЗаканчиваетсяНа(КнопкаЯзыка.Имя, ПереключаемыйЯзык) Тогда + КнопкаЯзыка.Видимость = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Для Каждого КнопкаЯзыка Из МенюЯзык.ПодчиненныеЭлементы Цикл + Если ТипЗнч(КнопкаЯзыка) = Тип("КнопкаФормы") Тогда + Если СтрЗаканчиваетсяНа(КнопкаЯзыка.Имя, ПереключаемыйЯзык) Тогда + КнопкаЯзыка.Видимость = Ложь; + КнопкаЯзыка.Пометка = Ложь; + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + КонецЕсли; + Форма.Модифицированность = Ложь; ОписаниеОповещения = Новый ОписаниеОповещения("Подключаемый_ПриПереключенииЯзыка", Форма); @@ -936,4 +1047,24 @@ КонецПроцедуры +// Параметры: +// Существует - Булево +// ПараметрыПодготовки - см. ПараметрыПодготовкиИменФайлов +// +Процедура ПриПроверкеСуществованияФайла(Существует, ПараметрыПодготовки) Экспорт + + Если Существует Тогда + ПараметрыПодготовки.Счетчик = ПараметрыПодготовки.Счетчик + 1; + Иначе + ОписаниеФайла = ПараметрыПодготовки.ОписанияФайлов[ПараметрыПодготовки.Индекс]; + ОписаниеФайла.Представление = ПараметрыПодготовки.ИмяФайла; + ПараметрыПодготовки.Счетчик = 0; + ПараметрыПодготовки.Индекс = ПараметрыПодготовки.Индекс + 1; + КонецЕсли; + + ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки); + +КонецПроцедуры + + #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеПечатьюКлиентСервер/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюКлиентСервер/Module.bsl index 347ce5a1c..c9cdbe82e 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюКлиентСервер/Module.bsl @@ -6,6 +6,14 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// +#Область СлужебныйПрограммныйИнтерфейс + +Функция ИмяТегаУсловие() Экспорт + Возврат НСтр("ru = 'v8 Условие'"); +КонецФункции + +#КонецОбласти + #Область СлужебныеПроцедурыИФункции Функция ИменаПолейКоллекцииПечатныхФорм() Экспорт diff --git a/SSL/src/CommonModules/УправлениеПечатьюМультиязычность/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюМультиязычность/Module.bsl index 630a2b1f3..d8aa59b63 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюМультиязычность/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюМультиязычность/Module.bsl @@ -19,6 +19,12 @@ КонецПроцедуры +Процедура ДобавитьЯзыкиПечатныхФорм(КодыЯзыков) Экспорт + + Справочники.ЯзыкиПечатныхФорм.ДобавитьЯзыки(КодыЯзыков); + +КонецПроцедуры + Функция ДоступныеЯзыки(СРегиональнымиНастройками = Ложь) Экспорт Возврат Справочники.ЯзыкиПечатныхФорм.ДоступныеЯзыки(СРегиональнымиНастройками); @@ -93,12 +99,12 @@ | РегистрСведений.ПользовательскиеМакетыПечати КАК ПользовательскиеМакетыПечати |ГДЕ | ПользовательскиеМакетыПечати.Объект = &Объект - | И ПользовательскиеМакетыПечати.ИмяМакета ПОДОБНО &ШаблонИмениМакета + | И ПользовательскиеМакетыПечати.ИмяМакета ПОДОБНО &ШаблонИмениМакета СПЕЦСИМВОЛ ""~"" | И ПользовательскиеМакетыПечати.Использование"; Запрос = Новый Запрос(ТекстЗапроса); Запрос.Параметры.Вставить("Объект", ИмяОбъекта); - Запрос.Параметры.Вставить("ШаблонИмениМакета", ИмяМакета + "_%"); + Запрос.Параметры.Вставить("ШаблонИмениМакета", ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(ИмяМакета) + "_%"); Выборка = Запрос.Выполнить().Выбрать(); НайденныеЯзыки = Новый Соответствие; @@ -122,7 +128,7 @@ КоллекцияМакетов = Метаданные.ОбщиеМакеты; Если Не ЭтоОбщийМакет Тогда - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъекта); Если ОбъектМетаданных = Неопределено Тогда ВызватьИсключение ТекстОшибки; КонецЕсли; @@ -235,10 +241,30 @@ Форма.ТекущийЯзык = ТекущийЯзык; ДоступныеЯзыки = ДоступныеЯзыки(ИспользоватьРегиональныеПредставленияЯзыков); - + + ЭтоФормаРедактирования = СтрНачинаетсяС(Форма.ИмяФормы, "ОбщаяФорма.Редактирование"); + ЭтоМобильныйКлиент = ОбщегоНазначения.ЭтоМобильныйКлиент(); Если Не ЭтоМобильныйКлиент Тогда - Элементы.Язык.Заголовок = ""; + + Если ЭтоФормаРедактирования Тогда + Элементы.Язык.Заголовок = ""; + Если ЗначениеЗаполнено(Форма.ИдентификаторМакета) Тогда + ЯзыкиМакета = ЯзыкиМакета(Форма.ИдентификаторМакета); + ИначеЕсли ЗначениеЗаполнено(Форма.ИдентификаторКопируемогоМакета) Тогда + ЯзыкиМакета = ЯзыкиМакета(Форма.ИдентификаторКопируемогоМакета); + Иначе + ЯзыкиМакета = Новый Массив; + ЯзыкиМакета.Добавить(ОбщегоНазначения.КодОсновногоЯзыка()); + КонецЕсли; + Форма.СохраненныеЯзыкиМакета.ЗагрузитьЗначения(ЯзыкиМакета); + ИначеЕсли СтрНачинаетсяС(Форма.ИмяФормы, "ОбщаяФорма.ПечатьДокументов") Тогда + Элементы.Язык.Заголовок = ""; + ЯзыкиМакета = Новый Массив(Новый ФиксированныйМассив(ДоступныеЯзыки)); + Иначе + Элементы.Язык.Заголовок = ""; + ЯзыкиМакета = Новый Массив; + КонецЕсли; КонецЕсли; Для Каждого КодЛокализации Из ДоступныеЯзыки Цикл @@ -256,11 +282,30 @@ Команда.Действие = "Подключаемый_ПереключитьЯзык"; Команда.Заголовок = ПредставлениеЯзыка; + МакетНаТекущемЯзыке = ЯзыкиМакета.Найти(КодЯзыка) <> Неопределено; + КнопкаФормы = Элементы.Добавить(Команда.Имя, Тип("КнопкаФормы"), Элементы.Язык); КнопкаФормы.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; + КнопкаФормы.Пометка = КодЯзыка = ТекущийЯзык; КнопкаФормы.ИмяКоманды = Команда.Имя; КнопкаФормы.Заголовок = ПредставлениеЯзыка; - КнопкаФормы.ТолькоВоВсехДействиях= ЭтоМобильныйКлиент; + КнопкаФормы.ПоложениеВКоманднойПанели = ?(ЭтоМобильныйКлиент, + ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю, ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели); + КнопкаФормы.Видимость = МакетНаТекущемЯзыке; + + Если ЭтоФормаРедактирования Тогда + Команда = Команды.Добавить("ДобавитьЯзык_" + КодЛокализации); + Команда.Действие = "Подключаемый_ПереключитьЯзык"; + Команда.Заголовок = НСтр("ru = 'Добавить:'") + " " + ПредставлениеЯзыка; + + КнопкаФормы = Элементы.Добавить(Команда.Имя, Тип("КнопкаФормы"), Элементы.ДобавляемыеЯзыки); + КнопкаФормы.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; + КнопкаФормы.ИмяКоманды = Команда.Имя; + КнопкаФормы.Заголовок = НСтр("ru = 'Добавить:'") + " " + ПредставлениеЯзыка; + КнопкаФормы.ПоложениеВКоманднойПанели= ?(ЭтоМобильныйКлиент, + ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю, ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели); + КнопкаФормы.Видимость = Не МакетНаТекущемЯзыке; + КонецЕсли; КонецЦикла; КонецПроцедуры @@ -309,7 +354,7 @@ ИмяРеквизита = ЧастиСтроки[ЧастиСтроки.ВГраница()]; ЧастиСтроки.Удалить(ЧастиСтроки.ВГраница()); ИмяОбъектаМетаданных = СтрСоединить(ЧастиСтроки, "."); - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаМетаданных); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъектаМетаданных); МультиязычныеРеквизитыОбъекта = МультиязычностьСервер.МультиязычныеРеквизитыОбъекта(ОбъектМетаданных); Если МультиязычныеРеквизитыОбъекта[ИмяРеквизита] = Истина Тогда @@ -331,6 +376,25 @@ КонецПроцедуры +Процедура ПеревестиТекстыОфисногоДокумента(АдресФайлаМакета, ЯзыкПеревода, ИсходныйЯзык) Экспорт + + ОфисныйДокумент = ПолучитьИзВременногоХранилища(АдресФайлаМакета); + + ДеревоМакета = УправлениеПечатью.ИнициализироватьМакетОфисногоДокументаСКД(ОфисныйДокумент); + + КореньДокумента = ДеревоМакета.СтруктураДокумента.ДеревоДокумента.Строки[0]; + + ПеревестиДеревоОфисногоДокумента(КореньДокумента, ЯзыкПеревода, ИсходныйЯзык); + + Для Каждого Колонтитул Из ДеревоМакета.СтруктураДокумента.Колонтитулы Цикл + КореньКолонтитула = Колонтитул.Значение.Строки[0]; + ПеревестиДеревоОфисногоДокумента(КореньКолонтитула, ЯзыкПеревода, ИсходныйЯзык); + КонецЦикла; + + УправлениеПечатью.ПолучитьПечатнуюФорму(ДеревоМакета, АдресФайлаМакета); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -359,7 +423,6 @@ КонецФункции Функция ДанныеПечатиМультиязычныеРеквизиты(ОписанияИсточниковДанных) - ДоступныеЯзыки(); ИсточникиДанных = ОписанияИсточниковДанных.ВыгрузитьКолонку("Владелец"); @@ -400,4 +463,118 @@ КонецФункции +Процедура ПеревестиДеревоОфисногоДокумента(КореньДокумента, ЯзыкПеревода, ИсходныйЯзык) + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + УзлыТекстов = МодульУправлениеПечатью.ПолучитьУзлыТекстов(КореньДокумента); + + ТекстыДляПеревода = Новый Массив; + УзлыКТекстам = Новый Соответствие(); + + Для Каждого УзелТекста Из УзлыТекстов Цикл + + ТекстУзлаБезПараметров = УбратьПараметрыИзТекстаОфисногоДокумента(УзелТекста.Значение).Текст; + + ТекстыДляПеревода.Добавить(ТекстУзлаБезПараметров); + + СоответствиеТекста = УзлыКТекстам.Получить(ТекстУзлаБезПараметров); + Если СоответствиеТекста = Неопределено Тогда + СоответствиеТекста = Новый Массив(); + КонецЕсли; + + СоответствиеТекста.Добавить(УзелТекста); + УзлыКТекстам.Вставить(ТекстУзлаБезПараметров, СоответствиеТекста); + + КонецЦикла; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.ПереводТекста") Тогда + МодульПереводТекстаНаДругиеЯзыки = ОбщегоНазначения.ОбщийМодуль("ПереводТекстаНаДругиеЯзыки"); + Переводы = МодульПереводТекстаНаДругиеЯзыки.ПеревестиТексты(ТекстыДляПеревода, ЯзыкПеревода, ИсходныйЯзык); + КонецЕсли; + + Для Каждого Перевод Из Переводы Цикл + Для Каждого УзелДляЗамены Из УзлыКТекстам[Перевод.Ключ] Цикл + + РезультатОбработки = УбратьПараметрыИзТекстаОфисногоДокумента(УзелДляЗамены.Ключ.Текст); + УзелДляЗамены.Ключ.Текст = ВернутьПараметрыВТекст(Перевод.Значение, РезультатОбработки.Параметры); + + КонецЦикла; + КонецЦикла; + КонецЕсли; +КонецПроцедуры + +Функция УбратьПараметрыИзТекстаОфисногоДокумента(Знач Текст) + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + + ОбработанныеПараметры = Новый Массив; + + Счетчик = 0; + + МассивСтрокУсловий = СтрРазделить(Текст, "{"); + Для Каждого СтрокаУсловий Из МассивСтрокУсловий Цикл + НайденнаяПозицияУсловия = СтрНайти(СтрокаУсловий, ИмяТегаУсловие()); + Если НайденнаяПозицияУсловия И НайденнаяПозицияУсловия < 3 Тогда + Параметр = "{"+СтрРазделить(СтрокаУсловий, "}")[0]+"}"; + Счетчик = Счетчик + 1; + Текст = СтрЗаменить(Текст, Параметр, ИдентификаторПараметра(Счетчик)); + ОбработанныеПараметры.Добавить(Параметр); + КонецЕсли; + КонецЦикла; + + НайденныеПараметры = МодульУправлениеПечатью.НайтиПараметрыВТексте(Текст); + + Для Каждого Параметр Из НайденныеПараметры Цикл + Если СтрНайти(Текст, Параметр) Тогда + Счетчик = Счетчик + 1; + Текст = СтрЗаменить(Текст, Параметр, ИдентификаторПараметра(Счетчик)); + ОбработанныеПараметры.Добавить(Параметр); + КонецЕсли; + КонецЦикла; + + Если СтрНайти(Текст, ИмяТегаУсловие()) Тогда + Счетчик = Счетчик + 1; + Текст = СтрЗаменить(Текст, ИмяТегаУсловие(), ИдентификаторПараметра(Счетчик)); + ОбработанныеПараметры.Добавить(ИмяТегаУсловие()); + КонецЕсли; + + + Результат = Новый Структура; + Результат.Вставить("Текст", Текст); + Результат.Вставить("Параметры", ОбработанныеПараметры); + + Возврат Результат; + + КонецЕсли; + +КонецФункции + +Функция ВернутьПараметрыВТекст(Знач Текст, ОбработанныеПараметры) + + Для Счетчик = 1 По ОбработанныеПараметры.Количество() Цикл + Текст = СтрЗаменить(Текст, ИдентификаторПараметра(Счетчик), "%" + XMLСтрока(Счетчик)); + КонецЦикла; + + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтрокуИзМассива(Текст, ОбработанныеПараметры); + +КонецФункции + +// Последовательность символов, которая не должна меняться при переводе на любой язык. +Функция ИдентификаторПараметра(Номер) + + Возврат "{<" + XMLСтрока(Номер) + ">}"; + +КонецФункции + +Функция ИмяТегаУсловие() + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатьюКлиентСервер = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюКлиентСервер"); + Возврат МодульУправлениеПечатьюКлиентСервер.ИмяТегаУсловие(); + Иначе + Возврат ""; + КонецЕсли; +КонецФункции + + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl index 56209beb2..d63ab58c7 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl @@ -17,19 +17,14 @@ // * СкрыватьПодписиИПечатиДляРедактирования - Булево - удалять рисунки подписей и печатей табличных документов при // снятии флажка "Подписи и печати" в форме "Печать документов", для того, // чтобы они не мешали редактировать текст, находящийся под ними. +// * ПроверкаПроведенияПередПечатью - Булево - признак необходимости проверки проведенности +// документов перед печатью, является значением по умолчанию для команды печати +// см. УправлениеПечатью.СоздатьКоллекциюКомандПечати. +// Для непроведенных документов команда печати не выполняется. +// Если параметр не указан, то проверка проведенности не выполняется. +// * ОбъектыПечати - Массив - менеджеры объектов с процедурой ПриОпределенииНастроекПечати. // Процедура ПриОпределенииНастроекПечати(Настройки) Экспорт - -КонецПроцедуры - -// Определяет объекты конфигурации, в модулях менеджеров которых размещена процедура ДобавитьКомандыПечати, -// формирующая список команд печати, предоставляемых этим объектом. -// Синтаксис процедуры ДобавитьКомандыПечати см. в документации к подсистеме. -// -// Параметры: -// СписокОбъектов - Массив - менеджеры объектов с процедурой ДобавитьКомандыПечати. -// -Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт @@ -158,6 +153,19 @@ +КонецПроцедуры + +// Позволяет выполнить переопределение данных печатной формы перед формированием. +// +// Параметры: +// ИдентификаторПечатнойФормы - Строка - идентификатор печатной формы; +// ОбъектыПечати - Массив - коллекция ссылок на объекты печати; +// ПараметрыПечати - Структура - произвольные параметры, переданные при вызове команды печати; +// +Процедура ПередПечатью(Знач ИдентификаторПечатнойФормы, ОбъектыПечати, ПараметрыПечати) Экспорт + + + КонецПроцедуры // Переопределяет параметры отправки печатных форм при подготовке письма. @@ -332,6 +340,35 @@ +КонецПроцедуры + +// Позволяет задать дополнительные настройки команд печати. +// +// Параметры: +// ПолноеИмяОбъектаМетаданных - ОбъектМетаданных - к которому подключены источники команд +// КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати +// +Процедура ПриПолученииКомандПечати(Знач ПолноеИмяОбъектаМетаданных, КомандыПечати) Экспорт + + + +КонецПроцедуры + +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать УправлениеПечатьюПереопределяемый.ПриОпределенииНастроекПечати(). +// Определяет объекты конфигурации, в модулях менеджеров которых размещена процедура ДобавитьКомандыПечати, +// формирующая список команд печати, предоставляемых этим объектом. +// Синтаксис процедуры ДобавитьКомандыПечати см. в документации к подсистеме. +// +// Параметры: +// СписокОбъектов - Массив - менеджеры объектов с процедурой ДобавитьКомандыПечати. +// +Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт + КонецПроцедуры #КонецОбласти + +#КонецОбласти + diff --git a/SSL/src/CommonModules/УправлениеПечатьюСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюСлужебный/Module.bsl index e13f6ae17..056aa2434 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюСлужебный/Module.bsl @@ -10,6 +10,68 @@ #Область ПечатьВФорматеOfficeOpenXML +Функция СформироватьПечатныеФормы(ТаблицаПечатныхФорм, ПараметрыФормирования, ОфисныеДокументы, СтруктураЕдиногоДокумента) Экспорт + + Если ПараметрыФормирования.Количество() Тогда + + ТипыОбъектовПечати = Неопределено; + ДополнительныеПараметры = Новый Структура("ДополнитьКомплектВнешнимиПечатнымиФормами", Ложь); + СоставЕдиногоДокумента = Новый Соответствие(); + + Для Каждого СтрокаПечатнойФормы Из ТаблицаПечатныхФорм Цикл + Если СтрокаПечатнойФормы.ФормироватьЗаново Тогда + ДополнительныеПараметры.Вставить("ПодписьИПечать", СтрокаПечатнойФормы.ПодписьИПечать); + МассивОбъектовПечати = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СтрокаПечатнойФормы.ОбъектПечати); + ПечатныеФормы = УправлениеПечатью.СформироватьПечатныеФормы("УправлениеПечатью", СтрокаПечатнойФормы.ИмяМакета, + МассивОбъектовПечати, ДополнительныеПараметры, ТипыОбъектовПечати, СтрокаПечатнойФормы.ТекущийЯзык); + + Если ПечатныеФормы.КоллекцияПечатныхФорм.Количество() Тогда + СтрокаПечатныхФорм = ПечатныеФормы.КоллекцияПечатныхФорм[0]; + Для Каждого ЭлементОфисногоДокумента Из СтрокаПечатныхФорм.ОфисныеДокументы Цикл + ОфисныйДокумент = ПолучитьИзВременногоХранилища(ЭлементОфисногоДокумента.Ключ); + ОфисныеДокументы.Вставить(СтрокаПечатнойФормы.АдресПечатнойФормы, ОфисныйДокумент); + ПоместитьВоВременноеХранилище(ОфисныйДокумент, СтрокаПечатнойФормы.АдресПечатнойФормы); + Прервать; + КонецЦикла; + Иначе + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка: Не удалось сформировать %1'"), СтрокаПечатнойФормы.Представление); + КонецЕсли; + КонецЕсли; + + Если СтрокаПечатнойФормы.Пометка Тогда + СвойстваПечатнойФормы = Новый Структура("ПодписьИПечать, ТекущийЯзык"); + СвойстваПечатнойФормы.ПодписьИПечать = СтрокаПечатнойФормы.ПодписьИПечать; + СвойстваПечатнойФормы.ТекущийЯзык = СтрокаПечатнойФормы.ТекущийЯзык; + СоставЕдиногоДокумента.Вставить(СтрокаПечатнойФормы.АдресПечатнойФормы, СвойстваПечатнойФормы); + КонецЕсли; + КонецЦикла; + + + Если ПараметрыФормирования.Свойство("ПереформироватьЕдиныйДокумент") И ПараметрыФормирования.ПереформироватьЕдиныйДокумент Тогда + + ОфисныеДокументыДляОбъединения = Новый Соответствие(); + + Для Каждого ПечатнаяФорма Из СоставЕдиногоДокумента Цикл + ОфисныеДокументыДляОбъединения.Вставить(ПечатнаяФорма.Ключ, ОфисныеДокументы[ПечатнаяФорма.Ключ]); + КонецЦикла; + + СтруктураЕдиногоДокумента.Вставить("АдресПечатнойФормы", ОбъединитьОфисныеДокументы(ОфисныеДокументыДляОбъединения, СтруктураЕдиногоДокумента.АдресПечатнойФормы)); + + Представление = СтрСоединить(ТаблицаПечатныхФорм.ВыгрузитьКолонку("Представление"), ", "); + Если СтрДлина(Представление) > 50 Тогда + Представление = Лев(Представление, 50)+"..."; + КонецЕсли; + + СтруктураЕдиногоДокумента.Вставить("ИмяФайлаПечатнойФормы", Представление+".docx"); + СтруктураЕдиногоДокумента.Вставить("Представление", Представление); + СтруктураЕдиногоДокумента.Вставить("СоставЕдиногоДокумента", СоставЕдиногоДокумента); + + КонецЕсли; + КонецЕсли; + Возврат СтруктураЕдиногоДокумента; +КонецФункции + ////////////////////////////////////////////////////////////////////////////////// // Печать с использованием макетов в формате Office Open XML. // @@ -107,9 +169,10 @@ КонецЕсли; Расширение = ОпределитьРасширениеФайлаДанныхПоСигнатуре(ДвоичныеДанныеМакета); - Если НЕ Расширение = "docx" Тогда - ЗаписатьСобытияВЖурналРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", НСтр("ru = 'Макет шаблона офисного документа имеет не верный формат.'")); - ВызватьИсключение(НСтр("ru = 'Ошибка анализа макета шаблона. Макет шаблона офисного документа имеет не верный формат.'")); + Если Расширение <> "docx" Тогда + ТекстОшибки = НСтр("ru = 'Макет шаблона офисного документа имеет не верный формат.'"); + ЗаписатьСобытияВЖурналРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ТекстОшибки); + ВызватьИсключение ТекстОшибки; КонецЕсли; ИмяВременногоФайла = ПолучитьИмяВременногоФайла("docx"); @@ -129,11 +192,176 @@ Макет.Вставить("СтруктураДокумента", СтруктураДокумента); ИнициализироватьСтруктуруМакета(Макет); - + Возврат Макет; КонецФункции +#Область СКД + +// Параметры: +// ДвоичныеДанныеМакета - ДвоичныеДанные +// +// Возвращаемое значение: +// Структура: +// * ИмяКаталога - Строка - временный каталог +// * СтруктураДокумента - см. ИнициализироватьДокументСКД +// +Функция МакетИзДвоичныхДанныхСКД(ДвоичныеДанныеМакета) Экспорт + + Если БезопасныйРежим() <> Ложь Тогда + УстановитьОтключениеБезопасногоРежима(Истина); + КонецЕсли; + + Расширение = ОпределитьРасширениеФайлаДанныхПоСигнатуре(ДвоичныеДанныеМакета); + Если Расширение <> "docx" Тогда + ТекстОшибки = НСтр("ru = 'Макет шаблона офисного документа имеет не верный формат.'"); + ЗаписатьСобытияВЖурналРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ТекстОшибки); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + ИмяВременногоФайла = ПолучитьИмяВременногоФайла("docx"); + ИмяВременногоКаталога = ФайловаяСистема.СоздатьВременныйКаталог(); + ДвоичныеДанныеМакета.Записать(ИмяВременногоФайла); + + РазобратьКонтейнерДокументDOCX(ИмяВременногоФайла, ИмяВременногоКаталога); + + УдалитьФайлы(ИмяВременногоФайла); + + СтруктураДокумента = ИнициализироватьДокументСКД(); + + Макет = Новый Структура; + Макет.Вставить("ИмяКаталога", ИмяВременногоКаталога); + Макет.Вставить("СтруктураДокумента", СтруктураДокумента); + + ИнициализироватьСтруктуруМакетаСКД(Макет); + + Возврат Макет; + +КонецФункции + + +// Инициализировать документ СКД. +// +// Возвращаемое значение: +// Структура - инициализировать документ версия параметры: +// * Колонтитулы - Соответствие +// * ТипыКонтента - см. ДеревоДокумента +// * СвязиКонтента - см. ДеревоДокумента +// * КаталогКартинок - Строка +// * РасширенияКартинок - Массив +// * ИдентификаторДокумента - Строка +// * ДеревоДокумента - см. ДеревоДокумента +// * ПараметрыТекста - Массив +// * Области - см. ТаблицаОбластейМакета +// +Функция ИнициализироватьДокументСКД() + + Результат = Новый Структура; + Результат.Вставить("Колонтитулы", Новый Соответствие); + Результат.Вставить("ТипыКонтента", Новый ДеревоЗначений); + Результат.Вставить("СвязиКонтента", Новый ДеревоЗначений); + Результат.Вставить("МаксимальныйИдентификаторСвязи", 0); + Результат.Вставить("Гиперссылки", Новый Соответствие); + Результат.Вставить("КаталогКартинок", ""); + Результат.Вставить("РасширенияКартинок", Новый Массив); + Результат.Вставить("ИдентификаторДокумента", ""); + Результат.Вставить("ДеревоДокумента", Новый ДеревоЗначений); + Результат.Вставить("ПараметрыТекста", Новый Массив); + + ТаблицаОбластей = ТаблицаОбластейМакета(); + Результат.Вставить("Области", ТаблицаОбластей); + + Возврат Результат; + +КонецФункции + +// Таблица областей макета. +// +// Возвращаемое значение: +// ТаблицаЗначений: +// * УзелДереваДокумента - см. ДеревоДокумента +// * УсловиеОбласти - Строка +// * Коллекция - Строка +// * Индекс - Число +// * ДеревоОбласти - см. ДеревоДокумента +// * Параметры - Массив +// +Функция ТаблицаОбластейМакета() + Перем ТаблицаОбластей; + ТаблицаОбластей = Новый ТаблицаЗначений; + ТаблицаОбластей.Колонки.Добавить("УзелДереваДокумента"); + ТаблицаОбластей.Колонки.Добавить("УсловиеОбласти"); + ТаблицаОбластей.Колонки.Добавить("Коллекция"); + ТаблицаОбластей.Колонки.Добавить("Индекс"); + ТаблицаОбластей.Колонки.Добавить("ДеревоОбласти"); + ТаблицаОбластей.Колонки.Добавить("Параметры"); + Возврат ТаблицаОбластей +КонецФункции + + +// Конвертировать параметры. +// +// Параметры: +// ДеревоДокумента - см. УправлениеПечатьюСлужебный.ПрочитатьXMLВДерево +// +Процедура КонвертироватьПараметры(ДеревоДокумента) Экспорт + + МассивУзловПараметров = Новый Массив; + НайтиУзлыПоСодержимому(ДеревоДокумента, "w:fldChar", МассивУзловПараметров); + + Если Не МассивУзловПараметров.Количество() Тогда + Возврат; + КонецЕсли; + + МассивОбластей = Новый Массив; + МассивОбласти = Новый Массив; + + Для Каждого УзелПараметров Из МассивУзловПараметров Цикл + ТипУзла = УзелПараметров.Атрибуты["w:fldCharType"]; + + МассивОбласти.Добавить(УзелПараметров); + + Если ТипУзла = "end" Тогда + МассивОбластей.Добавить(МассивОбласти); + МассивОбласти = Новый Массив; + КонецЕсли; + + КонецЦикла; + + Для Каждого МассивОбласти Из МассивОбластей Цикл + УзелНачала = МассивОбласти[0]; // СтрокаДереваЗначений: см. УправлениеПечатьюСлужебный.ПрочитатьXMLВДерево + Если Не УзелНачала.Строки.Количество() Тогда + Продолжить; + КонецЕсли; + УзелВводаТекста = НайтиУзелПоСодержимому(УзелНачала, "w:textInput"); + УзелЗначения = УзелВводаТекста.Строки[0]; + УзелНачала.Текст = "["+УзелЗначения.Атрибуты["w:val"]+"]"; + + УзелНачала.Строки.Очистить(); + УзелНачала.ИмяТега = "w:t"; + УзелНачала.Атрибуты.Очистить(); + + + УзелОкончания = МассивОбласти[МассивОбласти.ВГраница()]; // СтрокаДереваЗначений: см. УправлениеПечатьюСлужебный.ПрочитатьXMLВДерево + + ПрогонНачала = УзелНачала.Родитель; + ПрогонОкончания = УзелОкончания.Родитель; + + ИндексПрогонаНачала = ПрогонНачала.Родитель.Строки.Индекс(ПрогонНачала); + ИндексПрогонаОкончания = ПрогонОкончания.Родитель.Строки.Индекс(ПрогонОкончания); + + УзловКУдалению = ИндексПрогонаОкончания - (ИндексПрогонаНачала+1); + + Для к = 0 По УзловКУдалению Цикл + ПрогонНачала.Родитель.Строки.Удалить(ИндексПрогонаОкончания-к); + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + // Очищает все файлы, связанные с печатной формой или макетом печатной формы. // Параметры: // ПечатнаяФорма - Структура - печатная форма или макет печатной формы. @@ -147,9 +375,9 @@ ФайловаяСистема.УдалитьВременныйКаталог(ПечатнаяФорма.ИмяКаталога); Исключение - ЗаписатьСобытияВЖурналРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьСобытияВЖурналРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение(НСтр("ru = 'Не удалось удалить временный каталог шаблона печатной формы по причине:'") + Символы.ПС - + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры @@ -294,6 +522,7 @@ КонецЕсли; ЗаполнитьПараметрыОбласти(ПечатнаяФорма, НижнийКолонтитул, ДанныеОбъекта); + ЗаполнитьПараметрыГиперссылок(ПечатнаяФорма, НижнийКолонтитул, ДанныеОбъекта); КонецПроцедуры @@ -329,6 +558,7 @@ КонецЕсли; ЗаполнитьПараметрыОбласти(ПечатнаяФорма, ВерхнийКолонтитул, ДанныеОбъекта); + ЗаполнитьПараметрыГиперссылок(ПечатнаяФорма, ВерхнийКолонтитул, ДанныеОбъекта); КонецПроцедуры @@ -370,6 +600,7 @@ Возврат; КонецЕсли; + ЗаполнитьПараметрыГиперссылок(ПечатнаяФорма, ОбластьМакета, ДанныеОбъекта); ЗаполнитьПараметрыОбласти(ПечатнаяФорма, ОбластьМакета, ДанныеОбъекта); КонецПроцедуры @@ -496,6 +727,7 @@ Результат.Вставить("Имя", ""); Результат.Вставить("Текст", ""); Результат.Вставить("НомерРаздела", 1); + Результат.Вставить("Гиперссылки", Новый Массив); Возврат Результат; @@ -507,6 +739,7 @@ // * Текст - Строка // * ИмяВнутр - Строка // * Имя - Строка +// * Гиперссылки - Массив // Функция ОбластьКолонтитула() @@ -515,6 +748,7 @@ Результат.Вставить("ИмяВнутр", ""); Результат.Вставить("Текст", ""); Результат.Вставить("НомерРаздела", 1); + Результат.Вставить("Гиперссылки", Новый Массив); Возврат Результат; @@ -613,7 +847,1729 @@ #КонецОбласти -#Область РаботаСOpenOfficeXML +#Область РаботаСOfficeOpenXML + +#Область СКД + +#Область ОбъединениеДокументов + +Функция ОбъединитьОфисныеДокументы(ОфисныеДокументы, АдресЕдиногоДокумента) + + ИтоговаяПечатнаяФорма = Неопределено; + + Для каждого ОфисныйДокумент Из ОфисныеДокументы Цикл + ДеревоМакета = УправлениеПечатью.ИнициализироватьМакетОфисногоДокументаСКД(ОфисныйДокумент.Значение); + СтруктураДокумента = ДеревоМакета.СтруктураДокумента; + СоответствиеСсылок = Новый Соответствие; + + СсылкиДляПоиска = ПолучитьСсылкиДляПоискаКонтента(СтруктураДокумента, ИтоговаяПечатнаяФорма = Неопределено); + + СсылкиДляПоиска = МассивВСоответствие(СсылкиДляПоиска); + + ВыделитьСсылки(СтруктураДокумента.ДеревоДокумента, СоответствиеСсылок, СсылкиДляПоиска); + + Если ИтоговаяПечатнаяФорма = Неопределено Тогда + Для к = 1 По СсылкиДляПоиска.Количество() Цикл + ИмяСвойства = "rId"+ Формат(к, "ЧГ="); + Если СоответствиеСсылок.Получить(ИмяСвойства) = Неопределено Тогда + СоответствиеСсылок.Вставить(ИмяСвойства, Новый Соответствие); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если ИтоговаяПечатнаяФорма = Неопределено Тогда + СтруктураСсылокИтоговогоДокумента = ОбщегоНазначения.СкопироватьРекурсивно(СоответствиеСсылок); + ИтоговаяПечатнаяФорма = ОбщегоНазначения.СкопироватьРекурсивно(ДеревоМакета); + СтруктураИтоговогоДокумента = ИтоговаяПечатнаяФорма.СтруктураДокумента; + Иначе + Для Каждого СсылкиВДокументе Из СоответствиеСсылок Цикл + НовыйКлюч = ПодобратьУникальныйКлюч(СсылкиВДокументе.Ключ, СтруктураСсылокИтоговогоДокумента); + Если НовыйКлюч <> СсылкиВДокументе.Ключ Тогда + ЗаменитьУпоминания(СсылкиВДокументе, НовыйКлюч); + КонецЕсли; + ОбработатьСтруктуру(СсылкиВДокументе.Ключ, НовыйКлюч, ИтоговаяПечатнаяФорма, ДеревоМакета); + СтруктураСсылокИтоговогоДокумента.Вставить(НовыйКлюч, ОбщегоНазначения.СкопироватьРекурсивно(СсылкиВДокументе.Значение)); + КонецЦикла; + + УзелDocumentНовогоДокумента = СтруктураДокумента.ДеревоДокумента.Строки[0]; // СтрокаТаблицыЗначений: см. УправлениеПечатьюСлужебный.ПрочитатьXMLВДерево + УзелDocumentИтоговогоДокумента = СтруктураИтоговогоДокумента.ДеревоДокумента.Строки[0]; + + УзелBodyНовогоДокумента = УзелDocumentНовогоДокумента.Строки[0]; + УзелBodyИтоговогоДокумента = УзелDocumentИтоговогоДокумента.Строки[0]; + + УзелОкончанияРаздела = НайтиУзел(УзелBodyИтоговогоДокумента, -1, "w:sectPr"); + + ИндексДобавленияРаздела = УзелBodyИтоговогоДокумента.Строки.Индекс(УзелОкончанияРаздела); + + ДобавитьУзелОписанияРаздела(УзелBodyИтоговогоДокумента, ИндексДобавленияРаздела, УзелОкончанияРаздела); + УзелBodyИтоговогоДокумента.Строки.Удалить(УзелОкончанияРаздела); + + Для Каждого УзелДобавления Из УзелBodyНовогоДокумента.Строки Цикл + ИндексДобавленияРаздела = ИндексДобавленияРаздела + 1; + ДобавляемыйУзел = СкопироватьУзел(УзелBodyИтоговогоДокумента, ИндексДобавленияРаздела, УзелДобавления); + СоздатьПоследующие(ДобавляемыйУзел, УзелДобавления); + КонецЦикла; + УдалитьФайлы(ДеревоМакета.ИмяКаталога); + КонецЕсли; + КонецЦикла; + + Возврат ПолучитьПечатнуюФорму(ИтоговаяПечатнаяФорма, АдресЕдиногоДокумента); + +КонецФункции + +Функция ПолучитьСсылкиДляПоискаКонтента(СтруктураДокумента, ВсеСсылки = Ложь) + МассивСсылокДляПоиска = Новый Массив; + МассивНайденныхУзлов = Новый Массив; + + МассивИскомых = Новый Массив; + МассивИскомых.Добавить("http://schemas.openxmlformats.org/officeDocument/2006/relationships/header"); + МассивИскомых.Добавить("http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"); + МассивИскомых.Добавить("http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer"); + МассивИскомых.Добавить("http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" ); + + ДеревоСвязей = СтруктураДокумента.СвязиКонтента; + + Если ВсеСсылки Тогда + НайтиУзлыПоСодержимому(ДеревоСвязей, "Relationship", МассивНайденныхУзлов); + Иначе + ПараметрыПоискаУзлов = ПараметрыПоискаУзлов(); + ПараметрыПоискаУзлов.ИмяАтрибута = "Type"; + ПараметрыПоискаУзлов.ЗначенияАтрибута = МассивИскомых; + НайтиУзлыПоСодержимому(ДеревоСвязей, "Relationship", МассивНайденныхУзлов, ПараметрыПоискаУзлов); + КонецЕсли; + + Для Каждого НайденныйУзел Из МассивНайденныхУзлов Цикл + МассивСсылокДляПоиска.Добавить(НайденныйУзел.Атрибуты["Id"]); + КонецЦикла; + + МассивСсылокДляПоиска = ОбщегоНазначенияКлиентСервер.СвернутьМассив(МассивСсылокДляПоиска); + + Возврат МассивСсылокДляПоиска; +КонецФункции + +Процедура ЗаменитьУпоминания(СсылкиВДокументе, НовыйКлюч) + Для Каждого СсылкаВДокументе Из СсылкиВДокументе.Значение Цикл + ИсправляемыйУзел = СсылкаВДокументе.Ключ; + Для Каждого Атрибут Из СсылкаВДокументе.Значение Цикл + ИсправляемыйУзел.Атрибуты.Вставить(Атрибут.Ключ, НовыйКлюч); + КонецЦикла; + КонецЦикла; +КонецПроцедуры + +Процедура ОбработатьСтруктуру(ИсходныйКлюч, НовыйКлюч, Приемник, Источник, Кодировка = "UTF-8") + + СтруктураДокументаПриемника = Приемник.СтруктураДокумента; + СтруктураДокументаИсточника = Источник.СтруктураДокумента; + + ДеревоСвязейИсточника = СтруктураДокументаИсточника.СвязиКонтента; + ДеревоСвязейПриемника = СтруктураДокументаПриемника.СвязиКонтента; + + УзелИсточника = НайтиУзелПоСодержимому(ДеревоСвязейИсточника, "Relationship", "Id", ИсходныйКлюч); + ИсходноеИмяРесурса = УзелИсточника.Атрибуты["Target"]; + ИмяРесурсаДляПриема = ИсходноеИмяРесурса; + + Если УзелИсточника.Атрибуты["Type"] = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Тогда + + Иначе + Пока Истина Цикл + НайденныйУзел = НайтиУзелПоСодержимому(ДеревоСвязейПриемника, "Relationship", "Target", ИмяРесурсаДляПриема); + Если НайденныйУзел = Неопределено Тогда + Прервать; + КонецЕсли; + + МассивИмениИсточника = СтрРазделить(ИмяРесурсаДляПриема, "/\."); + КороткоеИмяРесурса = МассивИмениИсточника[МассивИмениИсточника.ВГраница()-1]; + + СтруктураКлюча = ПолучитьИмяБезЦифр(КороткоеИмяРесурса); + ШаблонИмени = СтруктураКлюча.ШаблонИмени; + НомерРесурса = СтруктураКлюча.Номер; + НомерРесурса = НомерРесурса + 1; + ИмяРесурса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмени, Формат(НомерРесурса, "ЧГ=")); + + ПутьКРесурсу = ""; + Для к = 0 По МассивИмениИсточника.ВГраница() - 2 Цикл + ПутьКРесурсу = ПутьКРесурсу + МассивИмениИсточника[к]+"/"; + КонецЦикла; + ИмяРесурсаДляПриема = ПутьКРесурсу + ИмяРесурса +"."+МассивИмениИсточника[МассивИмениИсточника.ВГраница()]; + КонецЦикла; + + ИмяФайлаИсточника = Источник.ИмяКаталога + "word" + УстановитьРазделительПути("\"+ИсходноеИмяРесурса); + ИмяФайлаПриемника = Приемник.ИмяКаталога + "word" + УстановитьРазделительПути("\"+ИмяРесурсаДляПриема); + + ФайлПриемник = Новый Файл(ИмяФайлаПриемника); + КаталогФайлаПриемника = Новый Файл(ФайлПриемник.Путь); + + Если Не КаталогФайлаПриемника.Существует() Тогда + СоздатьКаталог(ФайлПриемник.Путь); + КонецЕсли; + + КопироватьФайл(ИмяФайлаИсточника, ИмяФайлаПриемника); + КонецЕсли; + + КореньСвязейПриемника = ДеревоСвязейПриемника.Строки[0]; + НоваяСвязь = СкопироватьУзел(КореньСвязейПриемника, КореньСвязейПриемника.Строки.Количество(), УзелИсточника); + НоваяСвязь.Атрибуты.Вставить("Target", ИмяРесурсаДляПриема); + НоваяСвязь.Атрибуты.Вставить("Id", НовыйКлюч); + + ДеревоТиповКонтентаПриемника = СтруктураДокументаПриемника.ТипыКонтента; + ДеревоТиповКонтентаИсточника = СтруктураДокументаИсточника.ТипыКонтента; + + КореньПриемника = НайтиУзелПоСодержимому(ДеревоТиповКонтентаПриемника, "Types"); + + Если СтрНайти(НоваяСвязь.Атрибуты["Type"], "header") ИЛИ СтрНайти(НоваяСвязь.Атрибуты["Type"], "footer") Тогда + ИмяФайлаКолонтитулаИсточник = "/word/"+ИсходноеИмяРесурса; + ИмяФайлаКолонтитулаПриемник = "/word/"+ИмяРесурсаДляПриема; + + УзелПереопределения = НайтиУзелПоСодержимому(ДеревоТиповКонтентаИсточника, "Override", "PartName", ИмяФайлаКолонтитулаИсточник); + + Если УзелПереопределения <> Неопределено Тогда + НоваяТипКонтента = СкопироватьУзел(КореньПриемника, КореньПриемника.Строки.Количество(), УзелПереопределения); + НоваяТипКонтента.Атрибуты.Вставить("PartName", ИмяФайлаКолонтитулаПриемник); + КонецЕсли; + ИначеЕсли НоваяСвязь.Атрибуты["Type"] = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Тогда + + МассивСловИмени = СтрРазделить(ИмяРесурсаДляПриема, ".", Истина); + РасширениеИсточникаИсточника = МассивСловИмени[МассивСловИмени.ВГраница()]; + + УзелОпределениеИсточника = НайтиУзелПоСодержимому(ДеревоТиповКонтентаИсточника, "Default", "Extension", РасширениеИсточникаИсточника); + УзелОпределениеПриемника = НайтиУзелПоСодержимому(ДеревоТиповКонтентаПриемника, "Default", "Extension", РасширениеИсточникаИсточника); + + Если УзелОпределениеИсточника <> Неопределено И УзелОпределениеПриемника = Неопределено Тогда + НоваяТипКонтента = СкопироватьУзел(КореньПриемника, КореньПриемника.Строки.Количество(), УзелОпределениеИсточника); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Функция ПрочитатьСтрокуXMLВДерево(СтрокаXML) + ЧтениеXML = ИнициализироватьЧтениеXML(СтрокаXML); + Возврат ПрочитатьXMLВДерево(ЧтениеXML); +КонецФункции + +// Поместить дерево в запись XML. +// +// Параметры: +// ЗаписьXML - ЗаписьXML - запись XML +// Дерево - ДеревоЗначений: +// * ИмяТега - Строка +// * Текст - Строка +// * ПолныйТекст - Строка +// * Атрибуты - Соответствие +// +Процедура ПоместитьДеревоВЗаписьXML(ЗаписьXML, Дерево) + Для каждого Подстрока Из Дерево.Строки Цикл + ЗаписатьЭлемент(ЗаписьXML, Подстрока); + КонецЦикла; +КонецПроцедуры + +Функция ПоместитьДеревоВСтрокуXML(Дерево) + ЗаписьXML = ИнициализироватьЗаписьXML(""); + Для каждого Подстрока Из Дерево.Строки Цикл + ЗаписатьЭлемент(ЗаписьXML, Подстрока); + КонецЦикла; + Возврат ЗаписьXML.Закрыть(); +КонецФункции + +Функция ПодобратьУникальныйКлюч(Знач Ключ, Структура) + СтруктураКлюча = ПолучитьИмяБезЦифр(Ключ); + ШаблонИмени = СтруктураКлюча.ШаблонИмени; + НомерКлюча = СтруктураКлюча.Номер; + + Пока Структура.Получить(Ключ) <> Неопределено Цикл + НомерКлюча = НомерКлюча + 1; + Ключ = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмени, Формат(НомерКлюча, "ЧГ=")); + КонецЦикла; + Возврат Ключ; +КонецФункции + +Функция ПолучитьИмяБезЦифр(Знач Имя) + МассивКлюча = СтрРазделить(Имя, "0123456789", Ложь); + Если МассивКлюча.Количество() > 1 Тогда + ВызватьИсключение НСтр("ru = 'Неожиданный ключ'"); + КонецЕсли; + Результат = Новый Структура ("ШаблонИмени, Номер"); + Результат.ШаблонИмени = МассивКлюча[0]+"%1"; + НеНужныеСимволы = СтрСоединить(МассивКлюча,""); + МассивНомеров = СтрРазделить(Имя, НеНужныеСимволы, Ложь); + Если МассивНомеров.Количество() > 1 Тогда + ВызватьИсключение НСтр("ru = 'Неожиданный ключ, несколько номеров'"); + КонецЕсли; + Результат.Номер = Число(МассивНомеров[0]); + Возврат Результат; +КонецФункции + +Процедура ВыделитьСсылки(ДеревоМакета, СоответствиеСсылок, СсылкиДляПоиска) + + Для Каждого СтрокаДерева Из ДеревоМакета.Строки Цикл + + Для Каждого Атрибут Из СтрокаДерева.Атрибуты Цикл + Если СсылкиДляПоиска.Получить(Атрибут.Значение) <> Неопределено Тогда + Упоминания = СоответствиеСсылок.Получить(Атрибут.Значение); + Если Упоминания = Неопределено Тогда + Упоминания = Новый Соответствие; + КонецЕсли; + + Атрибуты = Упоминания.Получить(СтрокаДерева); + Если Атрибуты = Неопределено Тогда + Атрибуты = Новый Соответствие; + КонецЕсли; + Атрибуты.Вставить(Атрибут.Ключ, Атрибут.Значение); + + Упоминания.Вставить(СтрокаДерева, Атрибуты); + + СоответствиеСсылок.Вставить(Атрибут.Значение, Упоминания); + КонецЕсли; + КонецЦикла; + + ВыделитьСсылки(СтрокаДерева, СоответствиеСсылок, СсылкиДляПоиска); + КонецЦикла; +КонецПроцедуры + + + +// Параметры: +// УзелРодителя - см. ДеревоДокумента +// Индекс - Число +// Узел - см. ДеревоДокумента +// +Процедура ДобавитьУзелОписанияРаздела(УзелРодителя, Индекс, Узел) + Если УзелРодителя.Строки.Количество() <= Индекс Тогда + НовыйАбзац = УзелРодителя.Строки.Добавить(); + Иначе + НовыйАбзац = УзелРодителя.Строки.Вставить(Индекс); + КонецЕсли; + НовыйАбзац.ИмяТега = "w:p"; + НовыеСвойстваФорматирования = НовыйАбзац.Строки.Добавить(); + НовыеСвойстваФорматирования.ИмяТега = "w:pPr"; + + НовыйРаздел = НовыеСвойстваФорматирования.Строки.Добавить(); + + ЗаполнитьЗначенияСвойств(НовыйРаздел, Узел, "ИмяТега,Текст,ПолныйТекст"); + НовыйРаздел.Атрибуты = ОбщегоНазначения.СкопироватьРекурсивно(Узел.Атрибуты); + СоздатьПоследующие(НовыйРаздел, Узел); + +КонецПроцедуры + +#КонецОбласти + +// Строит дерево значений по XML. +// +// Параметры: +// ЧтениеXML - ЧтениеXML +// +// Возвращаемое значение: +// ДеревоЗначений: +// * ИмяТега - Строка - имя тега XML. +// * Текст - Строка - текстовое значение тега. +// * ПолныйТекст - Строка - текст всех подлежащих узлов +// * Атрибуты - Соответствие - атрибуты узла +// Гиперссылки - Соответствие +// +Функция ПрочитатьXMLВДерево(ЧтениеXML, Гиперссылки = Неопределено) Экспорт + ЧтениеXML.ИгнорироватьПробелы = Ложь; + Дерево = ДеревоДокумента(); + Если Гиперссылки <> Неопределено И Гиперссылки.Количество() = 0 Тогда + Гиперссылки = Неопределено; + КонецЕсли; + ПрочитатьЗапись(ЧтениеXML, Дерево, Гиперссылки); + Возврат Дерево; +КонецФункции + +// Возвращаемое значение: +// ДеревоЗначений: +// * ИмяТега - Строка - имя тега XML +// * Текст - Строка - текст содержащийся в теге XML +// * ПолныйТекст - Строка - текст всех подчиненных узлов +// * Атрибуты - Соответствие - атрибуты узла XML +// * Индекс - Число - поле для индексации +// +Функция ДеревоДокумента() + Перем Дерево; + Дерево = Новый ДеревоЗначений; + Дерево.Колонки.Добавить("ИмяТега", Новый ОписаниеТипов("Строка")); + Дерево.Колонки.Добавить("Текст", Новый ОписаниеТипов("Строка")); + Дерево.Колонки.Добавить("ПолныйТекст", Новый ОписаниеТипов("Строка")); + Дерево.Колонки.Добавить("Атрибуты", Новый ОписаниеТипов("Соответствие")); + Дерево.Колонки.Добавить("Индекс", Новый ОписаниеТипов("Число")); + Возврат Дерево +КонецФункции + +Функция ПрочитатьЗапись(ЧтениеXML, СтрокаДерева, Гиперссылки) + ПолныйТекст = ""; + Пока ЧтениеXML.Прочитать() Цикл + Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + НоваяСтрока = СтрокаДерева.Строки.Добавить(); + НоваяСтрока.ИмяТега = ЧтениеXML.Имя; + НоваяСтрока.Атрибуты = ПолучитьАтрибуты(ЧтениеXML); + НоваяСтрока.Текст = ""; + НоваяСтрока.ПолныйТекст = ПрочитатьЗапись(ЧтениеXML, НоваяСтрока, Гиперссылки); + + Если Гиперссылки <> Неопределено И НоваяСтрока.ИмяТега = "w:hyperlink" Тогда + ТекстСсылки = Гиперссылки[НоваяСтрока.Атрибуты["r:id"]]; + Если ТекстСсылки <> Неопределено Тогда + НоваяСтрока.ПолныйТекст = ТекстСсылки + НоваяСтрока.ПолныйТекст; + КонецЕсли; + КонецЕсли; + ПолныйТекст = ПолныйТекст + НоваяСтрока.ПолныйТекст; + + ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда + Возврат ПолныйТекст; + ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда + Если ТипЗнч(СтрокаДерева) <> Тип("СтрокаДереваЗначений") + ИЛИ (СтрНачинаетсяС(ЧтениеXML.Значение, Символ(10))) Тогда + Продолжить; + КонецЕсли; + + СтрокаДерева.Текст = СтрЗаменить(ЧтениеXML.Значение, Символ(160), " "); + Если СтрНачинаетсяС(СтрокаДерева.Текст, "HYPERLINK ") Тогда + СтрокаДерева.Текст = РаскодироватьСтроку(ЧтениеXML.Значение, СпособКодированияСтроки.КодировкаURL); + Иначе + СтрокаДерева.Текст = СтрЗаменить(ЧтениеXML.Значение, Символ(160), " "); + КонецЕсли; + + СтрокаДерева.ПолныйТекст = СтрокаДерева.Текст; + ПолныйТекст = ПолныйТекст + СтрокаДерева.ПолныйТекст; + ЧтениеXML.Прочитать(); + Возврат ПолныйТекст; + Иначе + ВызватьИсключение (НСтр("ru = 'Не известный:'") + " " + ЧтениеXML.ТипУзла); + КонецЕсли; + КонецЦикла; + Возврат ПолныйТекст; +КонецФункции + +Функция ПолучитьАтрибуты(ЧтениеXML) + СоответствиеАтрибутов = Новый Соответствие; + Пока ЧтениеXML.ПрочитатьАтрибут() Цикл + СоответствиеАтрибутов.Вставить(ЧтениеXML.Имя, ЧтениеXML.Значение); + КонецЦикла; + Возврат СоответствиеАтрибутов; +КонецФункции + +Процедура ИнициализироватьСтруктуруМакетаСКД(Макет) + + ИмяКаталога = Макет.ИмяКаталога; + СтруктураДокумента = Макет.СтруктураДокумента; + СтруктураДокумента.КаталогКартинок = ИмяКаталога + УстановитьРазделительПути("\word\media\"); + + ИзменяемыеФайлы = Новый Соответствие; + ИзменяемыеФайлы.Вставить("СвязиКонтента", ИмяКаталога + УстановитьРазделительПути("\word\_rels\document.xml.rels")); + ИзменяемыеФайлы.Вставить("ТипыКонтента", ИмяКаталога + УстановитьРазделительПути("\[Content_Types].xml")); + ИзменяемыеФайлы.Вставить("Документ", ИмяКаталога + УстановитьРазделительПути("\word\document.xml")); + + КаталогСоСтруктуройФайла = ИмяКаталога + "word" + ПолучитьРазделительПути(); + + Файл = Новый Файл(ИзменяемыеФайлы.Получить("СвязиКонтента")); + Если Файл.Существует() Тогда + ЧтениеXML = ИнициализироватьЧтениеXML(Файл.ПолноеИмя, 1); + ДеревоXML = ПрочитатьXMLВДерево(ЧтениеXML); + МассивУзловГиперссылок = Новый Массив; + ПараметрыПоискаУзлов = ПараметрыПоискаУзлов(); + ПараметрыПоискаУзлов.ИмяАтрибута = "Type"; + ПараметрыПоискаУзлов.ЗначенияАтрибута = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"; + НайтиУзлыПоСодержимому(ДеревоXML, "Relationship", МассивУзловГиперссылок, ПараметрыПоискаУзлов); + СоответствиеГиперссылок = СтруктураДокумента.Гиперссылки; + + Для Каждого УзелГиперссылки Из МассивУзловГиперссылок Цикл + ТекстСсылки = РаскодироватьСтроку(УзелГиперссылки.Атрибуты["Target"], СпособКодированияСтроки.КодировкаURL); + ПараметрыСсылки = УправлениеПечатью.НайтиПараметрыВТексте(ТекстСсылки); + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(СтруктураДокумента.ПараметрыТекста, ПараметрыСсылки, Истина); + ИдентификаторСсылки = УзелГиперссылки.Атрибуты["Id"]; + СоответствиеГиперссылок.Вставить(ИдентификаторСсылки, ТекстСсылки); + КонецЦикла; + МаксимальныйИдентификатор = 0; + МассивУзлов = Новый Массив; + НайтиУзлыПоСодержимому(ДеревоXML, "Relationship", МассивУзлов); + Для Каждого Узел Из МассивУзлов Цикл + Идентификатор = Узел.Атрибуты["Id"]; + МассивЧастейИдентификатора = СтрРазделить(Идентификатор, "0123456789", Ложь); + Идентификатор = Число(СтрЗаменить(Идентификатор, МассивЧастейИдентификатора[0], "")); + МаксимальныйИдентификатор = Макс(Идентификатор, МаксимальныйИдентификатор); + КонецЦикла; + СтруктураДокумента.МаксимальныйИдентификаторСвязи = МаксимальныйИдентификатор; + СтруктураДокумента.СвязиКонтента = ДеревоXML; + КонецЕсли; + + + Файл = Новый Файл(КаталогСоСтруктуройФайла + "document.xml"); //@Non-NLS + Если Файл.Существует() Тогда + ЧтениеXML = ИнициализироватьЧтениеXML(Файл.ПолноеИмя, 1); + СтруктураДокумента.ДеревоДокумента = ПрочитатьXMLВДерево(ЧтениеXML, СтруктураДокумента.Гиперссылки); + + ТекстXML = СтруктураДокумента.ДеревоДокумента.Строки[0].ПолныйТекст; + СтруктураДокумента.ПараметрыТекста = УправлениеПечатью.НайтиПараметрыВТексте(ТекстXML); + + КонецЕсли; + + СтруктурныеФайлы = НайтиФайлы(КаталогСоСтруктуройФайла, "*.xml"); + Для Каждого Файл Из СтруктурныеФайлы Цикл + Если НЕ (Лев(Файл.ИмяБезРасширения, 6) = "header") И НЕ (Лев(Файл.ИмяБезРасширения, 6) = "footer") Тогда + Продолжить; + КонецЕсли; + + ЧтениеXML = ИнициализироватьЧтениеXML(Файл.ПолноеИмя, 1); + + ДеревоXML = ПрочитатьXMLВДерево(ЧтениеXML, СтруктураДокумента.Гиперссылки); + + СтруктураДокумента.Колонтитулы.Вставить(Файл.ИмяБезРасширения, ДеревоXML); + + ТекстXML = ДеревоXML.Строки[0].ПолныйТекст; + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(СтруктураДокумента.ПараметрыТекста, УправлениеПечатью.НайтиПараметрыВТексте(ТекстXML), Истина); + + КонецЦикла; + + Файл = Новый Файл(ИзменяемыеФайлы.Получить("ТипыКонтента")); + Если Файл.Существует() Тогда + ЧтениеXML = ИнициализироватьЧтениеXML(Файл.ПолноеИмя, 1); + ДеревоXML = ПрочитатьXMLВДерево(ЧтениеXML); + СтруктураДокумента.ТипыКонтента = ДеревоXML; + КонецЕсли; + +КонецПроцедуры + +Функция ПолучитьУзел(Дерево, Знач Путь) Экспорт + МассивПути = СтрРазделить(Путь, "/", Ложь); + МассивНайденныхСтрок = Дерево.Строки.НайтиСтроки(Новый Структура("ИмяТега", МассивПути[0]), Ложь); + Если МассивНайденныхСтрок.Количество() Тогда + Если МассивПути.Количество() = 1 Тогда + Возврат МассивНайденныхСтрок[0]; + ИначеЕсли МассивПути.Количество() Тогда + МассивПути.Удалить(0); + Возврат ПолучитьУзел(МассивНайденныхСтрок[0], СтрСоединить(МассивПути, "/")); + КонецЕсли; + КонецЕсли; + Возврат Неопределено; +КонецФункции + +Функция ПолучитьУзлыТекстов(УзелДокумента, СоответствиеУзлов = Неопределено) Экспорт + Если СоответствиеУзлов = Неопределено Тогда + СоответствиеУзлов = Новый Соответствие(); + КонецЕсли; + + Если УзелДокумента.ИмяТега = "w:t" Тогда + СоответствиеУзлов.Вставить(УзелДокумента, УзелДокумента.Текст); + КонецЕсли; + + Для Каждого ДочернийУзел Из УзелДокумента.Строки Цикл + ПолучитьУзлыТекстов(ДочернийУзел, СоответствиеУзлов); + КонецЦикла; + + Возврат СоответствиеУзлов; +КонецФункции + +Процедура ПроиндексироватьУзлы(ДеревоДокумента, Счетчик = 0) Экспорт + Для Каждого Строка Из ДеревоДокумента.Строки Цикл + Строка.Индекс = Счетчик; + Счетчик = Счетчик + 1; + ПроиндексироватьУзлы(Строка, Счетчик); + КонецЦикла; +КонецПроцедуры + +Процедура НайтиОбласти(СтруктураДокумента, ИменаТабличныхЧастейОбъекта) Экспорт + + Области = СтруктураДокумента.Области; + ДеревоДокумента = СтруктураДокумента.ДеревоДокумента; + + НайденныеОбластиНачало = Новый Массив; + НайденныеОбластиОкончание = Новый Массив; + НайтиУзлы(ДеревоДокумента, "{"+ИмяТегаУсловие(), НайденныеОбластиНачало); + НайтиУзлы(ДеревоДокумента, "{/"+ИмяТегаУсловие(), НайденныеОбластиОкончание); + + Для Каждого ИмяТабличнойЧасти Из ИменаТабличныхЧастейОбъекта Цикл + НайденныеОбласти = Новый Массив; + НайтиУзлы(ДеревоДокумента, "["+ИмяТабличнойЧасти+".", НайденныеОбласти); + Для Каждого Область Из НайденныеОбласти Цикл + Если НайденныеОбластиНачало.Найти(Область) <> Неопределено Тогда + Продолжить; + КонецЕсли; + УзелНачалаТабличнойОбласти = НайтиКореньТабличнойОбласти(Область); + Если Области.Найти(УзелНачалаТабличнойОбласти, "УзелДереваДокумента") = Неопределено Тогда + НоваяОбласть = Области.Добавить(); + НоваяОбласть.УзелДереваДокумента = УзелНачалаТабличнойОбласти; + НоваяОбласть.Коллекция = ИмяТабличнойЧасти; + НоваяОбласть.Индекс = НоваяОбласть.УзелДереваДокумента.Индекс; + КонецЕсли; + + УзелОкончанияТабличнойОбласти = ПолучитьСледующийУзел(УзелНачалаТабличнойОбласти); + Если Области.Найти(УзелОкончанияТабличнойОбласти, "УзелДереваДокумента") = Неопределено Тогда + НоваяОбласть = Области.Добавить(); + НоваяОбласть.УзелДереваДокумента = УзелОкончанияТабличнойОбласти; + НоваяОбласть.Индекс = НоваяОбласть.УзелДереваДокумента.Индекс; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + ИндексыНайденныхОбластейНачало = ПолучитьИндексыМассиваУзлов(НайденныеОбластиНачало); + ИндексыНайденныхОбластейОкончание = ПолучитьИндексыМассиваУзлов(НайденныеОбластиОкончание); + + Для Каждого ИндексНайденнойОбластиНачало Из ИндексыНайденныхОбластейНачало Цикл + ОбластьНачала = ДеревоДокумента.Строки.Найти(ИндексНайденнойОбластиНачало, "Индекс", Истина); + Для Каждого ИндексНайденнойОбластиОкончание Из ИндексыНайденныхОбластейОкончание Цикл + ОбластьОкончания = ДеревоДокумента.Строки.Найти(ИндексНайденнойОбластиОкончание, "Индекс", Истина); + Если ИндексНайденнойОбластиНачало < ИндексНайденнойОбластиОкончание Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + Если ОбластьОкончания = Неопределено Тогда + ВызватьИсключение НСтр("ru='Не удалось найти окончание условной области'"); + КонецЕсли; + + УсловиеОбласти = ПолучитьУсловиеОбласти(ОбластьНачала); + + ОбластьКоллекции = Неопределено; + ОкончанияУсловныхОбластей = Новый Массив; + Для Каждого Область Из Области Цикл + Если Область.Индекс < ИндексНайденнойОбластиОкончание И ИндексНайденнойОбластиНачало < Область.Индекс Тогда + Если ЗначениеЗаполнено(Область.Коллекция) Тогда + ОбластьКоллекции = Область; + КонецЕсли; + ЭтоРодительОкончанияУсловия = + Область.УзелДереваДокумента.Строки.Найти(ИндексНайденнойОбластиОкончание, "Индекс", Истина) <> Неопределено; + Если ЭтоРодительОкончанияУсловия Тогда + Если ОбластьКоллекции <> Неопределено Тогда + УзелСледующейОбласти = НайтиГраницуСледующейОбласти(ОбластьКоллекции.УзелДереваДокумента, Области); + Если УзелСледующейОбласти <> Неопределено И УзелСледующейОбласти.Индекс < ИндексНайденнойОбластиОкончание Тогда + СтруктураОкончания = Новый Структура("УзелДереваДокумента, УсловиеОбласти"); + СтруктураОкончания.УзелДереваДокумента = УзелСледующейОбласти; + СтруктураОкончания.УсловиеОбласти = УсловиеОбласти; + ОкончанияУсловныхОбластей.Добавить(СтруктураОкончания); + КонецЕсли; + КонецЕсли; + + УзелСледующейОбласти = НайтиГраницуСледующейОбласти(ОбластьОкончания, Области); + Если УзелСледующейОбласти = Неопределено Тогда + Области.Удалить(Область); + Продолжить; + КонецЕсли; + Область.УзелДереваДокумента = УзелСледующейОбласти; + Область.Индекс = Область.УзелДереваДокумента.Индекс; + Иначе + Область.УсловиеОбласти = УсловиеОбласти; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Для Каждого СтруктураОкончания Из ОкончанияУсловныхОбластей Цикл + НоваяОбласть = Области.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяОбласть, СтруктураОкончания); + НоваяОбласть.Индекс = НоваяОбласть.УзелДереваДокумента.Индекс; + КонецЦикла; + + ДобавитьОбластьСУсловием(Области, ОбластьНачала); + ОбластьОкончания = ДеревоДокумента.Строки.Найти(ИндексНайденнойОбластиОкончание, "Индекс", Истина); + ДобавитьОбластьСУсловием(Области, ОбластьОкончания); + КонецЦикла; + + УдалитьТегиУсловныхОбластей(ИндексыНайденныхОбластейНачало, ДеревоДокумента); + УдалитьТегиУсловныхОбластей(ИндексыНайденныхОбластейОкончание, ДеревоДокумента); + + УзелНачала = ДеревоДокумента.Строки[0]; + Если Области.Найти(УзелНачала, "УзелДереваДокумента") = Неопределено Тогда + НоваяОбласть = Области.Добавить(); + НоваяОбласть.УзелДереваДокумента = УзелНачала; + НоваяОбласть.УсловиеОбласти = Неопределено; + НоваяОбласть.Коллекция = ""; + НоваяОбласть.Индекс = НоваяОбласть.УзелДереваДокумента.Индекс; + КонецЕсли; + + ДобавитьОбластиПереходныхУровней(Области, ДеревоДокумента); + + Для ИндексОбласти = 0 По Области.Количество()-1 Цикл + ТекущаяОбласть = СтруктураДокумента.Области[ИндексОбласти]; + СтруктураОбласти = СтруктураОбластиИзМакета(ДеревоДокумента, Области, ИндексОбласти, СтруктураДокумента.Гиперссылки); + ЗаполнитьЗначенияСвойств(ТекущаяОбласть, СтруктураОбласти); + КонецЦикла; + +КонецПроцедуры + +Функция ПолучитьИндексыМассиваУзлов(МассивУзлов) + Результат = Новый Массив; + + Для Каждого Узел Из МассивУзлов Цикл + Результат.Добавить(Узел.Индекс); + КонецЦикла; + + Возврат Результат; +КонецФункции + +Функция СтруктураОбластиИзМакета(ДеревоМакета, Области, ИндексОбласти, Гиперссылки) + ТекущаяОбласть = Области[ИндексОбласти]; + ИндексУзлаТекущейОбласти = ТекущаяОбласть.Индекс; + УзелНачалаОбласти = ТекущаяОбласть.УзелДереваДокумента; + РодительНачалаОбласти = УзелНачалаОбласти.Родитель; + Если РодительНачалаОбласти = Неопределено Тогда + КоллекцияПеребора = ДеревоМакета.Строки; + Иначе + КоллекцияПеребора = РодительНачалаОбласти.Строки; + КонецЕсли; + Если Области.Количество() = ИндексОбласти + 1 Тогда + ИндексСледующейОбласти = Неопределено; + ИндексУзлаСледующейОбласти = Неопределено; + Иначе + ИндексСледующейОбласти = ИндексОбласти + 1; + ИндексУзлаСледующейОбласти = Области[ИндексСледующейОбласти].Индекс; + КонецЕсли; + + + ДеревоОбласти = ДеревоДокумента(); + Для Каждого Узел Из КоллекцияПеребора Цикл + Если Узел.Индекс < ИндексУзлаТекущейОбласти Тогда + Продолжить; + КонецЕсли; + + Если ИндексУзлаСледующейОбласти <> Неопределено И Узел.Индекс >= ИндексУзлаСледующейОбласти Тогда + Прервать; + КонецЕсли; + + НовыйУзел = СкопироватьУзел(ДеревоОбласти, ДеревоОбласти.Строки.Количество(), Узел); + СоздатьПоследующие(НовыйУзел, Узел, ИндексУзлаСледующейОбласти); + КонецЦикла; + + ВосстановитьПолныйТекст(ДеревоОбласти, Гиперссылки); + + МассивПараметров = Новый Массив; + Для Каждого СтрокаДерева Из ДеревоОбласти.Строки Цикл + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивПараметров, УправлениеПечатью.НайтиПараметрыВТексте(СтрокаДерева.ПолныйТекст)); + КонецЦикла; + + МассивУзловГиперссылок = Новый Массив; + НайтиУзлыПоСодержимому(ДеревоОбласти, "w:hyperlink", МассивУзловГиперссылок); + + Для Каждого УзелГиперссылки Из МассивУзловГиперссылок Цикл + ТекстГиперссылки = Гиперссылки[УзелГиперссылки.Атрибуты["r:id"]]; + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивПараметров, УправлениеПечатью.НайтиПараметрыВТексте(ТекстГиперссылки)); + КонецЦикла; + + Результат = Новый Структура("ДеревоОбласти, Параметры"); + Результат.ДеревоОбласти = ДеревоОбласти; + Результат.Параметры = МассивПараметров; + + Возврат Результат; +КонецФункции + +// Параметры: +// СтрокаДерева - СтрокаДереваЗначений: см. ДеревоДокумента +// Ключ - Строка +// МассивУзлов - Массив из см. ДеревоДокумента +// +Функция НайтиУзлы(СтрокаДерева, Ключ, МассивУзлов) Экспорт + НайденыУзлы = Ложь; + Для Каждого Строка Из СтрокаДерева.Строки Цикл + КоличествоНайденныхУзлов = МассивУзлов.ВГраница(); + + КоличествоВхождений = СтрЧислоВхождений(Строка.ПолныйТекст, Ключ); + + Если КоличествоВхождений И Не НайтиУзлы(Строка, Ключ, МассивУзлов) Тогда + Если КоличествоНайденныхУзлов = МассивУзлов.ВГраница() Тогда + КоличествоВхождений = КоличествоВхождений - 1; + МассивУзлов.Добавить(Строка); + НайденыУзлы = Истина; + КонецЕсли; + КонецЕсли; + + КонецЦикла; + Возврат НайденыУзлы; +КонецФункции + +Функция МассивВСоответствие(Массив) + Соответствие = Новый Соответствие(); + Для Каждого Элемент Из Массив Цикл + Соответствие.Вставить(Элемент, Истина); + КонецЦикла; + Возврат Соответствие; +КонецФункции + +// Осуществляет поиск первого узла, в дереве или строке значений. +// +// Параметры: +// СтрокаДерева - см. ДеревоДокумента +// ИмяТега - Строка - имя тега +// МассивУзлов - см. ДеревоДокумента +// ИмяАтрибута - Неопределено, Строка - имя атрибута +// ЗначенияАтрибута - Неопределено, Строка, Массив, Произвольный - значения атрибута +// +// Возвращаемое значение: +// см. ДеревоДокумента +// +Функция НайтиУзелПоСодержимому(СтрокаДерева, ИмяТега, ИмяАтрибута = Неопределено, Знач ЗначенияАтрибута = Неопределено) Экспорт + МассивУзлов = Новый Массив; + ПараметрыПоискаУзлов = ПараметрыПоискаУзлов(); + ПараметрыПоискаУзлов.ИмяАтрибута = ИмяАтрибута; + ПараметрыПоискаУзлов.ЗначенияАтрибута = ЗначенияАтрибута; + ПараметрыПоискаУзлов.ПервоеЗначение = Истина; + НайтиУзлыПоСодержимому(СтрокаДерева, ИмяТега, МассивУзлов, ПараметрыПоискаУзлов); + Если МассивУзлов.Количество() = 1 Тогда + Возврат МассивУзлов[0]; + Иначе + Возврат Неопределено; + КонецЕсли; +КонецФункции + +// Параметры поиска узлов. +// +// Возвращаемое значение: +// Структура: +// * ИмяАтрибута - Неопределено +// * ЗначенияАтрибута - Неопределено +// * ПервоеЗначение - Булево +// * ТолькоПодчиненные - Булево +// +Функция ПараметрыПоискаУзлов() Экспорт + СтруктураПараметров = Новый Структура; + СтруктураПараметров.Вставить("ИмяАтрибута", Неопределено); + СтруктураПараметров.Вставить("ЗначенияАтрибута", Неопределено); + СтруктураПараметров.Вставить("ПервоеЗначение", Ложь); + СтруктураПараметров.Вставить("ВключатьПодчиненные", Истина); + Возврат СтруктураПараметров; +КонецФункции + +// Осуществляет поиск узлов, в дереве или строке значений. +// +// Параметры: +// СтрокаДерева - см. ДеревоДокумента +// ИмяТега - Строка - имя тега +// МассивУзлов - см. ДеревоДокумента +// ПараметрыПоиска - см. ПараметрыПоискаУзлов +// +Процедура НайтиУзлыПоСодержимому(СтрокаДерева, ИмяТега, МассивУзлов, ПараметрыПоиска = Неопределено) Экспорт + Если ПараметрыПоиска = Неопределено Тогда + ПараметрыПоиска = ПараметрыПоискаУзлов(); + КонецЕсли; + ИмяАтрибута = ПараметрыПоиска.ИмяАтрибута; + ЗначенияАтрибута = ПараметрыПоиска.ЗначенияАтрибута; + ПервоеЗначение = ПараметрыПоиска.ПервоеЗначение; + ВключатьПодчиненные = ПараметрыПоиска.ВключатьПодчиненные; + + Если ТипЗнч(ЗначенияАтрибута) = Тип("Строка") Тогда + ЗначенияАтрибута = СтрРазделить(ЗначенияАтрибута, ",", Ложь); + ЗначенияАтрибута = МассивВСоответствие(ЗначенияАтрибута); + ИначеЕсли ТипЗнч(ЗначенияАтрибута) = Тип("Массив") Тогда + ЗначенияАтрибута = МассивВСоответствие(ЗначенияАтрибута); + КонецЕсли; + + + ОтборПоТегу = Новый Структура("ИмяТега", ИмяТега); + + СтрокиПоТегу = СтрокаДерева.Строки.НайтиСтроки(ОтборПоТегу, ВключатьПодчиненные); + + Для Каждого Строка Из СтрокиПоТегу Цикл + Если ИмяАтрибута <> Неопределено Тогда + ТекущиеАтрибуты = Строка.Атрибуты; + ТекущееЗначениеАтрибута = ТекущиеАтрибуты.Получить(ИмяАтрибута); + Если ТекущееЗначениеАтрибута = Неопределено Тогда + Продолжить; + КонецЕсли; + + Если ЗначенияАтрибута <> Неопределено Тогда + Если ЗначенияАтрибута.Получить(ТекущееЗначениеАтрибута) = Неопределено Тогда + Продолжить; + КонецЕсли; + КонецЕсли; + КонецЕсли; + МассивУзлов.Добавить(Строка); + Если ПервоеЗначение Тогда + Возврат; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + + +Процедура ВосстановитьПолныйТекст(ДеревоXML, Гиперссылки) Экспорт + Для Каждого Строка Из ДеревоXML.Строки Цикл + ВосстановитьПолныйТекстРекурсивно(Строка, Гиперссылки); + КонецЦикла; +КонецПроцедуры + +Процедура ВосстановитьПолныйТекстРекурсивно(СтрокаДерева, Гиперссылки) + + СтрокаДерева.ПолныйТекст = ""; + + Если Не СтрокаДерева.Строки.Количество() Тогда + СтрокаДерева.ПолныйТекст = СтрокаДерева.Текст; + Если Гиперссылки <> Неопределено И СтрокаДерева.ИмяТега = "w:hyperlink" Тогда + ТекстСсылки = Гиперссылки[СтрокаДерева.Атрибуты["r:id"]]; + Если ТекстСсылки <> Неопределено Тогда + СтрокаДерева.ПолныйТекст = ТекстСсылки + СтрокаДерева.ПолныйТекст; + КонецЕсли; + КонецЕсли; + Иначе + Для Каждого ПодСтрока Из СтрокаДерева.Строки Цикл + ВосстановитьПолныйТекстРекурсивно(ПодСтрока, Гиперссылки); + СтрокаДерева.ПолныйТекст = СтрокаДерева.ПолныйТекст + ПодСтрока.ПолныйТекст; + Если Гиперссылки <> Неопределено И СтрокаДерева.ИмяТега = "w:hyperlink" Тогда + ТекстСсылки = Гиперссылки[СтрокаДерева.Атрибуты["r:id"]]; + Если ТекстСсылки <> Неопределено Тогда + СтрокаДерева.ПолныйТекст = ТекстСсылки + СтрокаДерева.ПолныйТекст; + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЕсли; +КонецПроцедуры + +// Возвращаемое значение: +// - СтрокаДереваЗначений: см. ДеревоДокумента +// - Неопределено +// +Функция НайтиУзел(Узел, Направление, Имя) + + КоллекцияСтрокУзла = Узел.Строки; + + КоличествоСтрок = КоллекцияСтрокУзла.Количество() - 1; + + Если Направление < 0 Тогда + Для к = 0 По КоличествоСтрок Цикл + СтрокаПоиска = КоллекцияСтрокУзла.Получить(КоличествоСтрок-к); + Если СтрокаПоиска.ИмяТега = Имя Тогда + Возврат СтрокаПоиска; + КонецЕсли; + КонецЦикла; + Иначе + Для к = 0 По КоличествоСтрок Цикл + СтрокаПоиска = КоллекцияСтрокУзла.Получить(к); + Если СтрокаПоиска.ИмяТега = Имя Тогда + Возврат СтрокаПоиска; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Возврат Неопределено; +КонецФункции + +Функция НайтиУзелРодитель(Узел, Имя) + Родитель = Узел.Родитель; + Если Родитель = Неопределено Тогда + Возврат Неопределено; + ИначеЕсли Родитель.ИмяТега = Имя Тогда + Возврат Родитель; + Иначе + Возврат НайтиУзелРодитель(Родитель, Имя); + КонецЕсли; +КонецФункции + +// Скопировать узел. +// +// Параметры: +// УзелРодителя - СтрокаДереваЗначений: +// * ИмяТега - Строка +// * Текст - Строка +// * ПолныйТекст - Строка +// * Атрибуты - Соответствие +// Индекс - Число - индекс +// Узел - Неопределено, СтрокаДереваЗначений: +// * ИмяТега - Строка +// * Текст - Строка +// * ПолныйТекст - Строка +// * Атрибуты - Соответствие +// +// Возвращаемое значение: +// СтрокаДереваЗначений: +// * ИмяТега - Строка +// * Текст - Строка +// * ПолныйТекст - Строка +// * Атрибуты - Соответствие +// +Функция СкопироватьУзел(УзелРодителя, Индекс, Узел) Экспорт + Если УзелРодителя.Строки.Количество() <= Индекс Тогда + УзелКлона = УзелРодителя.Строки.Добавить(); + Иначе + УзелКлона = УзелРодителя.Строки.Вставить(Индекс); + КонецЕсли; + ЗаполнитьЗначенияСвойств(УзелКлона, Узел, "ИмяТега,Текст,ПолныйТекст,Индекс"); + УзелКлона.Атрибуты = Новый Соответствие; + ОбщегоНазначенияКлиентСервер.ДополнитьСоответствие(УзелКлона.Атрибуты, Узел.Атрибуты); + + Возврат УзелКлона; +КонецФункции + +// Создает копии подчиненных узлов, в узле приемнике. +// +// Параметры: +// Приемник - см. УправлениеПечатьюСлужебный.ПрочитатьXMLВДерево +// Источник - см. УправлениеПечатьюСлужебный.ПрочитатьXMLВДерево +// +Процедура СоздатьПоследующие(НоваяСтрока, ТекущаяСтрока, НижнийИндекс = Неопределено) Экспорт + + Для Каждого ТСтрока Из ТекущаяСтрока.Строки Цикл + Если НижнийИндекс <> Неопределено И НижнийИндекс <= ТСтрока.Индекс Тогда + Прервать; + КонецЕсли; + НСтрока = СкопироватьУзел(НоваяСтрока, НоваяСтрока.Строки.Количество(), ТСтрока); + СоздатьПоследующие(НСтрока, ТСтрока, НижнийИндекс); + КонецЦикла; + +КонецПроцедуры + +Процедура ПолучитьОбластиИзДерева(УказательДерева, Области, ИменаТабличныхЧастей, КонецОбласти = Ложь) + Для Каждого Строка Из УказательДерева.Строки Цикл + Если СтрокаСодержитНачалоОбласти(Строка.ПолныйТекст, ИменаТабличныхЧастей) Тогда + + ЭтоКонецОбласти = СтрНайти(Строка.ПолныйТекст, "{/"+ИмяТегаУсловие()) <> 0; + Если Не Строка.Строки.Количество() Тогда + ДобавитьУзелОбласти(Области, Строка, ЭтоКонецОбласти, ИменаТабличныхЧастей); + Иначе + ПолучитьОбластиИзДерева(Строка, Области, ИменаТабличныхЧастей, ЭтоКонецОбласти); + КонецЕсли; + + // Поиск условий области + КрайняяОбласть = Области[Области.Количество()-1]; + Если КрайняяОбласть <> Неопределено И СтрНайти(Строка.ПолныйТекст, "{"+ИмяТегаУсловие()) И СтрНайти(Строка.ПолныйТекст, "}") И КрайняяОбласть.УсловиеОбласти = Неопределено Тогда + МассивУсловияНачало = СтрРазделить(Строка.ПолныйТекст, "{", Ложь); + Для к=0 По МассивУсловияНачало.ВГраница() Цикл + Если СтрНайти(МассивУсловияНачало[к], ИмяТегаУсловие()+" ") Тогда + МассивУсловияОкончания = СтрРазделить(МассивУсловияНачало[к], "}", Ложь); + КрайняяОбласть.УсловиеОбласти = СокрЛП(СтрЗаменить(МассивУсловияОкончания[0], ИмяТегаУсловие()+" ", "")); + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + ИначеЕсли СтрНайти(Строка.ПолныйТекст, "{") И Не Строка.Строки.Количество() Тогда + ДобавитьУзелОбласти(Области, Строка, КонецОбласти, ИменаТабличныхЧастей); + ИначеЕсли СтрНайти(Строка.ПолныйТекст, "{") Тогда + ПолучитьОбластиИзДерева(Строка, Области, ИменаТабличныхЧастей, ЭтоКонецОбласти); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Процедура ДобавитьУзелОбласти(Области, Строка, ЭтоКонецОбласти, ИменаТабличныхЧастей) + + Если СтрокаСодержитНачалоТабличнойЧасти(Строка.ПолныйТекст, ИменаТабличныхЧастей, Ложь) Тогда + УзелДереваДокумента = НайтиКореньТабличнойОбласти(Строка); + Если Области.Найти(УзелДереваДокумента, "УзелДереваДокумента") = Неопределено Тогда + НоваяОбласть = Области.Добавить(); + НоваяОбласть.УзелДереваДокумента = УзелДереваДокумента; + НоваяОбласть.УсловиеОбласти = Неопределено; + + Для каждого ИмяТабличнойЧасти Из ИменаТабличныхЧастей Цикл + Если СтрНайти(Строка.ПолныйТекст, "["+ИмяТабличнойЧасти+".") Тогда + Прервать; + КонецЕсли; + КонецЦикла; + НоваяОбласть.Коллекция = ИмяТабличнойЧасти; + + КонецЕсли; + Иначе + НоваяОбласть = Области.Добавить(); + НоваяОбласть.УзелДереваДокумента = Строка; + НоваяОбласть.УсловиеОбласти = Неопределено; + КонецЕсли; +КонецПроцедуры + +Функция НайтиКореньТабличнойОбласти(Строка) + Указатель = Строка; + + СтруктураРодителей = Новый Структура("Абзац, СтрокаТаблицы"); + + Пока ЗначениеЗаполнено(Указатель.Родитель) Цикл + Указатель = Указатель.Родитель; + Если Указатель.имяТега = "w:tr" И НЕ ЗначениеЗаполнено(СтруктураРодителей.СтрокаТаблицы) Тогда + СтруктураРодителей.СтрокаТаблицы = Указатель; + ИначеЕсли Указатель.имяТега = "w:p" И НЕ ЗначениеЗаполнено(СтруктураРодителей.Абзац) Тогда + СтруктураРодителей.Абзац = Указатель; + КонецЕсли; + КонецЦикла; + + Возврат ?(ЗначениеЗаполнено(СтруктураРодителей.СтрокаТаблицы), СтруктураРодителей.СтрокаТаблицы, СтруктураРодителей.Абзац); + +КонецФункции + +Функция ПолучитьСледующийУзел(Узел) + УзелРодитель = Узел.Родитель; + Индекс = УзелРодитель.Строки.Индекс(Узел); + Если Индекс + 1 = УзелРодитель.Строки.Количество() Тогда + Возврат ПолучитьСледующийУзел(УзелРодитель); + Иначе + Возврат УзелРодитель.Строки[Индекс+1]; + КонецЕсли; +КонецФункции + +Функция НайтиГраницуСледующейОбласти(Строка, Области) + Родитель = Строка.Родитель; + Если Родитель = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + ИндексСледующегоУзла = Родитель.Строки.Индекс(Строка)+1; + ПерейтиКРодителю = Ложь; + Если ИндексСледующегоУзла = Родитель.Строки.Количество() Тогда + ПерейтиКРодителю = Истина; + Иначе + Для ИндексСтроки = Родитель.Строки.Индекс(Строка)+1 По Родитель.Строки.Количество()-1 Цикл + ПерейтиКРодителю = Родитель.Строки[ИндексСтроки].ПолныйТекст = ""; + Если Не ПерейтиКРодителю Тогда + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если ПерейтиКРодителю Тогда + + Возврат НайтиГраницуСледующейОбласти(Родитель, Области); + + Иначе + + УзелНачалаОбласти = Родитель.Строки[ИндексСледующегоУзла]; + + ЭтоНачалоТаблицы = УзелНачалаОбласти.ИмяТега = "w:tbl"; + Если ЭтоНачалоТаблицы Тогда + ЕстьУзлыПредшественники = Родитель.Строки.Количество() > 2; + Если ЕстьУзлыПредшественники Тогда + УзелПредшественника = ТаблицаПредшественник(Родитель, ИндексСледующегоУзла-1); + Если УзелПредшественника <> Неопределено Тогда + СовместитьСеткуКолонок(УзелНачалаОбласти, УзелПредшественника); + + Пока Истина Цикл + УзелДляСовмещения = ТаблицаПредшественник(Родитель, Родитель.Строки.Индекс(УзелПредшественника)-1); + Если УзелДляСовмещения <> Неопределено Тогда + СовместитьСеткуКолонок(УзелНачалаОбласти, УзелДляСовмещения); + Иначе + Прервать; + КонецЕсли; + КонецЦикла; + + СтрокиТаблицы = Новый Массив(); + НайтиУзлыПоСодержимому(УзелНачалаОбласти, "w:tr", СтрокиТаблицы); + ПервыйДобавленныйУзел = Неопределено; + Для Каждого СтрокаТаблицы Из СтрокиТаблицы Цикл + НовыйУзел = СкопироватьУзел(УзелПредшественника, УзелПредшественника.Строки.Количество(), СтрокаТаблицы); + СоздатьПоследующие(НовыйУзел, СтрокаТаблицы); + ПервыйДобавленныйУзел = ?(ПервыйДобавленныйУзел = Неопределено, НовыйУзел, ПервыйДобавленныйУзел); + + ОбластьДляПодмены = Области.Найти(НовыйУзел.Индекс, "Индекс"); + Если ОбластьДляПодмены <> Неопределено Тогда + ОбластьДляПодмены.УзелДереваДокумента = НовыйУзел; + КонецЕсли; + КонецЦикла; + + Родитель.Строки.Удалить(УзелНачалаОбласти); + Возврат ПервыйДобавленныйУзел; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Возврат Родитель.Строки[ИндексСледующегоУзла]; + КонецЕсли; +КонецФункции + +Функция ТаблицаПредшественник(Родитель, ИндексТекущегоУзла) + + Для ИндексПоиска = 1 По ИндексТекущегоУзла Цикл + УзелПредшественника = Родитель.Строки[ИндексТекущегоУзла-ИндексПоиска]; + Если УзелПредшественника.ИмяТега = "w:tbl" Тогда + Возврат УзелПредшественника; + ИначеЕсли УзелПредшественника.ИмяТега = "w:p" И СтрНачинаетсяС(УзелПредшественника.ПолныйТекст, "{"+ИмяТегаУсловие()) + И СтрЗаканчиваетсяНа(УзелПредшественника.ПолныйТекст, "}") Тогда + Продолжить; + КонецЕсли; + Возврат Неопределено; + КонецЦикла; + Возврат Неопределено; + +КонецФункции + +Процедура СовместитьСеткуКолонок(УзелНачалаОбласти, УзелПредшественника) + + УзелСеткиСтолбцовПредшественника = НайтиУзелПоСодержимому(УзелПредшественника, "w:tblGrid"); + УзелСеткиСтолбцовДобавления = НайтиУзелПоСодержимому(УзелНачалаОбласти, "w:tblGrid"); + МассивСетки = Новый Массив; + МассивСеткиПредшественника = Новый Массив; + ТекущаяШирина = 0; + Для Каждого УзелСетки Из УзелСеткиСтолбцовПредшественника.Строки Цикл + ТекущаяШирина = ТекущаяШирина + Число(УзелСетки.Атрибуты["w:w"]); + МассивСетки.Добавить(ТекущаяШирина); + МассивСеткиПредшественника.Добавить(ТекущаяШирина); + КонецЦикла; + + МассивСеткиДобавления = Новый Массив; + ТекущаяШирина = 0; + Для Каждого УзелСетки Из УзелСеткиСтолбцовДобавления.Строки Цикл + ТекущаяШирина = ТекущаяШирина + Число(УзелСетки.Атрибуты["w:w"]); + МассивСеткиДобавления.Добавить(ТекущаяШирина); + ШиринаКлетокМассива = 0; + Для ИндексСетки = 0 По МассивСетки.ВГраница() Цикл + Если ТекущаяШирина = МассивСетки[ИндексСетки] Тогда + Прервать; + ИначеЕсли ТекущаяШирина > МассивСетки[ИндексСетки] + И МассивСетки.ВГраница() = ИндексСетки Тогда + МассивСетки.Добавить(ТекущаяШирина); + ИначеЕсли (ТекущаяШирина > МассивСетки[ИндексСетки] + И ТекущаяШирина < МассивСетки[ИндексСетки+1]) Тогда + МассивСетки.Вставить(ИндексСетки+1, ТекущаяШирина); + Прервать; + КонецЕсли; + ШиринаКлетокМассива = ШиринаКлетокМассива + МассивСетки[ИндексСетки]; + КонецЦикла; + КонецЦикла; + + МассивКоличестваКолонокПредшественника = ИспользованиеКолонок(УзелСеткиСтолбцовПредшественника, МассивСетки); + МассивКоличестваКолонокДобавления = ИспользованиеКолонок(УзелСеткиСтолбцовДобавления, МассивСетки); + + УстановитьСетку(УзелПредшественника, МассивСетки); + УстановитьСетку(УзелНачалаОбласти, МассивСетки); + + УстановитьИспользованиеСетки(УзелПредшественника, МассивКоличестваКолонокПредшественника); + УстановитьИспользованиеСетки(УзелНачалаОбласти, МассивКоличестваКолонокДобавления); + +КонецПроцедуры + +Функция ИспользованиеКолонок(УзелСеткиСтолбцовПредшественника, МассивСетки) + + ИспользованиеКолонок = Новый Массив; + ТекущаяШирина = 0; + ИспользованоКолонокСетки = 0; + НомерПредыдущейКолонки = 0; + Для Каждого УзелСетки Из УзелСеткиСтолбцовПредшественника.Строки Цикл + ТекущаяШирина = ТекущаяШирина + Число(УзелСетки.Атрибуты["w:w"]); + КоличествоКолонок = МассивСетки.Найти(ТекущаяШирина) - НомерПредыдущейКолонки + 1; + НомерПредыдущейКолонки = МассивСетки.Найти(ТекущаяШирина)+1; + ИспользованиеКолонок.Добавить(КоличествоКолонок); + ИспользованоКолонокСетки = ИспользованоКолонокСетки + КоличествоКолонок; + КонецЦикла; + + Если ИспользованоКолонокСетки < МассивСетки.Количество() Тогда + ИспользованиеКолонок[ИспользованиеКолонок.ВГраница()] = ИспользованиеКолонок[ИспользованиеКолонок.ВГраница()] + + МассивСетки.Количество() - ИспользованоКолонокСетки; + КонецЕсли; + + Возврат ИспользованиеКолонок; + +КонецФункции + +Процедура УстановитьСетку(УзелПредшественника, МассивСетки) + + УзелОпределенияСетки = НайтиУзелПоСодержимому(УзелПредшественника, "w:tblGrid"); + УзелОпределенияСетки.Строки.Очистить(); + ТекущаяШирина = 0; + Для Каждого ЭлементСетки Из МассивСетки Цикл + УзелОпределенияСеткиКолонки = УзелОпределенияСетки.Строки.Добавить(); + УзелОпределенияСеткиКолонки.ИмяТега = "w:gridCol"; + УзелОпределенияСеткиКолонки.Атрибуты.Вставить("w:w", Формат(ЭлементСетки-ТекущаяШирина, "ЧГ=;")); + ТекущаяШирина = ЭлементСетки; + КонецЦикла; + +КонецПроцедуры + +Процедура УстановитьИспользованиеСетки(Узел, Знач МассивКоличестваКолонок) + МассивУзловСтрок = Новый Массив; + ПараметрыПоиска = ПараметрыПоискаУзлов(); + ПараметрыПоиска.ВключатьПодчиненные = Ложь; + НайтиУзлыПоСодержимому(Узел, "w:tr", МассивУзловСтрок, ПараметрыПоиска); + + Для Каждого УзелСтроки Из МассивУзловСтрок Цикл + ПараметрыПоиска = ПараметрыПоискаУзлов(); + ПараметрыПоиска.ВключатьПодчиненные = Ложь; + МассивУзловКолонок = Новый Массив; + НайтиУзлыПоСодержимому(УзелСтроки, "w:tc", МассивУзловКолонок, ПараметрыПоиска); + ИндексИспользованныхРанее = 0; + Для ИндексКолонки = 0 По МассивУзловКолонок.ВГраница() Цикл + УзелКолонки = МассивУзловКолонок[ИндексКолонки]; + УзелСвойствКолонки = НайтиУзелПоСодержимому(УзелКолонки, "w:tcPr"); + УзелОпределенияСетки = НайтиУзелПоСодержимому(УзелСвойствКолонки, "w:gridSpan"); + Если УзелОпределенияСетки = Неопределено Тогда + УзелОпределенияСетки = УзелСвойствКолонки.Строки.Добавить(); + УзелОпределенияСетки.ИмяТега = "w:gridSpan"; + КоличествоКолонокСетки = МассивКоличестваКолонок[ИндексКолонки]; + Иначе + КоличествоКолонокСетки = 0; + РанееКоличествоКолонокСетки = Число("0"+УзелОпределенияСетки.Атрибуты["w:val"]); + Для ИндексИспользованныхВСтаройСетке = ИндексИспользованныхРанее По ИндексИспользованныхРанее + РанееКоличествоКолонокСетки - 1 Цикл + КоличествоКолонокСетки = КоличествоКолонокСетки + МассивКоличестваКолонок[ИндексИспользованныхВСтаройСетке]; + КонецЦикла; + ИндексИспользованныхРанее = ИндексИспользованныхВСтаройСетке; + КонецЕсли; + УзелОпределенияСетки.Атрибуты.Вставить("w:val", Формат(КоличествоКолонокСетки, "ЧГ=;")); + КонецЦикла; + КонецЦикла; +КонецПроцедуры + +Функция ИмяТегаУсловие() + Возврат УправлениеПечатьюКлиентСервер.ИмяТегаУсловие(); +КонецФункции + +Функция ПолучитьУсловиеОбласти(Область) + МассивУсловияНачало = СтрРазделить(Область.ПолныйТекст, "{", Ложь); + Для к=0 По МассивУсловияНачало.ВГраница() Цикл + Если СтрНайти(МассивУсловияНачало[к], ИмяТегаУсловие()+" ") Тогда + МассивУсловияОкончания = СтрРазделить(МассивУсловияНачало[к], "}", Ложь); + Возврат СокрЛП(СтрЗаменить(МассивУсловияОкончания[0], ИмяТегаУсловие()+" ", "")); + КонецЕсли; + КонецЦикла; + Возврат Неопределено; +КонецФункции + +Функция СтрокаСодержитНачалоОбласти(Знач Текст, ИменаТабличныхЧастей) + Результат = СтрНайти(Текст, "{"+ИмяТегаУсловие()+" ") ИЛИ СтрНайти(Текст, "{/"+ИмяТегаУсловие()); + + СтрокаСодержитНачалоТабличнойЧасти(Текст, ИменаТабличныхЧастей, Результат); + + Возврат Результат; +КонецФункции + +Функция СтрокаСодержитНачалоТабличнойЧасти(Текст, ИменаТабличныхЧастей, Результат) + + Если Не Результат Тогда + Для каждого ИмяТабличнойЧасти Из ИменаТабличныхЧастей Цикл + Результат = Результат ИЛИ СтрНайти(Текст, "["+ИмяТабличнойЧасти+"."); + Если Результат Тогда + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Возврат Результат; +КонецФункции + +Функция ПолучитьПечатнуюФорму(ДеревоМакета, АдресХранилища = Неопределено) Экспорт + + ПутьКДокументу = СобратьФайлОфисногоДокумента(ДеревоМакета); + ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКДокументу); + АдресХранилищаПечатнойФормы = ПоместитьВоВременноеХранилище(ДвоичныеДанные, + ?(АдресХранилища = Неопределено, Новый УникальныйИдентификатор, АдресХранилища)); + + УдалитьФайлы(ПутьКДокументу); + УдалитьФайлы(ДеревоМакета.ИмяКаталога); + + Возврат АдресХранилищаПечатнойФормы; +КонецФункции + +// Собрать файл офисного документа. +// +// Параметры: +// ДеревоМакета - см. УправлениеПечатьюСлужебный.ИнициализироватьДокументСКД. +// Кодировка - Строка - кодировка +// +// Возвращаемое значение: +// Строка - путь к сформированному документу +// +Функция СобратьФайлОфисногоДокумента(ДеревоМакета, Кодировка = "UTF-8") Экспорт + СтруктураДокумента = ДеревоМакета.СтруктураДокумента; + Дерево = СтруктураДокумента.ДеревоДокумента; + + ИзменяемыеФайлы = Новый Соответствие; + ИзменяемыеФайлы.Вставить("СвязиКонтента", ДеревоМакета.ИмяКаталога + УстановитьРазделительПути("\word\_rels\document.xml.rels")); + ИзменяемыеФайлы.Вставить("ТипыКонтента", ДеревоМакета.ИмяКаталога + УстановитьРазделительПути("\[Content_Types].xml")); + ИзменяемыеФайлы.Вставить("Документ", ДеревоМакета.ИмяКаталога + УстановитьРазделительПути("\word\document.xml")); + + + ЗаписьXML = ИнициализироватьЗаписьXML("", ИзменяемыеФайлы.Получить("Документ")); + ПоместитьДеревоВЗаписьXML(ЗаписьXML, Дерево); + ЗаписьXML.Закрыть(); + + МассивФайловКолонтитулов = Новый Массив; + + Для Каждого Колонтитул Из СтруктураДокумента.Колонтитулы Цикл + ИмяФайла = ДеревоМакета.ИмяКаталога + УстановитьРазделительПути("\word\") + Колонтитул.Ключ + ".xml"; + Если Не Колонтитул.Значение.Строки.Количество() Тогда + Продолжить; + КонецЕсли; + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML = ИнициализироватьЗаписьXML("", ИмяФайла); + Для каждого Подстрока Из Колонтитул.Значение.Строки Цикл + ЗаписатьЭлемент(ЗаписьXML, Подстрока); + КонецЦикла; + ЗаписьXML.Закрыть(); + + МассивФайловКолонтитулов.Добавить(Колонтитул.Ключ); + КонецЦикла; + + // Обрабатываем связи контента + + ЗаписьXML = ИнициализироватьЗаписьXML("", ИзменяемыеФайлы.Получить("СвязиКонтента")); + ПоместитьДеревоВЗаписьXML(ЗаписьXML, СтруктураДокумента.СвязиКонтента); + ЗаписьXML.Закрыть(); + + // Обрабатываем типы контента + + ЗаписьXML = ИнициализироватьЗаписьXML("", ИзменяемыеФайлы.Получить("ТипыКонтента")); + ПоместитьДеревоВЗаписьXML(ЗаписьXML, СтруктураДокумента.ТипыКонтента); + ЗаписьXML.Закрыть(); + + ПутьКДокументу = ПолучитьИмяВременногоФайла("DOCX"); + СобратьКонтейнерДокументаDOCX(ПутьКДокументу, ДеревоМакета.ИмяКаталога); + Возврат ПутьКДокументу; + +КонецФункции + +Процедура ЗаписатьЭлемент(ЗаписьXML, СтрокаДерева) + Если СтрокаДерева.Атрибуты["o:gfxdata"] <> Неопределено Тогда + КонструкторТега = ИнициализироватьЗаписьXML("",,, Ложь); + КонструкторТега.ЗаписатьНачалоЭлемента(СтрокаДерева.ИмяТега); + Для Каждого Атрибут Из СтрокаДерева.Атрибуты Цикл + КонструкторТега.ЗаписатьНачалоАтрибута(Атрибут.Ключ); + Если Атрибут.Ключ = "o:gfxdata" Тогда + КонструкторТега.ЗаписатьТекст(""); + Иначе + КонструкторТега.ЗаписатьТекст(Атрибут.Значение); + КонецЕсли; + КонструкторТега.ЗаписатьКонецАтрибута(); + КонецЦикла; + КонструкторТега.ЗаписатьКонецЭлемента(); + ПредставлениеТега = КонструкторТега.Закрыть(); + ПредставлениеАтрибута = "o:gfxdata="""+СтрЗаменить(СтрокаДерева.Атрибуты["o:gfxdata"], Символ(10), " ")+""""; + ПредставлениеТега = СтрЗаменить(ПредставлениеТега, "o:gfxdata=""""", ПредставлениеАтрибута); + ЗаписьXML.ЗаписатьБезОбработки(ПредставлениеТега); + Иначе + ЗаписьXML.ЗаписатьНачалоЭлемента(СтрокаДерева.ИмяТега); + Для Каждого Атрибут Из СтрокаДерева.Атрибуты Цикл + ЗаписьXML.ЗаписатьАтрибут(Атрибут.Ключ, Атрибут.Значение); + КонецЦикла; + + Если СтрокаДерева.Текст <> "" Тогда + ТекстЗаписи = СтрокаДерева.Текст; + Если СтрНачинаетсяС(ТекстЗаписи, " HYPERLINK ") Тогда + МассивПоля = СтрРазделить(ТекстЗаписи, """"); + МассивПоля[1] = КодироватьСтроку(МассивПоля[1], СпособКодированияСтроки.КодировкаURL); + ТекстЗаписи = СтрСоединить(МассивПоля,""""); + КонецЕсли; + ЗаписьXML.ЗаписатьТекст(ТекстЗаписи); + КонецЕсли; + + Для каждого Подстрока Из СтрокаДерева.Строки Цикл + ЗаписатьЭлемент(ЗаписьXML, Подстрока); + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьЗначениеВДокумент(Узел, СоответствиеЗамены, ДеревоМакета, ДобавлятьСвязи) Экспорт + СтруктураДокумента = ДеревоМакета.СтруктураДокумента; + Если Узел.ИмяТега = "w:hyperlink" Тогда + Гиперссылки = СтруктураДокумента.Гиперссылки; + ТекстГиперссылки = Гиперссылки[Узел.Атрибуты["r:id"]]; + Если СтрНайти(ТекстГиперссылки, СоответствиеЗамены.Ключ) = 0 Тогда + Возврат; + КонецЕсли; + ТекстГиперссылки = СтрЗаменить(ТекстГиперссылки, СоответствиеЗамены.Ключ, СоответствиеЗамены.Значение); + Если ДобавлятьСвязи Тогда + ИдРесурса = ДеревоМакета.СтруктураДокумента.МаксимальныйИдентификаторСвязи + 1; + ДеревоМакета.СтруктураДокумента.МаксимальныйИдентификаторСвязи = ИдРесурса; + ПолныйИдентификатор = "rId" + Формат(ИдРесурса, "ЧГ=0"); + Узел.Атрибуты["r:id"] = ПолныйИдентификатор; + + Гиперссылки.Вставить(ПолныйИдентификатор, ТекстГиперссылки); + УзелСвязей = ДеревоМакета.СтруктураДокумента.СвязиКонтента.Строки[0]; + УзелСвязейГиперссылки = УзелСвязей.Строки.Добавить(); + УзелСвязейГиперссылки.ИмяТега = "Relationship"; + УзелСвязейГиперссылки.Атрибуты.Вставить("Id", ПолныйИдентификатор); + УзелСвязейГиперссылки.Атрибуты.Вставить("Target", ТекстГиперссылки); + УзелСвязейГиперссылки.Атрибуты.Вставить("Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"); + УзелСвязейГиперссылки.Атрибуты.Вставить("TargetMode", "External"); + Иначе + ПолныйИдентификатор = Узел.Атрибуты["r:id"]; + МассивНайденныхУзлов = Новый Массив; + ПараметрыПоиска = ПараметрыПоискаУзлов(); + ПараметрыПоиска.ИмяАтрибута = "Id"; + ПараметрыПоиска.ЗначенияАтрибута = ПолныйИдентификатор; + НайтиУзлыПоСодержимому(ДеревоМакета.СтруктураДокумента.СвязиКонтента, "Relationship", МассивНайденныхУзлов, ПараметрыПоиска); + Если МассивНайденныхУзлов.Количество() <> 0 Тогда + МассивНайденныхУзлов[0].Атрибуты.Вставить("Target", ТекстГиперссылки); + Гиперссылки.Вставить(ПолныйИдентификатор, ТекстГиперссылки); + КонецЕсли; + КонецЕсли; + + ИначеЕсли ДеревоМакета = Неопределено Или ТипЗнч(СоответствиеЗамены.Значение) <> Тип("Структура") Тогда + Если СтрНайти(СоответствиеЗамены.Ключ, ".ШтампЭП") Тогда + Узел.ИмяТега = "w:bookmarkStart"; + Узел.Текст = ""; + Узел.ПолныйТекст = ""; + Узел.Атрибуты.Очистить(); + Узел.Атрибуты.Вставить("w:id", "1"); + Узел.Атрибуты.Вставить("w:name", "V8DSStamp"); + Узел.Строки.Очистить(); + + УзелОкончанияЗакладки = СкопироватьУзел(Узел.Родитель, Узел.Родитель.Строки.Индекс(Узел)+1, Узел); + УзелОкончанияЗакладки.ИмяТега = "w:bookmarkEnd"; + УзелОкончанияЗакладки.Атрибуты.Удалить("w:name"); + Иначе + Узел.Текст = СтрЗаменить(Узел.Текст, СоответствиеЗамены.Ключ, СоответствиеЗамены.Значение); + КонецЕсли; + + Иначе + СтруктураЗначения = СоответствиеЗамены.Значение; + + Если Не ЭтоАдресВременногоХранилища(СтруктураЗначения.АдресКартинки) Тогда + Узел.Текст = ""; + Возврат; + КонецЕсли; + + ДвоичныеДанные = ПолучитьИзВременногоХранилища(СтруктураЗначения.АдресКартинки); // ДвоичныеДанные - + + СтруктураКартинка = Новый Структура; + СтруктураКартинка.Вставить("ДвоичныеДанные", ДвоичныеДанные); + СтруктураКартинка.Вставить("ИмяКартинки", "image"); + + ПараметрыКартинки = ПолучитьАтрибутыИзображения(ДвоичныеДанные); + + Если ПараметрыКартинки.Количество() = 0 ИЛИ ПараметрыКартинки.ТипИзображения = Null Тогда + Узел.Текст = ""; + Возврат; + КонецЕсли; + + РазмерыКартинки = Новый Структура("Ширина,Высота",0,0); + ЗаполнитьЗначенияСвойств(РазмерыКартинки, СтруктураЗначения); + + РазрешениеОсновногоЭкрана = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("РазрешениеОсновногоЭкрана"); + РазрешениеОсновногоЭкрана = ?(РазрешениеОсновногоЭкрана = Неопределено, 72, РазрешениеОсновногоЭкрана); + + УзелДляПоиска = ДеревоМакета.СтруктураДокумента.ДеревоДокумента.Строки.Найти(Узел.Индекс, "Индекс", Истина); + УзелТаблицы = НайтиУзелРодитель(УзелДляПоиска, "w:tbl"); + Если УзелТаблицы = Неопределено Тогда + ШиринаКлеткиТаблицы = 0; + Иначе + + УзелОписанияШириныТаблицы = НайтиУзелПоСодержимому(УзелТаблицы, "w:tblW"); + + ТипDXA = Ложь; + ТипPCT = Ложь; + + ШиринаТаблицы = УзелОписанияШириныТаблицы.Атрибуты["w:w"]; + ТипШирины = УзелОписанияШириныТаблицы.Атрибуты["w:type"]; + + УзелЯчейки = НайтиУзелРодитель(УзелДляПоиска, "w:tc"); + УзелОписанияШириныЯчейки = НайтиУзелПоСодержимому(УзелЯчейки, "w:tcW"); + ШиринаКлеткиТаблицы = УзелОписанияШириныЯчейки.Атрибуты["w:w"]; + + Если ТипШирины = "auto" Тогда + ТипDXA = Ложь; + ИначеЕсли ТипШирины = "dxa" Тогда + ТипDXA = Истина; + ИначеЕсли ТипШирины = "pct" Тогда + ТипPCT = Истина; + КонецЕсли; + + Если НЕ ТипDXA ИЛИ (ТипPCT И ШиринаТаблицы = 0) Тогда + ШиринаКлеткиТаблицы = 0; + ИначеЕсли ТипPCT И НЕ ШиринаТаблицы = 0 Тогда + + // 5000 - значение равное 100% для типа "pct". + // ПолеРодитель - в значениях dxa. + + ШиринаКлеткиТаблицы = ШиринаТаблицы * ШиринаКлеткиТаблицы / 50 / 100; + + КонецЕсли; + КонецЕсли; + + Если НЕ ШиринаКлеткиТаблицы = 0 Тогда + + ОтношениеВысотыКШирине = ПараметрыКартинки.Высота / ПараметрыКартинки.Ширина; + + ШиринаКартинки = ШиринаКлеткиТаблицы * 914400 / РазрешениеОсновногоЭкрана / 20; + ВысотаКартинки = ОтношениеВысотыКШирине * ШиринаКлеткиТаблицы * 914400 / РазрешениеОсновногоЭкрана / 20; + + Иначе + + Если ЗначениеЗаполнено(РазмерыКартинки.Высота) ИЛИ ЗначениеЗаполнено(РазмерыКартинки.Ширина) Тогда + + КоэффициентПересчета = 914400/2.54/10; + Если РазмерыКартинки.Ширина <> 0 Тогда + ШиринаКартинки = КоэффициентПересчета * РазмерыКартинки.Ширина; + КоэффициентМасштабирования = ШиринаКартинки/ПараметрыКартинки.Ширина; + КонецЕсли; + + Если РазмерыКартинки.Высота <> 0 Тогда + ВысотаКартинки = КоэффициентПересчета * РазмерыКартинки.Высота; + КоэффициентМасштабирования = ВысотаКартинки/ПараметрыКартинки.Высота; + КонецЕсли; + + Если РазмерыКартинки.Ширина = 0 Тогда + ШиринаКартинки = КоэффициентМасштабирования*ПараметрыКартинки.Ширина; + КонецЕсли; + + Если РазмерыКартинки.Высота = 0 Тогда + ВысотаКартинки = КоэффициентМасштабирования*ПараметрыКартинки.Высота; + КонецЕсли; + + Иначе + КоэффициентМасштаба = 2; + КоэффициентПропорций = 914400 / (РазрешениеОсновногоЭкрана * КоэффициентМасштаба); + + ШиринаКартинки = КоэффициентПропорций * ПараметрыКартинки.Ширина; + ВысотаКартинки = КоэффициентПропорций * ПараметрыКартинки.Высота; + КонецЕсли; + КонецЕсли; + + ШиринаКартинки = Окр(ШиринаКартинки, 0); + ВысотаКартинки = Окр(ВысотаКартинки, 0); + + СтруктураКартинка.Вставить("РасширениеКартинки", СтрЗаменить(ПараметрыКартинки.ТипИзображения, "image/", "")); + СтруктураКартинка.Вставить("ШиринаКартинки", ШиринаКартинки); + СтруктураКартинка.Вставить("ВысотаКартинки", ВысотаКартинки); + + + ВнестиКартинкуВБиблиотекуДокументаСКД(ДеревоМакета, СтруктураКартинка); + ШаблонКартинкиXML = ПолучитьШаблонКартинки(); + ПодготовитьШаблонКЧтениюXML(ШаблонКартинкиXML); + ПодготовитьШаблонКартинки(ШаблонКартинкиXML, СтруктураКартинка); + ДеревоКартинки = ПрочитатьСтрокуXMLВДерево(СтруктураКартинка.ТекстКартинки); + + УзелДокументаКартинки = ДеревоКартинки.Строки[0]; + ИндексРазмещения = Узел.Родитель.Строки.Индекс(Узел); + + МассивЧастейТекста = СтрРазделить(СтрЗаменить(Узел.Текст, СоответствиеЗамены.Ключ, Символы.ПС), Символы.ПС); + Для СчетчикЧастей = 0 По МассивЧастейТекста.ВГраница() Цикл + ЧастьТекста = МассивЧастейТекста[СчетчикЧастей]; + Если ЧастьТекста <> "" Тогда + ДобавляемыйУзел = СкопироватьУзел(Узел.Родитель, ИндексРазмещения, Узел); + ДобавляемыйУзел.Текст = ЧастьТекста; + ИндексРазмещения = ИндексРазмещения + 1; + КонецЕсли; + + Если СчетчикЧастей < МассивЧастейТекста.ВГраница() Тогда + Для Каждого УзелКартинки Из УзелДокументаКартинки.Строки Цикл + ДобавляемыйУзел = СкопироватьУзел(Узел.Родитель, ИндексРазмещения+1, УзелКартинки); + СоздатьПоследующие(ДобавляемыйУзел, УзелКартинки); + ИндексРазмещения = ИндексРазмещения + 1; + КонецЦикла; + КонецЕсли; + КонецЦикла; + Узел.Родитель.Строки.Удалить(Узел); + + КонецЕсли; + +КонецПроцедуры + +Процедура ПодготовитьШаблонКЧтениюXML(ШаблонКартинкиXML) + ШаблонКартинкиXML = "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?> + |<w:document xmlns:wpc=""http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"" xmlns:cx=""http://schemas.microsoft.com/office/drawing/2014/chartex"" xmlns:cx1=""http://schemas.microsoft.com/office/drawing/2015/9/8/chartex"" xmlns:cx2=""http://schemas.microsoft.com/office/drawing/2015/10/21/chartex"" xmlns:cx3=""http://schemas.microsoft.com/office/drawing/2016/5/9/chartex"" xmlns:cx4=""http://schemas.microsoft.com/office/drawing/2016/5/10/chartex"" xmlns:cx5=""http://schemas.microsoft.com/office/drawing/2016/5/11/chartex"" xmlns:cx6=""http://schemas.microsoft.com/office/drawing/2016/5/12/chartex"" xmlns:cx7=""http://schemas.microsoft.com/office/drawing/2016/5/13/chartex"" xmlns:cx8=""http://schemas.microsoft.com/office/drawing/2016/5/14/chartex"" xmlns:mc=""http://schemas.openxmlformats.org/markup-compatibility/2006"" xmlns:aink=""http://schemas.microsoft.com/office/drawing/2016/ink"" xmlns:am3d=""http://schemas.microsoft.com/office/drawing/2017/model3d"" xmlns:o=""urn:schemas-microsoft-com:office:office"" xmlns:r=""http://schemas.openxmlformats.org/officeDocument/2006/relationships"" xmlns:m=""http://schemas.openxmlformats.org/officeDocument/2006/math"" xmlns:v=""urn:schemas-microsoft-com:vml"" xmlns:wp14=""http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing"" xmlns:wp=""http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"" xmlns:w10=""urn:schemas-microsoft-com:office:word"" xmlns:w=""http://schemas.openxmlformats.org/wordprocessingml/2006/main"" xmlns:w14=""http://schemas.microsoft.com/office/word/2010/wordml"" xmlns:w15=""http://schemas.microsoft.com/office/word/2012/wordml"" xmlns:w16cid=""http://schemas.microsoft.com/office/word/2016/wordml/cid"" xmlns:w16se=""http://schemas.microsoft.com/office/word/2015/wordml/symex"" xmlns:wpg=""http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"" xmlns:wpi=""http://schemas.microsoft.com/office/word/2010/wordprocessingInk"" xmlns:wne=""http://schemas.microsoft.com/office/word/2006/wordml"" xmlns:wps=""http://schemas.microsoft.com/office/word/2010/wordprocessingShape"" mc:Ignorable=""w14 w15 w16se w16cid wp14"">" + + ШаблонКартинкиXML + +"</w:document>"; +КонецПроцедуры + +Процедура ВнестиКартинкуВБиблиотекуДокументаСКД(ДеревоМакета, СтруктураКартинка) + + КаталогКартинок = ДеревоМакета.СтруктураДокумента.КаталогКартинок; + + КаталогMedia = Новый Файл(КаталогКартинок); + ТипКартинка = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"; + + Если НЕ КаталогMedia.Существует() Тогда + СоздатьКаталог(КаталогКартинок); + КонецЕсли; + + УзелСвязей = ДеревоМакета.СтруктураДокумента.СвязиКонтента.Строки[0]; + РасширениеКартинки = СтруктураКартинка.РасширениеКартинки; + + ИдРесурса = ДеревоМакета.СтруктураДокумента.МаксимальныйИдентификаторСвязи + 1; + УзелСвязейКартинки = УзелСвязей.Строки.Добавить(); + УзелСвязейКартинки.ИмяТега = "Relationship"; + УзелСвязейКартинки.Атрибуты.Вставить("Id", "rId" + Формат(ИдРесурса, "ЧГ=0")); + ДеревоМакета.СтруктураДокумента.МаксимальныйИдентификаторСвязи = ИдРесурса; + УзелСвязейКартинки.Атрибуты.Вставить("Type", ТипКартинка); + + ИмяКартинки = СтруктураКартинка.ИмяКартинки + Формат(ИдРесурса, "ЧГ=0"); + ИмяРесурса = "media/" + ИмяКартинки + "." + РасширениеКартинки; + УзелСвязейКартинки.Атрибуты.Вставить("Target", ИмяРесурса); + + СтруктураКартинка.Вставить("rId", "rId" + Формат(ИдРесурса, "ЧГ=0")); + СтруктураКартинка.ИмяКартинки = ИмяКартинки; + + ТипыКонтента = ДеревоМакета.СтруктураДокумента.ТипыКонтента; + УзлыРасширенийКартинки = Новый Массив; + ПараметрыПоискаУзлов = ПараметрыПоискаУзлов(); + ПараметрыПоискаУзлов.ИмяАтрибута = "Extension"; + ПараметрыПоискаУзлов.ЗначенияАтрибута = РасширениеКартинки; + НайтиУзлыПоСодержимому(ТипыКонтента, "Default", УзлыРасширенийКартинки, ПараметрыПоискаУзлов); + Если УзлыРасширенийКартинки.Количество() = 0 Тогда + УзелТипов = ТипыКонтента.Строки[0]; + УзелТипа = УзелТипов.Строки.Добавить(); + УзелТипа.ИмяТега = "Default"; + УзелТипа.Атрибуты.Вставить("ContentType", "image/" + РасширениеКартинки); + УзелТипа.Атрибуты.Вставить("Extension", РасширениеКартинки); + КонецЕсли; + + ДвоичныеДанные = СтруктураКартинка.ДвоичныеДанные; + ДвоичныеДанные.Записать(КаталогКартинок + СтруктураКартинка.ИмяКартинки + "." + СтруктураКартинка.РасширениеКартинки); + +КонецПроцедуры + +Процедура ДобавитьОбластиПереходныхУровней(Области, ДеревоДокумента) + + Области.Сортировать("Индекс"); + + ДобавляемыеОбласти = Новый Массив; + + Для ИндексОбласти = 0 По Области.Количество()-1 Цикл + Область = Области[ИндексОбласти]; + Если ИндексОбласти = Области.Количество()-1 Тогда + ИндексНачалаСледующейОбласти = ИндексОкончанияОбласти(ДеревоДокумента); + Иначе + ИндексНачалаСледующейОбласти = Области[ИндексОбласти+1].Индекс; + КонецЕсли; + + ДобавитьОбластиДоДостиженияИндекса(Область.УзелДереваДокумента, Область.Индекс, Область.УсловиеОбласти, ИндексНачалаСледующейОбласти, ДобавляемыеОбласти); + + КонецЦикла; + + Для Каждого СтруктураОбласти Из ДобавляемыеОбласти Цикл + НоваяОбласть = Области.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяОбласть, СтруктураОбласти); + НоваяОбласть.Индекс = НоваяОбласть.УзелДереваДокумента.Индекс; + КонецЦикла; + + Области.Сортировать("Индекс"); + +КонецПроцедуры + +Процедура ДобавитьОбластиДоДостиженияИндекса(УзелДереваДокумента, ИндексНачалаТекущейОбласти, УсловиеОбласти, ИндексНачалаСледующейОбласти, ДобавляемыеОбласти) + ИндексОкончанияТекущейОбласти = ИндексОкончанияОбласти(УзелДереваДокумента); + Если ИндексОкончанияТекущейОбласти + 1 < ИндексНачалаСледующейОбласти Тогда + РодительОбласти = УзелДереваДокумента.Родитель; + ИндексТекущейОбласти = РодительОбласти.Строки.Индекс(УзелДереваДокумента); + Если ИндексТекущейОбласти = РодительОбласти.Строки.Количество() - 1 Тогда + ДобавитьОбластиДоДостиженияИндекса(РодительОбласти, ИндексНачалаТекущейОбласти, УсловиеОбласти, ИндексНачалаСледующейОбласти, ДобавляемыеОбласти) + Иначе + ДобавляемыйУзел = РодительОбласти.Строки[ИндексТекущейОбласти+1]; + Если ДобавляемыйУзел.Индекс + 1 < ИндексНачалаСледующейОбласти И ДобавляемыйУзел.Индекс > ИндексНачалаТекущейОбласти Тогда + СтруктураОбласти = Новый Структура("УзелДереваДокумента, УсловиеОбласти"); + СтруктураОбласти.УзелДереваДокумента = ДобавляемыйУзел; + СтруктураОбласти.УсловиеОбласти = УсловиеОбласти; + ДобавляемыеОбласти.Добавить(СтруктураОбласти); + ДобавитьОбластиДоДостиженияИндекса(РодительОбласти, ИндексНачалаТекущейОбласти, УсловиеОбласти, ИндексНачалаСледующейОбласти, ДобавляемыеОбласти); + КонецЕсли; + КонецЕсли; + КонецЕсли; +КонецПроцедуры + +Функция ИндексОкончанияОбласти(УзелДереваДокумента) + КоличествоСтрок = УзелДереваДокумента.Строки.Количество(); + Если КоличествоСтрок > 0 Тогда + Возврат ИндексОкончанияОбласти(УзелДереваДокумента.Строки[КоличествоСтрок-1]); + Иначе + Возврат УзелДереваДокумента.Индекс; + КонецЕсли; +КонецФункции + +Процедура УдалитьТегиУсловныхОбластей(Индексы, ДеревоДокумента) + Для Каждого Индекс Из Индексы Цикл + Область = ДеревоДокумента.Строки.Найти(Индекс, "Индекс", Истина); + Область.Родитель.Строки.Удалить(Область); + КонецЦикла; +КонецПроцедуры + +Процедура ДобавитьОбластьСУсловием(Области, Область) + УзелСледующейОбласти = НайтиГраницуСледующейОбласти(Область, Области); + + Если УзелСледующейОбласти = Неопределено Тогда + Возврат; + КонецЕсли; + + НайденнаяОбласть = Области.Найти(УзелСледующейОбласти, "УзелДереваДокумента"); + + Если НайденнаяОбласть = Неопределено Тогда + НайденнаяОбласть = Области.Добавить(); + НайденнаяОбласть.УзелДереваДокумента = УзелСледующейОбласти; + НайденнаяОбласть.Индекс = НайденнаяОбласть.УзелДереваДокумента.Индекс; + КонецЕсли; + + НайденнаяОбласть.УсловиеОбласти = ПолучитьУсловиеОбласти(Область); +КонецПроцедуры + +#КонецОбласти Процедура РазобратьКонтейнерДокументDOCX(Знач ПолноеИмяФайла, Знач ПутьКСтруктуреФайла) @@ -621,9 +2577,9 @@ Архиватор = Новый ЧтениеZipФайла(ПолноеИмяФайла); Исключение УдалитьФайлы(ПолноеИмяФайла); - ЗаписатьСобытияВЖурналРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьСобытияВЖурналРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение(НСтр("ru = 'Не удалось открыть файла шаблона по причине:'") + Символы.ПС - + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Попытка @@ -631,9 +2587,9 @@ Исключение Архиватор.Закрыть(); УдалитьФайлы(ПолноеИмяФайла); - ЗаписатьСобытияВЖурналРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьСобытияВЖурналРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение(НСтр("ru = 'Не удалось выполнить разбор файла шаблона по причине:'") + Символы.ПС - + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Архиватор.Закрыть(); @@ -645,9 +2601,9 @@ Попытка Архиватор = Новый ЗаписьZipФайла(ПолноеИмяФайла); Исключение - ЗаписатьСобытияВЖурналРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьСобытияВЖурналРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение(НСтр("ru = 'Не удалось создать файл документа по причине:'") + Символы.ПС - + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; МаскаУпаковкиФайлов = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПутьКСтруктуреФайла) + "*"; @@ -656,9 +2612,9 @@ Архиватор.Добавить(МаскаУпаковкиФайлов, РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно); Архиватор.Записать(); Исключение - ЗаписатьСобытияВЖурналРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьСобытияВЖурналРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение(НСтр("ru = 'Не удалось сформировать файл документа по причине:'") + Символы.ПС - + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры @@ -892,6 +2848,62 @@ КонецФункции + +// Параметры: +// УзелПоиска - СтрокаДереваЗначений: см. ДеревоДокумента +// ИндексРазмещения - Число +// +Процедура НайтиУзелРазмещенияШтампа(УзелПоиска, ИндексРазмещения) Экспорт + Если УзелПоиска.Родитель.ИмяТега <> "w:body" И УзелПоиска.Родитель.ИмяТега <> "w:tc" Тогда + УзелПоиска = УзелПоиска.Родитель; + НайтиУзелРазмещенияШтампа(УзелПоиска, ИндексРазмещения); + Иначе + РодительУзлаПоиска = УзелПоиска.Родитель; + ИндексРазмещения = РодительУзлаПоиска.Строки.Индекс(УзелПоиска); + УзелПоиска = РодительУзлаПоиска; + КонецЕсли; +КонецПроцедуры + +// Параметры: +// УзелТаблицы - СтрокаДереваЗначений: см. ДеревоДокумента +// УзелТекста - СтрокаДереваЗначений: см. ДеревоДокумента +// +Процедура ПеренестиПараметрыФорматирования(УзелТаблицы, УзелТекста) Экспорт + + Прогон = УзелТекста.Родитель; + Абзац = Прогон.Родитель; + + ХарактеристикиТекста = НайтиУзел(Абзац, 1, "w:pPr"); + Если ХарактеристикиТекста = Неопределено Тогда + Возврат; + КонецЕсли; + + ХарактеристикаПоложениеТекста = НайтиУзел(ХарактеристикиТекста, 1, "w:jc"); + Если ХарактеристикаПоложениеТекста = Неопределено Тогда + Возврат; + КонецЕсли; + + ХарактеристикиТаблицы = НайтиУзел(УзелТаблицы, 1, "w:tblPr"); + + ХарактеристикаПоложениеТаблицы = ХарактеристикиТаблицы.Строки.Добавить(); + ЗаполнитьЗначенияСвойств(ХарактеристикаПоложениеТаблицы, ХарактеристикаПоложениеТекста); + ХарактеристикаПоложениеТаблицы.Атрибуты = ОбщегоНазначения.СкопироватьРекурсивно(ХарактеристикаПоложениеТекста.Атрибуты); + +КонецПроцедуры + +Процедура УдалитьНезначащиеАтрибуты(Дерево, НезначащиеАтрибуты) Экспорт + Для Каждого Строка Из Дерево.Строки Цикл + + Для Каждого Атрибут Из НезначащиеАтрибуты Цикл + Если Строка.Атрибуты.Получить(Атрибут) <> Неопределено Тогда + Строка.Атрибуты.Удалить(Атрибут); + КонецЕсли; + КонецЦикла; + + УдалитьНезначащиеАтрибуты(Строка, НезначащиеАтрибуты); + КонецЦикла; +КонецПроцедуры + Процедура ИнициализироватьСтруктуруМакета(Макет) ИмяКаталога = Макет.ИмяКаталога; @@ -1051,7 +3063,7 @@ ШиринаТаблицы = 0; ШиринаКлеткиТаблицы = 0; - РазрешениеОсновногоЭкрана = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере(Ложь).Получить("РазрешениеОсновногоЭкрана"); + РазрешениеОсновногоЭкрана = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере().Получить("РазрешениеОсновногоЭкрана"); РазрешениеОсновногоЭкрана = ?(РазрешениеОсновногоЭкрана = Неопределено, 72, РазрешениеОсновногоЭкрана); ЧтениеXML = ИнициализироватьЧтениеXML(Область.Текст); @@ -1108,8 +3120,15 @@ Для Каждого ПараметрТекст Из ПараметрыИзТекста Цикл - ДанныеОбъекта.Свойство(ПараметрТекст, ЗначениеПараметра); - ЗначениеПараметра = Строка(ЗначениеПараметра); + Если ДанныеОбъекта.Свойство(ПараметрТекст, ЗначениеПараметра) Тогда + Если ТипЗнч(ЗначениеПараметра) = Тип("Структура") Тогда + РазмерыКартинки = Новый Структура("Ширина,Высота",0,0); + ЗаполнитьЗначенияСвойств(РазмерыКартинки, ЗначениеПараметра); + ЗначениеПараметра = СокрЛП(ЗначениеПараметра.АдресКартинки); + Иначе + ЗначениеПараметра = Строка(ЗначениеПараметра); + КонецЕсли; + КонецЕсли; Если ТипЗнч(ЗначениеПараметра) = Тип("Строка") И НЕ СтрНачинаетсяС(ЗначениеПараметра, "e1cib/tempstorage") Тогда ТекстУзла = СтрЗаменить(ТекстУзла, "{v8 " + ПараметрТекст + "}", ЗначениеПараметра); @@ -1151,12 +3170,34 @@ Иначе - КоэффициентМасштаба = 2; - КоэффициентПропорций = 914400 / (РазрешениеОсновногоЭкрана * КоэффициентМасштаба); - - ШиринаКартинки = КоэффициентПропорций * ПараметрыКартинки.Ширина; - ВысотаКартинки = КоэффициентПропорций * ПараметрыКартинки.Высота; - + Если РазмерыКартинки.Высота <> 0 ИЛИ РазмерыКартинки.Ширина <> 0 Тогда + + КоэффициентПересчета = 914400/2.54/10; + Если РазмерыКартинки.Ширина <> 0 Тогда + ШиринаКартинки = КоэффициентПересчета * РазмерыКартинки.Ширина; + КоэффициентМасштабирования = ШиринаКартинки/ПараметрыКартинки.Ширина; + КонецЕсли; + + Если РазмерыКартинки.Высота <> 0 Тогда + ВысотаКартинки = КоэффициентПересчета * РазмерыКартинки.Высота; + КоэффициентМасштабирования = ВысотаКартинки/ПараметрыКартинки.Высота; + КонецЕсли; + + Если РазмерыКартинки.Ширина = 0 Тогда + ШиринаКартинки = КоэффициентМасштабирования*ПараметрыКартинки.Ширина; + КонецЕсли; + + Если РазмерыКартинки.Высота = 0 Тогда + ВысотаКартинки = КоэффициентМасштабирования*ПараметрыКартинки.Высота; + КонецЕсли; + + Иначе + КоэффициентМасштаба = 2; + КоэффициентПропорций = 914400 / (РазрешениеОсновногоЭкрана * КоэффициентМасштаба); + + ШиринаКартинки = КоэффициентПропорций * ПараметрыКартинки.Ширина; + ВысотаКартинки = КоэффициентПропорций * ПараметрыКартинки.Высота; + КонецЕсли; КонецЕсли; ШиринаКартинки = Окр(ШиринаКартинки, 0); @@ -1184,6 +3225,91 @@ КонецПроцедуры +// Параметры: +// ПечатнаяФорма - см. ИнициализироватьПечатнуюФорму +// Область - Структура: +// * Имя - Строка +// * Текст - Строка +// * НомерРаздела - Число +// * Гиперссылки - Массив из см. СтруктураГиперссылки +// ДанныеОбъекта - Структура, Неопределено, КлючИЗначение +// +Процедура ЗаполнитьПараметрыГиперссылок(ПечатнаяФорма, Область, ДанныеОбъекта) + + Если Область.Гиперссылки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + СтруктураДокумента = ПечатнаяФорма.СтруктураДокумента; + ТаблицаСвязейКонтента = СтруктураДокумента.ТаблицаСвязейКонтента; + + ДеревоСвязей = ПрочитатьСтрокуXMLВДерево(СтруктураДокумента.СвязиКонтента); + УзелВзаимосвязей = ДеревоСвязей.Строки[0]; + МассивНайденныхУзлов = Новый Массив; + ПараметрыПоискаУзлов = ПараметрыПоискаУзлов(); + ПараметрыПоискаУзлов.ИмяАтрибута = "Type"; + ПараметрыПоискаУзлов.ЗначенияАтрибута = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"; + НайтиУзлыПоСодержимому(ДеревоСвязей, "Relationship", МассивНайденныхУзлов, ПараметрыПоискаУзлов); + + Для ИндексМассива = 0 По Область.Гиперссылки.ВГраница() Цикл + + ГиперСсылка = Область.Гиперссылки[ИндексМассива]; + ИДРесурса = ГиперСсылка.ИДРесурса; + ИмяПараметра = ГиперСсылка.ИмяПараметра; + + Если Не ПустаяСтрока(ИмяПараметра) Тогда + СтрокаСсылка = ГиперСсылка.Ссылка; + ЗначениеПараметра = ""; + + Если ДанныеОбъекта.Свойство(ИмяПараметра, ЗначениеПараметра) Тогда + ЗначениеПараметра = КодироватьСтроку(СокрЛП(ЗначениеПараметра), СпособКодированияСтроки.КодировкаURL); + КонецЕсли; + УстанавливаемоеЗначение = СтрЗаменить(СтрокаСсылка, "{v8 " + ИмяПараметра +"}" , ЗначениеПараметра); + + СтрокаСвязейКонтента = ТаблицаСвязейКонтента.Найти(ИДРесурса, "ИДРесурса"); + + Если РаскодироватьСтроку(СтрокаСвязейКонтента.ИмяРесурса, СпособКодированияСтроки.КодировкаURL) = СтрокаСсылка Тогда + СтрокаСвязейКонтента.ИмяРесурса = УстанавливаемоеЗначение; + + Для Каждого УзелГиперссылки Из МассивНайденныхУзлов Цикл + Если УзелГиперссылки.Атрибуты["Id"] = ИДРесурса Тогда + УзелГиперссылки.Атрибуты.Вставить("Target", УстанавливаемоеЗначение); + Прервать; + КонецЕсли; + КонецЦикла; + + Иначе + ТаблицаСвязейКонтента.Сортировать("НомерРесурса Возр"); + НовыйНомерРесурса = ТаблицаСвязейКонтента[ТаблицаСвязейКонтента.Количество() - 1].НомерРесурса + 1; + + НовыйИДРесурса = "rId" + Формат(НовыйНомерРесурса, "ЧГ=0"); + + НоваяСтрокаСсылки = ТаблицаСвязейКонтента.Добавить(); + НоваяСтрокаСсылки.НомерРесурса = НовыйНомерРесурса; + НоваяСтрокаСсылки.ИДРесурса = НовыйИДРесурса; + НоваяСтрокаСсылки.ИмяРесурса = УстанавливаемоеЗначение; + + НоваяСвязь = УзелВзаимосвязей.Строки.Добавить(); + НоваяСвязь.ИмяТега = "Relationship"; + НоваяСвязь.Атрибуты = Новый Соответствие; + НоваяСвязь.Атрибуты.Вставить("Target", УстанавливаемоеЗначение); + НоваяСвязь.Атрибуты.Вставить("Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"); + НоваяСвязь.Атрибуты.Вставить("Id", НовыйИДРесурса); + НоваяСвязь.Атрибуты.Вставить("TargetMode", "External"); + + Область.Текст = СтрЗаменить(Область.Текст, "r:id="""+ИДРесурса+"""", "r:id="""+НовыйИДРесурса+""""); + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + СтруктураДокумента.СвязиКонтента = ПоместитьДеревоВСтрокуXML(ДеревоСвязей); + + +КонецПроцедуры + Процедура ВыделитьПараметры(МассивПараметров, Знач Текст) НачалоПараметра = СтрНайти(Текст, "{v8 "); @@ -1440,9 +3566,9 @@ ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.Отступ = Ложь; Если ПустаяСтрока(ПутьКФайлу) Тогда - ЗаписьXML.УстановитьСтроку(Кодировка); + ЗаписьXML.УстановитьСтроку(); Иначе - ЗаписьXML.ОткрытьФайл(ПутьКФайлу, Кодировка) + ЗаписьXML.ОткрытьФайл(ПутьКФайлу) КонецЕсли; Если ЗаписатьОбъявление Тогда @@ -1461,7 +3587,7 @@ ЧтениеXML = Новый ЧтениеXML; Если ТипДанных = 0 Тогда - ЧтениеXML.УстановитьСтроку(ДанныеЧтения) + ЧтениеXML.УстановитьСтроку(ДанныеЧтения); Иначе ЧтениеXML.ОткрытьФайл(ДанныеЧтения); КонецЕсли; @@ -1957,6 +4083,10 @@ ЗначениеАтрибута = ЧтениеXML.Значение; + Если Лев(ЧтениеXML.Имя, 4) = "r:id" И (ИмяУзла = "w:hyperlink") Тогда + ДобавитьРазобраннуюСтрокуГиперссылка(СтруктураРазбораXML, СтруктураДокумента.ТаблицаСвязейКонтента.Найти(ЗначениеАтрибута, "ИДРесурса")); + КонецЕсли; + Если Лев(ЧтениеXML.Имя, 6) = "w:rsid" Тогда ЗначениеАтрибута = СтруктураДокумента.ИдентификаторДокумента; КонецЕсли; @@ -1987,6 +4117,8 @@ КонецПроцедуры + + Функция ЧтениеНачалаЛюбогоБлокаКромеПараграфа(СтруктураРазбораXML, ЧтениеXML) Если Не ПустаяСтрока(СтруктураРазбораXML.БлокирующийПоток) Тогда @@ -2179,11 +4311,23 @@ Результат.Вставить("РазобранныеСтроки", Новый Массив); Результат.Вставить("ИмяПотокаФормата", ""); Результат.Вставить("ТекущийУровеньАбзаца", "0"); + Результат.Вставить("Гиперссылки", Новый Массив); Возврат Результат; КонецФункции +// Возвращаемое значение: +// Структура: +// * ИДРесурса +// * ИмяПараметра +// * Ссылка +// +Функция СтруктураГиперссылки() + Структура = Новый Структура("ИДРесурса,ИмяПараметра,Ссылка"); + Возврат Структура; +КонецФункции + Функция ТипыКолонтитулов() Результат = Новый Соответствие; @@ -2225,6 +4369,23 @@ КонецПроцедуры +Процедура ДобавитьРазобраннуюСтрокуГиперссылка(СтруктураРазбораXML, СтрокаРесурса) + + СтрокаСсылка = РаскодироватьСтроку(СтрокаРесурса.ИмяРесурса, СпособКодированияСтроки.КодировкаURL); + + ПараметрыИзТекста = Новый Массив; + ВыделитьПараметры(ПараметрыИзТекста, СтрокаСсылка); + + Для Каждого ПараметрТекст Из ПараметрыИзТекста Цикл + СтруктураГиперссылки = СтруктураГиперссылки(); + СтруктураГиперссылки.ИДРесурса = СтрокаРесурса.ИдРесурса; + СтруктураГиперссылки.ИмяПараметра = ПараметрТекст; + СтруктураГиперссылки.Ссылка = СтрокаСсылка; + СтруктураРазбораXML.Гиперссылки.Добавить(СтруктураГиперссылки); + КонецЦикла; + +КонецПроцедуры + Процедура СформироватьРазобранныеСтроки(СтруктураРазбораXML) Если СтруктураРазбораXML.СтатусТэга1С = 7 И СтруктураРазбораXML.ТипТэга1С = 0 @@ -2262,6 +4423,12 @@ КонецПроцедуры +Процедура ОчиститьГиперссылки(СтруктураРазбораXML) + + СтруктураРазбораXML.Гиперссылки.Очистить(); + +КонецПроцедуры + Процедура ИнициализироватьПотокиШаблоннойСтроки(СтруктураРазбораXML) Если СтруктураРазбораXML.СтатусТэга1С = 1 ИЛИ СтруктураРазбораXML.СтатусТэга1С = 5 Тогда @@ -2331,6 +4498,10 @@ ПропуститьТэг = Ложь; ТекстРаздела = ""; + ИдентификаторЗакладкиЭЦП = ""; + ТекстБуфераЗакладок = ""; + СоответствиеАтрибутовЗакладок = Новый Соответствие(); + СтруктураРазбораXML = ИнициализироватьРазборXML(); СброситьСтатусыТэгов1С(СтруктураРазбораXML); @@ -2352,12 +4523,31 @@ Если (ЧтениеXML.Имя = "w:bookmarkStart" ИЛИ ЧтениеXML.Имя = "w:bookmarkEnd") Тогда Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда - ПропуститьТэг = Истина; - ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда - ПропуститьТэг = Ложь; + БуферЗакладок = ИнициализироватьЗаписьXML(""); + БуферЗакладок.ЗаписатьТекущий(ЧтениеXML); + + ТекстБуфераЗакладок = БуферЗакладок.Закрыть(); + + ЧтениеXMLЗакладок = ИнициализироватьЧтениеXML(ТекстБуфераЗакладок); + ЧтениеXMLЗакладок.Прочитать(); + + СоответствиеАтрибутовЗакладок = ПолучитьАтрибуты(ЧтениеXMLЗакладок); КонецЕсли; - Продолжить; + Если СоответствиеАтрибутовЗакладок.Получить("w:name") <> "V8DSStamp" И ИдентификаторЗакладкиЭЦП <> СоответствиеАтрибутовЗакладок.Получить("w:id") Тогда + + Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + ПропуститьТэг = Истина; + ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда + ПропуститьТэг = Ложь; + КонецЕсли; + + Продолжить; + + Иначе + + ИдентификаторЗакладкиЭЦП = СоответствиеАтрибутовЗакладок.Получить("w:id"); + КонецЕсли; КонецЕсли; @@ -2449,6 +4639,9 @@ СтруктураОбласти.Имя = СтруктураРазбораXML.ИмяОбласти; СтруктураОбласти.Текст = ТекстОбласти; СтруктураОбласти.НомерРаздела = СтруктураРазбораXML.НомерРаздела; + СтруктураОбласти.Гиперссылки = ОбщегоНазначения.СкопироватьРекурсивно(СтруктураРазбораXML.Гиперссылки); + + ОчиститьГиперссылки(СтруктураРазбораXML); ДобавитьВСтруктуруДокументаОбластьДокумента(СтруктураДокумента, СтруктураОбласти); @@ -3058,7 +5251,7 @@ КонецФункции -Процедура КопироватьСодержимоеКаталога(Откуда, Куда) +Процедура КопироватьСодержимоеКаталога(Откуда, Куда) Экспорт КаталогНазначения = Новый Файл(Куда); @@ -3149,11 +5342,30 @@ Если Символ1 = 208 И Символ2 = 207 И Символ3 = 17 И Символ4 = 224 И Символ5 = 161 И Символ6 = 177 И Символ7 = 26 И Символ8 = 225 Тогда Возврат "doc"; - ИначеЕсли Символ1 = 80 И Символ2 = 75 И Символ3 = 3 И Символ4 = 4 И Символ5 = 20 И Символ6 = 0 И Символ7 = 0 И Символ8 = 8 - ИЛИ Символ1 = 80 И Символ2 = 75 И Символ3 = 3 И Символ4 = 4 И Символ5 = 10 И Символ6 = 0 И Символ7 = 0 И Символ8 = 0 Тогда - Возврат "odt"; - ИначеЕсли Символ1 = 80 И Символ2 = 75 И Символ3 = 3 И Символ4 = 4 И Символ5 = 20 И Символ6 = 0 Тогда - Возврат "docx"; + ИначеЕсли Символ1 = 80 И Символ2 = 75 И Символ3 = 3 И Символ4 = 4 И Символ5 = 20 + ИЛИ Символ1 = 80 И Символ2 = 75 И Символ3 = 3 И Символ4 = 4 И Символ5 = 10 Тогда + + ИмяВременногоФайла = ПолучитьИмяВременногоФайла("docx"); + + ДвоичныеДанныеМакета.Записать(ИмяВременногоФайла); + Попытка + Архиватор = Новый ЧтениеZipФайла(ИмяВременногоФайла); + Исключение + УдалитьФайлы(ИмяВременногоФайла); + ЗаписатьСобытияВЖурналРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение(НСтр("ru = 'Не удалось открыть файла шаблона по причине:'") + Символы.ПС + + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Если Архиватор.Элементы.Найти("document.xml") = Неопределено Тогда + Расширение = "odt"; + Иначе + Расширение = "docx"; + КонецЕсли; + Архиватор.Закрыть(); + УдалитьФайлы(ИмяВременногоФайла); + + Возврат Расширение; Иначе Возврат Неопределено; КонецЕсли; diff --git a/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl index 62343abc6..edc670866 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl @@ -100,12 +100,12 @@ ОписаниеКоманды.Вставить("Форма", Форма); ИмяОбработчика = ОписаниеКоманды.Обработчик; Если СтрЧислоВхождений(ИмяОбработчика, ".") = 0 И ЭтоОтчетИлиОбработка(ОписаниеКоманды.МенеджерПечати) Тогда - //@skip-warning - ОсновнаяФорма = ПолучитьФорму(ОписаниеКоманды.МенеджерПечати + ".Форма", , Форма, Истина); + ОсновнаяФорма = ПолучитьФорму(ОписаниеКоманды.МенеджерПечати + ".Форма", , Форма, Истина);// АПК:65 - форма создается для вызова метода ИмяОбработчика = "ОсновнаяФорма." + ИмяОбработчика; КонецЕсли; - Обработчик = ИмяОбработчика + "(ОписаниеКоманды)"; - //@skip-warning + ПараметрыПечати = УправлениеПечатьюКлиент.ОписаниеПараметровПечати(); + ЗаполнитьЗначенияСвойств(ПараметрыПечати, ОписаниеКоманды); + Обработчик = ИмяОбработчика + "(ПараметрыПечати)"; Результат = Вычислить(Обработчик); Возврат; КонецЕсли; @@ -241,7 +241,7 @@ // Функция СоздатьВременныйКаталог(Знач Расширение = "") Экспорт - ИмяКаталога = КаталогВременныхФайлов() + "v8_" + Строка(Новый УникальныйИдентификатор); + ИмяКаталога = КаталогВременныхФайлов() + "v8_" + Строка(Новый УникальныйИдентификатор);// АПК:495 для обратной совместимости Если Не ПустаяСтрока(Расширение) Тогда ИмяКаталога = ИмяКаталога + "." + Расширение; КонецЕсли; diff --git a/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl index 2eb1e17a2..f3376d161 100644 --- a/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl +++ b/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl @@ -344,11 +344,280 @@ Процедура ОбновитьЭлементыДополнительныхРеквизитов(Форма, Объект = Неопределено, СкрытьУдаленные = Неопределено) Экспорт УправлениеСвойствамиСлужебный.ПеренестиЗначенияИзРеквизитовФормыВОбъект(Форма, Объект); - + ЗаполнитьДополнительныеРеквизитыВФорме(Форма, Объект, , СкрытьУдаленные); КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции для программной работы со свойствами + +// Добавляет дополнительное свойство к переданному объекту. +// +// Параметры: +// Владелец - ОбъектМетаданных +// - Строка - полное имя объекта метаданных или имя набора свойств. +// - СправочникСсылка.НаборыДополнительныхРеквизитовИСведений - ссылка на набор свойств. +// Параметры - см. ПараметрыДобавленияСвойства. +// ЭтоСведение - Булево - если Истина, будет добавлено дополнительное сведение. +// Значение по умолчанию Ложь - добавляется дополнительный реквизит. +// +Процедура ДобавитьСвойство(Владелец, Параметры, ЭтоСведение = Ложь) Экспорт + + Если ТипЗнч(Владелец) = Тип("ОбъектМетаданных") Тогда + ИмяПредопределенного = СтрЗаменить(Владелец.ПолноеИмя(), ".", "_"); + ИначеЕсли ТипЗнч(Владелец) = Тип("Строка") Тогда + Если СтрНайти(Владелец, ".") = 0 Тогда + // Это набор свойств. + ИмяПредопределенного = Владелец; + Иначе + ИмяПредопределенного = СтрЗаменить(Владелец, ".", "_"); + КонецЕсли; + КонецЕсли; + + Если ТипЗнч(Владелец) = Тип("СправочникСсылка.НаборыДополнительныхРеквизитовИСведений") Тогда + НаборСвойств = Владелец; + Иначе + НаборСвойств = НаборСвойствПоИмени(ИмяПредопределенного); + Если НаборСвойств = Неопределено Тогда + ТекстИсключения = НСтр("ru = 'Переданный объект ""%1"" не подключен к подсистеме Свойства.'"); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстИсключения, Владелец); + КонецЕсли; + КонецЕсли; + + ОтсутствующиеПараметры = Новый Массив; + Если Не Параметры.Свойство("Наименование") + Или Не ЗначениеЗаполнено(Параметры.Наименование) Тогда + ОтсутствующиеПараметры.Добавить("Наименование"); + КонецЕсли; + + Если Не Параметры.Свойство("Тип") + Или Не ЗначениеЗаполнено(Параметры.Тип) Тогда + ОтсутствующиеПараметры.Добавить("Тип"); + КонецЕсли; + + Если ОтсутствующиеПараметры.Количество() > 0 Тогда + ОтсутствующиеПараметры = СтрСоединить(ОтсутствующиеПараметры, ", "); + ТекстИсключения = НСтр("ru = 'Не переданы обязательные параметры: + |%1.'"); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстИсключения, ОтсутствующиеПараметры); + КонецЕсли; + + ПустаяСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПустаяСсылка(); + // 1. Проверка, что наименование используется. + Результат = УправлениеСвойствамиСлужебный.НаименованиеУжеИспользуется(ПустаяСсылка, НаборСвойств, Параметры.Наименование); + Если ЗначениеЗаполнено(Результат) Тогда + ВызватьИсключение Результат; + КонецЕсли; + + // 2. Проверка, что имя уже используется. + Если Параметры.Свойство("Имя") + И ЗначениеЗаполнено(Параметры.Имя) Тогда + Результат = УправлениеСвойствамиСлужебный.ИмяУжеИспользуется(Параметры.Имя, ПустаяСсылка); + Если ЗначениеЗаполнено(Результат) Тогда + ВызватьИсключение Результат; + КонецЕсли; + Иначе + Имя = ""; + ЗаголовокОбъекта = Параметры.Наименование; + УправлениеСвойствамиСлужебный.УдалитьНедопустимыеСимволы(ЗаголовокОбъекта); + ЗаголовокОбъектаЧастями = СтрРазделить(ЗаголовокОбъекта, " ", Ложь); + Для Каждого ЧастьЗаголовка Из ЗаголовокОбъектаЧастями Цикл + Имя = Имя + ВРег(Лев(ЧастьЗаголовка, 1)) + Сред(ЧастьЗаголовка, 2); + КонецЦикла; + + Если УправлениеСвойствамиСлужебный.ИмяНачинаетсяСЦифры(Имя) Тогда + Имя = "_" + Имя; + КонецЕсли; + + Результат = УправлениеСвойствамиСлужебный.ИмяУжеИспользуется(Имя, ПустаяСсылка); + Если ЗначениеЗаполнено(Результат) Тогда + УИД = Новый УникальныйИдентификатор(); + СтрокаУИД = СтрЗаменить(Строка(УИД), "-", ""); + Имя = Имя + "_" + СтрокаУИД; + КонецЕсли; + + Параметры.Вставить("Имя", Имя); + КонецЕсли; + + // 3. Проверка, что идентификатор для формул уже используется. + Если Параметры.Свойство("ИдентификаторДляФормул") + И ЗначениеЗаполнено(Параметры.ИдентификаторДляФормул) Тогда + Результат = УправлениеСвойствамиСлужебный.ИдентификаторДляФормулУжеИспользуется(Параметры.ИдентификаторДляФормул, ПустаяСсылка); + Если ЗначениеЗаполнено(Результат) Тогда + ВызватьИсключение Результат; + КонецЕсли; + КонецЕсли; + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.НаборыДополнительныхРеквизитовИСведений"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", НаборСвойств); + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + + НовоеСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент(); + ЗаполнитьЗначенияСвойств(НовоеСвойство, Параметры); + + НовоеСвойство.Заголовок = Параметры.Наименование; + НовоеСвойство.ЭтоДополнительноеСведение = ЭтоСведение; + НовоеСвойство.НаборСвойств = НаборСвойств; + + // Для мультиязычной. + НовоеСвойство.ЗаголовокЯзык1 = Параметры.Наименование; + НовоеСвойство.ЗаголовокЯзык2 = Параметры.Наименование; + + НовоеСвойство.Записать(); + + ОбъектНаборСвойств = НаборСвойств.ПолучитьОбъект(); + Если НовоеСвойство.ЭтоДополнительноеСведение Тогда + ТабличнаяЧасть = ОбъектНаборСвойств.ДополнительныеСведения; + Иначе + ТабличнаяЧасть = ОбъектНаборСвойств.ДополнительныеРеквизиты; + КонецЕсли; + НайденнаяСтрока = ТабличнаяЧасть.Найти(НаборСвойств.Ссылка, "Свойство"); + Если НайденнаяСтрока = Неопределено Тогда + НоваяСтрока = ТабличнаяЧасть.Добавить(); + НоваяСтрока.Свойство = НовоеСвойство.Ссылка; + ОбъектНаборСвойств.Записать(); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// Добавляет доступное значение для реквизита с типом ЗначениеСвойствОбъекта +// или ЗначениеСвойствОбъектаИерархия. +// +// Параметры: +// Владелец - Строка - имя дополнительного реквизита. +// - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - дополнительный реквизит, +// для которого надо добавить значение. +// Параметры - см. ПараметрыДобавленияЗначенияСвойства. +// Иерархия - Булево +// +// Возвращаемое значение: +// СправочникСсылка.ЗначениеСвойствОбъекта +// СправочникСсылка.ЗначениеСвойствОбъектаИерархия +// +Функция ДобавитьЗначениеСвойства(Знач Владелец, Параметры, Иерархия = Ложь) Экспорт + + Если Не Параметры.Свойство("Наименование") + Или Не ЗначениеЗаполнено(Параметры.Наименование) Тогда + ВызватьИсключение НСтр("ru = 'Не указан обязательный параметр ""Наименование"".'"); + КонецЕсли; + + Если ТипЗнч(Владелец) = Тип("Строка") Тогда + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Имя", Владелец); + Запрос.Текст = + "ВЫБРАТЬ + | ДополнительныеРеквизитыИСведения.Ссылка КАК Ссылка + |ИЗ + | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения + |ГДЕ + | ДополнительныеРеквизитыИСведения.Имя = &Имя"; + Результат = Запрос.Выполнить().Выгрузить(); + Если Результат.Количество() = 0 Тогда + ШаблонИсключения = НСтр("ru = 'Не найдено дополнительного реквизита с именем ""%1"".'"); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИсключения, Владелец); + КонецЕсли; + + Владелец = Результат[0].Ссылка; + КонецЕсли; + + ТипРеквизита = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Владелец, "ТипЗначения"); + Если Не УправлениеСвойствамиСлужебный.ТипЗначенияСодержитЗначенияСвойств(ТипРеквизита) Тогда + ШаблонИсключения = НСтр("ru = 'Добавление значений поддерживается только для дополнительных реквизитов + |с типами ""%1"" или ""%2"". Тип значения текущего реквизита - ""%3""'"); + ШаблонИсключения = СтрЗаменить(ШаблонИсключения, Символы.ПС, " "); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИсключения, + Тип("СправочникСсылка.ЗначенияСвойствОбъектов"), + Тип("СправочникСсылка.ЗначенияСвойствОбъектовИерархия"), + ТипРеквизита); + КонецЕсли; + + ЭтоГруппа = Параметры.Свойство("ЭтоГруппа") И Параметры.ЭтоГруппа; + Если Иерархия Тогда + Если ЭтоГруппа Тогда + ЗначениеРеквизита = Справочники.ЗначенияСвойствОбъектовИерархия.СоздатьГруппу(); + Иначе + ЗначениеРеквизита = Справочники.ЗначенияСвойствОбъектовИерархия.СоздатьЭлемент(); + КонецЕсли; + Иначе + Если ЭтоГруппа Тогда + ЗначениеРеквизита = Справочники.ЗначенияСвойствОбъектов.СоздатьГруппу(); + Иначе + ЗначениеРеквизита = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент(); + КонецЕсли; + КонецЕсли; + + ЗначениеРеквизита.Владелец = Владелец; + ЗаполнитьЗначенияСвойств(ЗначениеРеквизита, Параметры); + + ЗначениеРеквизита.Записать(); + + Возврат ЗначениеРеквизита.Ссылка; + +КонецФункции + +// Возвращает параметры, необходимые для для добавления свойства. +// +// Возвращаемое значение: +// Структура: +// * Наименование - Строка - обязательно для заполнения. +// * Тип - ОписаниеТипов - обязательно для заполнения. +// * Имя - Строка +// * Комментарий - Строка +// * ЗаголовокФормыЗначения - Строка +// * ЗаголовокФормыВыбораЗначения - Строка +// * ИдентификаторДляФормул - Строка +// * МногострочноеПолеВвода - Булево +// * Подсказка - Строка +// +Функция ПараметрыДобавленияСвойства() Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("Наименование", ""); + Параметры.Вставить("Тип"); + Параметры.Вставить("Имя", ""); + Параметры.Вставить("Комментарий", ""); + Параметры.Вставить("ЗаголовокФормыЗначения", ""); + Параметры.Вставить("ЗаголовокФормыВыбораЗначения", ""); + Параметры.Вставить("ИдентификаторДляФормул", ""); + Параметры.Вставить("МногострочноеПолеВвода", Ложь); + Параметры.Вставить("Подсказка", ""); + + Возврат Параметры; + +КонецФункции + +// Возвращает параметры, требуемые для добавления значения свойства. +// +// Возвращаемое значение: +// Структура: +// * Наименование - Строка - обязательно для заполнения. +// * ПолноеНаименование - Строка +// * Родитель - СправочникСсылка.ЗначениеСвойствОбъекта +// - СправочникСсылка.ЗначениеСвойствОбъектаИерархия +// * ЭтоГруппа - Булево +// +Функция ПараметрыДобавленияЗначенияСвойства() Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("Наименование", ""); + Параметры.Вставить("ПолноеНаименование", ""); + Параметры.Вставить("Родитель"); + Параметры.Вставить("ЭтоГруппа", Ложь); + + Возврат Параметры; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для нестандартной обработки дополнительных свойств. @@ -640,7 +909,7 @@ ЗаголовокКнопки = НСтр("ru = 'Начать/закончить редактирование реквизита %1'"); Кнопка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ЗаголовокКнопки, ОписаниеСвойства.Наименование); - Кнопка.ТолькоВоВсехДействиях = Истина; + Кнопка.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; Кнопка.ИмяКоманды = "РедактироватьГиперссылкуРеквизита"; Кнопка.ОтображениеФигуры = ОтображениеФигурыКнопки.ПриАктивности; КонецЕсли; @@ -1058,12 +1327,13 @@ Результат = Запрос.Выполнить().Выгрузить(); Результат.Колонки.Добавить("Представление"); + ФорматСвойств = ФорматСвойств(Свойства); РезультатСТекстовымиСтроками = Неопределено; ИндексСтроки = 0; Для каждого ЗначениеСвойства Из Результат Цикл ЗначениеСвойства.Представление = ПредставлениеЗначения(ЗначениеСвойства.Значение, КодЯзыка, - ФорматСвойства(ЗначениеСвойства.Свойство)); + ФорматСвойств[ЗначениеСвойства.Свойство]); ТекстоваяСтрока = ЗначениеСвойства.ТекстоваяСтрока; Если Не ПустаяСтрока(ТекстоваяСтрока) Тогда @@ -1260,7 +1530,7 @@ // Функция ИспользоватьДопСведения(ВладелецСвойств) Экспорт - Возврат Метаданные.НайтиПоПолномуИмени("ОбщаяКоманда.ДополнительныеСведенияКоманднаяПанель") <> Неопределено + Возврат Метаданные.ОбщиеКоманды.Найти("ДополнительныеСведенияКоманднаяПанель") <> Неопределено И Метаданные.ОбщиеКоманды.ДополнительныеСведенияКоманднаяПанель.ТипПараметраКоманды.Типы().Найти(ТипЗнч(ВладелецСвойств)) <> Неопределено; КонецФункции @@ -1509,54 +1779,79 @@ // Процедура ВосстановитьНастройкиФормСДополнительнымиРеквизитами() Экспорт - Запрос = Новый Запрос; - Запрос.Текст = + Наборы = Новый Соответствие; + ИменаПредопределенныхНаборов = Метаданные.Справочники.НаборыДополнительныхРеквизитовИСведений.ПолучитьИменаПредопределенных(); + УстаревшиеПредопределенныеЭлементы = Новый Массив; + Для Каждого ИмяПредопределенногоНабора Из ИменаПредопределенныхНаборов Цикл + Если Не СтрНачинаетсяС(ИмяПредопределенногоНабора, "Удалить") Тогда + Продолжить; + КонецЕсли; + + УстаревшиеПредопределенныеЭлементы.Добавить(ИмяПредопределенногоНабора); + КонецЦикла; + + ЗапросДочернихНаборов = Новый Запрос; + ЗапросДочернихНаборов.Текст = "ВЫБРАТЬ - | НаборыДополнительныхРеквизитовИСведений.Ссылка КАК Ссылка + | НаборыДополнительныхРеквизитовИСведений.Ссылка КАК Ссылка, + | НаборыДополнительныхРеквизитовИСведений.Родитель КАК Родитель |ИЗ | Справочник.НаборыДополнительныхРеквизитовИСведений КАК НаборыДополнительныхРеквизитовИСведений |ГДЕ - | НаборыДополнительныхРеквизитовИСведений.Родитель = &Родитель - | И НаборыДополнительныхРеквизитовИСведений.ИмяПредопределенногоНабора = """""; + | НаборыДополнительныхРеквизитовИСведений.ИмяПредопределенногоНабора = """" + | И НаборыДополнительныхРеквизитовИСведений.Родитель <> ЗНАЧЕНИЕ(Справочник.НаборыДополнительныхРеквизитовИСведений.ПустаяСсылка)"; + ВсеДочерниеНаборы = ЗапросДочернихНаборов.Выполнить().Выгрузить(); + ВсеДочерниеНаборы.Индексы.Добавить("Ссылка"); - // Наборы свойств, помеченные к удалению. - Наборы = Новый Соответствие; - ИменаПредопределенныхНаборов = Метаданные.Справочники.НаборыДополнительныхРеквизитовИСведений.ПолучитьИменаПредопределенных(); - Для Каждого ИмяПредопределенногоНабора Из ИменаПредопределенныхНаборов Цикл - Если СтрНачинаетсяС(ИмяПредопределенногоНабора, "Удалить") Тогда - Попытка - ПредопределенныйНабор = Справочники.НаборыДополнительныхРеквизитовИСведений[ИмяПредопределенногоНабора]; - ЭтоГруппа = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПредопределенныйНабор, "ЭтоГруппа"); - Если ЭтоГруппа Тогда - Продолжить; - КонецЕсли; - - ДлинаПрефикса = СтрДлина("Удалить"); - ИмяНабора = Сред(ИмяПредопределенногоНабора, ДлинаПрефикса + 1, СтрДлина(ИмяПредопределенногоНабора) - ДлинаПрефикса); - - ИдентификаторСсылки = Строка(ПредопределенныйНабор.УникальныйИдентификатор()); - Если СтрЗаканчиваетсяНа(ИмяНабора, "_Общие") Тогда - Дочерние = Новый Массив; - ИмяНабора = СтрЗаменить(ИмяНабора, "_Общие", ""); - НаборРодитель = НаборСвойствПоИмени(ИмяНабора); - Запрос.УстановитьПараметр("Родитель", НаборРодитель); - ДочерниеНаборы = Запрос.Выполнить().Выгрузить(); - Для Каждого ДочернийНабор Из ДочерниеНаборы Цикл - ИдентификаторСсылкиДочернего = Строка(ДочернийНабор.Ссылка.УникальныйИдентификатор()); - ИдентификаторПолный = ИдентификаторСсылки + ИдентификаторСсылкиДочернего; - КонтрольнаяСумма = ОбщегоНазначения.КонтрольнаяСуммаСтрокой(СтрЗаменить(ИдентификаторПолный, "-", "")); - Дочерние.Добавить("КлючНаборовСвойств" + КонтрольнаяСумма); + ЗапросПредопределенныхНаборов = Новый Запрос; + ЗапросПредопределенныхНаборов.УстановитьПараметр("ИмяПредопределенныхДанных", УстаревшиеПредопределенныеЭлементы); + ЗапросПредопределенныхНаборов.Текст = + "ВЫБРАТЬ + | НаборыДополнительныхРеквизитовИСведений.Ссылка КАК Ссылка, + | НаборыДополнительныхРеквизитовИСведений.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений КАК НаборыДополнительныхРеквизитовИСведений + |ГДЕ + | НаборыДополнительныхРеквизитовИСведений.ЭтоГруппа = ЛОЖЬ + | И НаборыДополнительныхРеквизитовИСведений.ИмяПредопределенныхДанных В(&ИмяПредопределенныхДанных)"; + ТаблицаПредопределенных = ЗапросПредопределенныхНаборов.Выполнить().Выгрузить(); + Для Каждого Строка Из ТаблицаПредопределенных Цикл + Попытка + ДлинаПрефикса = СтрДлина("Удалить"); + ИмяНабора = Сред(Строка.ИмяПредопределенныхДанных, ДлинаПрефикса + 1, СтрДлина(Строка.ИмяПредопределенныхДанных) - ДлинаПрефикса); + + ИдентификаторСсылки = Строка(Строка.Ссылка.УникальныйИдентификатор()); + Если СтрЗаканчиваетсяНа(ИмяНабора, "_Общие") Тогда + Дочерние = Новый Массив; + ИмяНабора = СтрЗаменить(ИмяНабора, "_Общие", ""); + НаборРодитель = НаборСвойствПоИмени(ИмяНабора); + ОтборСтрок = Новый Структура("Родитель", НаборРодитель); + ДочерниеНаборы = ВсеДочерниеНаборы.НайтиСтроки(ОтборСтрок); + Для Каждого ДочернийНабор Из ДочерниеНаборы Цикл + ИдентификаторСсылкиДочернего = Строка(ДочернийНабор.Ссылка.УникальныйИдентификатор()); + + ИдентификаторыНаборов = Новый СписокЗначений; + ИдентификаторыНаборов.Добавить(ИдентификаторСсылки); + ИдентификаторыНаборов.Добавить(ИдентификаторСсылкиДочернего); + ИдентификаторыНаборов.СортироватьПоЗначению(); + + СтрокаИдентификаторов = ""; + Для Каждого ЭлементСписка Из ИдентификаторыНаборов Цикл + СтрокаИдентификаторов = СтрокаИдентификаторов + СтрЗаменить(ЭлементСписка.Значение, "-", ""); КонецЦикла; - Наборы.Вставить(ИмяНабора, Дочерние); - Иначе - КонтрольнаяСумма = ОбщегоНазначения.КонтрольнаяСуммаСтрокой(СтрЗаменить(ИдентификаторСсылки, "-", "")); - Наборы.Вставить(ИмяНабора, "КлючНаборовСвойств" + КонтрольнаяСумма + "," + ИдентификаторСсылки); - КонецЕсли; - Исключение - // Обработка исключения не требуется, отсутствует предопределенный элемент в данных. - Продолжить; - КонецПопытки; - КонецЕсли; + + КонтрольнаяСумма = ОбщегоНазначения.КонтрольнаяСуммаСтрокой(СтрокаИдентификаторов); + Дочерние.Добавить("КлючНаборовСвойств" + КонтрольнаяСумма); + КонецЦикла; + Наборы.Вставить(ИмяНабора, Дочерние); + Иначе + КонтрольнаяСумма = ОбщегоНазначения.КонтрольнаяСуммаСтрокой(СтрЗаменить(ИдентификаторСсылки, "-", "")); + Наборы.Вставить(ИмяНабора, "КлючНаборовСвойств" + КонтрольнаяСумма + "," + ИдентификаторСсылки); + КонецЕсли; + Исключение + // Обработка исключения не требуется, отсутствует предопределенный элемент в данных. + Продолжить; + КонецПопытки; КонецЦикла; Настройки = УправлениеСвойствамиСлужебный.ЧтениеНастроекИзХранилища(ХранилищеСистемныхНастроек); @@ -1783,7 +2078,7 @@ Форма.КоманднаяПанель, Форма.Элементы[ИмяЭлементаКоманднойПанели])); - Кнопка.ТолькоВоВсехДействиях = Истина; + Кнопка.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; Кнопка.ИмяКоманды = "РедактироватьСоставДополнительныхРеквизитов"; КонецЕсли; @@ -2020,10 +2315,10 @@ Если Не МетаданныеОбъекта.Иерархический Или МетаданныеОбъекта.ВидИерархии <> Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов Тогда ЭтоГруппа = Ложь; - ИначеЕсли ЗначениеЗаполнено(ОписаниеОбъекта.Ссылка) Тогда - ЭтоГруппа = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОписаниеОбъекта.Ссылка, "ЭтоГруппа"); ИначеЕсли ОписаниеОбъекта.Свойство("ЭтоГруппа") Тогда ЭтоГруппа = ОписаниеОбъекта.ЭтоГруппа; + ИначеЕсли ЗначениеЗаполнено(ОписаниеОбъекта.Ссылка) Тогда + ЭтоГруппа = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОписаниеОбъекта.Ссылка, "ЭтоГруппа"); Иначе ЭтоГруппа = Ложь; КонецЕсли; @@ -2117,29 +2412,31 @@ КонецФункции -Функция ФорматСвойства(Свойство) +Функция ФорматСвойств(Свойство) Запрос = Новый Запрос; Запрос.УстановитьПараметр("Свойство", Свойство); Запрос.Текст = "ВЫБРАТЬ - | ДополнительныеРеквизитыИСведения.ФорматСвойства КАК ФорматСвойства + | ДополнительныеРеквизитыИСведения.ФорматСвойства КАК ФорматСвойства, + | ДополнительныеРеквизитыИСведения.Ссылка КАК Свойство |ИЗ | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения |ГДЕ - | &Условие"; - Если ТипЗнч(Свойство) = Тип("Строка") Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", "ДополнительныеРеквизитыИСведения.Имя = &Свойство"); - Иначе - Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", "ДополнительныеРеквизитыИСведения.Ссылка = &Свойство"); - КонецЕсли; + | ДополнительныеРеквизитыИСведения.Имя В(&Свойство) + | ИЛИ ДополнительныеРеквизитыИСведения.Ссылка В(&Свойство)"; Результат = Запрос.Выполнить().Выгрузить(); Если Результат.Количество() = 0 Тогда Возврат Неопределено; КонецЕсли; - Возврат Результат[0].ФорматСвойства; + ФорматСвойств = Новый Соответствие; + Для Каждого Строка Из Результат Цикл + ФорматСвойств.Вставить(Строка.Свойство, Строка.ФорматСвойства); + КонецЦикла; + + Возврат ФорматСвойств; КонецФункции diff --git a/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl index e2eb8009d..ae9450d33 100644 --- a/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl @@ -101,6 +101,17 @@ Позиция = ИнформацияПоКолонкам.Количество() + 1; Свойства = УправлениеСвойствами.СвойстваОбъекта(Справочники[МетаданныеСправочника.Имя].ПустаяСсылка()); + ЗначенияСвойств = ДополнительныеЗначенияСвойства(Свойства); + СоответствиеЗначений = Новый Соответствие; + Для Каждого Строка Из ЗначенияСвойств Цикл + Значение = СоответствиеЗначений[Строка.Свойство]; + Если Значение = Неопределено Тогда + СоответствиеЗначений.Вставить(Строка.Свойство, ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Строка.Ссылка)); + Иначе + СоответствиеЗначений[Строка.Свойство].Добавить(Строка.Ссылка); + КонецЕсли; + КонецЦикла; + ДополнительныеСведения = Новый Массив; Для каждого Свойство Из Свойства Цикл Если Не Свойство.ЭтоДополнительноеСведение Тогда @@ -113,19 +124,19 @@ КонецЕсли; СтрокаИнфоПроКолонки = ИнформацияПоКолонкам.Добавить(); - СтрокаИнфоПроКолонки.ИмяКолонки = ИмяКолонки; - СтрокаИнфоПроКолонки.ПредставлениеКолонки = Строка(Свойство); - СтрокаИнфоПроКолонки.ТипКолонки = Свойство.ТипЗначения; + СтрокаИнфоПроКолонки.ИмяКолонки = ИмяКолонки; + СтрокаИнфоПроКолонки.ПредставлениеКолонки = Строка(Свойство); + СтрокаИнфоПроКолонки.ТипКолонки = Свойство.ТипЗначения; СтрокаИнфоПроКолонки.ОбязательнаДляЗаполнения = Свойство.ЗаполнятьОбязательно; - СтрокаИнфоПроКолонки.Позиция = Позиция; - СтрокаИнфоПроКолонки.Группа = НСтр("ru = 'Доп. реквизиты'"); - СтрокаИнфоПроКолонки.Видимость = Истина; - СтрокаИнфоПроКолонки.Примечание = Строка(Свойство); - СтрокаИнфоПроКолонки.Ширина = 30; + СтрокаИнфоПроКолонки.Позиция = Позиция; + СтрокаИнфоПроКолонки.Группа = НСтр("ru = 'Доп. реквизиты'"); + СтрокаИнфоПроКолонки.Видимость = Истина; + СтрокаИнфоПроКолонки.Примечание = Строка(Свойство); + СтрокаИнфоПроКолонки.Ширина = 30; Позиция = Позиция + 1; - Значения = ДополнительныеЗначенияСвойства(Свойство); - Если Значения.Количество() > 0 Тогда + Значения = СоответствиеЗначений[Свойство]; + Если ТипЗнч(Значения) = Тип("Массив") И Значения.Количество() > 0 Тогда СтрокаИнфоПроКолонки.Примечание = СтрокаИнфоПроКолонки.Примечание + Символы.ПС + НСтр("ru = 'Варианты значений:'") + Символы.ПС; Для каждого Значение Из Значения Цикл Код = ?(ЗначениеЗаполнено(Значение.Код), " (" + Значение.Код + ")", ""); @@ -140,26 +151,26 @@ Для каждого Свойство Из ДополнительныеСведения Цикл ИмяКолонки = "Свойство_" - + СтандартныеПодсистемыСервер.ПреобразоватьСтрокуВДопустимоеНаименованиеКолонки(Строка(Свойство)); - + + СтандартныеПодсистемыСервер.ПреобразоватьСтрокуВДопустимоеНаименованиеКолонки(Строка(Свойство)); + Если ИнформацияПоКолонкам.Найти(ИмяКолонки, "ИмяКолонки") <> Неопределено Тогда Продолжить; КонецЕсли; СтрокаИнфоПроКолонки = ИнформацияПоКолонкам.Добавить(); - СтрокаИнфоПроКолонки.ИмяКолонки = ИмяКолонки; - СтрокаИнфоПроКолонки.ПредставлениеКолонки = Строка(Свойство); - СтрокаИнфоПроКолонки.ТипКолонки = Свойство.ТипЗначения; + СтрокаИнфоПроКолонки.ИмяКолонки = ИмяКолонки; + СтрокаИнфоПроКолонки.ПредставлениеКолонки = Строка(Свойство); + СтрокаИнфоПроКолонки.ТипКолонки = Свойство.ТипЗначения; СтрокаИнфоПроКолонки.ОбязательнаДляЗаполнения = Свойство.ЗаполнятьОбязательно; - СтрокаИнфоПроКолонки.Позиция = Позиция; - СтрокаИнфоПроКолонки.Группа = НСтр("ru = 'Доп. свойства'"); - СтрокаИнфоПроКолонки.Видимость = Истина; - СтрокаИнфоПроКолонки.Примечание = Строка(Свойство); - СтрокаИнфоПроКолонки.Ширина = 30; + СтрокаИнфоПроКолонки.Позиция = Позиция; + СтрокаИнфоПроКолонки.Группа = НСтр("ru = 'Доп. свойства'"); + СтрокаИнфоПроКолонки.Видимость = Истина; + СтрокаИнфоПроКолонки.Примечание = Строка(Свойство); + СтрокаИнфоПроКолонки.Ширина = 30; Позиция = Позиция + 1; - Значения = ДополнительныеЗначенияСвойства(Свойство); - Если Значения.Количество() > 0 Тогда + Значения = СоответствиеЗначений[Свойство]; + Если ТипЗнч(Значения) = Тип("Массив") И Значения.Количество() > 0 Тогда СтрокаИнфоПроКолонки.Примечание = СтрокаИнфоПроКолонки.Примечание + Символы.ПС + НСтр("ru = 'Варианты значений:'") + Символы.ПС; Для каждого Значение Из Значения Цикл Код = ?(ЗначениеЗаполнено(Значение.Код), " (" + Значение.Код + ")", ""); @@ -173,6 +184,53 @@ КонецПроцедуры +Процедура ЗагрузитьЗначенияСвойствИзФайла(СсылкаНаОбъект, СтрокаТаблицы) Экспорт + + Свойства = Новый Соответствие(); + + Если УправлениеСвойствами.ИспользоватьДопРеквизиты(СсылкаНаОбъект) + Или УправлениеСвойствами.ИспользоватьДопСведения(СсылкаНаОбъект) Тогда + СписокСвойств = УправлениеСвойствами.СвойстваОбъекта(СсылкаНаОбъект); + Для Каждого Свойство Из СписокСвойств Цикл + Свойства.Вставить(Строка(Свойство), Свойство); + КонецЦикла; + КонецЕсли; + + ТаблицаСвойств = Новый ТаблицаЗначений; + ТаблицаСвойств.Колонки.Добавить("Свойство"); + ТаблицаСвойств.Колонки.Добавить("Значение"); + + Для Каждого Колонка Из СтрокаТаблицы.Владелец().Колонки Цикл + + Префикс = ""; + + Если СтрНачинаетсяС(Колонка.Имя, "ДополнительныйРеквизит_") Тогда + Префикс = "ДополнительныйРеквизит_"; + ИначеЕсли СтрНачинаетсяС(Колонка.Имя, "Свойство_") Тогда + Префикс = "Свойство_"; + КонецЕсли; + + Если ПустаяСтрока(Префикс) Тогда + Продолжить; + КонецЕсли; + + ИмяСвойства = СокрЛП(СтандартныеПодсистемыСервер.ПреобразоватьАдаптированноеНаименованиеКолонкиВСтроку(Сред(Колонка.Имя, + СтрДлина(Префикс) + 1))); + Свойство = Свойства.Получить(ИмяСвойства); // ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения + Если Свойство <> Неопределено Тогда + НоваяСтрокаСвойств = ТаблицаСвойств.Добавить(); + НоваяСтрокаСвойств.Свойство = Свойство.Ссылка; + НоваяСтрокаСвойств.Значение = СтрокаТаблицы[Колонка.Имя]; + КонецЕсли; + + КонецЦикла; + + Если ТаблицаСвойств.Количество() > 0 Тогда + УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(СсылкаНаОбъект, ТаблицаСвойств); + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем конфигурации. @@ -390,6 +448,14 @@ КонецПроцедуры +// См. МультиязычностьСервер.ОбъектыСТЧПредставления +Процедура ПриОпределенииОбъектовСТабличнойЧастьюПредставление(Объекты) Экспорт + Объекты.Добавить("Справочник.ЗначенияСвойствОбъектов"); + Объекты.Добавить("Справочник.ЗначенияСвойствОбъектовИерархия"); + Объекты.Добавить("Справочник.НаборыДополнительныхРеквизитовИСведений"); + Объекты.Добавить("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения"); +КонецПроцедуры + // АПК:299-выкл программно вызываемая процедур // // Вызывается при замене дублей в реквизитах элементов. @@ -426,7 +492,7 @@ ЗаписьЖурналаРегистрации(НСтр("ru = 'Поиск и замена ссылок'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, НеобработанныйДубль.ЗаменяемоеЗначение.Метаданные,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; @@ -1199,7 +1265,7 @@ ВтораяЧастьИмени = Прав(ИмяПредопределенного, СтрДлина(ИмяПредопределенного) - Позиция); ПолноеИмяТаблицы = ПерваяЧастьИмени + "." + ВтораяЧастьИмени; - МетаданныеВладельца = Метаданные.НайтиПоПолномуИмени(ПолноеИмяТаблицы); + МетаданныеВладельца = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяТаблицы); Если МетаданныеВладельца <> Неопределено Тогда ТипСсылки = Тип(ПерваяЧастьИмени + "Ссылка." + ВтораяЧастьИмени); @@ -1421,7 +1487,7 @@ Для каждого Таблица Из ТаблицыОбъектов Цикл Запрос.Текст = СтрЗаменить(ТекстЗапроса, "ИмяТаблицы", Таблица + ".ДополнительныеРеквизиты"); - Если НЕ Запрос.Выполнить().Пустой() Тогда + Если НЕ Запрос.Выполнить().Пустой() Тогда // @skip-check query-in-loop - запрос к разным таблицам. Возврат Истина; КонецЕсли; КонецЦикла; @@ -1484,7 +1550,7 @@ ПолноеИмя = ПерваяЧастьИмени + "." + ВтораяЧастьИмени; - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмя); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмя); Если ОбъектМетаданных = Неопределено Тогда Если ТипЗнч(Набор) = Тип("Строка") Тогда Возврат ""; @@ -1603,36 +1669,39 @@ // Параметры: // Свойство - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - свойство для // которого нужно получить перечисляемые значения. +// - Массив // // Возвращаемое значение: // Массив из СправочникСсылка - значения свойства, если есть. // Функция ДополнительныеЗначенияСвойства(Свойство) Экспорт - ТипЗначения = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Свойство, "ТипЗначения"); - - Если ТипЗначения.СодержитТип(Тип("СправочникСсылка.ЗначенияСвойствОбъектовИерархия")) Тогда - ТекстЗапроса = + Запрос = Новый Запрос; + Запрос.Параметры.Вставить("Свойство", Свойство); + Запрос.Текст = "ВЫБРАТЬ - | Ссылка КАК Ссылка + | ЗначенияСвойствОбъектовИерархия.Ссылка КАК Ссылка, + | ЗначенияСвойствОбъектовИерархия.Владелец КАК Свойство |ИЗ - | Справочник.ЗначенияСвойствОбъектовИерархия КАК ЗначенияСвойствОбъектов + | Справочник.ЗначенияСвойствОбъектовИерархия КАК ЗначенияСвойствОбъектовИерархия |ГДЕ - | ЗначенияСвойствОбъектов.Владелец = &Свойство"; - Иначе - ТекстЗапроса = - "ВЫБРАТЬ - | Ссылка КАК Ссылка + | ЗначенияСвойствОбъектовИерархия.Владелец В (&Свойство) + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ЗначенияСвойствОбъектов.Ссылка КАК Ссылка, + | ЗначенияСвойствОбъектов.Владелец КАК Свойство |ИЗ | Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов |ГДЕ - | ЗначенияСвойствОбъектов.Владелец = &Свойство"; - КонецЕсли; + | ЗначенияСвойствОбъектов.Владелец В (&Свойство)"; - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - Запрос.Параметры.Вставить("Свойство", Свойство); - Результат = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + Если ТипЗнч(Свойство) = Тип("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения") Тогда + Результат = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + Иначе + Результат = Запрос.Выполнить().Выгрузить(); + КонецЕсли; Возврат Результат; @@ -1836,6 +1905,7 @@ Объект["Наименование" + СуффиксЯзыка] = ЛокализованноеНаименование; Записать = Истина; КонецЕсли; + КонецЦикла; КонецЕсли; @@ -1914,7 +1984,7 @@ |%2'"); ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, "УправлениеСвойствамиСлужебный.ОчиститьНеиспользуемыеНастройки", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации( ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение,,, @@ -1936,7 +2006,7 @@ |%2'"); ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, "УправлениеСвойствамиСлужебный.ОчиститьНеиспользуемыеНастройки", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации( ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение,,, @@ -1947,6 +2017,181 @@ КонецФункции +Функция НаименованиеУжеИспользуется(Свойство, НаборСвойств, Наименование) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | СвойстваНабора.Свойство КАК Свойство, + | РеквизитыИСведения.ЭтоДополнительноеСведение КАК ЭтоДополнительноеСведение + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК СвойстваНабора + | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК РеквизитыИСведения + | ПО (РеквизитыИСведения.Ссылка = СвойстваНабора.Свойство) + |ГДЕ + | РеквизитыИСведения.Заголовок = &Наименование + | И СвойстваНабора.Ссылка = &НаборСвойств + | И СвойстваНабора.Свойство <> &Ссылка + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ ПЕРВЫЕ 1 + | СвойстваНабора.Свойство КАК Свойство, + | РеквизитыИСведения.ЭтоДополнительноеСведение КАК ЭтоДополнительноеСведение + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения КАК СвойстваНабора + | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК РеквизитыИСведения + | ПО (РеквизитыИСведения.Ссылка = СвойстваНабора.Свойство) + |ГДЕ + | РеквизитыИСведения.Заголовок = &Наименование + | И СвойстваНабора.Ссылка = &НаборСвойств + | И СвойстваНабора.Свойство <> &Ссылка"; + + Запрос.УстановитьПараметр("Ссылка", Свойство); + Запрос.УстановитьПараметр("НаборСвойств", НаборСвойств); + Запрос.УстановитьПараметр("Наименование", Наименование); + + Выборка = Запрос.Выполнить().Выбрать(); + + Если НЕ Выборка.Следующий() Тогда + Возврат ""; + КонецЕсли; + + Если Выборка.ЭтоДополнительноеСведение Тогда + ТекстВопроса = НСтр("ru = 'Существует дополнительное сведение с наименованием + |""%1"".'"); + Иначе + ТекстВопроса = НСтр("ru = 'Существует дополнительный реквизит с наименованием + |""%1"".'"); + КонецЕсли; + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстВопроса + Символы.ПС + Символы.ПС + + НСтр("ru = 'Рекомендуется использовать другое наименование, + |иначе программа может работать некорректно.'"), + Наименование); + + Возврат ТекстВопроса; + +КонецФункции + +Функция ИмяУжеИспользуется(Знач Имя, Знач ТекущееСвойство) Экспорт + + НовоеИмя = Имя; + УдалитьНедопустимыеСимволы(НовоеИмя); + Если НовоеИмя <> Имя + Или ИмяНачинаетсяСЦифры(Имя) + Или СтрРазделить(НовоеИмя, " ", Истина).Количество() > 1 Тогда + + ТекстВопроса = НСтр("ru = 'Имя (группа Для разработчиков) должно состоять из одного слова, начинаться с буквы и не содержать специальных символов, кроме ""_"".'"); + Возврат ТекстВопроса; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | Свойства.ЭтоДополнительноеСведение + |ИЗ + | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства + |ГДЕ + | Свойства.Имя = &Имя + | И Свойства.Ссылка <> &Ссылка"; + + Запрос.УстановитьПараметр("Ссылка", ТекущееСвойство); + Запрос.УстановитьПараметр("Имя", Имя); + + Выборка = Запрос.Выполнить().Выбрать(); + + Если НЕ Выборка.Следующий() Тогда + Возврат ""; + КонецЕсли; + + Если Выборка.ЭтоДополнительноеСведение Тогда + ТекстВопроса = НСтр("ru = 'Существует дополнительное сведение с именем + |""%1"".'"); + Иначе + ТекстВопроса = НСтр("ru = 'Существует дополнительный реквизит с именем + |""%1"".'"); + КонецЕсли; + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстВопроса + Символы.ПС + Символы.ПС + + НСтр("ru = 'Рекомендуется использовать другое имя, + |иначе программа может работать некорректно. + | + |Создать новое имя и продолжить запись?'"), + Имя); + + Возврат ТекстВопроса; + +КонецФункции + +Функция ИмяНачинаетсяСЦифры(ИмяРеквизита) Экспорт + ПервыйСимвол = Лев(ИмяРеквизита, 1); + Если СтрНайти("0123456789", ПервыйСимвол) > 0 Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; +КонецФункции + +Функция ИдентификаторДляФормулУжеИспользуется(Знач ИдентификаторДляФормул, Знач ТекущееСвойство) Экспорт + + ПроверочныйИдентификатор = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ИдентификаторДляФормул(ИдентификаторДляФормул); + Если ВРег(ИдентификаторДляФормул) <> ВРег(ПроверочныйИдентификатор) Тогда + ТекстВопроса = НСтр("ru = 'Идентификатор ""%1"" не соответствует правилам именования переменных. + |Идентификатор не должен содержать пробелов и специальных символов.'"); + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстВопроса, + ИдентификаторДляФормул); + Возврат ТекстВопроса; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | Свойства.ЭтоДополнительноеСведение + |ИЗ + | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства + |ГДЕ + | Свойства.ИдентификаторДляФормул = &ИдентификаторДляФормул + | И Свойства.Ссылка <> &Ссылка"; + + Запрос.УстановитьПараметр("Ссылка", ТекущееСвойство); + Запрос.УстановитьПараметр("ИдентификаторДляФормул", ИдентификаторДляФормул); + + НачатьТранзакцию(); + Попытка + Выборка = Запрос.Выполнить().Выбрать(); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + Если НЕ Выборка.Следующий() Тогда + Возврат ""; + КонецЕсли; + + Если Выборка.ЭтоДополнительноеСведение Тогда + ТекстВопроса = НСтр("ru = 'Существует дополнительное сведение с идентификатором для формул + |""%1"".'"); + Иначе + ТекстВопроса = НСтр("ru = 'Существует дополнительный реквизит с идентификатором для формул + |""%1"".'"); + КонецЕсли; + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстВопроса + Символы.ПС + Символы.ПС + + НСтр("ru = 'Рекомендуется использовать другой идентификатор для формул, + |иначе программа может работать некорректно.'"), + ИдентификаторДляФормул); + + Возврат ТекстВопроса; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Вспомогательные процедуры и функции. @@ -2026,6 +2271,304 @@ КонецФункции +// Используется в форме списка справочника НаборыДополнительныхРеквизитовИСведений +// и плана видов характеристик ДополнительныеРеквизитыИСведения. +// +Процедура ОбновитьСписокСвойствТекущегоНабора(Форма, Набор, ЭтоСведения, ТекущаяДоступность = Неопределено) Экспорт + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Набор", Набор); + Запрос.УстановитьПараметр("ЭтоОсновнойЯзык", ОбщегоНазначения.ЭтоОсновнойЯзык()); + Запрос.УстановитьПараметр("КодЯзыка", ТекущийЯзык().КодЯзыка); + + Если Не Форма.ПоказатьНеиспользуемыеРеквизиты Тогда + Запрос.Текст = + "ВЫБРАТЬ + | СвойстваНаборов.НомерСтроки, + | СвойстваНаборов.Свойство, + | СвойстваНаборов.ПометкаУдаления, + | Свойства.Заголовок КАК Заголовок, + | Свойства.ВладелецДополнительныхЗначений, + | Свойства.ЗаполнятьОбязательно, + | Свойства.ТипЗначения КАК ТипЗначения, + | ИСТИНА КАК Общее, + | ВЫБОР + | КОГДА СвойстваНаборов.ПометкаУдаления = ИСТИНА + | ТОГДА 4 + | ИНАЧЕ 3 + | КОНЕЦ КАК НомерКартинки, + | Свойства.Подсказка КАК Подсказка, + | Свойства.ЗаголовокФормыЗначения КАК ЗаголовокФормыЗначения, + | Свойства.ЗаголовокФормыВыбораЗначения КАК ЗаголовокФормыВыбораЗначения + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК СвойстваНаборов + | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства + | ПО СвойстваНаборов.Свойство = Свойства.Ссылка + |ГДЕ + | СвойстваНаборов.Ссылка = &Набор + | + |УПОРЯДОЧИТЬ ПО + | СвойстваНаборов.НомерСтроки + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Наборы.ВерсияДанных КАК ВерсияДанных + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений КАК Наборы + |ГДЕ + | Наборы.Ссылка = &Набор"; + Иначе + Запрос.Текст = + "ВЫБРАТЬ + | Свойства.Ссылка КАК Свойство, + | Свойства.ПометкаУдаления КАК ПометкаУдаления, + | Свойства.Заголовок КАК Заголовок, + | Свойства.ВладелецДополнительныхЗначений, + | Свойства.ТипЗначения КАК ТипЗначения, + | ИСТИНА КАК Общее, + | ВЫБОР + | КОГДА Свойства.ПометкаУдаления = ИСТИНА + | ТОГДА 4 + | ИНАЧЕ 3 + | КОНЕЦ КАК НомерКартинки, + | Свойства.Подсказка КАК Подсказка, + | Свойства.ЗаголовокФормыЗначения КАК ЗаголовокФормыЗначения, + | Свойства.ЗаголовокФормыВыбораЗначения КАК ЗаголовокФормыВыбораЗначения + |ИЗ + | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства + | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Представления КАК СвойстваПредставления + | ПО Свойства.Ссылка = СвойстваПредставления.Ссылка + | И СвойстваПредставления.КодЯзыка = &КодЯзыка + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК СоставНабора + | ПО Свойства.Ссылка = СоставНабора.Свойство + |ГДЕ + | Свойства.ЭтоДополнительноеСведение = &ЭтоДополнительноеСведение + | И СоставНабора.Свойство ЕСТЬ NULL + | + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ""ВерсияДанных"" КАК ВерсияДанных"; + + Запрос.УстановитьПараметр("ЭтоДополнительноеСведение", (ЭтоСведения)); + КонецЕсли; + + Если ЭтоСведения Тогда + Запрос.Текст = СтрЗаменить( + Запрос.Текст, + "Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты", + "Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения"); + КонецЕсли; + + СуффиксТекущегоЯзыка = ОбщегоНазначения.СуффиксЯзыкаТекущегоПользователя(); + Если СуффиксТекущегоЯзыка = Неопределено Тогда + + Если Не Форма.ПоказатьНеиспользуемыеРеквизиты Тогда + Позиция = СтрНайти(Запрос.Текст, "ГДЕ"); + Запрос.Текст = Лев(Запрос.Текст, Позиция - 1 ) + + " ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Представления КАК СвойстваПредставления + | ПО Свойства.Ссылка = СвойстваПредставления.Ссылка + | И СвойстваПредставления.КодЯзыка = &КодЯзыка" + Сред(Запрос.Текст, Позиция -1); + КонецЕсли; + + Запрос.Текст = СтрЗаменить(Запрос.Текст, "Свойства.Заголовок КАК Заголовок", + "ВЫРАЗИТЬ(ЕСТЬNULL(СвойстваПредставления.Заголовок, Свойства.Заголовок) КАК СТРОКА(150)) КАК Заголовок"); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "Свойства.Подсказка КАК Подсказка", + "ВЫРАЗИТЬ(ЕСТЬNULL(СвойстваПредставления.Подсказка, Свойства.Подсказка) КАК СТРОКА(150)) КАК Подсказка"); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "Свойства.ЗаголовокФормыЗначения КАК ЗаголовокФормыЗначения", + "ВЫРАЗИТЬ(ЕСТЬNULL(СвойстваПредставления.ЗаголовокФормыЗначения, Свойства.ЗаголовокФормыЗначения) КАК СТРОКА(150)) КАК ЗаголовокФормыЗначения"); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "Свойства.ЗаголовокФормыВыбораЗначения КАК ЗаголовокФормыВыбораЗначения", + "ВЫРАЗИТЬ(ЕСТЬNULL(СвойстваПредставления.ЗаголовокФормыВыбораЗначения, Свойства.ЗаголовокФормыВыбораЗначения) КАК СТРОКА(150)) КАК ЗаголовокФормыВыбораЗначения"); + Иначе + + Если ЗначениеЗаполнено(СуффиксТекущегоЯзыка) И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(Запрос.Текст, "Свойства.Заголовок КАК Заголовок"); + Если Форма.ПоказатьНеиспользуемыеРеквизиты Тогда + МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(Запрос.Текст, "Свойства.Подсказка КАК Подсказка"); + МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(Запрос.Текст, "Свойства.ЗаголовокФормыЗначения КАК ЗаголовокФормыЗначения"); + МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(Запрос.Текст, "Свойства.ЗаголовокФормыВыбораЗначения КАК ЗаголовокФормыВыбораЗначения"); + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + НачатьТранзакцию(); + Попытка + РезультатыЗапроса = Запрос.ВыполнитьПакет(); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + Если Форма.Элементы.Свойства.ТекущаяСтрока = Неопределено Тогда + Строка = Неопределено; + Иначе + Строка = Форма.Свойства.НайтиПоИдентификатору(Форма.Элементы.Свойства.ТекущаяСтрока); + КонецЕсли; + ТекущееСвойство = ?(Строка = Неопределено, Неопределено, Строка.Свойство); + + Форма.Свойства.Очистить(); + + Если РезультатыЗапроса[1].Пустой() Тогда + ТекущаяДоступность = Ложь; + Возврат; + КонецЕсли; + + Форма.ТекущийНаборВерсияДанных = РезультатыЗапроса[1].Выгрузить()[0].ВерсияДанных; + + РеквизитыСоЗначениямиСвойств = Новый Массив; + Выборка = РезультатыЗапроса[0].Выбрать(); + Пока Выборка.Следующий() Цикл + Если Выборка.ТипЗначения <> NULL + И ТипЗначенияСодержитЗначенияСвойств(Выборка.ТипЗначения) Тогда + Если ЗначениеЗаполнено(Выборка.ВладелецДополнительныхЗначений) Тогда + РеквизитыСоЗначениямиСвойств.Добавить(Выборка.ВладелецДополнительныхЗначений); + Иначе + РеквизитыСоЗначениямиСвойств.Добавить(Выборка.Свойство); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Владелец", РеквизитыСоЗначениямиСвойств); + Запрос.Текст = + "ВЫБРАТЬ + | ПРЕДСТАВЛЕНИЕ(ЗначенияСвойствОбъектов.Ссылка) КАК Наименование, + | ЗначенияСвойствОбъектов.Владелец КАК Владелец + |ИЗ + | Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов + |ГДЕ + | ЗначенияСвойствОбъектов.Владелец В(&Владелец) + | И НЕ ЗначенияСвойствОбъектов.ЭтоГруппа + | И НЕ ЗначенияСвойствОбъектов.ПометкаУдаления + | И ЗначенияСвойствОбъектов.Ссылка В + | (ВЫБРАТЬ ПЕРВЫЕ 4 + | ЗначенияСвойствОбъектовДляПроверки.Ссылка + | ИЗ + | Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектовДляПроверки + | ГДЕ + | ЗначенияСвойствОбъектовДляПроверки.Владелец = ЗначенияСвойствОбъектов.Владелец + | И НЕ ЗначенияСвойствОбъектовДляПроверки.ЭтоГруппа + | И НЕ ЗначенияСвойствОбъектовДляПроверки.ПометкаУдаления) + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ПРЕДСТАВЛЕНИЕ(ЗначенияСвойствОбъектовИерархия.Ссылка) КАК Наименование, + | ЗначенияСвойствОбъектовИерархия.Владелец + |ИЗ + | Справочник.ЗначенияСвойствОбъектовИерархия КАК ЗначенияСвойствОбъектовИерархия + |ГДЕ + | ЗначенияСвойствОбъектовИерархия.Владелец В(&Владелец) + | И НЕ ЗначенияСвойствОбъектовИерархия.ПометкаУдаления + | И ЗначенияСвойствОбъектовИерархия.Ссылка В + | (ВЫБРАТЬ ПЕРВЫЕ 4 + | ЗначенияСвойствОбъектовИерархияДляПроверки.Ссылка + | ИЗ + | Справочник.ЗначенияСвойствОбъектовИерархия КАК ЗначенияСвойствОбъектовИерархияДляПроверки + | ГДЕ + | ЗначенияСвойствОбъектовИерархияДляПроверки.Владелец = ЗначенияСвойствОбъектовИерархия.Владелец + | И НЕ ЗначенияСвойствОбъектовИерархияДляПроверки.ПометкаУдаления) + | + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ ПЕРВЫЕ 1 + | ЗначенияСвойствОбъектов.Владелец КАК Владелец + |ИЗ + | Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов + |ГДЕ + | ЗначенияСвойствОбъектов.Владелец В(&Владелец) + | И НЕ ЗначенияСвойствОбъектов.ЭтоГруппа + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ ПЕРВЫЕ 1 + | ЗначенияСвойствОбъектовИерархия.Владелец КАК Владелец + |ИЗ + | Справочник.ЗначенияСвойствОбъектовИерархия КАК ЗначенияСвойствОбъектовИерархия + |ГДЕ + | ЗначенияСвойствОбъектовИерархия.Владелец В(&Владелец)"; + ВыборкаЗначений = Запрос.ВыполнитьПакет(); + + Результат = ВыборкаЗначений[0].Выгрузить(); + СоответствиеЗначенийРеквизитов = Новый Соответствие; + Для Каждого Строка Из Результат Цикл + ТекущийСписокЗначений = СоответствиеЗначенийРеквизитов[Строка.Владелец]; + Если ТекущийСписокЗначений = Неопределено Тогда + Индекс = 1; + СоответствиеЗначенийРеквизитов.Вставить(Строка.Владелец, Строка.Наименование); + Иначе + Индекс = Индекс + 1; + Если Индекс = 4 Тогда + ТекущийСписокЗначений = ТекущийСписокЗначений + ",..."; + Иначе + ТекущийСписокЗначений = ТекущийСписокЗначений + ", " + Строка.Наименование; + КонецЕсли; + СоответствиеЗначенийРеквизитов.Вставить(Строка.Владелец, ТекущийСписокЗначений); + КонецЕсли; + КонецЦикла; + + Результат = ВыборкаЗначений[1].Выгрузить(); + РеквизитыСоЗначениями = Новый Соответствие; + Для Каждого Строка Из Результат Цикл + РеквизитыСоЗначениями.Вставить(Строка.Владелец, Истина); + КонецЦикла; + + Выборка = РезультатыЗапроса[0].Выбрать(); + Пока Выборка.Следующий() Цикл + + НоваяСтрока = Форма.Свойства.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка); + + НоваяСтрока.ОбщиеЗначения = ЗначениеЗаполнено(Выборка.ВладелецДополнительныхЗначений); + + Если Выборка.ТипЗначения <> NULL + И ТипЗначенияСодержитЗначенияСвойств(Выборка.ТипЗначения) Тогда + + НоваяСтрока.ТипЗначения = Строка(Новый ОписаниеТипов( + Выборка.ТипЗначения, + , + "СправочникСсылка.ЗначенияСвойствОбъектовИерархия, + |СправочникСсылка.ЗначенияСвойствОбъектов")); + + Если ЗначениеЗаполнено(Выборка.ВладелецДополнительныхЗначений) Тогда + ПервыеЗначения = СоответствиеЗначенийРеквизитов[Выборка.ВладелецДополнительныхЗначений]; + ЕстьЗначения = РеквизитыСоЗначениями[Выборка.ВладелецДополнительныхЗначений]; + Иначе + ПервыеЗначения = СоответствиеЗначенийРеквизитов[Выборка.Свойство]; + ЕстьЗначения = РеквизитыСоЗначениями[Выборка.Свойство]; + КонецЕсли; + + Если ПервыеЗначения = Неопределено Тогда + Если ЕстьЗначения = Истина Тогда + ПредставлениеЗначений = НСтр("ru = 'Значения помечены на удаление'"); + Иначе + ПредставлениеЗначений = НСтр("ru = 'Значения еще не введены'"); + КонецЕсли; + Иначе + ПредставлениеЗначений = ПервыеЗначения; + КонецЕсли; + ПредставлениеЗначений = "<" + ПредставлениеЗначений + ">"; + Если ЗначениеЗаполнено(НоваяСтрока.ТипЗначения) Тогда + ПредставлениеЗначений = ПредставлениеЗначений + ", "; + КонецЕсли; + НоваяСтрока.ТипЗначения = ПредставлениеЗначений + НоваяСтрока.ТипЗначения; + КонецЕсли; + + Если Выборка.Свойство = ТекущееСвойство Тогда + Форма.Элементы.Свойства.ТекущаяСтрока = + Форма.Свойства[Форма.Свойства.Количество()-1].ПолучитьИдентификатор(); + КонецЕсли; + КонецЦикла + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы. diff --git a/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl b/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl index a4f55a5ce..cdb467864 100644 --- a/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl +++ b/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl @@ -138,10 +138,10 @@ Пока Выборка.Следующий() Цикл Получено = 0; ПолученныеПисьма.ПолученныеПисьмаПоУчетнойЗаписи.Очистить(); + // @skip-check query-in-loop - Порционная загрузка писем из разных почтовых ящиков. ПолучитьПисьма(Выборка, Ложь, Получено, ПолученныеПисьма); - + // @skip-check query-in-loop - Порционная загрузка писем из разных почтовых ящиков. ОпределитьЗагруженныеРанееПодчиненныеПисьма(Выборка.Ссылка, ПолученныеПисьма.ПолученныеПисьмаПоУчетнойЗаписи); - КонецЦикла; Возврат Выборка.Ссылка; @@ -217,6 +217,7 @@ Пока ВыборкаУчетныеЗаписи.Следующий() Цикл УчетнаяЗапись = ВыборкаУчетныеЗаписи.УчетнаяЗапись; + // @skip-check query-in-loop - Порционная загрузка писем из разных почтовых ящиков. Если Не ЗаблокироватьУчетнуюЗапись(УчетнаяЗапись) Тогда Продолжить; КонецЕсли; @@ -234,18 +235,16 @@ ПисьмоОбъект = ВыборкаПисьма.Ссылка.ПолучитьОбъект(); ПараметрыПисьма = Взаимодействия.ПараметрыПисьмаДляОтправки(ПисьмоОбъект); Попытка - Письмо = РаботаСПочтовымиСообщениями.ПодготовитьПисьмо(УчетнаяЗапись, ПараметрыПисьма); - Исключение - ШаблонСообщенияОбОшибке = НСтр("ru = 'При подготовке письма %1 к отправке произошла ошибка - |%2'", ОбщегоНазначения.КодОсновногоЯзыка()); + ШаблонСообщенияОбОшибке = НСтр("ru = 'Письмо %1 не подготовлено к отправке по причине: + |%2'", ОбщегоНазначения.КодОсновногоЯзыка()); ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ШаблонСообщенияОбОшибке, Взаимодействия.ПредставлениеПисьма(ПисьмоОбъект.Тема, ПисьмоОбъект.Дата), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, , , ТекстСообщенияОбОшибке); МенеджерЗаписи = РегистрыСведений.НепринятыеКОбработкеПочтовымСерверомИсходящиеПисьма.СоздатьМенеджерЗаписи(); @@ -270,7 +269,7 @@ Исключение СнятьБлокировкуУчетнойЗаписиДляПолучения(УчетнаяЗапись); - ШаблонСообщенияОбОшибке = НСтр("ru = 'Во время подключения к учетной записи %1 произошла ошибка + ШаблонСообщенияОбОшибке = НСтр("ru = 'Не удалось подключиться к учетной записи %1 по причине: |%2'", ОбщегоНазначения.КодОсновногоЯзыка()); ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщенияОбОшибке, @@ -363,8 +362,8 @@ КонецЕсли; ИнформацияОбОшибке = ИнформацияОбОшибке(); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, Ссылка.Метаданные(), - ПисьмоОбъект, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - Возврат КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПисьмоОбъект, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + Возврат ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Возврат ""; @@ -612,9 +611,11 @@ Получено = 0; ПолученныеПисьма = ПолученныеПисьма(); + // @skip-check query-in-loop - Порционная загрузка писем из разных почтовых ящиков. ПолучитьПисьма(Выборка, Результат.ЕстьОшибки, Получено, ПолученныеПисьма); Результат.ПолученоПисем = Результат.ПолученоПисем + Получено; + // @skip-check query-in-loop - Порционная загрузка писем из разных почтовых ящиков. ОпределитьЗагруженныеРанееПодчиненныеПисьма(Выборка.Ссылка, ПолученныеПисьма.ПолученныеПисьмаПоУчетнойЗаписи); Взаимодействия.ЗаполнитьКонтактыМассиваВзаимодействий(ПолученныеПисьма.ВсеПолученныеПисьма); Взаимодействия.УстановитьПапкиДляМассиваПисем(ПолученныеПисьма.ПисьмаДляОпределенияПапок); @@ -773,10 +774,7 @@ Возврат; КонецЕсли; - // ----------------------------------------------------------------- - // Сформируем почтовый профиль и подключимся к почтовому серверу. Профиль = РаботаСПочтовымиСообщениямиСлужебный.ИнтернетПочтовыйПрофиль(ДанныеУчетнойЗаписи.Ссылка, Истина); - Протокол = ПротоколИнтернетПочты.POP3; Если ДанныеУчетнойЗаписи.ПротоколВходящейПочты = "IMAP" Тогда Протокол = ПротоколИнтернетПочты.IMAP; @@ -785,24 +783,19 @@ Почта = Новый ИнтернетПочта; Попытка Почта.Подключиться(Профиль, Протокол); - Исключение - + Исключение СнятьБлокировкуУчетнойЗаписиДляПолучения(ДанныеУчетнойЗаписи.Ссылка); ЕстьОшибки = Истина; - ТекстСообщенияОбОшибке = РаботаСПочтовымиСообщениями.РасширенноеПредставлениеОшибки( - ИнформацияОбОшибке(), ОбщегоНазначения.КодОсновногоЯзыка()); - + ИнформацияОбОшибке(), ОбщегоНазначения.КодОсновногоЯзыка()); ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Во время подключения к учетной записи %1 произошла ошибка + НСтр("ru = 'Не удалось подключиться к учетной записи %1 по причине: |%2'", ОбщегоНазначения.КодОсновногоЯзыка()), ДанныеУчетнойЗаписи.Ссылка, - ТекстСообщенияОбОшибке); - + ТекстСообщенияОбОшибке); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка, , , ТекстСообщенияОбОшибке); - + УровеньЖурналаРегистрации.Ошибка, , , ТекстСообщенияОбОшибке); Возврат; КонецПопытки; @@ -820,31 +813,36 @@ КонецПроцедуры -Процедура ПолучитьПисьмаПоМассивуИдентификаторов(Почта, - ДанныеУчетнойЗаписи, - ИдЗагружать, - Получено, - СтруктураМассивовСозданныхПисем, - ВсеИдентификаторы = Неопределено) +// Параметры: +// Почта - ИнтернетПочта +// ДанныеУчетнойЗаписи - ВыборкаИзРезультатаЗапроса +// ИдентификаторыПисемКЗагрузке - Массив из Строка +// ПолученныеПисьма - см. ПолученныеПисьма +// ВсеИдентификаторы - Массив из Строка +// +// Возвращаемое значение: +// Число - количество полученных писем. +// +Функция ПолучитьПисьмаПоИдентификаторам(Почта, ДанныеУчетнойЗаписи, ИдентификаторыПисемКЗагрузке, + ПолученныеПисьма, ВсеИдентификаторы = Неопределено) - Получено = 0; + ПолученоПисем = 0; - Если ИдЗагружать.Количество() <> 0 Тогда + Если ИдентификаторыПисемКЗагрузке.Количество() <> 0 Тогда ОтветственныйЗаОбработкуПисем = ДанныеУчетнойЗаписи.ОтветственныйЗаОбработкуПисем; КоличествоОшибокПриЗаписи = 0; КоличествоНеАктуальныхСообщений = 0; - Пока ИдЗагружать.Количество() > (Получено + КоличествоОшибокПриЗаписи + КоличествоНеАктуальныхСообщений) Цикл + Пока ИдентификаторыПисемКЗагрузке.Количество() > (ПолученоПисем + КоличествоОшибокПриЗаписи + КоличествоНеАктуальныхСообщений) Цикл КоличествоВПорции = 0; - МассивИдентификаторовПорцииДляЗагрузки = Новый Массив; + ИдентификаторыПорцииДляЗагрузки = Новый Массив; - Для Инд = (Получено + КоличествоОшибокПриЗаписи) По ИдЗагружать.Количество() - 1 Цикл + Для Индекс = (ПолученоПисем + КоличествоОшибокПриЗаписи) По ИдентификаторыПисемКЗагрузке.Количество() - 1 Цикл - МассивИдентификаторовПорцииДляЗагрузки.Добавить(ИдЗагружать.Получить(Инд)); + ИдентификаторыПорцииДляЗагрузки.Добавить(ИдентификаторыПисемКЗагрузке.Получить(Индекс)); КоличествоВПорции = КоличествоВПорции + 1; - Если КоличествоВПорции = 5 Тогда Прервать; КонецЕсли; @@ -852,16 +850,14 @@ КонецЦикла; Попытка - // Получим нужные сообщения - Сообщения = Почта.Выбрать(Ложь, - МассивИдентификаторовПорцииДляЗагрузки, - ?(ДанныеУчетнойЗаписи.ПротоколВходящейПочты = "IMAP",Ложь, Истина)); // Массив из ИнтернетПочтовоеСообщение + Сообщения = Почта.Выбрать(Ложь, ИдентификаторыПорцииДляЗагрузки, + ?(ДанныеУчетнойЗаписи.ПротоколВходящейПочты = "IMAP", Ложь, Истина)); // Массив из ИнтернетПочтовоеСообщение Исключение ТекстОшибкиДляЖурналаРегистрации = РаботаСПочтовымиСообщениями.РасширенноеПредставлениеОшибки( ИнформацияОбОшибке(), ОбщегоНазначения.КодОсновногоЯзыка()); ТекстОшибкиДляЖурналаРегистрации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Во время подключения к учетной записи %1 произошла ошибка + НСтр("ru = 'Не удалось подключиться к учетной записи %1 по причине: |%2'", ОбщегоНазначения.КодОсновногоЯзыка()), ДанныеУчетнойЗаписи.Ссылка, ТекстОшибкиДляЖурналаРегистрации); @@ -875,7 +871,6 @@ КоличествоНеАктуальныхСообщений = КоличествоНеАктуальныхСообщений + (КоличествоВПорции - Сообщения.Количество()); - // Запишем их Для Каждого Сообщение Из Сообщения Цикл ДобавлятьВМассивПисемДляПолученияПапки = Ложь; @@ -893,38 +888,29 @@ КонецЕсли; НачатьТранзакцию(); - Попытка Блокировка.Заблокировать(); - ЭтоИсходящееПисьмо = ПочтовыеАдресаРавны(ДанныеУчетнойЗаписи.АдресЭлектроннойПочты, - АдресОтправителяИнтернетПочтовогоСообщения(Сообщение.Отправитель)); - - СозданноеПисьмо = ЗаписатьЭлектронноеПисьмо(ДанныеУчетнойЗаписи, - Сообщение, - ОтветственныйЗаОбработкуПисем, - ДанныеУчетнойЗаписи.ПомещатьПисьмоВПапкуПисьмаОснования, - ДобавлятьВМассивПисемДляПолученияПапки, - ЭтоИсходящееПисьмо); - - Получено = Получено + 1; + ЭтоИсходящееПисьмо = ПочтовыеАдресаРавны(ДанныеУчетнойЗаписи.АдресЭлектроннойПочты, + АдресОтправителяИнтернетПочтовогоСообщения(Сообщение.Отправитель)); + // @skip-check query-in-loop - По-объектная запись данных. + СозданноеПисьмо = ЗаписатьЭлектронноеПисьмо(ДанныеУчетнойЗаписи, Сообщение, + ОтветственныйЗаОбработкуПисем, ДанныеУчетнойЗаписи.ПомещатьПисьмоВПапкуПисьмаОснования, + ДобавлятьВМассивПисемДляПолученияПапки, ЭтоИсходящееПисьмо); + ПолученоПисем = ПолученоПисем + 1; ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При получении письма %1 от %2, отправленное c адреса %3 произошла ошибка - |%4'", ОбщегоНазначения.КодОсновногоЯзыка()), - Сообщение.Тема, - Сообщение.ДатаОтправления, - Сообщение.Отправитель.Адрес, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка, , , - ТекстСообщенияОбОшибке); + НСтр("ru = 'Не удалось получить письмо %1 от %2, отправленное c адреса %3, по причине: + |%4'", ОбщегоНазначения.КодОсновногоЯзыка()), + Сообщение.Тема, Сообщение.ДатаОтправления, Сообщение.Отправитель.Адрес, + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, , , + ТекстСообщенияОбОшибке); КоличествоОшибокПриЗаписи = КоличествоОшибокПриЗаписи + 1; @@ -940,10 +926,10 @@ КонецПопытки; - СтруктураМассивовСозданныхПисем.ВсеПолученныеПисьма.Добавить(СозданноеПисьмо); - СтруктураМассивовСозданныхПисем.ПолученныеПисьмаПоУчетнойЗаписи.Добавить(СозданноеПисьмо); + ПолученныеПисьма.ВсеПолученныеПисьма.Добавить(СозданноеПисьмо); + ПолученныеПисьма.ПолученныеПисьмаПоУчетнойЗаписи.Добавить(СозданноеПисьмо); Если ДобавлятьВМассивПисемДляПолученияПапки Тогда - СтруктураМассивовСозданныхПисем.ПисьмаДляОпределенияПапок.Добавить(СозданноеПисьмо); + ПолученныеПисьма.ПисьмаДляОпределенияПапок.Добавить(СозданноеПисьмо); КонецЕсли; КонецЦикла; @@ -951,8 +937,9 @@ КонецЦикла; КонецЕсли; + Возврат ПолученоПисем; -КонецПроцедуры +КонецФункции Функция ДатаОтбораЗагрузкиПисемПоПротоколуIMAP(ДатаЗагрузкиПисем) @@ -964,9 +951,8 @@ СтрокаТаблицыИдентификаторов = ТаблицаИдентификаторов.Добавить(); СтрокаТаблицыИдентификаторов.ИдентификаторНаСервере = ?(ЗаголовокПисьма.Идентификатор.Количество() = 0, - "", - ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(ЗаголовокПисьма.Идентификатор[0], "")); - + "", + ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(ЗаголовокПисьма.Идентификатор[0], "")); СтрокаТаблицыИдентификаторов.ИдентификаторПисьма = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(ЗаголовокПисьма.ИдентификаторСообщения, ""); @@ -979,20 +965,23 @@ Возврат; КонецЕсли; - ПозицияОткрывающегосяТега = СтрНайти(ЗаголовокПисьма.Заголовок, "<", НаправлениеПоиска.СНачала, ПозицияIDОригинальногоСообщения); - ПозицияЗакрывающегосяТега = СтрНайти(ЗаголовокПисьма.Заголовок, ">", НаправлениеПоиска.СНачала, ПозицияIDОригинальногоСообщения); - - ОригинальныйIDСообщенияMicrosoft = - Сред(ЗаголовокПисьма.Заголовок, ПозицияОткрывающегосяТега + 1, ПозицияЗакрывающегосяТега - ПозицияОткрывающегосяТега -1); - + Начало = СтрНайти(ЗаголовокПисьма.Заголовок, "<", НаправлениеПоиска.СНачала, ПозицияIDОригинальногоСообщения); + Конец = СтрНайти(ЗаголовокПисьма.Заголовок, ">", НаправлениеПоиска.СНачала, ПозицияIDОригинальногоСообщения); + ОригинальныйIDСообщенияMicrosoft = Сред(ЗаголовокПисьма.Заголовок, Начало + 1, Конец - Начало - 1); СтрокаТаблицыИдентификаторов.ИдентификаторОригинальногоПисьмаMicrosoft = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(ОригинальныйIDСообщенияMicrosoft, ""); КонецПроцедуры -Процедура ПолучитьПочтуПоПроколуIMAP(ДанныеУчетнойЗаписи, Почта, Получено, ПолученныеПисьма) +// Параметры: +// ДанныеУчетнойЗаписи - ВыборкаИзРезультатаЗапроса +// Почта - ИнтернетПочта +// ПолученоПисем - Число +// ПолученныеПисьма - см. ПолученныеПисьма +// +Процедура ПолучитьПочтуПоПроколуIMAP(ДанныеУчетнойЗаписи, Почта, ПолученоПисем, ПолученныеПисьма) - МассивИменАктивныхПапок = МассивИменАктивныхПапок(Почта); + ИменаАктивныхПапок = ИменаАктивныхПапок(Почта); КвалификаторСтроки255 = Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(255,ДопустимаяДлина.Переменная)); @@ -1007,7 +996,7 @@ ДатаЗагрузкиПисем = ТекущаяДатаСеанса(); - Для каждого ИмяАктивнойПапки Из МассивИменАктивныхПапок Цикл + Для каждого ИмяАктивнойПапки Из ИменаАктивныхПапок Цикл Попытка Почта.ТекущийПочтовыйЯщик = ИмяАктивнойПапки; @@ -1015,10 +1004,10 @@ Продолжить; КонецПопытки; - ПараметрыОтбора = Новый Структура; - + ПараметрыОтбора = Новый Структура; Если Не ДанныеУчетнойЗаписи.ДатаЗагрузкиПисем = Дата(1,1,1) Тогда - ПараметрыОтбора.Вставить("ПослеДатыОтправления", ДатаОтбораЗагрузкиПисемПоПротоколуIMAP(ДанныеУчетнойЗаписи.ДатаЗагрузкиПисем)); + ПараметрыОтбора.Вставить("ПослеДатыОтправления", + ДатаОтбораЗагрузкиПисемПоПротоколуIMAP(ДанныеУчетнойЗаписи.ДатаЗагрузкиПисем)); Иначе ПараметрыОтбора.Вставить("Удаленные", Ложь); КонецЕсли; @@ -1029,23 +1018,30 @@ Продолжить; КонецПопытки; - МассивЗаголовковСПустымИдентификатором = Новый Массив; + ЗаголовкиСПустымИдентификатором = Новый Массив; ТаблицаИдентификаторов.Очистить(); + ТаблицаПустыхИдентификаторов.Очистить(); + Для Каждого ЗаголовокПисьма Из ЗаголовкиПисемДляЗагрузки Цикл - Если ПустаяСтрока(ЗаголовокПисьма.ИдентификаторСообщения) Тогда - МассивЗаголовковСПустымИдентификатором.Добавить(ЗаголовокПисьма); + ЗаголовкиСПустымИдентификатором.Добавить(ЗаголовокПисьма); Продолжить; КонецЕсли; - ОпределитьИдентификаторыВходящегоСообщения(ЗаголовокПисьма, ТаблицаИдентификаторов); - КонецЦикла; - ПолученоПисемВТекущемПочтовомЯщике = 0; - - Если ТаблицаИдентификаторов.Количество() > 0 Тогда + Если ЗаголовкиСПустымИдентификатором.Количество() > 0 Тогда + Для Каждого ЗаголовокПисьма Из ЗаголовкиСПустымИдентификатором Цикл + НоваяСтрока = ТаблицаПустыхИдентификаторов.Добавить(); + НоваяСтрока.ИдентификаторНаСервере = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML( + ЗаголовокПисьма.Идентификатор[0], ""); + НоваяСтрока.ХешСумма = ХешСуммаПочтовогоСообщения(ЗаголовокПисьма); + КонецЦикла; + КонецЕсли; + + Если ТаблицаИдентификаторов.Количество() > 0 Или ЗаголовкиСПустымИдентификатором.Количество() > 0 Тогда + // АПК:96-выкл Ключевое слово ОБЪЕДИНИТЬ, т.к. двум запросам-условиям может соответствовать письмо с одним и тем же идентификатором. Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ @@ -1059,9 +1055,16 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | ИдентификаторыПисемКЗагрузке.ИдентификаторПисьма КАК ИдентификаторПисьма, - | ИдентификаторыПисемКЗагрузке.ИдентификаторНаСервере КАК ИдентификаторНаСервере, - | ИдентификаторыПисемКЗагрузке.ИдентификаторОригинальногоПисьмаMicrosoft КАК ИдентификаторОригинальногоПисьмаMicrosoft + | ПустыеИдентификаторыПисемКЗагрузке.ХешСумма, + | ПустыеИдентификаторыПисемКЗагрузке.ИдентификаторНаСервере + |ПОМЕСТИТЬ ПустыеИдентификаторыПисемКЗагрузке + |ИЗ + | &ПустыеИдентификаторыПисемКЗагрузке КАК ПустыеИдентификаторыПисемКЗагрузке + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ИдентификаторыПисемКЗагрузке.ИдентификаторНаСервере КАК ИдентификаторНаСервере |ИЗ | ИдентификаторыПисемКЗагрузке КАК ИдентификаторыПисемКЗагрузке | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЭлектронноеПисьмоВходящее КАК ЭлектронноеПисьмоВходящее @@ -1076,47 +1079,14 @@ | И ЭлектронноеПисьмоИсходящее.ИдентификаторСообщения <> """") |ГДЕ | ЭлектронноеПисьмоВходящее.Ссылка ЕСТЬ NULL - | И ЭлектронноеПисьмоИсходящее.Ссылка ЕСТЬ NULL"; - - Запрос.УстановитьПараметр("ИдентификаторыПисемКЗагрузке", ТаблицаИдентификаторов); - Запрос.УстановитьПараметр("УчетнаяЗапись", ДанныеУчетнойЗаписи.Ссылка); - - ИдЗагружать = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ИдентификаторНаСервере"); - - ПолучитьПисьмаПоМассивуИдентификаторов(Почта, - ДанныеУчетнойЗаписи, - ИдЗагружать, - ПолученоПисемВТекущемПочтовомЯщике, - ПолученныеПисьма); - - КонецЕсли; - - Если МассивЗаголовковСПустымИдентификатором.Количество() > 0 Тогда - - ТаблицаПустыхИдентификаторов.Очистить(); - - Для Каждого ЗаголовокПисьма Из МассивЗаголовковСПустымИдентификатором Цикл - НоваяСтрока = ТаблицаПустыхИдентификаторов.Добавить(); - НоваяСтрока.ИдентификаторНаСервере = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(ЗаголовокПисьма.Идентификатор[0], ""); - НоваяСтрока.ХешСумма = ХешСуммаПочтовогоСообщения(ЗаголовокПисьма); - КонецЦикла; - - Запрос = Новый Запрос; - Запрос.Текст = " - |ВЫБРАТЬ - | ИдентификаторыПисемКЗагрузке.ХешСумма, - | ИдентификаторыПисемКЗагрузке.ИдентификаторНаСервере - |ПОМЕСТИТЬ ИдентификаторыПисемКЗагрузке - |ИЗ - | &ИдентификаторыПисемКЗагрузке КАК ИдентификаторыПисемКЗагрузке - |; + | И ЭлектронноеПисьмоИсходящее.Ссылка ЕСТЬ NULL + | + |ОБЪЕДИНИТЬ | - |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | ИдентификаторыПисемКЗагрузке.ХешСумма, | ИдентификаторыПисемКЗагрузке.ИдентификаторНаСервере |ИЗ - | ИдентификаторыПисемКЗагрузке КАК ИдентификаторыПисемКЗагрузке + | ПустыеИдентификаторыПисемКЗагрузке КАК ИдентификаторыПисемКЗагрузке | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЭлектронноеПисьмоВходящее КАК ЭлектронноеПисьмоВходящее | ПО ИдентификаторыПисемКЗагрузке.ХешСумма = ЭлектронноеПисьмоВходящее.ХешСумма | И (ЭлектронноеПисьмоВходящее.УчетнаяЗапись = &УчетнаяЗапись) @@ -1126,29 +1096,25 @@ |ГДЕ | ЭлектронноеПисьмоВходящее.Ссылка ЕСТЬ NULL | И ЭлектронноеПисьмоИсходящее.Ссылка ЕСТЬ NULL"; + // АПК:96-вкл - Запрос.УстановитьПараметр("ИдентификаторыПисемКЗагрузке", ТаблицаПустыхИдентификаторов); + Запрос.УстановитьПараметр("ИдентификаторыПисемКЗагрузке", ТаблицаИдентификаторов); + Запрос.УстановитьПараметр("ПустыеИдентификаторыПисемКЗагрузке", ТаблицаПустыхИдентификаторов); Запрос.УстановитьПараметр("УчетнаяЗапись", ДанныеУчетнойЗаписи.Ссылка); - ИдЗагружать = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ИдентификаторНаСервере"); - - ПолучитьПисьмаПоМассивуИдентификаторов(Почта, - ДанныеУчетнойЗаписи, - ИдЗагружать, - ПолученоПисемВТекущемПочтовомЯщике, - ПолученныеПисьма); - - КонецЕсли; + // @skip-check query-in-loop - Порционная загрузка писем из папок. + ИдентификаторыПисемКЗагрузке = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ИдентификаторНаСервере"); + ПолученоПисем = ПолученоПисем + ПолучитьПисьмаПоИдентификаторам(Почта, ДанныеУчетнойЗаписи, + ИдентификаторыПисемКЗагрузке, ПолученныеПисьма); - Получено = Получено + ПолученоПисемВТекущемПочтовомЯщике; - + КонецЕсли; КонецЦикла; УстановитьДатуПоследнейЗагрузкиПисем(ДанныеУчетнойЗаписи.Ссылка, ДатаЗагрузкиПисем); КонецПроцедуры -Процедура ПолучитьПочтуПоПроколуPOP3(ДанныеУчетнойЗаписи, Почта, Получено, ПолученныеПисьма) +Процедура ПолучитьПочтуПоПроколуPOP3(ДанныеУчетнойЗаписи, Почта, ПолученоПисем, ПолученныеПисьма) // Получим идентификаторы сообщений на сервере. Идентификаторы = Почта.ПолучитьИдентификаторы(); @@ -1159,48 +1125,34 @@ Возврат; КонецЕсли; - // ----------------------------------------------------------------- // Определим какие сообщения нужно получать. - ИдЗагружать = ПолучитьИдентификаторыПисемДляЗагрузки(Идентификаторы, ДанныеУчетнойЗаписи.Ссылка); + ИдентификаторыПисемКЗагрузке = ПолучитьИдентификаторыПисемДляЗагрузки(Идентификаторы, ДанныеУчетнойЗаписи.Ссылка); + ПолученоПисем = ПолученоПисем + ПолучитьПисьмаПоИдентификаторам(Почта, ДанныеУчетнойЗаписи, + ИдентификаторыПисемКЗагрузке, ПолученныеПисьма, Идентификаторы); - ПолученоПоДаннойУчетнойЗаписи = 0; - ПолучитьПисьмаПоМассивуИдентификаторов(Почта, - ДанныеУчетнойЗаписи, - ИдЗагружать, - ПолученоПоДаннойУчетнойЗаписи, - ПолученныеПисьма, - Идентификаторы); - - Получено = Получено + ПолученоПоДаннойУчетнойЗаписи; - - // ----------------------------------------------------------------- // Удалим ненужные сообщения на сервере. - Если Не ДанныеУчетнойЗаписи.ОставлятьКопии Тогда - // удалять все - МассивКУдалению = Идентификаторы; - УдалятьВсе = Истина; + УдалятьВсе = Не ДанныеУчетнойЗаписи.ОставлятьКопии; + Если УдалятьВсе Тогда + УдаляемыеСообщения = Идентификаторы; Иначе - УдалятьВсе = Ложь; Если ДанныеУчетнойЗаписи.ОставлятьДней > 0 Тогда - МассивКУдалению = ПолучитьИдентификаторыПисемДляУдаленияНаСервере( - Идентификаторы, - ДанныеУчетнойЗаписи.Ссылка, - ТекущаяДатаСеанса() - ДанныеУчетнойЗаписи.ОставлятьДней * 24 * 60 * 60); + УдаляемыеСообщения = ПолучитьИдентификаторыПисемДляУдаленияНаСервере(Идентификаторы, + ДанныеУчетнойЗаписи.Ссылка, + ТекущаяДатаСеанса() - ДанныеУчетнойЗаписи.ОставлятьДней * 24 * 60 * 60); Иначе - МассивКУдалению = Новый Массив; + УдаляемыеСообщения = Новый Массив; КонецЕсли; КонецЕсли; - Если МассивКУдалению.Количество() <> 0 Тогда - Почта.УдалитьСообщения(МассивКУдалению); + Если УдаляемыеСообщения.Количество() <> 0 Тогда + Почта.УдалитьСообщения(УдаляемыеСообщения); КонецЕсли; - // ----------------------------------------------------------------- // Удалим ненужные идентификаторы в регистре сведений. Если УдалятьВсе Тогда УдалитьИдентификаторыВсехРанееПолученныхПисем(ДанныеУчетнойЗаписи.Ссылка); Иначе - УдалитьИдентификаторыРанееПолученныхПисем(ДанныеУчетнойЗаписи.Ссылка, Идентификаторы, МассивКУдалению); + УдалитьИдентификаторыРанееПолученныхПисем(ДанныеУчетнойЗаписи.Ссылка, Идентификаторы, УдаляемыеСообщения); КонецЕсли; КонецПроцедуры @@ -1217,15 +1169,6 @@ КонецФункции -Функция СоответствиеПодменяемыхДоменовЭлектроннойПочты() - - СоответствиеДоменов = Новый Соответствие; - СоответствиеДоменов.Вставить("yandex.ru","ya.ru"); - - Возврат СоответствиеДоменов; - -КонецФункции - Функция СтруктураАдресаЭлектроннойПочты(АдресЭлектроннойПочты) МассивАдреса = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(АдресЭлектроннойПочты,"@"); @@ -1243,6 +1186,15 @@ КонецФункции +// Возвращаемое значение: +// Структура: +// * ВсеПолученныеПисьма - Массив из Документы.ЭлектронноеПисьмоВходящее +// - Массив из Документы.ЭлектронноеПисьмоИсходящее +// * ПисьмаДляОпределенияПапок - Массив из Документы.ЭлектронноеПисьмоВходящее +// - Массив из Документы.ЭлектронноеПисьмоИсходящее +// * ПолученныеПисьмаПоУчетнойЗаписи - Массив из Документы.ЭлектронноеПисьмоВходящее +// - Массив из Документы.ЭлектронноеПисьмоИсходящее +// Функция ПолученныеПисьма() Результат = Новый Структура; @@ -1268,7 +1220,7 @@ Возврат; КонецЕсли; - МассивИменАктивныхПапок = МассивИменАктивныхПапок(Почта); + МассивИменАктивныхПапок = ИменаАктивныхПапок(Почта); МассивИдентификаторовНеПрочитанныхПисем = Новый Массив; @@ -1394,7 +1346,7 @@ ОтменитьТранзакцию(); ТекстСообщения = НСтр("ru = 'Не удалось изменить информацию о признаке рассмотрено для писем по причине : %Причина%.'"); - ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Причина%", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Причина%", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, Метаданные.РегистрыСведений.ПредметыПапкиВзаимодействий, @@ -1407,21 +1359,34 @@ Процедура УдалитьИдентификаторыВсехРанееПолученныхПисем(УчетнаяЗапись) - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | ИдентификаторыПолученныхЭлектронныхПисем.Идентификатор - |ИЗ - | РегистрСведений.ИдентификаторыПолученныхЭлектронныхПисем КАК ИдентификаторыПолученныхЭлектронныхПисем - |ГДЕ - | ИдентификаторыПолученныхЭлектронныхПисем.УчетнаяЗапись = &УчетнаяЗапись"; - Запрос.УстановитьПараметр("УчетнаяЗапись", УчетнаяЗапись); - - Если НЕ Запрос.Выполнить().Пустой() Тогда - Набор = РегистрыСведений.ИдентификаторыПолученныхЭлектронныхПисем.СоздатьНаборЗаписей(); - Набор.Отбор.УчетнаяЗапись.Установить(УчетнаяЗапись); - Набор.Записать(); - КонецЕсли; + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных(); + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ИдентификаторыПолученныхЭлектронныхПисем"); + ЭлементБлокировки.УстановитьЗначение("УчетнаяЗапись", УчетнаяЗапись); + Блокировка.Заблокировать(); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИдентификаторыПолученныхЭлектронныхПисем.Идентификатор + |ИЗ + | РегистрСведений.ИдентификаторыПолученныхЭлектронныхПисем КАК ИдентификаторыПолученныхЭлектронныхПисем + |ГДЕ + | ИдентификаторыПолученныхЭлектронныхПисем.УчетнаяЗапись = &УчетнаяЗапись"; + Запрос.УстановитьПараметр("УчетнаяЗапись", УчетнаяЗапись); + + Если НЕ Запрос.Выполнить().Пустой() Тогда + Набор = РегистрыСведений.ИдентификаторыПолученныхЭлектронныхПисем.СоздатьНаборЗаписей(); + Набор.Отбор.УчетнаяЗапись.Установить(УчетнаяЗапись); + Набор.Записать(); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецПроцедуры @@ -1490,7 +1455,7 @@ ОтменитьТранзакцию(); ТекстСообщения = НСтр("ru = 'Не удалось очистить информацию о ранее полученных идентификаторах по причине: %Причина%.'"); - ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Причина%", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Причина%", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, Метаданные.РегистрыСведений.ИдентификаторыПолученныхЭлектронныхПисем, @@ -1576,82 +1541,76 @@ КонецФункции -Функция ЗаписатьЭлектронноеПисьмо(ДанныеУчетнойЗаписи, - Сообщение, - ОтветственныйЗаОбработкуПисем, - ПомещатьПисьмоВПапкуПисьмаОснования, - ДобавлятьВМассивПисемДляПолученияПапки, - ЭтоИсходящееПисьмо); +Функция ЗаписатьЭлектронноеПисьмо(ДанныеУчетнойЗаписи, Сообщение, ОтветственныйЗаОбработкуПисем, + ПомещатьПисьмоВПапкуПисьмаОснования, ДобавлятьВМассивПисемДляПолученияПапки, ЭтоИсходящееПисьмо); // Создадим документ и заполним его реквизиты на основе сообщения. - Если ЭтоИсходящееПисьмо Тогда - Письмо = Документы.ЭлектронноеПисьмоИсходящее.СоздатьДокумент(); - Иначе - Письмо = Документы.ЭлектронноеПисьмоВходящее.СоздатьДокумент(); - КонецЕсли; - - - ЗаполнитьДокументЭлектронноеПисьмо(Письмо, Сообщение, ЭтоИсходящееПисьмо); - Письмо.УчетнаяЗапись = ДанныеУчетнойЗаписи.Ссылка; - - // Найдем основание письма, определим предмет и контакты. - Предмет = Неопределено; - Папка = Неопределено; - - ЗаполнитьПредметИКонтакты(Письмо, - ДанныеУчетнойЗаписи.Ссылка, - Предмет, - Папка, - ЭтоИсходящееПисьмо, - ПомещатьПисьмоВПапкуПисьмаОснования); - - // Заполним ответственного - Письмо.Ответственный = ОтветственныйЗаОбработкуПисем; - - // Запишем письмо - Письмо.Записать(); - - // Установим папку письма и предмет. - Если ДанныеУчетнойЗаписи.ОбработкаПисемВедетсяВДругомПочтовомКлиенте Тогда - ПризнакРассмотрено = Истина; - Иначе - ПризнакРассмотрено = ?(ЭтоИсходящееПисьмо, Истина, Ложь); - КонецЕсли; - - СтруктураДляЗаписи = РегистрыСведений.ПредметыПапкиВзаимодействий.РеквизитыВзаимодействия(); - СтруктураДляЗаписи.Папка = Папка; - СтруктураДляЗаписи.Предмет = ?(ЗначениеЗаполнено(Предмет), Предмет, Письмо.Ссылка); - СтруктураДляЗаписи.Рассмотрено = ПризнакРассмотрено; - СтруктураДляЗаписи.РассчитыватьРассмотрено = Ложь; - РегистрыСведений.ПредметыПапкиВзаимодействий.ЗаписатьПредметыПапкиВзаимодействий(Письмо.Ссылка, СтруктураДляЗаписи); - - МассивИменВложений = Новый Массив; - МассивДублирующихсяИменВложений = Новый Массив; - - // Запишем вложения - Для Каждого Вложение Из Сообщение.Вложения Цикл - Если МассивИменВложений.Найти(Вложение.ИмяФайла) = Неопределено Тогда - МассивИменВложений.Добавить(Вложение.ИмяФайла); - ИначеЕсли МассивДублирующихсяИменВложений.Найти(Вложение.ИмяФайла) = Неопределено Тогда - МассивДублирующихсяИменВложений.Добавить(Вложение.ИмяФайла); + НачатьТранзакцию(); + Попытка + Если ЭтоИсходящееПисьмо Тогда + Письмо = Документы.ЭлектронноеПисьмоИсходящее.СоздатьДокумент(); + Иначе + Письмо = Документы.ЭлектронноеПисьмоВходящее.СоздатьДокумент(); КонецЕсли; + + ЗаполнитьДокументЭлектронноеПисьмо(Письмо, Сообщение, ЭтоИсходящееПисьмо); + Письмо.УчетнаяЗапись = ДанныеУчетнойЗаписи.Ссылка; + ПредметИПапка = ЗаполнитьПредметИКонтакты(Письмо, ДанныеУчетнойЗаписи.Ссылка, ЭтоИсходящееПисьмо, + ПомещатьПисьмоВПапкуПисьмаОснования); + Письмо.Ответственный = ОтветственныйЗаОбработкуПисем; + Письмо.Записать(); + + // Установим папку письма и предмет. + Если ДанныеУчетнойЗаписи.ОбработкаПисемВедетсяВДругомПочтовомКлиенте Тогда + ПризнакРассмотрено = Истина; + Иначе + ПризнакРассмотрено = ?(ЭтоИсходящееПисьмо, Истина, Ложь); + КонецЕсли; + + Реквизиты = РегистрыСведений.ПредметыПапкиВзаимодействий.РеквизитыВзаимодействия(); + Реквизиты.Папка = ПредметИПапка.Папка; + Реквизиты.Предмет = ПредметИПапка.Предмет; + Реквизиты.Рассмотрено = ПризнакРассмотрено; + Реквизиты.РассчитыватьРассмотрено = Ложь; + РегистрыСведений.ПредметыПапкиВзаимодействий.ЗаписатьПредметыПапкиВзаимодействий(Письмо.Ссылка, Реквизиты); + + // Запишем идентификатор + Если Не ДанныеУчетнойЗаписи.ПротоколВходящейПочты = "IMAP" Тогда + ЗаписатьИдентификаторПолученногоПисьма(ДанныеУчетнойЗаписи.Ссылка, Письмо.ИдентификаторНаСервере, + Сообщение.ДатаПолучения); + КонецЕсли; + + Если Не ЭтоИсходящееПисьмо И Письмо.УведомитьОПрочтении Тогда + ЗаписатьНеобходимостьОбработкиУведомленияОПрочтении(Письмо.Ссылка); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + // Запишем вложения вне транзакции записи письма + УникальныеИменаВложений = Новый Соответствие; + Для Каждого Вложение Из Сообщение.Вложения Цикл + УникальныеИменаВложений[Вложение.ИмяФайла] = ?(УникальныеИменаВложений[Вложение.ИмяФайла] = Неопределено, + Истина, Ложь); КонецЦикла; - Для Каждого ДублирующеесяВложение Из МассивДублирующихсяИменВложений Цикл - ИндексВМассиве = МассивИменВложений.Найти(ДублирующеесяВложение); - Если ИндексВМассиве <> Неопределено Тогда - МассивИменВложений.Удалить(ИндексВМассиве); + ИменаВложений = Новый Массив; + Для Каждого Вложение Из Сообщение.Вложения Цикл + Если УникальныеИменаВложений[Вложение.ИмяФайла] = Истина Тогда + ИменаВложений.Добавить(Вложение.ИмяФайла); КонецЕсли; КонецЦикла; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); - СоответствиеВложенийИПодписей = - МодульЭлектроннаяПодписьСлужебный.ИменаФайловПодписейИменФайловДанных(МассивИменВложений); + МодульЭлектроннаяПодписьСлужебный.ИменаФайловПодписейИменФайловДанных(ИменаВложений); Иначе СоответствиеВложенийИПодписей = Новый Соответствие; - Для Каждого ИмяФайлаВложения Из МассивИменВложений Цикл + Для Каждого ИмяФайлаВложения Из ИменаВложений Цикл СоответствиеВложенийИПодписей.Вставить(ИмяФайлаВложения, Новый Массив); КонецЦикла; КонецЕсли; @@ -1678,41 +1637,18 @@ КонецЕсли; Если НайденноеВложение <> Неопределено Тогда - ЗаписатьВложениеЭлектронногоПисьма( - Письмо,НайденноеВложение, - МассивПодписей, - КоличествоПустыхИменВоВложениях); + ЗаписатьВложениеЭлектронногоПисьма(Письмо, НайденноеВложение, МассивПодписей, КоличествоПустыхИменВоВложениях); КонецЕсли; КонецЦикла; - Если МассивДублирующихсяИменВложений.Количество() > 0 Тогда - Для каждого Вложение Из Сообщение.Вложения Цикл - Если МассивДублирующихсяИменВложений.Найти(Вложение.ИмяФайла) <> Неопределено Тогда - ЗаписатьВложениеЭлектронногоПисьма( - Письмо,Вложение, - Новый Массив, - КоличествоПустыхИменВоВложениях); - КонецЕсли; - КонецЦикла; - КонецЕсли; + Для каждого Вложение Из Сообщение.Вложения Цикл + Если УникальныеИменаВложений[Вложение.ИмяФайла] = Ложь Тогда // дублирующиеся имена вложений + ЗаписатьВложениеЭлектронногоПисьма(Письмо, Вложение, Новый Массив, КоличествоПустыхИменВоВложениях); + КонецЕсли; + КонецЦикла; - // Запишем идентификатор - Если Не ДанныеУчетнойЗаписи.ПротоколВходящейПочты = "IMAP" Тогда - - ЗаписатьИдентификаторПолученногоПисьма(ДанныеУчетнойЗаписи.Ссылка, - Письмо.ИдентификаторНаСервере, - Сообщение.ДатаПолучения); - - КонецЕсли; - - Если Не ЭтоИсходящееПисьмо И Письмо.УведомитьОПрочтении Тогда - - ЗаписатьНеобходимостьОбработкиУведомленияОПрочтении(Письмо.Ссылка); - - КонецЕсли; - - Если (НЕ ПомещатьПисьмоВПапкуПисьмаОснования) ИЛИ (НЕ ЗначениеЗаполнено(Папка)) Тогда + Если (Не ПомещатьПисьмоВПапкуПисьмаОснования) ИЛИ Не ЗначениеЗаполнено(ПредметИПапка.Папка) Тогда ДобавлятьВМассивПисемДляПолученияПапки = Истина; КонецЕсли; @@ -1734,26 +1670,23 @@ ОтправительАдрес = АдресОтправителяИнтернетПочтовогоСообщения(Сообщение.Отправитель); Если Не ЭтоИсходящееПисьмо Тогда - Письмо.ДатаПолучения = Сообщение.ДатаПолучения; Письмо.ОтправительАдрес = ОтправительАдрес; - Иначе - Письмо.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Отправлено; Письмо.ДатаОтправления = Сообщение.ДатаОтправления; - КонецЕсли; ИмяОтправителя = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(Сообщение.ИмяОтправителя, ""); Письмо.ОтправительПредставление = ?(ПустаяСтрока(Сообщение.ИмяОтправителя), - ОтправительАдрес, - ИмяОтправителя + " <"+ ОтправительАдрес +">"); + ОтправительАдрес, + ИмяОтправителя + " <"+ ОтправительАдрес +">"); Письмо.Важность = ПолучитьВажностьЭлектронногоПисьма(Сообщение.Важность); Письмо.Дата = ?(Сообщение.ДатаОтправления = Дата(1,1,1), ТекущаяДатаСеанса(), Сообщение.ДатаОтправления); Письмо.ВнутреннийЗаголовок = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(Сообщение.Заголовок, ""); - Письмо.ИдентификаторНаСервере = ?(Сообщение.Идентификатор.Количество() = 0, "", ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(Сообщение.Идентификатор[0], "")); + Письмо.ИдентификаторНаСервере = ?(Сообщение.Идентификатор.Количество() = 0, "", + ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(Сообщение.Идентификатор[0], "")); Письмо.ИдентификаторСообщения = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(Сообщение.ИдентификаторСообщения, ""); Письмо.Кодировка = Сообщение.Кодировка; Письмо.УведомитьОДоставке = Сообщение.УведомитьОДоставке; @@ -1763,17 +1696,17 @@ Письмо.Тема = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(Сообщение.Тема); УстановитьТекстПисьма(Письмо, Сообщение); + + РаботаСПочтовымиСообщениямиСлужебный.ДекодироватьАдресаВПисьме(Сообщение); - ЗаполнитьИнтернетПочтовыеАдреса(Письмо.ПолучателиКопий , Сообщение.Копии); + ЗаполнитьИнтернетПочтовыеАдреса(Письмо.ПолучателиКопий, Сообщение.Копии); ЗаполнитьИнтернетПочтовыеАдреса(Письмо.ПолучателиОтвета, Сообщение.ОбратныйАдрес); ЗаполнитьИнтернетПочтовыеАдреса(Письмо.ПолучателиПисьма, Сообщение.Получатели); Если ЭтоИсходящееПисьмо Тогда - ЗаполнитьИнтернетПочтовыеАдреса(Письмо.ПолучателиСкрытыхКопий, - Сообщение.СлепыеКопии); + ЗаполнитьИнтернетПочтовыеАдреса(Письмо.ПолучателиСкрытыхКопий, Сообщение.СлепыеКопии); Иначе - ЗаполнитьИнтернетПочтовыеАдреса(Письмо.АдресаУведомленияОПрочтении, - Сообщение.АдресаУведомленияОПрочтении); + ЗаполнитьИнтернетПочтовыеАдреса(Письмо.АдресаУведомленияОПрочтении, Сообщение.АдресаУведомленияОПрочтении); КонецЕсли; Письмо.ИдентификаторОснования = ИзПисьмаПолучитьИдентификаторОснования(Сообщение); @@ -1798,14 +1731,10 @@ КонецФункции -Процедура ЗаполнитьПредметИКонтакты(Письмо, - УчетнаяЗапись, - Предмет, - Папка, - ЭтоИсходящееПисьмо, - ПомещатьПисьмоВПапкуПисьмаОснования) +Функция ЗаполнитьПредметИКонтакты(Письмо, УчетнаяЗапись, ЭтоИсходящееПисьмо, ПомещатьПисьмоВПапкуПисьмаОснования) + + Результат = Новый Структура("Предмет,Папка", Письмо.Ссылка, Неопределено); - // ----------------------------------------------------------------- // Получим идентификаторы писем оснований. МассивИдентификаторов = Новый Массив; СтрокаИдентификаторы = Письмо.ИдентификаторыОснований; @@ -1841,7 +1770,6 @@ ТаблицаИдентификаторов = СоздатьТаблицуСИдентификаторами(МассивИдентификаторов); - // ----------------------------------------------------------------- // Получим все основания Запрос = Новый Запрос; Запрос.Текст = @@ -1926,35 +1854,26 @@ Запрос.УстановитьПараметр("УчетнаяЗапись", УчетнаяЗапись); Запрос.УстановитьПараметр("ИдентификаторСообщения", Письмо.ИдентификаторСообщения); - Результат = Запрос.Выполнить(); - Если Не Результат.Пустой() Тогда + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда - Выборка = Результат.Выбрать(); - Выборка.Следующий(); - Предмет = Выборка.Предмет; + Результат.Предмет = Выборка.Предмет; Если Выборка.Приоритет = 0 Тогда Письмо.ВзаимодействиеОснование = Выборка.Ссылка; Если ПомещатьПисьмоВПапкуПисьмаОснования И Не Выборка.ПредопределеннаяПапка Тогда - Папка = Выборка.Папка; + Результат.Папка = Выборка.Папка; КонецЕсли; КонецЕсли; КонецЕсли; - Если Предмет = Неопределено Тогда - Предмет = Письмо.Ссылка; - КонецЕсли; - - // ----------------------------------------------------------------- // Получим проставленные контакты в предмете. СоответствиеКонтактов = СоответствиеКонтактовВПисьме(Письмо.ВзаимодействиеОснование); - // ----------------------------------------------------------------- // Проставим контакты на основании предмета. НеопределенныеАдреса = Новый Массив; УстановитьКонтактыВПисьме(Письмо, СоответствиеКонтактов, НеопределенныеАдреса, ЭтоИсходящееПисьмо); - // ----------------------------------------------------------------- // Если есть неопределенные адреса, то поищем их по контактной информации. СоответствиеКонтактов = НайтиАдресаЭлектроннойПочтыВКонтактнойИнформации(НеопределенныеАдреса); Если СоответствиеКонтактов.Количество() > 0 Тогда @@ -1963,12 +1882,13 @@ Письмо.СписокПолучателейПисьма = ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Письмо.ПолучателиПисьма, Ложь); Письмо.СписокПолучателейКопий = ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Письмо.ПолучателиКопий, Ложь); - Если ТипЗнч(Письмо) = Тип("ДокументОбъект.ЭлектронноеПисьмоИсходящее") Тогда - Письмо.СписокПолучателейКопий = ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Письмо.ПолучателиКопий, Ложь); + Письмо.СписокПолучателейСкрытыхКопий = ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Письмо.ПолучателиКопий, Ложь); КонецЕсли; -КонецПроцедуры + Возврат Результат; + +КонецФункции Функция НайтиАдресаЭлектроннойПочтыВКонтактнойИнформации(МассивАдресов) @@ -2250,9 +2170,13 @@ Процедура ИзменитьДоменВПочтовомАдресеЕслиНеобходимо(ПочтовыйАдрес) СтруктураАдреса = СтруктураАдресаЭлектроннойПочты(ПочтовыйАдрес); - Если СтруктураАдреса <> Неопределено Тогда - СоответствиеПодменяемыхДоменов = СоответствиеПодменяемыхДоменовЭлектроннойПочты(); - ДоменНаКоторыйНеобходимоЗаменить = СоответствиеПодменяемыхДоменов.Получить(СтруктураАдреса.Домен); + Если СтруктураАдреса = Неопределено Тогда + Возврат; + КонецЕсли; + Если Метаданные.ОбщиеМодули.Найти("ВзаимодействияЛокализация") <> Неопределено Тогда + МодульВзаимодействияЛокализация = ОбщегоНазначения.ОбщийМодуль("ВзаимодействияЛокализация"); + СинонимыДоменовЭлектроннойПочты = МодульВзаимодействияЛокализация.СинонимыДоменовЭлектроннойПочты(); + ДоменНаКоторыйНеобходимоЗаменить = СинонимыДоменовЭлектроннойПочты[СтруктураАдреса.Домен]; Если ДоменНаКоторыйНеобходимоЗаменить <> Неопределено Тогда ПочтовыйАдрес = СтруктураАдреса.ИмяПочтовогоЯщика + "@" + ДоменНаКоторыйНеобходимоЗаменить; КонецЕсли; @@ -2260,9 +2184,9 @@ КонецПроцедуры -Функция МассивИменАктивныхПапок(Почта) +Функция ИменаАктивныхПапок(Почта) - МассивИменАктивныхПапок = Новый Массив; + Результат = Новый Массив; ИменаАктивныхПапок = Почта.ПолучитьПочтовыеЯщикиПоПодписке(); Если ИменаАктивныхПапок.Количество() = 0 Тогда @@ -2273,10 +2197,10 @@ Попытка Разделитель = Почта.СимволРазделитель; Исключение - // Некоторые почтовые сервера не поддерживают эту команду. + // АПК:280 Некоторые почтовые сервера не поддерживают эту команду. КонецПопытки; - МассивИгнорируемыхИмен = МассивИменПапокДляКоторыхНеВыполняетсяЗагрузкаПисем(); + МассивИгнорируемыхИмен = ИменаПапокНеДляЗагрузкиПисем(); Для Каждого ИмяАктивнойПапки Из ИменаАктивныхПапок Цикл @@ -2310,29 +2234,29 @@ КонецЕсли; - МассивИменАктивныхПапок.Добавить(ИмяАктивнойПапки); + Результат.Добавить(ИмяАктивнойПапки); КонецЦикла; - Возврат МассивИменАктивныхПапок; + Возврат Результат; КонецФункции -Функция МассивИменПапокДляКоторыхНеВыполняетсяЗагрузкаПисем() +Функция ИменаПапокНеДляЗагрузкиПисем() - МассивИмен = Новый Массив; - МассивИмен.Добавить("спам"); - МассивИмен.Добавить("удаленные"); - МассивИмен.Добавить("черновики"); - МассивИмен.Добавить("корзина"); - МассивИмен.Добавить("spam"); - МассивИмен.Добавить("trash"); - МассивИмен.Добавить("drafts"); - МассивИмен.Добавить("draftBox"); - МассивИмен.Добавить("deleted"); - МассивИмен.Добавить("junk"); - МассивИмен.Добавить("bulk mail"); - Возврат МассивИмен; + Результат = Новый Массив; + Результат.Добавить("спам"); + Результат.Добавить("удаленные"); + Результат.Добавить("черновики"); + Результат.Добавить("корзина"); + Результат.Добавить("spam"); + Результат.Добавить("trash"); + Результат.Добавить("drafts"); + Результат.Добавить("draftBox"); + Результат.Добавить("deleted"); + Результат.Добавить("junk"); + Результат.Добавить("bulk mail"); + Возврат Результат; КонецФункции @@ -2471,7 +2395,7 @@ ОтменитьТранзакцию(); ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не установить письмо основание у %1 по причине %2'"), - Выборка.Письмо, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Выборка.Письмо, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, МетаданныеДокумента, Выборка.Письмо, ТекстСообщения); КонецПопытки; @@ -2551,11 +2475,29 @@ ПараметрыВложения.Вставить("ПодписанЭП", Истина); КонецЕсли; + Если СтрЗаканчиваетсяНа(ИмяФайла, ".p7m") Тогда + + Зашифрован = Истина; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодписьСлужебныйКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебныйКлиентСервер"); + ТипДанных = МодульЭлектроннаяПодписьСлужебныйКлиентСервер.ОпределитьТипДанных(ДанныеВложения); + Если ТипДанных <> "ЗашифрованныеДанные" Тогда + Зашифрован = Ложь; + КонецЕсли; + КонецЕсли; + + Если Зашифрован Тогда + ПараметрыВложения.Вставить("Зашифрован", Зашифрован); + ПараметрыВложения.Вставить("ИмяФайла", Лев(ИмяФайла, СтрДлина(ИмяФайла) - 4)); + КонецЕсли; + + КонецЕсли; + ВложениеПисьмаСсылка = ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища( ПисьмоСсылка, Адрес, ПараметрыВложения, КоличествоПустыхИменВоВложениях); - + Если ЕстьПодписи Тогда - + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); Для Каждого ПодписьВложения Из МассивПодписей Цикл @@ -2575,7 +2517,7 @@ РаботаСФайлами.ДобавитьПодписьКФайлу(ВложениеПисьмаСсылка, ДанныеПодписи); КонецЦикла; - + КонецЕсли; УдалитьИзВременногоХранилища(Адрес); @@ -2697,8 +2639,8 @@ КоличествоПустыхИменВоВложениях = 0) Экспорт ИмяФайлаДляРазбора = ПараметрыВложения.ИмяФайла; - РасширениеБезТочки = ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ИмяФайлаДляРазбора); ИмяБезРасширения = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайлаДляРазбора); + РасширениеБезТочки = ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ИмяБезРасширения); Если ПустаяСтрока(ИмяБезРасширения) Тогда @@ -2723,6 +2665,9 @@ Если ПараметрыВложения.Свойство("ПодписанЭП") Тогда ДополнительныеПараметры.Добавить("ПодписанЭП"); КонецЕсли; + Если ПараметрыВложения.Свойство("Зашифрован") Тогда + ДополнительныеПараметры.Добавить("Зашифрован"); + КонецЕсли; ПараметрыФайла = РаботаСФайлами.ПараметрыДобавленияФайла(ДополнительныеПараметры); ПараметрыФайла.ВладелецФайлов = Письмо; @@ -2739,6 +2684,9 @@ Если ПараметрыВложения.Свойство("ПодписанЭП") Тогда ПараметрыФайла.ПодписанЭП = ПараметрыВложения.ПодписанЭП; КонецЕсли; + Если ПараметрыВложения.Свойство("Зашифрован") Тогда + ПараметрыФайла.Зашифрован = ПараметрыВложения.Зашифрован; + КонецЕсли; Возврат РаботаСФайлами.ДобавитьФайл( ПараметрыФайла, diff --git a/SSL/src/CommonModules/УправлениеЭлектроннойПочтойКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеЭлектроннойПочтойКлиент/Module.bsl index 5fc652fa8..380157f2f 100644 --- a/SSL/src/CommonModules/УправлениеЭлектроннойПочтойКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеЭлектроннойПочтойКлиент/Module.bsl @@ -141,9 +141,9 @@ Заголовок = НСтр("ru = 'Отправка и получение почты'"); РезультатВыполнения = ПолучитьИзВременногоХранилища(Результат.АдресРезультата); Если РезультатВыполнения.ЕстьОшибки Тогда - ПоказатьОповещениеПользователя(Заголовок, ДополнительныеПараметры.НавигационнаяСсылка, + ПоказатьОповещениеПользователя(Заголовок, "e1cib/app/Обработка.ЖурналРегистрации", НСтр("ru = 'Не удалось выполнить все действия. Технические подробности для администратора в журнале регистрации.'"), - БиблиотекаКартинок.Ошибка32, СтатусОповещенияПользователя.Важное); + БиблиотекаКартинок.Предупреждение, СтатусОповещенияПользователя.Важное); Иначе ПоказатьОповещениеПользователя(Заголовок, ДополнительныеПараметры.НавигационнаяСсылка, РезультатОтправкиПолученияПисем(РезультатВыполнения)); diff --git a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументов/Module.bsl b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументов/Module.bsl index d8753c0fe..c4a6e2fd0 100644 --- a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументов/Module.bsl +++ b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументов/Module.bsl @@ -398,8 +398,7 @@ КонецЦикла; -// Добавляет кнопку для перехода к настройкам состояний в подменю командой панели списка "Установить состояние", если у -// польз. есть соответствующая роль + // Добавляет кнопку для перехода к настройкам состояний в подменю командой панели списка "Установить состояние". Если ПравоДоступа("Добавление",Метаданные.Справочники.СостоянияОригиналовПервичныхДокументов) И ПравоДоступа("Изменение",Метаданные.Справочники.СостоянияОригиналовПервичныхДокументов) Тогда ИмяКоманды = "НастройкаСостояний"; @@ -671,8 +670,8 @@ Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда Изменено = Истина; - ТЧ = ТабличнаяЧастьМногосотрудниковаДокумента(Запись.Ссылка); - Если ТЧ <> "" Тогда + ТабличнаяЧасть = ТабличнаяЧастьССотрудниками(Запись.Ссылка); + Если ТабличнаяЧасть <> "" Тогда РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Ссылка, ПрошлаяЗапись.ПервичныйДокумент,ПрошлаяЗапись.ПервичныйДокументПредставление,ИмяСостояния,ПрошлаяЗапись.ФормаИзвне,ПрошлаяЗапись.Сотрудник); Иначе @@ -691,21 +690,15 @@ Если ПроверкаЗаписьСостоянияОригинала.Количество()> 0 Тогда ПроверкаЗаписьСостоянияОригинала.Отбор.ПервичныйДокумент.Установить(Запись.ПервичныйДокумент); ПроверкаЗаписьСостоянияОригинала.Прочитать(); - ТЧ = ТабличнаяЧастьМногосотрудниковаДокумента(Запись.Ссылка); - Если ТЧ <> "" Тогда - Для Каждого Сотрудник Из Запись.Ссылка[ТЧ] Цикл + ТабличнаяЧасть = ТабличнаяЧастьССотрудниками(Запись.Ссылка); + Если ТабличнаяЧасть <> "" Тогда + Для Каждого Сотрудник Из Запись.Ссылка[ТабличнаяЧасть] Цикл Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда Изменено = Истина; РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Ссылка, Запись.ПервичныйДокумент,Запись.ПервичныйДокументПредставление,ИмяСостояния,Запись.Извне,Сотрудник.Сотрудник); - Если СостояниеПечатныхФормОдинаково(Запись.Ссылка,ИмяСостояния) Тогда - Изменено = Истина; РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,ИмяСостояния); - Иначе - Изменено = Истина; - РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналыНеВсе); - КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; @@ -715,13 +708,7 @@ Изменено = Истина; РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Ссылка, Запись.ПервичныйДокумент,Запись.ПервичныйДокументПредставление,ИмяСостояния,Запись.Извне); - Если СостояниеПечатныхФормОдинаково(Запись.Ссылка,ИмяСостояния) Тогда - Изменено = Истина; - РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,ИмяСостояния); - Иначе - Изменено = Истина; - РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналыНеВсе); - КонецЕсли; + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,ИмяСостояния); КонецЕсли; КонецЦикла; КонецЕсли; @@ -757,7 +744,7 @@ ПроверкаЗаписьСостоянияОригинала.Прочитать(); Если ПроверкаЗаписьСостоянияОригинала.Количество()>0 Тогда - ТЧ = ТабличнаяЧастьМногосотрудниковаДокумента(ДанныеЗаписи.Ссылка); + ТЧ = ТабличнаяЧастьССотрудниками(ДанныеЗаписи.Ссылка); Если ТЧ <> "" Тогда Для Каждого Сотрудник Из ДанныеЗаписи.Ссылка[ТЧ] Цикл ПроверкаЗаписьСостоянияОригинала.Отбор.Сотрудник.Установить(Сотрудник.Сотрудник); @@ -896,41 +883,34 @@ // Функция ЭтоОбъектУчета(ДокументСсылка) Экспорт - ДоступныеТипы = Метаданные.ОпределяемыеТипы.ОбъектСУчетомОригиналовПервичныхДокументов.Тип.Типы(); - Для Каждого Тип Из ДоступныеТипы Цикл - ТипДокумента = Метаданные.НайтиПоТипу(Тип); - ТипПоСсылке = ОбщегоНазначения.ИмяТаблицыПоСсылке(ДокументСсылка); - ТипПоСсылке = Метаданные.НайтиПоПолномуИмени(ТипПоСсылке); - Если ТипДокумента = ТипПоСсылке Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; + Если ДокументСсылка = Неопределено Тогда + Возврат Ложь; + КонецЕсли; - Возврат Ложь; + Возврат Метаданные.ОпределяемыеТипы.ОбъектСУчетомОригиналовПервичныхДокументов.Тип.СодержитТип(ТипЗнч(ДокументСсылка)); КонецФункции -// Проверяет является ли документ по ссылке многосотрудниковым документом и возвращает наименование табличной части, в -// которой хранятся сотрудники. +// Проверяет, хранятся ли в документе сведения о сотрудниках и возвращает наименование соответствующей табличной части. // // Параметры: // ДокументСсылка - ДокументСсылка - ссылка на документ, который необходимо проверить. // // Возвращаемое значение: // Строка - наименование табличной части документа, в которой хранятся сотрудники. Пустая, если это не -// многосотрудниковый документ. +// документ с несколькими сотрудниками. // -Функция ТабличнаяЧастьМногосотрудниковаДокумента(ДокументСсылка) Экспорт +Функция ТабличнаяЧастьССотрудниками(ДокументСсылка) Экспорт СписокОбъектов = Новый Соответствие(); - ТЧ=""; + Результат = ""; УчетОригиналовПервичныхДокументовПереопределяемый.ПриОпределенииМногосотрудниковыхДокументов(СписокОбъектов); ТипДокумента = ОбщегоНазначения.ИмяТаблицыПоСсылке(ДокументСсылка); Если СписокОбъектов[ТипДокумента] <> Неопределено Тогда - ТЧ = СписокОбъектов[ТипДокумента]; + Результат = СписокОбъектов[ТипДокумента]; КонецЕсли; - Возврат ТЧ; + Возврат Результат; КонецФункции @@ -999,12 +979,11 @@ ШтрихкодВШестнадцатеричномВиде = "0" + ШтрихкодВШестнадцатеричномВиде; КонецЦикла; - Идентификатор = - Сред(ШтрихкодВШестнадцатеричномВиде, 1, 8) - + "-" + Сред(ШтрихкодВШестнадцатеричномВиде, 9, 4) - + "-" + Сред(ШтрихкодВШестнадцатеричномВиде, 13, 4) - + "-" + Сред(ШтрихкодВШестнадцатеричномВиде, 17, 4) - + "-" + Сред(ШтрихкодВШестнадцатеричномВиде, 21, 12); + Идентификатор = Сред(ШтрихкодВШестнадцатеричномВиде, 1, 8) + + "-" + Сред(ШтрихкодВШестнадцатеричномВиде, 9, 4) + + "-" + Сред(ШтрихкодВШестнадцатеричномВиде, 13, 4) + + "-" + Сред(ШтрихкодВШестнадцатеричномВиде, 17, 4) + + "-" + Сред(ШтрихкодВШестнадцатеричномВиде, 21, 12); Если СтрДлина(Идентификатор) <> 36 Тогда Возврат Новый Массив; @@ -1037,8 +1016,7 @@ Иначе ТекстИсключения = НСтр("ru = 'Ошибка распознавания штрихкода: тип ""%Тип%"" не поддерживается.'"); - ТекстИсключения = СтрЗаменить(ТекстИсключения,"%Тип%",ТипСсылки); - + ТекстИсключения = СтрЗаменить(ТекстИсключения, "%Тип%", ТипСсылки); ВызватьИсключение ТекстИсключения; КонецЕсли; diff --git a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовКлиент/Module.bsl b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовКлиент/Module.bsl index 18f400f9b..70fd6b8d2 100644 --- a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовКлиент/Module.bsl +++ b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовКлиент/Module.bsl @@ -111,10 +111,11 @@ ТекстВопроса = СтрЗаменить(ТекстВопроса, "%ИмяСостояния%", ИмяСостояния); Кнопки = Новый СписокЗначений; - Кнопки.Добавить(КодВозвратаДиалога.Да,НСтр("ru='Установить'")); - Кнопки.Добавить(КодВозвратаДиалога.Нет,НСтр("ru='Не устанавливать'")); + Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru='Установить'")); + Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru='Не устанавливать'")); - ПоказатьВопрос(Новый ОписаниеОповещения("УстановитьСостояниеОригиналаЗавершение", ЭтотОбъект, ДополнительныеПараметры), ТекстВопроса, Кнопки); + ПоказатьВопрос(Новый ОписаниеОповещения("УстановитьСостояниеОригиналаЗавершение", ЭтотОбъект, ДополнительныеПараметры), + ТекстВопроса, Кнопки); ИначеЕсли УчетОригиналовПервичныхДокументовВызовСервера.ЭтоОбъектУчета(Список.ТекущиеДанные.Ссылка) Тогда УстановитьСостояниеОригиналаЗавершение(КодВозвратаДиалога.Да, ДополнительныеПараметры); Иначе @@ -129,73 +130,74 @@ // Форма - ФормаКлиентскогоПриложения: // * Объект - ДанныеФормыСтруктура, ДокументОбъект - основной реквизит формы. // Источник - ТаблицаФормы - список или декорация формы, у которого будет открыт выпадающий список. +// Если не задан, то элемент с именем "ДекорацияСостояниеОригинала". // -Процедура ОткрытьМенюВыбораСостояния(Форма, Источник) Экспорт +Процедура ОткрытьМенюВыбораСостояния(Знач Форма, Знач Источник = Неопределено) Экспорт Если Не УчетОригиналовПервичныхДокументовВызовСервера.ПраваНаИзменениеСостояния() Тогда ПоказатьПредупреждение(, НСтр("ru = 'У пользователя недостаточно прав на изменение состояния оригинала первичного документа'")); Возврат; КонецЕсли; + Если ТипЗнч(Источник) = Неопределено Тогда + Источник = Форма.Элементы.Найти("ДекорацияСостояниеОригинала"); + КонецЕсли; + Если ТипЗнч(Источник) = Тип("ТаблицаФормы") Тогда + ДанныеЗаписи = Источник.ТекущиеДанные; - - МассивСсылок = Новый Массив; - МассивСсылок.Добавить(ДанныеЗаписи.Ссылка); - - НепроведенныеДокументы = ОбщегоНазначенияВызовСервера.ПроверитьПроведенностьДокументов(МассивСсылок); - + НепроведенныеДокументы = ОбщегоНазначенияВызовСервера.ПроверитьПроведенностьДокументов( + ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ДанныеЗаписи.Ссылка)); Если НепроведенныеДокументы.Количество() = 1 Тогда ПоказатьПредупреждение(,НСтр("ru = 'Для выполнения команды предварительно проведите документ.'")); Возврат; - Иначе - МассивЗаписей = Новый Массив; - МассивЗаписей.Добавить(ДанныеЗаписи); - - ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьМенюВыбораСостоянияЗавершение", ЭтотОбъект, МассивЗаписей); + КонецЕсли; + + МассивЗаписей = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ДанныеЗаписи); + ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьМенюВыбораСостоянияЗавершение", ЭтотОбъект, МассивЗаписей); - Если ДанныеЗаписи.ОбщееСостояние Или Не ЗначениеЗаполнено(ДанныеЗаписи.СостояниеОригиналаПервичногоДокумента) Тогда - УточнитьПоПечатнымФормам = Форма.СписокВыбораСостоянийОригинала.НайтиПоЗначению("Уточнитьпопечатнымформам"); - Если УточнитьПоПечатнымФормам = Неопределено Тогда - Форма.СписокВыбораСостоянийОригинала.Добавить("Уточнитьпопечатнымформам",НСтр("ru = 'Уточнить по печатным формам...'"),,БиблиотекаКартинок.УточнитьСостояниеОригиналаПервичногоДокументаПоПечатнымФормам); - КонецЕсли; - Форма.ПоказатьВыборИзМеню(ОписаниеОповещения,Форма.СписокВыбораСостоянийОригинала,Форма.Элементы.СостояниеОригиналаПервичногоДокумента); - Иначе - УточнитьПоПечатнымФормам = Форма.СписокВыбораСостоянийОригинала.НайтиПоЗначению("Уточнитьпопечатнымформам"); - Если УточнитьПоПечатнымФормам <> Неопределено Тогда - Форма.СписокВыбораСостоянийОригинала.Удалить(УточнитьПоПечатнымФормам); - КонецЕсли; - Форма.ПоказатьВыборИзМеню(ОписаниеОповещения,Форма.СписокВыбораСостоянийОригинала,Форма.Элементы.СостояниеОригиналаПервичногоДокумента); + Если ДанныеЗаписи.ОбщееСостояние Или Не ЗначениеЗаполнено(ДанныеЗаписи.СостояниеОригиналаПервичногоДокумента) Тогда + УточнитьПоПечатнымФормам = Форма.СписокВыбораСостоянийОригинала.НайтиПоЗначению("УточнитьПоПечатнымФормам"); + Если УточнитьПоПечатнымФормам = Неопределено Тогда + Форма.СписокВыбораСостоянийОригинала.Добавить("УточнитьПоПечатнымФормам", + НСтр("ru = 'Уточнить по печатным формам...'"),, + БиблиотекаКартинок.УточнитьСостояниеОригиналаПервичногоДокументаПоПечатнымФормам); КонецЕсли; - + Форма.ПоказатьВыборИзМеню(ОписаниеОповещения, Форма.СписокВыбораСостоянийОригинала, + Форма.Элементы.СостояниеОригиналаПервичногоДокумента); + Иначе + УточнитьПоПечатнымФормам = Форма.СписокВыбораСостоянийОригинала.НайтиПоЗначению("УточнитьПоПечатнымФормам"); + Если УточнитьПоПечатнымФормам <> Неопределено Тогда + Форма.СписокВыбораСостоянийОригинала.Удалить(УточнитьПоПечатнымФормам); + КонецЕсли; + Форма.ПоказатьВыборИзМеню(ОписаниеОповещения, Форма.СписокВыбораСостоянийОригинала, + Форма.Элементы.СостояниеОригиналаПервичногоДокумента); КонецЕсли; Иначе Если Форма.Объект.Ссылка.Пустая() Тогда ПоказатьПредупреждение(,НСтр("ru = 'Для выполнения команды предварительно проведите документ.'")); Возврат; - Иначе - МассивСсылок = Новый Массив; - МассивСсылок.Добавить(Форма.Объект.Ссылка); - - НепроведенныеДокументы = ОбщегоНазначенияВызовСервера.ПроверитьПроведенностьДокументов(МассивСсылок); - - Если НепроведенныеДокументы.Количество() = 1 Тогда - ПоказатьПредупреждение(,НСтр("ru = 'Для выполнения команды предварительно проведите документ.'")); - Возврат; - Иначе - ДополнительныеПараметры = Новый Структура("Ссылка", Форма.Объект.Ссылка); - - ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьМенюВыбораСостоянияЗавершение", ЭтотОбъект, ДополнительныеПараметры); - - УточнитьПоПечатнымФормам = Форма.СписокВыбораСостоянийОригинала.НайтиПоЗначению("Уточнитьпопечатнымформам"); - - Если УточнитьПоПечатнымФормам = Неопределено Тогда - Форма.СписокВыбораСостоянийОригинала.Добавить("Уточнитьпопечатнымформам",НСтр("ru = 'Уточнить по печатным формам...'"),,БиблиотекаКартинок.УточнитьСостояниеОригиналаПервичногоДокументаПоПечатнымФормам); - КонецЕсли; - - Форма.ПоказатьВыборИзМеню(ОписаниеОповещения, Форма.СписокВыбораСостоянийОригинала, Источник); - КонецЕсли; КонецЕсли; + НепроведенныеДокументы = ОбщегоНазначенияВызовСервера.ПроверитьПроведенностьДокументов( + ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Форма.Объект.Ссылка)); + + Если НепроведенныеДокументы.Количество() = 1 Тогда + ПоказатьПредупреждение(,НСтр("ru = 'Для выполнения команды предварительно проведите документ.'")); + Возврат; + КонецЕсли; + + ДополнительныеПараметры = Новый Структура("Ссылка", Форма.Объект.Ссылка); + ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьМенюВыбораСостоянияЗавершение", ЭтотОбъект, + ДополнительныеПараметры); + + УточнитьПоПечатнымФормам = Форма.СписокВыбораСостоянийОригинала.НайтиПоЗначению("УточнитьПоПечатнымФормам"); + Если УточнитьПоПечатнымФормам = Неопределено Тогда + Форма.СписокВыбораСостоянийОригинала.Добавить("УточнитьПоПечатнымФормам", + НСтр("ru = 'Уточнить по печатным формам...'"),, + БиблиотекаКартинок.УточнитьСостояниеОригиналаПервичногоДокументаПоПечатнымФормам); + КонецЕсли; + + Форма.ПоказатьВыборИзМеню(ОписаниеОповещения, Форма.СписокВыбораСостоянийОригинала, Источник); КонецЕсли; КонецПроцедуры @@ -388,67 +390,67 @@ // Процедура СформироватьНадписьТекущегоСостоянияОригинала(Форма) - Если Не Форма.Элементы.Найти("ДекорацияСостояниеОригинала") = Неопределено Тогда - Если ЗначениеЗаполнено(Форма.Объект.Ссылка) Тогда - ТекущиеСостояниеОригинала = УчетОригиналовПервичныхДокументовВызовСервера.СведенияОСостоянииОригиналаПоСсылке(Форма.Объект.Ссылка); - Если ТекущиеСостояниеОригинала.Количество() = 0 Тогда - ТекущиеСостояниеОригинала=НСтр("ru='<Состояние оригинала неизвестно>'"); - Форма.Элементы.ДекорацияСостояниеОригинала.ЦветТекста = WebЦвета.Серебряный; - Иначе - ТекущиеСостояниеОригинала = ТекущиеСостояниеОригинала.СостояниеОригиналаПервичногоДокумента; - Форма.Элементы.ДекорацияСостояниеОригинала.ЦветТекста = Новый Цвет(); - КонецЕсли; - Иначе - Форма.Элементы.ДекорацияСостояниеОригинала.ЦветТекста = WebЦвета.Серебряный; - КонецЕсли; - - Форма.Элементы.ДекорацияСостояниеОригинала.Заголовок = ТекущиеСостояниеОригинала; + ДекорацияСостояниеОригинала = Форма.Элементы.Найти("ДекорацияСостояниеОригинала"); + Если ДекорацияСостояниеОригинала = Неопределено Тогда + Возврат; КонецЕсли; + + Если ЗначениеЗаполнено(Форма.Объект.Ссылка) Тогда + ТекущиеСостояниеОригинала = УчетОригиналовПервичныхДокументовВызовСервера.СведенияОСостоянииОригиналаПоСсылке(Форма.Объект.Ссылка); + Если ТекущиеСостояниеОригинала.Количество() = 0 Тогда + ТекущиеСостояниеОригинала=НСтр("ru='<Состояние оригинала неизвестно>'"); + ДекорацияСостояниеОригинала.ЦветТекста = WebЦвета.Серебряный; + Иначе + ТекущиеСостояниеОригинала = ТекущиеСостояниеОригинала.СостояниеОригиналаПервичногоДокумента; + ДекорацияСостояниеОригинала.ЦветТекста = Новый Цвет; + КонецЕсли; + Иначе + ДекорацияСостояниеОригинала.ЦветТекста = WebЦвета.Серебряный; + КонецЕсли; + + ДекорацияСостояниеОригинала.Заголовок = ТекущиеСостояниеОригинала; КонецПроцедуры // Обработчик оповещения, вызванного после завершения работы процедуры УстановитьСостояниеОригинала(...). Процедура УстановитьСостояниеОригиналаЗавершение(Ответ, ДополнительныеПараметры) Экспорт - Если Ответ = КодВозвратаДиалога.Да Тогда - Список = ДополнительныеПараметры.Список; - ИмяСостояния = ДополнительныеПараметры.ИмяСостояния; - - Если Список.ВыделенныеСтроки.Количество() = 0 Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Не выделено ни одного документа, для которого можно установить выбранное состояние'")); - Возврат; - Иначе - МассивСтрок = Новый Массив; - Для Каждого СтрокаСписка Из Список.ВыделенныеСтроки Цикл - ДанныеСтроки = Список.ДанныеСтроки(СтрокаСписка); - МассивСтрок.Добавить(ДанныеСтроки); - КонецЦикла; - КонецЕсли; - - ОбъектыЗаписи = УчетОригиналовПервичныхДокументовВызовСервера.ВозможностьЗаписиОбъектов(МассивСтрок); // Массив из ДокументСсылка- - - Если Не ТипЗнч(ОбъектыЗаписи)= Тип("Массив") Тогда - ПоказатьПредупреждение(,НСтр("ru = 'Для выполнения команды предварительно проведите все выделенные документы.'")); - Возврат; - Иначе - Изменено = Ложь; - - УчетОригиналовПервичныхДокументовВызовСервера.УстановитьНовоеСостояниеОригинала(ОбъектыЗаписи,ИмяСостояния,Изменено); - - Если ОбъектыЗаписи.Количество() = 1 И Изменено Тогда - ОповеститьПользователяОбУстановкеСостояний(1,ОбъектыЗаписи[0].Ссылка); - ИначеЕсли Изменено Тогда - ОповеститьПользователяОбУстановкеСостояний(ОбъектыЗаписи.Количество(),,ИмяСостояния); - КонецЕсли; - - Если Изменено Тогда - Оповестить("ИзменениеСостоянияОригиналаПервичногоДокумента"); - КонецЕсли; - КонецЕсли; - - Иначе + Если Ответ <> КодВозвратаДиалога.Да Тогда Возврат; КонецЕсли; + + Список = ДополнительныеПараметры.Список; + ИмяСостояния = ДополнительныеПараметры.ИмяСостояния; + + Если Список.ВыделенныеСтроки.Количество() = 0 Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Не выделено ни одного документа, для которого можно установить выбранное состояние.'")); + Возврат; + КонецЕсли; + + МассивСтрок = Новый Массив; + Для Каждого СтрокаСписка Из Список.ВыделенныеСтроки Цикл + ДанныеСтроки = Список.ДанныеСтроки(СтрокаСписка); + МассивСтрок.Добавить(ДанныеСтроки); + КонецЦикла; + + ОбъектыЗаписи = УчетОригиналовПервичныхДокументовВызовСервера.ВозможностьЗаписиОбъектов(МассивСтрок); // Массив из ДокументСсылка- + Если Не ТипЗнч(ОбъектыЗаписи) = Тип("Массив") Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Для выполнения команды предварительно проведите все выделенные документы.'")); + Возврат; + КонецЕсли; + + Изменено = Ложь; + УчетОригиналовПервичныхДокументовВызовСервера.УстановитьНовоеСостояниеОригинала(ОбъектыЗаписи, ИмяСостояния, Изменено); + + Если ОбъектыЗаписи.Количество() = 1 И Изменено Тогда + ОповеститьПользователяОбУстановкеСостояний(1,ОбъектыЗаписи[0].Ссылка); + ИначеЕсли Изменено Тогда + ОповеститьПользователяОбУстановкеСостояний(ОбъектыЗаписи.Количество(),,ИмяСостояния); + КонецЕсли; + + Если Изменено Тогда + Оповестить("ИзменениеСостоянияОригиналаПервичногоДокумента"); + КонецЕсли; КонецПроцедуры @@ -486,7 +488,7 @@ Изменено = Ложь; - Если ВыбранноеСостояниеИзСписка.Значение = "Уточнитьпопечатнымформам" Тогда + Если ВыбранноеСостояниеИзСписка.Значение = "УточнитьПоПечатнымФормам" Тогда ОткрытьФормуИзмененияСостоянийПечатныхФорм(ДополнительныеПараметры[0].Ссылка); Иначе УчетОригиналовПервичныхДокументовВызовСервера.УстановитьНовоеСостояниеОригинала(ДополнительныеПараметры,ВыбранноеСостояниеИзСписка.Значение, Изменено); @@ -509,7 +511,7 @@ Изменено = Ложь; - Если ВыбранноеСостояниеИзСписка.Значение = "Уточнитьпопечатнымформам" Тогда + Если ВыбранноеСостояниеИзСписка.Значение = "УточнитьПоПечатнымФормам" Тогда ОткрытьФормуИзмененияСостоянийПечатныхФорм(ДополнительныеПараметры.Ссылка); Иначе УчетОригиналовПервичныхДокументовВызовСервера.УстановитьНовоеСостояниеОригинала(ДополнительныеПараметры.Ссылка,ВыбранноеСостояниеИзСписка.Значение, Изменено); diff --git a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовПереопределяемый/Module.bsl b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовПереопределяемый/Module.bsl index d79ea523c..fcffc6b80 100644 --- a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовПереопределяемый/Module.bsl @@ -19,7 +19,7 @@ КонецПроцедуры -// Определяет многосотрудниковые объекты конфигурации, для которых отслеживание состояний будет в разрезе сотрудников +// Определяет объекты конфигурации, для которых отслеживание состояний будет в разрезе сотрудников. // // Параметры: // СписокОбъектов - Соответствие из КлючИЗначение: diff --git a/SSL/src/CommonModules/ФайловаяСистема/Module.bsl b/SSL/src/CommonModules/ФайловаяСистема/Module.bsl index f27878abc..4596d1653 100644 --- a/SSL/src/CommonModules/ФайловаяСистема/Module.bsl +++ b/SSL/src/CommonModules/ФайловаяСистема/Module.bsl @@ -284,28 +284,29 @@ #КонецОбласти -#КонецОбласти - -#Область СлужебныйПрограммныйИнтерфейс - -// Функция возвращает путь к общему каталогу временных файлов. +// Возвращает путь к общему сетевому каталогу временных файлов. // +// Для корректной работы программы в клиент-серверном варианте временные файлы +// следует размещать в общем сетевом каталоге, одинаково доступном с любого сервера в кластере. +// Это обеспечит доступ со всех серверов кластера к временному файлу, например, +// для его обработки в фоновых заданиях, работающих параллельно // Путь к каталогу определяется в общих настройках администрирования. -// Использование этого пути при работе конфигурации с использованием кластера серверов обеспечивает гарантированное -// общее место хранения файлов. // Если путь не заполнен или информационная база развернута в файловом варианте, то каталог // создается во временном каталоге пользователя. // Следует удалять временные файлы в каталоге самостоятельно после их использования, // т.к. при активном создании файлов временные файлы могут занять значительную часть дискового пространства. // +// Параметры: +// ВложенныйКаталог - Строка - если указан, то внутри общего сетевого каталога будет создан подчиненный каталог. +// // Возвращаемое значение: // Строка - путь к каталогу временных файлов. // -Функция КаталогОбщегоВременногоХранилищаФайлов(ПодКаталог = Неопределено) Экспорт +Функция ОбщийКаталогВременныхФайлов(ВложенныйКаталог = Неопределено) Экспорт Если ОбщегоНазначения.ИнформационнаяБазаФайловая() И НЕ ОбщегоНазначения.РежимОтладки() Тогда - Результат = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла(ПодКаталог)); + Результат = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла(ВложенныйКаталог)); СоздатьКаталог(Результат); Возврат Результат; @@ -331,7 +332,7 @@ Если ПустаяСтрока(Результат) Тогда - Результат = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла(ПодКаталог)); + Результат = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла(ВложенныйКаталог)); СоздатьКаталог(Результат); Иначе @@ -355,8 +356,8 @@ КонецЕсли; - Если ПодКаталог <> Неопределено Тогда - Результат = Результат + ПолучитьРазделительПутиСервера() + ПодКаталог; + Если ВложенныйКаталог <> Неопределено Тогда + Результат = Результат + ПолучитьРазделительПутиСервера() + ВложенныйКаталог; СоздатьКаталог(Результат); КонецЕсли; @@ -382,7 +383,7 @@ НСтр("ru = 'Не удалось удалить временный файл ""%1"" по причине: |%2'"), Путь, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; КонецПроцедуры diff --git a/SSL/src/CommonModules/ФайловаяСистемаКлиент/Module.bsl b/SSL/src/CommonModules/ФайловаяСистемаКлиент/Module.bsl index 4634952e1..43620b224 100644 --- a/SSL/src/CommonModules/ФайловаяСистемаКлиент/Module.bsl +++ b/SSL/src/CommonModules/ФайловаяСистемаКлиент/Module.bsl @@ -19,7 +19,7 @@ // Параметры: // ОбработчикЗавершения - ОписаниеОповещения - содержит описание процедуры, которая будет вызвана после // загрузки файла со следующими параметрами: -// * ПомещенныйФайл - Неопределено - пользователь отказался от выбора. +// * ПомещенныйФайл - Неопределено - пользователь отказался от выбора или файл занят другой программой. // - Структура - пользователь выбрал файл: // ** Хранение - Строка - расположение данных во временном хранилище. // ** Имя - Строка - в тонком клиенте и в веб-клиенте с установленным @@ -76,7 +76,7 @@ // Параметры: // ОбработчикЗавершения - ОписаниеОповещения - содержит описание процедуры, которая будет вызвана после // загрузки файлов со следующими параметрами: -// * ПомещенныеФайлы - Неопределено - пользователь отказался от выбора. +// * ПомещенныеФайлы - Неопределено - пользователь отказался от выбора или файл занят другой программой. // - Массив - содержит объекты типа Структура. Пользователь выбрал файл: // ** Хранение - Строка - расположение данных во временном хранилище. // ** Имя - Строка - в тонком клиенте и в веб-клиенте с установленным @@ -649,6 +649,35 @@ КонецПроцедуры +// Выполняет печать файла внешним приложением. +// +// Параметры: +// ИмяОткрываемогоФайла - Строка +// +Процедура НапечататьИзПриложенияПоИмениФайла(ИмяОткрываемогоФайла) Экспорт + + Если Не ЗначениеЗаполнено(ИмяОткрываемогоФайла) Тогда + Возврат; + КонецЕсли; + +#Если Не МобильныйКлиент Тогда + Если ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда + Shell = Новый COMОбъект("Shell.Application"); + Shell.ShellExecute(ИмяОткрываемогоФайла, "", "", "print", 1); + ИначеЕсли ОбщегоНазначенияКлиент.ЭтоLinuxКлиент() Тогда + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ИмяОткрываемогоФайла", ИмяОткрываемогоФайла); + ОписаниеОповещения = Новый ОписаниеОповещения("НапечататьИзПриложенияПоИмениФайлаLinux", + ЭтотОбъект, ДополнительныеПараметры); + ПроверитьПрограммаLinuxУстановлена("Unoconv", ОписаниеОповещения); + Иначе + ПоказатьПредупреждение(, НСтр("ru = 'Печать файлов данного типа возможна только из приложения для Windows или Linux.'")); + Возврат; + КонецЕсли; +#КонецЕсли + +КонецПроцедуры + #КонецОбласти #Область Прочее @@ -904,4 +933,207 @@ КонецПроцедуры +Процедура ПроверитьПрограммаLinuxУстановлена(ИмяПрограммы, Оповещение) + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("Оповещение", Оповещение); + ПрограммаLinuxУстановленаЗавершение = Новый ОписаниеОповещения("ПроверитьПрограммаLinuxУстановленаЗавершение", + ЭтотОбъект, ДополнительныеПараметры); + + ПараметрыЗапускаПрограммы = ПараметрыЗапускаПрограммы(); + ПараметрыЗапускаПрограммы.Вставить("ДождатьсяЗавершения", Истина); + ПараметрыЗапускаПрограммы.Вставить("ПолучитьПотокВывода", Истина); + ПараметрыЗапускаПрограммы.Вставить("ПолучитьПотокОшибок", Истина); + ПараметрыЗапускаПрограммы.Вставить("Оповещение", ПрограммаLinuxУстановленаЗавершение); + + ЗапуститьПрограмму(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + "dpkg -s '%1'", Строка(ИмяПрограммы)), ПараметрыЗапускаПрограммы); + +КонецПроцедуры + +Процедура ПроверитьПрограммаLinuxУстановленаЗавершение(Результат, Параметры) Экспорт + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + РезультатПроцедуры = СтрНайти(Результат.ПотокВывода, "Status: install ok installed") <> Ложь; + ВыполнитьОбработкуОповещения(Параметры.Оповещение, РезультатПроцедуры); + +КонецПроцедуры + +Процедура НапечататьИзПриложенияПоИмениФайлаLinux(Результат, Параметры) Экспорт + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Результат = Ложь Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Требуется установка программы ""Unoconv"" в системе'")); + Возврат; + КонецЕсли; + + ОписаниеОповещения = Новый ОписаниеОповещения("НапечататьИзПриложенияПоИмениФайлаLinuxЗапускUnoconv", + ЭтотОбъект, Параметры); + ПолучитьПолноеИмяВременногоФайла(ОписаниеОповещения); + +КонецПроцедуры + +Процедура НапечататьИзПриложенияПоИмениФайлаLinuxЗапускUnoconv(ИмяВременногоФайла, Параметры) Экспорт + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ФайлКонвертируемыхДанных", ИмяВременногоФайла); + + ОписаниеОповещения = Новый ОписаниеОповещения("НапечататьИзПриложенияПоИмениФайлаLinuxЗапускLpr", + ЭтотОбъект, ДополнительныеПараметры); + + ПараметрыЗапускаПрограммы = ПараметрыЗапускаПрограммы(); + ПараметрыЗапускаПрограммы.Вставить("ДождатьсяЗавершения", Истина); + ПараметрыЗапускаПрограммы.Вставить("ПолучитьПотокОшибок", Истина); + ПараметрыЗапускаПрограммы.Вставить("Оповещение", ОписаниеОповещения); + + СтрокаКоманды = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("unoconv --stdout '%1' >""%2""", + Параметры.ИмяОткрываемогоФайла, ИмяВременногоФайла); + ЗапуститьПрограмму(СтрокаКоманды, ПараметрыЗапускаПрограммы); + +КонецПроцедуры + +Процедура НапечататьИзПриложенияПоИмениФайлаLinuxЗапускLpr(Результат, Параметры) Экспорт + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Не Результат.ПриложениеЗапущено Тогда + ПоказатьПредупреждение(, Результат.ОписаниеОшибки); + Иначе + + Параметры.Вставить("ОписаниеОшибки", Результат.ОписаниеОшибки); + + ОписаниеОповещения = Новый ОписаниеОповещения("НапечататьИзПриложенияПоИмениФайлаLinuxЗавершение", ЭтотОбъект, Параметры); + ПараметрыЗапускаПрограммы = ПараметрыЗапускаПрограммы(); + ПараметрыЗапускаПрограммы.Вставить("ДождатьсяЗавершения", Истина); + ПараметрыЗапускаПрограммы.Вставить("ПолучитьПотокОшибок", Истина); + ПараметрыЗапускаПрограммы.Вставить("Оповещение", ОписаниеОповещения); + + ЗапуститьПрограмму( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("lpr %1", Параметры.ФайлКонвертируемыхДанных), + ПараметрыЗапускаПрограммы); + + КонецЕсли; + +КонецПроцедуры + +Процедура НапечататьИзПриложенияПоИмениФайлаLinuxЗавершение(Результат, Параметры) Экспорт + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Файл = Новый Файл(Параметры.ФайлКонвертируемыхДанных); + Если Файл.Существует() Тогда// АПК:566 Выполняется только для Linux + УдалитьФайлы(Параметры.ФайлКонвертируемыхДанных);// АПК:566 Выполняется только для Linux + КонецЕсли; + + Если Не Результат.ПриложениеЗапущено Или ЗначениеЗаполнено(Результат.ОписаниеОшибки) Или ЗначениеЗаполнено(Результат.ПотокОшибок) Тогда + ПоказатьПредупреждение(, ?(ЗначениеЗаполнено(Результат.ОписаниеОшибки),Результат.ОписаниеОшибки + Символы.ПС, "") + Результат.ПотокОшибок); + КонецЕсли; + +КонецПроцедуры + +#Область ПолучитьПолноеИмяВременногоФайла + +// Получение имени временного файла. +// +// Параметры: +// Оповещение - ОписаниеОповещения - оповещение о результате получения со следующими параметрами. +// -- ИмяВременногоФайла - Строка - путь к временному файлу. +// -- ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения. +// Расширение - Строка - расширение временного файла. +// +Процедура ПолучитьПолноеИмяВременногоФайла(Знач Оповещение, Расширение = "") + + Контекст = Новый Структура; + Контекст.Вставить("Оповещение", Оповещение); + Контекст.Вставить("Расширение", Расширение); + + Оповещение = Новый ОписаниеОповещения("ПолучитьИмяВременногоФайлаПослеПроверкиРасширенияРаботыСФайлами", + ЭтотОбъект, Контекст); + ПодключитьРасширениеДляРаботыСФайлами(Оповещение, + НСтр("ru = 'Для получения имени временного файла установите расширение для работы с 1С:Предприятием.'"), Ложь); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьПолноеИмяВременногоФайла. +// +// Параметры: +// РасширениеПодключено - Булево +// Контекст - Структура: +// * Оповещение - ОписаниеОповещения +// * Расширение - Строка +// +Процедура ПолучитьИмяВременногоФайлаПослеПроверкиРасширенияРаботыСФайлами(РасширениеПодключено, Контекст) Экспорт + + Если РасширениеПодключено Тогда +#Если ВебКлиент Тогда + Оповещение = Новый ОписаниеОповещения( + "ПолучитьИмяВременногоФайлаПослеПолученияВременногоКаталога", ЭтотОбъект, Контекст, + "ПолучитьИмяВременногоФайлаПриОбработкеОшибки", ЭтотОбъект); + НачатьПолучениеКаталогаВременныхФайлов(Оповещение); +#Иначе + ПолучитьИмяВременногоФайлаПослеПолученияВременногоКаталога("", Контекст); +#КонецЕсли + Иначе + ПолучитьИмяВременногоФайлаОповеститьОбОшибке(НСтр("ru = 'Не удалось установить расширение для работы с 1С:Предприятием.'"), Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПолучитьПолноеИмяВременногоФайла. +// +// Параметры: +// ИмяКаталогаВременныхФайлов - Строка +// Контекст - Структура: +// * Оповещение - ОписаниеОповещения +// * Расширение - Строка +// +Процедура ПолучитьИмяВременногоФайлаПослеПолученияВременногоКаталога(ИмяКаталогаВременныхФайлов, Контекст) Экспорт + + Оповещение = Контекст.Оповещение; + Расширение = Контекст.Расширение; + +#Если ВебКлиент Тогда + ИмяВременногоФайла = ИмяКаталогаВременныхФайлов + Строка(Новый УникальныйИдентификатор); +#Иначе + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение); // АПК:441 Функция для получения имени временного файла. +#КонецЕсли + + Если Не ПустаяСтрока(Расширение) Тогда + ИмяВременногоФайла = ИмяВременногоФайла + "." + Расширение; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Оповещение, ИмяВременногоФайла); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьПолноеИмяВременногоФайла. +Процедура ПолучитьИмяВременногоФайлаПриОбработкеОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт + + СтандартнаяОбработка = Ложь; + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПолучитьИмяВременногоФайлаОповеститьОбОшибке(ОписаниеОшибки, Контекст); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьПолноеИмяВременногоФайла. +Процедура ПолучитьИмяВременногоФайлаОповеститьОбОшибке(ОписаниеОшибки, Контекст) + + ПоказатьПредупреждение(, ОписаниеОшибки); + ИмяВременногоФайла = ""; + ВыполнитьОбработкуОповещения(Контекст.Оповещение, ИмяВременногоФайла); + +КонецПроцедуры + +#КонецОбласти + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ФайловаяСистемаСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ФайловаяСистемаСлужебныйКлиент/Module.bsl index 18820c547..a4b1fcad2 100644 --- a/SSL/src/CommonModules/ФайловаяСистемаСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ФайловаяСистемаСлужебныйКлиент/Module.bsl @@ -13,6 +13,57 @@ // Продолжение процедуры ФайловаяСистемаКлиент.ПоказатьПомещениеФайла. Процедура ПоказатьПомещениеФайлаПриПодключенииРасширенияРаботыСФайлами(РасширениеПодключено, Контекст) Экспорт + Интерактивно = Контекст.Интерактивно; + + Если Не РасширениеПодключено + И Не Интерактивно Тогда + ВызватьИсключение НСтр("ru = 'Невозможно загрузить файл без установленного расширения работы с файлами.'"); + КонецЕсли; + + Попытка + НачатьОбработкуПомещениеФайлов(Контекст); + Исключение + Диалог = Контекст.Диалог; // ДиалогВыбораФайла - + Интерактивно = Контекст.Интерактивно; + ОбработчикЗавершения = Контекст.ОбработчикЗавершения; + + ПараметрыОбработкиРезультата = Новый Структура; + ПараметрыОбработкиРезультата.Вставить("МножественныйВыбор", Диалог.МножественныйВыбор); + ПараметрыОбработкиРезультата.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); + + ОписаниеОповещения = Новый ОписаниеОповещения( + "ПослеПредупрежденияОНедоступностиФайла", ЭтотОбъект, ПараметрыОбработкиРезультата); + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОписаниеОшибки = ИнформацияОбОшибке.Причина.Описание; + Если СтрНайти(ОписаниеОшибки, "32(0x00000020)") Тогда + ПоказатьПредупреждение(ОписаниеОповещения, НСтр("ru = 'Завершите работу с файлом в другом приложении.'"), , НСтр("ru = 'Файл открыт в другом приложении'")); + Иначе + ВызватьИсключение ОписаниеОшибки; + КонецЕсли; + + КонецПопытки; + +КонецПроцедуры + +// После предупреждения о недоступности файла. +// +// Параметры: +// ПараметрыОбработкиРезультата - Структура: +// * МножественныйВыбор - Булево +// * ОбработчикЗавершения - ОписаниеОповещения +// +Процедура ПослеПредупрежденияОНедоступностиФайла(ПараметрыОбработкиРезультата) Экспорт + + Если ПараметрыОбработкиРезультата.МножественныйВыбор Тогда + ОбработатьРезультатПомещенияФайлов(Неопределено, ПараметрыОбработкиРезультата); + Иначе + ОбработатьРезультатПомещенияФайла(Ложь, Неопределено, Неопределено, ПараметрыОбработкиРезультата); + КонецЕсли; + +КонецПроцедуры + +Процедура НачатьОбработкуПомещениеФайлов(Контекст) + Диалог = Контекст.Диалог; // ДиалогВыбораФайла - Интерактивно = Контекст.Интерактивно; ЗагружаемыеФайлы = Контекст.ЗагружаемыеФайлы; @@ -22,12 +73,7 @@ ПараметрыОбработкиРезультата = Новый Структура; ПараметрыОбработкиРезультата.Вставить("МножественныйВыбор", Диалог.МножественныйВыбор); ПараметрыОбработкиРезультата.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); - - Если Не РасширениеПодключено - И Не Интерактивно Тогда - ВызватьИсключение НСтр("ru = 'Невозможно загрузить файл без установленного расширения работы с файлами.'"); - КонецЕсли; - + Если Диалог.МножественныйВыбор Тогда ПомещаемыеФайлы = ?(Интерактивно, Диалог, ЗагружаемыеФайлы); @@ -47,7 +93,7 @@ ПомещаемыйФайл = ?(Интерактивно, Диалог, ЗагружаемыеФайлы.Имя); ОписаниеОповещения = Новый ОписаниеОповещения( "ОбработатьРезультатПомещенияФайла", ЭтотОбъект, ПараметрыОбработкиРезультата); - + Если ЗначениеЗаполнено(ИдентификаторФормы) Тогда НачатьПомещениеФайла(ОписаниеОповещения, ЗагружаемыеФайлы.Хранение, ПомещаемыйФайл, Интерактивно, ИдентификаторФормы, Контекст.ДействиеПередНачаломПомещенияФайлов); @@ -57,7 +103,6 @@ КонецЕсли; КонецЕсли; - КонецПроцедуры // Завершение помещения файлов. @@ -804,7 +849,7 @@ КонецЕсли; Если Контекст.ДождатьсяЗавершения И КодВозврата = Неопределено Тогда - ОписаниеОшибки = НСтр("ru = 'Произошла неизвестная ошибка при запуске программы.'"); + ОписаниеОшибки = НСтр("ru = 'Возникла непредвиденная ситуация при запуске программы.'"); ЗапуститьПрограммуОповеститьОбОшибке(ОписаниеОшибки, Контекст); Возврат; КонецЕсли; @@ -823,7 +868,7 @@ Процедура ЗапуститьПрограммуПриОбработкеОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); ЗапуститьПрограммуОповеститьОбОшибке(ОписаниеОшибки, Контекст); КонецПроцедуры @@ -1082,8 +1127,7 @@ Возврат; КонецЕсли; - // В веб клиенте под macOS расширение доступно только в браузере Chrome - // при версии платформы больше 8.3.16. + // В веб клиенте под macOS расширение доступно только в браузере Chrome. Если ОбщегоНазначенияКлиент.ЭтоMacOSКлиент() И НЕ ДоступноРасширениеРаботыСФайлами() Тогда ВыполнитьОбработкуОповещения(Контекст.ОписаниеОповещенияЗавершение); @@ -1148,8 +1192,7 @@ Функция ДоступноРасширениеРаботыСФайлами() СистемнаяИнформация = Новый СистемнаяИнформация; - Возврат ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения,"8.3.16.0") - И СтрНайти(СистемнаяИнформация.ИнформацияПрограммыПросмотра, "Chrome") > 0; + Возврат СтрНайти(СистемнаяИнформация.ИнформацияПрограммыПросмотра, "Chrome") > 0; КонецФункции @@ -1207,7 +1250,7 @@ Процедура СоздатьВременныйКаталогПриОбработкеОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); СоздатьВременныйКаталогОповеститьОбОшибке(ОписаниеОшибки, Контекст); КонецПроцедуры diff --git a/SSL/src/CommonModules/ЦентрМониторингаКлиент/Module.bsl b/SSL/src/CommonModules/ЦентрМониторингаКлиент/Module.bsl index d3aca4eae..3032b443a 100644 --- a/SSL/src/CommonModules/ЦентрМониторингаКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЦентрМониторингаКлиент/Module.bsl @@ -100,6 +100,20 @@ #КонецОбласти +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ПоказатьНастройкиЦентраМониторинга(ФормаВладелец, ПараметрыФормы) Экспорт + ОткрытьФорму("Обработка.НастройкиЦентраМониторинга.Форма.НастройкиЦентраМониторинга", + ПараметрыФормы, ФормаВладелец,,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); +КонецПроцедуры + +Процедура ПоказатьНастройкуОтправкиКонтактнойИнформации(ФормаВладелец) Экспорт + ОткрытьФорму("Обработка.НастройкиЦентраМониторинга.Форма.ОтправкаКонтактнойИнформации",, + ФормаВладелец,,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); +КонецПроцедуры + +#КонецОбласти + #Область СлужебныеПроцедурыИФункции Процедура ЗаписатьОперациюБизнесСтатистикиСлужебная(ПараметрыЗаписи) @@ -134,7 +148,7 @@ КонецПроцедуры -Функция РегистрироватьБизнесСтатистику() +Функция РегистрироватьБизнесСтатистику() ИмяПараметра = "СтандартныеПодсистемы.ЦентрМониторинга"; diff --git a/SSL/src/CommonModules/ЦентрМониторингаСлужебный/Module.bsl b/SSL/src/CommonModules/ЦентрМониторингаСлужебный/Module.bsl index 8364b90e5..3a894e2ea 100644 --- a/SSL/src/CommonModules/ЦентрМониторингаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ЦентрМониторингаСлужебный/Module.bsl @@ -453,7 +453,7 @@ Попытка РегистрацияДампов(); Исключение - Комментарий = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Комментарий = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга.Регистрация дампов'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, Комментарий); УстановитьПараметрЦентраМониторинга("РегистрироватьДампы", Ложь); @@ -470,7 +470,7 @@ Попытка РегистрацияОперацийСтатистики(); Исключение - Комментарий = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Комментарий = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга.Регистрация операций статистики'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, Комментарий); ЦентрМониторинга.ЗаписатьОперациюБизнесСтатистики("ЦентрМониторинга.РегистрацияОперацийСтатистики.Ошибка", 1, Комментарий); @@ -487,7 +487,7 @@ Попытка СобратьСтатистикуКонфигурации(Новый Структура("РегистрироватьСтатистикуКонфигурации, РегистрироватьНастройкуКонфигурации", ПараметрыЦентраМониторинга.РегистрироватьСтатистикуКонфигурации, ПараметрыЦентраМониторинга.РегистрироватьНастройкуКонфигурации)); Исключение - Комментарий = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Комментарий = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга.Собрать статистику конфигурации'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, Комментарий); ЦентрМониторинга.ЗаписатьОперациюБизнесСтатистики("ЦентрМониторинга.СобратьСтатистикуКонфигурации.Ошибка", 1, Комментарий); @@ -504,7 +504,7 @@ Попытка СформироватьПакетДляОтправки(); Исключение - Комментарий = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Комментарий = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга.Сформировать пакет для отправки'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, Комментарий); ЦентрМониторинга.ЗаписатьОперациюБизнесСтатистики("ЦентрМониторинга.СформироватьПакетДляОтправки.Ошибка", 1, Комментарий); @@ -516,7 +516,7 @@ // Все хорошо. КонецЕсли; Исключение - Комментарий = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Комментарий = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга.Отправить данные мониторинга'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, Комментарий); ЦентрМониторинга.ЗаписатьОперациюБизнесСтатистики("ЦентрМониторинга.ОтправитьДанныеМониторинга.Ошибка", @@ -624,7 +624,7 @@ ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Ошибка = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииРазобратьБуферОперацийСтатистики(), УровеньЖурналаРегистрации.Ошибка, Метаданные.РегистрыСведений.БуферОперацийСтатистики,, Ошибка); ВызватьИсключение; @@ -671,7 +671,7 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга.Агрегировать замеры операций статистики'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; КонецЕсли; @@ -725,7 +725,7 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга.Удалить устаревшие данные операций статистики'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -960,13 +960,17 @@ ПараметрыЦентраМониторинга.Вставить("РегистрироватьНастройкуКонфигурации"); ПараметрыЦентраМониторинга.Вставить("РегистрироватьПроизводительность"); ПараметрыЦентраМониторинга.Вставить("РегистрироватьПроизводительностьТехнологическую"); + ПараметрыЦентраМониторинга.Вставить("СтатистикаКонфигурацииСледующаяОтправка"); + ПараметрыЦентраМониторинга.Вставить("СтатистикаКонфигурацииПериодОтправки"); ПараметрыЦентраМониторинга = ПолучитьПараметрыЦентраМониторинга(ПараметрыЦентраМониторинга); + ОтправлятьСтатистикуКонфигурации = Параметры.ДатаЗапуска >= ПараметрыЦентраМониторинга.СтатистикаКонфигурацииСледующаяОтправка; + Если ПараметрыЦентраМониторинга.РегистрироватьИнформациюОСистеме Тогда Инфо = ПолучитьСистемнуюИнформацию(); КонецЕсли; - Если ПараметрыЦентраМониторинга.РегистрироватьВерсииПодсистем Тогда + Если ПараметрыЦентраМониторинга.РегистрироватьВерсииПодсистем И ОтправлятьСтатистикуКонфигурации Тогда Подсистемы = ВерсииПодсистем(); КонецЕсли; @@ -1048,7 +1052,7 @@ РазделениеПоОбластямДанныхВключено = РазделениеПоОбластямДанныхВключено(); #Область СекцияStatisticsConfiguration - Если ПараметрыЦентраМониторинга.РегистрироватьСтатистикуКонфигурации Тогда + Если ПараметрыЦентраМониторинга.РегистрироватьСтатистикуКонфигурации И ОтправлятьСтатистикуКонфигурации Тогда Если РазделениеПоОбластямДанныхВключено Тогда РезультатЗапросаИмена = РегистрыСведений.СтатистикаКонфигурации.ПолучитьИменаСтатистики(0); ТаблицаЗначенийИмена = РезультатЗапросаИмена.Выгрузить(); @@ -1109,7 +1113,7 @@ #КонецОбласти #Область СекцияOptions - Если ПараметрыЦентраМониторинга.РегистрироватьНастройкуКонфигурации Тогда + Если ПараметрыЦентраМониторинга.РегистрироватьНастройкуКонфигурации И ОтправлятьСтатистикуКонфигурации Тогда Если РазделениеПоОбластямДанныхВключено Тогда РезультатЗапросаИмена = РегистрыСведений.СтатистикаКонфигурации.ПолучитьИменаСтатистики(1); ТаблицаЗначенийИмена = РезультатЗапросаИмена.Выгрузить(); @@ -1203,25 +1207,25 @@ ИдентификаторИнформационнойБазы = Строка(ПараметрыЦентраМониторинга.ИдентификаторИнформационнойБазы); ИдентификаторИнформационнойБазыПостоянный = Строка(ПараметрыЦентраМониторинга.ИдентификаторИнформационнойБазыПостоянный); JSONСтруктура = Новый Структура; - JSONСтруктура.Вставить("ib", ИдентификаторИнформационнойБазы); - JSONСтруктура.Вставить("ibConst", ИдентификаторИнформационнойБазыПостоянный); - JSONСтруктура.Вставить("versionPacket", "1.0.5.0"); + JSONСтруктура.Вставить("id", ИдентификаторИнформационнойБазы); + JSONСтруктура.Вставить("idConst", ИдентификаторИнформационнойБазыПостоянный); + JSONСтруктура.Вставить("versionPacket", "1.0.10.0"); JSONСтруктура.Вставить("datePacket", ТекущаяУниверсальнаяДата()); Если ПараметрыЦентраМониторинга.РегистрироватьИнформациюОСистеме Тогда JSONСтруктура.Вставить("info", Инфо); КонецЕсли; - Если ПараметрыЦентраМониторинга.РегистрироватьВерсииПодсистем Тогда + Если ПараметрыЦентраМониторинга.РегистрироватьВерсииПодсистем И ОтправлятьСтатистикуКонфигурации Тогда JSONСтруктура.Вставить("versions", Подсистемы); КонецЕсли; Если ПараметрыЦентраМониторинга.РегистрироватьДампы Тогда JSONСтруктура.Вставить("dumps", СекцияDUMPS["dumps"]); ДанныеОПолныхДампах = Новый Структура; - ДанныеОПолныхДампах.Вставить("РезультатОтправки", Параметры.РезультатОтправки); - ДанныеОПолныхДампах.Вставить("ОтправлятьФайлыДампов", Параметры.ОтправлятьФайлыДампов); - ДанныеОПолныхДампах.Вставить("СпрашиватьПередОтправкой", Параметры.СпрашиватьПередОтправкой); + ДанныеОПолныхДампах.Вставить("sendingResult", Параметры.РезультатОтправки); + ДанныеОПолныхДампах.Вставить("sendDumps", Параметры.ОтправлятьФайлыДампов); + ДанныеОПолныхДампах.Вставить("askBeforeSending", Параметры.СпрашиватьПередОтправкой); JSONСтруктура.Вставить("FullDumps", ДанныеОПолныхДампах); КонецЕсли; @@ -1235,13 +1239,13 @@ JSONСтруктура.Вставить("business", БизнесСтатистика); КонецЕсли; - Если ПараметрыЦентраМониторинга.РегистрироватьСтатистикуКонфигурации Тогда + Если ПараметрыЦентраМониторинга.РегистрироватьСтатистикуКонфигурации И ОтправлятьСтатистикуКонфигурации Тогда JSONСтруктура.Вставить("config", СекцияСтатистикаКонфигурации["StatisticsConfiguration"]); JSONСтруктура.Вставить("extensionsInfo", ДанныеОбИспользуемыхРасширениях); JSONСтруктура.Вставить("statisticOfRoles", ДанныеОбИспользованииРолей); КонецЕсли; - Если ПараметрыЦентраМониторинга.РегистрироватьНастройкуКонфигурации Тогда + Если ПараметрыЦентраМониторинга.РегистрироватьНастройкуКонфигурации И ОтправлятьСтатистикуКонфигурации Тогда JSONСтруктура.Вставить("options", СекцияНастройкаКонфигурации["Options"]); КонецЕсли; @@ -1265,6 +1269,10 @@ КонтактнаяИнформация.Вставить("ЛогинПортала", Параметры.ЛогинПортала); JSONСтруктура.Вставить("contacts", КонтактнаяИнформация); КонецЕсли; + + Если ОтправлятьСтатистикуКонфигурации Тогда + УстановитьПараметрЦентраМониторинга("СтатистикаКонфигурацииСледующаяОтправка", Параметры.ДатаЗапуска + ПараметрыЦентраМониторинга.СтатистикаКонфигурацииПериодОтправки); + КонецЕсли; Возврат JSONСтруктура; КонецФункции @@ -1432,7 +1440,7 @@ Исключение ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЦентрМониторингаУдалениеДампа(), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Иначе ДампДляУдаления.ИмяФайла = ""; @@ -1542,7 +1550,7 @@ ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга.Статистика конфигурации переопределяемая'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, НСтр("ru = 'Не удалось установить разделение сеанса. Область данных'", ОбщегоНазначения.КодОсновногоЯзыка()) - + " = " + Формат(Выборка.ОбластьДанных, "ЧГ=0") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + " = " + Формат(Выборка.ОбластьДанных, "ЧГ=0") + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВыйтиИзОбластиДанных(); Продолжить; КонецПопытки; @@ -1584,6 +1592,7 @@ Параметры = Новый Структура; Параметры.Вставить("ДатаНачала", Дата(1,1,1) + Цел((ПараметрыЦентраМониторинга.ДатаКрайнегоПакета - Дата(1,1,1))/ПараметрыЦентраМониторинга.ПериодУдаления) * ПараметрыЦентраМониторинга.ПериодУдаления); Параметры.Вставить("ДатаОкончания", Дата(1,1,1) + Цел((ТекДата - Дата(1,1,1))/ПараметрыЦентраМониторинга.ПериодУдаления) * ПараметрыЦентраМониторинга.ПериодУдаления - 1); + Параметры.Вставить("ДатаЗапуска", ТекДата); Параметры.Вставить("ТопДамповКоличество", 5); Параметры.Вставить("TopApdex", ПараметрыЦентраМониторинга.TopApdex); Параметры.Вставить("TopApdexTech", ПараметрыЦентраМониторинга.TopApdexTech); @@ -1613,7 +1622,7 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга.Формирование пакета для отправки'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -1769,6 +1778,8 @@ ПараметрыКонстанты.Вставить("ОтправкаДанныхСледующееФормирование", Дата(1,1,1)); ПараметрыКонстанты.Вставить("ОтправкаДанныхПериодФормирования", 607800); ПараметрыКонстанты.Вставить("ДатаКрайнегоПакета", Дата(1,1,1)); + ПараметрыКонстанты.Вставить("СтатистикаКонфигурацииСледующаяОтправка", Дата(2010,1,1)); + ПараметрыКонстанты.Вставить("СтатистикаКонфигурацииПериодОтправки", 607800); ПараметрыКонстанты.Вставить("НомерКрайнегоПакета", 0); ПараметрыКонстанты.Вставить("ПакетовДляОтправки", 3); ПараметрыКонстанты.Вставить("Сервер", "pult.1c.com"); @@ -2053,7 +2064,7 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга.Установка параметров отправки'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -2107,7 +2118,7 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга.Установка параметров центра мониторинга'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, - Метаданные.Константы.ПараметрыЦентраМониторинга,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Метаданные.Константы.ПараметрыЦентраМониторинга,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -2121,7 +2132,7 @@ Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга.Удалить параметры центра мониторинга'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, - Метаданные.Константы.ПараметрыЦентраМониторинга,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Метаданные.Константы.ПараметрыЦентраМониторинга,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; КонецПроцедуры @@ -2149,7 +2160,7 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга.Установка параметров центра мониторинга'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, - Метаданные.Константы.ПараметрыЦентраМониторинга,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Метаданные.Константы.ПараметрыЦентраМониторинга,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -2340,7 +2351,7 @@ Исключение Сообщение = НСтр("ru = 'Ошибка записи файла настроек технологического журнала. Регистрация дампов не возможна.'"); Сообщение = Сообщение + " """ +Файл.ПолноеИмя + """." + Символы.ПС; - Сообщение = Сообщение + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Сообщение = Сообщение + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга.Регистрация дампов'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Предупреждение,,, Сообщение); @@ -2378,7 +2389,7 @@ Исключение Сообщение = НСтр("ru = 'Ошибка создания файла настроек технологического журнала. Регистрация дампов не возможна.'"); Сообщение = Сообщение + " """ +ПутьКаталога + ИмяФайлаНастроек + """." + Символы.ПС; - Сообщение = Сообщение + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Сообщение = Сообщение + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Предупреждение,,, Сообщение); @@ -2527,18 +2538,18 @@ СисИнфо = Новый СистемнаяИнформация; Результат = Новый Структура; - Результат.Вставить("ИмяКомпьютера", ОбщегоНазначения.КонтрольнаяСуммаСтрокой(ИмяКомпьютера())); - Результат.Вставить("ВерсияОС", Строка(СисИнфо.ВерсияОС)); - Результат.Вставить("ВерсияПриложения", Строка(СисИнфо.ВерсияПриложения)); - Результат.Вставить("ИдентификаторКлиента", Строка(СисИнфо.ИдентификаторКлиента)); - Результат.Вставить("ОперативнаяПамять", Строка(СисИнфо.ОперативнаяПамять)); - Результат.Вставить("Процессор", Строка(СисИнфо.Процессор)); - Результат.Вставить("ТипПлатформы", Строка(СисИнфо.ТипПлатформы)); - Результат.Вставить("ТекущийЯзык", Строка(ТекущийЯзык())); - Результат.Вставить("ТекущийКодЛокализации", Строка(ТекущийКодЛокализации())); - Результат.Вставить("ТекущийЯзыкСистемы", Строка(ТекущийЯзыкСистемы())); - Результат.Вставить("ТекущийРежимЗапуска", Строка(ТекущийРежимЗапуска())); - Результат.Вставить("ЧасовойПоясСеанса", Строка(ЧасовойПоясСеанса())); + Результат.Вставить("computerName", ОбщегоНазначения.КонтрольнаяСуммаСтрокой(ИмяКомпьютера())); + Результат.Вставить("osInfo", Строка(СисИнфо.ВерсияОС)); + Результат.Вставить("platformVersion", Строка(СисИнфо.ВерсияПриложения)); + Результат.Вставить("clientID", Строка(СисИнфо.ИдентификаторКлиента)); + Результат.Вставить("ram", Строка(СисИнфо.ОперативнаяПамять)); + Результат.Вставить("cpu", Строка(СисИнфо.Процессор)); + Результат.Вставить("applicationArchitecture", Строка(СисИнфо.ТипПлатформы)); + Результат.Вставить("currentLanguage", Строка(ТекущийЯзык())); + Результат.Вставить("currentLocalizationCode", Строка(ТекущийКодЛокализации())); + Результат.Вставить("currentSystemLanguage", Строка(ТекущийЯзыкСистемы())); + Результат.Вставить("currentRunMode", Строка(ТекущийРежимЗапуска())); + Результат.Вставить("sessionTimeZone", Строка(ЧасовойПоясСеанса())); Возврат Результат; КонецФункции @@ -3466,7 +3477,7 @@ "СтатистикаКлиента.ИнформацияОСистеме.СвободноНаДиске." + БукваДиска, "", РезультатЗапроса.Значение, Истина); Исключение РезультатЗапроса.Успешно = Ложь; - РезультатЗапроса.ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + РезультатЗапроса.ОписаниеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; КонецЕсли; Иначе @@ -3816,7 +3827,7 @@ Исключение РезультатВыполнения.Успешно = Ложь; РезультатВыполнения.КраткоеПредставлениеОшибки = НСтр("ru = 'Ошибка при формировании пакета.'"); - Комментарий = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Комментарий = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга.Сформировать тестовый пакет для отправки'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, Комментарий); КонецПопытки; @@ -3836,7 +3847,7 @@ Исключение РезультатВыполнения.Успешно = Ложь; РезультатВыполнения.КраткоеПредставлениеОшибки = НСтр("ru = 'Ошибка при отправке пакета.'"); - Комментарий = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Комментарий = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга.Отправить тестовые данные мониторинга'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, Комментарий); ЦентрМониторинга.ЗаписатьОперациюБизнесСтатистики("ЦентрМониторинга.ОтправитьДанныеМониторинга.Ошибка", diff --git a/SSL/src/CommonModules/ШаблоныСообщений/Module.bsl b/SSL/src/CommonModules/ШаблоныСообщений/Module.bsl index 7d450310c..d163f1207 100644 --- a/SSL/src/CommonModules/ШаблоныСообщений/Module.bsl +++ b/SSL/src/CommonModules/ШаблоныСообщений/Module.bsl @@ -15,11 +15,13 @@ // Предмет - Произвольный - объект основание для шаблона сообщений, типы объектов перечислены в // определяемом типе ПредметШаблонаСообщения. // УникальныйИдентификатор - УникальныйИдентификатор - идентификатор формы, необходим для размещения вложений во -// временном хранилище при клиент-серверном вызове. Если вызов -// происходит только на сервере, то можно использовать любой идентификатор. -// ДополнительныеПараметры - Структура - список дополнительных параметров, который будет передан в -// параметр Сообщение в процедурах ПриФормированииСообщения при создании сообщения: -// * ПреобразовыватьHTMLДляФорматированногоДокумента - Булево - необязательный, по умолчанию Ложь, определяет +// временном хранилище при клиент-серверном вызове. Если вызов +// происходит только на сервере, то можно использовать любой идентификатор. +// ДополнительныеПараметры - Структура - список дополнительных параметров, который будет передан в параметр +// Сообщение в процедурах ПриФормированииСообщения в момент создания сообщения: +// * ЗначенияПараметровСКД - Структура - значения параметров СКД, состав и значения реквизитов +// для формируемого шаблона определяется средствами СКД. +// * ПреобразовыватьHTMLДляФорматированногоДокумента - Булево - необязательный, по умолчанию Ложь, определяет // необходимо ли преобразование HTML текста сообщения содержащего картинки в тексте письма из-за // особенностей вывода изображений в форматированном документе. // @@ -27,7 +29,10 @@ // Структура - подготовленное сообщение на основание шаблона для отправки: // * Тема - Строка - тема письма // * Текст - Строка - текст письма -// * Получатель - СписокЗначений - список получателей письма +// * Получатель - СписокЗначений - получатели письма, где в значении электронная почта получателя, а +// в представлении получатель письма. +// - Массив из см. НовыйПолучателиПисьма - если в процедуре ПриОпределенииНастроек +// общего модуля ШаблоныСообщенийПереопределяемый свойство РасширенныйСписокПолучателей равно Истина. // * ДополнительныеПараметры - Структура - параметры шаблона сообщения. // * Вложения - ТаблицаЗначений: // ** Представление - Строка - имя файла вложения. @@ -78,6 +83,8 @@ // * ОтправитьСразу - Булево - если Ложь, то письмо будет помещено в папку Исходящих // и отправлено при общей отправке писем. Только при отправке через Взаимодействие. // Значение по умолчанию, Ложь. +// * ЗначенияПараметровСКД - Структура - значения параметров СКД, состав и значения реквизитов +// для формируемого шаблона определяется средствами СКД. // Функция ПараметрыОтправкиПисьмаПоШаблону() Экспорт @@ -86,6 +93,7 @@ ДополнительныеПараметры.Вставить("ПреобразовыватьHTMLДляФорматированногоДокумента", Ложь); ДополнительныеПараметры.Вставить("УчетнаяЗапись", Неопределено); ДополнительныеПараметры.Вставить("ОтправитьСразу", Ложь); + ДополнительныеПараметры.Вставить("ЗначенияПараметровСКД", Новый Структура); Возврат ДополнительныеПараметры; @@ -117,7 +125,7 @@ // // Параметры: // Наименование - Строка - наименование шаблона. -// ПараметрыШаблона - см. ШаблоныСообщений.ОписаниеПараметровШаблона. +// ПараметрыШаблона - см. ШаблоныСообщений.ОписаниеПараметровШаблона // // Возвращаемое значение: // СправочникСсылка.ШаблоныСообщений - ссылка на созданный шаблон. @@ -126,14 +134,66 @@ ПараметрыШаблона.Вставить("Наименование", Наименование); - Шаблон = Справочники.ШаблоныСообщений.СоздатьЭлемент(); - Шаблон.Заполнить(ПараметрыШаблона); + ИмяСобытияЖурналаРегистрации = НСтр("ru = 'Создание шаблона сообщений'", ОбщегоНазначения.КодОсновногоЯзыка()); - Если ОбновлениеИнформационнойБазы.ЭтоВызовИзОбработчикаОбновления() Тогда - ОбновлениеИнформационнойБазы.ЗаписатьДанные(Шаблон, Истина); - Иначе - Шаблон.Записать(); - КонецЕсли; + НачатьТранзакцию(); + Попытка + + Шаблон = Справочники.ШаблоныСообщений.СоздатьЭлемент(); + Шаблон.Заполнить(ПараметрыШаблона); + + Если ОбновлениеИнформационнойБазы.ЭтоВызовИзОбработчикаОбновления() Тогда + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Шаблон, Истина); + Иначе + Шаблон.Записать(); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + + МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); + + Если ПараметрыШаблона.Вложения <> Неопределено Тогда + Для каждого Вложение Из ПараметрыШаблона.Вложения Цикл + + ИмяФайла = Новый Файл(Вложение.Ключ); + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("Наименование", ИмяФайла.ИмяБезРасширения); + Если СтрНайти(ПараметрыШаблона.Текст, ИмяФайла.ИмяБезРасширения) > 0 Тогда + ДополнительныеПараметры.Вставить("ИДФайлаЭлектронногоПисьма", ИмяФайла.ИмяБезРасширения); + КонецЕсли; + + ПараметрыДобавленияФайла = МодульРаботаСФайлами.ПараметрыДобавленияФайла(ДополнительныеПараметры); + ПараметрыДобавленияФайла.ИмяБезРасширения = ИмяФайла.ИмяБезРасширения; + Если СтрДлина(ИмяФайла.Расширение) > 1 Тогда + ПараметрыДобавленияФайла.РасширениеБезТочки = Сред(ИмяФайла.Расширение, 2); + КонецЕсли; + ПараметрыДобавленияФайла.Автор = Пользователи.АвторизованныйПользователь(); + ПараметрыДобавленияФайла.ВладелецФайлов = Шаблон.Ссылка; + + Попытка + МодульРаботаСФайлами.ДобавитьФайл(ПараметрыДобавленияФайла, Вложение.Значение); + Исключение + // Исключение может произойти в случае хранения файлов в томах, которые недоступны в момент записи файла. + // В таком случае создаем шаблон без вложенных файлов. + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ЗаписьЖурналаРегистрации(ИмяСобытияЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка,,, + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + КонецПопытки; + КонецЦикла; + КонецЕсли; + + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ЗаписьЖурналаРегистрации(ИмяСобытияЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + + ВызватьИсключение; + КонецПопытки; Возврат Шаблон.Ссылка; @@ -159,11 +219,18 @@ // различными операционными системами. Например, файл "Счет на оплату.pdf" будет // сохранен с именем "Schet na oplaty.pdf". Только для шаблонов электронной почты. // * ФорматыВложений - СписокЗначений - список форматов вложений. Только для шаблонов электронной почты. +// * Вложения - Соответствие из КлючИЗначение: +// ** Ключ - Строка - имя файла с расширением (например, image.png). Наименование будет без расширения. +// Или идентификатор картинки в html-письме (без cid). +// ** Значение - Строка - адрес, указывающий на двоичные данные файла во временном хранилище. +// * КомандыПечати - Массив из Строка - уникальные идентификаторы печатных форм // * ВладелецШаблона - ОпределяемыйТип.ВладелецШаблонаСообщения - владелец контекстного шаблона. // * ШаблонПоВнешнейОбработке - Булево - если Истина, то шаблон формируется внешней обработкой. // * ВнешняяОбработка - СправочникСсылка.ДополнительныеОтчетыИОбработки - внешняя обработка, в которой содержится шаблон. // * ПодписьИПечать - Булево - добавляет факсимильную подпись и печать в печатную форму. Только для шаблонов // электронной почты. +// * ДобавлятьПрисоединенныеФайлы - Булево - если Истина, то к вложениям письма будут добавлены все +// присоединенные файлы предмета-владельца. // Функция ОписаниеПараметровШаблона() Экспорт @@ -197,8 +264,9 @@ // номера телефонов. // ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации - если тип Адрес, то будут добавлены адреса // почты, если Телефон, то номера телефонов. +// ВариантОтправки - Строка - вариант отправки для получателя письма: Кому, Копия, СкрытаяКопия, ОбратныйАдрес; // -Процедура ЗаполнитьПолучателей(ПолучателиПисьма, ПредметСообщения, ИмяРеквизита, ТипКонтактнойИнформации = Неопределено) Экспорт +Процедура ЗаполнитьПолучателей(ПолучателиПисьма, ПредметСообщения, ИмяРеквизита, ТипКонтактнойИнформации = Неопределено, ВариантОтправки = "Кому") Экспорт Если ТипЗнч(ПредметСообщения) = Тип("Структура") Тогда Предмет = ПредметСообщения.Предмет; @@ -207,8 +275,12 @@ КонецЕсли; - Если Предмет.Метаданные().Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда - Возврат; + МетаданныеОбъекта = Предмет.Метаданные(); + + Если МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда + Если Не ШаблоныСообщенийСлужебный.ЭтоСтандартныйРеквизит(МетаданныеОбъекта, ИмяРеквизита) Тогда + Возврат; + КонецЕсли; КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда @@ -233,9 +305,10 @@ Получатель.Представление = Строка(ЭлементКонтактнойИнформации.Объект); Получатель.Контакт = ОбъектыКонтактнойИнформации[0]; Иначе - Получатель.Адрес = ЭлементКонтактнойИнформации.Представление; - Получатель.Представление = Строка(ЭлементКонтактнойИнформации.Объект); - Получатель.Контакт = ОбъектыКонтактнойИнформации[0]; + Получатель.Адрес = ЭлементКонтактнойИнформации.Представление; + Получатель.Представление = Строка(ЭлементКонтактнойИнформации.Объект); + Получатель.Контакт = ОбъектыКонтактнойИнформации[0]; + Получатель.ВариантОтправки = ВариантОтправки; КонецЕсли; КонецЦикла; @@ -243,6 +316,28 @@ КонецПроцедуры +// Включает/выключает формирование сообщений по ранее созданным шаблонам. +// +// Параметры: +// Значение - Булево - если Истина, то шаблоны сообщений доступны для использования. +// +Процедура УстановитьИспользованиеШаблоновСообщений(Значение) Экспорт + + Константы.ИспользоватьШаблоныСообщений.Установить(Значение); + +КонецПроцедуры + +// Проверяет возможность использования механизма шаблонов сообщений. +// +// Возвращаемое значение: +// Булево - если Истина, то шаблоны сообщений доступны для использования. +// +Функция ИспользуютсяШаблоныСообщений() Экспорт + + Возврат ПолучитьФункциональнуюОпцию("ИспользоватьШаблоныСообщений"); + +КонецФункции + // Программный интерфейс для внешних обработок. // Создает описание таблицы параметров шаблона сообщения. @@ -464,7 +559,7 @@ ПараметрыОтправки = ШаблоныСообщенийКлиентСервер.КонструкторПараметровОтправки(Шаблон.Ссылка, Предмет, УникальныйИдентификатор); Если ТипЗнч(ПараметрыОтправки.Предмет) = Тип("Строка") - И Метаданные.НайтиПоПолномуИмени(ПараметрыОтправки.Предмет) <> Неопределено Тогда + И ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПараметрыОтправки.Предмет) <> Неопределено Тогда ПараметрыОтправки.Предмет = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПараметрыОтправки.Предмет).ПустаяСсылка(); @@ -486,6 +581,24 @@ КонецФункции +// Возвращаемое значение: +// Структура: +// * Адрес - Строка - электронная почта получателя. +// * Представление - Строка - представление получателя письма. +// * ИсточникКонтактнойИнформации - ОпределяемыйТип.ПредметШаблонаСообщения - владелец контактной информации. +// - Неопределено +// +Функция НовыйПолучателиПисьма() Экспорт + + Результат = Новый Структура; + Результат.Вставить("Адрес", ""); + Результат.Вставить("Представление", ""); + Результат.Вставить("ИсточникКонтактнойИнформации", Неопределено); + + Возврат Результат; + +КонецФункции + // Параметры: // Вложения - ТаблицаЗначений // Возвращаемое значение: @@ -509,3 +622,4 @@ #КонецОбласти + diff --git a/SSL/src/CommonModules/ШаблоныСообщенийКлиентСервер/Module.bsl b/SSL/src/CommonModules/ШаблоныСообщенийКлиентСервер/Module.bsl index 0234cf8f6..644e32a16 100644 --- a/SSL/src/CommonModules/ШаблоныСообщенийКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ШаблоныСообщенийКлиентСервер/Module.bsl @@ -109,11 +109,15 @@ Результат.Вставить("ПараметрыСКД", Новый Соответствие); Результат.Вставить("ВладелецШаблона", Неопределено); Результат.Вставить("Ссылка", Неопределено); + Результат.Вставить("Вложения", Новый Соответствие); + Результат.Вставить("КомандыПечати", Новый Массив); Результат.Вставить("Наименование", ""); - Результат.Вставить("ПараметрыСообщения", Новый Структура); - Результат.Вставить("ПодписьИПечать", Ложь); - Результат.Вставить("РасширенныйСписокПолучателей", Ложь); - Результат.Вставить("ФорматПисьма", ПредопределенноеЗначение("Перечисление.СпособыРедактированияЭлектронныхПисем.HTML")); + Результат.Вставить("ПараметрыСообщения", Новый Структура); + Результат.Вставить("ДобавлятьПрисоединенныеФайлы", Ложь); + Результат.Вставить("ПодписьИПечать", Ложь); + Результат.Вставить("РасширенныйСписокПолучателей", Ложь); + Результат.Вставить("ДобавлятьПрисоединенныеФайлы", Ложь); + Результат.Вставить("ФорматПисьма", ПредопределенноеЗначение("Перечисление.СпособыРедактированияЭлектронныхПисем.HTML")); Возврат Результат; @@ -153,6 +157,7 @@ // ** ПечатныеФормы - Массив // ** НастройкиСохранения - Произвольный // ** ПроизвольныеПараметры - Соответствие +// ** ЗначенияПараметровСКД - Структура // Функция КонструкторПараметровОтправки(Шаблон, Предмет, УникальныйИдентификатор) Экспорт @@ -169,6 +174,7 @@ ПараметрыОтправки.ДополнительныеПараметры.Вставить("УчетнаяЗапись", Неопределено); ПараметрыОтправки.ДополнительныеПараметры.Вставить("ПечатныеФормы", Новый Массив); ПараметрыОтправки.ДополнительныеПараметры.Вставить("НастройкиСохранения"); + ПараметрыОтправки.ДополнительныеПараметры.Вставить("ЗначенияПараметровСКД", Новый Структура); Возврат ПараметрыОтправки; @@ -205,9 +211,11 @@ Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); - МодульРаботаСФайламиСлужебныйВызовСервера.ОпределитьФормуПрисоединенногоФайла(Источник, ВидФормы, Параметры, - ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка); + Если ТипЗнч(ВыбраннаяФорма) = Тип("Строка") Тогда + МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); + МодульРаботаСФайламиСлужебныйВызовСервера.ОпределитьФормуПрисоединенногоФайла(Источник, ВидФормы, Параметры, + ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка); + КонецЕсли; КонецЕсли; diff --git a/SSL/src/CommonModules/ШаблоныСообщенийПереопределяемый/Module.bsl b/SSL/src/CommonModules/ШаблоныСообщенийПереопределяемый/Module.bsl index c5de7bff5..72e667743 100644 --- a/SSL/src/CommonModules/ШаблоныСообщенийПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ШаблоныСообщенийПереопределяемый/Module.bsl @@ -25,6 +25,8 @@ // параметры в шаблонах сообщений. // * ЗначенияПараметровСКД - Структура - общие значения параметров СКД, для всех макетов, где состав реквизитов // определяется средствами СКД. +// * РасширенныйСписокПолучателей - Булево - если Истина, то для получателей письма можно указывать вариант отправки +// и контакт в исходящих писем подсистемы Взаимодействия. // Процедура ПриОпределенииНастроек(Настройки) Экспорт @@ -106,6 +108,7 @@ // // Параметры: // ПолучателиПисьма - ТаблицаЗначений - список получается письма: +// * ВариантОтправки - Строка - вариант отправки для получателя письма: Кому, Копия, СкрытаяКопия, ОбратныйАдрес; // * Адрес - Строка - адрес электронной почты получателя; // * Представление - Строка - представление получателя письма; // * Контакт - Произвольный - контакт, которому принадлежит адрес электронной почты. @@ -126,6 +129,44 @@ +КонецПроцедуры + +// Начальное заполнение предопределенных шаблонов сообщений + +// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов +// +// Параметры: +// Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки +// +Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт + +КонецПроцедуры + +// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов +// +// Параметры: +// КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков +// Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы +// ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти +// +Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт + + + +КонецПроцедуры + +// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов +// +// Параметры: +// Объект - СправочникОбъект.РолиИсполнителей - заполняемый объект. +// Данные - СтрокаТаблицыЗначений - данные заполнения объекта. +// ДополнительныеПараметры - Структура: +// * ПредопределенныеДанные - ТаблицаЗначений - данные заполненные в процедуре ПриНачальномЗаполненииЭлементов. +// +Процедура ПриНачальномЗаполненииЭлемента(Объект, Данные, ДополнительныеПараметры) Экспорт + + + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/ШаблоныСообщенийСлужебный/Module.bsl b/SSL/src/CommonModules/ШаблоныСообщенийСлужебный/Module.bsl index d4875b2cd..d98a5556b 100644 --- a/SSL/src/CommonModules/ШаблоныСообщенийСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ШаблоныСообщенийСлужебный/Module.bsl @@ -38,6 +38,11 @@ ПараметрыШаблона.ПараметрыСообщения = ПараметрыОтправки.ДополнительныеПараметры.ПараметрыСообщения; КонецЕсли; + Если ЗначениеЗаполнено(ПараметрыОтправки.ДополнительныеПараметры.ЗначенияПараметровСКД) Тогда + ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыШаблона.ПараметрыСКД, + ПараметрыОтправки.ДополнительныеПараметры.ЗначенияПараметровСКД, Истина); + КонецЕсли; + Если ПараметрыОтправки.Шаблон = Неопределено Тогда Если ПараметрыОтправки.Свойство("ДополнительныеПараметры") И ПараметрыОтправки.ДополнительныеПараметры.Свойство("ВидСообщения") Тогда @@ -58,7 +63,7 @@ ПараметрыШаблона.Вставить("Предмет", ПараметрыОтправки.Предмет); КонецЕсли; Если ЗначениеЗаполнено(ПараметрыШаблона.ПолноеИмяТипаНазначения) Тогда - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПараметрыШаблона.ПолноеИмяТипаНазначения); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПараметрыШаблона.ПолноеИмяТипаНазначения); Если МетаданныеОбъекта <> Неопределено Тогда МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПараметрыШаблона.ПолноеИмяТипаНазначения); КонецЕсли; @@ -97,6 +102,30 @@ СформированноеСообщение.Тема = СообщениеРезультат.Тема; СформированноеСообщение.Текст = СообщениеРезультат.Текст; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами"); + + Если ПараметрыШаблона.ДобавлятьПрисоединенныеФайлы Тогда + + ФайлыВладельца = Новый Массив; + МодульРаботаСФайлами.ЗаполнитьПрисоединенныеФайлыКОбъекту(ПараметрыОтправки.Предмет, ФайлыВладельца); + Для Каждого ФайлВладельца Из ФайлыВладельца Цикл + ДанныеФайла = МодульРаботаСФайлами.ДанныеФайла(ФайлВладельца); + Если ДанныеФайла = Неопределено Или ДанныеФайла.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + + НовоеВложение = СформированноеСообщение.Вложения.Добавить(); + НовоеВложение.АдресВоВременномХранилище = ДанныеФайла.СсылкаНаДвоичныеДанныеФайла; + НовоеВложение.Представление =?(ПараметрыШаблона.ТранслитерироватьИменаФайлов, + СтроковыеФункции.СтрокаЛатиницей(ДанныеФайла.ИмяФайла), ДанныеФайла.ИмяФайла); + + КонецЦикла; + + КонецЕсли; + + КонецЕсли; + Для каждого Вложение Из Сообщение.Вложения Цикл НовоеВложение = СформированноеСообщение.Вложения.Добавить(); Если ПараметрыШаблона.ТранслитерироватьИменаФайлов Тогда @@ -146,7 +175,7 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); - Если МодульВзаимодействия.ИспользуетсяПрочиеВзаимодействия() Тогда + Если МодульВзаимодействия.ИспользуютсяПрочиеВзаимодействия() Тогда МодульВзаимодействия.СоздатьИОтправитьСообщениеSMS(Сообщение); Результат.Отправлено = Истина; @@ -228,7 +257,26 @@ МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); Если МодульВзаимодействия.ИспользуетсяПочтовыйКлиент() Тогда - РезультатОтправки = МодульВзаимодействия.СоздатьПисьмо(Сообщение, УчетнаяЗапись, ПараметрыОтправки.ДополнительныеПараметры.ОтправитьСразу); + ПараметрыПисьма = МодульВзаимодействия.ПараметрыПисьма(); + ЗаполнитьЗначенияСвойств(ПараметрыПисьма, Сообщение, , "ДополнительныеПараметры"); + + СписокПолучателейСпискомЗначений =(ТипЗнч(Сообщение.Получатель) = Тип("СписокЗначений")); + Для Каждого ПолучательПисьма Из Сообщение.Получатель Цикл + НоваяСтрока = ПараметрыПисьма.Получатели.Добавить(); + Если СписокПолучателейСпискомЗначений Тогда + НоваяСтрока.Адрес = ПолучательПисьма.Значение; + НоваяСтрока.Представление = ПолучательПисьма.Представление; + Иначе + НоваяСтрока.Адрес = ПолучательПисьма.Адрес; + НоваяСтрока.Представление = ПолучательПисьма.Представление; + НоваяСтрока.ИсточникКонтактнойИнформации = ПолучательПисьма.ИсточникКонтактнойИнформации; + КонецЕсли; + КонецЦикла; + + ЗаполнитьЗначенияСвойств(ПараметрыПисьма.ДополнительныеПараметры, Сообщение.ДополнительныеПараметры); + ПараметрыПисьма.ДополнительныеПараметры.Комментарий = КомментарийПоНаименованиюШаблона(Сообщение.ДополнительныеПараметры.Наименование); + + РезультатОтправки = МодульВзаимодействия.СоздатьПисьмо(ПараметрыПисьма, УчетнаяЗапись, ПараметрыОтправки.ДополнительныеПараметры.ОтправитьСразу); ЗаполнитьЗначенияСвойств(Результат, РезультатОтправки); Возврат Результат; @@ -368,6 +416,17 @@ КонецПроцедуры +// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриОпределенииНастроек +// +// Параметры: +// Объекты - Массив из ОбъектМетаданных +// +Процедура ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты) Экспорт + + Объекты.Добавить(Метаданные.Справочники.ШаблоныСообщений); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -439,23 +498,33 @@ Функция КонструкторСообщения(ПараметрыШаблона = Неопределено) Экспорт Сообщение = Новый Структура(); - Сообщение.Вставить("Тема", ""); - Сообщение.Вставить("Текст", ""); - Сообщение.Вставить("Получатель", Неопределено); + Сообщение.Вставить("Тема", ""); + Сообщение.Вставить("Текст", ""); + Сообщение.Вставить("Получатель", Новый СписокЗначений); Сообщение.Вставить("ДополнительныеПараметры", ?(ПараметрыШаблона <> Неопределено, ПараметрыШаблона, Новый Структура())); Сообщение.Вставить("СообщенияПользователю", Новый ФиксированныйМассив(Новый Массив())); ТипСтрока = Новый ОписаниеТипов("Строка"); Вложения = Новый ТаблицаЗначений; - Вложения.Колонки.Добавить("Представление", ТипСтрока); + Вложения.Колонки.Добавить("Представление", ТипСтрока); Вложения.Колонки.Добавить("АдресВоВременномХранилище", ТипСтрока); - Вложения.Колонки.Добавить("Кодировка", ТипСтрока); - Вложения.Колонки.Добавить("Идентификатор", ТипСтрока); + Вложения.Колонки.Добавить("Кодировка", ТипСтрока); + Вложения.Колонки.Добавить("Идентификатор", ТипСтрока); + Сообщение.Вставить("Вложения", Вложения); Если ПараметрыШаблона <> Неопределено Тогда - ЗаполнитьЗначенияСвойств(Сообщение, ПараметрыШаблона); + ЗаполнитьЗначенияСвойств(Сообщение, ПараметрыШаблона,, "Вложения"); + + Для Каждого Вложение Из ПараметрыШаблона.Вложения Цикл + + НовоеВложение = Вложения.Добавить(); + НовоеВложение.Представление = Вложение.Ключ; + НовоеВложение.АдресВоВременномХранилище = Вложение.Значение; + + КонецЦикла; + КонецЕсли; Возврат Сообщение; @@ -559,7 +628,7 @@ Если ЗначениеЗаполнено(ПараметрыШаблона.ПолноеИмяТипаНазначения) Тогда // Реквизиты - МетаданныеОбъект = Метаданные.НайтиПоПолномуИмени(ПараметрыШаблона.ПолноеИмяТипаНазначения); + МетаданныеОбъект = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПараметрыШаблона.ПолноеИмяТипаНазначения); РеквизитыОбъектаНазначения = РеквизитыОбъектаНазначения(СведенияОШаблоне.Реквизиты, ПараметрыШаблона.ПолноеИмяТипаНазначения, ПараметрыШаблона.Назначение); РазворачиватьСсылочныеРеквизиты = ПараметрыШаблона.РазворачиватьСсылочныеРеквизиты; @@ -860,6 +929,12 @@ КонецФункции +Функция КомментарийПоНаименованиюШаблона(НаименованиеШаблона) + + Возврат НСтр("ru = 'Создано и отправлено по шаблону'") + " - " + НаименованиеШаблона; + +КонецФункции + // Настройки Функция ОпределитьПредметыШаблонов() Экспорт @@ -997,7 +1072,7 @@ // Функция РеквизитыОбъектаНазначения(Реквизиты, ПолноеИмяТипаНазначения, Знач Представление = "") - МетаданныеОбъект = Метаданные.НайтиПоПолномуИмени(ПолноеИмяТипаНазначения); + МетаданныеОбъект = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяТипаНазначения); Если МетаданныеОбъект <> Неопределено Тогда ИмяРодителя = МетаданныеОбъект.Имя; Представление = ?(ЗначениеЗаполнено(Представление), Представление, МетаданныеОбъект.Представление()); @@ -1182,7 +1257,7 @@ ЗаписьЖурналаРегистрации( ИмяСобытияЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, НСтр("ru = 'Ошибка при создании внешней печатной формы. По причине:'") + Символы.ПС - + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ОбщегоНазначения.СообщитьПользователю(ИнформацияОбОшибке.Описание); // сообщения обрабатываются в СформироватьСообщение Продолжить; @@ -1299,6 +1374,7 @@ | ШаблоныСообщений.ОтправлятьВТранслите, | ШаблоныСообщений.ПодписьИПечать, | ШаблоныСообщений.ШаблонПоВнешнейОбработке, + | ШаблоныСообщений.ДобавлятьПрисоединенныеФайлы, | ШаблоныСообщений.ВнешняяОбработка, | ШаблоныСообщений.Ссылка, | ШаблоныСообщений.ВладелецШаблона @@ -2635,8 +2711,13 @@ Результат.Получатель = Новый Массив; Для каждого Получатель Из Получатели Цикл Если ЗначениеЗаполнено(Получатель.Адрес) Тогда - ЗначениеПолучателя = Новый Структура("Адрес, Представление, ИсточникКонтактнойИнформации", - Получатель.Адрес, Получатель.Представление, Получатель.Контакт); + + ЗначениеПолучателя = ШаблоныСообщений.НовыйПолучателиПисьма(); + ЗначениеПолучателя.Адрес = Получатель.Адрес; + ЗначениеПолучателя.Представление = Получатель.Представление; + ЗначениеПолучателя.ИсточникКонтактнойИнформации = Получатель.Контакт; + + ЗначениеПолучателя.Вставить("ВариантОтправки", Получатель.ВариантОтправки); Результат.Получатель.Добавить(ЗначениеПолучателя); КонецЕсли; КонецЦикла; @@ -2692,10 +2773,11 @@ Функция СформироватьПолучателейПоУмолчанию(Предмет, ТипШаблона); Получатели = Новый ТаблицаЗначений; - Получатели.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); + Получатели.Колонки.Добавить("ВариантОтправки", ОбщегоНазначения.ОписаниеТипаСтрока(20)); + Получатели.Колонки.Добавить("Представление", ОбщегоНазначения.ОписаниеТипаСтрока(0)); Получатели.Колонки.Добавить("Контакт"); Если СтрСравнить(ТипШаблона, "SMS") = 0 Тогда - Получатели.Колонки.Добавить("НомерТелефона", Новый ОписаниеТипов("Строка")); + Получатели.Колонки.Добавить("НомерТелефона", ОбщегоНазначения.ОписаниеТипаСтрока(500)); ИмяКолонки = "НомерТелефона"; Иначе Получатели.Колонки.Добавить("Адрес", Новый ОписаниеТипов("Строка")); @@ -2721,9 +2803,10 @@ Для каждого ИнформацияОКонтакте Из Контакты Цикл НоваяСтрока = Получатели.Добавить(); - НоваяСтрока.Контакт = ИнформацияОКонтакте.Контакт; - НоваяСтрока.Представление = ИнформацияОКонтакте.Представление; - НоваяСтрока[ИмяКолонки] = ИнформацияОКонтакте.Адрес; + НоваяСтрока.ВариантОтправки = "Кому"; + НоваяСтрока.Контакт = ИнформацияОКонтакте.Контакт; + НоваяСтрока.Представление = ИнформацияОКонтакте.Представление; + НоваяСтрока[ИмяКолонки] = ИнформацияОКонтакте.Адрес; КонецЦикла; КонецЕсли; @@ -2739,9 +2822,10 @@ Если КонтактнаяИнформацияОбъектов.Количество() > 0 Тогда Для каждого КонтактнаяИнформацияОбъекта Из КонтактнаяИнформацияОбъектов Цикл НоваяСтрока= Получатели.Добавить(); - НоваяСтрока[ИмяКолонки] = КонтактнаяИнформацияОбъекта.Представление; - НоваяСтрока.Представление = СтрЗаменить(Строка(КонтактнаяИнформацияОбъекта.Объект), ",", ""); - НоваяСтрока.Контакт = Предмет; + НоваяСтрока.ВариантОтправки = "Кому"; + НоваяСтрока[ИмяКолонки] = КонтактнаяИнформацияОбъекта.Представление; + НоваяСтрока.Представление = СтрЗаменить(Строка(КонтактнаяИнформацияОбъекта.Объект), ",", ""); + НоваяСтрока.Контакт = Предмет; КонецЦикла; КонецЕсли; КонецЕсли; @@ -2854,4 +2938,17 @@ КонецПроцедуры +Функция ЭтоСтандартныйРеквизит(МетаданныеОбъекта, ИмяРеквизита) Экспорт + + Для Каждого СтандартныйРеквизит Из МетаданныеОбъекта.СтандартныеРеквизиты Цикл + + Если СтрСравнить(СтандартныйРеквизит.Имя, ИмяРеквизита) = 0 Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl index 2221364b3..f12a06218 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl @@ -200,17 +200,12 @@ Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить(ОбъектДанных.Метаданные().ПолноеИмя()); ЭлементБлокировки.УстановитьЗначение("Ссылка", ОбъектДанных.Ссылка); + Блокировка.Заблокировать(); СообщениеЖурналаРегистрации = ""; - Если ТипЗнч(СвойстваПодписи) = Тип("Массив") Тогда - Для Каждого ТекущиеСвойства Из СвойстваПодписи Цикл - ДобавитьСтрокуПодписи(ОбъектДанных, ТекущиеСвойства, СообщениеЖурналаРегистрации); - КонецЦикла; - Иначе - ДобавитьСтрокуПодписи(ОбъектДанных, СвойстваПодписи, СообщениеЖурналаРегистрации); - КонецЕсли; + ДобавитьСтрокиПодписи(ОбъектДанных, СвойстваПодписи, СообщениеЖурналаРегистрации); Если Не ОбъектДанных.ПодписанЭП И (ТипЗнч(СвойстваПодписи) <> Тип("Массив") @@ -241,7 +236,7 @@ Объект.Ссылка, СообщениеЖурналаРегистрации + " | - |" + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + |" + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецЕсли; ВызватьИсключение; КонецПопытки; @@ -256,8 +251,8 @@ // // СвойстваПодписи - Строка - адрес временного хранилища, содержащий описанную ниже структуру. // - Структура - см. ЭлектроннаяПодписьКлиентСервер.НовыеСвойстваПодписи. -// ОбновитьПоПорядковомуНомеру - Булево - подпись обновляется по порядковому номеру, т.к. двоичные данные -// подписи изменились при усовершенствовании. +// ОбновитьПоПорядковомуНомеру - Булево - (по умолчанию Ложь) подпись обновляется по порядковому номеру, +// т.к. двоичные данные подписи изменились при усовершенствовании. // Процедура ОбновитьПодпись(Объект, Знач СвойстваПодписи, ОбновитьПоПорядковомуНомеру = Ложь) Экспорт @@ -290,10 +285,12 @@ Если ОбновитьПоПорядковомуНомеру И ПодписьОбъекта.ПорядковыйНомер = СвойстваПодписи.ПорядковыйНомер // Если двоичные данные совпадают, то обновляем подпись. Или ДвоичныеДанныеПодписи = СвойстваПодписи.Подпись Тогда + ОбновляемаяПодпись = РегистрыСведений.ЭлектронныеПодписи.СоздатьМенеджерЗаписи(); ОбновляемаяПодпись.ПорядковыйНомер = СвойстваПодписи.ПорядковыйНомер; ОбновляемаяПодпись.ПодписанныйОбъект = Объект; ОбновляемаяПодпись.Прочитать(); + Если ОбновитьПоПорядковомуНомеру Тогда Для Каждого КлючИЗначение Из СвойстваПодписи Цикл Если КлючИЗначение.Ключ = "Сертификат" @@ -313,6 +310,19 @@ Иначе ЗаполнитьЗначенияСвойств(ОбновляемаяПодпись, СвойстваПодписи, , "Подпись, Сертификат"); КонецЕсли; + + Если ЗначениеЗаполнено(СвойстваПодписи.Сертификат) И Не ЗначениеЗаполнено( + ОбновляемаяПодпись.Сертификат.Получить()) Тогда + + Если ТипЗнч(СвойстваПодписи.Сертификат) = Тип("ХранилищеЗначения") Тогда + ОбновляемаяПодпись.Сертификат = СвойстваПодписи.Сертификат; + Иначе + ОбновляемаяПодпись.Сертификат = Новый ХранилищеЗначения(СвойстваПодписи.Сертификат, + Новый СжатиеДанных(9)); + КонецЕсли; + + КонецЕсли; + ОбновляемаяПодпись.Записать(Истина); КонецЕсли; КонецЦикла; @@ -370,16 +380,7 @@ СообщениеЖурналаРегистрации = ""; - Если ТипЗнч(ПорядковыйНомер) = Тип("Массив") Тогда - Список = Новый СписокЗначений; - Список.ЗагрузитьЗначения(ПорядковыйНомер); - Список.СортироватьПоЗначению(НаправлениеСортировки.Убыв); - Для Каждого ЭлементСписка Из Список Цикл - УдалитьСтрокуПодписи(ОбъектДанных, ЭлементСписка.Значение, СообщениеЖурналаРегистрации); - КонецЦикла; - Иначе - УдалитьСтрокуПодписи(ОбъектДанных, ПорядковыйНомер, СообщениеЖурналаРегистрации); - КонецЕсли; + УдалитьСтрокиПодписи(ОбъектДанных, ПорядковыйНомер, СообщениеЖурналаРегистрации); ОбновитьНумерациюПодписей(ОбъектДанных); @@ -404,7 +405,7 @@ Объект.Ссылка, СообщениеЖурналаРегистрации + " | - |" + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + |" + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецЕсли; ВызватьИсключение; КонецПопытки; @@ -633,7 +634,8 @@ // Значение используется при получении списка личных сертификатов пользователя // в формах подписания и шифрования данных. // -// * Организация - ОпределяемыйТип.Организация - организация, к которой относится сертификат. +// * Организация - ОпределяемыйТип.Организация - организация, к которой относится сертификат. +// * ФизическоеЛицо - ОпределяемыйТип.ФизическоеЛицо - лицо, которому выдан сертификат. // // * Программа - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - программа, которая // требуется для подписания и расшифровки. @@ -667,7 +669,11 @@ СертификатКриптографии = Новый СертификатКриптографии(ДвоичныеДанныеСертификата); КонецЕсли; - СертификатСсылка = СсылкаНаСертификат(Сертификат); + Если ДополнительныеПараметры.Свойство("СсылкаНаСертификат") Тогда + СертификатСсылка = ДополнительныеПараметры.СсылкаНаСертификат; + Иначе + СертификатСсылка = СсылкаНаСертификат(Сертификат); + КонецЕсли; ПравоДоступаДобавление = ПравоДоступа("Добавление", Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования); @@ -755,6 +761,11 @@ КонецЕсли; Для Каждого КлючИЗначение Из ДополнительныеПараметры Цикл + + Если КлючИЗначение.Ключ = "СсылкаНаСертификат" Тогда + Продолжить; + КонецЕсли; + Если РазрешенныеПоляДляИзменения <> Неопределено И РазрешенныеПоляДляИзменения.Найти(КлючИЗначение.Ключ) = Неопределено Тогда Продолжить; @@ -1080,6 +1091,8 @@ // // Параметры: // ТекстДляПоискаВКлассификаторе - Строка - текст, по которому осуществляется поиск в классификаторе. +// ОшибкаНаСервере - Булево - (по умолчанию Ложь) контекст возникновения ошибки (причины и решения +// на клиенте и сервере могут отличаться). // // Возвращаемое значение: // Неопределено - ошибка не существует в классификаторе. @@ -1089,36 +1102,32 @@ // * СпособУстранения - Строка - идентификатор способа автоматического устранения ошибки. // * Ссылка - Строка - идентификатора якоря в статье на сайте ИТС. // -Функция ОшибкаПоКлассификатору(ТекстДляПоискаВКлассификаторе) Экспорт +Функция ОшибкаПоКлассификатору(ТекстДляПоискаВКлассификаторе, ОшибкаНаСервере = Ложь) Экспорт - Возврат ЭлектроннаяПодписьСлужебный.ОшибкаПоКлассификатору(ТекстДляПоискаВКлассификаторе); + Возврат ЭлектроннаяПодписьСлужебный.ОшибкаПоКлассификатору(ТекстДляПоискаВКлассификаторе, ОшибкаНаСервере); КонецФункции // Усовершенствует подпись до переданного типа, если подпись позволяет. // Добавляет архивную метку времени в архивную подпись (CAdES-A). -// -// Параметры: -// Подпись - ДвоичныеДанные - двоичные данные электронной подписи. -// - Строка - адрес временного хранилища, содержащего двоичные данные. -// -// ТипПодписи - ПеречислениеСсылка.ТипыЭлектроннойПодписи - тип подписи, -// до которого требуется усовершенствование. Если фактический ТипПодписи -// тот же или выше, тогда никаких действий произведено не будет. -// -// ДобавитьАрхивнуюМеткуВремени - Булево - если указано Истина и фактический ТипПодписи архивная, -// тогда будет добавлена метка времени. -// -// МенеджерКриптографии - Неопределено - получить менеджер криптографии для проверки -// электронных подписей, как настроил администратор. -// - МенеджерКриптографии - использовать указанный менеджер криптографии. -// +// +// Параметры: +// Подпись - ДвоичныеДанные - двоичные данные электронной подписи. +// ТипПодписи - ПеречислениеСсылка.ТипыЭлектроннойПодписи - тип подписи, +// до которого требуется усовершенствование. Если фактический ТипПодписи +// тот же или выше, тогда никаких действий произведено не будет. +// ДобавитьАрхивнуюМеткуВремени - Булево - если указано Истина и фактический ТипПодписи архивная, +// тогда будет добавлена метка времени. +// МенеджерКриптографии - МенеджерКриптографии +// - Неопределено - получить менеджер криптографии для проверки +// электронных подписей, как настроил администратор. +// // Возвращаемое значение: // Структура: // * Успех - Булево - Истина, если усовершенствование прошло успешно или не требовалось. // * ТекстОшибки - Строка - заполнен, если Успех = Ложь. // * СвойстваПодписи - см. ЭлектроннаяПодписьКлиентСервер.НовыеСвойстваПодписи. -// +// Функция УсовершенствоватьПодпись(Подпись, ТипПодписи, ДобавитьАрхивнуюМеткуВремени = Ложь, МенеджерКриптографии = Неопределено) Экспорт Результат = Новый Структура("Успех, ТекстОшибки, СвойстваПодписи", Ложь); @@ -1147,13 +1156,18 @@ КонтейнерПодписи = МенеджерКриптографии.ПолучитьКонтейнерПодписейКриптографии(Подпись); Исключение Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Не удалось прочитать данные подписи: %1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + НСтр("ru='Не удалось прочитать данные подписи: %1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат Результат; КонецПопытки; ПараметрыПодписиКриптографии = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПараметрыПодписиКриптографии(КонтейнерПодписи, ЭлектроннаяПодписьСлужебный.ДобавкаВремени(), ТекущаяДатаСеанса()); + Если ПараметрыПодписиКриптографии.СертификатПоследнейМеткиВремени = Неопределено Тогда + Результат.ТекстОшибки = НСтр("ru='Не удалось получить сертификат подписи'"); + Возврат Результат; + КонецЕсли; + СвойстваПодписи.ТипПодписи = ПараметрыПодписиКриптографии.ТипПодписи; СвойстваПодписи.СрокДействияПоследнейМеткиВремени = ПараметрыПодписиКриптографии.СрокДействияПоследнейМеткиВремени; @@ -1177,7 +1191,7 @@ ЭлектроннаяПодписьСлужебныйКлиентСервер.ТипПодписиКриптографии(ТипПодписи)); Исключение Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Не удалось усовершенствовать подпись: %1'"), КраткоеПредставлениеОшибки( + НСтр("ru='Не удалось усовершенствовать подпись: %1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки( ИнформацияОбОшибке())); Возврат Результат; КонецПопытки; @@ -1188,7 +1202,7 @@ ДвоичныеДанныеРезультата = МенеджерКриптографии.ДобавитьАрхивнуюМеткуВремени(Подпись); Исключение Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Не удалось добавить архивную метку времени в подпись: %1'"), КраткоеПредставлениеОшибки( + НСтр("ru='Не удалось добавить архивную метку времени в подпись: %1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки( ИнформацияОбОшибке())); Возврат Результат; КонецПопытки; @@ -1211,13 +1225,14 @@ КонтейнерПодписи = МенеджерКриптографии.ПолучитьКонтейнерПодписейКриптографии(ДвоичныеДанныеРезультата); Исключение Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Не удалось прочитать данные усовершенствованной подписи: %1'"), КраткоеПредставлениеОшибки( + НСтр("ru='Не удалось прочитать данные усовершенствованной подписи: %1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки( ИнформацияОбОшибке())); Возврат Результат; КонецПопытки; ПараметрыПодписиКриптографии = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПараметрыПодписиКриптографии( КонтейнерПодписи, ЭлектроннаяПодписьСлужебный.ДобавкаВремени(), ТекущаяДатаСеанса()); + РезультатПроверкиСертификата = ПроверитьСертификат(МенеджерКриптографии, ПараметрыПодписиКриптографии.СертификатПоследнейМеткиВремени, ОписаниеОшибки); @@ -1252,8 +1267,6 @@ // усовершенствования и для блокировки при обновлении. // // ПорядковыйНомер - Число - порядковый номер подписи. -// - Массив - значения указанного выше типа. -// - Неопределено - все подписи объекта. // // ТипПодписи - ПеречислениеСсылка.ТипыЭлектроннойПодписи - тип подписи, // до которого требуется усовершенствование. Если фактический ТипПодписи @@ -1345,6 +1358,9 @@ // программы из справочника для которой удалось его создать. // - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - программа // для которой нужно создать и вернуть менеджер криптографии. +// - Структура - см. НовоеОписаниеПрограммы. +// - ДвоичныеДанные - данные подписи или сертификата в кодировке DER для определения программы. +// - Строка - адрес двоичных данных, описанных выше, во временном хранилище. // // Возвращаемое значение: // МенеджерКриптографии - менеджер криптографии. @@ -1366,6 +1382,85 @@ КонецФункции +// Выполняет проверку установленных программ +// +// Параметры: +// ПараметрыПроверки - Неопределено, Структура: +// * ПроверяемыеПрограммы - Неопределено - (по умолчанию) возвращаются все установленные программы. +// - Булево - см. ЭлектроннаяПодписьСлужебныйКлиентСервер.АктуальныеАлгоритмыПрограмм +// - ДвоичныеДанные - данные подписи или сертификата, для проверки наличия подходящих программ. +// - Строка - адрес во временном хранилище данных подписи или сертификата, +// для проверки наличия подходящих программ. +// - Массив - со значениями, как возвращает функция ЭлектроннаяПодпись.НовоеОписаниеПрограммы. +// Возвращаемое значение: +// Структура: +// * ПроверкаВыполнена - Булево - Истина, если проверка выполнена на компьютере, получены установленные криптопровайдеры. +// если Ложь, то будет заполнена Ошибка. +// * Ошибка - Строка - текст ошибки. +// * Программы - Массив из Структура: +// ** ИмяПрограммы - Строка - имя криптопровайдера, например "Infotecs GOST 2012/512 Cryptographic Service Provider" +// ** ТипПрограммы - Число - тип криптопровайдера, например, 77 +// ** Имя - Строка - представление программы для установки, из списка поставляемых, +// например НСтр("ru = 'ViPNet CSP'") +// ** Версия - Строка - версия библиотеки +// ** Лицензия - Булево - есть лицензия +// - только установленные программы, из переданных в параметре ПроверяемыеПрограммы на клиенте. +// * ВозможенКонфликт - Булево - установлено несколько программ криптографии, между +// которыми возможен конфликт. +// +Функция ПроверитьУстановкуПрограммКриптографии(ПараметрыПроверки = Неопределено) Экспорт + + Контекст = Новый Структура; + Контекст.Вставить("ПроверяемыеПрограммы", Неопределено); + Контекст.Вставить("РасширенноеОписание", Ложь); + Контекст.Вставить("АлгоритмыПодписи", Новый Массив); + Контекст.Вставить("ТипДанных", Неопределено); + Контекст.Вставить("ЭтоСервер", Истина); + + Если ТипЗнч(ПараметрыПроверки) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(Контекст, ПараметрыПроверки); + КонецЕсли; + + Если Контекст.ПроверяемыеПрограммы <> Неопределено Тогда + Если Контекст.ПроверяемыеПрограммы = Истина Тогда + Контекст.ПроверяемыеПрограммы = Неопределено; + Контекст.АлгоритмыПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.АктуальныеАлгоритмыПрограмм(); + Контекст.ТипДанных = "Сертификат"; + ИначеЕсли ТипЗнч(Контекст.ПроверяемыеПрограммы) = Тип("ДвоичныеДанные") + Или ТипЗнч(Контекст.ПроверяемыеПрограммы) = Тип("Строка") Тогда + ДвоичныеДанные = ЭлектроннаяПодписьСлужебныйКлиентСервер.ДвоичныеДанныеИзДанных( + Контекст.ПроверяемыеПрограммы, "ЭлектроннаяПодпись.ПроверитьУстановкуПрограммКриптографии"); + Контекст.ПроверяемыеПрограммы = Неопределено; + Контекст.ТипДанных = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОпределитьТипДанных(ДвоичныеДанные); + Если Контекст.ТипДанных = "Сертификат" Тогда + АлгоритмПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмПодписиСертификата(ДвоичныеДанные); + ИначеЕсли Контекст.ТипДанных = "Подпись" Тогда + АлгоритмПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмСформированнойПодписи(ДвоичныеДанные); + Иначе + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Данные для поиска программы криптографии не являются сертификатом или подписью.'"), ); + КонецЕсли; + Контекст.АлгоритмыПодписи.Добавить(АлгоритмПодписи); + КонецЕсли; + КонецЕсли; + + Результат = ЭлектроннаяПодписьСлужебныйПовтИсп.УстановленныеКриптопровайдеры(); + + РезультатПроверки = Новый Структура("Ошибка, ПроверкаВыполнена"); + РезультатПроверки.Вставить("Программы", Новый Массив); + РезультатПроверки.Вставить("ВозможенКонфликт", Ложь); + ЗаполнитьЗначенияСвойств(РезультатПроверки, Результат); + Если Не РезультатПроверки.ПроверкаВыполнена Тогда + Возврат РезультатПроверки; + КонецЕсли; + + ЭлектроннаяПодписьСлужебныйКлиентСервер.ОбработатьРезультатПроверкиПрограмм(Результат.Криптопровайдеры, + РезультатПроверки.Программы, РезультатПроверки.ВозможенКонфликт, Контекст); + + Возврат РезультатПроверки; + +КонецФункции + // Проверяет действительность подписи и сертификата. // Только для работы через средства платформы (МенеджерКриптографии). // @@ -1397,9 +1492,9 @@ // - Строка - содержит описание ошибки, если произошла ошибка. // // НаДату - Дата - проверить сертификат на указанную дату, -// если дату не удалось извлечь из подписи. +// если дату не удалось извлечь из подписи или если проверяется КонвертXML. // Если параметр не заполнен, тогда проверять на текущую дату сеанса, -// если дату не удалось извлечь из подписи. +// если дату не удалось извлечь из подписи или если проверяется КонвертXML. // // Возвращаемое значение: // Булево - Истина, если проверка выполнена успешно. @@ -1487,7 +1582,7 @@ МенеджерКриптографииДляПроверки, СвойстваКонвертаXML); Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Если ВызыватьИсключение Тогда ВызватьИсключение; КонецЕсли; @@ -1504,7 +1599,7 @@ ИсходныеДанныеДляПроверки.ПараметрыCMS, МенеджерКриптографииДляПроверки); Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Если ВызыватьИсключение Тогда ВызватьИсключение; КонецЕсли; @@ -1527,7 +1622,7 @@ Сертификат = ЭлектроннаяПодписьСлужебный.СертификатыПоПорядкуДоКорневого(Сертификаты)[0]; КонецЕсли; Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Если ВызыватьИсключение Тогда ВызватьИсключение; КонецЕсли; @@ -1554,7 +1649,7 @@ Попытка МенеджерКриптографииДляПроверки.ПроверитьПодпись(ИсходныеДанныеДляПроверки, ПодписьДляПроверки, Сертификат); Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Если ВызыватьИсключение Тогда ВызватьИсключение; КонецЕсли; @@ -1567,7 +1662,7 @@ КонтейнерПодписи = МенеджерКриптографииДляПроверки.ПолучитьКонтейнерПодписейКриптографии(ПодписьДляПроверки); Исключение ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='При чтении данных подписи: %1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + НСтр("ru='При чтении данных подписи: %1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Если ВызыватьИсключение Тогда ВызватьИсключение; КонецЕсли; @@ -1577,7 +1672,7 @@ ПараметрыПодписиКриптографии = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПараметрыПодписиКриптографии(КонтейнерПодписи, ЭлектроннаяПодписьСлужебный.ДобавкаВремени(), ТекущаяДатаСеанса()); - ДатаПодписания = ЭлектроннаяПодписьСлужебныйКлиентСервер.ДатаПодписиИзПараметровПодписи(ПараметрыПодписиКриптографии); + ДатаПодписания = ЭлектроннаяПодписьСлужебныйКлиентСервер.ДатаДляПроверкиПодписи(ПараметрыПодписиКриптографии); Иначе @@ -1736,7 +1831,11 @@ Иначе ПрограммаОбъект = Справочники.ПрограммыЭлектроннойПодписиИШифрования.СоздатьЭлемент(); КонецЕсли; + ОбновитьЗначение(ПрограммаОбъект.ПометкаУдаления, Ложь); + Если Не ЗначениеЗаполнено(ПрограммаОбъект.РежимИспользования) Тогда + ОбновитьЗначение(ПрограммаОбъект.РежимИспользования, Перечисления.РежимыИспользованияПрограммыЭлектроннойПодписи.Настроена); + КонецЕсли; Строки = ПоставляемыеНастройки.НайтиСтроки(Отбор); Для Каждого КлючИЗначение Из ОписаниеПрограммы Цикл @@ -1819,6 +1918,7 @@ КонецФункции + #КонецОбласти // Возвращает доступность создания заявления на выпуск @@ -1964,7 +2064,7 @@ Если ПоказатьОшибку Тогда ВызватьИсключение; Иначе - ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); Возврат Результат; КонецЕсли; КонецПопытки; @@ -1990,7 +2090,7 @@ Если ПоказатьОшибку Тогда ВызватьИсключение; Иначе - ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); Возврат Результат; КонецЕсли; КонецПопытки; @@ -2050,6 +2150,167 @@ КонецФункции +// Возвращает зашифрованные данные. +// +// Параметры: +// Данные - ДвоичныеДанные +// Сертификат - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования +// +// Возвращаемое значение: +// ДвоичныеДанные +// +Функция Зашифровать(Данные, Сертификат) Экспорт + + Если Не ОбщиеНастройки().ИспользоватьШифрование Тогда + ВызватьИсключение НСтр("ru = 'В программе не включено использование шифрования.'"); + КонецЕсли; + + СписокОшибок = Новый Массив; + + ЗначенияРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта( + Сертификат, "Программа, ДанныеСертификата"); + + Программа = ЗначенияРеквизитов.Программа; + + Попытка + ДвоичныеДанныеСертификата = ЗначенияРеквизитов.ДанныеСертификата.Получить(); + СертификатКриптографии = Новый СертификатКриптографии(ДвоичныеДанныеСертификата); + Исключение + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось получить данные сертификата ""%1"" + |из информационной базы по причине: + |%2'"), + Сертификат, + ОписаниеОшибки); + КонецПопытки; + + МенеджерКриптографии = Неопределено; + + Если ЗначениеЗаполнено(ЗначенияРеквизитов.Программа) Тогда + + Если ТипЗнч(ЗначенияРеквизитов.Программа) = ЭлектроннаяПодписьСлужебный.ТипПрограммыСервисаПодписи() Тогда + + Возврат ЭлектроннаяПодписьСлужебный.ЗашифроватьВСервисеОблачнойПодписи( + Данные, ДвоичныеДанныеСертификата, ЗначенияРеквизитов.Программа); + + ИначеЕсли Программа = ЭлектроннаяПодписьСлужебный.ВстроенныйКриптопровайдер() Тогда + + Возврат ЭлектроннаяПодписьСлужебный.ЗашифроватьВстроеннымКриптопровайдером( + Данные, ДвоичныеДанныеСертификата); + + ИначеЕсли Не ОбщегоНазначения.РазделениеВключено() + И (ОбщиеНастройки().СоздаватьЭлектронныеПодписиНаСервере Или ОбщегоНазначения.ИнформационнаяБазаФайловая()) + Тогда + + ПараметрыСоздания = ЭлектроннаяПодписьСлужебный.ПараметрыСозданияМенеджераКриптографии(); + ПараметрыСоздания.Программа = ЗначенияРеквизитов.Программа; + ПараметрыСоздания.ОписаниеОшибки = ""; + МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии("Шифрование", + ПараметрыСоздания); + + ОшибкаНаСервере = ПараметрыСоздания.ОписаниеОшибки; + Если ЗначениеЗаполнено(ОшибкаНаСервере) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось выполнить шифрование сертификатом ""%1"": + |%2'"), Сертификат, ОшибкаНаСервере); + КонецЕсли; + + Если МенеджерКриптографии = Неопределено Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось выполнить шифрование сертификатом ""%1"": + |Не удалось создать менеджер криптографии'"), Сертификат); + КонецЕсли; + + Попытка + ДвоичныеДанныеРезультата = ЭлектроннаяПодписьСлужебный.Зашифровать(Данные, СертификатКриптографии, + МенеджерКриптографии); + Возврат ДвоичныеДанныеРезультата; + Исключение + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось выполнить шифрование сертификатом ""%1"": + |%2'"), Сертификат, ОписаниеОшибки); + КонецПопытки; + + КонецЕсли; + + СписокОшибок.Добавить(НСтр("ru = 'Недоступно шифрование на сервере.'")); + + КонецЕсли; + + АлгоритмПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмПодписиСертификата(ДвоичныеДанныеСертификата); + + Если Не ОбщегоНазначения.РазделениеВключено() И (ОбщиеНастройки().СоздаватьЭлектронныеПодписиНаСервере + Или ОбщегоНазначения.ИнформационнаяБазаФайловая()) Тогда + + ПараметрыСоздания = ЭлектроннаяПодписьСлужебный.ПараметрыСозданияМенеджераКриптографии(); + ПараметрыСоздания.ОписаниеОшибки = ""; + ПараметрыСоздания.АлгоритмПодписи = АлгоритмПодписи; + + МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии("Шифрование", ПараметрыСоздания); + + ОписаниеОшибки = ПараметрыСоздания.ОписаниеОшибки; + + Если Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда + + Если МенеджерКриптографии = Неопределено Тогда + ОписаниеОшибки = НСтр("ru = 'Не удалось создать менеджер криптографии'"); + Иначе + + Попытка + ДвоичныеДанныеРезультата = ЭлектроннаяПодписьСлужебный.Зашифровать(Данные, СертификатКриптографии, + МенеджерКриптографии); + Возврат ДвоичныеДанныеРезультата; + Исключение + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; + + КонецЕсли; + + КонецЕсли; + + СписокОшибок.Добавить(ОписаниеОшибки); + + КонецЕсли; + + МожноШифроватьВОблаке = СтрНайти(АлгоритмПодписи, "GOST 34.10") <> 0; + + Если МожноШифроватьВОблаке Тогда + + Если ОбщиеНастройки().ЭтоМодельСервисаСДоступнымУсовершенствованием Тогда + Попытка + ДвоичныеДанныеРезультата = ЭлектроннаяПодписьСлужебный.ЗашифроватьВСервисеОблачнойПодписи(Данные, + ДвоичныеДанныеСертификата); + Возврат ДвоичныеДанныеРезультата; + Исключение + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + СписокОшибок.Добавить(ОписаниеОшибки); + КонецПопытки; + КонецЕсли; + + Если ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда + Попытка + ДвоичныеДанныеРезультата = ЭлектроннаяПодписьСлужебный.ЗашифроватьВстроеннымКриптопровайдером(Данные, ДвоичныеДанныеСертификата); + Возврат ДвоичныеДанныеРезультата; + Исключение + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + СписокОшибок.Добавить(ОписаниеОшибки); + КонецПопытки; + КонецЕсли; + + КонецЕсли; + + Если ЗначениеЗаполнено(СписокОшибок) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось выполнить шифрование сертификатом ""%1"": + |%2'"), Сертификат, СтрСоединить(СписокОшибок, Символы.ПС)); + КонецЕсли; + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось выполнить шифрование сертификатом ""%1""'"), Сертификат); +КонецФункции + #Область ОбработчикиРегламентныхЗаданий // Локализация @@ -2201,24 +2462,12 @@ // Вспомогательные процедуры и функции. // Для процедуры ДобавитьПодпись. -Процедура ДобавитьСтрокуПодписи(ОбъектДанных, СвойстваПодписи, СообщениеЖурналаРегистрации) +Процедура ДобавитьСтрокиПодписи(ОбъектДанных, СвойстваПодписей, СообщениеЖурналаРегистрации) УстановитьПривилегированныйРежим(Истина); - - НоваяЗапись = РегистрыСведений.ЭлектронныеПодписи.СоздатьМенеджерЗаписи(); - - ЗаполнитьЗначенияСвойств(НоваяЗапись, СвойстваПодписи, , "Подпись, Сертификат"); - - НоваяЗапись.ПодписанныйОбъект = ОбъектДанных.Ссылка; - НоваяЗапись.Подпись = Новый ХранилищеЗначения(СвойстваПодписи.Подпись, Новый СжатиеДанных(9)); - Если ТипЗнч(СвойстваПодписи.Сертификат) = Тип("ХранилищеЗначения") Тогда - НоваяЗапись.Сертификат = СвойстваПодписи.Сертификат; - Иначе - НоваяЗапись.Сертификат = Новый ХранилищеЗначения(СвойстваПодписи.Сертификат, Новый СжатиеДанных(9)); - КонецЕсли; - + ПорядковыйНомер = 1; - + Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ @@ -2227,68 +2476,93 @@ | РегистрСведений.ЭлектронныеПодписи КАК ЭлектронныеПодписи |ГДЕ | ЭлектронныеПодписи.ПодписанныйОбъект = &ПодписанныйОбъект"; - + Запрос.УстановитьПараметр("ПодписанныйОбъект", ОбъектДанных.Ссылка); - + РезультатЗапроса = Запрос.Выполнить(); - + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); - + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл ПорядковыйНомер = ВыборкаДетальныеЗаписи.ПоследнийПорядковыйНомер + 1; КонецЦикла; - - НоваяЗапись.ПорядковыйНомер = ПорядковыйНомер; - - Если Не ЗначениеЗаполнено(НоваяЗапись.УстановившийПодпись) Тогда - НоваяЗапись.УстановившийПодпись = Пользователи.АвторизованныйПользователь(); - КонецЕсли; - - ДатаПодписи = Неопределено; - Если ЗначениеЗаполнено(ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( - СвойстваПодписи, "НеподтвержденнаяДатаПодписи", Неопределено)) Тогда - - ДатаПодписи = СвойстваПодписи.НеподтвержденнаяДатаПодписи; - ИначеЕсли ЗначениеЗаполнено(НоваяЗапись.ТипПодписи) Тогда - ДатаПодписи = ДатаПодписания(СвойстваПодписи.Подпись); + + Если ТипЗнч(СвойстваПодписей) = Тип("Массив") Тогда + МассивСвойствПодписи = СвойстваПодписей; Иначе - ПараметрыПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваПодписиИзДвоичныхДанных( - СвойстваПодписи.Подпись, ЭлектроннаяПодписьСлужебный.ДобавкаВремени()); - Если ЗначениеЗаполнено(ПараметрыПодписи.ДатаПодписания) Тогда - ДатаПодписи = ПараметрыПодписи.ДатаПодписания; - КонецЕсли; - НоваяЗапись.ТипПодписи = ПараметрыПодписи.ТипПодписи; + МассивСвойствПодписи = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СвойстваПодписей); КонецЕсли; - - Если ДатаПодписи <> Неопределено Тогда - НоваяЗапись.ДатаПодписи = ДатаПодписи; - - ИначеЕсли Не ЗначениеЗаполнено(НоваяЗапись.ДатаПодписи) Тогда - НоваяЗапись.ДатаПодписи = ТекущаяДатаСеанса(); - КонецЕсли; - - СообщениеЖурналаРегистрации = ЭлектроннаяПодписьСлужебный.СведенияОПодписиДляЖурналаРегистрации( - НоваяЗапись.ДатаПодписи, СвойстваПодписи); - - НоваяЗапись.Записать(); - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Электронная подпись.Добавление подписи'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Информация, - ОбъектДанных.Метаданные(), - ОбъектДанных.Ссылка, - СообщениеЖурналаРегистрации, - РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); + + Для Каждого СвойстваПодписи Из МассивСвойствПодписи Цикл + + НоваяЗапись = РегистрыСведений.ЭлектронныеПодписи.СоздатьМенеджерЗаписи(); + + ЗаполнитьЗначенияСвойств(НоваяЗапись, СвойстваПодписи, , "Подпись, Сертификат"); + + НоваяЗапись.ПодписанныйОбъект = ОбъектДанных.Ссылка; + НоваяЗапись.Подпись = Новый ХранилищеЗначения(СвойстваПодписи.Подпись, Новый СжатиеДанных(9)); + Если ТипЗнч(СвойстваПодписи.Сертификат) = Тип("ХранилищеЗначения") Тогда + НоваяЗапись.Сертификат = СвойстваПодписи.Сертификат; + Иначе + НоваяЗапись.Сертификат = Новый ХранилищеЗначения(СвойстваПодписи.Сертификат, Новый СжатиеДанных(9)); + КонецЕсли; + + НоваяЗапись.ПорядковыйНомер = ПорядковыйНомер; + + Если Не ЗначениеЗаполнено(НоваяЗапись.УстановившийПодпись) Тогда + НоваяЗапись.УстановившийПодпись = Пользователи.АвторизованныйПользователь(); + КонецЕсли; + + ДатаПодписи = Неопределено; + Если ЗначениеЗаполнено(ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( + СвойстваПодписи, "НеподтвержденнаяДатаПодписи", Неопределено)) Тогда + ДатаПодписи = СвойстваПодписи.НеподтвержденнаяДатаПодписи; + ИначеЕсли ЗначениеЗаполнено(НоваяЗапись.ТипПодписи) Тогда + ДатаПодписи = ДатаПодписания(СвойстваПодписи.Подпись); + Иначе + ПараметрыПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваПодписиИзДвоичныхДанных( + СвойстваПодписи.Подпись, ЭлектроннаяПодписьСлужебный.ДобавкаВремени()); + Если ЗначениеЗаполнено(ПараметрыПодписи.ДатаПодписания) Тогда + ДатаПодписи = ПараметрыПодписи.ДатаПодписания; + КонецЕсли; + НоваяЗапись.ТипПодписи = ПараметрыПодписи.ТипПодписи; + КонецЕсли; + + Если ДатаПодписи <> Неопределено Тогда + НоваяЗапись.ДатаПодписи = ДатаПодписи; + + ИначеЕсли Не ЗначениеЗаполнено(НоваяЗапись.ДатаПодписи) Тогда + НоваяЗапись.ДатаПодписи = ТекущаяДатаСеанса(); + КонецЕсли; + + СообщениеЖурналаРегистрации = ЭлектроннаяПодписьСлужебный.СведенияОПодписиДляЖурналаРегистрации( + НоваяЗапись.ДатаПодписи, СвойстваПодписи); + + НоваяЗапись.Записать(); + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Электронная подпись.Добавление подписи'", ОбщегоНазначения.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Информация, ОбъектДанных.Метаданные(), ОбъектДанных.Ссылка, + СообщениеЖурналаРегистрации, РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); + + ПорядковыйНомер = ПорядковыйНомер + 1; + КонецЦикла; КонецПроцедуры // Для процедуры УдалитьПодпись. -Процедура УдалитьСтрокуПодписи(ПодписанныйОбъект, ПорядковыйНомер, СообщениеЖурналаРегистрации) +Процедура УдалитьСтрокиПодписи(ПодписанныйОбъект, ПорядковыеНомера, СообщениеЖурналаРегистрации) ЭтоПолноправныйПользователь = Пользователи.ЭтоПолноправныйПользователь(); - + УстановитьПривилегированныйРежим(Истина); - + + Если ТипЗнч(ПорядковыеНомера) = Тип("Массив") Тогда + МассивПорядковыхНомеров = ПорядковыеНомера; + Иначе + МассивПорядковыхНомеров = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПорядковыеНомера); + КонецЕсли; + Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ @@ -2297,49 +2571,51 @@ |ИЗ | РегистрСведений.ЭлектронныеПодписи КАК ЭлектронныеПодписи |ГДЕ - | ЭлектронныеПодписи.ПорядковыйНомер = &ПорядковыйНомер - | И ЭлектронныеПодписи.ПодписанныйОбъект = &ПодписанныйОбъект"; - - Запрос.УстановитьПараметр("ПорядковыйНомер", ПорядковыйНомер); + | ЭлектронныеПодписи.ПорядковыйНомер В (&МассивПорядковыхНомеров) + | И ЭлектронныеПодписи.ПодписанныйОбъект = &ПодписанныйОбъект + | + |УПОРЯДОЧИТЬ ПО + | ПорядковыйНомер УБЫВ"; + + Запрос.УстановитьПараметр("МассивПорядковыхНомеров", МассивПорядковыхНомеров); Запрос.УстановитьПараметр("ПодписанныйОбъект", ПодписанныйОбъект.Ссылка); - + РезультатЗапроса = Запрос.Выполнить(); - + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); - - Если ВыборкаДетальныеЗаписи.Количество() = 0 Тогда + + Если ВыборкаДетальныеЗаписи.Количество() <> МассивПорядковыхНомеров.Количество() Тогда ВызватьИсключение НСтр("ru = 'Строка с подписью не существует.'"); КонецЕсли; - - МенеджерЗаписи = РегистрыСведений.ЭлектронныеПодписи.СоздатьМенеджерЗаписи(); + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + МенеджерЗаписи = РегистрыСведений.ЭлектронныеПодписи.СоздатьМенеджерЗаписи(); ЗаполнитьЗначенияСвойств(МенеджерЗаписи, ВыборкаДетальныеЗаписи); - КонецЦикла; - МенеджерЗаписи.Прочитать(); - - ЕстьПрава = ЭтоПолноправныйПользователь - Или МенеджерЗаписи.УстановившийПодпись = Пользователи.АвторизованныйПользователь(); - - СвойстваПодписи = Новый Структура; - СвойстваПодписи.Вставить("Сертификат", МенеджерЗаписи.Сертификат.Получить()); - СвойстваПодписи.Вставить("КомуВыданСертификат", МенеджерЗаписи.КомуВыданСертификат); - - СообщениеЖурналаРегистрации = ЭлектроннаяПодписьСлужебный.СведенияОПодписиДляЖурналаРегистрации( + + МенеджерЗаписи.Прочитать(); + + ЕстьПрава = ЭтоПолноправныйПользователь Или МенеджерЗаписи.УстановившийПодпись + = Пользователи.АвторизованныйПользователь(); + + СвойстваПодписи = Новый Структура; + СвойстваПодписи.Вставить("Сертификат", МенеджерЗаписи.Сертификат.Получить()); + СвойстваПодписи.Вставить("КомуВыданСертификат", МенеджерЗаписи.КомуВыданСертификат); + + СообщениеЖурналаРегистрации = ЭлектроннаяПодписьСлужебный.СведенияОПодписиДляЖурналаРегистрации( МенеджерЗаписи.ДатаПодписи, СвойстваПодписи); - - Если ЕстьПрава Тогда - МенеджерЗаписи.Удалить(); - Иначе - ВызватьИсключение НСтр("ru = 'Недостаточно прав на удаление подписи.'"); - КонецЕсли; - - ЗаписьЖурналаРегистрации( + + Если ЕстьПрава Тогда + МенеджерЗаписи.Удалить(); + Иначе + ВызватьИсключение НСтр("ru = 'Недостаточно прав на удаление подписи.'"); + КонецЕсли; + + ЗаписьЖурналаРегистрации( НСтр("ru = 'Электронная подпись.Удаление подписи'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Информация, - ПодписанныйОбъект.Метаданные(), - ПодписанныйОбъект.Ссылка, - СообщениеЖурналаРегистрации, - РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); + УровеньЖурналаРегистрации.Информация, ПодписанныйОбъект.Метаданные(), ПодписанныйОбъект.Ссылка, + СообщениеЖурналаРегистрации, РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); + + КонецЦикла; КонецПроцедуры @@ -2425,5 +2701,4 @@ КонецПроцедуры - #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl index 8f146ecee..b01837882 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl @@ -184,7 +184,7 @@ // При передаче параметра НаборДанных, свойство нужно проверять в нем. // = Структура - см. ЭлектроннаяПодписьКлиентСервер.НовыеСвойстваПодписи // -// ТипПодписи - см. НовыйТипПодписи +// ТипПодписи - см. НовыйТипПодписи // Процедура Подписать(ОписаниеДанных, Форма = Неопределено, ОбработкаРезультата = Неопределено, ТипПодписи = Неопределено) Экспорт @@ -234,7 +234,7 @@ // ТипПодписи - ПеречислениеСсылка.ТипыПодписиКриптографии // // Возвращаемое значение: -// Структура - Новый тип подписи: +// Структура: // * ТипыПодписи - Массив - массив типов подписей для выбора. // * Видимость - Булево - видимость типа подписи на форме подписания. // * Доступность - Булево - доступность типа подписи на форме подписания. @@ -448,9 +448,9 @@ // (менеджер первой программы в списке, как настроил администратор). // - МенеджерКриптографии - использовать указанный менеджер криптографии. // НаДату - Дата - проверить сертификат на указанную дату, -// если дату не удалось извлечь из подписи. +// если дату не удалось извлечь из подписи или если проверяется КонвертXML. // Если параметр не заполнен, тогда проверять на текущую дату сеанса, -// если дату не удалось извлечь из подписи. +// если дату не удалось извлечь из подписи или если проверяется КонвертXML. // ПоказатьОшибку - Булево - показать ошибку создания менеджера криптографии (когда не указан). // Процедура ПроверитьПодпись(Оповещение, ИсходныеДанные, Подпись, @@ -1034,7 +1034,6 @@ КонецПроцедуры - // Открывает ссылку на раздел ИТС "Инструкции по работе с программами электронной подписи и шифрования". // Процедура ОткрытьИнструкциюПоРаботеСПрограммами() Экспорт @@ -1044,16 +1043,20 @@ КонецПроцедуры // Открывает инструкцию с описанием типичных проблем при работе с программами -// электронной подписи и вариантами их решения: http://its.1c.ru/bmk/dsig/errors. +// электронной подписи и вариантами их решения. // // Параметры: // ИмяРаздела - Строка - ссылка на ошибку в инструкции. // Процедура ОткрытьИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами(ИмяРаздела = "") Экспорт - ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку( - "https://its.1c.ru/db/metod81#content:5784:hdoc" - + ?(ПустаяСтрока(ИмяРаздела), "", ":" + ИмяРаздела)); + НавигационнаяСсылка = ""; + ЭлектроннаяПодписьКлиентСерверЛокализация.ПриОпределенииСсылкиНаИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами( + НавигационнаяСсылка, ИмяРаздела); + + Если Не ПустаяСтрока(НавигационнаяСсылка) Тогда + ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(НавигационнаяСсылка); + КонецЕсли; КонецПроцедуры @@ -1669,7 +1672,7 @@ // Следующие процедуры и функции предназначены для интеграции с 1С:Библиотека электронных документов. -// Создает и возвращает менеджер криптографии (на клиенте) для указанной программы. +// Создает и возвращает менеджер криптографии (на клиенте) для указанной программы или данных. // // Параметры: // Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов: @@ -1687,9 +1690,12 @@ // а также открыть инструкцию по установке. // // Программа - Неопределено - возвращает менеджер криптографии первой -// программы из справочника для которой удалось его создать. +// программы, для которой удалось его создать. // - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - программа // для которой нужно создать и вернуть менеджер криптографии. +// - Структура - см. ЭлектроннаяПодпись.НовоеОписаниеПрограммы. +// - ДвоичныеДанные - данные подписи или сертификата в кодировке DER для определения программы. +// - Строка - адрес двоичных данных, описанных выше, во временном хранилище. // Процедура СоздатьМенеджерКриптографии(Оповещение, Операция, ПоказатьОшибку = Истина, Программа = Неопределено) Экспорт @@ -1836,6 +1842,53 @@ КонецПроцедуры +// Выполняет проверку установленных программ и предлагает установку в зависимости от переданных параметров. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения. +// ПараметрыПроверки - Неопределено, Структура: +// * ПредлагатьУстановитьПрограмму - Булево - если Истина, будет открыта форма обработки +// см. Обработка.ПрограммыЭлектроннойПодписиИШифрования.УстановкаПрограммКриптопровайдеров, +// если она существует и если список установленных программ пуст. По умолчанию, если ПроверяемыеПрограммы = Истина +// и не используется облачная подпись и криптографические операции на сервере - Истина, иначе - Ложь. +// * ПроверяемыеПрограммы - Структура +// - Неопределено - (по умолчанию) возвращаются все установленные программы. +// - Булево - см. ЭлектроннаяПодписьСлужебныйКлиентСервер.АктуальныеАлгоритмыПрограмм +// - ДвоичныеДанные - данные подписи или сертификата, для проверки наличия подходящих программ. +// - Строка - адрес во временном хранилище данных подписи или сертификата, для проверки наличия подходящих программ. +// - Массив - со значениями, как возвращает функция ЭлектроннаяПодпись.НовоеОписаниеПрограммы. +// * УстанавливатьКомпоненту - Булево - (по умолчанию Истина) запрашивать установку компоненты +// для автоматического определения установленных программ. +// * УстанавливатьРасширение - Булево - (по умолчанию Истина) запрашивать установку расширения криптографии +// для автоматического определения установленных программ. +// * ПроверятьНаСервере - Булево, Неопределено - (по умолчанию Неопределено) - если Неопределено, проверять на сервере +// в зависимости от общих настроек. +// ОповещениеОЗавершении - ОписаниеОповещения - оповещение о результате выполнения, один из типов: +// = Структура: +// # ПроверкаВыполнена = Булево - Истина, если проверка выполнена на компьютере, получены установленные криптопровайдеры. +// если Ложь, то будет заполнена Ошибка. +// # Ошибка = Строка - текст ошибки. +// # Программы = Массив Из Структура: +// ## ИмяПрограммы - Строка - имя криптопровайдера, например "Infotecs GOST 2012/512 Cryptographic Service Provider" +// ## ТипПрограммы - Число - тип криптопровайдера, например, 77 +// ## Имя - Строка - представление программы для установки, из списка поставляемых, +// например НСтр("ru = 'ViPNet CSP'") +// ## Версия - Строка - версия библиотеки +// ## Лицензия - Булево - есть лицензия +// - только установленные программы, из переданных в параметре ПроверяемыеПрограммы на клиенте. +// # ПрограммыНаСервере = см. Программы - только установленные программы, из переданных в параметре +// ПроверяемыеПрограммы на сервере. +// # ВозможенКонфликт = Булево - установлено несколько программ криптографии, между +// которыми возможен конфликт. +// # ВозможенКонфликтНаСервере = Булево - установлено несколько программ криптографии, +// между которыми возможен конфликт. +// +Процедура ПроверитьУстановкуПрограммКриптографии(Форма, ПараметрыПроверки = Неопределено, ОповещениеОЗавершении = Неопределено) Экспорт + + ЭлектроннаяПодписьСлужебныйКлиент.ПроверитьУстановкуПрограммКриптографии(Форма, ПараметрыПроверки, ОповещениеОЗавершении); + +КонецПроцедуры + // Устанавливает пароль в хранилище паролей на клиенте на время сеанса. // Только для работы через средства платформы (МенеджерКриптографии). // @@ -1921,6 +1974,21 @@ КонецПроцедуры +// Получить корневой сертификат из данных сертификата и установить его. +// +// Параметры: +// Сертификат - ДвоичныеДанные +// - Строка - адрес во временном хранилище +// - Строка - строковое представление сертификата в формате Base64 +// - СертификатКриптографии +// +Процедура УстановитьКорневойСертификат(Сертификат) Экспорт + + Параметры = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыУстановкиСертификата(Сертификат); + ЭлектроннаяПодписьСлужебныйКлиент.УстановитьКорневойСертификат(Параметры); + +КонецПроцедуры + #КонецОбласти #КонецОбласти diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/Module.bsl index 46f226979..7c0987230 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/Module.bsl @@ -32,6 +32,7 @@ // Производные свойства: // * Сертификат - ХранилищеЗначения - содержит выгрузку сертификата, // который использовался для подписания (содержится в подписи). +// - ДвоичныеДанные // * Отпечаток - Строка - отпечаток сертификата в формате строки Base64. // * КомуВыданСертификат - Строка - представление субъекта, полученное из двоичных данных сертификата. // * ТипПодписи - ПеречислениеСсылка.ТипыЭлектроннойПодписи diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСерверЛокализация/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСерверЛокализация/Module.bsl index fe7a9e689..ebb794599 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСерверЛокализация/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСерверЛокализация/Module.bsl @@ -146,7 +146,26 @@ КонецЕсли; ЗаполнитьИНН(Свойства, Издатель); + // Конец Локализация + +КонецПроцедуры +Процедура ПриПолученииКонвертаXML(Параметры, КонвертXML) Экспорт + + // Локализация + Если Параметры.Вариант = КонвертПоУмолчанию() Тогда + КонвертXML = КонвертXML1(); + ИначеЕсли Параметры.Вариант = "dmdk.goznak.ru_v1" Тогда + КонвертXML = КонвертXML2(); + КонецЕсли; + // Конец Локализация + +КонецПроцедуры + +Процедура ПриПолученииВариантаКонвертаПоУмолчанию(КонвертXML) Экспорт + + // Локализация + КонвертXML = КонвертПоУмолчанию(); // Конец Локализация КонецПроцедуры @@ -262,7 +281,138 @@ КонецФункции +Процедура ПриОпределенииСсылкиНаИнструкциюПоРаботеСПрограммами(Раздел, НавигационнаяСсылка) Экспорт + + // Локализация + + Если Раздел = "УчетВГосударственныхУчреждениях" Тогда + НавигационнаяСсылка = "http://its.1c.ru/bmk/bud/digsig"; + Иначе + НавигационнаяСсылка = "http://its.1c.ru/bmk/comm/digsig"; + КонецЕсли; + + // Конец Локализация + +КонецПроцедуры + +Процедура ПриОпределенииСсылкиНаИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами(НавигационнаяСсылка, ИмяРаздела = "") Экспорт + + // Локализация + + НавигационнаяСсылка = "https://its.1c.ru/db/metod81#content:5784:hdoc" + + ?(ПустаяСтрока(ИмяРаздела), "", ":" + ИмяРаздела); + + // Конец Локализация + +КонецПроцедуры + // Локализация + +#Область ШаблоныКонвертаXML + +Функция КонвертПоУмолчанию() + + Возврат "furs.mark.crpt.ru_v1"; + +КонецФункции + +// Вариант "furs.mark.crpt.ru_v1". +Функция КонвертXML1() + + Возврат + "<soap:Envelope + | xmlns:wsse=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"" + | xmlns:wsu=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"" + | xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""> + | <soap:Header> + | <wsse:Security soap:actor=""http://smev.gosuslugi.ru/actors/smev""> + | <ds:Signature xmlns:ds=""http://www.w3.org/2000/09/xmldsig#""> + | <SignedInfo xmlns=""http://www.w3.org/2000/09/xmldsig#""> + | <CanonicalizationMethod Algorithm=""http://www.w3.org/2001/10/xml-exc-c14n#""/> + | <SignatureMethod Algorithm=""%SignatureMethod%""/> + | <Reference URI=""#body""> + | <Transforms> + | <Transform Algorithm=""http://www.w3.org/2000/09/xmldsig#enveloped-signature""/> + | <Transform Algorithm=""http://www.w3.org/2001/10/xml-exc-c14n#""/> + | </Transforms> + | <DigestMethod Algorithm=""%DigestMethod%""/> + | <DigestValue>%DigestValue%</DigestValue> + | </Reference> + | </SignedInfo> + | <SignatureValue xmlns=""http://www.w3.org/2000/09/xmldsig#""> + | %SignatureValue% + | </SignatureValue> + | <ds:KeyInfo> + | <wsse:SecurityTokenReference> + | <wsse:Reference URI=""#SenderCertificate"" + | ValueType=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3""/> + | </wsse:SecurityTokenReference> + | </ds:KeyInfo> + | </ds:Signature> + | <wsse:BinarySecurityToken + | EncodingType=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"" + | ValueType=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"" + | wsu:Id=""SenderCertificate""> + | %BinarySecurityToken% + | </wsse:BinarySecurityToken> + | </wsse:Security> + | </soap:Header> + | <soap:Body wsu:Id=""body""> + | %MessageXML% + | </soap:Body> + |</soap:Envelope>"; + +КонецФункции + +// Вариант "dmdk.goznak.ru_v1". +Функция КонвертXML2() + + Возврат + "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" + | xmlns:ns=""urn://xsd.dmdk.goznak.ru/exchange/1.0"" + | xmlns:ns1=""urn://xsd.dmdk.goznak.ru/batch/1.0"" + | xmlns:ns2=""urn://xsd.dmdk.goznak.ru/contractor/1.0"" + | xmlns:ns3=""urn://xsd.dmdk.goznak.ru/types/1.0""> + | <soapenv:Header /> + | <soapenv:Body> + | <ns:CheckBatchRequest> + | <ns:CallerSignature> + | <ds:Signature xmlns:ds=""http://www.w3.org/2000/09/xmldsig#""> + | <ds:SignedInfo> + | <ds:CanonicalizationMethod Algorithm=""http://www.w3.org/2001/10/xml-exc-c14n#"" /> + | <ds:SignatureMethod Algorithm=""%SignatureMethod%"" /> + | <ds:Reference URI=""#body""> + | <ds:Transforms> + | <ds:Transform Algorithm=""http://www.w3.org/2001/10/xml-exc-c14n#"" /> + | <ds:Transform Algorithm=""urn://smev-gov-ru/xmldsig/transform"" /> + | </ds:Transforms> + | <ds:DigestMethod Algorithm=""%DigestMethod%"" /> + | <ds:DigestValue>%DigestValue%</ds:DigestValue> + | </ds:Reference> + | </ds:SignedInfo> + | <ds:SignatureValue>%SignatureValue%</ds:SignatureValue> + | <ds:KeyInfo> + | <ds:X509Data> + | <ds:X509Certificate>%BinarySecurityToken%</ds:X509Certificate> + | </ds:X509Data> + | </ds:KeyInfo> + | </ds:Signature> + | </ns:CallerSignature> + | <ns:RequestData Id=""body""> + | %MessageXML% + | </ns:RequestData> + | </ns:CheckBatchRequest> + | </soapenv:Body> + |</soapenv:Envelope>"; + +КонецФункции + +#КонецОбласти + +// Конец Локализация + +// Локализация + Функция ПредставлениеСубъекта(Знач Сертификат, Знач Отчество) Субъект = ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваСубъектаСертификата(Сертификат); @@ -665,6 +815,14 @@ КонецФункции +Функция ИмяПрограммыVipNet() Экспорт + Возврат "ViPNet CSP"; +КонецФункции + +Функция ИмяПрограммыКриптоПро() Экспорт + Возврат "КриптоПро CSP"; +КонецФункции + // Конец Локализация #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl index 87904d22e..1025bd6ea 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl @@ -92,7 +92,7 @@ Результат = МодульСервисКриптографии.ПроверитьСертификат(ДанныеСертификата); КонецЕсли; Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Если ВызыватьИсключение Тогда ВызватьИсключение; КонецЕсли; @@ -191,6 +191,99 @@ КонецФункции +// Только для внутреннего использования. +Функция Зашифровать(Данные, Сертификат, МенеджерКриптографии) Экспорт + + ОписаниеОшибки = ""; + + Попытка + ДвоичныеДанныеРезультата = МенеджерКриптографии.Зашифровать(Данные, Сертификат); + ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеЗашифрованныеДанные(ДвоичныеДанныеРезультата, ОписаниеОшибки); + Исключение + ОписаниеОшибки = ИнформацияОбОшибке(); + КонецПопытки; + + Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда + ВызватьИсключение ОписаниеОшибки; + КонецЕсли; + + Возврат ДвоичныеДанныеРезультата; + +КонецФункции + +// Только для внутреннего использования. +Функция ЗашифроватьВСервисеОблачнойПодписи(Данные, Сертификат, УчетнаяЗапись = Неопределено) Экспорт + + Если ИспользоватьСервисОблачнойПодписи() Тогда + + МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS"); + + Если УчетнаяЗапись = Неопределено Тогда + УчетнаяЗаписьDSSРезультат = МодульСервисКриптографииDSS.НастройкиПодключенияСлужебнойУчетнойЗаписи(); + Если Не УчетнаяЗаписьDSSРезультат.Выполнено Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сервис DSS: + |%1'"), УчетнаяЗаписьDSSРезультат.Ошибка); + КонецЕсли; + УчетнаяЗаписьDSS = УчетнаяЗаписьDSSРезультат.Результат; + Иначе + УчетнаяЗаписьDSS = УчетнаяЗапись; + КонецЕсли; + + ОписаниеОшибки = ""; + Попытка + Результат = МодульСервисКриптографииDSS.Зашифровать( + УчетнаяЗаписьDSS, Данные, Сертификат, "CMS"); + Если Результат.Выполнено Тогда + ДвоичныеДанныеРезультата = Результат.Результат; + ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеЗашифрованныеДанные(ДвоичныеДанныеРезультата, ОписаниеОшибки); + Иначе + ОписаниеОшибки = Результат.Ошибка; + КонецЕсли; + Исключение + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; + + Иначе + ОписаниеОшибки = НСтр("ru = 'Не настроен сервис DSS.'"); + КонецЕсли; + + Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сервис DSS: + |%1'"), ОписаниеОшибки); + КонецЕсли; + + Возврат ДвоичныеДанныеРезультата; + +КонецФункции + +// Только для внутреннего использования. +Функция ЗашифроватьВстроеннымКриптопровайдером(Данные, Сертификат) Экспорт + + Если ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда + МодульСервисКриптографии = ОбщегоНазначения.ОбщийМодуль("СервисКриптографии"); + ОписаниеОшибки = ""; + Попытка + ДвоичныеДанныеРезультата = МодульСервисКриптографии.Зашифровать(Данные, Сертификат); + ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеЗашифрованныеДанные(ДвоичныеДанныеРезультата, ОписаниеОшибки); + Исключение + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; + Иначе + ОписаниеОшибки = НСтр("ru = 'Не настроен встроенный криптопровайдер.'"); + КонецЕсли; + + Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Встроенный криптопровайдер: + |%1'"), ОписаниеОшибки); + КонецЕсли; + + Возврат ДвоичныеДанныеРезультата; + +КонецФункции + // Добавляет сертификаты к переданному объекту. Процедура ДобавитьСертификатыШифрования(ОбъектСсылка, МассивОтпечатков) Экспорт УстановитьПривилегированныйРежим(Истина); @@ -364,7 +457,7 @@ // ДанныеСертификатов - Массив из ДвоичныеДанные // // Возвращаемое значение: -// Массив из ДвоичныеДанные - Сертификаты по порядку до корневого +// Массив из ДвоичныеДанные - сертификаты по порядку до корневого // Функция СертификатыПоПорядкуДоКорневого(ДанныеСертификатов) Экспорт @@ -524,6 +617,567 @@ КонецПроцедуры +// Для формы общих настроек подсистемы Администрирование. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения - см. Обработка.ПанельАдминистрированияБСП.Формы.ОбщиеНастройки +// РеквизитПутьКДанным - Строка - путь к данным реквизита, который изменили на форме +// +Процедура НастроитьФормуОбщихНастроек(Форма, РеквизитПутьКДанным) Экспорт + + Элементы = Форма.Элементы; + НаборКонстант = Форма.НаборКонстант; + ОбщиеНастройки = ЭлектроннаяПодпись.ОбщиеНастройки(); + ДоступнаУсовершенствованнаяПодпись = ОбщиеНастройки.ДоступнаУсовершенствованнаяПодпись; + + Если ОбщегоНазначения.РазделениеВключено() + И (РеквизитПутьКДанным = "НаборКонстант.ИспользоватьЭлектронныеПодписи" + Или РеквизитПутьКДанным = "НаборКонстант.ИспользоватьШифрование" + Или РеквизитПутьКДанным = "НаборКонстант.ИспользоватьСервисDSS" + Или РеквизитПутьКДанным = "") Тогда + + Элементы.ПроверятьЭлектронныеПодписиНаСервере.Видимость = ИспользоватьСервисОблачнойПодписи() + Или ИспользоватьЭлектроннуюПодписьВМоделиСервиса(); + + КонецЕсли; + + Если РеквизитПутьКДанным = "НаборКонстант.ИспользоватьЭлектронныеПодписи" Или РеквизитПутьКДанным + = "НаборКонстант.ИспользоватьШифрование" Или РеквизитПутьКДанным = "" Тогда + + Элементы.НастройкиЭлектроннойПодписиИШифрования.Доступность = НаборКонстант.ИспользоватьЭлектронныеПодписи + Или НаборКонстант.ИспользоватьШифрование; + Элементы.ГруппаУсовершенствованнаяПодпись.Доступность = НаборКонстант.ИспользоватьЭлектронныеПодписи; + Элементы.ГруппаПроверятьПодписиНаСервере.Доступность = НаборКонстант.ИспользоватьЭлектронныеПодписи + Или НаборКонстант.ИспользоватьШифрование; + + Если НаборКонстант.ИспользоватьЭлектронныеПодписи И (РеквизитПутьКДанным + = "НаборКонстант.ИспользоватьЭлектронныеПодписи" Или РеквизитПутьКДанным = "") Тогда + Если ДоступнаУсовершенствованнаяПодпись Тогда + Форма.КонстантаАдресаСерверовМетокВремени = СтрСоединить(ОбщиеНастройки.АдресаСерверовМетокВремени, Символы.ПС); + Форма.КонстантаУсовершенствоватьПодписиАвтоматически = Константы.УсовершенствоватьПодписиАвтоматически.Получить(); + Форма.КонстантаДобавлятьМеткиВремениАвтоматически = Константы.ДобавлятьМеткиВремениАвтоматически.Получить(); + Форма.КонстантаУсовершенствоватьПодписиСДаты = Константы.УсовершенствоватьПодписиСДаты.Получить(); + ТипПодписи = Константы.ТипПодписиКриптографииПоУмолчанию.Получить(); + Форма.КонстантаТипПодписиКриптографииПоУмолчанию = ТипПодписи; + УстановитьЗаголовокПодсказкиУсовершенствования(Форма, ТипПодписи); + КонецЕсли; + Если Элементы.СоздаватьЭлектронныеПодписиНаСервере.Видимость Тогда + Форма.КонстантаСоздаватьЭлектронныеПодписиНаСервере = Константы.СоздаватьЭлектронныеПодписиНаСервере.Получить(); + КонецЕсли; + Если Элементы.ПроверятьЭлектронныеПодписиНаСервере.Видимость Тогда + Форма.КонстантаПроверятьЭлектронныеПодписиНаСервере = Константы.ПроверятьЭлектронныеПодписиНаСервере.Получить(); + КонецЕсли; + КонецЕсли; + + УстановитьЗаголовокЭлектроннаяПодписьНаСервере(Форма); + + ИначеЕсли (РеквизитПутьКДанным = "КонстантаТипПодписиКриптографииПоУмолчанию" Или РеквизитПутьКДанным + = "КонстантаУсовершенствоватьПодписиАвтоматически") И ДоступнаУсовершенствованнаяПодпись Тогда + + Форма.КонстантаУсовершенствоватьПодписиАвтоматически = Константы.УсовершенствоватьПодписиАвтоматически.Получить(); + ТипПодписи = Константы.ТипПодписиКриптографииПоУмолчанию.Получить(); + Форма.КонстантаТипПодписиКриптографииПоУмолчанию = ТипПодписи; + УстановитьЗаголовокПодсказкиУсовершенствования(Форма, ТипПодписи); + + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодписьСервисаDSS") + И ДоступнаУсовершенствованнаяПодпись + И (РеквизитПутьКДанным = "НаборКонстант.ИспользоватьСервисDSS" Или РеквизитПутьКДанным = "") Тогда + + Если ОбщегоНазначения.РазделениеВключено() Тогда + + ЭтоМодельСервисаСДоступнымУсовершенствованием = ОбщиеНастройки.ЭтоМодельСервисаСДоступнымУсовершенствованием; + Элементы.ГруппаАвтоматическаяОбработкаПодписей.Видимость = ЭтоМодельСервисаСДоступнымУсовершенствованием; + Элементы.ГруппаДобавлятьМеткиАвтоматически.Видимость = Ложь; + Элементы.ТипПодписиКриптографииПоУмолчанию.ОтображениеПодсказки = ОтображениеПодсказки.ОтображатьСнизу; + Если ЭтоМодельСервисаСДоступнымУсовершенствованием Тогда + Элементы.ТипПодписиКриптографииПоУмолчанию.Видимость = Истина; + Элементы.ТипПодписиКриптографииПоУмолчанию1.Видимость = Ложь; + + ЗаполнитьСписокТиповПодписейКриптографии( + Элементы.ТипПодписиКриптографииПоУмолчанию.СписокВыбора, "Настройки"); + Элементы.ТипПодписиКриптографииПоУмолчаниюРасширеннаяПодсказка.Заголовок = СтроковыеФункции.ФорматированнаяСтрока( + НСтр( + "ru = 'В приложении в Интернете архивная подпись по умолчанию недоступна, этот тип подписи можно выбрать при подписании <a href=%1>сертификатом</a>, установленным на компьютер при установленной <a href=Программы>программе электронной подписи</a>.'"), "Сертификаты"); + Иначе + Элементы.ТипПодписиКриптографииПоУмолчанию.Видимость = Ложь; + Элементы.ТипПодписиКриптографииПоУмолчанию1.Видимость = Истина; + Элементы.ТипПодписиКриптографииПоУмолчанию1РасширеннаяПодсказка.Заголовок = СтроковыеФункции.ФорматированнаяСтрока( + НСтр( + "ru = 'В приложении в Интернете по умолчанию установлен тип подписи Базовая, типы подписи с метками времени можно выбрать при подписании <a href=%1>сертификатом</a>, установленным на компьютер при установленной <a href=Программы>программе электронной подписи</a>.'"), "Сертификаты"); + КонецЕсли; + + Иначе + + ЗаполнитьСписокТиповПодписейКриптографии( + Элементы.ТипПодписиКриптографииПоУмолчанию.СписокВыбора, "Настройки"); + Элементы.ТипПодписиКриптографииПоУмолчанию.ОтображениеПодсказки = ОтображениеПодсказки.Нет; + Элементы.ТипПодписиКриптографииПоУмолчанию.Видимость = Истина; + Элементы.ТипПодписиКриптографииПоУмолчанию1.Видимость = Ложь; + + КонецЕсли; + Иначе + + Элементы.ТипПодписиКриптографииПоУмолчанию.ОтображениеПодсказки = ОтображениеПодсказки.Нет; + + Если РеквизитПутьКДанным = "" И ДоступнаУсовершенствованнаяПодпись Тогда + Элементы.ТипПодписиКриптографииПоУмолчанию.Видимость = Истина; + Элементы.ТипПодписиКриптографииПоУмолчанию1.Видимость = Ложь; + ЗаполнитьСписокТиповПодписейКриптографии( + Элементы.ТипПодписиКриптографииПоУмолчанию.СписокВыбора, "Настройки"); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Возвращает выборку сертификатов физических лиц. +// +// Параметры: +// ФизическиеЛица - Массив из ОпределяемыйТип.ФизическоеЛицо +// +// Возвращаемое значение: +// ВыборкаИзРезультатаЗапроса: +// * Сертификат - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования +// * ФизическоеЛицо - ОпределяемыйТип.ФизическоеЛицо +// +Функция СертификатыФизическихЛиц(ФизическиеЛица) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | СертификатыКлючейЭлектроннойПодписиИШифрования.Ссылка КАК Сертификат, + | СертификатыКлючейЭлектроннойПодписиИШифрования.ФизическоеЛицо КАК ФизическоеЛицо + |ИЗ + | Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК СертификатыКлючейЭлектроннойПодписиИШифрования + |ГДЕ + | СертификатыКлючейЭлектроннойПодписиИШифрования.ФизическоеЛицо В(&МассивФизическихЛиц) + | И НЕ СертификатыКлючейЭлектроннойПодписиИШифрования.ПометкаУдаления + | И СертификатыКлючейЭлектроннойПодписиИШифрования.ДействителенДо > &ТекущаяДатаСеанса"; + + Запрос.УстановитьПараметр("МассивФизическихЛиц", ФизическиеЛица); + Запрос.УстановитьПараметр("ТекущаяДатаСеанса", ТекущаяДатаСеанса()); + РезультатЗапроса = Запрос.Выполнить(); + + Возврат РезультатЗапроса.Выбрать(); + +КонецФункции + +// Возвращает выборку сертификатов физических лиц пользователей. +// +// Параметры: +// Пользователи - Массив из СправочникСсылка.Пользователи +// +// Возвращаемое значение: +// ВыборкаИзРезультатаЗапроса: +// * Сертификат - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования +// * Пользователь - СправочникСсылка.Пользователи +// +Функция СертификатыФизическихЛицПользователей(Пользователи) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | СертификатыКлючейЭлектроннойПодписиИШифрования.Ссылка КАК Сертификат, + | ПользователиСправочник.Ссылка КАК Пользователь + |ИЗ + | Справочник.Пользователи КАК ПользователиСправочник + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК + | СертификатыКлючейЭлектроннойПодписиИШифрования + | ПО (СертификатыКлючейЭлектроннойПодписиИШифрования.ФизическоеЛицо = ПользователиСправочник.ФизическоеЛицо + | И ПользователиСправочник.Ссылка В (&МассивПользователей) + | И ПользователиСправочник.ФизическоеЛицо <> &ПустоеФизическоеЛицо + | И НЕ СертификатыКлючейЭлектроннойПодписиИШифрования.ПометкаУдаления + | И СертификатыКлючейЭлектроннойПодписиИШифрования.ДействителенДо > &ТекущаяДатаСеанса)"; + + ТипыФизическоеЛицо = Метаданные.ОпределяемыеТипы.ФизическоеЛицо.Тип.Типы(); + Если ТипыФизическоеЛицо[0] <> Тип("Строка") Тогда + Запрос.УстановитьПараметр("ПустоеФизическоеЛицо", Новый (ТипыФизическоеЛицо[0])); + Иначе + Запрос.УстановитьПараметр("ПустоеФизическоеЛицо", ""); + КонецЕсли; + + Запрос.УстановитьПараметр("ТекущаяДатаСеанса", ТекущаяДатаСеанса()); + Запрос.УстановитьПараметр("МассивПользователей", Пользователи); + РезультатЗапроса = Запрос.Выполнить(); + + Возврат РезультатЗапроса.Выбрать(); + +КонецФункции + +// Возвращает возможность показа ссылки на инструкцию по типичным проблемам при работе с программами +// в зависимости от локализации конфигурации. +// +// Возвращаемое значение: +// Булево +// +Функция ВидимостьСсылкиНаИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами() Экспорт + + НавигационнаяСсылка = ""; + ЭлектроннаяПодписьКлиентСерверЛокализация.ПриОпределенииСсылкиНаИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами( + НавигационнаяСсылка); + Возврат Не ПустаяСтрока(НавигационнаяСсылка); + +КонецФункции + +#Область ПоставляемыеДанные + +// См. ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных +Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.ВидДанных = "ОшибкиКриптографии3"; + Обработчик.КодОбработчика = "ОшибкиКриптографии"; + Обработчик.Обработчик = ЭлектроннаяПодписьСлужебный; + +КонецПроцедуры + +// Вызывается при получении уведомления о новых данных. +// В теле следует проверить, необходимы ли эти данные приложению, +// и если да - установить флажок Загружать. +// +// Параметры: +// Дескриптор - ОбъектXDTO +// Загружать - Булево - Истина, если загружать, Ложь - иначе. +// +Процедура ДоступныНовыеДанные(Знач Дескриптор, Загружать) Экспорт + + Загружать = Дескриптор.DataType = "ОшибкиКриптографии3"; + +КонецПроцедуры + +// Вызывается после вызова ДоступныНовыеДанные, позволяет разобрать данные. +// +// Параметры: +// Дескриптор - ОбъектXDTO +// ПутьКФайлу - Строка - полное имя извлеченного файла. Файл будет автоматически удален +// после завершения процедуры. Если в менеджере сервиса не был +// указан файл - значение аргумента равно Неопределено. +// +Процедура ОбработатьНовыеДанные(Знач Дескриптор, Знач ПутьКФайлу) Экспорт + + Если Дескриптор.DataType = "ОшибкиКриптографии3" Тогда + ЗаписатьДанныеКлассификатора(Новый ДвоичныеДанные(ПутьКФайлу)); + КонецЕсли; + +КонецПроцедуры + +// Вызывается при отмене обработки данных в случае сбоя. +// +// Параметры: +// Дескриптор - ОбъектXDTO +// +Процедура ОбработкаДанныхОтменена(Знач Дескриптор) Экспорт + +КонецПроцедуры + +#КонецОбласти + +#Область ОблачнаяПодпись + +// Определяет доступность подсистемы облачной подписи +// +// Возвращаемое значение: +// Булево +// +Функция ИспользоватьСервисОблачнойПодписи() Экспорт + + Результат = Ложь; + + // Локализация + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодписьСервисаDSS") Тогда + МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS"); + Результат = МодульСервисКриптографииDSS.ИспользоватьСервисОблачнойПодписи(); + КонецЕсли; + // Конец Локализация + + Возврат Результат; + +КонецФункции + +// Определяет тип программы облачной подписи. +// +// Возвращаемое значение: +// Неопределено +// Тип +// +Функция ТипПрограммыСервисаПодписи() Экспорт + + Результат = Неопределено; + + // Локализация + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодписьСервисаDSS") Тогда + МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSКлиентСервер"); + Результат = МодульСервисКриптографииDSSКлиентСервер.ПолучитьТипОблачнойПодписи(); + КонецЕсли; + // Конец Локализация + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область ОбработчикиСобытийПодсистемКонфигурации + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Процедура = "Справочники.ПрограммыЭлектроннойПодписиИШифрования.ЗаполнитьНачальныеНастройки"; + Обработчик.РежимВыполнения = "Монопольно"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "3.1.3.190"; + Обработчик.Комментарий = НСтр("ru = 'Удаление путей из заполненных имен файлов подписей.'"); + Обработчик.Идентификатор = Новый УникальныйИдентификатор("781a39e1-48e9-4145-8d98-93c1040c2755"); + Обработчик.Процедура = "РегистрыСведений.ЭлектронныеПодписи.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "РегистрыСведений.ЭлектронныеПодписи.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; + Обработчик.ЧитаемыеОбъекты = "РегистрСведений.ЭлектронныеПодписи"; + Обработчик.ИзменяемыеОбъекты = "РегистрСведений.ЭлектронныеПодписи"; + Обработчик.ОчередьОтложеннойОбработки = 10; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Порядок = "После"; + Приоритет.Процедура = "РаботаСФайлами.ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведений"; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") + И Не ОбщегоНазначения.РазделениеВключено() Тогда + Обработчик = Обработчики.Добавить(); + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Версия = "3.1.5.220"; + Обработчик.Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = 'Добавление внешней компоненты %1 в справочник Внешние компоненты.'"), "ExtraCryptoAPI"); + Обработчик.Идентификатор = Новый УникальныйИдентификатор("9fcfccd5-ec23-4ba9-8b2c-8f0ae269c271"); + Обработчик.Процедура = "ЭлектроннаяПодписьСлужебный.ДобавитьКомпонентуExtraCryptoAPI"; + Обработчик.РежимВыполнения = "Оперативно"; + КонецЕсли; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "3.1.6.20"; + Обработчик.Процедура = "ЭлектроннаяПодписьСлужебный.ЗаменитьРольДобавлениеИзменениеЭлектронныхПодписейИШифрование"; + Обработчик.РежимВыполнения = "Оперативно"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "3.1.6.20"; + Обработчик.Комментарий = НСтр( + "ru = 'Перенос оповещений об окончании срока действия сертификата и данных заявлений в регистры сведений.'"); + Обработчик.Идентификатор = Новый УникальныйИдентификатор("05bd8752-d7f7-47bb-abe6-41d72bcc477b"); + Обработчик.Процедура = "Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; + Обработчик.ЧитаемыеОбъекты = "Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования"; + ИзменяемыеОбъекты = Новый Массив; + ИзменяемыеОбъекты.Добавить("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования"); + ИзменяемыеОбъекты.Добавить("РегистрСведений.ОповещенияПользователейСертификатов"); + Если Метаданные.РегистрыСведений.Найти("ЗаявленияНаВыпускСертификата") <> Неопределено Тогда + ИзменяемыеОбъекты.Добавить("РегистрСведений.ЗаявленияНаВыпускСертификата"); + КонецЕсли; + Обработчик.ИзменяемыеОбъекты = СтрСоединить(ИзменяемыеОбъекты, ","); + Обработчик.БлокируемыеОбъекты = "Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования"; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; + + Если Метаданные.Обработки.Найти("ПрограммыЭлектроннойПодписиИШифрования") <> Неопределено Тогда + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "3.1.6.69"; + Обработчик.Комментарий = НСтр("ru = 'Обновление справочника Программы электронной подписи и шифрования.'"); + Обработчик.Процедура = "Обработки.ПрограммыЭлектроннойПодписиИШифрования.ОбновитьНаименованиеВстроенногоКриптопровайдера"; + Обработчик.РежимВыполнения = "Оперативно"; + КонецЕсли; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "3.1.6.128"; + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Комментарий = НСтр("ru = 'Заполнение настроек для усовершенствования подписей.'"); + Обработчик.Процедура = "ЭлектроннаяПодписьСлужебный.ЗаполнитьНастройкиДляУсовершенствованияПодписей"; + Обработчик.РежимВыполнения = "Оперативно"; + + // Локализация + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "3.1.6.180"; + Обработчик.Комментарий = НСтр("ru = 'Устанавливает стандартные адреса серверов меток времени ФНС России и Удостоверяющего Центра ООО «Научно-производственный центр ""1С""» для удобной работы с метками доверенного времени в электронной подписи.'"); + Обработчик.Процедура = "ЭлектроннаяПодписьСлужебный.ЗаполнитьАдресаСерверовМетокВремени"; + Обработчик.РежимВыполнения = "Оперативно"; + // Конец Локализация + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "3.1.8.58"; + Обработчик.Комментарий = + НСтр("ru = 'Устанавливает режим использования Настроена в программах электронной подписи и шифрования.'"); + Обработчик.Идентификатор = Новый УникальныйИдентификатор("ddaf9603-7641-470b-93cc-8754c9a64a99"); + Обработчик.Процедура = "Справочники.ПрограммыЭлектроннойПодписиИШифрования.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.ПрограммыЭлектроннойПодписиИШифрования.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; + Обработчик.ЧитаемыеОбъекты = "Справочник.ПрограммыЭлектроннойПодписиИШифрования"; + Обработчик.ИзменяемыеОбъекты = "Справочник.ПрограммыЭлектроннойПодписиИШифрования"; + Обработчик.ОчередьОтложеннойОбработки = 1; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. +Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт + + Библиотека = "СтандартныеПодсистемы"; + + СтароеИмя = "Роль.ИспользованиеЭЦП"; + НовоеИмя = "Роль.ИспользованиеЭП"; + ОбщегоНазначения.ДобавитьПереименование(Итог, "2.2.1.7", СтароеИмя, НовоеИмя, Библиотека); + + СтароеИмя = "Подсистема.СтандартныеПодсистемы.Подсистема.ЭлектроннаяЦифроваяПодпись"; + НовоеИмя = "Подсистема.СтандартныеПодсистемы.Подсистема.ЭлектроннаяПодпись"; + ОбщегоНазначения.ДобавитьПереименование(Итог, "2.2.1.7", СтароеИмя, НовоеИмя, Библиотека); + + СтароеИмя = "Роль.ИспользованиеЭП"; + НовоеИмя = "Роль.ИспользованиеЭлектроннойПодписиИШифрования"; + ОбщегоНазначения.ДобавитьПереименование(Итог, "2.3.1.10", СтароеИмя, НовоеИмя, Библиотека); + + СтароеИмя = "Роль.ИспользованиеЭлектроннойПодписиИШифрования"; + НовоеИмя = "Роль.ДобавлениеИзменениеЭлектронныхПодписейИШифрование"; + ОбщегоНазначения.ДобавитьПереименование(Итог, "2.3.3.2", СтароеИмя, НовоеИмя, Библиотека); + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиента. +Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт + + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + НастройкиПодсистемы = Новый Структура; + НастройкиПодсистемы.Вставить("ПерсональныеНастройки", ЭлектроннаяПодпись.ПерсональныеНастройки()); + НастройкиПодсистемы.Вставить("ОбщиеНастройки", ЭлектроннаяПодпись.ОбщиеНастройки()); + НастройкиПодсистемы = Новый ФиксированнаяСтруктура(НастройкиПодсистемы); + Параметры.Вставить("ЭлектроннаяПодпись", НастройкиПодсистемы); + КонецЕсли; + +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. +Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт + + ШаблоныЗаданий.Добавить(Метаданные.РегламентныеЗадания.ПродлениеДостоверностиПодписей.Имя); + +КонецПроцедуры + +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. +Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт + + СоответствиеИменПсевдонимам.Вставить(Метаданные.РегламентныеЗадания.ПродлениеДостоверностиПодписей.ИмяМетода); + + Если Метаданные.Обработки.Найти("ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата") <> Неопределено Тогда + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата = + ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( + "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата"); + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) + КонецЕсли; + +КонецПроцедуры + +// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных. +Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт + + // Загрузка в справочник ПрограммыЭлектроннойПодписиИШифрования запрещена. + СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПолноеИмя(), "ПолноеИмя"); + Если СтрокаТаблицы <> Неопределено Тогда + ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); + КонецЕсли; + + // Загрузка в справочник СертификатыКлючейЭлектроннойПодписиИШифрования запрещена. + СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ПолноеИмя(), "ПолноеИмя"); + Если СтрокаТаблицы <> Неопределено Тогда + ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); + КонецЕсли; + +КонецПроцедуры + +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. +Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт + Объекты.Вставить(Метаданные.Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); +КонецПроцедуры + +// Переопределяет исключения неразделенных данных для подсистемы ТехнологияСервиса +// +// Параметры: +// Исключения - Массив из ОбъектМетаданных - исключения. +// +Процедура ПриОпределенииИсключенийНеразделенныхДанных(Исключения) Экспорт + + Исключения.Добавить(Метаданные.РегистрыСведений.СпискиОтзываСертификатов); + +КонецПроцедуры + +// См. ПолучениеВнешнихКомпонентВМоделиСервисаПереопределяемый.ПриОпределенииИспользуемыхВерсийВнешнихКомпонент. +Процедура ПриОпределенииИспользуемыхВерсийВнешнихКомпонент(Идентификаторы) Экспорт + + Идентификаторы.Добавить(ЭлектроннаяПодписьСлужебныйКлиентСервер.ОписаниеКомпоненты().ИмяОбъекта); + +КонецПроцедуры + +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт + + Если Метаданные.Обработки.Найти("ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата") <> Неопределено Тогда + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата = + ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( + "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата"); + ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); + КонецЕсли; + + Настройка = Настройки.Добавить(); + Настройка.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ПродлениеДостоверностиПодписей; + Настройка.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьЭлектронныеПодписи; + +КонецПроцедуры + +// См. РаботаСКлассификаторамиПереопределяемый.ПриДобавленииКлассификаторов. +Процедура ПриДобавленииКлассификаторов(Классификаторы) Экспорт + + Если Метаданные.ОбщиеМодули.Найти("ЭлектроннаяПодписьСлужебныйЛокализация") = Неопределено Тогда + Возврат; + КонецЕсли; + + Описание = Неопределено; + Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.РаботаСКлассификаторами") Тогда + МодульРаботаСКлассификаторами = ОбщегоНазначения.ОбщийМодуль("РаботаСКлассификаторами"); + Описание = МодульРаботаСКлассификаторами.ОписаниеКлассификатора(); + КонецЕсли; + Если Описание = Неопределено Тогда + Возврат; + КонецЕсли; + + Описание.Идентификатор = ИдентификаторКлассификатора(); + Описание.Наименование = НСтр("ru = 'Список аккредитованных удостоверяющих центров'"); + Описание.ОбновлятьАвтоматически = Истина; + Описание.ОбщиеДанные = Истина; + Описание.ОбработкаРазделенныхДанных = Ложь; + Описание.СохранятьФайлВКэш = Ложь; + + Классификаторы.Добавить(Описание); + +КонецПроцедуры + +// См. РаботаСКлассификаторамиПереопределяемый.ПриЗагрузкеКлассификатора. +Процедура ПриЗагрузкеКлассификатора(Идентификатор, Версия, Адрес, Обработан, ДополнительныеПараметры) Экспорт + + Если Идентификатор <> ИдентификаторКлассификатора() Тогда + Возврат; + КонецЕсли; + + Если Метаданные.ОбщиеМодули.Найти("ЭлектроннаяПодписьСлужебныйЛокализация") = Неопределено Тогда + Обработан = Истина; + Возврат; + КонецЕсли; + + МодульЭлектроннаяПодписьСлужебныйЛокализация = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебныйЛокализация"); + МодульЭлектроннаяПодписьСлужебныйЛокализация.ЗагрузитьДанныеАккредитованныхУЦ(Версия, Адрес, Обработан, ДополнительныеПараметры); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистемы ТекущиеДела. @@ -650,364 +1304,6 @@ МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.ПродлениеСрокаДействияЭлектронныхПодписей); -КонецПроцедуры - -#Область ПоставляемыеДанные - -// См. ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных -Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.ВидДанных = "ОшибкиКриптографии2"; - Обработчик.КодОбработчика = "ОшибкиКриптографии"; - Обработчик.Обработчик = ЭлектроннаяПодписьСлужебный; - -КонецПроцедуры - -// Вызывается при получении уведомления о новых данных. -// В теле следует проверить, необходимы ли эти данные приложению, -// и если да - установить флажок Загружать. -// -// Параметры: -// Дескриптор - ОбъектXDTO -// Загружать - Булево - Истина, если загружать, Ложь - иначе. -// -Процедура ДоступныНовыеДанные(Знач Дескриптор, Загружать) Экспорт - - Загружать = Дескриптор.DataType = "ОшибкиКриптографии2"; - -КонецПроцедуры - -// Вызывается после вызова ДоступныНовыеДанные, позволяет разобрать данные. -// -// Параметры: -// Дескриптор - ОбъектXDTO -// ПутьКФайлу - Строка - полное имя извлеченного файла. Файл будет автоматически удален -// после завершения процедуры. Если в менеджере сервиса не был -// указан файл - значение аргумента равно Неопределено. -// -Процедура ОбработатьНовыеДанные(Знач Дескриптор, Знач ПутьКФайлу) Экспорт - - Если Дескриптор.DataType = "ОшибкиКриптографии2" Тогда - ЗаписатьДанныеКлассификатора(Новый ДвоичныеДанные(ПутьКФайлу)); - КонецЕсли; - -КонецПроцедуры - -// Вызывается при отмене обработки данных в случае сбоя. -// -// Параметры: -// Дескриптор - ОбъектXDTO -// -Процедура ОбработкаДанныхОтменена(Знач Дескриптор) Экспорт - -КонецПроцедуры - -#КонецОбласти - -#Область ОблачнаяПодпись - -// Определяет доступность подсистемы облачной подписи -// -// Возвращаемое значение: -// Булево -// -Функция ИспользоватьСервисОблачнойПодписи() Экспорт - - Результат = Ложь; - - // Локализация - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодписьСервисаDSS") Тогда - МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS"); - Результат = МодульСервисКриптографииDSS.ИспользоватьСервисОблачнойПодписи(); - КонецЕсли; - // Конец Локализация - - Возврат Результат; - -КонецФункции - -// Определяет тип программы облачной подписи. -// -// Возвращаемое значение: -// Неопределено -// Тип -// -Функция ТипПрограммыСервисаПодписи() Экспорт - - Результат = Неопределено; - - // Локализация - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодписьСервисаDSS") Тогда - МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSКлиентСервер"); - Результат = МодульСервисКриптографииDSSКлиентСервер.ПолучитьТипОблачнойПодписи(); - КонецЕсли; - // Конец Локализация - - Возврат Результат; - -КонецФункции - -#КонецОбласти - -#Область ОбработчикиСобытийПодсистемКонфигурации - -// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Процедура = "Справочники.ПрограммыЭлектроннойПодписиИШифрования.ЗаполнитьНачальныеНастройки"; - Обработчик.РежимВыполнения = "Монопольно"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "3.1.3.241"; - Обработчик.Комментарий = - НСтр("ru = 'Обновление справочника Программы электронной подписи и шифрования.'"); - Обработчик.Идентификатор = Новый УникальныйИдентификатор("8e76369a-e16c-415d-bfeb-95e7e5f07a00"); - Обработчик.Процедура = "Справочники.ПрограммыЭлектроннойПодписиИШифрования.ОбработатьДанныеДляПереходаНаНовуюВерсию"; - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.ПрограммыЭлектроннойПодписиИШифрования.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; - Обработчик.ЧитаемыеОбъекты = "Справочник.ПрограммыЭлектроннойПодписиИШифрования"; - Обработчик.ИзменяемыеОбъекты = "Справочник.ПрограммыЭлектроннойПодписиИШифрования"; - Обработчик.ОчередьОтложеннойОбработки = 1; - Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "3.1.3.190"; - Обработчик.Комментарий = НСтр("ru = 'Удаление путей из заполненных имен файлов подписей.'"); - Обработчик.Идентификатор = Новый УникальныйИдентификатор("781a39e1-48e9-4145-8d98-93c1040c2755"); - Обработчик.Процедура = "РегистрыСведений.ЭлектронныеПодписи.ОбработатьДанныеДляПереходаНаНовуюВерсию"; - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.ПроцедураЗаполненияДанныхОбновления = "РегистрыСведений.ЭлектронныеПодписи.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; - Обработчик.ЧитаемыеОбъекты = "РегистрСведений.ЭлектронныеПодписи"; - Обработчик.ИзменяемыеОбъекты = "РегистрСведений.ЭлектронныеПодписи"; - Обработчик.ОчередьОтложеннойОбработки = 10; - Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); - Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); - Приоритет.Порядок = "После"; - Приоритет.Процедура = "РаботаСФайлами.ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведений"; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") - И Не ОбщегоНазначения.РазделениеВключено() Тогда - Обработчик = Обработчики.Добавить(); - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Версия = "3.1.5.220"; - Обработчик.Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( - "ru = 'Добавление внешней компоненты %1 в справочник Внешние компоненты.'"), "ExtraCryptoAPI"); - Обработчик.Идентификатор = Новый УникальныйИдентификатор("9fcfccd5-ec23-4ba9-8b2c-8f0ae269c271"); - Обработчик.Процедура = "ЭлектроннаяПодписьСлужебный.ДобавитьКомпонентуExtraCryptoAPI"; - Обработчик.РежимВыполнения = "Оперативно"; - КонецЕсли; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "3.1.6.20"; - Обработчик.Процедура = "ЭлектроннаяПодписьСлужебный.ЗаменитьРольДобавлениеИзменениеЭлектронныхПодписейИШифрование"; - Обработчик.РежимВыполнения = "Оперативно"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "3.1.6.20"; - Обработчик.Комментарий = НСтр( - "ru = 'Перенос оповещений об окончании срока действия сертификата и данных заявлений в регистры сведений.'"); - Обработчик.Идентификатор = Новый УникальныйИдентификатор("05bd8752-d7f7-47bb-abe6-41d72bcc477b"); - Обработчик.Процедура = "Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ОбработатьДанныеДляПереходаНаНовуюВерсию"; - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; - Обработчик.ЧитаемыеОбъекты = "Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования"; - ИзменяемыеОбъекты = Новый Массив; - ИзменяемыеОбъекты.Добавить("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования"); - ИзменяемыеОбъекты.Добавить("РегистрСведений.ОповещенияПользователейСертификатов"); - Если Метаданные.РегистрыСведений.Найти("ЗаявленияНаВыпускСертификата") <> Неопределено Тогда - ИзменяемыеОбъекты.Добавить("РегистрСведений.ЗаявленияНаВыпускСертификата"); - КонецЕсли; - Обработчик.ИзменяемыеОбъекты = СтрСоединить(ИзменяемыеОбъекты, ","); - Обработчик.БлокируемыеОбъекты = "Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования"; - Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; - - Если Метаданные.Обработки.Найти("ПрограммыЭлектроннойПодписиИШифрования") <> Неопределено Тогда - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "3.1.6.69"; - Обработчик.Комментарий = НСтр("ru = 'Обновление справочника Программы электронной подписи и шифрования.'"); - Обработчик.Процедура = "Обработки.ПрограммыЭлектроннойПодписиИШифрования.ОбновитьНаименованиеВстроенногоКриптопровайдера"; - Обработчик.РежимВыполнения = "Оперативно"; - КонецЕсли; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "3.1.6.128"; - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Комментарий = НСтр("ru = 'Заполнение настроек для усовершенствования подписей.'"); - Обработчик.Процедура = "ЭлектроннаяПодписьСлужебный.ЗаполнитьНастройкиДляУсовершенствованияПодписей"; - Обработчик.РежимВыполнения = "Оперативно"; - - // Локализация - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "3.1.6.180"; - Обработчик.Комментарий = НСтр("ru = 'Устанавливает стандартные адреса серверов меток времени ФНС России и Удостоверяющего Центра ООО «Научно-производственный центр ""1С""» для удобной работы с метками доверенного времени в электронной подписи.'"); - Обработчик.Процедура = "ЭлектроннаяПодписьСлужебный.ЗаполнитьАдресаСерверовМетокВремени"; - Обработчик.РежимВыполнения = "Оперативно"; - // Конец Локализация - -КонецПроцедуры - -// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. -Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт - - Библиотека = "СтандартныеПодсистемы"; - - СтароеИмя = "Роль.ИспользованиеЭЦП"; - НовоеИмя = "Роль.ИспользованиеЭП"; - ОбщегоНазначения.ДобавитьПереименование(Итог, "2.2.1.7", СтароеИмя, НовоеИмя, Библиотека); - - СтароеИмя = "Подсистема.СтандартныеПодсистемы.Подсистема.ЭлектроннаяЦифроваяПодпись"; - НовоеИмя = "Подсистема.СтандартныеПодсистемы.Подсистема.ЭлектроннаяПодпись"; - ОбщегоНазначения.ДобавитьПереименование(Итог, "2.2.1.7", СтароеИмя, НовоеИмя, Библиотека); - - СтароеИмя = "Роль.ИспользованиеЭП"; - НовоеИмя = "Роль.ИспользованиеЭлектроннойПодписиИШифрования"; - ОбщегоНазначения.ДобавитьПереименование(Итог, "2.3.1.10", СтароеИмя, НовоеИмя, Библиотека); - - СтароеИмя = "Роль.ИспользованиеЭлектроннойПодписиИШифрования"; - НовоеИмя = "Роль.ДобавлениеИзменениеЭлектронныхПодписейИШифрование"; - ОбщегоНазначения.ДобавитьПереименование(Итог, "2.3.3.2", СтароеИмя, НовоеИмя, Библиотека); - -КонецПроцедуры - -// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиента. -Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт - - Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - НастройкиПодсистемы = Новый Структура; - НастройкиПодсистемы.Вставить("ПерсональныеНастройки", ЭлектроннаяПодпись.ПерсональныеНастройки()); - НастройкиПодсистемы.Вставить("ОбщиеНастройки", ЭлектроннаяПодпись.ОбщиеНастройки()); - НастройкиПодсистемы = Новый ФиксированнаяСтруктура(НастройкиПодсистемы); - Параметры.Вставить("ЭлектроннаяПодпись", НастройкиПодсистемы); - КонецЕсли; - -КонецПроцедуры - -// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. -Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт - - ШаблоныЗаданий.Добавить(Метаданные.РегламентныеЗадания.ПродлениеДостоверностиПодписей.Имя); - -КонецПроцедуры - -// Переопределяет исключения неразделенных данных для подсистемы ТехнологияСервиса -// -// Параметры: -// Исключения - Массив Из ОбъектМетаданных - исключения. -// -Процедура ПриОпределенииИсключенийНеразделенныхДанных(Исключения) Экспорт - - Исключения.Добавить(Метаданные.РегистрыСведений.СпискиОтзываСертификатов); - -КонецПроцедуры - -// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. -Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт - - СоответствиеИменПсевдонимам.Вставить(Метаданные.РегламентныеЗадания.ПродлениеДостоверностиПодписей.ИмяМетода); - - Если Метаданные.Обработки.Найти("ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата") <> Неопределено Тогда - ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата = - ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( - "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата"); - ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) - КонецЕсли; - -КонецПроцедуры - -// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных. -Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт - - // Загрузка в справочник ПрограммыЭлектроннойПодписиИШифрования запрещена. - СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПолноеИмя(), "ПолноеИмя"); - Если СтрокаТаблицы <> Неопределено Тогда - ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); - КонецЕсли; - - // Загрузка в справочник СертификатыКлючейЭлектроннойПодписиИШифрования запрещена. - СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ПолноеИмя(), "ПолноеИмя"); - Если СтрокаТаблицы <> Неопределено Тогда - ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); - КонецЕсли; - -КонецПроцедуры - -// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. -Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт - Объекты.Вставить(Метаданные.Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); - Объекты.Вставить(Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); -КонецПроцедуры - -// См. ПолучениеВнешнихКомпонентВМоделиСервисаПереопределяемый.ПриОпределенииИспользуемыхВерсийВнешнихКомпонент. -Процедура ПриОпределенииИспользуемыхВерсийВнешнихКомпонент(Идентификаторы) Экспорт - - Идентификаторы.Добавить(ЭлектроннаяПодписьСлужебныйКлиентСервер.ОписаниеКомпоненты().ИмяОбъекта); - -КонецПроцедуры - -// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий -Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт - - Если Метаданные.Обработки.Найти("ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата") <> Неопределено Тогда - ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата = - ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( - "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата"); - ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); - КонецЕсли; - - Настройка = Настройки.Добавить(); - Настройка.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ПродлениеДостоверностиПодписей; - Настройка.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьЭлектронныеПодписи; - -КонецПроцедуры - -// См. РаботаСКлассификаторамиПереопределяемый.ПриДобавленииКлассификаторов. -Процедура ПриДобавленииКлассификаторов(Классификаторы) Экспорт - - Если Метаданные.ОбщиеМодули.Найти("ЭлектроннаяПодписьСлужебныйЛокализация") = Неопределено Тогда - Возврат; - КонецЕсли; - - Описание = Неопределено; - Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.РаботаСКлассификаторами") Тогда - МодульРаботаСКлассификаторами = ОбщегоНазначения.ОбщийМодуль("РаботаСКлассификаторами"); - Описание = МодульРаботаСКлассификаторами.ОписаниеКлассификатора(); - КонецЕсли; - Если Описание = Неопределено Тогда - Возврат; - КонецЕсли; - - Описание.Идентификатор = ИдентификаторКлассификатора(); - Описание.Наименование = НСтр("ru = 'Список аккредитованных удостоверяющих центров'"); - Описание.ОбновлятьАвтоматически = Истина; - Описание.ОбщиеДанные = Истина; - Описание.ОбработкаРазделенныхДанных = Ложь; - Описание.СохранятьФайлВКэш = Ложь; - - Классификаторы.Добавить(Описание); - -КонецПроцедуры - -// См. РаботаСКлассификаторамиПереопределяемый.ПриЗагрузкеКлассификатора. -Процедура ПриЗагрузкеКлассификатора(Идентификатор, Версия, Адрес, Обработан, ДополнительныеПараметры) Экспорт - - Если Идентификатор <> ИдентификаторКлассификатора() Тогда - Возврат; - КонецЕсли; - - Если Метаданные.ОбщиеМодули.Найти("ЭлектроннаяПодписьСлужебныйЛокализация") = Неопределено Тогда - Обработан = Истина; - Возврат; - КонецЕсли; - - МодульЭлектроннаяПодписьСлужебныйЛокализация = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебныйЛокализация"); - МодульЭлектроннаяПодписьСлужебныйЛокализация.ЗагрузитьДанныеАккредитованныхУЦ(Версия, Адрес, Обработан, ДополнительныеПараметры); - КонецПроцедуры #КонецОбласти @@ -1016,6 +1312,32 @@ #Область СлужебныеПроцедурыИФункции +Процедура УстановитьВидимостьСсылкиНаИнструкциюПоРаботеСПрограммами(ЭлементИнструкция) Экспорт + + НавигационнаяСсылка = ""; + ЭлектроннаяПодписьКлиентСерверЛокализация.ПриОпределенииСсылкиНаИнструкциюПоРаботеСПрограммами("", НавигационнаяСсылка); + ЭлементИнструкция.Видимость = Не ПустаяСтрока(НавигационнаяСсылка); + +КонецПроцедуры + +Функция ЗаголовокИнформацииДляПоддержки() Экспорт + + Если ВидимостьСсылкиНаИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами() Тогда + Заголовок = СтроковыеФункции.ФорматированнаяСтрока( + НСтр("ru = 'При возникновении затруднений ознакомьтесь со списком <a href = %1>типичных проблем при работе с программой электронной подписи и их решений</a>. + | + |В иных случаях обратитесь в службу поддержки фирмы ""1С"", предоставив <a href = %2>техническую информацию о возникшей проблеме</a>'"), + "ТипичныеПроблемы", "ТехническаяИнформация"); + Иначе + Заголовок = СтроковыеФункции.ФорматированнаяСтрока( + НСтр("ru = 'Обратитесь в службу поддержки фирмы ""1С"", предоставив <a href = %1>техническую информацию о возникшей проблеме</a>'"), + "ТехническаяИнформация"); + КонецЕсли; + + Возврат Заголовок; + +КонецФункции + // Определяет внутренний идентификатор классификатора для подсистемы РаботаСКлассификаторами. // // Возвращаемое значение: @@ -1061,6 +1383,7 @@ // - Структура - см. ЭлектроннаяПодпись.НовоеОписаниеПрограммы // // * АлгоритмПодписи - Строка - если параметр заполнен, возвращает программу с указанным алгоритмом подписи. +// * Автоопределение - Булево - определять установленные программы. // Функция ПараметрыСозданияМенеджераКриптографии() Экспорт @@ -1069,6 +1392,7 @@ ПараметрыСозданияМенеджераКриптографии.Вставить("ПоказатьОшибку", Ложь); ПараметрыСозданияМенеджераКриптографии.Вставить("ОписаниеОшибки", ""); ПараметрыСозданияМенеджераКриптографии.Вставить("АлгоритмПодписи", ""); + ПараметрыСозданияМенеджераКриптографии.Вставить("Автоопределение", Истина); Возврат ПараметрыСозданияМенеджераКриптографии; @@ -1095,11 +1419,11 @@ Программа = ПараметрыСозданияМенеджераКриптографии.Программа; ПоказатьОшибку = ПараметрыСозданияМенеджераКриптографии.ПоказатьОшибку; АлгоритмПодписи = ПараметрыСозданияМенеджераКриптографии.АлгоритмПодписи; - + ИмяКомпьютера = ИмяКомпьютера(); ОписаниеОшибок = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовоеОписаниеОшибок(ИмяКомпьютера); Менеджер = НовыйМенеджерКриптографии(Программа, - ОписаниеОшибок.Ошибки, АлгоритмПодписи, Операция); + ОписаниеОшибок.Ошибки, ПараметрыСозданияМенеджераКриптографии.Автоопределение, АлгоритмПодписи, Операция); Если Менеджер <> Неопределено Тогда Возврат Менеджер; @@ -1128,7 +1452,7 @@ ИначеЕсли Операция <> "" Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка в функции %1. + НСтр("ru = 'Ошибка вызова функции %1. |Неверное значение параметра Операция ""%2"".'"), "МенеджерКриптографии", Операция); ИначеЕсли ТипЗнч(ПараметрыСозданияМенеджераКриптографии.ОписаниеОшибки) = Тип("Структура") @@ -1197,7 +1521,7 @@ ВызватьИсключение; КонецЕсли; ИнформацияОбОшибке = ИнформацияОбОшибке(); - ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Если Не ЗначениеЗаполнено(ПредставлениеОшибки) Тогда @@ -1208,7 +1532,7 @@ ВызватьИсключение; КонецЕсли; ИнформацияОбОшибке = ИнформацияОбОшибке(); - ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; КонецЕсли; @@ -1220,7 +1544,7 @@ ВызватьИсключение; КонецЕсли; ИнформацияОбОшибке = ИнформацияОбОшибке(); - ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; КонецЕсли; @@ -1499,17 +1823,6 @@ КонецПроцедуры -// Только для внутреннего использования. -// -// Параметры: -// ТипПодписи - Перечисление.ТипыПодписиКриптографии - тип подписи, для которого нужно определить доступность настроек. -// -Функция ДоступностьНастроекУсовершенствованияПодписи(ТипПодписи) Экспорт - - Возврат ТипПодписи <> ПредопределенноеЗначение("Перечисление.ТипыПодписиКриптографии.ОбычнаяCMS") - И ТипПодписи <> ПредопределенноеЗначение("Перечисление.ТипыПодписиКриптографии.БазоваяCAdESBES"); -КонецФункции - // Только для внутреннего использования. Процедура ОбновитьСписокСертификатов(Сертификаты, СвойстваСертификатовНаКлиенте, КромеУжеДобавленных, Личные, Ошибка, БезОтбора, ДополнительныеПараметры = Неопределено) Экспорт @@ -1553,20 +1866,38 @@ Ошибка = ПараметрыСоздания.ОписаниеОшибки; Если МенеджерКриптографии <> Неопределено Тогда - МассивСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов( - ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты).ПолучитьВсе(); - - ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатов(ТаблицаСвойствСертификатов, - МассивСертификатов, БезОтбора, ДобавкаВремени(), ТекущаяДатаСеанса()); - - Если Не Личные Тогда + Попытка МассивСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов( - ТипХранилищаСертификатовКриптографии.СертификатыПолучателей).ПолучитьВсе(); - + ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты).ПолучитьВсе(); ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатов(ТаблицаСвойствСертификатов, МассивСертификатов, БезОтбора, ДобавкаВремени(), ТекущаяДатаСеанса()); + Исключение + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Если ТипЗнч(Ошибка) = Тип("Структура") Тогда + Ошибка = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовоеОписаниеОшибок(ИмяКомпьютера()); + Ошибка.ОписаниеОшибки = ОписаниеОшибки; + Иначе + Ошибка = ОписаниеОшибки; + КонецЕсли; + КонецПопытки; + + Если Не Личные Тогда + Попытка + МассивСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов( + ТипХранилищаСертификатовКриптографии.СертификатыПолучателей).ПолучитьВсе(); + ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатов(ТаблицаСвойствСертификатов, + МассивСертификатов, БезОтбора, ДобавкаВремени(), ТекущаяДатаСеанса()); + Исключение + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Если ТипЗнч(Ошибка) = Тип("Структура") Тогда + Ошибка = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовоеОписаниеОшибок(ИмяКомпьютера()); + Ошибка.ОписаниеОшибки = ОписаниеОшибки; + Иначе + Ошибка = ОписаниеОшибки; + КонецЕсли; + КонецПопытки; КонецЕсли; - + КонецЕсли; КонецЕсли; @@ -1660,7 +1991,7 @@ МенеджерКриптографииДляПроверки.ПроверитьСертификат(СертификатДляПроверки, РежимыПроверкиСертификата); Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Возврат ПроверитьСертификатНаКорректностьПовторно(МенеджерКриптографииДляПроверки, СертификатДляПроверки, РежимыПроверкиСертификата, ОписаниеОшибки, ВызыватьИсключение); @@ -1681,7 +2012,7 @@ Если ТипЗнч(МенеджерКриптографииДляПроверки) = Тип("МенеджерКриптографии") Тогда Действия = ЭлектроннаяПодписьСлужебныйПовтИсп.ДействияДляУстраненияОшибки(ОписаниеОшибки); - Если ЗначениеЗаполнено(Действия) И Действия.Найти("УстановкаСпискаОтзываСертификатов") <> Неопределено Тогда + Если ЗначениеЗаполнено(Действия) И Действия.Найти("УстановитьСписокОтзываСертификата") <> Неопределено Тогда ИмяИздателя = НРег(ЭлектроннаяПодпись.СвойстваИздателяСертификата(СертификатДляПроверки).ОбщееИмя); Если ЗначениеЗаполнено(ИмяИздателя) Тогда ИмяИздателя = СтроковыеФункции.СтрокаЛатиницей(ИмяИздателя); @@ -1705,7 +2036,7 @@ НСтр("ru = 'Электронная подпись.Обновление списков отзыва'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат Ложь; КонецПопытки; @@ -1715,7 +2046,7 @@ МенеджерКриптографииДляПроверки.ПроверитьСертификат(СертификатДляПроверки, РежимыПроверкиСертификата); Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Если ВызыватьИсключение Тогда ВызватьИсключение; @@ -1763,6 +2094,19 @@ КонецЕсли; ОписанияПрограмм = ЭлектроннаяПодпись.ОбщиеНастройки().ОписанияПрограмм; + ПрограммаПоСертификатуРезультат = ПрограммаПоСертификату( + Контекст.ДанныеСертификата, Истина); + + Если ЗначениеЗаполнено(ПрограммаПоСертификатуРезультат.Программа) Тогда + ОписанияПрограмм = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииОписанияПрограмм( + ПрограммаПоСертификатуРезультат.Программа, Контекст.ОшибкаНаСервере.Ошибки, ОписанияПрограмм); + Иначе + + ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииДобавитьОшибку( + Контекст.ОшибкаНаСервере.Ошибки, Неопределено, ПрограммаПоСертификатуРезультат.Ошибка, Истина); + + КонецЕсли; + СертификатКриптографии = Новый СертификатКриптографии(Контекст.ДанныеСертификата); ЭтоПолноправныйПользователь = Пользователи.ЭтоПолноправныйПользователь(,, Ложь); @@ -1927,13 +2271,22 @@ Ошибка = ПараметрыСоздания.ОписаниеОшибки; Если МенеджерКриптографии <> Неопределено Тогда - - МассивСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов( - ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты).ПолучитьВсе(); - - Для Каждого Элемент Из МассивСертификатов Цикл - СписокСертификатов.Добавить(Base64Строка(Элемент.Отпечаток)); - КонецЦикла; + + Попытка + МассивСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов( + ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты).ПолучитьВсе(); + Для Каждого Элемент Из МассивСертификатов Цикл + СписокСертификатов.Добавить(Base64Строка(Элемент.Отпечаток)); + КонецЦикла; + Исключение + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Если ТипЗнч(Ошибка) = Тип("Структура") Тогда + Ошибка = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовоеОписаниеОшибок(ИмяКомпьютера()); + Ошибка.ОписаниеОшибки = ОписаниеОшибки; + Иначе + Ошибка = ОписаниеОшибки; + КонецЕсли; + КонецПопытки; КонецЕсли; @@ -2005,9 +2358,11 @@ Элементы.Комментарий.Видимость = Параметры.ПоказатьКомментарий И Не Форма.БезПодтверждения; КонецЕсли; - ЗаполнитьСуществующиеСертификатыПользователя(Форма.СертификатСписокВыбора, - Параметры.ОтпечаткиСертификатовНаКлиенте, Форма.ОтборСертификатов, - Форма.ОтборОтпечатков, Расшифровка, Форма.ВыполнятьНаСервере); + Если Не Шифрование Тогда + ЗаполнитьСуществующиеСертификатыПользователя(Форма.СертификатСписокВыбора, + Параметры.ОтпечаткиСертификатовНаКлиенте, Форма.ОтборСертификатов, + Форма.ОтборОтпечатков, Расшифровка, Форма.ВыполнятьНаСервере); + КонецЕсли; Сертификат = Неопределено; @@ -2028,7 +2383,7 @@ КонецЕсли; КонецЕсли; - Если ТипЗнч(Форма.ОтборСертификатов) = Тип("СписокЗначений") Тогда + Если Не Шифрование И ТипЗнч(Форма.ОтборСертификатов) = Тип("СписокЗначений") Тогда Если Форма.СертификатСписокВыбора.Количество() = 0 Тогда Сертификат = Неопределено; Иначе @@ -2081,7 +2436,9 @@ // Только для внутреннего использования. Процедура СертификатПриИзмененииНаСервере(Форма, ОтпечаткиСертификатовНаКлиенте, Шифрование = Ложь, Расшифровка = Ложь) Экспорт - Если ТипЗнч(Форма.ОтборСертификатов) <> Тип("СписокЗначений") И ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда + Если (ТипЗнч(Форма.ОтборСертификатов) <> Тип("СписокЗначений") + Или ТипЗнч(Форма.ОтборСертификатов) = Тип("СписокЗначений") И Форма.ОтборСертификатов.Количество() = 0) + И ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда Если Шифрование Тогда ХранилищеОбщихНастроек.Сохранить("Криптография", "СертификатДляШифрования", Форма.Сертификат); @@ -2193,9 +2550,10 @@ Процедура ЗаписатьСертификатВСправочник(Форма, Программа = Неопределено, ДляШифрования = Ложь) Экспорт ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("Наименование", Форма.СертификатНаименование); - ДополнительныеПараметры.Вставить("Пользователь", Форма.СертификатПользователь); - ДополнительныеПараметры.Вставить("Организация", Форма.СертификатОрганизация); + ДополнительныеПараметры.Вставить("Наименование", Форма.СертификатНаименование); + ДополнительныеПараметры.Вставить("Пользователь", Форма.СертификатПользователь); + ДополнительныеПараметры.Вставить("Организация", Форма.СертификатОрганизация); + ДополнительныеПараметры.Вставить("ФизическоеЛицо", Форма.СертификатФизическоеЛицо); Если Не ДляШифрования Тогда ДополнительныеПараметры.Вставить("Программа", Программа); @@ -2205,9 +2563,10 @@ Если Не ЗначениеЗаполнено(Форма.Сертификат) Тогда ПропускаемыеРеквизиты = Новый Соответствие; - ПропускаемыеРеквизиты.Вставить("Ссылка", Истина); - ПропускаемыеРеквизиты.Вставить("Наименование", Истина); - ПропускаемыеРеквизиты.Вставить("Организация", Истина); + ПропускаемыеРеквизиты.Вставить("Ссылка", Истина); + ПропускаемыеРеквизиты.Вставить("Наименование", Истина); + ПропускаемыеРеквизиты.Вставить("Организация", Истина); + ПропускаемыеРеквизиты.Вставить("ФизическоеЛицо", Истина); ПропускаемыеРеквизиты.Вставить("ВводитьПарольВПрограммеЭлектроннойПодписи", Истина); Если Не ДляШифрования И Форма.ЛичныйСписокПриДобавлении Тогда ПропускаемыеРеквизиты.Вставить("Пользователь", Истина); @@ -2305,20 +2664,24 @@ НСтр("ru = 'Электронная подпись.Удаление временного файла'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; - Если Текст.КоличествоСтрок() < 3 - Или Текст.ПолучитьСтроку(1) <> "-----BEGIN CERTIFICATE-----" - Или Текст.ПолучитьСтроку(Текст.КоличествоСтрок()) <> "-----END CERTIFICATE-----" Тогда + Если СтрНачинаетсяС(Текст.ПолучитьСтроку(1), "MII") Тогда + СтрокаBase64 = Текст.ПолучитьТекст(); + Иначе + Если Текст.КоличествоСтрок() < 3 + Или Текст.ПолучитьСтроку(1) <> "-----BEGIN CERTIFICATE-----" + Или Текст.ПолучитьСтроку(Текст.КоличествоСтрок()) <> "-----END CERTIFICATE-----" Тогда + + Возврат Неопределено; + КонецЕсли; - Возврат Неопределено; + Текст.УдалитьСтроку(1); + Текст.УдалитьСтроку(Текст.КоличествоСтрок()); + СтрокаBase64 = Текст.ПолучитьТекст(); КонецЕсли; - Текст.УдалитьСтроку(1); - Текст.УдалитьСтроку(Текст.КоличествоСтрок()); - СтрокаBase64 = Текст.ПолучитьТекст(); - Попытка ДанныеСертификата = Base64Значение(СтрокаBase64); Исключение @@ -2525,8 +2888,8 @@ ЭлектроннаяПодпись.ОбновитьПодпись(СвойстваПодписи.ПодписанныйОбъект, СвойстваПодписи, Истина); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ПредставлениеОшибки = НСтр("ru = 'При записи подписи возникла ошибка:'") - + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПредставлениеОшибки = НСтр("ru = 'Не удалось записать подписи по причине:'") + + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Возврат ПредставлениеОшибки; @@ -2555,8 +2918,8 @@ ТипПодписи = ТипПодписиСервиса(СвойстваПодписи[0].ТипПодписи); Исключение Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Ошибка при чтении данных подписи для усовершенствования в приложении в Интернете: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + НСтр("ru='Не удалось усовершенствовать подпись в приложении в Интернете по причине: + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат Результат; КонецПопытки; @@ -2596,7 +2959,7 @@ ЭлектроннаяПодписьСлужебныйКлиентСервер.СведенияОСертификатеСтрокой(СвойстваСертификата); Результат.СвойстваПодписи.СрокДействияПоследнейМеткиВремени = СвойстваСертификата.ДатаОкончания; Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Ошибка при проверке сертификата в приложении в Интернете, подробности см. в журнале регистрации: + НСтр("ru='Не удалось проверить сертификат в приложении в Интернете, подробности см. в журнале регистрации: |%1'"), СведенияОСертификате); Возврат Результат; @@ -2715,7 +3078,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); Результат.ТекстОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ЗаголовокОшибкиПолученияДанных("ПродлениеСрокаДействияПодписи") - + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); Возврат Результат; КонецПопытки; КонецЕсли; @@ -2946,14 +3309,9 @@ ДвоичныеДанные = Base64Значение(СертификатКриптографииBase64); - ДатаПодписания = ЭлектроннаяПодпись.ДатаПодписания(ДвоичныеДанные); - Если Не ЗначениеЗаполнено(ДатаПодписания) Тогда - ДатаПодписания = Неопределено; - КонецЕсли; - ВозвращаемоеЗначение = Новый Структура; ВозвращаемоеЗначение.Вставить("Сертификат", Новый СертификатКриптографии(ДвоичныеДанные)); - ВозвращаемоеЗначение.Вставить("ДатаПодписания", ДатаПодписания); + ВозвращаемоеЗначение.Вставить("ДатаПодписания", Неопределено); Возврат ВозвращаемоеЗначение; Иначе @@ -3161,8 +3519,8 @@ ЭлектроннаяПодписьСлужебныйКлиентСервер.ИдентификаторыАлгоритмовХешированияИОткрытогоКлюча(); Исключение ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При установке свойства %1 компоненты %2 произошла ошибка:'"), "СоответствиеOID", "ExtraCryptoAPI") - + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + НСтр("ru = 'Не удалось установить свойство %1 компоненты %2 по причине: + |%3'"), "СоответствиеOID", "ExtraCryptoAPI", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение ТекстОшибки; КонецПопытки; @@ -3217,21 +3575,89 @@ КонецФункции +// Установленные криптопровайдеры. +// +// Возвращаемое значение: +// Структура: +// * ПроверкаВыполнена - Булево +// * Ошибка - Строка - если ПроверкаВыполнена = Ложь +// * Криптопровайдеры - Массив из Структура: +// ** Ссылка - Неопределено, СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования +// ** Представление - Строка +// ** ИмяПрограммы - Строка +// ** ТипПрограммы - Число +// ** АлгоритмПодписи - Строка +// ** АлгоритмХеширования - Строка +// ** АлгоритмШифрования - Строка +// ** Идентификатор - Строка +// ** ПутьКПрограмме - Строка +// ** Версия - Строка - версия библиотеки +// ** Лицензия - Булево - есть ли лицензия к программе +// ** Автоопределение - Истина +// +Функция УстановленныеКриптопровайдеры(ОбъектКомпоненты = Неопределено) Экспорт + + Результат = Новый Структура; + Результат.Вставить("ПроверкаВыполнена", Ложь); + Результат.Вставить("Криптопровайдеры", Новый Массив); + Результат.Вставить("Ошибка", ""); + + Настройки = ЭлектроннаяПодпись.ОбщиеНастройки(); + + Попытка + Если ОбъектКомпоненты = Неопределено Тогда + ОбъектКомпоненты = ОбъектВнешнейКомпонентыExtraCryptoAPI(); + КонецЕсли; + РезультатСписок = ОбъектКомпоненты.ПолучитьСписокКриптопровайдеров(); + ПрограммыПоИменамСТипом = Настройки.ПрограммыПоИменамСТипом; + УстановленныеКриптопровайдеры = ЭлектроннаяПодписьСлужебныйКлиентСервер.УстановленныеКриптопровайдерыИзОтветаКомпоненты( + РезультатСписок, ПрограммыПоИменамСТипом, Ложь); + Результат.ПроверкаВыполнена = Истина; + Результат.Криптопровайдеры = УстановленныеКриптопровайдеры; + Исключение + Результат.ПроверкаВыполнена = Ложь; + Результат.Ошибка = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; + + Возврат Результат; + +КонецФункции + Функция СвойстваКриптопровайдера(МенеджерКриптографии) ИнформацияМодуляКриптографии = МенеджерКриптографии.ПолучитьИнформациюМодуляКриптографии(); ИмяКриптопровайдера = ИнформацияМодуляКриптографии.Имя; + + ОписаниеОшибки = ""; + КриптопровайдерыРезультат = ЭлектроннаяПодписьСлужебныйПовтИсп.УстановленныеКриптопровайдеры(); + ПрограммыАвто = ЭлектроннаяПодписьСлужебныйКлиентСервер.РезультатПоискаКриптопровайдеров(КриптопровайдерыРезультат, ИмяКомпьютера()); + + Если ТипЗнч(ПрограммыАвто) = Тип("Строка") Тогда + ОписаниеОшибки = ПрограммыАвто; + ПрограммыАвто = Неопределено; + КонецЕсли; + ОписаниеПрограммы = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОписаниеПрограммыПоИмениКриптопровайдера(ИмяКриптопровайдера, - ЭлектроннаяПодпись.ОбщиеНастройки().ОписанияПрограмм); // см. ЭлектроннаяПодписьСлужебныйПовтИсп.ОписаниеПрограммы + ЭлектроннаяПодпись.ОбщиеНастройки().ОписанияПрограмм, ПрограммыАвто); // см. ЭлектроннаяПодписьСлужебныйПовтИсп.ОписаниеПрограммы Если ОписаниеПрограммы = Неопределено Тогда - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось определить тип криптопровайдера %1'"), ИмяКриптопровайдера); + Если Не ПустаяСтрока(ОписаниеОшибки) Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось определить тип криптопровайдера %1. %2'"), ИнформацияМодуляКриптографии.Имя, ОписаниеОшибки); + Иначе + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось определить тип криптопровайдера %1'"), ИнформацияМодуляКриптографии.Имя); + КонецЕсли; ВызватьИсключение ТекстОшибки; КонецЕсли; - ОписаниеПути = ПутьКПрограмме(ОписаниеПрограммы.Ссылка); + Если ОписаниеПрограммы.Свойство("Автоопределение") Тогда + ОписаниеПути = Новый Структура("ПутьКПрограмме, Существует, ТекстОшибки", ОписаниеПрограммы.ПутьКПрограммеАвто, Истина, ""); + Иначе + ОписаниеПути = ПутьКПрограмме(ОписаниеПрограммы.Ссылка); + КонецЕсли; + Если ЗначениеЗаполнено(ОписаниеПути.ТекстОшибки) Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось определить путь к программе электронной подписи @@ -3255,7 +3681,7 @@ КанонизированныйТекстXML = ОбъектКомпоненты.C14N(КонвертXML, XPath); Исключение ТекстОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("C14N", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение ТекстОшибки; КонецПопытки; @@ -3319,7 +3745,7 @@ Алгоритм.Версия, Алгоритм.СКомментариями); Исключение ТекстОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("C14N_body", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение ТекстОшибки; КонецПопытки; @@ -3339,7 +3765,7 @@ КанонизированныйТекстXML = ОбъектКомпоненты.TransformSMEV(ТекстXML); Исключение ТекстОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("TransformSMEV", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение ТекстОшибки; КонецПопытки; @@ -3362,7 +3788,7 @@ ТипКриптопровайдера); Исключение ТекстОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("Hash", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение ТекстОшибки; КонецПопытки; @@ -3389,7 +3815,7 @@ ПарольДоступаКЗакрытомуКлючу); Исключение ТекстОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("Sign", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение ТекстОшибки; КонецПопытки; @@ -3414,7 +3840,7 @@ ТипКриптопровайдера); Исключение ТекстОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("VerifySign", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение ТекстОшибки; КонецПопытки; @@ -3445,7 +3871,7 @@ ПараметрыКомпоненты.ВключениеСертификатовВПодпись); Исключение ТекстОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("CMSSign", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение ТекстОшибки; КонецПопытки; @@ -3467,7 +3893,7 @@ ПараметрыCMS.Открепленная, Данные, ТипКриптопровайдера, Сертификат); Исключение ТекстОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("CMSVerifySign", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение ТекстОшибки; КонецПопытки; @@ -3596,20 +4022,38 @@ Отпечатки = Новый Соответствие; ПредставленияОтпечатков = Новый Соответствие; - Для каждого Описание Из Параметры.СертификатыШифрования Цикл + ЗашифрованныеОбъекты = Новый Массив; + + Для Каждого Описание Из Параметры.СертификатыШифрования Цикл Если Описания[Описание] <> Неопределено Тогда Продолжить; КонецЕсли; Описания.Вставить(Описание, Истина); - Сертификаты = СертификатыШифрованияИзОписания(Описание); - + + Если ТипЗнч(Описание) = Тип("Строка") Тогда + Сертификаты = ПолучитьИзВременногоХранилища(Описание); + Для Каждого Свойства Из Сертификаты Цикл + Значение = Отпечатки[Свойства.Отпечаток]; + Значение = ?(Значение = Неопределено, 1, Значение + 1); + Отпечатки.Вставить(Свойства.Отпечаток, Значение); + ПредставленияОтпечатков.Вставить(Свойства.Отпечаток, Свойства.Представление); + КонецЦикла; + Иначе + ЗашифрованныеОбъекты.Добавить(Описание); + КонецЕсли; + + КонецЦикла; + + Если ЗашифрованныеОбъекты.Количество() > 0 Тогда + Сертификаты = СертификатыШифрованияИзОписания(ЗашифрованныеОбъекты); Для каждого Свойства Из Сертификаты Цикл Значение = Отпечатки[Свойства.Отпечаток]; Значение = ?(Значение = Неопределено, 1, Значение + 1); Отпечатки.Вставить(Свойства.Отпечаток, Значение); ПредставленияОтпечатков.Вставить(Свойства.Отпечаток, Свойства.Представление); КонецЦикла; - КонецЦикла; + КонецЕсли; + КоличествоЭлементовДанных = Параметры.СертификатыШифрования.Количество(); Для каждого КлючИЗначение Из Отпечатки Цикл Если КлючИЗначение.Значение = КоличествоЭлементовДанных Тогда @@ -3649,9 +4093,15 @@ |ИЗ | РегистрСведений.СертификатыШифрования КАК СертификатыШифрования |ГДЕ - | СертификатыШифрования.ЗашифрованныйОбъект = &ЗашифрованныйОбъект"; + | СертификатыШифрования.ЗашифрованныйОбъект В (&ЗашифрованныеОбъекты)"; + + Если ТипЗнч(Описание) <> Тип("Массив") Тогда + ЗашифрованныеОбъекты = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Описание); + Иначе + ЗашифрованныеОбъекты = Описание; + КонецЕсли; - Запрос.УстановитьПараметр("ЗашифрованныйОбъект", Описание); + Запрос.УстановитьПараметр("ЗашифрованныеОбъекты", ЗашифрованныеОбъекты); РезультатЗапроса = Запрос.Выполнить(); @@ -3699,10 +4149,15 @@ Если МенеджерКриптографии <> Неопределено Тогда ТипХранилища = ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты; - МассивСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилища).ПолучитьВсе(); - ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьОтпечаткиСертификатов(ОтпечаткиСертификатовНаКлиенте, - МассивСертификатов, ДобавкаВремени(), ТекущаяДатаСеанса); + Попытка + МассивСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилища).ПолучитьВсе(); + ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьОтпечаткиСертификатов(ОтпечаткиСертификатовНаКлиенте, + МассивСертификатов, ДобавкаВремени(), ТекущаяДатаСеанса); + Исключение // АПК:280 + // Исключение не обрабатываем т.к. ошибка отображается в форме подбора сертификатов. + КонецПопытки; + КонецЕсли; КонецЕсли; @@ -3808,8 +4263,7 @@ |ИЗ | Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК Сертификаты |ГДЕ - | Сертификаты.Программа <> ЗНАЧЕНИЕ(Справочник.ПрограммыЭлектроннойПодписиИШифрования.ПустаяСсылка) - | И Сертификаты.Отозван = ЛОЖЬ + | Сертификаты.Отозван = ЛОЖЬ | И Сертификаты.Отпечаток В(&Отпечатки) | И ИСТИНА |; @@ -3875,11 +4329,11 @@ Сертификат = Форма.Сертификат; Форма.Сертификат = Неопределено; ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При получении данных сертификата ""%1"" - |из информационной базы возникла ошибка: + НСтр("ru = 'Не удалось получить данные сертификата ""%1"" + |по причине: |%2'"), Сертификат, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; ЭтоВстроенныйКриптопровайдер = ЗначенияРеквизитов.Программа = ВстроенныйКриптопровайдер(); @@ -3923,8 +4377,23 @@ Возврат; КонецЕсли; + Если Не ЗначениеЗаполнено(Форма.СертификатПрограмма) Тогда + ПрограммаПоСертификатуРезультат = ПрограммаПоСертификату(Форма.СертификатАдрес); + Если ПрограммаПоСертификатуРезультат.Программа = Неопределено Тогда + ТекстОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТекстОшибкиНеУдалосьОпределитьПрограмму( + ПрограммаПоСертификатуРезультат.Ошибка); + Форма.СертификатНаСервереОписаниеОшибки.Вставить("ОписаниеОшибки", ТекстОшибки); + Возврат; + ИначеЕсли ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Форма, "ПрограммаАвтоНаСервере") Тогда + Форма.ПрограммаАвтоНаСервере = ПрограммаПоСертификатуРезультат.Программа; + КонецЕсли; + Программа = ПрограммаПоСертификатуРезультат.Программа; + Иначе + Программа = Форма.СертификатПрограмма; + КонецЕсли; + ПолучитьСертификатПоОтпечатку(Форма.СертификатОтпечаток, - Истина, Ложь, Форма.СертификатПрограмма, Форма.СертификатНаСервереОписаниеОшибки); + Истина, Ложь, Программа, Форма.СертификатНаСервереОписаниеОшибки); КонецПроцедуры @@ -3933,10 +4402,46 @@ КонецФункции // Для функции МенеджерКриптографии. -Функция НовыйМенеджерКриптографии(Программа, Ошибки, АлгоритмПодписи = "", Операция = "") +Функция НовыйМенеджерКриптографии(Программа, Ошибки, Автоопределение, АлгоритмПодписи = "", Операция = "") + + ПрограммыАвто = Неопределено; + + Если ТипЗнч(Программа) = Тип("Строка") Или ТипЗнч(Программа) = Тип("ДвоичныеДанные") Тогда + + ОписаниеОшибки = ""; + ТребуетсяЗакрытыйКлюч = Операция = "Подписание" + Или Операция = "Расшифровка"; + ЗаполнитьПараметрыДляСозданияМенеджераКриптографии(Программа, АлгоритмПодписи, ОписаниеОшибки, ТребуетсяЗакрытыйКлюч); + + Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда + СвойстваОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовыеСвойстваОшибки(); + СвойстваОшибки.Описание = ОписаниеОшибки; + Ошибки.Добавить(СвойстваОшибки); + + Если Программа = Неопределено И ТребуетсяЗакрытыйКлюч Тогда + Возврат Неопределено; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + Если Автоопределение И ТипЗнч(Программа) <> Тип("Структура") И ТипЗнч(Программа) <> Тип("ФиксированнаяСтруктура") Тогда + + КриптопровайдерыРезультат = ЭлектроннаяПодписьСлужебныйПовтИсп.УстановленныеКриптопровайдеры(); + ПрограммыАвто = ЭлектроннаяПодписьСлужебныйКлиентСервер.РезультатПоискаКриптопровайдеров( + КриптопровайдерыРезультат, ИмяКомпьютера()); + + Если ТипЗнч(ПрограммыАвто) = Тип("Строка") Тогда + СвойстваОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовыеСвойстваОшибки(); + СвойстваОшибки.Описание = ПрограммыАвто; + Ошибки.Добавить(СвойстваОшибки); + ПрограммыАвто = Неопределено; + КонецЕсли; + + КонецЕсли; ОписанияПрограмм = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииОписанияПрограмм( - Программа, Ошибки, ЭлектроннаяПодпись.ОбщиеНастройки().ОписанияПрограмм); + Программа, Ошибки, ЭлектроннаяПодпись.ОбщиеНастройки().ОписанияПрограмм, ПрограммыАвто); Если ОписанияПрограмм = Неопределено Тогда Возврат Неопределено; @@ -3958,11 +4463,22 @@ КонецЕсли; КонецЕсли; - ИдентификаторПутиКПрограмме = ?(ЗначениеЗаполнено(ОписаниеПрограммы.Ссылка), - ОписаниеПрограммы.Ссылка, ОписаниеПрограммы.Идентификатор); + Если ОписаниеПрограммы.Свойство("Автоопределение") Тогда + + СвойстваПрограммы = Новый Структура; + СвойстваПрограммы.Вставить("ИмяПрограммы", ОписаниеПрограммы.ИмяПрограммы); + СвойстваПрограммы.Вставить("ПутьКПрограмме", ОписаниеПрограммы.ПутьКПрограммеНаСервереАвто); + СвойстваПрограммы.Вставить("ТипПрограммы", ОписаниеПрограммы.ТипПрограммы); + + Иначе + + ИдентификаторПутиКПрограмме = ?(ЗначениеЗаполнено(ОписаниеПрограммы.Ссылка), + ОписаниеПрограммы.Ссылка, ОписаниеПрограммы.Идентификатор); - СвойстваПрограммы = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииСвойстваПрограммы( - ОписаниеПрограммы, ЭтоLinux, Ошибки, Истина, ПутьКПрограмме(ИдентификаторПутиКПрограмме)); + СвойстваПрограммы = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииСвойстваПрограммы( + ОписаниеПрограммы, ЭтоLinux, Ошибки, Истина, ПутьКПрограмме(ИдентификаторПутиКПрограмме)); + + КонецЕсли; Если СвойстваПрограммы = Неопределено Тогда Продолжить; @@ -3975,7 +4491,7 @@ СвойстваПрограммы.ТипПрограммы); Исключение ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииДобавитьОшибку(Ошибки, - ОписаниеПрограммы.Ссылка, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), + ОписаниеПрограммы.Ссылка, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), Истина, Истина, Истина); Продолжить; КонецПопытки; @@ -4007,7 +4523,7 @@ СвойстваПрограммы.ТипПрограммы); Исключение ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииДобавитьОшибку(Ошибки, - ОписаниеПрограммы.Ссылка, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), + ОписаниеПрограммы.Ссылка, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), Истина, Истина, Истина); Продолжить; КонецПопытки; @@ -4026,6 +4542,132 @@ КонецФункции +// Для функции НовыйМенеджерКриптографии. +Процедура ЗаполнитьПараметрыДляСозданияМенеджераКриптографии(Программа, АлгоритмПодписи, ОписаниеОшибки, ТребуетсяЗакрытыйКлюч) + + Данные = Программа; + + Попытка + + ТипДанных = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОпределитьТипДанных(Данные); + + Исключение + + Программа = Неопределено; + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось определить программу для переданных данных: %1'"), + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат; + КонецПопытки; + + Если ТипДанных = "Сертификат" Тогда + + ПрограммаПоСертификатуРезультат = ПрограммаПоСертификату(Данные, ТребуетсяЗакрытыйКлюч); + Если ЗначениеЗаполнено(ПрограммаПоСертификатуРезультат.Ошибка) Тогда + + ОписаниеОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТекстОшибкиНеУдалосьОпределитьПрограмму( + ПрограммаПоСертификатуРезультат.Ошибка); + АлгоритмПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмПодписиСертификата(Данные); + Программа = Неопределено; + + Иначе + Программа = ПрограммаПоСертификатуРезультат.Программа; + КонецЕсли; + + Возврат; + + ИначеЕсли ТипДанных = "Подпись" Тогда + + Программа = Неопределено; + АлгоритмПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмСформированнойПодписи(Данные); + Возврат; + + ИначеЕсли ТипДанных = "ЗашифрованныеДанные" Тогда + + Программа = Неопределено; + ОписаниеОшибки = НСтр("ru = 'Для определения программы для расшифровки в процедуру должны быть переданы данные сертификата.'"); + Возврат; + + КонецЕсли; + + Программа = Неопределено; + ОписаниеОшибки = НСтр("ru = 'Не удалось определить программу для переданных данных.'"); + +КонецПроцедуры + +Функция ПрограммаПоСертификату(Знач Сертификат, ТребуетсяЗакрытыйКлюч = Неопределено, ОбъектКомпоненты = Неопределено) Экспорт + + Результат = Новый Структура("Программа, Ошибка"); + + Сертификат = СертификатBase64Строка(Сертификат); + + Если ОбъектКомпоненты = Неопределено Тогда + Попытка + ОбъектКомпоненты = ОбъектВнешнейКомпонентыExtraCryptoAPI(); + Исключение + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось подключить компоненту %1 на сервере %2.'"), "ExtraCryptoAPI", ИмяКомпьютера()); + Возврат Результат; + КонецПопытки; + КонецЕсли; + + Если ТребуетсяЗакрытыйКлюч <> Ложь Тогда + + Попытка + СвойстваКриптопровайдера = ОбъектКомпоненты.ПолучитьСвойстваКриптопровайдера(Сертификат); + ТекущийКриптопровайдер = ЭлектроннаяПодписьСлужебныйВызовСервера.ПрочитатьОтветКомпоненты( + СвойстваКриптопровайдера); + Исключение + Результат.Ошибка = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Возврат Результат; + КонецПопытки; + + ПрограммыПоИменамСТипом = ЭлектроннаяПодпись.ОбщиеНастройки().ПрограммыПоИменамСТипом; + РасширенноеОписаниеПрограммы = ЭлектроннаяПодписьСлужебныйКлиентСервер.РасширенноеОписаниеПрограммы( + ТекущийКриптопровайдер, ПрограммыПоИменамСТипом); + + Если РасширенноеОписаниеПрограммы <> Неопределено Тогда + Результат.Программа = РасширенноеОписаниеПрограммы; + Возврат Результат; + ИначеЕсли ТребуетсяЗакрытыйКлюч = Истина И ТекущийКриптопровайдер.Получить("type") <> 0 Тогда + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сертификат связан с программой %1 с типом %2 на сервере %3, настройте ее для использования и выберите в сертификате.'"), + ТекущийКриптопровайдер.Получить("name"), + ТекущийКриптопровайдер.Получить("type"), ИмяКомпьютера()); + Возврат Результат; + КонецЕсли; + + КонецЕсли; + + Если ТребуетсяЗакрытыйКлюч = Истина Тогда + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось определить программу по закрытому ключу сертификата на сервере %1.'"), ИмяКомпьютера()); + Возврат Результат; + КонецЕсли; + + СвойстваСертификатаРасширенные = СвойстваСертификатаРасширенные(Сертификат, ОбъектКомпоненты); + РезультатКриптопровайдеры = ЭлектроннаяПодписьСлужебныйПовтИсп.УстановленныеКриптопровайдеры(); + + Если РезультатКриптопровайдеры.ПроверкаВыполнена Тогда + + Ошибка = ""; + + Результат.Программа = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОпределитьПрограмму( + СвойстваСертификатаРасширенные.СвойстваСертификата, РезультатКриптопровайдеры.Криптопровайдеры, + ЭлектроннаяПодпись.ОбщиеНастройки().ПрограммыПоИдентификаторамАлгоритмовОткрытогоКлюча, Ошибка); + + Если Результат.Программа = Неопределено Тогда + Результат.Ошибка = Ошибка; + КонецЕсли; + + Возврат Результат; + Иначе + Результат.Ошибка = РезультатКриптопровайдеры.Ошибка; + Возврат Результат; + КонецЕсли; + +КонецФункции + Функция ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Экспорт Если Не ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ЭлектроннаяПодписьВМоделиСервиса") Тогда @@ -4090,7 +4732,7 @@ ЗашифрованныеДанные = МенеджерКриптографии.Зашифровать(ДвоичныеДанныеСертификата, СертификатКриптографии); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда @@ -4113,7 +4755,7 @@ ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеРасшифрованныеДанные(РасшифрованныеДанные, ПредставлениеОшибки); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда @@ -4143,7 +4785,7 @@ ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеДанныеПодписи(ДанныеПодписи, ПредставлениеОшибки); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда @@ -4552,6 +5194,163 @@ КонецФункции +// Производит поиск физических лиц по наименованию +// +// Параметры: +// КомуВыдан - Массив из строк +// - Строка +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - Строка - наименование физического лица +// * Значение - Массив из ссылок - ссылки на справочник физические лица, указанный в определяемом типе ФизическоеЛицо +// +Функция ПолучитьФизическиеЛицаПоПолюСертификатаКомуВыдан(КомуВыдан) Экспорт + + ФизическиеЛицаПоФИО = Новый Соответствие; + + ТипыФизическоеЛицо = Метаданные.ОпределяемыеТипы.ФизическоеЛицо.Тип.Типы(); + Если ТипыФизическоеЛицо[0] <> Тип("Строка") Тогда + ФизическоеЛицоПустаяСсылка = Новый (ТипыФизическоеЛицо[0]); + Иначе + Возврат ФизическиеЛицаПоФИО; + КонецЕсли; + + ФизическоеЛицоИмяМетаданных = ОбщегоНазначения.ИмяТаблицыПоСсылке(ФизическоеЛицоПустаяСсылка); + + Запрос = Новый Запрос; + ТекстЗапроса = + "ВЫБРАТЬ + | ФизическиеЛица.Ссылка КАК Ссылка, + | ФизическиеЛица.Наименование КАК Наименование + |ИЗ + | Справочник.Пользователи КАК ФизическиеЛица + |ГДЕ + | ФизическиеЛица.Наименование В(&КомуВыдан) + |ИТОГИ ПО + | Наименование"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Справочник.Пользователи", ФизическоеЛицоИмяМетаданных); + + Запрос.УстановитьПараметр("КомуВыдан", КомуВыдан); + + Запрос.Текст = ТекстЗапроса; + РезультатЗапроса = Запрос.Выполнить(); + + ВыборкаНаименование = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + + Пока ВыборкаНаименование.Следующий() Цикл + + Выборка = ВыборкаНаименование.Выбрать(); + ФизическиеЛица = Новый Массив; + + Пока Выборка.Следующий() Цикл + ФизическиеЛица.Добавить(Выборка.Ссылка); + КонецЦикла; + + ФизическиеЛицаПоФИО.Вставить(ВыборкаНаименование.Наименование, ФизическиеЛица); + + КонецЦикла; + + Возврат ФизическиеЛицаПоФИО; + +КонецФункции + +// Для процедуры НастроитьФормуОбщихНастроек. +Процедура УстановитьЗаголовокПодсказкиУсовершенствования(Форма, ТипПодписи) + + Элементы = Форма.Элементы; + + Если ЗначениеЗаполнено(ТипПодписи) Тогда + + Элементы.ГруппаУсовершенствоватьПодписи.Доступность = + ТипПодписи <> ПредопределенноеЗначение("Перечисление.ТипыПодписиКриптографии.ОбычнаяCMS") + И ТипПодписи <> ПредопределенноеЗначение("Перечисление.ТипыПодписиКриптографии.БазоваяCAdESBES"); + + Если Элементы.ГруппаУсовершенствоватьПодписи.Доступность Тогда + + Элементы.ДекорацияУсовершенствованиеРасширеннаяПодсказка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Подписи, добавленные ранее и полученные извне, будут усовершенствованы для длительного хранения до выбранного типа: %1.'"), + ТипПодписи); + + Иначе + Элементы.ДекорацияУсовершенствованиеРасширеннаяПодсказка.Заголовок = + НСтр("ru = 'Подписи, добавленные ранее и полученные извне, будут усовершенствованы для длительного хранения до выбранного типа.'"); + КонецЕсли; + + Иначе + Элементы.ДекорацияУсовершенствованиеРасширеннаяПодсказка.Заголовок = + НСтр("ru = 'Не выбран тип подписи для документов.'"); + Элементы.ГруппаУсовершенствоватьПодписи.Доступность = Ложь; + КонецЕсли; + +КонецПроцедуры + +// Для процедуры НастроитьФормуОбщихНастроек. +Процедура УстановитьЗаголовокЭлектроннаяПодписьНаСервере(Форма) + + Если ОбщегоНазначения.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + ИнформационнаяБазаФайловая = ОбщегоНазначения.ИнформационнаяБазаФайловая(); + + НаборКонстант = Форма.НаборКонстант; + Элементы = Форма.Элементы; + + Если НаборКонстант.ИспользоватьЭлектронныеПодписи Тогда + ЗаголовокФлажка = НСтр("ru = 'Проверять подписи и сертификаты на сервере'"); + ПодсказкаФлажка = + НСтр("ru = 'Позволяет не устанавливать программу электронной подписи на компьютер пользователя для проверки электронных подписей и сертификатов.'"); + Иначе + ЗаголовокФлажка = НСтр("ru = 'Проверять сертификаты на сервере'"); + ПодсказкаФлажка = + НСтр("ru = 'Позволяет не устанавливать программу электронной подписи на компьютер пользователя для проверки сертификатов.'"); + КонецЕсли; + + Элементы.ПроверятьЭлектронныеПодписиНаСервере.Заголовок = ЗаголовокФлажка; + + Если ИнформационнаяБазаФайловая Тогда + ПодсказкаНаСервере = НСтр("ru = 'Важно: на компьютер, где работает веб-сервер, подключенный к файловой информационной базе, должна быть установлена хотя бы одна <a href=%1>программа электронной подписи</a> из списка.'"); + Иначе + ПодсказкаНаСервере = НСтр("ru = 'Важно: на каждый компьютер, где работает сервер 1С:Предприятия, должна быть установлена хотя бы одна <a href=%1>программа электронной подписи</a> из списка.'"); + КонецЕсли; + + ПодсказкаФлажка = ПодсказкаФлажка + Символы.ПС + Символы.ПС + ПодсказкаНаСервере; + + Элементы.ПроверятьЭлектронныеПодписиНаСервереРасширеннаяПодсказка.Заголовок = + СтроковыеФункции.ФорматированнаяСтрока(ПодсказкаФлажка, "Программа"); + + Если Не НаборКонстант.ИспользоватьЭлектронныеПодписи Тогда + ЗаголовокФлажка = НСтр("ru = 'Шифровать и расшифровывать на сервере'"); + ПодсказкаФлажка = + НСтр("ru = 'Позволяет не устанавливать программу электронной подписи и сертификат на компьютер пользователя для шифрования и расшифровки.'"); + + ИначеЕсли Не НаборКонстант.ИспользоватьШифрование Тогда + ЗаголовокФлажка = НСтр("ru = 'Подписывать на сервере'"); + ПодсказкаФлажка = + НСтр("ru = 'Позволяет не устанавливать программу электронной подписи и сертификат на компьютер пользователя для подписания.'"); + Иначе + ЗаголовокФлажка = НСтр("ru = 'Подписывать и шифровать на сервере'"); + ПодсказкаФлажка = + НСтр("ru = 'Позволяет не устанавливать программу электронной подписи и сертификат на компьютер пользователя для подписания, шифрования и расшифровки.'"); + КонецЕсли; + + Элементы.СоздаватьЭлектронныеПодписиНаСервере.Заголовок = ЗаголовокФлажка; + + Если ИнформационнаяБазаФайловая Тогда + ПодсказкаНаСервере = НСтр("ru = 'Важно: на компьютер, где работает веб-сервер, подключенный к файловой информационной базе, должна быть установлена <a href=%1>программа электронной подписи</a> и <a href=%2>сертификат</a> с закрытым ключом.'"); + Иначе + ПодсказкаНаСервере = НСтр("ru = 'Важно: на каждый компьютер, где работает сервер 1С:Предприятия, должна быть установлена <a href=%1>программа электронной подписи</a> и <a href=%2>сертификат</a> с закрытым ключом.'"); + КонецЕсли; + + ПодсказкаФлажка = ПодсказкаФлажка + Символы.ПС + Символы.ПС + ПодсказкаНаСервере; + + Элементы.СоздаватьЭлектронныеПодписиНаСервереРасширеннаяПодсказка.Заголовок = + СтроковыеФункции.ФорматированнаяСтрока(ПодсказкаФлажка, "Программы", "Сертификаты"); + +КонецПроцедуры + #Область СвойстваКонвертаXML Функция ОбработатьУзелSignedInfo(УзелSignedInfo, СвойстваКонвертаXML) @@ -5300,20 +6099,6 @@ #Область КлассификаторОшибокКриптографии -// Ошибка по классификатору. -// -// Параметры: -// ТекстДляПоискаВКлассификаторе - Строка -// ОшибкаНаСервере - Булево -// -// Возвращаемое значение: -// Неопределено, Структура - Ошибка по классификатору: -// * Ссылка - Строка -// * Причина - Строка -// * Решение - Строка -// * СпособУстранения - Строка -// * ДействияДляУстранения - Массив, Неопределено -// Функция ОшибкаПоКлассификатору(ТекстДляПоискаВКлассификаторе, ОшибкаНаСервере = Ложь) Экспорт Возврат ЭлектроннаяПодписьСлужебныйПовтИсп.ОшибкаПоКлассификатору( @@ -5333,7 +6118,7 @@ Попытка ТекстОшибки = МодульЭлектроннаяПодписьСлужебныйЛокализация.ОбновитьКлассификатор(); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Если ЗначениеЗаполнено(ТекстОшибки) Тогда @@ -5355,7 +6140,7 @@ Если ТипЗнч(ДанныеКлассификатора) = Тип("Структура") Тогда Попытка - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ДанныеКлассификатора.Версия, "2.0.0.8") < 0 Тогда + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ДанныеКлассификатора.Версия, "3.0.0.2") < 0 Тогда Версия = Неопределено; Иначе Версия = ДанныеКлассификатора.Версия; @@ -5546,7 +6331,7 @@ Попытка ВерсияКомпоненты = ОбъектВнешнейКомпонентыExtraCryptoAPI().ПолучитьВерсию(); Исключение - ВерсияКомпоненты = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ВерсияКомпоненты = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -5556,18 +6341,55 @@ Функция ТехническаяИнформацияОПрограммах() - ИспользуемыеПрограммы = ЭлектроннаяПодписьСлужебныйВызовСервера.ИспользуемыеПрограммы(); - Если ИспользуемыеПрограммы.Количество() = 0 Тогда - Возврат ""; + ДиагностическаяИнформация = ""; + + УстановленныеПрограммыРезультат = УстановленныеКриптопровайдеры(); + + Если Не УстановленныеПрограммыРезультат.ПроверкаВыполнена Тогда + ДиагностическаяИнформация = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось автоматически определить программы на ""%1"": %2'"), + ИмяКомпьютера(), УстановленныеПрограммыРезультат.Ошибка); + Иначе + + Если УстановленныеПрограммыРезультат.Криптопровайдеры.Количество() = 0 Тогда + ДиагностическаяИнформация = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Нет программ на ""%1"", определенных автоматически'"), + ИмяКомпьютера()); + Иначе + ДиагностическаяИнформация = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Автоматически определенные программы на сервере ""%1"":'"), ИмяКомпьютера()) + Символы.ПС; + + Для Каждого Программа Из УстановленныеПрограммыРезультат.Криптопровайдеры Цикл + + ПараметрыСоздания = ПараметрыСозданияМенеджераКриптографии(); + ПараметрыСоздания.Автоопределение = Ложь; + ПараметрыСоздания.Программа = Программа; + ПараметрыСоздания.ПоказатьОшибку = Ложь; + ПараметрыСоздания.ОписаниеОшибки = Новый Структура; + + МенеджерКриптографии = МенеджерКриптографии("", ПараметрыСоздания); + + ДиагностическаяИнформация = ДиагностическаяИнформация + + ЭлектроннаяПодписьСлужебныйКлиентСервер.ДиагностическаяИнформацияПоПрограмме(Программа, + МенеджерКриптографии, ПараметрыСоздания.ОписаниеОшибки); + КонецЦикла; + КонецЕсли; КонецЕсли; - ДиагностическаяИнформация = Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Программы на сервере ""%1"":'"), ИмяКомпьютера()) + Символы.ПС; + ИспользуемыеПрограммы = ЭлектроннаяПодписьСлужебныйВызовСервера.ИспользуемыеПрограммы(); + + Если ИспользуемыеПрограммы.Количество() = 0 Тогда + Возврат ДиагностическаяИнформация; + КонецЕсли; + + ДиагностическаяИнформация = ДиагностическаяИнформация + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Программы на сервере из справочника ""%1"":'"), ИмяКомпьютера()) + Символы.ПС; Для Каждого Программа Из ИспользуемыеПрограммы Цикл ПараметрыСоздания = ПараметрыСозданияМенеджераКриптографии(); - ПараметрыСоздания.Программа = Программа.Ссылка; + ПараметрыСоздания.Автоопределение = Ложь; + ПараметрыСоздания.Программа = Программа; ПараметрыСоздания.ПоказатьОшибку = Ложь; ПараметрыСоздания.ОписаниеОшибки = Новый Структура; @@ -5601,13 +6423,15 @@ | Тип программы: %3 | Алгоритм подписи: %4 | Алгоритм хеширования: %5 - | Алгоритм шифрования: %6'"), + | Алгоритм шифрования: %6 + | Режим использования %7'"), Программа.Представление, Программа.ИмяПрограммы, Программа.ТипПрограммы, Программа.АлгоритмПодписи, Программа.АлгоритмХеширования, - Программа.АлгоритмШифрования) + Символы.ПС; + Программа.АлгоритмШифрования, + Программа.РежимИспользования) + Символы.ПС; Если ТребуетсяПутьКПрограмме(Истина) Тогда ДобавитьИнформациюОПутиКПрограмме(ДиагностическаяИнформация, @@ -5820,13 +6644,13 @@ НСтр("ru = 'Ошибки при загрузке списка отзыва: |%1 |Подробности см. в Журнале регистрации.'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации( НСтр("ru = 'Электронная подпись.Обновление списков отзыва'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецЕсли; @@ -5905,6 +6729,7 @@ Прервать; Иначе ДатаПоследнегоИзменения = Неопределено; + РезультатЗагрузки.Вставить("СообщениеОбОшибке", Результат.СообщениеОбОшибке); КонецЕсли; КонецЦикла; @@ -6028,6 +6853,109 @@ КонецПроцедуры +Функция ЦепочкаСертификатов(Знач Сертификат, ИдентификаторФормы = Неопределено, ОбъектКомпоненты = Неопределено) Экспорт + + Сертификат = СертификатBase64Строка(Сертификат); + Результат = Новый Структура("Сертификаты, Ошибка", Новый Массив, ""); + + Попытка + Если ОбъектКомпоненты = Неопределено Тогда + ОбъектКомпоненты = ОбъектВнешнейКомпонентыExtraCryptoAPI(); + КонецЕсли; + + СертификатыРезультат = ОбъектКомпоненты.ПолучитьЦепочкуСертификатов(Сертификат); + + Ошибка = ОбъектКомпоненты.СписокОшибок; + Если ЗначениеЗаполнено(Ошибка) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось получить цепочку сертификатов: %1 (%2).'"), Ошибка, ИмяКомпьютера()); + КонецЕсли; + + Если СертификатыРезультат = Неопределено Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось получить цепочку сертификатов (%1).'"), ИмяКомпьютера()); + КонецЕсли; + + Результат = ЭлектроннаяПодписьСлужебныйКлиентСервер.ЦепочкаСертификатовИзОтветаКомпоненты( + СертификатыРезультат, ИдентификаторФормы); + Исключение + Результат.Ошибка = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Возврат Результат; + КонецПопытки; + + Возврат Результат; + +КонецФункции + +Функция СвойстваСертификатаРасширенные(Знач Сертификат, ИдентификаторФормы = Неопределено, ОбъектКомпоненты = Неопределено) Экспорт + + Сертификат = СертификатBase64Строка(Сертификат); + + Результат = Новый Структура("Ошибка, СвойстваСертификата, СертификатBase64Строка", ""); + Результат.СертификатBase64Строка = Сертификат; + + Попытка + + СвойстваСертификата = Новый Структура; + СвойстваСертификата.Вставить("АдресаСписковОтзыва", Новый Массив); + + Если ОбъектКомпоненты = Неопределено Тогда + ОбъектКомпоненты = ОбъектВнешнейКомпонентыExtraCryptoAPI(); + КонецЕсли; + + СвойстваСертификатаРезультат = ОбъектКомпоненты.ПолучитьСвойстваСертификата(Сертификат); + + СвойстваСертификата = ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваСертификатаИзОтветаКомпоненты( + СвойстваСертификатаРезультат); + + Результат.СвойстваСертификата = СвойстваСертификата; + + Исключение + + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при получении расширенных свойств сертификата: %1'"), + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат Результат; + + КонецПопытки; + + Возврат Результат; + +КонецФункции + +// Сертификат base64 строка. +// +// Параметры: +// Сертификат - ДвоичныеДанные +// - Строка - адрес во временном хранилище +// - Строка - сертификат в формате Base64Строка +// - СертификатКриптографии +// +// Возвращаемое значение: +// Строка - сертификат base64 строка +// +Функция СертификатBase64Строка(Знач Сертификат) + + Если ТипЗнч(Сертификат) = Тип("Строка") И ЭтоАдресВременногоХранилища(Сертификат) Тогда + Сертификат = ПолучитьИзВременногоХранилища(Сертификат); + КонецЕсли; + + Если ТипЗнч(Сертификат) = Тип("Строка") Тогда + Возврат Сертификат; + КонецЕсли; + + Если ТипЗнч(Сертификат) = Тип("СертификатКриптографии") Тогда + Сертификат = Сертификат.Выгрузить(); + КонецЕсли; + + Сертификат = Base64Строка(Сертификат); + Сертификат = СтрЗаменить(Сертификат, Символы.ВК, ""); + Сертификат = СтрЗаменить(Сертификат, Символы.ПС, ""); + + Возврат Сертификат; + +КонецФункции + Функция ДатаПоследнегоИзмененияФайла(РезультатЗагрузки) Экспорт Заголовки = Неопределено; @@ -6052,7 +6980,7 @@ // Локализация -Процедура УстановитьСписокОтзываСертификата(Сертификат, Адреса, АдресВнутренний) +Процедура УстановитьСписокОтзываСертификата(Сертификат, Адреса = Неопределено, АдресВнутренний = Неопределено) Экспорт ОбъектКомпоненты = ОбъектВнешнейКомпонентыExtraCryptoAPI(); @@ -6061,7 +6989,16 @@ КонецЕсли; Если Не ЗначениеЗаполнено(Адреса) Тогда - ВызватьИсключение НСтр("ru = 'Не указаны адреса списков отзыва.'"); + СвойстваСертификатаРасширенные = СвойстваСертификатаРасширенные(Сертификат, ОбъектКомпоненты); + + Если ЗначениеЗаполнено(СвойстваСертификатаРасширенные.Ошибка) Тогда + ВызватьИсключение СвойстваСертификатаРасширенные.Ошибка; + КонецЕсли; + + АдресаСписковОтзыва = СвойстваСертификатаРасширенные.СвойстваСертификата.АдресаСписковОтзыва; + Если АдресаСписковОтзыва.Количество() = 0 Тогда + ВызватьИсключение НСтр("ru = 'В сертификате не указаны адреса списков отзыва.'"); + КонецЕсли; Иначе Если ТипЗнч(Адреса) = Тип("Строка") Тогда АдресаСписковОтзыва = СтрРазделить(Адреса, ";"); @@ -6084,7 +7021,7 @@ ОбъектКомпоненты.ImportCRu(ИмяВременногоФайла, "CA"); РезультатУстановки = Истина; Исключение - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); РезультатУстановки = Ложь; КонецПопытки; diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl index 87a25ea8e..8b2fba720 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl @@ -36,10 +36,21 @@ Ошибка = ПараметрыСоздания.ОписаниеОшибки; Если МенеджерКриптографии <> Неопределено Тогда - МассивСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов( - ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты).ПолучитьВсе(); - ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатов(ТаблицаСвойствСертификатов, МассивСертификатов, Истина, - ЭлектроннаяПодписьСлужебный.ДобавкаВремени(), ТекущаяДатаСеанса()); + + Попытка + МассивСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов( + ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты).ПолучитьВсе(); + ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатов(ТаблицаСвойствСертификатов, МассивСертификатов, Истина, + ЭлектроннаяПодписьСлужебный.ДобавкаВремени(), ТекущаяДатаСеанса()); + Исключение + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Если ТипЗнч(Ошибка) = Тип("Структура") Тогда + Ошибка = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовоеОписаниеОшибок(ИмяКомпьютера()); + Ошибка.ОписаниеОшибки = ОписаниеОшибки; + Иначе + Ошибка = ОписаниеОшибки; + КонецЕсли; + КонецПопытки; КонецЕсли; КонецЕсли; @@ -248,6 +259,29 @@ // Только для внутреннего использования. Функция ВыполнитьНаСторонеСервера(Знач Параметры, АдресРезультата, ОперацияНачалась, ОшибкаНаСервере) Экспорт + Если Не ЗначениеЗаполнено(Параметры.СертификатПрограмма) + И Параметры.Свойство("ДанныеДляСозданияМенеджераКриптографии") Тогда + + Если Параметры.Операция = "Подписание" Или Параметры.Операция = "Расшифровка" Тогда + ТребуетсяЗакрытыйКлюч = Истина; + Иначе + ТребуетсяЗакрытыйКлюч = Неопределено; + КонецЕсли; + + ПрограммаПоСертификатуРезультат = ЭлектроннаяПодписьСлужебный.ПрограммаПоСертификату( + Параметры.ДанныеДляСозданияМенеджераКриптографии, ТребуетсяЗакрытыйКлюч); + + Если Не ЗначениеЗаполнено(ПрограммаПоСертификатуРезультат.Программа) Тогда + ОшибкаНаСервере = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовоеОписаниеОшибок(); + ОшибкаНаСервере.Вставить("ОписаниеОшибки", + ЭлектроннаяПодписьСлужебныйКлиентСервер.ТекстОшибкиНеУдалосьОпределитьПрограмму( + ПрограммаПоСертификатуРезультат.Ошибка)); + Возврат Ложь; + КонецЕсли; + + Параметры.СертификатПрограмма = ПрограммаПоСертификатуРезультат.Программа; + КонецЕсли; + ПараметрыСоздания = ЭлектроннаяПодписьСлужебный.ПараметрыСозданияМенеджераКриптографии(); ПараметрыСоздания.Программа = Параметры.СертификатПрограмма; ПараметрыСоздания.ОписаниеОшибки = Новый Структура; @@ -277,7 +311,7 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); ОшибкаНаСервере.Вставить("ОписаниеОшибки", ЭлектроннаяПодписьСлужебныйКлиентСервер.ЗаголовокОшибкиПолученияДанных(Параметры.Операция) - + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат Ложь; КонецПопытки; @@ -371,7 +405,7 @@ КонецЕсли; Если ИнформацияОбОшибке <> Неопределено Тогда - ОшибкаНаСервере.Вставить("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОшибкаНаСервере.Вставить("ОписаниеОшибки", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ОшибкаНаСервере.Вставить("Инструкция", Истина); Возврат Ложь; КонецЕсли; @@ -397,7 +431,7 @@ ДанныеПодписи = Base64Строка(ДвоичныеДанныеРезультата); ПредставлениеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru='При чтении данных подписи после подписания: %1 - |Результат подписи: %2'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ДанныеПодписи); + |Результат подписи: %2'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ДанныеПодписи); ОшибкаНаСервере.Вставить("ОписаниеОшибки", ПредставлениеОшибки); ОшибкаНаСервере.Вставить("Инструкция", Истина); Возврат Ложь; @@ -452,7 +486,7 @@ Исключение Результат = Новый Структура; Результат.Вставить("Успех", Ложь); - Результат.Вставить("ТекстОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Результат.Вставить("ТекстОшибки", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Результат.Вставить("ОшибкаПриСозданииМенеджераКриптографии", Ложь); Возврат Результат; КонецПопытки; @@ -533,8 +567,8 @@ ЭлектроннаяПодпись.ДобавитьПодпись(СсылкаНаОбъект, СвойстваПодписи, ИдентификаторФормы, ВерсияОбъекта); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ПредставлениеОшибки = НСтр("ru = 'При записи подписи возникла ошибка:'") - + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПредставлениеОшибки = НСтр("ru = 'Не удалось записать подпись по причине:'") + + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Возврат ПредставлениеОшибки; @@ -601,6 +635,12 @@ КонецФункции +Функция УстановленныеКриптопровайдеры() Экспорт + + Возврат ЭлектроннаяПодписьСлужебный.УстановленныеКриптопровайдеры(); + +КонецФункции + Функция НайтиУстановленныеПрограммы(ОписаниеПрограмм, ПроверятьНаСервере) Экспорт Если ПроверятьНаСервере = Неопределено Тогда @@ -758,6 +798,36 @@ КонецФункции +// Производит поиск физических лиц по наименованию +// +// Параметры: +// КомуВыдан - Массив из строк +// - Строка +// +// Возвращаемое значение: +// Структура: +// * ФизическиеЛица - см. ЭлектроннаяПодписьСлужебный.ПолучитьФизическиеЛицаПоПолюСертификатаКомуВыдан +// * ПутьФормыВыбораФизическогоЛица - Строка +// +Функция ПолучитьФизическиеЛицаПоПолюСертификатаКомуВыдан(КомуВыдан) Экспорт + + Результат = Новый Структура; + + ТипыФизическоеЛицо = Метаданные.ОпределяемыеТипы.ФизическоеЛицо.Тип.Типы(); + Если ТипыФизическоеЛицо[0] = Тип("Строка") Тогда + Возврат Результат; + КонецЕсли; + + ФизическоеЛицоПустаяСсылка = Новый (ТипыФизическоеЛицо[0]); + + Результат.Вставить("ФизическиеЛица", ЭлектроннаяПодписьСлужебный.ПолучитьФизическиеЛицаПоПолюСертификатаКомуВыдан(КомуВыдан)); + Результат.Вставить("ПутьФормыВыбораФизическогоЛица", ОбщегоНазначения.ИмяТаблицыПоСсылке( + ФизическоеЛицоПустаяСсылка) + ".ФормаВыбора"); + + Возврат Результат; + +КонецФункции + #Область ДиагностикаЭлектроннойПодписи Функция ДействияДляУстраненияОшибки(ТекстОшибки) Экспорт @@ -766,6 +836,34 @@ КонецФункции +Функция ПрочитатьОтветКомпоненты(Текст) Экспорт + + Попытка + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(Текст); + Результат = ПрочитатьJSON(ЧтениеJSON, Истина); + ЧтениеJSON.Закрыть(); + Исключение + + ИнформацияОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Электронная подпись.Работа с компонентой.'", + ОбщегоНазначения.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось прочитать ответ компоненты: %1 + |%2'"), Текст, ИнформацияОбОшибке)); + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось прочитать ответ компоненты: %1'"), ИнформацияОбОшибке); + + КонецПопытки; + + Возврат Результат; + +КонецФункции + Процедура ДобавитьОписаниеДополнительныхДанных(ДополнительныеДанные, ОписаниеФайлов, Сведения) Экспорт Текст = ""; @@ -939,7 +1037,8 @@ | ПрограммыЭлектроннойПодписиИШифрования.ТипПрограммы КАК ТипПрограммы, | ПрограммыЭлектроннойПодписиИШифрования.АлгоритмПодписи КАК АлгоритмПодписи, | ПрограммыЭлектроннойПодписиИШифрования.АлгоритмХеширования КАК АлгоритмХеширования, - | ПрограммыЭлектроннойПодписиИШифрования.АлгоритмШифрования КАК АлгоритмШифрования + | ПрограммыЭлектроннойПодписиИШифрования.АлгоритмШифрования КАК АлгоритмШифрования, + | ПрограммыЭлектроннойПодписиИШифрования.РежимИспользования |ИЗ | Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК ПрограммыЭлектроннойПодписиИШифрования |ГДЕ @@ -1037,4 +1136,79 @@ КонецФункции +// Локализация +Функция ПолучитьДистрибутивCryptoProCSP(Параметры) Экспорт + + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(Новый УникальныйИдентификатор); + ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Получение дистрибутива CryptoPro CSP'"); + + Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, + "ЭлектроннаяПодписьСлужебныйЛокализация.ДистрибутивCryptoProCSP", Параметры); + +КонецФункции + +Функция ПолучитьДистрибутивViPNetCSP(Параметры) Экспорт + + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(Новый УникальныйИдентификатор); + ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Получение дистрибутива VipNet CSP'"); + + Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, + "ЭлектроннаяПодписьСлужебныйЛокализация.ДистрибутивViPNetCSP", Параметры); + +КонецФункции + +// Результат получения дистрибутива криптопровайдера. +// +// Параметры: +// ДлительнаяОперация - Структура: +// * АдресРезультата - Строка - адрес во временном хранилище +// ИдентификаторФормы Идентификатор формы +// +// Возвращаемое значение: +// Структура - результат получения дистрибутива криптопровайдера: +// * ДанныеДистрибутива - Структура: +// ** НомерДистрибутива - Строка +// ** Версия - Строка +// ** КонтрольнаяСумма - Строка +// ** СерийныйНомер - Строка +// ** ИмяФайлаДистрибутива - Строка +// ** Дистрибутив - Массив из ОписаниеПередаваемогоФайла +// * Ошибка - Строка +// +Функция РезультатПолученияДистрибутиваКриптопровайдера(ДлительнаяОперация, ИдентификаторФормы) Экспорт + + Результат = ПолучитьИзВременногоХранилища(ДлительнаяОперация.АдресРезультата); // см. ЭлектроннаяПодписьСлужебныйЛокализация.ДистрибутивViPNetCSP + + ДанныеДистрибутива = Новый Структура; + Если Результат.ПараметрыДистрибутива <> Неопределено И Результат.ПараметрыДистрибутива.Свойство("Дистрибутив") Тогда + + ДанныеДистрибутива.Вставить("НомерДистрибутива", Результат.ПараметрыДистрибутива.НомерДистрибутива); + ДанныеДистрибутива.Вставить("Версия", Результат.ПараметрыДистрибутива.Версия); + ДанныеДистрибутива.Вставить("КонтрольнаяСумма", Результат.ПараметрыДистрибутива.КонтрольнаяСумма); + ДанныеДистрибутива.Вставить("ИмяФайлаДистрибутива", Результат.ПараметрыДистрибутива.ИмяФайлаДистрибутива); + + Если Результат.ПараметрыДистрибутива.Свойство("СерийныйНомер") Тогда + ДанныеДистрибутива.Вставить("СерийныйНомер", Результат.ПараметрыДистрибутива.СерийныйНомер); + КонецЕсли; + + ОписаниеФайлов = Новый Массив; + + Для каждого Файл Из Результат.ПараметрыДистрибутива.Дистрибутив Цикл + ОписаниеФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(Файл.Имя, + ПоместитьВоВременноеХранилище(Файл.ДвоичныеДанные, ИдентификаторФормы))); + КонецЦикла; + + ДанныеДистрибутива.Вставить("Дистрибутив", ОписаниеФайлов); + КонецЕсли; + + СтруктураВозврата = Новый Структура; + СтруктураВозврата.Вставить("ДанныеДистрибутива", ДанныеДистрибутива); + СтруктураВозврата.Вставить("Ошибка", Результат.Ошибка); + + Возврат СтруктураВозврата; + +КонецФункции + +// Конец Локализация + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl index fa5b0ad01..ccad4ef4d 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl @@ -28,6 +28,190 @@ КонецПроцедуры +// Выполняет получение установленных криптопровайдеров. +// +// Параметры: +// Оповещение - ОписаниеОповещения - оповещение о результате выполнения, один из типов: +// = Неопределено - данные не получены (не установлено расширение для работы с криптографией или компонента) +// = Структура: +// # ПроверкаВыполнена = Булево - Истина, если проверка выполнена, получены установленные криптопровайдеры. +// если Ложь, то будет заполнена Ошибка. +// # Ошибка = Строка - текст ошибки +// # Криптопровайдеры = Массив из ЭлектроннаяПодписьСлужебныйКлиентСервер.НовоеРасширенноеОписаниеПрограммы +// # КриптопровайдерыНаСервере = Массив из ЭлектроннаяПодписьСлужебныйКлиентСервер.НовоеРасширенноеОписаниеПрограммы +// ПараметрыПроверки - Неопределено +// - Структура: +// * УстанавливатьРасширение - Булево - устанавливать расширение для работы с электронной подписью. +// * УстанавливатьКомпоненту - Булево - устанавливать компоненту для работы с электронной подписью. +// * ПроверятьНаСервере - Булево - получить список криптопровайдеров на сервере. +// +Процедура ПолучитьУстановленныеКриптопровайдеры(Оповещение, ПараметрыПроверки = Неопределено) Экспорт + + Контекст = Новый Структура; + Контекст.Вставить("УстанавливатьРасширение", Истина); + Контекст.Вставить("УстанавливатьКомпоненту", Истина); + Контекст.Вставить("Результат", РезультатПолученияУстановленныхКриптопровайдеров()); + + ПроверятьНаСервере = Неопределено; + + Если ТипЗнч(ПараметрыПроверки) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(Контекст, ПараметрыПроверки); + ПроверятьНаСервере = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыПроверки, "ПроверятьНаСервере", Неопределено); + КонецЕсли; + + Если ПроверятьНаСервере = Неопределено Тогда + ПроверятьНаСервере = ЭлектроннаяПодписьКлиент.ПроверятьЭлектронныеПодписиНаСервере() + Или ЭлектроннаяПодписьКлиент.СоздаватьЭлектронныеПодписиНаСервере(); + КонецЕсли; + + Если ПроверятьНаСервере Тогда + РезультатНаСервере = ЭлектроннаяПодписьСлужебныйВызовСервера.УстановленныеКриптопровайдеры(); + Если РезультатНаСервере.ПроверкаВыполнена Тогда + Контекст.Результат.КриптопровайдерыНаСервере = РезультатНаСервере.Криптопровайдеры; + КонецЕсли; + КонецЕсли; + + Контекст.Вставить("Оповещение", Оповещение); + Контекст.Вставить("ПродолжатьБезУстановкиРасширения", Истина); + + ОповещениеОПродолжении = Новый ОписаниеОповещения("ПолучитьУстановленныеКриптопровайдерыПослеПодключенияКомпоненты", + ЭтотОбъект, Контекст); + ВыполнитьПослеПроверкиРасширенияИКомпоненты(ОповещениеОПродолжении, Контекст); + +КонецПроцедуры + +// Получает из сертификата адреса списков отзыва, скачивает, устанавливает в промежуточное хранилище сертификатов +// +// Параметры: +// ПараметрыУстановкиСпискаОтзыва - см. ПараметрыУстановкиСпискаОтзыва +// +Процедура УстановитьСписокОтзываСертификата(ПараметрыУстановкиСпискаОтзыва) Экспорт + + Оповещение = Новый ОписаниеОповещения("УстановитьСписокОтзываСертификатаПослеПодключенияКомпоненты", + ЭтотОбъект, ПараметрыУстановкиСпискаОтзыва); + ВыполнитьПослеПроверкиРасширенияИКомпоненты(Оповещение); + +КонецПроцедуры + +// Параметры установки списка отзыва. +// +// Параметры: +// Сертификат - ДвоичныеДанные +// - Строка - адрес во временном хранилище. +// - Строка - строковое представление сертификата в формате Base64. +// - СертификатКриптографии +// +// Возвращаемое значение: +// Структура: +// * Сертификат - ДвоичныеДанные +// - Строка - адрес во временном хранилище. +// - Строка - строковое представление сертификата в формате Base64. +// - СертификатКриптографии +// * Адреса - Строка - адрес списка отзыва, если не указан, загрузка будет с адресов, указанных в сертификате. +// - Массив из Строка +// * АдресВнутренний - Строка - если указан, список отзыва будет записан в кэш. +// * ОповещениеОЗавершении - Неопределено +// - ОписаниеОповещения - оповещение, которое вызывается после установки c результатом: +// # Структура: +// ## УстановкаВыполнена - Булево +// ## Сообщение - сообщение о результате установки +// * Форма - ФормаКлиентскогоПриложения - владелец формы установки +// +Функция ПараметрыУстановкиСпискаОтзыва(Сертификат) Экспорт + + ПараметрыУстановкиСпискаОтзыва = Новый Структура; + ПараметрыУстановкиСпискаОтзыва.Вставить("Сертификат", Сертификат); + ПараметрыУстановкиСпискаОтзыва.Вставить("Адреса", Новый Массив); + ПараметрыУстановкиСпискаОтзыва.Вставить("АдресВнутренний"); + ПараметрыУстановкиСпискаОтзыва.Вставить("ОповещениеОЗавершении"); + ПараметрыУстановкиСпискаОтзыва.Вставить("Форма"); + + Возврат ПараметрыУстановкиСпискаОтзыва; + +КонецФункции + +// Установить сертификат +// +// Параметры: +// ПараметрыУстановкиСертификата - см. ПараметрыУстановкиСертификата +// +Процедура УстановитьСертификат(ПараметрыУстановкиСертификата) Экспорт + + Оповещение = Новый ОписаниеОповещения("УстановитьСертификатПослеПодключенияКомпоненты", + ЭтотОбъект, ПараметрыУстановкиСертификата); + ВыполнитьПослеПроверкиРасширенияИКомпоненты(Оповещение); + +КонецПроцедуры + +// Получить корневой сертификат из данных сертификата и установить его. +// +// Параметры: +// ПараметрыУстановкиСертификата - см. ПараметрыУстановкиСертификата +// - Структура: +// * Сертификат - ДвоичныеДанные +// - Строка - адрес во временном хранилище +// - Строка - строковое представление сертификата в формате Base64 +// - СертификатКриптографии +// * Хранилище - Структура: +// ** Значение - Строка +// ** Представление - Строка +// +Процедура УстановитьКорневойСертификат(ПараметрыУстановкиСертификата) Экспорт + + ПараметрыУстановки = ПараметрыУстановкиСертификата(ПараметрыУстановкиСертификата.Сертификат); + ЗаполнитьЗначенияСвойств(ПараметрыУстановки, ПараметрыУстановкиСертификата); + Оповещение = Новый ОписаниеОповещения("УстановитьКорневойСертификатПослеПодключенияКомпоненты", + ЭтотОбъект, ПараметрыУстановки); + ВыполнитьПослеПроверкиРасширенияИКомпоненты(Оповещение); + +КонецПроцедуры + +// Параметры установки сертификата. +// +// Параметры: +// Сертификат - ДвоичныеДанные +// - Строка - адрес во временном хранилище +// - Строка - строковое представление сертификата в формате Base64 +// - СертификатКриптографии +// +// Возвращаемое значение: +// Структура: +// * Сертификат - ДвоичныеДанные +// - Строка - адрес во временном хранилище +// - Строка - строковое представление сертификата в формате Base64 +// - СертификатКриптографии +// * ОповещениеОЗавершении - ОписаниеОповещения - оповещение, которое вызывается после установки. +// Результат оповещения - Структура: +// # УстановкаВыполнена - результат установки +// # Сообщение - ошибка или сообщение о результате установки +// * ВариантыУстановки - СписокЗначений - для выбора в форме установки +// * Хранилище - Строка - имя хранилища +// - Структура: +// ** Значение - имя хранилища +// ** Представление - представление в форме установки +// * СвойстваКонтейнера - Структура: +// ** - Имя - строка - Имя контейнера +// ** - ТипПрограммы - число - тип программы криптопровайдера +// ** - ИмяПрограммы - строка - имя программы криптопровайдера +// ** - ПутьКПрограмме - строка - имя программы криптопровайдера +// * ТекстПредупреждения - Строка - для отображения в форме установки +// * Форма - ФормаКлиентскогоПриложения - владелец формы установки +// +Функция ПараметрыУстановкиСертификата(Сертификат) Экспорт + + ПараметрыУстановкиСертификата = Новый Структура; + ПараметрыУстановкиСертификата.Вставить("Сертификат", Сертификат); + ПараметрыУстановкиСертификата.Вставить("ОповещениеОЗавершении", Неопределено); + ПараметрыУстановкиСертификата.Вставить("ВариантыУстановки", Неопределено); + ПараметрыУстановкиСертификата.Вставить("Хранилище", Неопределено); + ПараметрыУстановкиСертификата.Вставить("СвойстваКонтейнера", Неопределено); + ПараметрыУстановкиСертификата.Вставить("ТекстПредупреждения", ""); + ПараметрыУстановкиСертификата.Вставить("Форма", Неопределено); + + Возврат ПараметрыУстановкиСертификата; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -237,7 +421,7 @@ КонецЕсли; ПутиКМодулямПрограммы = ПутиКМодулямПрограмм.Значение.Получить( - ЭлектроннаяПодписьСлужебныйКлиентСервер.ТипПлатформыСтрокой()); + ОбщегоНазначенияКлиентСервер.ИмяТипаПлатформы()); Если ПутиКМодулямПрограммы = Неопределено Тогда ВыполнитьОбработкуОповещения(ОбработкаЗавершения, Результат); @@ -335,6 +519,67 @@ КонецПроцедуры +// Продолжение процедуры ПроверитьУстановкуПрограммКриптографии. +Процедура ПроверитьУстановкуПрограммКриптографии(Форма, ПараметрыПроверки = Неопределено, ОповещениеОЗавершении = Неопределено) Экспорт + + Контекст = Новый Структура; + Контекст.Вставить("Форма", Форма); + Контекст.Вставить("ЭтоПовторнаяПроверка", Ложь); + Контекст.Вставить("ПредлагатьУстановитьПрограмму", Неопределено); + Контекст.Вставить("ПроверяемыеПрограммы", Неопределено); + Контекст.Вставить("РасширенноеОписание", Ложь); + Контекст.Вставить("Оповещение", ОповещениеОЗавершении); + + ПараметрыПолучения = Новый Структура; + ПараметрыПолучения.Вставить("УстанавливатьКомпоненту", Истина); + ПараметрыПолучения.Вставить("УстанавливатьРасширение", Истина); + ПараметрыПолучения.Вставить("ПроверятьНаСервере", Неопределено); + + Если ТипЗнч(ПараметрыПроверки) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(Контекст, ПараметрыПроверки); + ЗаполнитьЗначенияСвойств(ПараметрыПолучения, ПараметрыПроверки); + КонецЕсли; + + Если Контекст.ПредлагатьУстановитьПрограмму = Неопределено Тогда + Контекст.ПредлагатьУстановитьПрограмму = Контекст.ПроверяемыеПрограммы = Истина + И Не ЭлектроннаяПодписьКлиент.ПроверятьЭлектронныеПодписиНаСервере() + И Не ЭлектроннаяПодписьКлиент.СоздаватьЭлектронныеПодписиНаСервере() + И Не ИспользоватьСервисОблачнойПодписи() + И Не ИспользоватьЭлектроннуюПодписьВМоделиСервиса(); + КонецЕсли; + + Контекст.Вставить("АлгоритмыПодписи", Новый Массив); + Контекст.Вставить("ТипДанных", Неопределено); + + Если Контекст.ПроверяемыеПрограммы <> Неопределено Тогда + Если Контекст.ПроверяемыеПрограммы = Истина Тогда + Контекст.ПроверяемыеПрограммы = Неопределено; + Контекст.АлгоритмыПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.АктуальныеАлгоритмыПрограмм(); + Контекст.ТипДанных = "Сертификат"; + ИначеЕсли ТипЗнч(Контекст.ПроверяемыеПрограммы) = Тип("ДвоичныеДанные") + Или ТипЗнч(Контекст.ПроверяемыеПрограммы) = Тип("Строка") Тогда + ДвоичныеДанные = ЭлектроннаяПодписьСлужебныйКлиентСервер.ДвоичныеДанныеИзДанных( + Контекст.ПроверяемыеПрограммы, "ЭлектроннаяПодписьСлужебныйКлиент.ПроверитьУстановкуПрограммКриптографии"); + Контекст.ПроверяемыеПрограммы = Неопределено; + Контекст.ТипДанных = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОпределитьТипДанных(ДвоичныеДанные); + Если Контекст.ТипДанных = "Сертификат" Тогда + АлгоритмПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмПодписиСертификата(ДвоичныеДанные); + ИначеЕсли Контекст.ТипДанных = "Подпись" Тогда + АлгоритмПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмСформированнойПодписи(ДвоичныеДанные); + Иначе + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Данные для поиска программы криптографии не являются сертификатом или подписью.'"), ); + КонецЕсли; + Контекст.АлгоритмыПодписи.Добавить(АлгоритмПодписи); + КонецЕсли; + КонецЕсли; + + ПолучитьУстановленныеКриптопровайдеры( + Новый ОписаниеОповещения("ПроверитьУстановкуПрограммКриптографииПослеПолученияУстановленных", ЭтотОбъект, Контекст), + ПараметрыПолучения); + +КонецПроцедуры + // Продолжение процедуры НайтиУстановленныеПрограммы. Процедура НайтиУстановленныеПрограммы(Оповещение, ОписаниеПрограмм, ПроверятьНаСервере) Экспорт @@ -795,7 +1040,7 @@ ВызватьИсключение; КонецЕсли; ИнформацияОбОшибке = ИнформацияОбОшибке(); - ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); ПолучитьСертификатПоОтпечаткуЗавершение(Неопределено, ПредставлениеОшибки, Контекст); Возврат; КонецПопытки; @@ -817,7 +1062,7 @@ СтандартнаяОбработка = Ложь; - ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); ПолучитьСертификатПоОтпечаткуЗавершение(Неопределено, ПредставлениеОшибки, Контекст); КонецПроцедуры @@ -841,7 +1086,7 @@ СтандартнаяОбработка = Ложь; - ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); ПолучитьСертификатПоОтпечаткуЗавершение(Неопределено, ПредставлениеОшибки, Контекст); @@ -1172,7 +1417,8 @@ Контекст.МенеджерКриптографии); Иначе - Контекст.МенеджерКриптографии.НачатьПроверкуПодписи(Новый ОписаниеОповещения( + МенеджерКриптографии = Контекст.МенеджерКриптографии; // МенеджерКриптографии + МенеджерКриптографии.НачатьПроверкуПодписи(Новый ОписаниеОповещения( "ПроверитьПодписьНаКлиентеПослеПроверкиПодписи", ЭтотОбъект, Контекст, "ПроверитьПодписьНаКлиентеПослеОшибкиПроверкиПодписи", ЭтотОбъект), Контекст.ИсходныеДанные, Контекст.ДанныеПодписи); @@ -1206,7 +1452,7 @@ СтандартнаяОбработка = Ложь; ТекстОшибки = ?(ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Строка(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Строка(ИнформацияОбОшибке)); ВыполнитьОбработкуОповещения(Контекст.Оповещение, ТекстОшибки); @@ -1240,7 +1486,7 @@ СвойстваПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваПодписиИзДвоичныхДанных( Контекст.ДанныеПодписи, ДобавкаВремени()); - Если Не СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено + Если Не ОбщегоНазначенияКлиент.РазделениеВключено() И ТипЗнч(МенеджерДляПолученияДатыПодписи) = Тип("МенеджерКриптографии") Тогда Если СвойстваПодписи.ТипПодписи <> ПредопределенноеЗначение("Перечисление.ТипыПодписиКриптографии.БазоваяCAdESBES") @@ -1249,7 +1495,7 @@ И СвойстваПодписи.ТипПодписи <> Неопределено Тогда ТекстОповещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '%1: Для проверки подписей этого типа требуется версия платформы 1С:Предприятие выше 8.3.20.1838 или 8.3.21.1302.'"), + НСтр("ru = '%1: Для проверки подписей этого типа требуется версия платформы 1С:Предприятие выше 8.3.21.1302.'"), СвойстваПодписи.ТипПодписи); ПоказатьОповещениеПользователя(НСтр("ru = 'Для корректной проверки подписей требуется обновление платформы.'"),, ТекстОповещения,БиблиотекаКартинок.Предупреждение32, СтатусОповещенияПользователя.Важное, @@ -1274,7 +1520,7 @@ ДобавкаВремени = ДатаСеанса - ОбщегоНазначенияКлиент.ДатаУниверсальная(); ПараметрыПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПараметрыПодписиКриптографии( КонтейнерПодписи, ДобавкаВремени, ДатаСеанса); - ДатаПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.ДатаПодписиИзПараметровПодписи(ПараметрыПодписи); + ДатаПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.ДатаДляПроверкиПодписи(ПараметрыПодписи); ПроверитьПодписьНаКлиентеПослеПолученияДатыПодписания(ДатаПодписи, Контекст); КонецПроцедуры @@ -1284,7 +1530,7 @@ Контекст) Экспорт СтандартнаяОбработка = Ложь; - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); ВыполнитьОбработкуОповещения(Контекст.Оповещение, ТекстОшибки); КонецПроцедуры @@ -1589,7 +1835,7 @@ СтандартнаяОбработка = Ложь; Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); // Локализация @@ -1609,7 +1855,7 @@ Контекст.ДействияДляУстраненияОшибок.Вставить(Действие, ОписаниеОшибки); Контекст.ДействияДляУстраненияОшибок.Вставить("ДействиеПриПовторнойПроверке", Действие); - Если Действие = "УстановкаСпискаОтзываСертификатов" Тогда + Если Действие = "УстановитьСписокОтзываСертификата" Тогда ИмяИздателя = НРег(ЭлектроннаяПодписьКлиент.СвойстваИздателяСертификата(Контекст.СертификатКриптографии).ОбщееИмя); Если ЗначениеЗаполнено(ИмяИздателя) Тогда ИмяИздателя = СтроковыеФункцииКлиент.СтрокаЛатиницей(ИмяИздателя); @@ -1641,7 +1887,7 @@ Если Контекст.ПроверитьВСервисеПослеОшибки И ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда ПроверитьСертификатВМоделиСервиса(Контекст); ИначеЕсли Контекст.ПроверитьВСервисеПослеОшибки И ПроверятьСертификатыОблачнойПодписью() Тогда - ПроверитьСертификатОблачнаяПодпись(Контекст); + ПроверитьСертификатОблачнаяПодпись(Контекст, Ложь); Иначе ПроверитьСертификатПослеНеуспешнойПроверки(Контекст); КонецЕсли; @@ -1682,7 +1928,7 @@ КонецЕсли; КонецПроцедуры - + // Продолжение процедуры ПроверитьСертификат. Процедура ДополнительнаяПроверкаСертификата(СертификатКриптографии, ПроверкаНаСервере, Контекст) @@ -1708,6 +1954,7 @@ Контекст.ОписаниеОшибкиНаКлиенте = РезультатПроверкиУдостоверяющегоЦентраСертификата.Предупреждение.ТекстОшибки; Контекст.ДополнительныеДанныеПроверкиНаКлиенте = РезультатПроверкиУдостоверяющегоЦентраСертификата.Предупреждение; КонецЕсли; + ПроверитьСертификатПослеНеуспешнойПроверки(Контекст); Возврат; @@ -1742,6 +1989,7 @@ Результат = ЭлектроннаяПодписьСлужебныйКлиентСервер.РезультатПроверкиУдостоверяющегоЦентраПоУмолчанию(); // Локализация + Если Не ЭлектроннаяПодписьКлиент.ОбщиеНастройки().ДоступнаПроверкаПоСпискуУЦ Тогда Возврат Результат; КонецЕсли; @@ -1837,7 +2085,7 @@ Процедура ПроверитьСертификатПослеПроверкиВМоделиСервиса(Результат, Контекст) Экспорт Если Не Результат.Выполнено Тогда - Контекст.ОписаниеОшибкиНаСервере = КраткоеПредставлениеОшибки(Результат.ИнформацияОбОшибке); + Контекст.ОписаниеОшибкиНаСервере = ОбработкаОшибок.КраткоеПредставлениеОшибки(Результат.ИнформацияОбОшибке); ПроверитьСертификатПослеНеуспешнойПроверки(Контекст); Возврат; КонецЕсли; @@ -1911,6 +2159,8 @@ // (установка свойства ПарольДоступаКЗакрытомуКлючу будет запрещена). // // * АлгоритмПодписи - Строка - если параметр заполнен, возвращает программу с указанным алгоритмом подписи. +// * Автоопределение - Булево - использовать автоопределение программ, установленных на компьютере, +// если программа не указана. // Функция ПараметрыСозданияМенеджераКриптографии() Экспорт @@ -1919,11 +2169,13 @@ ПараметрыСозданияМенеджераКриптографии.Вставить("Программа", Неопределено); ПараметрыСозданияМенеджераКриптографии.Вставить("ИнтерактивныйРежим", Ложь); ПараметрыСозданияМенеджераКриптографии.Вставить("АлгоритмПодписи", ""); + ПараметрыСозданияМенеджераКриптографии.Вставить("Автоопределение", Истина); Возврат ПараметрыСозданияМенеджераКриптографии; КонецФункции + // Создает и возвращает менеджер криптографии (на клиенте) для указанной программы. // // Параметры: @@ -1935,7 +2187,7 @@ // Операция - Строка - если не пустая, то должна содержать одну из строк, которые определяют // операцию для вставки в описание ошибки: Подписание, ПроверкаПодписи, Шифрование, // Расшифровка, ПроверкаСертификата, ПолучениеСертификатов. -// ПараметрыСозданияМенеджераКриптографии - см. ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыСозданияМенеджераКриптографии. +// ПараметрыСозданияМенеджераКриптографии - см. ПараметрыСозданияМенеджераКриптографии. // Процедура СоздатьМенеджерКриптографии(Оповещение, Операция, ПараметрыСозданияМенеджераКриптографии = Неопределено) Экспорт @@ -1954,6 +2206,8 @@ ПараметрыСозданияМенеджераКриптографии.АлгоритмПодписи; Контекст.ИнтерактивныйРежим = ПараметрыСозданияМенеджераКриптографии.ИнтерактивныйРежим; + Контекст.Автоопределение = + ПараметрыСозданияМенеджераКриптографии.Автоопределение; НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения( "СоздатьМенеджерКриптографииПослеПодключенияРасширенияРаботыСКриптографией", ЭтотОбъект, Контекст)); @@ -1966,8 +2220,13 @@ // * АлгоритмПодписи - Строка // * ПоказатьОшибку - Булево // * Программа - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования +// - ДвоичныеДанные - данные подписи или сертификата в кодировке DER +// - Строка - адрес данных, указанных выше во временном хранилище +// - Структура - см. ЭлектроннаяПодпись.НовоеОписаниеПрограммы +// - ФиксированнаяСтруктура - см. ЭлектроннаяПодпись.НовоеОписаниеПрограммы // * Оповещение - ОписаниеОповещения // * Операция - см. СоздатьМенеджерКриптографии.Операция +// * Автоопределение - Булево // * ОписаниеПрограмм - Массив из см. ЭлектроннаяПодписьСлужебныйПовтИсп.ОписаниеПрограммы // * СвойстваОшибки - Массив из Структура: // ** Описание - Строка @@ -1982,48 +2241,17 @@ Контекст.Вставить("ПоказатьОшибку"); Контекст.Вставить("АлгоритмПодписи"); Контекст.Вставить("ИнтерактивныйРежим"); - Возврат Контекст; + Контекст.Вставить("Автоопределение"); + + Возврат Контекст; КонецФункции // Продолжение процедуры СоздатьМенеджерКриптографии. -Процедура СоздатьМенеджерКриптографииПослеПодключенияРасширенияРаботыСКриптографией(Подключено, Контекст) Экспорт +Асинх Процедура СоздатьМенеджерКриптографииПослеПодключенияРасширенияРаботыСКриптографией(Подключено, Контекст) Экспорт ЗаголовокФормы = НСтр("ru = 'Требуется программа электронной подписи и шифрования'"); - Операция = Контекст.Операция; - - Если Операция = "Подписание" Тогда - ЗаголовокОшибки = НСтр("ru = 'Не удалось подписать данные по причине:'"); - - ИначеЕсли Операция = "ПроверкаПодписи" Тогда - ЗаголовокОшибки = НСтр("ru = 'Не удалось проверить подпись по причине:'"); - - ИначеЕсли Операция = "Шифрование" Тогда - ЗаголовокОшибки = НСтр("ru = 'Не удалось зашифровать данные по причине:'"); - - ИначеЕсли Операция = "Расшифровка" Тогда - ЗаголовокОшибки = НСтр("ru = 'Не удалось расшифровать данные по причине:'"); - - ИначеЕсли Операция = "ПроверкаСертификата" Тогда - ЗаголовокОшибки = НСтр("ru = 'Не удалось проверить сертификат по причине:'"); - - ИначеЕсли Операция = "ПолучениеСертификатов" Тогда - ЗаголовокОшибки = НСтр("ru = 'Не удалось получить сертификаты по причине:'"); - - ИначеЕсли Операция = "ПродлениеСрокаДействияПодписи" Тогда - ЗаголовокОшибки = НСтр("ru = 'Не удалось продлить действие подписи по причине:'"); - - ИначеЕсли Операция = Null И Контекст.ПоказатьОшибку <> Истина Тогда - ЗаголовокОшибки = ""; - - ИначеЕсли Операция <> "" Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка в функции %1. - |Неверное значение параметра Операция ""%2"".'"), "МенеджерКриптографии", Операция); - Иначе - ЗаголовокОшибки = НСтр("ru = 'Не удалось выполнить операцию по причине:'"); - КонецЕсли; - + ЗаголовокОшибки = ЗаголовокОшибкиОперации(Контекст.Операция, Контекст.ПоказатьОшибку); ОписаниеОшибок = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовоеОписаниеОшибок(); ОписаниеОшибок.ЗаголовокОшибки = ЗаголовокОшибки; @@ -2033,7 +2261,8 @@ И Не ОбщегоНазначенияКлиент.ЭтоLinuxКлиент() И Не ОбщегоНазначенияКлиент.ЭтоMacOSКлиент() Тогда - ТекстОбщейОшибки = НСтр("ru = 'Устройство не поддерживается.'"); + ТекстОбщейОшибки = ТекстОшибкиУстройствоНеПоддерживается(); + СвойстваОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовыеСвойстваОшибки(); СвойстваОшибки.НеПоддерживается = Истина; КонецЕсли; @@ -2046,6 +2275,33 @@ СвойстваОшибки.НетРасширения = Истина; КонецЕсли; + Если ТипЗнч(Контекст.Программа) = Тип("Строка") Или ТипЗнч(Контекст.Программа) = Тип("ДвоичныеДанные") Тогда + + ТребуетсяЗакрытыйКлюч = Контекст.Операция = "Подписание" + Или Контекст.Операция = "Расшифровка"; + + Результат = Ждать ЗаполнитьПараметрыДляСозданияМенеджераКриптографии(Контекст, ТребуетсяЗакрытыйКлюч); + Контекст = Результат.Контекст; + + Если ЗначениеЗаполнено(Результат.Ошибка) Тогда + + Если ТребуетсяЗакрытыйКлюч И Контекст.Программа = Неопределено Тогда + + ТекстОбщейОшибки = Результат.Ошибка; + СвойстваОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовыеСвойстваОшибки(); + + Иначе + + СвойстваОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовыеСвойстваОшибки(); + СвойстваОшибки.Описание = Результат.Ошибка; + ОписаниеОшибок.Ошибки.Добавить(СвойстваОшибки); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + Если ЗначениеЗаполнено(ТекстОбщейОшибки) Тогда СвойстваОшибки.Описание = ТекстОбщейОшибки; @@ -2066,20 +2322,36 @@ Возврат; КонецЕсли; + ПрограммыАвто = Неопределено; + + Если Контекст.Автоопределение И ТипЗнч(Контекст.Программа) <> Тип("Структура") + И ТипЗнч(Контекст.Программа) <> Тип("ФиксированнаяСтруктура") Тогда + + КриптопровайдерыРезультат = Ждать УстановленныеКриптопровайдерыИзКэша(); + ПрограммыАвто = ЭлектроннаяПодписьСлужебныйКлиентСервер.РезультатПоискаКриптопровайдеров(КриптопровайдерыРезультат); + + Если ТипЗнч(ПрограммыАвто) = Тип("Строка") Тогда + СвойстваОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовыеСвойстваОшибки(); + СвойстваОшибки.Описание = ПрограммыАвто; + ОписаниеОшибок.Ошибки.Добавить(СвойстваОшибки); + ПрограммыАвто = Неопределено; + КонецЕсли; + + КонецЕсли; + Контекст.Вставить("ЗаголовокФормы", ЗаголовокФормы); Контекст.Вставить("ОписаниеОшибок", ОписаниеОшибок); Контекст.Вставить("ЭтоLinux", ТребуетсяПутьКПрограмме()); - + ОписанияПрограмм = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииОписанияПрограмм( - Контекст.Программа, ОписаниеОшибок.Ошибки, ЭлектроннаяПодписьКлиент.ОбщиеНастройки().ОписанияПрограмм); + Контекст.Программа, ОписаниеОшибок.Ошибки, ЭлектроннаяПодписьКлиент.ОбщиеНастройки().ОписанияПрограмм, ПрограммыАвто); Контекст.Вставить("Менеджер", Неопределено); Если ОписанияПрограмм = Неопределено Или ОписанияПрограмм.Количество() = 0 Тогда - - СоздатьМенеджерКриптографииПослеЦикла(Контекст); - Возврат; + СоздатьМенеджерКриптографииПослеЦикла(Контекст); + Возврат; КонецЕсли; Контекст.Вставить("ОписанияПрограмм", ОписанияПрограмм); @@ -2089,6 +2361,106 @@ КонецПроцедуры +// Для процедуры СоздатьМенеджерКриптографии. +Функция ЗаголовокОшибкиОперации(Операция, ПоказатьОшибку) + + Если Операция = "Подписание" Тогда + ЗаголовокОшибки = НСтр("ru = 'Не удалось подписать данные по причине:'"); + + ИначеЕсли Операция = "ПроверкаПодписи" Тогда + ЗаголовокОшибки = НСтр("ru = 'Не удалось проверить подпись по причине:'"); + + ИначеЕсли Операция = "Шифрование" Тогда + ЗаголовокОшибки = НСтр("ru = 'Не удалось зашифровать данные по причине:'"); + + ИначеЕсли Операция = "Расшифровка" Тогда + ЗаголовокОшибки = НСтр("ru = 'Не удалось расшифровать данные по причине:'"); + + ИначеЕсли Операция = "ПроверкаСертификата" Тогда + ЗаголовокОшибки = НСтр("ru = 'Не удалось проверить сертификат по причине:'"); + + ИначеЕсли Операция = "ПолучениеСертификатов" Тогда + ЗаголовокОшибки = НСтр("ru = 'Не удалось получить сертификаты по причине:'"); + + ИначеЕсли Операция = "ПродлениеСрокаДействияПодписи" Тогда + ЗаголовокОшибки = НСтр("ru = 'Не удалось продлить действие подписи по причине:'"); + + ИначеЕсли Операция = Null И ПоказатьОшибку <> Истина Тогда + ЗаголовокОшибки = ""; + + ИначеЕсли Операция <> "" Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка в функции %1. + |Неверное значение параметра Операция ""%2"".'"), "МенеджерКриптографии", Операция); + Иначе + ЗаголовокОшибки = НСтр("ru = 'Не удалось выполнить операцию по причине:'"); + КонецЕсли; + + Возврат ЗаголовокОшибки; + +КонецФункции + +// Для процедуры СоздатьМенеджерКриптографии. +// +// Возвращает уточненный контекст создания менеджера криптографии для указанных данных подписи или сертификата. +// Контекст - см. КонтекстСоздатьМенеджерКриптографии +// +Асинх Функция ЗаполнитьПараметрыДляСозданияМенеджераКриптографии(Контекст, ТребуетсяЗакрытыйКлюч) + + Результат = Новый Структура("Контекст, Ошибка", Контекст, ""); + Данные = Контекст.Программа; + + Попытка + + ТипДанных = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОпределитьТипДанных(Данные); + + Исключение + + Результат.Контекст.Программа = Неопределено; + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось определить программу для переданных данных: %1'"), + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат Результат; + + КонецПопытки; + + Если ТипДанных = "Сертификат" Тогда + + ПрограммаПоСертификатуРезультат = Ждать ПрограммаПоСертификату(Данные, ТребуетсяЗакрытыйКлюч,, Истина); + Если ЗначениеЗаполнено(ПрограммаПоСертификатуРезультат.Ошибка) Тогда + + Результат.Ошибка = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТекстОшибкиНеУдалосьОпределитьПрограмму( + ПрограммаПоСертификатуРезультат.Ошибка); + Результат.Контекст.АлгоритмПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмПодписиСертификата(Данные); + Результат.Контекст.Программа = Неопределено; + + Иначе + Результат.Контекст.Программа = ПрограммаПоСертификатуРезультат.Программа; + КонецЕсли; + + Возврат Результат; + + ИначеЕсли ТипДанных = "Подпись" Тогда + + Результат.Контекст.Программа = Неопределено; + Результат.Контекст.АлгоритмПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмСформированнойПодписи(Данные); + Возврат Результат; + + ИначеЕсли ТипДанных = "ЗашифрованныеДанные" Тогда + + Результат.Контекст.Программа = Неопределено; + Результат.Ошибка = НСтр("ru = 'Для определения программы для расшифровки в процедуру должны быть переданы данные сертификата.'"); + Возврат Результат; + + КонецЕсли; + + Результат.Контекст.Программа = Неопределено; + Результат.Ошибка = НСтр("ru = 'Не удалось определить программу для переданных данных.'"); + + Возврат Результат; + +КонецФункции + // Продолжение процедуры СоздатьМенеджерКриптографии. Процедура СоздатьМенеджерКриптографииЦиклНачало(Контекст) Экспорт @@ -2128,6 +2500,12 @@ КонецЕсли; КонецЕсли; + Если ОписаниеПрограммы.Свойство("Автоопределение") Тогда + ОписаниеПути = Новый Структура("ПутьКПрограмме, Существует", ОписаниеПрограммы.ПутьКПрограммеАвто, Истина); + СоздатьМенеджерКриптографииЦиклПослеПолученияПутиКПрограмме(ОписаниеПути, Контекст); + Возврат; + КонецЕсли; + ИдентификаторПутиКПрограмме = ?(ЗначениеЗаполнено(ОписаниеПрограммы.Ссылка), ОписаниеПрограммы.Ссылка, ОписаниеПрограммы.Идентификатор); @@ -2229,7 +2607,7 @@ ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииДобавитьОшибку( Контекст.ОписаниеОшибок.Ошибки, ОписаниеПрограммы.Ссылка, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке), + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Ложь, Истина, Истина); СоздатьМенеджерКриптографииЦиклНачало(Контекст); @@ -2284,62 +2662,439 @@ КонецПроцедуры -// Только для внутреннего назначения. -// +Асинх Функция ОбъектВнешнейКомпонентыExtraCryptoAPI(ПредложитьУстановить = Истина) + + Если Не ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() + И Не ОбщегоНазначенияКлиент.ЭтоLinuxКлиент() + И Не ОбщегоНазначенияКлиент.ЭтоMacOSКлиент() Тогда + + ВызватьИсключение ТекстОшибкиУстройствоНеПоддерживается(); + + КонецЕсли; + + ОписаниеКомпоненты = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОписаниеКомпоненты(); + ПараметрыПодключения = ОбщегоНазначенияКлиент.ПараметрыПодключенияКомпоненты(); + ПараметрыПодключения.ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для упрощения работы с криптографией требуется установка внешней компоненты %1.'"), + ОписаниеКомпоненты.ИмяОбъекта); + ПараметрыПодключения.ПредложитьУстановить = ПредложитьУстановить; + ПараметрыПодключения.ПредложитьЗагрузить = Ложь; + + Результат = Ждать ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакетаАсинх( + ОписаниеКомпоненты.ИмяОбъекта, + ОписаниеКомпоненты.ПолноеИмяМакета, + ПараметрыПодключения); + + Если Результат.Подключено Тогда + ОбъектКомпоненты = Результат.ПодключаемыйМодуль; + ОбъектКомпоненты = Ждать НастроитьКомпоненту(ОбъектКомпоненты); + ИначеЕсли ЗначениеЗаполнено(Результат.ОписаниеОшибки) Тогда + ВызватьИсключение Результат.ОписаниеОшибки; + Иначе + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось подключить внешнюю компоненту %1.'"), ОписаниеКомпоненты.ИмяОбъекта); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Возврат ОбъектКомпоненты; + +КонецФункции + +Асинх Функция НастроитьКомпоненту(ОбъектКомпоненты) + + Попытка + Ждать ОбъектКомпоненты.УстановитьСоответствиеOIDАсинх( + ЭлектроннаяПодписьСлужебныйКлиентСервер.ИдентификаторыАлгоритмовХешированияИОткрытогоКлюча()); + Исключение + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось установить свойство %1 компоненты %2 по причине: + |%3'"), "СоответствиеOID", "ExtraCryptoAPI", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстОшибки; + КонецПопытки; + + Возврат ОбъектКомпоненты; + +КонецФункции + +Асинх Функция ПрограммаПоСертификату(Сертификат, + ТребуетсяЗакрытыйКлюч = Неопределено, ОбъектКомпоненты = Неопределено, ПредложитьУстановить = Ложь) Экспорт + + Результат = Новый Структура("Программа, Ошибка"); + + Если ОбъектКомпоненты = Неопределено Тогда + Попытка + ОбъектКомпоненты = Ждать ОбъектВнешнейКомпонентыExtraCryptoAPI(ПредложитьУстановить); + Исключение + Результат.Ошибка = ТекстОшибкиНеУстановленаКомпонента(); + Возврат Результат; + КонецПопытки; + КонецЕсли; + + Сертификат = Ждать СертификатBase64Строка(Сертификат); + + Если ТребуетсяЗакрытыйКлюч <> Ложь Тогда + + Попытка + РезультатСвойстваКриптопровайдера = Ждать ОбъектКомпоненты.ПолучитьСвойстваКриптопровайдераАсинх(Сертификат); + ТекущийКриптопровайдер = КриптопровайдерИзОтветаКомпоненты(РезультатСвойстваКриптопровайдера.Значение); + Исключение + Результат.Ошибка = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Возврат Результат; + КонецПопытки; + + ПрограммыПоИменамСТипом = ЭлектроннаяПодписьКлиент.ОбщиеНастройки().ПрограммыПоИменамСТипом; + РасширенноеОписаниеПрограммы = ЭлектроннаяПодписьСлужебныйКлиентСервер.РасширенноеОписаниеПрограммы( + ТекущийКриптопровайдер, ПрограммыПоИменамСТипом); + + Если РасширенноеОписаниеПрограммы <> Неопределено Тогда + Результат.Программа = РасширенноеОписаниеПрограммы; + Возврат Результат; + ИначеЕсли ТребуетсяЗакрытыйКлюч = Истина И ТекущийКриптопровайдер.Получить("type") <> 0 Тогда + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сертификат связан с программой %1 с типом %2, настройте ее в справочнике для использования.'"), + ТекущийКриптопровайдер.Получить("name"), + ТекущийКриптопровайдер.Получить("type")); + Возврат Результат; + КонецЕсли; + + КонецЕсли; + + Если ТребуетсяЗакрытыйКлюч = Истина Тогда + Результат.Ошибка = ТекстОшибкиНеУдалосьОпределитьПрограммуПоЗакрытомуКлючуСертификата(); + Возврат Результат; + КонецЕсли; + + СвойстваСертификата = Ждать ПолучитьСвойстваСертификатаАсинх(Сертификат, ОбъектКомпоненты); + Если ЗначениеЗаполнено(СвойстваСертификата.Ошибка) Тогда + Результат.Ошибка = СвойстваСертификата.Ошибка; + Возврат Результат; + КонецЕсли; + + СвойстваСертификата = СвойстваСертификата.СвойстваСертификата; + + УстановленныеКриптопровайдеры = Ждать УстановленныеКриптопровайдерыИзКэша( + ПредложитьУстановить); + + Если УстановленныеКриптопровайдеры.ПроверкаВыполнена Тогда + + ПрограммыПоИдентификаторамАлгоритмовОткрытогоКлюча = ЭлектроннаяПодписьКлиент.ОбщиеНастройки().ПрограммыПоИдентификаторамАлгоритмовОткрытогоКлюча; + Ошибка = ""; + РасширенноеОписаниеПрограммы = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОпределитьПрограмму(СвойстваСертификата, + УстановленныеКриптопровайдеры.Криптопровайдеры, ПрограммыПоИдентификаторамАлгоритмовОткрытогоКлюча, Ошибка); + Результат.Программа = РасширенноеОписаниеПрограммы; + + Если Результат.Программа = Неопределено Тогда + Результат.Ошибка = Ошибка; + КонецЕсли; + + Возврат Результат; + + Иначе + Результат.Ошибка = УстановленныеКриптопровайдеры.Ошибка; + Возврат Результат; + КонецЕсли; + +КонецФункции + +Функция ТекстОшибкиНеУдалосьОпределитьПрограммуПоЗакрытомуКлючуСертификата() + + Возврат НСтр("ru = 'Не удалось определить программу по закрытому ключу сертификата.'"); + +КонецФункции + +Функция КриптопровайдерИзОтветаКомпоненты(Знач Текст) + + Результат = Новый Соответствие; + + Попытка + + ЗаполнитьСоответствиеИзОтветаJSON(Результат, Текст); + Возврат Результат; + + Исключение + + ИнформацияОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось прочитать ответ компоненты: %1 + |%2'"), Текст, ИнформацияОбОшибке); + + КонецПопытки; + + Возврат Результат; + +КонецФункции + +// Для функции КриптопровайдерИзОтветаКомпоненты +Процедура ЗаполнитьСоответствиеИзОтветаJSON(Результат, Знач ТекстJSON) + + ТекстJSON = СтрЗаменить(СокрЛП(ТекстJSON), Символы.ПС, ""); + ТекстJSON = СокрЛП(Сред(ТекстJSON, 2, СтрДлина(ТекстJSON)-2)); + + Пока ТекстJSON <> "" Цикл + + Позиция = СтрНайти(ТекстJSON, ":"); + Если Позиция = 0 Тогда + Прервать; + КонецЕсли; + + ИмяЗначения = СокрЛП(Лев(ТекстJSON, Позиция-1)); + ИмяЗначения = СтрЗаменить(ИмяЗначения, """",""); + + ЭтоЧисло = Ложь; + ТекстJSON = СокрЛП(Сред(ТекстJSON, Позиция+1)); + Если Лев(ТекстJSON, 1) = """" Тогда + ТекстJSON = СокрЛП(Сред(ТекстJSON, 2)); + Иначе + ЭтоЧисло = Истина; + КонецЕсли; + + Позиция = 0; + Для НоваяПозиция = 1 По СтрДлина(ТекстJSON) Цикл + Символ = Сред(ТекстJSON, НоваяПозиция, 1); + + СледующийСимвол = Неопределено; + Если Символ = "," Тогда + Для СледующаяПозиция = НоваяПозиция + 1 По СтрДлина(ТекстJSON) Цикл + СледующийСимвол = Сред(ТекстJSON, СледующаяПозиция, 1); + Если СледующийСимвол <> " " Тогда + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + Если Символ = "," И (СледующийСимвол = Неопределено ИЛИ СледующийСимвол = """") Тогда + Позиция = НоваяПозиция; + Прервать; + КонецЕсли; + КонецЦикла; + + Если Позиция = 0 Тогда + Значение = ТекстJSON; + ТекстJSON = ""; + Иначе + Значение = Лев(ТекстJSON, Позиция-1); + ТекстJSON = СокрЛП(Сред(ТекстJSON, Позиция + ?(Сред(ТекстJSON, Позиция, 1) = ",", 1, 0))); + КонецЕсли; + + Значение = СокрЛП(Значение); + Если Значение = "true" Тогда + Значение = Истина; + ИначеЕсли Значение = "false" Тогда + Значение = Ложь; + ИначеЕсли Значение = "null" Тогда + Значение = Неопределено; + Иначе + Если ЭтоЧисло Тогда + Значение = СтроковыеФункцииКлиентСервер.СтрокаВЧисло(Значение); + Иначе + Значение = Лев(Значение, СтрДлина(Значение)-1); + КонецЕсли; + КонецЕсли; + + Результат.Вставить(ИмяЗначения, Значение); + + КонецЦикла; + +КонецПроцедуры + +// Контейнеры по сертификату. +// // Параметры: -// ПараметрыСоздания - Структура: -// * ВЛичныйСписок - Булево - если не указано, значит Ложь. -// Если Истина, то реквизит Пользователь будет заполнено текущим пользователем. -// * Организация - ОпределяемыйТип.Организация - значение по умолчанию. -// * СкрытьЗаявление - Булево - не предлагать создать заявление на выпуск сертификата. -// * СоздатьЗаявление - Булево - сразу открыть форму создания заявления на выпуск сертификата. -// * ФизическоеЛицо - СправочникСсылка - физическое лицо, для которого нужно создать заявление -// на выпуск сертификата (когда заполнено, имеет приоритет над организацией). -// Значение по умолчанию - Неопределено. +// Сертификат - ДвоичныеДанные +// - Строка - адрес во временном хранилище +// - Строка - строковое представление сертификата в формате Base64 +// - СертификатКриптографии +// ОбъектКомпоненты - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты +// +// Возвращаемое значение: +// Обещание - Массив из см. НовыеСвойстваКонтейнера +// +Асинх Функция КонтейнерыПоСертификату(Сертификат, ОбъектКомпоненты = Неопределено) Экспорт + + Если ОбъектКомпоненты = Неопределено Тогда + ОбъектКомпоненты = Ждать ОбъектВнешнейКомпонентыExtraCryptoAPI(Истина); + КонецЕсли; + + Сертификат = Ждать СертификатBase64Строка(Сертификат); + + Контейнеры = Новый Массив; + СвойстваСертификатаРезультат = Ждать ПолучитьСвойстваСертификатаАсинх(Сертификат, ОбъектКомпоненты); + + Если Не ПустаяСтрока(СвойстваСертификатаРезультат.Ошибка) Тогда + ВызватьИсключение СвойстваСертификатаРезультат.Ошибка; + КонецЕсли; + + СвойстваСертификата = СвойстваСертификатаРезультат.СвойстваСертификата; + + ИменаКонтейнеров = Новый Соответствие; + ПрограммаПоСертификатуРезультат = Ждать ПрограммаПоСертификату(Сертификат, Неопределено, ОбъектКомпоненты, Истина); + + Если ПрограммаПоСертификатуРезультат.Программа <> Неопределено Тогда + Контейнеры = Ждать ДобавитьКонтейнерыПоСертификатуПоКриптопровайдеру( + СвойстваСертификата, ПрограммаПоСертификатуРезультат.Программа, + ОбъектКомпоненты, Контейнеры, ИменаКонтейнеров); + + Для Каждого ТекущийКонтейнер Из Контейнеры Цикл + ИменаКонтейнеров.Вставить(ТекущийКонтейнер.Имя, Истина); + КонецЦикла; + КонецЕсли; + + КриптопровайдерыРезультат = Ждать УстановленныеКриптопровайдеры(ОбъектКомпоненты); + + Если Не КриптопровайдерыРезультат.ПроверкаВыполнена Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось получить список установленных криптопровайдеров: + |%1'"), КриптопровайдерыРезультат.Ошибка); + КонецЕсли; + + Для Каждого ТекущийКриптопровайдер Из КриптопровайдерыРезультат.Криптопровайдеры Цикл + Контейнеры = Ждать ДобавитьКонтейнерыПоСертификатуПоКриптопровайдеру( + СвойстваСертификата, ТекущийКриптопровайдер, + ОбъектКомпоненты, Контейнеры, ИменаКонтейнеров); + Для Каждого ТекущийКонтейнер Из Контейнеры Цикл + ИменаКонтейнеров.Вставить(ТекущийКонтейнер.Имя, Истина); + КонецЦикла; + КонецЦикла; + + Возврат Контейнеры; + +КонецФункции + +// Для КонтейнерыПоСертификату +Асинх Функция ДобавитьКонтейнерыПоСертификатуПоКриптопровайдеру(СвойстваСертификата, Криптопровайдер, ОбъектКомпоненты, Контейнеры, ИменаКонтейнеров) + + Результат = Ждать ОбъектКомпоненты.НайтиКонтейнерыАсинх( + Криптопровайдер.ТипПрограммы, + Криптопровайдер.ИмяПрограммы, + СвойстваСертификата.Сертификат); + + Если ЗначениеЗаполнено(Результат.Значение) И Результат.Значение <> "null" Тогда + Прочитано = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПрочитатьОтветКомпоненты(Результат.Значение); + Иначе + Возврат Контейнеры; + КонецЕсли; + + КонтейнерыКриптопровайдера = Прочитано.Получить(Криптопровайдер.ИмяПрограммы); + СвойстваКонтейнеров = КонтейнерыКриптопровайдера.Получить("containers"); + + Если СвойстваКонтейнеров = Неопределено Тогда + Возврат Контейнеры; + КонецЕсли; + + Для Каждого ТекущийКонтейнер Из СвойстваКонтейнеров Цикл + + ИмяКонтейнера = ТекущийКонтейнер.Получить("FQCN"); + + Если ИменаКонтейнеров.Получить(ИмяКонтейнера) = Истина Тогда + Продолжить; + КонецЕсли; + + ЭтоТекущийКонтейнер = ИмяКонтейнера = СвойстваСертификата.ИмяКонтейнера; + + Контейнер = НовыеСвойстваКонтейнера(); + Контейнер.Имя = ИмяКонтейнера; + Контейнер.ДружественноеИмя = ТекущийКонтейнер.Получить("Friendly name"); + Если Не ЗначениеЗаполнено(Контейнер.ДружественноеИмя) Тогда + Контейнер.ДружественноеИмя = Контейнер.Имя; + КонецЕсли; + Контейнер.ТипПрограммы = Криптопровайдер.ТипПрограммы; + Контейнер.ИмяПрограммы = Криптопровайдер.ИмяПрограммы; + Контейнер.ПутьКПрограмме = Криптопровайдер.ПутьКПрограммеАвто; + + Контейнер.Вставить("ЭтоТекущийКонтейнер", ЭтоТекущийКонтейнер); + + Контейнеры.Добавить(Контейнер); + + КонецЦикла; + + Возврат Контейнеры; + +КонецФункции + +// Свойства контейнера закрытого ключа. +// +// Возвращаемое значение: +// Структура: +// * Имя - Строка +// * ДружественноеИмя - Строка +// * ТипПрограммы - Число +// * ИмяПрограммы - Строка +// * ПутьКПрограмме - Строка +// +Функция НовыеСвойстваКонтейнера() Экспорт + + Контейнер = Новый Структура; + Контейнер.Вставить("Имя", ""); + Контейнер.Вставить("ДружественноеИмя", ""); + Контейнер.Вставить("ТипПрограммы", 0); + Контейнер.Вставить("ИмяПрограммы", ""); + Контейнер.Вставить("ПутьКПрограмме", ""); + + Возврат Контейнер; + +КонецФункции + + +// Только для внутреннего назначения. +// +// Параметры: +// ПараметрыСоздания - см. ПараметрыДобавленияСертификата +// ОбработчикЗавершения - Неопределено - обработчик завершения // Процедура ДобавитьСертификат(ПараметрыСоздания = Неопределено, ОбработчикЗавершения = Неопределено) Экспорт - Если ТипЗнч(ПараметрыСоздания) <> Тип("Структура") Тогда - ПараметрыСоздания = Новый Структура; - КонецЕсли; + ПараметрыДобавленияСертификата = ПараметрыДобавленияСертификата(); + ЗаполнитьЗначенияСвойств(ПараметрыДобавленияСертификата, ПараметрыСоздания); + ПараметрыДобавленияСертификата.ОбработчикЗавершения = ОбработчикЗавершения; - Если Не ПараметрыСоздания.Свойство("ВЛичныйСписок") Тогда - ПараметрыСоздания.Вставить("ВЛичныйСписок", Ложь); - КонецЕсли; - - Если Не ПараметрыСоздания.Свойство("Организация") Тогда - ПараметрыСоздания.Вставить("Организация", Неопределено); - КонецЕсли; - - Если Не ПараметрыСоздания.Свойство("ФизическоеЛицо") Тогда - ПараметрыСоздания.Вставить("ФизическоеЛицо", Неопределено); - КонецЕсли; - - Если Не ПараметрыСоздания.Свойство("СертификатОснование") Тогда - ПараметрыСоздания.Вставить("СертификатОснование", Неопределено); - КонецЕсли; - - ПараметрыСоздания.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); - - Если ПараметрыСоздания.Свойство("СоздатьЗаявление") И ПараметрыСоздания.СоздатьЗаявление = Истина Тогда - ДобавитьСертификатПослеВыбораНазначения("ЗаявлениеНаВыпускСертификата", ПараметрыСоздания); + Если ПараметрыДобавленияСертификата.СоздатьЗаявление = Истина Тогда + ДобавитьСертификатПослеВыбораНазначения("ЗаявлениеНаВыпускСертификата", ПараметрыДобавленияСертификата); Возврат; КонецЕсли; - Если Не ПараметрыСоздания.Свойство("СкрытьЗаявление") Тогда - ПараметрыСоздания.Вставить("СкрытьЗаявление", Истина); + Если ПараметрыДобавленияСертификата.СкрытьЗаявление = Неопределено Тогда + ПараметрыДобавленияСертификата.СкрытьЗаявление = Истина; КонецЕсли; Форма = ОткрытьФорму("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.ДобавлениеСертификата", - Новый Структура("СкрытьЗаявление", ПараметрыСоздания.СкрытьЗаявление),,,,, - Новый ОписаниеОповещения("ДобавитьСертификатПослеВыбораНазначения", ЭтотОбъект, ПараметрыСоздания)); + Новый Структура("СкрытьЗаявление", ПараметрыДобавленияСертификата.СкрытьЗаявление),,,,, + Новый ОписаниеОповещения("ДобавитьСертификатПослеВыбораНазначения", ЭтотОбъект, ПараметрыДобавленияСертификата)); Если Форма = Неопределено Тогда - ДобавитьСертификатПослеВыбораНазначения("ДляПодписанияШифрованияИРасшифровки", ПараметрыСоздания); + ДобавитьСертификатПослеВыбораНазначения("ДляПодписанияШифрованияИРасшифровки", ПараметрыДобавленияСертификата); КонецЕсли; КонецПроцедуры +// Только для внутреннего назначения. +// +// Возвращаемое значение: +// Структура - параметры добавления сертификата: +// * ВЛичныйСписок - Булево - если не указано, значит Ложь. +// * Организация - ОпределяемыйТип.Организация - значение по умолчанию. +// * ФизическоеЛицо - СправочникСсылка - физическое лицо, для которого нужно создать заявление +// на выпуск сертификата (когда заполнено, имеет приоритет над организацией). +// Значение по умолчанию - Неопределено. +// * СертификатОснование - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - сертификат, который надо перевыпустить. +// * ОбработчикЗавершения - ОписаниеОповещения +// * СоздатьЗаявление - Булево - сразу открыть форму создания заявления на выпуск сертификата. +// * СкрытьЗаявление - Булево - не предлагать создать заявление на выпуск сертификата. +// +Функция ПараметрыДобавленияСертификата() Экспорт + + Структура = Новый Структура; + Структура.Вставить("ВЛичныйСписок", Ложь); + Структура.Вставить("Организация", Неопределено); + Структура.Вставить("ФизическоеЛицо", Неопределено); + Структура.Вставить("СертификатОснование", Неопределено); + Структура.Вставить("ОбработчикЗавершения", Неопределено); + Структура.Вставить("СоздатьЗаявление", Неопределено); + Структура.Вставить("СкрытьЗаявление", Неопределено); + + Возврат Структура; + +КонецФункции + // Только для внутреннего назначения. Процедура ДобавитьСертификатПослеВыбораНазначения(Назначение, ПараметрыСоздания) Экспорт @@ -2359,6 +3114,16 @@ Возврат; КонецЕсли; + Если Назначение = "ТолькоДляШифрованияИзФайлов" Тогда + ДобавитьСертификатТолькоДляШифрованияИзФайла(ПараметрыСоздания, Истина); + Возврат; + КонецЕсли; + + Если Назначение = "ТолькоДляШифрованияИзКаталога" Тогда + ДобавитьСертификатТолькоДляШифрованияИзКаталога(ПараметрыСоздания); + Возврат; + КонецЕсли; + Если Назначение <> "ТолькоДляШифрования" Тогда ПараметрыФормы.Вставить("ДляШифрованияИРасшифровки", Неопределено); @@ -2513,27 +3278,44 @@ КонецПроцедуры // Только для внутреннего назначения. -Процедура ДобавитьСертификатТолькоДляШифрованияИзФайла(ПараметрыСоздания) Экспорт +Процедура ДобавитьСертификатТолькоДляШифрованияИзФайла(ПараметрыСоздания, МножественныйВыбор = Ложь) Экспорт Оповещение = Новый ОписаниеОповещения("ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеПомещенияФайлов", ЭтотОбъект, ПараметрыСоздания); ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла(); - ПараметрыЗагрузки.Диалог.Заголовок = НСтр("ru = 'Выберите файл сертификата (только для шифрования)'"); + ПараметрыЗагрузки.Диалог.Заголовок = НСтр("ru = 'Выберите файл(ы) сертификата (только для шифрования)'"); ПараметрыЗагрузки.Диалог.Фильтр = НСтр("ru = 'Сертификат X.509 (*.cer;*.crt)|*.cer;*.crt|Все файлы (*.*)|*.*'"); - ФайловаяСистемаКлиент.ЗагрузитьФайл(Оповещение, ПараметрыЗагрузки); + Если МножественныйВыбор Тогда + ПараметрыЗагрузки.Диалог.МножественныйВыбор = МножественныйВыбор; + ФайловаяСистемаКлиент.ЗагрузитьФайлы(Оповещение, ПараметрыЗагрузки); + Иначе + ФайловаяСистемаКлиент.ЗагрузитьФайл(Оповещение, ПараметрыЗагрузки); + КонецЕсли; КонецПроцедуры // Продолжение процедуры ДобавитьСертификатТолькоДляШифрованияИзФайла. -Процедура ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеПомещенияФайлов(ПомещенныйФайл, Контекст) Экспорт +Процедура ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеПомещенияФайлов(ПомещенныеФайлы, Контекст) Экспорт - Если Не ЗначениеЗаполнено(ПомещенныйФайл) Тогда + Если Не ЗначениеЗаполнено(ПомещенныеФайлы) Тогда Возврат; КонецЕсли; - ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеПомещенияФайла(ПомещенныйФайл.Хранение, Контекст); + Если ТипЗнч(ПомещенныеФайлы) = Тип("Массив") Тогда + + Если ПомещенныеФайлы.Количество() = 1 Тогда + ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеПомещенияФайла(ПомещенныеФайлы[0].Хранение, Контекст); + Возврат; + КонецЕсли; + + ДобавитьСертификатыТолькоДляШифрованияИзФайлаПослеПомещенияФайлов(ПомещенныеФайлы, Контекст); + Возврат; + + КонецЕсли; + + ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеПомещенияФайла(ПомещенныеФайлы.Хранение, Контекст); КонецПроцедуры @@ -2567,6 +3349,19 @@ КонецПроцедуры +// Продолжение процедуры ДобавитьСертификатТолькоДляШифрованияИзФайла. +Процедура ДобавитьСертификатыТолькоДляШифрованияИзФайлаПослеПомещенияФайлов(ПомещенныеФайлы, Контекст) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПомещенныеФайлы", ПомещенныеФайлы); + ПараметрыФормы.Вставить("Организация", Контекст.Организация); + + ОбработчикЗавершения = ?(Контекст.Свойство("ОбработчикЗавершения"), Контекст.ОбработчикЗавершения, Неопределено); + Форма = ОткрытьФорму("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.ДобавлениеСертификатовДляШифрования", + ПараметрыФормы, , , , , ОбработчикЗавершения); + +КонецПроцедуры + // Продолжение процедуры ДобавитьСертификатТолькоДляШифрованияИзФайла. Процедура ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеПредупрежденияОСуществующем(Ответ, Сертификат) Экспорт @@ -2578,6 +3373,65 @@ КонецПроцедуры +// Только для внутреннего назначения. +Процедура ДобавитьСертификатТолькоДляШифрованияИзКаталога(ПараметрыСоздания) + + Оповещение = Новый ОписаниеОповещения("ДобавитьСертификатТолькоДляШифрованияИзКаталогаПослеПодключенияРасширения", + ЭтотОбъект, ПараметрыСоздания); + + ТекстПредложения = НСтр("ru = 'Для поиска файлов в каталоге требуется расширение для работы с файлами'"); + ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(Оповещение, ТекстПредложения, Ложь); + +КонецПроцедуры + +// Продолжение процедуры ДобавитьСертификатТолькоДляШифрованияИзКаталога. +Процедура ДобавитьСертификатТолькоДляШифрованияИзКаталогаПослеПодключенияРасширения(Результат, ПараметрыСоздания) Экспорт + + Если Результат <> Истина Тогда + Возврат; + КонецЕсли; + + Оповещение = Новый ОписаниеОповещения("ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеВыбораКаталога", + ЭтотОбъект, ПараметрыСоздания); + + Заголовок = НСтр("ru = 'Выберите каталог файлов сертификатов (только для шифрования)'"); + + ФайловаяСистемаКлиент.ВыбратьКаталог(Оповещение, Заголовок); + +КонецПроцедуры + +// Продолжение процедуры ДобавитьСертификатТолькоДляШифрованияИзКаталога. +Асинх Процедура ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеВыбораКаталога(ВыбранныйКаталог, Контекст) Экспорт + + Если Не ЗначениеЗаполнено(ВыбранныйКаталог) Тогда + Возврат; + КонецЕсли; + + Оповещение = Новый ОписаниеОповещения("ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеПомещенияФайлов", + ЭтотОбъект, Контекст); + + ОписаниеПередаваемыхФайлов = Новый Массив; + + Файлы = Ждать НайтиФайлыАсинх(ВыбранныйКаталог,"*.*", Истина); + + Для Каждого ТекущийФайл Из Файлы Цикл + Если Ждать ТекущийФайл.ЭтоКаталогАсинх() Тогда + Продолжить; + КонецЕсли; + ОписаниеПередаваемогоФайла = Новый ОписаниеПередаваемогоФайла(ТекущийФайл.ПолноеИмя); + ОписаниеПередаваемыхФайлов.Добавить(ОписаниеПередаваемогоФайла); + КонецЦикла; + + Если ОписаниеПередаваемыхФайлов.Количество() = 0 Тогда + ВызватьИсключение НСтр("ru = 'Указанный каталог не содержит файлов.'"); + КонецЕсли; + + ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла(); + ПараметрыЗагрузки.Интерактивно = Ложь; + ФайловаяСистемаКлиент.ЗагрузитьФайлы(Оповещение, ПараметрыЗагрузки, ОписаниеПередаваемыхФайлов); + +КонецПроцедуры + // Только для внутреннего использования. Процедура ПоказатьОшибкуОбращенияКПрограмме(ЗаголовокФормы, ЗаголовокОшибки, ОшибкаНаКлиенте, ОшибкаНаСервере, ДополнительныеПараметры = Неопределено, ОбработкаПродолжения = Неопределено) Экспорт @@ -3065,7 +3919,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); СохранитьДанныеВместеСПодписьюПослеСохраненияФайлаДанных( - Новый Структура("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)), Контекст); + Новый Структура("ОписаниеОшибки", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)), Контекст); КонецПопытки; КонецПроцедуры @@ -3075,7 +3929,7 @@ Если Результат.Свойство("ОписаниеОшибки") Тогда Ошибка = Новый Структура("ОписаниеОшибки", - НСтр("ru = 'При записи файла возникла ошибка:'") + Символы.ПС + Результат.ОписаниеОшибки); + НСтр("ru = 'Не удалось записать файл по причине:'") + Символы.ПС + Результат.ОписаниеОшибки); ПоказатьОшибкуОбращенияКПрограмме( НСтр("ru = 'Не удалось сохранить подписи вместе с файлом'"), "", Ошибка, Новый Структура); @@ -3453,10 +4307,12 @@ Раздел = "БухгалтерскийИНалоговыйУчет"; ЭлектроннаяПодписьКлиентПереопределяемый.ПриОпределенииРазделаСтатьиНаИТС(Раздел); - Если Раздел = "УчетВГосударственныхУчреждениях" Тогда - ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("http://its.1c.ru/bmk/bud/digsig"); - Иначе - ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("http://its.1c.ru/bmk/comm/digsig"); + НавигационнаяСсылка = ""; + ЭлектроннаяПодписьКлиентСерверЛокализация.ПриОпределенииСсылкиНаИнструкциюПоРаботеСПрограммами( + Раздел, НавигационнаяСсылка); + + Если Не ПустаяСтрока(НавигационнаяСсылка) Тогда + ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(НавигационнаяСсылка); КонецЕсли; КонецПроцедуры @@ -3886,9 +4742,8 @@ КонецПроцедуры - // Только для внутреннего использования. -Процедура ВыполнитьНаСтороне(Оповещение, Операция, СторонаВыполнения, ПараметрыВыполнения) Экспорт +Асинх Процедура ВыполнитьНаСтороне(Оповещение, Операция, СторонаВыполнения, ПараметрыВыполнения) Экспорт Контекст = ВыполнитьНаСторонеНовыйКонтекст(); @@ -3917,9 +4772,29 @@ ВыполнитьНаСторонеВМоделиСервиса(Null, Контекст); Иначе + Если ЗначениеЗаполнено(Контекст.Форма.СертификатПрограмма) Тогда + Программа = Контекст.Форма.СертификатПрограмма; + Иначе + Если Операция = "Подписание" Или Операция = "Расшифровка" Тогда + ТребуетсяЗакрытыйКлюч = Истина; + Иначе + ТребуетсяЗакрытыйКлюч = Неопределено; + КонецЕсли; + ПрограммаПоСертификатуРезультат = Ждать ПрограммаПоСертификату( + ПараметрыВыполнения.СертификатАдрес, ТребуетсяЗакрытыйКлюч, Неопределено, Истина); + Если ЗначениеЗаполнено(ПрограммаПоСертификатуРезультат.Программа) Тогда + Программа = ПрограммаПоСертификатуРезультат.Программа; + Иначе + ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки", ПрограммаПоСертификатуРезультат.Ошибка); + ОшибкаНаКлиенте.Вставить("Инструкция", Истина); + ВыполнитьНаСторонеПослеЦикла(ОшибкаНаКлиенте, Контекст); + Возврат; + КонецЕсли; + КонецЕсли; + ПараметрыСоздания = ПараметрыСозданияМенеджераКриптографии(); ПараметрыСоздания.ПоказатьОшибку = Неопределено; - ПараметрыСоздания.Программа = Контекст.Форма.СертификатПрограмма; + ПараметрыСоздания.Программа = Программа; ПараметрыСоздания.ИнтерактивныйРежим = Контекст.Форма.СертификатВводитьПарольВПрограммеЭлектроннойПодписи; СоздатьМенеджерКриптографии(Новый ОписаниеОповещения( @@ -3955,7 +4830,9 @@ ПолучитьСертификатПоОтпечатку(Новый ОписаниеОповещения( "ВыполнитьНаСторонеПослеПоискаСертификата", ЭтотОбъект, Контекст), - Контекст.Форма.СертификатОтпечаток, Истина, Неопределено, Контекст.Форма.СертификатПрограмма); + Контекст.Форма.СертификатОтпечаток, Истина, Неопределено, + ?(ТипЗнч(Результат) <> Тип("МенеджерКриптографии"), Контекст.Форма.СертификатПрограмма, Результат)); + Иначе ВыполнитьНаСторонеПослеПоискаСертификата(Null, Контекст); КонецЕсли; @@ -4112,7 +4989,6 @@ КонецПроцедуры - // Продолжение процедуры ВыполнитьНаСтороне. Процедура ВыполнитьНаСторонеЦиклПослеОперацииНаКлиентеXMLDSig(КонвертXML, Контекст) Экспорт @@ -4341,8 +5217,12 @@ ОшибкаНаСервере = Новый Структура; АдресРезультата = Неопределено; + Если Не ЗначениеЗаполнено(ПараметрыДляСервера.СертификатПрограмма) Тогда + ПараметрыДляСервера.Вставить("ДанныеДляСозданияМенеджераКриптографии", Контекст.СертификатАдрес); + КонецЕсли; + Если Контекст.Операция = "Подписание" Тогда - + ПараметрыДляСервера.Вставить("ТипПодписи", Контекст.ОписаниеДанных.ТипПодписи); ПараметрыДляСервера.Вставить("Комментарий", Контекст.Форма.Комментарий); ПараметрыДляСервера.Вставить("ЗначениеПароля", Контекст.ЗначениеПароля); @@ -4358,7 +5238,9 @@ КонецЕсли; ИначеЕсли Контекст.Операция = "Шифрование" Тогда + ПараметрыДляСервера.Вставить("АдресСертификатов", Контекст.ОписаниеДанных.СертификатыШифрования); + Иначе // Расшифровка. ПараметрыДляСервера.Вставить("ЗначениеПароля", Контекст.ЗначениеПароля); КонецЕсли; @@ -4385,7 +5267,7 @@ СтандартнаяОбработка = Ложь; - ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ОшибкаНаКлиенте.Вставить("Инструкция", Истина); ВыполнитьНаСторонеПослеЦикла(ОшибкаНаКлиенте, Контекст); @@ -4400,7 +5282,7 @@ // ** Описание - Строка // Контекст - Структура // -Процедура ВыполнитьНаСторонеЦиклПослеОперацииНаКлиенте(ДвоичныеДанные, Контекст) Экспорт +Асинх Процедура ВыполнитьНаСторонеЦиклПослеОперацииНаКлиенте(ДвоичныеДанные, Контекст) Экспорт Если Контекст.Свойство("МенеджерКриптографии") И Контекст.МенеджерКриптографии = "СервисКриптографии" Тогда @@ -4424,11 +5306,11 @@ Если ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Контекст, "ИспользоватьОблачнуюПодпись", Ложь) Тогда Контекст.Вставить("ИспользоватьОблачнуюПодпись", Ложь); ВыполнитьНаСтороне(Контекст.Оповещение, Контекст.Операция, "НаСторонеКлиента", Контекст); - Иначе + Иначе ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки", ТекстОшибкиОблачнаяПодпись(Контекст.Операция, ДвоичныеДанные)); ВыполнитьНаСторонеПослеЦикла(ОшибкаНаКлиенте, Контекст); - КонецЕсли; + КонецЕсли; Возврат; КонецЕсли; @@ -4511,7 +5393,7 @@ ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru='При чтении данных подписи после подписания: %1 - |Результат подписи: %2'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ДанныеПодписи); + |Результат подписи: %2'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ДанныеПодписи); ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки", ОписаниеОшибки); ОшибкаНаКлиенте.Вставить("Инструкция", Истина); @@ -4583,7 +5465,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ВыполнитьНаСторонеЦиклПослеЗаписиПодписи(Новый Структура("ОписаниеОшибки", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)), Контекст); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)), Контекст); КонецПопытки; КонецПроцедуры @@ -4626,7 +5508,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ВыполнитьНаСторонеЦиклПослеЗаписиЗашифрованныхДанных(Новый Структура("ОписаниеОшибки", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)), Контекст); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)), Контекст); КонецПопытки; КонецПроцедуры @@ -4637,7 +5519,7 @@ Если Результат.Свойство("ОписаниеОшибки") Тогда Контекст.ЭлементДанных.Удалить("ЗашифрованныеДанные"); Ошибка = Новый Структура("ОписаниеОшибки", - НСтр("ru = 'При записи зашифрованных данных возникла ошибка:'") + НСтр("ru = 'Не удалось записать зашифрованные данные по причине:'") + Символы.ПС + Результат.ОписаниеОшибки); ВыполнитьНаСторонеПослеЦикла(Ошибка, Контекст); Возврат; @@ -4670,7 +5552,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ВыполнитьНаСторонеЦиклПослеЗаписиЗашифрованныхДанных(Новый Структура("ОписаниеОшибки", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)), Контекст); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)), Контекст); КонецПопытки; КонецПроцедуры @@ -4681,7 +5563,7 @@ Если Результат.Свойство("ОписаниеОшибки") Тогда Контекст.ЭлементДанных.Удалить("РасшифрованныеДанные"); Ошибка = Новый Структура("ОписаниеОшибки", - НСтр("ru = 'При записи расшифрованных данных возникла ошибка:'") + НСтр("ru = 'Не удалось записать расшифрованные данные по причине:'") + Символы.ПС + Результат.ОписаниеОшибки); ВыполнитьНаСторонеПослеЦикла(Ошибка, Контекст); Возврат; @@ -4791,7 +5673,7 @@ ВыполнитьОбработкуОповещения(ИсточникДанных, ПараметрыВыполнения); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - Результат = Новый Структура("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + Результат = Новый Структура("ОписаниеОшибки", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ПолучитьДанныеИзОписанияДанныхПродолжение(Результат, Контекст); КонецПопытки; Иначе @@ -4851,7 +5733,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ТекущийРезультат = Новый Структура("ОписаниеОшибки", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; ВыполнитьОбработкуОповещения(Контекст.Оповещение, ТекущийРезультат); @@ -4891,7 +5773,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ТекущийРезультат = Новый Структура("ОписаниеОшибки", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ВыполнитьОбработкуОповещения(Контекст.Оповещение, ТекущийРезультат); КонецПопытки; КонецЕсли; @@ -4904,7 +5786,7 @@ СтандартнаяОбработка = Ложь; - Результат = Новый Структура("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + Результат = Новый Структура("ОписаниеОшибки", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); КонецПроцедуры @@ -5085,7 +5967,7 @@ Подпись = ПолучитьИзВременногоХранилища(Подпись); Исключение Ошибка = ОписаниеОшибкиПриУсовершенствовании(); - Ошибка.Текст = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Ошибка.Текст = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); УсовершенствоватьНаСторонеПослеОшибки(Ошибка, Контекст); Возврат; КонецПопытки; @@ -5230,6 +6112,13 @@ Контекст.ЭлементДанных.Вставить("ПараметрыПодписи", ПараметрыПодписи); + Если ПараметрыПодписи.СертификатПоследнейМеткиВремени = Неопределено Тогда + ОписаниеОшибки = НСтр("ru='Не удалось получить сертификат подписи'"); + Контекст.ЭлементДанных.Вставить("Ошибка", ОписаниеОшибки); + УсовершенствоватьНаСторонеЦиклПослеОперацииНаКлиенте(ПараметрыПодписи, Контекст); + Возврат; + КонецЕсли; + Если ЗначениеЗаполнено(ПараметрыПодписи.СрокДействияПоследнейМеткиВремени) И ПараметрыПодписи.СрокДействияПоследнейМеткиВремени < ДатаСеанса Тогда @@ -5379,7 +6268,7 @@ СтандартнаяОбработка = Ложь; Ошибка = ОписаниеОшибкиПриУсовершенствовании(); - Ошибка.Текст = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + Ошибка.Текст = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); УсовершенствоватьНаСторонеПослеОшибки(Ошибка, Контекст); КонецПроцедуры @@ -5810,8 +6699,8 @@ ЗавершитьОперациюСОшибкой(Контекст, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При установке свойства %1 компоненты %2 произошла ошибка:'"), "СоответствиеOID", "ExtraCryptoAPI") - + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + НСтр("ru = 'Не удалось установить свойство %1 компоненты %2 по причине: + |%3'"), "СоответствиеOID", "ExtraCryptoAPI", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); КонецПроцедуры @@ -5819,23 +6708,43 @@ // ИнформацияМодуляКриптографии - ИнформацияМодуляКриптографии // Контекст - Структура // -Процедура ПослеПолученияИнформацииМодуляКриптографии(ИнформацияМодуляКриптографии, Контекст) Экспорт +Асинх Процедура ПослеПолученияИнформацииМодуляКриптографии(ИнформацияМодуляКриптографии, Контекст) Экспорт ИмяКриптопровайдера = ИнформацияМодуляКриптографии.Имя; + + ОписаниеОшибки = ""; + + КриптопровайдерыРезультат = Ждать УстановленныеКриптопровайдерыИзКэша(); + ПрограммыАвто = ЭлектроннаяПодписьСлужебныйКлиентСервер.РезультатПоискаКриптопровайдеров(КриптопровайдерыРезультат); + + Если ТипЗнч(ПрограммыАвто) = Тип("Строка") Тогда + ОписаниеОшибки = ПрограммыАвто; + ПрограммыАвто = Неопределено; + КонецЕсли; + ОписаниеПрограммы = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОписаниеПрограммыПоИмениКриптопровайдера( - ИмяКриптопровайдера, ЭлектроннаяПодписьКлиент.ОбщиеНастройки().ОписанияПрограмм); // см. ЭлектроннаяПодписьСлужебныйПовтИсп.ОписаниеПрограммы + ИмяКриптопровайдера, ЭлектроннаяПодписьКлиент.ОбщиеНастройки().ОписанияПрограмм, ПрограммыАвто); // см. ЭлектроннаяПодписьСлужебныйПовтИсп.ОписаниеПрограммы Если ОписаниеПрограммы = Неопределено Тогда - ЗавершитьОперациюСОшибкой(Контекст, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось определить тип криптопровайдера %1'"), - ИнформацияМодуляКриптографии.Имя)); + Если Не ПустаяСтрока(ОписаниеОшибки) Тогда + ЗавершитьОперациюСОшибкой(Контекст, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось определить тип криптопровайдера %1. %2'"), ИнформацияМодуляКриптографии.Имя, ОписаниеОшибки)); + Иначе + ЗавершитьОперациюСОшибкой(Контекст, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось определить тип криптопровайдера %1'"), ИнформацияМодуляКриптографии.Имя)); + КонецЕсли; Возврат; КонецЕсли; Контекст.ТипКриптопровайдера = ОписаниеПрограммы.ТипПрограммы; Контекст.ИмяКриптопровайдера = ИмяКриптопровайдера; + Если ОписаниеПрограммы.Свойство("Автоопределение") Тогда + ОписаниеПути = Новый Структура("ПутьКПрограмме, Существует", ОписаниеПрограммы.ПутьКПрограммеАвто, Истина); + ПослеПолученияПутиКПрограмме(ОписаниеПути, Контекст); + Возврат; + КонецЕсли; + ПолучитьПутьКПрограмме(Новый ОписаниеОповещения("ПослеПолученияПутиКПрограмме", ЭтотОбъект, Контекст), ОписаниеПрограммы.Ссылка); @@ -5943,7 +6852,7 @@ ПараметрыCMSSign.ВключениеСертификатовВПодпись); Исключение ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("CMSSign", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; КонецПроцедуры @@ -5953,7 +6862,7 @@ СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("CMSSign", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); КонецПроцедуры @@ -5987,7 +6896,7 @@ Исключение ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("CMSVerifySign", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; @@ -5999,7 +6908,7 @@ ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("CMSVerifySign", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); КонецПроцедуры @@ -6078,7 +6987,7 @@ Исключение ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("Hash", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; КонецПроцедуры @@ -6089,7 +6998,7 @@ ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("Hash", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); КонецПроцедуры @@ -6149,7 +7058,7 @@ Исключение ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("Sign", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; КонецПроцедуры @@ -6221,7 +7130,7 @@ Исключение ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("VerifySign", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; КонецПроцедуры @@ -6232,7 +7141,7 @@ ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("VerifySign", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); КонецПроцедуры @@ -6281,7 +7190,7 @@ Исключение ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("Hash", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; КонецПроцедуры @@ -6292,7 +7201,7 @@ ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("Hash", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); КонецПроцедуры @@ -6326,11 +7235,7 @@ Возврат; КонецЕсли; - ДвоичныеДанные = Base64Значение(Контекст.СертификатКриптографииBase64); - - ЭлектроннаяПодписьКлиент.ДатаПодписания(Новый ОписаниеОповещения( - "Проверка_ПослеВыполненияHash_ПодписываемыйТегПослеПолученияДатыПодписания", ЭтотОбъект, Контекст), - ДвоичныеДанные); + Проверка_ПослеВыполненияHash_ПодписываемыйТегПослеПолученияДатыПодписания(Неопределено, Контекст); КонецПроцедуры @@ -6369,7 +7274,7 @@ Исключение ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("C14N", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; КонецПроцедуры @@ -6392,7 +7297,7 @@ ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("C14N", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); КонецПроцедуры @@ -6472,7 +7377,7 @@ Исключение ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("C14N_body", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; Иначе Оповещение = Новый ОписаниеОповещения( @@ -6483,7 +7388,7 @@ Исключение ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("TransformSMEV", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; КонецЕсли; Иначе @@ -6510,7 +7415,7 @@ ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("C14N_body", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); КонецПроцедуры @@ -6532,7 +7437,7 @@ ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("TransformSMEV", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); КонецПроцедуры @@ -6556,7 +7461,7 @@ Исключение ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("GetLastError", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; КонецПроцедуры @@ -6567,7 +7472,7 @@ ЗавершитьОперациюСОшибкой(Контекст, ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаВызоваМетодаКомпоненты("GetLastError", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); КонецПроцедуры @@ -6653,6 +7558,7 @@ Если ДополнительныеПараметры.ПриУстановкеПароляИзДругойОперации Тогда РеквизитПароль = ?(СвойстваПароля.Значение <> "", "****************", ""); + РеквизитЗапомнитьПароль = ДополнительныеПараметры.ПарольВПамяти; Возврат; КонецЕсли; @@ -6988,7 +7894,7 @@ Функция НачалоОписанияТекстаОшибки(ИмяМетода) Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При выполнении метода %1 произошла ошибка:'"), ИмяМетода); + НСтр("ru = 'Метод %1 не выполнен по причине:'"), ИмяМетода); КонецФункции @@ -7017,7 +7923,7 @@ КонецПроцедуры // Продолжение процедуры ЭлектроннаяПодписьКлиент.ДобавитьСертификат. -Процедура ДобавитьСертификатПослеИнициализацииСертификата(СертификатКриптографии, Контекст) Экспорт +Асинх Процедура ДобавитьСертификатПослеИнициализацииСертификата(СертификатКриптографии, Контекст) Экспорт Контекст.Вставить("СертификатКриптографии", СертификатКриптографии); @@ -7028,11 +7934,22 @@ Контекст.Вставить("АлгоритмПодписи", ""); КонецЕсли; - ОписанияПрограмм = ЭлектроннаяПодписьКлиент.ОбщиеНастройки().ОписанияПрограмм; ЭтоПолноправныйПользователь = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ЭтоПолноправныйПользователь; - - Контекст.Вставить("ОписанияПрограмм", ОписанияПрограмм); Контекст.Вставить("ЭтоПолноправныйПользователь", ЭтоПолноправныйПользователь); + + ОписанияПрограмм = ЭлектроннаяПодписьКлиент.ОбщиеНастройки().ОписанияПрограмм; + + ПрограммаПоСертификатуРезультат = Ждать ПрограммаПоСертификату(СертификатКриптографии, Истина, Неопределено, Истина); + Если ЗначениеЗаполнено(ПрограммаПоСертификатуРезультат.Программа) Тогда + ОписанияПрограмм = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииОписанияПрограмм( + ПрограммаПоСертификатуРезультат.Программа, Контекст.ОшибкаНаКлиенте.Ошибки, ОписанияПрограмм); + Иначе + СвойстваОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовыеСвойстваОшибки(); + СвойстваОшибки.Описание = ПрограммаПоСертификатуРезультат.Ошибка; + Контекст.ОшибкаНаКлиенте.Ошибки.Добавить(СвойстваОшибки); + КонецЕсли; + + Контекст.Вставить("ОписанияПрограмм", ОписанияПрограмм); Контекст.Вставить("ОписаниеПрограммы", Неопределено); Контекст.Вставить("Индекс", -1); @@ -7065,7 +7982,8 @@ ПараметрыСоздания = ПараметрыСозданияМенеджераКриптографии(); ПараметрыСоздания.ПоказатьОшибку = Неопределено; - ПараметрыСоздания.Программа = ОписаниеПрограммы.Ссылка; + + ПараметрыСоздания.Программа = ОписаниеПрограммы; ПараметрыСоздания.ИнтерактивныйРежим = Контекст.ДополнительныеПараметры.ВводитьПарольВПрограммеЭлектроннойПодписи; ПараметрыСоздания.АлгоритмПодписи = Контекст.АлгоритмПодписи; @@ -7144,7 +8062,7 @@ Контекст.ОшибкаНаКлиенте, Контекст.ОписаниеПрограммы, "Шифрование", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке), + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст.ЭтоПолноправныйПользователь); ДобавитьСертификатЦиклНачало(Контекст); @@ -7165,7 +8083,7 @@ ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеДанныеПодписи(ДанныеПодписи, ПредставлениеОшибки); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда @@ -7201,7 +8119,7 @@ Контекст.ОшибкаНаКлиенте, Контекст.ОписаниеПрограммы, "Подписание", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке), + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст.ЭтоПолноправныйПользователь); ДобавитьСертификатЦиклНачало(Контекст); @@ -7221,7 +8139,7 @@ ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеРасшифрованныеДанные(РасшифрованныеДанные, ПредставлениеОшибки); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда @@ -7257,7 +8175,7 @@ Контекст.ОшибкаНаКлиенте, Контекст.ОписаниеПрограммы, "Расшифровка", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке), + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст.ЭтоПолноправныйПользователь); ДобавитьСертификатЦиклНачало(Контекст); @@ -7273,10 +8191,26 @@ ДополнительныеПараметры = Новый Структура("Сертификат", КонтекстДобавления.ДанныеСертификата); - - ПоказатьОшибкуОбращенияКПрограмме(КонтекстДобавления.ЗаголовокФормы, - "", ОшибкаНаКлиенте, ОшибкаНаСервере, ДополнительныеПараметры); - + + Если ЗначениеЗаполнено(ОшибкаНаКлиенте) И ОшибкаНаКлиенте.Ошибки.Количество() > 0 + И ОшибкаНаКлиенте.Ошибки[0].Описание = ТекстОшибкиНеУдалосьОпределитьПрограммуПоЗакрытомуКлючуСертификата() Тогда + + ПараметрыОшибки = Новый Структура; + ПараметрыОшибки.Вставить("ЗаголовокПредупреждения", КонтекстДобавления.ЗаголовокФормы); + ПараметрыОшибки.Вставить("ТекстОшибкиКлиент", ОшибкаНаКлиенте.Ошибки[0].Описание); + + Если ЗначениеЗаполнено(ОшибкаНаСервере) И ОшибкаНаСервере.Ошибки.Количество() > 0 Тогда + ПараметрыОшибки.Вставить("ТекстОшибкиСервер", ОшибкаНаСервере.Ошибки[0].Описание); + КонецЕсли; + + ПараметрыОшибки.Вставить("ДополнительныеДанные", ДополнительныеПараметры); + + ОткрытьФорму("ОбщаяФорма.РасширенноеПредставлениеОшибки", ПараметрыОшибки, ЭтотОбъект); + + Иначе + ПоказатьОшибкуОбращенияКПрограмме(КонтекстДобавления.ЗаголовокФормы, + "", ОшибкаНаКлиенте, ОшибкаНаСервере, ДополнительныеПараметры); + КонецЕсли; КонецПроцедуры #КонецОбласти @@ -7567,7 +8501,7 @@ ВыполнитьОбработкуОповещения(ЭлементДанных.Объект, ПараметрыВыполнения); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; КонецЕсли; @@ -7603,7 +8537,9 @@ КонецФункции // Продолжение процедуры ПроверитьСертификат. -Процедура ПроверитьСертификатОблачнаяПодпись(Контекст) +Процедура ПроверитьСертификатОблачнаяПодпись(Контекст, РегистрироватьОшибки = Истина) + + Контекст.Вставить("РегистрироватьОшибкиОблачногоСервиса", РегистрироватьОшибки); Если ТипЗнч(Контекст.Сертификат) = Тип("СертификатКриптографии") Тогда Контекст.Сертификат.НачатьВыгрузку(Новый ОписаниеОповещения( @@ -7625,11 +8561,18 @@ ДанныеСертификата = ПолучитьИзВременногоХранилища(Сертификат); КонецЕсли; + Если Не Контекст.РегистрироватьОшибкиОблачногоСервиса Тогда + ПараметрыОперации = Новый Структура("РегистрироватьОшибку", Ложь); + Иначе + ПараметрыОперации = Неопределено; + КонецЕсли; + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); МодульСервисКриптографииDSSКлиент.ПроверитьСертификат( Новый ОписаниеОповещения("ПроверитьСертификатПослеПроверкиОблачнаяПодпись", ЭтотОбъект, Контекст), Неопределено, - ДанныеСертификата); + ДанныеСертификата, + ПараметрыОперации); КонецПроцедуры @@ -7898,310 +8841,6 @@ #КонецОбласти -// Локализация - -#Область УстановкаСпискаОтзыва - -// Получает из сертификата адреса списков отзыва, скачивает, устанавливает в промежуточное хранилище сертификатов -// -// Параметры: -// ПараметрыУстановкиСпискаОтзыва - см. ПараметрыУстановкиСпискаОтзыва -// -Процедура УстановитьСписокОтзываСертификата(ПараметрыУстановкиСпискаОтзыва) - - Оповещение = Новый ОписаниеОповещения("УстановитьСписокОтзываСертификатаПослеПодключенияКомпоненты", - ЭтотОбъект, ПараметрыУстановкиСпискаОтзыва); - ВыполнитьПослеПроверкиРасширенияИКомпоненты(Оповещение); - -КонецПроцедуры - -Процедура ВыполнитьПослеПроверкиРасширенияИКомпоненты(Оповещение, Параметры = Неопределено) - - Контекст = Новый Структура; - Контекст.Вставить("УстанавливатьРасширение", Истина); - Контекст.Вставить("УстанавливатьКомпоненту", Истина); - - Если ТипЗнч(Параметры) = Тип("Структура") Тогда - ЗаполнитьЗначенияСвойств(Контекст, Параметры); - КонецЕсли; - - Контекст.Вставить("Оповещение", Оповещение); - - НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения( - "ВыполнитьПослеПодключенияРасширенияРаботыСКриптографией", ЭтотОбъект, Контекст)); - -КонецПроцедуры - -Процедура ВыполнитьПослеПодключенияРасширенияРаботыСКриптографией(Подключено, Контекст) Экспорт - - Если Не Подключено Тогда - Если Контекст.УстанавливатьРасширение Тогда - ЭлектроннаяПодписьКлиент.УстановитьРасширение(Истина, - Новый ОписаниеОповещения("ВыполнитьПослеУстановкиРасширения", ЭтотОбъект, Контекст)); - Возврат; - Иначе - ПродолжатьБезУстановкиРасширения = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( - Контекст, "ПродолжатьБезУстановкиРасширения", Ложь); - ВыполнитьПослеУстановкиРасширения(ПродолжатьБезУстановкиРасширения, Контекст); - Возврат; - КонецЕсли; - КонецЕсли; - - ВыполнитьПослеУстановкиРасширения(Истина, Контекст); - -КонецПроцедуры - -Процедура ВыполнитьПослеУстановкиРасширения(Установлено, Контекст) Экспорт - - Если Не Установлено Тогда - ВыполнитьОбработкуОповещения(Контекст.Оповещение, ТекстОшибкиНеУстановленоРасширение()); - Возврат; - КонецЕсли; - - ПараметрыПодключения = ОбщегоНазначенияКлиент.ПараметрыПодключенияКомпоненты(); - ПараметрыПодключения.ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для выполнения требуется установка компоненты %1'"), "ExtraCryptoAPI"); - ПараметрыПодключения.ПредложитьУстановить = Контекст.УстанавливатьКомпоненту; - ПараметрыПодключения.ПредложитьЗагрузить = Контекст.УстанавливатьКомпоненту; - ОписаниеКомпоненты = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОписаниеКомпоненты(); - ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета( - Новый ОписаниеОповещения("ВыполнитьПослеПодключенияКомпоненты", - ЭтотОбъект, Контекст), - ОписаниеКомпоненты.ИмяОбъекта, ОписаниеКомпоненты.ПолноеИмяМакета, ПараметрыПодключения); - -КонецПроцедуры - -Функция ТекстОшибкиНеУстановленоРасширение() - - Возврат НСтр("ru = 'Не установлено расширение для работы с криптографией.'"); - -КонецФункции - -// Параметры установки списка отзыва. -// -// Параметры: -// Сертификат - ДвоичныеДанные -// - Строка - адрес во временном хранилище. -// - Строка - строковое представление сертификата в формате Base64. -// - СертификатКриптографии -// -// Возвращаемое значение: -// Структура: -// * Сертификат - ДвоичныеДанные -// - Строка - адрес во временном хранилище. -// - Строка - строковое представление сертификата в формате Base64. -// - СертификатКриптографии -// * Адреса - Строка - адрес списка отзыва. -// - Массив из Строка -// * АдресВнутренний - Строка - если указан, список отзыва будет записан в кэш. -// * ОповещениеОЗавершении - Неопределено -// - ОписаниеОповещения - оповещение, которое вызывается после установки c результатом: -// # Структура: -// ## УстановкаВыполнена - Булево -// ## Сообщение - сообщение о результате установки -// * Форма - ФормаКлиентскогоПриложения - владелец формы установки -// -Функция ПараметрыУстановкиСпискаОтзыва(Сертификат) - - ПараметрыУстановкиСпискаОтзыва = Новый Структура; - ПараметрыУстановкиСпискаОтзыва.Вставить("Сертификат", Сертификат); - ПараметрыУстановкиСпискаОтзыва.Вставить("Адреса", Новый Массив); - ПараметрыУстановкиСпискаОтзыва.Вставить("АдресВнутренний"); - ПараметрыУстановкиСпискаОтзыва.Вставить("ОповещениеОЗавершении"); - ПараметрыУстановкиСпискаОтзыва.Вставить("Форма"); - - Возврат ПараметрыУстановкиСпискаОтзыва; - -КонецФункции - -Процедура УстановитьСписокОтзываСертификатаПослеПодключенияКомпоненты(ОбъектКомпоненты, Контекст) Экспорт - - Если ТипЗнч(ОбъектКомпоненты) = Тип("Строка") Тогда - ОбработатьОшибкуУстановкиСпискаОтзыва(ОбъектКомпоненты, Контекст); - Возврат; - КонецЕсли; - - Если ТипЗнч(Контекст.Адреса) = Тип("Строка") Тогда - АдресаСписковОтзыва = СтрРазделить(Контекст.Адреса, ";"); - Иначе - АдресаСписковОтзыва = Контекст.Адреса; - КонецЕсли; - - Контекст.Вставить("ОбъектКомпоненты", ОбъектКомпоненты); - - Параметры = Новый Структура("АдресРесурса, НаименованиеОперации, АдресВнутренний"); - Параметры.АдресРесурса = АдресаСписковОтзыва; - Параметры.АдресВнутренний = Контекст.АдресВнутренний; - Параметры.НаименованиеОперации = НСтр("ru = 'Загрузка списка отзыва сертификата'"); - - Контекст.Вставить("ОбъектКомпоненты", ОбъектКомпоненты); - Контекст.Вставить("АдресРесурса", Параметры.АдресРесурса); - - ДлительнаяОперация = ЭлектроннаяПодписьСлужебныйВызовСервера.НачатьСкачиваниеФайлаНаСервере(Параметры); - - Если Не ДлительнаяОперация.Свойство("АдресРезультата") Тогда - ПродолжитьУстановкуСпискаОтзываПослеСкачивания(ДлительнаяОперация, Контекст); - Возврат; - КонецЕсли; - - ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Неопределено); - ПараметрыОжидания.Заголовок = Параметры.НаименованиеОперации; - ПараметрыОжидания.ВыводитьОкноОжидания = Истина; - - ОповещениеОЗавершении = Новый ОписаниеОповещения("ПродолжитьУстановкуСпискаОтзываПослеСкачивания", - ЭтотОбъект, Контекст); - - ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания); - -КонецПроцедуры - -Процедура ПродолжитьУстановкуСпискаОтзываПослеСкачивания(РезультатВыполнения, Контекст) Экспорт - - Если РезультатВыполнения = Неопределено Тогда - Возврат; - КонецЕсли; - - Если РезультатВыполнения.Статус = "Ошибка" Тогда - ОбработатьОшибкуУстановкиСпискаОтзыва(РезультатВыполнения.КраткоеПредставлениеОшибки, Контекст); - Возврат; - КонецЕсли; - - // Результат выполнения фонового задания. - Результат = ПолучитьИзВременногоХранилища(РезультатВыполнения.АдресРезультата); - УдалитьИзВременногоХранилища(РезультатВыполнения.АдресРезультата); - - Если ЗначениеЗаполнено(Результат.СообщениеОбОшибке) И Не ЗначениеЗаполнено(Результат.ДанныеФайла) Тогда - ОбработатьОшибкуУстановкиСпискаОтзыва(Результат.СообщениеОбОшибке, Контекст); - Возврат; - КонецЕсли; - - ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(Результат, Контекст); - - ФайловаяСистемаКлиент.СоздатьВременныйКаталог( - Новый ОписаниеОповещения("УстановитьСписокОтзываПослеСозданияВременногоКаталога", ЭтотОбъект, Результат)); - -КонецПроцедуры - -// Установить список отзыва после создания временного каталога. -// -// Параметры: -// ИмяВременногоКаталога - Строка -// Контекст - Структура: -// * ИмяФайла - Строка -// * ДанныеФайла - ДвоичныеДанные -// -Процедура УстановитьСписокОтзываПослеСозданияВременногоКаталога(ИмяВременногоКаталога, Контекст) Экспорт - - Если Не ЗначениеЗаполнено(ИмяВременногоКаталога) Тогда - ОбработатьОшибкуУстановкиСпискаОтзыва( - НСтр("ru = 'Не удалось создать временный каталог для загрузки списка отзыва.'"), Контекст); - Возврат; - КонецЕсли; - - ИмяФайлаСпискаОтзыва = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяВременногоКаталога) - + Контекст.ИмяФайла; - - Контекст.Вставить("ИмяФайлаСпискаОтзыва", ИмяФайлаСпискаОтзыва); - Контекст.Вставить("ИмяВременногоКаталога", ИмяВременногоКаталога); - - Контекст.ДанныеФайла.НачатьЗапись(Новый ОписаниеОповещения("ПослеЗаписиСпискаОтзыва", ЭтотОбъект, Контекст), - ИмяФайлаСпискаОтзыва); - -КонецПроцедуры - -Процедура ПослеЗаписиСпискаОтзыва(Контекст) Экспорт - - ИмяХранилища = "CA"; - - Оповещение = Новый ОписаниеОповещения("ПослеУстановкиСпискаОтзыва", ЭтотОбъект, Контекст, - "ПослеОшибкиУстановкиСпискаОтзыва", ЭтотОбъект); - - Контекст.ОбъектКомпоненты.НачатьВызовImportCRu(Оповещение, Контекст.ИмяФайлаСпискаОтзыва, ИмяХранилища); - -КонецПроцедуры - -Процедура ПослеУстановкиСпискаОтзыва(РезультатУстановки, Контекст) Экспорт - - Если Не РезультатУстановки = Истина Тогда - - Оповещение = Новый ОписаниеОповещения("ПослеПолученияОшибокУстановкиСпискаОтзыва", ЭтотОбъект, Контекст); - Контекст.ОбъектКомпоненты.НачатьПолучениеСписокОшибок(Оповещение); - Возврат; - - Иначе - - Сообщение = НСтр("ru = 'Установка списка отзыва выполнена успешно.'"); - - Если Контекст.ОповещениеОЗавершении <> Неопределено Тогда - Результат = РезультатУстановкиСпискаОтзыва(); - Результат.УстановкаВыполнена = Истина; - Результат.Сообщение = Сообщение; - ВыполнитьОбработкуОповещения(Контекст.ОповещениеОЗавершении, Результат); - Иначе - ПоказатьПредупреждение(, Сообщение); - КонецЕсли; - - КонецЕсли; - - НачатьУдалениеФайлов(, Контекст.ИмяВременногоКаталога); - -КонецПроцедуры - -Процедура ПослеОшибкиУстановкиСпискаОтзыва(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт - - СтандартнаяОбработка = Ложь; - ОбработатьОшибкуУстановкиСпискаОтзыва(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст); - -КонецПроцедуры - -Процедура ПослеПолученияОшибокУстановкиСпискаОтзыва(СписокОшибок, Контекст) Экспорт - - Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось установить список отзыва по причине: - |%1'"), СписокОшибок); - ОбработатьОшибкуУстановкиСпискаОтзыва(Ошибка, Контекст); - -КонецПроцедуры - -Процедура ОбработатьОшибкуУстановкиСпискаОтзыва(Ошибка, Контекст) - - АдресРесурса = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Контекст, "АдресРесурса", Неопределено); - - Если ЗначениеЗаполнено(АдресРесурса) Тогда - Ошибка = Ошибка + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Загрузите вручную и установите список отзыва с: - |%1'"), СтрСоединить(АдресРесурса, Символы.ПС)); - КонецЕсли; - - Если Контекст.ОповещениеОЗавершении <> Неопределено Тогда - - Результат = РезультатУстановкиСпискаОтзыва(); - Результат.Сообщение = Ошибка; - ВыполнитьОбработкуОповещения(Контекст.ОповещениеОЗавершении, Результат); - - Иначе - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ЗаголовокПредупреждения", НСтр("ru = 'Не удалось установить список отзыва.'")); - ПараметрыФормы.Вставить("ТекстОшибкиКлиент", Ошибка); - - ОткрытьФорму("ОбщаяФорма.РасширенноеПредставлениеОшибки", - ПараметрыФормы, Контекст.Форма,,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); - - КонецЕсли; - -КонецПроцедуры - -Функция РезультатУстановкиСпискаОтзыва() - - Возврат Новый Структура("УстановкаВыполнена, Сообщение", Ложь, ""); - -КонецФункции - -#КонецОбласти - -// Конец Локализация - #Область ДиагностикаЭлектроннойПодписи // Формирует архив, содержащий техническую информацию, и предлагает сохранить его на диск. @@ -8245,13 +8884,42 @@ КонецФункции +Асинх Процедура ДиагностическаяИнформацияОПрограммахОпределенныхАвтоматически(Оповещение) + + ИспользуемыеПрограммыРезультат = Ждать УстановленныеКриптопровайдеры(, Ложь); + + Если Не ИспользуемыеПрограммыРезультат.ПроверкаВыполнена Тогда + ВыполнитьОбработкуОповещения(Оповещение, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось автоматически определить программы на клиенте: %1'"), + ИспользуемыеПрограммыРезультат.Ошибка)); + Возврат; + КонецЕсли; + + Если ИспользуемыеПрограммыРезультат.Криптопровайдеры.Количество() = 0 Тогда + ВыполнитьОбработкуОповещения(Оповещение, НСтр("ru = 'Нет программ на клиенте, определенных автоматически'")); + Возврат; + КонецЕсли; + + Заголовок = Символы.ПС + НСтр("ru = 'Автоматически определенные программы на клиенте:'") + Символы.ПС; + + Контекст = Новый Структура; + Контекст.Вставить("Индекс", 0); + Контекст.Вставить("Оповещение", Оповещение); + Контекст.Вставить("ИспользуемыеПрограммы", ИспользуемыеПрограммыРезультат.Криптопровайдеры); + Контекст.Вставить("ДиагностическаяИнформация", Заголовок); + + ИнформацияОПрограммахЦиклНачало(Контекст); + +КонецПроцедуры + Процедура ДиагностическаяИнформацияОПрограммах(Оповещение) ИспользуемыеПрограммы = ЭлектроннаяПодписьСлужебныйВызовСервера.ИспользуемыеПрограммы(); Если ИспользуемыеПрограммы.Количество() = 0 Тогда ВыполнитьОбработкуОповещения(Оповещение, ""); + Возврат; КонецЕсли; - Заголовок = Символы.ПС + НСтр("ru = 'Программы на клиенте:'") + Символы.ПС; + Заголовок = Символы.ПС + НСтр("ru = 'Программы на клиенте из справочника:'") + Символы.ПС; Контекст = Новый Структура; Контекст.Вставить("Индекс", 0); @@ -8267,7 +8935,8 @@ ПараметрыСоздания = ПараметрыСозданияМенеджераКриптографии(); ПараметрыСоздания.ПоказатьОшибку = Неопределено; - ПараметрыСоздания.Программа = Контекст.ИспользуемыеПрограммы[Контекст.Индекс].Ссылка; + ПараметрыСоздания.Автоопределение = Ложь; + ПараметрыСоздания.Программа = Контекст.ИспользуемыеПрограммы[Контекст.Индекс]; Оповещение = Новый ОписаниеОповещения( "ИнформацияОПрограммахПослеСозданияМенеджераКриптографии", @@ -8308,11 +8977,22 @@ + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Версия компоненты %1 на клиенте - %2'"), "ExtraCryptoAPI", ИнформацияОКомпоненте) + Символы.ПС; - ДиагностическаяИнформацияОПрограммах( - Новый ОписаниеОповещения("ПослеСбораТехническойИнформацииОПрограммах", ЭтотОбъект, Контекст)); + ДиагностическаяИнформацияОПрограммахОпределенныхАвтоматически( + Новый ОписаниеОповещения("ПослеСбораТехническойИнформацииОПрограммахОпределенныхАвтоматически", + ЭтотОбъект, Контекст)); КонецПроцедуры +Процедура ПослеСбораТехническойИнформацииОПрограммахОпределенныхАвтоматически(ИнформацияОПрограммах, Контекст) Экспорт + + Контекст.СопроводительныйТекст = Контекст.СопроводительныйТекст + Символы.ПС + + ИнформацияОПрограммах + Символы.ПС; + + ДиагностическаяИнформацияОПрограммах( + Новый ОписаниеОповещения("ПослеСбораТехническойИнформацииОПрограммах", ЭтотОбъект, Контекст)); + +КонецПроцедуры + Процедура ПослеСбораТехническойИнформацииОПрограммах(ИнформацияОПрограммах, Контекст) Экспорт Контекст.СопроводительныйТекст = Контекст.СопроводительныйТекст + ИнформацияОПрограммах; @@ -8364,7 +9044,7 @@ Возврат; Исключение ВерсияКомпоненты = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось определить версию компоненты. %1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + НСтр("ru = 'Не удалось определить версию компоненты. %1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Иначе Если ПустаяСтрока(Результат.ОписаниеОшибки) Тогда @@ -8388,6 +9068,83 @@ КонецПроцедуры +Процедура ВыполнитьПослеПроверкиРасширенияИКомпоненты(Оповещение, Параметры = Неопределено) + + Контекст = Новый Структура; + Контекст.Вставить("УстанавливатьРасширение", Истина); + Контекст.Вставить("УстанавливатьКомпоненту", Истина); + + Если ТипЗнч(Параметры) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(Контекст, Параметры); + КонецЕсли; + + Контекст.Вставить("Оповещение", Оповещение); + + НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения( + "ВыполнитьПослеПодключенияРасширенияРаботыСКриптографией", ЭтотОбъект, Контекст)); + +КонецПроцедуры + +Процедура ВыполнитьПослеПодключенияРасширенияРаботыСКриптографией(Подключено, Контекст) Экспорт + + Если Не Подключено Тогда + Если Контекст.УстанавливатьРасширение Тогда + ЭлектроннаяПодписьКлиент.УстановитьРасширение(Истина, + Новый ОписаниеОповещения("ВыполнитьПослеУстановкиРасширения", ЭтотОбъект, Контекст)); + Возврат; + Иначе + ПродолжатьБезУстановкиРасширения = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( + Контекст, "ПродолжатьБезУстановкиРасширения", Ложь); + ВыполнитьПослеУстановкиРасширения(ПродолжатьБезУстановкиРасширения, Контекст); + Возврат; + КонецЕсли; + КонецЕсли; + + ВыполнитьПослеУстановкиРасширения(Истина, Контекст); + +КонецПроцедуры + +Процедура ВыполнитьПослеУстановкиРасширения(Установлено, Контекст) Экспорт + + Если Не Установлено Тогда + ВыполнитьОбработкуОповещения(Контекст.Оповещение, ТекстОшибкиНеУстановленоРасширение()); + Возврат; + КонецЕсли; + + Если Не ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() + И Не ОбщегоНазначенияКлиент.ЭтоLinuxКлиент() + И Не ОбщегоНазначенияКлиент.ЭтоMacOSКлиент() Тогда + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, ТекстОшибкиУстройствоНеПоддерживается()); + Возврат; + КонецЕсли; + + ПараметрыПодключения = ОбщегоНазначенияКлиент.ПараметрыПодключенияКомпоненты(); + ПараметрыПодключения.ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для выполнения требуется установка компоненты %1'"), "ExtraCryptoAPI"); + ПараметрыПодключения.ПредложитьУстановить = Контекст.УстанавливатьКомпоненту; + ПараметрыПодключения.ПредложитьЗагрузить = Контекст.УстанавливатьКомпоненту; + ОписаниеКомпоненты = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОписаниеКомпоненты(); + ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета( + Новый ОписаниеОповещения("ВыполнитьПослеПодключенияКомпоненты", + ЭтотОбъект, Контекст), + ОписаниеКомпоненты.ИмяОбъекта, ОписаниеКомпоненты.ПолноеИмяМакета, ПараметрыПодключения); + +КонецПроцедуры + +Функция ТекстОшибкиНеУстановленоРасширение() + + Возврат НСтр("ru = 'Не установлено расширение для работы с криптографией.'"); + +КонецФункции + +Функция ТекстОшибкиУстройствоНеПоддерживается() + + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Действие доступно только на компьютерах с операционной системой %1, %2 или %3.'"), + "MacOS", "Windows", "Linux"); +КонецФункции + Процедура ВыполнитьПослеПодключенияКомпоненты(Результат, Контекст) Экспорт Если Результат.Подключено Тогда @@ -8414,6 +9171,1074 @@ КонецПроцедуры +Процедура ОповеститьОбУспешномПодключенииКомпоненты(Результат, Контекст) Экспорт + + Если ТипЗнч(Результат) = Тип("Строка") Тогда + ПоказатьПредупреждение(, Результат); + Возврат; + КонецЕсли; + + ОчиститьКэшУстановленныхКриптопровайдеров(); + Оповестить("Установка_КомпонентаExtraCryptoAPI"); + +КонецПроцедуры + +Асинх Функция ПолучитьСвойстваСертификатаАсинх(Сертификат, ОбъектКомпоненты) + + СертификатBase64Строка = Ждать СертификатBase64Строка(Сертификат); + + Результат = Новый Структура("Ошибка, СвойстваСертификата, СертификатBase64Строка", ""); + Результат.СертификатBase64Строка = СертификатBase64Строка; + + Попытка + + Ждать ОбъектКомпоненты.ПолучитьСписокОшибокАсинх(); + СвойстваСертификатаРезультат = Ждать ОбъектКомпоненты.ПолучитьСвойстваСертификатаАсинх(СертификатBase64Строка); + + Ошибка = Ждать ОбъектКомпоненты.ПолучитьСписокОшибокАсинх(); + Если ЗначениеЗаполнено(Ошибка) Тогда + ВызватьИсключение Ошибка; + КонецЕсли; + + СвойстваСертификата = ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваСертификатаИзОтветаКомпоненты( + СвойстваСертификатаРезультат.Значение); + + Результат.СвойстваСертификата = СвойстваСертификата; + + Исключение + + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при получении расширенных свойств сертификата: + | %1'"), + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат Результат; + + КонецПопытки; + + Возврат Результат; + +КонецФункции + +// Сертификат base64 строка. +// +// Параметры: +// Сертификат - ДвоичныеДанные +// - Строка - адрес во временном хранилище +// - Строка - Сертификат base64 строка +// - СертификатКриптографии +// +// Возвращаемое значение: +// Обещание - Сертификат base64 строка +// +Асинх Функция СертификатBase64Строка(Сертификат) + + Если ТипЗнч(Сертификат) = Тип("Строка") И ЭтоАдресВременногоХранилища(Сертификат) Тогда + Сертификат = ПолучитьИзВременногоХранилища(Сертификат); + КонецЕсли; + + Если ТипЗнч(Сертификат) = Тип("Строка") Тогда + Возврат Сертификат; + КонецЕсли; + + Если ТипЗнч(Сертификат) = Тип("СертификатКриптографии") Тогда + Сертификат = Ждать Сертификат.ВыгрузитьАсинх(); + КонецЕсли; + + Сертификат = Base64Строка(Сертификат); + Сертификат = СтрЗаменить(Сертификат, Символы.ВК, ""); + Сертификат = СтрЗаменить(Сертификат, Символы.ПС, ""); + + Возврат Сертификат; + +КонецФункции + +#Область УстановкаСпискаОтзыва + +Асинх Процедура УстановитьСписокОтзываСертификатаПослеПодключенияКомпоненты(ОбъектКомпоненты, Контекст) Экспорт + + Если ТипЗнч(ОбъектКомпоненты) = Тип("Строка") Тогда + ОбработатьОшибкуУстановкиСпискаОтзыва(ОбъектКомпоненты, Контекст); + Возврат; + КонецЕсли; + + Если Не ЗначениеЗаполнено(Контекст.Адреса) Тогда + СвойстваСертификатаРасширенные = Ждать ПолучитьСвойстваСертификатаАсинх(Контекст.Сертификат, ОбъектКомпоненты); + + Если ЗначениеЗаполнено(СвойстваСертификатаРасширенные.Ошибка) Тогда + ОбработатьОшибкуУстановкиСпискаОтзыва(СвойстваСертификатаРасширенные.Ошибка, Контекст); + Возврат; + КонецЕсли; + + АдресаСписковОтзыва = СвойстваСертификатаРасширенные.СвойстваСертификата.АдресаСписковОтзыва; + Если АдресаСписковОтзыва.Количество() = 0 Тогда + ОбработатьОшибкуУстановкиСпискаОтзыва(НСтр("ru = 'В сертификате не указаны адреса списков отзыва.'"), + Контекст); + Возврат; + КонецЕсли; + Иначе + Если ТипЗнч(Контекст.Адреса) = Тип("Строка") Тогда + АдресаСписковОтзыва = СтрРазделить(Контекст.Адреса, ";"); + КонецЕсли; + КонецЕсли; + + Параметры = Новый Структура("АдресРесурса, НаименованиеОперации, АдресВнутренний"); + Параметры.АдресРесурса = АдресаСписковОтзыва; + Параметры.АдресВнутренний = Контекст.АдресВнутренний; + Параметры.НаименованиеОперации = НСтр("ru = 'Загрузка списка отзыва сертификата'"); + + Контекст.Вставить("ОбъектКомпоненты", ОбъектКомпоненты); + Контекст.Вставить("АдресРесурса", Параметры.АдресРесурса); + + ДлительнаяОперация = ЭлектроннаяПодписьСлужебныйВызовСервера.НачатьСкачиваниеФайлаНаСервере(Параметры); + + Если Не ДлительнаяОперация.Свойство("АдресРезультата") Тогда + ПродолжитьУстановкуСпискаОтзываПослеСкачивания(ДлительнаяОперация, Контекст); + Возврат; + КонецЕсли; + + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Неопределено); + ПараметрыОжидания.Заголовок = Параметры.НаименованиеОперации; + ПараметрыОжидания.ВыводитьОкноОжидания = Истина; + + ОповещениеОЗавершении = Новый ОписаниеОповещения("ПродолжитьУстановкуСпискаОтзываПослеСкачивания", + ЭтотОбъект, Контекст); + + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания); + +КонецПроцедуры + +Процедура ПродолжитьУстановкуСпискаОтзываПослеСкачивания(РезультатВыполнения, Контекст) Экспорт + + Если РезультатВыполнения = Неопределено Тогда + Возврат; + КонецЕсли; + + Если РезультатВыполнения.Статус = "Ошибка" Тогда + ОбработатьОшибкуУстановкиСпискаОтзыва(РезультатВыполнения.КраткоеПредставлениеОшибки, Контекст); + Возврат; + КонецЕсли; + + // Результат выполнения фонового задания. + Результат = ПолучитьИзВременногоХранилища(РезультатВыполнения.АдресРезультата); + УдалитьИзВременногоХранилища(РезультатВыполнения.АдресРезультата); + + Если ЗначениеЗаполнено(Результат.СообщениеОбОшибке) И Не ЗначениеЗаполнено(Результат.ДанныеФайла) Тогда + ОбработатьОшибкуУстановкиСпискаОтзыва(Результат.СообщениеОбОшибке, Контекст); + Возврат; + КонецЕсли; + + Если Не ЗначениеЗаполнено(Результат.ДанныеФайла) Тогда + ОбработатьОшибкуУстановкиСпискаОтзыва( + НСтр("ru = 'Не удалось загрузить список отзыва. Подробнее см. в журнале регистрации.'"), Контекст); + Возврат; + КонецЕсли; + + ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(Результат, Контекст); + + ФайловаяСистемаКлиент.СоздатьВременныйКаталог( + Новый ОписаниеОповещения("УстановитьСписокОтзываПослеСозданияВременногоКаталога", ЭтотОбъект, Результат)); + +КонецПроцедуры + +// Установить список отзыва после создания временного каталога. +// +// Параметры: +// ИмяВременногоКаталога - Строка +// Контекст - Структура: +// * ИмяФайла - Строка +// * ДанныеФайла - ДвоичныеДанные +// +Асинх Процедура УстановитьСписокОтзываПослеСозданияВременногоКаталога(ИмяВременногоКаталога, Контекст) Экспорт + + Если Не ЗначениеЗаполнено(ИмяВременногоКаталога) Тогда + ОбработатьОшибкуУстановкиСпискаОтзыва( + НСтр("ru = 'Не удалось создать временный каталог для загрузки списка отзыва.'"), Контекст); + Возврат; + КонецЕсли; + + ИмяФайлаСпискаОтзыва = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяВременногоКаталога) + + Контекст.ИмяФайла; + Ждать Контекст.ДанныеФайла.ЗаписатьАсинх(ИмяФайлаСпискаОтзыва); + + Контекст.Вставить("ИмяФайлаСпискаОтзыва", ИмяФайлаСпискаОтзыва); + Контекст.Вставить("ИмяВременногоКаталога", ИмяВременногоКаталога); + + ИмяХранилища = "CA"; + РезультатУстановки = Ждать Контекст.ОбъектКомпоненты.ImportCRuАсинх(Контекст.ИмяФайлаСпискаОтзыва, ИмяХранилища); + + Если РезультатУстановки.Значение <> Истина Тогда + + Ошибка = Ждать Контекст.ОбъектКомпоненты.ПолучитьСписокОшибокАсинх(); + Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось установить список отзыва в хранилище ""%1"" по причине: + | %2'"), ИмяХранилища, Ошибка); + ОбработатьОшибкуУстановкиСпискаОтзыва(Ошибка, Контекст); + + Иначе + + Сообщение = НСтр("ru = 'Установка списка отзыва выполнена успешно.'"); + + Если Контекст.ОповещениеОЗавершении <> Неопределено Тогда + Результат = РезультатУстановкиСертификата(); + Результат.УстановкаВыполнена = Истина; + Результат.Сообщение = Сообщение; + ВыполнитьОбработкуОповещения(Контекст.ОповещениеОЗавершении, Результат); + Иначе + ПоказатьПредупреждение(, Сообщение); + КонецЕсли; + + КонецЕсли; + + Ждать УдалитьФайлыАсинх(Контекст.ИмяВременногоКаталога); + +КонецПроцедуры + +Процедура ОбработатьОшибкуУстановкиСпискаОтзыва(Ошибка, Контекст) + + АдресРесурса = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Контекст, "АдресРесурса", Неопределено); + + Если ЗначениеЗаполнено(АдресРесурса) Тогда + Ошибка = Ошибка + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Загрузите вручную и установите список отзыва с: + |%1'"), СтрСоединить(АдресРесурса, Символы.ПС)); + КонецЕсли; + + Если Контекст.ОповещениеОЗавершении <> Неопределено Тогда + + Результат = РезультатУстановкиСертификата(); + Результат.Сообщение = Ошибка; + ВыполнитьОбработкуОповещения(Контекст.ОповещениеОЗавершении, Результат); + + Иначе + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ЗаголовокПредупреждения", НСтр("ru = 'Не удалось установить список отзыва.'")); + ПараметрыФормы.Вставить("ТекстОшибкиКлиент", Ошибка); + + ОткрытьФорму("ОбщаяФорма.РасширенноеПредставлениеОшибки", + ПараметрыФормы, Контекст.Форма,,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область УстановкаСертификата + +// Установить корневой сертификат после подключения компоненты. +// +// Параметры: +// ОбъектКомпоненты - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты +// ПараметрыУстановки - см. ПараметрыУстановкиСертификата +// +Асинх Процедура УстановитьКорневойСертификатПослеПодключенияКомпоненты(ОбъектКомпоненты, ПараметрыУстановки) Экспорт + + Если ТипЗнч(ОбъектКомпоненты) = Тип("Строка") Тогда + ОбработатьОшибкуУстановкиСертификата(ОбъектКомпоненты, ПараметрыУстановки); + Возврат; + КонецЕсли; + + Результат = Ждать ЦепочкаСертификатовАсинх(ПараметрыУстановки.Сертификат, ОбъектКомпоненты); + + Если ЗначениеЗаполнено(Результат.Ошибка) Тогда + ОбработатьОшибкуУстановкиСертификата(Результат.Ошибка, ПараметрыУстановки); + Возврат; + КонецЕсли; + + Если Результат.Сертификаты.Количество() = 0 Тогда + ОбработатьОшибкуУстановкиСертификата(НСтр("ru = 'Цепочка сертификатов не содержит сертификатов.'"), ПараметрыУстановки); + Возврат; + КонецЕсли; + + СписокЗначений = Новый СписокЗначений; + Если Не ЗначениеЗаполнено(ПараметрыУстановки.Хранилище) Тогда + СписокЗначений.Добавить("ROOT", НСтр("ru = 'Доверенные корневые сертификаты'")); + Иначе + СписокЗначений.Добавить(ПараметрыУстановки.Хранилище.Значение, + ПараметрыУстановки.Хранилище.Представление); + КонецЕсли; + + Сертификат = Результат.Сертификаты[Результат.Сертификаты.ВГраница()]; + ПараметрыУстановкиСертификата = ПараметрыУстановкиСертификата(Сертификат.ДанныеСертификата); + ПараметрыУстановкиСертификата.ВариантыУстановки = СписокЗначений; + УстановитьСертификатПослеПодключенияКомпоненты(ОбъектКомпоненты, ПараметрыУстановкиСертификата); + +КонецПроцедуры + +Процедура УстановитьСертификатПослеПодключенияКомпоненты(ОбъектКомпоненты, ПараметрыУстановкиСертификата) Экспорт + + Если ТипЗнч(ОбъектКомпоненты) = Тип("Строка") Тогда + ОбработатьОшибкуУстановкиСертификата(ОбъектКомпоненты, ПараметрыУстановкиСертификата); + Возврат; + КонецЕсли; + + Если ПараметрыУстановкиСертификата.ВариантыУстановки = Неопределено + Или ТипЗнч(ПараметрыУстановкиСертификата.ВариантыУстановки) = Тип("СписокЗначений") + Или ПараметрыУстановкиСертификата.ВариантыУстановки = "Контейнер" + И ПараметрыУстановкиСертификата.СвойстваКонтейнера = Неопределено Тогда + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Сертификат", ПараметрыУстановкиСертификата.Сертификат); + ПараметрыФормы.Вставить("ВариантыУстановки", ПараметрыУстановкиСертификата.ВариантыУстановки); + + ОповещениеОЗакрытииФормы = Новый ОписаниеОповещения("ВыполнитьПослеУстановкиСертификата", + ЭтотОбъект, ПараметрыУстановкиСертификата); + + ОткрытьФорму("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.УстановкаСертификата", + ПараметрыУстановкиСертификата, ПараметрыУстановкиСертификата.Форма,,,, + ОповещениеОЗакрытииФормы, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + Возврат; + КонецЕсли; + + УстановитьСертификатПослеВыбораВариантаУстановки(ПараметрыУстановкиСертификата, ОбъектКомпоненты); + +КонецПроцедуры + +Асинх Процедура УстановитьСертификатПослеВыбораВариантаУстановки(ПараметрыУстановкиСертификата, ОбъектКомпоненты = Неопределено) Экспорт + + Хранилище = ПараметрыУстановкиСертификата.Хранилище; + ПредставлениеХранилища = ""; + Если ТипЗнч(Хранилище) = Тип("Структура") Тогда + Хранилище = ПараметрыУстановкиСертификата.Хранилище.Значение; + ПредставлениеХранилища = ПараметрыУстановкиСертификата.Хранилище.Представление; + КонецЕсли; + + Если Не ЗначениеЗаполнено(ПредставлениеХранилища) Тогда + ПредставлениеХранилища = Хранилище; + КонецЕсли; + + СертификатСтрокой = Ждать СертификатBase64Строка(ПараметрыУстановкиСертификата.Сертификат); + Если ОбъектКомпоненты = Неопределено Тогда + Попытка + ОбъектКомпоненты = Ждать ОбъектВнешнейКомпонентыExtraCryptoAPI(); + Исключение + Ошибка = ТекстОшибкиНеУстановленаКомпонента(); + ОбработатьОшибкуУстановкиСертификата(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось установить сертификат в %1. + |%2'"), ПредставлениеХранилища, Ошибка), ПараметрыУстановкиСертификата); + КонецПопытки + КонецЕсли; + + Ждать ОбъектКомпоненты.ПолучитьСписокОшибокАсинх(); + + Если ЗначениеЗаполнено(ПараметрыУстановкиСертификата.СвойстваКонтейнера) Тогда + + СвойстваКонтейнера = ПараметрыУстановкиСертификата.СвойстваКонтейнера; + Результат = Ждать ОбъектКомпоненты.УстановитьСвязьСКонтейнеромАсинх( + СвойстваКонтейнера.ТипПрограммы, СвойстваКонтейнера.ИмяПрограммы, СвойстваКонтейнера.Имя, СертификатСтрокой); + Если Результат.Значение <> Истина Тогда + Ошибка = Ждать ОбъектКомпоненты.ПолучитьСписокОшибокАсинх(); + ОбработатьОшибкуУстановкиСертификата(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось связать сертификат с контейнером %1. + |%2'"), СвойстваКонтейнера.Имя, Ошибка), ПараметрыУстановкиСертификата); + Возврат; + КонецЕсли; + + ПредставлениеХранилища = СвойстваКонтейнера.Имя; + + Иначе + + Результат = Ждать ОбъектКомпоненты.УстановитьСертификатВХранилищеАсинх(СертификатСтрокой, Хранилище); + + Если Результат.Значение <> Истина Тогда + Ошибка = Ждать ОбъектКомпоненты.ПолучитьСписокОшибокАсинх(); + ОбработатьОшибкуУстановкиСертификата(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось установить сертификат в %1. + |%2'"), ПредставлениеХранилища, Ошибка), ПараметрыУстановкиСертификата); + Возврат; + КонецЕсли; + + КонецЕсли; + + Результат = РезультатУстановкиСертификата(); + Результат.УстановкаВыполнена = Истина; + Результат.Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сертификат успешно установлен в %1.'"), ПредставлениеХранилища); + + ВыполнитьПослеУстановкиСертификата(Результат, + Новый Структура("ОповещениеОЗавершении", ПараметрыУстановкиСертификата.ОповещениеОЗавершении)); + +КонецПроцедуры + +Процедура ОбработатьОшибкуУстановкиСертификата(Ошибка, Контекст) + + Если Контекст.ОповещениеОЗавершении <> Неопределено Тогда + + Результат = РезультатУстановкиСертификата(); + Результат.Сообщение = Ошибка; + ВыполнитьОбработкуОповещения(Контекст.ОповещениеОЗавершении, Результат); + + Иначе + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ЗаголовокПредупреждения", НСтр("ru = 'Не удалось установить сертификат.'")); + ПараметрыФормы.Вставить("ТекстОшибкиКлиент", Ошибка); + + ОткрытьФорму("ОбщаяФорма.РасширенноеПредставлениеОшибки", + ПараметрыФормы, Контекст.Форма,,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьПослеУстановкиСертификата(Результат, Контекст) Экспорт + + Если Результат = Неопределено Тогда + Результат = РезультатУстановкиСертификата(); + Результат.УстановкаВыполнена = Ложь; + Результат.Сообщение = НСтр("ru = 'Установка сертификата не выполнена.'"); + КонецЕсли; + + Если Контекст.ОповещениеОЗавершении <> Неопределено Тогда + ВыполнитьОбработкуОповещения(Контекст.ОповещениеОЗавершении, Результат); + Иначе + ПоказатьПредупреждение(, Результат.Сообщение); + КонецЕсли; + +КонецПроцедуры + +Функция РезультатУстановкиСертификата() + + Возврат Новый Структура("УстановкаВыполнена, Сообщение", Ложь, ""); + +КонецФункции + +#КонецОбласти + +#Область ПолучениеЦепочкиСертификатов + +// Получает из сертификата цепочку корневых сертификатов +// +Процедура ПолучитьЦепочкуСертификатов(Оповещение, Сертификат, ИдентификаторФормы = Неопределено) Экспорт + + Контекст = Новый Структура; + Контекст.Вставить("Оповещение", Оповещение); + Контекст.Вставить("Сертификат", Сертификат); + Контекст.Вставить("ИдентификаторФормы", ИдентификаторФормы); + + Оповещение = Новый ОписаниеОповещения("ПолучитьЦепочкуСертификатовПослеПодключенияКомпоненты", + ЭтотОбъект, Контекст); + ВыполнитьПослеПроверкиРасширенияИКомпоненты(Оповещение); + +КонецПроцедуры + +Асинх Процедура ПолучитьЦепочкуСертификатовПослеПодключенияКомпоненты(ОбъектКомпоненты, Контекст) Экспорт + + Результат = Новый Структура("Сертификаты, Ошибка", Новый Массив, ""); + + Если ТипЗнч(ОбъектКомпоненты) = Тип("Строка") Тогда + Результат.Ошибка = ОбъектКомпоненты; + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + Возврат; + КонецЕсли; + + Результат = Ждать ЦепочкаСертификатовАсинх(Контекст.Сертификат, ОбъектКомпоненты, Контекст.ИдентификаторФормы); + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + +КонецПроцедуры + +Асинх Функция ЦепочкаСертификатовАсинх(Сертификат, ОбъектКомпоненты = Неопределено, ИдентификаторФормы = Неопределено) + + Результат = Новый Структура("Сертификаты, Ошибка", Новый Массив, ""); + Сертификат = Ждать СертификатBase64Строка(Сертификат); + + Если ОбъектКомпоненты = Неопределено Тогда + Попытка + ОбъектКомпоненты = Ждать ОбъектВнешнейКомпонентыExtraCryptoAPI(Истина); + Исключение + Результат.Ошибка = ТекстОшибкиНеУстановленаКомпонента(); + Возврат Результат; + КонецПопытки; + КонецЕсли; + + Попытка + Ждать ОбъектКомпоненты.ПолучитьСписокОшибокАсинх(); + СертификатыРезультат = Ждать ОбъектКомпоненты.ПолучитьЦепочкуСертификатовАсинх(Сертификат); + + Ошибка = Ждать ОбъектКомпоненты.ПолучитьСписокОшибокАсинх(); + Если ЗначениеЗаполнено(Ошибка) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось получить цепочку сертификатов на компьютере: %1'"), + Ошибка); + КонецЕсли; + + Если СертификатыРезультат = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Не удалось получить цепочку сертификатов.'"); + КонецЕсли; + + Результат = ЭлектроннаяПодписьСлужебныйКлиентСервер.ЦепочкаСертификатовИзОтветаКомпоненты( + СертификатыРезультат.Значение, ИдентификаторФормы); + + Исключение + Результат.Вставить("Ошибка", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат Результат; + КонецПопытки; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область УстановкаИПроверкаПрограммКриптографии + +// Результат получения установленных криптопровайдеров. +// +// Возвращаемое значение: +// Структура - результат получения установленных криптопровайдеров: +// * ПроверкаВыполнена - Булево +// * КомпонентаУстановлена - Булево +// * РасширениеУстановлено - Булево +// * Криптопровайдеры - Массив +// * КриптопровайдерыНаСервере - Массив +// * Ошибка - Строка +// +Функция РезультатПолученияУстановленныхКриптопровайдеров() + + Результат = Новый Структура; + Результат.Вставить("ПроверкаВыполнена", Ложь); + Результат.Вставить("КомпонентаУстановлена", Ложь); + Результат.Вставить("Криптопровайдеры", Новый Массив); + Результат.Вставить("КриптопровайдерыНаСервере", Новый Массив); + Результат.Вставить("Ошибка", ""); + Возврат Результат; + +КонецФункции + +// Продолжение процедуры ПолучитьУстановленныеКриптопровайдеры +Асинх Процедура ПолучитьУстановленныеКриптопровайдерыПослеПодключенияКомпоненты(ОбъектКомпоненты, Контекст) Экспорт + + Результат = Контекст.Результат; + + Если ТипЗнч(ОбъектКомпоненты) = Тип("Строка") Тогда + Результат.Ошибка = ОбъектКомпоненты; + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + Возврат; + КонецЕсли; + + Результат.КомпонентаУстановлена = Истина; + КриптопровайдерыРезультат = Ждать УстановленныеКриптопровайдерыИзКэша(Контекст.УстанавливатьКомпоненту); + Если КриптопровайдерыРезультат.ПроверкаВыполнена Тогда + Результат.Криптопровайдеры = КриптопровайдерыРезультат.Криптопровайдеры; + Результат.ПроверкаВыполнена = Истина; + Иначе + Результат.Ошибка = КриптопровайдерыРезультат.Ошибка; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); + +КонецПроцедуры + +Асинх Функция УстановленныеКриптопровайдеры(ОбъектКомпоненты = Неопределено, ПредложитьУстановить = Ложь) Экспорт + + Результат = Новый Структура; + Результат.Вставить("ПроверкаВыполнена", Ложь); + Результат.Вставить("Криптопровайдеры", Новый Массив); + Результат.Вставить("Ошибка", ""); + + Если ОбъектКомпоненты = Неопределено Тогда + Попытка + ОбъектКомпоненты = Ждать ОбъектВнешнейКомпонентыExtraCryptoAPI(ПредложитьУстановить); + Исключение + Результат.Ошибка = ТекстОшибкиНеУстановленаКомпонента(); + Возврат Результат; + КонецПопытки; + КонецЕсли; + + Попытка + Ждать ОбъектКомпоненты.ПолучитьСписокОшибокАсинх(); + РезультатСписок = Ждать ОбъектКомпоненты.ПолучитьСписокКриптопровайдеровАсинх(); + + Ошибка = Ждать ОбъектКомпоненты.ПолучитьСписокОшибокАсинх(); + Если ЗначениеЗаполнено(Ошибка) Тогда + ВызватьИсключение Ошибка; + КонецЕсли; + + ПрограммыПоИменамСТипом = ЭлектроннаяПодписьКлиент.ОбщиеНастройки().ПрограммыПоИменамСТипом; + Криптопровайдеры = ЭлектроннаяПодписьСлужебныйКлиентСервер.УстановленныеКриптопровайдерыИзОтветаКомпоненты( + РезультатСписок.Значение, ПрограммыПоИменамСТипом); + Результат.ПроверкаВыполнена = Истина; + Исключение + Результат.Ошибка = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Возврат Результат; + КонецПопытки; + + Результат.Криптопровайдеры = Криптопровайдеры; + ЗаписатьВКэшУстановленныеКриптопровайдеры(Результат); + + Возврат Результат; + +КонецФункции + +// Возвращает результат проверки криптопровайдеров из кэша с обновлением в 5 минут. +Асинх Функция УстановленныеКриптопровайдерыИзКэша(ПредложитьУстановить = Ложь) + + ИмяПараметра = "ЭлектроннаяПодпись.УстановленныеКриптопровайдеры"; + + Если ПараметрыПриложения[ИмяПараметра] = Неопределено + Или ПараметрыПриложения[ИмяПараметра].ВремяПроверки + 300 < ТекущаяДата() // АПК:143 Должна использоваться ТекущаяДата(). + Или ПараметрыПриложения[ИмяПараметра].Ошибка = ТекстОшибкиНеУстановленаКомпонента() И ПредложитьУстановить Тогда + + РезультатПроверки = Ждать УстановленныеКриптопровайдеры(Неопределено, ПредложитьУстановить); + + Если Не РезультатПроверки.ПроверкаВыполнена Тогда + ЗаписатьВКэшУстановленныеКриптопровайдеры(РезультатПроверки); + КонецЕсли; + + Возврат РезультатПроверки; + + Иначе + + РезультатИзКэша = ПараметрыПриложения[ИмяПараметра]; + + Результат = Новый Структура; + Результат.Вставить("ПроверкаВыполнена", РезультатИзКэша.ПроверкаВыполнена); + Результат.Вставить("Криптопровайдеры", Новый Массив(РезультатИзКэша.Криптопровайдеры)); + Результат.Вставить("Ошибка", РезультатИзКэша.Ошибка); + + Возврат Результат; + + КонецЕсли; + +КонецФункции + +Процедура ОчиститьКэшУстановленныхКриптопровайдеров() Экспорт + + ИмяПараметра = "ЭлектроннаяПодпись.УстановленныеКриптопровайдеры"; + + Если ПараметрыПриложения[ИмяПараметра] <> Неопределено Тогда + ПараметрыПриложения[ИмяПараметра] = Неопределено; + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаписатьВКэшУстановленныеКриптопровайдеры(Результат) + + РезультатДляКэша = Новый Структура; + РезультатДляКэша.Вставить("ПроверкаВыполнена", Результат.ПроверкаВыполнена); + РезультатДляКэша.Вставить("Криптопровайдеры", Новый ФиксированныйМассив(Результат.Криптопровайдеры)); + РезультатДляКэша.Вставить("Ошибка", Результат.Ошибка); + РезультатДляКэша.Вставить("ВремяПроверки", ТекущаяДата()); // АПК:143 Должна использоваться ТекущаяДата(). + + ИмяПараметра = "ЭлектроннаяПодпись.УстановленныеКриптопровайдеры"; + ПараметрыПриложения.Вставить(ИмяПараметра, Новый ФиксированнаяСтруктура(РезультатДляКэша)); + +КонецПроцедуры + +Функция ТекстОшибкиНеУстановленаКомпонента() + + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не установлена компонента %1'"), "ExtraCryptoAPI"); + +КонецФункции + +// Продолжение процедуры ПроверитьУстановкуПрограммКриптографии +Процедура ПроверитьУстановкуПрограммКриптографииПослеПолученияУстановленных(Результат, Контекст) Экспорт + + РезультатПроверки = Новый Структура("КомпонентаУстановлена, Ошибка, ПроверкаВыполнена"); + ЗаполнитьЗначенияСвойств(РезультатПроверки, Результат); + РезультатПроверки.Вставить("Программы", Новый Массив); + РезультатПроверки.Вставить("ПрограммыНаСервере", Новый Массив); + РезультатПроверки.Вставить("ВозможенКонфликт", Ложь); + РезультатПроверки.Вставить("ВозможенКонфликтНаСервере", Ложь); + + Если Не РезультатПроверки.ПроверкаВыполнена Тогда + ВыполнитьОбработкуОповещения(Контекст.Оповещение, РезультатПроверки); + Возврат; + КонецЕсли; + + ПараметрыОбработки = Новый Структура("АлгоритмыПодписи, ПроверяемыеПрограммы, ТипДанных, РасширенноеОписание"); + ЗаполнитьЗначенияСвойств(ПараметрыОбработки, Контекст); + ПараметрыОбработки.Вставить("ЭтоСервер", Ложь); + + ЕстьПроверяемыеПрограммы = Ложь; + + ЭлектроннаяПодписьСлужебныйКлиентСервер.ОбработатьРезультатПроверкиПрограмм(Результат.Криптопровайдеры, + РезультатПроверки.Программы, РезультатПроверки.ВозможенКонфликт, ПараметрыОбработки, ЕстьПроверяемыеПрограммы); + + ПараметрыОбработки.Вставить("ЭтоСервер", Истина); + ЭлектроннаяПодписьСлужебныйКлиентСервер.ОбработатьРезультатПроверкиПрограмм(Результат.КриптопровайдерыНаСервере, + РезультатПроверки.ПрограммыНаСервере, РезультатПроверки.ВозможенКонфликтНаСервере, ПараметрыОбработки, ЕстьПроверяемыеПрограммы); + + // Локализация + + Если Контекст.ПредлагатьУстановитьПрограмму + И РезультатПроверки.ПроверкаВыполнена + И Не ЕстьПроверяемыеПрограммы + И Не Контекст.ЭтоПовторнаяПроверка Тогда + + Оповещение = Новый ОписаниеОповещения("ПослеУстановкиКриптопровайдера", ЭтотОбъект, Контекст); + ОткрытьФорму("Обработка.ПрограммыЭлектроннойПодписиИШифрования.Форма.УстановкаПрограммКриптопровайдеров",, + Контекст.Форма,,,,Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + + Возврат; + КонецЕсли; + + // Конец Локализация + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, РезультатПроверки); + +КонецПроцедуры + +// Возвращаемое значение: +// Структура: +// * ОповещениеОЗавершении - ОписаниеОповещения +// * Программы - см. ЭлектроннаяПодписьСлужебныйВызовСервера.ЗаполнитьСписокПрограммДляПоиска +// * Индекс - Число +// +Функция КонтекстПоискаУстановленныхПрограмм() + + Контекст = Новый Структура; + Контекст.Вставить("Индекс"); + Контекст.Вставить("Программы"); + Контекст.Вставить("ОповещениеОЗавершении"); + + Возврат Контекст; + +КонецФункции + +// Локализация + +#Область УстановкаКриптопровайдеровЛокализация + +#Область УстановитьCryptoPRO + +Процедура УстановитьКриптоПро(Форма, ОповещениеОЗавершении, ВходящийКонтекст) Экспорт + + Если ЗначениеЗаполнено(ВходящийКонтекст) Тогда + ПослеСохраненияФайловДистрибутива(Истина, ВходящийКонтекст); + Возврат; + КонецЕсли; + + СистемнаяИнформация = Новый СистемнаяИнформация; + Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 + ИЛИ СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда + Контекст = Новый Структура; + Контекст.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + Контекст.Вставить("ВладелецФормы", Форма.ВладелецФормы); + Контекст.Вставить("Форма", Форма); + Контекст.Вставить("ИмяПрограммы", ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыКриптоПро()); + Оповещение = Новый ОписаниеОповещения("УстановитьCryptoProCSPПослеВводаРегистрационныхДанных", + ЭлектроннаяПодписьСлужебныйКлиент, Контекст); + + ОткрытьФорму( + "Обработка.ПрограммыЭлектроннойПодписиИШифрования.Форма.УстановкаCryptoProCSPРегистрационныеДанные",, + Форма,,,, Оповещение); + Иначе + + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Автоматическая установка %1 возможна только на операционных системах семейства Windows. + |Вы можете скачать дистрибутив программы с %2 и установить ее самостоятельно.'"), + ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыКриптоПро(), + "www.cryptopro.ru"); + ОбработатьОшибкуУстановкиПрограммыКриптографии(ОписаниеОшибки, ОповещениеОЗавершении); + + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьCryptoProCSPПослеВводаРегистрационныхДанных(РегистрационныеДанные, ВходящийКонтекст) Экспорт + + ОповещениеПослеСозданияКаталога = Новый ОписаниеОповещения( + "УстановитьКриптопровайдерПослеСозданияВременногоКаталога", ЭтотОбъект, ВходящийКонтекст); + + ВходящийКонтекст.Вставить("ПослеСозданияВременногоКаталога", ОповещениеПослеСозданияКаталога); + + Если ЗначениеЗаполнено(РегистрационныеДанные) И ТипЗнч(РегистрационныеДанные) = Тип("Структура") Тогда + + ВходящийКонтекст.Вставить("РегистрационныеДанные", РегистрационныеДанные); + Оповещение = Новый ОписаниеОповещения( + "УстановитьКриптопровайдерПослеПолученияДистрибутива", ЭтотОбъект, ВходящийКонтекст); + + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ВходящийКонтекст.Форма); + ПараметрыОжидания.ВыводитьОкноОжидания = Истина; + + ДлительнаяОперация = ЭлектроннаяПодписьСлужебныйВызовСервера.ПолучитьДистрибутивCryptoProCSP( + ВходящийКонтекст.РегистрационныеДанные); + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Оповещение, ПараметрыОжидания); + Иначе + ОбработатьОшибкуУстановкиПрограммыКриптографии(НСтр("ru = 'Пользователь прервал операцию'"), ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область УстановитьVipNet + +Процедура УстановитьVipNet(Форма, ОповещениеОЗавершении, ВходящийКонтекст) Экспорт + + Если ЗначениеЗаполнено(ВходящийКонтекст) Тогда + ПослеСохраненияФайловДистрибутива(Истина, ВходящийКонтекст); + Возврат; + КонецЕсли; + + СистемнаяИнформация = Новый СистемнаяИнформация; + Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 + ИЛИ СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда + + Если СтрНайти(СистемнаяИнформация.ВерсияОС, "Windows 10") <> 0 + Или СтрНайти(СистемнаяИнформация.ВерсияОС, "Windows Server 2016") <> 0 Тогда + + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Работа %1 на операционной системе %2 не поддерживается. Подробности на сайте %3.'"), + ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыVipNet(), СистемнаяИнформация.ВерсияОС, + "www.infotecs.ru"); + + ОбработатьОшибкуУстановкиПрограммыКриптографии(ОписаниеОшибки, ОповещениеОЗавершении); + Возврат; + КонецЕсли; + + Контекст = Новый Структура; + Контекст.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + Контекст.Вставить("ВладелецФормы", Форма.ВладелецФормы); + Контекст.Вставить("Форма", Форма); + Контекст.Вставить("ИмяПрограммы", ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыVipNet()); + + Оповещение = Новый ОписаниеОповещения("УстановитьViPNetCSPПослеВводаРегистрационныхДанных", + ЭлектроннаяПодписьСлужебныйКлиент, Контекст); + + ОткрытьФорму( + "Обработка.ПрограммыЭлектроннойПодписиИШифрования.Форма.УстановкаViPNetCSPРегистрационныеДанные",, + Форма,,,, Оповещение); + Иначе + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Установка %1 возможна только на операционных системах семейства Windows.'"), + ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыVipNet()); + ОбработатьОшибкуУстановкиПрограммыКриптографии(ОписаниеОшибки, ОповещениеОЗавершении); + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьViPNetCSPПослеВводаРегистрационныхДанных(РегистрационныеДанные, ВходящийКонтекст) Экспорт + + Если РегистрационныеДанные = КодВозвратаДиалога.Отмена + Или РегистрационныеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + СистемнаяИнформация = Новый СистемнаяИнформация; + + Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда + РегистрационныеДанные.Вставить("Разрядность", 32); + ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда + РегистрационныеДанные.Вставить("Разрядность", 64); + Иначе + Возврат; + КонецЕсли; + + ОповещениеПослеСозданияКаталога = Новый ОписаниеОповещения( + "УстановитьКриптопровайдерПослеСозданияВременногоКаталога", ЭтотОбъект, ВходящийКонтекст); + + ВходящийКонтекст.Вставить("ПослеСозданияВременногоКаталога", ОповещениеПослеСозданияКаталога); + + Если ЗначениеЗаполнено(РегистрационныеДанные) И ТипЗнч(РегистрационныеДанные) = Тип("Структура") Тогда + ВходящийКонтекст.Вставить("РегистрационныеДанные", РегистрационныеДанные); + Оповещение = Новый ОписаниеОповещения( + "УстановитьКриптопровайдерПослеПолученияДистрибутива", ЭтотОбъект, ВходящийКонтекст); + + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ВходящийКонтекст.Форма); + ПараметрыОжидания.ВыводитьОкноОжидания = Истина; + + ДлительнаяОперация = ЭлектроннаяПодписьСлужебныйВызовСервера.ПолучитьДистрибутивViPNetCSP(ВходящийКонтекст.РегистрационныеДанные); + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Оповещение, ПараметрыОжидания); + Иначе + ОбработатьОшибкуУстановкиПрограммыКриптографии(НСтр("ru = 'Пользователь прервал операцию'"), ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +Процедура УстановитьSignalCOM() Экспорт + + ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("https://www.signal-com.ru/products/crypt/signal-com-csp/"); + +КонецПроцедуры + +Процедура УстановитьLISSI() Экспорт + + ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("http://soft.lissi.ru/ls_product/skzi/"); + +КонецПроцедуры + +Процедура УстановитьКриптопровайдерПослеПолученияДистрибутива(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + Если ДлительнаяОперация = Неопределено Тогда + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Вызов API сервиса выдачи дистрибутивов %1 не был завершен штатно.'"), ВходящийКонтекст.ИмяПрограммы); + ОбработатьОшибкуУстановкиПрограммыКриптографии(ОписаниеОшибки, ВходящийКонтекст); + Возврат; + КонецЕсли; + + Если ДлительнаяОперация.Статус = "Выполнено" Тогда + РезультатПолученияДистрибутива = ЭлектроннаяПодписьСлужебныйВызовСервера.РезультатПолученияДистрибутиваКриптопровайдера( + ДлительнаяОперация, ВходящийКонтекст.Форма.УникальныйИдентификатор); + Если ЗначениеЗаполнено(РезультатПолученияДистрибутива.Ошибка) Тогда + ОбработатьОшибкуУстановкиПрограммыКриптографии(РезультатПолученияДистрибутива.Ошибка, ВходящийКонтекст); + Возврат; + КонецЕсли; + ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ВходящийКонтекст, РезультатПолученияДистрибутива.ДанныеДистрибутива); + ФайловаяСистемаКлиент.СоздатьВременныйКаталог(ВходящийКонтекст.ПослеСозданияВременногоКаталога); + Иначе + ОбработатьОшибкуУстановкиПрограммыКриптографии(НСтр("ru = 'Пользователь прервал операцию'"), ВходящийКонтекст); + Возврат; + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьКриптопровайдерПослеСозданияВременногоКаталога(ИмяКаталогаВременныхФайлов, ВходящийКонтекст) Экспорт + + ИмяКаталогаВременныхФайлов = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяКаталогаВременныхФайлов); + ВходящийКонтекст.Вставить("ВременныйКаталог", ИмяКаталогаВременныхФайлов); + + Оповещение = Новый ОписаниеОповещения("ПослеСохраненияФайловДистрибутива", ЭтотОбъект, ВходящийКонтекст); + ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла(); + ПараметрыСохранения.Интерактивно = Ложь; + ПараметрыСохранения.Диалог.Каталог = ИмяКаталогаВременныхФайлов; + ФайловаяСистемаКлиент.СохранитьФайлы(Оповещение, ВходящийКонтекст.Дистрибутив, ПараметрыСохранения); + +КонецПроцедуры + +Процедура ПослеСохраненияФайловДистрибутива(ПолученныеФайлы, ВходящийКонтекст) Экспорт + + Если ПолученныеФайлы = Неопределено Тогда + ОбработатьОшибкуУстановкиПрограммыКриптографии(НСтр("ru = 'Не удалось сохранить на компьютер файлы дистрибутива'"), + ВходящийКонтекст); + Возврат; + КонецЕсли; + + ВходящийКонтекст.Вставить("ФайлыДистрибутиваПолучены", Истина); + + Если ВходящийКонтекст.РегистрационныеДанные.ВыполнятьКонтрольЦелостности Тогда + ПараметрыФормы = Новый Структура; + + ПараметрыФормы.Вставить("Дистрибутив", ВходящийКонтекст.ВременныйКаталог + ВходящийКонтекст.ИмяФайлаДистрибутива); + ПараметрыФормы.Вставить("Версия", ВходящийКонтекст.Версия); + ПараметрыФормы.Вставить("ИмяПрограммы", ВходящийКонтекст.ИмяПрограммы); + ПараметрыФормы.Вставить("КонтрольнаяСумма", ВходящийКонтекст.КонтрольнаяСумма); + + ОткрытьФорму( + "Обработка.ПрограммыЭлектроннойПодписиИШифрования.Форма.УстановкаКриптопровайдераИнформацияОДистрибутиве", + ПараметрыФормы, , , , , + Новый ОписаниеОповещения("УстановитьКриптопровайдерПослеПолученияПодтвержденияНаУстановку", ЭтотОбъект, + ВходящийКонтекст)); + Иначе + УстановитьКриптопровайдерПослеПолученияПодтвержденияНаУстановку(Истина, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьКриптопровайдерПослеПолученияПодтвержденияНаУстановку(Результат, ВходящийКонтекст) Экспорт + + Если Результат = Истина Тогда + ЗапуститьПриложениеНаКлиенте( + ВходящийКонтекст.ВременныйКаталог + "Setup.bat", ВходящийКонтекст.ВременныйКаталог, + Истина, Ложь, ВходящийКонтекст); + Иначе + + ОбработатьОшибкуУстановкиПрограммыКриптографии(НСтр("ru = 'Пользователь прервал операцию'"), ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработатьОшибкуУстановкиПрограммыКриптографии(Ошибка, ВходящийКонтекст) + + РезультатВыполнения = Новый Структура("Выполнено", Ложь); + РезультатВыполнения.Вставить("ОписаниеОшибки", Ошибка); + + Если ТипЗнч(ВходящийКонтекст) = Тип("Структура") + И ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ВходящийКонтекст,"ФайлыДистрибутиваПолучены", Ложь) Тогда + РезультатВыполнения.Вставить("ВходящийКонтекст", ВходящийКонтекст); + КонецЕсли; + + Если ТипЗнч(ВходящийКонтекст) = Тип("Структура") И ВходящийКонтекст.ОповещениеОЗавершении <> Неопределено Тогда + + ВыполнитьОбработкуОповещения(ВходящийКонтекст.ОповещениеОЗавершении, РезультатВыполнения); + + ИначеЕсли ТипЗнч(ВходящийКонтекст) = Тип("ОписаниеОповещения") Тогда + + РезультатВыполнения = Новый Структура("Выполнено", Ложь); + РезультатВыполнения.Вставить("ОписаниеОшибки", Ошибка); + ВыполнитьОбработкуОповещения(ВходящийКонтекст, РезультатВыполнения); + + Иначе + + ПоказатьПредупреждение(Неопределено, Ошибка,, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Установка %1'"), ВходящийКонтекст.ИмяПрограммы)); + + КонецЕсли; + +КонецПроцедуры + +#Область ЗапуститьПриложениеНаКлиенте + +Процедура ЗапуститьПриложениеНаКлиенте(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, ВыводитьСообщения, ВходящийКонтекст) + + Оповещение = Новый ОписаниеОповещения( + "ЗапуститьПриложениеНаКлиентеПослеЗапускаПриложения", ЭтотОбъект, ВходящийКонтекст, + "ЗапуститьПриложениеНаКлиентеПриОшибкеЗапускаПриложения", ЭтотОбъект); + + ПараметрыЗапуска = ФайловаяСистемаКлиент.ПараметрыЗапускаПрограммы(); + ПараметрыЗапуска.Оповещение = Оповещение; + ПараметрыЗапуска.ТекущийКаталог = ТекущийКаталог; + ПараметрыЗапуска.ДождатьсяЗавершения = ДождатьсяЗавершения; + + ФайловаяСистемаКлиент.ЗапуститьПрограмму(СтрокаКоманды, ПараметрыЗапуска); + +КонецПроцедуры + +Процедура ЗапуститьПриложениеНаКлиентеПослеЗапускаПриложения(КодВозврата, ВходящийКонтекст) Экспорт + + Если ТипЗнч(ВходящийКонтекст.ОповещениеОЗавершении) = Тип("ОписаниеОповещения") Тогда + РезультатВыполнения = Новый Структура; + РезультатВыполнения.Вставить("Выполнено", Истина); + РезультатВыполнения.Вставить("ОписаниеОшибки", ""); + + ВыполнитьОбработкуОповещения( + ВходящийКонтекст.ОповещениеОЗавершении, + РезультатВыполнения); + КонецЕсли; + +КонецПроцедуры + +Процедура ЗапуститьПриложениеНаКлиентеПриОшибкеЗапускаПриложения(ИнформацияОбОшибке, СтандартнаяОбработка, ВходящийКонтекст) Экспорт + + СтандартнаяОбработка = Ложь; + + ОписаниеОшибки = НСтр("ru = 'Не удалось открыть файл %1. + |Возможно файл уже открыт.'"); + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ОписаниеОшибки, ВходящийКонтекст.СтрокаКоманды); + ОбщегоНазначенияКлиент.СообщитьПользователю(ОписаниеОшибки); + + РезультатВыполнения = Новый Структура; + РезультатВыполнения.Вставить("Выполнено", Ложь); + РезультатВыполнения.Вставить("ОписаниеОшибки", ОписаниеОшибки); + РезультатВыполнения.Вставить("ВходящийКонтекст", ВходящийКонтекст); + + ВыполнитьОбработкуОповещения( + ВходящийКонтекст.ОповещениеОЗавершении, + РезультатВыполнения); + +КонецПроцедуры + +#КонецОбласти + +Процедура ПослеУстановкиКриптопровайдера(Результат, Контекст) Экспорт + + Контекст.Вставить("ЭтоПовторнаяПроверка", Истина); + ПроверитьУстановкуПрограммКриптографии(Контекст.Форма, Контекст, Контекст.Оповещение); + +КонецПроцедуры + +#КонецОбласти + +// Конец Локализация + +#КонецОбласти + #КонецОбласти Процедура ПоказатьРезультатПроверкиСертификата(Сертификат, Результат, ВладелецФормы, @@ -8435,15 +10260,20 @@ Процедура ОбработатьНавигационнуюСсылкуКлассификатора(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка, ДополнительныеДанные = Неопределено) Экспорт СтандартнаяОбработка = Ложь; - Сертификат = Неопределено; + + Параметры = ДополнительныеДанныеДляКлассификатораОшибок(); Если ТипЗнч(ДополнительныеДанные) = Тип("Структура") Тогда - Сертификат = ДополнительныеДанные.Сертификат; + ЗаполнитьЗначенияСвойств(Параметры, ДополнительныеДанные); КонецЕсли; Если НавигационнаяСсылкаФорматированнойСтроки = "ОткрытьСертификат" Тогда - - Если ЗначениеЗаполнено(Сертификат) Тогда - ПоказатьЗначение( ,Сертификат); + Если ЗначениеЗаполнено(Параметры.Сертификат) + И ТипЗнч(Параметры.Сертификат) = Тип("СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования") Тогда + ПоказатьЗначение( , Параметры.Сертификат); + ИначеЕсли ЗначениеЗаполнено(Параметры.ДанныеСертификата) Тогда + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("АдресСертификата", Параметры.ДанныеСертификата); + ОткрытьФорму("ОбщаяФорма.Сертификат", ПараметрыФормы); КонецЕсли; ИначеЕсли НавигационнаяСсылкаФорматированнойСтроки = "ОткрытьСписокПрограмм" Тогда @@ -8451,23 +10281,61 @@ ИначеЕсли НавигационнаяСсылкаФорматированнойСтроки = "ПодатьЗаявлениеНаСертификат" Тогда - Если ЗначениеЗаполнено(Сертификат) Тогда + Если ЗначениеЗаполнено(Параметры.Сертификат) И ТипЗнч(Параметры.Сертификат) = Тип("СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования") Тогда ПараметрыСоздания = Новый Структура; ПараметрыСоздания.Вставить("СоздатьЗаявление", Истина); - ПараметрыСоздания.Вставить("СертификатОснование", Сертификат); + ПараметрыСоздания.Вставить("СертификатОснование", Параметры.Сертификат); ДобавитьСертификат(ПараметрыСоздания); КонецЕсли; + // Локализация + ИначеЕсли НавигационнаяСсылкаФорматированнойСтроки = "ДобавитьУдостоверяющийЦентрВСписокРазрешенныхНеаккредитованных" Тогда - Если ЗначениеЗаполнено(Сертификат) И ЭлектроннаяПодписьКлиент.ОбщиеНастройки().ДоступнаПроверкаПоСпискуУЦ Тогда + Если ЗначениеЗаполнено(Параметры.Сертификат) И ЭлектроннаяПодписьКлиент.ОбщиеНастройки().ДоступнаПроверкаПоСпискуУЦ Тогда ПараметрыСоздания = Новый Структура; - ПараметрыСоздания.Вставить("Сертификат", Сертификат); + ПараметрыСоздания.Вставить("Сертификат", Параметры.Сертификат); ОткрытьФорму("ОбщаяФорма.РазрешенныеНеаккредитованныеУЦ", ПараметрыСоздания, Элемент); КонецЕсли; // Конец Локализация - Иначе + + ИначеЕсли НавигационнаяСсылкаФорматированнойСтроки = "УстановитьСписокОтзываСертификата" Тогда + + Если ЗначениеЗаполнено(Параметры.ДанныеСертификата) Тогда + ПараметрыУстановкиСпискаОтзыва = ПараметрыУстановкиСпискаОтзыва(Параметры.ДанныеСертификата); + УстановитьСписокОтзываСертификата(ПараметрыУстановкиСпискаОтзыва); + КонецЕсли; + + ИначеЕсли НавигационнаяСсылкаФорматированнойСтроки = "УстановитьКорневойСертификат" Тогда + + Если ЗначениеЗаполнено(Параметры.ДанныеСертификата) Тогда + ЭлектроннаяПодписьКлиент.УстановитьКорневойСертификат(Параметры.ДанныеСертификата); + КонецЕсли; + + ИначеЕсли НавигационнаяСсылкаФорматированнойСтроки = "УстановитьСертификат" Тогда + + Если ЗначениеЗаполнено(Параметры.ДанныеСертификата) Тогда + ПараметрыУстановкиСертификата = ПараметрыУстановкиСертификата(Параметры.ДанныеСертификата); + УстановитьСертификат(ПараметрыУстановкиСертификата); + КонецЕсли; + + ИначеЕсли НавигационнаяСсылкаФорматированнойСтроки = "УстановитьСертификатВКонтейнер" Тогда + + Если ЗначениеЗаполнено(Параметры.ДанныеСертификата) Тогда + ПараметрыУстановкиСертификата = ПараметрыУстановкиСертификата(Параметры.ДанныеСертификата); + ПараметрыУстановкиСертификата.ВариантыУстановки = "Контейнер"; + УстановитьСертификат(ПараметрыУстановкиСертификата); + КонецЕсли; + + ИначеЕсли НавигационнаяСсылкаФорматированнойСтроки = "УстановитьКомпоненту" Тогда + + Оповещение = Новый ОписаниеОповещения("ОповеститьОбУспешномПодключенииКомпоненты", ЭтотОбъект); + ВыполнитьПослеПроверкиРасширенияИКомпоненты(Оповещение); + + ИначеЕсли СтрНайти(НавигационнаяСсылкаФорматированнойСтроки, "http") Тогда ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(НавигационнаяСсылкаФорматированнойСтроки, ); + Иначе + ПоказатьПредупреждение(, НСтр("ru = 'Действие будет доступно в следующих обновлениях программы'")); КонецЕсли; КонецПроцедуры @@ -8484,29 +10352,14 @@ ДополнительныеДанные = Новый Структура; ДополнительныеДанные.Вставить("Сертификат"); + ДополнительныеДанные.Вставить("ДанныеСертификата"); + ДополнительныеДанные.Вставить("ПараметрыПодключенияКомпоненты"); ДополнительныеДанные.Вставить("ДополнительныеДанныеПроверокНаКлиенте"); ДополнительныеДанные.Вставить("ДополнительныеДанныеПроверокНаСервере"); Возврат ДополнительныеДанные; КонецФункции -// Возвращаемое значение: -// Структура: -// * ОповещениеОЗавершении - ОписаниеОповещения -// * Программы - см. ЭлектроннаяПодписьСлужебныйВызовСервера.ЗаполнитьСписокПрограммДляПоиска -// * Индекс - Число -// -Функция КонтекстПоискаУстановленныхПрограмм() - - Контекст = Новый Структура; - Контекст.Вставить("Индекс"); - Контекст.Вставить("Программы"); - Контекст.Вставить("ОповещениеОЗавершении"); - - Возврат Контекст; - -КонецФункции - // Используется для управления напоминаниями пользователя из формы сертификата, заявления на сертификат // и формы ОповещениеОбОкончанииСрокаДействия. // @@ -8522,4 +10375,98 @@ КонецПроцедуры +// Только для внутреннего использования +// Заполнение реквизита ФизическоеЛицо значением, найденным по наименованию из поля сертификата КомуВыдан +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// КомуВыдан - Строка +// ФизическоеЛицо - ОпределяемыйТип.ФизическоеЛицо - реквизит для заполнения физического лица +// +Процедура ПодобратьФизическоеЛицоДляСертификата(Форма, КомуВыдан, ФизическоеЛицо) Экспорт + + Если ЗначениеЗаполнено(ФизическоеЛицо) Тогда + + ТекстВопроса = НСтр("ru = 'Поле ""Физическое лицо"" заполнено. Перезаполнить?'"); + Параметры = Новый Структура("Форма, КомуВыдан, ФизическоеЛицо", Форма, КомуВыдан, ФизическоеЛицо); + ОповещениеОтвет = Новый ОписаниеОповещения("ОтветПодобратьФизическоеЛицо", ЭтотОбъект, Параметры); + + ПоказатьВопрос(ОповещениеОтвет, ТекстВопроса, + РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); + Возврат; + КонецЕсли; + + УстановитьФизическоеЛицо(Форма, КомуВыдан, ФизическоеЛицо); + +КонецПроцедуры + +Процедура ОтветПодобратьФизическоеЛицо(Результат, Параметры) Экспорт + + Если Результат = КодВозвратаДиалога.Да Тогда + УстановитьФизическоеЛицо(Параметры.Форма, Параметры.КомуВыдан, Параметры.ФизическоеЛицо); + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьФизическоеЛицо(Форма, КомуВыдан, ФизическоеЛицо) + + Форма.Модифицированность = Истина; + + КомуВыдан = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПреобразоватьКомуВыданКВидуФИО(КомуВыдан); + + Результат = ЭлектроннаяПодписьСлужебныйВызовСервера.ПолучитьФизическиеЛицаПоПолюСертификатаКомуВыдан(КомуВыдан); + + Если НЕ Результат.Свойство("ФизическиеЛица") Тогда + Возврат; + КонецЕсли; + + ФизическиеЛица = Результат.ФизическиеЛица.Получить(КомуВыдан); + + ФизическоеЛицоПустаяСсылка = Новый (ТипЗнч(ФизическоеЛицо)); + ЭтоФормаЭлемента = ?(Форма.Элементы.Найти("СертификатФизическоеЛицо") = Неопределено, Истина, Ложь); + + Если ЭтоФормаЭлемента Тогда + Форма.Объект.ФизическоеЛицо = ФизическоеЛицоПустаяСсылка; + Иначе + Форма.СертификатФизическоеЛицо = ФизическоеЛицоПустаяСсылка; + КонецЕсли; + + Если ФизическиеЛица = Неопределено Тогда + ОбработкаВыбора = Новый ОписаниеОповещения("ПриЗакрытииФормыВыбораФизическогоЛица", Форма); + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ОткрытьФорму(Результат.ПутьФормыВыбораФизическогоЛица, ПараметрыФормы, Форма, , , , ОбработкаВыбора, + РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + Возврат; + КонецЕсли; + + Если ФизическиеЛица.Количество() = 1 Тогда + Если ЭтоФормаЭлемента Тогда + Форма.Объект.ФизическоеЛицо = ФизическиеЛица[0]; + Иначе + Форма.СертификатФизическоеЛицо = ФизическиеЛица[0]; + КонецЕсли; + Возврат; + КонецЕсли; + + ФиксированныеНастройки = Новый НастройкиКомпоновкиДанных; + + Отбор = ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка"); + Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; + Отбор.ПравоеЗначение = ФизическиеЛица; + Отбор.Использование = Истина; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ФиксированныеНастройки", ФиксированныеНастройки); + ПараметрыФормы.Вставить("ОтборПоСсылке", Истина); + ПараметрыФормы.Вставить("РежимВыбора", Истина); + + ОбработкаВыбора = Новый ОписаниеОповещения("ПриЗакрытииФормыВыбораФизическогоЛица", Форма); + ОткрытьФорму(Результат.ПутьФормыВыбораФизическогоЛица, ПараметрыФормы, Форма, , , , ОбработкаВыбора, + РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + +КонецПроцедуры + + #КонецОбласти diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl index 9a5d5d3f8..e63232514 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl @@ -96,6 +96,58 @@ КонецФункции +// Возвращаемое значение: +// Структура: +// * ТекстОшибки - Строка +// +Функция ТекстОшибкиНеУдалосьОпределитьПрограмму(Ошибка) Экспорт + + Если ЗначениеЗаполнено(Ошибка) Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось автоматически определить программу для работы с электронной подписью: + |%1'"), Ошибка); + Иначе + ТекстОшибки = НСтр("ru = 'Не удалось автоматически определить программу для работы с электронной подписью.'"); + КонецЕсли; + + Возврат ТекстОшибки; + +КонецФункции + +// Возвращаемое значение: +// Строка +// Массив из см. НовоеРасширенноеОписаниеПрограммы +// +Функция РезультатПоискаКриптопровайдеров(КриптопровайдерыРезультат, ИмяСервера = "") Экспорт + + Если ИмяСервера = "" Тогда + ИмяСервера = НСтр("ru = 'На компьютере'"); + Иначе + ИмяСервера = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'На сервере %1'"), ИмяСервера); + КонецЕсли; + + Если КриптопровайдерыРезультат = Неопределено Тогда + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 не удалось автоматически определить установленные программы, + |проверьте настройки программ.'"), ИмяСервера); + ИначеЕсли КриптопровайдерыРезультат.ПроверкаВыполнена Тогда + Если КриптопровайдерыРезультат.Криптопровайдеры.Количество() > 0 Тогда + Возврат КриптопровайдерыРезультат.Криптопровайдеры; + Иначе + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 не установлены программы для работы с электронной подписью.'"), ИмяСервера); + КонецЕсли; + Иначе + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 не удалось автоматически определить установленные программы: + |%2'"), ИмяСервера, КриптопровайдерыРезультат.Ошибка); + КонецЕсли; + + Возврат ТекстОшибки; + +КонецФункции + // Адрес списка отзыва, расположенного на другом ресурсе. // // Параметры: @@ -171,10 +223,10 @@ // Сертификаты по порядку до корневого. // // Параметры: -// Сертификаты - Массив Из СертификатКриптографии +// Сертификаты - Массив из СертификатКриптографии // // Возвращаемое значение: -// Массив Из СертификатКриптографии - Сертификаты по порядку до корневого +// Массив из СертификатКриптографии - сертификаты по порядку до корневого // Функция СертификатыПоПорядкуДоКорневого(Сертификаты) Экспорт @@ -194,6 +246,12 @@ КонецФункции +Функция АктуальныеАлгоритмыПрограмм() Экспорт + + Возврат ИменаАлгоритмовПодписиГОСТ_34_10_2012_256() + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -238,15 +296,27 @@ КонецФункции -Функция ОписаниеПрограммыПоИмениКриптопровайдера(ИмяКриптопровайдера, ОписанияПрограмм) Экспорт +Функция ОписаниеПрограммыПоИмениКриптопровайдера(ИмяКриптопровайдера, ОписанияПрограмм, ПрограммыАвто) Экспорт ПрограммаНайдена = Ложь; - Для Каждого ОписаниеПрограммы Из ОписанияПрограмм Цикл - Если ОписаниеПрограммы.ИмяПрограммы = ИмяКриптопровайдера Тогда - ПрограммаНайдена = Истина; - Прервать; - КонецЕсли; - КонецЦикла; + + Если ЗначениеЗаполнено(ПрограммыАвто) Тогда + Для Каждого ОписаниеПрограммы Из ПрограммыАвто Цикл + Если ОписаниеПрограммы.ИмяПрограммы = ИмяКриптопровайдера Тогда + ПрограммаНайдена = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если Не ПрограммаНайдена Тогда + Для Каждого ОписаниеПрограммы Из ОписанияПрограмм Цикл + Если ОписаниеПрограммы.ИмяПрограммы = ИмяКриптопровайдера Тогда + ПрограммаНайдена = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; Если ПрограммаНайдена Тогда Возврат ОписаниеПрограммы; @@ -258,25 +328,226 @@ Или ИмяКриптопровайдера = "Crypto-Pro GOST R 34.10-2001 KC2 CSP" Тогда ОписаниеПрограммы = ОписаниеПрограммыПоИмениКриптопровайдера( - "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider", ОписанияПрограмм); + "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider", ОписанияПрограмм, ПрограммыАвто); ИначеЕсли ИмяКриптопровайдера = "Crypto-Pro GOST R 34.10-2012 KC1 CSP" Или ИмяКриптопровайдера = "Crypto-Pro GOST R 34.10-2012 KC2 CSP" Тогда ОписаниеПрограммы = ОписаниеПрограммыПоИмениКриптопровайдера( - "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", ОписанияПрограмм); + "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", ОписанияПрограмм, ПрограммыАвто); ИначеЕсли ИмяКриптопровайдера = "Crypto-Pro GOST R 34.10-2012 KC1 Strong CSP" Или ИмяКриптопровайдера = "Crypto-Pro GOST R 34.10-2012 KC2 Strong CSP" Тогда ОписаниеПрограммы = ОписаниеПрограммыПоИмениКриптопровайдера( - "Crypto-Pro GOST R 34.10-2012 Strong Cryptographic Service Provider", ОписанияПрограмм); + "Crypto-Pro GOST R 34.10-2012 Strong Cryptographic Service Provider", ОписанияПрограмм, ПрограммыАвто); КонецЕсли; Возврат ОписаниеПрограммы; КонецФункции +Функция СвойстваСертификатаИзОтветаКомпоненты(ОтветКомпоненты) Экспорт + + СвойстваСертификата = Новый Структура; + СвойстваСертификата.Вставить("АдресаСписковОтзыва", Новый Массив); + + Попытка + СвойстваСертификатаРезультат = ПрочитатьОтветКомпоненты( + ОтветКомпоненты); + + АдресаСписковОтзыва = СвойстваСертификатаРезультат.Получить("crls"); + Если ЗначениеЗаполнено(АдресаСписковОтзыва) Тогда + СвойстваСертификата.АдресаСписковОтзыва = АдресаСписковОтзыва; + КонецЕсли; + + СвойстваСертификата.Вставить("Издатель", СвойстваСертификатаРезультат.Получить("issuer_name")); + СвойстваСертификата.Вставить("АлгоритмОткрытогоКлюча", СвойстваСертификатаРезультат.Получить( + "public_key_algorithm")); + СвойстваСертификата.Вставить("АлгоритмПодписи", СвойстваСертификатаРезультат.Получить("signature_algorithm")); + СвойстваСертификата.Вставить("СерийныйНомер", СвойстваСертификатаРезультат.Получить("serial_number")); + СвойстваСертификата.Вставить("ИмяКонтейнера", СвойстваСертификатаРезультат.Получить("container_name")); + СвойстваСертификата.Вставить("ОписаниеПрограммы", СвойстваСертификатаРезультат.Получить("provider")); + СвойстваСертификата.Вставить("Сертификат", СвойстваСертификатаРезультат.Получить("value")); + СвойстваСертификата.Вставить("ОткрытыйКлюч", СвойстваСертификатаРезультат.Получить("public_key")); + + Возврат СвойстваСертификата; + + Исключение + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при чтении расширенных свойств сертификата: + | %1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + +КонецФункции + +Функция ЦепочкаСертификатовИзОтветаКомпоненты(ОтветКомпоненты, ИдентификаторФормы) Экспорт + + Результат = Новый Структура("Сертификаты, Ошибка", Новый Массив, ""); + + Попытка + СертификатыРезультат = ПрочитатьОтветКомпоненты( + ОтветКомпоненты); + СертификатыРезультат = СертификатыРезультат.Получить("Certificates"); + Исключение + + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при получении цепочки сертификатов %1'"), + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат Результат; + + КонецПопытки; + + Для Каждого ТекущийСертификат Из СертификатыРезультат Цикл + + ОписаниеСертификата = Новый Структура; + ОписаниеСертификата.Вставить("Субъект", ТекущийСертификат.Получить("subject_name")); + ДанныеСертификата = ТекущийСертификат.Получить("value"); + Если ИдентификаторФормы = Неопределено Тогда + ОписаниеСертификата.Вставить("ДанныеСертификата", ДанныеСертификата); + Иначе + ОписаниеСертификата.Вставить("ДанныеСертификата", + ПоместитьВоВременноеХранилище(ДанныеСертификата, ИдентификаторФормы)); + КонецЕсли; + + ОписаниеСертификата.Вставить("Издатель", ТекущийСертификат.Получить("issuer_name")); + ОписаниеСертификата.Вставить("ОткрытыйКлюч", ТекущийСертификат.Получить("public_key_")); + + Результат.Сертификаты.Добавить(ОписаниеСертификата); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция УстановленныеКриптопровайдерыИзОтветаКомпоненты(ОтветКомпоненты, ПрограммыПоИменамСТипом, + ПроверкаНаКлиенте = Истина) Экспорт + + Попытка + ВсеКриптопровайдеры = ПрочитатьОтветКомпоненты(ОтветКомпоненты); + Криптопровайдеры = ВсеКриптопровайдеры.Получить("providers"); + Исключение + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при чтении свойств криптопровайдеров: + | %1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Если ТипЗнч(Криптопровайдеры) <> Тип("Массив") Тогда + Возврат Новый Массив; + КонецЕсли; + + КриптопровайдерыРезультат = Новый Массив; + Для Каждого ТекущийКриптопровайдер Из Криптопровайдеры Цикл + + РасширенноеОписаниеПрограммы = РасширенноеОписаниеПрограммы( + ТекущийКриптопровайдер, ПрограммыПоИменамСТипом, ПроверкаНаКлиенте); + + Если РасширенноеОписаниеПрограммы = Неопределено Тогда + Продолжить; + КонецЕсли; + + КриптопровайдерыРезультат.Добавить(РасширенноеОписаниеПрограммы); + + КонецЦикла; + + Возврат КриптопровайдерыРезультат; + +КонецФункции + +Функция ПрочитатьОтветКомпоненты(Текст) Экспорт + + #Если ВебКлиент Тогда + Возврат ЭлектроннаяПодписьСлужебныйВызовСервера.ПрочитатьОтветКомпоненты(Текст); + #Иначе + Попытка + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(Текст); + Результат = ПрочитатьJSON(ЧтениеJSON, Истина); + ЧтениеJSON.Закрыть(); + Исключение + + ИнформацияОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось прочитать ответ компоненты: %1 + |%2'"), Текст, ИнформацияОбОшибке); + + КонецПопытки; + + Возврат Результат; + #КонецЕсли + +КонецФункции + +Функция ОпределитьПрограмму(СвойстваСертификата, + УстановленныеКриптопровайдеры, ПоискПрограммПоОткрытомуКлючу, ОписаниеОшибки = "") Экспорт + + Если УстановленныеКриптопровайдеры.Количество() = 0 Тогда + ОписаниеОшибки = НСтр("ru = 'Не установлены программы для работы с электронной подписью'"); + Возврат Неопределено; + КонецЕсли; + + ПрограммыПоОткрытомуКлючу = ПоискПрограммПоОткрытомуКлючу.Получить(СвойстваСертификата.АлгоритмОткрытогоКлюча); + + Если ПрограммыПоОткрытомуКлючу = Неопределено Тогда + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не найдено подходящих программ по открытому ключу сертификата %1'"), + СвойстваСертификата.АлгоритмОткрытогоКлюча); + Возврат Неопределено; + КонецЕсли; + + ПрограммаНайдена = Неопределено; + + Для Каждого УстановленныйКриптопровайдер Из УстановленныеКриптопровайдеры Цикл + + Если ПрограммаНеИспользуется(УстановленныйКриптопровайдер.РежимИспользования) Тогда + Продолжить; + КонецЕсли; + + Программа = ПрограммыПоОткрытомуКлючу.Получить( + КлючПоискаПрограммыПоИмениСТипом(УстановленныйКриптопровайдер.ИмяПрограммы, УстановленныйКриптопровайдер.ТипПрограммы)); + Если Программа = Неопределено Тогда + Продолжить; + КонецЕсли; + + // Приоритет КриптоПро, если установлено несколько подходящих программ. + Если СтрНайти(Программа, "CryptoPro") Тогда + Возврат УстановленныйКриптопровайдер; + КонецЕсли; + + // Приоритет Microsoft Enhanced CSP, если установлено несколько подходящих программ. + Если СтрНайти(Программа, "MicrosoftEnhanced") Тогда + Возврат УстановленныйКриптопровайдер; + КонецЕсли; + + ПрограммаНайдена = УстановленныйКриптопровайдер; + + КонецЦикла; + + Если ПрограммаНайдена = Неопределено Тогда + + ИдентификаторыАлгоритмов = ИдентификаторыАлгоритмовПодписи(Истина); + АлгоритмПодписи = АлгоритмПоOID(СвойстваСертификата.АлгоритмОткрытогоКлюча, ИдентификаторыАлгоритмов, Ложь); + + ШаблонОшибки = НСтр("ru = 'Не предусмотрено использование ни одной программы + |с алгоритмом подписи %1'"); + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, + СокрЛП(СтрРазделить(АлгоритмПодписи, ",")[0])); + + КонецЕсли; + + Возврат ПрограммаНайдена; + +КонецФункции + +Функция КлючПоискаПрограммыПоИмениСТипом(Имя, Тип) Экспорт + + Возврат СтрШаблон("%1 (%2)", Имя, Тип); + +КонецФункции + // Возвращаемое значение: // Структура - содержит ошибки выполнения операций программами: // * ОписаниеОшибки - Строка - полное описание ошибки, когда оно возвращается строкой. @@ -311,7 +582,8 @@ // * КАдминистратору - Булево - для исправления ошибки требуются права администратора. // * Инструкция - Булево - для исправления требуется инструкция по работе с программами ЭП. // * НастройкаПрограмм - Булево - для исправления ошибки требуется настройка программ. -// * Программа - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - если не +// * Программа - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования +// - Строка - если не // заполнено, значит ошибка, общая для всех программ. // * НетАлгоритма - Булево - менеджер криптографии не поддерживает алгоритм, указанный // для его создании в дополнение к указанной программе. @@ -358,16 +630,19 @@ // Только для внутреннего использования. // // Параметры: -// Программа - Строка +// Программа - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования +// - см. ЭлектроннаяПодписьСлужебныйПовтИсп.ОписаниеПрограммы +// - см. НовоеРасширенноеОписаниеПрограммы // Ошибки - Массив // ОписанияПрограмм - Массив из см. ЭлектроннаяПодписьСлужебныйПовтИсп.ОписаниеПрограммы +// ПрограммыАвто - Массив из см. НовоеРасширенноеОписаниеПрограммы // // Возвращаемое значение: // Массив из см. ЭлектроннаяПодписьСлужебныйПовтИсп.ОписаниеПрограммы // -Функция МенеджерКриптографииОписанияПрограмм(Программа, Ошибки, Знач ОписанияПрограмм) Экспорт +Функция МенеджерКриптографииОписанияПрограмм(Программа, Ошибки, Знач ОписанияПрограмм, Знач ПрограммыАвто = Неопределено) Экспорт - Если ТипЗнч(Программа) = Тип("Структура") Тогда + Если ТипЗнч(Программа) = Тип("Структура") Или ТипЗнч(Программа) = Тип("ФиксированнаяСтруктура") Тогда ОписанияПрограмм = Новый Массив; ОписанияПрограмм.Добавить(Программа); @@ -376,11 +651,32 @@ ИначеЕсли Программа <> Неопределено Тогда ПрограммаНайдена = Ложь; + Для Каждого ОписаниеПрограммы Из ОписанияПрограмм Цикл Если ОписаниеПрограммы.Ссылка = Программа Тогда + + Если ИспользуютсяАвтоматическиеНастройки(ОписаниеПрограммы.РежимИспользования) + И ЗначениеЗаполнено(ПрограммыАвто) Тогда + + Для Каждого ПрограммаАвто Из ПрограммыАвто Цикл + Если ПрограммаАвто.ИмяПрограммы = ОписаниеПрограммы.ИмяПрограммы + И ПрограммаАвто.ТипПрограммы = ОписаниеПрограммы.ТипПрограммы Тогда + ОписанияПрограмм = Новый Массив; + ОписанияПрограмм.Добавить(ПрограммаАвто); + Возврат ОписанияПрограмм; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + + Если ПрограммаНеИспользуется(ОписаниеПрограммы.РежимИспользования) Тогда + Прервать; + КонецЕсли; + ПрограммаНайдена = Истина; Прервать; + КонецЕсли; КонецЦикла; @@ -394,12 +690,52 @@ ОписанияПрограмм = Новый Массив; ОписанияПрограмм.Добавить(ОписаниеПрограммы); + ИначеЕсли ПрограммыАвто <> Неопределено Тогда + + Для Каждого ОписаниеПрограммы Из ОписанияПрограмм Цикл + Если Не ЗначениеЗаполнено(ОписаниеПрограммы.Идентификатор) + И Не ПрограммаНеИспользуется(ОписаниеПрограммы.РежимИспользования) Тогда + + Найдено = Неопределено; + Для Каждого ПрограммаАвто Из ПрограммыАвто Цикл + Если ОписаниеПрограммы.ИмяПрограммы = ПрограммаАвто.ИмяПрограммы + И ОписаниеПрограммы.ТипПрограммы = ПрограммаАвто.ТипПрограммы Тогда + Найдено = ПрограммаАвто; + Прервать; + КонецЕсли; + КонецЦикла; + + Если Найдено = Неопределено Тогда + НовоеОписание = НовоеРасширенноеОписаниеПрограммы(); + ЗаполнитьЗначенияСвойств(НовоеОписание, ОписаниеПрограммы); + НовоеОписание.Автоопределение = Ложь; + ПрограммыАвто.Добавить(НовоеОписание); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат ПрограммыАвто; + КонецЕсли; Возврат ОписанияПрограмм; КонецФункции +Функция ИспользуютсяАвтоматическиеНастройки(РежимИспользования) Экспорт + + Возврат РежимИспользования = ПредопределенноеЗначение( + "Перечисление.РежимыИспользованияПрограммыЭлектроннойПодписи.Автоматически") + +КонецФункции + +Функция ПрограммаНеИспользуется(РежимИспользования) Экспорт + + Возврат РежимИспользования = ПредопределенноеЗначение( + "Перечисление.РежимыИспользованияПрограммыЭлектроннойПодписи.НеИспользуется") + +КонецФункции + // Только для внутреннего использования. // // Параметры: @@ -432,12 +768,9 @@ СвойстваПрограммы = Новый Структура("ИмяПрограммы, ПутьКПрограмме, ТипПрограммы"); ПутьКПрограмме = ""; - Если ЭтоLinux Тогда - НеУказанПуть = Ложь; - Если Не ЗначениеЗаполнено(ОписаниеПути.ПутьКПрограмме) Тогда - ТекстОшибки = НСтр("ru = 'Не указан путь к программе.'"); - НеУказанПуть = Истина; - ИначеЕсли Не ОписаниеПути.Существует Тогда + Автоопределение = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ОписаниеПрограммы, "Автоопределение", Ложь); + Если ЭтоLinux И Не Автоопределение Тогда + Если ЗначениеЗаполнено(ОписаниеПути.ПутьКПрограмме) И Не ОписаниеПути.Существует Тогда Если ОписаниеПути.Свойство("ТекстОшибки") И ЗначениеЗаполнено(ОписаниеПути.ТекстОшибки) Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -460,7 +793,7 @@ КонецЕсли; Если ЗначениеЗаполнено(ТекстОшибки) Тогда МенеджерКриптографииДобавитьОшибку(Ошибки, - ОписаниеПрограммы.Ссылка, ТекстОшибки, ЭтоСервер, , , НеУказанПуть); + ОписаниеПрограммы.Ссылка, ТекстОшибки, ЭтоСервер); Возврат Неопределено; КонецЕсли; КонецЕсли; @@ -692,6 +1025,7 @@ // Параметры: // Ошибки - Массив из см. НовыеСвойстваОшибки // Программа - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования +// - Структура - см. НовоеРасширенноеОписаниеПрограммы // Описание - Строка // КАдминистратору - Булево // Инструкция - Булево @@ -702,8 +1036,17 @@ КАдминистратору, Инструкция = Ложь, ИзИсключения = Ложь, НеУказанПуть = Ложь) Экспорт СвойстваОшибки = НовыеСвойстваОшибки(); - Если ЗначениеЗаполнено(Программа) Тогда - СвойстваОшибки.Программа = Программа; + Если ТипЗнч(Программа) = Тип("СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования") Тогда + Если ЗначениеЗаполнено(Программа) Тогда + СвойстваОшибки.Программа = Программа; + КонецЕсли; + ИначеЕсли ТипЗнч(Программа) = Тип("Структура") Тогда + Если ЗначениеЗаполнено(Программа.Ссылка) Тогда + СвойстваОшибки.Программа = Программа.Ссылка; + Иначе + СвойстваОшибки.Программа = ?(ЗначениеЗаполнено(Программа.Представление), Программа.Представление, + КлючПоискаПрограммыПоИмениСТипом(Программа.ИмяПрограммы, Программа.ТипПрограммы)); + КонецЕсли; КонецЕсли; СвойстваОшибки.Описание = Описание; СвойстваОшибки.КАдминистратору = КАдминистратору; @@ -822,7 +1165,7 @@ Ошибка.ЗаголовокОшибки = НСтр("ru = 'Не удалось записать сертификат по причине:'"); СвойстваОшибки = НовыеСвойстваОшибки(); - СвойстваОшибки.Описание = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СвойстваОшибки.Описание = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); Ошибка.Ошибки.Добавить(СвойстваОшибки); КонецПопытки; @@ -916,7 +1259,10 @@ Функция РежимыПроверкиСертификата(ИгнорироватьВремяДействия = Ложь) Экспорт МассивРежимовПроверки = Новый Массив; - МассивРежимовПроверки.Добавить(РежимПроверкиСертификатаКриптографии.РазрешитьТестовыеСертификаты); + + #Если ВебКлиент Тогда + МассивРежимовПроверки.Добавить(РежимПроверкиСертификатаКриптографии.РазрешитьТестовыеСертификаты); + #КонецЕсли Если ИгнорироватьВремяДействия Тогда МассивРежимовПроверки.Добавить(РежимПроверкиСертификатаКриптографии.ИгнорироватьВремяДействия); @@ -1189,6 +1535,7 @@ // * СертификатПоследнейМеткиВремени - СертификатКриптографии // * ДатаПодписиИзМетки - Дата // * ОписаниеСертификата - см. ЭлектроннаяПодписьКлиент.СвойстваСертификата +// - Неопределено - если не удалось определить сертификат подписи. // * НеподтвержденнаяДатаПодписи - Дата // * ДатаПоследнейМеткиВремени - Дата // @@ -1209,9 +1556,9 @@ // Только для внутреннего использования. // Возвращаемое значение: -// Дата, Неопределено +// Дата, Неопределено - дата для проверки сертификата подписи // -Функция ДатаПодписиИзПараметровПодписи(ПараметрыПодписи) Экспорт +Функция ДатаДляПроверкиПодписи(ПараметрыПодписи) Экспорт Если ЗначениеЗаполнено(ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( ПараметрыПодписи, "ДатаПодписиИзМетки", Неопределено)) Тогда @@ -1237,8 +1584,18 @@ ПараметрыПодписи = НовыеПараметрыПодписиКриптографии(); Подпись = КонтейнерПодписи.Подписи[0]; - ПараметрыПодписи.ОписаниеСертификата = СвойстваСертификата(Подпись.СертификатПодписи, ДобавкаВремени); - + + Попытка + СерийныйНомер = Подпись.СертификатПодписи.СерийныйНомер; + СертификатСуществует = Истина; + Исключение + СертификатСуществует = Ложь; + КонецПопытки; + + Если СертификатСуществует Тогда + ПараметрыПодписи.ОписаниеСертификата = СвойстваСертификата(Подпись.СертификатПодписи, ДобавкаВремени); + КонецЕсли; + ДатаПодписиИзМетки = Дата(3999, 12, 31); Если ЗначениеЗаполнено(Подпись.НеподтвержденноеВремяПодписи) Тогда ПараметрыПодписи.НеподтвержденнаяДатаПодписи = Подпись.НеподтвержденноеВремяПодписи + ДобавкаВремени; @@ -1271,10 +1628,10 @@ Если ЗначениеЗаполнено(СрокДействияПоследнейМеткиВремени) Тогда ПараметрыПодписи.СрокДействияПоследнейМеткиВремени = СрокДействияПоследнейМеткиВремени + ДобавкаВремени; ПараметрыПодписи.СертификатПоследнейМеткиВремени = СертификатПоследнейМеткиВремени; - ИначеЕсли ПараметрыПодписи.ОписаниеСертификата.ДействителенДо < ДатаСеанса Тогда + ИначеЕсли СертификатСуществует И ПараметрыПодписи.ОписаниеСертификата.ДействителенДо < ДатаСеанса Тогда ПараметрыПодписи.СрокДействияПоследнейМеткиВремени = ПараметрыПодписи.ОписаниеСертификата.ДействителенДо; ПараметрыПодписи.СертификатПоследнейМеткиВремени = Подпись.СертификатПодписи; - Иначе + ИначеЕсли СертификатСуществует Тогда ПараметрыПодписи.СертификатПоследнейМеткиВремени = Подпись.СертификатПодписи; КонецЕсли; @@ -1289,10 +1646,16 @@ // Только для внутреннего использования. Функция ТипПодписиКриптографии(ТипПодписиЗначение) Экспорт + #Если МобильныйКлиент Тогда + + Возврат Неопределено + + #Иначе + Если Ложь Тогда // Для совместимости с версиями платформы, не поддерживающими усовершенствованную подпись. ТипПодписиКриптографии = Неопределено; КонецЕсли; - + ИмяТипа = "ТипПодписиКриптографии"; Если ТипЗнч(ТипПодписиЗначение) = Тип(ИмяТипа) Тогда @@ -1346,7 +1709,9 @@ КонецЕсли; Возврат Неопределено; - + + #КонецЕсли + КонецФункции // Только для внутреннего использования. @@ -1412,13 +1777,13 @@ Функция ЗаголовокОшибкиПолученияДанных(Операция) Экспорт Если Операция = "Подписание" Тогда - Возврат НСтр("ru = 'При получении данных для подписания возникла ошибка:'"); + Возврат НСтр("ru = 'Не удалось получить данные для подписания по причине:'"); ИначеЕсли Операция = "Шифрование" Тогда - Возврат НСтр("ru = 'При получении данных для шифрования возникла ошибка:'"); + Возврат НСтр("ru = 'Не удалось получить данные для шифрования по причине:'"); ИначеЕсли Операция = "ПродлениеСрокаДействияПодписи" Тогда - Возврат НСтр("ru = 'При получении данных подписи для продления возникла ошибка:'"); + Возврат НСтр("ru = 'Не удалось получить данные подписи для продления по причине:'"); Иначе - Возврат НСтр("ru = 'При получении данных для расшифровки возникла ошибка:'"); + Возврат НСтр("ru = 'Не удалось получить данные для расшифровки по причине:'"); КонецЕсли; КонецФункции @@ -1468,7 +1833,7 @@ Если Не ЗначениеЗаполнено(ОписаниеОшибкиНаКлиенте.ОписаниеОшибки) И Не ЗначениеЗаполнено(ОписаниеОшибкиНаСервере.ОписаниеОшибки) Тогда - ОбщееОписаниеОшибки = НСтр("ru = 'Неизвестная ошибка'"); + ОбщееОписаниеОшибки = НСтр("ru = 'Непредвиденная ситуация'"); ИначеЕсли Не ЗначениеЗаполнено(ОписаниеОшибкиНаКлиенте.ОписаниеОшибки) Или ОписаниеОшибкиНаКлиенте.НеПоддерживается @@ -2174,6 +2539,32 @@ КонецФункции +// Удаляет из поля сертификата КомуВыдан все кроме ФИО +// +// Параметры: +// КомуВыдан - Массив из строк +// - Строка +// +// Возвращаемое значение: +// Массив из строк - если КомуВыдан массив +// Строка - если КомуВыдан строка +// +Функция ПреобразоватьКомуВыданКВидуФИО(КомуВыдан) Экспорт + + Если ТипЗнч(КомуВыдан) = Тип("Массив") Тогда + Для Каждого ЭлементКомуВыдан Из КомуВыдан Цикл + ДлинаСтроки = СтрНайти(ЭлементКомуВыдан, ","); + ЭлементКомуВыдан = СокрЛП(?(ДлинаСтроки = 0, ЭлементКомуВыдан, Лев(ЭлементКомуВыдан, ДлинаСтроки - 1))); + КонецЦикла; + Иначе + ДлинаСтроки = СтрНайти(КомуВыдан, ","); + КомуВыдан = СокрЛП(?(ДлинаСтроки = 0, КомуВыдан, Лев(КомуВыдан, ДлинаСтроки - 1))); + КонецЕсли; + + Возврат КомуВыдан; + +КонецФункции + // Описание подключения внешней компоненты (ExtraCryptoAPI). // // Возвращаемое значение: @@ -2211,15 +2602,13 @@ Параметры = ПараметрыКонвертаXML(); КонецЕсли; - Если Параметры.Вариант = "furs.mark.crpt.ru_v1" Тогда - КонвертXML = КонвертXML1(); - - ИначеЕсли Параметры.Вариант = "dmdk.goznak.ru_v1" Тогда - КонвертXML = КонвертXML2(); - Иначе + КонвертXML = Неопределено; + ЭлектроннаяПодписьКлиентСерверЛокализация.ПриПолученииКонвертаXML(Параметры, КонвертXML); + + Если КонвертXML = Неопределено Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Указано неизвестное значение ""%1"" параметра %2 в функции %3'"), - Параметры.Вариант, "Вариант", "КонвертXML"); + НСтр("ru = 'Указано неизвестное значение ""%1"" параметра %2 в функции %3'"), + Параметры.Вариант, "Вариант", "КонвертXML"); ВызватьИсключение ТекстОшибки; КонецЕсли; @@ -2235,7 +2624,11 @@ Функция ПараметрыКонвертаXML() Экспорт Результат = Новый Структура; - Результат.Вставить("Вариант", "furs.mark.crpt.ru_v1"); + + ВариантКонверта = ""; + ЭлектроннаяПодписьКлиентСерверЛокализация.ПриПолученииВариантаКонвертаПоУмолчанию(ВариантКонверта); + + Результат.Вставить("Вариант", ВариантКонверта); Результат.Вставить("СообщениеXML", ""); Возврат Результат; @@ -2478,28 +2871,6 @@ КонецФункции -Функция ТипПлатформыСтрокой() Экспорт - - СистемнаяИнформация = Новый СистемнаяИнформация; - - Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 Тогда - Возврат "Linux_x86"; - ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда - Возврат "Linux_x86_64"; - ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86 Тогда - Возврат "MacOS_x86"; - ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86_64 Тогда - Возврат "MacOS_x86_64"; - ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда - Возврат "Windows_x86"; - ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда - Возврат "Windows_x86_64"; - КонецЕсли; - - Возврат ""; - -КонецФункции - // Готовит строку для использования в качестве имени файла. Функция ПодготовитьСтрокуДляИмениФайла(Строка, ЗаменаПробела = Неопределено) Экспорт @@ -2587,7 +2958,6 @@ КонецФункции - // Возвращает сведения из свойств сертификата строкой. // // Параметры: @@ -2712,6 +3082,161 @@ КонецФункции +// Только для внутреннего использования. +// +// Параметры: +// Криптопровайдер - Соответствие - из ответа компоненты +// ПрограммыПоИменамСТипом - см. ЭлектроннаяПодписьСлужебныйПовтИсп.ОбщиеНастройки +// ПроверкаНаКлиенте - Булево - криптопровайдер установлен на клиентском компьютере +// +// Возвращаемое значение: +// см. НовоеРасширенноеОписаниеПрограммы +// +Функция РасширенноеОписаниеПрограммы(Криптопровайдер, ПрограммыПоИменамСТипом, ПроверкаНаКлиенте = Истина) Экспорт + + ОписаниеПрограммы = НовоеРасширенноеОписаниеПрограммы(); + + ТипПрограммы = Криптопровайдер.Получить("type"); + Если ТипПрограммы = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + ОписаниеПрограммы.ТипПрограммы = ТипПрограммы; + ОписаниеПрограммы.ИмяПрограммы = Криптопровайдер.Получить("name"); + + Ключ = КлючПоискаПрограммыПоИмениСТипом(ОписаниеПрограммы.ИмяПрограммы, ОписаниеПрограммы.ТипПрограммы); + ПоставляемаяПрограмма = ПрограммыПоИменамСТипом.Получить(Ключ); + + Если ПоставляемаяПрограмма = Неопределено Тогда + Возврат Неопределено; + Иначе + ЗаполнитьЗначенияСвойств(ОписаниеПрограммы, ПоставляемаяПрограмма); + КонецЕсли; + + Если Не ЗначениеЗаполнено(ОписаниеПрограммы.Представление) Тогда + ОписаниеПрограммы.Представление = Ключ; + КонецЕсли; + + Если ПроверкаНаКлиенте Тогда + ОписаниеПрограммы.ПутьКПрограммеАвто = Криптопровайдер.Получить("path"); + Иначе + ОписаниеПрограммы.ПутьКПрограммеНаСервереАвто = Криптопровайдер.Получить("path"); + КонецЕсли; + + ОписаниеПрограммы.Версия = Криптопровайдер.Получить("version"); + ОписаниеПрограммы.Лицензия = Криптопровайдер.Получить("license"); + ОписаниеПрограммы.Автоопределение = Истина; + + Возврат ОписаниеПрограммы; + +КонецФункции + +// Только для внутреннего использования. +Процедура ОбработатьРезультатПроверкиПрограмм(Криптопровайдеры, Программы, ВозможенКонфликт, Контекст, ЕстьПроверяемыеПрограммы = Ложь) Экспорт + + УстановленныеПрограммы = Новый Соответствие; + + Для Каждого ТекущийКриптопровайдер Из Криптопровайдеры Цикл + + Найдена = Истина; Представление = Неопределено; + + Если ЗначениеЗаполнено(Контекст.АлгоритмыПодписи) Тогда + Найдена = Ложь; + Для Каждого Алгоритм Из Контекст.АлгоритмыПодписи Цикл + Найдена = МенеджерКриптографииАлгоритмПодписиПоддерживается(ТекущийКриптопровайдер, + ?(Контекст.ТипДанных = "Сертификат","","ПроверкаПодписи"), Алгоритм, Неопределено, Контекст.ЭтоСервер, Ложь); + Если Найдена Тогда + Прервать; + КонецЕсли; + КонецЦикла; + ИначеЕсли ЗначениеЗаполнено(Контекст.ПроверяемыеПрограммы) Тогда + Найдена = Ложь; + Для Каждого Программа Из Контекст.ПроверяемыеПрограммы Цикл + Если Программа.ИмяПрограммы = ТекущийКриптопровайдер.ИмяПрограммы + И Программа.ТипПрограммы = ТекущийКриптопровайдер.ТипПрограммы Тогда + Представление = Программа.Представление; + Найдена = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если Не Найдена Тогда + Продолжить; + КонецЕсли; + + Если Контекст.РасширенноеОписание Тогда + РезультатПроверкиПрограммы = НовоеРасширенноеОписаниеПрограммы(); + Иначе + РезультатПроверкиПрограммы = РезультатПроверкиПрограммы(); + КонецЕсли; + + ЗаполнитьЗначенияСвойств(РезультатПроверкиПрограммы, ТекущийКриптопровайдер); + РезультатПроверкиПрограммы.Представление = + ?(ЗначениеЗаполнено(Представление), Представление, ТекущийКриптопровайдер.Представление); + + РезультатПроверкиПрограммы.Вставить("Программа", ПрограммаЭлектроннойПодписи(ТекущийКриптопровайдер)); + Если Не ПустаяСтрока(РезультатПроверкиПрограммы.Программа) Тогда + УстановленныеПрограммы.Вставить(РезультатПроверкиПрограммы.Программа, Истина); + КонецЕсли; + + Программы.Добавить(РезультатПроверкиПрограммы); + + КонецЦикла; + + Если УстановленныеПрограммы.Количество() > 0 Тогда + ЕстьПроверяемыеПрограммы = Истина; + ВозможенКонфликт = УстановленныеПрограммы.Количество() > 1; + КонецЕсли; + +КонецПроцедуры + +Функция ПрограммаЭлектроннойПодписи(Криптопровайдер) + + // Локализация + + Если ПустаяСтрока(Криптопровайдер.Идентификатор) Тогда + Возврат ""; + КонецЕсли; + + Если СтрНайти(Криптопровайдер.Идентификатор, "CryptoPro") <> 0 Тогда + Возврат НСтр("ru = 'КриптоПро CSP'"); + КонецЕсли; + + Если СтрНайти(Криптопровайдер.Идентификатор, "VipNet") <> 0 Тогда + Возврат НСтр("ru = 'ViPNet CSP'"); + КонецЕсли; + + Если СтрНайти(Криптопровайдер.Идентификатор, "Lissi") <> 0 Тогда + Возврат НСтр("ru = 'ЛИССИ CSP'"); + КонецЕсли; + + Если СтрНайти(Криптопровайдер.Идентификатор, "SignalCom") <> 0 Тогда + Возврат НСтр("ru = 'Сигнал-КОМ CSP'"); + КонецЕсли; + + // Конец Локализация + + Возврат ""; + +КонецФункции + +// Только для внутреннего использования. +Функция РезультатПроверкиПрограммы() + + Структура = Новый Структура; + Структура.Вставить("Представление"); + Структура.Вставить("Ссылка"); + Структура.Вставить("ИмяПрограммы"); + Структура.Вставить("ТипПрограммы"); + Структура.Вставить("Программа"); + Структура.Вставить("Версия"); + Структура.Вставить("Лицензия"); + + Возврат Структура; + +КонецФункции + // Только для внутреннего использования. Функция РазмещениеСертификата(ТипРазмещения) Экспорт @@ -2728,100 +3253,51 @@ КонецФункции -#Область ШаблоныКонвертаXML +// Возвращаемое значение: +// Структура: +// * Ссылка - Неопределено, СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования +// * Представление - Строка +// * ИмяПрограммы - Строка +// * ТипПрограммы - Число +// * АлгоритмПодписи - Строка +// * АлгоритмХеширования - Строка +// * АлгоритмШифрования - Строка +// * Идентификатор - Строка +// * ПутьКПрограмме - Строка +// * ПутьКПрограммеАвто - Строка +// * ПутьКПрограммеНаСервереАвто - Строка +// * Версия - Строка - версия библиотеки +// * Лицензия - Булево - есть ли лицензия к программе +// * РежимИспользования - ПеречислениеСсылка.РежимыИспользованияПрограммыЭлектроннойПодписи +// * Автоопределение - Булево - программа определена автоматически +// +Функция НовоеРасширенноеОписаниеПрограммы() Экспорт + + Описание = Новый Структура; + Описание.Вставить("Ссылка"); + Описание.Вставить("Представление"); + Описание.Вставить("ИмяПрограммы"); + Описание.Вставить("ТипПрограммы"); + Описание.Вставить("АлгоритмПодписи"); + Описание.Вставить("АлгоритмХеширования"); + Описание.Вставить("АлгоритмШифрования"); + Описание.Вставить("Идентификатор"); + Описание.Вставить("АлгоритмыПроверкиПодписи"); + + Описание.Вставить("ПутьКПрограммеАвто", ""); + Описание.Вставить("ПутьКПрограммеНаСервереАвто", ""); + Описание.Вставить("Версия"); + Описание.Вставить("Лицензия", Ложь); + Описание.Вставить("РежимИспользования", ПредопределенноеЗначение( + "Перечисление.РежимыИспользованияПрограммыЭлектроннойПодписи.Автоматически")); + Описание.Вставить("Автоопределение", Истина); + + Возврат Описание; -// Вариант "furs.mark.crpt.ru_v1". -Функция КонвертXML1() - - Возврат - "<soap:Envelope - | xmlns:wsse=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"" - | xmlns:wsu=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"" - | xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""> - | <soap:Header> - | <wsse:Security soap:actor=""http://smev.gosuslugi.ru/actors/smev""> - | <ds:Signature xmlns:ds=""http://www.w3.org/2000/09/xmldsig#""> - | <SignedInfo xmlns=""http://www.w3.org/2000/09/xmldsig#""> - | <CanonicalizationMethod Algorithm=""http://www.w3.org/2001/10/xml-exc-c14n#""/> - | <SignatureMethod Algorithm=""%SignatureMethod%""/> - | <Reference URI=""#body""> - | <Transforms> - | <Transform Algorithm=""http://www.w3.org/2000/09/xmldsig#enveloped-signature""/> - | <Transform Algorithm=""http://www.w3.org/2001/10/xml-exc-c14n#""/> - | </Transforms> - | <DigestMethod Algorithm=""%DigestMethod%""/> - | <DigestValue>%DigestValue%</DigestValue> - | </Reference> - | </SignedInfo> - | <SignatureValue xmlns=""http://www.w3.org/2000/09/xmldsig#""> - | %SignatureValue% - | </SignatureValue> - | <ds:KeyInfo> - | <wsse:SecurityTokenReference> - | <wsse:Reference URI=""#SenderCertificate"" - | ValueType=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3""/> - | </wsse:SecurityTokenReference> - | </ds:KeyInfo> - | </ds:Signature> - | <wsse:BinarySecurityToken - | EncodingType=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"" - | ValueType=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"" - | wsu:Id=""SenderCertificate""> - | %BinarySecurityToken% - | </wsse:BinarySecurityToken> - | </wsse:Security> - | </soap:Header> - | <soap:Body wsu:Id=""body""> - | %MessageXML% - | </soap:Body> - |</soap:Envelope>"; - КонецФункции -// Вариант "dmdk.goznak.ru_v1". -Функция КонвертXML2() - - Возврат - "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" - | xmlns:ns=""urn://xsd.dmdk.goznak.ru/exchange/1.0"" - | xmlns:ns1=""urn://xsd.dmdk.goznak.ru/batch/1.0"" - | xmlns:ns2=""urn://xsd.dmdk.goznak.ru/contractor/1.0"" - | xmlns:ns3=""urn://xsd.dmdk.goznak.ru/types/1.0""> - | <soapenv:Header /> - | <soapenv:Body> - | <ns:CheckBatchRequest> - | <ns:CallerSignature> - | <ds:Signature xmlns:ds=""http://www.w3.org/2000/09/xmldsig#""> - | <ds:SignedInfo> - | <ds:CanonicalizationMethod Algorithm=""http://www.w3.org/2001/10/xml-exc-c14n#"" /> - | <ds:SignatureMethod Algorithm=""%SignatureMethod%"" /> - | <ds:Reference URI=""#body""> - | <ds:Transforms> - | <ds:Transform Algorithm=""http://www.w3.org/2001/10/xml-exc-c14n#"" /> - | <ds:Transform Algorithm=""urn://smev-gov-ru/xmldsig/transform"" /> - | </ds:Transforms> - | <ds:DigestMethod Algorithm=""%DigestMethod%"" /> - | <ds:DigestValue>%DigestValue%</ds:DigestValue> - | </ds:Reference> - | </ds:SignedInfo> - | <ds:SignatureValue>%SignatureValue%</ds:SignatureValue> - | <ds:KeyInfo> - | <ds:X509Data> - | <ds:X509Certificate>%BinarySecurityToken%</ds:X509Certificate> - | </ds:X509Data> - | </ds:KeyInfo> - | </ds:Signature> - | </ns:CallerSignature> - | <ns:RequestData Id=""body""> - | %MessageXML% - | </ns:RequestData> - | </ns:CheckBatchRequest> - | </soapenv:Body> - |</soapenv:Envelope>"; - -КонецФункции -#КонецОбласти + #Область ОбластьXML @@ -3118,7 +3594,7 @@ КонецФункции -Функция АлгоритмПодписи(Данные, ЭтоДанныеСертификата, ВключаяOID = Ложь, ТолькоOID = Ложь) +Функция АлгоритмПодписи(Данные, ЭтоДанныеСертификата = Неопределено, ВключаяOID = Ложь, ТолькоOID = Ложь) ДвоичныеДанные = ДвоичныеДанныеИзДанных(Данные, "ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмПодписи"); diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйЛокализация/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйЛокализация/Module.bsl index 43422e000..618bce10e 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйЛокализация/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйЛокализация/Module.bsl @@ -182,23 +182,331 @@ КонецФункции +#Область ПолучениеДистрибутивовКриптопровайдеров + +// Получает дистрибутив КриптоПро CSP +// +// Параметры: +// ПараметрыЗагрузки - Структура: +// * Продукт - Строка - тип продукта КриптоПро (x64/x86) для загрузки. +// * КонтактноеЛицо - Строка - контактное лицо запросившее дистрибутив. +// * ЭлектроннаяПочта - Строка - электронная почта для регистрации дистрибутива. +// +Функция ДистрибутивCryptoProCSP(Параметры) Экспорт + + СтруктураВозврата = Новый Структура; + СтруктураВозврата.Вставить("ПараметрыДистрибутива", Неопределено); + СтруктураВозврата.Вставить("Ошибка", ""); + + ИмяПрограммыКриптоПро = ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыКриптоПро(); + + АдресЗагрузки = "https://www.cryptopro.ru/products/csp/downloads/kontur"; + ВидОперации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Получение серийного номера %1'", ОбщегоНазначения.КодОсновногоЯзыка()), ИмяПрограммыКриптоПро); + + Попытка + ОписаниеСоединения = СоединениеССерверомИнтернета(ВидОперации, АдресЗагрузки, 60); + Исключение + СтруктураВозврата.Ошибка = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Возврат СтруктураВозврата; + КонецПопытки; + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded"); + Запрос = Новый HTTPЗапрос("/products/csp/downloads/kontur", Заголовки); + + СтрокаЗапроса = "product=%1&username=%2&email=%3&company=%4"; + СтрокаЗапроса = СтрШаблон(СтрокаЗапроса, + Параметры.Продукт, + КодироватьСтроку(Параметры.КонтактноеЛицо, СпособКодированияСтроки.URLВКодировкеURL), + КодироватьСтроку(Параметры.ЭлектроннаяПочта, СпособКодированияСтроки.URLВКодировкеURL), + ""); + + Запрос.УстановитьТелоИзСтроки(СтрокаЗапроса); + + Попытка + Ответ = ОписаниеСоединения.HTTPСоединение.ОтправитьДляОбработки(Запрос); + Исключение + ИнформацияОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписьЖурналаРегистрации(ВидОперации, УровеньЖурналаРегистрации.Ошибка,,, ИнформацияОбОшибке); + СтруктураВозврата.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сервис получения серийных номеров для %1 временно недоступен. Подробности см. в Журнале регистрации. + |Повторите попытку позже.'"), ИмяПрограммыКриптоПро); + Возврат СтруктураВозврата; + КонецПопытки; + + Если Ответ.КодСостояния = 200 И Ответ.Заголовки.Получить("Distribution-Number") <> Неопределено Тогда + + Дистрибутив = Ответ.ПолучитьТелоКакДвоичныеДанные(); + ПараметрыДистрибутива = НовыйПараметрыДистрибутива(); + ПараметрыДистрибутива.НомерДистрибутива = Ответ.Заголовки["Distribution-Number"]; + ПараметрыДистрибутива.КонтрольнаяСумма = Ответ.Заголовки["GOST"]; + ПараметрыДистрибутива.Версия = Ответ.Заголовки["Version"]; + + ВременныйКаталог = ФайловаяСистема.СоздатьВременныйКаталог(); + + Дистрибутив.Записать(ВременныйКаталог + "Setup.exe"); + + ПараметрыДистрибутива.ИмяФайлаДистрибутива = "Setup.exe"; + + ТекстСкрипта = ":: setup CryptoPro CSP + |@echo off + | + |""!setup.exe!""!args!"; + ТекстСкрипта = СтрЗаменить(ТекстСкрипта, "!setup.exe!", "Setup.exe"); + Если ЗначениеЗаполнено(Параметры.СерийныйНомер) Тогда + ТекстСкрипта = СтрЗаменить(ТекстСкрипта, "!args!", СтрШаблон(" -args ""PIDKEY=%1""", Параметры.СерийныйНомер)); + Иначе + ТекстСкрипта = СтрЗаменить(ТекстСкрипта, "!args!", ""); + КонецЕсли; + + ТекстовыйФайл = Новый ЗаписьТекста(ВременныйКаталог + "Setup.bat", КодировкаТекста.OEM); + ТекстовыйФайл.Записать(ТекстСкрипта); + ТекстовыйФайл.Закрыть(); + + Файлы = Новый Массив; + Для каждого Файл Из НайтиФайлы(ВременныйКаталог, ПолучитьМаскуВсеФайлы()) Цикл + ОписаниеФайла = Новый Структура; + ОписаниеФайла.Вставить("Имя", Файл.Имя); + ОписаниеФайла.Вставить("ДвоичныеДанные", Новый ДвоичныеДанные(Файл.ПолноеИмя)); + Файлы.Добавить(ОписаниеФайла); + КонецЦикла; + ПараметрыДистрибутива.Дистрибутив = Файлы; + ФайловаяСистема.УдалитьВременныйКаталог(ВременныйКаталог); + Иначе + СтруктураВозврата.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при получении серийного номера %1, подробности см. в журнале регистрации'"), + ИмяПрограммыКриптоПро); + Возврат СтруктураВозврата; + КонецЕсли; + + СтруктураВозврата.Вставить("ПараметрыДистрибутива", ПараметрыДистрибутива); + Возврат СтруктураВозврата; + +КонецФункции + +// Получает дистрибутив VipNet CSP +// +// Параметры: +// ПараметрыПоиска - Структура: +// * Разрядность - Число - разрядность операционной системы (x64/x86) для загрузки дистрибутива. +// * КонтактноеЛицо - Строка - контактное лицо запросившее дистрибутив. +// * ЭлектроннаяПочта - Строка - электронная почта для регистрации дистрибутива. +// +// Возвращаемое значение: +// Структура: +// * ПараметрыДистрибутива см. НовыйПараметрыДистрибутива +// +Функция ДистрибутивViPNetCSP(Параметры) Экспорт + + ИмяПрограммыVipNet = ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыVipNet(); + + СтруктураВозврата = Новый Структура; + СтруктураВозврата.Вставить("ПараметрыДистрибутива", Неопределено); + СтруктураВозврата.Вставить("Ошибка", ""); + + Если Параметры.Разрядность = 64 Тогда + ВидДистрибутива = "latest_win64bit_all"; + Иначе + ВидДистрибутива = "latest_win32bit_all"; + КонецЕсли; + + АдресЗагрузки = "https://getserial.infotecs.ru/partner/csp/service/GetSerialNumberByAbonentInfo/"; + ВидОперации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Получение серийного номера %1'", ОбщегоНазначения.КодОсновногоЯзыка()), ИмяПрограммыVipNet); + + Попытка + ОписаниеСоединения = СоединениеССерверомИнтернета(ВидОперации, АдресЗагрузки, 60); + Исключение + СтруктураВозврата.Ошибка = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Возврат СтруктураВозврата; + КонецПопытки; + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded"); + Запрос = Новый HTTPЗапрос("/partner/csp/service/GetSerialNumberByAbonentInfo/", Заголовки); + + ИдентификаторЗапроса = Строка(Новый УникальныйИдентификатор); + + Хеширование = Новый ХешированиеДанных(ХешФункция.MD5); + Хеширование.Добавить(СокрЛП(ИдентификаторЗапроса) + "1594xV9dHsW7vNN"); + + MD5 = СтрЗаменить(НРег(Хеширование.ХешСумма), " ", ""); + + СтрокаЗапроса = "i_id_request=%1&i_id_partner=%2&i_req_sign=%3&i_contact_person=%4&i_email=%5&i_id_file=%6"; + СтрокаЗапроса = СтрШаблон(СтрокаЗапроса, + ИдентификаторЗапроса, "1594", MD5, + КодироватьСтроку(Параметры.КонтактноеЛицо, СпособКодированияСтроки.URLВКодировкеURL), + КодироватьСтроку(Параметры.ЭлектроннаяПочта, СпособКодированияСтроки.URLВКодировкеURL), + КодироватьСтроку(ВидДистрибутива, СпособКодированияСтроки.URLВКодировкеURL)); + + Запрос.УстановитьТелоИзСтроки(СтрокаЗапроса); + + Попытка + Ответ = ОписаниеСоединения.HTTPСоединение.ОтправитьДляОбработки(Запрос); + Исключение + + ИнформацияОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписьЖурналаРегистрации(ВидОперации, УровеньЖурналаРегистрации.Ошибка,,, ИнформацияОбОшибке); + СтруктураВозврата.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сервис получения серийных номеров для %1 временно недоступен. Подробности см. в Журнале регистрации. + |Повторите попытку позже.'"), ИмяПрограммыVipNet); + Возврат СтруктураВозврата; + + КонецПопытки; + + Если Ответ.КодСостояния = 200 Тогда + ЧтениеJson = Новый ЧтениеJSON; + ЧтениеJson.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку()); + + ОтветJSON = ПрочитатьJSON(ЧтениеJson); + ЧтениеJson.Закрыть(); + + Если ОтветJSON.Свойство("error_code") И ОтветJSON.error_code = 100 Тогда + ПараметрыДистрибутива = НовыйПараметрыДистрибутива(); + ПараметрыДистрибутива.СерийныйНомер = ОтветJSON.i_sn; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + МодульПолучениеФайловИзИнтернетаКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиентСервер"); + ПараметрыПолученияФайла = МодульПолучениеФайловИзИнтернетаКлиентСервер.ПараметрыПолученияФайла(); + МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета"); + Файл = МодульПолучениеФайловИзИнтернета.СкачатьФайлВоВременноеХранилище(ОтветJSON.i_download_url, ПараметрыПолученияФайла); + Если Не Файл.Статус Тогда + Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось скачать дистрибутив %1. Подробности см.в Журнале регистрации. + |Повторите попытку позже.'"), ИмяПрограммыVipNet); + СтруктураВозврата.Вставить("ПараметрыДистрибутива", ПараметрыДистрибутива); + СтруктураВозврата.Вставить("Ошибка", Ошибка); + Возврат СтруктураВозврата; + КонецЕсли; + Дистрибутив = ПолучитьИзВременногоХранилища(Файл.Путь); + Иначе + + ПутьДляСохранения = ПолучитьИмяВременногоФайла(); + Заголовки = Новый Соответствие; + Попытка + Ответ = ОписаниеСоединения.HTTPСоединение.Получить(Новый HTTPЗапрос(ОтветJSON.i_download_url, + Заголовки), ПутьДляСохранения); + Исключение + + ИнформацияОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписьЖурналаРегистрации(ВидОперации, УровеньЖурналаРегистрации.Ошибка, , , ИнформацияОбОшибке); + СтруктураВозврата.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось скачать дистрибутив %1. Подробности см.в Журнале регистрации. + |Повторите попытку позже.'"), ИмяПрограммыVipNet); + Возврат СтруктураВозврата; + + КонецПопытки; + + Если Ответ.КодСостояния = 200 Тогда + Дистрибутив = Новый ДвоичныеДанные(ПутьДляСохранения); + ФайловаяСистема.УдалитьВременныйФайл(ПутьДляСохранения); + Иначе + + ИнформацияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'HTTP ответ - %1'"), Строка(Ответ.КодСостояния)); + ЗаписьЖурналаРегистрации(ВидОперации, УровеньЖурналаРегистрации.Ошибка, , , ИнформацияОбОшибке); + СтруктураВозврата.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось скачать дистрибутив %1. Подробности см.в Журнале регистрации. + |Повторите попытку позже.'"), ИмяПрограммыVipNet); + Возврат СтруктураВозврата; + + КонецЕсли; + + КонецЕсли; + + ПараметрыДистрибутива.КонтрольнаяСумма = ОтветJSON.i_distr_checksum; + + ВременныйКаталог = ФайловаяСистема.СоздатьВременныйКаталог(); + Поток = Новый ПотокВПамяти; + Дистрибутив.Записать(Поток); + + ЧтениеZip = Новый ЧтениеZipФайла(Поток); + ЧтениеZip.ИзвлечьВсе(ВременныйКаталог); + ЧтениеZip.Закрыть(); + Поток.Закрыть(); + + ТекстСкрипта = "Serial Number: %1 + |E-mail: %2 + |User name: %3 + |Company: %4"; + + ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыДистрибутива.СерийныйНомер, + Параметры.ЭлектроннаяПочта, Параметры.КонтактноеЛицо, ""); + + ТекстовыйФайл = Новый ЗаписьТекста(ВременныйКаталог + "cspreg.txt", КодировкаТекста.OEM); + ТекстовыйФайл.Записать(ТекстСкрипта); + ТекстовыйФайл.Закрыть(); + Файлы = Новый Массив; + Для Каждого Файл Из НайтиФайлы(ВременныйКаталог, ПолучитьМаскуВсеФайлы(), Истина) Цикл + Если Файл.ЭтоКаталог() Тогда + Продолжить; + КонецЕсли; + + ОписаниеФайла = Новый Структура; + ОписаниеФайла.Вставить("Имя", Файл.Имя); + ОписаниеФайла.Вставить("ДвоичныеДанные", Новый ДвоичныеДанные(Файл.ПолноеИмя)); + Файлы.Добавить(ОписаниеФайла); + + Если СтрНачинаетсяС(Файл.Имя, "ViPNet") + И СтрЗаканчиваетсяНа(Файл.Имя, ".exe") + И СтрНайти(Файл.Имя, "hash") = 0 Тогда + + // Версию возьмем из имени файла, пример: ViPNet_CSP_RUS_4.4.0.61581.exe + НачалоВерсии = СтрНайти(Файл.ИмяБезРасширения, "_", НаправлениеПоиска.СКонца, , 1) + 1; + Версия = Сред(Файл.Имя, НачалоВерсии, 11); + ПараметрыДистрибутива.Версия = Версия; + ПараметрыДистрибутива.ИмяФайлаДистрибутива = Файл.Имя; + + ТекстСкрипта = + ":: setup ViPNet CSP + |@echo off + | + |""!setup.exe!""!args!"; + ТекстСкрипта = СтрЗаменить(ТекстСкрипта, "!setup.exe!", Файл.Имя); + ТекстСкрипта = СтрЗаменить(ТекстСкрипта, "!args!", "/qf"); + + ТекстовыйФайл = Новый ЗаписьТекста(ВременныйКаталог + "Setup.bat", КодировкаТекста.OEM); + ТекстовыйФайл.Записать(ТекстСкрипта); + ТекстовыйФайл.Закрыть(); + + ОписаниеФайла = Новый Структура; + ОписаниеФайла.Вставить("Имя", "Setup.bat"); + ОписаниеФайла.Вставить("ДвоичныеДанные", Новый ДвоичныеДанные(ВременныйКаталог + "Setup.bat")); + Файлы.Добавить(ОписаниеФайла); + КонецЕсли; + КонецЦикла; + + ПараметрыДистрибутива.Дистрибутив = Файлы; + ФайловаяСистема.УдалитьВременныйКаталог(ВременныйКаталог); + Иначе + ЗаписьЖурналаРегистрации(ВидОперации, УровеньЖурналаРегистрации.Ошибка, , , СтрШаблон("error_code: %1", + ОтветJSON.error_code)); + СтруктураВозврата.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сервис получения серийных номеров для %1 временно недоступен. Подробности см. в Журнале регистрации. + |Повторите попытку позже.'"), ИмяПрограммыVipNet); + Возврат СтруктураВозврата; + КонецЕсли; + + Иначе + ЗаписьЖурналаРегистрации(ВидОперации, УровеньЖурналаРегистрации.Ошибка, , , Ответ.ПолучитьТелоКакСтроку()); + СтруктураВозврата.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сервис получения серийных номеров для %1 временно недоступен. Подробности см. в Журнале регистрации. + |Повторите попытку позже.'"), ИмяПрограммыVipNet); + Возврат СтруктураВозврата; + КонецЕсли; + + СтруктураВозврата.Вставить("ПараметрыДистрибутива", ПараметрыДистрибутива); + Возврат СтруктураВозврата; + +КонецФункции + +#КонецОбласти + #КонецОбласти #Область СлужебныеПроцедурыИФункции -// Для функции ДоступностьСозданияЗаявления. -Функция МосковскоеВремя() - - Если ПолучитьДопустимыеЧасовыеПояса().Найти("Europe/Moscow") <> Неопределено Тогда - ЧасовойПоясМосквы = "Europe/Moscow"; - Иначе - ЧасовойПоясМосквы = "GMT+3"; - КонецЕсли; - - Возврат МестноеВремя(ТекущаяУниверсальнаяДата(), ЧасовойПоясМосквы); - -КонецФункции - Функция ДатаПрекращенияДействияСертификатовВыданныхКоммерческимиУЦ() ДатаПоУмолчанию = Дата(2023, 9, 1); @@ -219,6 +527,105 @@ КонецФункции +// Новый параметры дистрибутива. +// +// Возвращаемое значение: +// Структура: +// * Дистрибутив - Массив из Структура: +// ** Имя - Строка +// ** ДвоичныеДанные - ДвоичныеДанные +// * НомерДистрибутива - Строка +// * КонтрольнаяСумма - Строка +// * Версия - Строка +// * СерийныйНомер - Строка +// * ИмяФайлаДистрибутива - Строка +// +Функция НовыйПараметрыДистрибутива() + + Структура = Новый Структура; + Структура.Вставить("Дистрибутив", Новый Массив); + Структура.Вставить("НомерДистрибутива", ""); + Структура.Вставить("КонтрольнаяСумма", ""); + Структура.Вставить("Версия", ""); + Структура.Вставить("СерийныйНомер", ""); + Структура.Вставить("ИмяФайлаДистрибутива", ""); + + Возврат Структура; + +КонецФункции + +// Возвращает описание HTTP соединения. +// +// Параметры: +// URL - Строка +// Таймаут - Число +// Возвращаемое значение: +// Структура: +// * HTTPСоединение - HTTPСоединение +// * СтруктураURI - см. ОбщегоНазначенияКлиентСервер.СтруктураURI + +Функция СоединениеССерверомИнтернета(ВидОперации, URL, Таймаут = Неопределено) + + СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(URL); + Схема = ?(ЗначениеЗаполнено(СтруктураURI.Схема), СтруктураURI.Схема, "http"); + Прокси = Неопределено; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета"); + Прокси = МодульПолучениеФайловИзИнтернета.ПолучитьПрокси(Схема); + КонецЕсли; + + Если Таймаут = Неопределено Тогда + Таймаут = 60; + КонецЕсли; + + Попытка + Соединение = Новый HTTPСоединение( + СтруктураURI.Хост, + СтруктураURI.Порт, + СтруктураURI.Логин, + СтруктураURI.Пароль, + Прокси, + Таймаут, + ?(НРег(Схема) = "http", Неопределено, ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение())); + Исключение + + ШаблонЗапроса = "%1:%2ping"; + СсылкаНаРесурс = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗапроса, + СтруктураURI.Хост, СтруктураURI.Порт); + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось установить HTTP-соединение с сервером %1:%2 + |по причине: + |%3'"), + СтруктураURI.Хост, Формат(СтруктураURI.Порт, "ЧГ="), + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета"); + РезультатДиагностики = МодульПолучениеФайловИзИнтернета.ДиагностикаСоединения(СсылкаНаРесурс); + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 + |Результат диагностики: + |%2'"), + РезультатДиагностики.ОписаниеОшибки); + КонецЕсли; + + ЗаписьЖурналаРегистрации(ВидОперации, УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки); + + ВызватьИсключение ТекстОшибки; + + КонецПопытки; + + ОписаниеСоединения = Новый Структура; + ОписаниеСоединения.Вставить("HTTPСоединение", Соединение); + ОписаниеСоединения.Вставить("СтруктураURI", СтруктураURI); + + Возврат ОписаниеСоединения; + +КонецФункции + Функция ПрочитатьАрхивКлассификатора(Знач Архив, Версия = 0) ИмяАрхива = ПолучитьИмяВременногоФайла("zip"); @@ -422,10 +829,23 @@ АдресКлассификатора = Новый Структура; АдресКлассификатора.Вставить("Протокол", "http://"); АдресКлассификатора.Вставить("АдресСервера", "downloads.v8.1c.ru"); - АдресКлассификатора.Вставить("АдресРесурса", "content/LED/settings/ErrorClassifier/classifier2.json"); + АдресКлассификатора.Вставить("АдресРесурса", "content/LED/settings/ErrorClassifier/classifier3.json"); Возврат АдресКлассификатора; КонецФункции +// Для функции ДоступностьСозданияЗаявления. +Функция МосковскоеВремя() + + Если ПолучитьДопустимыеЧасовыеПояса().Найти("Europe/Moscow") <> Неопределено Тогда + ЧасовойПоясМосквы = "Europe/Moscow"; + Иначе + ЧасовойПоясМосквы = "GMT+3"; + КонецЕсли; + + Возврат МестноеВремя(ТекущаяУниверсальнаяДата(), ЧасовойПоясМосквы); + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйПовтИсп/Module.bsl index b66ab40cb..fb6cb2de5 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйПовтИсп/Module.bsl @@ -65,7 +65,8 @@ | Программы.ТипПрограммы КАК ТипПрограммы, | Программы.АлгоритмПодписи КАК АлгоритмПодписи, | Программы.АлгоритмХеширования КАК АлгоритмХеширования, - | Программы.АлгоритмШифрования КАК АлгоритмШифрования + | Программы.АлгоритмШифрования КАК АлгоритмШифрования, + | Программы.РежимИспользования КАК РежимИспользования |ИЗ | Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК Программы |ГДЕ @@ -78,7 +79,43 @@ Выборка = Запрос.Выполнить().Выбрать(); ОписанияПрограмм = Новый Массив; ОписанияПрограммПоСсылке = Новый Соответствие; + + ПрограммыПоИменамСТипом = Новый Соответствие; + ПрограммыПоИдентификаторамАлгоритмовОткрытогоКлюча = Новый Соответствие; + ПоставляемыеНастройки = Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПоставляемыеНастройкиПрограмм(); + НаборыАлгоритмовДляСозданияПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.НаборыАлгоритмовДляСозданияПодписи(); + + Для Каждого ПоставляемаяНастройка Из ПоставляемыеНастройки Цикл + + КлючПоискаПрограммыПоИмениСТипом = ЭлектроннаяПодписьСлужебныйКлиентСервер.КлючПоискаПрограммыПоИмениСТипом( + ПоставляемаяНастройка.ИмяПрограммы, ПоставляемаяНастройка.ТипПрограммы); + + Описание = ОписаниеПрограммы(); + ЗаполнитьЗначенияСвойств(Описание, ПоставляемаяНастройка); + Описание.АлгоритмыПроверкиПодписи = АлгоритмыПроверкиПодписи(ПоставляемаяНастройка); + ФиксированноеОписание = Новый ФиксированнаяСтруктура(Описание); + + ПрограммыПоИменамСТипом .Вставить(КлючПоискаПрограммыПоИмениСТипом, ФиксированноеОписание); + + ИдентификаторОткрытогоКлюча = Неопределено; + Для Каждого ТекущийЭлемент Из НаборыАлгоритмовДляСозданияПодписи Цикл + Если ТекущийЭлемент.ИменаАлгоритмаПодписи.Найти(ПоставляемаяНастройка.АлгоритмПодписи) <> Неопределено Тогда + ИдентификаторОткрытогоКлюча = ТекущийЭлемент.ИдентификаторАлгоритмаОткрытогоКлюча; + Прервать; + КонецЕсли; + КонецЦикла; + + Если ИдентификаторОткрытогоКлюча <> Неопределено Тогда + ПрограммыПоОткрытомуКлючу = ПрограммыПоИдентификаторамАлгоритмовОткрытогоКлюча.Получить(ИдентификаторОткрытогоКлюча); + Если ПрограммыПоОткрытомуКлючу = Неопределено Тогда + ПрограммыПоОткрытомуКлючу = Новый Соответствие; + КонецЕсли; + ПрограммыПоОткрытомуКлючу.Вставить(КлючПоискаПрограммыПоИмениСТипом, ПоставляемаяНастройка.Идентификатор); + ПрограммыПоИдентификаторамАлгоритмовОткрытогоКлюча.Вставить(ИдентификаторОткрытогоКлюча, ПрограммыПоОткрытомуКлючу); + КонецЕсли; + + КонецЦикла; Пока Выборка.Следующий() Цикл Отбор = Новый Структура("ИмяПрограммы, ТипПрограммы", Выборка.ИмяПрограммы, Выборка.ТипПрограммы); @@ -89,15 +126,7 @@ Иначе Строка = Строки[0]; // СтрокаТаблицыЗначений: см. ЭлектроннаяПодписьСлужебный.ПоставляемыеНастройкиПрограмм Идентификатор = Строка.Идентификатор; - АлгоритмыПроверкиПодписи = Строка.АлгоритмыПроверкиПодписи; - Если АлгоритмыПроверкиПодписи.Найти(Строка.АлгоритмПодписи) = Неопределено Тогда - АлгоритмыПроверкиПодписи.Вставить(0, Строка.АлгоритмПодписи); - КонецЕсли; - Для Каждого АлгоритмПодписи Из Строка.АлгоритмыПодписи Цикл - Если АлгоритмыПроверкиПодписи.Найти(АлгоритмПодписи) = Неопределено Тогда - АлгоритмыПроверкиПодписи.Добавить(АлгоритмПодписи); - КонецЕсли; - КонецЦикла; + АлгоритмыПроверкиПодписи = АлгоритмыПроверкиПодписи(Строка); КонецЕсли; Описание = ОписаниеПрограммы(); @@ -107,6 +136,14 @@ ФиксированноеОписание = Новый ФиксированнаяСтруктура(Описание); ОписанияПрограмм.Добавить(ФиксированноеОписание); + + Если Выборка.РежимИспользования <> Перечисления.РежимыИспользованияПрограммыЭлектроннойПодписи.Автоматически Тогда + КлючПоискаПрограммыПоИмениСТипом = ЭлектроннаяПодписьСлужебныйКлиентСервер.КлючПоискаПрограммыПоИмениСТипом( + Выборка.ИмяПрограммы, Выборка.ТипПрограммы); + // Замена поставляемой настройки настройкой из справочника. + ПрограммыПоИменамСТипом.Вставить(КлючПоискаПрограммыПоИмениСТипом, ФиксированноеОписание); + КонецЕсли; + ОписанияПрограммПоСсылке.Вставить(Описание.Ссылка, ФиксированноеОписание); КонецЦикла; @@ -125,17 +162,18 @@ ОбщиеНастройки.Вставить("АдресаСерверовМетокВремени", Новый Массив); КонецЕсли; - ОбщиеНастройки.Вставить("УсовершенствоватьПодписиАвтоматически", Константы.УсовершенствоватьПодписиАвтоматически.Получить()); - ОбщиеНастройки.Вставить("ДобавлятьМеткиВремениАвтоматически", Константы.ДобавлятьМеткиВремениАвтоматически.Получить()); - ОбщиеНастройки.Вставить("УсовершенствоватьПодписиСДаты", Константы.УсовершенствоватьПодписиСДаты.Получить()); ОбщиеНастройки.Вставить("ЭтоМодельСервисаСДоступнымУсовершенствованием", ЭтоМодельСервисаСДоступнымУсовершенствованием()); ОбщиеНастройки.Вставить("ДоступнаПроверкаПоСпискуУЦ", Метаданные.ОбщиеМодули.Найти("ЭлектроннаяПодписьСлужебныйЛокализация") <> Неопределено); - + ОбщиеНастройки.Вставить("ДоступнаПроверкаСертификатаВОблачномСервисеСПараметрами", ДоступнаПроверкаСертификатаВОблачномСервисеСПараметрами()); + ОбщиеНастройки.Вставить("ПрограммыПоИменамСТипом", Новый ФиксированноеСоответствие(ПрограммыПоИменамСТипом)); + ОбщиеНастройки.Вставить("ПрограммыПоИдентификаторамАлгоритмовОткрытогоКлюча", + Новый ФиксированноеСоответствие(ПрограммыПоИдентификаторамАлгоритмовОткрытогоКлюча)); + Возврат Новый ФиксированнаяСтруктура(ОбщиеНастройки); КонецФункции @@ -163,7 +201,8 @@ Описание.Вставить("АлгоритмШифрования"); Описание.Вставить("Идентификатор"); Описание.Вставить("АлгоритмыПроверкиПодписи"); - + Описание.Вставить("РежимИспользования"); + Возврат Описание; КонецФункции @@ -228,6 +267,8 @@ ЗаполнитьЗначенияСвойств(ПредставлениеОшибки, СтрокаКлассификатора); ПредставлениеОшибки.ДействияДляУстранения = ПрочитанныеДействияДляУстраненияОшибок( ПредставлениеОшибки.СпособУстранения); + ДополнитьРешениеАвтоматическимиДействиями(ПредставлениеОшибки.Решение, ПредставлениеОшибки.ДействияДляУстранения); + ПредставлениеОшибки.Причина = СтроковыеФункции.ФорматированнаяСтрока(ПредставлениеОшибки.Причина); ПредставлениеОшибки.Решение = СтроковыеФункции.ФорматированнаяСтрока(ПредставлениеОшибки.Решение); @@ -241,6 +282,40 @@ КонецФункции +Процедура ДополнитьРешениеАвтоматическимиДействиями(Решение, ДействияДляУстранения) + + Если Не ЗначениеЗаполнено(ДействияДляУстранения) Тогда + Возврат; + КонецЕсли; + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + Возврат; + КонецЕсли; + + Для Каждого Действие Из ДействияДляУстранения Цикл + + Если Действие = "УстановитьСписокОтзываСертификата" Тогда + Решение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '- <a href=%1>Установите список отзыва</a> удостоверяющего центра автоматически. + |%2'"), Действие, Решение); + ИначеЕсли Действие = "УстановитьКорневойСертификат" Тогда + Решение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '- <a href=%1>Установите корневой сертификат</a> удостоверяющего центра автоматически. + |%2'"), Действие, Решение); + ИначеЕсли Действие = "УстановитьСертификат" Тогда + Решение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '- <a href=%1>Установите сертификат</a> в Личное хранилище сертификатов пользователя операционной системы автоматически. + |%2'"), Действие, Решение); + ИначеЕсли Действие = "УстановитьСертификатВКонтейнер" Тогда + Решение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '- <a href=%1>Установите сертификат в контейнер</a> прямо из программы. + |%2'"), Действие, Решение); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + // Только для внутреннего использования. Функция ПрочитанныеДействияДляУстраненияОшибок(СпособУстранения) @@ -312,7 +387,7 @@ КонецЦикла; ОбщиеНастройки = ЭлектроннаяПодпись.ОбщиеНастройки(); - ТипПлатформыСтрокой = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТипПлатформыСтрокой(); + ИмяТипаПлатформы = ОбщегоНазначенияКлиентСервер.ИмяТипаПлатформы(); Для Каждого ОписаниеПрограммы Из ОбщиеНастройки.ОписанияПрограмм Цикл Если ПутиКПрограммамНаСерверахLinux.Получить(ОписаниеПрограммы.Ссылка) <> Неопределено Тогда @@ -323,7 +398,7 @@ Продолжить; КонецЕсли; ОписаниеПути = ОписаниеПутиПоИдентификаторуПрограммы(ОписаниеПрограммы.Идентификатор, - ОбщиеНастройки.ПоставляемыеПутиКМодулямПрограмм, ТипПлатформыСтрокой); + ОбщиеНастройки.ПоставляемыеПутиКМодулямПрограмм, ИмяТипаПлатформы); Если ОписаниеПути <> Неопределено Тогда ПутиКПрограммамНаСерверахLinux.Вставить(ОписаниеПрограммы.Ссылка, ОписаниеПути); ПутиКПрограммамНаСерверахLinux.Вставить(ОписаниеПрограммы.Идентификатор, ОписаниеПути); @@ -336,7 +411,7 @@ Продолжить; КонецЕсли; ОписаниеПути = ОписаниеПутиПоИдентификаторуПрограммы(ПоставляемаяНастройка.Идентификатор, - ОбщиеНастройки.ПоставляемыеПутиКМодулямПрограмм, ТипПлатформыСтрокой); + ОбщиеНастройки.ПоставляемыеПутиКМодулямПрограмм, ИмяТипаПлатформы); Если ОписаниеПути <> Неопределено Тогда ПутиКПрограммамНаСерверахLinux.Вставить(ПоставляемаяНастройка.Идентификатор, ОписаниеПути); КонецЕсли; @@ -391,7 +466,7 @@ Исключение Существует = Ложь; ИнформацияОбОшибке = ИнформацияОбОшибке(); - ТекстыОшибок.Добавить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ТекстыОшибок.Добавить(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; Если Существует Тогда Результат = Истина; @@ -433,11 +508,12 @@ Если ОбщегоНазначения.РазделениеВключено() Тогда Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS"); НастройкиПодключения = МодульСервисКриптографииDSS.НастройкиПодключенияСлужебнойУчетнойЗаписи(); - Если НастройкиПодключения.Свойство("АдресСервера") И ЗначениеЗаполнено(НастройкиПодключения.АдресСервера) Тогда - Возврат Истина; - КонецЕсли; + + Возврат НастройкиПодключения.Выполнено; + КонецЕсли; КонецЕсли; @@ -471,4 +547,27 @@ КонецФункции +Функция УстановленныеКриптопровайдеры() Экспорт + + Возврат ЭлектроннаяПодписьСлужебный.УстановленныеКриптопровайдеры(); + +КонецФункции + +Функция АлгоритмыПроверкиПодписи(ПоставляемаяНастройка) + + АлгоритмыПроверкиПодписи = ПоставляемаяНастройка.АлгоритмыПроверкиПодписи; + Если АлгоритмыПроверкиПодписи.Найти(ПоставляемаяНастройка.АлгоритмПодписи) = Неопределено Тогда + АлгоритмыПроверкиПодписи.Вставить(0, ПоставляемаяНастройка.АлгоритмПодписи); + КонецЕсли; + + Для Каждого АлгоритмПодписи Из ПоставляемаяНастройка.АлгоритмыПодписи Цикл + Если АлгоритмыПроверкиПодписи.Найти(АлгоритмПодписи) = Неопределено Тогда + АлгоритмыПроверкиПодписи.Добавить(АлгоритмПодписи); + КонецЕсли; + КонецЦикла; + + Возврат АлгоритмыПроверкиПодписи; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/ЯндексПереводчик/Module.bsl b/SSL/src/CommonModules/ЯндексПереводчик/Module.bsl index d2f2ad367..3068a74a2 100644 --- a/SSL/src/CommonModules/ЯндексПереводчик/Module.bsl +++ b/SSL/src/CommonModules/ЯндексПереводчик/Module.bsl @@ -177,7 +177,7 @@ Исключение ЗаписатьОшибкуВЖурналРегистрации(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось установить соединение с сервером %1 по причине: - |%2'"), ИмяХоста, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + |%2'"), ИмяХоста, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); ВызватьИсключение; КонецПопытки; diff --git a/SSL/src/CommonPictures/GoogleMaps/Picture.svg b/SSL/src/CommonPictures/GoogleMaps/Picture.svg new file mode 100644 index 000000000..281010b8d --- /dev/null +++ b/SSL/src/CommonPictures/GoogleMaps/Picture.svg @@ -0,0 +1,7 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M5.06997 11.8528C5.56362 12.4702 6.06638 13.2465 6.32949 13.7154C6.6499 14.325 6.78275 14.7366 7.02111 15.4738C7.16048 15.8776 7.29333 16 7.57207 16C7.87685 16 8.01622 15.7942 8.12302 15.4738C8.34575 14.7822 8.51768 14.2559 8.7899 13.7545C9.83971 11.7747 11.5512 10.368 12.515 8.44024C12.515 8.44024 13.1494 7.26277 13.1494 5.61379C13.1494 4.07683 12.5242 3.00877 12.5242 3.00877L5.07388 11.8658L5.06997 11.8528Z" fill="#34A853"/> +<path d="M2.54314 8.23182C3.1436 9.59945 4.28849 10.7978 5.06999 11.8528L9.21192 6.94233C9.21192 6.94233 8.6271 7.70821 7.57078 7.70821C6.39332 7.70821 5.43468 6.7704 5.43468 5.58511C5.43468 4.76974 5.92052 4.20445 5.92052 4.20445C2.87268 4.65773 3.042 5.39625 2.53403 8.22921L2.54314 8.23182Z" fill="#FBBC04"/> +<path d="M9.26403 0.256622C10.6447 0.700776 11.8169 1.63728 12.5203 3.0049L9.21193 6.95149C9.21193 6.95149 9.69776 6.3836 9.69776 5.57083C9.69776 4.36081 8.6766 3.44775 7.57469 3.44775C6.52878 3.44775 5.93354 4.20451 5.93354 4.20451C6.18753 3.6262 8.81206 0.4533 9.26793 0.257925L9.26403 0.256622Z" fill="#4285F4"/> +<path d="M3.2986 1.99282C4.12177 1.01334 5.56494 0 7.55776 0C8.5203 0 9.251 0.25529 9.251 0.25529L5.92964 4.20186C5.70561 4.08034 3.52002 2.37836 3.2986 1.98761V1.99282Z" fill="#1A73E8"/> +<path d="M2.54314 8.23179C2.54314 8.23179 2 7.15332 2 5.60075C2 4.12893 2.5757 2.83946 3.3025 2.00586L5.93354 4.2201L2.54705 8.23179H2.54314Z" fill="#EA4335"/> +</svg> diff --git a/SSL/src/CommonPictures/GoogleMaps/Picture.zip b/SSL/src/CommonPictures/GoogleMaps/Picture.zip deleted file mode 100644 index db75cef80a6fd993cf154835b0653da351aa5a9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17951 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 diff --git a/SSL/src/CommonPictures/Skype/Picture.zip b/SSL/src/CommonPictures/Skype/Picture.zip index 9e385f9107c2f6d87b325e6d21e7939d08215646..4b18540d9b45e30c1488ad102e215e28cdd53666 100644 GIT binary patch literal 12876 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 Lk5-`4|F!yG#RrF$ literal 10368 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 X*=kDgf8|#Il&5#d(`d`y-@yL?FL{ZH diff --git a/SSL/src/CommonPictures/Адрес/Picture.zip b/SSL/src/CommonPictures/Адрес/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..fa584a0614494d46b8fd101071a0f6167b9a2cc1 GIT binary patch literal 7611 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 literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/Адрес/Адрес.mdo b/SSL/src/CommonPictures/Адрес/Адрес.mdo new file mode 100644 index 000000000..5540d6b29 --- /dev/null +++ b/SSL/src/CommonPictures/Адрес/Адрес.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="0302674f-944a-4a45-94c8-a44f93fc5a9a"> + <name>Адрес</name> + <synonym> + <key>ru</key> + <value>Адрес</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/ВебСтраница/Picture.zip b/SSL/src/CommonPictures/ВебСтраница/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..c23cec713e48893e7b3f8eab5ebddc76a1d00d7a GIT binary patch literal 9674 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 literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ВебСтраница/ВебСтраница.mdo b/SSL/src/CommonPictures/ВебСтраница/ВебСтраница.mdo new file mode 100644 index 000000000..f8a541dfe --- /dev/null +++ b/SSL/src/CommonPictures/ВебСтраница/ВебСтраница.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="367c49cc-0317-4b0d-846c-79e203f800b8"> + <name>ВебСтраница</name> + <synonym> + <key>ru</key> + <value>Веб-страница</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/ВидимостьПароляЗакрыто/Picture.png b/SSL/src/CommonPictures/ВидимостьПароляЗакрыто/Picture.png deleted file mode 100644 index 0fd72b59badfe7a782e0198efe0e3d925f7ec4c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 591 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKVD!!mi71Ki^|4CM&(%vz$xlkv ztH><?$}=$7*jE%JCTFLXC?ut(XXe=|z2CiGNg*@ERw>-n*TA>HIW;5GqpB!1xXLdi zxhgx^GDXSWj?1RP3TQxXYDuC(MQ%=Bu~mhw64+cTAR8pCucQE0Qj%?}<Os4*A;LF6 z!8yMuRl!uxOgGuk#7M#1QqR!Lz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-?6?$c zic-?7f?V97mH~OTN*N_31y=g{<>lpi<;HsXMd|v6mX?<K21fcuM!G;1y2X`wC5aWf zdBw^gBOqqDq!uR^WfqiV=I1GZ%uGzmFD<cEQql)mq7StN=skV7|9~8L2&Lu$gQW=Q z|9LVA?}1^r-_yl0#G?1@`Hfyqg(Am4p5JS(x7E|Rqnh{96>APBg&UWqBwT#*<bn1M z>z{0jFPL}i(9m0FC1Pf35_6DULu>l~g6RhqtgSo!v(Vyxab0`;->$xi4<E6gku=kA zd$FiT|H}6m1D7t<DNdhdSKB_Qv|v*=jJxQ}uAEcYepqJ8Bef&*7PZ=K;^5ShSlm{< z=b?;$;z7-82l+oVXsLO2eC}a3DeP9(2{_>15O=|i+1Tch@&D*KpTif%J^S<3d~<!A Y^=nz>FoVNagh1)Q)78&qol`;+08DVs?f?J) diff --git a/SSL/src/CommonPictures/ВидимостьПароляЗакрыто/ВидимостьПароляЗакрыто.mdo b/SSL/src/CommonPictures/ВидимостьПароляЗакрыто/ВидимостьПароляЗакрыто.mdo deleted file mode 100644 index 4303f8236..000000000 --- a/SSL/src/CommonPictures/ВидимостьПароляЗакрыто/ВидимостьПароляЗакрыто.mdo +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="eb3cee83-57be-4a2a-a180-366c2f6454bc"> - <name>ВидимостьПароляЗакрыто</name> - <synonym> - <key>ru</key> - <value>Видимость пароля закрыто</value> - </synonym> -</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/ВидимостьПароляОткрыто/Picture.png b/SSL/src/CommonPictures/ВидимостьПароляОткрыто/Picture.png deleted file mode 100644 index d583a4d0ec352f17ae9c6276a72948fbb2a46e9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 744 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKVD!!mi71Ki^|4CM&(%vz$xlkv ztH><?$}=$7*jE%JCTFLXC?ut(XXe=|z2CiGNg*@ERw>-n*TA>HIW;5GqpB!1xXLdi zxhgx^GDXSWj?1RP3TQxXYDuC(MQ%=Bu~mhw64+cTAR8pCucQE0Qj%?}<Os4*A;LF6 z!8yMuRl!uxOgGuk#7M#1QqR!Lz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-?6?$c zic-?7f?V97mH~OTN*N_31y=g{<>lpi<;HsXMd|v6mX?<K21fcuM!G;1y2X`wC5aWf zdBw^gBOqqDq!uR^WfqiV=I1GZ%uGzmFD<cEQql)mq7StN=skV7|9~8L2&Lu$gQW=Q z|9LVA?}5P@;pyTSV$pl`(%$}_KoPbN_xI%QF?#)$&rAE_2^Hxh8(NdhZvW&E4E(_# z;AJ8-H*MEVugoLUxL7Ckx|IE8=IZoQ^4iEHqVY^?PI%jzdFqxs)t}FMZYlr$)A}UK z^WHlq{aZO#Xtia%`MPEGBHk7q&K5n1_hJvv>kC=__Ne-tx!(JlU3m&*=Wmo}-_Th5 z<6dbYzj`4bYx(SDm4TsG&CgWry=QH6W_PzmW9ge&^6Ap@1v*M<rLp2uE@p%*yPTPM z`<rOrgW6|*59!W1o~`5B(sAQlR;rEM^dK)u9=6RL6O{L!Da=1TEo}$GT!-t9mrYVF zWTvfJwQm{2oRdt`cOPJzm#E09mV0}e-;#B&FTMXRzvKYZJeB9>YaSa;Q(n~Bv9;sJ zjBR3qzIwj|-<2=9C$D7wNp;>M%X?`xf~zg&x~kO+KX`uJa-UI@<YVt+x6ZCTJA3CI fbL)bC>3<lMc7{A{+qv{PD1myq`njxgN@xNA$$lGH diff --git a/SSL/src/CommonPictures/ВидимостьПароляОткрыто/ВидимостьПароляОткрыто.mdo b/SSL/src/CommonPictures/ВидимостьПароляОткрыто/ВидимостьПароляОткрыто.mdo deleted file mode 100644 index 2f54e691f..000000000 --- a/SSL/src/CommonPictures/ВидимостьПароляОткрыто/ВидимостьПароляОткрыто.mdo +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c78c1d9c-5c34-4636-bf2c-6cc410e95003"> - <name>ВидимостьПароляОткрыто</name> - <synonym> - <key>ru</key> - <value>Видимость пароля открыто</value> - </synonym> -</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/ВыпадающийСписок/Picture.zip b/SSL/src/CommonPictures/ВыпадающийСписок/Picture.zip index 5d4550bb5313601a7f85f133428673992386c744..79d39781eeddb3665b591ba9518b750b4f9fd91c 100644 GIT binary patch delta 1020 zcmaE6`bDNbz?+#xgn@&DgF)MBbqE6z-~qC86Z10DQj1IUDsppLFB<YU83?pJj1>Ow zT)aCVK*?FVyRa<aJC}Hl6aS^AgZ1mVrO)Qx|McYS(-70$el-`^Z%=O1nW!+~)xM2a zvMTPZ|1GrYbKdH_ZF1`U|93`yyIhf-Q7@7rlcmv}vOvsbg{@NTgeKYjQgN}y5gw2A zCKrir(u?Pp5)*svczkED%87$EMGt2ews*{yEbrNoS*R7e?<aGBH#^7oXI5oXfR6po z$iRTxJ8VD|7N&XydFiitJ`_KHI_XhTLc)WI0dM87_?;c7*wDZLq<XU@lQbhvHAY|) zHwUt);Z|b`F{gyh3bz__h&ih{vT&*~g1SeDI}xWEW2l+}-o-f8m_XGC2;5|>XJis# zKtw-sNP?mt6(A>u0B=;C?&X|;kATWw05K?}5#St<2?=*}J!)%r)X!o8MjAT^BXj^+ zPk<uO@JH8m-)&VaKTui_Lz65sP!l9V&^76bSEVZhHK?Fzs%KzGWC7}eL=n2K+62D~ z!9X1WXu22}cCrFBLE;QuQ;UH8UN4{qcMMIAKtDnw5vHjEmhm!9hJWk<>gdMMb%29` s0UE6^T`*0~(}S3f12vq+(A3DqzyOWs0B=@sgm5x&GCTw-tOZ9b03!j;hyVZp literal 6886 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 G$o~Kcn4OCN diff --git a/SSL/src/CommonPictures/Другое/Picture.zip b/SSL/src/CommonPictures/Другое/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..b79291b9a5a9e90e942b7d40139eb9513571e76a GIT binary patch literal 7209 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 literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/Другое/Другое.mdo b/SSL/src/CommonPictures/Другое/Другое.mdo new file mode 100644 index 000000000..203cbf193 --- /dev/null +++ b/SSL/src/CommonPictures/Другое/Другое.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="a5df6ca4-8791-4025-a0e6-07d66e0454b7"> + <name>Другое</name> + <synonym> + <key>ru</key> + <value>Другое</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/ИспользованиеМакета/Picture.zip b/SSL/src/CommonPictures/ИспользованиеМакета/Picture.zip index f943edf9de155051b86c3cb85c46b98e310250b4..1ce35c044dd24d862d9df431d273108af3fbe073 100644 GIT binary patch literal 31776 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 O13-a*Lf!v*^?v{>F)y9~ literal 24454 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 VM*C;=1z_L5Lr?&KJ;Q(0{{aNEo<slu diff --git a/SSL/src/CommonPictures/ИсторияИзменений/Picture.svg b/SSL/src/CommonPictures/ИсторияИзменений/Picture.svg new file mode 100644 index 000000000..1bb6ba109 --- /dev/null +++ b/SSL/src/CommonPictures/ИсторияИзменений/Picture.svg @@ -0,0 +1,5 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M8.5 5C8.77614 5 9 5.22386 9 5.5V8H12.5C12.7761 8 13 8.22386 13 8.5C13 8.77614 12.7761 9 12.5 9H8.5C8.22386 9 8 8.77614 8 8.5V5.5C8 5.22386 8.22386 5 8.5 5Z" fill="#333333"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M2.86982 8.05693C3.09133 5.14503 5.52423 2.85125 8.49286 2.85125C11.6075 2.85125 14.1323 5.37614 14.1323 8.49074C14.1323 11.6053 11.6075 14.1302 8.49286 14.1302C6.83884 14.1302 5.35113 13.4182 4.31956 12.2838C4.20172 12.3396 4.09415 12.4058 3.99993 12.5C3.83771 12.6622 3.74822 12.7833 3.69458 12.8861C4.88417 14.184 6.59348 14.9978 8.49286 14.9978C12.0866 14.9978 15 12.0845 15 8.49074C15 4.89697 12.0866 1.98364 8.49286 1.98364C5.04487 1.98364 2.22323 4.66542 2 8.05693H2.86982Z" fill="#333333"/> +<path d="M2.5 11L5 8H0L2.5 11Z" fill="#333333"/> +</svg> diff --git a/SSL/src/CommonPictures/ИсторияИзменений/Picture.zip b/SSL/src/CommonPictures/ИсторияИзменений/Picture.zip deleted file mode 100644 index bf6f3c5e96e44cfdbc35a57c66a51bd5afdf1cd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10825 zcmZ{K1z1#F)b$KQ3?0(aDlOeD-Cd$|H=<Gk&M4iDq@+l9*U%u{4WqO)NY_95`hCCt z@B1^)x%b(3&Rx%ahIQ83_w22%1VSbR0Ki~C>C<)jt-4zWAQAv@4Fmwt0000d2M3#r zlQr-f2)YecSCzxYAjd#l##WG*)<m4~ehx4y;z)gbX9@rSI~1g!XbXgQ#XPaUr-9e= zcE6erO$t4}$Tme%A`|?~PBB_CG*Ch#M&b=Y7gZHe@iHuyQBqPIit&z4ySMK>0n0lY zQ8KSEFmdRUEEZ-R+9{u>?jkdW3G`>TxVTnScgq7!{AJ6UbnUa-?%DNXCQt2O8zJA9 zVEW#|UI?Rv0koYSgGL(B1d8GctTY2JhX>P1MYvMKfKAT6ly84zS@EXsE78TEB}1Rc zv7Fi5u!>tg<0lSH8pUVP^||yDZ+#XPp<kX7+NJFKrN*nu2xPVh&>QQMzPldK|3dnn zGe9v{GJBLJXv4Z&bIXDb=lLGMCYN~q)9#2v7<%96!a|kk=Xe9~p4WRc!swk5iED`o zQWRuz@}M5+RSz)0Z*gU=nHj*MlqV&XuZ={L*ssAzXj6OlPSc1m3Y8C{z3$T9Dv&by zq|3E_VYDxya+mqD98d+0<<ctP`D)R=mi^TL-soKSy0x(dF9tv#jUMOJ)-tRQX=QPs zbjkZw%e754#N{|^`P_c(#ctk)Cxdb8)erCfSvU9R9T8WpyJ+m&)OIOD{Kl(<aMVvu zg;*{+Ol-g&x0PBt5oD)I>-aO{JHVPj+YctaB2mPD6`&xaDqSLJ@=pDKS>ldhNt<mz zQ4@kCwTSVHC0x9}SW=55fAb$KLC_08_=_ds!Ianl0Fv)NELn?HlaDo}=n>y<6s+E| zdTH9hW=l)TET5EVAv|Hz%rOuOz7f@awK>8RBt*E{CY6>$!0Z+z^y;%x4$-S#5&c&# zBb`_>wO>EHwX@sxNk7}oh@BSPCja5T{PjX~c>nmSV;}m~FvK?bl~HTrehG3NxC-<} zcX%9zmVrxJCg$sPj08AUA+UvYv?DcU=et=qlz7QyR`xy-sa6*vBy%Q9N!|h&0U021 zyd2aAtRoxFMM=9t3#-hogmnbL$fGuK63<eEN3^%o<#WQ)dv30Xi4)PFx-?1Hx-U(z zF&40^`K|@XX7;NKF(kpVa&qW_9bj5KN%gJQg|$QeO-|P3Xy9kSdf46<N6S9*!D=VN z>AvJRf^nYmOAH5$M4>qm7(U!aECUzpXYif5BHm(<0}J4KBc_&bu*UKcRdplfD^Nxw z%x+n?v1EJu3$Y|1Y8&ly=}~?6N`3-whNUGlh1+}<ZSH)OtD(A3nyjM2LjoXd<q&@2 z1!R0l+yK$E_pgO&0me8erm0RU8!J+Wq)r$MBhAW5lavFNmW%+`zT#~rE{|r%hOrJ7 zF`6(akjedd7@6Gg78)^4ZPmtkcvPP0y{@?_*Jnmi)`u#=UYL;1j4eHnb(x7P*jc!J zXh<$iANvS~$r3e*We9O@Y!vvk?Im9Hx+&ktmt5_;WC84^Xt;q7BvE%YJ7Q1UX-VrB z-AJ$dhM!CD>|#DFF#aQNBdWLS%5}hi=y2fvKwhHMeycLW`gp%QQ?zExD2nmDm)-Ac z9~`#X44|i$*VsFHzQ0_Owt^VH9~I!!d0LTgC!08CoBSCj2gks>nAg7r-JsIF<G5EN z-T&yn2@XLJ9IbDw{~ibcz(I^(1n2!n25~@#*Z)CqQUns|FM`9}Mb8lgpZrO1`QY8S z-vpn(avE}+N(f+lTt+ip?2u5~9*;jMQ^Cq1zZr=Z-ZVwGnMJZioYpjv8AP+At`L*P zDj%9rl<~e_Cpo`EW${XEc)U%eRxi(UA5(lOarszed4Hc;{5+D^L`xAk;&G$eB3up2 z|KV;w$B*;_hzlW^LOXLdGPs`B!^cIcg@SMlQx@?V!xQ7r2^5(wUYgBaJ-RIH<LE+x zKN>;8DwU2=GZ7zId9_)?9e6qzc!rG0J81O5=LuM08GdlxyiqE})Zq=HK)WoKJ{5@; zKP9Oj97^zV_E56~GWy|3)8W%agC)Td8qai|j?8NApODn6z+YVM79jCu%;(!*PFBiY zi$!9N^N^@8`D-%wY#i6s&AsZ}pWvn3RDHQh1P1Yje~nt)ctPveTb_Hgdg)_Cl837+ z3`ypZGlItA7%J^xqherp!0a>?bK?5115DKo>$|o_s*zo|Qby)h=Nv7&UOdX}i5oK* zlKJqdKI`qXr!THwzAECAgK^zK2k$SA2bdPg(~M_b3@P!|oeblZS-JS<?%{^14DB@B z9Z?!3#x{&Zq(*d^ajvhg+t}NKGP1JXO-)VZ4*2!jy2!$rTtG8`1Ir)$ZYkmG9XcNp z<lnc^^jX9l9l0Xb$Xivum2vcY=T1cD$f+Qz7^?Dyf?ed0(1gi`%uLg#Pr2Ovw55AK zHAy(1dRm200Vx4EgSU)T%{(n*IYm~^tr0`yl3vipDJ-ra0Gm{=y<||R#B_zrF->~v z#_R|`I+i|nFEO6P8=>82Fje?<@@gg1UNiZvIYvHk5b{OL__bjz^}NqTk40AY#D?3f zV?Bs2{#!?{biv(<%@;z==<1!@*M{RK7N4m{cpDvS7WRX$L{Ly59~1}fm-ltb((2H1 z^tMM8*&A9PPzf;S2;rxFK$l~%;sY|7P;8o-9(k3=t%*<hw+_j8lBRv{7yj>c(}P$y zju8%2M~F4E`#<Z3{~u%61rhw$x}iWIQT$pruGq_Q005}!_qs_iw4u-;?0L)Gm^46N znKEc6MjkWcXg?QDY;N92lTRLBU93Oagj}5aPV>pJde9FUjPFtsm-KXx<ey!e_%IR? zQHRKn>KDe$ymP2Vj;$%8R;jditL)oz+oPmDeZMC#8{XA(`&DG1-g+qV<zCtwRHv=C z31&};0Ud!6+M!y|G#K6pZWZV;Ob1SP@aO<|kTTv+-Fl%ZlVvc6(g_)cZWtEKZQD<r z)IiuxJ-)v-0eCcn#c-;0l-5f$CQadxEE7j;6s<_d#{TK?#dWv*f>Odbqc2BN4zlUj zmwC!`@w1rHkUZ%AEz5zZiE->#g-9H^rnZRr{wRG`SrIA*3LJA%)c4Q$3UGfcZe2Ni z^WN*+%GWI%`4$M>Pb+X4V}Z30xAODW+%fG_?gDe-EK@#wF!A<Iy|}ojPy@Q*E@<5y zjnH6h!WaaqrqO4BVUzWSv+swcy{QJn@v_<#(FXTOBuAFVbH(bL+10+9G*^?u8BMT6 zXEu)RH<*tRs4H&OwXiG{^54hCgjK=<>?DY0R^0M0ppDa$f{zMyOic|d9#9-1mC(JC zfm>x*n(J-Hyz{qBj-bzF1?h#%QaI=VF+EmgAvbZSNJWmAq>|u3ClU+i{8%hQsp*CO z*{1q@B%4OlYk*PYI-kl*858<gpoy1PvIQ49q-Q0wv9Xb^B-5zh@_5~mNCHl2B6s){ zr6e`^x_WzJRc3+Bzd6z=bJAJ+VMxykKstN0f}IqLi;GJWpCLyZQbc)ffL~X#s+^Mu z^q^}BhGd$T@)2TW+LEWGrP(B-O3>ha4vHN!dm%UtR-T6{VCapKWn@;l>|gRaY;U<N zWXnH1Vy9Ne7rvTa2HQ>ot#>6L$FNXXAfRDAeQCDUSE|~lD3_arjUAu@Q(&Nh$-#6@ zBAG0tyM);MW_-EJ#0f&5*SQWVnZENbC%}X2z<soO$!I%Y!XgRRmkO%m8dZO!=wloJ z(I6qB<!{gFIZ!y<zU@4s?Oc%zs*iUfY#hu>5ICJ2-csIc!1b6nqAW7|7P+@)oWkEV zdhzNslXoyYg7Z_9^5FA9pR4};gs21@3Xl<_j{8byDIYFS;CgG7)rBl0|A`XvvlO1U z=04`l&vX)w+rt=0v=Z0HsI=s9%K#Lty4Hegh3Kr`8Ar;?;;2RVg*PgisWT3okJ&g- zpBE;4UKq0@7kecQ+ym|9aX2M2QG}q-;G}|7<(6me@*YTQ*l{^+eLBH?%WxuQ=P~u< zzh%J;Aqx{?me-pINm%(U3tYe7Dpo)g|0N4F2qc<cvhdQ&>jy#>3VzChzW;85p#$MR zvM}#vEso)U>A&anz$w2%2g4CYk6oVMbp*kcU0jnQpuPs<p1ddZ=AsX%6H`y;;XLfx zrwbM%&31NFW+eyXX-!nglqoUF<j+^6l`JliQClVMuyXHC9HBDQ_cfm_Tzp(!s6QKk zzHzHf$=SXvesVO3n_xhVatcg?S!EFSg7hHb&?j(Ymp)Z^=RA8-w^Lw-1`Ub`sP2n* zJPhQ2D&SHDI7H=Wi7UGYVSuPXA*@Pf+n+wqQMDS|h80=9hV{I|Qyv^}_56k^)nPt+ zoNZhBY3mJC6ov^SVF7xOZGu)4x`VvR@(iEW(tnO)bLn%M3M_a^UGS;dGyAQpU4UAP zcy9WAl`H5lL<nAI2=I)Cqr>ZvA2!T&ezmC8Z2S`W$+p&jE}AA<{=>SR-i7Dm*<!?( ze#k;DMH$saltD<;NMl-Q#dCX<FB0+E6DGdYzL8tVwViA4gI4ann_^-e@>|4d0-e`( zw%ZM#q8Unpiwu|`I@_}?v(1l)b%EjsB|0=L5L6l_rI?xN$%2_+VIZDl*<CrGOu|Fx zi}&QIfQP{PN4g&|nd3u4gn?iW78_fv4UF;_Re%t%hA+S;6kQkvamQobeU?c!-a@Gv zEW8qQ11dI_XLg1@DkC|LNM-V^ynq(PVM@?}o@dD7+&lnc4aI)+QrsU&(E`4(DXS0z z@Yrk-l3c$wuR!Fh<8`H_!&skfYla)3p`>S3SpuFbpT4+T%K~gLrbk8>;2!+&Q_4Pz zjgZCGB0vB{4|?_`EfbQMC;ZKZuT3jI?g8X*JITy_1_J>1$-wp~**vJT5UsC#dQ_KV z+1wm|<GMA+3J0O?ATmQBE~prCE3f7AmQlUhJ-5wyXz<wna$ixR<6LDPX%)f%<%abL zuSD1S;ZaIhJOV7IQ|Y`m)PwlKUF%y#@WVlkkOy*VIF|l+XnuIdN{`4JPgk6`{G$uC zFrrW*^nnJJ?Z*&+ywAxou4K@A$)Ic3_aCWJ@ZNXWlC30Oi||cGXD1&Vq&r3;QLi1* z8LTmt_6{T@-6XbQ>P>{kjw{lhZ<F!@55(=;&6iUtvAkGtEMH!fn!lbrR=KZxHKoIH z-Ygr?KeU#Vs(W$sU3|9OetfB&e;A1!=_C86-6}>)E2ozGF5$`+-Vg4PHCp<HjW0zW z4(`iq7*y$TeD5%ON`*E>>^%*|Bt5%Uf=60zE>$)z+=6)e*-xX}h4%kj48jm%uvbXq zw2cA)tRu$H+?xBh7_6g^UH(UI&4HN0@k<Q!kS+oN0F>gNVqgQ^P5LbcmAg)fY>S#1 zRelLIRa<$)Hkta-s0Pe5lc)#TL|L>1W_UcDZD`cqoR{xLGn#_BZOjP6*on{?c~QkH z<T1?fa|jJa-i`6;8q7F|pBhnHeNwLFzS1%9nR)9PThG0besO2LzVvdBEQmIM)a;x+ zQ=X|O&B0@B(Z+iXU=Klq(9vMZkCk8p^q|WSYDg($NIsR?`{e2P@!=>3FAa_d#SFSO zQi%T|YjHd<1&Hne@qt-G#0`*YY|xMjp~g@($W=MLGpfw}<KT7k*HsU*JVB}^>}87{ zTtil|xt?Tk>sE~Q$C^p8-{?oT0I==*S&gM1`=`BZnin2DV}JdXM3Uq=m;!VPVh6PJ z5k_H9pe95VD3o1I>m_tgvOU&aV9VR0sqGJ*Uwg=Ij$@w?&j>Q2HvT9wY^qkc%r8KZ zm*j{>4BCdK_u)lhc;gaoGB7I<ms#%myyz>j1%PSWT~}R&X4I>Lz8}4-i;PT%y)2Px zt<rAn!DuJMFM&wIqg0JF2rqs#DCT}@!UI&s7v<*%gV1mQ>c+-uQc@iP_uaE%DevoP zM#T@w$%$wx=G&YJAZvq`)H~bLI^RGog)R(JbeSeCQRJB(r{K5k<iu$w5|!DHGs|cY z`oOt%(`oS|Ad@h@=F0jSNv8f`X)t~jnT$M>)Li14b;Vj6#)@K1IEQYYI+6oy-YYMQ zG39&3b(BRGK8>Hr<Tr2Tkc#lLw`jam(vRWj6Q4uIP0#qJ;sRwJ8UQ81<n~`)2<>>8 zut;OaX<&M&ihnlLB;9ZoqBn%}Z)LbCWFF@4hv`b-*j05}X-QAEFO(@LOGEJ975LZB zIE1v&>mgxg;g=CV7G)e#)O(J8%5)E|Sf-U4U!rD%!mALb4|BcAu<=bMKnFIH;cv}k zUD$?@B}yP;T0FXJYnt7A;V0R)gDw3oY__l4sXX401DJH#R+J-secQ`rlntPj?p(2^ zSK)T6EZX_@-ofa{AQ;_kKCTsteD$I9O+&n)h&qaZa!DFW+=PYRQdfyl?PHqxVO6Cz zDrZXbx%qjy$dr^6TPG(fYb`A;DMQ1wt#cQYo@{!xt70rKr=|6q2Mj%_EQ1OR?t244 zAMI$~HItP(_s%q1u05dgz~%MyqEAivl&5Sxe)KJBx$0?vot61oUZXQ?=4SCrpjfaw zAeWSn*~&%eo9*+bim58-7e8v97Ri4!;IN1rHs5sb2^JnUKxj=KxRAeI;lc^YI@mli z(|nG8@Ag&uldEc@zBHfHNL{yX%PLF{taH>@ESI(Br>lc1Nd!l=Xo0q^x3z2%SqY}f z_@u#+phi%*Rb6VHE@9vjXrb7xVwYS}F)amc6TF(!!5Y=<FGNCKeJjIcS&a8h7*53^ z=Z?A5W-3C`aJ_JWaf(t|8`3$it`&>|>rPo}6Qk`^g+HS!yps;g&J!jjKipnr&meAL zHH{ze)L=NVsv?4)42$;o<GrCj9=EOk!LV_+$$R9Hj;GUTQa@r@94-ky<oeFG6>XxL z-PX13Lvghh@?z}*Pz@&{#3ylgpJrD;#z9&alpquspOreEE!6y?aU_nfu3OH$C;J@n zIy&(!UehT`b1#}%GC`$i&T*L|&_GCF%8Lke!3Q^O|BU`5ZgPviMSvHn>4(|kw`|Ah zE3utM-VgPRZ}?Q@Jodb$9;DWfDJk_}-;D%ubf;>;q?9#nUr;PvA8p`NX`e}78FR7l z2JcKfeB>xg*B6W~u*=N9T=p?#>50?z%9`RZq-l<uruy}gysu(NBh&+19*C#OoVIxL z%Iz$W^j-T*ZXNcF4C%cota}&YfCIvVhjvw1X}%HuXs?slXcdn*4*B6|Vv`0qWjH4! zTC^P0F7|FWpP3F(CXAKkf(}TuusA#MI_~b>Au$Jdre9^@Kl^V#&_MWsh22PRJ;Dg8 z5aXvG@cj0JDm10@|L_9|#1x5Neo$chVhM4}o1cE*k-D2~??5<B)bqBo(WumYTCIW) zS9pdNv*w;TnmLvqIF&C_*3KnmtbsRp&R1SbTH_v5@x<q7<{0AS0CkOO6&+rUoSdA& z>_>L7S>Qs&aip$J9y&bOhmmt2sxY6g`1)zbB5&o&Vp`JTtQpf)qHN>Yg5XB_o1yw) z!6;dB+ni{`!P_7cOlzjgCwg0CxJ!tH4YSLjU<4sS*tNy6ejri86yP)?NY9mPz9!a+ z6V@)pJAhtr;CcYg$<;9#Un~tGV?Zoni?qoA185?I1k#_cJ{FCXgo$`hjD#4%6u-HP z5y#=}v%y8m(DZF$Be=`P0c>y$IN<?UuVWs^16m9V%;e+RA#j++10%76YNZRc3H=|1 zA}wgwMBOJw)#qSOyr!T|BCEJK>|?q_3*2fEfz6f}MYz8jU7A&jyXeEcCKN16hT_KP zEZ~3~q$5Ttd}N+PL<;NaxZ3MPdDfSM+SgvK9M>_i4dj(%5kmSw9Zgrawx`s$kd`)6 zQ6+2_a2@rz7S|UBgfT*mkyIa#?w^$9XC?#?t<|LlhgW#ki|rZeb%@$0jJy7L_}0PJ z(#C={iwsU=f_aeAIiWTLSeA7YLn?G`fR-*-CODL$(HM|EdpDkWFdI)ap_g!YZG6|) zwqpID0BSAO+Nvn+n}u3OBFJJ-`1%00F?EnM=L)M^QBhIBUu%AI*6p+WF}`o=iu^O9 zAq>;`Hq=&UQg<IH1ofdm`S^qm^)tXo`rhdt7Rj@Hdw7D0LOT_Izx!2)<*N0Yi>|`Q z%F3$#eM3>Ig^+u?bJao;+>qr5Js%xrznUnmcoihFO6us0M^fo}6ehBoA+DrGfKP5{ z7g--i>tY`mW*8{Vc<YJswwd|iB~XbL9Ze&L&U))L8!7W1xD;TO;dwk)($~@W5|Er> zxwgxJuoP_GC*N86e`NUv`BP>Sfvy26n^%=wwk_F1nwxXH$W>~`l&`s2RP}k`oQ>En zlm{x0GY@O*ys6wJ(<@n!{O~-uxow`;K4;&%Pn+h*4YQ(QdCu5-=(;^<iT-AA2&}FX zU(KJW5w$WI(vPv_PzbatYY_^P(jYiZPD3~)ER(UQ6z97P-@GM6(nO{%gAwEP+BCx& zXX6729i8uAO64@@R2Qp1e83tcg}d==Ty)7?tX_yHcn<7=@g$=*j?3y8jaf9GEJ=3x zC#9Kmnl)Al;7z{oYsX1a3I(NZZ;i+3(zyq5nsx)$<|GwNjkIy;F@-G>2-mk1`ola1 zNa3=Mv{BnBmH2ocd^R}jttL9cfFV^Vtv#aF*zmKulbkG@eOtucvvZPG0WXJepaWQW z>2Z|1qK}{J?%(R@sBDHzgXe1;L!Y(2IdhUC)5x-E59&d=CO=Qe{DIeUH_x9vruUd- zU8z<liO8JHDxi1sJSY8C7h;YBC;?<opn;X~FiL4<?n@k2ILAOQ6)Dwt>}9ye^Incw zziSM00o%>5$91+&pJm(9gIS3OdRu11`@iOed$h-zFpPnnL6x7z^j#P+j2G2q+!9XW zO*e+p5|;QM+^r~qyv71$MdpeRgkfhzjIZ5y!{Y+@WM6)@-QOE8oUxlgyWu*2xk~%Z z_d$2T7@ck+NgmHmv5AXC>QFzvlmq}R>^y51M1@okWo(>f=G*cy{6tAhXzQuW{47<o zm>iVtL5mG4DX;~6eg7g@7%3zR%h%ITCSp8ufNWo_@Lflq(8+4zz(KbVjynxI;inTv zblR4fjpLoxsTISkrs<_YcyFEVu*T|{qEzQR#vQh2$E7*;t{m)HLBT1_KDuU-i77_* zJuQm!VL{OgL3j+AZ#HH$CConat`wvO5IGEVpZCLiQ&PR*kJt3NDs42Fsdz{V7HcJh z+f7B-dtX;>)7>gTL+6BZHC$<+k89FqyRP@}xRRoo@?NYlsZ~iQDwG|7-x&6>$;(9> zT&@5fee+o4Z9!q=jU%O(;W8+lbKbKOH7J;}lv3z{-+2?B+4<e<1^433j<9!tEw9;Z zBN7j=QdRoUL@9Y8`@Y^3=q>G+3S0h&wC%Osv*B!6H(&DlSHqVgPI2_sN-+~!Z^c~Y z!R4~x(FEqw$S}2|?&!)L@zdy*W59ColqYxDW2GJID+9H_u(D@h&Pid8_KB+GS3P;3 zbmoRmjv7Hdg0q75rQ+dD{ql^$$PPw5AAMIgNe^6nTyB>mtBgImw%r8nzaVL|GQ;-E z6K45%`1*o}#O8#&>bZzt>*Lbi<1|*2-OzThXbMz46G0a!4O2N93TC@~Q4xAkFQ!;> ztQEKYX!&FC@=Et^3{ZeGmy3t*$=!$m399V*elD#SYCtfzD5cb=FN486f}(D~c!PI% zBR72<iysFR-77;hR_QmGlo!sDo-kvTQF>;0;aye8$VJW1Q^I=q`j9naSr&qo;~!(+ z)MU**F^~{=dWmns$)z(jH6&$+%bgh2SYaLI9**6+A4c?CB@x#;73&4B;Vm*3W)(_Z zl;q8r{DW|wp9eL;TeK;bXPnb2<dgsH?hOccFWSm1-$WFXR}kZ8omk+X4dE3a#edb4 zaS$_bewjP9{NqtXJ^9zp4`Xz5w5Sc?uX^(C68*Y9FEzQ8-#OG(asrP<;l)f4W6;bD zIzCZkPQ?*MIT%0Ggv1P{+tw~Yr&pLp{Dr9<UwW9Po%VBZpy1M83qR9PsJ*=9S8eW& z>+?Hn)LZw@nEd;>_PBL~7T27`6RJ--1wHRGoZ=i%z(+fI0oR0t=jrL<6>rblM!6rn zxqo6w6hK?OHd(S&Z(Z*!{#GTlSKD4c4;Fkq0+m|XIKHZIY+;U9)Mh3^^%9<UHWqEn zv$yXNh*}0)&2!y$y?hXe7RE_xUN%M0^MYHAfbFB$()OE6Sxkqglso&gHD<9Mi7LtA zJm8V(B*$q3N<*}2O{9bT)3j}FOy!7lY2c(?ylcHO9x`EQ*N?;GjC*}R_G(Q^JymS$ ztYr*;NmCzBbF35Dhu>C}3|?r!p?Q<1dk!w`q~o=-%fv>kzG1~FDlA#?<dv#HS(_h% z23T@0pMj>()s}sXF4eCNsp?t}1po^^N0&O?)3NEgU6fxFCOZXNN_g658UkUDVYetk z(c)K~Zm1qj7T*PFkd^@9gFAOxMZlb%G9TL^UFrYk0$+5Cd{d9m*a0#Cz=$9MCSsbp zt@*3hu9iPb$7$Mcl<&Dyh(9FG;xJ*$u0!id!Y0W)vn&0PGcl&=h$<h&^pw=a5w}ia zzoAhI<8#xe`>6aH4}`)9Hu&zn-lY0Ip;4pyVIX+C>uV>i07GBUX8}^pIm7q{OU~PJ z<GsDJOYfHbeO@a|HtdhwZxJ;6x^CI+U>otHHIr-WzVLc>4wI~MKark`j2TMTIAp2& zsm+K(UdWb1a)nNdXMidy1WrfKpf@lm&rqCd_~e2UBX1FSE>|(Ml~I&i1vc0;3z(G5 zW-!F-ov9jO)<KQ=$}#e2pn^HwNFzSUyqLM#&LN5oMcFMT1|a-cGh^JS8zV;xQ#49R z(f*DT3yMo)mQU<uqwOS1Yy<Zo*Je79W_g!I^Mp}7H-u&c8Ba<bOExD^UOGM}gocw> zfSX3)zB3D5W%wsD!!cFN_@J!!eqTdEFl10l;OAzflQulQWTXj<v;_W&x;d%AMP)QJ zZSt79=`Vt?dfwfNT7LZ^^B5WBd6_U57Ztjdf0Bd(?fbMikSr0{p|%59MPoHCqb7?f z7>`3f^a-)+UaNS)XmG%;qxR_%8pFHlnjRe^8BZo?U!P_rQ>lTez>jg?{J|tROF`$W z*8+rPT${0gA<m<~Aefv(S?YtbzC`y*U7cnmbGU+Ct^t!Jol36U1VLZW)+9Yq$-@a? zNfMECNc9+y?HD)FgD#Qhfaj5`H%?DH3NuZi-#x)hzn72zBIG(3qK>&bjITs*y{uSs zJ*{{hxerq*z444=Ji~ky;xV{s>=tsguWqJ3YrIG8iO~kf1kePno=KJL-gROnghB7L zSfLN{k#73sa@ifJcyR|6DLa&kGf8vlfhM{ov!91w+?pMpdpE!n?e1@D3I}3pnvKE6 z#ao4iTB<Es`Rdmj&h{of+>RqwqFXj+*VhY0XVh0n@wd@^F27u?!{eJz(0F}}&vXoJ zy{qT8lXj?b#CM#O<aZh<Id_bjMDF&$PxFIW1+U$%GS{hn-Iqn=1XnKE^NjDel-DJT z-RO>?`$C(F@}K*DtC!)tVB!_^zrsoFv-3H<&#~v=ymo%Gh1;~kUK-sWQ<%qCTG;JQ z=IkNWGNk8lwLL_*BQ|BE?#}Ke)z}}Jo_w?yy#3vYYKPKA6c@K>urOCBFSK6dMsR<@ zdhgCtYlG^w<6a6y=<U?J&y`oHla$|3AVc*n^pW1;7KSzSd^5-JXfE;`HPU+Nw%6y0 zOxnk;R)*Hew@n+Tt6kr)7h)3p`}wl+zFUU0%#A`LURJW5+j++>TR&#=X%l_L_|VEQ z>g$x>URp*}Hd_AkLA~Pl*5s-IlM`GOj+Vl1vXsFy0>btx3M0|%HTyc`r_}2849}wv zYS2kPyk$3IY$|4>ZDwLMtL-Nsd+pfZYvI#IF!rIvlP7kuoRJjg=|rtz?Zc*#dubu& zqy(2t5#cud?%!3mR9_R#aANTrl2cF!y>?${)=p6C#hLeUd?rgU)=~3=!7skVcU04+ z-1A$;zJXo#`mMfid4$j#Y@$!XbGYb<Ww-3pHB*b55s8$PGxsWm*F4TV6Q#CWs0Jso z_V?=t?54wpSJu)lo3`Fii%*_h`XeQ>?;q!X+)U{)6Q;m!Bvjw%v}e&u8$G0*lxlTy z9NoQf^ikiZr;$fpZ54NR-7!;)yIXct?dS20G0?x`|G)h-`k?}f{X5;9_y~ifMu;O8 zLKq!QoouZvU%q1VaC9ghUsUYiAVfQ`M_Hy_T`KNxC?Of_mgp32K3H+><g0<6^5i5H z4X^u0uCkC;N%fMvTY40@nkXKa8d-a0_GZW6$CpVOuM7`PC5~_Er}2>FZ-H0a{S?_x zxIgR9gYrC9K}$|-L!rVN-`{_;@^mv0=XykHgIvVTa6G9j>FAUg^0Mw52Ut||dO=sy zM7uWIAzeE6{;{3Vu5;bz`!_lt0>8?{cv#}5&bko$2a9vPw2aZOVCr0r7kAxgcVm}t zBH5O(h)kV#rHWO^=nn_62cx7&A{(K?vq5=o-*}P*uwiIuLp$`=qx5QB&d(w1-~HqB zxCzz9WB2>+-u4-bH@E6oStXIXYu?hza^59vtEnpik=Q{0zm~O!Kket&UlsJ{>30Jg z27u<*MIZptt8rK&XEZ$u1Ynk&ox6?!|0n(v_}^Vle*)7Z`kpxd>3RAKc(5G(FW}$t zpTPg_F8LD}4Y4QA`A@IOU%+4tg1>-&$A1F<yZrtqus9e2{7*6dFW})#)4za!$A1F< zyMXs6ur7kHzsq@l0aN5382<Si|Bn9z{&z9pPhfLIZ{hFKz+b=*^=bZk;@|O~!2jM= z`V;si@&E2I{RQmVv-H;!|Bn9z{&zzAC$I+9|D?Bn;llg1|9arx@t?T=PLBS>HAGPN zk5uU|a8^8J|As%P{5$>={NDoeC%D_AzvbpnbV%~~nu^;P@c%ulE1~>M<pCIo&pSj( Kx19cG^nU<f=@BLX diff --git a/SSL/src/CommonPictures/КонтактнаяИнформацияПерейтиПоСсылке/Picture.svg b/SSL/src/CommonPictures/КонтактнаяИнформацияПерейтиПоСсылке/Picture.svg new file mode 100644 index 000000000..ebb13cb40 --- /dev/null +++ b/SSL/src/CommonPictures/КонтактнаяИнформацияПерейтиПоСсылке/Picture.svg @@ -0,0 +1,5 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M5.5 8.5H15.5" stroke="#333333" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/> +<path d="M11.5 4.5L15.5 8.5L11.5 12.5" stroke="#333333" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/> +<path d="M8.5 15.5H1.5C0.948 15.5 0.5 15.052 0.5 14.5V2.5C0.5 1.948 0.948 1.5 1.5 1.5H8.5" stroke="#333333" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/> +</svg> diff --git a/SSL/src/CommonPictures/КонтактнаяИнформацияПерейтиПоСсылке/Picture.zip b/SSL/src/CommonPictures/КонтактнаяИнформацияПерейтиПоСсылке/Picture.zip deleted file mode 100644 index 3b4cf1d8e36dd12379729d66337291b10f551bf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17177 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 UKWa+=^yhEDXEoq2@Q3&R0B2k;g#Z8m diff --git a/SSL/src/CommonPictures/МенюДополнительныеФункции/Picture.svg b/SSL/src/CommonPictures/МенюДополнительныеФункции/Picture.svg new file mode 100644 index 000000000..6f8f1d1d5 --- /dev/null +++ b/SSL/src/CommonPictures/МенюДополнительныеФункции/Picture.svg @@ -0,0 +1,5 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M0 7.5C0 7.22386 0.22386 7 0.5 7H15.5C15.7761 7 16 7.22386 16 7.5C16 7.77614 15.7761 8 15.5 8H0.5C0.22386 8 0 7.77614 0 7.5Z" fill="#333333"/> +<path d="M0 3.5C0 3.22386 0.22386 3 0.5 3H15.5C15.7761 3 16 3.22386 16 3.5C16 3.77614 15.7761 4 15.5 4H0.5C0.22386 4 0 3.77614 0 3.5Z" fill="#333333"/> +<path d="M7.99994 13L10.598 10.75H5.40186L7.99994 13Z" fill="#333333"/> +</svg> diff --git a/SSL/src/CommonPictures/МенюДополнительныеФункции/Picture.zip b/SSL/src/CommonPictures/МенюДополнительныеФункции/Picture.zip deleted file mode 100644 index d519f3f27c5238de2854eef19dd641f3e5f51948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5708 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 diff --git a/SSL/src/CommonPictures/МестоДляQRКода/Picture.png b/SSL/src/CommonPictures/МестоДляQRКода/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..494f6f921596e364e3b67e3ae02abf34615335ca GIT binary patch literal 1697 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 literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/МестоДляQRКода/МестоДляQRКода.mdo b/SSL/src/CommonPictures/МестоДляQRКода/МестоДляQRКода.mdo new file mode 100644 index 000000000..30d6fc97c --- /dev/null +++ b/SSL/src/CommonPictures/МестоДляQRКода/МестоДляQRКода.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="8cb20eb9-306b-4c2a-9a77-6a4632f72b54"> + <name>МестоДляQRКода</name> + <synonym> + <key>ru</key> + <value>Место QR-кода</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/МестоДляШтрихкода/Picture.gif b/SSL/src/CommonPictures/МестоДляШтрихкода/Picture.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e587f963b36e83d9e9daa53c1adaeda7923f478 GIT binary patch literal 3419 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 XA&xJJ%WjFw{T`R696v5E4_5sjtF)S5 literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/МестоДляШтрихкода/МестоДляШтрихкода.mdo b/SSL/src/CommonPictures/МестоДляШтрихкода/МестоДляШтрихкода.mdo new file mode 100644 index 000000000..6f071ab2c --- /dev/null +++ b/SSL/src/CommonPictures/МестоДляШтрихкода/МестоДляШтрихкода.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="f3f753ac-b2cb-44ea-a917-811b0ef711f8"> + <name>МестоДляШтрихкода</name> + <synonym> + <key>ru</key> + <value>Место для штрих кода</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/ОтправитьSMS/Picture.svg b/SSL/src/CommonPictures/ОтправитьSMS/Picture.svg new file mode 100644 index 000000000..082f0411a --- /dev/null +++ b/SSL/src/CommonPictures/ОтправитьSMS/Picture.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><g class="nc-icon-wrapper" stroke-width="1" fill="none" stroke="#333333" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"><path d="M14.5,1.5h-13 c-0.552,0-1,0.448-1,1v8c0,0.552,0.448,1,1,1h3v4l4.667-4H14.5c0.552,0,1-0.448,1-1v-8C15.5,1.948,15.052,1.5,14.5,1.5z"></path> </g></svg> \ No newline at end of file diff --git a/SSL/src/CommonPictures/ОтправитьSMS/Picture.zip b/SSL/src/CommonPictures/ОтправитьSMS/Picture.zip deleted file mode 100644 index 2397c80c5334539cb19cbf1a1d82fe52a24ae82c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13530 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 b(EoocCkgh)eH#G!{ptUH86rUcNA>>!$Pd6u diff --git a/SSL/src/CommonPictures/ОтправитьЭлектронноеПисьмо/Picture.svg b/SSL/src/CommonPictures/ОтправитьЭлектронноеПисьмо/Picture.svg new file mode 100644 index 000000000..3cc624e49 --- /dev/null +++ b/SSL/src/CommonPictures/ОтправитьЭлектронноеПисьмо/Picture.svg @@ -0,0 +1,4 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M0.5 5L8 9L15.5 5" stroke="#333333" stroke-linecap="round" stroke-linejoin="round"/> +<path d="M14 14.5H2C1.60218 14.5 1.22064 14.342 0.93934 14.0607C0.658035 13.7794 0.5 13.3978 0.5 13V3C0.5 2.60218 0.658035 2.22064 0.93934 1.93934C1.22064 1.65804 1.60218 1.5 2 1.5H14C14.3978 1.5 14.7794 1.65804 15.0607 1.93934C15.342 2.22064 15.5 2.60218 15.5 3V13C15.5 13.3978 15.342 13.7794 15.0607 14.0607C14.7794 14.342 14.3978 14.5 14 14.5V14.5Z" stroke="#333333" stroke-linecap="round" stroke-linejoin="round"/> +</svg> diff --git a/SSL/src/CommonPictures/ОтправитьЭлектронноеПисьмо/Picture.zip b/SSL/src/CommonPictures/ОтправитьЭлектронноеПисьмо/Picture.zip deleted file mode 100644 index bb31b57ea6a5175d7eda85391df03c2ececd2947..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10207 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 diff --git a/SSL/src/CommonPictures/Позвонить/Picture.svg b/SSL/src/CommonPictures/Позвонить/Picture.svg new file mode 100644 index 000000000..32920b87f --- /dev/null +++ b/SSL/src/CommonPictures/Позвонить/Picture.svg @@ -0,0 +1,12 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_129_35)"> +<path d="M9.17796 10.529L8.11896 11.854C6.4782 10.8892 5.11074 9.52176 4.14596 7.881L5.47096 6.822C5.6262 6.69772 5.7359 6.52552 5.78294 6.3323C5.82998 6.13909 5.8117 5.93573 5.73096 5.754L4.52396 3.036C4.43743 2.84103 4.28447 2.68312 4.09234 2.59045C3.90021 2.49777 3.68141 2.47635 3.47496 2.53L1.17496 3.13C0.959891 3.18497 0.772723 3.31747 0.649421 3.50206C0.526119 3.68664 0.475381 3.91028 0.506958 4.13C0.910887 7.00121 2.23861 9.66287 4.28939 11.7126C6.34018 13.7623 9.00253 15.0886 11.874 15.491C12.0937 15.5226 12.3173 15.4718 12.5019 15.3485C12.6865 15.2252 12.819 15.0381 12.874 14.823L13.474 12.523C13.5273 12.3167 13.5058 12.0981 13.4131 11.9062C13.3205 11.7143 13.1627 11.5615 12.968 11.475L10.246 10.27C10.0643 10.1892 9.86105 10.1707 9.66784 10.2176C9.47463 10.2644 9.30237 10.3739 9.17796 10.529V10.529Z" stroke="#333333" stroke-linecap="round" stroke-linejoin="round"/> +<path d="M8.5 4C9.42826 4 10.3185 4.36875 10.9749 5.02513C11.6313 5.6815 12 6.57174 12 7.5" stroke="#333333" stroke-linecap="round" stroke-linejoin="round"/> +<path d="M8.5 1C9.35359 1 10.1988 1.16813 10.9874 1.49478C11.7761 1.82144 12.4926 2.30023 13.0962 2.90381C13.6998 3.50739 14.1786 4.22394 14.5052 5.01256C14.8319 5.80117 15 6.64641 15 7.5" stroke="#333333" stroke-linecap="round" stroke-linejoin="round"/> +</g> +<defs> +<clipPath id="clip0_129_35"> +<rect width="16" height="16" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/SSL/src/CommonPictures/Позвонить/Picture.zip b/SSL/src/CommonPictures/Позвонить/Picture.zip deleted file mode 100644 index 82b59c058c0f5867eae805e299230da4647dc61a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6907 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 diff --git a/SSL/src/CommonPictures/ПоказатьНаКарте/Picture.zip b/SSL/src/CommonPictures/ПоказатьНаКарте/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..26249d9b6d9d2be7c61c7f25c40b5cca90a36b26 GIT binary patch literal 8800 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 literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПоказатьНаКарте/ПоказатьНаКарте.mdo b/SSL/src/CommonPictures/ПоказатьНаКарте/ПоказатьНаКарте.mdo new file mode 100644 index 000000000..ae882d492 --- /dev/null +++ b/SSL/src/CommonPictures/ПоказатьНаКарте/ПоказатьНаКарте.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="584aa9db-e6b0-49f3-ae9d-5b6c796d015c"> + <name>ПоказатьНаКарте</name> + <synonym> + <key>ru</key> + <value>Показать на карте</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/ПредварительныйПросмотрКартинка/Picture.png b/SSL/src/CommonPictures/ПредварительныйПросмотрКартинка/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f4f1ae5f8b468b08c9335935f339dfb9bc48ad GIT binary patch literal 1900 zcmbVN32f6=7<L(uLRAiR8>p0Fxd@FyVmoJJ$e<*p3Dl*undmOSwVl=^v4icjY1WO7 zqXbm8m2F|0I)SQ{AwX>0s(^5m!6<Cvk}3_v%En47juxtcfUVtgnnW<M3ro-M`TgJf z{^R}s?=^)5d8xzGheHsQ>ag32z&uJB$wR?=LT^6>reQw&YZ3&dq$wi_`n+K*1P#gH zoF#GznNQGyS3@yEDXR&1eE<zX(`N*H6zyhZxRfp9cni{f;4lJnj0IU>ATiQsWy?8x zP-KgP1x`BXrp*j8;}v*%fB*zuR;J*9*TYLhz=A}139weSQ3Q@cWVZ#$Q53=@WFc%7 zL>4w`Fg1-~IvB@|8it`wrL=x3ti`lAie;m?Nsa3WJe$y&;MjuzeInx`ifprE+Q63u zDVJp*fufa_m6}SOMi9$T+-x?Zm=@J))c~QEs(6_SsCg+f&R}CDTI75(C-AVsNR<kH z*@6ID2b}Qw612P&3ls<$8lZeAuE7+iqCkdD;Cz136IIU8DC=RpEH6s{izl$YazPfP za^Y{N6XGWnfZ&p3LdR2W@p=;~BssSNxDgA;Q_+&M%EzKbtR(nFn$4{MW@akh_z0`W zQnDaA1;G=)s=~O*uol;7;g?B@=6J=4$&VdjZIsMf5G{sht1+!wo9)ERguzH?u_>62 zz_0-*DKMO?Dh>q~gBjGg*@>G81+9Mq3etw5Wa?kR3{AKM(MtiBIWJYlqCUP1ffIow ztb#`nfns2t?(uzx)mkVDF3tl4Qc>P4*pX{B;%1{!t<~UBb4ikL@RCgNH0!Wg5D*>> z$1#M7!VD~hyVM3FW>V`-G^@_mYcaK}l%iQZV=~faL;So=p#4e`#LqMT^ZY!K17%2g zo|#7}P9=K?J12pAt%?;-F}pOj@^El8VF-#=3c-TVN(QhD65HmUIRXQ;mE|lT{fE35 zfJuT&uB1dZrwl~vKV%*X%tw`?9q<JGtCLaLV+9_EgRY@06AcS|Bw8NJgFYvMh6b&$ z9fzQ#dk$NUGkaarNAvB)^D|B?yS^}GpJ%&oc5<Wb)Wpz-_EtD~c^x@?(ehmz>b9R~ zT)p<na}(Bni5$x@bdot4!y+NL?a1AutC!THsT2L*cXYft^7fTwBP&+l=WS<I6B=3` zZ0xT7NtL%Ixqn6a+oL1Zr?(h4ap_eTR%C6a(^_^0zO4zt$jV@2ZO9V}b-At`ott?v z%~0UKzwn#u-X)ry>7&nG9&A6Z>Ioh){jjiZ<@gc%`R!!;=5@Ae=&iQyx_J@z)~xn@ zs!bm^K9Z*u?{>_dbVa&(-0`!O7P98-8L}_D;nbMsKIFYSU6+=U#qu8GorCC^_J^(V zt4Wu36s^sVe0Q}|_u_8%uf12hKB)e5(Wd_2>+f3f24B$QWLiyU`x`(e?^Qi`>F~*8 zHx4v#(`IHJYHhjG{LZplGbgXA&rj;Pwj^Zfd;Q++A01Q05j9`W-4@w8`evJHRYN1c z<?J7GRAKfLS{^*^^!)S9{_w6L!Hw@jXES<U*h)b9rstcA)|^~GeD<)RRGxIIGygok zr(sI42I^_KI<xJ!^_#hHsN~)53irKphHW>>3kOBUUwq{5^0@26wM4l0@bn`SM-^5? z=I(#A?sDt;Uz$2j3>~re_E!<!1a+O6SJ#YQs_jTorHl)Y8C%@{@QYjL`(WtcAii%X Yk~#kFf!@Wb%Ky-jTVUHUYw_|w0W;*U6aWAK literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПредварительныйПросмотрКартинка/ПредварительныйПросмотрКартинка.mdo b/SSL/src/CommonPictures/ПредварительныйПросмотрКартинка/ПредварительныйПросмотрКартинка.mdo new file mode 100644 index 000000000..ab292ba91 --- /dev/null +++ b/SSL/src/CommonPictures/ПредварительныйПросмотрКартинка/ПредварительныйПросмотрКартинка.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="d1391e3b-ec29-48c8-8bf5-fa4434a909e9"> + <name>ПредварительныйПросмотрКартинка</name> + <synonym> + <key>ru</key> + <value>Предварительный просмотр</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/СостояниеПользователя01/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя01/Picture.svg new file mode 100644 index 000000000..a0787ac0e --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя01/Picture.svg @@ -0,0 +1,10 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M4 12C4 10.3431 5.51099 9 7.375 9H9.625C11.489 9 13 10.3431 13 12V14H4V12Z" fill="#3B92C1"/> +<path d="M7 9H10V10.3333C10 10.7015 9.32845 11 8.5 11C7.67155 11 7 10.7015 7 10.3333V9Z" fill="#DCEAF2"/> +<path d="M10 7H7V9H10V7Z" fill="#BB8942"/> +<path d="M12 6C12 6 10.433 6 8.5 6C6.56695 6 5 6 5 6C5 3.79086 6.56695 2 8.5 2C10.433 2 12 3.79086 12 6Z" fill="#110702"/> +<path d="M8.5 8C9.88071 8 11 6.88071 11 5.5C11 4.11929 9.88071 3 8.5 3C7.11929 3 6 4.11929 6 5.5C6 6.88071 7.11929 8 8.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M14 15H3V12C3 10.1597 4.30798 8.719 6 8.20437V7.94949C5.7296 7.67356 5.50453 7.35304 5.33682 7H5.00007L5 6H6.05001C6.125 6.36944 6.28146 6.70929 6.49982 7C6.64208 7.18939 6.81061 7.35792 7 7.50018V9H7.375C7.24825 9 7.12312 9.00621 7 9.01831C6.64745 9.05295 6.31127 9.13585 6 9.25943C4.82137 9.72735 4 10.7784 4 12V14H13V12C13 10.7784 12.1786 9.72735 11 9.25943C10.6887 9.13585 10.3526 9.05295 10 9.01831C9.87687 9.00621 9.75175 9 9.625 9H10V7.50018C10.1894 7.35792 10.3579 7.18939 10.5002 7C10.7185 6.70929 10.875 6.36944 10.95 6H12L12 7H11.664C11.4963 7.35304 11.2704 7.67356 11 7.94949V8.20437C12.692 8.719 14 10.1597 14 12V15ZM12 6C12 5.99994 12 6.00006 12 6L12 7H13V6C13 3.36819 11.1066 1 8.5 1C5.8934 1 4 3.36819 4 6V7H5.00007L5 6C5 6.00006 5 5.99994 5 6C5 5.91045 5.00258 5.82142 5.00765 5.73333C5.01217 5.65492 5.01866 5.57712 5.02708 5.5C5.04565 5.32978 5.07358 5.16288 5.11026 5C5.49879 3.27477 6.8691 2 8.5 2C10.1309 2 11.5012 3.27477 11.8897 5C11.9264 5.16288 11.9543 5.32978 11.9729 5.5C11.9813 5.57712 11.9878 5.65492 11.9923 5.73333C11.9974 5.82142 12 5.91045 12 6Z" fill="white"/> +<path opacity="0.7" d="M8 5.5L6.5 7L5.5 5.5L5 4.5L6 3L8 5.5Z" fill="white"/> +<path d="M5.57042 0L3.5 2.11972L1.42958 0L0 1.42958L2.11972 3.5L0 5.57042L1.42958 7L3.5 4.88028L5.57042 7L7 5.57042L4.88028 3.5L7 1.42958L5.57042 0Z" fill="#ED604B"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя01/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя01/Picture.zip deleted file mode 100644 index 370985a61e0ae6935fed0bc86de4661cb1dfe5bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22241 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 A7XSbN diff --git a/SSL/src/CommonPictures/СостояниеПользователя02/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя02/Picture.svg new file mode 100644 index 000000000..850dc04d5 --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя02/Picture.svg @@ -0,0 +1,8 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M4 12C4 10.3431 5.51099 9 7.375 9H9.625C11.489 9 13 10.3431 13 12V14H4V12Z" fill="#3B92C1"/> +<path d="M7 9H10V10.3333C10 10.7015 9.32845 11 8.5 11C7.67155 11 7 10.7015 7 10.3333V9Z" fill="#DCEAF2"/> +<path d="M10 7H7V9H10V7Z" fill="#BB8942"/> +<path d="M12 6C12 6 10.433 6 8.5 6C6.56695 6 5 6 5 6C5 3.79086 6.56695 2 8.5 2C10.433 2 12 3.79086 12 6Z" fill="#110702"/> +<path d="M8.5 8C9.88071 8 11 6.88071 11 5.5C11 4.11929 9.88071 3 8.5 3C7.11929 3 6 4.11929 6 5.5C6 6.88071 7.11929 8 8.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M14 15H3V12C3 10.1597 4.30798 8.719 6 8.20437V7.94949C5.7296 7.67356 5.50453 7.35304 5.33682 7H5.00007L5 6H6.05001C6.125 6.36944 6.28146 6.70929 6.49982 7C6.64208 7.18939 6.81061 7.35792 7 7.50018V9H7.375C7.24825 9 7.12312 9.00621 7 9.01831C6.64745 9.05295 6.31127 9.13585 6 9.25943C4.82137 9.72735 4 10.7784 4 12V14H13V12C13 10.7784 12.1786 9.72735 11 9.25943C10.6887 9.13585 10.3526 9.05295 10 9.01831C9.87687 9.00621 9.75175 9 9.625 9H10V7.50018C10.1894 7.35792 10.3579 7.18939 10.5002 7C10.7185 6.70929 10.875 6.36944 10.95 6H12L12 7H11.664C11.4963 7.35304 11.2704 7.67356 11 7.94949V8.20437C12.692 8.719 14 10.1597 14 12V15ZM12 6C12 5.99994 12 6.00006 12 6L12 7H13V6C13 3.36819 11.1066 1 8.5 1C5.8934 1 4 3.36819 4 6V7H5.00007L5 6C5 6.00006 5 5.99994 5 6C5 5.91045 5.00258 5.82142 5.00765 5.73333C5.01217 5.65492 5.01866 5.57712 5.02708 5.5C5.04565 5.32978 5.07358 5.16288 5.11026 5C5.49879 3.27477 6.8691 2 8.5 2C10.1309 2 11.5012 3.27477 11.8897 5C11.9264 5.16288 11.9543 5.32978 11.9729 5.5C11.9813 5.57712 11.9878 5.65492 11.9923 5.73333C11.9974 5.82142 12 5.91045 12 6Z" fill="white"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя02/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя02/Picture.zip deleted file mode 100644 index 9f704e02154026e3992f9bb198c6bce7693d30d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20646 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 diff --git a/SSL/src/CommonPictures/СостояниеПользователя03/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя03/Picture.svg new file mode 100644 index 000000000..5bc0485c5 --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя03/Picture.svg @@ -0,0 +1,15 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<rect x="2" y="8" width="12" height="6" fill="#D9D9D9"/> +<path d="M2 8H14V14H2V8Z" fill="#F7DA7D"/> +<path d="M2 7H14V5.5H9L8 4H2V7Z" fill="#FFE069"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M3.91421 4C3.78161 4 3.65443 4.05268 3.56066 4.14645L2.14645 5.56066C2.05268 5.65443 2 5.78161 2 5.91421V13.5C2 13.7761 2.22386 14 2.5 14H13.5C13.7761 14 14 13.7761 14 13.5V6.5C14 6.22386 13.7761 6 13.5 6H9.5C9.02786 6 8.58328 5.77771 8.3 5.4L7.4 4.2C7.30557 4.0741 7.15738 4 7 4H3.91421ZM2.85355 3.43934C3.13486 3.15803 3.51639 3 3.91421 3H7C7.47214 3 7.91672 3.22229 8.2 3.6L9.1 4.8C9.19443 4.9259 9.34262 5 9.5 5H13.5C14.3284 5 15 5.67157 15 6.5V13.5C15 14.3284 14.3284 15 13.5 15H2.5C1.67157 15 1 14.3284 1 13.5V5.91421C1 5.51639 1.15804 5.13486 1.43934 4.85355L2.85355 3.43934Z" fill="#BB8744"/> +<path d="M2 7H14V8H2V7Z" fill="#BB8744"/> +<path d="M4 12C4 10.3431 5.51099 9 7.375 9H9.625C11.489 9 13 10.3431 13 12V14H4V12Z" fill="#3B92C1"/> +<path d="M7 9H10V10.3333C10 10.7015 9.32845 11 8.5 11C7.67155 11 7 10.7015 7 10.3333V9Z" fill="#DCEAF2"/> +<path d="M10 7H7V9H10V7Z" fill="#BB8942"/> +<path d="M12 6C12 6 10.433 6 8.5 6C6.56695 6 5 6 5 6C5 3.79086 6.56695 2 8.5 2C10.433 2 12 3.79086 12 6Z" fill="#110702"/> +<path d="M8.5 8C9.88071 8 11 6.88071 11 5.5C11 4.11929 9.88071 3 8.5 3C7.11929 3 6 4.11929 6 5.5C6 6.88071 7.11929 8 8.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M14 15H3V12C3 10.1597 4.30798 8.719 6 8.20437V7.94949C5.7296 7.67356 5.50453 7.35304 5.33682 7H5.00007L5 6H6.05001C6.125 6.36944 6.28146 6.70929 6.49982 7C6.64208 7.18939 6.81061 7.35792 7 7.50018V9H7.375C7.24825 9 7.12312 9.00621 7 9.01831C6.64745 9.05295 6.31127 9.13585 6 9.25943C4.82137 9.72735 4 10.7784 4 12V14H13V12C13 10.7784 12.1786 9.72735 11 9.25943C10.6887 9.13585 10.3526 9.05295 10 9.01831C9.87687 9.00621 9.75175 9 9.625 9H10V7.50018C10.1894 7.35792 10.3579 7.18939 10.5002 7C10.7185 6.70929 10.875 6.36944 10.95 6H12L12 7H11.664C11.4963 7.35304 11.2704 7.67356 11 7.94949V8.20437C12.692 8.719 14 10.1597 14 12V15ZM12 6C12 5.99994 12 6.00006 12 6L12 7H13V6C13 3.36819 11.1066 1 8.5 1C5.8934 1 4 3.36819 4 6V7H5.00007L5 6C5 6.00006 5 5.99994 5 6C5 5.91045 5.00258 5.82142 5.00765 5.73333C5.01217 5.65492 5.01866 5.57712 5.02708 5.5C5.04565 5.32978 5.07358 5.16288 5.11026 5C5.49879 3.27477 6.8691 2 8.5 2C10.1309 2 11.5012 3.27477 11.8897 5C11.9264 5.16288 11.9543 5.32978 11.9729 5.5C11.9813 5.57712 11.9878 5.65492 11.9923 5.73333C11.9974 5.82142 12 5.91045 12 6Z" fill="white"/> +<path opacity="0.7" d="M8 5.5L6.5 7L5.5 5.5L5 4.5L6 3L8 5.5Z" fill="white"/> +<path d="M5.57042 0L3.5 2.11972L1.42958 0L0 1.42958L2.11972 3.5L0 5.57042L1.42958 7L3.5 4.88028L5.57042 7L7 5.57042L4.88028 3.5L7 1.42958L5.57042 0Z" fill="#ED604B"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя03/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя03/Picture.zip deleted file mode 100644 index 93914cb0921c6d173e77ff82fee7c951109884f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24019 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 T|B1~2?3+(8>djG9|Bw0~t92rM diff --git a/SSL/src/CommonPictures/СостояниеПользователя04/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя04/Picture.svg new file mode 100644 index 000000000..5810c046a --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя04/Picture.svg @@ -0,0 +1,13 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<rect x="2" y="8" width="12" height="6" fill="#D9D9D9"/> +<path d="M2 8H14V14H2V8Z" fill="#F7DA7D"/> +<path d="M2 7H14V5.5H9L8 4H2V7Z" fill="#FFE069"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M3.91421 4C3.78161 4 3.65443 4.05268 3.56066 4.14645L2.14645 5.56066C2.05268 5.65443 2 5.78161 2 5.91421V13.5C2 13.7761 2.22386 14 2.5 14H13.5C13.7761 14 14 13.7761 14 13.5V6.5C14 6.22386 13.7761 6 13.5 6H9.5C9.02786 6 8.58328 5.77771 8.3 5.4L7.4 4.2C7.30557 4.0741 7.15738 4 7 4H3.91421ZM2.85355 3.43934C3.13486 3.15803 3.51639 3 3.91421 3H7C7.47214 3 7.91672 3.22229 8.2 3.6L9.1 4.8C9.19443 4.9259 9.34262 5 9.5 5H13.5C14.3284 5 15 5.67157 15 6.5V13.5C15 14.3284 14.3284 15 13.5 15H2.5C1.67157 15 1 14.3284 1 13.5V5.91421C1 5.51639 1.15804 5.13486 1.43934 4.85355L2.85355 3.43934Z" fill="#BB8744"/> +<path d="M2 7H14V8H2V7Z" fill="#BB8744"/> +<path d="M4 12C4 10.3431 5.51099 9 7.375 9H9.625C11.489 9 13 10.3431 13 12V14H4V12Z" fill="#3B92C1"/> +<path d="M7 9H10V10.3333C10 10.7015 9.32845 11 8.5 11C7.67155 11 7 10.7015 7 10.3333V9Z" fill="#DCEAF2"/> +<path d="M10 7H7V9H10V7Z" fill="#BB8942"/> +<path d="M12 6C12 6 10.433 6 8.5 6C6.56695 6 5 6 5 6C5 3.79086 6.56695 2 8.5 2C10.433 2 12 3.79086 12 6Z" fill="#110702"/> +<path d="M8.5 8C9.88071 8 11 6.88071 11 5.5C11 4.11929 9.88071 3 8.5 3C7.11929 3 6 4.11929 6 5.5C6 6.88071 7.11929 8 8.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M14 15H3V12C3 10.1597 4.30798 8.719 6 8.20437V7.94949C5.7296 7.67356 5.50453 7.35304 5.33682 7H5.00007L5 6H6.05001C6.125 6.36944 6.28146 6.70929 6.49982 7C6.64208 7.18939 6.81061 7.35792 7 7.50018V9H7.375C7.24825 9 7.12312 9.00621 7 9.01831C6.64745 9.05295 6.31127 9.13585 6 9.25943C4.82137 9.72735 4 10.7784 4 12V14H13V12C13 10.7784 12.1786 9.72735 11 9.25943C10.6887 9.13585 10.3526 9.05295 10 9.01831C9.87687 9.00621 9.75175 9 9.625 9H10V7.50018C10.1894 7.35792 10.3579 7.18939 10.5002 7C10.7185 6.70929 10.875 6.36944 10.95 6H12L12 7H11.664C11.4963 7.35304 11.2704 7.67356 11 7.94949V8.20437C12.692 8.719 14 10.1597 14 12V15ZM12 6C12 5.99994 12 6.00006 12 6L12 7H13V6C13 3.36819 11.1066 1 8.5 1C5.8934 1 4 3.36819 4 6V7H5.00007L5 6C5 6.00006 5 5.99994 5 6C5 5.91045 5.00258 5.82142 5.00765 5.73333C5.01217 5.65492 5.01866 5.57712 5.02708 5.5C5.04565 5.32978 5.07358 5.16288 5.11026 5C5.49879 3.27477 6.8691 2 8.5 2C10.1309 2 11.5012 3.27477 11.8897 5C11.9264 5.16288 11.9543 5.32978 11.9729 5.5C11.9813 5.57712 11.9878 5.65492 11.9923 5.73333C11.9974 5.82142 12 5.91045 12 6Z" fill="white"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя04/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя04/Picture.zip deleted file mode 100644 index 95477c55e7f39c126c548db034d2c617d82be0d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23490 zcmb^YQ;;rPu&oWgW!tuG+qP}nHdfijD%<ud+qP}Hs=to2|K5Fn{)mj2k+<_ApD{*c zD$0O>q5=SrkO1b0AgNKL_TU0=005l_0Du4h08EUG^p5rx*V$f<C~CN)7>fT|af1iR z7R+E;;7PlrvWwTrD@v%EQ=1Dwy&(tOJ(6ol*X`Uz7Kov_|H5kkRizLs8wmnU!j8fo zXTTeaAsu1=14eJgha6+lEi~MgTTD7R`}=U}le|6s<A3}4*?st`za!wan!{47v6Mgw z8SHIlhW$8XVQ_x2uGc-fV@otNs-kO7gdjBkT~Y<p?7U0}DV;Z@2^|W&=$T`R=NxPt zZPl^bFQhzQ;>{JDBLw5fWM`7&eYA1o4QfuwmsH1WL{6VeZ^S&Q_cZi?3!}v!vZO3o zNhEzbJPd%>CN!)Yyg72J!@nOM9==V&5;HVFGYZF-O2%~z8iy@wqQ_PrUuITL%z(9N zb`F!yu9n4yqhSie9&RotmI|kGl#MolUNb-xN%36mprpyOz`Y#(<KSH^ipYs8#)luj zl}u@&$F5qiY^@~whdPzHAv}h`1v*sY<mga4q<NTWf%n{)Gsq~n{z)FS$zCX)P{~p7 z{&ljyB_yXi;A%)ov<EbT`Un$SUNrF<d*-_FGfO;?(yk1zS!GWwm$*8P#t1Bp!H9%# za~rAO*ha2&X7kc9RP8}{M7F?%%z^6Ak~RKBt1Y^i#XL&y4-AI1VfD&gBB{bq>!Ln+ zu<S$g1T2CZcSD_LXEZtJ2BkhYRfs8cNd`Z97`BGdfdy(>q)7%mTqPFj;E-}m3#~3J zTwXbR43Z)XXL!avDiLBlDp|dK`%gVR%;W}KP1VR2`>CUMXR|b`qcHzru_nT=u;A!d zQlKU3A04gq5JcFRkotMb)8_NJh>^goYpt-dCifLG_at`Gi#f-WxEi+1J6Z|`MERr{ zW^B=r93x6zER_m2YBq8bRw;F?0y$zcP^!3a@(#@!C7tA&4EFWahq#A?Iq@`CnW|xe ztdH~pkRzf37rmJFMWmPCKaeQopsC|`2S+Jb+(%sw2w9Tp?#-=SS1}F>2ap&FGBon> z&2(I(qJ&nyG#C_;RvavML$X;51$efJVp9RRy@+0>;bo!j?yaQ2)?)AjP3rw3?Psjn zoHOx_%md@Z5fn0zWwE8Omf7{wh|EHkm#|>d6xiGac2dY$0B$Rclq3mTl>KbNFnG8I zuvLbHq<=Rr@2t|YwB^E`pCv&zhE_(W3j^}S2ztpmF@}mCWI`u^)Mm9ddrXvJ6)-!+ zD%C&Kc-Xe^>KRxJb_|Tn2h0b4B!w?F!FWbtVTqw(L<1`o&~M)ke7b*s7Q;O2g*Fw~ z_mNNTF#te_|JRi;3j4?V%|K{F>Kq9n$y&0MzDy7iG&$3Y9Fm#<O2}m=_^%J$!6OHx zvk9WB6*uTU4WT7rm#y}oCgep{l9_Ci=WMl3URp;Ert4m;jR&4J+$p8`#a%AAoc2v- z#@UFUhT%!iZ0w}>tVABBd%cJDs|g8GH)BDgp_1~{{*>LOi+qU@lwY&S)QQr{#q(!d z{h~Lohm6zXs8+zrE!V<=G3SCZd-Vx(UZLKt<wTIbzY}1EqEyFwB^3QKtjmq#hugzR z1I68SZ;n50q5-1GP0WU!oN9P=@uugq_I~yzhoDJWL&fzYB6Z&K>V150t3r3-=mAQl zuyp+ZbGGFcWv8ssn7|N0md~O5mF~LDeDH#JjraH|ObdEjfh^nMSdBHH0X9=}zWXN6 zO!MX@g>U)E(9e9hl&(_BaU!a+GDe|=463rrh2OS4-KPvF*5%T{=X79If_8h=kFk2j z^E|t8KH9?Lb^v2I;6=zyWU;_28zF$BjNIGdXB{8gMf$KCjv{OKr?s}je@iia#(T?? z@#RvZRYeU$Loe5ly4C8kP&&d~wJ(?kB6gjp)y}|gZ!D2c_x;;*Gq(yxpf`onbLUZ} z6Q56@>FMn0fJ)`i=GZB_=!3vVuDATcSoX^QC+_7&+xzpN67BYjm|J?=3}zv&O1zua z0Ee!w#-Oou6W~9b{!PusmSL>y^2o(2;B!GhaUg!>>HT&$V&Oh~YC)I7`*Sq2>3sN> ze9=cVU%!;s<0fw>vRjktmao~tA-=mY>({)uoEJ+YVbJ!?U%&KyR4V*wzkOuqXm=gi z*el|Zn~{CWyXpL0h2yR9GV)oWhub8#ETSL4m|b_4&HTLjVW051R^XG3gCzZNYOO9F z*Wf<&#PJKH`2V9A{eKkWWrPEy{D-ge|A%7CZ2yO1cB&{E*rO5BEyhYS{ca6W<{_QL z<SbC6r0a;P!C<UWNGa)qlcwgtB;&H|EP{ev<(5?C<znl>X~S;IYV&mUY4qCjP0(ds zovD>A&tP44blTNpNIGa#JRm?K$ei2T{@t&PEJq!$zrWi&uN@q(GEpY!JvZ0SSs0)~ zJM&7~e6KlE26ZvVH=9x4JsqQ-GOENNLMXoPlOUB_mk>fxp3L+?a&vTQM$K9=2hBl< zn^WkK3>S{sV8e}&>V|~OlGL(mUX4<eg!hd5)|v40TEvmE%+$Nm)l&xO5yuur(z=+n z_sW~9IYF6*N<q`Mg_x;yvTL_h2S2BS^@?-5q0`VP^hY$HP@S4Wpmt=S%niDsQo(4! ziY1!FD%8b9k6_B8#1Tkjv`|Py$Y_PCM94uskZk%}dUnIH)IIJEc%y#MDCUjTVqk+E z9UTW-hD>(Tfn?Gp$l}HIs?-PCkr}*EVs^w)P?(HZPxHvI=45oVQYyedEY^RU))@=t zWcC!V4w-er1yM}`JhpT~?aIN@B9Yc|AxFbm(`>6M`fNDCQOE~m6=?_0N$uUzWV1># zWxYX<6rUpvYumWD&%W8Rx2dt%nIrJ@#)pozAT<>jU0cyeh+WzXK--&)rHbZzPz+d% zccE~&f@A8i60G#kmbNt2kko<Apy)iT-e8fXigiDRq>iYu2EM_F`l&&c2Ic8;d0koM zu^+d*LMw}*B@iOgX7F`K4k@F5NHIoRZ$?CP4lOr|u{7BlLR{!0Blk3<$_;O<lLpRp z$>)p=-T#E(#8t#JFUK@uFT|K5)`v|f4l)G8(?v8&qX}hO(r`!$qg01)hef=qm#K)U zz(y-$BGoKA0x?M)P>Tj(!-gZOlB$gz6(Wj63Kv6)!xEEGQ<%071xAb=ee)5}do-*p zXtMWdU#+|aSX~o(H0axtb>zacedj}Ru+x`QChe0`D6r7(e!l)q9dd|}fS{2z{mnBK zs)6mVYiHcwOG4>{^pyLZP%FUf%eKN~jrg~GSHCt!{1A}KkMTYhvn3mhZ70RqjJ+OO z5Nk_sO@?mnc>7*f4eQaEc-<hIGC}AF$4iL|+b)a9%P1oM2-PKjW|-7Y9+<TY_I|Yg z5&EK#APUztl(R{3CuKNsQwNhutQ$o3wN39<?Vd&+M=ysf_EAWkN30dQMDGO6Q~p-t zZ8)eoo=XiGt4j`(R$+8n-$b0&j8qCrH%><qej9<>V3R|$1&tzsOx_6zQ97~z8L;OF zw5fox)enx(z1}X9k>3Y^4E(>ZuPMYjj6O6{N?zFv8rW6U67wD~p#(tm!X+VP06S<6 zL+IZ!zpY1nP%{$5Cp&J?ik+ap1`7^lxdyO8CgkEa7$fVot5?!9-QC{aGM=BbjZ<l4 zHs4nl$SR|4>HHt0;vas`DQN!dx1|dH-3khCIdl*9FT6N!7sBt^y)?a6FPWXsU$?)l zmCtud{X=6LG*YAbEYV3c$D{D#23_l`$|)Ou*?t66nma$TUY{?yr`b<r1*R@f`hOzY zKT^96DdSgc80=oGVrUWh!dt7o|52ZeGvqz>+1%*9PPLxw$|Tod;IuJRzQ%vuyS{ab zlz9);v;xkibRy8f@G(`q$xp_(Pn^GNpvqELuuUh>`;Z?ex`vwyAqO;<v;@kUy5~81 zEA7oEWj5=#@AFrVzR1hJz+YT9_KWzs;CVYe`^Z}~-|xNs#?!(H$ogo`;>bGX?dWMG z>DrkC79r3Kmf2DR+J6*t?}uW29<l5HxvSh>!7MzEwv~xe_3i96-HR$haaFwI;@<pz zTl9_&_%uGCVkD76Mfvj;Es|Uh9eY}v%NiMZb#&8N#!uN?FRMM;5PVw&2&%l|5a6_f z#|ua<J?)%(yI8D_^WDz$MsR3^{`lP@{I2!wQX1@FUnUED3mrDycEZQ~p5p2#h%DC# zZ0(9ntlD;`aL`ei>qhmyeD})PB%kUv;Lo<_H#)4QZ*$QsTzqn`Jf(RjQ0Y7~*bwlp zzrR;Ye=jtP#}AANc<=hY2SyC9t=?>_x1J1|eNM>SPQ@x@y-01x>3zDBc5}4EV0L*$ z-JXK6R6Y0f&Qjd^liV3NUH)qCXeWBxzXrD<1XMBzxE~2R9%GbBC@!Zb)Ap6Ot1h>B zNuMT5E&HQPA{Ka+K994MR}fvf#m~T?O^<{({<TpvnA<U!-@K4384lno)W>#oo#ODc zT}Ud6ujuJNxsR^nc;&y7v3lNWEvQLF+9swb{a}#PUTFN7bsO%hB<J0*n7XNbrj;A# zMs+2vsi0{)dQuNKxtdm4Ts)o1kp7eBZ5%eyv{aR??HYZep0_BVOXmN^%fSm;*`XgG z+$qorb}J>*#8<sWWY+;w7awT<O-O%XDKp%=Skm{n6P3{(zqXyCvH1dD*HXH{gf|zf zl?TBgt9j@4lF1K@53}9JP2pvcWQO}|vUN6Qws9D}!0`j|zu+eS58Nzd{>qY&06-S+ z|JYBq|FNGwx+ogxqY-G;fB$w7Lu<zhRkxBSg9?vjghKDj0f1oI-!REhFr}E8Scs5T zFnm?D8wzXVhkb4PHSX1@=ZuA>M%%j3hgw}HJJs4YfLmzxY8@OcJS{`_%DOfMZomJ7 z_SPfMuFq+ni_7nL7nBpyjXl3TB4~$%7&S`fDd`I~TT;g^<0Jtyf`*7GHkeS+Xj3|h zs<9bwFgoIRg=-}>dcPzdfm$*a=WZd3plvdk4lHF_>|zcqZ}Qw^hlh=V6IZDAj2u!G zD76S>o|xzf_I>eIyD2RPPI6^OKQu=sm=W-qBlfYTt2SSl=F!$pJLIE)O?XF+J_fhW zOzx<=qp})Qj^aY3%g~n~KKT>Efn>37fhIO7bjBbORA^AWAT$h!ComCl0x>XAS)UV{ z{gj@$s!f8ZnWsS9JL#$Ud^1pxQPcVq$LFJz2{~<wbV<D+XtXHrNQgwu++ulHS()!= zFzk@h0jfDEEUVB3*Odip2<yBv{c5bq>c?pb3opcZ#gE5mx7b=Rwjq%LfCssv;S@V$ zy!;w33p>P#u6FR5b@(h4-YuLqiM)c=8T07z#;AYFQms-WUZc#Vy!fmh_hVU_+A9nw z0>vqc6^n_NHX<{su1Jx!V4gE>=mnO?eM=aY#Kh;rGzx<oi$#NUDYA&Q)|4JBTZp$H zQYzonh>#eaF~9-p3n@qt9N_^MRYa^3Y8qOCi8NBtlwfei#SxbLaG5gpr;zfcH||6P zJ6TG(>Z~d&G>GjqG`vxbcz;To=*fCPcDglNvu}t#3tNP>SSexwS~$Y|pk64SD#QTu znm6A94O!Y+iiAZ<cb_2yFVg_OMmkLNoC<r{#4|;?AM*{gK-@7PAcz#Oe3vl+zh@>1 z9PBBi85kK6#r#D^jEayTUED(wpv6zxoHQhB+wv5l{+nKKeIz10iUVa{CerdtF(8yd zR4y58jBXKjP~v;L9g=i+%%B6o-7I>WXDS$rI-{PG!=vcDMFgzAsM7%%)zFn0EbQXg z0_#7{-W~a7knRxa>lw}kv)Wfldet3{Ae@N35rcj2l{w|}LzcQP$?oe(3$tu-U=7Ag zh|378McD2T23|wK>na41WNHaKwx*XLhi@)xc?%3>c89oW_^Zke)m*y6|3~s4tLE6w zXUWTUNQqTlT4|5)N1;tn-e0sr|8c^m+^Fr!Pxctn6V)IZ;9=wc3=h67ezhbaZ9BV~ z6r-7F!yzKrlMT2BCu%7ig)9#7l@4{+?QicO*j7NNAw2utV{&X!==(Fy{|n>>jMc$9 z`P}OW>DHyWOm7(uf1EWO5<(srCjOy@oOllT%Laz{bcXe48$y^22;N8+Mr?!$CQs5y z&w+{fi&R#a@|Z+Nr^aL4Jl=j9w!C@?ub!EpxEMj;Mf}O(uwE~)%e6^y^!VUmTsX-b z`nBe6(BSMKCVU|=@YuxsFneRO(d-oAGZ`_{XEV*<Ust`sV3A*24reo*FwON_>~iZ~ zW>8vJ`>kSCZ2NlC{n4d>ldpM5Vj%$CtLny$5TKK{=RGw1DE_5PY3U(5fTSZdq21AJ zRAN^)jeLr%e5U0Uzj(Hk@oH!Wrk&f7oYl9t)wVQ5|5Nw@TeYm+awlo%wte1VAaFBL zD?puxW1YR=WUDJ4UUl2qJ@^g>rcgkmmz%q9e;u}u!dv=``ua3gwMkH#%jOfVumDAR zmeW!#_v$i4eb99osq-<E!2P)YRY}F-ndv39jlWT$nA5UM?#0PueBbgIl)cOBr><vh zSM7JzYiee(`27m+r}S~MePY(+z>w$vqBQ^XvQ>`d5}ch4lbwUzX<|~h-B^>Vskoq{ z##580@hdg`p3kr8`nQBVhVb!=mx3?JUG$4{72`m!&l3^*5hFe9RwFu~iPa)>{}i2) zsq=dgJ7Agv+vwnSF>0(jIyxUcpG&KjgTe7JR@<Q2?a1`3wBKu*z`A6;wyiJLjlR8O zmYPGMNTHUWe_g$Yw`nxp!zcJ>Z#T|D0#}dpg}TER>zDd|v9)xiV*Pk!)Irvp!(H~R z^5*k%&o(~kRl|;ry%qn@+VM$>Be)8G9K+j1<#lv@KD}Rc{N)TipRd#QLpT+U&8aay zPpj85s=OTxU+75f<6|=~W$c4oOsSfMy_*{D1u@~ri=KkaV0&w<&QI#ocTVEwNW2!4 z)l-XBgs#(c23sjuEX%S!L{z%hg}1o4yN{}QNh~$=W{lcZ&im=RfzPdUUjB{0%>WJ& zU9t_k!-8#q-P2_ewZz}j9{P^qNqqL4`L5Ek??nF#Hy#J6`C5)Yw>Mkejc^|HI=y8z zY_=99WPaw8jVbS`5Pyr0Nj8?_Z--cG(Hxuon|N*%U`jB`P}92b!?)FZOtgDmLq~n| z){c6<o5J0M`rYQv3rlB~aMOokEr*%XAAF+Kee@Zq#}nf=pGr(GY65f%{L-$jEH~-D z_kHpg^%VEO2r9XJzv3w5*@6#;^L_DO4HtVTD)54yM=e@<ddJq?3x5C*kCHDmvNCk~ zoX44NvtM4Zc&?8P6($U}_wSb@C#=6)aSS{HwbNHW*G(k-9=%@f<|k6OOL_!fJ|Z4( zBYharsk!kxdB%f-))Y9Uo38g5v*9rWeh0Y(?wcb5<!?&9COLnP&ek~lR5tCdTjt_q zaBPqL@iyPLz09f%LJC(Mdc4)_|Ck5x;i93J@uD}f{tEoB*dYE-Y!E_=alk<V0D64? zBQ`kxCnd1a{Qsr|5S6Ne32M#yg2IT=!pu^Hx+A2JP?#x%&NQmnSV=(QNwTuw$a8Ad z+LvfTG?5R1H^Ih5e^nLd(HZu<g}_`jI>jo~5E%kBWtMAP2gFD~^Ka}0W_UCIo6$4B zzdRN*KJqi^wvcd{7G_M#zyLrMVF6)G`{wy9llhREnVSWK6N?74$r8YjODG@<;N?RO z66isSjT9>p9ZUp8UN)#qi(g=KEG-z|=-VQ#nG~~^;z^36=2(%dwyQ){o+9%dN@pCI z;!6sJR$7&C_mluB<=r?WA^m);<=Bj9L@42yQJ6Z3YArcg^71Y`<l%=|to%{AH?CWm z-y4Wb2VHW<geGjX$Y+II+Ql*a-=s7B^lakYqND|1L@|8}ltsV}fnxF{1W#smRP;h0 zN-atv7c>g~2ZVb+R6@SrjtndmD=xCyzR09TJoa>d4}?XVFkFblW_iI125(~p-J;Sr z{x=?=B%@l6EWrdO_6s{|LdBUb-SQU`7vwvMW;YP^BFICcTTBs#Mu<EY2pdI;%z<?R zHMP3VN*OA043Vqw-*RZ2m1>#nfTL_~Xl$Ub3NLYnWsT(1&&$NIc&aroAzDD6GG1b- z=s!l$*phNmNkQs)Gzt@S&a4E(Ehz(L<4q(w?qFGi1%|_(Wv9qqVP7=h!^l8RuMgNl zCN0qqQAR!@_K>%B<}D)d5D@qZt|5_7srgV=6MTKd5W6!YMVE4j#Cv7Th~I>0BR!Mv zepMt)^26uZths)svb*;WtphQqcThD+rdaPZp;2&BaC>E_l)#E3#u<@gM`B=Vv_H6a zc5{DEva5sNGGJAZaz#CFaOX7NwpXG=6%&MG2ce;mN%xR|xTB<r$fN%Z4I*cp5Q$~5 zDmWm7o=iWykm6@T%1|3Mbg$w2(FJJmPiY5ADL*xt{nP$1(8d{y&|*+67?OsV{80!+ z$~K}Tsw4-eh<%mseXSANA8Yg|3IStoc92sZpk^z~chbGsODTd!Ib-u<!3ZY%SdJ+R zS3#nJ@TFjHg#0#$aLDjA4JU_E>UNOET*6)#jV0T|)(m?iL%w~FpMo{{FDM|BswYND zeE27{Z)ms%2>K>rHRbK!2jR{j9YhH%G5~uX7iosN!677vz(vQ=7SPTIZA|H9W<U?& z6fFJWCS;?<r;hdNV?E(pXcJ3>Mm=o+Clwh0r~X#n?lTNU>4FYD9XIc4;@X?LQxv1D z6f>O%PRS6r_T$mq0m&)=6Axn|fiek)`iz*^d+iHw0fN7xkBo(TGq*6IHTwAq2~9vm z78aI-gd!p$4gJ4r-jj*Y9e!ydDT{S0!!IT$kr``%0DmPzjfeq~9^ip7Y=FDM^!7Fo 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 PBg8id1pr{w`K|s3gUthB diff --git a/SSL/src/CommonPictures/СостояниеПользователя05/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя05/Picture.svg new file mode 100644 index 000000000..a0dc3ff04 --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя05/Picture.svg @@ -0,0 +1,10 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M4 12C4 10.3431 5.51099 9 7.375 9H9.625C11.489 9 13 10.3431 13 12V14H4V12Z" fill="#3B92C1"/> +<path d="M7 9H10V10.3333C10 10.7015 9.32845 11 8.5 11C7.67155 11 7 10.7015 7 10.3333V9Z" fill="#DCEAF2"/> +<path d="M10 7H7V9H10V7Z" fill="#BB8942"/> +<path d="M12 6C12 6 10.433 6 8.5 6C6.56695 6 5 6 5 6C5 3.79086 6.56695 2 8.5 2C10.433 2 12 3.79086 12 6Z" fill="#110702"/> +<path d="M8.5 8C9.88071 8 11 6.88071 11 5.5C11 4.11929 9.88071 3 8.5 3C7.11929 3 6 4.11929 6 5.5C6 6.88071 7.11929 8 8.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M14 15H3V12C3 10.1597 4.30798 8.719 6 8.20437V7.94949C5.7296 7.67356 5.50453 7.35304 5.33682 7H5.00007L5 6H6.05001C6.125 6.36944 6.28146 6.70929 6.49982 7C6.64208 7.18939 6.81061 7.35792 7 7.50018V9H7.375C7.24825 9 7.12312 9.00621 7 9.01831C6.64745 9.05295 6.31127 9.13585 6 9.25943C4.82137 9.72735 4 10.7784 4 12V14H13V12C13 10.7784 12.1786 9.72735 11 9.25943C10.6887 9.13585 10.3526 9.05295 10 9.01831C9.87687 9.00621 9.75175 9 9.625 9H10V7.50018C10.1894 7.35792 10.3579 7.18939 10.5002 7C10.7185 6.70929 10.875 6.36944 10.95 6H12L12 7H11.664C11.4963 7.35304 11.2704 7.67356 11 7.94949V8.20437C12.692 8.719 14 10.1597 14 12V15ZM12 6C12 5.99994 12 6.00006 12 6L12 7H13V6C13 3.36819 11.1066 1 8.5 1C5.8934 1 4 3.36819 4 6V7H5.00007L5 6C5 6.00006 5 5.99994 5 6C5 5.91045 5.00258 5.82142 5.00765 5.73333C5.01217 5.65492 5.01866 5.57712 5.02708 5.5C5.04565 5.32978 5.07358 5.16288 5.11026 5C5.49879 3.27477 6.8691 2 8.5 2C10.1309 2 11.5012 3.27477 11.8897 5C11.9264 5.16288 11.9543 5.32978 11.9729 5.5C11.9813 5.57712 11.9878 5.65492 11.9923 5.73333C11.9974 5.82142 12 5.91045 12 6Z" fill="white"/> +<path d="M2.30946 0.00358324C1.49963 0.00191163 0.703456 0.217664 0 0.629416L0.531799 1.72543C1.0427 1.43028 1.61393 1.26222 2.1996 1.23475C2.42997 1.22068 2.65893 1.28021 2.85499 1.40514C2.93172 1.46053 2.99347 1.53503 3.03442 1.62166C3.07536 1.70828 3.09417 1.80417 3.08905 1.9003C3.09038 2.08878 3.03309 2.27279 2.92552 2.42556C2.73102 2.66217 2.50343 2.8679 2.25016 3.03602C1.95988 3.23549 1.71138 3.49247 1.51925 3.79189C1.38136 4.04733 1.31241 4.33591 1.31951 4.62783V5H2.61156V4.69765C2.60426 4.52656 2.64779 4.35723 2.73639 4.2121C2.90894 4.005 3.10847 3.8233 3.32936 3.67211C3.68941 3.43281 4.00324 3.12725 4.25502 2.77083C4.42275 2.48421 4.5074 2.15446 4.49907 1.82023C4.50752 1.56776 4.4583 1.31676 4.35534 1.0873C4.25237 0.857837 4.09853 0.65628 3.9061 0.498741C3.44656 0.14741 2.88168 -0.0277705 2.30946 0.00358324Z" fill="#333333"/> +<path d="M2.00023 9.00046C2.55264 9.00046 3.00046 8.55264 3.00046 8.00023C3.00046 7.44782 2.55264 7 2.00023 7C1.44782 7 1 7.44782 1 8.00023C1 8.55264 1.44782 9.00046 2.00023 9.00046Z" fill="#333333"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя05/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя05/Picture.zip deleted file mode 100644 index c34f433e8797c8201f7652b9f14750c43478a926..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23248 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 achvvgE6Y9pXKw_c-Cco5cYj*zAN5~HihkYz diff --git a/SSL/src/CommonPictures/СостояниеПользователя06/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя06/Picture.svg new file mode 100644 index 000000000..41b6aa9af --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя06/Picture.svg @@ -0,0 +1,10 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M4 12C4 10.3431 5.51099 9 7.375 9H9.625C11.489 9 13 10.3431 13 12V14H4V12Z" fill="#3B92C1"/> +<path d="M7 9H10V10.3333C10 10.7015 9.32845 11 8.5 11C7.67155 11 7 10.7015 7 10.3333V9Z" fill="#DCEAF2"/> +<path d="M10 7H7V9H10V7Z" fill="#BB8942"/> +<path d="M12 6C12 6 10.433 6 8.5 6C6.56695 6 5 6 5 6C5 3.79086 6.56695 2 8.5 2C10.433 2 12 3.79086 12 6Z" fill="#110702"/> +<path d="M8.5 8C9.88071 8 11 6.88071 11 5.5C11 4.11929 9.88071 3 8.5 3C7.11929 3 6 4.11929 6 5.5C6 6.88071 7.11929 8 8.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M14 15H3V12C3 10.1597 4.30798 8.719 6 8.20437V7.94949C5.7296 7.67356 5.50453 7.35304 5.33682 7H5.00007L5 6H6.05001C6.125 6.36944 6.28146 6.70929 6.49982 7C6.64208 7.18939 6.81061 7.35792 7 7.50018V9H7.375C7.24825 9 7.12312 9.00621 7 9.01831C6.64745 9.05295 6.31127 9.13585 6 9.25943C4.82137 9.72735 4 10.7784 4 12V14H13V12C13 10.7784 12.1786 9.72735 11 9.25943C10.6887 9.13585 10.3526 9.05295 10 9.01831C9.87687 9.00621 9.75175 9 9.625 9H10V7.50018C10.1894 7.35792 10.3579 7.18939 10.5002 7C10.7185 6.70929 10.875 6.36944 10.95 6H12L12 7H11.664C11.4963 7.35304 11.2704 7.67356 11 7.94949V8.20437C12.692 8.719 14 10.1597 14 12V15ZM12 6C12 5.99994 12 6.00006 12 6L12 7H13V6C13 3.36819 11.1066 1 8.5 1C5.8934 1 4 3.36819 4 6V7H5.00007L5 6C5 6.00006 5 5.99994 5 6C5 5.91045 5.00258 5.82142 5.00765 5.73333C5.01217 5.65492 5.01866 5.57712 5.02708 5.5C5.04565 5.32978 5.07358 5.16288 5.11026 5C5.49879 3.27477 6.8691 2 8.5 2C10.1309 2 11.5012 3.27477 11.8897 5C11.9264 5.16288 11.9543 5.32978 11.9729 5.5C11.9813 5.57712 11.9878 5.65492 11.9923 5.73333C11.9974 5.82142 12 5.91045 12 6Z" fill="white"/> +<path d="M2.00023 9.00046C2.55264 9.00046 3.00046 8.55264 3.00046 8.00023C3.00046 7.44782 2.55264 7 2.00023 7C1.44782 7 1 7.44782 1 8.00023C1 8.55264 1.44782 9.00046 2.00023 9.00046Z" fill="#ED604B"/> +<rect x="1" width="2" height="5" rx="1" fill="#ED604B"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя06/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя06/Picture.zip deleted file mode 100644 index d8d153f9b0633291c208c7122d2aaa29eeb7d630..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22398 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%0Da42L`s{scVvhR^_yakeIA4B! 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 Xdldz=-?0sVb-f3oUg!C${Z{`2d(|4$ diff --git a/SSL/src/CommonPictures/СостояниеПользователя07/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя07/Picture.svg new file mode 100644 index 000000000..0d5a52376 --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя07/Picture.svg @@ -0,0 +1,10 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M4 12C4 10.3431 5.51099 9 7.375 9H9.625C11.489 9 13 10.3431 13 12V14H4V12Z" fill="#3DB689"/> +<path d="M7 9H10V10.3333C10 10.7015 9.32845 11 8.5 11C7.67155 11 7 10.7015 7 10.3333V9Z" fill="#DCEAF2"/> +<path d="M10 7H7V9H10V7Z" fill="#BB8942"/> +<path d="M12 6C12 6 10.433 6 8.5 6C6.56695 6 5 6 5 6C5 3.79086 6.56695 2 8.5 2C10.433 2 12 3.79086 12 6Z" fill="#110702"/> +<path d="M8.5 8C9.88071 8 11 6.88071 11 5.5C11 4.11929 9.88071 3 8.5 3C7.11929 3 6 4.11929 6 5.5C6 6.88071 7.11929 8 8.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M14 15H3V12C3 10.1597 4.30798 8.719 6 8.20437V7.94949C5.7296 7.67356 5.50453 7.35304 5.33682 7H5.00007L5 6H6.05001C6.125 6.36944 6.28146 6.70929 6.49982 7C6.64208 7.18939 6.81061 7.35792 7 7.50018V9H7.375C7.24825 9 7.12312 9.00621 7 9.01831C6.64745 9.05295 6.31127 9.13585 6 9.25943C4.82137 9.72735 4 10.7784 4 12V14H13V12C13 10.7784 12.1786 9.72735 11 9.25943C10.6887 9.13585 10.3526 9.05295 10 9.01831C9.87687 9.00621 9.75175 9 9.625 9H10V7.50018C10.1894 7.35792 10.3579 7.18939 10.5002 7C10.7185 6.70929 10.875 6.36944 10.95 6H12L12 7H11.664C11.4963 7.35304 11.2704 7.67356 11 7.94949V8.20437C12.692 8.719 14 10.1597 14 12V15ZM12 6C12 5.99994 12 6.00006 12 6L12 7H13V6C13 3.36819 11.1066 1 8.5 1C5.8934 1 4 3.36819 4 6V7H5.00007L5 6C5 6.00006 5 5.99994 5 6C5 5.91045 5.00258 5.82142 5.00765 5.73333C5.01217 5.65492 5.01866 5.57712 5.02708 5.5C5.04565 5.32978 5.07358 5.16288 5.11026 5C5.49879 3.27477 6.8691 2 8.5 2C10.1309 2 11.5012 3.27477 11.8897 5C11.9264 5.16288 11.9543 5.32978 11.9729 5.5C11.9813 5.57712 11.9878 5.65492 11.9923 5.73333C11.9974 5.82142 12 5.91045 12 6Z" fill="white"/> +<path opacity="0.7" d="M8 5.5L6.5 7L5.5 5.5L5 4.5L6 3L8 5.5Z" fill="white"/> +<path d="M5.57042 0L3.5 2.11972L1.42958 0L0 1.42958L2.11972 3.5L0 5.57042L1.42958 7L3.5 4.88028L5.57042 7L7 5.57042L4.88028 3.5L7 1.42958L5.57042 0Z" fill="#ED604B"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя07/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя07/Picture.zip deleted file mode 100644 index 3c5d04dfd44c6bae62b84b9101b5405271130def..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22400 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 diff --git a/SSL/src/CommonPictures/СостояниеПользователя08/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя08/Picture.svg new file mode 100644 index 000000000..f914b730b --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя08/Picture.svg @@ -0,0 +1,8 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M4 12C4 10.3431 5.51099 9 7.375 9H9.625C11.489 9 13 10.3431 13 12V14H4V12Z" fill="#3DB689"/> +<path d="M7 9H10V10.3333C10 10.7015 9.32845 11 8.5 11C7.67155 11 7 10.7015 7 10.3333V9Z" fill="#DCEAF2"/> +<path d="M10 7H7V9H10V7Z" fill="#BB8942"/> +<path d="M12 6C12 6 10.433 6 8.5 6C6.56695 6 5 6 5 6C5 3.79086 6.56695 2 8.5 2C10.433 2 12 3.79086 12 6Z" fill="#110702"/> +<path d="M8.5 8C9.88071 8 11 6.88071 11 5.5C11 4.11929 9.88071 3 8.5 3C7.11929 3 6 4.11929 6 5.5C6 6.88071 7.11929 8 8.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M14 15H3V12C3 10.1597 4.30798 8.719 6 8.20437V7.94949C5.7296 7.67356 5.50453 7.35304 5.33682 7H5.00007L5 6H6.05001C6.125 6.36944 6.28146 6.70929 6.49982 7C6.64208 7.18939 6.81061 7.35792 7 7.50018V9H7.375C7.24825 9 7.12312 9.00621 7 9.01831C6.64745 9.05295 6.31127 9.13585 6 9.25943C4.82137 9.72735 4 10.7784 4 12V14H13V12C13 10.7784 12.1786 9.72735 11 9.25943C10.6887 9.13585 10.3526 9.05295 10 9.01831C9.87687 9.00621 9.75175 9 9.625 9H10V7.50018C10.1894 7.35792 10.3579 7.18939 10.5002 7C10.7185 6.70929 10.875 6.36944 10.95 6H12L12 7H11.664C11.4963 7.35304 11.2704 7.67356 11 7.94949V8.20437C12.692 8.719 14 10.1597 14 12V15ZM12 6C12 5.99994 12 6.00006 12 6L12 7H13V6C13 3.36819 11.1066 1 8.5 1C5.8934 1 4 3.36819 4 6V7H5.00007L5 6C5 6.00006 5 5.99994 5 6C5 5.91045 5.00258 5.82142 5.00765 5.73333C5.01217 5.65492 5.01866 5.57712 5.02708 5.5C5.04565 5.32978 5.07358 5.16288 5.11026 5C5.49879 3.27477 6.8691 2 8.5 2C10.1309 2 11.5012 3.27477 11.8897 5C11.9264 5.16288 11.9543 5.32978 11.9729 5.5C11.9813 5.57712 11.9878 5.65492 11.9923 5.73333C11.9974 5.82142 12 5.91045 12 6Z" fill="white"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя08/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя08/Picture.zip deleted file mode 100644 index 14f07fbb433055a8167842f530c47c174e2ad170..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20874 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 B1_}TG diff --git a/SSL/src/CommonPictures/СостояниеПользователя09/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя09/Picture.svg new file mode 100644 index 000000000..e6aa61092 --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя09/Picture.svg @@ -0,0 +1,15 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<rect x="2" y="8" width="12" height="6" fill="#D9D9D9"/> +<path d="M2 8H14V14H2V8Z" fill="#F7DA7D"/> +<path d="M2 7H14V5.5H9L8 4H2V7Z" fill="#FFE069"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M3.91421 4C3.78161 4 3.65443 4.05268 3.56066 4.14645L2.14645 5.56066C2.05268 5.65443 2 5.78161 2 5.91421V13.5C2 13.7761 2.22386 14 2.5 14H13.5C13.7761 14 14 13.7761 14 13.5V6.5C14 6.22386 13.7761 6 13.5 6H9.5C9.02786 6 8.58328 5.77771 8.3 5.4L7.4 4.2C7.30557 4.0741 7.15738 4 7 4H3.91421ZM2.85355 3.43934C3.13486 3.15803 3.51639 3 3.91421 3H7C7.47214 3 7.91672 3.22229 8.2 3.6L9.1 4.8C9.19443 4.9259 9.34262 5 9.5 5H13.5C14.3284 5 15 5.67157 15 6.5V13.5C15 14.3284 14.3284 15 13.5 15H2.5C1.67157 15 1 14.3284 1 13.5V5.91421C1 5.51639 1.15804 5.13486 1.43934 4.85355L2.85355 3.43934Z" fill="#BB8744"/> +<path d="M2 7H14V8H2V7Z" fill="#BB8744"/> +<path d="M4 12C4 10.3431 5.51099 9 7.375 9H9.625C11.489 9 13 10.3431 13 12V14H4V12Z" fill="#3DB689"/> +<path d="M7 9H10V10.3333C10 10.7015 9.32845 11 8.5 11C7.67155 11 7 10.7015 7 10.3333V9Z" fill="#DCEAF2"/> +<path d="M10 7H7V9H10V7Z" fill="#BB8942"/> +<path d="M12 6C12 6 10.433 6 8.5 6C6.56695 6 5 6 5 6C5 3.79086 6.56695 2 8.5 2C10.433 2 12 3.79086 12 6Z" fill="#110702"/> +<path d="M8.5 8C9.88071 8 11 6.88071 11 5.5C11 4.11929 9.88071 3 8.5 3C7.11929 3 6 4.11929 6 5.5C6 6.88071 7.11929 8 8.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M14 15H3V12C3 10.1597 4.30798 8.719 6 8.20437V7.94949C5.7296 7.67356 5.50453 7.35304 5.33682 7H5.00007L5 6H6.05001C6.125 6.36944 6.28146 6.70929 6.49982 7C6.64208 7.18939 6.81061 7.35792 7 7.50018V9H7.375C7.24825 9 7.12312 9.00621 7 9.01831C6.64745 9.05295 6.31127 9.13585 6 9.25943C4.82137 9.72735 4 10.7784 4 12V14H13V12C13 10.7784 12.1786 9.72735 11 9.25943C10.6887 9.13585 10.3526 9.05295 10 9.01831C9.87687 9.00621 9.75175 9 9.625 9H10V7.50018C10.1894 7.35792 10.3579 7.18939 10.5002 7C10.7185 6.70929 10.875 6.36944 10.95 6H12L12 7H11.664C11.4963 7.35304 11.2704 7.67356 11 7.94949V8.20437C12.692 8.719 14 10.1597 14 12V15ZM12 6C12 5.99994 12 6.00006 12 6L12 7H13V6C13 3.36819 11.1066 1 8.5 1C5.8934 1 4 3.36819 4 6V7H5.00007L5 6C5 6.00006 5 5.99994 5 6C5 5.91045 5.00258 5.82142 5.00765 5.73333C5.01217 5.65492 5.01866 5.57712 5.02708 5.5C5.04565 5.32978 5.07358 5.16288 5.11026 5C5.49879 3.27477 6.8691 2 8.5 2C10.1309 2 11.5012 3.27477 11.8897 5C11.9264 5.16288 11.9543 5.32978 11.9729 5.5C11.9813 5.57712 11.9878 5.65492 11.9923 5.73333C11.9974 5.82142 12 5.91045 12 6Z" fill="white"/> +<path opacity="0.7" d="M8 5.5L6.5 7L5.5 5.5L5 4.5L6 3L8 5.5Z" fill="white"/> +<path d="M5.57042 0L3.5 2.11972L1.42958 0L0 1.42958L2.11972 3.5L0 5.57042L1.42958 7L3.5 4.88028L5.57042 7L7 5.57042L4.88028 3.5L7 1.42958L5.57042 0Z" fill="#ED604B"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя09/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя09/Picture.zip deleted file mode 100644 index 6cf212bfb0fbd79a463cdd995139179e8407ba54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24053 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 diff --git a/SSL/src/CommonPictures/СостояниеПользователя10/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя10/Picture.svg new file mode 100644 index 000000000..dd72550ba --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя10/Picture.svg @@ -0,0 +1,13 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<rect x="2" y="8" width="12" height="6" fill="#D9D9D9"/> +<path d="M2 8H14V14H2V8Z" fill="#F7DA7D"/> +<path d="M2 7H14V5.5H9L8 4H2V7Z" fill="#FFE069"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M3.91421 4C3.78161 4 3.65443 4.05268 3.56066 4.14645L2.14645 5.56066C2.05268 5.65443 2 5.78161 2 5.91421V13.5C2 13.7761 2.22386 14 2.5 14H13.5C13.7761 14 14 13.7761 14 13.5V6.5C14 6.22386 13.7761 6 13.5 6H9.5C9.02786 6 8.58328 5.77771 8.3 5.4L7.4 4.2C7.30557 4.0741 7.15738 4 7 4H3.91421ZM2.85355 3.43934C3.13486 3.15803 3.51639 3 3.91421 3H7C7.47214 3 7.91672 3.22229 8.2 3.6L9.1 4.8C9.19443 4.9259 9.34262 5 9.5 5H13.5C14.3284 5 15 5.67157 15 6.5V13.5C15 14.3284 14.3284 15 13.5 15H2.5C1.67157 15 1 14.3284 1 13.5V5.91421C1 5.51639 1.15804 5.13486 1.43934 4.85355L2.85355 3.43934Z" fill="#BB8744"/> +<path d="M2 7H14V8H2V7Z" fill="#BB8744"/> +<path d="M4 12C4 10.3431 5.51099 9 7.375 9H9.625C11.489 9 13 10.3431 13 12V14H4V12Z" fill="#3DB689"/> +<path d="M7 9H10V10.3333C10 10.7015 9.32845 11 8.5 11C7.67155 11 7 10.7015 7 10.3333V9Z" fill="#DCEAF2"/> +<path d="M10 7H7V9H10V7Z" fill="#BB8942"/> +<path d="M12 6C12 6 10.433 6 8.5 6C6.56695 6 5 6 5 6C5 3.79086 6.56695 2 8.5 2C10.433 2 12 3.79086 12 6Z" fill="#110702"/> +<path d="M8.5 8C9.88071 8 11 6.88071 11 5.5C11 4.11929 9.88071 3 8.5 3C7.11929 3 6 4.11929 6 5.5C6 6.88071 7.11929 8 8.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M14 15H3V12C3 10.1597 4.30798 8.719 6 8.20437V7.94949C5.7296 7.67356 5.50453 7.35304 5.33682 7H5.00007L5 6H6.05001C6.125 6.36944 6.28146 6.70929 6.49982 7C6.64208 7.18939 6.81061 7.35792 7 7.50018V9H7.375C7.24825 9 7.12312 9.00621 7 9.01831C6.64745 9.05295 6.31127 9.13585 6 9.25943C4.82137 9.72735 4 10.7784 4 12V14H13V12C13 10.7784 12.1786 9.72735 11 9.25943C10.6887 9.13585 10.3526 9.05295 10 9.01831C9.87687 9.00621 9.75175 9 9.625 9H10V7.50018C10.1894 7.35792 10.3579 7.18939 10.5002 7C10.7185 6.70929 10.875 6.36944 10.95 6H12L12 7H11.664C11.4963 7.35304 11.2704 7.67356 11 7.94949V8.20437C12.692 8.719 14 10.1597 14 12V15ZM12 6C12 5.99994 12 6.00006 12 6L12 7H13V6C13 3.36819 11.1066 1 8.5 1C5.8934 1 4 3.36819 4 6V7H5.00007L5 6C5 6.00006 5 5.99994 5 6C5 5.91045 5.00258 5.82142 5.00765 5.73333C5.01217 5.65492 5.01866 5.57712 5.02708 5.5C5.04565 5.32978 5.07358 5.16288 5.11026 5C5.49879 3.27477 6.8691 2 8.5 2C10.1309 2 11.5012 3.27477 11.8897 5C11.9264 5.16288 11.9543 5.32978 11.9729 5.5C11.9813 5.57712 11.9878 5.65492 11.9923 5.73333C11.9974 5.82142 12 5.91045 12 6Z" fill="white"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя10/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя10/Picture.zip deleted file mode 100644 index 0528421e6f8fe0dfcf22ffadc9ee8288fc442a3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22829 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 diff --git a/SSL/src/CommonPictures/СостояниеПользователя11/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя11/Picture.svg new file mode 100644 index 000000000..2c7bb58f3 --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя11/Picture.svg @@ -0,0 +1,10 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M4 12C4 10.3431 5.51099 9 7.375 9H9.625C11.489 9 13 10.3431 13 12V14H4V12Z" fill="#3DB689"/> +<path d="M7 9H10V10.3333C10 10.7015 9.32845 11 8.5 11C7.67155 11 7 10.7015 7 10.3333V9Z" fill="#DCEAF2"/> +<path d="M10 7H7V9H10V7Z" fill="#BB8942"/> +<path d="M12 6C12 6 10.433 6 8.5 6C6.56695 6 5 6 5 6C5 3.79086 6.56695 2 8.5 2C10.433 2 12 3.79086 12 6Z" fill="#110702"/> +<path d="M8.5 8C9.88071 8 11 6.88071 11 5.5C11 4.11929 9.88071 3 8.5 3C7.11929 3 6 4.11929 6 5.5C6 6.88071 7.11929 8 8.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M14 15H3V12C3 10.1597 4.30798 8.719 6 8.20437V7.94949C5.7296 7.67356 5.50453 7.35304 5.33682 7H5.00007L5 6H6.05001C6.125 6.36944 6.28146 6.70929 6.49982 7C6.64208 7.18939 6.81061 7.35792 7 7.50018V9H7.375C7.24825 9 7.12312 9.00621 7 9.01831C6.64745 9.05295 6.31127 9.13585 6 9.25943C4.82137 9.72735 4 10.7784 4 12V14H13V12C13 10.7784 12.1786 9.72735 11 9.25943C10.6887 9.13585 10.3526 9.05295 10 9.01831C9.87687 9.00621 9.75175 9 9.625 9H10V7.50018C10.1894 7.35792 10.3579 7.18939 10.5002 7C10.7185 6.70929 10.875 6.36944 10.95 6H12L12 7H11.664C11.4963 7.35304 11.2704 7.67356 11 7.94949V8.20437C12.692 8.719 14 10.1597 14 12V15ZM12 6C12 5.99994 12 6.00006 12 6L12 7H13V6C13 3.36819 11.1066 1 8.5 1C5.8934 1 4 3.36819 4 6V7H5.00007L5 6C5 6.00006 5 5.99994 5 6C5 5.91045 5.00258 5.82142 5.00765 5.73333C5.01217 5.65492 5.01866 5.57712 5.02708 5.5C5.04565 5.32978 5.07358 5.16288 5.11026 5C5.49879 3.27477 6.8691 2 8.5 2C10.1309 2 11.5012 3.27477 11.8897 5C11.9264 5.16288 11.9543 5.32978 11.9729 5.5C11.9813 5.57712 11.9878 5.65492 11.9923 5.73333C11.9974 5.82142 12 5.91045 12 6Z" fill="white"/> +<path d="M2.30946 0.00358324C1.49963 0.00191163 0.703456 0.217664 0 0.629416L0.531799 1.72543C1.0427 1.43028 1.61393 1.26222 2.1996 1.23475C2.42997 1.22068 2.65893 1.28021 2.85499 1.40514C2.93172 1.46053 2.99347 1.53503 3.03442 1.62166C3.07536 1.70828 3.09417 1.80417 3.08905 1.9003C3.09038 2.08878 3.03309 2.27279 2.92552 2.42556C2.73102 2.66217 2.50343 2.8679 2.25016 3.03602C1.95988 3.23549 1.71138 3.49247 1.51925 3.79189C1.38136 4.04733 1.31241 4.33591 1.31951 4.62783V5H2.61156V4.69765C2.60426 4.52656 2.64779 4.35723 2.73639 4.2121C2.90894 4.005 3.10847 3.8233 3.32936 3.67211C3.68941 3.43281 4.00324 3.12725 4.25502 2.77083C4.42275 2.48421 4.5074 2.15446 4.49907 1.82023C4.50752 1.56776 4.4583 1.31676 4.35534 1.0873C4.25237 0.857837 4.09853 0.65628 3.9061 0.498741C3.44656 0.14741 2.88168 -0.0277705 2.30946 0.00358324Z" fill="#333333"/> +<path d="M2.00023 9.00046C2.55264 9.00046 3.00046 8.55264 3.00046 8.00023C3.00046 7.44782 2.55264 7 2.00023 7C1.44782 7 1 7.44782 1 8.00023C1 8.55264 1.44782 9.00046 2.00023 9.00046Z" fill="#333333"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя11/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя11/Picture.zip deleted file mode 100644 index 99bb936dacfbb4770ee0d68e22ee901a846caa71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22476 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 diff --git a/SSL/src/CommonPictures/СостояниеПользователя12/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя12/Picture.svg new file mode 100644 index 000000000..73110e0b4 --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя12/Picture.svg @@ -0,0 +1,10 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M4 12C4 10.3431 5.51099 9 7.375 9H9.625C11.489 9 13 10.3431 13 12V14H4V12Z" fill="#3DB689"/> +<path d="M7 9H10V10.3333C10 10.7015 9.32845 11 8.5 11C7.67155 11 7 10.7015 7 10.3333V9Z" fill="#DCEAF2"/> +<path d="M10 7H7V9H10V7Z" fill="#BB8942"/> +<path d="M12 6C12 6 10.433 6 8.5 6C6.56695 6 5 6 5 6C5 3.79086 6.56695 2 8.5 2C10.433 2 12 3.79086 12 6Z" fill="#110702"/> +<path d="M8.5 8C9.88071 8 11 6.88071 11 5.5C11 4.11929 9.88071 3 8.5 3C7.11929 3 6 4.11929 6 5.5C6 6.88071 7.11929 8 8.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M14 15H3V12C3 10.1597 4.30798 8.719 6 8.20437V7.94949C5.7296 7.67356 5.50453 7.35304 5.33682 7H5.00007L5 6H6.05001C6.125 6.36944 6.28146 6.70929 6.49982 7C6.64208 7.18939 6.81061 7.35792 7 7.50018V9H7.375C7.24825 9 7.12312 9.00621 7 9.01831C6.64745 9.05295 6.31127 9.13585 6 9.25943C4.82137 9.72735 4 10.7784 4 12V14H13V12C13 10.7784 12.1786 9.72735 11 9.25943C10.6887 9.13585 10.3526 9.05295 10 9.01831C9.87687 9.00621 9.75175 9 9.625 9H10V7.50018C10.1894 7.35792 10.3579 7.18939 10.5002 7C10.7185 6.70929 10.875 6.36944 10.95 6H12L12 7H11.664C11.4963 7.35304 11.2704 7.67356 11 7.94949V8.20437C12.692 8.719 14 10.1597 14 12V15ZM12 6C12 5.99994 12 6.00006 12 6L12 7H13V6C13 3.36819 11.1066 1 8.5 1C5.8934 1 4 3.36819 4 6V7H5.00007L5 6C5 6.00006 5 5.99994 5 6C5 5.91045 5.00258 5.82142 5.00765 5.73333C5.01217 5.65492 5.01866 5.57712 5.02708 5.5C5.04565 5.32978 5.07358 5.16288 5.11026 5C5.49879 3.27477 6.8691 2 8.5 2C10.1309 2 11.5012 3.27477 11.8897 5C11.9264 5.16288 11.9543 5.32978 11.9729 5.5C11.9813 5.57712 11.9878 5.65492 11.9923 5.73333C11.9974 5.82142 12 5.91045 12 6Z" fill="white"/> +<path d="M2.00023 9.00046C2.55264 9.00046 3.00046 8.55264 3.00046 8.00023C3.00046 7.44782 2.55264 7 2.00023 7C1.44782 7 1 7.44782 1 8.00023C1 8.55264 1.44782 9.00046 2.00023 9.00046Z" fill="#ED604B"/> +<rect x="1" width="2" height="5" rx="1" fill="#ED604B"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя12/Picture.zip b/SSL/src/CommonPictures/СостояниеПользователя12/Picture.zip deleted file mode 100644 index f01361a8e8a718fd6b99758a895ff6cc7afb6e56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22105 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 diff --git a/SSL/src/CommonPictures/СостояниеПользователя13/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя13/Picture.svg new file mode 100644 index 000000000..e2436f48f --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя13/Picture.svg @@ -0,0 +1,10 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M4 12C4 10.3431 5.51099 9 7.375 9H9.625C11.489 9 13 10.3431 13 12V14H4V12Z" fill="#3B92C1"/> +<path d="M7 9H10V10.3333C10 10.7015 9.32845 11 8.5 11C7.67155 11 7 10.7015 7 10.3333V9Z" fill="#DCEAF2"/> +<path d="M10 7H7V9H10V7Z" fill="#BB8942"/> +<path d="M12 6C12 6 10.433 6 8.5 6C6.56695 6 5 6 5 6C5 3.79086 6.56695 2 8.5 2C10.433 2 12 3.79086 12 6Z" fill="#110702"/> +<path d="M8.5 8C9.88071 8 11 6.88071 11 5.5C11 4.11929 9.88071 3 8.5 3C7.11929 3 6 4.11929 6 5.5C6 6.88071 7.11929 8 8.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M14 15H3V12C3 10.1597 4.30798 8.719 6 8.20437V7.94949C5.7296 7.67356 5.50453 7.35304 5.33682 7H5.00007L5 6H6.05001C6.125 6.36944 6.28146 6.70929 6.49982 7C6.64208 7.18939 6.81061 7.35792 7 7.50018V9H7.375C7.24825 9 7.12312 9.00621 7 9.01831C6.64745 9.05295 6.31127 9.13585 6 9.25943C4.82137 9.72735 4 10.7784 4 12V14H13V12C13 10.7784 12.1786 9.72735 11 9.25943C10.6887 9.13585 10.3526 9.05295 10 9.01831C9.87687 9.00621 9.75175 9 9.625 9H10V7.50018C10.1894 7.35792 10.3579 7.18939 10.5002 7C10.7185 6.70929 10.875 6.36944 10.95 6H12L12 7H11.664C11.4963 7.35304 11.2704 7.67356 11 7.94949V8.20437C12.692 8.719 14 10.1597 14 12V15ZM12 6C12 5.99994 12 6.00006 12 6L12 7H13V6C13 3.36819 11.1066 1 8.5 1C5.8934 1 4 3.36819 4 6V7H5.00007L5 6C5 6.00006 5 5.99994 5 6C5 5.91045 5.00258 5.82142 5.00765 5.73333C5.01217 5.65492 5.01866 5.57712 5.02708 5.5C5.04565 5.32978 5.07358 5.16288 5.11026 5C5.49879 3.27477 6.8691 2 8.5 2C10.1309 2 11.5012 3.27477 11.8897 5C11.9264 5.16288 11.9543 5.32978 11.9729 5.5C11.9813 5.57712 11.9878 5.65492 11.9923 5.73333C11.9974 5.82142 12 5.91045 12 6Z" fill="white"/> +<circle opacity="0.5" cx="3.5" cy="3.5" r="3.5" fill="#F7F7F7"/> +<path d="M5.18363 0.941617L5.17813 0.937617C4.60996 0.404451 3.85665 0.113247 3.0776 0.125623C2.29855 0.137999 1.55487 0.452983 1.00393 1.00393C0.452983 1.55487 0.137999 2.29855 0.125623 3.0776C0.113247 3.85665 0.404451 4.60996 0.937617 5.17813L0.941617 5.18363L0.947117 5.18763C1.51528 5.72079 2.26859 6.012 3.04764 5.99962C3.8267 5.98724 4.57037 5.67226 5.12132 5.12132C5.67226 4.57037 5.98724 3.8267 5.99962 3.04764C6.012 2.26859 5.72079 1.51528 5.18763 0.947117L5.18363 0.941617ZM3.06262 1.06262C3.41853 1.06436 3.76734 1.16232 4.07212 1.34612L1.34612 4.07212C1.16232 3.76734 1.06436 3.41853 1.06262 3.06262C1.06262 2.53219 1.27333 2.02348 1.64841 1.64841C2.02348 1.27333 2.53219 1.06262 3.06262 1.06262V1.06262ZM3.06262 5.06263C2.70671 5.06088 2.3579 4.96293 2.05312 4.77913L4.77913 2.05312C4.96293 2.3579 5.06088 2.70671 5.06263 3.06262C5.06263 3.59306 4.85191 4.10177 4.47684 4.47684C4.10177 4.85191 3.59306 5.06263 3.06262 5.06263V5.06263Z" fill="#ED604B"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя13/СостояниеПользователя13.mdo b/SSL/src/CommonPictures/СостояниеПользователя13/СостояниеПользователя13.mdo new file mode 100644 index 000000000..c67b488b3 --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя13/СостояниеПользователя13.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="a511f7d7-60ef-4a5c-8f8e-ddbee065eccd"> + <name>СостояниеПользователя13</name> + <synonym> + <key>ru</key> + <value>Состояние пользователя 13</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/СостояниеПользователя14/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя14/Picture.svg new file mode 100644 index 000000000..cec5a221a --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя14/Picture.svg @@ -0,0 +1,11 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M4 12C4 10.3431 5.51099 9 7.375 9H9.625C11.489 9 13 10.3431 13 12V14H4V12Z" fill="#3B92C1"/> +<path d="M7 9H10V10.3333C10 10.7015 9.32845 11 8.5 11C7.67155 11 7 10.7015 7 10.3333V9Z" fill="#DCEAF2"/> +<path d="M10 7H7V9H10V7Z" fill="#BB8942"/> +<path d="M12 6C12 6 10.433 6 8.5 6C6.56695 6 5 6 5 6C5 3.79086 6.56695 2 8.5 2C10.433 2 12 3.79086 12 6Z" fill="#110702"/> +<path d="M8.5 8C9.88071 8 11 6.88071 11 5.5C11 4.11929 9.88071 3 8.5 3C7.11929 3 6 4.11929 6 5.5C6 6.88071 7.11929 8 8.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M14 15H3V12C3 10.1597 4.30798 8.719 6 8.20437V7.94949C5.7296 7.67356 5.50453 7.35304 5.33682 7H5.00007L5 6H6.05001C6.125 6.36944 6.28146 6.70929 6.49982 7C6.64208 7.18939 6.81061 7.35792 7 7.50018V9H7.375C7.24825 9 7.12312 9.00621 7 9.01831C6.64745 9.05295 6.31127 9.13585 6 9.25943C4.82137 9.72735 4 10.7784 4 12V14H13V12C13 10.7784 12.1786 9.72735 11 9.25943C10.6887 9.13585 10.3526 9.05295 10 9.01831C9.87687 9.00621 9.75175 9 9.625 9H10V7.50018C10.1894 7.35792 10.3579 7.18939 10.5002 7C10.7185 6.70929 10.875 6.36944 10.95 6H12L12 7H11.664C11.4963 7.35304 11.2704 7.67356 11 7.94949V8.20437C12.692 8.719 14 10.1597 14 12V15ZM12 6C12 5.99994 12 6.00006 12 6L12 7H13V6C13 3.36819 11.1066 1 8.5 1C5.8934 1 4 3.36819 4 6V7H5.00007L5 6C5 6.00006 5 5.99994 5 6C5 5.91045 5.00258 5.82142 5.00765 5.73333C5.01217 5.65492 5.01866 5.57712 5.02708 5.5C5.04565 5.32978 5.07358 5.16288 5.11026 5C5.49879 3.27477 6.8691 2 8.5 2C10.1309 2 11.5012 3.27477 11.8897 5C11.9264 5.16288 11.9543 5.32978 11.9729 5.5C11.9813 5.57712 11.9878 5.65492 11.9923 5.73333C11.9974 5.82142 12 5.91045 12 6Z" fill="white"/> +<path d="M1 2H4L3 3.5L4.5 5.5L4 6H1L0.5 5.5L2 3.5L1 2Z" fill="#CA9713"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M0 1.5C0 0.671573 0.671573 0 1.5 0H3.5C4.32843 0 5 0.671573 5 1.5V1.88197C5 2.45012 4.679 2.96952 4.17082 3.22361L3.44721 3.58541L4.4 4.3C4.77771 4.58328 5 5.02786 5 5.5C5 6.32843 4.32843 7 3.5 7H1.5C0.671573 7 0 6.32843 0 5.5C0 5.02786 0.222291 4.58328 0.6 4.3L1.55279 3.58541L0.829179 3.22361C0.321003 2.96952 0 2.45012 0 1.88197V1.5ZM2.5 4.125L1.2 5.1C1.0741 5.19443 1 5.34262 1 5.5C1 5.77614 1.22386 6 1.5 6H3.5C3.77614 6 4 5.77614 4 5.5C4 5.34262 3.9259 5.19443 3.8 5.1L2.5 4.125ZM2.5 2.94098L3.72361 2.32918C3.893 2.24448 4 2.07135 4 1.88197V1.5C4 1.22386 3.77614 1 3.5 1H1.5C1.22386 1 1 1.22386 1 1.5V1.88197C1 2.07135 1.107 2.24448 1.27639 2.32918L2.5 2.94098Z" fill="#564D3E"/> +<rect x="2" y="2" width="1" height="3" fill="#CA9612"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя14/СостояниеПользователя14.mdo b/SSL/src/CommonPictures/СостояниеПользователя14/СостояниеПользователя14.mdo new file mode 100644 index 000000000..034013046 --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя14/СостояниеПользователя14.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="6fa87b5a-fab0-48b6-b8ab-1aaa8c82d81d"> + <name>СостояниеПользователя14</name> + <synonym> + <key>ru</key> + <value>Состояние пользователя 14</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/СостояниеПользователя15/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя15/Picture.svg new file mode 100644 index 000000000..9fc9137a6 --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя15/Picture.svg @@ -0,0 +1,5 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M5.562 9C4.93708 9.34611 4.41625 9.85327 4.05363 10.4688C3.69102 11.0843 3.49985 11.7856 3.5 12.5V13.5H12.5V12.5C12.5001 11.7856 12.309 11.0843 11.9464 10.4688C11.5838 9.85327 11.0629 9.34611 10.438 9" stroke="#3B92C1" stroke-linecap="round" stroke-linejoin="round"/> +<path d="M10.5 5.125C10.5 3.67525 9.38071 2.5 8 2.5C6.61929 2.5 5.5 3.67525 5.5 5.125V5.875C5.5 7.32475 6.61929 8.5 8 8.5C9.38071 8.5 10.5 7.32475 10.5 5.875V5.125Z" stroke="#3B92C1" stroke-linecap="round" stroke-linejoin="round"/> +<rect x="4" y="12" width="8" height="1" fill="#3B92C1"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя15/СостояниеПользователя15.mdo b/SSL/src/CommonPictures/СостояниеПользователя15/СостояниеПользователя15.mdo new file mode 100644 index 000000000..21beaec34 --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя15/СостояниеПользователя15.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="323ef3df-b1cb-4927-a16e-2dbf11e37ae8"> + <name>СостояниеПользователя15</name> + <synonym> + <key>ru</key> + <value>Состояние пользователя 15</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/СостояниеПользователя16/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя16/Picture.svg new file mode 100644 index 000000000..2361c66c8 --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя16/Picture.svg @@ -0,0 +1,10 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M4 12C4 10.3431 5.51099 9 7.375 9H9.625C11.489 9 13 10.3431 13 12V14H4V12Z" fill="#3DB689"/> +<path d="M7 9H10V10.3333C10 10.7015 9.32845 11 8.5 11C7.67155 11 7 10.7015 7 10.3333V9Z" fill="#DCEAF2"/> +<path d="M10 7H7V9H10V7Z" fill="#BB8942"/> +<path d="M12 6C12 6 10.433 6 8.5 6C6.56695 6 5 6 5 6C5 3.79086 6.56695 2 8.5 2C10.433 2 12 3.79086 12 6Z" fill="#110702"/> +<path d="M8.5 8C9.88071 8 11 6.88071 11 5.5C11 4.11929 9.88071 3 8.5 3C7.11929 3 6 4.11929 6 5.5C6 6.88071 7.11929 8 8.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M14 15H3V12C3 10.1597 4.30798 8.719 6 8.20437V7.94949C5.7296 7.67356 5.50453 7.35304 5.33682 7H5.00007L5 6H6.05001C6.125 6.36944 6.28146 6.70929 6.49982 7C6.64208 7.18939 6.81061 7.35792 7 7.50018V9H7.375C7.24825 9 7.12312 9.00621 7 9.01831C6.64745 9.05295 6.31127 9.13585 6 9.25943C4.82137 9.72735 4 10.7784 4 12V14H13V12C13 10.7784 12.1786 9.72735 11 9.25943C10.6887 9.13585 10.3526 9.05295 10 9.01831C9.87687 9.00621 9.75175 9 9.625 9H10V7.50018C10.1894 7.35792 10.3579 7.18939 10.5002 7C10.7185 6.70929 10.875 6.36944 10.95 6H12L12 7H11.664C11.4963 7.35304 11.2704 7.67356 11 7.94949V8.20437C12.692 8.719 14 10.1597 14 12V15ZM12 6C12 5.99994 12 6.00006 12 6L12 7H13V6C13 3.36819 11.1066 1 8.5 1C5.8934 1 4 3.36819 4 6V7H5.00007L5 6C5 6.00006 5 5.99994 5 6C5 5.91045 5.00258 5.82142 5.00765 5.73333C5.01217 5.65492 5.01866 5.57712 5.02708 5.5C5.04565 5.32978 5.07358 5.16288 5.11026 5C5.49879 3.27477 6.8691 2 8.5 2C10.1309 2 11.5012 3.27477 11.8897 5C11.9264 5.16288 11.9543 5.32978 11.9729 5.5C11.9813 5.57712 11.9878 5.65492 11.9923 5.73333C11.9974 5.82142 12 5.91045 12 6Z" fill="white"/> +<circle opacity="0.5" cx="3.5" cy="3.5" r="3.5" fill="#F7F7F7"/> +<path d="M5.18363 0.941617L5.17813 0.937617C4.60996 0.404451 3.85665 0.113247 3.0776 0.125623C2.29855 0.137999 1.55487 0.452983 1.00393 1.00393C0.452983 1.55487 0.137999 2.29855 0.125623 3.0776C0.113247 3.85665 0.404451 4.60996 0.937617 5.17813L0.941617 5.18363L0.947117 5.18763C1.51528 5.72079 2.26859 6.012 3.04764 5.99962C3.8267 5.98724 4.57037 5.67226 5.12132 5.12132C5.67226 4.57037 5.98724 3.8267 5.99962 3.04764C6.012 2.26859 5.72079 1.51528 5.18763 0.947117L5.18363 0.941617ZM3.06262 1.06262C3.41853 1.06436 3.76734 1.16232 4.07212 1.34612L1.34612 4.07212C1.16232 3.76734 1.06436 3.41853 1.06262 3.06262C1.06262 2.53219 1.27333 2.02348 1.64841 1.64841C2.02348 1.27333 2.53219 1.06262 3.06262 1.06262V1.06262ZM3.06262 5.06263C2.70671 5.06088 2.3579 4.96293 2.05312 4.77913L4.77913 2.05312C4.96293 2.3579 5.06088 2.70671 5.06263 3.06262C5.06263 3.59306 4.85191 4.10177 4.47684 4.47684C4.10177 4.85191 3.59306 5.06263 3.06262 5.06263V5.06263Z" fill="#ED604B"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя16/СостояниеПользователя16.mdo b/SSL/src/CommonPictures/СостояниеПользователя16/СостояниеПользователя16.mdo new file mode 100644 index 000000000..27bf56a49 --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя16/СостояниеПользователя16.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="e1760aea-29e3-4a45-b02a-b2b96cb73ec4"> + <name>СостояниеПользователя16</name> + <synonym> + <key>ru</key> + <value>Состояние пользователя 16</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/СостояниеПользователя17/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя17/Picture.svg new file mode 100644 index 000000000..4ad3715fe --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя17/Picture.svg @@ -0,0 +1,11 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M4 12C4 10.3431 5.51099 9 7.375 9H9.625C11.489 9 13 10.3431 13 12V14H4V12Z" fill="#3DB689"/> +<path d="M7 9H10V10.3333C10 10.7015 9.32845 11 8.5 11C7.67155 11 7 10.7015 7 10.3333V9Z" fill="#DCEAF2"/> +<path d="M10 7H7V9H10V7Z" fill="#BB8942"/> +<path d="M12 6C12 6 10.433 6 8.5 6C6.56695 6 5 6 5 6C5 3.79086 6.56695 2 8.5 2C10.433 2 12 3.79086 12 6Z" fill="#110702"/> +<path d="M8.5 8C9.88071 8 11 6.88071 11 5.5C11 4.11929 9.88071 3 8.5 3C7.11929 3 6 4.11929 6 5.5C6 6.88071 7.11929 8 8.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M14 15H3V12C3 10.1597 4.30798 8.719 6 8.20437V7.94949C5.7296 7.67356 5.50453 7.35304 5.33682 7H5.00007L5 6H6.05001C6.125 6.36944 6.28146 6.70929 6.49982 7C6.64208 7.18939 6.81061 7.35792 7 7.50018V9H7.375C7.24825 9 7.12312 9.00621 7 9.01831C6.64745 9.05295 6.31127 9.13585 6 9.25943C4.82137 9.72735 4 10.7784 4 12V14H13V12C13 10.7784 12.1786 9.72735 11 9.25943C10.6887 9.13585 10.3526 9.05295 10 9.01831C9.87687 9.00621 9.75175 9 9.625 9H10V7.50018C10.1894 7.35792 10.3579 7.18939 10.5002 7C10.7185 6.70929 10.875 6.36944 10.95 6H12L12 7H11.664C11.4963 7.35304 11.2704 7.67356 11 7.94949V8.20437C12.692 8.719 14 10.1597 14 12V15ZM12 6C12 5.99994 12 6.00006 12 6L12 7H13V6C13 3.36819 11.1066 1 8.5 1C5.8934 1 4 3.36819 4 6V7H5.00007L5 6C5 6.00006 5 5.99994 5 6C5 5.91045 5.00258 5.82142 5.00765 5.73333C5.01217 5.65492 5.01866 5.57712 5.02708 5.5C5.04565 5.32978 5.07358 5.16288 5.11026 5C5.49879 3.27477 6.8691 2 8.5 2C10.1309 2 11.5012 3.27477 11.8897 5C11.9264 5.16288 11.9543 5.32978 11.9729 5.5C11.9813 5.57712 11.9878 5.65492 11.9923 5.73333C11.9974 5.82142 12 5.91045 12 6Z" fill="white"/> +<path d="M1 2H4L3 3.5L4.5 5.5L4 6H1L0.5 5.5L2 3.5L1 2Z" fill="#CA9713"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M0 1.5C0 0.671573 0.671573 0 1.5 0H3.5C4.32843 0 5 0.671573 5 1.5V1.88197C5 2.45012 4.679 2.96952 4.17082 3.22361L3.44721 3.58541L4.4 4.3C4.77771 4.58328 5 5.02786 5 5.5C5 6.32843 4.32843 7 3.5 7H1.5C0.671573 7 0 6.32843 0 5.5C0 5.02786 0.222291 4.58328 0.6 4.3L1.55279 3.58541L0.829179 3.22361C0.321003 2.96952 0 2.45012 0 1.88197V1.5ZM2.5 4.125L1.2 5.1C1.0741 5.19443 1 5.34262 1 5.5C1 5.77614 1.22386 6 1.5 6H3.5C3.77614 6 4 5.77614 4 5.5C4 5.34262 3.9259 5.19443 3.8 5.1L2.5 4.125ZM2.5 2.94098L3.72361 2.32918C3.893 2.24448 4 2.07135 4 1.88197V1.5C4 1.22386 3.77614 1 3.5 1H1.5C1.22386 1 1 1.22386 1 1.5V1.88197C1 2.07135 1.107 2.24448 1.27639 2.32918L2.5 2.94098Z" fill="#564D3E"/> +<rect x="2" y="2" width="1" height="3" fill="#CA9612"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя17/СостояниеПользователя17.mdo b/SSL/src/CommonPictures/СостояниеПользователя17/СостояниеПользователя17.mdo new file mode 100644 index 000000000..99a0353fa --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя17/СостояниеПользователя17.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c2b721a7-1e61-4b72-ba75-f4601d52e98a"> + <name>СостояниеПользователя17</name> + <synonym> + <key>ru</key> + <value>Состояние пользователя 17</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/СостояниеПользователя18/Picture.svg b/SSL/src/CommonPictures/СостояниеПользователя18/Picture.svg new file mode 100644 index 000000000..7dd23e3ee --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя18/Picture.svg @@ -0,0 +1,5 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M5.562 9C4.93708 9.34611 4.41625 9.85327 4.05363 10.4688C3.69102 11.0843 3.49985 11.7856 3.5 12.5V13.5H12.5V12.5C12.5001 11.7856 12.309 11.0843 11.9464 10.4688C11.5838 9.85327 11.0629 9.34611 10.438 9" stroke="#3DB689" stroke-linecap="round" stroke-linejoin="round"/> +<path d="M10.5 5.125C10.5 3.67525 9.38071 2.5 8 2.5C6.61929 2.5 5.5 3.67525 5.5 5.125V5.875C5.5 7.32475 6.61929 8.5 8 8.5C9.38071 8.5 10.5 7.32475 10.5 5.875V5.125Z" stroke="#3DB689" stroke-linecap="round" stroke-linejoin="round"/> +<rect x="4" y="12" width="8" height="1" fill="#3DB689"/> +</svg> diff --git a/SSL/src/CommonPictures/СостояниеПользователя18/СостояниеПользователя18.mdo b/SSL/src/CommonPictures/СостояниеПользователя18/СостояниеПользователя18.mdo new file mode 100644 index 000000000..ce615db3d --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеПользователя18/СостояниеПользователя18.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="a4ecd21c-a980-47f8-9944-b1dd7b5a41f3"> + <name>СостояниеПользователя18</name> + <synonym> + <key>ru</key> + <value>Состояние пользователя 18</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/СостоянияПользователей/Picture.svg b/SSL/src/CommonPictures/СостоянияПользователей/Picture.svg new file mode 100644 index 000000000..24f7c3b27 --- /dev/null +++ b/SSL/src/CommonPictures/СостоянияПользователей/Picture.svg @@ -0,0 +1,150 @@ +<svg width="288" height="16" viewBox="0 0 288 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M4 12C4 10.3431 5.51099 9 7.375 9H9.625C11.489 9 13 10.3431 13 12V14H4V12Z" fill="#3B92C1"/> +<path d="M7 9H10V10.3333C10 10.7015 9.32845 11 8.5 11C7.67155 11 7 10.7015 7 10.3333V9Z" fill="#DCEAF2"/> +<path d="M10 7H7V9H10V7Z" fill="#BB8942"/> +<path d="M12 6C12 6 10.433 6 8.5 6C6.56695 6 5 6 5 6C5 3.79086 6.56695 2 8.5 2C10.433 2 12 3.79086 12 6Z" fill="#110702"/> +<path d="M8.5 8C9.88071 8 11 6.88071 11 5.5C11 4.11929 9.88071 3 8.5 3C7.11929 3 6 4.11929 6 5.5C6 6.88071 7.11929 8 8.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M14 15H3V12C3 10.1597 4.30798 8.719 6 8.20437V7.94949C5.7296 7.67356 5.50453 7.35304 5.33682 7H5.00007L5 6H6.05001C6.125 6.36944 6.28146 6.70929 6.49982 7C6.64208 7.18939 6.81061 7.35792 7 7.50018V9H7.375C7.24825 9 7.12312 9.00621 7 9.01831C6.64745 9.05295 6.31127 9.13585 6 9.25943C4.82137 9.72735 4 10.7784 4 12V14H13V12C13 10.7784 12.1786 9.72735 11 9.25943C10.6887 9.13585 10.3526 9.05295 10 9.01831C9.87687 9.00621 9.75175 9 9.625 9H10V7.50018C10.1894 7.35792 10.3579 7.18939 10.5002 7C10.7185 6.70929 10.875 6.36944 10.95 6H12L12 7H11.664C11.4963 7.35304 11.2704 7.67356 11 7.94949V8.20437C12.692 8.719 14 10.1597 14 12V15ZM12 6C12 5.99994 12 6.00006 12 6L12 7H13V6C13 3.36819 11.1066 1 8.5 1C5.8934 1 4 3.36819 4 6V7H5.00007L5 6C5 6.00006 5 5.99994 5 6C5 5.91045 5.00258 5.82142 5.00765 5.73333C5.01217 5.65492 5.01866 5.57712 5.02708 5.5C5.04565 5.32978 5.07358 5.16288 5.11026 5C5.49879 3.27477 6.8691 2 8.5 2C10.1309 2 11.5012 3.27477 11.8897 5C11.9264 5.16288 11.9543 5.32978 11.9729 5.5C11.9813 5.57712 11.9878 5.65492 11.9923 5.73333C11.9974 5.82142 12 5.91045 12 6Z" fill="white"/> +<path opacity="0.7" d="M8 5.5L6.5 7L5.5 5.5L5 4.5L6 3L8 5.5Z" fill="white"/> +<path d="M5.57042 0L3.5 2.11972L1.42958 0L0 1.42958L2.11972 3.5L0 5.57042L1.42958 7L3.5 4.88028L5.57042 7L7 5.57042L4.88028 3.5L7 1.42958L5.57042 0Z" fill="#ED604B"/> +<path d="M20 12C20 10.3431 21.511 9 23.375 9H25.625C27.489 9 29 10.3431 29 12V14H20V12Z" fill="#3B92C1"/> +<path d="M23 9H26V10.3333C26 10.7015 25.3284 11 24.5 11C23.6716 11 23 10.7015 23 10.3333V9Z" fill="#DCEAF2"/> +<path d="M26 7H23V9H26V7Z" fill="#BB8942"/> +<path d="M28 6C28 6 26.433 6 24.5 6C22.5669 6 21 6 21 6C21 3.79086 22.5669 2 24.5 2C26.433 2 28 3.79086 28 6Z" fill="#110702"/> +<path d="M24.5 8C25.8807 8 27 6.88071 27 5.5C27 4.11929 25.8807 3 24.5 3C23.1193 3 22 4.11929 22 5.5C22 6.88071 23.1193 8 24.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M30 15H19V12C19 10.1597 20.308 8.719 22 8.20437V7.94949C21.7296 7.67356 21.5045 7.35304 21.3368 7H21.0001L21 6H22.05C22.125 6.36944 22.2815 6.70929 22.4998 7C22.6421 7.18939 22.8106 7.35792 23 7.50018V9H23.375C23.2482 9 23.1231 9.00621 23 9.01831C22.6474 9.05295 22.3113 9.13585 22 9.25943C20.8214 9.72735 20 10.7784 20 12V14H29V12C29 10.7784 28.1786 9.72735 27 9.25943C26.6887 9.13585 26.3526 9.05295 26 9.01831C25.8769 9.00621 25.7518 9 25.625 9H26V7.50018C26.1894 7.35792 26.3579 7.18939 26.5002 7C26.7185 6.70929 26.875 6.36944 26.95 6H28L28 7H27.664C27.4963 7.35304 27.2704 7.67356 27 7.94949V8.20437C28.692 8.719 30 10.1597 30 12V15ZM28 6C28 5.99994 28 6.00006 28 6L28 7H29V6C29 3.36819 27.1066 1 24.5 1C21.8934 1 20 3.36819 20 6V7H21.0001L21 6C21 6.00006 21 5.99994 21 6C21 5.91045 21.0026 5.82142 21.0077 5.73333C21.0122 5.65492 21.0187 5.57712 21.0271 5.5C21.0456 5.32978 21.0736 5.16288 21.1103 5C21.4988 3.27477 22.8691 2 24.5 2C26.1309 2 27.5012 3.27477 27.8897 5C27.9264 5.16288 27.9543 5.32978 27.9729 5.5C27.9813 5.57712 27.9878 5.65492 27.9923 5.73333C27.9974 5.82142 28 5.91045 28 6Z" fill="white"/> +<rect x="34" y="8" width="12" height="6" fill="#D9D9D9"/> +<path d="M34 8H46V14H34V8Z" fill="#F7DA7D"/> +<path d="M34 7H46V5.5H41L40 4H34V7Z" fill="#FFE069"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M35.9142 4C35.7816 4 35.6544 4.05268 35.5607 4.14645L34.1464 5.56066C34.0527 5.65443 34 5.78161 34 5.91421V13.5C34 13.7761 34.2239 14 34.5 14H45.5C45.7761 14 46 13.7761 46 13.5V6.5C46 6.22386 45.7761 6 45.5 6H41.5C41.0279 6 40.5833 5.77771 40.3 5.4L39.4 4.2C39.3056 4.0741 39.1574 4 39 4H35.9142ZM34.8536 3.43934C35.1349 3.15803 35.5164 3 35.9142 3H39C39.4721 3 39.9167 3.22229 40.2 3.6L41.1 4.8C41.1944 4.9259 41.3426 5 41.5 5H45.5C46.3284 5 47 5.67157 47 6.5V13.5C47 14.3284 46.3284 15 45.5 15H34.5C33.6716 15 33 14.3284 33 13.5V5.91421C33 5.51639 33.158 5.13486 33.4393 4.85355L34.8536 3.43934Z" fill="#BB8744"/> +<path d="M34 7H46V8H34V7Z" fill="#BB8744"/> +<path d="M36 12C36 10.3431 37.511 9 39.375 9H41.625C43.489 9 45 10.3431 45 12V14H36V12Z" fill="#3B92C1"/> +<path d="M39 9H42V10.3333C42 10.7015 41.3284 11 40.5 11C39.6716 11 39 10.7015 39 10.3333V9Z" fill="#DCEAF2"/> +<path d="M42 7H39V9H42V7Z" fill="#BB8942"/> +<path d="M44 6C44 6 42.433 6 40.5 6C38.5669 6 37 6 37 6C37 3.79086 38.5669 2 40.5 2C42.433 2 44 3.79086 44 6Z" fill="#110702"/> +<path d="M40.5 8C41.8807 8 43 6.88071 43 5.5C43 4.11929 41.8807 3 40.5 3C39.1193 3 38 4.11929 38 5.5C38 6.88071 39.1193 8 40.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M46 15H35V12C35 10.1597 36.308 8.719 38 8.20437V7.94949C37.7296 7.67356 37.5045 7.35304 37.3368 7H37.0001L37 6H38.05C38.125 6.36944 38.2815 6.70929 38.4998 7C38.6421 7.18939 38.8106 7.35792 39 7.50018V9H39.375C39.2482 9 39.1231 9.00621 39 9.01831C38.6474 9.05295 38.3113 9.13585 38 9.25943C36.8214 9.72735 36 10.7784 36 12V14H45V12C45 10.7784 44.1786 9.72735 43 9.25943C42.6887 9.13585 42.3526 9.05295 42 9.01831C41.8769 9.00621 41.7518 9 41.625 9H42V7.50018C42.1894 7.35792 42.3579 7.18939 42.5002 7C42.7185 6.70929 42.875 6.36944 42.95 6H44L44 7H43.664C43.4963 7.35304 43.2704 7.67356 43 7.94949V8.20437C44.692 8.719 46 10.1597 46 12V15ZM44 6C44 5.99994 44 6.00006 44 6L44 7H45V6C45 3.36819 43.1066 1 40.5 1C37.8934 1 36 3.36819 36 6V7H37.0001L37 6C37 6.00006 37 5.99994 37 6C37 5.91045 37.0026 5.82142 37.0077 5.73333C37.0122 5.65492 37.0187 5.57712 37.0271 5.5C37.0456 5.32978 37.0736 5.16288 37.1103 5C37.4988 3.27477 38.8691 2 40.5 2C42.1309 2 43.5012 3.27477 43.8897 5C43.9264 5.16288 43.9543 5.32978 43.9729 5.5C43.9813 5.57712 43.9878 5.65492 43.9923 5.73333C43.9974 5.82142 44 5.91045 44 6Z" fill="white"/> +<path opacity="0.7" d="M40 5.5L38.5 7L37.5 5.5L37 4.5L38 3L40 5.5Z" fill="white"/> +<path d="M37.5704 0L35.5 2.11972L33.4296 0L32 1.42958L34.1197 3.5L32 5.57042L33.4296 7L35.5 4.88028L37.5704 7L39 5.57042L36.8803 3.5L39 1.42958L37.5704 0Z" fill="#ED604B"/> +<rect x="50" y="8" width="12" height="6" fill="#D9D9D9"/> +<path d="M50 8H62V14H50V8Z" fill="#F7DA7D"/> +<path d="M50 7H62V5.5H57L56 4H50V7Z" fill="#FFE069"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M51.9142 4C51.7816 4 51.6544 4.05268 51.5607 4.14645L50.1464 5.56066C50.0527 5.65443 50 5.78161 50 5.91421V13.5C50 13.7761 50.2239 14 50.5 14H61.5C61.7761 14 62 13.7761 62 13.5V6.5C62 6.22386 61.7761 6 61.5 6H57.5C57.0279 6 56.5833 5.77771 56.3 5.4L55.4 4.2C55.3056 4.0741 55.1574 4 55 4H51.9142ZM50.8536 3.43934C51.1349 3.15803 51.5164 3 51.9142 3H55C55.4721 3 55.9167 3.22229 56.2 3.6L57.1 4.8C57.1944 4.9259 57.3426 5 57.5 5H61.5C62.3284 5 63 5.67157 63 6.5V13.5C63 14.3284 62.3284 15 61.5 15H50.5C49.6716 15 49 14.3284 49 13.5V5.91421C49 5.51639 49.158 5.13486 49.4393 4.85355L50.8536 3.43934Z" fill="#BB8744"/> +<path d="M50 7H62V8H50V7Z" fill="#BB8744"/> +<path d="M52 12C52 10.3431 53.511 9 55.375 9H57.625C59.489 9 61 10.3431 61 12V14H52V12Z" fill="#3B92C1"/> +<path d="M55 9H58V10.3333C58 10.7015 57.3284 11 56.5 11C55.6716 11 55 10.7015 55 10.3333V9Z" fill="#DCEAF2"/> +<path d="M58 7H55V9H58V7Z" fill="#BB8942"/> +<path d="M60 6C60 6 58.433 6 56.5 6C54.5669 6 53 6 53 6C53 3.79086 54.5669 2 56.5 2C58.433 2 60 3.79086 60 6Z" fill="#110702"/> +<path d="M56.5 8C57.8807 8 59 6.88071 59 5.5C59 4.11929 57.8807 3 56.5 3C55.1193 3 54 4.11929 54 5.5C54 6.88071 55.1193 8 56.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M62 15H51V12C51 10.1597 52.308 8.719 54 8.20437V7.94949C53.7296 7.67356 53.5045 7.35304 53.3368 7H53.0001L53 6H54.05C54.125 6.36944 54.2815 6.70929 54.4998 7C54.6421 7.18939 54.8106 7.35792 55 7.50018V9H55.375C55.2482 9 55.1231 9.00621 55 9.01831C54.6474 9.05295 54.3113 9.13585 54 9.25943C52.8214 9.72735 52 10.7784 52 12V14H61V12C61 10.7784 60.1786 9.72735 59 9.25943C58.6887 9.13585 58.3526 9.05295 58 9.01831C57.8769 9.00621 57.7518 9 57.625 9H58V7.50018C58.1894 7.35792 58.3579 7.18939 58.5002 7C58.7185 6.70929 58.875 6.36944 58.95 6H60L60 7H59.664C59.4963 7.35304 59.2704 7.67356 59 7.94949V8.20437C60.692 8.719 62 10.1597 62 12V15ZM60 6C60 5.99994 60 6.00006 60 6L60 7H61V6C61 3.36819 59.1066 1 56.5 1C53.8934 1 52 3.36819 52 6V7H53.0001L53 6C53 6.00006 53 5.99994 53 6C53 5.91045 53.0026 5.82142 53.0077 5.73333C53.0122 5.65492 53.0187 5.57712 53.0271 5.5C53.0456 5.32978 53.0736 5.16288 53.1103 5C53.4988 3.27477 54.8691 2 56.5 2C58.1309 2 59.5012 3.27477 59.8897 5C59.9264 5.16288 59.9543 5.32978 59.9729 5.5C59.9813 5.57712 59.9878 5.65492 59.9923 5.73333C59.9974 5.82142 60 5.91045 60 6Z" fill="white"/> +<path d="M68 12C68 10.3431 69.511 9 71.375 9H73.625C75.489 9 77 10.3431 77 12V14H68V12Z" fill="#3B92C1"/> +<path d="M71 9H74V10.3333C74 10.7015 73.3284 11 72.5 11C71.6716 11 71 10.7015 71 10.3333V9Z" fill="#DCEAF2"/> +<path d="M74 7H71V9H74V7Z" fill="#BB8942"/> +<path d="M76 6C76 6 74.433 6 72.5 6C70.5669 6 69 6 69 6C69 3.79086 70.5669 2 72.5 2C74.433 2 76 3.79086 76 6Z" fill="#110702"/> +<path d="M72.5 8C73.8807 8 75 6.88071 75 5.5C75 4.11929 73.8807 3 72.5 3C71.1193 3 70 4.11929 70 5.5C70 6.88071 71.1193 8 72.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M78 15H67V12C67 10.1597 68.308 8.719 70 8.20437V7.94949C69.7296 7.67356 69.5045 7.35304 69.3368 7H69.0001L69 6H70.05C70.125 6.36944 70.2815 6.70929 70.4998 7C70.6421 7.18939 70.8106 7.35792 71 7.50018V9H71.375C71.2482 9 71.1231 9.00621 71 9.01831C70.6474 9.05295 70.3113 9.13585 70 9.25943C68.8214 9.72735 68 10.7784 68 12V14H77V12C77 10.7784 76.1786 9.72735 75 9.25943C74.6887 9.13585 74.3526 9.05295 74 9.01831C73.8769 9.00621 73.7518 9 73.625 9H74V7.50018C74.1894 7.35792 74.3579 7.18939 74.5002 7C74.7185 6.70929 74.875 6.36944 74.95 6H76L76 7H75.664C75.4963 7.35304 75.2704 7.67356 75 7.94949V8.20437C76.692 8.719 78 10.1597 78 12V15ZM76 6C76 5.99994 76 6.00006 76 6L76 7H77V6C77 3.36819 75.1066 1 72.5 1C69.8934 1 68 3.36819 68 6V7H69.0001L69 6C69 6.00006 69 5.99994 69 6C69 5.91045 69.0026 5.82142 69.0077 5.73333C69.0122 5.65492 69.0187 5.57712 69.0271 5.5C69.0456 5.32978 69.0736 5.16288 69.1103 5C69.4988 3.27477 70.8691 2 72.5 2C74.1309 2 75.5012 3.27477 75.8897 5C75.9264 5.16288 75.9543 5.32978 75.9729 5.5C75.9813 5.57712 75.9878 5.65492 75.9923 5.73333C75.9974 5.82142 76 5.91045 76 6Z" fill="white"/> +<path d="M66.3095 0.00358324C65.4996 0.00191163 64.7035 0.217664 64 0.629416L64.5318 1.72543C65.0427 1.43028 65.6139 1.26222 66.1996 1.23475C66.43 1.22068 66.6589 1.28021 66.855 1.40514C66.9317 1.46053 66.9935 1.53503 67.0344 1.62166C67.0754 1.70828 67.0942 1.80417 67.0891 1.9003C67.0904 2.08878 67.0331 2.27279 66.9255 2.42556C66.731 2.66217 66.5034 2.8679 66.2502 3.03602C65.9599 3.23549 65.7114 3.49247 65.5192 3.79189C65.3814 4.04733 65.3124 4.33591 65.3195 4.62783V5H66.6116V4.69765C66.6043 4.52656 66.6478 4.35723 66.7364 4.2121C66.9089 4.005 67.1085 3.8233 67.3294 3.67211C67.6894 3.43281 68.0032 3.12725 68.255 2.77083C68.4227 2.48421 68.5074 2.15446 68.4991 1.82023C68.5075 1.56776 68.4583 1.31676 68.3553 1.0873C68.2524 0.857837 68.0985 0.65628 67.9061 0.498741C67.4466 0.14741 66.8817 -0.0277705 66.3095 0.00358324Z" fill="#333333"/> +<path d="M66.0002 9.00046C66.5526 9.00046 67.0005 8.55264 67.0005 8.00023C67.0005 7.44782 66.5526 7 66.0002 7C65.4478 7 65 7.44782 65 8.00023C65 8.55264 65.4478 9.00046 66.0002 9.00046Z" fill="#333333"/> +<path d="M84 12C84 10.3431 85.511 9 87.375 9H89.625C91.489 9 93 10.3431 93 12V14H84V12Z" fill="#3B92C1"/> +<path d="M87 9H90V10.3333C90 10.7015 89.3284 11 88.5 11C87.6716 11 87 10.7015 87 10.3333V9Z" fill="#DCEAF2"/> +<path d="M90 7H87V9H90V7Z" fill="#BB8942"/> +<path d="M92 6C92 6 90.433 6 88.5 6C86.5669 6 85 6 85 6C85 3.79086 86.5669 2 88.5 2C90.433 2 92 3.79086 92 6Z" fill="#110702"/> +<path d="M88.5 8C89.8807 8 91 6.88071 91 5.5C91 4.11929 89.8807 3 88.5 3C87.1193 3 86 4.11929 86 5.5C86 6.88071 87.1193 8 88.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M94 15H83V12C83 10.1597 84.308 8.719 86 8.20437V7.94949C85.7296 7.67356 85.5045 7.35304 85.3368 7H85.0001L85 6H86.05C86.125 6.36944 86.2815 6.70929 86.4998 7C86.6421 7.18939 86.8106 7.35792 87 7.50018V9H87.375C87.2482 9 87.1231 9.00621 87 9.01831C86.6474 9.05295 86.3113 9.13585 86 9.25943C84.8214 9.72735 84 10.7784 84 12V14H93V12C93 10.7784 92.1786 9.72735 91 9.25943C90.6887 9.13585 90.3526 9.05295 90 9.01831C89.8769 9.00621 89.7518 9 89.625 9H90V7.50018C90.1894 7.35792 90.3579 7.18939 90.5002 7C90.7185 6.70929 90.875 6.36944 90.95 6H92L92 7H91.664C91.4963 7.35304 91.2704 7.67356 91 7.94949V8.20437C92.692 8.719 94 10.1597 94 12V15ZM92 6C92 5.99994 92 6.00006 92 6L92 7H93V6C93 3.36819 91.1066 1 88.5 1C85.8934 1 84 3.36819 84 6V7H85.0001L85 6C85 6.00006 85 5.99994 85 6C85 5.91045 85.0026 5.82142 85.0077 5.73333C85.0122 5.65492 85.0187 5.57712 85.0271 5.5C85.0456 5.32978 85.0736 5.16288 85.1103 5C85.4988 3.27477 86.8691 2 88.5 2C90.1309 2 91.5012 3.27477 91.8897 5C91.9264 5.16288 91.9543 5.32978 91.9729 5.5C91.9813 5.57712 91.9878 5.65492 91.9923 5.73333C91.9974 5.82142 92 5.91045 92 6Z" fill="white"/> +<path d="M82.0002 9.00046C82.5526 9.00046 83.0005 8.55264 83.0005 8.00023C83.0005 7.44782 82.5526 7 82.0002 7C81.4478 7 81 7.44782 81 8.00023C81 8.55264 81.4478 9.00046 82.0002 9.00046Z" fill="#ED604B"/> +<rect x="81" width="2" height="5" rx="1" fill="#ED604B"/> +<path d="M100 12C100 10.3431 101.511 9 103.375 9H105.625C107.489 9 109 10.3431 109 12V14H100V12Z" fill="#3DB689"/> +<path d="M103 9H106V10.3333C106 10.7015 105.328 11 104.5 11C103.672 11 103 10.7015 103 10.3333V9Z" fill="#DCEAF2"/> +<path d="M106 7H103V9H106V7Z" fill="#BB8942"/> +<path d="M108 6C108 6 106.433 6 104.5 6C102.567 6 101 6 101 6C101 3.79086 102.567 2 104.5 2C106.433 2 108 3.79086 108 6Z" fill="#110702"/> +<path d="M104.5 8C105.881 8 107 6.88071 107 5.5C107 4.11929 105.881 3 104.5 3C103.119 3 102 4.11929 102 5.5C102 6.88071 103.119 8 104.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M110 15H99V12C99 10.1597 100.308 8.719 102 8.20437V7.94949C101.73 7.67356 101.505 7.35304 101.337 7H101L101 6H102.05C102.125 6.36944 102.281 6.70929 102.5 7C102.642 7.18939 102.811 7.35792 103 7.50018V9H103.375C103.248 9 103.123 9.00621 103 9.01831C102.647 9.05295 102.311 9.13585 102 9.25943C100.821 9.72735 100 10.7784 100 12V14H109V12C109 10.7784 108.179 9.72735 107 9.25943C106.689 9.13585 106.353 9.05295 106 9.01831C105.877 9.00621 105.752 9 105.625 9H106V7.50018C106.189 7.35792 106.358 7.18939 106.5 7C106.719 6.70929 106.875 6.36944 106.95 6H108L108 7H107.664C107.496 7.35304 107.27 7.67356 107 7.94949V8.20437C108.692 8.719 110 10.1597 110 12V15ZM108 6C108 5.99994 108 6.00006 108 6L108 7H109V6C109 3.36819 107.107 1 104.5 1C101.893 1 100 3.36819 100 6V7H101L101 6C101 6.00006 101 5.99994 101 6C101 5.91045 101.003 5.82142 101.008 5.73333C101.012 5.65492 101.019 5.57712 101.027 5.5C101.046 5.32978 101.074 5.16288 101.11 5C101.499 3.27477 102.869 2 104.5 2C106.131 2 107.501 3.27477 107.89 5C107.926 5.16288 107.954 5.32978 107.973 5.5C107.981 5.57712 107.988 5.65492 107.992 5.73333C107.997 5.82142 108 5.91045 108 6Z" fill="white"/> +<path opacity="0.7" d="M104 5.5L102.5 7L101.5 5.5L101 4.5L102 3L104 5.5Z" fill="white"/> +<path d="M101.57 0L99.5 2.11972L97.4296 0L96 1.42958L98.1197 3.5L96 5.57042L97.4296 7L99.5 4.88028L101.57 7L103 5.57042L100.88 3.5L103 1.42958L101.57 0Z" fill="#ED604B"/> +<path d="M116 12C116 10.3431 117.511 9 119.375 9H121.625C123.489 9 125 10.3431 125 12V14H116V12Z" fill="#3DB689"/> +<path d="M119 9H122V10.3333C122 10.7015 121.328 11 120.5 11C119.672 11 119 10.7015 119 10.3333V9Z" fill="#DCEAF2"/> +<path d="M122 7H119V9H122V7Z" fill="#BB8942"/> +<path d="M124 6C124 6 122.433 6 120.5 6C118.567 6 117 6 117 6C117 3.79086 118.567 2 120.5 2C122.433 2 124 3.79086 124 6Z" fill="#110702"/> +<path d="M120.5 8C121.881 8 123 6.88071 123 5.5C123 4.11929 121.881 3 120.5 3C119.119 3 118 4.11929 118 5.5C118 6.88071 119.119 8 120.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M126 15H115V12C115 10.1597 116.308 8.719 118 8.20437V7.94949C117.73 7.67356 117.505 7.35304 117.337 7H117L117 6H118.05C118.125 6.36944 118.281 6.70929 118.5 7C118.642 7.18939 118.811 7.35792 119 7.50018V9H119.375C119.248 9 119.123 9.00621 119 9.01831C118.647 9.05295 118.311 9.13585 118 9.25943C116.821 9.72735 116 10.7784 116 12V14H125V12C125 10.7784 124.179 9.72735 123 9.25943C122.689 9.13585 122.353 9.05295 122 9.01831C121.877 9.00621 121.752 9 121.625 9H122V7.50018C122.189 7.35792 122.358 7.18939 122.5 7C122.719 6.70929 122.875 6.36944 122.95 6H124L124 7H123.664C123.496 7.35304 123.27 7.67356 123 7.94949V8.20437C124.692 8.719 126 10.1597 126 12V15ZM124 6C124 5.99994 124 6.00006 124 6L124 7H125V6C125 3.36819 123.107 1 120.5 1C117.893 1 116 3.36819 116 6V7H117L117 6C117 6.00006 117 5.99994 117 6C117 5.91045 117.003 5.82142 117.008 5.73333C117.012 5.65492 117.019 5.57712 117.027 5.5C117.046 5.32978 117.074 5.16288 117.11 5C117.499 3.27477 118.869 2 120.5 2C122.131 2 123.501 3.27477 123.89 5C123.926 5.16288 123.954 5.32978 123.973 5.5C123.981 5.57712 123.988 5.65492 123.992 5.73333C123.997 5.82142 124 5.91045 124 6Z" fill="white"/> +<rect x="130" y="8" width="12" height="6" fill="#D9D9D9"/> +<path d="M130 8H142V14H130V8Z" fill="#F7DA7D"/> +<path d="M130 7H142V5.5H137L136 4H130V7Z" fill="#FFE069"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M131.914 4C131.782 4 131.654 4.05268 131.561 4.14645L130.146 5.56066C130.053 5.65443 130 5.78161 130 5.91421V13.5C130 13.7761 130.224 14 130.5 14H141.5C141.776 14 142 13.7761 142 13.5V6.5C142 6.22386 141.776 6 141.5 6H137.5C137.028 6 136.583 5.77771 136.3 5.4L135.4 4.2C135.306 4.0741 135.157 4 135 4H131.914ZM130.854 3.43934C131.135 3.15803 131.516 3 131.914 3H135C135.472 3 135.917 3.22229 136.2 3.6L137.1 4.8C137.194 4.9259 137.343 5 137.5 5H141.5C142.328 5 143 5.67157 143 6.5V13.5C143 14.3284 142.328 15 141.5 15H130.5C129.672 15 129 14.3284 129 13.5V5.91421C129 5.51639 129.158 5.13486 129.439 4.85355L130.854 3.43934Z" fill="#BB8744"/> +<path d="M130 7H142V8H130V7Z" fill="#BB8744"/> +<path d="M132 12C132 10.3431 133.511 9 135.375 9H137.625C139.489 9 141 10.3431 141 12V14H132V12Z" fill="#3DB689"/> +<path d="M135 9H138V10.3333C138 10.7015 137.328 11 136.5 11C135.672 11 135 10.7015 135 10.3333V9Z" fill="#DCEAF2"/> +<path d="M138 7H135V9H138V7Z" fill="#BB8942"/> +<path d="M140 6C140 6 138.433 6 136.5 6C134.567 6 133 6 133 6C133 3.79086 134.567 2 136.5 2C138.433 2 140 3.79086 140 6Z" fill="#110702"/> +<path d="M136.5 8C137.881 8 139 6.88071 139 5.5C139 4.11929 137.881 3 136.5 3C135.119 3 134 4.11929 134 5.5C134 6.88071 135.119 8 136.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M142 15H131V12C131 10.1597 132.308 8.719 134 8.20437V7.94949C133.73 7.67356 133.505 7.35304 133.337 7H133L133 6H134.05C134.125 6.36944 134.281 6.70929 134.5 7C134.642 7.18939 134.811 7.35792 135 7.50018V9H135.375C135.248 9 135.123 9.00621 135 9.01831C134.647 9.05295 134.311 9.13585 134 9.25943C132.821 9.72735 132 10.7784 132 12V14H141V12C141 10.7784 140.179 9.72735 139 9.25943C138.689 9.13585 138.353 9.05295 138 9.01831C137.877 9.00621 137.752 9 137.625 9H138V7.50018C138.189 7.35792 138.358 7.18939 138.5 7C138.719 6.70929 138.875 6.36944 138.95 6H140L140 7H139.664C139.496 7.35304 139.27 7.67356 139 7.94949V8.20437C140.692 8.719 142 10.1597 142 12V15ZM140 6C140 5.99994 140 6.00006 140 6L140 7H141V6C141 3.36819 139.107 1 136.5 1C133.893 1 132 3.36819 132 6V7H133L133 6C133 6.00006 133 5.99994 133 6C133 5.91045 133.003 5.82142 133.008 5.73333C133.012 5.65492 133.019 5.57712 133.027 5.5C133.046 5.32978 133.074 5.16288 133.11 5C133.499 3.27477 134.869 2 136.5 2C138.131 2 139.501 3.27477 139.89 5C139.926 5.16288 139.954 5.32978 139.973 5.5C139.981 5.57712 139.988 5.65492 139.992 5.73333C139.997 5.82142 140 5.91045 140 6Z" fill="white"/> +<path opacity="0.7" d="M136 5.5L134.5 7L133.5 5.5L133 4.5L134 3L136 5.5Z" fill="white"/> +<path d="M133.57 0L131.5 2.11972L129.43 0L128 1.42958L130.12 3.5L128 5.57042L129.43 7L131.5 4.88028L133.57 7L135 5.57042L132.88 3.5L135 1.42958L133.57 0Z" fill="#ED604B"/> +<rect x="146" y="8" width="12" height="6" fill="#D9D9D9"/> +<path d="M146 8H158V14H146V8Z" fill="#F7DA7D"/> +<path d="M146 7H158V5.5H153L152 4H146V7Z" fill="#FFE069"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M147.914 4C147.782 4 147.654 4.05268 147.561 4.14645L146.146 5.56066C146.053 5.65443 146 5.78161 146 5.91421V13.5C146 13.7761 146.224 14 146.5 14H157.5C157.776 14 158 13.7761 158 13.5V6.5C158 6.22386 157.776 6 157.5 6H153.5C153.028 6 152.583 5.77771 152.3 5.4L151.4 4.2C151.306 4.0741 151.157 4 151 4H147.914ZM146.854 3.43934C147.135 3.15803 147.516 3 147.914 3H151C151.472 3 151.917 3.22229 152.2 3.6L153.1 4.8C153.194 4.9259 153.343 5 153.5 5H157.5C158.328 5 159 5.67157 159 6.5V13.5C159 14.3284 158.328 15 157.5 15H146.5C145.672 15 145 14.3284 145 13.5V5.91421C145 5.51639 145.158 5.13486 145.439 4.85355L146.854 3.43934Z" fill="#BB8744"/> +<path d="M146 7H158V8H146V7Z" fill="#BB8744"/> +<path d="M148 12C148 10.3431 149.511 9 151.375 9H153.625C155.489 9 157 10.3431 157 12V14H148V12Z" fill="#3DB689"/> +<path d="M151 9H154V10.3333C154 10.7015 153.328 11 152.5 11C151.672 11 151 10.7015 151 10.3333V9Z" fill="#DCEAF2"/> +<path d="M154 7H151V9H154V7Z" fill="#BB8942"/> +<path d="M156 6C156 6 154.433 6 152.5 6C150.567 6 149 6 149 6C149 3.79086 150.567 2 152.5 2C154.433 2 156 3.79086 156 6Z" fill="#110702"/> +<path d="M152.5 8C153.881 8 155 6.88071 155 5.5C155 4.11929 153.881 3 152.5 3C151.119 3 150 4.11929 150 5.5C150 6.88071 151.119 8 152.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M158 15H147V12C147 10.1597 148.308 8.719 150 8.20437V7.94949C149.73 7.67356 149.505 7.35304 149.337 7H149L149 6H150.05C150.125 6.36944 150.281 6.70929 150.5 7C150.642 7.18939 150.811 7.35792 151 7.50018V9H151.375C151.248 9 151.123 9.00621 151 9.01831C150.647 9.05295 150.311 9.13585 150 9.25943C148.821 9.72735 148 10.7784 148 12V14H157V12C157 10.7784 156.179 9.72735 155 9.25943C154.689 9.13585 154.353 9.05295 154 9.01831C153.877 9.00621 153.752 9 153.625 9H154V7.50018C154.189 7.35792 154.358 7.18939 154.5 7C154.719 6.70929 154.875 6.36944 154.95 6H156L156 7H155.664C155.496 7.35304 155.27 7.67356 155 7.94949V8.20437C156.692 8.719 158 10.1597 158 12V15ZM156 6C156 5.99994 156 6.00006 156 6L156 7H157V6C157 3.36819 155.107 1 152.5 1C149.893 1 148 3.36819 148 6V7H149L149 6C149 6.00006 149 5.99994 149 6C149 5.91045 149.003 5.82142 149.008 5.73333C149.012 5.65492 149.019 5.57712 149.027 5.5C149.046 5.32978 149.074 5.16288 149.11 5C149.499 3.27477 150.869 2 152.5 2C154.131 2 155.501 3.27477 155.89 5C155.926 5.16288 155.954 5.32978 155.973 5.5C155.981 5.57712 155.988 5.65492 155.992 5.73333C155.997 5.82142 156 5.91045 156 6Z" fill="white"/> +<path d="M164 12C164 10.3431 165.511 9 167.375 9H169.625C171.489 9 173 10.3431 173 12V14H164V12Z" fill="#3DB689"/> +<path d="M167 9H170V10.3333C170 10.7015 169.328 11 168.5 11C167.672 11 167 10.7015 167 10.3333V9Z" fill="#DCEAF2"/> +<path d="M170 7H167V9H170V7Z" fill="#BB8942"/> +<path d="M172 6C172 6 170.433 6 168.5 6C166.567 6 165 6 165 6C165 3.79086 166.567 2 168.5 2C170.433 2 172 3.79086 172 6Z" fill="#110702"/> +<path d="M168.5 8C169.881 8 171 6.88071 171 5.5C171 4.11929 169.881 3 168.5 3C167.119 3 166 4.11929 166 5.5C166 6.88071 167.119 8 168.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M174 15H163V12C163 10.1597 164.308 8.719 166 8.20437V7.94949C165.73 7.67356 165.505 7.35304 165.337 7H165L165 6H166.05C166.125 6.36944 166.281 6.70929 166.5 7C166.642 7.18939 166.811 7.35792 167 7.50018V9H167.375C167.248 9 167.123 9.00621 167 9.01831C166.647 9.05295 166.311 9.13585 166 9.25943C164.821 9.72735 164 10.7784 164 12V14H173V12C173 10.7784 172.179 9.72735 171 9.25943C170.689 9.13585 170.353 9.05295 170 9.01831C169.877 9.00621 169.752 9 169.625 9H170V7.50018C170.189 7.35792 170.358 7.18939 170.5 7C170.719 6.70929 170.875 6.36944 170.95 6H172L172 7H171.664C171.496 7.35304 171.27 7.67356 171 7.94949V8.20437C172.692 8.719 174 10.1597 174 12V15ZM172 6C172 5.99994 172 6.00006 172 6L172 7H173V6C173 3.36819 171.107 1 168.5 1C165.893 1 164 3.36819 164 6V7H165L165 6C165 6.00006 165 5.99994 165 6C165 5.91045 165.003 5.82142 165.008 5.73333C165.012 5.65492 165.019 5.57712 165.027 5.5C165.046 5.32978 165.074 5.16288 165.11 5C165.499 3.27477 166.869 2 168.5 2C170.131 2 171.501 3.27477 171.89 5C171.926 5.16288 171.954 5.32978 171.973 5.5C171.981 5.57712 171.988 5.65492 171.992 5.73333C171.997 5.82142 172 5.91045 172 6Z" fill="white"/> +<path d="M162.309 0.00358324C161.5 0.00191163 160.703 0.217664 160 0.629416L160.532 1.72543C161.043 1.43028 161.614 1.26222 162.2 1.23475C162.43 1.22068 162.659 1.28021 162.855 1.40514C162.932 1.46053 162.993 1.53503 163.034 1.62166C163.075 1.70828 163.094 1.80417 163.089 1.9003C163.09 2.08878 163.033 2.27279 162.926 2.42556C162.731 2.66217 162.503 2.8679 162.25 3.03602C161.96 3.23549 161.711 3.49247 161.519 3.79189C161.381 4.04733 161.312 4.33591 161.32 4.62783V5H162.612V4.69765C162.604 4.52656 162.648 4.35723 162.736 4.2121C162.909 4.005 163.108 3.8233 163.329 3.67211C163.689 3.43281 164.003 3.12725 164.255 2.77083C164.423 2.48421 164.507 2.15446 164.499 1.82023C164.508 1.56776 164.458 1.31676 164.355 1.0873C164.252 0.857837 164.099 0.65628 163.906 0.498741C163.447 0.14741 162.882 -0.0277705 162.309 0.00358324Z" fill="#333333"/> +<path d="M162 9.00046C162.553 9.00046 163 8.55264 163 8.00023C163 7.44782 162.553 7 162 7C161.448 7 161 7.44782 161 8.00023C161 8.55264 161.448 9.00046 162 9.00046Z" fill="#333333"/> +<path d="M180 12C180 10.3431 181.511 9 183.375 9H185.625C187.489 9 189 10.3431 189 12V14H180V12Z" fill="#3DB689"/> +<path d="M183 9H186V10.3333C186 10.7015 185.328 11 184.5 11C183.672 11 183 10.7015 183 10.3333V9Z" fill="#DCEAF2"/> +<path d="M186 7H183V9H186V7Z" fill="#BB8942"/> +<path d="M188 6C188 6 186.433 6 184.5 6C182.567 6 181 6 181 6C181 3.79086 182.567 2 184.5 2C186.433 2 188 3.79086 188 6Z" fill="#110702"/> +<path d="M184.5 8C185.881 8 187 6.88071 187 5.5C187 4.11929 185.881 3 184.5 3C183.119 3 182 4.11929 182 5.5C182 6.88071 183.119 8 184.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M190 15H179V12C179 10.1597 180.308 8.719 182 8.20437V7.94949C181.73 7.67356 181.505 7.35304 181.337 7H181L181 6H182.05C182.125 6.36944 182.281 6.70929 182.5 7C182.642 7.18939 182.811 7.35792 183 7.50018V9H183.375C183.248 9 183.123 9.00621 183 9.01831C182.647 9.05295 182.311 9.13585 182 9.25943C180.821 9.72735 180 10.7784 180 12V14H189V12C189 10.7784 188.179 9.72735 187 9.25943C186.689 9.13585 186.353 9.05295 186 9.01831C185.877 9.00621 185.752 9 185.625 9H186V7.50018C186.189 7.35792 186.358 7.18939 186.5 7C186.719 6.70929 186.875 6.36944 186.95 6H188L188 7H187.664C187.496 7.35304 187.27 7.67356 187 7.94949V8.20437C188.692 8.719 190 10.1597 190 12V15ZM188 6C188 5.99994 188 6.00006 188 6L188 7H189V6C189 3.36819 187.107 1 184.5 1C181.893 1 180 3.36819 180 6V7H181L181 6C181 6.00006 181 5.99994 181 6C181 5.91045 181.003 5.82142 181.008 5.73333C181.012 5.65492 181.019 5.57712 181.027 5.5C181.046 5.32978 181.074 5.16288 181.11 5C181.499 3.27477 182.869 2 184.5 2C186.131 2 187.501 3.27477 187.89 5C187.926 5.16288 187.954 5.32978 187.973 5.5C187.981 5.57712 187.988 5.65492 187.992 5.73333C187.997 5.82142 188 5.91045 188 6Z" fill="white"/> +<path d="M178 9.00046C178.553 9.00046 179 8.55264 179 8.00023C179 7.44782 178.553 7 178 7C177.448 7 177 7.44782 177 8.00023C177 8.55264 177.448 9.00046 178 9.00046Z" fill="#ED604B"/> +<rect x="177" width="2" height="5" rx="1" fill="#ED604B"/> +<path d="M196 12C196 10.3431 197.511 9 199.375 9H201.625C203.489 9 205 10.3431 205 12V14H196V12Z" fill="#3B92C1"/> +<path d="M199 9H202V10.3333C202 10.7015 201.328 11 200.5 11C199.672 11 199 10.7015 199 10.3333V9Z" fill="#DCEAF2"/> +<path d="M202 7H199V9H202V7Z" fill="#BB8942"/> +<path d="M204 6C204 6 202.433 6 200.5 6C198.567 6 197 6 197 6C197 3.79086 198.567 2 200.5 2C202.433 2 204 3.79086 204 6Z" fill="#110702"/> +<path d="M200.5 8C201.881 8 203 6.88071 203 5.5C203 4.11929 201.881 3 200.5 3C199.119 3 198 4.11929 198 5.5C198 6.88071 199.119 8 200.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M206 15H195V12C195 10.1597 196.308 8.719 198 8.20437V7.94949C197.73 7.67356 197.505 7.35304 197.337 7H197L197 6H198.05C198.125 6.36944 198.281 6.70929 198.5 7C198.642 7.18939 198.811 7.35792 199 7.50018V9H199.375C199.248 9 199.123 9.00621 199 9.01831C198.647 9.05295 198.311 9.13585 198 9.25943C196.821 9.72735 196 10.7784 196 12V14H205V12C205 10.7784 204.179 9.72735 203 9.25943C202.689 9.13585 202.353 9.05295 202 9.01831C201.877 9.00621 201.752 9 201.625 9H202V7.50018C202.189 7.35792 202.358 7.18939 202.5 7C202.719 6.70929 202.875 6.36944 202.95 6H204L204 7H203.664C203.496 7.35304 203.27 7.67356 203 7.94949V8.20437C204.692 8.719 206 10.1597 206 12V15ZM204 6C204 5.99994 204 6.00006 204 6L204 7H205V6C205 3.36819 203.107 1 200.5 1C197.893 1 196 3.36819 196 6V7H197L197 6C197 6.00006 197 5.99994 197 6C197 5.91045 197.003 5.82142 197.008 5.73333C197.012 5.65492 197.019 5.57712 197.027 5.5C197.046 5.32978 197.074 5.16288 197.11 5C197.499 3.27477 198.869 2 200.5 2C202.131 2 203.501 3.27477 203.89 5C203.926 5.16288 203.954 5.32978 203.973 5.5C203.981 5.57712 203.988 5.65492 203.992 5.73333C203.997 5.82142 204 5.91045 204 6Z" fill="white"/> +<circle opacity="0.5" cx="195.5" cy="3.5" r="3.5" fill="#F7F7F7"/> +<path d="M197.184 0.941617L197.178 0.937617C196.61 0.404451 195.857 0.113247 195.078 0.125623C194.299 0.137999 193.555 0.452983 193.004 1.00393C192.453 1.55487 192.138 2.29855 192.126 3.0776C192.113 3.85665 192.404 4.60996 192.938 5.17813L192.942 5.18363L192.947 5.18763C193.515 5.72079 194.269 6.012 195.048 5.99962C195.827 5.98724 196.57 5.67226 197.121 5.12132C197.672 4.57037 197.987 3.8267 198 3.04764C198.012 2.26859 197.721 1.51528 197.188 0.947117L197.184 0.941617ZM195.063 1.06262C195.419 1.06436 195.767 1.16232 196.072 1.34612L193.346 4.07212C193.162 3.76734 193.064 3.41853 193.063 3.06262C193.063 2.53219 193.273 2.02348 193.648 1.64841C194.023 1.27333 194.532 1.06262 195.063 1.06262V1.06262ZM195.063 5.06263C194.707 5.06088 194.358 4.96293 194.053 4.77913L196.779 2.05312C196.963 2.3579 197.061 2.70671 197.063 3.06262C197.063 3.59306 196.852 4.10177 196.477 4.47684C196.102 4.85191 195.593 5.06263 195.063 5.06263V5.06263Z" fill="#ED604B"/> +<path d="M244 12C244 10.3431 245.511 9 247.375 9H249.625C251.489 9 253 10.3431 253 12V14H244V12Z" fill="#3DB689"/> +<path d="M247 9H250V10.3333C250 10.7015 249.328 11 248.5 11C247.672 11 247 10.7015 247 10.3333V9Z" fill="#DCEAF2"/> +<path d="M250 7H247V9H250V7Z" fill="#BB8942"/> +<path d="M252 6C252 6 250.433 6 248.5 6C246.567 6 245 6 245 6C245 3.79086 246.567 2 248.5 2C250.433 2 252 3.79086 252 6Z" fill="#110702"/> +<path d="M248.5 8C249.881 8 251 6.88071 251 5.5C251 4.11929 249.881 3 248.5 3C247.119 3 246 4.11929 246 5.5C246 6.88071 247.119 8 248.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M254 15H243V12C243 10.1597 244.308 8.719 246 8.20437V7.94949C245.73 7.67356 245.505 7.35304 245.337 7H245L245 6H246.05C246.125 6.36944 246.281 6.70929 246.5 7C246.642 7.18939 246.811 7.35792 247 7.50018V9H247.375C247.248 9 247.123 9.00621 247 9.01831C246.647 9.05295 246.311 9.13585 246 9.25943C244.821 9.72735 244 10.7784 244 12V14H253V12C253 10.7784 252.179 9.72735 251 9.25943C250.689 9.13585 250.353 9.05295 250 9.01831C249.877 9.00621 249.752 9 249.625 9H250V7.50018C250.189 7.35792 250.358 7.18939 250.5 7C250.719 6.70929 250.875 6.36944 250.95 6H252L252 7H251.664C251.496 7.35304 251.27 7.67356 251 7.94949V8.20437C252.692 8.719 254 10.1597 254 12V15ZM252 6C252 5.99994 252 6.00006 252 6L252 7H253V6C253 3.36819 251.107 1 248.5 1C245.893 1 244 3.36819 244 6V7H245L245 6C245 6.00006 245 5.99994 245 6C245 5.91045 245.003 5.82142 245.008 5.73333C245.012 5.65492 245.019 5.57712 245.027 5.5C245.046 5.32978 245.074 5.16288 245.11 5C245.499 3.27477 246.869 2 248.5 2C250.131 2 251.501 3.27477 251.89 5C251.926 5.16288 251.954 5.32978 251.973 5.5C251.981 5.57712 251.988 5.65492 251.992 5.73333C251.997 5.82142 252 5.91045 252 6Z" fill="white"/> +<circle opacity="0.5" cx="243.5" cy="3.5" r="3.5" fill="#F7F7F7"/> +<path d="M245.184 0.941617L245.178 0.937617C244.61 0.404451 243.857 0.113247 243.078 0.125623C242.299 0.137999 241.555 0.452983 241.004 1.00393C240.453 1.55487 240.138 2.29855 240.126 3.0776C240.113 3.85665 240.404 4.60996 240.938 5.17813L240.942 5.18363L240.947 5.18763C241.515 5.72079 242.269 6.012 243.048 5.99962C243.827 5.98724 244.57 5.67226 245.121 5.12132C245.672 4.57037 245.987 3.8267 246 3.04764C246.012 2.26859 245.721 1.51528 245.188 0.947117L245.184 0.941617ZM243.063 1.06262C243.419 1.06436 243.767 1.16232 244.072 1.34612L241.346 4.07212C241.162 3.76734 241.064 3.41853 241.063 3.06262C241.063 2.53219 241.273 2.02348 241.648 1.64841C242.023 1.27333 242.532 1.06262 243.063 1.06262V1.06262ZM243.063 5.06263C242.707 5.06088 242.358 4.96293 242.053 4.77913L244.779 2.05312C244.963 2.3579 245.061 2.70671 245.063 3.06262C245.063 3.59306 244.852 4.10177 244.477 4.47684C244.102 4.85191 243.593 5.06263 243.063 5.06263V5.06263Z" fill="#ED604B"/> +<path d="M212 12C212 10.3431 213.511 9 215.375 9H217.625C219.489 9 221 10.3431 221 12V14H212V12Z" fill="#3B92C1"/> +<path d="M215 9H218V10.3333C218 10.7015 217.328 11 216.5 11C215.672 11 215 10.7015 215 10.3333V9Z" fill="#DCEAF2"/> +<path d="M218 7H215V9H218V7Z" fill="#BB8942"/> +<path d="M220 6C220 6 218.433 6 216.5 6C214.567 6 213 6 213 6C213 3.79086 214.567 2 216.5 2C218.433 2 220 3.79086 220 6Z" fill="#110702"/> +<path d="M216.5 8C217.881 8 219 6.88071 219 5.5C219 4.11929 217.881 3 216.5 3C215.119 3 214 4.11929 214 5.5C214 6.88071 215.119 8 216.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M222 15H211V12C211 10.1597 212.308 8.719 214 8.20437V7.94949C213.73 7.67356 213.505 7.35304 213.337 7H213L213 6H214.05C214.125 6.36944 214.281 6.70929 214.5 7C214.642 7.18939 214.811 7.35792 215 7.50018V9H215.375C215.248 9 215.123 9.00621 215 9.01831C214.647 9.05295 214.311 9.13585 214 9.25943C212.821 9.72735 212 10.7784 212 12V14H221V12C221 10.7784 220.179 9.72735 219 9.25943C218.689 9.13585 218.353 9.05295 218 9.01831C217.877 9.00621 217.752 9 217.625 9H218V7.50018C218.189 7.35792 218.358 7.18939 218.5 7C218.719 6.70929 218.875 6.36944 218.95 6H220L220 7H219.664C219.496 7.35304 219.27 7.67356 219 7.94949V8.20437C220.692 8.719 222 10.1597 222 12V15ZM220 6C220 5.99994 220 6.00006 220 6L220 7H221V6C221 3.36819 219.107 1 216.5 1C213.893 1 212 3.36819 212 6V7H213L213 6C213 6.00006 213 5.99994 213 6C213 5.91045 213.003 5.82142 213.008 5.73333C213.012 5.65492 213.019 5.57712 213.027 5.5C213.046 5.32978 213.074 5.16288 213.11 5C213.499 3.27477 214.869 2 216.5 2C218.131 2 219.501 3.27477 219.89 5C219.926 5.16288 219.954 5.32978 219.973 5.5C219.981 5.57712 219.988 5.65492 219.992 5.73333C219.997 5.82142 220 5.91045 220 6Z" fill="white"/> +<path d="M209 2H212L211 3.5L212.5 5.5L212 6H209L208.5 5.5L210 3.5L209 2Z" fill="#CA9713"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M208 1.5C208 0.671573 208.672 0 209.5 0H211.5C212.328 0 213 0.671573 213 1.5V1.88197C213 2.45012 212.679 2.96952 212.171 3.22361L211.447 3.58541L212.4 4.3C212.778 4.58328 213 5.02786 213 5.5C213 6.32843 212.328 7 211.5 7H209.5C208.672 7 208 6.32843 208 5.5C208 5.02786 208.222 4.58328 208.6 4.3L209.553 3.58541L208.829 3.22361C208.321 2.96952 208 2.45012 208 1.88197V1.5ZM210.5 4.125L209.2 5.1C209.074 5.19443 209 5.34262 209 5.5C209 5.77614 209.224 6 209.5 6H211.5C211.776 6 212 5.77614 212 5.5C212 5.34262 211.926 5.19443 211.8 5.1L210.5 4.125ZM210.5 2.94098L211.724 2.32918C211.893 2.24448 212 2.07135 212 1.88197V1.5C212 1.22386 211.776 1 211.5 1H209.5C209.224 1 209 1.22386 209 1.5V1.88197C209 2.07135 209.107 2.24448 209.276 2.32918L210.5 2.94098Z" fill="#564D3E"/> +<rect x="210" y="2" width="1" height="3" fill="#CA9612"/> +<path d="M260 12C260 10.3431 261.511 9 263.375 9H265.625C267.489 9 269 10.3431 269 12V14H260V12Z" fill="#3DB689"/> +<path d="M263 9H266V10.3333C266 10.7015 265.328 11 264.5 11C263.672 11 263 10.7015 263 10.3333V9Z" fill="#DCEAF2"/> +<path d="M266 7H263V9H266V7Z" fill="#BB8942"/> +<path d="M268 6C268 6 266.433 6 264.5 6C262.567 6 261 6 261 6C261 3.79086 262.567 2 264.5 2C266.433 2 268 3.79086 268 6Z" fill="#110702"/> +<path d="M264.5 8C265.881 8 267 6.88071 267 5.5C267 4.11929 265.881 3 264.5 3C263.119 3 262 4.11929 262 5.5C262 6.88071 263.119 8 264.5 8Z" fill="#ECB968"/> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M270 15H259V12C259 10.1597 260.308 8.719 262 8.20437V7.94949C261.73 7.67356 261.505 7.35304 261.337 7H261L261 6H262.05C262.125 6.36944 262.281 6.70929 262.5 7C262.642 7.18939 262.811 7.35792 263 7.50018V9H263.375C263.248 9 263.123 9.00621 263 9.01831C262.647 9.05295 262.311 9.13585 262 9.25943C260.821 9.72735 260 10.7784 260 12V14H269V12C269 10.7784 268.179 9.72735 267 9.25943C266.689 9.13585 266.353 9.05295 266 9.01831C265.877 9.00621 265.752 9 265.625 9H266V7.50018C266.189 7.35792 266.358 7.18939 266.5 7C266.719 6.70929 266.875 6.36944 266.95 6H268L268 7H267.664C267.496 7.35304 267.27 7.67356 267 7.94949V8.20437C268.692 8.719 270 10.1597 270 12V15ZM268 6C268 5.99994 268 6.00006 268 6L268 7H269V6C269 3.36819 267.107 1 264.5 1C261.893 1 260 3.36819 260 6V7H261L261 6C261 6.00006 261 5.99994 261 6C261 5.91045 261.003 5.82142 261.008 5.73333C261.012 5.65492 261.019 5.57712 261.027 5.5C261.046 5.32978 261.074 5.16288 261.11 5C261.499 3.27477 262.869 2 264.5 2C266.131 2 267.501 3.27477 267.89 5C267.926 5.16288 267.954 5.32978 267.973 5.5C267.981 5.57712 267.988 5.65492 267.992 5.73333C267.997 5.82142 268 5.91045 268 6Z" fill="white"/> +<path d="M257 2H260L259 3.5L260.5 5.5L260 6H257L256.5 5.5L258 3.5L257 2Z" fill="#CA9713"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M256 1.5C256 0.671573 256.672 0 257.5 0H259.5C260.328 0 261 0.671573 261 1.5V1.88197C261 2.45012 260.679 2.96952 260.171 3.22361L259.447 3.58541L260.4 4.3C260.778 4.58328 261 5.02786 261 5.5C261 6.32843 260.328 7 259.5 7H257.5C256.672 7 256 6.32843 256 5.5C256 5.02786 256.222 4.58328 256.6 4.3L257.553 3.58541L256.829 3.22361C256.321 2.96952 256 2.45012 256 1.88197V1.5ZM258.5 4.125L257.2 5.1C257.074 5.19443 257 5.34262 257 5.5C257 5.77614 257.224 6 257.5 6H259.5C259.776 6 260 5.77614 260 5.5C260 5.34262 259.926 5.19443 259.8 5.1L258.5 4.125ZM258.5 2.94098L259.724 2.32918C259.893 2.24448 260 2.07135 260 1.88197V1.5C260 1.22386 259.776 1 259.5 1H257.5C257.224 1 257 1.22386 257 1.5V1.88197C257 2.07135 257.107 2.24448 257.276 2.32918L258.5 2.94098Z" fill="#564D3E"/> +<rect x="258" y="2" width="1" height="3" fill="#CA9612"/> +<path d="M229.562 9C228.937 9.34611 228.416 9.85327 228.054 10.4688C227.691 11.0843 227.5 11.7856 227.5 12.5V13.5H236.5V12.5C236.5 11.7856 236.309 11.0843 235.946 10.4688C235.584 9.85327 235.063 9.34611 234.438 9" stroke="#3B92C1" stroke-linecap="round" stroke-linejoin="round"/> +<path d="M234.5 5.125C234.5 3.67525 233.381 2.5 232 2.5C230.619 2.5 229.5 3.67525 229.5 5.125V5.875C229.5 7.32475 230.619 8.5 232 8.5C233.381 8.5 234.5 7.32475 234.5 5.875V5.125Z" stroke="#3B92C1" stroke-linecap="round" stroke-linejoin="round"/> +<rect x="228" y="12" width="8" height="1" fill="#3B92C1"/> +<path d="M277.562 9C276.937 9.34611 276.416 9.85327 276.054 10.4688C275.691 11.0843 275.5 11.7856 275.5 12.5V13.5H284.5V12.5C284.5 11.7856 284.309 11.0843 283.946 10.4688C283.584 9.85327 283.063 9.34611 282.438 9" stroke="#3DB689" stroke-linecap="round" stroke-linejoin="round"/> +<path d="M282.5 5.125C282.5 3.67525 281.381 2.5 280 2.5C278.619 2.5 277.5 3.67525 277.5 5.125V5.875C277.5 7.32475 278.619 8.5 280 8.5C281.381 8.5 282.5 7.32475 282.5 5.875V5.125Z" stroke="#3DB689" stroke-linecap="round" stroke-linejoin="round"/> +<rect x="276" y="12" width="8" height="1" fill="#3DB689"/> +</svg> diff --git a/SSL/src/CommonPictures/СостоянияПользователей/Picture.zip b/SSL/src/CommonPictures/СостоянияПользователей/Picture.zip deleted file mode 100644 index c46000413157b94bddec1a690841d29512080fc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49741 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 Ze_DAd(EqGI08roW01yD6vFktD{{tK?e)s?Y diff --git a/SSL/src/CommonPictures/ТипыСертификатов/Picture.png b/SSL/src/CommonPictures/ТипыСертификатов/Picture.png index 125c845ab8ec21c762a9f89fd45e892cae1b2b99..16fa3f8e85b01973ba4951964b5383bfe1bf1134 100644 GIT binary patch literal 2701 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 Kz^B|RD*c~9S2{=l delta 1111 zcmV-d1gQIs72OCSiBL{Q4GJ0x0000DNk~Le0001x0000G2nGNE0QvUzV38pge*gh< zQb$4nuFf3k00004XF*Lt006O%3;baP000B>Nkl<ZcmeHLJxo(k6h5~C35p4c0S$2| z3r0#pO^B;7l4t}MT?jQWu+a{z(9R6NP9lWK!MNaLBAPfDAmJy#z+j6SqGbSrltJ3( zciMaF<MG~WYhU42`z5FEzH{&Cf4TScJNKSjq6#Xgpn?i2C`$-(2yJa`S|Q^%Ha5=r z_W68KA%xe?PSdp5=H_NIxeS-Qe&u@=(hG?}dLS>PJ_4Dv&>82DT?hQ6=h)iXI_B|s zg3|vC^dU8-iX4PlP|RQzYz`iO2luO|*%)#uE_wY-D*lm~AYG6#NC2`Uf7_E5x-$Sl zBJlA5%}#y?p(glynK+c$aDpJz;nvnxnEO5CB5-!8pjic($C#<5tU$a{$Jw?oC1|5d zgELQw(sAZt9{VgZkR?SC>sMexbjtRud~c`Bu4JV<111K1e9)-^5Z-m3L%2N)f(@%q zM|YrNQRLB7R0bBBd8L5Ee@8Q~Ee7eQ%$mC_bOk|@C<|8+$blM&0~D2Qm2F`<pMiQ^ z8cYljBn<zZQWYSXd2((fGcRm(y5jfO&nJ`gs=YlbGCN>QfOtPWo~e7Qs|S<=Y+sj3 z4Ic>+tRt$AL${Dh(Y&V7G38$W^($BCO-sx0&6=7Xd4@*k_V(yge<IQQ_TYePofYK@ z!t2rNvi?&-1bF^&_<aX?1byG>=@fj9@%r)HG0xpp1ai0rax?>tnWw<PzouymPd({s zz$?{WO^7h`J?QVUBayPlcz>PLHA49N?&C)s1(Eb5GOnNPza$cLtENVOBzyZB8mQys zWM%Q_D0Y}kMx=fUfAU(kBS!zKfNK<jo<YEvg}JJ#E|91m<mrd+dgJ^ZB~YO^5hEO^ z0Ukr%%eGmznP#9F5G>owQ%4zRE(gD9VuIr1<8->aOVv$H)G#tayP=RDI}_JXmVWH) zDHNiI_#t0vn&tZ0{%&n8S=lf8e6x4f*TZu7jFi0m^Zc)-e^NmtGm|q&7Y!ysv82iq zs)$~oKf6GHGRGN9*hZHHA7T0;8grk-`@X)wHWu33IJO{Kw7XkNEG=nY2L{s5&v<A3 zM+n&<mp%8p+1|1Lfy|)DlkfGm9RCN}))Az(ql0cwPt&)-K{{Dp&W>qWTNB0DKS6z^ zU|j!2__wonf7LZ!)j-^~BApBW2a53rZ~HffhSI_3XBFNVaV_TtT#&uV`fcqs+5flx zbJ>@KK)jRak1lSrE|;AHHPD3v^WmFax@P!3I-1VhA9yx$4MLeS)o%Uy*c-;j3b6;{ zW~qqz=dv&95%xbIid)Pt+*Z)^n{=-p3t@W;D|dTWEgfOyh-L)08bQWQCZe``e)4;+ d;QtHuzX3iSI87?C9#Q}R002ovPDHLkV1lY%5Ptvw diff --git a/SSL/src/CommonPictures/Факс/Picture.zip b/SSL/src/CommonPictures/Факс/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..6641148bb5eb0e56d60b8f27d757cc80905319dc GIT binary patch literal 6313 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 b1^h#^AFDQ;>`PP+pddVX2tqkCe7X7$JW33x literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/Факс/Факс.mdo b/SSL/src/CommonPictures/Факс/Факс.mdo new file mode 100644 index 000000000..d9e724940 --- /dev/null +++ b/SSL/src/CommonPictures/Факс/Факс.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="12d19666-e996-4b55-b43c-b3a541f849a7"> + <name>Факс</name> + <synonym> + <key>ru</key> + <value>Факс</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/ЦветГраницы/Picture.svg b/SSL/src/CommonPictures/ЦветГраницы/Picture.svg new file mode 100644 index 000000000..e91013499 --- /dev/null +++ b/SSL/src/CommonPictures/ЦветГраницы/Picture.svg @@ -0,0 +1,6 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M4.12492 10.8603L5.12735 7.18471L10.6204 1.69231L13.2929 4.3648L7.80051 9.85787L4.12492 10.8603ZM4.06 11.0983L4.06003 11.0982L4.06 11.0983Z" fill="#53768F" stroke="#356587"/> +<path d="M6.04643 6.26604L6.61655 8.04508L6.69508 8.29012L6.94011 8.36864L8.71915 8.93876L7.8005 9.85784L4.12492 10.8603L5.12735 7.18469L6.04643 6.26604ZM3.88682 10.9252C3.88693 10.9252 3.88704 10.9252 3.88714 10.9251L3.88691 10.9252L3.88682 10.9252Z" fill="#D8AF69" stroke="#897759"/> +<path d="M3.83486 10.1861C4.0556 9.96532 4.41349 9.96532 4.63422 10.1861V10.1861C4.85496 10.4068 4.85496 10.7647 4.63422 10.9854L4.01933 11.6003C3.79859 11.821 3.44071 11.821 3.21997 11.6003V11.6003C2.99924 11.3796 2.99924 11.0217 3.21997 10.8009L3.83486 10.1861Z" fill="#5C5342"/> +<rect x="2" y="13" width="12" height="2" fill="#6E6E6E"/> +</svg> diff --git a/SSL/src/CommonPictures/ЦветГраницы/ЦветГраницы.mdo b/SSL/src/CommonPictures/ЦветГраницы/ЦветГраницы.mdo new file mode 100644 index 000000000..25b02cdcb --- /dev/null +++ b/SSL/src/CommonPictures/ЦветГраницы/ЦветГраницы.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="61cfdc9a-49c3-4316-b38d-997910cf25c3"> + <name>ЦветГраницы</name> + <synonym> + <key>ru</key> + <value>Цвет границы</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/ЭлектроннаяПочта/Picture.zip b/SSL/src/CommonPictures/ЭлектроннаяПочта/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..1b27e5cdd0d0c0097984fe14399abd95cb8d750f GIT binary patch literal 9350 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 N@?02{8s~3U{{zHwtylm6 literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ЭлектроннаяПочта/ЭлектроннаяПочта.mdo b/SSL/src/CommonPictures/ЭлектроннаяПочта/ЭлектроннаяПочта.mdo new file mode 100644 index 000000000..826bc5c72 --- /dev/null +++ b/SSL/src/CommonPictures/ЭлектроннаяПочта/ЭлектроннаяПочта.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="594c79fa-0fdc-41d5-b122-04615dca3752"> + <name>ЭлектроннаяПочта</name> + <synonym> + <key>ru</key> + <value>Электронная почта</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/ЯндексКарты/Picture.svg b/SSL/src/CommonPictures/ЯндексКарты/Picture.svg new file mode 100644 index 000000000..4f296179b --- /dev/null +++ b/SSL/src/CommonPictures/ЯндексКарты/Picture.svg @@ -0,0 +1 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8 1C4.6862 1 2 3.6862 2 7C2 8.6563 2.6711 10.156 3.7565 11.2417C4.8422 12.328 7.4 13.9 7.55 15.55C7.57249 15.7974 7.7516 16 8 16C8.2484 16 8.42751 15.7974 8.45 15.55C8.6 13.9 11.1578 12.328 12.2435 11.2417C13.3289 10.156 14 8.6563 14 7C14 3.6862 11.3138 1 8 1Z" fill="#FF4433"/><path d="M8.00002 9.10015C9.15982 9.10015 10.1 8.15994 10.1 7.00015C10.1 5.84035 9.15982 4.90015 8.00002 4.90015C6.84023 4.90015 5.90002 5.84035 5.90002 7.00015C5.90002 8.15994 6.84023 9.10015 8.00002 9.10015Z" fill="white"/></svg> diff --git a/SSL/src/CommonPictures/ЯндексКарты/Picture.zip b/SSL/src/CommonPictures/ЯндексКарты/Picture.zip deleted file mode 100644 index e6aad3fa5f6592134d59c797159cacabe43b45e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10389 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 D6<p{y diff --git a/SSL/src/CommonTemplates/ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen/Template.htmldoc b/SSL/src/CommonTemplates/ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen/Template.htmldoc new file mode 100644 index 000000000..1621f1d23 --- /dev/null +++ b/SSL/src/CommonTemplates/ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen/Template.htmldoc @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<htmldoc:HtmlDocument xmlns:htmldoc="http://g5.1c.ru/v8/dt/html-document"> + <pages lang="ru"/> +</htmldoc:HtmlDocument> diff --git a/SSL/src/CommonTemplates/ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen/ru.html b/SSL/src/CommonTemplates/ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen/ru.html new file mode 100644 index 000000000..d616543af --- /dev/null +++ b/SSL/src/CommonTemplates/ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen/ru.html @@ -0,0 +1,156 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><style type="text/css"> + .thinclient { + display: none + } + + .Text { + orphans: 2; + widows: 2; + font-variant-ligatures: normal; + } + + .boldText { + font-weight: bold; + orphans: 2; + widows: 2; + font-variant-ligatures: normal; + } + + .bigPic { + border: currentColor; + border-image: none; + } + + .tdtab { + width: 30px; + text-align: center; + font-size: x-large; + } +</style><meta http-equiv="content-type" content="text/html;charset=utf-8"></meta></head><body style="font-family:Arial, Helvetica, sans-serif;"> + <p style="text-align: center;"> + </p><table width="100%" border="0"><tbody><tr><td height="30"> + <img class="bigPic" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANMAAAB4CAYAAABo3Mf0AAAACXBIWXMAAAsTAAALEwEAmpwYAAA/l2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDg4LCAyMDIwLzA3LzEwLTIyOjA2OjUzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczppbGx1c3RyYXRvcj0iaHR0cDovL25zLmFkb2JlLmNvbS9pbGx1c3RyYXRvci8xLjAvIiB4bWxuczpwZGY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGRmLzEuMy8iIHhtbG5zOnhtcFRQZz0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3QvcGcvIiB4bWxuczpzdERpbT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL0RpbWVuc2lvbnMjIiB4bWxuczpzdEZudD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL0ZvbnQjIiB4bWxuczp4bXBHPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvZy8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHhtcDpNZXRhZGF0YURhdGU9IjIwMjItMDYtMDdUMTM6MTA6MjcrMDM6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA2LTA3VDEzOjEwOjI3KzAzOjAwIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMi0wNi0wN1QxMzowODozOSswNDowMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBJbGx1c3RyYXRvciAyNi4zIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowODZhMDJjZi1iMTg3LTcxNDYtYmY2Yi1iM2IyY2NjMTgzOGQiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo0ZTNiNzA5OS0xZmExLTczNDItYThlMC02NTY3N2M1NTU0MDEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0idXVpZDo1RDIwODkyNDkzQkZEQjExOTE0QTg1OTBEMzE1MDhDOCIgeG1wTU06UmVuZGl0aW9uQ2xhc3M9InByb29mOnBkZiIgaWxsdXN0cmF0b3I6U3RhcnR1cFByb2ZpbGU9IlByaW50IiBpbGx1c3RyYXRvcjpDcmVhdG9yU3ViVG9vbD0iQUlSb2JpbiIgaWxsdXN0cmF0b3I6VHlwZT0iRG9jdW1lbnQiIHBkZjpQcm9kdWNlcj0iQWRvYmUgUERGIGxpYnJhcnkgMTYuMDciIHhtcFRQZzpOUGFnZXM9IjEiIHhtcFRQZzpIYXNWaXNpYmxlVHJhbnNwYXJlbmN5PSJUcnVlIiB4bXBUUGc6SGFzVmlzaWJsZU92ZXJwcmludD0iRmFsc2UiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSI+IDxkYzp0aXRsZT4gPHJkZjpBbHQ+IDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+MjAyMl8wNl/QmNC90YHRgtGA0YPQutGG0LjRjyDQtNC70Y8g0J/QnzwvcmRmOmxpPiA8L3JkZjpBbHQ+IDwvZGM6dGl0bGU+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjc0NmQ1NDYyLTQ5NWYtZjU0Yy05MGRmLTAzZDNkMTc0MmE5MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NDZkNTQ2Mi00OTVmLWY1NGMtOTBkZi0wM2QzZDE3NDJhOTEiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0idXVpZDo1RDIwODkyNDkzQkZEQjExOTE0QTg1OTBEMzE1MDhDOCIgc3RSZWY6cmVuZGl0aW9uQ2xhc3M9InByb29mOnBkZiIvPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDplZWI2Y2Q0NC02ZTYzLWRjNGEtYWZhMi04NTdiMmU2YWFhZDYiIHN0RXZ0OndoZW49IjIwMjItMDMtMThUMTc6NDU6MTMrMDM6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIElsbHVzdHJhdG9yIDI2LjEgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MjRiMzJmMy1kMzU1LWExNGMtOTMwYi03NDEwNDgxYjBhZWYiIHN0RXZ0OndoZW49IjIwMjItMDYtMDdUMTI6NTk6MzgrMDM6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIElsbHVzdHJhdG9yIDI2LjMgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gYXBwbGljYXRpb24vcGRmIHRvIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjc0NmQ1NDYyLTQ5NWYtZjU0Yy05MGRmLTAzZDNkMTc0MmE5MSIgc3RFdnQ6d2hlbj0iMjAyMi0wNi0wN1QxMzoxMDoyNyswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gYXBwbGljYXRpb24vcGRmIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iZGVyaXZlZCIgc3RFdnQ6cGFyYW1ldGVycz0iY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjA4NmEwMmNmLWIxODctNzE0Ni1iZjZiLWIzYjJjY2MxODM4ZCIgc3RFdnQ6d2hlbj0iMjAyMi0wNi0wN1QxMzoxMDoyNyswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8eG1wVFBnOk1heFBhZ2VTaXplIHN0RGltOnc9IjIxMS4wMDAwMDAiIHN0RGltOmg9IjEyMC4wMDAwMDAiIHN0RGltOnVuaXQ9IlBpeGVscyIvPiA8eG1wVFBnOkZvbnRzPiA8cmRmOkJhZz4gPHJkZjpsaSBzdEZudDpmb250TmFtZT0iQXJpYWwtQm9sZE1UIiBzdEZudDpmb250RmFtaWx5PSJBcmlhbCBNVCIgc3RGbnQ6Zm9udEZhY2U9IkJvbGQiIHN0Rm50OmZvbnRUeXBlPSJPcGVuIFR5cGUiIHN0Rm50OnZlcnNpb25TdHJpbmc9IjAwMS4wMDEiIHN0Rm50OmNvbXBvc2l0ZT0iRmFsc2UiIHN0Rm50OmZvbnRGaWxlTmFtZT0iQXJpYWwtQm9sZE1ULm90ZiIvPiA8cmRmOmxpIHN0Rm50OmZvbnROYW1lPSJBcmlhbE1UIiBzdEZudDpmb250RmFtaWx5PSJBcmlhbCIgc3RGbnQ6Zm9udEZhY2U9IlJlZ3VsYXIiIHN0Rm50OmZvbnRUeXBlPSJPcGVuIFR5cGUiIHN0Rm50OnZlcnNpb25TdHJpbmc9IlZlcnNpb24gNy4wMCIgc3RGbnQ6Y29tcG9zaXRlPSJGYWxzZSIgc3RGbnQ6Zm9udEZpbGVOYW1lPSJhcmlhbC50dGYiLz4gPC9yZGY6QmFnPiA8L3htcFRQZzpGb250cz4gPHhtcFRQZzpQbGF0ZU5hbWVzPiA8cmRmOlNlcT4gPHJkZjpsaT5DeWFuPC9yZGY6bGk+IDxyZGY6bGk+TWFnZW50YTwvcmRmOmxpPiA8cmRmOmxpPlllbGxvdzwvcmRmOmxpPiA8cmRmOmxpPkJsYWNrPC9yZGY6bGk+IDwvcmRmOlNlcT4gPC94bXBUUGc6UGxhdGVOYW1lcz4gPHhtcFRQZzpTd2F0Y2hHcm91cHM+IDxyZGY6U2VxPiA8cmRmOmxpPiA8cmRmOkRlc2NyaXB0aW9uIHhtcEc6Z3JvdXBOYW1lPSJEZWZhdWx0IFN3YXRjaCBHcm91cCIgeG1wRzpncm91cFR5cGU9IjAiPiA8eG1wRzpDb2xvcmFudHM+IDxyZGY6U2VxPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iV2hpdGUiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJCbGFjayIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIwLjAwMDAwMCIgeG1wRzpibGFjaz0iMTAwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQ01ZSyBSZWQiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIxMDAuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQ01ZSyBZZWxsb3ciIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMTAwLjAwMDAwMCIgeG1wRzpibGFjaz0iMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkNNWUsgR3JlZW4iIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjEwMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIxMDAuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQ01ZSyBDeWFuIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIxMDAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDTVlLIEJsdWUiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjEwMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMTAwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQ01ZSyBNYWdlbnRhIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIxMDAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTE1IE09MTAwIFk9OTAgSz0xMCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMTUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwMC4wMDAwMDAiIHhtcEc6eWVsbG93PSI5MC4wMDAwMDAiIHhtcEc6YmxhY2s9IjEwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09OTAgWT04NSBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjkwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9Ijg1LjAwMDAwMCIgeG1wRzpibGFjaz0iMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MCBNPTgwIFk9OTUgSz0wIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSI4MC4wMDAwMDAiIHhtcEc6eWVsbG93PSI5NS4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT01MCBZPTEwMCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjUwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT0zNSBZPTg1IEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMzUuMDAwMDAwIiB4bXBHOnllbGxvdz0iODUuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz01IE09MCBZPTkwIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iNS4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSI5MC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTIwIE09MCBZPTEwMCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTUwIE09MCBZPTEwMCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjUwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTc1IE09MCBZPTEwMCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49Ijc1LjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTg1IE09MTAgWT0xMDAgSz0xMCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iODUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjEwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz05MCBNPTMwIFk9OTUgSz0zMCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iOTAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjMwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9Ijk1LjAwMDAwMCIgeG1wRzpibGFjaz0iMzAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTc1IE09MCBZPTc1IEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iNzUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iNzUuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz04MCBNPTEwIFk9NDUgSz0wIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI4MC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMTAuMDAwMDAwIiB4bXBHOnllbGxvdz0iNDUuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz03MCBNPTE1IFk9MCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjcwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIxNS4wMDAwMDAiIHhtcEc6eWVsbG93PSIwLjAwMDAwMCIgeG1wRzpibGFjaz0iMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9ODUgTT01MCBZPTAgSz0wIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI4NS4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNTAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTEwMCBNPTk1IFk9NSBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjEwMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iOTUuMDAwMDAwIiB4bXBHOnllbGxvdz0iNS4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTEwMCBNPTEwMCBZPTI1IEs9MjUiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjEwMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMTAwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjI1LjAwMDAwMCIgeG1wRzpibGFjaz0iMjUuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTc1IE09MTAwIFk9MCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49Ijc1LjAwMDAwMCIgeG1wRzptYWdlbnRhPSIxMDAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTUwIE09MTAwIFk9MCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjUwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIxMDAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTM1IE09MTAwIFk9MzUgSz0xMCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMzUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIzNS4wMDAwMDAiIHhtcEc6YmxhY2s9IjEwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0xMCBNPTEwMCBZPTUwIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMTAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwMC4wMDAwMDAiIHhtcEc6eWVsbG93PSI1MC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT05NSBZPTIwIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iOTUuMDAwMDAwIiB4bXBHOnllbGxvdz0iMjAuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0yNSBNPTI1IFk9NDAgSz0wIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIyNS4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMjUuMDAwMDAwIiB4bXBHOnllbGxvdz0iNDAuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz00MCBNPTQ1IFk9NTAgSz01IiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI0MC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNDUuMDAwMDAwIiB4bXBHOnllbGxvdz0iNTAuMDAwMDAwIiB4bXBHOmJsYWNrPSI1LjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz01MCBNPTUwIFk9NjAgSz0yNSIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iNTAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjUwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjYwLjAwMDAwMCIgeG1wRzpibGFjaz0iMjUuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTU1IE09NjAgWT02NSBLPTQwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI1NS4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iNjUuMDAwMDAwIiB4bXBHOmJsYWNrPSI0MC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MjUgTT00MCBZPTY1IEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMjUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjQwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjY1LjAwMDAwMCIgeG1wRzpibGFjaz0iMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MzAgTT01MCBZPTc1IEs9MTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjMwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSI1MC4wMDAwMDAiIHhtcEc6eWVsbG93PSI3NS4wMDAwMDAiIHhtcEc6YmxhY2s9IjEwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0zNSBNPTYwIFk9ODAgSz0yNSIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMzUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjYwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjgwLjAwMDAwMCIgeG1wRzpibGFjaz0iMjUuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTQwIE09NjUgWT05MCBLPTM1IiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI0MC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNjUuMDAwMDAwIiB4bXBHOnllbGxvdz0iOTAuMDAwMDAwIiB4bXBHOmJsYWNrPSIzNS4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9NDAgTT03MCBZPTEwMCBLPTUwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI0MC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNzAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMTAwLjAwMDAwMCIgeG1wRzpibGFjaz0iNTAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTUwIE09NzAgWT04MCBLPTcwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI1MC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNzAuMDAwMDAwIiB4bXBHOnllbGxvdz0iODAuMDAwMDAwIiB4bXBHOmJsYWNrPSI3MC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9NCBNPTEgWT00OCBLPTAgMSIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMy44NDIyMjIiIHhtcEc6bWFnZW50YT0iMS4zNTUwMDEiIHhtcEc6eWVsbG93PSI0Ny41MTY1OTMiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTIgTT0xIFk9MSBLPTAgMSIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMi4zMDEwNjAiIHhtcEc6bWFnZW50YT0iMS4zMTgzNzkiIHhtcEc6eWVsbG93PSIwLjY2ODM0NSIgeG1wRzpibGFjaz0iMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MzEgTT0yNCBZPTI1IEs9MCAxIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIzMC42OTUwNDgiIHhtcEc6bWFnZW50YT0iMjQuMTg4NjAwIiB4bXBHOnllbGxvdz0iMjQuNzc3NTk5IiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iUj0xMzMgRz0xMzcgQj0xNDAiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzp0aW50PSIxMDAuMDAwMDAwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6Y3lhbj0iNTAuNTk3Mzg4IiB4bXBHOm1hZ2VudGE9IjQwLjAyNzQ2MyIgeG1wRzp5ZWxsb3c9IjM4LjY2OTQxMCIgeG1wRzpibGFjaz0iMy45ODU2NTYiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9NCBNPTIgWT05NCBLPTAgMSIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iNC4wNzExMDciIHhtcEc6bWFnZW50YT0iMS45NjUzNjIiIHhtcEc6eWVsbG93PSI5My44ODcyMzQiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTkgTT0xMSBZPTk5IEs9MCAxIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI4LjcwMDY5NCIgeG1wRzptYWdlbnRhPSIxMC43NDU0MDMiIHhtcEc6eWVsbG93PSI5OC43MTgyMzgiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTM1IE09MzMgWT0xMDAgSz00IDEiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjM0LjkxODc0MyIgeG1wRzptYWdlbnRhPSIzMi42MTE1NzkiIHhtcEc6eWVsbG93PSIxMDAuMDAwMDAwIiB4bXBHOmJsYWNrPSI0LjQ0NjQ3OSIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz02NiBNPTU5IFk9NTggSz00MCAxIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI2Ni4wNDg2NzYiIHhtcEc6bWFnZW50YT0iNTguOTg5ODUzIiB4bXBHOnllbGxvdz0iNTcuNjY4NDE4IiB4bXBHOmJsYWNrPSIzOS41NDgzMzEiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9NDQgTT0zNiBZPTM3IEs9MSAxIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI0My43MjAxNDciIHhtcEc6bWFnZW50YT0iMzYuMzI4Njc5IiB4bXBHOnllbGxvdz0iMzYuNTUxNDYxIiB4bXBHOmJsYWNrPSIxLjQ5ODQzNiIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz00IE09MyBZPTIgSz0wIDEiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjMuNjgwNDc2IiB4bXBHOm1hZ2VudGE9IjIuNTY5NjE5IiB4bXBHOnllbGxvdz0iMi4wNjkxMjMiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDwvcmRmOlNlcT4gPC94bXBHOkNvbG9yYW50cz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOmxpPiA8cmRmOmxpPiA8cmRmOkRlc2NyaXB0aW9uIHhtcEc6Z3JvdXBOYW1lPSJHcmF5cyIgeG1wRzpncm91cFR5cGU9IjEiPiA8eG1wRzpDb2xvcmFudHM+IDxyZGY6U2VxPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MCBZPTAgSz0xMDAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjEwMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MCBNPTAgWT0wIEs9OTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9Ijg5Ljk5OTQwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MCBZPTAgSz04MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIwLjAwMDAwMCIgeG1wRzpibGFjaz0iNzkuOTk4ODAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT0wIFk9MCBLPTcwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAwMDAwIiB4bXBHOmJsYWNrPSI2OS45OTk3MDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MCBNPTAgWT0wIEs9NjAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjU5Ljk5OTEwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MCBZPTAgSz01MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIwLjAwMDAwMCIgeG1wRzpibGFjaz0iNTAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT0wIFk9MCBLPTQwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAwMDAwIiB4bXBHOmJsYWNrPSIzOS45OTk0MDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MCBNPTAgWT0wIEs9MzAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjI5Ljk5ODgwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MCBZPTAgSz0yMCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIwLjAwMDAwMCIgeG1wRzpibGFjaz0iMTkuOTk5NzAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT0wIFk9MCBLPTEwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAwMDAwIiB4bXBHOmJsYWNrPSI5Ljk5OTEwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MCBZPTAgSz01IiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAwMDAwIiB4bXBHOmJsYWNrPSI0Ljk5ODgwMCIvPiA8L3JkZjpTZXE+IDwveG1wRzpDb2xvcmFudHM+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpsaT4gPHJkZjpsaT4gPHJkZjpEZXNjcmlwdGlvbiB4bXBHOmdyb3VwTmFtZT0iQnJpZ2h0cyIgeG1wRzpncm91cFR5cGU9IjEiPiA8eG1wRzpDb2xvcmFudHM+IDxyZGY6U2VxPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MTAwIFk9MTAwIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMTAwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT03NSBZPTEwMCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9Ijc1LjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT0xMCBZPTk1IEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMTAuMDAwMDAwIiB4bXBHOnllbGxvdz0iOTUuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz04NSBNPTEwIFk9MTAwIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iODUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTEwMCBNPTkwIFk9MCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjEwMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iOTAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTYwIE09OTAgWT0wIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iNjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjkwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAzMTAwIiB4bXBHOmJsYWNrPSIwLjAwMzEwMCIvPiA8L3JkZjpTZXE+IDwv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"></img></td> + <td class="tdtab"> + </td> + <td class="tdtab"> + <span class="Text">1.</span> + </td> + + <td height="30"> + + <span class="Text">Нажмите кнопку </span> + <span class="boldText">Открыть редактор</span><span class="Text">.</span> + </td> + </tr><tr><td height="30"> + <br></td> + <td class="tdtab"> + </td> + <td class="tdtab"> + </td> + + <td height="30"> + <br></td> + </tr><tr><td height="30"> + <img class="bigPic" src="data:image/png;base64,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"></img></td> + <td class="tdtab"> + </td> + <td class="tdtab"> + 2. + </td> + + <td height="30"> + <span class="Text">Расположите окна программы 1С и редактора макета рядом с + помощью клавиш</span> + + <img class="bigPic" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAAZCAYAAACCXybJAAAACXBIWXMAAAsSAAALEgHS3X78AAAE20lEQVRYhbWY3U4bRxTH//thm+AAxg3gEprepKWJiviKCr2oVKnKG0RK1d5V6kWlPEKlPEKlKFJeIZXCA6Q3BVop6k1Lr4DQiAQwtinY3vXau+v9imbWNrv27HqB9ZHGO56ZPXN+83Hm7HCO46BUKjmGacI0TVimiUEK6U9tNDCayeDjW7cCezo9PYOqabBMA5ZlhVpUrZSRGc/2tVpTVfz16hV48ocXRAi8CEEQwfPCQKFJx5qmo1QoBrfRdTgAREGAIMZjk67rNM3euQORFPA87yoXeAwPD1+5gyAhs1xXFGi6Bp7jQtu6NgmQJAlnZ6due44D10m8J0/ayXCbdLcBfc+2LDqYmt50oYkIAg/bBmzyM0ARE0k64olEom8nZOX1B26nYOD2++3ZFr2dOA5Jg4U2TQPNphEJmkgcwOS/7Zh0WxHxQdu2Bcd2rgS1t7sNpV7H4tI9NrTRcpRRu4kBmOM5urVI6oEmwJYd7imJvHm9i3Q6Tbw+tra2UCwWIcsyJEXptPnxBxvzS8s977Y7jkodBzCpA859iA/acizmnv73n7/x28uXOPn/FLrRpGUfTU/T5+HxMdNY23GYutrQ5/BRoP3Ae7s7tO6zu3cjAXfqWNC25cCyeg3d3dntgetnMoFi6bLb0JGQ0QHeXF/H4eEhjosFNA0DI+k0Njf/8E5gK+v+Tk1O4uH337nvd+nscmQ23dcMBBZVqLFkq7B0XW6mOXyxsoJsdhxDQykc5fOYmZ7GItk+nIvJeR0egPT16x1gd+B4NrRt2fQ8CzLUV9bHWLq8Q3R5df65sYG1tTX88uRJIDSBWFhawuLycvQl3Qbu7GsGtAMHNuPISg0N9ZQNpVIYGxtDvlDwlU9ks0ilUpiYmGDqcuCHfvHrc2xv76BSreLZ06eYm5vDvdXVHuiLOK1uYJ7McvCetuhsd0t2fBw3cx/6Sqcmp+izuxytlU+cGEtXe1uEHY3eujiAaV2Q93YCPG4+n0e+WOgqdQ3LF9kx9EmphA9u3GAw+2EfPPyWLu9yuYyfHj2iZSRcPIeOAZgLWd5kOTIjMpYfY6J64di6Onvao+Hz+XmMjI4x9cQD7OaZ0K7HDd6HF5GgVcNyZJlMBpnFhT7QVwAOC07IEcMyNJfLIZlI0PPRY33oEDhkT8canFwe2C0PhGYHFHPzCzQReb2zA01Tab6hus+aoqBWr/veIb6IpavNGpE5FmChM9sMaG9QHiSfzM76alZWv+zkjw4O0GjU8XZ/HzdnZtjn+4VnOgZg3h+TMSKyy39aTs/M0OftT92BYeq64AdHHMCdiI0FbQeEjnGK2YrSorrGWIBbn5ZMaBJJqWpjYMBNvQlZlugFAsfzEd4g93fu/dhVgMll55v/9ujFpygmzqHJXZRSq0GWJJQrFTQa8cMnkkkkk0k66qlksm/7SrkMqVJFuXxGbdI0jdnOMMJvYkRRpP2S/snAUOhC/ohe4UhSFVVZHggw6K2J0Tl3c1O5wHZJUcSJoqBSqVCbJFkOBI7UL7nWbn2FvdvfB733BvD1xvrGA3IU6c3zEJAlAi+ooyOjeVZdRarc7m8Ch/S1a2ff3L//e1irWk2ZOnj39itFUaA2VBimQY1v38378raVtEyrSe7HaTItmJbp5j2JxA4/P3784j3Wub3y9kYZkQAAAABJRU5ErkJggg=="></img><span class="Text"> и </span> + <img class="bigPic" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAAZCAYAAACCXybJAAAACXBIWXMAAAsSAAALEgHS3X78AAAE10lEQVRYhbWYW2/cRBTH/76sNwk0bErT3SSbRLSBkKpp2lJBeCDc1G9QqTwj8YDUj4DUj4BUVUIC8Q5S857yApGCKiFI06emXJQ2dJvdkLX34qzt9Q3NeC92dux1Gu9Isx7PjM+c35wzlz2c67oolUquaVmwLAu2ZWGQiYynNRoYzWQwOzMTOtLBQRmarsO2TNi2HalRRZGRGTvdV2tN0/DbgwfgyQsviBB4EYIggueFgULrmgZdN1DaK4b3MQy4AERBgCAmo5NhGGgaBuYXFiCSCp7nPeECj5GRkRMPEJaIlQ9VFbqhg+e4yL6eTgKq1SrK5QOvP8eB62TeVyb9avC6HO0D+p1j23QySRbbgwgCD8cBHPIzwCSmJDrrqVSq7yDE8/oDt3M4cPt7Mq5hNLvQaFmC5EEmyzLRbJqxoKnFEwAm745r0WVFUgCaWNl1Tgb9cPN3+rxy9Rqz3TJbG2XcYRIA5nguYNCgpR0XthO9U5L0aPMPZLNZsutja2sLxWIR+/8dwDCbnT5ffO5g6eo7Pd92PSkedRLApA3o7iEBaNu1mWv60cNN/HT/fgBsenKSPv998YKprOO6TFlt6LjL6LjAv25sYHp6Bm+cO9cB7kwGC9qxXdh2r6JPtp/0wPVTmUCxZDlt6FjI6AH+/rtv/a1+A9LiQVmmhkmnJOSnJrGwsIAPP/4kIPPIRubAYbo3Q8U+liJLhSXr5SzdzSsrK+DQclmO63C339fW1vCq42J2dgbnz8/h3eVlOnE8x7OhHduh51mYooG6PspS946Q5Ze5sb6O1dVVfH3nTh9o4O0LFyLX8MVLl7ptLU/h+dYEsaBduHDcXpdMDw311GXPnqXPwt5epy4/MdEpj4+PM2W5CELf+/EHPH68DaVSwTd372JxcRHXlpcZ0PE3raPA5InwNW1Tax9Np8fGMJWbCNQOpb2J8Nf7HYJsYixZ7U5RR6O/LQlg2ha2e7shO26hUEChuHek1lOsUGTfofdLJbx+5gyDOQh74+Zn1L1lWcaXt27ROnJV7EInAMy1jy0GtHc5CbdOL3J4IpsiS1ZnTfskXFxawqnR15iykgH2ykxoamnmOjx+CpXF2MgymQwyVy73gT4BcNTlhBwxLPfO5XKQUik0TdOvfeREECsnezl5eWDyzoe7N/tCsbh0mWaS/tzehq5rGBoahqzItK6uqqgfHga+IXsRS1abNe7/miSAhY61GdBx/mW9OT8feH9v+f1O+fnuLhqNQzzd2cFUPs8+349t6QSAI89pl+2ScdNkPk97zr3lTQxT1jH/cCQBTN99Invcm30NTS5ZrVta3M0xEWAu6FkB6HQ6DU1rDAy4aTRRq1VpAIHj+RhfkPidFx87CTAJdv7z91808CmKqS50tVKBWq+jVq1CVhQ0GsnDpyQJkiTRWU9LUt/+iiyjqlQgy2Wqk67rzH6mGR2JEUWRjkvGJxNBofcKz2kIp1qtoFKrDQQYNGpids7dXDYX2k8SReyrKhRFoTqRoF8YcKxxSVi79S/s2c4OaNwbwEfrv6zfIEeR0exeAVlJ4AVt9NRogdWmVJW5/ipweGV4uPzp9es/R/Wq19Xs7rOnH6iqCq2hwbRMqnw7Nh8oO7ZkW3aTxMdptmxYtuWVfZncHb66ffve/7lzuBFUo4ttAAAAAElFTkSuQmCC"></img><span class="Text">.</span> + </td> + </tr><tr><td height="30"> + <br></td> + <td class="tdtab"> + </td> + <td class="tdtab"> + </td> + <td height="30"> + <br></td> + </tr><tr><td height="30"> + <img class="bigPic" src="data:image/png;base64,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"></img></td> + <td class="tdtab"> + </td> + <td class="tdtab"> + 3. + </td> + + <td height="30"> + <span class="Text">Выберите поле для размещения в макете.</span> + </td> + </tr><tr><td height="30"> + <br></td> + <td class="tdtab"> + </td> + <td class="tdtab"> + </td> + + <td height="30"> + <br></td> + </tr><tr class="thinclient"><td height="30"> + <img class="bigPic" src="data:image/png;base64,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"></img></td> + + <td class="tdtab"> + </td> + <td class="tdtab"> + 4. + </td> + + <td height="30"> + <span class="Text">Перетаскивайте или копируйте поле из нижней области программы.</span> + </td> + </tr><tr class="thinclient"><td height="30"> + <br></td> + <td class="tdtab"> + </td> + <td class="tdtab"> + </td> + + <td height="30"> + <br></td> + </tr><tr class="thinclient"><td height="30"> + <img class="bigPic" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANMAAAB4CAYAAABo3Mf0AAAACXBIWXMAAAsTAAALEwEAmpwYAAA/l2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDg4LCAyMDIwLzA3LzEwLTIyOjA2OjUzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczppbGx1c3RyYXRvcj0iaHR0cDovL25zLmFkb2JlLmNvbS9pbGx1c3RyYXRvci8xLjAvIiB4bWxuczpwZGY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGRmLzEuMy8iIHhtbG5zOnhtcFRQZz0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3QvcGcvIiB4bWxuczpzdERpbT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL0RpbWVuc2lvbnMjIiB4bWxuczpzdEZudD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL0ZvbnQjIiB4bWxuczp4bXBHPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvZy8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHhtcDpNZXRhZGF0YURhdGU9IjIwMjItMDYtMDdUMTM6MTE6MjErMDM6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA2LTA3VDEzOjExOjIxKzAzOjAwIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMi0wNi0wN1QxMzowODozOSswNDowMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBJbGx1c3RyYXRvciAyNi4zIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowMmQwNjNjMC03N2EzLWRlNDUtYjBiNi1iYWY4MjllYmQzODIiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo4MThmZDI0NS0wMTIzLTFkNDItYTRlMy1kZDU0MDhmODg4ODYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0idXVpZDo1RDIwODkyNDkzQkZEQjExOTE0QTg1OTBEMzE1MDhDOCIgeG1wTU06UmVuZGl0aW9uQ2xhc3M9InByb29mOnBkZiIgaWxsdXN0cmF0b3I6U3RhcnR1cFByb2ZpbGU9IlByaW50IiBpbGx1c3RyYXRvcjpDcmVhdG9yU3ViVG9vbD0iQUlSb2JpbiIgaWxsdXN0cmF0b3I6VHlwZT0iRG9jdW1lbnQiIHBkZjpQcm9kdWNlcj0iQWRvYmUgUERGIGxpYnJhcnkgMTYuMDciIHhtcFRQZzpOUGFnZXM9IjEiIHhtcFRQZzpIYXNWaXNpYmxlVHJhbnNwYXJlbmN5PSJUcnVlIiB4bXBUUGc6SGFzVmlzaWJsZU92ZXJwcmludD0iRmFsc2UiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSI+IDxkYzp0aXRsZT4gPHJkZjpBbHQ+IDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+MjAyMl8wNl/QmNC90YHRgtGA0YPQutGG0LjRjyDQtNC70Y8g0J/QnzwvcmRmOmxpPiA8L3JkZjpBbHQ+IDwvZGM6dGl0bGU+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmVhYTY5ZTM1LWQ2M2YtZjA0Mi04N2RjLTdlYmIzNTUwODg0YiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDplYWE2OWUzNS1kNjNmLWYwNDItODdkYy03ZWJiMzU1MDg4NGIiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0idXVpZDo1RDIwODkyNDkzQkZEQjExOTE0QTg1OTBEMzE1MDhDOCIgc3RSZWY6cmVuZGl0aW9uQ2xhc3M9InByb29mOnBkZiIvPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDplZWI2Y2Q0NC02ZTYzLWRjNGEtYWZhMi04NTdiMmU2YWFhZDYiIHN0RXZ0OndoZW49IjIwMjItMDMtMThUMTc6NDU6MTMrMDM6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIElsbHVzdHJhdG9yIDI2LjEgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MjRiMzJmMy1kMzU1LWExNGMtOTMwYi03NDEwNDgxYjBhZWYiIHN0RXZ0OndoZW49IjIwMjItMDYtMDdUMTI6NTk6MzgrMDM6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIElsbHVzdHJhdG9yIDI2LjMgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gYXBwbGljYXRpb24vcGRmIHRvIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmVhYTY5ZTM1LWQ2M2YtZjA0Mi04N2RjLTdlYmIzNTUwODg0YiIgc3RFdnQ6d2hlbj0iMjAyMi0wNi0wN1QxMzoxMToyMSswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gYXBwbGljYXRpb24vcGRmIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iZGVyaXZlZCIgc3RFdnQ6cGFyYW1ldGVycz0iY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjAyZDA2M2MwLTc3YTMtZGU0NS1iMGI2LWJhZjgyOWViZDM4MiIgc3RFdnQ6d2hlbj0iMjAyMi0wNi0wN1QxMzoxMToyMSswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8eG1wVFBnOk1heFBhZ2VTaXplIHN0RGltOnc9IjIxMS4wMDAwMDAiIHN0RGltOmg9IjEyMC4wMDAwMDAiIHN0RGltOnVuaXQ9IlBpeGVscyIvPiA8eG1wVFBnOkZvbnRzPiA8cmRmOkJhZz4gPHJkZjpsaSBzdEZudDpmb250TmFtZT0iQXJpYWwtQm9sZE1UIiBzdEZudDpmb250RmFtaWx5PSJBcmlhbCBNVCIgc3RGbnQ6Zm9udEZhY2U9IkJvbGQiIHN0Rm50OmZvbnRUeXBlPSJPcGVuIFR5cGUiIHN0Rm50OnZlcnNpb25TdHJpbmc9IjAwMS4wMDEiIHN0Rm50OmNvbXBvc2l0ZT0iRmFsc2UiIHN0Rm50OmZvbnRGaWxlTmFtZT0iQXJpYWwtQm9sZE1ULm90ZiIvPiA8cmRmOmxpIHN0Rm50OmZvbnROYW1lPSJBcmlhbE1UIiBzdEZudDpmb250RmFtaWx5PSJBcmlhbCIgc3RGbnQ6Zm9udEZhY2U9IlJlZ3VsYXIiIHN0Rm50OmZvbnRUeXBlPSJPcGVuIFR5cGUiIHN0Rm50OnZlcnNpb25TdHJpbmc9IlZlcnNpb24gNy4wMCIgc3RGbnQ6Y29tcG9zaXRlPSJGYWxzZSIgc3RGbnQ6Zm9udEZpbGVOYW1lPSJhcmlhbC50dGYiLz4gPC9yZGY6QmFnPiA8L3htcFRQZzpGb250cz4gPHhtcFRQZzpQbGF0ZU5hbWVzPiA8cmRmOlNlcT4gPHJkZjpsaT5DeWFuPC9yZGY6bGk+IDxyZGY6bGk+TWFnZW50YTwvcmRmOmxpPiA8cmRmOmxpPlllbGxvdzwvcmRmOmxpPiA8cmRmOmxpPkJsYWNrPC9yZGY6bGk+IDwvcmRmOlNlcT4gPC94bXBUUGc6UGxhdGVOYW1lcz4gPHhtcFRQZzpTd2F0Y2hHcm91cHM+IDxyZGY6U2VxPiA8cmRmOmxpPiA8cmRmOkRlc2NyaXB0aW9uIHhtcEc6Z3JvdXBOYW1lPSJEZWZhdWx0IFN3YXRjaCBHcm91cCIgeG1wRzpncm91cFR5cGU9IjAiPiA8eG1wRzpDb2xvcmFudHM+IDxyZGY6U2VxPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iV2hpdGUiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJCbGFjayIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIwLjAwMDAwMCIgeG1wRzpibGFjaz0iMTAwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQ01ZSyBSZWQiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIxMDAuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQ01ZSyBZZWxsb3ciIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMTAwLjAwMDAwMCIgeG1wRzpibGFjaz0iMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkNNWUsgR3JlZW4iIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjEwMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIxMDAuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQ01ZSyBDeWFuIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIxMDAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDTVlLIEJsdWUiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjEwMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMTAwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQ01ZSyBNYWdlbnRhIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIxMDAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTE1IE09MTAwIFk9OTAgSz0xMCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMTUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwMC4wMDAwMDAiIHhtcEc6eWVsbG93PSI5MC4wMDAwMDAiIHhtcEc6YmxhY2s9IjEwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09OTAgWT04NSBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjkwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9Ijg1LjAwMDAwMCIgeG1wRzpibGFjaz0iMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MCBNPTgwIFk9OTUgSz0wIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSI4MC4wMDAwMDAiIHhtcEc6eWVsbG93PSI5NS4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT01MCBZPTEwMCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjUwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT0zNSBZPTg1IEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMzUuMDAwMDAwIiB4bXBHOnllbGxvdz0iODUuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz01IE09MCBZPTkwIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iNS4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSI5MC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTIwIE09MCBZPTEwMCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTUwIE09MCBZPTEwMCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjUwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTc1IE09MCBZPTEwMCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49Ijc1LjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTg1IE09MTAgWT0xMDAgSz0xMCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iODUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjEwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz05MCBNPTMwIFk9OTUgSz0zMCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iOTAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjMwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9Ijk1LjAwMDAwMCIgeG1wRzpibGFjaz0iMzAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTc1IE09MCBZPTc1IEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iNzUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iNzUuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz04MCBNPTEwIFk9NDUgSz0wIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI4MC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMTAuMDAwMDAwIiB4bXBHOnllbGxvdz0iNDUuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz03MCBNPTE1IFk9MCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjcwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIxNS4wMDAwMDAiIHhtcEc6eWVsbG93PSIwLjAwMDAwMCIgeG1wRzpibGFjaz0iMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9ODUgTT01MCBZPTAgSz0wIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI4NS4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNTAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTEwMCBNPTk1IFk9NSBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjEwMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iOTUuMDAwMDAwIiB4bXBHOnllbGxvdz0iNS4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTEwMCBNPTEwMCBZPTI1IEs9MjUiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjEwMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMTAwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjI1LjAwMDAwMCIgeG1wRzpibGFjaz0iMjUuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTc1IE09MTAwIFk9MCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49Ijc1LjAwMDAwMCIgeG1wRzptYWdlbnRhPSIxMDAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTUwIE09MTAwIFk9MCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjUwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIxMDAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTM1IE09MTAwIFk9MzUgSz0xMCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMzUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIzNS4wMDAwMDAiIHhtcEc6YmxhY2s9IjEwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0xMCBNPTEwMCBZPTUwIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMTAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwMC4wMDAwMDAiIHhtcEc6eWVsbG93PSI1MC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT05NSBZPTIwIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iOTUuMDAwMDAwIiB4bXBHOnllbGxvdz0iMjAuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0yNSBNPTI1IFk9NDAgSz0wIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIyNS4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMjUuMDAwMDAwIiB4bXBHOnllbGxvdz0iNDAuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz00MCBNPTQ1IFk9NTAgSz01IiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI0MC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNDUuMDAwMDAwIiB4bXBHOnllbGxvdz0iNTAuMDAwMDAwIiB4bXBHOmJsYWNrPSI1LjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz01MCBNPTUwIFk9NjAgSz0yNSIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iNTAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjUwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjYwLjAwMDAwMCIgeG1wRzpibGFjaz0iMjUuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTU1IE09NjAgWT02NSBLPTQwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI1NS4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iNjUuMDAwMDAwIiB4bXBHOmJsYWNrPSI0MC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MjUgTT00MCBZPTY1IEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMjUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjQwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjY1LjAwMDAwMCIgeG1wRzpibGFjaz0iMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MzAgTT01MCBZPTc1IEs9MTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjMwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSI1MC4wMDAwMDAiIHhtcEc6eWVsbG93PSI3NS4wMDAwMDAiIHhtcEc6YmxhY2s9IjEwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0zNSBNPTYwIFk9ODAgSz0yNSIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMzUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjYwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjgwLjAwMDAwMCIgeG1wRzpibGFjaz0iMjUuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTQwIE09NjUgWT05MCBLPTM1IiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI0MC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNjUuMDAwMDAwIiB4bXBHOnllbGxvdz0iOTAuMDAwMDAwIiB4bXBHOmJsYWNrPSIzNS4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9NDAgTT03MCBZPTEwMCBLPTUwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI0MC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNzAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMTAwLjAwMDAwMCIgeG1wRzpibGFjaz0iNTAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTUwIE09NzAgWT04MCBLPTcwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI1MC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNzAuMDAwMDAwIiB4bXBHOnllbGxvdz0iODAuMDAwMDAwIiB4bXBHOmJsYWNrPSI3MC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9NCBNPTEgWT00OCBLPTAgMSIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMy44NDIyMjIiIHhtcEc6bWFnZW50YT0iMS4zNTUwMDEiIHhtcEc6eWVsbG93PSI0Ny41MTY1OTMiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTIgTT0xIFk9MSBLPTAgMSIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMi4zMDEwNjAiIHhtcEc6bWFnZW50YT0iMS4zMTgzNzkiIHhtcEc6eWVsbG93PSIwLjY2ODM0NSIgeG1wRzpibGFjaz0iMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MzEgTT0yNCBZPTI1IEs9MCAxIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIzMC42OTUwNDgiIHhtcEc6bWFnZW50YT0iMjQuMTg4NjAwIiB4bXBHOnllbGxvdz0iMjQuNzc3NTk5IiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iUj0xMzMgRz0xMzcgQj0xNDAiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzp0aW50PSIxMDAuMDAwMDAwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6Y3lhbj0iNTAuNTk3Mzg4IiB4bXBHOm1hZ2VudGE9IjQwLjAyNzQ2MyIgeG1wRzp5ZWxsb3c9IjM4LjY2OTQxMCIgeG1wRzpibGFjaz0iMy45ODU2NTYiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9NCBNPTIgWT05NCBLPTAgMSIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iNC4wNzExMDciIHhtcEc6bWFnZW50YT0iMS45NjUzNjIiIHhtcEc6eWVsbG93PSI5My44ODcyMzQiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTkgTT0xMSBZPTk5IEs9MCAxIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI4LjcwMDY5NCIgeG1wRzptYWdlbnRhPSIxMC43NDU0MDMiIHhtcEc6eWVsbG93PSI5OC43MTgyMzgiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTM1IE09MzMgWT0xMDAgSz00IDEiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjM0LjkxODc0MyIgeG1wRzptYWdlbnRhPSIzMi42MTE1NzkiIHhtcEc6eWVsbG93PSIxMDAuMDAwMDAwIiB4bXBHOmJsYWNrPSI0LjQ0NjQ3OSIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz02NiBNPTU5IFk9NTggSz00MCAxIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI2Ni4wNDg2NzYiIHhtcEc6bWFnZW50YT0iNTguOTg5ODUzIiB4bXBHOnllbGxvdz0iNTcuNjY4NDE4IiB4bXBHOmJsYWNrPSIzOS41NDgzMzEiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9NDQgTT0zNiBZPTM3IEs9MSAxIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI0My43MjAxNDciIHhtcEc6bWFnZW50YT0iMzYuMzI4Njc5IiB4bXBHOnllbGxvdz0iMzYuNTUxNDYxIiB4bXBHOmJsYWNrPSIxLjQ5ODQzNiIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz00IE09MyBZPTIgSz0wIDEiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjMuNjgwNDc2IiB4bXBHOm1hZ2VudGE9IjIuNTY5NjE5IiB4bXBHOnllbGxvdz0iMi4wNjkxMjMiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDwvcmRmOlNlcT4gPC94bXBHOkNvbG9yYW50cz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOmxpPiA8cmRmOmxpPiA8cmRmOkRlc2NyaXB0aW9uIHhtcEc6Z3JvdXBOYW1lPSJHcmF5cyIgeG1wRzpncm91cFR5cGU9IjEiPiA8eG1wRzpDb2xvcmFudHM+IDxyZGY6U2VxPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MCBZPTAgSz0xMDAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjEwMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MCBNPTAgWT0wIEs9OTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9Ijg5Ljk5OTQwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MCBZPTAgSz04MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIwLjAwMDAwMCIgeG1wRzpibGFjaz0iNzkuOTk4ODAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT0wIFk9MCBLPTcwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAwMDAwIiB4bXBHOmJsYWNrPSI2OS45OTk3MDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MCBNPTAgWT0wIEs9NjAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjU5Ljk5OTEwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MCBZPTAgSz01MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIwLjAwMDAwMCIgeG1wRzpibGFjaz0iNTAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT0wIFk9MCBLPTQwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAwMDAwIiB4bXBHOmJsYWNrPSIzOS45OTk0MDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MCBNPTAgWT0wIEs9MzAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjI5Ljk5ODgwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MCBZPTAgSz0yMCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIwLjAwMDAwMCIgeG1wRzpibGFjaz0iMTkuOTk5NzAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT0wIFk9MCBLPTEwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAwMDAwIiB4bXBHOmJsYWNrPSI5Ljk5OTEwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MCBZPTAgSz01IiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAwMDAwIiB4bXBHOmJsYWNrPSI0Ljk5ODgwMCIvPiA8L3JkZjpTZXE+IDwveG1wRzpDb2xvcmFudHM+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpsaT4gPHJkZjpsaT4gPHJkZjpEZXNjcmlwdGlvbiB4bXBHOmdyb3VwTmFtZT0iQnJpZ2h0cyIgeG1wRzpncm91cFR5cGU9IjEiPiA8eG1wRzpDb2xvcmFudHM+IDxyZGY6U2VxPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MTAwIFk9MTAwIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMTAwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT03NSBZPTEwMCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9Ijc1LjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT0xMCBZPTk1IEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMTAuMDAwMDAwIiB4bXBHOnllbGxvdz0iOTUuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz04NSBNPTEwIFk9MTAwIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iODUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTEwMCBNPTkwIFk9MCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjEwMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iOTAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTYwIE09OTAgWT0wIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iNjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjkwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAzMTAwIiB4bXBHOmJsYWNrPSIwLjAwMzEwMCIvPiA8L3JkZjpTZXE+IDwv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"></img></td> + <td class="tdtab"> + </td> + + + <td class="tdtab"> + 5. + </td> + + <td height="30"> + <p> + <span class="Text">Сохраните макет и закройте редактор, затем нажмите кнопку </span><span class="boldText">Завершить изменения<span class="Text">.</span> + </span></p> + </td> + </tr><tr class="webclient"><td height="30"> + <img class="bigPic" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANMAAAB4CAYAAABo3Mf0AAAACXBIWXMAAAsTAAALEwEAmpwYAAA/l2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDg4LCAyMDIwLzA3LzEwLTIyOjA2OjUzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczppbGx1c3RyYXRvcj0iaHR0cDovL25zLmFkb2JlLmNvbS9pbGx1c3RyYXRvci8xLjAvIiB4bWxuczpwZGY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGRmLzEuMy8iIHhtbG5zOnhtcFRQZz0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3QvcGcvIiB4bWxuczpzdERpbT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL0RpbWVuc2lvbnMjIiB4bWxuczpzdEZudD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL0ZvbnQjIiB4bWxuczp4bXBHPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvZy8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHhtcDpNZXRhZGF0YURhdGU9IjIwMjItMDYtMDdUMTM6MTE6MjErMDM6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA2LTA3VDEzOjExOjIxKzAzOjAwIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMi0wNi0wN1QxMzowODozOSswNDowMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBJbGx1c3RyYXRvciAyNi4zIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowMmQwNjNjMC03N2EzLWRlNDUtYjBiNi1iYWY4MjllYmQzODIiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo4MThmZDI0NS0wMTIzLTFkNDItYTRlMy1kZDU0MDhmODg4ODYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0idXVpZDo1RDIwODkyNDkzQkZEQjExOTE0QTg1OTBEMzE1MDhDOCIgeG1wTU06UmVuZGl0aW9uQ2xhc3M9InByb29mOnBkZiIgaWxsdXN0cmF0b3I6U3RhcnR1cFByb2ZpbGU9IlByaW50IiBpbGx1c3RyYXRvcjpDcmVhdG9yU3ViVG9vbD0iQUlSb2JpbiIgaWxsdXN0cmF0b3I6VHlwZT0iRG9jdW1lbnQiIHBkZjpQcm9kdWNlcj0iQWRvYmUgUERGIGxpYnJhcnkgMTYuMDciIHhtcFRQZzpOUGFnZXM9IjEiIHhtcFRQZzpIYXNWaXNpYmxlVHJhbnNwYXJlbmN5PSJUcnVlIiB4bXBUUGc6SGFzVmlzaWJsZU92ZXJwcmludD0iRmFsc2UiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSI+IDxkYzp0aXRsZT4gPHJkZjpBbHQ+IDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+MjAyMl8wNl/QmNC90YHRgtGA0YPQutGG0LjRjyDQtNC70Y8g0J/QnzwvcmRmOmxpPiA8L3JkZjpBbHQ+IDwvZGM6dGl0bGU+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmVhYTY5ZTM1LWQ2M2YtZjA0Mi04N2RjLTdlYmIzNTUwODg0YiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDplYWE2OWUzNS1kNjNmLWYwNDItODdkYy03ZWJiMzU1MDg4NGIiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0idXVpZDo1RDIwODkyNDkzQkZEQjExOTE0QTg1OTBEMzE1MDhDOCIgc3RSZWY6cmVuZGl0aW9uQ2xhc3M9InByb29mOnBkZiIvPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDplZWI2Y2Q0NC02ZTYzLWRjNGEtYWZhMi04NTdiMmU2YWFhZDYiIHN0RXZ0OndoZW49IjIwMjItMDMtMThUMTc6NDU6MTMrMDM6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIElsbHVzdHJhdG9yIDI2LjEgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MjRiMzJmMy1kMzU1LWExNGMtOTMwYi03NDEwNDgxYjBhZWYiIHN0RXZ0OndoZW49IjIwMjItMDYtMDdUMTI6NTk6MzgrMDM6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIElsbHVzdHJhdG9yIDI2LjMgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gYXBwbGljYXRpb24vcGRmIHRvIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmVhYTY5ZTM1LWQ2M2YtZjA0Mi04N2RjLTdlYmIzNTUwODg0YiIgc3RFdnQ6d2hlbj0iMjAyMi0wNi0wN1QxMzoxMToyMSswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gYXBwbGljYXRpb24vcGRmIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iZGVyaXZlZCIgc3RFdnQ6cGFyYW1ldGVycz0iY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjAyZDA2M2MwLTc3YTMtZGU0NS1iMGI2LWJhZjgyOWViZDM4MiIgc3RFdnQ6d2hlbj0iMjAyMi0wNi0wN1QxMzoxMToyMSswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8eG1wVFBnOk1heFBhZ2VTaXplIHN0RGltOnc9IjIxMS4wMDAwMDAiIHN0RGltOmg9IjEyMC4wMDAwMDAiIHN0RGltOnVuaXQ9IlBpeGVscyIvPiA8eG1wVFBnOkZvbnRzPiA8cmRmOkJhZz4gPHJkZjpsaSBzdEZudDpmb250TmFtZT0iQXJpYWwtQm9sZE1UIiBzdEZudDpmb250RmFtaWx5PSJBcmlhbCBNVCIgc3RGbnQ6Zm9udEZhY2U9IkJvbGQiIHN0Rm50OmZvbnRUeXBlPSJPcGVuIFR5cGUiIHN0Rm50OnZlcnNpb25TdHJpbmc9IjAwMS4wMDEiIHN0Rm50OmNvbXBvc2l0ZT0iRmFsc2UiIHN0Rm50OmZvbnRGaWxlTmFtZT0iQXJpYWwtQm9sZE1ULm90ZiIvPiA8cmRmOmxpIHN0Rm50OmZvbnROYW1lPSJBcmlhbE1UIiBzdEZudDpmb250RmFtaWx5PSJBcmlhbCIgc3RGbnQ6Zm9udEZhY2U9IlJlZ3VsYXIiIHN0Rm50OmZvbnRUeXBlPSJPcGVuIFR5cGUiIHN0Rm50OnZlcnNpb25TdHJpbmc9IlZlcnNpb24gNy4wMCIgc3RGbnQ6Y29tcG9zaXRlPSJGYWxzZSIgc3RGbnQ6Zm9udEZpbGVOYW1lPSJhcmlhbC50dGYiLz4gPC9yZGY6QmFnPiA8L3htcFRQZzpGb250cz4gPHhtcFRQZzpQbGF0ZU5hbWVzPiA8cmRmOlNlcT4gPHJkZjpsaT5DeWFuPC9yZGY6bGk+IDxyZGY6bGk+TWFnZW50YTwvcmRmOmxpPiA8cmRmOmxpPlllbGxvdzwvcmRmOmxpPiA8cmRmOmxpPkJsYWNrPC9yZGY6bGk+IDwvcmRmOlNlcT4gPC94bXBUUGc6UGxhdGVOYW1lcz4gPHhtcFRQZzpTd2F0Y2hHcm91cHM+IDxyZGY6U2VxPiA8cmRmOmxpPiA8cmRmOkRlc2NyaXB0aW9uIHhtcEc6Z3JvdXBOYW1lPSJEZWZhdWx0IFN3YXRjaCBHcm91cCIgeG1wRzpncm91cFR5cGU9IjAiPiA8eG1wRzpDb2xvcmFudHM+IDxyZGY6U2VxPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iV2hpdGUiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJCbGFjayIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIwLjAwMDAwMCIgeG1wRzpibGFjaz0iMTAwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQ01ZSyBSZWQiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIxMDAuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQ01ZSyBZZWxsb3ciIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMTAwLjAwMDAwMCIgeG1wRzpibGFjaz0iMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkNNWUsgR3JlZW4iIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjEwMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIxMDAuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQ01ZSyBDeWFuIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIxMDAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDTVlLIEJsdWUiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjEwMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMTAwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQ01ZSyBNYWdlbnRhIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIxMDAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTE1IE09MTAwIFk9OTAgSz0xMCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMTUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwMC4wMDAwMDAiIHhtcEc6eWVsbG93PSI5MC4wMDAwMDAiIHhtcEc6YmxhY2s9IjEwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09OTAgWT04NSBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjkwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9Ijg1LjAwMDAwMCIgeG1wRzpibGFjaz0iMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MCBNPTgwIFk9OTUgSz0wIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSI4MC4wMDAwMDAiIHhtcEc6eWVsbG93PSI5NS4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT01MCBZPTEwMCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjUwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT0zNSBZPTg1IEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMzUuMDAwMDAwIiB4bXBHOnllbGxvdz0iODUuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz01IE09MCBZPTkwIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iNS4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSI5MC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTIwIE09MCBZPTEwMCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTUwIE09MCBZPTEwMCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjUwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTc1IE09MCBZPTEwMCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49Ijc1LjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTg1IE09MTAgWT0xMDAgSz0xMCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iODUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjEwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz05MCBNPTMwIFk9OTUgSz0zMCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iOTAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjMwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9Ijk1LjAwMDAwMCIgeG1wRzpibGFjaz0iMzAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTc1IE09MCBZPTc1IEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iNzUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iNzUuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz04MCBNPTEwIFk9NDUgSz0wIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI4MC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMTAuMDAwMDAwIiB4bXBHOnllbGxvdz0iNDUuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz03MCBNPTE1IFk9MCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjcwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIxNS4wMDAwMDAiIHhtcEc6eWVsbG93PSIwLjAwMDAwMCIgeG1wRzpibGFjaz0iMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9ODUgTT01MCBZPTAgSz0wIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI4NS4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNTAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTEwMCBNPTk1IFk9NSBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjEwMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iOTUuMDAwMDAwIiB4bXBHOnllbGxvdz0iNS4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTEwMCBNPTEwMCBZPTI1IEs9MjUiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjEwMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMTAwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjI1LjAwMDAwMCIgeG1wRzpibGFjaz0iMjUuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTc1IE09MTAwIFk9MCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49Ijc1LjAwMDAwMCIgeG1wRzptYWdlbnRhPSIxMDAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTUwIE09MTAwIFk9MCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjUwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIxMDAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTM1IE09MTAwIFk9MzUgSz0xMCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMzUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIzNS4wMDAwMDAiIHhtcEc6YmxhY2s9IjEwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0xMCBNPTEwMCBZPTUwIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMTAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwMC4wMDAwMDAiIHhtcEc6eWVsbG93PSI1MC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT05NSBZPTIwIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iOTUuMDAwMDAwIiB4bXBHOnllbGxvdz0iMjAuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0yNSBNPTI1IFk9NDAgSz0wIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIyNS4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMjUuMDAwMDAwIiB4bXBHOnllbGxvdz0iNDAuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz00MCBNPTQ1IFk9NTAgSz01IiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI0MC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNDUuMDAwMDAwIiB4bXBHOnllbGxvdz0iNTAuMDAwMDAwIiB4bXBHOmJsYWNrPSI1LjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz01MCBNPTUwIFk9NjAgSz0yNSIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iNTAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjUwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjYwLjAwMDAwMCIgeG1wRzpibGFjaz0iMjUuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTU1IE09NjAgWT02NSBLPTQwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI1NS4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iNjUuMDAwMDAwIiB4bXBHOmJsYWNrPSI0MC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MjUgTT00MCBZPTY1IEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMjUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjQwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjY1LjAwMDAwMCIgeG1wRzpibGFjaz0iMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MzAgTT01MCBZPTc1IEs9MTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjMwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSI1MC4wMDAwMDAiIHhtcEc6eWVsbG93PSI3NS4wMDAwMDAiIHhtcEc6YmxhY2s9IjEwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0zNSBNPTYwIFk9ODAgSz0yNSIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMzUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjYwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjgwLjAwMDAwMCIgeG1wRzpibGFjaz0iMjUuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTQwIE09NjUgWT05MCBLPTM1IiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI0MC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNjUuMDAwMDAwIiB4bXBHOnllbGxvdz0iOTAuMDAwMDAwIiB4bXBHOmJsYWNrPSIzNS4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9NDAgTT03MCBZPTEwMCBLPTUwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI0MC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNzAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMTAwLjAwMDAwMCIgeG1wRzpibGFjaz0iNTAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTUwIE09NzAgWT04MCBLPTcwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI1MC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iNzAuMDAwMDAwIiB4bXBHOnllbGxvdz0iODAuMDAwMDAwIiB4bXBHOmJsYWNrPSI3MC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9NCBNPTEgWT00OCBLPTAgMSIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMy44NDIyMjIiIHhtcEc6bWFnZW50YT0iMS4zNTUwMDEiIHhtcEc6eWVsbG93PSI0Ny41MTY1OTMiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTIgTT0xIFk9MSBLPTAgMSIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMi4zMDEwNjAiIHhtcEc6bWFnZW50YT0iMS4zMTgzNzkiIHhtcEc6eWVsbG93PSIwLjY2ODM0NSIgeG1wRzpibGFjaz0iMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MzEgTT0yNCBZPTI1IEs9MCAxIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIzMC42OTUwNDgiIHhtcEc6bWFnZW50YT0iMjQuMTg4NjAwIiB4bXBHOnllbGxvdz0iMjQuNzc3NTk5IiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iUj0xMzMgRz0xMzcgQj0xNDAiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzp0aW50PSIxMDAuMDAwMDAwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6Y3lhbj0iNTAuNTk3Mzg4IiB4bXBHOm1hZ2VudGE9IjQwLjAyNzQ2MyIgeG1wRzp5ZWxsb3c9IjM4LjY2OTQxMCIgeG1wRzpibGFjaz0iMy45ODU2NTYiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9NCBNPTIgWT05NCBLPTAgMSIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iNC4wNzExMDciIHhtcEc6bWFnZW50YT0iMS45NjUzNjIiIHhtcEc6eWVsbG93PSI5My44ODcyMzQiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTkgTT0xMSBZPTk5IEs9MCAxIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI4LjcwMDY5NCIgeG1wRzptYWdlbnRhPSIxMC43NDU0MDMiIHhtcEc6eWVsbG93PSI5OC43MTgyMzgiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTM1IE09MzMgWT0xMDAgSz00IDEiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjM0LjkxODc0MyIgeG1wRzptYWdlbnRhPSIzMi42MTE1NzkiIHhtcEc6eWVsbG93PSIxMDAuMDAwMDAwIiB4bXBHOmJsYWNrPSI0LjQ0NjQ3OSIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz02NiBNPTU5IFk9NTggSz00MCAxIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI2Ni4wNDg2NzYiIHhtcEc6bWFnZW50YT0iNTguOTg5ODUzIiB4bXBHOnllbGxvdz0iNTcuNjY4NDE4IiB4bXBHOmJsYWNrPSIzOS41NDgzMzEiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9NDQgTT0zNiBZPTM3IEs9MSAxIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSI0My43MjAxNDciIHhtcEc6bWFnZW50YT0iMzYuMzI4Njc5IiB4bXBHOnllbGxvdz0iMzYuNTUxNDYxIiB4bXBHOmJsYWNrPSIxLjQ5ODQzNiIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz00IE09MyBZPTIgSz0wIDEiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjMuNjgwNDc2IiB4bXBHOm1hZ2VudGE9IjIuNTY5NjE5IiB4bXBHOnllbGxvdz0iMi4wNjkxMjMiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDwvcmRmOlNlcT4gPC94bXBHOkNvbG9yYW50cz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOmxpPiA8cmRmOmxpPiA8cmRmOkRlc2NyaXB0aW9uIHhtcEc6Z3JvdXBOYW1lPSJHcmF5cyIgeG1wRzpncm91cFR5cGU9IjEiPiA8eG1wRzpDb2xvcmFudHM+IDxyZGY6U2VxPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MCBZPTAgSz0xMDAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjEwMC4wMDAwMDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MCBNPTAgWT0wIEs9OTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9Ijg5Ljk5OTQwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MCBZPTAgSz04MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIwLjAwMDAwMCIgeG1wRzpibGFjaz0iNzkuOTk4ODAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT0wIFk9MCBLPTcwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAwMDAwIiB4bXBHOmJsYWNrPSI2OS45OTk3MDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MCBNPTAgWT0wIEs9NjAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjU5Ljk5OTEwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MCBZPTAgSz01MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIwLjAwMDAwMCIgeG1wRzpibGFjaz0iNTAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT0wIFk9MCBLPTQwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAwMDAwIiB4bXBHOmJsYWNrPSIzOS45OTk0MDAiLz4gPHJkZjpsaSB4bXBHOnN3YXRjaE5hbWU9IkM9MCBNPTAgWT0wIEs9MzAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjI5Ljk5ODgwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MCBZPTAgSz0yMCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMC4wMDAwMDAiIHhtcEc6eWVsbG93PSIwLjAwMDAwMCIgeG1wRzpibGFjaz0iMTkuOTk5NzAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT0wIFk9MCBLPTEwIiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAwMDAwIiB4bXBHOmJsYWNrPSI5Ljk5OTEwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MCBZPTAgSz01IiB4bXBHOm1vZGU9IkNNWUsiIHhtcEc6dHlwZT0iUFJPQ0VTUyIgeG1wRzpjeWFuPSIwLjAwMDAwMCIgeG1wRzptYWdlbnRhPSIwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAwMDAwIiB4bXBHOmJsYWNrPSI0Ljk5ODgwMCIvPiA8L3JkZjpTZXE+IDwveG1wRzpDb2xvcmFudHM+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpsaT4gPHJkZjpsaT4gPHJkZjpEZXNjcmlwdGlvbiB4bXBHOmdyb3VwTmFtZT0iQnJpZ2h0cyIgeG1wRzpncm91cFR5cGU9IjEiPiA8eG1wRzpDb2xvcmFudHM+IDxyZGY6U2VxPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz0wIE09MTAwIFk9MTAwIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMTAwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT03NSBZPTEwMCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9Ijc1LjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTAgTT0xMCBZPTk1IEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iMTAuMDAwMDAwIiB4bXBHOnllbGxvdz0iOTUuMDAwMDAwIiB4bXBHOmJsYWNrPSIwLjAwMDAwMCIvPiA8cmRmOmxpIHhtcEc6c3dhdGNoTmFtZT0iQz04NSBNPTEwIFk9MTAwIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iODUuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjEwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjEwMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTEwMCBNPTkwIFk9MCBLPTAiIHhtcEc6bW9kZT0iQ01ZSyIgeG1wRzp0eXBlPSJQUk9DRVNTIiB4bXBHOmN5YW49IjEwMC4wMDAwMDAiIHhtcEc6bWFnZW50YT0iOTAuMDAwMDAwIiB4bXBHOnllbGxvdz0iMC4wMDAwMDAiIHhtcEc6YmxhY2s9IjAuMDAwMDAwIi8+IDxyZGY6bGkgeG1wRzpzd2F0Y2hOYW1lPSJDPTYwIE09OTAgWT0wIEs9MCIgeG1wRzptb2RlPSJDTVlLIiB4bXBHOnR5cGU9IlBST0NFU1MiIHhtcEc6Y3lhbj0iNjAuMDAwMDAwIiB4bXBHOm1hZ2VudGE9IjkwLjAwMDAwMCIgeG1wRzp5ZWxsb3c9IjAuMDAzMTAwIiB4bXBHOmJsYWNrPSIwLjAwMzEwMCIvPiA8L3JkZjpTZXE+IDwv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"></img></td> + <td class="tdtab"> + </td> + <td class="tdtab"> + 4. + </td> + + <td height="30"> + <p> + <span class="Text">Сохраните макет и закройте редактор, затем нажмите кнопку </span><span class="boldText">Завершить изменения<span class="Text">.</span> + </span></p> + </td> + </tr><tr><td height="30"> + <br></td> + <td class="tdtab"> + </td> + <td class="tdtab"> + </td> + + <td height="30" align="right"> + <a style="margin-right: 10%;" href="ВызватьСправку">Подробнее</a> + </td> + </tr></tbody></table><p></p> +</body></html> \ No newline at end of file diff --git a/SSL/src/CommonTemplates/ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen/ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen.mdo b/SSL/src/CommonTemplates/ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen/ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen.mdo new file mode 100644 index 000000000..5bf792094 --- /dev/null +++ b/SSL/src/CommonTemplates/ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen/ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen.mdo @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonTemplate xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="3002d5d8-1b7d-4252-9e5d-9a533bf03ca8"> + <name>ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen</name> + <synonym> + <key>ru</key> + <value>Инструкция как выполнить настройку макета Office Open</value> + </synonym> + <comment>АПК:497 - содержание макета html-страница</comment> + <templateType>HTMLDocument</templateType> +</mdclass:CommonTemplate> diff --git a/SSL/src/CommonTemplates/МакетШтемпеляЭЦПOfficeOpen/Template.txt b/SSL/src/CommonTemplates/МакетШтемпеляЭЦПOfficeOpen/Template.txt new file mode 100644 index 000000000..b4c928d23 --- /dev/null +++ b/SSL/src/CommonTemplates/МакетШтемпеляЭЦПOfficeOpen/Template.txt @@ -0,0 +1,184 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<w:document xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink" xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex" xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex" xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se w16cid wp14"> +<w:tbl> +<w:tblPr> +<w:tblStyle w:val="a3" /> +<w:tblW w:w="0" w:type="auto" /> +<w:tblBorders> +<w:insideH w:val="none" w:sz="0" w:space="0" w:color="auto" /> +<w:insideV w:val="none" w:sz="0" w:space="0" w:color="auto" /> +</w:tblBorders> +<w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1" /> +</w:tblPr> +<w:tblGrid> +<w:gridCol w:w="1035" /> +<w:gridCol w:w="3073" /> +</w:tblGrid> +<w:tr w:rsidR="00C4584D" w:rsidTr="00C4584D"> +<w:tc> +<w:tcPr> +<w:tcW w:w="4106" w:type="dxa" /> +<w:gridSpan w:val="2" /> +</w:tcPr> +<w:p w:rsidR="00C4584D" w:rsidRPr="00C4584D" w:rsidRDefault="00C4584D" w:rsidP="00C4584D"> +<w:pPr> +<w:jc w:val="center" /> +<w:rPr> +<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial" /> +<w:b /> +<w:sz w:val="16" /> +<w:szCs w:val="16" /> +</w:rPr> +</w:pPr> +<w:r w:rsidRPr="00C4584D"> +<w:rPr> +<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial" /> +<w:b /> +<w:sz w:val="16" /> +<w:szCs w:val="16" /> +</w:rPr> +<w:t>[Заголовок]</w:t> +</w:r> +</w:p> +</w:tc> +</w:tr> +<w:tr w:rsidR="00C4584D" w:rsidTr="00C4584D"> +<w:tc> +<w:tcPr> +<w:tcW w:w="1033" w:type="dxa" /> +</w:tcPr> +<w:p w:rsidR="00C4584D" w:rsidRPr="00C4584D" w:rsidRDefault="00C4584D"> +<w:pPr> +<w:rPr> +<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial" /> +<w:sz w:val="12" /> +<w:szCs w:val="12" /> +</w:rPr> +</w:pPr> +<w:r w:rsidRPr="00C4584D"> +<w:rPr> +<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial" /> +<w:sz w:val="12" /> +<w:szCs w:val="12" /> +</w:rPr> +<w:t>[ЗаголовокСертификат]:</w:t> +</w:r> +</w:p> +</w:tc> +<w:tc> +<w:tcPr> +<w:tcW w:w="3073" w:type="dxa" /> +</w:tcPr> +<w:p w:rsidR="00C4584D" w:rsidRPr="00C4584D" w:rsidRDefault="00C4584D"> +<w:pPr> +<w:rPr> +<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial" /> +<w:sz w:val="12" /> +<w:szCs w:val="12" /> +</w:rPr> +</w:pPr> +<w:r w:rsidRPr="00C4584D"> +<w:rPr> +<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial" /> +<w:sz w:val="12" /> +<w:szCs w:val="12" /> +</w:rPr> +<w:t>[Сертификат]</w:t> +</w:r> +</w:p> +</w:tc> +</w:tr> +<w:tr w:rsidR="00C4584D" w:rsidTr="00C4584D"> +<w:tc> +<w:tcPr> +<w:tcW w:w="1033" w:type="dxa" /> +</w:tcPr> +<w:p w:rsidR="00C4584D" w:rsidRPr="00C4584D" w:rsidRDefault="00C4584D"> +<w:pPr> +<w:rPr> +<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial" /> +<w:sz w:val="12" /> +<w:szCs w:val="12" /> +</w:rPr> +</w:pPr> +<w:r w:rsidRPr="00C4584D"> +<w:rPr> +<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial" /> +<w:sz w:val="12" /> +<w:szCs w:val="12" /> +</w:rPr> +<w:t>[ЗаголовокВладелец]:</w:t> +</w:r> +</w:p> +</w:tc> +<w:tc> +<w:tcPr> +<w:tcW w:w="3073" w:type="dxa" /> +</w:tcPr> +<w:p w:rsidR="00C4584D" w:rsidRPr="00C4584D" w:rsidRDefault="00C4584D"> +<w:pPr> +<w:rPr> +<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial" /> +<w:sz w:val="12" /> +<w:szCs w:val="12" /> +</w:rPr> +</w:pPr> +<w:r w:rsidRPr="00C4584D"> +<w:rPr> +<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial" /> +<w:sz w:val="12" /> +<w:szCs w:val="12" /> +</w:rPr> +<w:t>[Владелец]</w:t> +</w:r> +</w:p> +</w:tc> +</w:tr> +<w:tr w:rsidR="00C4584D" w:rsidTr="00C4584D"> +<w:tc> +<w:tcPr> +<w:tcW w:w="1033" w:type="dxa" /> +</w:tcPr> +<w:p w:rsidR="00C4584D" w:rsidRPr="00C4584D" w:rsidRDefault="00C4584D"> +<w:pPr> +<w:rPr> +<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial" /> +<w:sz w:val="12" /> +<w:szCs w:val="12" /> +</w:rPr> +</w:pPr> +<w:r w:rsidRPr="00C4584D"> +<w:rPr> +<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial" /> +<w:sz w:val="12" /> +<w:szCs w:val="12" /> +</w:rPr> +<w:t>[ЗаголовокПериодДействия]:</w:t> +</w:r> +</w:p> +</w:tc> +<w:tc> +<w:tcPr> +<w:tcW w:w="3073" w:type="dxa" /> +</w:tcPr> +<w:p w:rsidR="00C4584D" w:rsidRPr="00C4584D" w:rsidRDefault="00C4584D"> +<w:pPr> +<w:rPr> +<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial" /> +<w:sz w:val="12" /> +<w:szCs w:val="12" /> +</w:rPr> +</w:pPr> +<w:r w:rsidRPr="00C4584D"> +<w:rPr> +<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial" /> +<w:sz w:val="12" /> +<w:szCs w:val="12" /> +</w:rPr> +<w:t>[ПериодДействия]</w:t> +</w:r> +</w:p> +</w:tc> +</w:tr> +</w:tbl> +</w:document> \ No newline at end of file diff --git a/SSL/src/CommonTemplates/МакетШтемпеляЭЦПOfficeOpen/МакетШтемпеляЭЦПOfficeOpen.mdo b/SSL/src/CommonTemplates/МакетШтемпеляЭЦПOfficeOpen/МакетШтемпеляЭЦПOfficeOpen.mdo new file mode 100644 index 000000000..1919841dd --- /dev/null +++ b/SSL/src/CommonTemplates/МакетШтемпеляЭЦПOfficeOpen/МакетШтемпеляЭЦПOfficeOpen.mdo @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonTemplate xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="faf89779-2290-4d37-b1ea-e81b1b79f74c"> + <name>МакетШтемпеляЭЦПOfficeOpen</name> + <synonym> + <key>ru</key> + <value>Макет штемпеля ЭЦП Office Open</value> + </synonym> + <templateType>TextDocument</templateType> +</mdclass:CommonTemplate> diff --git a/SSL/src/CommonTemplates/ПолучениеДереваОбработчиковОбновления/Template.dcs b/SSL/src/CommonTemplates/ПолучениеДереваОбработчиковОбновления/Template.dcs index 2a5498aae..770b8ce3c 100644 --- a/SSL/src/CommonTemplates/ПолучениеДереваОбработчиковОбновления/Template.dcs +++ b/SSL/src/CommonTemplates/ПолучениеДереваОбработчиковОбновления/Template.dcs @@ -325,6 +325,19 @@ </v8:StringQualifiers> </valueType> </field> + <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> + + + d5p1:EnumRef.ПорядокОбработчиковОбновления + + ЧитаемыеОбъекты ЧитаемыеОбъекты @@ -611,9 +624,6 @@ НачальноеЗаполнение - - ИзменяемыеОбъекты - Комментарий @@ -644,6 +654,12 @@ Многопоточный + + Порядок + + + ИзменяемыеОбъекты + ЧитаемыеОбъекты diff --git a/SSL/src/CommonTemplates/ПустойМакетDOCX/Template.bin b/SSL/src/CommonTemplates/ПустойМакетDOCX/Template.bin new file mode 100644 index 0000000000000000000000000000000000000000..5d0a08e15323a20ee664347d88859e854845691c GIT binary patch literal 11781 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 + + ПустойМакетDOCX + + ru + Пустой макет DOCX + + АПК:497 макет не требует перевода + BinaryData + diff --git a/SSL/src/CommonTemplates/СтруктураПодчиненности/Template.mxlx b/SSL/src/CommonTemplates/СтруктураПодчиненности/Template.mxlx index 108c37bfb..1f21495f1 100644 --- a/SSL/src/CommonTemplates/СтруктураПодчиненности/Template.mxlx +++ b/SSL/src/CommonTemplates/СтруктураПодчиненности/Template.mxlx @@ -2087,22 +2087,6 @@ 1 11 - - -1 - 14 - - - -1 - 14 - - - -1 - 15 - - - -1 - 16 - ДокументЗаписан diff --git a/SSL/src/Configuration/Configuration.mdo b/SSL/src/Configuration/Configuration.mdo index f4f679b33..a91c5132a 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.7.382 + 3.1.8.276 http://downloads.v8.1c.ru/tmplts/ true @@ -55,7 +55,7 @@ NotAutoFree UseWithWarnings TaxiEnableVersion8_2 - 8.3.14 + 8.3.21 Русский @@ -148,6 +148,7 @@ CommonPicture.BotFatherВконтакте CommonPicture.GoogleMaps CommonPicture.Skype + CommonPicture.Адрес CommonPicture.АнимацияПодтверждения CommonPicture.АрхивАнкета CommonPicture.БыстрыеНастройкиОтчета @@ -158,12 +159,11 @@ CommonPicture.ВариантыОтчетовДоступныеВсемПользователям CommonPicture.ВводимыеСимволыВидны CommonPicture.ВводимыеСимволыСкрыты + CommonPicture.ВебСтраница CommonPicture.ВертикальноеПоложениеВерх CommonPicture.ВертикальноеПоложениеНиз CommonPicture.ВертикальноеПоложениеЦентр CommonPicture.Взаимодействия - CommonPicture.ВидимостьПароляЗакрыто - CommonPicture.ВидимостьПароляОткрыто CommonPicture.ВидСравнения CommonPicture.ВидыКонтактнойИнформации CommonPicture.ВидыНавигацииПоВзаимодействиямОтДопРеквизитовСведений @@ -231,6 +231,7 @@ CommonPicture.ДокументПроведенКоннекторНиз CommonPicture.ДополнительныеРеквизитыСведения CommonPicture.ДополнительныеСведения + CommonPicture.Другое CommonPicture.ЗавершитьРаботу CommonPicture.ЗавершитьРедактированиеМакета CommonPicture.ЗакончитьРедактированиеФайла @@ -293,7 +294,9 @@ CommonPicture.КурсивноеНачертание CommonPicture.Максимум CommonPicture.МенюДополнительныеФункции + CommonPicture.МестоДляQRКода CommonPicture.МестоДляКартинки + CommonPicture.МестоДляШтрихкода CommonPicture.МетаданныеHTTPСервисы CommonPicture.МетаданныеHTTPСервисыШаблоныURL CommonPicture.МетаданныеHTTPСервисыШаблоныURLМетоды @@ -441,6 +444,7 @@ CommonPicture.Подчеркивание CommonPicture.Позвонить CommonPicture.ПозвонитьИлиОтправитьSMS + CommonPicture.ПоказатьНаКарте CommonPicture.ПоказатьОтличия CommonPicture.ПоказатьТолькоВыбранныеРоли CommonPicture.ПолезныйСоветКонтрольВеденияУчета @@ -453,6 +457,7 @@ CommonPicture.ПревьюТабличногоВопросаОтветыВСтроках CommonPicture.ПревьюТабличногоВопросаОтветыСтрокиИКолонки CommonPicture.ПревьюТабличногоВопросаСоставной + CommonPicture.ПредварительныйПросмотрКартинка CommonPicture.ПредопределенныйЭлемент CommonPicture.Предупреждение CommonPicture.Предупреждение32 @@ -524,6 +529,12 @@ CommonPicture.СостояниеПользователя10 CommonPicture.СостояниеПользователя11 CommonPicture.СостояниеПользователя12 + CommonPicture.СостояниеПользователя13 + CommonPicture.СостояниеПользователя14 + CommonPicture.СостояниеПользователя15 + CommonPicture.СостояниеПользователя16 + CommonPicture.СостояниеПользователя17 + CommonPicture.СостояниеПользователя18 CommonPicture.СостояниеРассылкиОтчетов CommonPicture.СостоянияПользователей CommonPicture.СостоянияПроцессов @@ -610,6 +621,7 @@ CommonPicture.УстановитьПризнакРассмотреноДляВзаимодействия CommonPicture.УстановитьСостояниеОригиналаПервичногоДокумента CommonPicture.УточнитьСостояниеОригиналаПервичногоДокументаПоПечатнымФормам + CommonPicture.Факс CommonPicture.ФорматExcel CommonPicture.ФорматExcel2007 CommonPicture.ФорматHTML @@ -622,11 +634,13 @@ CommonPicture.ФорматWord2007 CommonPicture.ФорматПустой CommonPicture.Фотокамера + CommonPicture.ЦветГраницы CommonPicture.ЦветТекста CommonPicture.ЦветФона CommonPicture.ШиринаКолонки CommonPicture.Шрифт CommonPicture.ШтампЭлектроннойПодписи + CommonPicture.ЭлектроннаяПочта CommonPicture.ЭлектронноеПисьмо CommonPicture.ЭлектронноеПисьмоВходящее CommonPicture.ЭлектронноеПисьмоИсходящее @@ -656,6 +670,7 @@ SessionParameter.ОбластьДанныхИспользование SessionParameter.ОбновитьВерсиюДатЗапретаИзмененияПослеЗагрузкиДанных SessionParameter.ОбновлениеСправочниковИдентификаторов + SessionParameter.ОбновлениеСправочниковПользователей SessionParameter.ОбщиеПараметрыШаблоновОграниченияДоступа SessionParameter.ОграничениеДоступаНаУровнеЗаписейИспользуется SessionParameter.ОграничениеДоступаНаУровнеЗаписейУниверсально @@ -669,7 +684,7 @@ SessionParameter.ПаролиСинхронизацииДанных SessionParameter.ПодключениеDSS SessionParameter.ПодключенныеРасширения - SessionParameter.ПравилаВыборочнойРегистрацииОбъектов + SessionParameter.ПраваДоступаКДатамЗапрета SessionParameter.ПравилаРегистрацииОбъектов SessionParameter.ПриоритетныеДанныеОбмена SessionParameter.ПропуститьПроверкуЗапретаИзменения @@ -696,7 +711,6 @@ Role.БазовыеПраваБСП Role.БазовыеПраваВнешнихПользователейБСП Role.ВыводНаПринтерФайлБуферОбмена - Role.ВызовОнлайнПоддержки Role.ВыполнениеСинхронизацииДанных Role.ДобавлениеИзменениеАдресныхСведений Role.ДобавлениеИзменениеБанков @@ -705,6 +719,7 @@ Role.ДобавлениеИзменениеВидовКонтактнойИнформации Role.ДобавлениеИзменениеВнешнихПользователей Role.ДобавлениеИзменениеГрафиковРаботы + Role.ДобавлениеИзменениеДатЗапретаЗагрузки Role.ДобавлениеИзменениеДатЗапретаИзменения Role.ДобавлениеИзменениеДополнительныхОтчетовИОбработок Role.ДобавлениеИзменениеДополнительныхРеквизитовИСведений @@ -768,6 +783,8 @@ Role.ЧтениеВнешнихПользователей Role.ЧтениеГрафиковРаботы Role.ЧтениеДанныхСервисаDSS + Role.ЧтениеДатЗапретаЗагрузки + Role.ЧтениеДатЗапретаИзменения Role.ЧтениеДополнительныхОтчетовИОбработок Role.ЧтениеДополнительныхСведений Role.ЧтениеЗаданий @@ -784,13 +801,16 @@ CommonTemplate.ДанныеПечатиОбщиеРеквизиты CommonTemplate.ДанныеПечатиРегистрСимволов CommonTemplate.ИнструкцияДляУстановкиКодаДляПредопределенногоУзла_ru + CommonTemplate.ИнструкцияКакВыполнитьНастройкуМакетаOfficeOpen CommonTemplate.ИнструкцияКакВыполнитьУстановкуОбновленияВручную CommonTemplate.ИнструкцияПоСозданиюФаксимильнойПодписиИПечати CommonTemplate.КомпонентаTWAIN CommonTemplate.КомпонентаПечатиQRКода CommonTemplate.КомпонентаПечатиШтрихкодов CommonTemplate.КомпонентаПоискаСтрок + CommonTemplate.МакетШтемпеляЭЦПOfficeOpen CommonTemplate.ПолучениеДереваОбработчиковОбновления + CommonTemplate.ПустойМакетDOCX CommonTemplate.СтруктураПодчиненности FilterCriterion.СвязанныеДокументы FilterCriterion.ФайлыВТоме @@ -856,10 +876,6 @@ CommonModule.ВнешниеКомпонентыСлужебныйКлиент CommonModule.ВнешниеПользователи CommonModule.ВнешниеПользователиКлиент - CommonModule.ВызовОнлайнПоддержки - CommonModule.ВызовОнлайнПоддержкиВызовСервера - CommonModule.ВызовОнлайнПоддержкиКлиент - CommonModule.ВызовОнлайнПоддержкиПереопределяемый CommonModule.ГенерацияШтрихкода CommonModule.ГенерацияШтрихкодаСерверПовтИсп CommonModule.ГрафикиРаботы @@ -928,6 +944,7 @@ CommonModule.КонструкторФормул CommonModule.КонструкторФормулКлиент CommonModule.КонструкторФормулКлиентСервер + CommonModule.КонструкторФормулПовтИсп CommonModule.КонструкторФормулСлужебный CommonModule.КонтрольВеденияУчета CommonModule.КонтрольВеденияУчетаВызовСервера @@ -954,21 +971,31 @@ CommonModule.НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера CommonModule.НастройкаРазрешенийНаИспользованиеВнешнихРесурсовГлобальный CommonModule.НастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент + CommonModule.НастройкиПрограммы + CommonModule.НастройкиПрограммыКлиент CommonModule.НастройкиПрограммыПереопределяемый CommonModule.ОбменДаннымиXDTOСервер + CommonModule.ОбменДаннымиВебСервис CommonModule.ОбменДаннымиВМоделиСервиса CommonModule.ОбменДаннымиВМоделиСервисаКлиент CommonModule.ОбменДаннымиВМоделиСервисаПереопределяемый CommonModule.ОбменДаннымиВМоделиСервисаПовтИсп CommonModule.ОбменДаннымиВнешнееСоединение + CommonModule.ОбменДаннымиВнутренняяПубликация + CommonModule.ОбменДаннымиВнутренняяПубликацияВызовСервера + CommonModule.ОбменДаннымиВнутренняяПубликацияКлиент CommonModule.ОбменДаннымиВызовСервера CommonModule.ОбменДаннымиГлобальный CommonModule.ОбменДаннымиКлиент + CommonModule.ОбменДаннымиКонтрольЗацикливания CommonModule.ОбменДаннымиПереопределяемый CommonModule.ОбменДаннымиПовтИсп + CommonModule.ОбменДаннымиРегистрацияПовтИсп + CommonModule.ОбменДаннымиРегистрацияСервер CommonModule.ОбменДаннымиСервер CommonModule.ОбменДаннымиСлужебный CommonModule.ОбменДаннымиСобытия + CommonModule.ОбменДаннымиТрансляцияФорматаПовтИсп CommonModule.ОбновлениеИнформационнойБазы CommonModule.ОбновлениеИнформационнойБазыБСД CommonModule.ОбновлениеИнформационнойБазыБСП @@ -1051,6 +1078,7 @@ CommonModule.ПолучениеФайловИзИнтернетаКлиентСервер CommonModule.ПолучениеФайловИзИнтернетаСлужебный CommonModule.ПолучениеФайловИзИнтернетаСлужебныйВызовСервера + CommonModule.ПолучениеФайловИзИнтернетаСлужебныйЛокализация CommonModule.Пользователи CommonModule.ПользователиКлиент CommonModule.ПользователиКлиентСервер @@ -1082,11 +1110,13 @@ CommonModule.РаботаСАдресамиКлиентСервер CommonModule.РаботаСАдресамиПовтИсп CommonModule.РаботаСБанками + CommonModule.РаботаСБанкамиВызовСервера CommonModule.РаботаСБанкамиГлобальный CommonModule.РаботаСБанкамиКлиент CommonModule.РаботаСБанкамиПереопределяемый CommonModule.РаботаСБанкамиСлужебный CommonModule.РаботаСКурсамиВалют + CommonModule.РаботаСКурсамиВалютВызовСервера CommonModule.РаботаСКурсамиВалютГлобальный CommonModule.РаботаСКурсамиВалютКлиент CommonModule.РаботаСКурсамиВалютКлиентСервер @@ -1098,6 +1128,7 @@ CommonModule.РаботаСПочтовымиСообщениямиКлиентПереопределяемый CommonModule.РаботаСПочтовымиСообщениямиПереопределяемый CommonModule.РаботаСПочтовымиСообщениямиСлужебный + CommonModule.РаботаСПочтовымиСообщениямиСлужебныйЛокализация CommonModule.РаботаСФайлами CommonModule.РаботаСФайламиВТомахСлужебный CommonModule.РаботаСФайламиКлиент @@ -1160,6 +1191,8 @@ CommonModule.СообщенияАдминистрированиеОбменаДаннымиКонтрольОбработчикСообщения_2_1_2_1 CommonModule.СообщенияАдминистрированиеОбменаДаннымиУправлениеИнтерфейс CommonModule.СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_2_1_2_1 + CommonModule.СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_3_0_1_1 + CommonModule.СообщенияАдминистрированиеОбменаДаннымиУправлениеТрансляция_2_1_2_1 CommonModule.СообщенияКонтрольДополнительныхОтчетовИОбработокИнтерфейс CommonModule.СообщенияКонтрольДополнительныхОтчетовИОбработокОбработчикТрансляции_1_0_0_1 CommonModule.СообщенияОбменаДаннымиКонтрольИнтерфейс @@ -1316,6 +1349,7 @@ XDTOPackage.АдминистрированиеОбменаДанными_2_4_5_1 XDTOPackage.АдминистрированиеОбменаДаннымиКонтроль XDTOPackage.АдминистрированиеОбменаДаннымиУправление + XDTOPackage.АдминистрированиеОбменаДаннымиУправление_3_0_1_1 XDTOPackage.Адрес XDTOPackage.АдресныйКлассификатор XDTOPackage.КонтактнаяИнформация @@ -1328,17 +1362,13 @@ WebService.Exchange WebService.Exchange_2_0_1_6 WebService.Exchange_3_0_1_1 + WebService.Exchange_3_0_2_1 WebService.InterfaceVersion WebService.RemoteAdministrationOfExchange WebService.RemoteAdministrationOfExchange_2_0_1_6 WebService.RemoteAdministrationOfExchange_2_1_6_1 WebService.RemoteAdministrationOfExchange_2_4_5_1 WebService.RemoteControl - EventSubscription.АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанных - EventSubscription.АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхДокумент - EventSubscription.АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхКонстанта - EventSubscription.АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписей - EventSubscription.АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписейРасчета EventSubscription.ВариантыОтчетовПередУдалениемИдентификатораОбъектаМетаданных EventSubscription.ВариантыОтчетовПриУдаленииПользователя EventSubscription.ВключитьИспользованиеПланаОбмена @@ -1442,12 +1472,14 @@ ScheduledJob.ОтправкаSMS ScheduledJob.ОтправкаСерверныхОповещенийКлиентам ScheduledJob.ОчисткаЗамеровВремени + ScheduledJob.ОчисткаИсторииРассылкиОтчетов ScheduledJob.ОчисткаНенужныхФайлов ScheduledJob.ОчисткаУстаревшихВерсийОбъектов ScheduledJob.ОчисткаУстаревшихДанных ScheduledJob.ПерестроениеАгрегатов ScheduledJob.ПланированиеИзвлеченияТекстаВМоделиСервиса ScheduledJob.ПолучениеИОтправкаЭлектронныхПисем + ScheduledJob.ПолучениеСтатусовЭлектронныхПисем ScheduledJob.ПолучениеСубъектовДляСкрытияПерсональныхДанных ScheduledJob.ПроверкаВеденияУчета ScheduledJob.ПродлениеДостоверностиПодписей @@ -1465,6 +1497,7 @@ ScheduledJob.УдалениеПомеченныхОбъектов ScheduledJob.УдалениеУстаревшихПараметровРаботыВерсийРасширений ScheduledJob.УстановкаПериодаРассчитанныхИтогов + ScheduledJob.УстановкаПорядкаОтложенногоОбновленияВМоделиСервиса ScheduledJob.ЭкспортОценкиПроизводительности SettingsStorage.ХранилищеВариантовОтчетов FunctionalOption.АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО @@ -1491,8 +1524,8 @@ FunctionalOption.ИспользоватьДополнительныйЯзык2 FunctionalOption.ИспользоватьЗаметки FunctionalOption.ИспользоватьНапоминанияПользователя + FunctionalOption.ИспользоватьНастройкиПодключенияВМоделиСервиса FunctionalOption.ИспользоватьНесколькоПроизводственныхКалендарей - FunctionalOption.ИспользоватьОнлайнПоддержку FunctionalOption.ИспользоватьОптимизированнуюЗаписьСозданияАвтономногоРабочегоМеста FunctionalOption.ИспользоватьОтправкуSMSВШаблонахСообщений FunctionalOption.ИспользоватьПодчиненныеБизнесПроцессы @@ -1509,6 +1542,7 @@ FunctionalOption.ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете FunctionalOption.ИспользоватьСинхронизациюФайлов FunctionalOption.ИспользоватьСкрытиеПерсональныхДанныхСубъектов + FunctionalOption.ИспользоватьСценарииВМоделиСервиса FunctionalOption.ИспользоватьУдалениеПомеченныхОбъектов FunctionalOption.ИспользоватьУчетОригиналовПервичныхДокументов FunctionalOption.ИспользоватьШаблоныСообщений @@ -1533,9 +1567,11 @@ FunctionalOption.СтандартныеПодсистемыВАвтономномРежиме FunctionalOption.СтандартныеПодсистемыВЛокальномРежиме FunctionalOption.СтандартныеПодсистемыВМоделиСервиса + FunctionalOption.ХранитьИсториюРассылкиОтчетов FunctionalOption.ХранитьФайлыВТомахНаДиске FunctionalOptionsParameter.ДополнительныеОтчетыИОбработкиОбъектНазначения FunctionalOptionsParameter.ДополнительныеОтчетыИОбработкиТипФормы + FunctionalOptionsParameter.ОбщиеНастройкиУзлов FunctionalOptionsParameter.ТипВерсионируемогоОбъекта DefinedType.АдресатЗапретаИзменения DefinedType.БезопасныйРежим @@ -1573,6 +1609,7 @@ DefinedType.КонтекстПроверокВеденияУчета DefinedType.КурсВалюты DefinedType.МестоХраненияФункциональныхОпций + DefinedType.ОбменДаннымиУчетныеЗаписиЭлектроннойПочты DefinedType.ОбъектАдресации DefinedType.ОбъектСДополнительнымиКомандами DefinedType.ОбъектСклонения @@ -1602,6 +1639,7 @@ DefinedType.ФизическоеЛицо CommonCommand.АвтономнаяРабота CommonCommand.АвтономнаяРаботаВМоделиСервиса + CommonCommand.АрхивСообщенийОбменов CommonCommand.ВремяТекущегоСеанса CommonCommand.ВсеФайлы CommonCommand.ДобавитьПользователейСервиса @@ -1621,19 +1659,20 @@ CommonCommand.Напомнить CommonCommand.НастроитьПрава CommonCommand.НастройкаКолонтитулов - CommonCommand.НастройкаОнлайнПоддержки CommonCommand.НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты CommonCommand.НастройкиПодключения CommonCommand.НастройкиСинхронизацииДанных CommonCommand.НастройкиСинхронизацииДанныхВМоделиСервиса CommonCommand.НачатьИнтервью CommonCommand.Обсуждения + CommonCommand.ОбъектыНезарегистрированныеПриЗацикливании CommonCommand.ОтправитьSMS CommonCommand.ОтправитьПисьмо CommonCommand.ПанельОтчетовАдминистрирование CommonCommand.ПерсональнаяНастройкаПроксиСервера CommonCommand.ПоказатьРезультатРезервногоКопирования CommonCommand.ПолучитьНастройкиСинхронизацииДляДругойПрограммы + CommonCommand.ПомощникПереходаНаИнтернетВнутренняяПубликация CommonCommand.ПраваДоступа CommonCommand.ПредупрежденияПриЗавершенииРаботы CommonCommand.ПредупрежденияПриСинхронизацииДанных @@ -1643,7 +1682,6 @@ CommonCommand.РолиИИсполнителиЗадач CommonCommand.СведенияОПользователе CommonCommand.СвязанныеДокументы - CommonCommand.СвязатьсяСоСпециалистомОнлайнПоддержки CommonCommand.Синхронизировать CommonCommand.СинхронизироватьСДополнительнымиПараметрами CommonCommand.СкрытьПерсональныеДанныеСубъектов @@ -1715,7 +1753,6 @@ Constant.ИспользоватьЗаметки Constant.ИспользоватьНапоминанияПользователя Constant.ИспользоватьНесколькоПроизводственныхКалендарей - Constant.ИспользоватьОнлайнПоддержку Constant.ИспользоватьОптимизированнуюЗаписьСозданияАвтономногоРабочегоМеста Constant.ИспользоватьОтправкуSMSВШаблонахСообщений Constant.ИспользоватьПодчиненныеБизнесПроцессы @@ -1748,6 +1785,7 @@ Constant.КаталогСообщенийОбменаДаннымиДляWindows Constant.КлассификаторОшибокКриптографии Constant.КоличествоЗамеровВПакетеЭкспорта + Constant.КоличествоМесяцевХраненияИсторииРассылкиОтчетов Constant.КоличествоПотоковДлительныхОпераций Constant.КоличествоПотоковОбновленияДоступа Constant.КоличествоПотоковОбновленияИнформационнойБазы @@ -1780,6 +1818,7 @@ Constant.ПериодХраненияЗамеров Constant.ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском Constant.ПользовательСтандартногоИнтерфейсаOData + Constant.ПорядокОбрабатываемыхДанных Constant.ПоследнееОбновлениеДоступа Constant.ПрефиксПоследнегоАвтономногоРабочегоМеста Constant.ПрефиксУзлаРаспределеннойИнформационнойБазы @@ -1815,6 +1854,7 @@ Constant.УсовершенствоватьПодписиАвтоматически Constant.УсовершенствоватьПодписиСДаты Constant.УчетнаяЗаписьДляВосстановленияПароля + Constant.ХранитьИсториюРассылкиОтчетов Constant.ХранитьФайлыВТомахНаДиске Constant.ЭтоАвтономноеРабочееМесто Constant.УдалитьЛогинДоступаКСервисуMorpher @@ -1861,7 +1901,6 @@ CommonForm.НастройкаКолонтитулов CommonForm.НастройкаКомандПечати CommonForm.НастройкаМоихОтчетовИОбработок - CommonForm.НастройкаОнлайнПоддержки CommonForm.НастройкаОтправкиSMS CommonForm.НастройкаПереводаТекста CommonForm.НастройкаРабочегоКаталога @@ -1880,9 +1919,9 @@ CommonForm.ПараметрыАдминистрированияПрограммы CommonForm.ПараметрыПроксиСервера CommonForm.ПечатьДокументов + CommonForm.ПечатьДокументовOfficeOpen CommonForm.ПодготовкаНовогоПисьма CommonForm.ПоддерживаемыеКлиентскиеПриложения - CommonForm.ПоискИсполняемогоФайлаОнлайнПоддержки CommonForm.ПользователиСервиса CommonForm.ПраваДоступа CommonForm.ПраваДоступаУпрощенно @@ -1892,11 +1931,13 @@ CommonForm.ПроверкаФайлаОбновления CommonForm.ПродлениеСрокаДействияЭлектронныхПодписей CommonForm.ПустойРабочийСтол + CommonForm.РазблокированиеРеквизитов CommonForm.РазрешенныеНеаккредитованныеУЦ CommonForm.Расширения CommonForm.РасширенноеПредставлениеОшибки CommonForm.РегиональныеНастройки CommonForm.РедактированиеГиперссылки + CommonForm.РедактированиеДокументаOfficeOpen CommonForm.РедактированиеДополнительныхСведений CommonForm.РедактированиеТабличногоДокумента CommonForm.РезультатПроверки @@ -1913,6 +1954,8 @@ CommonForm.УточнениеКонтактов CommonForm.ФайлыВТоме CommonForm.ФормаВариантаОтчета + CommonForm.ФормаВыбораЦвета + CommonForm.ФормаВыбораШрифта CommonForm.ФормаНастроекОтчета CommonForm.ФормаОтчета CommonForm.ФормаПоиска @@ -2013,6 +2056,7 @@ Enum.ВидыТранспортаСообщенийОбмена Enum.ВидыФлажкаВАнкетах Enum.ДействияПриОбмене + Enum.ДействияПриОбменеВнутренняяПубликация Enum.ДействияСФайламиПоДвойномуЩелчку Enum.ДополнительныеЗначенияДоступа Enum.ДоступныеПериодыОтчета @@ -2020,6 +2064,7 @@ Enum.ОперацииАдминистрированияПрофилейБезопасности Enum.ПериодичностиРасписанийРассылокОтчетов Enum.ПериодОчисткиФайлов + Enum.ПорядокОбработчиковОбновления Enum.ПорядокОтветовНаЗапросыУведомленийОПрочтении Enum.ПриоритетыОбъектовОбмена Enum.ПричиныОтключенияДополнительныхОтчетовИОбработокВМоделиСервиса @@ -2030,6 +2075,7 @@ Enum.РежимыВыгрузкиОбъектовОбмена Enum.РежимыВыполненияОбработчиков Enum.РежимыВыполненияОтложенныхОбработчиков + Enum.РежимыИспользованияПрограммыЭлектроннойПодписи Enum.РежимыОчисткиФайлов Enum.РежимыСовместимостиРазрешенийДополнительныхОтчетовИОбработок Enum.РезультатыВыполненияОбмена @@ -2057,6 +2103,7 @@ Enum.СтатусыИзвлеченияТекстаФайлов Enum.СтатусыИсходящегоЭлектронногоПисьма Enum.СтатусыОбработчиковОбновления + Enum.СтатусыЭлектронныхПисем Enum.ТипыВерсийОбъекта Enum.ТипыВопросовШаблонаАнкеты Enum.ТипыДанныхКэшаПрограммныхИнтерфейсов @@ -2086,11 +2133,13 @@ Report.ДатыЗапретаЗагрузки Report.ДатыЗапретаИзменения Report.ДвиженияДокумента + Report.ДлительностьОтложенногоОбновления Report.ЗависшиеЗадачи Report.Задания Report.Задачи Report.ЗадачиИстекающиеНаДату Report.ИспользуемыеВнешниеРесурсы + Report.КонтрольРассылкиОтчетов Report.МестаИспользованияСсылок Report.ОбъемНенужныхФайлов Report.ОценкаПроизводительности @@ -2177,6 +2226,7 @@ DataProcessor.УстановкаОбновлений InformationRegister.АдминистративнаяИерархия InformationRegister.АдресныеОбъекты + InformationRegister.АрхивСообщенийОбменов InformationRegister.БезопасноеХранилищеДанных InformationRegister.БезопасноеХранилищеДанныхОбластейДанных InformationRegister.БлокировкиСеансовОбластейДанных @@ -2200,6 +2250,7 @@ InformationRegister.ЗаблокированныеДляПолученияУчетныеЗаписи InformationRegister.ЗависимостиПравДоступа InformationRegister.ЗагруженныеВерсииАдресныхСведений + InformationRegister.ЗадачиОбменаДаннымиВнутренняяПубликация InformationRegister.ЗамерыВремени InformationRegister.ЗамерыВремениТехнологические InformationRegister.ЗамерыКомментарииСтатистики @@ -2222,6 +2273,7 @@ InformationRegister.ИсторияАдминистративнойИерархии InformationRegister.ИсторияАдресныхОбъектов InformationRegister.ИсторияМуниципальнойИерархии + InformationRegister.ИсторияРассылкиОтчетов InformationRegister.КалендарныеГрафики InformationRegister.КлючиДоступаВнешнихПользователей InformationRegister.КлючиДоступаГруппДоступа @@ -2234,6 +2286,7 @@ InformationRegister.КомментарииОперацииСтатистики InformationRegister.КомментарииСтатистики InformationRegister.КонтактыВзаимодействий + InformationRegister.КонтурСинхронизации InformationRegister.КурсыВалют InformationRegister.КэшПереводов InformationRegister.КэшПрограммныхИнтерфейсов @@ -2243,6 +2296,7 @@ InformationRegister.НаличиеФайлов InformationRegister.НапоминанияПользователя InformationRegister.НаследованиеНастроекПравОбъектов + InformationRegister.НастройкиАрхиваСообщенийОбменов InformationRegister.НастройкиВариантовОтчетов InformationRegister.НастройкиВерсионированияОбъектов InformationRegister.НастройкиКомандПечати @@ -2268,6 +2322,7 @@ InformationRegister.ОбработчикиСобытийСинхронизацииДанных InformationRegister.ОбщиеНастройкиУзловИнформационныхБаз InformationRegister.ОбщиеПоставляемыеМакетыПечати + InformationRegister.ОбъектыНезарегистрированныеПриЗацикливании InformationRegister.ОперацииСтатистики InformationRegister.ОповещенияПользователейСертификатов InformationRegister.ОтветыНаВопросыАнкет @@ -2303,6 +2358,7 @@ InformationRegister.РучныеИзмененияГрафиковРаботы InformationRegister.СведенияОПользователях InformationRegister.СведенияОФайлах + InformationRegister.СертификатыПолучателейРассылкиОтчетов InformationRegister.СертификатыПользователяDSS InformationRegister.СертификатыШифрования InformationRegister.СессииОбменаСообщениямиСистемы @@ -2332,6 +2388,7 @@ InformationRegister.УдаляемыеОбъекты InformationRegister.УровниСокращенийАдресныхСведений InformationRegister.ФайлыВРабочемКаталоге + InformationRegister.ФиксацияОбработкиДанныхОбработчиками InformationRegister.ЭлектронныеПодписи InformationRegister.УдалитьЗамерыВремени3 InformationRegister.УдалитьНастройкиТранспортаОбмена diff --git a/SSL/src/Configuration/ManagedApplicationModule.bsl b/SSL/src/Configuration/ManagedApplicationModule.bsl index bc4a83ded..ca0945557 100644 --- a/SSL/src/Configuration/ManagedApplicationModule.bsl +++ b/SSL/src/Configuration/ManagedApplicationModule.bsl @@ -59,17 +59,14 @@ КонецПроцедуры -Процедура ОбработкаПолученияФормыВыбораПользователейСистемыВзаимодействия(НазначениеВыбора, Форма, ИдентификаторОбсуждения, Параметры, ВыбраннаяФорма, СтандартнаяОбработка) +Процедура ОбработкаПолученияФормыВыбораПользователейСистемыВзаимодействия(НазначениеВыбора, + Форма, ИдентификаторОбсуждения, Параметры, ВыбраннаяФорма, СтандартнаяОбработка) - // СтандартныеПодсистемы.Обсуждения - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда + // СтандартныеПодсистемы + СтандартныеПодсистемыКлиент.ОбработкаПолученияФормыВыбораПользователейСистемыВзаимодействия(НазначениеВыбора, + Форма, ИдентификаторОбсуждения, Параметры, ВыбраннаяФорма, СтандартнаяОбработка); + // Конец СтандартныеПодсистемы - МодульОбсужденияСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбсужденияСлужебныйКлиент"); - МодульОбсужденияСлужебныйКлиент.ПриПолученииФормыВыбораПользователейСистемыВзаимодействия(НазначениеВыбора, Форма, ИдентификаторОбсуждения, Параметры, ВыбраннаяФорма, СтандартнаяОбработка); - - КонецЕсли; - // Конец СтандартныеПодсистемы.Обсуждения - КонецПроцедуры #КонецОбласти \ No newline at end of file diff --git a/SSL/src/Configuration/OrdinaryApplicationModule.bsl b/SSL/src/Configuration/OrdinaryApplicationModule.bsl index bc4a83ded..ca0945557 100644 --- a/SSL/src/Configuration/OrdinaryApplicationModule.bsl +++ b/SSL/src/Configuration/OrdinaryApplicationModule.bsl @@ -59,17 +59,14 @@ КонецПроцедуры -Процедура ОбработкаПолученияФормыВыбораПользователейСистемыВзаимодействия(НазначениеВыбора, Форма, ИдентификаторОбсуждения, Параметры, ВыбраннаяФорма, СтандартнаяОбработка) +Процедура ОбработкаПолученияФормыВыбораПользователейСистемыВзаимодействия(НазначениеВыбора, + Форма, ИдентификаторОбсуждения, Параметры, ВыбраннаяФорма, СтандартнаяОбработка) - // СтандартныеПодсистемы.Обсуждения - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда + // СтандартныеПодсистемы + СтандартныеПодсистемыКлиент.ОбработкаПолученияФормыВыбораПользователейСистемыВзаимодействия(НазначениеВыбора, + Форма, ИдентификаторОбсуждения, Параметры, ВыбраннаяФорма, СтандартнаяОбработка); + // Конец СтандартныеПодсистемы - МодульОбсужденияСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбсужденияСлужебныйКлиент"); - МодульОбсужденияСлужебныйКлиент.ПриПолученииФормыВыбораПользователейСистемыВзаимодействия(НазначениеВыбора, Форма, ИдентификаторОбсуждения, Параметры, ВыбраннаяФорма, СтандартнаяОбработка); - - КонецЕсли; - // Конец СтандартныеПодсистемы.Обсуждения - КонецПроцедуры #КонецОбласти \ No newline at end of file diff --git a/SSL/src/Configuration/ParentConfigurations.bin b/SSL/src/Configuration/ParentConfigurations.bin index ea16ff81d..3f3a6f6af 100644 --- a/SSL/src/Configuration/ParentConfigurations.bin +++ b/SSL/src/Configuration/ParentConfigurations.bin @@ -1 +1 @@ -{6,1,1,b3e8e610-8b99-420f-aaa1-7c66d0cf5a60,1,3bd8fee9-d2e5-4e48-98fa-b42d8bed78f5,"3.1.7.382","Фирма ""1С""","БиблиотекаСтандартныхПодсистем",6786,1,0,9e456d66-766a-4a91-8559-f497339a8374,9e456d66-766a-4a91-8559-f497339a8374,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,153e11ac-f898-46a5-98c6-734adb933ca2,153e11ac-f898-46a5-98c6-734adb933ca2,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,fd930b50-4ada-4e7f-8bfd-ed9a7c4e8964,fd930b50-4ada-4e7f-8bfd-ed9a7c4e8964,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,ea36c426-2b43-4232-9978-0104bafd345d,ea36c426-2b43-4232-9978-0104bafd345d,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,0a83f9ec-eabe-4e8f-9fa9-0067acad6fc4,0a83f9ec-eabe-4e8f-9fa9-0067acad6fc4,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,5a83b75a-38b0-4d15-9c6f-c201fa97e485,5a83b75a-38b0-4d15-9c6f-c201fa97e485,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,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,87ba683b-b69c-4b23-854c-037b770a3ebb,87ba683b-b69c-4b23-854c-037b770a3ebb,1,0,1357adf5-0f5d-4930-afea-edc89db4d0a6,1357adf5-0f5d-4930-afea-edc89db4d0a6,1,0,505ff816-0d42-458a-b7b5-7d007c15d1be,505ff816-0d42-458a-b7b5-7d007c15d1be,1,0,27811a76-d8bd-43a5-9898-944bdd1388ce,27811a76-d8bd-43a5-9898-944bdd1388ce,1,0,363215fe-59f3-4d9a-a8c7-94049882147a,363215fe-59f3-4d9a-a8c7-94049882147a,1,0,3d4597ca-1c97-4116-b966-87970cd7ebdf,3d4597ca-1c97-4116-b966-87970cd7ebdf,1,0,715f7ba5-ca82-49e6-8671-fc1b55b740b5,715f7ba5-ca82-49e6-8671-fc1b55b740b5,1,0,0add6d62-bf4f-476c-9f6b-37633fcd6b0e,0add6d62-bf4f-476c-9f6b-37633fcd6b0e,1,0,93e495a4-207d-4216-b63e-a8b169b2b801,93e495a4-207d-4216-b63e-a8b169b2b801,1,0,3b47221a-ad5f-419c-b503-a4a88505d336,3b47221a-ad5f-419c-b503-a4a88505d336,1,0,0149a9c0-245b-4dfe-aa98-e8b02ba85c99,0149a9c0-245b-4dfe-aa98-e8b02ba85c99,1,0,94abbe1e-44d8-43c1-90fb-71bc9b6621a9,94abbe1e-44d8-43c1-90fb-71bc9b6621a9,1,0,2edfc563-9fd8-4f7c-8cd4-ba3c27c08840,2edfc563-9fd8-4f7c-8cd4-ba3c27c08840,1,0,d0d052c7-68b9-4b2b-9bbf-4fb083327dca,d0d052c7-68b9-4b2b-9bbf-4fb083327dca,1,0,807194b1-2460-4872-8430-e34f6970178f,807194b1-2460-4872-8430-e34f6970178f,1,0,b0409473-768f-4c29-89d3-6201e8476157,b0409473-768f-4c29-89d3-6201e8476157,1,0,d8415773-616e-43e4-9deb-e92200659d53,d8415773-616e-43e4-9deb-e92200659d53,1,0,b228f0de-7cd7-4337-b021-bc1beb980afd,b228f0de-7cd7-4337-b021-bc1beb980afd,1,0,c9178048-5d75-4d1b-a714-50d772e8d343,c9178048-5d75-4d1b-a714-50d772e8d343,1,0,661b7581-27ad-4cec-8618-9c314cb3a4d5,661b7581-27ad-4cec-8618-9c314cb3a4d5,1,0,310a8f7d-5b1f-428c-885d-1127b7789efd,310a8f7d-5b1f-428c-885d-1127b7789efd,1,0,ee5efc54-aa35-467f-b085-64f24819aaa7,ee5efc54-aa35-467f-b085-64f24819aaa7,1,0,376c8f0b-9d2e-4262-a26f-b63f1163c1c4,376c8f0b-9d2e-4262-a26f-b63f1163c1c4,1,0,d37c82e1-cc9f-492c-a7fb-0e6e9d8f6a72,d37c82e1-cc9f-492c-a7fb-0e6e9d8f6a72,1,0,b7ebf08a-d6be-42db-b28a-460df037d7ba,b7ebf08a-d6be-42db-b28a-460df037d7ba,1,0,ec3c34f6-b3b3-4a96-a231-aaf70db1e73d,ec3c34f6-b3b3-4a96-a231-aaf70db1e73d,1,0,8aa9daa0-e073-49f4-8346-7f2c809fac9a,8aa9daa0-e073-49f4-8346-7f2c809fac9a,1,0,043074cb-64aa-45ed-a2f3-b4fa252431cc,043074cb-64aa-45ed-a2f3-b4fa252431cc,1,0,9cc72214-6e84-45e6-aafd-b36205730faa,9cc72214-6e84-45e6-aafd-b36205730faa,1,0,768eb7d6-d37e-4182-961e-464a5e08781b,768eb7d6-d37e-4182-961e-464a5e08781b,1,0,4df52b04-759d-471d-9de4-3ba4d00d1d22,4df52b04-759d-471d-9de4-3ba4d00d1d22,1,0,5768f558-50b6-4682-960c-6894f6953461,5768f558-50b6-4682-960c-6894f6953461,1,0,74126b65-4f3b-4f8d-b7fc-1d2705822463,74126b65-4f3b-4f8d-b7fc-1d2705822463,1,0,75a4b472-00b6-4b2f-bb6b-03bdc0b05dcf,75a4b472-00b6-4b2f-bb6b-03bdc0b05dcf,1,0,8506ad71-85eb-4f91-b892-4e75318649c8,8506ad71-85eb-4f91-b892-4e75318649c8,1,0,6e3010f5-f725-4361-b853-768412b1ad6f,6e3010f5-f725-4361-b853-768412b1ad6f,1,0,40d8803a-2f6d-4091-be54-9d9827a53e30,40d8803a-2f6d-4091-be54-9d9827a53e30,1,0,ea2b936c-be5c-4316-aca9-4f890f4e6ec9,ea2b936c-be5c-4316-aca9-4f890f4e6ec9,1,0,092501bf-dd8e-4f50-8c58-b1b028b50a5a,092501bf-dd8e-4f50-8c58-b1b028b50a5a,1,0,927cfec6-c1e3-4152-aa2e-afa89359b5eb,927cfec6-c1e3-4152-aa2e-afa89359b5eb,1,0,8e986c32-7296-4329-a908-704398428e4e,8e986c32-7296-4329-a908-704398428e4e,1,0,c5b8870c-14cb-43ae-8d44-d639bd059b0e,c5b8870c-14cb-43ae-8d44-d639bd059b0e,1,0,bc98265e-329d-41d1-9fe8-4c78b7998cd2,bc98265e-329d-41d1-9fe8-4c78b7998cd2,1,0,b44c8a6b-0e3f-446b-95f7-6cb4a58f13e0,b44c8a6b-0e3f-446b-95f7-6cb4a58f13e0,1,0,7601f9c7-2fe7-43fb-a7a9-cf5be4475ce1,7601f9c7-2fe7-43fb-a7a9-cf5be4475ce1,1,0,2da686d3-38b0-4cf1-9962-1440d1afd050,2da686d3-38b0-4cf1-9962-1440d1afd050,1,0,71518348-f155-4616-bbdc-742e36cd3964,71518348-f155-4616-bbdc-742e36cd3964,1,0,723a58ca-9947-4320-9bf4-7c6b58aee2f5,723a58ca-9947-4320-9bf4-7c6b58aee2f5,1,0,2df24487-0b76-451d-a08f-21dc03adefa4,2df24487-0b76-451d-a08f-21dc03adefa4,1,0,00813d65-8dae-45a8-8691-d0b17d6d7754,00813d65-8dae-45a8-8691-d0b17d6d7754,1,0,d88166a7-ef6c-453a-b6cc-1c574cf6ea85,d88166a7-ef6c-453a-b6cc-1c574cf6ea85,1,0,aae1a856-ff88-41bb-a887-1b8c2c3eeab6,aae1a856-ff88-41bb-a887-1b8c2c3eeab6,1,0,cf2b8654-02b6-441e-98a9-cb8bea5cac89,cf2b8654-02b6-441e-98a9-cb8bea5cac89,1,0,2181bde8-031d-425e-875f-0bd153b634f2,2181bde8-031d-425e-875f-0bd153b634f2,1,0,ee1b81ac-0182-48dd-a348-1d8ba38869ca,ee1b81ac-0182-48dd-a348-1d8ba38869ca,1,0,ad385d3e-8201-402a-a1a8-267bc8c6d56b,ad385d3e-8201-402a-a1a8-267bc8c6d56b,1,0,53bb97e3-cd96-462a-b91f-c82678568d9a,53bb97e3-cd96-462a-b91f-c82678568d9a,1,0,32ca3bd6-7b32-4eab-8a4e-aeac26604e08,32ca3bd6-7b32-4eab-8a4e-aeac26604e08,1,0,2a702d37-8e83-4fa0-9969-5d954a7096c1,2a702d37-8e83-4fa0-9969-5d954a7096c1,1,0,71b7225e-6486-4916-85b2-8ec14363ebc8,71b7225e-6486-4916-85b2-8ec14363ebc8,1,0,2df34fcd-3118-4871-95d7-807dece77d3f,2df34fcd-3118-4871-95d7-807dece77d3f,1,0,32db89ab-74d3-4f80-9352-65e405770906,32db89ab-74d3-4f80-9352-65e405770906,1,0,21c22027-2036-4136-a98e-500e5cd679d1,21c22027-2036-4136-a98e-500e5cd679d1,1,0,6fe56db7-0f48-4dd0-b509-5372019ddcc2,6fe56db7-0f48-4dd0-b509-5372019ddcc2,1,0,884990f4-54f1-4b05-a5ed-40ee5a7a549a,884990f4-54f1-4b05-a5ed-40ee5a7a549a,1,0,4cf71e62-c8c2-4bc7-87fc-a89e48f2c007,4cf71e62-c8c2-4bc7-87fc-a89e48f2c007,1,0,e5a9260b-c18b-47bf-bc5a-23294e13025a,e5a9260b-c18b-47bf-bc5a-23294e13025a,1,0,02f00688-a2ed-4f91-bd41-50fc29e13d6c,02f00688-a2ed-4f91-bd41-50fc29e13d6c,1,0,e9f2b435-13e3-401a-9324-ca44986b7676,e9f2b435-13e3-401a-9324-ca44986b7676,1,0,2b854852-ae2d-46d8-8c3b-228af7a3f1db,2b854852-ae2d-46d8-8c3b-228af7a3f1db,1,0,11346c91-ecb6-40e6-a2fb-df7e6f5dbaed,11346c91-ecb6-40e6-a2fb-df7e6f5dbaed,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,27f793d8-da6a-4502-9b7e-82b8af7264d1,27f793d8-da6a-4502-9b7e-82b8af7264d1,1,0,4d3f3c76-999c-4105-8b64-cd4b7bc861b9,4d3f3c76-999c-4105-8b64-cd4b7bc861b9,1,0,efcf8b0f-7124-4096-9f50-b9b95369f196,efcf8b0f-7124-4096-9f50-b9b95369f196,1,0,c1f2db60-011c-4a0b-97bb-42e005ba51c9,c1f2db60-011c-4a0b-97bb-42e005ba51c9,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,993193b3-1dd8-4f5b-8ce7-6a0bf8c4330c,993193b3-1dd8-4f5b-8ce7-6a0bf8c4330c,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,75378d9c-a364-4b46-a6d1-b745604c46a2,75378d9c-a364-4b46-a6d1-b745604c46a2,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,2df403a2-57d8-4578-b017-e7cf9550b708,2df403a2-57d8-4578-b017-e7cf9550b708,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,5e232e6a-7f68-40d2-9555-4a2b3debe095,5e232e6a-7f68-40d2-9555-4a2b3debe095,1,0,efc8ca7d-966d-4c18-acd9-90f22dd75a7a,efc8ca7d-966d-4c18-acd9-90f22dd75a7a,1,0,1780ffa9-1ca3-4bcb-823f-5e582c4cc25e,1780ffa9-1ca3-4bcb-823f-5e582c4cc25e,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,71cad48a-37f2-4894-b876-9d74fa844828,71cad48a-37f2-4894-b876-9d74fa844828,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,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,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,40f93527-7bff-4f9c-b855-2b69f7c5eb33,40f93527-7bff-4f9c-b855-2b69f7c5eb33,1,0,697bd1de-bbef-4362-aa39-71f6008f4bd7,697bd1de-bbef-4362-aa39-71f6008f4bd7,1,0,676b2ea2-a559-4685-b5ca-7b619b02f101,676b2ea2-a559-4685-b5ca-7b619b02f101,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,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,1f018218-2281-4e32-a486-f32386959e5f,1f018218-2281-4e32-a486-f32386959e5f,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,beb07009-6612-4052-a991-888138da8e30,beb07009-6612-4052-a991-888138da8e30,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,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,5e4ec9d8-bb60-4dfb-89ba-002527dc149b,5e4ec9d8-bb60-4dfb-89ba-002527dc149b,1,0,bf463763-3801-4664-9d04-4d9fd7fe8c43,bf463763-3801-4664-9d04-4d9fd7fe8c43,1,0,43a0760f-3635-4e6a-a68a-1a2232245329,43a0760f-3635-4e6a-a68a-1a2232245329,1,0,5c64a4dd-2b9f-4110-abe2-266e6d8638fb,5c64a4dd-2b9f-4110-abe2-266e6d8638fb,1,0,d408d054-86ac-4471-a29d-efed65989899,d408d054-86ac-4471-a29d-efed65989899,1,0,3e979ec3-b544-4e37-8be6-95dce0a2b780,3e979ec3-b544-4e37-8be6-95dce0a2b780,1,0,2444eed3-25c7-4abc-a9a8-f3f3a8201267,2444eed3-25c7-4abc-a9a8-f3f3a8201267,1,0,e91118e9-d054-41a1-bfe9-343179718f33,e91118e9-d054-41a1-bfe9-343179718f33,1,0,042245ef-3a30-46fb-b3e3-6599d5426cbd,042245ef-3a30-46fb-b3e3-6599d5426cbd,1,0,d1034240-ab06-413a-9828-a5c7dc879680,d1034240-ab06-413a-9828-a5c7dc879680,1,0,5dd0f264-6d9f-41e4-92b6-e8b4fa3b4d84,5dd0f264-6d9f-41e4-92b6-e8b4fa3b4d84,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,e5033559-9d58-4b9b-a739-40c419e82192,e5033559-9d58-4b9b-a739-40c419e82192,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,ea868745-71fc-483c-aa6e-f242c06c673f,ea868745-71fc-483c-aa6e-f242c06c673f,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,ea0a498a-a1cb-4f28-88cb-0bc62971172b,ea0a498a-a1cb-4f28-88cb-0bc62971172b,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,801facc3-3b3b-4d0a-93c6-54a1f3495291,801facc3-3b3b-4d0a-93c6-54a1f3495291,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,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,9bb33b9f-0a27-4edd-b3b2-1c20a75d0f20,9bb33b9f-0a27-4edd-b3b2-1c20a75d0f20,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,bdafe976-c8d6-413a-8d61-765a02014e5d,bdafe976-c8d6-413a-8d61-765a02014e5d,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,6eb6003c-71cb-4be8-a375-abd5c9f7336b,6eb6003c-71cb-4be8-a375-abd5c9f7336b,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,bd206271-1388-4759-8992-da81507613be,bd206271-1388-4759-8992-da81507613be,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,f6b8e6ae-7d3e-4f6c-bd74-66ee7593868c,f6b8e6ae-7d3e-4f6c-bd74-66ee7593868c,1,0,e730ea3f-4f2a-4e21-8851-bccc51830cfe,e730ea3f-4f2a-4e21-8851-bccc51830cfe,1,0,193ab4a7-7eee-4374-95cf-2d907a3ba971,193ab4a7-7eee-4374-95cf-2d907a3ba971,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,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,e8cc4e0f-e9c2-4a24-a50e-f5be5ed21019,e8cc4e0f-e9c2-4a24-a50e-f5be5ed21019,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,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,e7903c89-5282-4771-8f9b-536694b7816e,e7903c89-5282-4771-8f9b-536694b7816e,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,61c1ff46-2a30-43bb-b1df-4db2271b1b12,61c1ff46-2a30-43bb-b1df-4db2271b1b12,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,72d579ee-8cd5-4b08-9f3f-eb15f14ee194,72d579ee-8cd5-4b08-9f3f-eb15f14ee194,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,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,9c472614-595a-4456-aadd-f629455a754e,9c472614-595a-4456-aadd-f629455a754e,1,0,c205ddad-54ed-476f-85cd-e133313fe3a5,c205ddad-54ed-476f-85cd-e133313fe3a5,1,0,98edbda8-2511-4743-b643-28934af0ed74,98edbda8-2511-4743-b643-28934af0ed74,1,0,db1f2fdc-6862-43c0-aefa-499f8c2b585c,db1f2fdc-6862-43c0-aefa-499f8c2b585c,1,0,c9a0afb1-65fa-45ea-aabb-5ec080d9406e,c9a0afb1-65fa-45ea-aabb-5ec080d9406e,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,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,9162a85e-a385-42b0-b809-da916fce44b7,9162a85e-a385-42b0-b809-da916fce44b7,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,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,5a2f2284-4f86-4ee4-8b53-296c2787f320,5a2f2284-4f86-4ee4-8b53-296c2787f320,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,c1f7437a-b278-4941-b580-75c6693155d0,c1f7437a-b278-4941-b580-75c6693155d0,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,836dfba9-c948-409b-825f-f0d869872835,836dfba9-c948-409b-825f-f0d869872835,1,0,137ec4ee-5053-47a7-8f5d-f6e63174608f,137ec4ee-5053-47a7-8f5d-f6e63174608f,1,0,4e6d38c5-2a09-4473-9e04-8f631fe88c61,4e6d38c5-2a09-4473-9e04-8f631fe88c61,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,8583ca82-a4f5-4f2a-9b9a-7807b4560e85,8583ca82-a4f5-4f2a-9b9a-7807b4560e85,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,baec0e60-c410-4b95-8126-f77fd06225b4,baec0e60-c410-4b95-8126-f77fd06225b4,1,0,91275c80-d7f7-47c6-ba76-4a10d394f55b,91275c80-d7f7-47c6-ba76-4a10d394f55b,1,0,b92edc24-fcf7-498d-97a2-0c7f3005c814,b92edc24-fcf7-498d-97a2-0c7f3005c814,1,0,2b97f923-6a4e-4894-9ece-5129d8832864,2b97f923-6a4e-4894-9ece-5129d8832864,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,96cd8b90-5cf3-416c-b3a2-1f62e158b37e,96cd8b90-5cf3-416c-b3a2-1f62e158b37e,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,f00116da-2bf1-4edd-b939-f25d36774f5b,f00116da-2bf1-4edd-b939-f25d36774f5b,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,b1230b96-f4c8-4311-bfc0-df33bcc41394,b1230b96-f4c8-4311-bfc0-df33bcc41394,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,ddaba839-5ed2-4707-8cb8-ebd5784f642a,ddaba839-5ed2-4707-8cb8-ebd5784f642a,1,0,86c679c0-3531-4622-9a1f-3d9d6ccdd431,86c679c0-3531-4622-9a1f-3d9d6ccdd431,1,0,cba9e94c-e328-42ef-bcd0-92db3f0c048b,cba9e94c-e328-42ef-bcd0-92db3f0c048b,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,667f0c7e-fa70-49e9-97c9-ad04819fee58,667f0c7e-fa70-49e9-97c9-ad04819fee58,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,546af6c0-0762-4d2d-9d3b-c6a8f6c57674,546af6c0-0762-4d2d-9d3b-c6a8f6c57674,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,9299b382-fc65-4f89-8329-94fec125761c,9299b382-fc65-4f89-8329-94fec125761c,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,b2f17ef1-3f6f-4029-b3e2-28d6b79c5b76,b2f17ef1-3f6f-4029-b3e2-28d6b79c5b76,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,7adced5f-3a5f-419a-926c-0452aad86c86,7adced5f-3a5f-419a-926c-0452aad86c86,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,2181d197-028b-40b2-bf02-3d85dad1af30,2181d197-028b-40b2-bf02-3d85dad1af30,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,bc039475-c872-4b99-9248-c74aae75f0e1,bc039475-c872-4b99-9248-c74aae75f0e1,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,8cf925d9-6811-4bce-b116-09d6a26ff3cb,8cf925d9-6811-4bce-b116-09d6a26ff3cb,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,36999e1b-865e-41ad-b9d6-1b3ac887acfb,36999e1b-865e-41ad-b9d6-1b3ac887acfb,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,af52cd7d-374a-4c46-a74c-305e154dc6f2,af52cd7d-374a-4c46-a74c-305e154dc6f2,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,2a985b50-a4b1-4932-8af6-51eee8e78ac8,2a985b50-a4b1-4932-8af6-51eee8e78ac8,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,fe9eca7c-6e3d-4c3f-b98d-abd8ab05d35e,fe9eca7c-6e3d-4c3f-b98d-abd8ab05d35e,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,7ad16fb4-17eb-4812-8015-9447d92e08ce,7ad16fb4-17eb-4812-8015-9447d92e08ce,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,8bd56034-6d56-4c2f-8e7f-4c0fff49ac39,8bd56034-6d56-4c2f-8e7f-4c0fff49ac39,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,dc14a27a-2299-4bd5-8c0e-5f84adae507a,dc14a27a-2299-4bd5-8c0e-5f84adae507a,1,0,bf20e6ce-bbe6-4523-9381-f9cb6cad348c,bf20e6ce-bbe6-4523-9381-f9cb6cad348c,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,8dad7f71-63cb-449a-bafd-79bd63f10310,8dad7f71-63cb-449a-bafd-79bd63f10310,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,ae039438-89af-4217-910d-476115f51ab2,ae039438-89af-4217-910d-476115f51ab2,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,6a9f1485-21a4-41e8-b8a7-26340eff5085,6a9f1485-21a4-41e8-b8a7-26340eff5085,1,0,630845af-a7dc-4d1e-8c1a-44fa65aab036,630845af-a7dc-4d1e-8c1a-44fa65aab036,1,0,65dd4904-0837-4de5-a5e5-601151055d94,65dd4904-0837-4de5-a5e5-601151055d94,1,0,d20739a3-a149-4b64-b9ca-4a76aca06cb8,d20739a3-a149-4b64-b9ca-4a76aca06cb8,1,0,99c5e87a-f096-4315-8fbe-f596ea9c176f,99c5e87a-f096-4315-8fbe-f596ea9c176f,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,db445527-7bd2-448b-bf87-5ac0c10d742d,db445527-7bd2-448b-bf87-5ac0c10d742d,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,a43fbfd8-6324-4192-a1a6-5628a7edb4d2,a43fbfd8-6324-4192-a1a6-5628a7edb4d2,1,0,84395058-d46a-428c-b782-a9fa89fea14a,84395058-d46a-428c-b782-a9fa89fea14a,1,0,c3c1a825-6b35-4b09-8043-63f75b575707,c3c1a825-6b35-4b09-8043-63f75b575707,1,0,5465466d-48be-493a-aadc-e97046b010cc,5465466d-48be-493a-aadc-e97046b010cc,1,0,fa61df43-49e7-4d5f-a0b9-f35af199f9f5,fa61df43-49e7-4d5f-a0b9-f35af199f9f5,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,766c9bee-b0fc-4a7f-b88e-cd8c4aad73b8,766c9bee-b0fc-4a7f-b88e-cd8c4aad73b8,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,85b591b4-a93d-4fcb-bdc7-e6d44436e511,85b591b4-a93d-4fcb-bdc7-e6d44436e511,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,0a1837b6-9a0a-4a86-b929-89d032d41383,0a1837b6-9a0a-4a86-b929-89d032d41383,1,0,62ff29be-7d52-4c63-8726-c55bf69a64de,62ff29be-7d52-4c63-8726-c55bf69a64de,1,0,e55d259f-cfaa-46f9-92c4-687e1ff3b89d,e55d259f-cfaa-46f9-92c4-687e1ff3b89d,1,0,cb81fb9f-16a2-4265-92a9-b827ca2fd588,cb81fb9f-16a2-4265-92a9-b827ca2fd588,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,52fd1e04-44b6-4405-a2de-ec5c0cf66b64,52fd1e04-44b6-4405-a2de-ec5c0cf66b64,1,0,9a647b38-73da-4491-997b-773059cfd1c9,9a647b38-73da-4491-997b-773059cfd1c9,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,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,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,800ef5f0-fdd1-4f8b-8c0b-9744952bfb5b,800ef5f0-fdd1-4f8b-8c0b-9744952bfb5b,1,0,b51eaf45-baa1-4d1c-bcb7-a89bb8bcc26a,b51eaf45-baa1-4d1c-bcb7-a89bb8bcc26a,1,0,0f314b6b-5ed1-46ed-bdfd-cf53330c2783,0f314b6b-5ed1-46ed-bdfd-cf53330c2783,1,0,322645d4-e3fb-467b-a55d-d8e74cff2ea3,322645d4-e3fb-467b-a55d-d8e74cff2ea3,1,0,5ea29362-0ab7-4ca3-865e-bf93db5ca24b,5ea29362-0ab7-4ca3-865e-bf93db5ca24b,1,0,8363bd46-1ea5-44f0-858a-05bc03f6020e,8363bd46-1ea5-44f0-858a-05bc03f6020e,1,0,0f039952-09d3-49c8-b909-e8333a3fc8f9,0f039952-09d3-49c8-b909-e8333a3fc8f9,1,0,d8fc4644-5351-443c-8b5d-5de2c4b855d1,d8fc4644-5351-443c-8b5d-5de2c4b855d1,1,0,64ff6058-c6f3-4682-b9a1-11ec438fa447,64ff6058-c6f3-4682-b9a1-11ec438fa447,1,0,9cd2fc77-a4b0-457e-a6b0-63dbf521bf90,9cd2fc77-a4b0-457e-a6b0-63dbf521bf90,1,0,a321b6db-391b-4c65-8d27-ce486d10055e,a321b6db-391b-4c65-8d27-ce486d10055e,1,0,71dfde27-3762-4dd0-9252-6e703ce1b101,71dfde27-3762-4dd0-9252-6e703ce1b101,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,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,0eea37cc-47f8-4819-85da-d4991f4e58ed,0eea37cc-47f8-4819-85da-d4991f4e58ed,1,0,45a2569e-820c-4d7d-ba74-4a781d26bb2b,45a2569e-820c-4d7d-ba74-4a781d26bb2b,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,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,826c2821-147d-4aaf-910c-acfbdb58a29f,826c2821-147d-4aaf-910c-acfbdb58a29f,1,0,aeea0075-bdeb-41b7-b9cc-1da7b500455f,aeea0075-bdeb-41b7-b9cc-1da7b500455f,1,0,11c086b0-c646-4701-983d-c38758286354,11c086b0-c646-4701-983d-c38758286354,1,0,21fad9b6-44df-417c-ba18-de4b8af98a34,21fad9b6-44df-417c-ba18-de4b8af98a34,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,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,7ac85789-9c69-40b6-9130-94c40ed440d4,7ac85789-9c69-40b6-9130-94c40ed440d4,1,0,0f77d06f-f736-451e-9e6b-28868e48f3ed,0f77d06f-f736-451e-9e6b-28868e48f3ed,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,3981b13c-f8e1-44cc-a8e8-59ee9635d029,3981b13c-f8e1-44cc-a8e8-59ee9635d029,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,de258ab8-2d16-4c69-9490-5819b7ae3d08,de258ab8-2d16-4c69-9490-5819b7ae3d08,1,0,f7aacf70-0b59-410a-9929-ab4ab8a2431c,f7aacf70-0b59-410a-9929-ab4ab8a2431c,1,0,5bb6ba7a-ed61-4cdd-b3db-ec9da292e7a4,5bb6ba7a-ed61-4cdd-b3db-ec9da292e7a4,1,0,b37a9edd-b6bc-40eb-b5de-f54968abc119,b37a9edd-b6bc-40eb-b5de-f54968abc119,1,0,52338832-b15a-4e56-b13d-141141677008,52338832-b15a-4e56-b13d-141141677008,1,0,e9616402-88cc-44ae-96ca-ba20cf7d38ad,e9616402-88cc-44ae-96ca-ba20cf7d38ad,1,0,1b8212d7-b834-460c-9a2b-68a5de889e5b,1b8212d7-b834-460c-9a2b-68a5de889e5b,1,0,a816deca-4863-44e2-a8ff-89bfa5fbb0ac,a816deca-4863-44e2-a8ff-89bfa5fbb0ac,1,0,157f3df0-97b7-461b-bd3e-1f2e12658adf,157f3df0-97b7-461b-bd3e-1f2e12658adf,1,0,d2d6968c-fbe6-4e09-9cdb-653ca9a97fcc,d2d6968c-fbe6-4e09-9cdb-653ca9a97fcc,1,0,ea6f491e-9ec9-456d-ae30-4a258d87dff6,ea6f491e-9ec9-456d-ae30-4a258d87dff6,1,0,6ccec21e-f26f-482c-9ce2-1f058fc492c1,6ccec21e-f26f-482c-9ce2-1f058fc492c1,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,ffd14055-0847-48da-8807-0ba07decf6a5,ffd14055-0847-48da-8807-0ba07decf6a5,1,0,ee808b7e-8313-4838-8a5a-9b49e3ce7e3e,ee808b7e-8313-4838-8a5a-9b49e3ce7e3e,1,0,a8450a10-c18c-4b99-828b-870f38c32991,a8450a10-c18c-4b99-828b-870f38c32991,1,0,ad5e61a9-2f12-4629-9d7b-7882cc885992,ad5e61a9-2f12-4629-9d7b-7882cc885992,1,0,68a66e43-123c-4dc4-8eb7-3b728a6dbf40,68a66e43-123c-4dc4-8eb7-3b728a6dbf40,1,0,b016e858-7a3b-473a-a9b7-a6c718d0a028,b016e858-7a3b-473a-a9b7-a6c718d0a028,1,0,7db81d96-e359-4157-b5cb-3b50622d6556,7db81d96-e359-4157-b5cb-3b50622d6556,1,0,aa09ff66-3f4a-4746-9a99-697a2915b3fc,aa09ff66-3f4a-4746-9a99-697a2915b3fc,1,0,21305c37-31fb-46f3-85bc-8743c22faa02,21305c37-31fb-46f3-85bc-8743c22faa02,1,0,c5bace94-8fbc-4ad1-9567-a41332e8f00a,c5bace94-8fbc-4ad1-9567-a41332e8f00a,1,0,9fc40f79-c538-4ea5-a939-67bdd540d805,9fc40f79-c538-4ea5-a939-67bdd540d805,1,0,70443b2a-04db-4573-a4ea-e35078b383d7,70443b2a-04db-4573-a4ea-e35078b383d7,1,0,fb760c8a-d0bd-4445-9d68-85e5145d0182,fb760c8a-d0bd-4445-9d68-85e5145d0182,1,0,ecf54919-4cf2-4b30-9efa-de517d823555,ecf54919-4cf2-4b30-9efa-de517d823555,1,0,a4814357-6575-4a55-808f-4a4c94047110,a4814357-6575-4a55-808f-4a4c94047110,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,44dba9ff-fb54-4cc9-9da2-b00db76060e4,44dba9ff-fb54-4cc9-9da2-b00db76060e4,1,0,a6a0c38d-52a1-4a36-b29a-fb9cc084465f,a6a0c38d-52a1-4a36-b29a-fb9cc084465f,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,a666af62-aa5d-4b2b-b9e5-017d1c93ae6a,a666af62-aa5d-4b2b-b9e5-017d1c93ae6a,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,20adf54c-044c-4bea-8028-b6d20917a030,20adf54c-044c-4bea-8028-b6d20917a030,1,0,fbaa5b0a-56dc-4bf1-b1b2-e48073f63d13,fbaa5b0a-56dc-4bf1-b1b2-e48073f63d13,1,0,2e54b3e8-6672-48d5-802a-23d5144fed79,2e54b3e8-6672-48d5-802a-23d5144fed79,1,0,2a7c4ae2-aab3-48b3-b04f-7be6989939e8,2a7c4ae2-aab3-48b3-b04f-7be6989939e8,1,0,a92acf0e-9132-4456-9a82-1543d98ca453,a92acf0e-9132-4456-9a82-1543d98ca453,1,0,f98bcdb8-6eed-4b4f-b3da-d80b5e8bed44,f98bcdb8-6eed-4b4f-b3da-d80b5e8bed44,1,0,daad5f66-3bb4-4389-bca1-bf528ad993a3,daad5f66-3bb4-4389-bca1-bf528ad993a3,1,0,ad043f15-b2c9-4a05-82b9-6428708584b2,ad043f15-b2c9-4a05-82b9-6428708584b2,1,0,d2fd8650-d13a-411d-8206-61b16016bd82,d2fd8650-d13a-411d-8206-61b16016bd82,1,0,643f4f37-fa02-4976-8701-7a5a44b0109a,643f4f37-fa02-4976-8701-7a5a44b0109a,1,0,278a0559-07b2-4ee3-a821-c0395f9a33c1,278a0559-07b2-4ee3-a821-c0395f9a33c1,1,0,7604b15a-8c5e-4515-84b9-c1d36f9efd0a,7604b15a-8c5e-4515-84b9-c1d36f9efd0a,1,0,54d9f5bb-599c-4d4b-b616-1445e7461813,54d9f5bb-599c-4d4b-b616-1445e7461813,1,0,7d0dbd52-8bb0-4d72-87fa-2d7066e5e189,7d0dbd52-8bb0-4d72-87fa-2d7066e5e189,1,0,a2c42946-1cdb-457a-a45b-97781cfb4a15,a2c42946-1cdb-457a-a45b-97781cfb4a15,1,0,a1a44832-6026-47ae-affd-5b6d52e84307,a1a44832-6026-47ae-affd-5b6d52e84307,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,223e4ccf-5638-4576-bd88-7c54be68de47,223e4ccf-5638-4576-bd88-7c54be68de47,1,0,e3bae40b-5316-4392-8c82-b601922a6582,e3bae40b-5316-4392-8c82-b601922a6582,1,0,26806602-54be-4b2f-96ae-3e2a31616a4e,26806602-54be-4b2f-96ae-3e2a31616a4e,1,0,738fc48f-5160-4786-84bb-053c188662ce,738fc48f-5160-4786-84bb-053c188662ce,1,0,6e883b67-f74c-4791-8fb3-446534e3a6db,6e883b67-f74c-4791-8fb3-446534e3a6db,1,0,24fed307-445d-44b5-8964-9d08d1003061,24fed307-445d-44b5-8964-9d08d1003061,1,0,8e4c2dbe-15b7-4e04-9f07-892d70741a97,8e4c2dbe-15b7-4e04-9f07-892d70741a97,1,0,67691860-e374-451f-aee3-05a35df2a477,67691860-e374-451f-aee3-05a35df2a477,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,e1132cbb-7045-47e2-bbc7-6e92e4dff131,e1132cbb-7045-47e2-bbc7-6e92e4dff131,1,0,62a71ba7-3226-4d10-8cc9-ac9908a00ae7,62a71ba7-3226-4d10-8cc9-ac9908a00ae7,1,0,f5ad6743-b19b-44c4-b3d1-2e39d74a4abd,f5ad6743-b19b-44c4-b3d1-2e39d74a4abd,1,0,85d7ea13-c521-44b8-9dce-5e57529a21db,85d7ea13-c521-44b8-9dce-5e57529a21db,1,0,4b89b7fb-31d9-43c7-9f7e-b0c31fa3331d,4b89b7fb-31d9-43c7-9f7e-b0c31fa3331d,1,0,6ce1d71d-7548-4ee7-be78-21ae23d5a08d,6ce1d71d-7548-4ee7-be78-21ae23d5a08d,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,ae4825b1-dd4e-4d0e-8133-da6d1a441c36,ae4825b1-dd4e-4d0e-8133-da6d1a441c36,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,ec966ef2-b291-4937-a164-5c2b461871f8,ec966ef2-b291-4937-a164-5c2b461871f8,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,e9939b36-bceb-40e2-a182-1d5cc248f353,e9939b36-bceb-40e2-a182-1d5cc248f353,1,0,619d3ac6-40fe-485d-a407-fe065f16b186,619d3ac6-40fe-485d-a407-fe065f16b186,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,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,526c688e-a4d4-45f7-8bba-b8ceff38fe27,526c688e-a4d4-45f7-8bba-b8ceff38fe27,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,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,ecb7dd1b-46d6-46b5-a51f-699f068ad6a0,ecb7dd1b-46d6-46b5-a51f-699f068ad6a0,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,b369842d-c20e-4b68-9d0e-701707584b2f,b369842d-c20e-4b68-9d0e-701707584b2f,1,0,de23a2ca-4607-4488-be7b-23ea28875d02,de23a2ca-4607-4488-be7b-23ea28875d02,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,be75d0b2-c9db-4dab-9e32-dbe26d667508,be75d0b2-c9db-4dab-9e32-dbe26d667508,1,0,299c014f-996a-4a99-a5be-a7cfd5ee45e4,299c014f-996a-4a99-a5be-a7cfd5ee45e4,1,0,2569b69d-006f-478e-83b7-9163048b34bb,2569b69d-006f-478e-83b7-9163048b34bb,1,0,1ee47933-8117-4d47-9245-476c0ed3a373,1ee47933-8117-4d47-9245-476c0ed3a373,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,24b4dd9e-825f-471b-b15d-ae21a508d183,24b4dd9e-825f-471b-b15d-ae21a508d183,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,de355360-f87a-4b0d-a37c-d0a091e7e984,de355360-f87a-4b0d-a37c-d0a091e7e984,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,1422999b-9977-4bed-9990-b46bd0ec7471,1422999b-9977-4bed-9990-b46bd0ec7471,1,0,4c48db2f-2b79-4c6f-b8ee-002810c6190c,4c48db2f-2b79-4c6f-b8ee-002810c6190c,1,0,d0d90cbf-21fc-47cb-8e1c-549e67a1bf0c,d0d90cbf-21fc-47cb-8e1c-549e67a1bf0c,1,0,cf48ae02-ecb0-4db9-92da-585f89cddb70,cf48ae02-ecb0-4db9-92da-585f89cddb70,1,0,5650c5c7-3f43-4ec9-8b64-003c5467d06a,5650c5c7-3f43-4ec9-8b64-003c5467d06a,1,0,5bac3798-1193-4d74-bbdd-40aba11d742c,5bac3798-1193-4d74-bbdd-40aba11d742c,1,0,514f3514-ba90-493e-b0dd-2d02c6ba4d1d,514f3514-ba90-493e-b0dd-2d02c6ba4d1d,1,0,032de836-80a8-46ce-9e40-b3b6ac5f9e1e,032de836-80a8-46ce-9e40-b3b6ac5f9e1e,1,0,962c2c55-6a16-46f6-9ce0-67d1984b530e,962c2c55-6a16-46f6-9ce0-67d1984b530e,1,0,27e906c2-ea0e-489e-b869-547c48c29518,27e906c2-ea0e-489e-b869-547c48c29518,1,0,553ebd03-267b-4ced-805e-be7eca6db18f,553ebd03-267b-4ced-805e-be7eca6db18f,1,0,8bf95fa7-1067-45b3-82ea-286192f97e06,8bf95fa7-1067-45b3-82ea-286192f97e06,1,0,73996d67-4d70-4ce5-a58a-d70f44484f1e,73996d67-4d70-4ce5-a58a-d70f44484f1e,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,9b0e9fec-8261-4e20-9556-754a46d11c12,9b0e9fec-8261-4e20-9556-754a46d11c12,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,2eeea138-481c-4fde-9e8a-709d751cc469,2eeea138-481c-4fde-9e8a-709d751cc469,1,0,70a3df8f-c12a-4185-81c4-39a5114ef7a9,70a3df8f-c12a-4185-81c4-39a5114ef7a9,1,0,bd362ff9-3dec-4a4b-9595-8609de76e842,bd362ff9-3dec-4a4b-9595-8609de76e842,1,0,76cc9ae1-7ac2-4b99-8def-f21dc55ad07d,76cc9ae1-7ac2-4b99-8def-f21dc55ad07d,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,54766e6b-cf49-4c58-b5e5-dcb6362ac5e2,54766e6b-cf49-4c58-b5e5-dcb6362ac5e2,1,0,f2210cf1-f9f5-41ed-8b4d-937778da842b,f2210cf1-f9f5-41ed-8b4d-937778da842b,1,0,07e81872-afac-4720-86b4-91e7bf4a2881,07e81872-afac-4720-86b4-91e7bf4a2881,1,0,d4b49ed0-3d3f-4b68-bc1e-949e8e338e9a,d4b49ed0-3d3f-4b68-bc1e-949e8e338e9a,1,0,542a53f5-56c5-4ca9-90d1-d689532c69fd,542a53f5-56c5-4ca9-90d1-d689532c69fd,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,1aa6b483-0f87-4ed3-94ea-8b81813532d6,1aa6b483-0f87-4ed3-94ea-8b81813532d6,1,0,0f79d87e-3311-4281-8f46-6154e708b930,0f79d87e-3311-4281-8f46-6154e708b930,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,748f7ddb-4cdc-46e5-9108-f7a550b33537,748f7ddb-4cdc-46e5-9108-f7a550b33537,1,0,0534460b-0548-45f0-ac79-aa4bc109655c,0534460b-0548-45f0-ac79-aa4bc109655c,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,4ae40e81-f2ab-4ac4-89e5-73545db42de9,4ae40e81-f2ab-4ac4-89e5-73545db42de9,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,8850b346-364d-457b-9554-acce031394fe,8850b346-364d-457b-9554-acce031394fe,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,a55e9aef-79ad-4cb6-b80a-c7f769bebbea,a55e9aef-79ad-4cb6-b80a-c7f769bebbea,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,bc3183cb-8691-4fa5-b154-3645f3cd8944,bc3183cb-8691-4fa5-b154-3645f3cd8944,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,018390b5-06d9-4d04-abad-1de1ccf0843c,018390b5-06d9-4d04-abad-1de1ccf0843c,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,9ac5a405-4eb7-4013-8bbd-5d1b6d0929ab,9ac5a405-4eb7-4013-8bbd-5d1b6d0929ab,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,f2d5f3d7-6f46-421b-8c7b-e9c78953d102,f2d5f3d7-6f46-421b-8c7b-e9c78953d102,1,0,d3799dbd-2548-4dac-b63b-524415f162cc,d3799dbd-2548-4dac-b63b-524415f162cc,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,35fe84b6-7d3c-4729-a75c-a5f3ef122124,35fe84b6-7d3c-4729-a75c-a5f3ef122124,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,766f2abe-1dfd-4e16-bffd-83f44d25d82a,766f2abe-1dfd-4e16-bffd-83f44d25d82a,1,0,0e7a34a8-ce5a-4767-8283-fd094e13d969,0e7a34a8-ce5a-4767-8283-fd094e13d969,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,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,886df9ab-09b4-4c7a-bd44-6afeab68d831,886df9ab-09b4-4c7a-bd44-6afeab68d831,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,ab4dbaff-cee6-47b3-9d69-13ac5c906f95,ab4dbaff-cee6-47b3-9d69-13ac5c906f95,1,0,82d5ed02-654f-4b86-b995-baf64a147a12,82d5ed02-654f-4b86-b995-baf64a147a12,1,0,ba96177b-d10c-4ad2-9851-dea312eeafd2,ba96177b-d10c-4ad2-9851-dea312eeafd2,1,0,7652c0d3-1b6e-4e0d-96d0-7bbdff808ce9,7652c0d3-1b6e-4e0d-96d0-7bbdff808ce9,1,0,caa287fe-4f60-4243-a6fe-8b2bd607205f,caa287fe-4f60-4243-a6fe-8b2bd607205f,1,0,ba6e2356-8b0e-4af6-9941-3b808e17c570,ba6e2356-8b0e-4af6-9941-3b808e17c570,1,0,f2f90525-566b-4add-ae3e-cc683dee6209,f2f90525-566b-4add-ae3e-cc683dee6209,1,0,59561ccb-5412-4f8a-8961-3d43639e4742,59561ccb-5412-4f8a-8961-3d43639e4742,1,0,8ce1e84a-9e69-4a75-9c3e-481ba3b5eaae,8ce1e84a-9e69-4a75-9c3e-481ba3b5eaae,1,0,0ec665f2-bbde-4e41-8cd0-2578253ecdf3,0ec665f2-bbde-4e41-8cd0-2578253ecdf3,1,0,e82ab008-d6b9-4f02-b4a5-0c0c57b06988,e82ab008-d6b9-4f02-b4a5-0c0c57b06988,1,0,50d2d02d-b812-4c2b-964a-4c2ded54284f,50d2d02d-b812-4c2b-964a-4c2ded54284f,1,0,5503d2c4-0b5e-4ba1-a26d-2f63628b25c8,5503d2c4-0b5e-4ba1-a26d-2f63628b25c8,1,0,53f519d2-0ee6-4314-a986-2f456722f2ae,53f519d2-0ee6-4314-a986-2f456722f2ae,1,0,c94a168f-e10f-4b09-8a82-7e53c056a643,c94a168f-e10f-4b09-8a82-7e53c056a643,1,0,35f56bf0-bb91-4ff4-ade4-fa06296e68a2,35f56bf0-bb91-4ff4-ade4-fa06296e68a2,1,0,a22ba49d-7a11-4dc7-8b0e-874da6f0874d,a22ba49d-7a11-4dc7-8b0e-874da6f0874d,1,0,888e5183-a152-435f-b105-6b924e0d4f4f,888e5183-a152-435f-b105-6b924e0d4f4f,1,0,f69a29cd-035f-4d16-8bec-150f563691b9,f69a29cd-035f-4d16-8bec-150f563691b9,1,0,6d4e26f4-4cc4-4445-ad7b-547cd0afc750,6d4e26f4-4cc4-4445-ad7b-547cd0afc750,1,0,5736ef36-69eb-4406-a98e-1e4b4227a10d,5736ef36-69eb-4406-a98e-1e4b4227a10d,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,977748b7-13d3-41ef-8206-82595ed8fc0c,977748b7-13d3-41ef-8206-82595ed8fc0c,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,90a7425e-3fc9-41ec-9373-f410936e1b53,90a7425e-3fc9-41ec-9373-f410936e1b53,1,0,509cdfc8-fad3-4628-869c-6c03d9519d69,509cdfc8-fad3-4628-869c-6c03d9519d69,1,0,9ef01e37-030a-44b7-824b-110e0f5a88f3,9ef01e37-030a-44b7-824b-110e0f5a88f3,1,0,663cf316-3077-4fac-b821-94bd5cdde65c,663cf316-3077-4fac-b821-94bd5cdde65c,1,0,a5ff3d28-847f-4512-afde-6bbad7f46f0e,a5ff3d28-847f-4512-afde-6bbad7f46f0e,1,0,c15f648b-3aed-4734-bcd2-524e2d3336c0,c15f648b-3aed-4734-bcd2-524e2d3336c0,1,0,c347e3a2-d6d9-46a0-971f-ec56a45dcbe8,c347e3a2-d6d9-46a0-971f-ec56a45dcbe8,1,0,ff87a40b-07da-4951-b469-a75d418e88b3,ff87a40b-07da-4951-b469-a75d418e88b3,1,0,e520fbbb-3521-4707-bbe7-c8ead04fb2dc,e520fbbb-3521-4707-bbe7-c8ead04fb2dc,1,0,a87faa63-4e1c-440c-b852-0e4e1485a047,a87faa63-4e1c-440c-b852-0e4e1485a047,1,0,36244ad9-5b3a-431e-9dbf-b05ee9da1188,36244ad9-5b3a-431e-9dbf-b05ee9da1188,1,0,6cf7fd67-e426-4fe3-a49d-fbcfae5fb52d,6cf7fd67-e426-4fe3-a49d-fbcfae5fb52d,1,0,92c4d60b-22df-4fef-a5b9-a97bc63b4858,92c4d60b-22df-4fef-a5b9-a97bc63b4858,1,0,8264b98b-7eec-4651-96fc-02620c87f274,8264b98b-7eec-4651-96fc-02620c87f274,1,0,bcd6e5f0-a800-4f21-ad75-24c428157cee,bcd6e5f0-a800-4f21-ad75-24c428157cee,1,0,9f351f0a-2d43-4215-8d74-040911230683,9f351f0a-2d43-4215-8d74-040911230683,1,0,6a9c1bd4-b550-4911-a8d1-321a7713a5a5,6a9c1bd4-b550-4911-a8d1-321a7713a5a5,1,0,019fa716-e91a-4116-abcf-c87349c153a4,019fa716-e91a-4116-abcf-c87349c153a4,1,0,f9fed640-0121-4c36-a822-0db7a9155adc,f9fed640-0121-4c36-a822-0db7a9155adc,1,0,e418d7c4-7322-41b1-a8df-d86a11f7711c,e418d7c4-7322-41b1-a8df-d86a11f7711c,1,0,3fcdfe26-1668-4aa7-bb10-ef8d8bd0ae39,3fcdfe26-1668-4aa7-bb10-ef8d8bd0ae39,1,0,a0ebcc8a-267b-4f95-a986-46db8fb5df4d,a0ebcc8a-267b-4f95-a986-46db8fb5df4d,1,0,9c890915-1ae3-457e-8a3d-7b39f181304b,9c890915-1ae3-457e-8a3d-7b39f181304b,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,15cd04c9-c12a-44ea-a397-d2adbac99c5b,15cd04c9-c12a-44ea-a397-d2adbac99c5b,1,0,182f92f5-0a8e-4f6a-9f9e-7878fafd0a2a,182f92f5-0a8e-4f6a-9f9e-7878fafd0a2a,1,0,45ca26ef-2a9f-4f24-a81b-2fe10c02ed9f,45ca26ef-2a9f-4f24-a81b-2fe10c02ed9f,1,0,56aa4b2f-5b7e-457d-a59d-837405f17fde,56aa4b2f-5b7e-457d-a59d-837405f17fde,1,0,819e2442-cb5a-4826-8a66-b34a3270e8e0,819e2442-cb5a-4826-8a66-b34a3270e8e0,1,0,49987536-3ab9-4a68-83a2-5dc3cd5d58fb,49987536-3ab9-4a68-83a2-5dc3cd5d58fb,1,0,8e4eec45-6ad3-4ac8-940a-b3130f504685,8e4eec45-6ad3-4ac8-940a-b3130f504685,1,0,ccdfef4b-a022-4bde-9c6c-84129b2bad65,ccdfef4b-a022-4bde-9c6c-84129b2bad65,1,0,95adcac2-bc88-46bc-aae5-d13cfb9a170c,95adcac2-bc88-46bc-aae5-d13cfb9a170c,1,0,d845ca4c-3af2-4322-8565-64f3aee61e3a,d845ca4c-3af2-4322-8565-64f3aee61e3a,1,0,430cf66c-5cfc-4fd4-bbf3-d9df6070e115,430cf66c-5cfc-4fd4-bbf3-d9df6070e115,1,0,6321fc1e-c1d7-4b49-b730-258857b2d936,6321fc1e-c1d7-4b49-b730-258857b2d936,1,0,f48abfe8-e400-4544-a80a-d1cb0b7d3ea8,f48abfe8-e400-4544-a80a-d1cb0b7d3ea8,1,0,ce40016b-7ca7-4803-81fa-5df0b92dbc54,ce40016b-7ca7-4803-81fa-5df0b92dbc54,1,0,b58b711b-8e9a-44a0-b62d-6b6362177a4b,b58b711b-8e9a-44a0-b62d-6b6362177a4b,1,0,f7c0af11-1b64-4504-a8db-0fd09c2ce20f,f7c0af11-1b64-4504-a8db-0fd09c2ce20f,1,0,b3c7cd75-fb40-4121-a727-d557fe66a5e0,b3c7cd75-fb40-4121-a727-d557fe66a5e0,1,0,38be384a-3abb-4f4d-b8b7-164c2c8d8b28,38be384a-3abb-4f4d-b8b7-164c2c8d8b28,1,0,8c697e44-1a1d-4c4a-b141-5254cfb229a5,8c697e44-1a1d-4c4a-b141-5254cfb229a5,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,22d7df25-5885-4ad6-bb29-28257256da22,22d7df25-5885-4ad6-bb29-28257256da22,1,0,3bb85423-6ce7-416f-884a-89c75deed890,3bb85423-6ce7-416f-884a-89c75deed890,1,0,132c8921-189a-4c00-a8a4-417728520203,132c8921-189a-4c00-a8a4-417728520203,1,0,18535b06-82f0-4179-af3c-975a5ba85872,18535b06-82f0-4179-af3c-975a5ba85872,1,0,1d0981b4-cf7c-4094-a597-d709a8573d71,1d0981b4-cf7c-4094-a597-d709a8573d71,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,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,a26d8489-88a8-438e-bb58-c7b5a742a243,a26d8489-88a8-438e-bb58-c7b5a742a243,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,9728fd22-163c-443d-a89f-79d15c51c086,9728fd22-163c-443d-a89f-79d15c51c086,1,0,7030a503-e97c-4cb8-b6cd-79dbd08fd2cc,7030a503-e97c-4cb8-b6cd-79dbd08fd2cc,1,0,0a7c25db-dba6-44d3-b994-d672c4f33f1f,0a7c25db-dba6-44d3-b994-d672c4f33f1f,1,0,618b565c-f80f-4e58-94f1-227d4bdc8fe7,618b565c-f80f-4e58-94f1-227d4bdc8fe7,1,0,e36ed6bf-7bb2-419f-b3d4-fe6f7e75188d,e36ed6bf-7bb2-419f-b3d4-fe6f7e75188d,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,88fafb0d-d624-4b91-8c68-c354817ccddb,88fafb0d-d624-4b91-8c68-c354817ccddb,1,0,f4a3e032-61fb-4004-bd4d-6eaffb53437b,f4a3e032-61fb-4004-bd4d-6eaffb53437b,1,0,9126b840-ddcc-4054-aa16-4156288a379e,9126b840-ddcc-4054-aa16-4156288a379e,1,0,a6facfdb-7529-479c-9bb3-e63316b032f4,a6facfdb-7529-479c-9bb3-e63316b032f4,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,d6d20d2e-ac18-4bed-aa98-2466871996ac,d6d20d2e-ac18-4bed-aa98-2466871996ac,1,0,53617fbd-4c88-4b13-b3f5-acc78064fdea,53617fbd-4c88-4b13-b3f5-acc78064fdea,1,0,fae5d2ca-4a2d-4ba3-945c-d6545a6b57f1,fae5d2ca-4a2d-4ba3-945c-d6545a6b57f1,1,0,7a043029-1b09-4c11-adfd-9f0588e323e8,7a043029-1b09-4c11-adfd-9f0588e323e8,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,5ffc2b03-28c0-45da-ab3e-e4c5d449a898,5ffc2b03-28c0-45da-ab3e-e4c5d449a898,1,0,5c1a1206-0521-44db-8cdd-3e132f2e5a34,5c1a1206-0521-44db-8cdd-3e132f2e5a34,1,0,a630b2d5-2a8e-471e-a7ca-2498e15ace47,a630b2d5-2a8e-471e-a7ca-2498e15ace47,1,0,ba0855a3-8384-4681-a6f0-6373f23cf52d,ba0855a3-8384-4681-a6f0-6373f23cf52d,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,c91f630a-286c-4eb8-b87e-6e6bc7670482,c91f630a-286c-4eb8-b87e-6e6bc7670482,1,0,8ace2dbf-ed9d-46fd-bda7-d884da77e30c,8ace2dbf-ed9d-46fd-bda7-d884da77e30c,1,0,ba59bf05-b815-4679-94ce-601923d60461,ba59bf05-b815-4679-94ce-601923d60461,1,0,65ff172c-3892-4dd2-821b-5d6293805528,65ff172c-3892-4dd2-821b-5d6293805528,1,0,00c47343-9f64-4368-896e-85f1639e4dae,00c47343-9f64-4368-896e-85f1639e4dae,1,0,afc02a73-15bd-4ab1-97bb-5cea6206a44f,afc02a73-15bd-4ab1-97bb-5cea6206a44f,1,0,27a9ef3c-902c-49e3-ab84-ba51185ab111,27a9ef3c-902c-49e3-ab84-ba51185ab111,1,0,20ba43f5-348f-41e4-b365-ff9485a3951d,20ba43f5-348f-41e4-b365-ff9485a3951d,1,0,2f6bc78d-d2ed-491f-bc66-3f95e2ca574c,2f6bc78d-d2ed-491f-bc66-3f95e2ca574c,1,0,bf3e3395-3e41-49c2-b59e-fdcdc3ef956f,bf3e3395-3e41-49c2-b59e-fdcdc3ef956f,1,0,164db402-4516-4d99-80d2-6cb7b6fd7698,164db402-4516-4d99-80d2-6cb7b6fd7698,1,0,93b18f0a-7aa1-42db-809b-1e543cda57de,93b18f0a-7aa1-42db-809b-1e543cda57de,1,0,a8e04267-5a28-40af-8d45-e65375cd8273,a8e04267-5a28-40af-8d45-e65375cd8273,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,b65954b9-39f9-4f7c-8af2-939af0694368,b65954b9-39f9-4f7c-8af2-939af0694368,1,0,3a984dac-c971-42c3-9736-a45c46b55f01,3a984dac-c971-42c3-9736-a45c46b55f01,1,0,edaa4ad4-4dd9-4225-85e8-b0d74d167985,edaa4ad4-4dd9-4225-85e8-b0d74d167985,1,0,c060feda-b1ec-4db3-b16e-d19b36833a2c,c060feda-b1ec-4db3-b16e-d19b36833a2c,1,0,3ff6a150-b687-4e7e-b09d-2aebb8312a61,3ff6a150-b687-4e7e-b09d-2aebb8312a61,1,0,2116217b-1660-499f-953d-f685738b0f30,2116217b-1660-499f-953d-f685738b0f30,1,0,45b46613-13cc-4888-9bb7-53780402206f,45b46613-13cc-4888-9bb7-53780402206f,1,0,5c224274-5495-49bc-b124-e6d649b09d57,5c224274-5495-49bc-b124-e6d649b09d57,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,b6424caf-3db8-4cfe-b92d-7435c23606a5,b6424caf-3db8-4cfe-b92d-7435c23606a5,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,1c2103d3-3feb-4412-98c4-c731f22eef2b,1c2103d3-3feb-4412-98c4-c731f22eef2b,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,336cb96e-8867-4c9d-b74c-b4287ac9212a,336cb96e-8867-4c9d-b74c-b4287ac9212a,1,0,fc7dbc20-7bef-4cbc-9b32-5d86cef5532c,fc7dbc20-7bef-4cbc-9b32-5d86cef5532c,1,0,29f616a6-b914-4ffb-8a86-1ae17089e2f7,29f616a6-b914-4ffb-8a86-1ae17089e2f7,1,0,c50075b0-e8e2-4a6c-92ef-05882aa3cfea,c50075b0-e8e2-4a6c-92ef-05882aa3cfea,1,0,5a1058fc-35f6-43c2-95e5-ae678e19e7d6,5a1058fc-35f6-43c2-95e5-ae678e19e7d6,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,9a68a81b-c6bd-4353-baf4-da8a21f98fb9,9a68a81b-c6bd-4353-baf4-da8a21f98fb9,1,0,8db2b1d8-c415-4846-bd1a-9fec1b105ff0,8db2b1d8-c415-4846-bd1a-9fec1b105ff0,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,41990cad-a43e-46fd-b9bc-e8acc1d6e937,41990cad-a43e-46fd-b9bc-e8acc1d6e937,1,0,3bcce139-d42e-45c2-ace8-28aa34e01a38,3bcce139-d42e-45c2-ace8-28aa34e01a38,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,50754c7d-9c8a-497c-a4c8-76d7400b3412,50754c7d-9c8a-497c-a4c8-76d7400b3412,1,0,193f2d79-83a7-4044-89c6-0b5d7c7cf80a,193f2d79-83a7-4044-89c6-0b5d7c7cf80a,1,0,93070fc1-4204-43b7-b8eb-1bf905f5fa3f,93070fc1-4204-43b7-b8eb-1bf905f5fa3f,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,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,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,9016988e-1aea-460a-b5eb-644dc5923d87,9016988e-1aea-460a-b5eb-644dc5923d87,1,0,8593c908-9f6f-42df-9fd4-e41ccffba315,8593c908-9f6f-42df-9fd4-e41ccffba315,1,0,d6eb3484-b0ab-40e3-aa95-c18a40259f77,d6eb3484-b0ab-40e3-aa95-c18a40259f77,1,0,08ec3f2e-e523-4e37-8d44-fbc52c66263c,08ec3f2e-e523-4e37-8d44-fbc52c66263c,1,0,7300e566-06ea-42a3-b046-477ee9883559,7300e566-06ea-42a3-b046-477ee9883559,1,0,72ef831d-9d37-4b7f-8b71-fb9dd0ab6038,72ef831d-9d37-4b7f-8b71-fb9dd0ab6038,1,0,a0ff40b4-5815-445e-ad67-f524dfa3aaa7,a0ff40b4-5815-445e-ad67-f524dfa3aaa7,1,0,4d7ef262-8449-4511-a408-e5d322ce3d78,4d7ef262-8449-4511-a408-e5d322ce3d78,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,a3b14a36-049d-4f94-bafc-cf7b874f9bf0,a3b14a36-049d-4f94-bafc-cf7b874f9bf0,1,0,6c954862-62d0-4901-8448-ea62a1174660,6c954862-62d0-4901-8448-ea62a1174660,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,54bfe81c-06b2-45a8-8bc1-bd22240cfe32,54bfe81c-06b2-45a8-8bc1-bd22240cfe32,1,0,46f71ecc-5cee-4b8d-9f6d-d38a86787a76,46f71ecc-5cee-4b8d-9f6d-d38a86787a76,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,e97edb4a-468d-499d-924d-aa4e5ee16548,e97edb4a-468d-499d-924d-aa4e5ee16548,1,0,24366a86-0dae-4a68-a180-d8ea7656a286,24366a86-0dae-4a68-a180-d8ea7656a286,1,0,cb65fbad-69a0-47d8-b4a9-da49274c3eb7,cb65fbad-69a0-47d8-b4a9-da49274c3eb7,1,0,3c03f78e-c904-47da-a0a1-db5d6b9f7254,3c03f78e-c904-47da-a0a1-db5d6b9f7254,1,0,3bf03ed7-6581-4a11-8fc8-748f46c8dad7,3bf03ed7-6581-4a11-8fc8-748f46c8dad7,1,0,0f28c616-162c-4dba-bd22-f7ea5d23ea5a,0f28c616-162c-4dba-bd22-f7ea5d23ea5a,1,0,39bf2771-1d8b-44bb-8d8b-54d046589ebe,39bf2771-1d8b-44bb-8d8b-54d046589ebe,1,0,872521e3-413c-45ac-a6ea-39fe1324bae8,872521e3-413c-45ac-a6ea-39fe1324bae8,1,0,f237a21e-066a-48e6-a5c4-5dc2487c7a3b,f237a21e-066a-48e6-a5c4-5dc2487c7a3b,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,79ad09ba-875a-46bd-9cd9-9d084bf4f6ea,79ad09ba-875a-46bd-9cd9-9d084bf4f6ea,1,0,2902460a-ed86-41cf-8e8f-895adab9a72f,2902460a-ed86-41cf-8e8f-895adab9a72f,1,0,d12c7296-36ab-41e0-83ef-143484958597,d12c7296-36ab-41e0-83ef-143484958597,1,0,2b6c3bcd-7d2a-4e95-8066-99374002689b,2b6c3bcd-7d2a-4e95-8066-99374002689b,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,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,cf013fe0-7147-4454-86a5-86a7540268b2,1,37e7eaea-9282-4044-832b-4af035ac5e5f,"3.1.8.276","Фирма ""1С""","БиблиотекаСтандартныхПодсистем",7110,1,0,816bac46-e1ff-43e9-a27a-9add6bc43eb6,816bac46-e1ff-43e9-a27a-9add6bc43eb6,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,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,153e11ac-f898-46a5-98c6-734adb933ca2,153e11ac-f898-46a5-98c6-734adb933ca2,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,a3001de6-272f-444e-a8db-ec8cc3a670a2,a3001de6-272f-444e-a8db-ec8cc3a670a2,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,fd930b50-4ada-4e7f-8bfd-ed9a7c4e8964,fd930b50-4ada-4e7f-8bfd-ed9a7c4e8964,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,ea36c426-2b43-4232-9978-0104bafd345d,ea36c426-2b43-4232-9978-0104bafd345d,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,0a83f9ec-eabe-4e8f-9fa9-0067acad6fc4,0a83f9ec-eabe-4e8f-9fa9-0067acad6fc4,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,5a83b75a-38b0-4d15-9c6f-c201fa97e485,5a83b75a-38b0-4d15-9c6f-c201fa97e485,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,0302674f-944a-4a45-94c8-a44f93fc5a9a,0302674f-944a-4a45-94c8-a44f93fc5a9a,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,367c49cc-0317-4b0d-846c-79e203f800b8,367c49cc-0317-4b0d-846c-79e203f800b8,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,a5df6ca4-8791-4025-a0e6-07d66e0454b7,a5df6ca4-8791-4025-a0e6-07d66e0454b7,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,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,8cb20eb9-306b-4c2a-9a77-6a4632f72b54,8cb20eb9-306b-4c2a-9a77-6a4632f72b54,1,0,87ba683b-b69c-4b23-854c-037b770a3ebb,87ba683b-b69c-4b23-854c-037b770a3ebb,1,0,f3f753ac-b2cb-44ea-a917-811b0ef711f8,f3f753ac-b2cb-44ea-a917-811b0ef711f8,1,0,1357adf5-0f5d-4930-afea-edc89db4d0a6,1357adf5-0f5d-4930-afea-edc89db4d0a6,1,0,505ff816-0d42-458a-b7b5-7d007c15d1be,505ff816-0d42-458a-b7b5-7d007c15d1be,1,0,27811a76-d8bd-43a5-9898-944bdd1388ce,27811a76-d8bd-43a5-9898-944bdd1388ce,1,0,363215fe-59f3-4d9a-a8c7-94049882147a,363215fe-59f3-4d9a-a8c7-94049882147a,1,0,3d4597ca-1c97-4116-b966-87970cd7ebdf,3d4597ca-1c97-4116-b966-87970cd7ebdf,1,0,715f7ba5-ca82-49e6-8671-fc1b55b740b5,715f7ba5-ca82-49e6-8671-fc1b55b740b5,1,0,0add6d62-bf4f-476c-9f6b-37633fcd6b0e,0add6d62-bf4f-476c-9f6b-37633fcd6b0e,1,0,93e495a4-207d-4216-b63e-a8b169b2b801,93e495a4-207d-4216-b63e-a8b169b2b801,1,0,3b47221a-ad5f-419c-b503-a4a88505d336,3b47221a-ad5f-419c-b503-a4a88505d336,1,0,0149a9c0-245b-4dfe-aa98-e8b02ba85c99,0149a9c0-245b-4dfe-aa98-e8b02ba85c99,1,0,94abbe1e-44d8-43c1-90fb-71bc9b6621a9,94abbe1e-44d8-43c1-90fb-71bc9b6621a9,1,0,2edfc563-9fd8-4f7c-8cd4-ba3c27c08840,2edfc563-9fd8-4f7c-8cd4-ba3c27c08840,1,0,d0d052c7-68b9-4b2b-9bbf-4fb083327dca,d0d052c7-68b9-4b2b-9bbf-4fb083327dca,1,0,807194b1-2460-4872-8430-e34f6970178f,807194b1-2460-4872-8430-e34f6970178f,1,0,b0409473-768f-4c29-89d3-6201e8476157,b0409473-768f-4c29-89d3-6201e8476157,1,0,d8415773-616e-43e4-9deb-e92200659d53,d8415773-616e-43e4-9deb-e92200659d53,1,0,b228f0de-7cd7-4337-b021-bc1beb980afd,b228f0de-7cd7-4337-b021-bc1beb980afd,1,0,c9178048-5d75-4d1b-a714-50d772e8d343,c9178048-5d75-4d1b-a714-50d772e8d343,1,0,661b7581-27ad-4cec-8618-9c314cb3a4d5,661b7581-27ad-4cec-8618-9c314cb3a4d5,1,0,310a8f7d-5b1f-428c-885d-1127b7789efd,310a8f7d-5b1f-428c-885d-1127b7789efd,1,0,ee5efc54-aa35-467f-b085-64f24819aaa7,ee5efc54-aa35-467f-b085-64f24819aaa7,1,0,376c8f0b-9d2e-4262-a26f-b63f1163c1c4,376c8f0b-9d2e-4262-a26f-b63f1163c1c4,1,0,d37c82e1-cc9f-492c-a7fb-0e6e9d8f6a72,d37c82e1-cc9f-492c-a7fb-0e6e9d8f6a72,1,0,b7ebf08a-d6be-42db-b28a-460df037d7ba,b7ebf08a-d6be-42db-b28a-460df037d7ba,1,0,ec3c34f6-b3b3-4a96-a231-aaf70db1e73d,ec3c34f6-b3b3-4a96-a231-aaf70db1e73d,1,0,8aa9daa0-e073-49f4-8346-7f2c809fac9a,8aa9daa0-e073-49f4-8346-7f2c809fac9a,1,0,043074cb-64aa-45ed-a2f3-b4fa252431cc,043074cb-64aa-45ed-a2f3-b4fa252431cc,1,0,9cc72214-6e84-45e6-aafd-b36205730faa,9cc72214-6e84-45e6-aafd-b36205730faa,1,0,768eb7d6-d37e-4182-961e-464a5e08781b,768eb7d6-d37e-4182-961e-464a5e08781b,1,0,4df52b04-759d-471d-9de4-3ba4d00d1d22,4df52b04-759d-471d-9de4-3ba4d00d1d22,1,0,5768f558-50b6-4682-960c-6894f6953461,5768f558-50b6-4682-960c-6894f6953461,1,0,74126b65-4f3b-4f8d-b7fc-1d2705822463,74126b65-4f3b-4f8d-b7fc-1d2705822463,1,0,75a4b472-00b6-4b2f-bb6b-03bdc0b05dcf,75a4b472-00b6-4b2f-bb6b-03bdc0b05dcf,1,0,8506ad71-85eb-4f91-b892-4e75318649c8,8506ad71-85eb-4f91-b892-4e75318649c8,1,0,6e3010f5-f725-4361-b853-768412b1ad6f,6e3010f5-f725-4361-b853-768412b1ad6f,1,0,40d8803a-2f6d-4091-be54-9d9827a53e30,40d8803a-2f6d-4091-be54-9d9827a53e30,1,0,ea2b936c-be5c-4316-aca9-4f890f4e6ec9,ea2b936c-be5c-4316-aca9-4f890f4e6ec9,1,0,092501bf-dd8e-4f50-8c58-b1b028b50a5a,092501bf-dd8e-4f50-8c58-b1b028b50a5a,1,0,927cfec6-c1e3-4152-aa2e-afa89359b5eb,927cfec6-c1e3-4152-aa2e-afa89359b5eb,1,0,8e986c32-7296-4329-a908-704398428e4e,8e986c32-7296-4329-a908-704398428e4e,1,0,c5b8870c-14cb-43ae-8d44-d639bd059b0e,c5b8870c-14cb-43ae-8d44-d639bd059b0e,1,0,bc98265e-329d-41d1-9fe8-4c78b7998cd2,bc98265e-329d-41d1-9fe8-4c78b7998cd2,1,0,b44c8a6b-0e3f-446b-95f7-6cb4a58f13e0,b44c8a6b-0e3f-446b-95f7-6cb4a58f13e0,1,0,7601f9c7-2fe7-43fb-a7a9-cf5be4475ce1,7601f9c7-2fe7-43fb-a7a9-cf5be4475ce1,1,0,2da686d3-38b0-4cf1-9962-1440d1afd050,2da686d3-38b0-4cf1-9962-1440d1afd050,1,0,71518348-f155-4616-bbdc-742e36cd3964,71518348-f155-4616-bbdc-742e36cd3964,1,0,723a58ca-9947-4320-9bf4-7c6b58aee2f5,723a58ca-9947-4320-9bf4-7c6b58aee2f5,1,0,2df24487-0b76-451d-a08f-21dc03adefa4,2df24487-0b76-451d-a08f-21dc03adefa4,1,0,00813d65-8dae-45a8-8691-d0b17d6d7754,00813d65-8dae-45a8-8691-d0b17d6d7754,1,0,d88166a7-ef6c-453a-b6cc-1c574cf6ea85,d88166a7-ef6c-453a-b6cc-1c574cf6ea85,1,0,aae1a856-ff88-41bb-a887-1b8c2c3eeab6,aae1a856-ff88-41bb-a887-1b8c2c3eeab6,1,0,cf2b8654-02b6-441e-98a9-cb8bea5cac89,cf2b8654-02b6-441e-98a9-cb8bea5cac89,1,0,2181bde8-031d-425e-875f-0bd153b634f2,2181bde8-031d-425e-875f-0bd153b634f2,1,0,ee1b81ac-0182-48dd-a348-1d8ba38869ca,ee1b81ac-0182-48dd-a348-1d8ba38869ca,1,0,ad385d3e-8201-402a-a1a8-267bc8c6d56b,ad385d3e-8201-402a-a1a8-267bc8c6d56b,1,0,53bb97e3-cd96-462a-b91f-c82678568d9a,53bb97e3-cd96-462a-b91f-c82678568d9a,1,0,32ca3bd6-7b32-4eab-8a4e-aeac26604e08,32ca3bd6-7b32-4eab-8a4e-aeac26604e08,1,0,2a702d37-8e83-4fa0-9969-5d954a7096c1,2a702d37-8e83-4fa0-9969-5d954a7096c1,1,0,71b7225e-6486-4916-85b2-8ec14363ebc8,71b7225e-6486-4916-85b2-8ec14363ebc8,1,0,2df34fcd-3118-4871-95d7-807dece77d3f,2df34fcd-3118-4871-95d7-807dece77d3f,1,0,32db89ab-74d3-4f80-9352-65e405770906,32db89ab-74d3-4f80-9352-65e405770906,1,0,21c22027-2036-4136-a98e-500e5cd679d1,21c22027-2036-4136-a98e-500e5cd679d1,1,0,6fe56db7-0f48-4dd0-b509-5372019ddcc2,6fe56db7-0f48-4dd0-b509-5372019ddcc2,1,0,884990f4-54f1-4b05-a5ed-40ee5a7a549a,884990f4-54f1-4b05-a5ed-40ee5a7a549a,1,0,4cf71e62-c8c2-4bc7-87fc-a89e48f2c007,4cf71e62-c8c2-4bc7-87fc-a89e48f2c007,1,0,e5a9260b-c18b-47bf-bc5a-23294e13025a,e5a9260b-c18b-47bf-bc5a-23294e13025a,1,0,02f00688-a2ed-4f91-bd41-50fc29e13d6c,02f00688-a2ed-4f91-bd41-50fc29e13d6c,1,0,e9f2b435-13e3-401a-9324-ca44986b7676,e9f2b435-13e3-401a-9324-ca44986b7676,1,0,2b854852-ae2d-46d8-8c3b-228af7a3f1db,2b854852-ae2d-46d8-8c3b-228af7a3f1db,1,0,11346c91-ecb6-40e6-a2fb-df7e6f5dbaed,11346c91-ecb6-40e6-a2fb-df7e6f5dbaed,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,27f793d8-da6a-4502-9b7e-82b8af7264d1,27f793d8-da6a-4502-9b7e-82b8af7264d1,1,0,4d3f3c76-999c-4105-8b64-cd4b7bc861b9,4d3f3c76-999c-4105-8b64-cd4b7bc861b9,1,0,efcf8b0f-7124-4096-9f50-b9b95369f196,efcf8b0f-7124-4096-9f50-b9b95369f196,1,0,c1f2db60-011c-4a0b-97bb-42e005ba51c9,c1f2db60-011c-4a0b-97bb-42e005ba51c9,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,993193b3-1dd8-4f5b-8ce7-6a0bf8c4330c,993193b3-1dd8-4f5b-8ce7-6a0bf8c4330c,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,75378d9c-a364-4b46-a6d1-b745604c46a2,75378d9c-a364-4b46-a6d1-b745604c46a2,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,2df403a2-57d8-4578-b017-e7cf9550b708,2df403a2-57d8-4578-b017-e7cf9550b708,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,5e232e6a-7f68-40d2-9555-4a2b3debe095,5e232e6a-7f68-40d2-9555-4a2b3debe095,1,0,efc8ca7d-966d-4c18-acd9-90f22dd75a7a,efc8ca7d-966d-4c18-acd9-90f22dd75a7a,1,0,1780ffa9-1ca3-4bcb-823f-5e582c4cc25e,1780ffa9-1ca3-4bcb-823f-5e582c4cc25e,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,71cad48a-37f2-4894-b876-9d74fa844828,71cad48a-37f2-4894-b876-9d74fa844828,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,584aa9db-e6b0-49f3-ae9d-5b6c796d015c,584aa9db-e6b0-49f3-ae9d-5b6c796d015c,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,d1391e3b-ec29-48c8-8bf5-fa4434a909e9,d1391e3b-ec29-48c8-8bf5-fa4434a909e9,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,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,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,40f93527-7bff-4f9c-b855-2b69f7c5eb33,40f93527-7bff-4f9c-b855-2b69f7c5eb33,1,0,697bd1de-bbef-4362-aa39-71f6008f4bd7,697bd1de-bbef-4362-aa39-71f6008f4bd7,1,0,676b2ea2-a559-4685-b5ca-7b619b02f101,676b2ea2-a559-4685-b5ca-7b619b02f101,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,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,a511f7d7-60ef-4a5c-8f8e-ddbee065eccd,a511f7d7-60ef-4a5c-8f8e-ddbee065eccd,1,0,6fa87b5a-fab0-48b6-b8ab-1aaa8c82d81d,6fa87b5a-fab0-48b6-b8ab-1aaa8c82d81d,1,0,323ef3df-b1cb-4927-a16e-2dbf11e37ae8,323ef3df-b1cb-4927-a16e-2dbf11e37ae8,1,0,e1760aea-29e3-4a45-b02a-b2b96cb73ec4,e1760aea-29e3-4a45-b02a-b2b96cb73ec4,1,0,c2b721a7-1e61-4b72-ba75-f4601d52e98a,c2b721a7-1e61-4b72-ba75-f4601d52e98a,1,0,a4ecd21c-a980-47f8-9944-b1dd7b5a41f3,a4ecd21c-a980-47f8-9944-b1dd7b5a41f3,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,1f018218-2281-4e32-a486-f32386959e5f,1f018218-2281-4e32-a486-f32386959e5f,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,beb07009-6612-4052-a991-888138da8e30,beb07009-6612-4052-a991-888138da8e30,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,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,5e4ec9d8-bb60-4dfb-89ba-002527dc149b,5e4ec9d8-bb60-4dfb-89ba-002527dc149b,1,0,bf463763-3801-4664-9d04-4d9fd7fe8c43,bf463763-3801-4664-9d04-4d9fd7fe8c43,1,0,43a0760f-3635-4e6a-a68a-1a2232245329,43a0760f-3635-4e6a-a68a-1a2232245329,1,0,5c64a4dd-2b9f-4110-abe2-266e6d8638fb,5c64a4dd-2b9f-4110-abe2-266e6d8638fb,1,0,d408d054-86ac-4471-a29d-efed65989899,d408d054-86ac-4471-a29d-efed65989899,1,0,3e979ec3-b544-4e37-8be6-95dce0a2b780,3e979ec3-b544-4e37-8be6-95dce0a2b780,1,0,2444eed3-25c7-4abc-a9a8-f3f3a8201267,2444eed3-25c7-4abc-a9a8-f3f3a8201267,1,0,e91118e9-d054-41a1-bfe9-343179718f33,e91118e9-d054-41a1-bfe9-343179718f33,1,0,042245ef-3a30-46fb-b3e3-6599d5426cbd,042245ef-3a30-46fb-b3e3-6599d5426cbd,1,0,d1034240-ab06-413a-9828-a5c7dc879680,d1034240-ab06-413a-9828-a5c7dc879680,1,0,5dd0f264-6d9f-41e4-92b6-e8b4fa3b4d84,5dd0f264-6d9f-41e4-92b6-e8b4fa3b4d84,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,12d19666-e996-4b55-b43c-b3a541f849a7,12d19666-e996-4b55-b43c-b3a541f849a7,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,61cfdc9a-49c3-4316-b38d-997910cf25c3,61cfdc9a-49c3-4316-b38d-997910cf25c3,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,e5033559-9d58-4b9b-a739-40c419e82192,e5033559-9d58-4b9b-a739-40c419e82192,1,0,594c79fa-0fdc-41d5-b122-04615dca3752,594c79fa-0fdc-41d5-b122-04615dca3752,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,ea868745-71fc-483c-aa6e-f242c06c673f,ea868745-71fc-483c-aa6e-f242c06c673f,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,ea0a498a-a1cb-4f28-88cb-0bc62971172b,ea0a498a-a1cb-4f28-88cb-0bc62971172b,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,801facc3-3b3b-4d0a-93c6-54a1f3495291,801facc3-3b3b-4d0a-93c6-54a1f3495291,1,0,f10167ac-f7bd-42fb-8daa-864593fcc115,f10167ac-f7bd-42fb-8daa-864593fcc115,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,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,e475a311-7cef-45e2-9ed2-0bded8b5c963,e475a311-7cef-45e2-9ed2-0bded8b5c963,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,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,4e6734a0-3bf8-4e71-bd38-5526819609f4,4e6734a0-3bf8-4e71-bd38-5526819609f4,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,9bb33b9f-0a27-4edd-b3b2-1c20a75d0f20,9bb33b9f-0a27-4edd-b3b2-1c20a75d0f20,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,bdafe976-c8d6-413a-8d61-765a02014e5d,bdafe976-c8d6-413a-8d61-765a02014e5d,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,6eb6003c-71cb-4be8-a375-abd5c9f7336b,6eb6003c-71cb-4be8-a375-abd5c9f7336b,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,bd206271-1388-4759-8992-da81507613be,bd206271-1388-4759-8992-da81507613be,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,b91b1b08-f35d-40b2-83d8-ecc761124b05,b91b1b08-f35d-40b2-83d8-ecc761124b05,1,0,5fb7ebb4-e2ce-40ae-aa1c-9351dc66919b,5fb7ebb4-e2ce-40ae-aa1c-9351dc66919b,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,f6b8e6ae-7d3e-4f6c-bd74-66ee7593868c,f6b8e6ae-7d3e-4f6c-bd74-66ee7593868c,1,0,e730ea3f-4f2a-4e21-8851-bccc51830cfe,e730ea3f-4f2a-4e21-8851-bccc51830cfe,1,0,193ab4a7-7eee-4374-95cf-2d907a3ba971,193ab4a7-7eee-4374-95cf-2d907a3ba971,1,0,e2779397-46ed-4d95-8529-45896f9567d2,e2779397-46ed-4d95-8529-45896f9567d2,1,0,3002d5d8-1b7d-4252-9e5d-9a533bf03ca8,3002d5d8-1b7d-4252-9e5d-9a533bf03ca8,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,faf89779-2290-4d37-b1ea-e81b1b79f74c,faf89779-2290-4d37-b1ea-e81b1b79f74c,1,0,88b879b7-1bb3-4478-b569-35bdb5c56939,88b879b7-1bb3-4478-b569-35bdb5c56939,1,0,b9e93e8f-1d4b-4bbb-ac1b-c8d26cfd1da2,b9e93e8f-1d4b-4bbb-ac1b-c8d26cfd1da2,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,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,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,e8cc4e0f-e9c2-4a24-a50e-f5be5ed21019,e8cc4e0f-e9c2-4a24-a50e-f5be5ed21019,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,93afedb2-2d93-4611-b0fd-830bf33789c2,93afedb2-2d93-4611-b0fd-830bf33789c2,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,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,e1a375da-c16c-4616-8a33-9414c13a48c7,e1a375da-c16c-4616-8a33-9414c13a48c7,1,0,99993a9b-97e9-4606-94fa-2da43a03c3b2,99993a9b-97e9-4606-94fa-2da43a03c3b2,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,b20780cd-53d9-48bb-ac3f-2aa4eb6ab3c5,b20780cd-53d9-48bb-ac3f-2aa4eb6ab3c5,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,ddac9d84-61b8-49e7-b468-e4aef4403d64,ddac9d84-61b8-49e7-b468-e4aef4403d64,1,0,ae2eec04-8327-4c51-89d3-eb6b725d6e8b,ae2eec04-8327-4c51-89d3-eb6b725d6e8b,1,0,350b262d-2b1f-43de-9994-6abfd2e4e761,350b262d-2b1f-43de-9994-6abfd2e4e761,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,740a6d15-23e8-43a0-af3c-71a544f8fa4f,740a6d15-23e8-43a0-af3c-71a544f8fa4f,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,16080b3d-b385-4e44-af16-d1a357a2b842,16080b3d-b385-4e44-af16-d1a357a2b842,1,0,8de85e8b-6828-44a3-8481-4ff4c8c2b9e2,8de85e8b-6828-44a3-8481-4ff4c8c2b9e2,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,090e521e-391a-4ce7-9f7c-1c459fd221eb,090e521e-391a-4ce7-9f7c-1c459fd221eb,1,0,87dad256-122b-4d7e-b249-a2c313a9cf33,87dad256-122b-4d7e-b249-a2c313a9cf33,1,0,e7903c89-5282-4771-8f9b-536694b7816e,e7903c89-5282-4771-8f9b-536694b7816e,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,61c1ff46-2a30-43bb-b1df-4db2271b1b12,61c1ff46-2a30-43bb-b1df-4db2271b1b12,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,b2bd5a0e-d60c-411d-a001-ecdee0152b1a,b2bd5a0e-d60c-411d-a001-ecdee0152b1a,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,72d579ee-8cd5-4b08-9f3f-eb15f14ee194,72d579ee-8cd5-4b08-9f3f-eb15f14ee194,1,0,b98ca634-25a5-4366-af04-815ba34c8bb2,b98ca634-25a5-4366-af04-815ba34c8bb2,1,0,447da3d4-5d94-4cd2-8540-53c0836e6173,447da3d4-5d94-4cd2-8540-53c0836e6173,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,6fbc9a01-ddcb-47ab-84c0-f08b103be12b,6fbc9a01-ddcb-47ab-84c0-f08b103be12b,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,9c472614-595a-4456-aadd-f629455a754e,9c472614-595a-4456-aadd-f629455a754e,1,0,c205ddad-54ed-476f-85cd-e133313fe3a5,c205ddad-54ed-476f-85cd-e133313fe3a5,1,0,98edbda8-2511-4743-b643-28934af0ed74,98edbda8-2511-4743-b643-28934af0ed74,1,0,db1f2fdc-6862-43c0-aefa-499f8c2b585c,db1f2fdc-6862-43c0-aefa-499f8c2b585c,1,0,c9a0afb1-65fa-45ea-aabb-5ec080d9406e,c9a0afb1-65fa-45ea-aabb-5ec080d9406e,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,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,8568b969-4d05-42ab-b30a-c937619c7c93,8568b969-4d05-42ab-b30a-c937619c7c93,1,0,1afea577-b99e-41de-b613-47dd0b480a91,1afea577-b99e-41de-b613-47dd0b480a91,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,9162a85e-a385-42b0-b809-da916fce44b7,9162a85e-a385-42b0-b809-da916fce44b7,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,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,5a2f2284-4f86-4ee4-8b53-296c2787f320,5a2f2284-4f86-4ee4-8b53-296c2787f320,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,c1f7437a-b278-4941-b580-75c6693155d0,c1f7437a-b278-4941-b580-75c6693155d0,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,836dfba9-c948-409b-825f-f0d869872835,836dfba9-c948-409b-825f-f0d869872835,1,0,137ec4ee-5053-47a7-8f5d-f6e63174608f,137ec4ee-5053-47a7-8f5d-f6e63174608f,1,0,4e6d38c5-2a09-4473-9e04-8f631fe88c61,4e6d38c5-2a09-4473-9e04-8f631fe88c61,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,8583ca82-a4f5-4f2a-9b9a-7807b4560e85,8583ca82-a4f5-4f2a-9b9a-7807b4560e85,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,baec0e60-c410-4b95-8126-f77fd06225b4,baec0e60-c410-4b95-8126-f77fd06225b4,1,0,91275c80-d7f7-47c6-ba76-4a10d394f55b,91275c80-d7f7-47c6-ba76-4a10d394f55b,1,0,b92edc24-fcf7-498d-97a2-0c7f3005c814,b92edc24-fcf7-498d-97a2-0c7f3005c814,1,0,2b97f923-6a4e-4894-9ece-5129d8832864,2b97f923-6a4e-4894-9ece-5129d8832864,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,15a4595f-92d8-4084-bb92-cdc587b3a04e,15a4595f-92d8-4084-bb92-cdc587b3a04e,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,6cc8da97-8752-4c6b-88ef-f7e8ff5dd693,6cc8da97-8752-4c6b-88ef-f7e8ff5dd693,1,0,8683dfa2-0ad9-4345-85e8-a6d2e40881e5,8683dfa2-0ad9-4345-85e8-a6d2e40881e5,1,0,e70ec2f5-5723-4fb0-9b81-c0979943a46a,e70ec2f5-5723-4fb0-9b81-c0979943a46a,1,0,eb125af7-4e19-4235-8d03-361b60a8f68a,eb125af7-4e19-4235-8d03-361b60a8f68a,1,0,bcd1077a-2d19-4bc1-bded-a85818765ac1,bcd1077a-2d19-4bc1-bded-a85818765ac1,1,0,b79ce000-28f7-4630-a5a3-cecb9ef8a0a1,b79ce000-28f7-4630-a5a3-cecb9ef8a0a1,1,0,3ff0b4e6-6afa-4aa8-a20e-84a9d2d74f86,3ff0b4e6-6afa-4aa8-a20e-84a9d2d74f86,1,0,eb747bc2-f81f-4ec3-b216-2457a87683ae,eb747bc2-f81f-4ec3-b216-2457a87683ae,1,0,0ad77f2c-24db-4fda-a79f-984c0c8beac0,0ad77f2c-24db-4fda-a79f-984c0c8beac0,1,0,cfb3ea4b-a092-4c5f-aef0-a83ff8829d24,cfb3ea4b-a092-4c5f-aef0-a83ff8829d24,1,0,02bc23cf-c600-4470-bb84-59cdac35eea9,02bc23cf-c600-4470-bb84-59cdac35eea9,1,0,b7753aea-3798-4be9-b9ce-e4145fbea58a,b7753aea-3798-4be9-b9ce-e4145fbea58a,1,0,ce3d12b8-da77-4ac5-a7bf-a02809ed3f1e,ce3d12b8-da77-4ac5-a7bf-a02809ed3f1e,1,0,cf3819dd-6564-47cd-9b22-790433ca9607,cf3819dd-6564-47cd-9b22-790433ca9607,1,0,231f7349-0e98-497a-9df3-8123a5ea20f0,231f7349-0e98-497a-9df3-8123a5ea20f0,1,0,0c7790f8-db18-4d1d-aa34-d0c7097d0576,0c7790f8-db18-4d1d-aa34-d0c7097d0576,1,0,926b936a-4147-40ef-92c7-008713d5a8b4,926b936a-4147-40ef-92c7-008713d5a8b4,1,0,3446ba39-fbd6-462f-af51-add3173ce1fc,3446ba39-fbd6-462f-af51-add3173ce1fc,1,0,7510d830-cf29-408c-9f2a-77e30382beeb,7510d830-cf29-408c-9f2a-77e30382beeb,1,0,133d9c01-751e-47a1-93a5-46cfa1b85a51,133d9c01-751e-47a1-93a5-46cfa1b85a51,1,0,42b81035-bc9b-4b8a-b1ee-55c24c6bb875,42b81035-bc9b-4b8a-b1ee-55c24c6bb875,1,0,c4e58e2b-2a73-44f2-8a4b-dded01944c35,c4e58e2b-2a73-44f2-8a4b-dded01944c35,1,0,ada738c2-8f68-4f25-afc2-ad88164f5fea,ada738c2-8f68-4f25-afc2-ad88164f5fea,1,0,683cc434-af64-4afb-835b-c20e7e17c32e,683cc434-af64-4afb-835b-c20e7e17c32e,1,0,19aad3e9-704b-4057-8a1d-e6131af2da2d,19aad3e9-704b-4057-8a1d-e6131af2da2d,1,0,6522829d-bb7f-4bac-9c66-21d936d9d3c6,6522829d-bb7f-4bac-9c66-21d936d9d3c6,1,0,aa4c2d2c-b1f8-4525-bdef-24b0dce4724a,aa4c2d2c-b1f8-4525-bdef-24b0dce4724a,1,0,f7c432c0-ee57-40f3-98c2-b94401042395,f7c432c0-ee57-40f3-98c2-b94401042395,1,0,b7dd0b15-bbf0-4959-8d63-fb00c2519d3d,b7dd0b15-bbf0-4959-8d63-fb00c2519d3d,1,0,d58fea2a-34b7-4404-9939-faf5bf1f19c6,d58fea2a-34b7-4404-9939-faf5bf1f19c6,1,0,b458ed6f-e0d2-4830-8005-16f08612c76a,b458ed6f-e0d2-4830-8005-16f08612c76a,1,0,988787d0-4704-4aa7-b02f-96492784d667,988787d0-4704-4aa7-b02f-96492784d667,1,0,66d837ed-be23-4e0a-8cbc-c918f234998d,66d837ed-be23-4e0a-8cbc-c918f234998d,1,0,010bcfe3-a299-4333-8faa-96b08356a097,010bcfe3-a299-4333-8faa-96b08356a097,1,0,4735b8d0-5b06-4640-9d68-380ba4165c01,4735b8d0-5b06-4640-9d68-380ba4165c01,1,0,adcaecde-1977-4c6d-a204-12df7d9915e2,adcaecde-1977-4c6d-a204-12df7d9915e2,1,0,348376e0-6e02-4360-95ea-f23086cabd55,348376e0-6e02-4360-95ea-f23086cabd55,1,0,d7cdbc04-3eaa-45b6-b71b-0340bf029752,d7cdbc04-3eaa-45b6-b71b-0340bf029752,1,0,f6d562ac-6bc8-4e82-9ac0-b6fc4ed41677,f6d562ac-6bc8-4e82-9ac0-b6fc4ed41677,1,0,e954636b-2410-4602-8dfd-fde852998f8b,e954636b-2410-4602-8dfd-fde852998f8b,1,0,00f82519-e522-4cf2-92ab-19a13f38baa7,00f82519-e522-4cf2-92ab-19a13f38baa7,1,0,b59f1272-69ab-4d6a-8e4b-43bfe8231c8c,b59f1272-69ab-4d6a-8e4b-43bfe8231c8c,1,0,33df37df-43d0-40d7-95dd-23655b1fdf81,33df37df-43d0-40d7-95dd-23655b1fdf81,1,0,cef5c343-440f-475e-98f1-28da65eabcf3,cef5c343-440f-475e-98f1-28da65eabcf3,1,0,979378ce-8455-4761-ae83-10e747a6656d,979378ce-8455-4761-ae83-10e747a6656d,1,0,de3cb87d-d08f-4f45-aca5-c4c526772eeb,de3cb87d-d08f-4f45-aca5-c4c526772eeb,1,0,509770b5-ddaf-477b-a79c-cec8afbaf9bc,509770b5-ddaf-477b-a79c-cec8afbaf9bc,1,0,25d72d6e-1a64-4366-85af-5789ed7806d3,25d72d6e-1a64-4366-85af-5789ed7806d3,1,0,eedf57b6-8fd6-4e80-bc0c-1583196b34eb,eedf57b6-8fd6-4e80-bc0c-1583196b34eb,1,0,ec7cc726-82a7-455e-b302-0e024d60bbab,ec7cc726-82a7-455e-b302-0e024d60bbab,1,0,1bae5c60-1027-4ff7-a607-d57da0d6e4f7,1bae5c60-1027-4ff7-a607-d57da0d6e4f7,1,0,3d18a46c-1d64-4bec-9a22-07a736abbf8f,3d18a46c-1d64-4bec-9a22-07a736abbf8f,1,0,d5c64b8e-1184-4ec5-8f02-87e037df0034,d5c64b8e-1184-4ec5-8f02-87e037df0034,1,0,6b5fb7ab-d010-483b-939d-c9f9e2d8884f,6b5fb7ab-d010-483b-939d-c9f9e2d8884f,1,0,5b0f5e4e-ef26-415b-830a-6623688e8a78,5b0f5e4e-ef26-415b-830a-6623688e8a78,1,0,b33693ac-6bc1-47e1-81ab-a3278d3596a3,b33693ac-6bc1-47e1-81ab-a3278d3596a3,1,0,caebab45-2be3-4f5d-b06d-d91c5a4122a0,caebab45-2be3-4f5d-b06d-d91c5a4122a0,1,0,7a56e6ee-3518-491f-b5af-4f1aca2462c0,7a56e6ee-3518-491f-b5af-4f1aca2462c0,1,0,61d03f9f-834b-4077-b5c7-0de85ef007d3,61d03f9f-834b-4077-b5c7-0de85ef007d3,1,0,1683afaf-db32-4267-b1d1-959836c50fb5,1683afaf-db32-4267-b1d1-959836c50fb5,1,0,1e50e4de-f091-4ccc-ba2d-8a526c20351e,1e50e4de-f091-4ccc-ba2d-8a526c20351e,1,0,7671eebd-cdf4-43c6-8d0d-2dff2f8ce975,7671eebd-cdf4-43c6-8d0d-2dff2f8ce975,1,0,83342c37-30b6-4f39-a2df-7aab425eb3bf,83342c37-30b6-4f39-a2df-7aab425eb3bf,1,0,896d8858-5574-4e36-abc0-92a2f0b6e905,896d8858-5574-4e36-abc0-92a2f0b6e905,1,0,8767bf87-b364-4e16-8371-40ae96bff7c0,8767bf87-b364-4e16-8371-40ae96bff7c0,1,0,65ba2d12-ce10-4f27-93ba-0668592edfce,65ba2d12-ce10-4f27-93ba-0668592edfce,1,0,45dba1f4-f080-4b99-abe4-63125f84f580,45dba1f4-f080-4b99-abe4-63125f84f580,1,0,24d0e61f-c9af-45f0-b6dd-00d1fefa1720,24d0e61f-c9af-45f0-b6dd-00d1fefa1720,1,0,75088623-2b34-499a-85c9-0c3f78448cf3,75088623-2b34-499a-85c9-0c3f78448cf3,1,0,f151768d-f840-4116-8fb5-bbcc0b5dd2bc,f151768d-f840-4116-8fb5-bbcc0b5dd2bc,1,0,dd6581f7-82fc-469c-ae2f-d270d810e843,dd6581f7-82fc-469c-ae2f-d270d810e843,1,0,ca0258bd-7408-45a6-8c61-6097090dad4a,ca0258bd-7408-45a6-8c61-6097090dad4a,1,0,5080a8ca-a75e-4f4f-885b-62f64434f0f2,5080a8ca-a75e-4f4f-885b-62f64434f0f2,1,0,3adbff51-6a82-40e7-9585-a030b06d0632,3adbff51-6a82-40e7-9585-a030b06d0632,1,0,c27036c4-7077-4464-b24a-46b37db4bfcf,c27036c4-7077-4464-b24a-46b37db4bfcf,1,0,99ce0c09-eae0-430b-9a20-46d96503876b,99ce0c09-eae0-430b-9a20-46d96503876b,1,0,128e9f84-5f92-4ed6-afb9-86b4b244ae58,128e9f84-5f92-4ed6-afb9-86b4b244ae58,1,0,5bff11e0-07d0-43eb-b02d-5dc6f2c9bab1,5bff11e0-07d0-43eb-b02d-5dc6f2c9bab1,1,0,13b4853f-d83d-4e30-80a4-704b740cf76f,13b4853f-d83d-4e30-80a4-704b740cf76f,1,0,32e9be21-ef2f-46fd-96ff-2ba143a8c1d9,32e9be21-ef2f-46fd-96ff-2ba143a8c1d9,1,0,9c81736c-25ce-42eb-9e7a-1fc014cbbc7d,9c81736c-25ce-42eb-9e7a-1fc014cbbc7d,1,0,655ac12f-a0e4-46fb-b11a-eaba635edfae,655ac12f-a0e4-46fb-b11a-eaba635edfae,1,0,7bccc0c6-bc80-4672-8190-4fc94cea4249,7bccc0c6-bc80-4672-8190-4fc94cea4249,1,0,82ebe1f1-2c36-4152-bc02-b8085ad614e3,82ebe1f1-2c36-4152-bc02-b8085ad614e3,1,0,68259658-c149-4a1b-b1d5-b15b232ee334,68259658-c149-4a1b-b1d5-b15b232ee334,1,0,301a9f28-2cd9-4364-9b57-a22b9e6553fa,301a9f28-2cd9-4364-9b57-a22b9e6553fa,1,0,4948d3d3-9267-4f9c-8260-5ebb63ce281f,4948d3d3-9267-4f9c-8260-5ebb63ce281f,1,0,051bc689-9357-463a-93db-55994af23a88,051bc689-9357-463a-93db-55994af23a88,1,0,2d4a8fe5-3371-42f9-8052-ec78d4df0da1,2d4a8fe5-3371-42f9-8052-ec78d4df0da1,1,0,4be19ad6-691e-4224-86ec-bc4d76a15525,4be19ad6-691e-4224-86ec-bc4d76a15525,1,0,cf9ebddd-d421-475f-8d57-6c45d817c4ec,cf9ebddd-d421-475f-8d57-6c45d817c4ec,1,0,6718e0bf-8a9d-4eab-88fd-9cd5f2bc9e58,6718e0bf-8a9d-4eab-88fd-9cd5f2bc9e58,1,0,2811d95d-6ce9-4066-99cb-ea6894b18497,2811d95d-6ce9-4066-99cb-ea6894b18497,1,0,2fcee659-7bd7-4181-9991-ce4723d485cd,2fcee659-7bd7-4181-9991-ce4723d485cd,1,0,79dc0e69-6a17-428f-b36f-9056d0f6864c,79dc0e69-6a17-428f-b36f-9056d0f6864c,1,0,77a94ffd-4847-4180-a587-31dd3c95f62a,77a94ffd-4847-4180-a587-31dd3c95f62a,1,0,de8bb46d-127e-40e6-af46-a7385a37819b,de8bb46d-127e-40e6-af46-a7385a37819b,1,0,95b5ac72-941c-4f6b-aa2d-ce2a1b616d8d,95b5ac72-941c-4f6b-aa2d-ce2a1b616d8d,1,0,ea557343-ae0f-4a2c-a298-573c952a7d63,ea557343-ae0f-4a2c-a298-573c952a7d63,1,0,11d02ccf-173f-447a-aae1-79f373e46e53,11d02ccf-173f-447a-aae1-79f373e46e53,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,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,96cd8b90-5cf3-416c-b3a2-1f62e158b37e,96cd8b90-5cf3-416c-b3a2-1f62e158b37e,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,f00116da-2bf1-4edd-b939-f25d36774f5b,f00116da-2bf1-4edd-b939-f25d36774f5b,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,b1230b96-f4c8-4311-bfc0-df33bcc41394,b1230b96-f4c8-4311-bfc0-df33bcc41394,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,ddaba839-5ed2-4707-8cb8-ebd5784f642a,ddaba839-5ed2-4707-8cb8-ebd5784f642a,1,0,86c679c0-3531-4622-9a1f-3d9d6ccdd431,86c679c0-3531-4622-9a1f-3d9d6ccdd431,1,0,cba9e94c-e328-42ef-bcd0-92db3f0c048b,cba9e94c-e328-42ef-bcd0-92db3f0c048b,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,667f0c7e-fa70-49e9-97c9-ad04819fee58,667f0c7e-fa70-49e9-97c9-ad04819fee58,1,0,ae3876e2-bd06-415b-9d9a-b77d787be09e,ae3876e2-bd06-415b-9d9a-b77d787be09e,1,0,ded105e9-b71b-4550-9d9c-9c743dc212d0,ded105e9-b71b-4550-9d9c-9c743dc212d0,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,546af6c0-0762-4d2d-9d3b-c6a8f6c57674,546af6c0-0762-4d2d-9d3b-c6a8f6c57674,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,32850dc1-1484-4b7d-94f4-a08329423e7b,32850dc1-1484-4b7d-94f4-a08329423e7b,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,9299b382-fc65-4f89-8329-94fec125761c,9299b382-fc65-4f89-8329-94fec125761c,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,1c265c15-6002-416e-8045-81f03c893faf,1c265c15-6002-416e-8045-81f03c893faf,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,b2f17ef1-3f6f-4029-b3e2-28d6b79c5b76,b2f17ef1-3f6f-4029-b3e2-28d6b79c5b76,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,7adced5f-3a5f-419a-926c-0452aad86c86,7adced5f-3a5f-419a-926c-0452aad86c86,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,2181d197-028b-40b2-bf02-3d85dad1af30,2181d197-028b-40b2-bf02-3d85dad1af30,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,4249f45b-b298-4d42-9ca2-bd80b87f2150,4249f45b-b298-4d42-9ca2-bd80b87f2150,1,0,f88ccd7a-8d15-4b24-addf-da522a0b4a43,f88ccd7a-8d15-4b24-addf-da522a0b4a43,1,0,bc039475-c872-4b99-9248-c74aae75f0e1,bc039475-c872-4b99-9248-c74aae75f0e1,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,30be8d71-a9dd-4dd3-8fb4-ea0c8de86358,30be8d71-a9dd-4dd3-8fb4-ea0c8de86358,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,33c93020-b5f0-424e-a8fc-114a6ab04107,33c93020-b5f0-424e-a8fc-114a6ab04107,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,f9479915-cdee-40d5-ba53-101132aac672,f9479915-cdee-40d5-ba53-101132aac672,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,b2de86fc-f10b-4304-8060-cad903ba37c5,b2de86fc-f10b-4304-8060-cad903ba37c5,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,85d6d214-2b70-4cc4-ba80-f4325dd4ca65,85d6d214-2b70-4cc4-ba80-f4325dd4ca65,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,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,e29d96ee-e8fa-4100-8a0e-494398e4ec9d,e29d96ee-e8fa-4100-8a0e-494398e4ec9d,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,19ea515f-65f7-4ed9-812b-c97b92e2498f,19ea515f-65f7-4ed9-812b-c97b92e2498f,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,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,8cf925d9-6811-4bce-b116-09d6a26ff3cb,8cf925d9-6811-4bce-b116-09d6a26ff3cb,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,36999e1b-865e-41ad-b9d6-1b3ac887acfb,36999e1b-865e-41ad-b9d6-1b3ac887acfb,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,af52cd7d-374a-4c46-a74c-305e154dc6f2,af52cd7d-374a-4c46-a74c-305e154dc6f2,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,2a985b50-a4b1-4932-8af6-51eee8e78ac8,2a985b50-a4b1-4932-8af6-51eee8e78ac8,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,fe9eca7c-6e3d-4c3f-b98d-abd8ab05d35e,fe9eca7c-6e3d-4c3f-b98d-abd8ab05d35e,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,7ad16fb4-17eb-4812-8015-9447d92e08ce,7ad16fb4-17eb-4812-8015-9447d92e08ce,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,8bd56034-6d56-4c2f-8e7f-4c0fff49ac39,8bd56034-6d56-4c2f-8e7f-4c0fff49ac39,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,dc14a27a-2299-4bd5-8c0e-5f84adae507a,dc14a27a-2299-4bd5-8c0e-5f84adae507a,1,0,bf20e6ce-bbe6-4523-9381-f9cb6cad348c,bf20e6ce-bbe6-4523-9381-f9cb6cad348c,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,8d8ac8f0-37e1-4637-87c7-5af82d05202b,8d8ac8f0-37e1-4637-87c7-5af82d05202b,1,0,8dad7f71-63cb-449a-bafd-79bd63f10310,8dad7f71-63cb-449a-bafd-79bd63f10310,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,ae039438-89af-4217-910d-476115f51ab2,ae039438-89af-4217-910d-476115f51ab2,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,f1560584-99a3-48ac-b736-e7d33affe474,f1560584-99a3-48ac-b736-e7d33affe474,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,6a9f1485-21a4-41e8-b8a7-26340eff5085,6a9f1485-21a4-41e8-b8a7-26340eff5085,1,0,630845af-a7dc-4d1e-8c1a-44fa65aab036,630845af-a7dc-4d1e-8c1a-44fa65aab036,1,0,65dd4904-0837-4de5-a5e5-601151055d94,65dd4904-0837-4de5-a5e5-601151055d94,1,0,d20739a3-a149-4b64-b9ca-4a76aca06cb8,d20739a3-a149-4b64-b9ca-4a76aca06cb8,1,0,99c5e87a-f096-4315-8fbe-f596ea9c176f,99c5e87a-f096-4315-8fbe-f596ea9c176f,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,db445527-7bd2-448b-bf87-5ac0c10d742d,db445527-7bd2-448b-bf87-5ac0c10d742d,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,a43fbfd8-6324-4192-a1a6-5628a7edb4d2,a43fbfd8-6324-4192-a1a6-5628a7edb4d2,1,0,84395058-d46a-428c-b782-a9fa89fea14a,84395058-d46a-428c-b782-a9fa89fea14a,1,0,c3c1a825-6b35-4b09-8043-63f75b575707,c3c1a825-6b35-4b09-8043-63f75b575707,1,0,5465466d-48be-493a-aadc-e97046b010cc,5465466d-48be-493a-aadc-e97046b010cc,1,0,fa61df43-49e7-4d5f-a0b9-f35af199f9f5,fa61df43-49e7-4d5f-a0b9-f35af199f9f5,1,0,0b92cced-d818-400c-82b6-7726e912a478,0b92cced-d818-400c-82b6-7726e912a478,1,0,5feb9b74-3d94-4202-a96a-170968f54194,5feb9b74-3d94-4202-a96a-170968f54194,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,766c9bee-b0fc-4a7f-b88e-cd8c4aad73b8,766c9bee-b0fc-4a7f-b88e-cd8c4aad73b8,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,85b591b4-a93d-4fcb-bdc7-e6d44436e511,85b591b4-a93d-4fcb-bdc7-e6d44436e511,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,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,e4703f32-ad6e-4803-8776-7d32c57d3549,e4703f32-ad6e-4803-8776-7d32c57d3549,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,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,0a1837b6-9a0a-4a86-b929-89d032d41383,0a1837b6-9a0a-4a86-b929-89d032d41383,1,0,62ff29be-7d52-4c63-8726-c55bf69a64de,62ff29be-7d52-4c63-8726-c55bf69a64de,1,0,e55d259f-cfaa-46f9-92c4-687e1ff3b89d,e55d259f-cfaa-46f9-92c4-687e1ff3b89d,1,0,123b8af3-8724-4f77-b1d6-6768832a43a7,123b8af3-8724-4f77-b1d6-6768832a43a7,1,0,cb81fb9f-16a2-4265-92a9-b827ca2fd588,cb81fb9f-16a2-4265-92a9-b827ca2fd588,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,2fa09d14-6d28-4bfb-87c3-894e66ab6bca,2fa09d14-6d28-4bfb-87c3-894e66ab6bca,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,308781d9-ea18-4c30-ba95-ef822e7ef739,308781d9-ea18-4c30-ba95-ef822e7ef739,1,0,a7f3ee04-4ffe-4a21-b2ad-92cd3f4acd8f,a7f3ee04-4ffe-4a21-b2ad-92cd3f4acd8f,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,52fd1e04-44b6-4405-a2de-ec5c0cf66b64,52fd1e04-44b6-4405-a2de-ec5c0cf66b64,1,0,9a647b38-73da-4491-997b-773059cfd1c9,9a647b38-73da-4491-997b-773059cfd1c9,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,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,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,800ef5f0-fdd1-4f8b-8c0b-9744952bfb5b,800ef5f0-fdd1-4f8b-8c0b-9744952bfb5b,1,0,b51eaf45-baa1-4d1c-bcb7-a89bb8bcc26a,b51eaf45-baa1-4d1c-bcb7-a89bb8bcc26a,1,0,0f314b6b-5ed1-46ed-bdfd-cf53330c2783,0f314b6b-5ed1-46ed-bdfd-cf53330c2783,1,0,322645d4-e3fb-467b-a55d-d8e74cff2ea3,322645d4-e3fb-467b-a55d-d8e74cff2ea3,1,0,5ea29362-0ab7-4ca3-865e-bf93db5ca24b,5ea29362-0ab7-4ca3-865e-bf93db5ca24b,1,0,8363bd46-1ea5-44f0-858a-05bc03f6020e,8363bd46-1ea5-44f0-858a-05bc03f6020e,1,0,0f039952-09d3-49c8-b909-e8333a3fc8f9,0f039952-09d3-49c8-b909-e8333a3fc8f9,1,0,d8fc4644-5351-443c-8b5d-5de2c4b855d1,d8fc4644-5351-443c-8b5d-5de2c4b855d1,1,0,64ff6058-c6f3-4682-b9a1-11ec438fa447,64ff6058-c6f3-4682-b9a1-11ec438fa447,1,0,9cd2fc77-a4b0-457e-a6b0-63dbf521bf90,9cd2fc77-a4b0-457e-a6b0-63dbf521bf90,1,0,a321b6db-391b-4c65-8d27-ce486d10055e,a321b6db-391b-4c65-8d27-ce486d10055e,1,0,71dfde27-3762-4dd0-9252-6e703ce1b101,71dfde27-3762-4dd0-9252-6e703ce1b101,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,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,0eea37cc-47f8-4819-85da-d4991f4e58ed,0eea37cc-47f8-4819-85da-d4991f4e58ed,1,0,45a2569e-820c-4d7d-ba74-4a781d26bb2b,45a2569e-820c-4d7d-ba74-4a781d26bb2b,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,91a0ceed-03ce-4914-9cd1-dec49bba336f,91a0ceed-03ce-4914-9cd1-dec49bba336f,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,826c2821-147d-4aaf-910c-acfbdb58a29f,826c2821-147d-4aaf-910c-acfbdb58a29f,1,0,aeea0075-bdeb-41b7-b9cc-1da7b500455f,aeea0075-bdeb-41b7-b9cc-1da7b500455f,1,0,11c086b0-c646-4701-983d-c38758286354,11c086b0-c646-4701-983d-c38758286354,1,0,21fad9b6-44df-417c-ba18-de4b8af98a34,21fad9b6-44df-417c-ba18-de4b8af98a34,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,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,7ac85789-9c69-40b6-9130-94c40ed440d4,7ac85789-9c69-40b6-9130-94c40ed440d4,1,0,0f77d06f-f736-451e-9e6b-28868e48f3ed,0f77d06f-f736-451e-9e6b-28868e48f3ed,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,07629bf6-5544-4de9-b1d8-851cb03766cb,07629bf6-5544-4de9-b1d8-851cb03766cb,1,0,d449a85f-2e26-4512-b98c-7be3007966ed,d449a85f-2e26-4512-b98c-7be3007966ed,1,0,581be829-b097-4f95-a0c4-7ca3f13c29fc,581be829-b097-4f95-a0c4-7ca3f13c29fc,1,0,dd978355-1fb7-44a0-ba88-4e72e9cd67a9,dd978355-1fb7-44a0-ba88-4e72e9cd67a9,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,3981b13c-f8e1-44cc-a8e8-59ee9635d029,3981b13c-f8e1-44cc-a8e8-59ee9635d029,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,de258ab8-2d16-4c69-9490-5819b7ae3d08,de258ab8-2d16-4c69-9490-5819b7ae3d08,1,0,f7aacf70-0b59-410a-9929-ab4ab8a2431c,f7aacf70-0b59-410a-9929-ab4ab8a2431c,1,0,5bb6ba7a-ed61-4cdd-b3db-ec9da292e7a4,5bb6ba7a-ed61-4cdd-b3db-ec9da292e7a4,1,0,b37a9edd-b6bc-40eb-b5de-f54968abc119,b37a9edd-b6bc-40eb-b5de-f54968abc119,1,0,52338832-b15a-4e56-b13d-141141677008,52338832-b15a-4e56-b13d-141141677008,1,0,e9616402-88cc-44ae-96ca-ba20cf7d38ad,e9616402-88cc-44ae-96ca-ba20cf7d38ad,1,0,1b8212d7-b834-460c-9a2b-68a5de889e5b,1b8212d7-b834-460c-9a2b-68a5de889e5b,1,0,a816deca-4863-44e2-a8ff-89bfa5fbb0ac,a816deca-4863-44e2-a8ff-89bfa5fbb0ac,1,0,157f3df0-97b7-461b-bd3e-1f2e12658adf,157f3df0-97b7-461b-bd3e-1f2e12658adf,1,0,d2d6968c-fbe6-4e09-9cdb-653ca9a97fcc,d2d6968c-fbe6-4e09-9cdb-653ca9a97fcc,1,0,ea6f491e-9ec9-456d-ae30-4a258d87dff6,ea6f491e-9ec9-456d-ae30-4a258d87dff6,1,0,c67cddce-64d0-45eb-8abb-5c76bbe27f93,c67cddce-64d0-45eb-8abb-5c76bbe27f93,1,0,4f1aa113-6d77-46c8-ac21-9e5545553499,4f1aa113-6d77-46c8-ac21-9e5545553499,1,0,6ccec21e-f26f-482c-9ce2-1f058fc492c1,6ccec21e-f26f-482c-9ce2-1f058fc492c1,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,ffd14055-0847-48da-8807-0ba07decf6a5,ffd14055-0847-48da-8807-0ba07decf6a5,1,0,ee808b7e-8313-4838-8a5a-9b49e3ce7e3e,ee808b7e-8313-4838-8a5a-9b49e3ce7e3e,1,0,a8450a10-c18c-4b99-828b-870f38c32991,a8450a10-c18c-4b99-828b-870f38c32991,1,0,ad5e61a9-2f12-4629-9d7b-7882cc885992,ad5e61a9-2f12-4629-9d7b-7882cc885992,1,0,68a66e43-123c-4dc4-8eb7-3b728a6dbf40,68a66e43-123c-4dc4-8eb7-3b728a6dbf40,1,0,b016e858-7a3b-473a-a9b7-a6c718d0a028,b016e858-7a3b-473a-a9b7-a6c718d0a028,1,0,7db81d96-e359-4157-b5cb-3b50622d6556,7db81d96-e359-4157-b5cb-3b50622d6556,1,0,aa09ff66-3f4a-4746-9a99-697a2915b3fc,aa09ff66-3f4a-4746-9a99-697a2915b3fc,1,0,21305c37-31fb-46f3-85bc-8743c22faa02,21305c37-31fb-46f3-85bc-8743c22faa02,1,0,c5bace94-8fbc-4ad1-9567-a41332e8f00a,c5bace94-8fbc-4ad1-9567-a41332e8f00a,1,0,9fc40f79-c538-4ea5-a939-67bdd540d805,9fc40f79-c538-4ea5-a939-67bdd540d805,1,0,70443b2a-04db-4573-a4ea-e35078b383d7,70443b2a-04db-4573-a4ea-e35078b383d7,1,0,fb760c8a-d0bd-4445-9d68-85e5145d0182,fb760c8a-d0bd-4445-9d68-85e5145d0182,1,0,ecf54919-4cf2-4b30-9efa-de517d823555,ecf54919-4cf2-4b30-9efa-de517d823555,1,0,a4814357-6575-4a55-808f-4a4c94047110,a4814357-6575-4a55-808f-4a4c94047110,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,44dba9ff-fb54-4cc9-9da2-b00db76060e4,44dba9ff-fb54-4cc9-9da2-b00db76060e4,1,0,a6a0c38d-52a1-4a36-b29a-fb9cc084465f,a6a0c38d-52a1-4a36-b29a-fb9cc084465f,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,a666af62-aa5d-4b2b-b9e5-017d1c93ae6a,a666af62-aa5d-4b2b-b9e5-017d1c93ae6a,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,20adf54c-044c-4bea-8028-b6d20917a030,20adf54c-044c-4bea-8028-b6d20917a030,1,0,fbaa5b0a-56dc-4bf1-b1b2-e48073f63d13,fbaa5b0a-56dc-4bf1-b1b2-e48073f63d13,1,0,2e54b3e8-6672-48d5-802a-23d5144fed79,2e54b3e8-6672-48d5-802a-23d5144fed79,1,0,2a7c4ae2-aab3-48b3-b04f-7be6989939e8,2a7c4ae2-aab3-48b3-b04f-7be6989939e8,1,0,a92acf0e-9132-4456-9a82-1543d98ca453,a92acf0e-9132-4456-9a82-1543d98ca453,1,0,f98bcdb8-6eed-4b4f-b3da-d80b5e8bed44,f98bcdb8-6eed-4b4f-b3da-d80b5e8bed44,1,0,daad5f66-3bb4-4389-bca1-bf528ad993a3,daad5f66-3bb4-4389-bca1-bf528ad993a3,1,0,ad043f15-b2c9-4a05-82b9-6428708584b2,ad043f15-b2c9-4a05-82b9-6428708584b2,1,0,d2fd8650-d13a-411d-8206-61b16016bd82,d2fd8650-d13a-411d-8206-61b16016bd82,1,0,643f4f37-fa02-4976-8701-7a5a44b0109a,643f4f37-fa02-4976-8701-7a5a44b0109a,1,0,278a0559-07b2-4ee3-a821-c0395f9a33c1,278a0559-07b2-4ee3-a821-c0395f9a33c1,1,0,7604b15a-8c5e-4515-84b9-c1d36f9efd0a,7604b15a-8c5e-4515-84b9-c1d36f9efd0a,1,0,54d9f5bb-599c-4d4b-b616-1445e7461813,54d9f5bb-599c-4d4b-b616-1445e7461813,1,0,7d0dbd52-8bb0-4d72-87fa-2d7066e5e189,7d0dbd52-8bb0-4d72-87fa-2d7066e5e189,1,0,a2c42946-1cdb-457a-a45b-97781cfb4a15,a2c42946-1cdb-457a-a45b-97781cfb4a15,1,0,a1a44832-6026-47ae-affd-5b6d52e84307,a1a44832-6026-47ae-affd-5b6d52e84307,1,0,63ad43fe-a050-47f7-af4f-099aa10255af,63ad43fe-a050-47f7-af4f-099aa10255af,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,223e4ccf-5638-4576-bd88-7c54be68de47,223e4ccf-5638-4576-bd88-7c54be68de47,1,0,e3bae40b-5316-4392-8c82-b601922a6582,e3bae40b-5316-4392-8c82-b601922a6582,1,0,26806602-54be-4b2f-96ae-3e2a31616a4e,26806602-54be-4b2f-96ae-3e2a31616a4e,1,0,738fc48f-5160-4786-84bb-053c188662ce,738fc48f-5160-4786-84bb-053c188662ce,1,0,6e883b67-f74c-4791-8fb3-446534e3a6db,6e883b67-f74c-4791-8fb3-446534e3a6db,1,0,24fed307-445d-44b5-8964-9d08d1003061,24fed307-445d-44b5-8964-9d08d1003061,1,0,8e4c2dbe-15b7-4e04-9f07-892d70741a97,8e4c2dbe-15b7-4e04-9f07-892d70741a97,1,0,67691860-e374-451f-aee3-05a35df2a477,67691860-e374-451f-aee3-05a35df2a477,1,0,dbed7302-370e-4e0f-b505-3a86fe4c4ebd,dbed7302-370e-4e0f-b505-3a86fe4c4ebd,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,67e8b7dc-e0d7-44a9-81d0-6b31bb318145,67e8b7dc-e0d7-44a9-81d0-6b31bb318145,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,80641554-046e-4c4a-8544-a35b4c554dad,80641554-046e-4c4a-8544-a35b4c554dad,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,9f81693c-4ddd-47ec-b111-d073e1510752,9f81693c-4ddd-47ec-b111-d073e1510752,1,0,8a2811be-64c5-44ba-a52c-482c125eb092,8a2811be-64c5-44ba-a52c-482c125eb092,1,0,149104f3-a4c7-47e5-8057-b5bcc754a4f2,149104f3-a4c7-47e5-8057-b5bcc754a4f2,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,e1132cbb-7045-47e2-bbc7-6e92e4dff131,e1132cbb-7045-47e2-bbc7-6e92e4dff131,1,0,62a71ba7-3226-4d10-8cc9-ac9908a00ae7,62a71ba7-3226-4d10-8cc9-ac9908a00ae7,1,0,f5ad6743-b19b-44c4-b3d1-2e39d74a4abd,f5ad6743-b19b-44c4-b3d1-2e39d74a4abd,1,0,85d7ea13-c521-44b8-9dce-5e57529a21db,85d7ea13-c521-44b8-9dce-5e57529a21db,1,0,4b89b7fb-31d9-43c7-9f7e-b0c31fa3331d,4b89b7fb-31d9-43c7-9f7e-b0c31fa3331d,1,0,6ce1d71d-7548-4ee7-be78-21ae23d5a08d,6ce1d71d-7548-4ee7-be78-21ae23d5a08d,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,993d8672-af86-4179-a9ef-228303748bcd,993d8672-af86-4179-a9ef-228303748bcd,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,ae4825b1-dd4e-4d0e-8133-da6d1a441c36,ae4825b1-dd4e-4d0e-8133-da6d1a441c36,1,0,f7e6da22-c2b7-47c9-8062-e612a56ae61c,f7e6da22-c2b7-47c9-8062-e612a56ae61c,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,a805d33c-2cb0-4862-943f-06ded997b940,a805d33c-2cb0-4862-943f-06ded997b940,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,87ed7963-c2e4-4515-b768-47cf72442fd0,87ed7963-c2e4-4515-b768-47cf72442fd0,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,ec966ef2-b291-4937-a164-5c2b461871f8,ec966ef2-b291-4937-a164-5c2b461871f8,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,e9939b36-bceb-40e2-a182-1d5cc248f353,e9939b36-bceb-40e2-a182-1d5cc248f353,1,0,619d3ac6-40fe-485d-a407-fe065f16b186,619d3ac6-40fe-485d-a407-fe065f16b186,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,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,526c688e-a4d4-45f7-8bba-b8ceff38fe27,526c688e-a4d4-45f7-8bba-b8ceff38fe27,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,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,0f0ac56d-b068-46f2-8440-731683c2b42a,0f0ac56d-b068-46f2-8440-731683c2b42a,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,5c17a594-eb0b-4cdf-af35-0eaba968e065,5c17a594-eb0b-4cdf-af35-0eaba968e065,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,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,ecb7dd1b-46d6-46b5-a51f-699f068ad6a0,ecb7dd1b-46d6-46b5-a51f-699f068ad6a0,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,e402b02e-fb2b-4ccc-aa30-ef1a9cb7e17b,e402b02e-fb2b-4ccc-aa30-ef1a9cb7e17b,1,0,10d1e6bf-5ec8-44d8-ae31-0d22bccb5f60,10d1e6bf-5ec8-44d8-ae31-0d22bccb5f60,1,0,7fddef11-7b49-4911-8c66-8d2f94d3cbbd,7fddef11-7b49-4911-8c66-8d2f94d3cbbd,1,0,be438a36-2036-4f27-a9a3-37fb5ba5d6ab,be438a36-2036-4f27-a9a3-37fb5ba5d6ab,1,0,fabf9c9e-d35c-42e0-a949-6c54cb24990f,fabf9c9e-d35c-42e0-a949-6c54cb24990f,1,0,e47df890-3925-4410-ae48-63cb8e3d94f8,e47df890-3925-4410-ae48-63cb8e3d94f8,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,b369842d-c20e-4b68-9d0e-701707584b2f,b369842d-c20e-4b68-9d0e-701707584b2f,1,0,de23a2ca-4607-4488-be7b-23ea28875d02,de23a2ca-4607-4488-be7b-23ea28875d02,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,316553f3-bed7-4517-86ed-6520c1e536d9,316553f3-bed7-4517-86ed-6520c1e536d9,1,0,1255dbc8-29fc-4cd1-a2ed-a97c626dea5c,1255dbc8-29fc-4cd1-a2ed-a97c626dea5c,1,0,ee538127-bfa3-487a-9595-e69968595113,ee538127-bfa3-487a-9595-e69968595113,1,0,6b297ab7-7ff9-45a7-9075-ca3a1878cb2b,6b297ab7-7ff9-45a7-9075-ca3a1878cb2b,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,e79dd738-4e6c-411a-97a2-d0acbe4918ee,e79dd738-4e6c-411a-97a2-d0acbe4918ee,1,0,571a910a-67c7-4fe9-b06e-78893498a606,571a910a-67c7-4fe9-b06e-78893498a606,1,0,86f98256-87d1-4922-8d70-a5d2cad1c385,86f98256-87d1-4922-8d70-a5d2cad1c385,1,0,05faa67b-195a-4f46-8e47-30c4208cbc64,05faa67b-195a-4f46-8e47-30c4208cbc64,1,0,be75d0b2-c9db-4dab-9e32-dbe26d667508,be75d0b2-c9db-4dab-9e32-dbe26d667508,1,0,299c014f-996a-4a99-a5be-a7cfd5ee45e4,299c014f-996a-4a99-a5be-a7cfd5ee45e4,1,0,2569b69d-006f-478e-83b7-9163048b34bb,2569b69d-006f-478e-83b7-9163048b34bb,1,0,1ee47933-8117-4d47-9245-476c0ed3a373,1ee47933-8117-4d47-9245-476c0ed3a373,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,24b4dd9e-825f-471b-b15d-ae21a508d183,24b4dd9e-825f-471b-b15d-ae21a508d183,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,de355360-f87a-4b0d-a37c-d0a091e7e984,de355360-f87a-4b0d-a37c-d0a091e7e984,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,da031ebd-4aba-40e6-acb9-245cf73c4423,da031ebd-4aba-40e6-acb9-245cf73c4423,1,0,59d47246-e522-4baa-96b3-d7e93279e3ec,59d47246-e522-4baa-96b3-d7e93279e3ec,1,0,c222b2c0-5e92-4022-b2f7-49967b5a9de3,c222b2c0-5e92-4022-b2f7-49967b5a9de3,1,0,e9bf314a-a4d1-4fb8-a84c-84ac7df6c456,e9bf314a-a4d1-4fb8-a84c-84ac7df6c456,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,1422999b-9977-4bed-9990-b46bd0ec7471,1422999b-9977-4bed-9990-b46bd0ec7471,1,0,4c48db2f-2b79-4c6f-b8ee-002810c6190c,4c48db2f-2b79-4c6f-b8ee-002810c6190c,1,0,d0d90cbf-21fc-47cb-8e1c-549e67a1bf0c,d0d90cbf-21fc-47cb-8e1c-549e67a1bf0c,1,0,cf48ae02-ecb0-4db9-92da-585f89cddb70,cf48ae02-ecb0-4db9-92da-585f89cddb70,1,0,5650c5c7-3f43-4ec9-8b64-003c5467d06a,5650c5c7-3f43-4ec9-8b64-003c5467d06a,1,0,5bac3798-1193-4d74-bbdd-40aba11d742c,5bac3798-1193-4d74-bbdd-40aba11d742c,1,0,514f3514-ba90-493e-b0dd-2d02c6ba4d1d,514f3514-ba90-493e-b0dd-2d02c6ba4d1d,1,0,032de836-80a8-46ce-9e40-b3b6ac5f9e1e,032de836-80a8-46ce-9e40-b3b6ac5f9e1e,1,0,962c2c55-6a16-46f6-9ce0-67d1984b530e,962c2c55-6a16-46f6-9ce0-67d1984b530e,1,0,27e906c2-ea0e-489e-b869-547c48c29518,27e906c2-ea0e-489e-b869-547c48c29518,1,0,553ebd03-267b-4ced-805e-be7eca6db18f,553ebd03-267b-4ced-805e-be7eca6db18f,1,0,8bf95fa7-1067-45b3-82ea-286192f97e06,8bf95fa7-1067-45b3-82ea-286192f97e06,1,0,73996d67-4d70-4ce5-a58a-d70f44484f1e,73996d67-4d70-4ce5-a58a-d70f44484f1e,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,9b0e9fec-8261-4e20-9556-754a46d11c12,9b0e9fec-8261-4e20-9556-754a46d11c12,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,764bf84f-3aa5-4023-a15a-b546f8837141,764bf84f-3aa5-4023-a15a-b546f8837141,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,bf40c9ed-b7db-4200-9646-c4e751fc2014,bf40c9ed-b7db-4200-9646-c4e751fc2014,1,0,2bf9c338-d31e-467e-8281-d1d6a3a6b2e2,2bf9c338-d31e-467e-8281-d1d6a3a6b2e2,1,0,3c2c192e-4869-4cc6-ba47-1fadac5b9678,3c2c192e-4869-4cc6-ba47-1fadac5b9678,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,e99606f3-cf75-44b2-ad50-c88a8c3d189c,e99606f3-cf75-44b2-ad50-c88a8c3d189c,1,0,b4fa35f9-cb7e-46a8-b32b-801d212c8fcf,b4fa35f9-cb7e-46a8-b32b-801d212c8fcf,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,2eeea138-481c-4fde-9e8a-709d751cc469,2eeea138-481c-4fde-9e8a-709d751cc469,1,0,70a3df8f-c12a-4185-81c4-39a5114ef7a9,70a3df8f-c12a-4185-81c4-39a5114ef7a9,1,0,bd362ff9-3dec-4a4b-9595-8609de76e842,bd362ff9-3dec-4a4b-9595-8609de76e842,1,0,76cc9ae1-7ac2-4b99-8def-f21dc55ad07d,76cc9ae1-7ac2-4b99-8def-f21dc55ad07d,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,54766e6b-cf49-4c58-b5e5-dcb6362ac5e2,54766e6b-cf49-4c58-b5e5-dcb6362ac5e2,1,0,f2210cf1-f9f5-41ed-8b4d-937778da842b,f2210cf1-f9f5-41ed-8b4d-937778da842b,1,0,07e81872-afac-4720-86b4-91e7bf4a2881,07e81872-afac-4720-86b4-91e7bf4a2881,1,0,d4b49ed0-3d3f-4b68-bc1e-949e8e338e9a,d4b49ed0-3d3f-4b68-bc1e-949e8e338e9a,1,0,542a53f5-56c5-4ca9-90d1-d689532c69fd,542a53f5-56c5-4ca9-90d1-d689532c69fd,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,1aa6b483-0f87-4ed3-94ea-8b81813532d6,1aa6b483-0f87-4ed3-94ea-8b81813532d6,1,0,0f79d87e-3311-4281-8f46-6154e708b930,0f79d87e-3311-4281-8f46-6154e708b930,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,748f7ddb-4cdc-46e5-9108-f7a550b33537,748f7ddb-4cdc-46e5-9108-f7a550b33537,1,0,0534460b-0548-45f0-ac79-aa4bc109655c,0534460b-0548-45f0-ac79-aa4bc109655c,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,4ae40e81-f2ab-4ac4-89e5-73545db42de9,4ae40e81-f2ab-4ac4-89e5-73545db42de9,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,8850b346-364d-457b-9554-acce031394fe,8850b346-364d-457b-9554-acce031394fe,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,a55e9aef-79ad-4cb6-b80a-c7f769bebbea,a55e9aef-79ad-4cb6-b80a-c7f769bebbea,1,0,c26283d2-dda1-438c-a444-05bdd2797691,c26283d2-dda1-438c-a444-05bdd2797691,1,0,3ae1ecf1-e062-4e89-96d6-9ac88bbc8aa8,3ae1ecf1-e062-4e89-96d6-9ac88bbc8aa8,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,bc3183cb-8691-4fa5-b154-3645f3cd8944,bc3183cb-8691-4fa5-b154-3645f3cd8944,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,018390b5-06d9-4d04-abad-1de1ccf0843c,018390b5-06d9-4d04-abad-1de1ccf0843c,1,0,a8b828da-6172-4732-a01e-c5127175cd60,a8b828da-6172-4732-a01e-c5127175cd60,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,9ac5a405-4eb7-4013-8bbd-5d1b6d0929ab,9ac5a405-4eb7-4013-8bbd-5d1b6d0929ab,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,75daf728-ee8c-41a4-a249-8db123bb802e,75daf728-ee8c-41a4-a249-8db123bb802e,1,0,0b154103-47b5-4c54-a4ea-60aa41190940,0b154103-47b5-4c54-a4ea-60aa41190940,1,0,1eb52621-8915-46f4-b1bb-db04bb58b065,1eb52621-8915-46f4-b1bb-db04bb58b065,1,0,d0fcb0f9-6d6c-444a-8b32-4287a963f72b,d0fcb0f9-6d6c-444a-8b32-4287a963f72b,1,0,1d583292-1820-498a-890a-66f5b154e698,1d583292-1820-498a-890a-66f5b154e698,1,0,a3b0430c-743d-4351-a928-9be3c8db9a0b,a3b0430c-743d-4351-a928-9be3c8db9a0b,1,0,f094241b-ae82-426c-92b0-18be87566ad6,f094241b-ae82-426c-92b0-18be87566ad6,1,0,1a570b62-6644-4427-a432-c6823c7d522a,1a570b62-6644-4427-a432-c6823c7d522a,1,0,7bae5ebc-85a5-43eb-8dfa-bc75cd54c013,7bae5ebc-85a5-43eb-8dfa-bc75cd54c013,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,24ce9257-6dcf-4ba6-839e-1e635c069e75,24ce9257-6dcf-4ba6-839e-1e635c069e75,1,0,ecb2048d-4c1d-4194-a728-604734683b3b,ecb2048d-4c1d-4194-a728-604734683b3b,1,0,b33e046c-b580-4c90-940d-71f38d9ceff2,b33e046c-b580-4c90-940d-71f38d9ceff2,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,35fe84b6-7d3c-4729-a75c-a5f3ef122124,35fe84b6-7d3c-4729-a75c-a5f3ef122124,1,0,f7d5815e-511e-48c2-bc31-f9987423439b,f7d5815e-511e-48c2-bc31-f9987423439b,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,8b0fb329-098b-46db-8766-bc034d6f20a8,8b0fb329-098b-46db-8766-bc034d6f20a8,1,0,c630e43c-98a6-4059-9b14-25d267410ba6,c630e43c-98a6-4059-9b14-25d267410ba6,1,0,d01089f3-427f-4624-955d-1a5a96098141,d01089f3-427f-4624-955d-1a5a96098141,1,0,6520d7f5-7326-4921-b8c1-6e6fbc56089c,6520d7f5-7326-4921-b8c1-6e6fbc56089c,1,0,766f2abe-1dfd-4e16-bffd-83f44d25d82a,766f2abe-1dfd-4e16-bffd-83f44d25d82a,1,0,0e7a34a8-ce5a-4767-8283-fd094e13d969,0e7a34a8-ce5a-4767-8283-fd094e13d969,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,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,886df9ab-09b4-4c7a-bd44-6afeab68d831,886df9ab-09b4-4c7a-bd44-6afeab68d831,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,55412118-700a-4a2d-b7c9-d3b7c0f4bd9a,55412118-700a-4a2d-b7c9-d3b7c0f4bd9a,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,c99c7271-cb3c-4fd2-8789-8637cf984514,c99c7271-cb3c-4fd2-8789-8637cf984514,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,9c57c3d0-aaa1-4c87-a81c-36ac4dd48eaa,9c57c3d0-aaa1-4c87-a81c-36ac4dd48eaa,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,ab4dbaff-cee6-47b3-9d69-13ac5c906f95,ab4dbaff-cee6-47b3-9d69-13ac5c906f95,1,0,82d5ed02-654f-4b86-b995-baf64a147a12,82d5ed02-654f-4b86-b995-baf64a147a12,1,0,ba96177b-d10c-4ad2-9851-dea312eeafd2,ba96177b-d10c-4ad2-9851-dea312eeafd2,1,0,7652c0d3-1b6e-4e0d-96d0-7bbdff808ce9,7652c0d3-1b6e-4e0d-96d0-7bbdff808ce9,1,0,caa287fe-4f60-4243-a6fe-8b2bd607205f,caa287fe-4f60-4243-a6fe-8b2bd607205f,1,0,ba6e2356-8b0e-4af6-9941-3b808e17c570,ba6e2356-8b0e-4af6-9941-3b808e17c570,1,0,f2f90525-566b-4add-ae3e-cc683dee6209,f2f90525-566b-4add-ae3e-cc683dee6209,1,0,59561ccb-5412-4f8a-8961-3d43639e4742,59561ccb-5412-4f8a-8961-3d43639e4742,1,0,8ce1e84a-9e69-4a75-9c3e-481ba3b5eaae,8ce1e84a-9e69-4a75-9c3e-481ba3b5eaae,1,0,0ec665f2-bbde-4e41-8cd0-2578253ecdf3,0ec665f2-bbde-4e41-8cd0-2578253ecdf3,1,0,e82ab008-d6b9-4f02-b4a5-0c0c57b06988,e82ab008-d6b9-4f02-b4a5-0c0c57b06988,1,0,50d2d02d-b812-4c2b-964a-4c2ded54284f,50d2d02d-b812-4c2b-964a-4c2ded54284f,1,0,5503d2c4-0b5e-4ba1-a26d-2f63628b25c8,5503d2c4-0b5e-4ba1-a26d-2f63628b25c8,1,0,53f519d2-0ee6-4314-a986-2f456722f2ae,53f519d2-0ee6-4314-a986-2f456722f2ae,1,0,c94a168f-e10f-4b09-8a82-7e53c056a643,c94a168f-e10f-4b09-8a82-7e53c056a643,1,0,35f56bf0-bb91-4ff4-ade4-fa06296e68a2,35f56bf0-bb91-4ff4-ade4-fa06296e68a2,1,0,a22ba49d-7a11-4dc7-8b0e-874da6f0874d,a22ba49d-7a11-4dc7-8b0e-874da6f0874d,1,0,888e5183-a152-435f-b105-6b924e0d4f4f,888e5183-a152-435f-b105-6b924e0d4f4f,1,0,f69a29cd-035f-4d16-8bec-150f563691b9,f69a29cd-035f-4d16-8bec-150f563691b9,1,0,6d4e26f4-4cc4-4445-ad7b-547cd0afc750,6d4e26f4-4cc4-4445-ad7b-547cd0afc750,1,0,5736ef36-69eb-4406-a98e-1e4b4227a10d,5736ef36-69eb-4406-a98e-1e4b4227a10d,1,0,0ab0a57c-24c6-4ba8-9be1-5773fd82367e,0ab0a57c-24c6-4ba8-9be1-5773fd82367e,1,0,9964f9e3-613c-479f-8557-742e409da4ab,9964f9e3-613c-479f-8557-742e409da4ab,1,0,ea6d3ce8-cbac-438a-92f1-b246d558fecd,ea6d3ce8-cbac-438a-92f1-b246d558fecd,1,0,84a655d4-49fb-44bb-bdc5-59776046e66b,84a655d4-49fb-44bb-bdc5-59776046e66b,1,0,8d5d9ad3-31a7-4877-b053-64edb7332af4,8d5d9ad3-31a7-4877-b053-64edb7332af4,1,0,3dbcdc42-8583-49e4-9c57-a1b06071be66,3dbcdc42-8583-49e4-9c57-a1b06071be66,1,0,79529e32-4c86-41e3-84ec-17f72b022855,79529e32-4c86-41e3-84ec-17f72b022855,1,0,6ef107de-6385-4448-9ef8-82110452a2b6,6ef107de-6385-4448-9ef8-82110452a2b6,1,0,3ce07fcb-f1a4-41db-891a-547311567ce0,3ce07fcb-f1a4-41db-891a-547311567ce0,1,0,3bcc76a7-f28a-4d28-a95e-af7ac1138993,3bcc76a7-f28a-4d28-a95e-af7ac1138993,1,0,50b4bf05-7810-4068-8be9-0be410d9b9db,50b4bf05-7810-4068-8be9-0be410d9b9db,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,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,977748b7-13d3-41ef-8206-82595ed8fc0c,977748b7-13d3-41ef-8206-82595ed8fc0c,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,90a7425e-3fc9-41ec-9373-f410936e1b53,90a7425e-3fc9-41ec-9373-f410936e1b53,1,0,509cdfc8-fad3-4628-869c-6c03d9519d69,509cdfc8-fad3-4628-869c-6c03d9519d69,1,0,c69f8196-5d7e-4ca9-a84e-c85d9ecf8777,c69f8196-5d7e-4ca9-a84e-c85d9ecf8777,1,0,663cf316-3077-4fac-b821-94bd5cdde65c,663cf316-3077-4fac-b821-94bd5cdde65c,1,0,4b37d2c0-4181-4c47-951c-987017972bf7,4b37d2c0-4181-4c47-951c-987017972bf7,1,0,8ae35de6-c7f0-4839-bc27-cc8619e30a43,8ae35de6-c7f0-4839-bc27-cc8619e30a43,1,0,9ef01e37-030a-44b7-824b-110e0f5a88f3,9ef01e37-030a-44b7-824b-110e0f5a88f3,1,0,98bf409f-de8d-4306-b290-716b006e6fd8,98bf409f-de8d-4306-b290-716b006e6fd8,1,0,c15f648b-3aed-4734-bcd2-524e2d3336c0,c15f648b-3aed-4734-bcd2-524e2d3336c0,1,0,600ac5b6-d3ac-4262-820d-5a989fa7f44d,600ac5b6-d3ac-4262-820d-5a989fa7f44d,1,0,3c671c62-5614-4c1b-a823-ac4922c9daf7,3c671c62-5614-4c1b-a823-ac4922c9daf7,1,0,c347e3a2-d6d9-46a0-971f-ec56a45dcbe8,c347e3a2-d6d9-46a0-971f-ec56a45dcbe8,1,0,455c94b6-6b10-405f-a198-f680c7ad5ffe,455c94b6-6b10-405f-a198-f680c7ad5ffe,1,0,d16a63b9-2b84-447e-9c32-1d8f7c4c5a11,d16a63b9-2b84-447e-9c32-1d8f7c4c5a11,1,0,48cc3006-9f06-4be1-aec4-5c04308200d5,48cc3006-9f06-4be1-aec4-5c04308200d5,1,0,bae8ba70-a19e-41fa-b11c-6513453bd3ac,bae8ba70-a19e-41fa-b11c-6513453bd3ac,1,0,f4a9a13e-91b0-4440-8662-25acf099220e,f4a9a13e-91b0-4440-8662-25acf099220e,1,0,ff87a40b-07da-4951-b469-a75d418e88b3,ff87a40b-07da-4951-b469-a75d418e88b3,1,0,708b4656-7d14-491f-95b5-8fe3f0d6d44b,708b4656-7d14-491f-95b5-8fe3f0d6d44b,1,0,331db59d-ef90-4255-89c2-d7fdd6bc5c4c,331db59d-ef90-4255-89c2-d7fdd6bc5c4c,1,0,e520fbbb-3521-4707-bbe7-c8ead04fb2dc,e520fbbb-3521-4707-bbe7-c8ead04fb2dc,1,0,a87faa63-4e1c-440c-b852-0e4e1485a047,a87faa63-4e1c-440c-b852-0e4e1485a047,1,0,36244ad9-5b3a-431e-9dbf-b05ee9da1188,36244ad9-5b3a-431e-9dbf-b05ee9da1188,1,0,6cf7fd67-e426-4fe3-a49d-fbcfae5fb52d,6cf7fd67-e426-4fe3-a49d-fbcfae5fb52d,1,0,92c4d60b-22df-4fef-a5b9-a97bc63b4858,92c4d60b-22df-4fef-a5b9-a97bc63b4858,1,0,8264b98b-7eec-4651-96fc-02620c87f274,8264b98b-7eec-4651-96fc-02620c87f274,1,0,bcd6e5f0-a800-4f21-ad75-24c428157cee,bcd6e5f0-a800-4f21-ad75-24c428157cee,1,0,9f351f0a-2d43-4215-8d74-040911230683,9f351f0a-2d43-4215-8d74-040911230683,1,0,6a9c1bd4-b550-4911-a8d1-321a7713a5a5,6a9c1bd4-b550-4911-a8d1-321a7713a5a5,1,0,019fa716-e91a-4116-abcf-c87349c153a4,019fa716-e91a-4116-abcf-c87349c153a4,1,0,f9fed640-0121-4c36-a822-0db7a9155adc,f9fed640-0121-4c36-a822-0db7a9155adc,1,0,e418d7c4-7322-41b1-a8df-d86a11f7711c,e418d7c4-7322-41b1-a8df-d86a11f7711c,1,0,3fcdfe26-1668-4aa7-bb10-ef8d8bd0ae39,3fcdfe26-1668-4aa7-bb10-ef8d8bd0ae39,1,0,a0ebcc8a-267b-4f95-a986-46db8fb5df4d,a0ebcc8a-267b-4f95-a986-46db8fb5df4d,1,0,9c890915-1ae3-457e-8a3d-7b39f181304b,9c890915-1ae3-457e-8a3d-7b39f181304b,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,2197147c-f67c-4e92-9e69-2c9900144e82,2197147c-f67c-4e92-9e69-2c9900144e82,1,0,7692e2fd-9ab5-45ee-9a4c-380107769ef7,7692e2fd-9ab5-45ee-9a4c-380107769ef7,1,0,6586260a-3abd-4283-b710-bc2ae3b965d8,6586260a-3abd-4283-b710-bc2ae3b965d8,1,0,2af20999-4b9a-44c7-9edf-40446e083796,2af20999-4b9a-44c7-9edf-40446e083796,1,0,100acfa0-d5f3-4a20-8a05-9d9d00aff2c9,100acfa0-d5f3-4a20-8a05-9d9d00aff2c9,1,0,ccdaa099-3739-4731-b028-3cb4e75834a5,ccdaa099-3739-4731-b028-3cb4e75834a5,1,0,ee07ebbe-b34d-4c42-a4b4-d5e14ef4c103,ee07ebbe-b34d-4c42-a4b4-d5e14ef4c103,1,0,1d44bf7e-3dc9-4ca4-86c8-bdabdb5650b8,1d44bf7e-3dc9-4ca4-86c8-bdabdb5650b8,1,0,d4757882-e0bd-4f54-962b-32d49c90fb60,d4757882-e0bd-4f54-962b-32d49c90fb60,1,0,6e650778-3ddd-44ca-bd7f-ffa5e8f4cce4,6e650778-3ddd-44ca-bd7f-ffa5e8f4cce4,1,0,ec81b967-a4a1-48ac-beda-cdc00f1222a0,ec81b967-a4a1-48ac-beda-cdc00f1222a0,1,0,0040f7b0-3499-41bd-94bf-d63679d9d9c1,0040f7b0-3499-41bd-94bf-d63679d9d9c1,1,0,e5c31a93-cda7-4972-a13b-8cb864cc40ed,e5c31a93-cda7-4972-a13b-8cb864cc40ed,1,0,e2a5f14f-9b64-4d1c-9c66-332ea0157cc2,e2a5f14f-9b64-4d1c-9c66-332ea0157cc2,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,15cd04c9-c12a-44ea-a397-d2adbac99c5b,15cd04c9-c12a-44ea-a397-d2adbac99c5b,1,0,182f92f5-0a8e-4f6a-9f9e-7878fafd0a2a,182f92f5-0a8e-4f6a-9f9e-7878fafd0a2a,1,0,45ca26ef-2a9f-4f24-a81b-2fe10c02ed9f,45ca26ef-2a9f-4f24-a81b-2fe10c02ed9f,1,0,56aa4b2f-5b7e-457d-a59d-837405f17fde,56aa4b2f-5b7e-457d-a59d-837405f17fde,1,0,819e2442-cb5a-4826-8a66-b34a3270e8e0,819e2442-cb5a-4826-8a66-b34a3270e8e0,1,0,49987536-3ab9-4a68-83a2-5dc3cd5d58fb,49987536-3ab9-4a68-83a2-5dc3cd5d58fb,1,0,8e4eec45-6ad3-4ac8-940a-b3130f504685,8e4eec45-6ad3-4ac8-940a-b3130f504685,1,0,ccdfef4b-a022-4bde-9c6c-84129b2bad65,ccdfef4b-a022-4bde-9c6c-84129b2bad65,1,0,95adcac2-bc88-46bc-aae5-d13cfb9a170c,95adcac2-bc88-46bc-aae5-d13cfb9a170c,1,0,d845ca4c-3af2-4322-8565-64f3aee61e3a,d845ca4c-3af2-4322-8565-64f3aee61e3a,1,0,430cf66c-5cfc-4fd4-bbf3-d9df6070e115,430cf66c-5cfc-4fd4-bbf3-d9df6070e115,1,0,6321fc1e-c1d7-4b49-b730-258857b2d936,6321fc1e-c1d7-4b49-b730-258857b2d936,1,0,f48abfe8-e400-4544-a80a-d1cb0b7d3ea8,f48abfe8-e400-4544-a80a-d1cb0b7d3ea8,1,0,ce40016b-7ca7-4803-81fa-5df0b92dbc54,ce40016b-7ca7-4803-81fa-5df0b92dbc54,1,0,b58b711b-8e9a-44a0-b62d-6b6362177a4b,b58b711b-8e9a-44a0-b62d-6b6362177a4b,1,0,f7c0af11-1b64-4504-a8db-0fd09c2ce20f,f7c0af11-1b64-4504-a8db-0fd09c2ce20f,1,0,b3c7cd75-fb40-4121-a727-d557fe66a5e0,b3c7cd75-fb40-4121-a727-d557fe66a5e0,1,0,38be384a-3abb-4f4d-b8b7-164c2c8d8b28,38be384a-3abb-4f4d-b8b7-164c2c8d8b28,1,0,8c697e44-1a1d-4c4a-b141-5254cfb229a5,8c697e44-1a1d-4c4a-b141-5254cfb229a5,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,22d7df25-5885-4ad6-bb29-28257256da22,22d7df25-5885-4ad6-bb29-28257256da22,1,0,3bb85423-6ce7-416f-884a-89c75deed890,3bb85423-6ce7-416f-884a-89c75deed890,1,0,132c8921-189a-4c00-a8a4-417728520203,132c8921-189a-4c00-a8a4-417728520203,1,0,18535b06-82f0-4179-af3c-975a5ba85872,18535b06-82f0-4179-af3c-975a5ba85872,1,0,1d0981b4-cf7c-4094-a597-d709a8573d71,1d0981b4-cf7c-4094-a597-d709a8573d71,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,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,a26d8489-88a8-438e-bb58-c7b5a742a243,a26d8489-88a8-438e-bb58-c7b5a742a243,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,9728fd22-163c-443d-a89f-79d15c51c086,9728fd22-163c-443d-a89f-79d15c51c086,1,0,7030a503-e97c-4cb8-b6cd-79dbd08fd2cc,7030a503-e97c-4cb8-b6cd-79dbd08fd2cc,1,0,0a7c25db-dba6-44d3-b994-d672c4f33f1f,0a7c25db-dba6-44d3-b994-d672c4f33f1f,1,0,618b565c-f80f-4e58-94f1-227d4bdc8fe7,618b565c-f80f-4e58-94f1-227d4bdc8fe7,1,0,e36ed6bf-7bb2-419f-b3d4-fe6f7e75188d,e36ed6bf-7bb2-419f-b3d4-fe6f7e75188d,1,0,018bd653-a526-4e2c-8483-1192ae997458,018bd653-a526-4e2c-8483-1192ae997458,1,0,788a38ca-6ef8-4a05-a0c7-032766b135d9,788a38ca-6ef8-4a05-a0c7-032766b135d9,1,0,82e0e020-d6a7-45ae-bdbd-d29aacff313a,82e0e020-d6a7-45ae-bdbd-d29aacff313a,1,0,31ac5bc1-3642-456b-aaed-d604669556f6,31ac5bc1-3642-456b-aaed-d604669556f6,1,0,3157f1b3-5d78-4fe4-89bf-afca0026a8d5,3157f1b3-5d78-4fe4-89bf-afca0026a8d5,1,0,317e6068-5c8e-4455-932c-f5ae09e398c3,317e6068-5c8e-4455-932c-f5ae09e398c3,1,0,8424768a-3673-4e7c-840f-836515f85ba9,8424768a-3673-4e7c-840f-836515f85ba9,1,0,37ba6039-9162-4c7e-9975-de3aec39664f,37ba6039-9162-4c7e-9975-de3aec39664f,1,0,1ed0209f-4e11-452b-8520-66bf02186f1a,1ed0209f-4e11-452b-8520-66bf02186f1a,1,0,d1e25f7f-f2c5-48bf-a7f4-4cd40d992e53,d1e25f7f-f2c5-48bf-a7f4-4cd40d992e53,1,0,4d7f4a37-8426-4f06-9b64-cae252cb8e9e,4d7f4a37-8426-4f06-9b64-cae252cb8e9e,1,0,ae5b5521-a525-402d-99b0-e83a7b2caaa4,ae5b5521-a525-402d-99b0-e83a7b2caaa4,1,0,3858dbf0-cb6b-4c67-9dd9-eb900c3688f4,3858dbf0-cb6b-4c67-9dd9-eb900c3688f4,1,0,a04a50db-cb4a-496e-8c25-5591d863a7d5,a04a50db-cb4a-496e-8c25-5591d863a7d5,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,851118bb-7e22-4c3c-a050-51b89216df86,851118bb-7e22-4c3c-a050-51b89216df86,1,0,4575003b-10c6-4d8e-bc5e-c643f38b24d9,4575003b-10c6-4d8e-bc5e-c643f38b24d9,1,0,b3fd4c7b-b7ae-40b9-bbe0-42fae0bc6bf5,b3fd4c7b-b7ae-40b9-bbe0-42fae0bc6bf5,1,0,e68e3408-ae45-4d3f-8cbf-e1f517cd4dec,e68e3408-ae45-4d3f-8cbf-e1f517cd4dec,1,0,6252386c-865f-41cc-aef4-1d8bf7087798,6252386c-865f-41cc-aef4-1d8bf7087798,1,0,9d256a1d-5a06-4716-9d83-c5877a5ffc14,9d256a1d-5a06-4716-9d83-c5877a5ffc14,1,0,63623218-8035-4ad9-b4db-a1f917c5641a,63623218-8035-4ad9-b4db-a1f917c5641a,1,0,d58babbe-6f59-4027-86db-54343d11e1c8,d58babbe-6f59-4027-86db-54343d11e1c8,1,0,a4cc0476-99a7-4b61-a382-2a6bb8d2043e,a4cc0476-99a7-4b61-a382-2a6bb8d2043e,1,0,8dbca9a8-97c0-4c95-b0a6-1c3f54e6fbab,8dbca9a8-97c0-4c95-b0a6-1c3f54e6fbab,1,0,4d23fa01-b9ef-419c-8806-e0b0fad14be0,4d23fa01-b9ef-419c-8806-e0b0fad14be0,1,0,3eb4e1a4-8653-410f-ae73-b25c03348880,3eb4e1a4-8653-410f-ae73-b25c03348880,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,88fafb0d-d624-4b91-8c68-c354817ccddb,88fafb0d-d624-4b91-8c68-c354817ccddb,1,0,f4a3e032-61fb-4004-bd4d-6eaffb53437b,f4a3e032-61fb-4004-bd4d-6eaffb53437b,1,0,9126b840-ddcc-4054-aa16-4156288a379e,9126b840-ddcc-4054-aa16-4156288a379e,1,0,a6facfdb-7529-479c-9bb3-e63316b032f4,a6facfdb-7529-479c-9bb3-e63316b032f4,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,db5fde74-275f-4d82-825c-5c245a7fef6b,db5fde74-275f-4d82-825c-5c245a7fef6b,1,0,e4e534e9-7ccc-4ced-b961-613989a6194b,e4e534e9-7ccc-4ced-b961-613989a6194b,1,0,cc925b83-839b-48da-8f62-7f8cde76ac2a,cc925b83-839b-48da-8f62-7f8cde76ac2a,1,0,7d06f855-8a6a-45e0-a1c2-fd5f03d2a8ed,7d06f855-8a6a-45e0-a1c2-fd5f03d2a8ed,1,0,a156434c-a1f0-401e-90b4-c0adae8800e3,a156434c-a1f0-401e-90b4-c0adae8800e3,1,0,f9681a4d-d47c-4a8d-a8a3-4aafc751e61b,f9681a4d-d47c-4a8d-a8a3-4aafc751e61b,1,0,e6e76d04-8adc-4462-8919-0979258e5a7b,e6e76d04-8adc-4462-8919-0979258e5a7b,1,0,6ee85be2-55f6-4d4b-abf1-0d1d25f61ea3,6ee85be2-55f6-4d4b-abf1-0d1d25f61ea3,1,0,f850e1d5-5108-4ca8-b397-983627e4871b,f850e1d5-5108-4ca8-b397-983627e4871b,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,e59e9cfc-43b2-4bdf-a512-b6f87f781cee,e59e9cfc-43b2-4bdf-a512-b6f87f781cee,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,178342fd-1ba5-422d-89d2-4f486e45dae9,178342fd-1ba5-422d-89d2-4f486e45dae9,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,6e82e4ec-cf8e-4e9f-aaed-69b146c2ed84,6e82e4ec-cf8e-4e9f-aaed-69b146c2ed84,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,ea232693-49b2-4e10-9349-66e26760602c,ea232693-49b2-4e10-9349-66e26760602c,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,1908b558-9619-477e-ab33-0c731adf2b0e,1908b558-9619-477e-ab33-0c731adf2b0e,1,0,2bed313f-06ac-43a1-a0bd-008c5457deb1,2bed313f-06ac-43a1-a0bd-008c5457deb1,1,0,304feda3-6d33-466c-9e0d-9cea97d763be,304feda3-6d33-466c-9e0d-9cea97d763be,1,0,d6d20d2e-ac18-4bed-aa98-2466871996ac,d6d20d2e-ac18-4bed-aa98-2466871996ac,1,0,53617fbd-4c88-4b13-b3f5-acc78064fdea,53617fbd-4c88-4b13-b3f5-acc78064fdea,1,0,fae5d2ca-4a2d-4ba3-945c-d6545a6b57f1,fae5d2ca-4a2d-4ba3-945c-d6545a6b57f1,1,0,7a043029-1b09-4c11-adfd-9f0588e323e8,7a043029-1b09-4c11-adfd-9f0588e323e8,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,53a2f4b2-e8ea-4347-b4c7-b73f4ea8f9b7,53a2f4b2-e8ea-4347-b4c7-b73f4ea8f9b7,1,0,6b814a99-441e-4a51-997b-1c56bc40b134,6b814a99-441e-4a51-997b-1c56bc40b134,1,0,9388e5d5-3a02-4019-a060-141f8a3bb055,9388e5d5-3a02-4019-a060-141f8a3bb055,1,0,c1b000a1-8094-4a06-805f-b84d4e9c6dc0,c1b000a1-8094-4a06-805f-b84d4e9c6dc0,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,ed1b3c28-99be-49e9-90eb-81e24c8323a5,ed1b3c28-99be-49e9-90eb-81e24c8323a5,1,0,1e20958d-79dc-4c53-b09f-e627c6463fca,1e20958d-79dc-4c53-b09f-e627c6463fca,1,0,0efdbcc2-e5a8-4b00-a72a-2823fb0b2658,0efdbcc2-e5a8-4b00-a72a-2823fb0b2658,1,0,0fa7190d-bafd-4113-a623-9d7d818f70c7,0fa7190d-bafd-4113-a623-9d7d818f70c7,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,1117fce9-6e77-4d1d-aa86-49e7baddfe4b,1117fce9-6e77-4d1d-aa86-49e7baddfe4b,1,0,23f96afc-28e2-470d-9732-220f8867fc23,23f96afc-28e2-470d-9732-220f8867fc23,1,0,aef883c7-c1f5-46ff-a95a-6828d3509069,aef883c7-c1f5-46ff-a95a-6828d3509069,1,0,36b3b988-bf64-4466-9887-93583f59833d,36b3b988-bf64-4466-9887-93583f59833d,1,0,c2997234-864c-408c-94d3-85a2a1820a16,c2997234-864c-408c-94d3-85a2a1820a16,1,0,9d5b351e-5533-4e9f-a23f-d0f7b03d72ca,9d5b351e-5533-4e9f-a23f-d0f7b03d72ca,1,0,d5775cec-e600-4259-82fc-f313cee1cd6f,d5775cec-e600-4259-82fc-f313cee1cd6f,1,0,df918f4e-1a0a-4a7a-997b-f4757185b691,df918f4e-1a0a-4a7a-997b-f4757185b691,1,0,4e305be6-8bbf-4215-aeea-1283aba6d19e,4e305be6-8bbf-4215-aeea-1283aba6d19e,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,5ffc2b03-28c0-45da-ab3e-e4c5d449a898,5ffc2b03-28c0-45da-ab3e-e4c5d449a898,1,0,5c1a1206-0521-44db-8cdd-3e132f2e5a34,5c1a1206-0521-44db-8cdd-3e132f2e5a34,1,0,a630b2d5-2a8e-471e-a7ca-2498e15ace47,a630b2d5-2a8e-471e-a7ca-2498e15ace47,1,0,ba0855a3-8384-4681-a6f0-6373f23cf52d,ba0855a3-8384-4681-a6f0-6373f23cf52d,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,c91f630a-286c-4eb8-b87e-6e6bc7670482,c91f630a-286c-4eb8-b87e-6e6bc7670482,1,0,8ace2dbf-ed9d-46fd-bda7-d884da77e30c,8ace2dbf-ed9d-46fd-bda7-d884da77e30c,1,0,ba59bf05-b815-4679-94ce-601923d60461,ba59bf05-b815-4679-94ce-601923d60461,1,0,65ff172c-3892-4dd2-821b-5d6293805528,65ff172c-3892-4dd2-821b-5d6293805528,1,0,00c47343-9f64-4368-896e-85f1639e4dae,00c47343-9f64-4368-896e-85f1639e4dae,1,0,afc02a73-15bd-4ab1-97bb-5cea6206a44f,afc02a73-15bd-4ab1-97bb-5cea6206a44f,1,0,27a9ef3c-902c-49e3-ab84-ba51185ab111,27a9ef3c-902c-49e3-ab84-ba51185ab111,1,0,20ba43f5-348f-41e4-b365-ff9485a3951d,20ba43f5-348f-41e4-b365-ff9485a3951d,1,0,2f6bc78d-d2ed-491f-bc66-3f95e2ca574c,2f6bc78d-d2ed-491f-bc66-3f95e2ca574c,1,0,bf3e3395-3e41-49c2-b59e-fdcdc3ef956f,bf3e3395-3e41-49c2-b59e-fdcdc3ef956f,1,0,164db402-4516-4d99-80d2-6cb7b6fd7698,164db402-4516-4d99-80d2-6cb7b6fd7698,1,0,93b18f0a-7aa1-42db-809b-1e543cda57de,93b18f0a-7aa1-42db-809b-1e543cda57de,1,0,a8e04267-5a28-40af-8d45-e65375cd8273,a8e04267-5a28-40af-8d45-e65375cd8273,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,b65954b9-39f9-4f7c-8af2-939af0694368,b65954b9-39f9-4f7c-8af2-939af0694368,1,0,3a984dac-c971-42c3-9736-a45c46b55f01,3a984dac-c971-42c3-9736-a45c46b55f01,1,0,edaa4ad4-4dd9-4225-85e8-b0d74d167985,edaa4ad4-4dd9-4225-85e8-b0d74d167985,1,0,c060feda-b1ec-4db3-b16e-d19b36833a2c,c060feda-b1ec-4db3-b16e-d19b36833a2c,1,0,3ff6a150-b687-4e7e-b09d-2aebb8312a61,3ff6a150-b687-4e7e-b09d-2aebb8312a61,1,0,2116217b-1660-499f-953d-f685738b0f30,2116217b-1660-499f-953d-f685738b0f30,1,0,45b46613-13cc-4888-9bb7-53780402206f,45b46613-13cc-4888-9bb7-53780402206f,1,0,5c224274-5495-49bc-b124-e6d649b09d57,5c224274-5495-49bc-b124-e6d649b09d57,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,b6424caf-3db8-4cfe-b92d-7435c23606a5,b6424caf-3db8-4cfe-b92d-7435c23606a5,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,1c2103d3-3feb-4412-98c4-c731f22eef2b,1c2103d3-3feb-4412-98c4-c731f22eef2b,1,0,569bb515-cec2-4da0-80f0-34dae50206e0,569bb515-cec2-4da0-80f0-34dae50206e0,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,336cb96e-8867-4c9d-b74c-b4287ac9212a,336cb96e-8867-4c9d-b74c-b4287ac9212a,1,0,fc7dbc20-7bef-4cbc-9b32-5d86cef5532c,fc7dbc20-7bef-4cbc-9b32-5d86cef5532c,1,0,29f616a6-b914-4ffb-8a86-1ae17089e2f7,29f616a6-b914-4ffb-8a86-1ae17089e2f7,1,0,c50075b0-e8e2-4a6c-92ef-05882aa3cfea,c50075b0-e8e2-4a6c-92ef-05882aa3cfea,1,0,5a1058fc-35f6-43c2-95e5-ae678e19e7d6,5a1058fc-35f6-43c2-95e5-ae678e19e7d6,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,9a68a81b-c6bd-4353-baf4-da8a21f98fb9,9a68a81b-c6bd-4353-baf4-da8a21f98fb9,1,0,8db2b1d8-c415-4846-bd1a-9fec1b105ff0,8db2b1d8-c415-4846-bd1a-9fec1b105ff0,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,41990cad-a43e-46fd-b9bc-e8acc1d6e937,41990cad-a43e-46fd-b9bc-e8acc1d6e937,1,0,3bcce139-d42e-45c2-ace8-28aa34e01a38,3bcce139-d42e-45c2-ace8-28aa34e01a38,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,50754c7d-9c8a-497c-a4c8-76d7400b3412,50754c7d-9c8a-497c-a4c8-76d7400b3412,1,0,193f2d79-83a7-4044-89c6-0b5d7c7cf80a,193f2d79-83a7-4044-89c6-0b5d7c7cf80a,1,0,93070fc1-4204-43b7-b8eb-1bf905f5fa3f,93070fc1-4204-43b7-b8eb-1bf905f5fa3f,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,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,5d81af5c-3133-4e21-9ea4-ffe3d3ca9769,5d81af5c-3133-4e21-9ea4-ffe3d3ca9769,1,0,0f83d532-f675-4aea-802e-d640cc53e4a9,0f83d532-f675-4aea-802e-d640cc53e4a9,1,0,75b0d16b-4acd-4870-8e9d-f2764171e747,75b0d16b-4acd-4870-8e9d-f2764171e747,1,0,8f2cd606-d326-4c92-bfff-e5ec8b5057b5,8f2cd606-d326-4c92-bfff-e5ec8b5057b5,1,0,ed56abb2-66c6-412e-bead-9b23c59bd49a,ed56abb2-66c6-412e-bead-9b23c59bd49a,1,0,47ad737d-c9d3-4d4d-8d4d-b550412062c4,47ad737d-c9d3-4d4d-8d4d-b550412062c4,1,0,204f67e9-204d-47b6-afdd-8e880b7563bc,204f67e9-204d-47b6-afdd-8e880b7563bc,1,0,4da10de3-d999-4acd-bf5a-b1c60cf01b32,4da10de3-d999-4acd-bf5a-b1c60cf01b32,1,0,5e52263e-856f-43da-96ca-d4f06127f604,5e52263e-856f-43da-96ca-d4f06127f604,1,0,ab6f18fe-4ce4-4ecb-945b-bf71ef793549,ab6f18fe-4ce4-4ecb-945b-bf71ef793549,1,0,57904a00-a127-4add-a9fb-639e17c80e33,57904a00-a127-4add-a9fb-639e17c80e33,1,0,2f2f70b7-8f78-4eee-acb7-fe103827e88a,2f2f70b7-8f78-4eee-acb7-fe103827e88a,1,0,f6e8a922-c28b-49b2-ace5-0c812946270d,f6e8a922-c28b-49b2-ace5-0c812946270d,1,0,3d9d472e-a914-4f76-b087-19d4cfe19c19,3d9d472e-a914-4f76-b087-19d4cfe19c19,1,0,81225721-7e65-451d-9175-76fddc50f0c4,81225721-7e65-451d-9175-76fddc50f0c4,1,0,4a6bfd2c-0690-4504-9952-10e7c31156e9,4a6bfd2c-0690-4504-9952-10e7c31156e9,1,0,8f2dfd13-5e16-4fdd-be02-033d27b43317,8f2dfd13-5e16-4fdd-be02-033d27b43317,1,0,2c3849f2-46cc-4350-a6c5-f5587af2c699,2c3849f2-46cc-4350-a6c5-f5587af2c699,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,735eb95a-f4a9-4a90-a9a0-ab269b89f4de,735eb95a-f4a9-4a90-a9a0-ab269b89f4de,1,0,49f4a74c-abc2-446f-8f3c-de7bc02d84bf,49f4a74c-abc2-446f-8f3c-de7bc02d84bf,1,0,9d55341b-ceb2-4400-aeb6-3b579d9c6f2b,9d55341b-ceb2-4400-aeb6-3b579d9c6f2b,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,f2aa4137-07b6-4fc7-8009-8127762dc698,f2aa4137-07b6-4fc7-8009-8127762dc698,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,9016988e-1aea-460a-b5eb-644dc5923d87,9016988e-1aea-460a-b5eb-644dc5923d87,1,0,8593c908-9f6f-42df-9fd4-e41ccffba315,8593c908-9f6f-42df-9fd4-e41ccffba315,1,0,d6eb3484-b0ab-40e3-aa95-c18a40259f77,d6eb3484-b0ab-40e3-aa95-c18a40259f77,1,0,08ec3f2e-e523-4e37-8d44-fbc52c66263c,08ec3f2e-e523-4e37-8d44-fbc52c66263c,1,0,7300e566-06ea-42a3-b046-477ee9883559,7300e566-06ea-42a3-b046-477ee9883559,1,0,72ef831d-9d37-4b7f-8b71-fb9dd0ab6038,72ef831d-9d37-4b7f-8b71-fb9dd0ab6038,1,0,a0ff40b4-5815-445e-ad67-f524dfa3aaa7,a0ff40b4-5815-445e-ad67-f524dfa3aaa7,1,0,4d7ef262-8449-4511-a408-e5d322ce3d78,4d7ef262-8449-4511-a408-e5d322ce3d78,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,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,dea1f169-5426-4623-9e5e-3c8c2360858f,dea1f169-5426-4623-9e5e-3c8c2360858f,1,0,039b1cc5-a831-41fb-933a-b9c0fb9c9f55,039b1cc5-a831-41fb-933a-b9c0fb9c9f55,1,0,b50f3157-3c3a-4553-a16a-7fcd660e2824,b50f3157-3c3a-4553-a16a-7fcd660e2824,1,0,a3b14a36-049d-4f94-bafc-cf7b874f9bf0,a3b14a36-049d-4f94-bafc-cf7b874f9bf0,1,0,6c954862-62d0-4901-8448-ea62a1174660,6c954862-62d0-4901-8448-ea62a1174660,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,54bfe81c-06b2-45a8-8bc1-bd22240cfe32,54bfe81c-06b2-45a8-8bc1-bd22240cfe32,1,0,46f71ecc-5cee-4b8d-9f6d-d38a86787a76,46f71ecc-5cee-4b8d-9f6d-d38a86787a76,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,e97edb4a-468d-499d-924d-aa4e5ee16548,e97edb4a-468d-499d-924d-aa4e5ee16548,1,0,24366a86-0dae-4a68-a180-d8ea7656a286,24366a86-0dae-4a68-a180-d8ea7656a286,1,0,cb65fbad-69a0-47d8-b4a9-da49274c3eb7,cb65fbad-69a0-47d8-b4a9-da49274c3eb7,1,0,3c03f78e-c904-47da-a0a1-db5d6b9f7254,3c03f78e-c904-47da-a0a1-db5d6b9f7254,1,0,3bf03ed7-6581-4a11-8fc8-748f46c8dad7,3bf03ed7-6581-4a11-8fc8-748f46c8dad7,1,0,0f28c616-162c-4dba-bd22-f7ea5d23ea5a,0f28c616-162c-4dba-bd22-f7ea5d23ea5a,1,0,39bf2771-1d8b-44bb-8d8b-54d046589ebe,39bf2771-1d8b-44bb-8d8b-54d046589ebe,1,0,872521e3-413c-45ac-a6ea-39fe1324bae8,872521e3-413c-45ac-a6ea-39fe1324bae8,1,0,f237a21e-066a-48e6-a5c4-5dc2487c7a3b,f237a21e-066a-48e6-a5c4-5dc2487c7a3b,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,79ad09ba-875a-46bd-9cd9-9d084bf4f6ea,79ad09ba-875a-46bd-9cd9-9d084bf4f6ea,1,0,2902460a-ed86-41cf-8e8f-895adab9a72f,2902460a-ed86-41cf-8e8f-895adab9a72f,1,0,d12c7296-36ab-41e0-83ef-143484958597,d12c7296-36ab-41e0-83ef-143484958597,1,0,2b6c3bcd-7d2a-4e95-8066-99374002689b,2b6c3bcd-7d2a-4e95-8066-99374002689b,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,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/Configuration/SessionModule.bsl b/SSL/src/Configuration/SessionModule.bsl index 5333d75e5..65e86bac9 100644 --- a/SSL/src/Configuration/SessionModule.bsl +++ b/SSL/src/Configuration/SessionModule.bsl @@ -16,6 +16,8 @@ СтандартныеПодсистемыСервер.УстановкаПараметровСеанса(ИменаПараметровСеанса); // Конец СтандартныеПодсистемы + + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Configuration/Splash.png b/SSL/src/Configuration/Splash.png index cdd67c2ce36927092d989940cc4d37751a4238a4..27f921c8af5ebf71a211c3109788fb460ac05bae 100644 GIT binary patch literal 43462 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 ALjV8( literal 43330 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

    8nKy0MHmf5 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 Неопределено И Пользователи.ВходВПрограммуРазрешен(ПользовательИБ) Тогда - ПользовательИБ.АутентификацияСтандартная = Ложь; - ПользовательИБ.АутентификацияОС = Ложь; - ПользовательИБ.АутентификацияOpenID = Ложь; + ПользовательИБ.АутентификацияСтандартная = Ложь; + ПользовательИБ.АутентификацияOpenID = Ложь; + ПользовательИБ.АутентификацияOpenIDConnect = Ложь; + ПользовательИБ.АутентификацияТокеномДоступа = Ложь; + ПользовательИБ.АутентификацияОС = Ложь; ПользовательИБ.Записать(); КонецЕсли; КонецЦикла; diff --git a/SSL/src/Constants/ИспользоватьОнлайнПоддержку/ИспользоватьОнлайнПоддержку.mdo b/SSL/src/Constants/ИспользоватьОнлайнПоддержку/ИспользоватьОнлайнПоддержку.mdo deleted file mode 100644 index 62f1eb0bb..000000000 --- a/SSL/src/Constants/ИспользоватьОнлайнПоддержку/ИспользоватьОнлайнПоддержку.mdo +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - ИспользоватьОнлайнПоддержку - - ru - Использовать онлайн-поддержку - - - Boolean - - true - - - Managed - diff --git a/SSL/src/Constants/ИспользоватьСинхронизациюДанных/ValueManagerModule.bsl b/SSL/src/Constants/ИспользоватьСинхронизациюДанных/ValueManagerModule.bsl index 9cf85c39e..e60337386 100644 --- a/SSL/src/Constants/ИспользоватьСинхронизациюДанных/ValueManagerModule.bsl +++ b/SSL/src/Constants/ИспользоватьСинхронизациюДанных/ValueManagerModule.bsl @@ -17,16 +17,18 @@ РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); Константы.ИспользоватьСинхронизациюДанныхВЛокальномРежиме.Установить(Не РазделениеВключено); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда - МенеджерКонстанты = ОбщегоНазначения.ОбщийМодуль("Константы.ИспользоватьСинхронизациюДанныхВМоделиСервиса"); - МенеджерКонстанты.Установить(РазделениеВключено); + МенеджерКонстанты = Константы["ИспользоватьСинхронизациюДанныхВМоделиСервиса"].СоздатьМенеджерЗначения(); + МенеджерКонстанты.Значение = РазделениеВключено; + МенеджерКонстанты.Записать(); КонецЕсли; Иначе Константы.ИспользоватьСинхронизациюДанныхВЛокальномРежиме.Установить(Ложь); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда - МенеджерКонстанты = ОбщегоНазначения.ОбщийМодуль("Константы.ИспользоватьСинхронизациюДанныхВМоделиСервиса"); - МенеджерКонстанты.Установить(Ложь); + МенеджерКонстанты = Константы["ИспользоватьСинхронизациюДанныхВМоделиСервиса"].СоздатьМенеджерЗначения(); + МенеджерКонстанты.Значение = Ложь; + МенеджерКонстанты.Записать(); КонецЕсли; КонецЕсли; diff --git a/SSL/src/Constants/КоличествоМесяцевХраненияИсторииРассылкиОтчетов/КоличествоМесяцевХраненияИсторииРассылкиОтчетов.mdo b/SSL/src/Constants/КоличествоМесяцевХраненияИсторииРассылкиОтчетов/КоличествоМесяцевХраненияИсторииРассылкиОтчетов.mdo new file mode 100644 index 000000000..f81be7897 --- /dev/null +++ b/SSL/src/Constants/КоличествоМесяцевХраненияИсторииРассылкиОтчетов/КоличествоМесяцевХраненияИсторииРассылкиОтчетов.mdo @@ -0,0 +1,26 @@ + + + + + + + + КоличествоМесяцевХраненияИсторииРассылкиОтчетов + + ru + Количество месяцев хранения истории рассылки отчетов + + + Number + + 2 + true + + + true + + 1 + + + Managed + diff --git a/SSL/src/Constants/КоличествоПотоковДлительныхОпераций/ValueManagerModule.bsl b/SSL/src/Constants/КоличествоПотоковДлительныхОпераций/ValueManagerModule.bsl index 922e1ba82..6cff52b7e 100644 --- a/SSL/src/Constants/КоличествоПотоковДлительныхОпераций/ValueManagerModule.bsl +++ b/SSL/src/Constants/КоличествоПотоковДлительныхОпераций/ValueManagerModule.bsl @@ -16,8 +16,8 @@ Возврат; КонецЕсли; - Если Значение < 1 Или Значение > 99 Тогда - Значение = 1; + Если Значение < 0 Или Значение > 99 Тогда + Значение = 0; КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Constants/ПорядокОбрабатываемыхДанных/ПорядокОбрабатываемыхДанных.mdo b/SSL/src/Constants/ПорядокОбрабатываемыхДанных/ПорядокОбрабатываемыхДанных.mdo new file mode 100644 index 000000000..e75cd856d --- /dev/null +++ b/SSL/src/Constants/ПорядокОбрабатываемыхДанных/ПорядокОбрабатываемыхДанных.mdo @@ -0,0 +1,20 @@ + + + + + + + + ПорядокОбрабатываемыхДанных + + ru + Порядок обрабатываемых данных + + + EnumRef.ПорядокОбработчиковОбновления + + true + + + Managed + diff --git a/SSL/src/Constants/УдалитьНастройкиВходаПользователей/ManagerModule.bsl b/SSL/src/Constants/УдалитьНастройкиВходаПользователей/ManagerModule.bsl index f54d5ec18..e69de29bb 100644 --- a/SSL/src/Constants/УдалитьНастройкиВходаПользователей/ManagerModule.bsl +++ b/SSL/src/Constants/УдалитьНастройкиВходаПользователей/ManagerModule.bsl @@ -1,74 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////// -// Copyright (c) 2023, ООО 1С-Софт -// Все права защищены. Эта программа и сопроводительные материалы предоставляются -// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) -// Текст лицензии доступен по ссылке: -// https://creativecommons.org/licenses/by/4.0/legalcode -/////////////////////////////////////////////////////////////////////////////////////////////////////// - -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - -#Область СлужебныйПрограммныйИнтерфейс - -// Обработчик обновления БСП 3.1.6.78 -// -// Переносит настройки из удаляемой константы УдалитьНастройкиВходаПользователей -// -Процедура ПеренестиНастройки() Экспорт - - Блокировка = Новый БлокировкаДанных(); - Блокировка.Добавить("Константа.УдалитьНастройкиВходаПользователей"); - Блокировка.Добавить("Константа.НастройкиВходаПользователей"); - - НачатьТранзакцию(); - - Попытка - - Блокировка.Заблокировать(); - - УстановитьПривилегированныйРежим(Истина); - - СохраненныеНастройки = Константы.УдалитьНастройкиВходаПользователей.Получить().Получить(); - Если СохраненныеНастройки <> Неопределено Тогда - - Константы.НастройкиВходаПользователей.Установить(Новый ХранилищеЗначения(СохраненныеНастройки)); - Константы.УдалитьНастройкиВходаПользователей.Установить(Новый ХранилищеЗначения(Неопределено)); - - КонецЕсли; - - УстановитьПривилегированныйРежим(Ложь); - - ЗафиксироватьТранзакцию(); - - ЗаписьЖурналаРегистрации( - ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Информация, - Метаданные.Константы.НастройкиВходаПользователей, - , - НСтр("ru = 'Настройки входа пользователей успешно перенесены'")); - - Исключение - - ОтменитьТранзакцию(); - - ТекстОшибки = СтрШаблон( - НСтр("ru = 'Ошибка переноса настроек входа пользователя: - |%1'"), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - - ЗаписьЖурналаРегистрации( - ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка, - Метаданные.Константы.НастройкиВходаПользователей, - , - ТекстОшибки); - - ВызватьИсключение НСтр("ru = 'Ошибка переноса настроек входа пользователя. Подробности в журнале регистрации.'"); - - КонецПопытки; - -КонецПроцедуры - -#КонецОбласти - -#КонецЕсли diff --git a/SSL/src/Constants/ХранитьИсториюРассылкиОтчетов/ХранитьИсториюРассылкиОтчетов.mdo b/SSL/src/Constants/ХранитьИсториюРассылкиОтчетов/ХранитьИсториюРассылкиОтчетов.mdo new file mode 100644 index 000000000..92113c6c1 --- /dev/null +++ b/SSL/src/Constants/ХранитьИсториюРассылкиОтчетов/ХранитьИсториюРассылкиОтчетов.mdo @@ -0,0 +1,20 @@ + + + + + + + + ХранитьИсториюРассылкиОтчетов + + ru + Хранить историю рассылки отчетов + + + Boolean + + true + + + Managed + diff --git a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Form.form b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Form.form index e0d87f5d6..eee0e9018 100644 --- a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Form.form @@ -109,7 +109,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -258,7 +257,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Module.bsl index bdf66b2a0..5038e89c7 100644 --- a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Module.bsl @@ -223,7 +223,7 @@ ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Поиск файлов с неизвлеченным текстом.'"); - ДлительнаяОперация = ДлительныеОперации.ВыполнитьВФоне("РаботаСФайламиСлужебный.ПолучитьКоличествоВерсийСНеизвлеченнымТекстом", Новый Структура, ПараметрыВыполнения); + ДлительнаяОперация = ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, "РаботаСФайламиСлужебный.КоличествоВерсийСНеизвлеченнымТекстом"); ТекущееФоновоеЗадание = "Подсчет"; ИдентификаторФоновогоЗадания = ДлительнаяОперация.ИдентификаторЗадания; АдресРезультата = ДлительнаяОперация.АдресРезультата; @@ -235,13 +235,8 @@ &НаСервереБезКонтекста Процедура ЗаписьЖурналаРегистрацииСервер(ТекстСообщения) - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Файлы.Извлечение текста'", - ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - , - ТекстСообщения); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Извлечение текста'", ОбщегоНазначения.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, ТекстСообщения); КонецПроцедуры @@ -314,21 +309,13 @@ ФайлИлиВерсияФайла, АдресФайла, Расширение, УникальныйИдентификатор, Кодировка); Исключение - - ОписаниеОшибкиИнфо = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Во время извлечения текста из файла ""%1"" - |произошла неизвестная ошибка.'"), - Строка(ФайлИлиВерсияФайла)); - - ТекстСообщения = ТекстСообщения + Строка(ОписаниеОшибкиИнфо); - + НСтр("ru = 'Непредвиденная ситуация при извлечении текста из файла ""%1"": + |%2'"), + Строка(ФайлИлиВерсияФайла), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Состояние(ТекстСообщения); - РезультатИзвлечения = "ИзвлечьНеУдалось"; ЗаписьОшибкиИзвлечения(ФайлИлиВерсияФайла, РезультатИзвлечения, ТекстСообщения); - КонецПопытки; КонецЦикла; @@ -336,25 +323,16 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Извлечение текста завершено. |Обработано файлов: %1'"), - МассивФайлов.Количество()); - + МассивФайлов.Количество()); ПоказатьОповещениеПользователя(НСтр("ru = 'Извлечение текстов'"),, ТекстСообщения); Исключение - - ОписаниеОшибкиИнфо = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Во время извлечения текста из файла ""%1"" - |произошла неизвестная ошибка.'"), - Строка(ФайлИлиВерсияФайла)); - - ТекстСообщения = ТекстСообщения + Строка(ОписаниеОшибкиИнфо); - - ПоказатьОповещениеПользователя(НСтр("ru = 'Извлечение текстов'"),, ТекстСообщения); - + НСтр("ru = 'Непредвиденная ситуация при извлечении текста из файла ""%1"": + |%2'"), + Строка(ФайлИлиВерсияФайла), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ПоказатьОповещениеПользователя(НСтр("ru = 'Извлечение текстов'"),, ТекстСообщения); ЗаписьЖурналаРегистрацииСервер(ТекстСообщения); - КонецПопытки; ОбновитьИнформациюОКоличествеФайловСНеизвлеченнымТекстом(); diff --git a/SSL/src/DataProcessors/АктивныеПользователи/Forms/АктивныеПользователи/Form.form b/SSL/src/DataProcessors/АктивныеПользователи/Forms/АктивныеПользователи/Form.form index 4c21e0598..863da893f 100644 --- a/SSL/src/DataProcessors/АктивныеПользователи/Forms/АктивныеПользователи/Form.form +++ b/SSL/src/DataProcessors/АктивныеПользователи/Forms/АктивныеПользователи/Form.form @@ -89,7 +89,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -178,18 +177,93 @@ UserCmds Auto - - СортировкаПоВозрастанию - 26 + + ГруппаСортировка + 82 + + СортировкаПоВозрастанию + 26 + true + true + + true + + false + + СортировкаПоВозрастаниюExtendedTooltip + 45 + Label + true + true + + Left + + + Form.Command.СортировкаПоВозрастанию + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + СортировкаПоУбыванию + 27 + true + true + + true + + false + + СортировкаПоУбываниюExtendedTooltip + 46 + Label + true + true + + Left + + + Form.Command.СортировкаПоУбыванию + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + true true true - false + + <key>ru</key> + <value>Сортировка</value> + - СортировкаПоВозрастаниюExtendedTooltip - 45 + ГруппаСортировкаРасширеннаяПодсказка + 83 Label true true @@ -197,58 +271,9 @@ Left - Form.Command.СортировкаПоВозрастанию - Normal - Auto - true - true - UserCmds - - Style.ButtonTextColor - - - Style.ButtonBackColor - - - Style.BorderColor - - Auto - - - СортировкаПоУбыванию - 27 - true - true - - true - - false - - СортировкаПоУбываниюExtendedTooltip - 46 - Label - true - true - - Left - - - Form.Command.СортировкаПоУбыванию - Normal - Auto - true - true - UserCmds - - Style.ButtonTextColor - - - Style.ButtonBackColor - - - Style.BorderColor - - Auto + + Compact + ЗавершитьСеанс @@ -1482,6 +1507,19 @@ DontUse Auto + + ОтборИмяПриложения + + String + + + + + ОповещатьОЗакрытии + + Boolean + + diff --git a/SSL/src/DataProcessors/АктивныеПользователи/Forms/АктивныеПользователи/Module.bsl b/SSL/src/DataProcessors/АктивныеПользователи/Forms/АктивныеПользователи/Module.bsl index 87aa78600..d59473ac1 100644 --- a/SSL/src/DataProcessors/АктивныеПользователи/Forms/АктивныеПользователи/Module.bsl +++ b/SSL/src/DataProcessors/АктивныеПользователи/Forms/АктивныеПользователи/Module.bsl @@ -20,10 +20,7 @@ УстановитьУсловноеОформление(); - Параметры.Свойство("ОповещатьОЗакрытии", ОповещатьОЗакрытии); - - НомерСеансаИнформационнойБазы = НомерСеансаИнформационнойБазы(); - УсловноеОформление.Элементы[0].Отбор.Элементы[0].ПравоеЗначение = НомерСеансаИнформационнойБазы; + ОповещатьОЗакрытии = Параметры.ОповещатьОЗакрытии; Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); @@ -49,10 +46,8 @@ НаправлениеСортировки = "Возр"; ЗаполнитьСписокВыбораФильтраСоединений(); - Если Параметры.Свойство("ОтборИмяПриложения") Тогда - Если Элементы.ОтборИмяПриложения.СписокВыбора.НайтиПоЗначению(Параметры.ОтборИмяПриложения) <> Неопределено Тогда - ОтборИмяПриложения = Параметры.ОтборИмяПриложения; - КонецЕсли; + Если Элементы.ОтборИмяПриложения.СписокВыбора.НайтиПоЗначению(Параметры.ОтборИмяПриложения) <> Неопределено Тогда + ОтборИмяПриложения = Параметры.ОтборИмяПриложения; КонецЕсли; ЗаполнитьСписокПользователей(); @@ -121,8 +116,8 @@ НомераСеансов.Добавить(НомерСеанса); КонецЦикла; - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); - Если ПараметрыРаботыКлиента.РазделениеВключено И ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда + Если ОбщегоНазначенияКлиент.РазделениеВключено() + И ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда СтандартнаяОбработка = Истина; ОповещениеПослеЗавершенияСеансов = Новый ОписаниеОповещения( @@ -211,6 +206,8 @@ ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокПользователей.Сеанс"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = 0; + НомерСеансаИнформационнойБазы = НомерСеансаИнформационнойБазы(); + ОтборЭлемента.ПравоеЗначение = НомерСеансаИнформационнойБазы; Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", ШрифтыСтиля.ОсновнойЭлементСписка); @@ -301,6 +298,8 @@ ИменаПриложений = СтрРазделить(ОтборИмяПриложения, ","); КонецЕсли; + ПользователиСсылки = Новый Соответствие; + ИдентификаторыПользователей = Новый Массив; Для Каждого СеансИБ Из СеансыИнформационнойБазы Цикл Если ФильтроватьИменаПриложений И ИменаПриложений.Найти(СеансИБ.ИмяПриложения) = Неопределено Тогда @@ -321,8 +320,8 @@ СтрПользователя.Пользователь = СеансИБ.Пользователь.Имя; СтрПользователя.ИмяПользователя = СеансИБ.Пользователь.Имя; - СтрПользователя.ПользовательСсылка = НайтиСсылкуПоИдентификаторуПользователя( - СеансИБ.Пользователь.УникальныйИдентификатор); + ИдентификаторыПользователей.Добавить(СеансИБ.Пользователь.УникальныйИдентификатор); + ПользователиСсылки[СеансИБ.Пользователь.УникальныйИдентификатор] = СтрПользователя; Если ОбщегоНазначения.РазделениеВключено() И Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда @@ -351,7 +350,8 @@ КонецЕсли; КонецЦикла; - + + ЗаполнитьСсылкиПоИдентификаторам(ПользователиСсылки, ИдентификаторыПользователей); СписокПользователей.Сортировать(ИмяКолонкиСортировки + " " + НаправлениеСортировки); КонецПроцедуры @@ -386,49 +386,65 @@ КонецФункции -&НаСервере -Функция НайтиСсылкуПоИдентификаторуПользователя(Идентификатор) - +// Параметры: +// ПользователиСсылки - Соответствие из КлючЗначение: +// * Ключ - УникальныйИдентификатор +// * Значение - ДанныеФормыЭлементКоллекции: +// ** ПользовательСсылка - СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи +// ИдентификаторыПользователей - Массив из УникальныйИдентификатор +// +&НаСервереБезКонтекста +Процедура ЗаполнитьСсылкиПоИдентификаторам(ПользователиСсылки, ИдентификаторыПользователей) + // Нет доступа к разделенному справочнику из неразделенного сеанса. Если ОбщегоНазначения.РазделениеВключено() И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - Возврат Неопределено; + Возврат; КонецЕсли; - Запрос = Новый Запрос; - + Если ИдентификаторыПользователей.Количество() = 0 Тогда + Возврат; + КонецЕсли; + ШаблонТекстаЗапроса = "ВЫБРАТЬ - | Ссылка КАК Ссылка - |ИЗ - | &ИмяТаблицы - |ГДЕ - | ИдентификаторПользователяИБ = &Идентификатор"; + | Пользователи.Ссылка КАК Ссылка, + | Пользователи.ИдентификаторПользователяИБ КАК ИдентификаторПользователяИБ + |ИЗ + | &ИмяТаблицы КАК Пользователи + |ГДЕ + | Пользователи.ИдентификаторПользователяИБ В (&Идентификаторы)"; - ТекстЗапросаПоПользователям = СтрЗаменить(ШаблонТекстаЗапроса, "&ИмяТаблицы", Метаданные.Справочники.Пользователи.ПолноеИмя()); - ТекстЗапросаПоВнешнимПользователям = СтрЗаменить(ШаблонТекстаЗапроса, "&ИмяТаблицы", Метаданные.Справочники.ВнешниеПользователи.ПолноеИмя()); + ТекстЗапросаПоПользователям = СтрЗаменить(ШаблонТекстаЗапроса, "&ИмяТаблицы", + Метаданные.Справочники.Пользователи.ПолноеИмя()); + Запрос = Новый Запрос(ТекстЗапросаПоПользователям); + Запрос.Параметры.Вставить("Идентификаторы", ИдентификаторыПользователей); - Запрос.Текст = ТекстЗапросаПоПользователям; - Запрос.Параметры.Вставить("Идентификатор", Идентификатор); - Результат = Запрос.Выполнить(); + Выборка = Запрос.Выполнить().Выбрать(); + Количество = 0; + Пока Выборка.Следующий() Цикл + ПользователиСсылки[Выборка.ИдентификаторПользователяИБ].ПользовательСсылка = Выборка.Ссылка; + Количество = Количество + 1; + КонецЦикла; - Если НЕ Результат.Пустой() Тогда - Выборка = Результат.Выбрать(); - Выборка.Следующий(); - Возврат Выборка.Ссылка; + Если Количество < ИдентификаторыПользователей.Количество() Тогда + Если ВнешниеПользователи.ИспользоватьВнешнихПользователей() Тогда + ТекстЗапросаПоВнешнимПользователям = СтрЗаменить(ШаблонТекстаЗапроса, "&ИмяТаблицы", + Метаданные.Справочники.ВнешниеПользователи.ПолноеИмя()); + Запрос.Текст = ТекстЗапросаПоВнешнимПользователям; + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + ПользователиСсылки[Выборка.ИдентификаторПользователяИБ].ПользовательСсылка = Выборка.Ссылка; + КонецЦикла; + КонецЕсли; + + Для каждого ПользовательСсылка Из ПользователиСсылки Цикл + Если Не ЗначениеЗаполнено(ПользовательСсылка.Ключ) Тогда + ПользовательСсылка.Значение.ПользовательСсылка = Справочники.Пользователи.ПустаяСсылка(); + КонецЕсли; + КонецЦикла; КонецЕсли; - Запрос.Текст = ТекстЗапросаПоВнешнимПользователям; - Результат = Запрос.Выполнить(); - - Если НЕ Результат.Пустой() Тогда - Выборка = Результат.Выбрать(); - Выборка.Следующий(); - Возврат Выборка.Ссылка; - КонецЕсли; - - Возврат Справочники.Пользователи.ПустаяСсылка(); - -КонецФункции +КонецПроцедуры &НаКлиенте Процедура ОткрытьПользователяИзСписка() diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Form.form b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Form.form index d56818155..f7e551bbd 100644 --- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Form.form +++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Form.form @@ -93,7 +93,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -319,7 +318,6 @@ UsualGroup HorizontalIfPossible - Auto true true Equal @@ -785,7 +783,6 @@ UsualGroup HorizontalIfPossible - Auto true true Equal @@ -815,7 +812,6 @@ UsualGroup Vertical - Auto true true Auto @@ -845,7 +841,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Module.bsl b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Module.bsl index 2d3e7b835..b29c96ef0 100644 --- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Module.bsl +++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Module.bsl @@ -128,7 +128,7 @@ Возврат; КонецЕсли; Исключение - ОбщегоНазначенияКлиент.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбщегоНазначенияКлиент.СообщитьПользователю(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат; КонецПопытки; @@ -205,9 +205,9 @@ УстановитьБлокировкуРегламентныхЗаданийНаСервере(ПараметрыАдминистрирования); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СоединенияИБКлиент.СобытиеЖурналаРегистрации(), "Ошибка", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); Элементы.ГруппаОшибка.Видимость = Истина; - Элементы.ТекстОшибки.Заголовок = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Элементы.ТекстОшибки.Заголовок = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Возврат; КонецПопытки; @@ -345,10 +345,10 @@ Исключение ЗаписьЖурналаРегистрации(СоединенияИБ.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Если ЭтоАдминистраторСистемы Тогда Элементы.ГруппаОшибка.Видимость = Истина; - Элементы.ТекстОшибки.Заголовок = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Элементы.ТекстОшибки.Заголовок = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецЕсли; Возврат Ложь; КонецПопытки; @@ -367,10 +367,10 @@ Исключение ЗаписьЖурналаРегистрации(СоединенияИБ.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Если ЭтоАдминистраторСистемы Тогда Элементы.ГруппаОшибка.Видимость = Истина; - Элементы.ТекстОшибки.Заголовок = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Элементы.ТекстОшибки.Заголовок = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецЕсли; Возврат Ложь; КонецПопытки; @@ -436,10 +436,10 @@ Исключение ЗаписьЖурналаРегистрации(СоединенияИБ.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Если ЭтоАдминистраторСистемы Тогда Элементы.ГруппаОшибка.Видимость = Истина; - Элементы.ТекстОшибки.Заголовок = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Элементы.ТекстОшибки.Заголовок = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецЕсли; КонецПопытки; diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Form.form b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Form.form index 7594ac697..8fedb6b57 100644 --- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Form.form +++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Form.form @@ -144,7 +144,6 @@ UsualGroup Vertical - Auto true true Auto @@ -208,7 +207,6 @@ UsualGroup Vertical - Auto true true Auto @@ -237,7 +235,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -408,7 +405,6 @@ UsualGroup Vertical - Auto true true Auto @@ -437,7 +433,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Module.bsl b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Module.bsl index 632ae013a..e14d45f65 100644 --- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Module.bsl +++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Module.bsl @@ -176,7 +176,7 @@ УстановитьМонопольныйРежим(Истина); Исключение ОшибкаУстановкиМонопольногоРежима = НСтр("ru = 'Техническая информация:'") + " " - + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Если МонопольныйРежим() Тогда УстановитьМонопольныйРежим(Ложь); @@ -224,8 +224,8 @@ Исключение ЗаписьЖурналаРегистрации(СоединенияИБ.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ОбщегоНазначения.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбщегоНазначения.СообщитьПользователю(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдресаВСвободнойФорме/Form.form b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдресаВСвободнойФорме/Form.form index 502305c21..b1d435a8e 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдресаВСвободнойФорме/Form.form +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдресаВСвободнойФорме/Form.form @@ -344,7 +344,6 @@ UsualGroup - Auto true true Auto @@ -525,7 +524,6 @@ UsualGroup - Auto true true Auto @@ -671,7 +669,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -700,7 +697,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1085,7 +1081,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Form.form b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Form.form index a17b8e74b..9fc1c0b01 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Form.form +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Form.form @@ -7,6 +7,52 @@ СведенияОТелефоне 56 + + НомерТелефонаПоМаске + 60 + true + true + + true + + + НомерТелефонаПоМаске + + Top + + OnChange + НомерТелефонаПоМаскеПриИзменении + + + НомерТелефонаПоМаскеРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + НомерТелефонаПоМаскеКонтекстноеМеню + 61 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + ГруппаПоляТелефона 24 @@ -241,7 +287,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -318,7 +363,6 @@ UsualGroup Vertical - Auto true true Auto @@ -964,6 +1008,39 @@ true + + НомерТелефонаПоМаске + + <key>ru</key> + <value>Номер телефона</value> + + 9 + + String + + 150 + + + + true + + + true + + + + ВводитьНомерПоМаске + 18 + + Boolean + + + true + + + true + + КомандаОК diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Help/ru.html b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Help/ru.html index a1aec4277..9e5520827 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Help/ru.html +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Help/ru.html @@ -12,7 +12,10 @@ </li> <li><strong>Добавочный номер</strong> - перед цифрами добавочного номера программа автоматически проставляет доб; </li> -<li><strong>Комментарий</strong> - введите дополнительную информацию о телефоне.</li></ul><h3>Очистка номера телефона (факса)</h3> +<li><strong>Комментарий</strong> - введите дополнительную информацию о телефоне.</li></ul><h3>Ввод по маске</h3> +<p class="">Также можно ввести телефон (факс) в <a href="Catalog.ВидыКонтактнойИнформации.Form.ФормаЭлемента/Help">поле</a> в соответствии с маской (если настроена маска для ввода телефона), необходимо заполнить поля:</p> +<ul><li><b>Номер телефона</b> - пишется в соответствии с маской; </li> +<li><strong>Комментарий</strong> - введите дополнительную информацию о телефоне.</li></ul><h3>Очистка номера телефона (факса)</h3> <ul><li>Для того чтобы удалить ошибочно введенный номер телефона (факса) и начать заполнение заново, воспользуйтесь командой <strong>Еще</strong> - <strong>Очистить номер телефона</strong>. </li></ul><h3>См. также:</h3> <ul><li><a href="Catalog.ВидыКонтактнойИнформации/Help">Виды контактной информации</a>. </li> diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Module.bsl b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Module.bsl index 8b0f23c9b..dcf3756fb 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Module.bsl +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Module.bsl @@ -40,7 +40,9 @@ КонецЕсли; СтруктураВидКонтактнойИнформации = УправлениеКонтактнойИнформациейСлужебный.СтруктураВидаКонтактнойИнформации(Параметры.ВидКонтактнойИнформации); - ТипКонтактнойИнформации = СтруктураВидКонтактнойИнформации.Тип; + ТипКонтактнойИнформации = СтруктураВидКонтактнойИнформации.Тип; + ВводитьНомерПоМаске = СтруктураВидКонтактнойИнформации.ВводитьНомерПоМаске И (НЕ ЗначениеЗаполнено(Параметры.Представление) + ИЛИ УправлениеКонтактнойИнформациейСлужебный.НомерТелефонаСоответствуетМаске(Параметры.Представление, СтруктураВидКонтактнойИнформации.МаскаНомераТелефона)); ПроверятьКорректность = СтруктураВидКонтактнойИнформации.ПроверятьКорректность; Заголовок = ?(ПустаяСтрока(Параметры.Заголовок), Строка(ВидКонтактнойИнформации), Параметры.Заголовок); @@ -48,12 +50,12 @@ ЗначенияПолей = ОпределитьЗначениеАдреса(Параметры); - Если Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") <> Неопределено Тогда + Если НЕ ВводитьНомерПоМаске И Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") <> Неопределено Тогда ПодсказкиПриВводеТелефона = Обработки["РасширенныйВводКонтактнойИнформации"].ПодсказкиПриВводеТелефона(); Элементы.КодСтраны.ПодсказкаВвода = ПодсказкиПриВводеТелефона.КодСтраны; Элементы.КодГорода.ПодсказкаВвода = ПодсказкиПриВводеТелефона.КодГорода; - Элементы.НомерТелефона.ПодсказкаВвода = ПодсказкиПриВводеТелефона.НомерТелефона; + Элементы.НомерТелефона.ПодсказкаВвода = ПодсказкиПриВводеТелефона.НомерТелефона; ИспользоватьДополнительныеПроверки = Истина; @@ -92,31 +94,36 @@ КонецЕсли; КонецЕсли; + + ЗначениеРеквизитовПоКонтактнойИнформации(Данные); - ЗначениеРеквизитовПоКонтактнойИнформации(Данные); - + Элементы.НомерТелефонаПоМаске.Видимость = ВводитьНомерПоМаске; + Элементы.НомерТелефонаПоМаске.Маска = СтруктураВидКонтактнойИнформации.МаскаНомераТелефона; + Элементы.ГруппаПоляТелефона.Видимость = НЕ ВводитьНомерПоМаске; Элементы.Добавочный.Видимость = СтруктураВидКонтактнойИнформации.ТелефонCДобавочнымНомером; Элементы.ОчиститьТелефон.Доступность = Не Параметры.ТолькоПросмотр; - Коды = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("Обработка.ВводКонтактнойИнформации.Форма.ВводТелефона", "КодыСтраныИГорода"); - Если ТипЗнч(Коды) = Тип("Структура") Тогда - Если ЭтоНовый Тогда + Если НЕ ВводитьНомерПоМаске Тогда + Коды = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("Обработка.ВводКонтактнойИнформации.Форма.ВводТелефона", "КодыСтраныИГорода"); + Если ТипЗнч(Коды) = Тип("Структура") Тогда + Если ЭтоНовый Тогда Коды.Свойство("КодСтраны", КодСтраны); Коды.Свойство("КодГорода", КодГорода); + КонецЕсли; + + Если Коды.Свойство("СписокКодовГорода") Тогда + Элементы.КодГорода.СписокВыбора.ЗагрузитьЗначения(Коды.СписокКодовГорода); + КонецЕсли; КонецЕсли; - Если Коды.Свойство("СписокКодовГорода") Тогда - Элементы.КодГорода.СписокВыбора.ЗагрузитьЗначения(Коды.СписокКодовГорода); - КонецЕсли; - КонецЕсли; - - Если СтруктураВидКонтактнойИнформации.ХранитьИсториюИзменений Тогда - Если Параметры.Свойство("КонтактнаяИнформацияОписаниеДополнительныхРеквизитов") Тогда - Для каждого СтрокаКИ Из Параметры.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл - НоваяСтрока = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаКИ); - КонецЦикла; - КонецЕсли; + Если СтруктураВидКонтактнойИнформации.ХранитьИсториюИзменений Тогда + Если Параметры.Свойство("КонтактнаяИнформацияОписаниеДополнительныхРеквизитов") Тогда + Для каждого СтрокаКИ Из Параметры.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл + НоваяСтрока = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаКИ); + КонецЦикла; + КонецЕсли; + КонецЕсли; КонецЕсли; Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда @@ -132,6 +139,7 @@ ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "КодГорода", "ПоложениеЗаголовка", ПоложениеЗаголовкаЭлементаФормы.Лево); ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "НомерТелефона", "ПоложениеЗаголовка", ПоложениеЗаголовкаЭлементаФормы.Лево); ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "Добавочный", "ПоложениеЗаголовка", ПоложениеЗаголовкаЭлементаФормы.Лево); + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "НомерТелефонаПоМаске", "ПоложениеЗаголовка", ПоложениеЗаголовкаЭлементаФормы.Лево); Если Элементы.КодГорода.СписокВыбора.Количество() < 2 Тогда @@ -202,6 +210,14 @@ КонецПроцедуры +&НаКлиенте +Процедура НомерТелефонаПоМаскеПриИзменении(Элемент) + + Модифицированность = Истина; + Представление = НомерТелефонаПоМаске; + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы @@ -252,14 +268,17 @@ Если ИспользоватьДополнительныеПроверки Тогда МодульРаботаСАдресамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСАдресамиКлиент"); КонецЕсли; - + ПоляТелефона = УправлениеКонтактнойИнформациейКлиентСервер.СтруктураПолейТелефона(); ПоляТелефона.КодГорода = КодГорода; - ПоляТелефона.КодСтраны = КодСтраны; + ПоляТелефона.КодСтраны = КодСтраны; ПоляТелефона.НомерТелефона = НомерТелефона; ПоляТелефона.Представление = Представление; ПоляТелефона.Добавочный = Добавочный; - ПоляТелефона.Комментарий = Комментарий; + ПоляТелефона.Комментарий = Комментарий; + Если ВводитьНомерПоМаске Тогда + ПоляТелефона.НомерТелефона = НомерТелефонаПоМаске; + КонецЕсли; СписокОшибок = УправлениеКонтактнойИнформациейКлиентСервер.ОшибкиЗаполненияТелефона(ПоляТелефона, МодульРаботаСАдресамиКлиент); @@ -378,11 +397,15 @@ // Копия комментария для анализа измененности. КопияКомментария = Комментарий; - КодСтраны = РедактируемаяИнформация.CountryCode; - КодГорода = РедактируемаяИнформация.AreaCode; - НомерТелефона = РедактируемаяИнформация.Number; - Добавочный = РедактируемаяИнформация.ExtNumber; - + Если ВводитьНомерПоМаске Тогда + НомерТелефонаПоМаске = РедактируемаяИнформация.Value; + Иначе + КодСтраны = РедактируемаяИнформация.CountryCode; + КодГорода = РедактируемаяИнформация.AreaCode; + НомерТелефона = РедактируемаяИнформация.Number; + Добавочный = РедактируемаяИнформация.ExtNumber; + КонецЕсли; + КонецПроцедуры // Возвращает XTDO объект типа "Контактная информация" по значению реквизитов. @@ -391,11 +414,21 @@ Результат = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеНовойКонтактнойИнформации(ТипКонтактнойИнформации); - Результат.CountryCode = КодСтраны; - Результат.AreaCode = КодГорода; - Результат.Number = НомерТелефона; - Результат.ExtNumber = Добавочный; - Результат.Value = УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПредставлениеТелефона(КодСтраны, КодГорода, НомерТелефона, Добавочный, ""); + Если ВводитьНомерПоМаске Тогда + ДанныеКонтактнойИнформации = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияПоПредставлению(НомерТелефонаПоМаске, ВидКонтактнойИнформации); + Результат.CountryCode = ДанныеКонтактнойИнформации.CountryCode; + Результат.AreaCode = ДанныеКонтактнойИнформации.AreaCode; + Результат.Number = ДанныеКонтактнойИнформации.Number; + Результат.ExtNumber = ДанныеКонтактнойИнформации.ExtNumber; + Результат.Value = НомерТелефонаПоМаске; + Иначе + Результат.CountryCode = КодСтраны; + Результат.AreaCode = КодГорода; + Результат.Number = НомерТелефона; + Результат.ExtNumber = Добавочный; + Результат.Value = УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПредставлениеТелефона(КодСтраны, КодГорода, НомерТелефона, Добавочный, ""); + КонецЕсли; + Результат.Comment = Комментарий; Возврат Результат; @@ -448,7 +481,8 @@ НомерТелефона = ""; Добавочный = ""; Комментарий = ""; - Представление = ""; + Представление = ""; + НомерТелефонаПоМаске = ""; Модифицированность = Истина; КонецПроцедуры diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Form.form b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Form.form index b6ffdf8db..1cc962d02 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Form.form +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Form.form @@ -164,7 +164,168 @@ <autoCommandBar> <name>ИсторияКоманднаяПанель</name> <id>3</id> + <items xsi:type="form:Button"> + <name>ИсторияВыбрать</name> + <id>50</id> + <displayImportance>VeryHigh</displayImportance> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ИсторияВыбратьРасширеннаяПодсказка</name> + <id>51</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Command.Выбрать</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> + <items xsi:type="form:Button"> + <name>ИсторияДобавить</name> + <id>22</id> + <displayImportance>Usual</displayImportance> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ИсторияДобавитьРасширеннаяПодсказка</name> + <id>23</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Item.История.StandardCommand.Add</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + <locationInCommandBar>InCommandBarAndInAdditionalSubmenu</locationInCommandBar> + </items> + <items xsi:type="form:Button"> + <name>ИсторияИзменить</name> + <id>20</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ИсторияИзменитьРасширеннаяПодсказка</name> + <id>21</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Item.История.StandardCommand.Change</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + <locationInCommandBar>InCommandBarAndInAdditionalSubmenu</locationInCommandBar> + </items> + <items xsi:type="form:Button"> + <name>ИсторияУдалить</name> + <id>24</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ИсторияУдалитьРасширеннаяПодсказка</name> + <id>25</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Item.История.StandardCommand.Delete</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> + <items xsi:type="form:Button"> + <name>ИсторияИзменитьФорму</name> + <id>28</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ИсторияИзменитьФормуРасширеннаяПодсказка</name> + <id>29</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.StandardCommand.CustomizeForm</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> + <items xsi:type="form:Button"> + <name>ФормаСправка</name> + <id>26</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ФормаСправкаРасширеннаяПодсказка</name> + <id>27</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.StandardCommand.Help</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + <locationInCommandBar>InAdditionalSubmenu</locationInCommandBar> + </items> <horizontalAlign>Left</horizontalAlign> + <autoFill>true</autoFill> </autoCommandBar> <handlers> <event>Selection</event> @@ -462,240 +623,6 @@ <autoCommandBar> <name>ФормаКоманднаяПанель</name> <id>-1</id> - <items xsi:type="form:Button"> - <name>ИсторияВыбрать</name> - <id>50</id> - <displayImportance>VeryHigh</displayImportance> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <extendedTooltip> - <name>ИсторияВыбратьРасширеннаяПодсказка</name> - <id>51</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <commandName>Form.Command.Выбрать</commandName> - <buttonImportance>Normal</buttonImportance> - <representation>Auto</representation> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <placementArea>UserCmds</placementArea> - <representationInContextMenu>Auto</representationInContextMenu> - </items> - <items xsi:type="form:Button"> - <name>ИсторияДобавить</name> - <id>22</id> - <displayImportance>Usual</displayImportance> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <extendedTooltip> - <name>ИсторияДобавитьРасширеннаяПодсказка</name> - <id>23</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <commandName>Form.Item.История.StandardCommand.Add</commandName> - <buttonImportance>Normal</buttonImportance> - <representation>Auto</representation> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <placementArea>UserCmds</placementArea> - <representationInContextMenu>Auto</representationInContextMenu> - <locationInCommandBar>InCommandBarAndInAdditionalSubmenu</locationInCommandBar> - </items> - <items xsi:type="form:Button"> - <name>ИсторияИзменить</name> - <id>20</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <extendedTooltip> - <name>ИсторияИзменитьРасширеннаяПодсказка</name> - <id>21</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <commandName>Form.Item.История.StandardCommand.Change</commandName> - <buttonImportance>Normal</buttonImportance> - <representation>Auto</representation> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <placementArea>UserCmds</placementArea> - <representationInContextMenu>Auto</representationInContextMenu> - <locationInCommandBar>InCommandBarAndInAdditionalSubmenu</locationInCommandBar> - </items> - <items xsi:type="form:Button"> - <name>ИсторияУдалить</name> - <id>24</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <extendedTooltip> - <name>ИсторияУдалитьРасширеннаяПодсказка</name> - <id>25</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <commandName>Form.Item.История.StandardCommand.Delete</commandName> - <buttonImportance>Normal</buttonImportance> - <representation>Auto</representation> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <placementArea>UserCmds</placementArea> - <representationInContextMenu>Auto</representationInContextMenu> - </items> - <items xsi:type="form:FormGroup"> - <name>ИсторияГруппаДействия</name> - <id>32</id> - <items xsi:type="form:Button"> - <name>ИсторияИзменитьФорму</name> - <id>28</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <extendedTooltip> - <name>ИсторияИзменитьФормуРасширеннаяПодсказка</name> - <id>29</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <commandName>Form.StandardCommand.CustomizeForm</commandName> - <buttonImportance>Normal</buttonImportance> - <representation>Auto</representation> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <placementArea>UserCmds</placementArea> - <representationInContextMenu>Auto</representationInContextMenu> - </items> - <items xsi:type="form:Button"> - <name>ИсторияВывестиСписок</name> - <id>30</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <extendedTooltip> - <name>ИсторияВывестиСписокРасширеннаяПодсказка</name> - <id>31</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <commandName>Form.Item.История.StandardCommand.OutputList</commandName> - <buttonImportance>Normal</buttonImportance> - <representation>Auto</representation> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <placementArea>UserCmds</placementArea> - <representationInContextMenu>Auto</representationInContextMenu> - </items> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <title> - <key>ru</key> - <value>История группа действия</value> - - - ИсторияГруппаДействияРасширеннаяПодсказка - 33 - Label - true - true - - Left - - - - - - ИсторияГруппаСправка - 34 - - ФормаСправка - 26 - true - true - - true - - - ФормаСправкаРасширеннаяПодсказка - 27 - Label - true - true - - Left - - - Form.StandardCommand.Help - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - true - true - - true - - - <key>ru</key> - <value>История группа справка</value> - - - ИсторияГруппаСправкаРасширеннаяПодсказка - 35 - Label - true - true - - Left - - - - Left diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Help/ru.html b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Help/ru.html index 91330d461..fe6b91add 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Help/ru.html +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ИсторияКонтактнойИнформации/Help/ru.html @@ -2,8 +2,10 @@

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

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

    Изменение адреса

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

    См. также

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

    См. также

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/РедактированиеПериодаИОтбора/Form.form b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/РедактированиеПериодаИОтбора/Form.form index cbb4916d7..899c5ce7d 100644 --- a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/РедактированиеПериодаИОтбора/Form.form +++ b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/РедактированиеПериодаИОтбора/Form.form @@ -83,7 +83,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/Форма/Form.form b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/Форма/Form.form index 1378d5d3c..6a3311e59 100644 --- a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/Forms/Форма/Form.form @@ -90,7 +90,6 @@ UsualGroup - Auto true true Auto @@ -455,7 +454,6 @@ UsualGroup Vertical - Auto true true Auto @@ -562,7 +560,6 @@ UsualGroup Vertical - Auto true true Auto @@ -590,7 +587,6 @@ UsualGroup - Auto true true Auto @@ -803,7 +799,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1056,7 +1051,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1188,7 +1182,6 @@ UsualGroup - Auto WeakSeparation true true @@ -1619,7 +1612,6 @@ Vertical Bottom - Auto true true Auto @@ -1647,7 +1639,6 @@ UsualGroup - Auto true true Auto @@ -1828,7 +1819,6 @@ UsualGroup Center - Auto true true Auto diff --git a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/ObjectModule.bsl b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/ObjectModule.bsl index 8e8d14189..53d13efa6 100644 --- a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаEnterpriseData/ObjectModule.bsl @@ -172,7 +172,7 @@ |Ошибка выполнения обработчика. |%2.'"), КомпонентыОбмена.НаправлениеОбмена, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ОбменДаннымиXDTOСервер.ЗаписатьВПротоколВыполнения(КомпонентыОбмена, ТекстОшибки); КонецПопытки; @@ -250,7 +250,7 @@ |Ошибка выполнения обработчика. |%2.'"), КомпонентыОбмена.НаправлениеОбмена, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ОбменДаннымиXDTOСервер.ЗаписатьВПротоколВыполнения(КомпонентыОбмена, ТекстОшибки); КонецПопытки; КонецЕсли; @@ -316,7 +316,7 @@ Исключение СобытиеЖурнала = ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(); - ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(СобытиеЖурнала, УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки); diff --git a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаДанныхСверткаСсылокНаПользователейВРазделенныхДанных/ObjectModule.bsl b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаДанныхСверткаСсылокНаПользователейВРазделенныхДанных/ObjectModule.bsl index 27c2d7bbb..c02c5de75 100644 --- a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаДанныхСверткаСсылокНаПользователейВРазделенныхДанных/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаДанныхСверткаСсылокНаПользователейВРазделенныхДанных/ObjectModule.bsl @@ -230,13 +230,18 @@ // Справочник Пользователи ЭтоИсходныйНеуказанныйПользователь = Ложь; + ИдентификаторыСлужебныхПользователей = ИдентификаторыСлужебныхПользователей(); Для Каждого Артефакт Из Артефакты Цикл Если Артефакт.Тип() = ТипАртефактНеразделенногоПользователя() Тогда - ВнутреннееИмя = Артефакт.UserName; - Идентификатор = ИдентификаторСлужебногоПользователяПоВнутреннемуИмени(ВнутреннееИмя); + НайденнаяСтрока = ИдентификаторыСлужебныхПользователей.Найти(Артефакт.UserName, "ИмяПользователя"); + Если НайденнаяСтрока = Неопределено Тогда + Идентификатор = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); + Иначе + Идентификатор = НайденнаяСтрока.ИдентификаторПользователяИБ; + КонецЕсли; Если ПользователиСлужебныйВМоделиСервиса.ПользовательЗарегистрированКакНеразделенный(Идентификатор) Тогда @@ -314,25 +319,20 @@ КонецФункции -Функция ИдентификаторСлужебногоПользователяПоВнутреннемуИмени(Знач ВнутреннееИмя) +Функция ИдентификаторыСлужебныхПользователей() - ТекстЗапроса = - "ВЫБРАТЬ - | НеразделенныеПользователи.ИдентификаторПользователяИБ КАК ИдентификаторПользователяИБ - |ИЗ - | РегистрСведений.НеразделенныеПользователи КАК НеразделенныеПользователи - |ГДЕ - | НеразделенныеПользователи.ИмяПользователя = &ИмяПользователя"; - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("ИмяПользователя", ВнутреннееИмя); - РезультатЗапроса = Запрос.Выполнить(); - Если РезультатЗапроса.Пустой() Тогда - Возврат Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); - Иначе - Выборка = РезультатЗапроса.Выбрать(); - Выборка.Следующий(); - Возврат Выборка.ИдентификаторПользователяИБ; - КонецЕсли; + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | НеразделенныеПользователи.ИмяПользователя КАК ИмяПользователя, + | НеразделенныеПользователи.ИдентификаторПользователяИБ КАК ИдентификаторПользователяИБ + |ИЗ + | РегистрСведений.НеразделенныеПользователи КАК НеразделенныеПользователи"; + + Результат = Запрос.Выполнить().Выгрузить(); + Результат.Индексы.Добавить("ИмяПользователя"); + + Возврат Результат; КонецФункции diff --git a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Form.form b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Form.form index a13852c18..ff77661b2 100644 --- a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Form.form @@ -51,7 +51,7 @@ ru Невозможно запустить синхронизацию данных. -Повторите попытку позже или <link ОжидатьВозможностьСинхронизации>ожидайте</><link ОжидатьВозможностьСинхронизации> </><link ОжидатьВозможностьСинхронизации>такую</><link ОжидатьВозможностьСинхронизации> </><link ОжидатьВозможностьСинхронизации>возможность...</> +Повторите попытку позже или <link ОжидатьВозможностьСинхронизации>ожидайте такую возможность...</> true true @@ -104,7 +104,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -137,6 +136,221 @@ false
    + + СтраницаПроверкаЗадачОбмена + 220 + + Группа3 + 222 + + ЗадачаВОчереди + 224 + + <key>ru</key> + <value>Задача в очереди</value> + + true + true + + true + + + ЗадачаВОчередиРасширеннаяПодсказка + 226 + Label + true + true + + Left + + + + ЗадачаВОчередиКонтекстноеМеню + 225 + true + + true + true + + + CommonPicture.СинхронизацияДанныхНедоступна + + + + + СтатусЗадачаВОчереди + 227 + + <key>ru</key> + <value>Для узла уже выполняется синхронизация.</value> + + true + true + + true + + + СтатусЗадачаВОчередиРасширеннаяПодсказка + 229 + Label + true + true + + Left + + + + СтатусЗадачаВОчередиКонтекстноеМеню + 228 + true + + true + Label + true + true + + Left + Center + + + true + true + + true + + true + + Группа3РасширеннаяПодсказка + 223 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + + Группа4 + 230 + + ОтменитьОчередьИПродолжить + 234 + + <key>ru</key> + <value>Далее</value> + + true + true + + true + + + ОтменитьОчередьИПродолжитьРасширеннаяПодсказка + 235 + Label + true + true + + Left + + + UsualButton + Form.Command.ОтменитьОчередьИПродолжить + Normal + Auto + true + true + UserCmds + Auto + + + Закрыть1 + 232 + true + true + + true + + + Закрыть1РасширеннаяПодсказка + 233 + Label + true + true + + Left + + + UsualButton + Form.StandardCommand.Close + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + true + + Группа4РасширеннаяПодсказка + 231 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Right + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Проверка очереди задач обмена</value> + + + СтраницаПроверкаЗадачОбменаРасширеннаяПодсказка + 221 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + ОжиданиеЗапускаСинхронизации 192 @@ -232,7 +446,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -402,7 +615,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -431,7 +643,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -502,7 +713,6 @@ UsualGroup Vertical - Auto true true Auto @@ -639,7 +849,6 @@ UsualGroup Vertical - Auto true true Auto @@ -668,7 +877,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1498,7 +1706,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3267,6 +3474,70 @@ true + + ОбменЧерезВнутреннююПубликацию + 50 + + Boolean + + + true + + + true + + + + ИдентификаторОбменаЧерезВнутреннююПубликацию + 51 + + String + + + + true + + + true + + + + ПараметрыОбменаЧерезВнутреннююПубликацию + 52 + + + true + + + true + + + + СценарийВыполненияЧерезВнутреннююПубликацию + 53 + + CatalogRef.СценарииОбменовДанными + + + true + + + true + + + + ПоУзлуЗапланированОбмен + 54 + + Boolean + + + true + + + true + + ПерейтиВЖурналРегистрации @@ -3377,6 +3648,28 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>ОтменитьОчередьИПродолжить</name> + <title> + <key>ru</key> + <value>Отменить очередь и продолжить</value> + + 6 + + ru + Отменить очередь и продолжить + + + true + + + + ОтменитьОчередьИПродолжить + + + Auto + Auto + УзелИнформационнойБазы diff --git a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Module.bsl index 3fd14dced..02ae4e4cd 100644 --- a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Module.bsl @@ -33,11 +33,18 @@ УстановитьПривилегированныйРежим(Истина); НаименованиеКорреспондента = Строка(УзелИнформационнойБазы); - ВидТранспортаСообщений = РегистрыСведений.НастройкиТранспортаОбменаДанными.ВидТранспортаСообщенийОбменаПоУмолчанию(УзелИнформационнойБазы); - ВыполнитьОтправкуДанных = РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.ВыполнитьОтправкуДанных(УзелИнформационнойБазы); + + НастройкиТранспорта = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспорта(УзелИнформационнойБазы); + ВидТранспортаСообщений = НастройкиТранспорта.ВидТранспортаСообщенийОбменаПоУмолчанию; + КонечнаяТочкаКорреспондента = НастройкиТранспорта.WSКонечнаяТочкаКорреспондента; + + ВыполнитьОтправкуДанных = РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.ВыполнитьОтправкуДанных(УзелИнформационнойБазы); УстановитьПривилегированныйРежим(Ложь); + ОбменЧерезВнутреннююПубликацию = ВидТранспортаСообщений = Перечисления.ВидыТранспортаСообщенийОбмена.WS + И ЗначениеЗаполнено(КонечнаяТочкаКорреспондента); + // Инициализируем роли пользователя. РольДоступнаАдминистрированиеОбменовДанными = ОбменДаннымиСервер.ЕстьПраваНаАдминистрированиеОбменов(); РольДоступнаПолныеПрава = Пользователи.ЭтоПолноправныйПользователь(); @@ -102,11 +109,13 @@ ЕстьОшибки = ((ОбменДаннымиСервер.ГлавныйУзел() = УзелИнформационнойБазы) И КонфигурацияИзменена()); ФоновоеЗаданиеИспользоватьПрогресс = Не ОбменМеждуПриложениямиВСервисе + И Не ОбменЧерезВнутреннююПубликацию И Не (ВидТранспортаСообщений = Перечисления.ВидыТранспортаСообщенийОбмена.WS); ЕстьСтраницаЗапросаПароля = Не ЕстьОшибки И (ВидТранспортаСообщений = Перечисления.ВидыТранспортаСообщенийОбмена.WS) - И Не (ПарольСинхронизацииЗадан И НеНапоминатьОДолгойСинхронизации); + И Не (ПарольСинхронизацииЗадан И НеНапоминатьОДолгойСинхронизации) + И Не ОбменЧерезВнутреннююПубликацию; Элементы.ГруппаПредупрежденияДолгойСинхронизации.Видимость = ЕстьСтраницаЗапросаПароля И Не НеНапоминатьОДолгойСинхронизации; Элементы.ГруппаЗапросаПароля.Видимость = ЕстьСтраницаЗапросаПароля И Не ПарольСинхронизацииЗадан; @@ -118,6 +127,14 @@ ПроверитьВозможностьЗапускаОбмена(УзелИнформационнойБазы, БлокировкаУзлаУстановлена); + Если ОбменЧерезВнутреннююПубликацию Тогда + МодульОбменДаннымиВнутренняяПубликация = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВнутренняяПубликация"); + ПоУзлуЗапланированОбмен = МодульОбменДаннымиВнутренняяПубликация.ПоУзлуЗапланированОбмен( + УзелИнформационнойБазы, + СценарийВыполненияЧерезВнутреннююПубликацию, + ИдентификаторОбменаЧерезВнутреннююПубликацию); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -632,7 +649,7 @@ НастройкаЗавершена = Истина; ПолученыДанныеДляСопоставления = Ложь; - ЕстьПодключение = ОбменДаннымиСервер.ЕстьПодключениеККорреспонденту(УзелИнформационнойБазы, + ЕстьПодключение = ОбменДаннымиВебСервис.ЕстьПодключениеККорреспонденту(УзелИнформационнойБазы, ПараметрыПодключения, СообщениеОбОшибкеПользователю, НастройкаЗавершена, ПолученыДанныеДляСопоставления); Если Не ЕстьПодключение Тогда @@ -736,6 +753,58 @@ КонецПроцедуры +&НаКлиенте +Функция Подключаемый_СтраницаПроверкаЗадачОбмена_ПриОткрытии(Отказ, ПропуститьСтраницу, ЭтоПереходДалее) + + Если ПоУзлуЗапланированОбмен Тогда + + Если ЗначениеЗаполнено(СценарийВыполненияЧерезВнутреннююПубликацию) Тогда + + Шаблон = НСтр("ru = 'Синхронизация для узла ""%1"" уже запланирована + |в сценарии ""%2"". + | + |Нажмите Далее, чтобы отменить выполнение сценария + |и запустить синхронизацию по узлу.'"); + ТекстСообщения = СтрШаблон(Шаблон, Строка(УзелИнформационнойБазы), Строка(СценарийВыполненияЧерезВнутреннююПубликацию)); + + Иначе + + Шаблон = НСтр("ru = 'Для узла ""%1"" уже выполняется синхронизация. + | + |Нажмите Далее, чтобы прервать текущую синхронизацию + |и запустить ее снова'"); + ТекстСообщения = СтрШаблон(Шаблон, Строка(УзелИнформационнойБазы)); + + КонецЕсли; + + Элементы.СтатусЗадачаВОчереди.Заголовок = ТекстСообщения; + + Иначе + + ПропуститьСтраницу = Истина; + + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +&НаСервере +Процедура ОтменитьОчередьИПродолжитьНаСервере() + + МодульОбменДаннымиВнутренняяПубликация = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВнутренняяПубликация"); + МодульОбменДаннымиВнутренняяПубликация.ОтменитьОчередьЗадач(УзелИнформационнойБазы, + СценарийВыполненияЧерезВнутреннююПубликацию, + ИдентификаторОбменаЧерезВнутреннююПубликацию); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтменитьОчередьИПродолжить(Команда) + ОтменитьОчередьИПродолжитьНаСервере(); + ВыполнитьПереходДалее(); +КонецПроцедуры + &НаКлиенте Функция Подключаемый_ОжиданиеЗапускаСинхронизации_ОбработкаДлительнойОперации(Отказ, ПерейтиДалее) @@ -837,6 +906,14 @@ Иначе ПриЗавершенииВыгрузкиДанных(); КонецЕсли; + ИначеЕсли ОбменЧерезВнутреннююПубликацию Тогда + ПриНачалеВыгрузкиДанныхЧерезВнутреннююПубликациюНаСервере(); + + ОбменДаннымиКлиент.ИнициализироватьПараметрыОбработчикаОжидания( + ПараметрыОбработчикаОжиданияВыгрузкиДанных); + + ПодключитьОбработчикОжидания("ПриОжиданииВыгрузкиДанныхЧерезВнутреннююПубликацию", + ПараметрыОбработчикаОжиданияВыгрузкиДанных.ТекущийИнтервал, Истина); Иначе ФоновоеЗаданиеВыполняемоеДействие = 2; ФоновоеЗаданиеЗапуститьНаКлиенте(ФоновоеЗаданиеВыполняемоеДействие, @@ -943,6 +1020,51 @@ КонецПроцедуры +&НаСервере +Процедура ПриНачалеВыгрузкиДанныхЧерезВнутреннююПубликациюНаСервере() + + МодульОбменДаннымиВнутренняяПубликация = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВнутренняяПубликация"); + МодульОбменДаннымиВнутренняяПубликация.ВыполнитьОбменДаннымиВручную(УзелИнформационнойБазы, ПараметрыОбменаЧерезВнутреннююПубликацию); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОжиданииВыгрузкиДанныхЧерезВнутреннююПубликацию() + + ПродолжитьОжидание = Ложь; + ПриОжиданииВыгрузкиДанныхЧерезВнутреннююПубликациюНаСервере(ПараметрыОбменаЧерезВнутреннююПубликацию, ПродолжитьОжидание); + + Если ПродолжитьОжидание Тогда + ОбменДаннымиКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжиданияВыгрузкиДанных); + + ПодключитьОбработчикОжидания("ПриОжиданииВыгрузкиДанныхЧерезВнутреннююПубликацию", + ПараметрыОбработчикаОжиданияВыгрузкиДанных.ТекущийИнтервал, Истина); + Иначе + ПриЗавершенииВыгрузкиДанныхЧерезВнутреннююПубликацию(); + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ПриОжиданииВыгрузкиДанныхЧерезВнутреннююПубликациюНаСервере(ПараметрыОбмена, ПродолжитьОжидание) + + МодульОбменДаннымиВнутренняяПубликация = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВнутренняяПубликация"); + МодульОбменДаннымиВнутренняяПубликация.ПриОжиданииВыгрузкиДанных(ПараметрыОбмена, ПродолжитьОжидание); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗавершенииВыгрузкиДанныхЧерезВнутреннююПубликацию() + + ЕстьОшибки = ЕстьОшибки Или ПараметрыОбменаЧерезВнутреннююПубликацию.Отказ; + + ВыводитьОписаниеОшибкиПользователю = Истина; + СообщениеОбОшибкеПользователю = ПараметрыОбменаЧерезВнутреннююПубликацию.СообщениеОбОшибке; + + ИзменитьПорядковыйНомерПерехода(+1); + +КонецПроцедуры + &НаКлиенте Функция Подключаемый_ЗавершениеОбмена_ПриОткрытии(Отказ, ПропуститьСтраницу, ЭтоПереходДалее) @@ -1437,6 +1559,11 @@ ТаблицаПереходов.Очистить(); ТаблицаПереходовНоваяСтрока("СтраницаСинхронизацияДанныхНедоступна", ""); + + Если ОбменЧерезВнутреннююПубликацию Тогда + ТаблицаПереходовНоваяСтрока("СтраницаПроверкаЗадачОбмена", "Подключаемый_СтраницаПроверкаЗадачОбмена_ПриОткрытии"); + КонецЕсли; + ТаблицаПереходовНоваяСтрока("ОжиданиеЗапускаСинхронизации", "", Истина, "Подключаемый_ОжиданиеЗапускаСинхронизации_ОбработкаДлительнойОперации"); // Инициализируем текущий сценарий работы обмена. @@ -1454,7 +1581,7 @@ ИмяСтраницыСинхронизацияВыгрузка = "ОжиданиеСинхронизацииДанных"; КонецЕсли; - Если ОбменМеждуПриложениямиВСервисе Тогда + Если ОбменМеждуПриложениямиВСервисе Или ОбменЧерезВнутреннююПубликацию Тогда // Получение и отправка. ТаблицаПереходовНоваяСтрока(ИмяСтраницыСинхронизацияВыгрузка, "Подключаемый_ВыгрузкаДанных_ПриОткрытии", Истина, "Подключаемый_ВыгрузкаДанных_ОбработкаДлительнойОперации"); ТаблицаПереходовНоваяСтрока(ИмяСтраницыСинхронизацияВыгрузка, , Истина, "Подключаемый_ВыгрузкаДанных_ОбработкаДлительнойОперации_Окончание"); diff --git a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/ManagerModule.bsl b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/ManagerModule.bsl index b055cd7b7..0b2d4dde8 100644 --- a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/ManagerModule.bsl @@ -73,7 +73,7 @@ // Процедура ВыполнитьЗагрузкуПолученногоИзИнтернетаФайла(ПараметрыЗадания, АдресХранилища) Экспорт - ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЗавершениеДлительнойОперации( + ОбменДаннымиВебСервис.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЗавершениеДлительнойОперации( ПараметрыЗадания.Отказ, ПараметрыЗадания.УзелИнформационнойБазы, ПараметрыЗадания.ИдентификаторФайлаСообщенияВСервисе, diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыборВидаОбъектов/Form.form b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыборВидаОбъектов/Form.form index f3d7d4371..3b65fcad8 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыборВидаОбъектов/Form.form +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыборВидаОбъектов/Form.form @@ -321,6 +321,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 35 + + СтрокаПоискаРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 36 + true + + ДоступныеОбъектыДляИзменения + + true + + Left true diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Form.form b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Form.form index 2270701d3..6e67305b8 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Form.form +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Form.form @@ -208,10 +208,22 @@ BeforeAddRow КомпоновщикНастроекНастройкиОтборПередНачаломДобавления + + OnActivateRow + КомпоновщикНастроекНастройкиОтборПриАктивизацииСтроки + + + OnStartEdit + КомпоновщикНастроекНастройкиОтборПриНачалеРедактирования + AfterDeleteRow КомпоновщикНастроекНастройкиОтборПослеУдаления + + OnChange + КомпоновщикНастроекНастройкиОтборПриИзменении + КомпоновщикНастроекНастройкиОтборSearchString 53 @@ -348,7 +360,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -383,7 +394,6 @@ ListSettings LoadDynamicListSettings SaveDynamicListSettings - SearchHistory СписокСсылка 87 @@ -470,10 +480,6 @@ Selection СписокВыбор - - OnActivateRow - СписокПриАктивизацииСтроки - СписокСтрокаПоиска 78 @@ -700,7 +706,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -916,6 +921,36 @@ true + + ВыполняетсяРедактированиеОтборов + 9 + + Boolean + + + true + + + true + + + + КоличествоУсловий + 10 + + Number + + 10 + true + + + + true + + + true + + ОК diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Module.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Module.bsl index 01d7c903e..1f69dddf8 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Module.bsl +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Module.bsl @@ -44,20 +44,53 @@ #Область ОбработчикиСобытийЭлементовТаблицыФормыКомпоновщикНастроекНастройкиОтбор +&НаКлиенте +Процедура КомпоновщикНастроекНастройкиОтборПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) + + ОтключитьОбработчикОжидания("ОбновитьКоличествоВыбранных"); + ОтключитьОбработчикОжидания("ОбновитьСписокВыбранных"); + ВыполняетсяРедактированиеОтборов = Истина; + +КонецПроцедуры + &НаКлиенте Процедура КомпоновщикНастроекНастройкиОтборПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) + + ВыполняетсяРедактированиеОтборов = Ложь; ИнициализироватьОбновлениеСпискаВыбранных(); + КонецПроцедуры &НаКлиенте Процедура КомпоновщикНастроекНастройкиОтборПослеУдаления(Элемент) + ИнициализироватьОбновлениеСпискаВыбранных(); + КонецПроцедуры &НаКлиенте Процедура КомпоновщикНастроекНастройкиОтборПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + ОтключитьОбработчикОжидания("ОбновитьКоличествоВыбранных"); ОтключитьОбработчикОжидания("ОбновитьСписокВыбранных"); + +КонецПроцедуры + +&НаКлиенте +Процедура КомпоновщикНастроекНастройкиОтборПриАктивизацииСтроки(Элемент) + + КоличествоЭлементовОтбора = КоличествоЭлементовОтбора(КомпоновщикНастроек.Настройки.Отбор.Элементы); + Если КоличествоУсловий <> КоличествоЭлементовОтбора Тогда + ИнициализироватьОбновлениеСпискаВыбранных(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура КомпоновщикНастроекНастройкиОтборПриИзменении(Элемент) + + ИнициализироватьОбновлениеСпискаВыбранных(); + КонецПроцедуры #КонецОбласти @@ -71,14 +104,6 @@ КонецЕсли; КонецПроцедуры -&НаКлиенте -Процедура СписокПриАктивизацииСтроки(Элемент) - ОтключитьОбработчикОжидания("ОбновитьКоличествоВыбранных"); - Если Элементы.ГруппаВыбранныеОбъекты.Видимость Тогда - ПодключитьОбработчикОжидания("ОбновитьКоличествоВыбранных", 0.1, Истина); - КонецЕсли; -КонецПроцедуры - #КонецОбласти #Область ОбработчикиКомандФормы @@ -175,10 +200,19 @@ &НаКлиенте Процедура ИнициализироватьОбновлениеСпискаВыбранных() + ОтключитьОбработчикОжидания("ОбновитьСписокВыбранных"); + + Если ВыполняетсяРедактированиеОтборов Тогда + Возврат; + КонецЕсли; + + КоличествоУсловий = КоличествоЭлементовОтбора(КомпоновщикНастроек.Настройки.Отбор.Элементы); + Если Элементы.ГруппаВыбранныеОбъекты.Видимость Тогда ПодключитьОбработчикОжидания("ОбновитьСписокВыбранных", 1, Истина); КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -237,4 +271,20 @@ Возврат Результат; КонецФункции +&НаКлиенте +Функция КоличествоЭлементовОтбора(КоллекцияЭлементовОтбора) + + Результат = 0; + + Для Каждого Элемент Из КоллекцияЭлементовОтбора Цикл + Результат = Результат + 1; + Если ТипЗнч(Элемент) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда + Результат = Результат + КоличествоЭлементовОтбора(Элемент.Элементы); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ДополнительныеПараметры/Form.form b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ДополнительныеПараметры/Form.form index 8e8c53a0a..39ae78fd9 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ДополнительныеПараметры/Form.form +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ДополнительныеПараметры/Form.form @@ -74,7 +74,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -147,7 +146,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -220,7 +218,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -296,7 +293,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -373,7 +369,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -446,7 +441,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/РедактированиеФормулы/Form.form b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/РедактированиеФормулы/Form.form index fad46a869..93a1c602d 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/РедактированиеФормулы/Form.form +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/РедактированиеФормулы/Form.form @@ -871,7 +871,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -1091,7 +1090,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -1122,7 +1120,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1192,7 +1189,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/РедактированиеФормулы/Module.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/РедактированиеФормулы/Module.bsl index ecac56fd6..91cd1a00a 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/РедактированиеФормулы/Module.bsl +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/РедактированиеФормулы/Module.bsl @@ -493,7 +493,6 @@ КонецЕсли; Попытка - //@skip-warning РезультатРасчета = Вычислить(ТекстРасчета); Исключение ТекстОшибки = НСтр("ru = 'В формуле обнаружены ошибки. Проверьте формулу. diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Form.form b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Form.form index 6381c8e38..b6f8f1f57 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Form.form @@ -130,7 +130,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -583,7 +582,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -785,7 +783,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1162,7 +1159,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1191,7 +1187,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1350,7 +1345,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>DontUse</throughAlign> @@ -2011,7 +2005,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2142,7 +2135,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2270,7 +2262,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2488,7 +2479,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2539,70 +2529,6 @@ </settingsSavedData> <main>true</main> </attributes> - <attributes> - <name>ТОНастройкаПорции</name> - <id>3</id> - <valueType> - <types>Number</types> - <numberQualifiers> - <precision>1</precision> - <nonNegative>true</nonNegative> - </numberQualifiers> - </valueType> - <view> - <common>true</common> - </view> - <edit> - <common>true</common> - </edit> - </attributes> - <attributes> - <name>ТОЧислоОбъектовВПорции</name> - <id>5</id> - <valueType> - <types>Number</types> - <numberQualifiers> - <precision>5</precision> - <nonNegative>true</nonNegative> - </numberQualifiers> - </valueType> - <view> - <common>true</common> - </view> - <edit> - <common>true</common> - </edit> - </attributes> - <attributes> - <name>ТОПроцентОбъектовВПорции</name> - <id>4</id> - <valueType> - <types>Number</types> - <numberQualifiers> - <precision>3</precision> - <nonNegative>true</nonNegative> - </numberQualifiers> - </valueType> - <view> - <common>true</common> - </view> - <edit> - <common>true</common> - </edit> - </attributes> - <attributes> - <name>ЕстьФормаРазблокированияРеквизитов</name> - <id>6</id> - <valueType> - <types>Boolean</types> - </valueType> - <view> - <common>true</common> - </view> - <edit> - <common>true</common> - </edit> - </attributes> <attributes> <name>ПолноеИмяФормыРаботыСБлокируемымиРеквизитами</name> <id>7</id> diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Module.bsl index fbeacdcd7..34497b8e7 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Module.bsl @@ -6,6 +6,13 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// +#Область ОписаниеПеременных + +&НаКлиенте +Перем ТекущийВыбранныйРеквизит; + +#КонецОбласти + #Область ОбработчикиСобытийФормы &НаСервере @@ -16,7 +23,6 @@ Параметры.Свойство("ДополнительнаяОбработкаСсылка", ДополнительнаяОбработкаСсылка); КонтекстныйВызов = ТипЗнч(Параметры.МассивОбъектов) = Тип("Массив"); - ЗагрузитьНастройкиОбработки(); Элементы.ФормаНазад.Видимость = Ложь; ЗапретРедактированияВстроен = Метаданные.НайтиПоПолномуИмени("ОбщийМодуль.ЗапретРедактированияРеквизитовОбъектовКлиент") <> Неопределено; @@ -31,7 +37,7 @@ ЗаполнитьСписокТиповОбъектов(); КонецЕсли; - НайтиФормуРазблокированияРеквизитов(); + ЗагрузитьНастройкиОбработки(); СформироватьПояснениеОНастроенныхИзменениях(); ОбновитьВидимостьЭлементов(); @@ -65,10 +71,6 @@ ЗаполнитьСписокТиповОбъектов(); КонецЕсли; - ТОНастройкаПорции = ВыбранноеЗначение.НастройкаПорции; - ТОПроцентОбъектовВПорции = ВыбранноеЗначение.ПроцентОбъектовВПорции; - ТОЧислоОбъектовВПорции = ВыбранноеЗначение.ЧислоОбъектовВПорции; - Если ПерезаполнитьСтруктуруРеквизитовОбъекта И Не ПустаяСтрока(ВидыИзменяемыхОбъектов) Тогда СохраненныеНастройки = Неопределено; ЗагрузитьМетаданныеОбъекта(Истина, СохраненныеНастройки); @@ -78,8 +80,7 @@ КонецЕсли; ОбновитьВидимостьЭлементов(); - СохранитьНастройкиОбработки(Объект.ИзменятьВТранзакции, Объект.ПрерыватьПриОшибке, - ТОНастройкаПорции, ТОПроцентОбъектовВПорции, ТОЧислоОбъектовВПорции, ОбрабатыватьРекурсивно); + СохранитьНастройкиОбработки(Объект.ИзменятьВТранзакции, Объект.ПрерыватьПриОшибке, ОбрабатыватьРекурсивно); КонецЕсли; КонецЕсли; @@ -120,7 +121,7 @@ ВыбранныеОбъектыВКонтексте.Очистить(); ПерестроитьИнтерфейсФормыДляВыбранногоВидаОбъектов(); Если Не КонтекстныйВызов Тогда - СохранитьВидыИзменяемыхОбъектов(ВидыИзменяемыхОбъектов); + СохранитьВидыИзменяемыхОбъектов(ВидыИзменяемыхОбъектов, АдресСпискаВыбранных); КонецЕсли; КонецЕсли; @@ -329,9 +330,6 @@ ПараметрыФормы.Вставить("ИзменятьВТранзакции", Объект.ИзменятьВТранзакции); ПараметрыФормы.Вставить("ОбрабатыватьРекурсивно", ОбрабатыватьРекурсивно); ПараметрыФормы.Вставить("ПрерыватьПриОшибке", Объект.ПрерыватьПриОшибке); - ПараметрыФормы.Вставить("НастройкаПорции", ТОНастройкаПорции); - ПараметрыФормы.Вставить("ПроцентОбъектовВПорции", ТОПроцентОбъектовВПорции); - ПараметрыФормы.Вставить("ЧислоОбъектовВПорции", ТОЧислоОбъектовВПорции); ПараметрыФормы.Вставить("УчитыватьИерархию", УчитыватьИерархию); ПараметрыФормы.Вставить("ПоказыватьСлужебныеРеквизиты", Объект.ПоказыватьСлужебныеРеквизиты); ПараметрыФормы.Вставить("КонтекстныйВызов", КонтекстныйВызов); @@ -391,7 +389,8 @@ Или Элемент.ТекущийЭлемент = Элементы.РеквизитыОбъектаИзменять) И Элемент.ТекущиеДанные.ЗаблокированныйРеквизит Тогда Отказ = Истина; - ВопросПерейтиКРазблокированиюРеквизитов(Элемент.ТекущиеДанные); + ТекущийВыбранныйРеквизит = Элемент.ТекущиеДанные; + ПодключитьОбработчикОжидания("РазрешитьРедактированиеРеквизитов", 0.1, Истина); КонецЕсли; КонецПроцедуры @@ -471,9 +470,9 @@ ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; + //@skip-check new-color Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", Новый Цвет(192, 192, 192)); // АПК:1346 - автономная обработка не может использовать стили - // Пояснения по связанным реквизитам Для Каждого Реквизит Из РеквизитыОбъекта Цикл @@ -737,43 +736,37 @@ КонецПроцедуры &НаКлиенте -Процедура ВопросПерейтиКРазблокированиюРеквизитов(ВыбранныйРеквизит) +Процедура ВопросРазблокированияРеквизита(ВыбранныйРеквизит) Кнопки = Новый СписокЗначений; - - Если КонтекстныйВызов Тогда - Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Перейти'")); - ТекстВопроса = НСтр("ru = 'Реквизит заблокирован, перейти к разблокированию реквизитов?'"); - Иначе - Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Разблокировать'")); - ТекстВопроса = ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для того чтобы не допустить рассогласования данных в программе, - |реквизит ""%1"" не доступен для редактирования. - | - |Перед тем, как разрешить его редактирование, рекомендуется оценить последствия, - |проверив все места использования выбранных элементов в программе. - | - |Разблокировать реквизит ""%1"" для изменения?'"), - ВыбранныйРеквизит.Представление); - КонецЕсли; + Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Разблокировать'")); + ТекстВопроса = ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для того чтобы не допустить рассогласования данных в программе, + |реквизит ""%1"" не доступен для редактирования. + | + |Перед тем, как разрешить его редактирование, рекомендуется оценить последствия, + |проверив все места использования выбранных элементов в программе. + | + |Разблокировать реквизит ""%1"" для изменения?'"), + ВыбранныйРеквизит.Представление); Кнопки.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'")); - ОписаниеОповещения = Новый ОписаниеОповещения("ВопросПерейтиКРазблокированиюРеквизитовЗавершение", ЭтотОбъект, ВыбранныйРеквизит); + ОписаниеОповещения = Новый ОписаниеОповещения("ВопросРазблокированияРеквизитаЗавершение", ЭтотОбъект, ВыбранныйРеквизит); ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки, , КодВозвратаДиалога.Да, НСтр("ru = 'Реквизит заблокирован'")); КонецПроцедуры &НаКлиенте -Процедура ВопросПерейтиКРазблокированиюРеквизитовЗавершение(РезультатВопроса, ОписаниеРеквизита) Экспорт +Процедура ВопросРазблокированияРеквизитаЗавершение(Ответ, ОписаниеРеквизита) Экспорт - Если РезультатВопроса = КодВозвратаДиалога.Да Тогда - РазрешитьРедактированиеРеквизитов(ОписаниеРеквизита); + Если Ответ = КодВозвратаДиалога.Да Тогда + ОписаниеРеквизита.ЗаблокированныйРеквизит = Ложь; КонецЕсли; КонецПроцедуры -&НаСервере +&НаСервереБезКонтекста Процедура УстановитьПараметрыВыбораСервер(ПараметрыВыбора, ПараметрыВыбораМассив) Для Индекс = 1 По СтрЧислоСтрок(ПараметрыВыбора) Цикл @@ -802,8 +795,7 @@ КонецПроцедуры &НаСервереБезКонтекста -Процедура СохранитьНастройкиОбработки(ИзменятьВТранзакции, ПрерыватьПриОшибке, - ТОНастройкаПорции, ТОПроцентОбъектовВПорции, ТОЧислоОбъектовВПорции, ОбрабатыватьРекурсивно) +Процедура СохранитьНастройкиОбработки(ИзменятьВТранзакции, ПрерыватьПриОшибке, ОбрабатыватьРекурсивно) Если Не ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда Возврат; @@ -812,16 +804,15 @@ СтруктураНастроек = СтруктураНастроек(); СтруктураНастроек.ИзменятьВТранзакции = ИзменятьВТранзакции; СтруктураНастроек.ПрерыватьПриОшибке = ПрерыватьПриОшибке; - СтруктураНастроек.ТОНастройкаПорции = ТОНастройкаПорции; - СтруктураНастроек.ТОПроцентОбъектовВПорции = ТОПроцентОбъектовВПорции; - СтруктураНастроек.ТОЧислоОбъектовВПорции = ТОЧислоОбъектовВПорции; СтруктураНастроек.ОбрабатыватьРекурсивно = ОбрабатыватьРекурсивно; ХранилищеОбщихНастроекСохранить("Обработка.ГрупповоеИзменениеОбъектов", "", СтруктураНастроек); КонецПроцедуры &НаСервереБезКонтекста -Процедура СохранитьВидыИзменяемыхОбъектов(ВидыИзменяемыхОбъектов) +Процедура СохранитьВидыИзменяемыхОбъектов(ВидыИзменяемыхОбъектов, АдресСпискаВыбранных) + + ОчиститьВременноеХранилищеСпискаВыбранных(АдресСпискаВыбранных); Если Не ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда Возврат; @@ -836,9 +827,6 @@ СтруктураНастроек = Новый Структура; СтруктураНастроек.Вставить("ИзменятьВТранзакции", Истина); СтруктураНастроек.Вставить("ПрерыватьПриОшибке", Истина); - СтруктураНастроек.Вставить("ТОНастройкаПорции", 1); - СтруктураНастроек.Вставить("ТОПроцентОбъектовВПорции", 100); - СтруктураНастроек.Вставить("ТОЧислоОбъектовВПорции", 1); СтруктураНастроек.Вставить("ОбрабатыватьРекурсивно", Ложь); Возврат СтруктураНастроек; @@ -864,9 +852,6 @@ Объект.ИзменятьВТранзакции = СтруктураНастроек.ИзменятьВТранзакции; Объект.ПрерыватьПриОшибке = СтруктураНастроек.ПрерыватьПриОшибке; ОбрабатыватьРекурсивно = СтруктураНастроек.ОбрабатыватьРекурсивно; - ТОНастройкаПорции = СтруктураНастроек.ТОНастройкаПорции; - ТОПроцентОбъектовВПорции = СтруктураНастроек.ТОПроцентОбъектовВПорции; - ТОЧислоОбъектовВПорции = СтруктураНастроек.ТОЧислоОбъектовВПорции; Если ПравоДоступа("АдминистрированиеДанных", Метаданные) И СтруктураНастроек.Свойство("ПоказыватьСлужебныеРеквизиты") Тогда Объект.ПоказыватьСлужебныеРеквизиты = СтруктураНастроек.ПоказыватьСлужебныеРеквизиты; Иначе @@ -891,7 +876,10 @@ Для Каждого ИмяОбъектаМетаданных Из СтрРазделить(ВидыИзменяемыхОбъектов, ",", Ложь) Цикл ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаМетаданных); Если ОбъектМетаданных <> Неопределено Тогда - СписокВидов.Добавить(ОбъектМетаданных.ПолноеИмя()); + ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); + Если Элементы.ПредставлениеИзменяемыхОбъектов.СписокВыбора.НайтиПоЗначению(ПолноеИмя) <> Неопределено Тогда + СписокВидов.Добавить(ПолноеИмя); + КонецЕсли; КонецЕсли; КонецЦикла; @@ -938,65 +926,36 @@ КонецФункции &НаКлиенте -Процедура РазрешитьРедактированиеРеквизитов(ВыбранныйРеквизит) +Процедура РазрешитьРедактированиеРеквизитов() - Если Не КонтекстныйВызов Тогда - ВыбранныйРеквизит.ЗаблокированныйРеквизит = Ложь; + ВыбранныйРеквизит = ТекущийВыбранныйРеквизит; + + Если Не ПодсистемаСуществует("СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов") + Или ОбщийМодуль("ЗапретРедактированияРеквизитовОбъектовКлиент") = Неопределено Тогда + + ВопросРазблокированияРеквизита(ВыбранныйРеквизит); Возврат; КонецЕсли; + ЗаблокированныеРеквизиты = Новый Массив; ЗаблокированныеРеквизитыСтроки = РеквизитыОбъекта.НайтиСтроки( Новый Структура("ЗаблокированныйРеквизит", Истина)); - Если ЕстьФормаРазблокированияРеквизитов Тогда - - ЗаблокированныеРеквизиты = Новый Массив; - - Для Каждого ОписаниеОперацииСтрока Из ЗаблокированныеРеквизитыСтроки Цикл - ЗаблокированныеРеквизиты.Добавить(ОписаниеОперацииСтрока.Имя); - КонецЦикла; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("РежимВыбора", Истина); - ПараметрыФормы.Вставить("ЗаблокированныеРеквизиты", ЗаблокированныеРеквизиты); - - ОписаниеОповещения = Новый ОписаниеОповещения("ПриРазблокированииРеквизитов", ЭтотОбъект); - ОткрытьФорму(ПолноеИмяФормыРаботыСБлокируемымиРеквизитами, ПараметрыФормы, ЭтотОбъект, , , , ОписаниеОповещения); - - Иначе - МассивСсылок = Новый Массив; - ЗаполнитьМассивИзменяемыхОбъектов(МассивСсылок); - - СинонимыРеквизитов = Новый Массив; - - Для Каждого ОписаниеОперацииСтрока Из ЗаблокированныеРеквизитыСтроки Цикл - СинонимыРеквизитов.Добавить(ОписаниеОперацииСтрока.Представление); - КонецЦикла; - - Если ПодсистемаСуществует("СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов") Тогда - МодульЗапретРедактированияРеквизитовОбъектовКлиент = ОбщийМодуль("ЗапретРедактированияРеквизитовОбъектовКлиент"); - Если МодульЗапретРедактированияРеквизитовОбъектовКлиент <> Неопределено Тогда - МодульЗапретРедактированияРеквизитовОбъектовКлиент.ПроверитьСсылкиНаОбъект( - Новый ОписаниеОповещения("РазрешитьРедактированиеРеквизитовЗавершение", ЭтотОбъект, - ЗаблокированныеРеквизитыСтроки), - МассивСсылок, СинонимыРеквизитов); - КонецЕсли; - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура РазрешитьРедактированиеРеквизитовЗавершение(Результат, ЗаблокированныеРеквизитыСтроки) Экспорт - - Если Результат <> Истина Тогда - Возврат; - КонецЕсли; - Для Каждого ОписаниеОперацииСтрока Из ЗаблокированныеРеквизитыСтроки Цикл - ОписаниеОперацииСтрока.ЗаблокированныйРеквизит = Ложь; + ЗаблокированныеРеквизиты.Добавить(ОписаниеОперацииСтрока.Имя); КонецЦикла; + МодульЗапретРедактированияРеквизитовОбъектовКлиент = ОбщийМодуль("ЗапретРедактированияРеквизитовОбъектовКлиент"); + + ПараметрыПроцедуры = МодульЗапретРедактированияРеквизитовОбъектовКлиент.НовыеПараметрыРазрешитьРедактированиеРеквизитовОбъектов(); + ПараметрыПроцедуры.ОбработкаРезультата = Новый ОписаниеОповещения("ПриРазблокированииРеквизитов", ЭтотОбъект); + ПараметрыПроцедуры.ПолноеИмяОбъекта = СтрРазделить(ВидыИзменяемыхОбъектов, ",", Ложь)[0]; + ПараметрыПроцедуры.ЗаблокированныеРеквизиты = ЗаблокированныеРеквизиты; + ПараметрыПроцедуры.ОтмеченныйРеквизит = ВыбранныйРеквизит.Имя; + ПараметрыПроцедуры.АдресСсылокНаОбъекты = АдресМассиваИзменяемыхОбъектов(); + + МодульЗапретРедактированияРеквизитовОбъектовКлиент.РазрешитьРедактированиеРеквизитовОбъектов(ПараметрыПроцедуры); + КонецПроцедуры &НаКлиенте @@ -1035,31 +994,10 @@ КоличествоОбъектовДляОбработки = КоличествоВыбранныхОбъектов(Истина, Истина); Если Объект.ИзменятьВТранзакции Тогда - - Если ТОНастройкаПорции = 1 Тогда // обработка одним вызовом - - ПоказатьОповещениеПользователя(НСтр("ru = 'Изменение выделенных элементов'"), ,НСтр("ru = 'Пожалуйста подождите, обработка может занять некоторое время...'")); - ПоказыватьПроцентОбработанных = Ложь; - - РазмерПорции = КоличествоОбъектовДляОбработки; - - Иначе - - ПоказыватьПроцентОбработанных = Истина; - - Если ТОНастройкаПорции = 2 Тогда // порциями по числу объектов - РазмерПорции = ?(ТОЧислоОбъектовВПорции < КоличествоОбъектовДляОбработки, - ТОЧислоОбъектовВПорции, КоличествоОбъектовДляОбработки); - Иначе // Порциями по проценту объектов. - РазмерПорции = Окр(КоличествоОбъектовДляОбработки * ТОПроцентОбъектовВПорции / 100); - Если РазмерПорции = 0 Тогда - РазмерПорции = 1; - КонецЕсли; - КонецЕсли; - - КонецЕсли; + ПоказатьОповещениеПользователя(НСтр("ru = 'Изменение выделенных элементов'"), ,НСтр("ru = 'Пожалуйста подождите, обработка может занять некоторое время...'")); + ПоказыватьПроцентОбработанных = Ложь; + РазмерПорции = КоличествоОбъектовДляОбработки; Иначе - Если КоличествоОбъектовДляОбработки >= НетранзакционнаяПорцияГраницаПерехода() Тогда // Число объектов - постоянная величина. РазмерПорции = НетранзакционнаяПорцияПолученияДанныхОбъектов(); @@ -1492,13 +1430,14 @@ КонецПроцедуры &НаСервере -Процедура ЗаполнитьМассивИзменяемыхОбъектов(МассивСсылок) +Функция АдресМассиваИзменяемыхОбъектов() - Для Каждого ВыбранныйОбъект Из ВыбранныеОбъекты().Строки Цикл - МассивСсылок.Добавить(ВыбранныйОбъект.Ссылка); - КонецЦикла; + ВыбранныеОбъекты = ВыбранныеОбъекты(); + Ссылки = ВыбранныеОбъекты.Строки.ВыгрузитьКолонку("Ссылка"); -КонецПроцедуры + Возврат ПоместитьВоВременноеХранилище(Ссылки, УникальныйИдентификатор); + +КонецФункции &НаСервереБезКонтекста Функция ОбъектМетаданныхИерархический(СсылкаПервого) @@ -1576,6 +1515,7 @@ Если ТипЗнч(Настройки) = Тип("НастройкиКомпоновкиДанных") Тогда КомпоновщикНастроек.ЗагрузитьНастройки(Настройки); ОбновитьНадписи(); + ОчиститьВременноеХранилищеСпискаВыбранных(АдресСпискаВыбранных); КонецЕсли; КонецПроцедуры @@ -1644,7 +1584,7 @@ МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроекКомпоновкиДанных.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); Исключение - ТекстСообщенияОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстСообщенияОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Возврат Результат; КонецПопытки; @@ -1663,6 +1603,16 @@ КонецФункции +&НаСервереБезКонтекста +Процедура ОчиститьВременноеХранилищеСпискаВыбранных(АдресСпискаВыбранных) + + Если ЗначениеЗаполнено(АдресСпискаВыбранных) Тогда + УдалитьИзВременногоХранилища(АдресСпискаВыбранных); + АдресСпискаВыбранных = ""; + КонецЕсли; + +КонецПроцедуры + &НаСервере Процедура УстановитьНастройкуСтруктурыВыводаРезультата(Настройки, ДляИзменения = Ложь) @@ -1739,7 +1689,7 @@ ПерестроитьИнтерфейсФормыДляВыбранногоВидаОбъектов(); Элементы.РеквизитыОбъектаАлгоритм.ОтборСтрок = Новый ФиксированнаяСтруктура(Новый Структура("ВидОперации", "1")); Если Не КонтекстныйВызов Тогда - СохранитьВидыИзменяемыхОбъектов(ВидыИзменяемыхОбъектов); + СохранитьВидыИзменяемыхОбъектов(ВидыИзменяемыхОбъектов, АдресСпискаВыбранных); КонецЕсли; КонецЕсли; КонецПроцедуры @@ -1755,7 +1705,6 @@ Процедура ИнициализироватьНастройкиФормы() ИнициализироватьКомпоновщикНастроек(); ЗагрузитьМетаданныеОбъекта(); - НайтиФормуРазблокированияРеквизитов(); ЗагрузитьИсториюОпераций(); ЗаполнитьПодменюРанееИзмененныеРеквизиты(); ПредставлениеИзменяемыхОбъектов = ПредставлениеИзменяемыхОбъектов(); @@ -1940,28 +1889,6 @@ КонецФункции -&НаСервереБезКонтекста -Функция МетодыМенеджераОбъектаДляРедактированияРеквизитов(ИмяОбъекта) - - МодульИнтеграцияПодсистемБСП = ОбщийМодуль("ИнтеграцияПодсистемБСП"); - МодульГрупповоеИзменениеОбъектовПереопределяемый = ОбщийМодуль("ГрупповоеИзменениеОбъектовПереопределяемый"); - Если МодульИнтеграцияПодсистемБСП = Неопределено Или МодульГрупповоеИзменениеОбъектовПереопределяемый = Неопределено Тогда - Возврат Новый Массив; - КонецЕсли; - - ОбъектыСЗаблокированнымиРеквизитами = Новый Соответствие; - МодульИнтеграцияПодсистемБСП.ПриОпределенииОбъектовСРедактируемымиРеквизитами(ОбъектыСЗаблокированнымиРеквизитами); - МодульГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами(ОбъектыСЗаблокированнымиРеквизитами); - - СведенияОМенеджереОбъекта = ОбъектыСЗаблокированнымиРеквизитами[ИмяОбъекта]; - Если СведенияОМенеджереОбъекта = Неопределено Тогда - Возврат "НеПоддерживается"; - КонецЕсли; - ДоступныеМетоды = СтрРазделить(СведенияОМенеджереОбъекта, Символы.ПС, Ложь); - Возврат ДоступныеМетоды; - -КонецФункции - &НаСервере Функция НередактируемыеРеквизиты() @@ -1970,58 +1897,32 @@ КонецЕсли; Результат = Новый Массив; - Для Каждого ВидИзменяемыхОбъектов Из СтрРазделить(ВидыИзменяемыхОбъектов, ",", Ложь) Цикл + ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); - ВерсияБСПСоответствуетТребованиям = ВерсияБСПСоответствуетТребованиям(); - Если ВерсияБСПСоответствуетТребованиям Тогда - ДоступныеМетоды = МетодыМенеджераОбъектаДляРедактированияРеквизитов(ВидИзменяемыхОбъектов); - Если ТипЗнч(ДоступныеМетоды) = Тип("Массив") И (ДоступныеМетоды.Количество() = 0 - Или ДоступныеМетоды.Найти("РеквизитыНеРедактируемыеВГрупповойОбработке") <> Неопределено) Тогда - МенеджерОбъекта = МенеджерОбъектаПоПолномуИмени(ВидИзменяемыхОбъектов); - НеРедактируемые = МенеджерОбъекта.РеквизитыНеРедактируемыеВГрупповойОбработке(); - Иначе - НеРедактируемые = Новый Массив; - КонецЕсли; - Иначе - // В конфигурациях без БСП или на старых версиях БСП, пытаемся определить, - // есть ли у объекта нередактируемые реквизиты. - МенеджерОбъекта = МенеджерОбъектаПоПолномуИмени(ВидИзменяемыхОбъектов); - Попытка - НеРедактируемые = МенеджерОбъекта.РеквизитыНеРедактируемыеВГрупповойОбработке(); - Исключение - // метод не найден - НеРедактируемые = Новый Массив; - КонецПопытки; - КонецЕсли; - - Если НеРедактируемые.Количество() > 0 Тогда - Возврат НеРедактируемые; - КонецЕсли; + ИменаРеквизитов = Новый Соответствие; + + Для Каждого ВидИзменяемыхОбъектов Из СтрРазделить(ВидыИзменяемыхОбъектов, ",", Ложь) Цикл + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ВидИзменяемыхОбъектов); + НастройкиРедактированияРеквизитов = ОбработкаОбъект.НастройкиРедактированияРеквизитов(ОбъектМетаданных); + Редактируемые = НастройкиРедактированияРеквизитов.Редактируемые; + НеРедактируемые = НастройкиРедактированияРеквизитов.НеРедактируемые; - Если ВерсияБСПСоответствуетТребованиям Тогда - Если ТипЗнч(ДоступныеМетоды) = Тип("Массив") И (ДоступныеМетоды.Количество() = 0 - Или ДоступныеМетоды.Найти("РеквизитыРедактируемыеВГрупповойОбработке") <> Неопределено) Тогда - Если МенеджерОбъекта = Неопределено Тогда - МенеджерОбъекта = МенеджерОбъектаПоПолномуИмени(ВидИзменяемыхОбъектов); - КонецЕсли; - Редактируемые = МенеджерОбъекта.РеквизитыРедактируемыеВГрупповойОбработке(); + Если ЗначениеЗаполнено(НеРедактируемые) Тогда + Если НеРедактируемые.Найти("*") = Неопределено Тогда + Для Каждого ИмяРеквизита Из НеРедактируемые Цикл + ИменаРеквизитов.Вставить(ИмяРеквизита); + КонецЦикла; + Продолжить; Иначе - Редактируемые = Неопределено; + Редактируемые = Новый Массив; КонецЕсли; Иначе - // В конфигурациях без БСП или на старых версиях БСП, пытаемся определить, - // есть ли у объекта редактируемые реквизиты. - Попытка - Редактируемые = МенеджерОбъекта.РеквизитыРедактируемыеВГрупповойОбработке(); - Исключение - Редактируемые = Неопределено; - КонецПопытки; - КонецЕсли; - - Если Редактируемые = Неопределено Или Редактируемые.Найти("*") <> Неопределено Тогда - Возврат НеРедактируемые; + Если Редактируемые = Неопределено Или ТипЗнч(Редактируемые) = Тип("Массив") И Редактируемые.Найти("*") <> Неопределено Тогда + Продолжить; + КонецЕсли; КонецЕсли; + НеРедактируемые = Новый Массив; ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ВидИзменяемыхОбъектов); ОписаниеСтандартныхРеквизитов = ОбъектМетаданных.СтандартныеРеквизиты;// массив из ОписаниеСтандартногоРеквизита Для Каждого ОписаниеРеквизита Из ОписаниеСтандартныхРеквизитов Цикл @@ -2051,13 +1952,16 @@ НеРедактируемые.Удалить(Индекс); КонецЦикла; - Для Каждого Реквизит Из НеРедактируемые Цикл - Если Результат.Найти(Реквизит) = Неопределено Тогда - Результат.Добавить(Реквизит); - КонецЕсли; + Для Каждого ИмяРеквизита Из НеРедактируемые Цикл + ИменаРеквизитов.Вставить(ИмяРеквизита); КонецЦикла; КонецЦикла; + Для Каждого Элемент Из ИменаРеквизитов Цикл + ИмяРеквизита = Элемент.Ключ; + Результат.Добавить(ИмяРеквизита); + КонецЦикла; + Возврат Результат; КонецФункции @@ -2536,6 +2440,8 @@ ОбщийСписокРеквизитов = ОбработкаОбъект.ПересечениеМножеств(ОбщийСписокРеквизитов, СписокСвойствДляВидаОбъектов(СписокВидовИзменяемыхОбъектов[Индекс])); КонецЦикла; + ДобавляемыеСвойства = Новый Массив; + Если КонтекстныйВызов Тогда НастройкиОтбора = НастройкиОтбора(); НастройкиОтбора.ОбновитьСписок = Истина; @@ -2559,27 +2465,32 @@ Продолжить; КонецЕсли; - ДобавитьСвойствоВСписокРеквизитов(Свойство); + ДобавляемыеСвойства.Добавить(Свойство); КонецЦикла; КонецЦикла; Иначе - Для Каждого Реквизит Из ОбщийСписокРеквизитов Цикл - ДобавитьСвойствоВСписокРеквизитов(Реквизит); - КонецЦикла; + ДобавляемыеСвойства = ОбщийСписокРеквизитов; КонецЕсли; + ДобавитьСвойстваВСписокРеквизитов(ДобавляемыеСвойства); РеквизитыОбъекта.Сортировать("Представление"); КонецПроцедуры &НаСервере -Процедура ДобавитьСвойствоВСписокРеквизитов(Свойство) - ОписаниеСвойства = ЗначенияРеквизитовОбъекта(Свойство, "Ссылка,Наименование,ТипЗначения,ЭтоДополнительноеСведение"); - ОписаниеРеквизита = РеквизитыОбъекта.Добавить(); - ОписаниеРеквизита.ВидОперации = ?(ОписаниеСвойства.ЭтоДополнительноеСведение, 3, 2); - ОписаниеРеквизита.Свойство = ОписаниеСвойства.Ссылка; - ОписаниеРеквизита.Представление = ОписаниеСвойства.Наименование; - ОписаниеРеквизита.ДопустимыеТипы = ОписаниеСвойства.ТипЗначения; +Процедура ДобавитьСвойстваВСписокРеквизитов(Свойства) + + МодульОбщегоНазначения = ОбщийМодуль("ОбщегоНазначения"); + ОписанияСвойств = МодульОбщегоНазначения.ЗначенияРеквизитовОбъектов(Свойства, "Ссылка,Наименование,ТипЗначения,ЭтоДополнительноеСведение"); + Для Каждого Свойство Из Свойства Цикл + ОписаниеСвойства = ОписанияСвойств[Свойство]; + ОписаниеРеквизита = РеквизитыОбъекта.Добавить(); + ОписаниеРеквизита.ВидОперации = ?(ОписаниеСвойства.ЭтоДополнительноеСведение, 3, 2); + ОписаниеРеквизита.Свойство = ОписаниеСвойства.Ссылка; + ОписаниеРеквизита.Представление = ОписаниеСвойства.Наименование; + ОписаниеРеквизита.ДопустимыеТипы = ОписаниеСвойства.ТипЗначения; + КонецЦикла; + КонецПроцедуры &НаСервере @@ -3361,43 +3272,37 @@ Попытка Возврат Вычислить(Выражение) = Неопределено; Исключение - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Возврат Истина; КонецПопытки; КонецФункции -&НаСервере -Процедура НайтиФормуРазблокированияРеквизитов() - ЕстьФормаРазблокированияРеквизитов = Ложь; - ПолноеИмяФормыРаботыСБлокируемымиРеквизитами = ""; - СписокВидовИзменяемыхОбъектов = СтрРазделить(ВидыИзменяемыхОбъектов, ",", Ложь); - Если СписокВидовИзменяемыхОбъектов.Количество() = 1 Тогда - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(СписокВидовИзменяемыхОбъектов[0]); - Если ЗапретРедактированияВстроен И РеквизитыОбъекта.НайтиСтроки(Новый Структура("ЗаблокированныйРеквизит", Истина)).Количество() > 0 Тогда - ОбъектМетаданныхФорма = МетаданныеОбъекта.Формы.Найти("РазблокированиеРеквизитов"); - Если ОбъектМетаданныхФорма <> Неопределено Тогда - ЕстьФормаРазблокированияРеквизитов = Истина; - ПолноеИмяФормыРаботыСБлокируемымиРеквизитами = ОбъектМетаданныхФорма.ПолноеИмя(); - КонецЕсли; - КонецЕсли; - КонецЕсли; -КонецПроцедуры - &НаКлиенте Процедура ПриРазблокированииРеквизитов(РазблокированныеРеквизиты, ДополнительныеПараметры) Экспорт + Если РазблокированныеРеквизиты = Неопределено Тогда Возврат; КонецЕсли; Если ТипЗнч(РазблокированныеРеквизиты) = Тип("Массив") И РазблокированныеРеквизиты.Количество() > 0 Тогда - ЗаблокированныеРеквизитыСтроки = РеквизитыОбъекта.НайтиСтроки(Новый Структура("ЗаблокированныйРеквизит", Истина)); + Отбор = Новый Структура("ЗаблокированныйРеквизит", Истина); + ЗаблокированныеРеквизитыСтроки = РеквизитыОбъекта.НайтиСтроки(Отбор); Для Каждого ОписаниеОперацииСтрока Из ЗаблокированныеРеквизитыСтроки Цикл - Если ОписаниеОперацииСтрока.ЗаблокированныйРеквизит И РазблокированныеРеквизиты.Найти(ОписаниеОперацииСтрока.Имя) <> Неопределено Тогда + Если ОписаниеОперацииСтрока.ЗаблокированныйРеквизит + И РазблокированныеРеквизиты.Найти(ОписаниеОперацииСтрока.Имя) <> Неопределено Тогда ОписаниеОперацииСтрока.ЗаблокированныйРеквизит = Ложь; КонецЕсли; КонецЦикла; + + ИначеЕсли РазблокированныеРеквизиты = Истина Тогда + + Для Каждого ОписаниеОперацииСтрока Из ЗаблокированныеРеквизитыСтроки Цикл + ОписаниеОперацииСтрока.ЗаблокированныйРеквизит = Ложь; + КонецЦикла; + КонецЕсли; + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -4471,6 +4376,7 @@ Для Каждого ЧастьСтроки Из СтрокиСоСсылками Цикл Если ЧастьСтроки.Пометка Тогда + //@skip-check new-font МассивСтроки.Добавить(Новый ФорматированнаяСтрока(ЧастьСтроки.Значение, Новый Шрифт(,,Истина))); // АПК:1345 - автономная обработка не может использовать стили ИначеЕсли Не ПустаяСтрока(ЧастьСтроки.Представление) Тогда МассивСтроки.Добавить(Новый ФорматированнаяСтрока(ЧастьСтроки.Значение,,,, ЧастьСтроки.Представление)); @@ -4506,7 +4412,7 @@ // 0.05,, "ЧДЦ=1"); // &НаСервереБезКонтекста -Функция СтрокаСЧисломДляЛюбогоЯзыка(Шаблон, Число, Вид = Неопределено, ФорматнаяСтрока = Неопределено) +Функция СтрокаСЧисломДляЛюбогоЯзыка(Шаблон, Число, Вид = Неопределено, ФорматнаяСтрока = "ЧН=0;") Если ПустаяСтрока(Шаблон) Тогда Возврат Формат(Число, ФорматнаяСтрока); @@ -4646,6 +4552,8 @@ СтрокаПоиска = Сред(СтрокаПоиска, Позиция + СтрДлина(Подстрока)); ФорматированныеСтроки.Добавить(ПодстрокаДоВхождения); + //@skip-check new-font + //@skip-check new-color ФорматированныеСтроки.Добавить(Новый ФорматированнаяСтрока(ПодстрокаВхождения, Новый Шрифт( , , Истина), Новый Цвет(0,128,0))); // АПК:1345 АПК:1346 - автономная обработка не может использовать стили КонецЦикла; diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/ObjectModule.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/ObjectModule.bsl index 048b29508..573ff482b 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/ObjectModule.bsl @@ -297,6 +297,7 @@ Если Параметры.ТипОперации = "ВыполнитьАлгоритм" Тогда ВыполнитьКодАлгоритма(ИзменяемыйОбъект, Параметры.КодАлгоритма, ВыполнятьКодАлгоритмаВБезопасномРежиме); Иначе + // @skip-check query-in-loop - порционная запись по одному объекту на транзакцию. Изменения = ВнестиИзменения(ДанныеОбъекта, ИзменяемыйОбъект, Параметры); КонецЕсли; @@ -346,7 +347,7 @@ РазблокироватьДанныеДляРедактирования(Ссылка); КонецЕсли; - КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + КраткоеПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, КраткоеПредставлениеОшибки); Если ОстанавливатьИзменениеПриОшибке Или Параметры.ИзменятьВТранзакции Тогда ЗаписатьОшибку = Ложь; @@ -375,7 +376,7 @@ ОтключитьОбновлениеКлючейДоступа(Ложь, Параметры.ИзменятьВТранзакции); Если ЗаписатьОшибку Тогда - КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + КраткоеПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, КраткоеПредставлениеОшибки); КонецЕсли; @@ -412,6 +413,8 @@ Результат.Вставить("ИзменяемыеДопСведенияОбъекта", Новый Соответствие); Результат.Вставить("МассивЗаписейДопСведений", Новый Массив); + ДобавленныеРеквизиты = Новый Массив; + // Выполнение операций изменения. Для Каждого Операция Из Параметры.ИзменяемыеРеквизиты Цикл @@ -439,11 +442,7 @@ КонецЕсли; НайденнаяСтрока.Значение = Значение; - ОписаниеСвойства = ЗначенияРеквизитовОбъекта(Операция.Свойство, "ТипЗначения, МногострочноеПолеВвода"); - МодульУправлениеСвойствамиСлужебный = ОбщийМодуль("УправлениеСвойствамиСлужебный"); - Если МодульУправлениеСвойствамиСлужебный.ИспользоватьНеограниченнуюСтроку(ОписаниеСвойства.ТипЗначения, ОписаниеСвойства.МногострочноеПолеВвода) Тогда - НайденнаяСтрока.ТекстоваяСтрока = Значение; - КонецЕсли; + ДобавленныеРеквизиты.Добавить(НайденнаяСтрока); Иначе Если НайденнаяСтрока <> Неопределено Тогда ИзменяемыйОбъект.ДополнительныеРеквизиты.Удалить(НайденнаяСтрока); @@ -472,6 +471,20 @@ КонецЦикла; + Если ДобавленныеРеквизиты.Количество() > 0 Тогда + СписокСвойств = ИзменяемыйОбъект.ДополнительныеРеквизиты.Выгрузить(ДобавленныеРеквизиты).ВыгрузитьКолонку("Свойство"); + МодульОбщегоНазначения = ОбщийМодуль("ОбщегоНазначения"); + ОписанияСвойств = МодульОбщегоНазначения.ЗначенияРеквизитовОбъектов(СписокСвойств, "ТипЗначения, МногострочноеПолеВвода"); + + МодульУправлениеСвойствамиСлужебный = ОбщийМодуль("УправлениеСвойствамиСлужебный"); + Для Каждого ДобавленныйРеквизит Из ДобавленныеРеквизиты Цикл + ОписаниеСвойства = ОписанияСвойств[ДобавленныйРеквизит.Свойство]; + Если МодульУправлениеСвойствамиСлужебный.ИспользоватьНеограниченнуюСтроку(ОписаниеСвойства.ТипЗначения, ОписаниеСвойства.МногострочноеПолеВвода) Тогда + ДобавленныйРеквизит.ТекстоваяСтрока = Значение; + КонецЕсли; + КонецЦикла; + КонецЕсли; + Если Параметры.ИзменяемыеТабличныеЧасти.Количество() > 0 Тогда ВнестиИзмененияВТабличныеЧасти(ИзменяемыйОбъект, ДанныеОбъекта, Параметры.ИзменяемыеТабличныеЧасти); КонецЕсли; @@ -660,12 +673,18 @@ УдаляемыеОбъекты = Новый СписокЗначений; МенеджерыОбъектов = Неопределено; + МодульОбщегоНазначения = Неопределено; Если ВерсияБСПСоответствуетТребованиям() Тогда МенеджерыОбъектов = МенеджерыОбъектовДляРедактированияРеквизитов(); + МодульОбщегоНазначения = ОбщийМодуль("ОбщегоНазначения"); КонецЕсли; Для Каждого КоллекцияОбъектовМетаданных Из КоллекцииОбъектовМетаданных Цикл Для Каждого ОбъектМетаданных Из КоллекцияОбъектовМетаданных Цикл + Если МодульОбщегоНазначения <> Неопределено + И Не МодульОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(ОбъектМетаданных) Тогда + Продолжить; + КонецЕсли; Если Не ПоказыватьСкрытые Тогда Если СтрНачинаетсяС(НРег(ОбъектМетаданных.Имя),ПрефиксУдаляемыхОбъектов) Или ЭтоСлужебныйОбъект(ОбъектМетаданных, МенеджерыОбъектов) Тогда @@ -692,7 +711,30 @@ КонецПроцедуры -Функция ЭтоСлужебныйОбъект(ОбъектМетаданных, МенеджерыОбъектов) +Функция ЭтоСлужебныйОбъект(Знач ОбъектМетаданных, Знач МенеджерыОбъектов) + + НастройкиРедактированияРеквизитов = НастройкиРедактированияРеквизитов(ОбъектМетаданных, МенеджерыОбъектов); + + Редактируемые = НастройкиРедактированияРеквизитов.Редактируемые; + НеРедактируемые = НастройкиРедактированияРеквизитов.НеРедактируемые; + + Если ТипЗнч(НеРедактируемые) = Тип("Массив") И НеРедактируемые.Найти("*") <> Неопределено + Или ТипЗнч(Редактируемые) = Тип("Массив") И Не ЗначениеЗаполнено(Редактируемые) Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +Функция НастройкиРедактированияРеквизитов(ОбъектМетаданных, МенеджерыОбъектов = Null) Экспорт + + Если МенеджерыОбъектов = Null Тогда + МенеджерыОбъектов = МенеджерыОбъектовДляРедактированияРеквизитов(); + КонецЕсли; + + Редактируемые = Неопределено; + НеРедактируемые = Неопределено; Если МенеджерыОбъектов <> Неопределено Тогда ДоступныеМетоды = МетодыМенеджераОбъектаДляРедактированияРеквизитов(ОбъектМетаданных.ПолноеИмя(), МенеджерыОбъектов); @@ -713,12 +755,6 @@ КонецПопытки; КонецЕсли; - Если Редактируемые <> Неопределено И Редактируемые.Количество() = 0 Тогда - Возврат Истина; - КонецЕсли; - - // - Если МенеджерыОбъектов <> Неопределено Тогда Если ТипЗнч(ДоступныеМетоды) = Тип("Массив") И (ДоступныеМетоды.Количество() = 0 Или ДоступныеМетоды.Найти("РеквизитыНеРедактируемыеВГрупповойОбработке") <> Неопределено) Тогда @@ -739,11 +775,22 @@ КонецПопытки; КонецЕсли; - Если НеРедактируемые <> Неопределено И НеРедактируемые.Найти("*") <> Неопределено Тогда - Возврат Истина; + Если ВерсияБСПСоответствуетТребованиям() Тогда + МодульИнтеграцияПодсистемБСП = ОбщийМодуль("ИнтеграцияПодсистемБСП"); + МодульГрупповоеИзменениеОбъектовПереопределяемый = ОбщийМодуль("ГрупповоеИзменениеОбъектовПереопределяемый"); + + МодульИнтеграцияПодсистемБСП.ПриОпределенииРедактируемыхРеквизитовОбъекта( + ОбъектМетаданных, Редактируемые, НеРедактируемые); + + МодульГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииРедактируемыхРеквизитовОбъекта( + ОбъектМетаданных, Редактируемые, НеРедактируемые); КонецЕсли; - Возврат Ложь; + Результат = Новый Структура; + Результат.Вставить("Редактируемые", Редактируемые); + Результат.Вставить("НеРедактируемые", НеРедактируемые); + + Возврат Результат; КонецФункции @@ -787,7 +834,7 @@ КонецЕсли; ВерсияБСП = МодульСтандартныеПодсистемыСервер.ВерсияБиблиотеки(); - Возврат СравнитьВерсии(ВерсияБСП, "3.1.2.45") >= 0; + Возврат СравнитьВерсии(ВерсияБСП, "3.1.8.25") >= 0; КонецФункции diff --git a/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Form.form b/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Form.form index 20b55c296..5cd24a040 100644 --- a/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Form.form +++ b/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Form.form @@ -1,5 +1,5 @@ <?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"> +<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" xmlns:schema="http://g5.1c.ru/v8/dt/data-composition-system/schema"> <title> <key>ru</key> <value>Архив анкет</value> @@ -27,7 +27,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <showTitle>auto</showTitle> @@ -184,8 +183,8 @@ </extInfo> </items> <items xsi:type="form:FormField"> - <name>ОтвеченныеАнкетыАнкета</name> - <id>18</id> + <name>ОтвеченныеАнкетыСсылка</name> + <id>32</id> <title> <key>ru</key> <value>Анкета</value> @@ -194,11 +193,11 @@ <enabled>true</enabled> <userVisible/> <dataPath xsi:type="form:DataPath"> - <segments>ОтвеченныеАнкеты.Анкета</segments> + <segments>ОтвеченныеАнкеты.Ссылка</segments> </dataPath> <extendedTooltip> - <name>ОтвеченныеАнкетыАнкетаРасширеннаяПодсказка</name> - <id>20</id> + <name>ОтвеченныеАнкетыСсылкаРасширеннаяПодсказка</name> + <id>34</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -207,18 +206,23 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ОтвеченныеАнкетыАнкетаКонтекстноеМеню</name> - <id>19</id> + <name>ОтвеченныеАнкетыСсылкаКонтекстноеМеню</name> + <id>33</id> <autoFill>true</autoFill> </contextMenu> - <type>LabelField</type> + <type>InputField</type> <editMode>Enter</editMode> <showInHeader>true</showInHeader> <headerHorizontalAlign>Left</headerHorizontalAlign> <showInFooter>true</showInFooter> - <extInfo xsi:type="form:LabelFieldExtInfo"> + <extInfo xsi:type="form:InputFieldExtInfo"> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> + <wrap>true</wrap> + <chooseType>true</chooseType> + <typeDomainEnabled>true</typeDomainEnabled> + <textEdit>true</textEdit> + <textSize>Normal</textSize> </extInfo> </items> <autoCommandBar> @@ -442,9 +446,6 @@ <edit> <common>true</common> </edit> - <notDefaultUseAlwaysAttributes xsi:type="form:DataPath"> - <segments>ОтвеченныеАнкеты.Анкета</segments> - </notDefaultUseAlwaysAttributes> <notDefaultUseAlwaysAttributes xsi:type="form:DataPath"> <segments>ОтвеченныеАнкеты.ДатаЗаполнения</segments> </notDefaultUseAlwaysAttributes> @@ -454,9 +455,12 @@ <notDefaultUseAlwaysAttributes xsi:type="form:DataPath"> <segments>ОтвеченныеАнкеты.НаименованиеОпроса</segments> </notDefaultUseAlwaysAttributes> + <notDefaultUseAlwaysAttributes xsi:type="form:DataPath"> + <segments>ОтвеченныеАнкеты.Ссылка</segments> + </notDefaultUseAlwaysAttributes> <extInfo xsi:type="form:DynamicListExtInfo"> <queryText>ВЫБРАТЬ - Анкета.Ссылка КАК Анкета, + Анкета.Ссылка КАК Ссылка, ЕСТЬNULL(НазначениеОпросов.Наименование, "") КАК НаименованиеОпроса, Анкета.ДатаРедактирования КАК ДатаЗаполнения, 0 КАК КодКартинки @@ -473,6 +477,114 @@ <customQuery>true</customQuery> <autoSaveUserSettings>true</autoSaveUserSettings> <getInvisibleFieldPresentations>true</getInvisibleFieldPresentations> + <fields xsi:type="schema:DataCompositionSchemaDataSetField"> + <dataPath>НаименованиеОпроса</dataPath> + <field>НаименованиеОпроса</field> + <title> + <localValue> + <content> + <key>ru</key> + <value>Наименование опроса</value> + </content> + </localValue> + + + + ДатаЗаполнения + ДатаЗаполнения + + <localValue> + <content> + <key>ru</key> + <value>Дата заполнения</value> + </content> + </localValue> + + + + КодКартинки + КодКартинки + + <localValue> + <content> + <key>ru</key> + <value>Код картинки</value> + </content> + </localValue> + + + + Номер + Номер + + + Дата + Дата + + + Опрос + Опрос + + + Респондент + Респондент + + + РедактируемыйРаздел + РедактируемыйРаздел + + + Комментарий + Комментарий + + + Интервьюер + Интервьюер + + + ШаблонАнкеты + ШаблонАнкеты + + + РежимАнкетирования + РежимАнкетирования + + + Состав + Состав + + + МоментВремени + МоментВремени + + + ПометкаУдаления + ПометкаУдаления + + + Проведен + Проведен + + + Ссылка + Ссылка + + + Респондент + + <localValue> + <content> + <key>ru</key> + <value>Респондент</value> + </content> + </localValue> + + + f0d7bb9f-e04b-4261-bbbf-0fe067eb2095 + + + true + diff --git a/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Module.bsl b/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Module.bsl index fe95cafa3..ac3576312 100644 --- a/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Module.bsl +++ b/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/АрхивАнкет/Module.bsl @@ -35,7 +35,7 @@ КонецЕсли; СтруктураПараметров = Новый Структура; - СтруктураПараметров.Вставить("Ключ",ТекущиеДанные.Анкета); + СтруктураПараметров.Вставить("Ключ",ТекущиеДанные.Ссылка); СтруктураПараметров.Вставить("ТолькоФормаЗаполнения",Истина); СтруктураПараметров.Вставить("ТолькоПросмотр",Истина); diff --git a/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/Форма/Form.form b/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/Форма/Form.form index 64e74829e..ca0179a10 100644 --- a/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ДоступныеАнкеты/Forms/Форма/Form.form @@ -10,33 +10,6 @@ Анкеты 15 - - Обновить - 13 - true - true - - true - - - ОбновитьExtendedTooltip - 23 - Label - true - true - - Left - - - UsualButton - Form.Command.Обновить - Normal - PictureAndText - true - true - UserCmds - Auto - ТаблицаАнкет 3 @@ -107,11 +80,39 @@ Normal
    - None + Top ТаблицаАнкетКоманднаяПанель 5 + + Обновить + 13 + true + true + + true + + + ОбновитьExtendedTooltip + 23 + Label + true + true + + Left + + + Form.Command.Обновить + Normal + PictureAndText + true + true + UserCmds + OnlyInContextMenu + InCommandBar + Left + true BeforeRowChange diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Form.form b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Form.form index 81f7de7ce..002c8c0f4 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Form.form +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Form.form @@ -274,7 +274,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1692,6 +1691,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 211 + + СтрокаПоискРасширеннаяПодсказка + 213 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 212 + true + + Журнал + + true + + Left diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Module.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Module.bsl index fdb203b0c..ae41c661b 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Module.bsl +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Module.bsl @@ -13,9 +13,6 @@ УстановитьУсловноеОформление(); - МодельСервиса = ОбщегоНазначения.РазделениеВключено() - И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(); - ОтборЖурналаРегистрации = Новый Структура; ОтборЖурналаРегистрацииПоУмолчанию = Новый Структура; ЗначенияОтбора = ПолучитьЗначенияОтбораЖурналаРегистрации("Событие").Событие; @@ -44,25 +41,10 @@ ОтборЖурналаРегистрации.Вставить("Событие", ОтборПоСобытию); КонецЕсли; - ПереданОтборПоДате = ЗначениеЗаполнено(Параметры.ДатаНачала) - Или ЗначениеЗаполнено(Параметры.ДатаОкончания); - - Если МодельСервиса И Не ПереданОтборПоДате Тогда - ОтборЖурналаРегистрации.Вставить("ДатаНачала", НачалоДня(ТекущаяДатаСеанса())); - ОтборЖурналаРегистрации.Вставить("ДатаОкончания", КонецДня(ТекущаяДатаСеанса())); - Иначе - Если ЗначениеЗаполнено(Параметры.ДатаНачала) Тогда - ОтборЖурналаРегистрации.Вставить("ДатаНачала", Параметры.ДатаНачала); - Иначе - ОтборЖурналаРегистрации.Вставить("ДатаНачала", НачалоДня(ТекущаяДатаСеанса())); - КонецЕсли; - - Если ЗначениеЗаполнено(Параметры.ДатаОкончания) Тогда - ОтборЖурналаРегистрации.Вставить("ДатаОкончания", Параметры.ДатаОкончания + 1); - Иначе - ОтборЖурналаРегистрации.Вставить("ДатаОкончания", КонецДня(ТекущаяДатаСеанса())); - КонецЕсли; - КонецЕсли; + ОтборЖурналаРегистрации.Вставить("ДатаНачала", + ?(ЗначениеЗаполнено(Параметры.ДатаНачала), Параметры.ДатаНачала, НачалоДня(ТекущаяДатаСеанса()))); + ОтборЖурналаРегистрации.Вставить("ДатаОкончания", + ?(ЗначениеЗаполнено(Параметры.ДатаОкончания), Параметры.ДатаОкончания, КонецДня(ТекущаяДатаСеанса()))); Если Параметры.Данные <> Неопределено Тогда ОтборЖурналаРегистрации.Вставить("Данные", Параметры.Данные); diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Form.form b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Form.form index 141ab8e9b..275a1d1b4 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Form.form +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Form.form @@ -164,7 +164,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -196,7 +195,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -225,7 +223,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -374,7 +371,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -655,7 +651,6 @@ UsualGroup Vertical - Auto true true Auto @@ -934,7 +929,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -964,7 +958,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1143,7 +1136,6 @@ UsualGroup Vertical - Auto true Auto Auto @@ -1325,7 +1317,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1605,7 +1596,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Form.form b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Form.form index 06ba66f6d..741f7e02c 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Form.form +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Form.form @@ -190,6 +190,38 @@ Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 32 + + СтрокаПоискРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 33 + true + + Список + + true + + Left diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Module.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Module.bsl index f1882dbd7..f103aa906 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Module.bsl +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Module.bsl @@ -106,7 +106,7 @@ Если (ОтбираемыеПараметры = "Пользователь" Или ОтбираемыеПараметры = "User") Тогда // Для пользователей ключом служит имя. - НовыйЭлемент.Значение = ЭлементСоответствия.Значение; + НовыйЭлемент.Значение = ЭлементСоответствия.Ключ; НовыйЭлемент.Представление = ЭлементСоответствия.Значение; НовыйЭлемент.ПолноеПредставление = ЭлементСоответствия.Значение; diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/Событие/Form.form b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/Событие/Form.form index f54e202e9..f807a5d71 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/Событие/Form.form +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/Событие/Form.form @@ -204,7 +204,6 @@ UsualGroup Vertical - Auto true true Auto @@ -370,7 +369,6 @@ UsualGroup Vertical - Auto true true Auto @@ -399,7 +397,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -532,7 +529,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1932,7 +1928,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2012,7 +2007,6 @@ UsualGroup Vertical - Auto true true auto @@ -2041,7 +2035,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -2257,7 +2250,6 @@ UsualGroup Vertical - Auto true true LeftNarrowest @@ -2381,7 +2373,6 @@ UsualGroup Vertical - Auto true true auto @@ -2410,7 +2401,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/ManagerModule.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/ManagerModule.bsl index e90403efa..5d03138c1 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ЖурналРегистрации/ManagerModule.bsl @@ -8,6 +8,39 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда +#Область СлужебныйПрограммныйИнтерфейс + +// См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов. +Процедура ПередДобавлениемКомандОтчетов(КомандыОтчетов, Параметры, СтандартнаяОбработка) Экспорт + + Если Не ПравоДоступа("Просмотр", Метаданные.Обработки.ЖурналРегистрации) Тогда + Возврат; + КонецЕсли; + + ТипПараметраКоманды = Новый ОписаниеТипов; + ТипПараметраКоманды = Новый ОписаниеТипов(ТипПараметраКоманды, Справочники.ТипВсеСсылки().Типы()); + ТипПараметраКоманды = Новый ОписаниеТипов(ТипПараметраКоманды, Документы.ТипВсеСсылки().Типы()); + ТипПараметраКоманды = Новый ОписаниеТипов(ТипПараметраКоманды, ПланыСчетов.ТипВсеСсылки().Типы()); + ТипПараметраКоманды = Новый ОписаниеТипов(ТипПараметраКоманды, ПланыВидовХарактеристик.ТипВсеСсылки().Типы()); + ТипПараметраКоманды = Новый ОписаниеТипов(ТипПараметраКоманды, БизнесПроцессы.ТипВсеСсылки().Типы()); + ТипПараметраКоманды = Новый ОписаниеТипов(ТипПараметраКоманды, Задачи.ТипВсеСсылки().Типы()); + ТипПараметраКоманды = Новый ОписаниеТипов(ТипПараметраКоманды, ПланыВидовРасчета.ТипВсеСсылки().Типы()); + ТипПараметраКоманды = Новый ОписаниеТипов(ТипПараметраКоманды, ПланыОбмена.ТипВсеСсылки().Типы()); + + Команда = КомандыОтчетов.Добавить(); + Команда.Представление = НСтр("ru = 'Журнал регистрации'"); + Команда.МножественныйВыбор = Ложь; + Команда.ИмяПараметраФормы = "Данные"; + Команда.ПараметрыФормы = Новый Структура("ДатаНачала", НачалоДня(ТекущаяДатаСеанса()) - 30 * 60 * 60 * 24); + Команда.Важность = "СмТакже"; + Команда.ТипПараметра = ТипПараметраКоманды; + Команда.Менеджер = "Обработка.ЖурналРегистрации"; + Команда.ТолькоВоВсехДействиях = Истина; + +КонецПроцедуры + +#КонецОбласти + #Область СлужебныеПроцедурыИФункции // Возвращает значение перечисления соответствующе строковому имени статус события. diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ВыборКолонок/Form.form b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ВыборКолонок/Form.form index 8516f980a..c7dc9517d 100644 --- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ВыборКолонок/Form.form +++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ВыборКолонок/Form.form @@ -172,17 +172,75 @@ UserCmds Auto - - СписокКолонокУстановитьФлажки - 13 + + СписокКолонокГруппа1 + 28 + + СписокКолонокУстановитьФлажки + 13 + true + true + + true + + + СписокКолонокУстановитьФлажкиРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + Form.Item.СписокКолонок.StandardCommand.CheckAll + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + СписокКолонокСнятьФлажки + 15 + true + true + + true + + + СписокКолонокСнятьФлажкиРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + Form.Item.СписокКолонок.StandardCommand.UncheckAll + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + true true true + + <key>ru</key> + <value>Список колонок группа1</value> + - СписокКолонокУстановитьФлажкиРасширеннаяПодсказка - 14 + СписокКолонокГруппа1РасширеннаяПодсказка + 29 Label true true @@ -190,26 +248,25 @@ Left - Form.Item.СписокКолонок.StandardCommand.CheckAll - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu + + Compact + - - СписокКолонокСнятьФлажки - 15 + + + <key>ru</key> + <value>Поиск</value> + true true true + СтрокаПоиска + 30 - СписокКолонокСнятьФлажкиРасширеннаяПодсказка - 16 + СтрокаПоискаРасширеннаяПодсказка + 32 Label true true @@ -217,14 +274,15 @@ Left - Form.Item.СписокКолонок.StandardCommand.UncheckAll - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu + + СтрокаПоискаКонтекстноеМеню + 31 + true + + СписокКолонок + + true + Left true diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Form.form b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Form.form index 3b88d7dbf..2c2aaa139 100644 --- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Form.form +++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Form.form @@ -67,7 +67,7 @@ Add Change CheckAll - Copy + Choose CopyToClipboard Delete EndEdit @@ -126,7 +126,38 @@ ВидЗагрузкиДанныхКоманднаяПанель 19 - Left + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 687 + + СтрокаПоискаРасширеннаяПодсказка + 689 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 688 + true + + ВидЗагрузкиДанных + + true + + ValueChoice @@ -268,7 +299,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -974,7 +1004,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1104,7 +1133,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1271,7 +1299,6 @@ UsualGroup Vertical - Auto NormalSeparation true auto @@ -1599,7 +1626,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -1803,7 +1829,6 @@ UsualGroup Vertical - Auto true Auto Auto @@ -1833,7 +1858,6 @@ UsualGroup Vertical - Auto true Auto Auto @@ -2043,7 +2067,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2190,7 +2213,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2302,7 +2324,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2331,7 +2352,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2396,7 +2416,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -2638,7 +2657,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2834,7 +2852,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3117,7 +3134,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Module.bsl b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Module.bsl index 1ee675bb0..6631ff831 100644 --- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Module.bsl +++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Module.bsl @@ -1584,9 +1584,9 @@ РазделительИ = ""; ТипСравнения = " = "; - ОтборГде = ""; СтрокаУсловие = ""; ТабличнаяЧасть = ""; + ОтборГде = Новый Массив; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); @@ -1606,12 +1606,16 @@ НайденныеВиды = ВидыКонтактнойИнформации.Найти(ИмяВидаКИ, "Наименование"); ТабличнаяЧасть = "КонтактнаяИнформация"; - СтрокаУсловие = СтрокаУсловие + РазделительИ + "ВЫРАЗИТЬ(СправочникСопоставления.Представление - | КАК Строка(500)) = ВЫРАЗИТЬ(ТаблицаСопоставления." + Колонка.ИмяКолонки + " КАК Строка(500)) "; + + ШаблонСтрокаУсловие = "ВЫРАЗИТЬ(СправочникСопоставления.Представление КАК Строка(500)) = ВЫРАЗИТЬ(ТаблицаСопоставления.%1 КАК Строка(500))"; + СтрокаУсловие = СтрокаУсловие + РазделительИ + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСтрокаУсловие, Колонка.ИмяКолонки); Если НайденныеВиды <> Неопределено Тогда СтрокаУсловие = СтрокаУсловие + " И СправочникСопоставления.Вид.Наименование = """ + НайденныеВиды.Ссылка.Наименование + """"; КонецЕсли; - ОтборГде = ОтборГде + " И СправочникСопоставления.Представление <> """""; + + ОтборГде.Добавить("СправочникСопоставления.Представление <> """""); + РазделительИ = " И "; Продолжить; @@ -1626,8 +1630,9 @@ КонецЕсли; ОбъектаТипаКолонки = Метаданные.НайтиПоТипу(ТипКолонки); - Если ОбъектаТипаКолонки <> Неопределено Тогда - ОтборГде = ОтборГде + " И СправочникСопоставления.Значение <> ЗНАЧЕНИЕ(" + ОбъектаТипаКолонки.ПолноеИмя() + ".ПустаяСсылка)"; + Если ОбъектаТипаКолонки <> Неопределено Тогда + ШаблонГде = "СправочникСопоставления.Значение <> ЗНАЧЕНИЕ(%1.ПустаяСсылка)"; + ОтборГде.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонГде, ОбъектаТипаКолонки.ПолноеИмя())); КонецЕсли; РазделительИ = " И "; Продолжить; @@ -1636,16 +1641,16 @@ ИмяКолонкиСправочника = "Ссылка." + Колонка.ИмяКолонки; ТипКолонки = Колонка.ТипКолонки.Типы()[0]; - Если ТипКолонки = Тип("Строка") Тогда + Если ТипКолонки = Тип("Строка") Тогда + ШаблонГде = "СправочникСопоставления.%1 <> """""; Если Колонка.ТипКолонки.КвалификаторыСтроки.Длина = 0 Тогда - СтрокаУсловие = СтрокаУсловие + РазделительИ + "ВЫРАЗИТЬ(СправочникСопоставления." + ИмяКолонкиСправочника + СтрокаУсловие = СтрокаУсловие + РазделительИ + "ВЫРАЗИТЬ(СправочникСопоставления." + ИмяКолонкиСправочника + " КАК Строка(500)) = ВЫРАЗИТЬ(ТаблицаСопоставления." + Колонка.ИмяКолонки + " КАК Строка(500))"; - ОтборГде = ОтборГде + " И СправочникСопоставления." + ИмяКолонкиСправочника + " <> """""; Иначе СтрокаУсловие = СтрокаУсловие + РазделительИ + "СправочникСопоставления." + ИмяКолонкиСправочника - + " = ТаблицаСопоставления." + Колонка.ИмяКолонки; - ОтборГде = ОтборГде + РазделительИ + " СправочникСопоставления." + ИмяКолонкиСправочника + " <> """""; + + " = ТаблицаСопоставления." + Колонка.ИмяКолонки; КонецЕсли; + ОтборГде.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонГде, ИмяКолонкиСправочника)); ИначеЕсли ТипКолонки = Тип("Число") Тогда СтрокаУсловие = СтрокаУсловие + РазделительИ + "СправочникСопоставления." + ИмяКолонкиСправочника + " = ТаблицаСопоставления." + Колонка.ИмяКолонки; ИначеЕсли ТипКолонки = Тип("Дата") Тогда @@ -1682,7 +1687,7 @@ Условия = Новый Структура("УсловиеОбъединения , Где, ТабличнаяЧасть"); Условия.УсловиеОбъединения = СтрокаУсловие; - Условия.Где = ОтборГде; + Условия.Где = СтрСоединить(ОтборГде, " И "); Условия.ТабличнаяЧасть = ТабличнаяЧасть; Возврат Условия; @@ -1903,23 +1908,25 @@ &НаСервереБезКонтекста Функция МенеджерОбъекта(ИмяОбъектаСопоставления) - МассивОбъекта = Обработки.ЗагрузкаДанныхИзФайла.РазложитьПолноеИмяОбъекта(ИмяОбъектаСопоставления); - Если МассивОбъекта.ТипОбъекта = "Документ" Тогда - МенеджерОбъекта = Документы[МассивОбъекта.НазваниеОбъекта]; - ИначеЕсли МассивОбъекта.ТипОбъекта = "Справочник" Тогда - МенеджерОбъекта = Справочники[МассивОбъекта.НазваниеОбъекта]; - ИначеЕсли МассивОбъекта.ТипОбъекта = "Обработка" Тогда - МенеджерОбъекта = Обработки[МассивОбъекта.НазваниеОбъекта]; - Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Объект ""%1"" не найден'"), ИмяОбъектаСопоставления); - КонецЕсли; - - Возврат МенеджерОбъекта; + + МассивОбъекта = Обработки.ЗагрузкаДанныхИзФайла.РазложитьПолноеИмяОбъекта(ИмяОбъектаСопоставления); + Если МассивОбъекта.ТипОбъекта = "Документ" Тогда + МенеджерОбъекта = Документы[МассивОбъекта.НазваниеОбъекта]; + ИначеЕсли МассивОбъекта.ТипОбъекта = "Справочник" Тогда + МенеджерОбъекта = Справочники[МассивОбъекта.НазваниеОбъекта]; + ИначеЕсли МассивОбъекта.ТипОбъекта = "Обработка" Тогда + МенеджерОбъекта = Обработки[МассивОбъекта.НазваниеОбъекта]; + Иначе + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Объект ""%1"" не найден'"), ИмяОбъектаСопоставления); + КонецЕсли; + + Возврат МенеджерОбъекта; + КонецФункции &НаСервереБезКонтекста Функция ФормаСписка(ИмяОбъектаСопоставления) - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаСопоставления); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъектаСопоставления); Если ОбъектМетаданных.ОсновнаяФормаСписка <> Неопределено Тогда Возврат ОбъектМетаданных.ОсновнаяФормаСписка.ПолноеИмя(); Иначе @@ -2277,7 +2284,7 @@ МассивРеквизитов = Новый Массив; - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаСопоставления); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъектаСопоставления); ОписаниеТипаОбъектаСопоставления = ОписаниеТипаПоМетаданным(ИмяОбъектаСопоставления); ВременнаяТЗ = РеквизитФормыВЗначение("ТаблицаСопоставленияДанных"); @@ -2351,7 +2358,7 @@ ОбязательныеКолонки = Новый Массив; КолонкиСодержащиеСвязиПараметровВыбора = Новый Соответствие; - ОбъектРеквизитыТЧ = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаСопоставления); // ОбъектМетаданныхСправочник, ОбъектМетаданныхДокумент + ОбъектРеквизитыТЧ = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъектаСопоставления); // ОбъектМетаданныхСправочник, ОбъектМетаданныхДокумент РеквизитыТЧ = ОбъектРеквизитыТЧ.Реквизиты; Для каждого Колонка Из РеквизитыТЧ Цикл @@ -2631,7 +2638,7 @@ &НаСервереБезКонтекста Функция СформироватьИмяФайлаДляОбъектаМетаданных(ИмяОбъектаМетаданных) - МетаданныеСправочника = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаМетаданных); + МетаданныеСправочника = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъектаМетаданных); Если МетаданныеСправочника <> Неопределено Тогда ИмяФайла = СокрЛП(МетаданныеСправочника.Синоним); @@ -2740,7 +2747,11 @@ &НаСервере Функция ЗагрузитьФайлСДаннымиВТабличныйДокументНаСервере(АдресВременногоХранилища, Расширение) - ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение); + ОбщийКаталогВременныхФайлов = ФайловаяСистема.ОбщийКаталогВременныхФайлов(); + + ВременныйФайл = Новый Файл(ПолучитьИмяВременногоФайла(Расширение)); + ИмяВременногоФайла = ФайловаяСистема.УникальноеИмяФайла(ОбщийКаталогВременныхФайлов + ВременныйФайл.Имя); + ДвоичныеДанные = ПолучитьИЗВременногоХранилища(АдресВременногоХранилища); // ДвоичныеДанные ДвоичныеДанные.Записать(ИмяВременногоФайла); @@ -2933,4 +2944,4 @@ #КонецОбласти -#КонецОбласти \ No newline at end of file +#КонецОбласти diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/РазрешенияНеоднозначностей/Form.form b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/РазрешенияНеоднозначностей/Form.form index 1aab69ced..718a5bfac 100644 --- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/РазрешенияНеоднозначностей/Form.form +++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/РазрешенияНеоднозначностей/Form.form @@ -828,7 +828,6 @@ UsualGroup Vertical - Auto true true Auto @@ -892,7 +891,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/ManagerModule.bsl b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/ManagerModule.bsl index f86ce6e2e..35b49a160 100644 --- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/ManagerModule.bsl @@ -143,6 +143,7 @@ Для каждого Реквизит Из Справочник.ТабличныеЧасти Цикл Если Реквизит.Имя <> "КонтактнаяИнформация" И Реквизит.Имя <> "ДополнительныеРеквизиты" + И Реквизит.Имя <> "Представления" И Реквизит.Имя <> "СертификатыШифрования" Тогда Возврат Истина; КонецЕсли; @@ -248,7 +249,10 @@ Типы = ТаблицаСопоставления.Колонки.ОбъектСопоставления.ТипЗначения.Типы(); ТипыОбъектовПоддерживающиеВводПоСтроке = ТипыОбъектовПоддерживающиеВводПоСтроке(); + ЗначенияДляСопоставления = Новый ТаблицаЗначений(); + ТекстЗапроса = ""; + Для каждого Тип Из Типы Цикл ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); // ОбъектМетаданныхСправочник, ОбъектМетаданныхДокумент Если ОбъектМетаданных <> Неопределено И ПравоДоступа("Чтение", ОбъектМетаданных) Тогда @@ -269,27 +273,68 @@ КонецЕсли; КонецЦикла; + Если ПустаяСтрока(ТекстЗапроса) Тогда + Возврат; + КонецЕсли; + + ТекстЗапроса = "ВЫБРАТЬ + |ЗначенияДляСопоставления.ЗначениеПоиска КАК ЗначениеПоиска, + |ЗначенияДляСопоставления.Ключ КАК Ключ + |ПОМЕСТИТЬ ЗначенияДляСопоставления + |ИЗ + | &ЗначенияДляСопоставления КАК ЗначенияДляСопоставления" + + ОбщегоНазначения.РазделительПакетаЗапросов() + + ТекстЗапроса + " + |ИТОГИ ПО Ключ"; + + Типы.Добавить(Тип("Строка")); + ПараметрыСтроки = Новый КвалификаторыСтроки(500); + ДопустимыеТипы = Новый ОписаниеТипов(Типы, , ПараметрыСтроки); + ЗначенияДляСопоставления.Колонки.Добавить("ЗначениеПоиска", ДопустимыеТипы); + ЗначенияДляСопоставления.Колонки.Добавить("Ключ", ОбщегоНазначения.ОписаниеТипаЧисло(10)); + Для каждого Строка Из ТаблицаСопоставления Цикл Если НЕ ЗначениеЗаполнено(Строка[ИмяКолонки]) Тогда Продолжить; КонецЕсли; - Если ЗначениеЗаполнено(ТекстЗапроса) Тогда - Значение = ДокументПоПредставлению(Строка[ИмяКолонки], Типы); - Если Значение = Неопределено Тогда - Значение = Строка[ИмяКолонки]; - КонецЕсли; - МассивСсылок = НайтиСсылкиПоПараметрамОтбора(ТекстЗапроса, Значение); - Если МассивСсылок.Количество() = 1 Тогда - Строка.ОбъектСопоставления = МассивСсылок[0]; - Строка.РезультатСопоставленияСтроки = "СтрокаСопоставлена"; - ИначеЕсли МассивСсылок.Количество() > 1 Тогда - Строка.СписокНеоднозначностей.ЗагрузитьЗначения(МассивСсылок); - Строка.РезультатСопоставленияСтроки = "Неоднозначность"; - Иначе - Строка.РезультатСопоставленияСтроки = "НеСопоставлен"; - КонецЕсли; + Значение = ДокументПоПредставлению(Строка[ИмяКолонки], Типы); + НоваяСтрока = ЗначенияДляСопоставления.Добавить(); + НоваяСтрока.ЗначениеПоиска =?(Значение = Неопределено, СокрЛП(Строка[ИмяКолонки]), Значение); + НоваяСтрока.Ключ = ТаблицаСопоставления.Индекс(Строка); + + КонецЦикла; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("ЗначенияДляСопоставления", ЗначенияДляСопоставления); + + ТаблицаРезультатов = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + + Пока ТаблицаРезультатов.Следующий() Цикл + + РезультатПоиска = ТаблицаРезультатов.Выбрать(); + СтрокаДанных = ТаблицаСопоставления.Получить(ТаблицаРезультатов.Ключ); + Если СтрокаДанных = Неопределено Тогда + Продолжить; КонецЕсли; + + НайденныеВарианты = Новый Массив; + Пока РезультатПоиска.Следующий() Цикл + Если РезультатПоиска.СсылкаНаОбъект <> Неопределено Тогда + НайденныеВарианты.Добавить(РезультатПоиска.СсылкаНаОбъект); + КонецЕсли; + КонецЦикла; + + Если НайденныеВарианты.Количество() = 1 Тогда + СтрокаДанных.ОбъектСопоставления = НайденныеВарианты[0]; + СтрокаДанных.РезультатСопоставленияСтроки = "СтрокаСопоставлена"; + ИначеЕсли НайденныеВарианты.Количество() > 1 Тогда + СтрокаДанных.СписокНеоднозначностей.ЗагрузитьЗначения(НайденныеВарианты); + СтрокаДанных.РезультатСопоставленияСтроки = "Неоднозначность"; + Иначе + СтрокаДанных.РезультатСопоставленияСтроки = "НеСопоставлен"; + КонецЕсли; + КонецЦикла; КонецПроцедуры @@ -304,7 +349,7 @@ Продолжить; КонецЕсли; СтруктураИмениОбъекта = РазложитьПолноеИмяОбъекта(ОбъектМетаданных.ПолноеИмя()); - Если СтруктураИмениОбъекта.ТипОбъекта <> "Документ" Тогда + Если ВРег(СтруктураИмениОбъекта.ТипОбъекта) <> ВРег("Документ") Тогда Продолжить; КонецЕсли; @@ -314,7 +359,7 @@ ПредставлениеНомерИДата = СокрЛП(Сред(Представление, СтрДлина(ПредставлениеЭлемента) + 1)); ПозицияОкончанияНомера = СтрНайти(ПредставлениеНомерИДата, " "); Номер = Лев(ПредставлениеНомерИДата, ПозицияОкончанияНомера - 1); - ПозицияОт = СтрНайти(НРег(ПредставлениеНомерИДата), "от"); + ПозицияОт = СтрНайти(НРег(ПредставлениеНомерИДата), НСтр("ru = 'от'")); ПредставлениеДата = СокрЛ(Сред(ПредставлениеНомерИДата, ПозицияОт + 2)); ПозицияОкончаниеДаты = СтрНайти(ПредставлениеДата, " "); ДатаОкругленнаяДоДня = Лев(ПредставлениеДата, ПозицияОкончаниеДаты - 1) + " 00:00:00"; @@ -330,23 +375,8 @@ Возврат Неопределено; КонецЕсли; - Запрос = Новый Запрос; // Проверка доступности документа с учетом ограничения на уровне записей. - Запрос.Текст = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | ДокументДляПроверки.Ссылка - |ИЗ - | &ДокументИмя КАК ДокументДляПроверки - |ГДЕ - | ДокументДляПроверки.Ссылка = &Ссылка"; - - Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ДокументИмя", "Документ." + ОбъектМетаданных.Имя); - - Запрос.УстановитьПараметр("Ссылка", Документ.Ссылка); - РезультатЗапроса = Запрос.Выполнить().Выбрать(); - - Если РезультатЗапроса.Следующий() Тогда - Возврат Документ; - КонецЕсли; + Возврат Документ; + КонецЦикла; Возврат Неопределено; @@ -355,41 +385,34 @@ Функция СтрокаЗапроса(ТекстЗапроса, ТипОбъекта, ИмяОбъекта, МассивКолонок) - Если МассивКолонок.Количество() > 0 Тогда - ТекстГде = ""; - РазделительГде = ""; - Для Каждого Поле Из МассивКолонок Цикл - ТекстГде = ТекстГде + РазделительГде + "ТаблицаДанных." + Поле + " = &ПараметрПоиска"; - РазделительГде = " ИЛИ "; - КонецЦикла; - - ТекстШаблон = "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | ТаблицаДанных.Ссылка КАК СсылкаНаОбъект - |ИЗ - | &ИмяТаблицы КАК ТаблицаДанных - |ГДЕ - | &Условия"; - ТекстШаблон = СтрЗаменить(ТекстШаблон, "&Условия", ТекстГде); - ТекстШаблон = СтрЗаменить(ТекстШаблон, "&ИмяТаблицы", ТипОбъекта + "." + ИмяОбъекта); - Если Не ПустаяСтрока(ТекстЗапроса) Тогда - ТекстШаблон = СтрЗаменить(ТекстШаблон, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); // @query-part-1, @query-part-2 - ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС; // @query-part-1 - КонецЕсли; - ТекстЗапроса = ТекстЗапроса + ТекстШаблон; + Если МассивКолонок.Количество() = 0 Тогда + Возврат ТекстЗапроса; КонецЕсли; + + ТекстыПО = Новый Массив; + Для Каждого Поле Из МассивКолонок Цикл + ТекстыПО.Добавить("ТаблицаДанных." + Поле + " = ЗначенияДляСопоставления.ЗначениеПоиска"); + КонецЦикла; + + ТекстШаблон = "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ЕСТЬNULL(ТаблицаДанных.Ссылка, Неопределено) КАК СсылкаНаОбъект, + | ЗначенияДляСопоставления.Ключ КАК Ключ + |ИЗ + | ЗначенияДляСопоставления КАК ЗначенияДляСопоставления + | ЛЕВОЕ СОЕДИНЕНИЕ &ИмяТаблицы КАК ТаблицаДанных + | ПО &Условия"; + ТекстШаблон = СтрЗаменить(ТекстШаблон, "&Условия", СтрСоединить(ТекстыПО, " ИЛИ ")); // @query-part-2 + ТекстШаблон = СтрЗаменить(ТекстШаблон, "&ИмяТаблицы", ТипОбъекта + "." + ИмяОбъекта); + Если Не ПустаяСтрока(ТекстЗапроса) Тогда + ТекстШаблон = СтрЗаменить(ТекстШаблон, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); // @query-part-1, @query-part-2 + ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС; // @query-part-1 + КонецЕсли; + ТекстЗапроса = ТекстЗапроса + ТекстШаблон; + Возврат ТекстЗапроса; КонецФункции -Функция НайтиСсылкиПоПараметрамОтбора(ТекстЗапроса, Значение) - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("ПараметрПоиска", Значение); - - ТаблицаРезультатов = Запрос.Выполнить().Выгрузить(); - МассивРезультат = ТаблицаРезультатов.ВыгрузитьКолонку("СсылкаНаОбъект"); - Возврат МассивРезультат; -КонецФункции - // Добавление информации по колонке для режима поиска ссылок. // Процедура ДобавитьИнформациюПоКолонке(ИнформацияПоКолонкам, Имя, Представление, Тип, ОбязательнаДляЗаполнения, Позиция, Группа = "") @@ -456,6 +479,7 @@ ТипДанных = ТипЗнч(НоваяСтрока[ИмяКолонки]); Если ТипДанных <> Тип("Строка") И ТипДанных <> Тип("Булево") И ТипДанных <> Тип("Число") И ТипДанных <> Тип("Дата") И ТипДанных <> Тип("УникальныйИдентификатор") Тогда + //@skip-check query-in-loop - построчная загрузка разнородных данных. ДанныеЯчейки = ЗначениеЯчейки(Колонка, Ячейка.Текст); Иначе ДанныеЯчейки = Ячейка.Текст; @@ -485,22 +509,22 @@ ДанныеЯчейки = ""; Для каждого ТипДанных Из Колонка.ТипКолонки.Типы() Цикл - Объект = Метаданные.НайтиПоТипу(ТипДанных); + ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипДанных); - Если Объект = Неопределено Тогда + Если ОбъектМетаданных = Неопределено Тогда Продолжить; КонецЕсли; - ОписаниеОбъекта = РазложитьПолноеИмяОбъекта(Объект.ПолноеИмя()); + ОписаниеОбъекта = РазложитьПолноеИмяОбъекта(ОбъектМетаданных.ПолноеИмя()); Если ОписаниеОбъекта.ТипОбъекта = "Справочник" Тогда - Если НЕ Объект.Автонумерация И Объект.ДлинаКода > 0 Тогда + Если НЕ ОбъектМетаданных.Автонумерация И ОбъектМетаданных.ДлинаКода > 0 Тогда ДанныеЯчейки = Справочники[ОписаниеОбъекта.НазваниеОбъекта].НайтиПоКоду(ЗначениеЯчейки, Истина); КонецЕсли; Если Не ЗначениеЗаполнено(ДанныеЯчейки) И ЗначениеЗаполнено(ЗначениеЯчейки) Тогда //@skip-check query-in-loop - штучные запросы разнородных данных. - ДанныеЯчейки = НайтиПоНаименованию(ЗначениеЯчейки, Объект, Колонка); + ДанныеЯчейки = НайтиПоНаименованию(ЗначениеЯчейки, ОбъектМетаданных, Колонка); КонецЕсли; - Если НЕ ЗначениеЗаполнено(ДанныеЯчейки) Тогда + Если Не ЗначениеЗаполнено(ДанныеЯчейки) Тогда ДанныеЯчейки = Справочники[ОписаниеОбъекта.НазваниеОбъекта].НайтиПоКоду(ЗначениеЯчейки, Истина); КонецЕсли; ИначеЕсли ОписаниеОбъекта.ТипОбъекта = "Перечисление" Тогда @@ -515,10 +539,10 @@ ДанныеЯчейки = ПланыСчетов[ОписаниеОбъекта.НазваниеОбъекта].НайтиПоНаименованию(ЗначениеЯчейки, Истина); КонецЕсли; ИначеЕсли ОписаниеОбъекта.ТипОбъекта = "ПланВидовХарактеристик" Тогда - Если НЕ Объект.Автонумерация И Объект.ДлинаКода > 0 Тогда + Если Не ОбъектМетаданных.Автонумерация И ОбъектМетаданных.ДлинаКода > 0 Тогда ДанныеЯчейки = ПланыВидовХарактеристик[ОписаниеОбъекта.НазваниеОбъекта].НайтиПоКоду(ЗначениеЯчейки); КонецЕсли; - Если НЕ ЗначениеЗаполнено(ДанныеЯчейки) Тогда + Если Не ЗначениеЗаполнено(ДанныеЯчейки) Тогда ДанныеЯчейки = ПланыВидовХарактеристик[ОписаниеОбъекта.НазваниеОбъекта].НайтиПоНаименованию(ЗначениеЯчейки, Истина); КонецЕсли; Иначе @@ -591,6 +615,7 @@ КонецФункции + Процедура ОпределитьПозицииКолонокВМакете(ШаблонСДанными, ИнформацияПоКолонкам) ОбластьЗаголовка = ОбластьЗаголовкаШаблонаТаблицы(ШаблонСДанными); @@ -638,7 +663,7 @@ ИнформацияПоКолонкам.Очистить(); Позиция = 1; - МетаданныеСправочника= Метаданные.НайтиПоПолномуИмени(ПараметрыЗагрузки.ПолноеИмяОбъекта); // ОбъектМетаданныхСправочник, ОбъектМетаданныхДокумент + МетаданныеСправочника= ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПараметрыЗагрузки.ПолноеИмяОбъекта); // ОбъектМетаданныхСправочник, ОбъектМетаданныхДокумент Если НЕ МетаданныеСправочника.Автонумерация И МетаданныеСправочника.ДлинаКода > 0 Тогда СоздатьКолонкуСтандартныеРеквизиты(ИнформацияПоКолонкам, МетаданныеСправочника, "Код", Позиция); @@ -884,7 +909,7 @@ СтруктураНаименованияОбъекта = РазложитьПолноеИмяОбъекта(ПараметрыЗагрузки.ПолноеИмяОбъекта); ИмяОбъектаМетаданных = СтруктураНаименованияОбъекта.ТипОбъекта + "." + СтруктураНаименованияОбъекта.НазваниеОбъекта; - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаМетаданных); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъектаМетаданных); Если ОбъектМетаданных = Неопределено Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Загрузка данных из файла в табличную часть не поддерживается для объектов типа: %1'"), @@ -969,8 +994,7 @@ КонецЕсли; ПредопределенныеОбластиМакета = ПредопределенныеОбластиМакета(); - - МетаданныеСправочника = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПараметрыЗагрузкиИзФайла.ПолноеИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПараметрыЗагрузкиИзФайла.ПолноеИмяОбъекта); Для НомерКолонки = 1 По ОбластьЗаголовокТаблицы.ШиринаТаблицы Цикл Ячейка = ОбластьЗаголовокТаблицы.ПолучитьОбласть(ВысотаШапки, НомерКолонки, ВысотаШапки, НомерКолонки).ТекущаяОбласть; @@ -986,16 +1010,15 @@ КонецЕсли; Если СтрСравнить(ПредставлениеРеквизита, ПредопределенныеОбластиМакета.ДополнительныеРеквизиты) = 0 Тогда - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); - МодульУправлениеСвойствамиСлужебный.КолонкиДляЗагрузкиДанных(МетаданныеСправочника, ИнформацияПоКолонкам); + МодульУправлениеСвойствамиСлужебный.КолонкиДляЗагрузкиДанных(ОбъектМетаданных, ИнформацияПоКолонкам); КонецЕсли; ИначеЕсли СтрСравнить(ПредставлениеРеквизита, ПредопределенныеОбластиМакета.КонтактнаяИнформация) = 0 Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); - МодульУправлениеКонтактнойИнформацией.КолонкиДляЗагрузкиДанных(МетаданныеСправочника, ИнформацияПоКолонкам); + МодульУправлениеКонтактнойИнформацией.КолонкиДляЗагрузкиДанных(ОбъектМетаданных, ИнформацияПоКолонкам); КонецЕсли; Иначе ТипДанныхКолонки = Новый ОписаниеТипов("Строка"); @@ -1029,8 +1052,8 @@ СтрокаИнфоПроКолонки.Примечание = ПримечаниеВШапкеКолонки; СтрокаИнфоПроКолонки.Ширина = Ячейка.ШиринаКолонки; - Если МетаданныеСправочника <> Неопределено Тогда - МетаданныеРеквизита = МетаданныеСправочника.Реквизиты.Найти(ИмяРеквизита); + Если ОбъектМетаданных <> Неопределено И ОбщегоНазначения.ЭтоСправочник(ОбъектМетаданных) Тогда + МетаданныеРеквизита = ОбъектМетаданных.Реквизиты.Найти(ИмяРеквизита); Если МетаданныеРеквизита <> Неопределено Тогда Если МетаданныеРеквизита.Использование = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппы Тогда @@ -1230,6 +1253,9 @@ ВысотаШапки = ?(ЗагрузкаДанныхИзФайлаКлиентСервер.КолонкиИмеютГруппировку(ТаблицаИнформацияПоКолонкам), 2, 1); ИнициализироватьКолонки(ТаблицаИнформацияПоКолонкам, ШаблонСДанными, ВысотаШапки); + Если Не КолонкиИнициализированы(ТаблицаИнформацияПоКолонкам) Тогда + ИнициализироватьКолонки(ТаблицаИнформацияПоКолонкам, ШаблонСДанными, ?(ВысотаШапки = 1, 2, 1)); + КонецЕсли; Для НомерСтроки = ВысотаШапки + 1 По ШаблонСДанными.ВысотаТаблицы Цикл СтрокаТаблицыПустая = Истина; @@ -1243,6 +1269,7 @@ ИмяКолонки = НайденнаяКолонка.ИмяКолонки; НоваяСтрока[ИмяКолонки] = ПриведениеЗначениеКТипу(Ячейка.Текст, НайденнаяКолонка.ТипКолонки); Если Не ЗначениеЗаполнено(НоваяСтрока[ИмяКолонки]) И ЗначениеЗаполнено(Ячейка.Текст) Тогда + //@skip-check query-in-loop - построчная загрузка разнородных данных. НоваяСтрока[ИмяКолонки] = ЗначениеЯчейки(НайденнаяКолонка, Ячейка.Текст); КонецЕсли; Если СтрокаТаблицыПустая Тогда @@ -1257,8 +1284,21 @@ КонецЦикла; АдресЗагруженныхДанных = ПоместитьВоВременноеХранилище(ЗагружаемыеДанные); + КонецПроцедуры +Функция КолонкиИнициализированы(ИнформацияПоКолонкам) + + Для Каждого ИнформацияПоКолонке Из ИнформацияПоКолонкам Цикл + Если ИнформацияПоКолонке.Позиция >=0 Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + Функция ПриведениеЗначениеКТипу(Значение, ОписаниеТипов) Для каждого Тип Из ОписаниеТипов.Типы() Цикл @@ -1455,6 +1495,8 @@ КонецФункции Функция ОпределитьТипОбъектаМетаданныхПоИмени(Имя) + + Для каждого Объект Из Метаданные.Справочники Цикл Если Объект.Имя = Имя Тогда Возврат "Справочник"; @@ -1467,20 +1509,30 @@ КонецЕсли; КонецЦикла; + Для каждого Объект Из Метаданные.Обработки Цикл + Если Объект.Имя = Имя Тогда + Возврат "Обработка"; + КонецЕсли; + КонецЦикла; + Возврат Неопределено; КонецФункции Функция МенеджерОбъекта(ИмяОбъектаСопоставления) - МассивОбъекта = РазложитьПолноеИмяОбъекта(ИмяОбъектаСопоставления); - Если МассивОбъекта.ТипОбъекта = "Документ" Тогда - МенеджерОбъекта = Документы[МассивОбъекта.НазваниеОбъекта]; - ИначеЕсли МассивОбъекта.ТипОбъекта = "Справочник" Тогда - МенеджерОбъекта = Справочники[МассивОбъекта.НазваниеОбъекта]; - Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Объект ""%1"" не найден'"), ИмяОбъектаСопоставления); - КонецЕсли; - - Возврат МенеджерОбъекта; + + МассивОбъекта = РазложитьПолноеИмяОбъекта(ИмяОбъектаСопоставления); + Если МассивОбъекта.ТипОбъекта = "Документ" Тогда + МенеджерОбъекта = Документы[МассивОбъекта.НазваниеОбъекта]; + ИначеЕсли МассивОбъекта.ТипОбъекта = "Справочник" Тогда + МенеджерОбъекта = Справочники[МассивОбъекта.НазваниеОбъекта]; + ИначеЕсли МассивОбъекта.ТипОбъекта = "Обработка" Тогда + МенеджерОбъекта = Обработки[МассивОбъекта.НазваниеОбъекта]; + Иначе + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Объект ""%1"" не найден'"), ИмяОбъектаСопоставления); + КонецЕсли; + + Возврат МенеджерОбъекта; + КонецФункции /////////////// Загрузка данных ////////////////////////// @@ -1518,44 +1570,74 @@ ИмяВременногоФайла = ПараметрыВызоваСервера.ИмяВременногоФайла; ИнформацияПоКолонкам = ПараметрыВызоваСервера.ИнформацияПоКолонкам; - Если Расширение = "csv" Тогда - ЗагрузитьCSVФайлВТаблицу(ИмяВременногоФайла, ШаблонСДанными, ИнформацияПоКолонкам); - Иначе - ЗагруженныйШаблонСДанными = Новый ТабличныйДокумент; - ЗагруженныйШаблонСДанными.Прочитать(ИмяВременногоФайла); + Попытка - НомерСтрокиСШапкойТаблицы = ?(ЗагрузкаДанныхИзФайлаКлиентСервер.КолонкиИмеютГруппировку(ИнформацияПоКолонкам), 2, 1); + Если Расширение = "csv" Тогда + ЗагрузитьCSVФайлВТаблицу(ИмяВременногоФайла, ШаблонСДанными, ИнформацияПоКолонкам); + Иначе + ЗагруженныйШаблонСДанными = Новый ТабличныйДокумент; + ЗагруженныйШаблонСДанными.Прочитать(ИмяВременногоФайла); + + НомерСтрокиСШапкойТаблицы = ?(ЗагрузкаДанныхИзФайлаКлиентСервер.КолонкиИмеютГруппировку(ИнформацияПоКолонкам), 2, 1); + + Адрес = ""; + ТабличныйДокументВТаблицуЗначений(ЗагруженныйШаблонСДанными, ИнформацияПоКолонкам, Адрес); + ЗагруженныеДанные = ПолучитьИзВременногоХранилища(Адрес); + + ОбластьВывода = ШаблонСДанными.ПолучитьОбласть(НомерСтрокиСШапкойТаблицы + 1, 1, НомерСтрокиСШапкойТаблицы + 1, ЗагруженныеДанные.Колонки.Количество()); + + Для Счетчик = 1 По ЗагруженныеДанные.Колонки.Количество() Цикл + ОбластьЗаполнения = ОбластьВывода.Область(1, Счетчик, 1, Счетчик); + Колонка = ИнформацияПоКолонкам.Найти(Счетчик, "Позиция"); + Если Колонка <> Неопределено И Колонка.Видимость Тогда + ОбластьЗаполнения.Параметр = Колонка.ИмяКолонки; + ОбластьЗаполнения.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр; + КонецЕсли; + КонецЦикла; + + ВсегоСтрок = ЗагруженныеДанные.Количество(); + НомерСтроки = 1; + Для Каждого Выборка Из ЗагруженныеДанные Цикл + УстановитьПроцентПрогресса(ВсегоСтрок, НомерСтроки); + ОбластьВывода.Параметры.Заполнить(Выборка); + ШаблонСДанными.Вывести(ОбластьВывода); + НомерСтроки = НомерСтроки + 1; + КонецЦикла; + + КонецЕсли; - Адрес = ""; - ТабличныйДокументВТаблицуЗначений(ЗагруженныйШаблонСДанными, ИнформацияПоКолонкам, Адрес); - ЗагруженныеДанные = ПолучитьИзВременногоХранилища(Адрес); + АдресХранилища = ПоместитьВоВременноеХранилище(ШаблонСДанными, АдресХранилища); + Исключение - ОбластьВывода = ШаблонСДанными.ПолучитьОбласть(НомерСтрокиСШапкойТаблицы + 1, 1, НомерСтрокиСШапкойТаблицы + 1, ЗагруженныеДанные.Колонки.Количество()); + УдалитьВременныйФайл(ИмяВременногоФайла); + ВызватьИсключение; - Для Счетчик = 1 По ЗагруженныеДанные.Колонки.Количество() Цикл - ОбластьЗаполнения = ОбластьВывода.Область(1, Счетчик, 1, Счетчик); - Колонка = ИнформацияПоКолонкам.Найти(Счетчик, "Позиция"); - Если Колонка <> Неопределено И Колонка.Видимость Тогда - ОбластьЗаполнения.Параметр = Колонка.ИмяКолонки; - ОбластьЗаполнения.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр; - КонецЕсли; - КонецЦикла; + КонецПопытки; + + УдалитьВременныйФайл(ИмяВременногоФайла); + +КонецПроцедуры + +Процедура УдалитьВременныйФайл(ИмяВременногоФайла) + + Файл = Новый Файл(ИмяВременногоФайла); + Если Файл.Существует() Тогда - ВсегоСтрок = ЗагруженныеДанные.Количество(); - НомерСтроки = 1; - Для Каждого Выборка Из ЗагруженныеДанные Цикл - УстановитьПроцентПрогресса(ВсегоСтрок, НомерСтроки); - ОбластьВывода.Параметры.Заполнить(Выборка); - ШаблонСДанными.Вывести(ОбластьВывода); - НомерСтроки = НомерСтроки + 1; - КонецЦикла; + Попытка + УдалитьФайлы(ИмяВременногоФайла); + Исключение + + ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не был удален временный файл ""%1"" по причине: + |%2'"), ИмяВременногоФайла, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, + Метаданные.Обработки.ЗагрузкаДанныхИзФайла,, ТекстПредупреждения); + + КонецПопытки; КонецЕсли; - АдресХранилища = ПоместитьВоВременноеХранилище(ШаблонСДанными, АдресХранилища); - - ФайловаяСистема.УдалитьВременныйФайл(ИмяВременногоФайла); - КонецПроцедуры #Область РаботаСCSVФайлами @@ -1784,12 +1866,12 @@ КонецЕсли; ИнформацияОбОшибке = ИнформацияОбОшибке(); СтрокаТаблицы.РезультатСопоставленияСтроки = "Пропущен"; - СтрокаТаблицы.ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + СтрокаТаблицы.ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось записать элемент справочника %1 по причине: |%2'"), - ИмяСправочника, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ИмяСправочника, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, МенеджерСправочника, ЭлементСправочника.Ссылка, ТекстСообщения); КонецПопытки; diff --git a/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/ManagerModule.bsl b/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/ManagerModule.bsl index 26bb6fef5..33c117962 100644 --- a/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/ManagerModule.bsl @@ -30,7 +30,7 @@ Описание.Наименование = НСтр("ru = 'Справочник БИК'"); Описание.ОбновлятьАвтоматически = Истина; Описание.ОбщиеДанные = Истина; - Описание.ОбработкаРазделенныхДанных = Ложь; + Описание.ОбработкаРазделенныхДанных = ОбрабатыватьДанныеОбластейПослеЗагрузкиКлассификатора(); Описание.СохранятьФайлВКэш = Истина; Классификаторы.Добавить(Описание); @@ -288,7 +288,7 @@ ЧтениеZipФайла = Новый ЧтениеZipФайла(ZipФайл); ЧтениеZipФайла.ИзвлечьВсе(ИмяВременногоКаталога); Исключение - ЗаписатьОшибкуВЖурналРегистрации(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьОшибкуВЖурналРегистрации(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); УдалитьФайлы(ИмяВременногоКаталога); КонецПопытки; @@ -357,7 +357,7 @@ |%3'"), Выборка.Ссылка, Выборка.Код, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; КонецЦикла; @@ -516,34 +516,33 @@ // Определяет нужно ли обновление данных классификатора. // Функция КлассификаторАктуален() Экспорт - ПоследнееОбновление = ДатаПоследнейЗагрузки(); - ДопустимаяПросрочка = 30*60*60*24; - Если ТекущаяДатаСеанса() > ПоследнееОбновление + ДопустимаяПросрочка Тогда - Возврат Ложь; // Пошла просрочка. - КонецЕсли; + АктуальностьКлассификатораБанков = АктуальностьКлассификатораБанков(); + Возврат Не АктуальностьКлассификатораБанков.КлассификаторПросрочен; - Возврат Истина; КонецФункции Функция АктуальностьКлассификатораБанков() Экспорт ПоследнееОбновление = ДатаПоследнейЗагрузки(); - ДопустимаяПросрочка = 60*60*24; + ДопустимаяПросрочка = 30; + ДнейСМоментаПоследнегоОбновления = Цел((ТекущаяДатаСеанса() - ПоследнееОбновление)/60/60/24); Результат = Новый Структура; - Результат.Вставить("КлассификаторУстарел", Ложь); - Результат.Вставить("КлассификаторПросрочен", Ложь); - Результат.Вставить("ВеличинаПросрочкиСтрокой", ""); + Результат.Вставить("ДоступноОбновление", Неопределено); + Результат.Вставить("КлассификаторПросрочен", ДнейСМоментаПоследнегоОбновления > ДопустимаяПросрочка); + Результат.Вставить("ВеличинаПросрочкиСтрокой", ОбщегоНазначения.ИнтервалВремениСтрокой( + ПоследнееОбновление, ТекущаяДатаСеанса())); - Если ТекущаяДатаСеанса() > ПоследнееОбновление + ДопустимаяПросрочка Тогда - Результат.ВеличинаПросрочкиСтрокой = ОбщегоНазначения.ИнтервалВремениСтрокой(ПоследнееОбновление, ТекущаяДатаСеанса()); - - ВеличинаПросрочки = (ТекущаяДатаСеанса() - ПоследнееОбновление); - ДнейПросрочено = Цел(ВеличинаПросрочки/60/60/24); - - Результат.КлассификаторУстарел = ДнейПросрочено >= 1; - Результат.КлассификаторПросрочен = ДнейПросрочено >= 7; + Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.РаботаСКлассификаторами") Тогда + МодульРаботаСКлассификаторами = ОбщегоНазначения.ОбщийМодуль("РаботаСКлассификаторами"); + Классификаторы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ИдентификаторКлассификатора()); + Обновления = МодульРаботаСКлассификаторами.ДоступныеОбновленияКлассификаторов(Классификаторы); + Если Не ЗначениеЗаполнено(Обновления.КодОшибки) Тогда + ДоступноОбновление = Обновления.ДоступныеВерсии.Количество() > 0; + Результат.ДоступноОбновление = ДоступноОбновление; + Результат.КлассификаторПросрочен = ДоступноОбновление И Результат.КлассификаторПросрочен; + КонецЕсли; КонецЕсли; Возврат Результат; @@ -643,6 +642,18 @@ КонецФункции +Функция ОбрабатыватьДанныеОбластейПослеЗагрузкиКлассификатора() + + Настройки = Новый Структура; + Настройки.Вставить("ОбрабатыватьОбластиДанных", Ложь); + + ИнтеграцияПодсистемБСП.ПриОпределенииНастроекЗагрузкиКлассификатораБанков(Настройки); + РаботаСБанкамиПереопределяемый.ПриОпределенииНастроекЗагрузкиКлассификатораБанков(Настройки); + + Возврат Настройки.ОбрабатыватьОбластиДанных; + +КонецФункции + #КонецОбласти #КонецЕсли \ No newline at end of file diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПараметрыПрописиВалюты_ru/Form.form b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПараметрыПрописиВалюты_ru/Form.form index de2bc784c..997b42e1b 100644 --- a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПараметрыПрописиВалюты_ru/Form.form +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПараметрыПрописиВалюты_ru/Form.form @@ -277,7 +277,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -570,7 +569,6 @@ UsualGroup HorizontalIfPossible - Auto true true @@ -681,7 +679,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -711,7 +708,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -835,7 +831,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПодборВалютИзКлассификатора/Form.form b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПодборВалютИзКлассификатора/Form.form index ecd50cec8..e960fad5f 100644 --- a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПодборВалютИзКлассификатора/Form.form +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПодборВалютИзКлассификатора/Form.form @@ -360,6 +360,7 @@ Auto Left + true Selection diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПодборВалютИзКлассификатора/Module.bsl b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПодборВалютИзКлассификатора/Module.bsl index c7afba3e2..d3c7d341a 100644 --- a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПодборВалютИзКлассификатора/Module.bsl +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПодборВалютИзКлассификатора/Module.bsl @@ -119,7 +119,7 @@ ПоказатьОповещениеПользователя( НСтр("ru = 'Валюты добавлены.'"), , - ?(СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено И ЕстьКурсы, + ?(ОбщегоНазначенияКлиент.РазделениеВключено() И ЕстьКурсы, НСтр("ru = 'Курсы будут загружены автоматически через непродолжительное время.'"), ""), БиблиотекаКартинок.Информация32); Закрыть(); diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Form.form b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Form.form index 485d34e61..9c87d93c7 100644 --- a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Form.form @@ -211,6 +211,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 87 + + СтрокаПоискаРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 88 + true + + СписокВалют + + true + + true true @@ -258,7 +290,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/ManagerModule.bsl b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/ManagerModule.bsl index 4acb284b9..2ed6ecbeb 100644 --- a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/ManagerModule.bsl @@ -121,6 +121,7 @@ ТекущаяДата = ТекущаяДатаСеанса(); ПриЗагрузкеВозниклиОшибки = Ложь; + ВалютыЗагружаемыеИзИнтернета = ВалютыЗагружаемыеИзИнтернета(); Если ПараметрыЗагрузки = Неопределено Тогда ТекстЗапроса = @@ -144,11 +145,11 @@ Пока Выборка.Следующий() Цикл НачалоПериода = ?(Выборка.ДатаКурса = '198001010000', НачалоГода(ДобавитьМесяц(ТекущаяДата, -12)), Выборка.ДатаКурса + 60*60*24); СписокВалют = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Выборка); - ЗагрузитьКурсыВалютПоПараметрам(СписокВалют, НачалоПериода, КонецПериода, ПриЗагрузкеВозниклиОшибки); + ЗагрузитьКурсыВалютПоПараметрам(СписокВалют, НачалоПериода, КонецПериода, ВалютыЗагружаемыеИзИнтернета, ПриЗагрузкеВозниклиОшибки); КонецЦикла; Иначе Результат = ЗагрузитьКурсыВалютПоПараметрам(ПараметрыЗагрузки.СписокВалют, - ПараметрыЗагрузки.НачалоПериода, ПараметрыЗагрузки.КонецПериода, ПриЗагрузкеВозниклиОшибки); + ПараметрыЗагрузки.НачалоПериода, ПараметрыЗагрузки.КонецПериода, ВалютыЗагружаемыеИзИнтернета, ПриЗагрузкеВозниклиОшибки); КонецЕсли; Если АдресРезультата <> Неопределено Тогда @@ -265,14 +266,16 @@ // * Валюта - СправочникСсылка.Валюты // НачалоПериодаЗагрузки - Дата - начало периода загрузки курсов. // ОкончаниеПериодаЗагрузки - Дата - окончание периода загрузки курсов. -// +// ВалютыЗагружаемыеИзИнтернета - см. ВалютыЗагружаемыеИзИнтернета +// // Возвращаемое значение: // Массив из Структура: // Валюта - СправочникСсылка.Валюты - загружаемая валюта. // СтатусОперации - Булево - завершилась ли загрузка успешно. // Сообщение - Строка - текст сообщения об ошибке или поясняющее сообщение. // -Функция ЗагрузитьКурсыВалютПоПараметрам(Знач Валюты, Знач НачалоПериодаЗагрузки, Знач ОкончаниеПериодаЗагрузки, ПриЗагрузкеВозниклиОшибки = Ложь) +Функция ЗагрузитьКурсыВалютПоПараметрам(Знач Валюты, Знач НачалоПериодаЗагрузки, Знач ОкончаниеПериодаЗагрузки, + Знач ВалютыЗагружаемыеИзИнтернета, ПриЗагрузкеВозниклиОшибки = Ложь) СостояниеЗагрузки = Новый Массив; @@ -303,8 +306,6 @@ УстановитьПривилегированныйРежим(Ложь); КонецЕсли; - ВалютыЗагружаемыеИзИнтернета = ВалютыЗагружаемыеИзИнтернета(); - Для Каждого Валюта Из Валюты Цикл Если ВалютыЗагружаемыеИзИнтернета.Найти(Валюта.Валюта) = Неопределено Тогда ПриЗагрузкеВозниклиОшибки = Истина; @@ -372,15 +373,16 @@ ИмяФайла = ПутьКФайлу; КонецЕсли; - Текст = Новый ТекстовыйДокумент(); - Текст.Прочитать(ИмяФайла, КодировкаТекста.ANSI); - ЗагружаемыеДаты = Новый Соответствие; - ДатаЗапрета = Неопределено; - Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл - - Стр = Текст.ПолучитьСтроку(НомерСтроки); + + ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.ANSI); + Текст = ЧтениеТекста.Прочитать(); + ЧтениеТекста.Закрыть(); + + СтрокиТекста = СтрРазделить(Текст, Символы.ПС + Символы.ВК, Ложь); + Для Индекс = -СтрокиТекста.ВГраница() По 0 Цикл + Стр = СтрокиТекста[-Индекс]; Если (Стр = "") ИЛИ (СтрНайти(Стр, Символы.Таб) = 0) Тогда Продолжить; КонецЕсли; @@ -399,11 +401,11 @@ КонецЕсли; Если ДатаКурса > ОкончаниеПериодаЗагрузки Тогда - Прервать; + Продолжить; КонецЕсли; Если ДатаКурса < НачалоПериодаЗагрузки Тогда - Продолжить; + Прервать; КонецЕсли; ЗагружаемыеДаты.Вставить(ДатаКурса, Истина); @@ -419,16 +421,13 @@ Записывать = Истина; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда - МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); - Если МодульДатыЗапретаИзмененияСлужебный.ЗапретИзмененияПроверяется(Метаданные.РегистрыСведений.КурсыВалют) Тогда - МодульДатыЗапретаИзменения = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзменения"); - Записывать = Не МодульДатыЗапретаИзменения.ИзменениеЗапрещено(НаборЗаписей); - Если Не Записывать Тогда - Если ДатаЗапрета = Неопределено Тогда - ДатаЗапрета = ДатаКурса; - Иначе - ДатаЗапрета = Макс(ДатаЗапрета, ДатаКурса); - КонецЕсли; + МодульДатыЗапретаИзменения = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзменения"); + Записывать = Не МодульДатыЗапретаИзменения.ИзменениеЗапрещено(НаборЗаписей); + Если Не Записывать Тогда + Если ДатаЗапрета = Неопределено Тогда + ДатаЗапрета = ДатаКурса; + Иначе + ДатаЗапрета = Макс(ДатаЗапрета, ДатаКурса); КонецЕсли; КонецЕсли; КонецЕсли; @@ -626,6 +625,9 @@ Возврат Результат; КонецФункции +// Возвращаемое значение: +// Массив из СправочникСсылка.Валюты +// Функция ВалютыЗагружаемыеИзИнтернета() Экспорт ТекстЗапроса = diff --git a/SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ObjectModule.bsl b/SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ObjectModule.bsl index c74ec0b5e..339eb7025 100644 --- a/SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ObjectModule.bsl @@ -62,7 +62,7 @@ Исключение // фиксируем ошибку - СообщитьОбОшибкеОбработки(2, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + СообщитьОбОшибкеОбработки(2, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; @@ -122,14 +122,14 @@ Правила.Прочитать(); Исключение Правила = Неопределено; - СообщитьОбОшибкеОбработки(1, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + СообщитьОбОшибкеОбработки(1, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат; КонецПопытки; Попытка ЗагрузитьРегистрацию(Правила, ТолькоИнформация); Исключение - СообщитьОбОшибкеОбработки(2, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + СообщитьОбОшибкеОбработки(2, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Правила.Закрыть(); diff --git a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Form.form b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Form.form index f633226ce..d62de291c 100644 --- a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Form.form +++ b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Form.form @@ -1,5 +1,5 @@ - + <key>ru</key> <value>Замена элементов</value> @@ -121,7 +121,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -151,13 +150,17 @@ <items xsi:type="form:FormField"> <name>СписокСтандартнаяКартинка</name> <id>192</id> + <title> + <key>ru</key> + <value>Картинка</value> + true true true - Список.DefaultPicture + Список.СтандартнаяКартинка None @@ -175,20 +178,19 @@ 193 true - PictureField + InputField Enter true Left true - + true true - true - true - - - 1 - + true + true + true + true + Normal @@ -821,6 +823,38 @@ + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 241 + + СтрокаПоискаРасширеннаяПодсказка + 243 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 242 + true + + НеудачныеЗамены + + true + + true true @@ -1630,7 +1664,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1885,13 +1918,86 @@ NULL КАК Владелец, NULL КАК Код, ЛОЖЬ КАК ПометкаУдаления, - ЛОЖЬ КАК ЭтоГруппа + ЛОЖЬ КАК ЭтоГруппа, + NULL КАК СтандартнаяКартинка true true true true + + Ссылка + Ссылка + + <localValue> + <content> + <key>ru</key> + <value>Ссылка</value> + </content> + </localValue> + + + + Владелец + Владелец + + <localValue> + <content> + <key>ru</key> + <value>Владелец</value> + </content> + </localValue> + + + + Код + Код + + <localValue> + <content> + <key>ru</key> + <value>Код</value> + </content> + </localValue> + + + + ПометкаУдаления + ПометкаУдаления + + <localValue> + <content> + <key>ru</key> + <value>Пометка удаления</value> + </content> + </localValue> + + + + ЭтоГруппа + ЭтоГруппа + + <localValue> + <content> + <key>ru</key> + <value>Это группа</value> + </content> + </localValue> + + + + СтандартнаяКартинка + СтандартнаяКартинка + + <localValue> + <content> + <key>ru</key> + <value>Стандартная картинка</value> + </content> + </localValue> + + diff --git a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Module.bsl b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Module.bsl index 7a8514c20..51baf042b 100644 --- a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Module.bsl +++ b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Module.bsl @@ -935,7 +935,7 @@ Если Задание.Статус <> "Выполнено" Тогда // Фоновое задание завершено с ошибкой. - Кратко = НСтр("ru = 'При замене элементов возникла ошибка:'") + Символы.ПС + Задание.КраткоеПредставлениеОшибки; + Кратко = НСтр("ru = 'Не выполнена замена элементов по причине:'") + Символы.ПС + Задание.КраткоеПредставлениеОшибки; Подробно = Кратко + Символы.ПС + Символы.ПС + Задание.ПодробноеПредставлениеОшибки; Элементы.НадписьТекстОшибки.Заголовок = Кратко; Элементы.СсылкаПодробнее.Подсказка = Подробно; @@ -1024,7 +1024,7 @@ СтрокаОшибки.Причина = НСтр("ru = 'Невозможно удалить данные.'"); Иначе - СтрокаОшибки.Причина = НСтр("ru = 'Неизвестная ошибка.'"); + СтрокаОшибки.Причина = НСтр("ru = 'Непредвиденная ситуация.'"); КонецЕсли; diff --git a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Form.form b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Form.form index f3ca16db8..c1a78e009 100644 --- a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Form.form +++ b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Form.form @@ -331,6 +331,10 @@ true + + <key>ru</key> + <value>Сортировать</value> + ГруппаСортироватьРасширеннаяПодсказка 242 @@ -448,6 +452,38 @@ + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоискаМестаИспользования + 246 + + СтрокаПоискаМестаИспользованияРасширеннаяПодсказка + 248 + Label + true + true + + Left + + + + СтрокаПоискаМестаИспользованияКонтекстноеМеню + 247 + true + + МестаИспользования + + true + + true true @@ -1260,7 +1296,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1685,6 +1720,38 @@ + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоискаНеудачныеЗамены + 243 + + СтрокаПоискаНеудачныеЗаменыРасширеннаяПодсказка + 245 + Label + true + true + + Left + + + + СтрокаПоискаНеудачныеЗаменыКонтекстноеМеню + 244 + true + + НеудачныеЗамены + + true + + true true @@ -2496,7 +2563,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Module.bsl b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Module.bsl index 693975949..4da061d90 100644 --- a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Module.bsl +++ b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Module.bsl @@ -1175,7 +1175,7 @@ СтрокаОшибки.Причина = НСтр("ru = 'Невозможно удалить данные.'"); Иначе - СтрокаОшибки.Причина = НСтр("ru = 'Неизвестная ошибка.'"); + СтрокаОшибки.Причина = НСтр("ru = 'Непредвиденная ситуация.'"); КонецЕсли; diff --git a/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/ManagerModule.bsl b/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/ManagerModule.bsl index 0cbd6f410..fb61e5b82 100644 --- a/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/ManagerModule.bsl @@ -51,13 +51,13 @@ Функция ВерсияОбновленияПроизводственныхКалендарей() Экспорт - Возврат "3.1.7.370"; + Возврат "3.1.8.263"; КонецФункции Функция ВерсияОбновленияДанныхПроизводственныхКалендарей() Экспорт - Возврат "3.1.7.370"; + Возврат "3.1.8.263"; КонецФункции @@ -227,6 +227,10 @@ Если НомерГода >= 2017 И НомерГода < 2021 Тогда ДобавитьПраздникРадоница(ПраздничныеДни, НомерГода, Ложь, Ложь, Истина); КонецЕсли; + + Если НомерГода >= 2016 Тогда + ДобавитьПраздничныйДень(ПраздничныеДни, 7, 9, НомерГода); + КонецЕсли; КонецПроцедуры @@ -395,6 +399,14 @@ // Отменен с 2020 года. ДобавитьПраздничныйДень(ПраздничныеДни, 18, 3, НомерГода); КонецЕсли; + + // 18 марта - День возвращения города Севастополя в Россию. + Если НомерГода >= 2023 Тогда + // Возвращен с 2023 года. + ДобавитьПраздничныйДень(ПраздничныеДни, 18, 3, НомерГода); + // Добавлен праздничный день - День основания города Севастополя. + ДобавитьПраздничныйДень(ПраздничныеДни, 14, 6, НомерГода); + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Forms/Форма/Form.form b/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Forms/Форма/Form.form index 96e9321ff..cf15c69e8 100644 --- a/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Forms/Форма/Form.form @@ -170,7 +170,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -209,42 +208,6 @@ UserCmds Auto - - УстановитьОтбор - 42 - true - true - - true - - false - - УстановитьОтборExtendedTooltip - 146 - Label - true - true - - Left - - - 0 - Normal - Auto - true - true - UserCmds - - Style.ButtonTextColor - - - Style.ButtonBackColor - - - Style.BorderColor - - Auto - УстановитьОтборПоЗначениюВТекущейКолонке 43 @@ -600,6 +563,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 198 + + СтрокаПоискРасширеннаяПодсказка + 200 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 199 + true + + Журнал + + true + + true true @@ -1929,7 +1924,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1958,7 +1952,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true diff --git a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Информация/Form.form b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Информация/Form.form index 3166ecce7..5bf7037a0 100644 --- a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Информация/Form.form +++ b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Информация/Form.form @@ -218,7 +218,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -303,7 +302,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -372,7 +370,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -528,7 +525,6 @@ UsualGroup AlwaysHorizontal - Auto NormalSeparation true true @@ -638,7 +634,6 @@ UsualGroup AlwaysHorizontal - Auto NormalSeparation true true @@ -671,7 +666,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -764,7 +758,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -824,7 +817,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -855,7 +847,6 @@ UsualGroup Vertical - Auto WeakSeparation true Auto diff --git a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Информация/Module.bsl b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Информация/Module.bsl index e5d38eac0..5d157feea 100644 --- a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Информация/Module.bsl +++ b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Информация/Module.bsl @@ -23,7 +23,7 @@ Иначе Заголовок = НСтр("ru = 'Информация об ошибке'"); Элементы.ГруппаКомандыОшибки.Видимость = Истина; - Элементы.ГруппаКомандыПодтверждения.Видимость = Ложь; + Элементы.ГруппаКомандыПодтверждения.Видимость = Ложь; Элементы.ГруппаЗаявление.Видимость = Ложь; Элементы.ГруппаСертификат.Видимость = Ложь; КонецЕсли; diff --git a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/СведенияОВладельцеСертификата/Form.form b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/СведенияОВладельцеСертификата/Form.form index 48a0514c9..2fb143d9f 100644 --- a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/СведенияОВладельцеСертификата/Form.form +++ b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/СведенияОВладельцеСертификата/Form.form @@ -193,7 +193,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -339,7 +338,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -478,7 +476,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -618,7 +615,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -940,7 +936,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1078,7 +1073,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1107,7 +1101,6 @@ UsualGroup AlwaysHorizontal - Auto true true auto @@ -1245,7 +1238,6 @@ HorizontalIfPossible Center - Auto true true Auto @@ -1389,7 +1381,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1418,7 +1409,6 @@ UsualGroup Vertical - Auto true true auto @@ -1448,7 +1438,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/СведенияОбОрганизации/Form.form b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/СведенияОбОрганизации/Form.form index 92a2bec9e..e73437e16 100644 --- a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/СведенияОбОрганизации/Form.form +++ b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/СведенияОбОрганизации/Form.form @@ -131,7 +131,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -378,7 +377,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -510,7 +508,6 @@ UsualGroup Vertical - Auto true true Auto @@ -643,7 +640,6 @@ UsualGroup Vertical - Auto true true Auto @@ -672,7 +668,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -808,7 +803,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -898,7 +892,6 @@ UsualGroup Vertical - Auto true true auto @@ -928,7 +921,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Форма/Form.form b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Форма/Form.form index d4dd69370..501b3d22e 100644 --- a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Форма/Form.form @@ -138,7 +138,6 @@ UsualGroup AlwaysHorizontal - Auto true true @@ -306,7 +305,6 @@ UsualGroup AlwaysHorizontal - Auto WeakSeparation true true @@ -378,7 +376,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -569,7 +566,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -639,7 +635,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -835,7 +830,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1050,7 +1044,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -1257,7 +1250,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -1286,7 +1278,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -1294,6 +1285,116 @@ Auto + + ГруппаПодсказкаКриптопровайдеры + 941 + + ДекорацияИнформацияКриптопровайдеры + 943 + + <key>ru</key> + <value>Декорация информация</value> + + true + true + + true + + + ДекорацияИнформацияКриптопровайдерыРасширеннаяПодсказка + 945 + Label + true + true + + Left + + + + ДекорацияИнформацияКриптопровайдерыКонтекстноеМеню + 944 + true + + true + + + StdPicture.Information + + AsFileRef + + + + ДекорацияПроверкаУстановкиКриптопровайдера + 946 + + <key>ru</key> + <value><link ПроверитьУстановкуПрограммКриптографии>Нажмите здесь</>, чтобы выбрать программу для работы с электронной подписью, установленную на компьютере. </value> + + true + true + + true + + Button + + ДекорацияПроверкаУстановкиКриптопровайдераРасширеннаяПодсказка + 948 + + <key>ru</key> + <value>Не удалось определить программу автоматически по причине:</value> + + Label + true + true + + Left + + + + ДекорацияПроверкаУстановкиКриптопровайдераКонтекстноеМеню + 947 + true + + true + Label + true + + + URLProcessing + ДекорацияПроверкаУстановкиКриптопровайдераОбработкаНавигационнойСсылки + + Left + + + true + true + + true + + + <key>ru</key> + <value>Подсказка о криптопровайдерах</value> + + + ГруппаПодсказкаКриптопровайдерыРасширеннаяПодсказка + 942 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + NormalSeparation + true + true + Auto + Auto + + ГруппаПрограмма 740 @@ -1344,6 +1445,85 @@ Left + + ПредставлениеПрограммы + 949 + + <key>ru</key> + <value>с помощью программы</value> + + true + true + + true + + + ПредставлениеПрограммы + + Button + + ПредставлениеПрограммыРасширеннаяПодсказка + 951 + + <key>ru</key> + <value>Программа для работы с электронной подписью должна быть установлена на компьютере</value> + + Label + true + true + + + URLProcessing + ПрограммаРасширеннаяПодсказкаОбработкаНавигационнойСсылки + + Left + + + + ПредставлениеПрограммыКонтекстноеМеню + 950 + true + + InputField + true + Enter + true + Left + true + + + AutoComplete + ПрограммаАвтоПодбор + + + StartChoice + ПрограммаНачалоВыбора + + + TextEditEnd + ПрограммаОкончаниеВводаТекста + + + ChoiceProcessing + ПрограммаОбработкаВыбора + + 30 + true + true + false + true + true + false + false + false + true + true + true + true + Normal + DontUse + + Программа 1 @@ -1365,15 +1545,8 @@ 3 <key>ru</key> - <value><color #807A59>Если не установлена программа электронной подписи, установите КриптоПро CSP или VipNet CSP.</><color #807A59> - -По вопросам работы программы обратитесь к ее документации. Или воспользуйтесь </><link %1>дополнительной инструкцией на сайте 1С</><color #807A59>. - -</><b><color #807A59>Ключ электронной подписи</></><color #807A59> - это секретная информация, которая сохраняется на компьютер, флешку, дискету или другой носитель информации и используется в дальнейшем для создания электронных подписей. - -</><b><color #807A59>Запрос на сертификат</></><color #807A59> - это не секретная информация, которая создается на основе ключа электронной подписи, отправляется вместе с заявлением на выпуск сертификата и требуется для выпуска сертификата.</></value> + <value>Программа для работы с электронной подписью должна быть установлена на компьютере</value> - true Label true true @@ -1430,6 +1603,40 @@ DontUse + + ДекорацияПрограмма + 952 + + <key>ru</key> + <value>Программа определена автоматически</value> + + true + true + + true + + + ДекорацияПрограммаРасширеннаяПодсказка + 954 + Label + true + true + + Left + + + + ДекорацияПрограммаКонтекстноеМеню + 953 + true + + Label + true + true + + Left + + true true @@ -1453,7 +1660,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1606,7 +1812,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1761,7 +1966,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1822,7 +2026,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1943,7 +2146,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2006,7 +2208,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -2037,7 +2238,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2417,7 +2617,6 @@ UsualGroup AlwaysHorizontal - Auto WeakSeparation true true @@ -4137,6 +4336,20 @@ true + + ПрограммаИдентификатор + 128 + + String + + + + true + + + true + + ПодтвержденоОзнакомлениеСИнформацией 129 diff --git a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Форма/Module.bsl index 6cf2aea76..9da5dacb3 100644 --- a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Форма/Module.bsl @@ -9,7 +9,7 @@ #Область ОписаниеПеременных &НаКлиенте -Перем Криптография, РаботаСДвоичнымиДанными; +Перем Криптография, РаботаСДвоичнымиДанными, ПрограммыАвто; #КонецОбласти @@ -106,6 +106,20 @@ Модифицированность = Ложь; КонецЕсли; + Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Ложь; + + ПодсказкаДляПрограммы = СтроковыеФункции.ФорматированнаяСтрока( + НСтр("ru = 'Если не установлена программа электронной подписи, установите %1 или %2. + | + |По вопросам работы программы обратитесь к ее документации. Или воспользуйтесь дополнительной инструкцией на сайте 1С. + |Ключ электронной подписи - это секретная информация, которая сохраняется на компьютер, флешку, дискету или другой носитель информации и используется в дальнейшем для создания электронных подписей. + |Запрос на сертификат - это не секретная информация, которая создается на основе ключа электронной подписи, отправляется вместе с заявлением на выпуск сертификата и требуется для выпуска сертификата.'"), + ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыКриптоПро(), + ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыVipNet()); + + Элементы.ПрограммаРасширеннаяПодсказка.Заголовок = ПодсказкаДляПрограммы; + Элементы.ПредставлениеПрограммыРасширеннаяПодсказка.Заголовок = ПодсказкаДляПрограммы; + Элементы.ДекорацияПрограмма.Видимость = Ложь; СтандартныеПодсистемыСервер.СброситьРазмерыИПоложениеОкна(ЭтотОбъект); КонецПроцедуры @@ -113,6 +127,8 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) + ПрограммыАвто = Новый Соответствие; + Если ДанныеЗаявления.СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияНаВыпускСертификата.НеПодготовлено") Тогда ПодключитьОбработчикОжидания("ПриИзмененииСоставаИлиНастроекПрограмм", 0.1, Истина); КонецЕсли; @@ -602,35 +618,32 @@ СтандартнаяОбработка = Ложь; Если ТипЗнч(ВыбранноеЗначение) = Тип("Строка") Тогда - Представление = ПоставляемоеПредставлениеПрограммы(СписокПрограмм, ВыбранноеЗначение); - Если Не ЭтоПолноправныйПользователь Тогда + ПрограммаАвто = ПрограммыАвто.Получить(ВыбранноеЗначение); + Если ПрограммаАвто <> Неопределено Тогда - ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Программа %1 еще не добавлена в список используемых программ. - |Обратитесь к администратору.'"), - Представление)); + Если ЗначениеЗаполнено(Объект.Программа) Или ПрограммаИдентификатор <> ВыбранноеЗначение Тогда + ПриПотереГотовности(ЭтотОбъект); + КонецЕсли; - ИначеЕсли ЭтоПодчиненныйУзелРИБ Тогда + Объект.Программа = Неопределено; + ПрограммаИдентификатор = ВыбранноеЗначение; + ПредставлениеПрограммы = ПрограммаАвто.Представление; + УстановитьВидимостьПрограммы(); + ПодключитьОбработчикОжидания("ПослеВыбораПрограммыОбработчикОжидания", 0.1, Истина); - ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Программа %1 еще не добавлена в список используемых программ. - |Выполните добавление в главном узле информационной базы.'"), - Представление)); + Возврат; - Иначе - - Кнопки = Новый СписокЗначений; - Кнопки.Добавить("Добавить", НСтр("ru = 'Добавить'")); - Кнопки.Добавить("НеДобавлять", НСтр("ru = 'Не добавлять'")); - ПоказатьВопрос(Новый ОписаниеОповещения("ПрограммаОбработкаВыбораПродолжение", ЭтотОбъект, ВыбранноеЗначение), - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Программа %1 еще не добавлена в список используемых программ. - |Добавить?'"), - Представление), - Кнопки,, "НеДобавлять"); - КонецЕсли; + ПараметрыПроверки = Новый Структура; + ПараметрыПроверки.Вставить("УстанавливатьРасширение", Ложь); + ПараметрыПроверки.Вставить("УстанавливатьКомпоненту", Ложь); + ПараметрыПроверки.Вставить("ПроверятьНаСервере", Ложь); + + ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьУстановленныеКриптопровайдеры( + Новый ОписаниеОповещения("ДобавитьПрограммуПослеПроверкиУстановленных", ЭтотОбъект, ВыбранноеЗначение), + ПараметрыПроверки); + Возврат; КонецЕсли; @@ -639,6 +652,8 @@ КонецЕсли; Объект.Программа = ВыбранноеЗначение; + ПрограммаИдентификатор = Неопределено; + УстановитьВидимостьПрограммы(); ПодключитьОбработчикОжидания("ПослеВыбораПрограммыОбработчикОжидания", 0.1, Истина); КонецПроцедуры @@ -770,6 +785,23 @@ КонецПроцедуры +&НаКлиенте +Процедура ДекорацияПроверкаУстановкиКриптопровайдераОбработкаНавигационнойСсылки( + Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ПараметрыПроверки = Новый Структура; + ПараметрыПроверки.Вставить("УстанавливатьРасширение", Истина); + ПараметрыПроверки.Вставить("УстанавливатьКомпоненту", Истина); + ПараметрыПроверки.Вставить("ПроверятьНаСервере", Ложь); + + ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьУстановленныеКриптопровайдеры( + Новый ОписаниеОповещения("ПослеПолученияПрограммКриптографии", ЭтотОбъект), + ПараметрыПроверки); + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы @@ -1084,7 +1116,8 @@ | СертификатыКлючейЭлектроннойПодписиИШифрования.ДействителенДо КАК ДействителенДо, | СертификатыКлючейЭлектроннойПодписиИШифрования.Ссылка КАК Ссылка, | Представление(СертификатыКлючейЭлектроннойПодписиИШифрования.Ссылка) КАК СертификатПредставление, - | ЕСТЬNULL(ЗаявленияНаВыпускСертификата.СостояниеЗаявления, Неопределено) КАК СостояниеЗаявления + | ЕСТЬNULL(ЗаявленияНаВыпускСертификата.СостояниеЗаявления, Неопределено) КАК СостояниеЗаявления, + | СертификатыКлючейЭлектроннойПодписиИШифрования.ДанныеСертификата КАК ДанныеСертификата |ИЗ | Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК СертификатыКлючейЭлектроннойПодписиИШифрования | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗаявленияНаВыпускСертификата КАК ЗаявленияНаВыпускСертификата @@ -1093,7 +1126,7 @@ | СертификатыКлючейЭлектроннойПодписиИШифрования.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", СертификатОснование); - ДанныеСертификатаОснования= Запрос.Выполнить().Выбрать(); + ДанныеСертификатаОснования = Запрос.Выполнить().Выбрать(); ДанныеСертификатаОснования.Следующий(); Объект.Пользователь = ДанныеСертификатаОснования.Пользователь; @@ -1146,30 +1179,23 @@ КопияСвойств = Новый Структура(КопируемыеСвойства); ЗаполнитьЗначенияСвойств(КопияСвойств, Содержание); ЗаполнитьЗначенияСвойств(ЭтотОбъект, КопияСвойств); - + Иначе - - Организация = ДанныеСертификатаОснования.Организация; - ЗаполнитьРеквизитыОрганизации(); - - РеквизитыВладельца = РеквизитыВладельцаСертификата(); - ЗаполнитьЗначенияСвойств(РеквизитыВладельца, ДанныеСертификатаОснования, "Фамилия, Имя, Отчество, Должность"); - УстановитьРеквизитыВладельца(РеквизитыВладельца); - - ДозаполнитьПоПредыдущемуЗаявлению(); + + ДозаполнитьПоПредыдущемуЗаявлениюИлиСертификату(ДанныеСертификатаОснования); КонецЕсли; Если Не ЗначениеЗаполнено(Сотрудник) Тогда Сотрудник = ДанныеСертификатаОснования.Сотрудник; - КонецЕсли; - + КонецЕсли; + Объект.Программа = ДанныеСертификатаОснования.Программа; СертификатОснованиеДействуетДо = ДанныеСертификатаОснования.ДействителенДо; - Если ПроверитьСертификатНаВозможностьЭлектронногоПродления(ДанныеСертификатаОснования, Ложь) Тогда - ДанныеЗаявленияМенеджерЗаписи.ОформленоВЭлектронномВиде = Истина; - КонецЕсли; + + ДанныеЗаявленияМенеджерЗаписи.ОформленоВЭлектронномВиде = ПроверитьСертификатНаВозможностьЭлектронногоПродления( + ДанныеСертификатаОснования, Ложь); ЗначениеВРеквизитФормы(ДанныеЗаявленияМенеджерЗаписи, "ДанныеЗаявления"); @@ -1324,6 +1350,7 @@ ОбновитьЗначение(Содержание, "КонтейнерКлючаПуть"); ОбновитьЗначение(Содержание, "ПрограммаИмя"); ОбновитьЗначение(Содержание, "ПрограммаТип"); + ОбновитьЗначение(Содержание, "ПрограммаИдентификатор"); ИначеЕсли ДанныеЗаявления.СостояниеЗаявления = Перечисления.СостоянияЗаявленияНаВыпускСертификата.Подготовлено Тогда @@ -1335,6 +1362,7 @@ ОбновитьЗначение(Содержание, "КонтейнерКлючаПуть"); ОбновитьЗначение(Содержание, "ПрограммаИмя"); ОбновитьЗначение(Содержание, "ПрограммаТип"); + ОбновитьЗначение(Содержание, "ПрограммаИдентификатор"); ОбновитьЗначение(Содержание, "ЗапросНаСертификат", ПолучитьИзВременногоХранилища(АдресЗапросаНаСертификат)); ОбновитьЗначение(Содержание, "ОткрытаяЧастьКлючаЭП"); ОбновитьЗначение(Содержание, "ИдентификаторКлючаСубъекта"); @@ -1555,7 +1583,11 @@ Элементы.ОтправитьЗаявление.Доступность = Не ТолькоПросмотрЭлементов; Элементы.НапомнитьОГотовности.Видимость = ДоступныНапоминанияПользователя - И (ДанныеЗаявления.СостояниеЗаявления = Перечисления.СостоянияЗаявленияНаВыпускСертификата.Отправлено); + И (ДанныеЗаявления.СостояниеЗаявления = Перечисления.СостоянияЗаявленияНаВыпускСертификата.Отправлено); + + ВидимостьПрограммы = ЗначениеЗаполнено(Объект.Программа); + Элементы.Программа.Видимость = ВидимостьПрограммы; + Элементы.ПредставлениеПрограммы.Видимость = Не ВидимостьПрограммы; КонецПроцедуры @@ -1723,7 +1755,7 @@ МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); ЭтотОбъект[ИмяРеквизита] = МодульУправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации( Реквизиты[ИмяРеквизита]); - + КонецЕсли; ИначеЕсли ТолькоЦифры Тогда @@ -2150,6 +2182,10 @@ ЭтоЮридическоеЛицо = Не ЭтоФизическоеЛицо И Не ЭтоИндивидуальныйПредприниматель; + Если ЭтоЮридическоеЛицо И Не Элементы.ГруппаПодписантЗаявления.Видимость Тогда + ПриИзмененииРуководителяНаСервере(); + КонецЕсли; + Элементы.ГруппаПодписантЗаявления.Видимость = ЭтоЮридическоеЛицо; Элементы.ГруппаДоверенность.Видимость = ЭтоЮридическоеЛицо И Не ЗаявлениеДляРуководителейЮридическихЛицДоступно; Элементы.ДокументыРуководитель.АвтоОтметкаНезаполненного = ЭтоЮридическоеЛицо; @@ -2503,7 +2539,7 @@ КонецПроцедуры &НаСервере -Процедура ДозаполнитьПоПредыдущемуЗаявлению() +Процедура ДозаполнитьПоПредыдущемуЗаявлениюИлиСертификату(ДанныеСертификата) Запрос = Новый Запрос; Запрос.Текст = @@ -2521,17 +2557,18 @@ | И СертификатыКлючейЭлектроннойПодписиИШифрования.Организация = &Организация | ИЛИ &ОтборПоФизическомуЛицу) | И СертификатыКлючейЭлектроннойПодписиИШифрования.Ссылка <> &ЭтаСсылка + | И НЕ СертификатыКлючейЭлектроннойПодписиИШифрования.ПометкаУдаления |УПОРЯДОЧИТЬ ПО | СертификатыКлючейЭлектроннойПодписиИШифрования.ДействителенДо УБЫВ"; Запрос.УстановитьПараметр("ЭтаСсылка", Объект.Ссылка); - Запрос.УстановитьПараметр("Имя", Имя); - Запрос.УстановитьПараметр("Фамилия", Фамилия); - Запрос.УстановитьПараметр("Отчество", Отчество); - Запрос.УстановитьПараметр("Организация", Организация); - Запрос.УстановитьПараметр("ФизическоеЛицо", Сотрудник); + Запрос.УстановитьПараметр("Имя", ДанныеСертификата.Имя); + Запрос.УстановитьПараметр("Фамилия", ДанныеСертификата.Фамилия); + Запрос.УстановитьПараметр("Отчество", ДанныеСертификата.Отчество); + Запрос.УстановитьПараметр("Организация", ДанныеСертификата.Организация); + Запрос.УстановитьПараметр("ФизическоеЛицо", ДанныеСертификата.Сотрудник); Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПоФизическомуЛицу", - ?(ЗначениеЗаполнено(Сотрудник), "СертификатыКлючейЭлектроннойПодписиИШифрования.ФизическоеЛицо = &ФизическоеЛицо", "ЛОЖЬ")); + ?(ЗначениеЗаполнено(ДанныеСертификата.Сотрудник), "СертификатыКлючейЭлектроннойПодписиИШифрования.ФизическоеЛицо = &ФизическоеЛицо", "ЛОЖЬ")); СведенияОЗаявлении = Запрос.Выполнить().Выбрать(); РеквизитыЗаявления = Неопределено; @@ -2572,11 +2609,68 @@ ДозаполнитьРеквизитыИзСведений(РеквизитыЗаявления, РеквизитыПартнера); Элементы.ДокументыПартнер.КнопкаОткрытия = ЗначениеЗаполнено(ДокументыПартнерСсылка); Элементы.ДокументыПартнерКПП.Доступность = Не ДокументыПартнерЭтоИП; + Иначе + + СведенияОбОрганизации = РеквизитыОрганизации(); + СведенияОВладельце = РеквизитыВладельцаСертификата(); + + ДвоичныеДанныеСертификата = ДанныеСертификата.ДанныеСертификата.Получить(); + Если ТипЗнч(ДвоичныеДанныеСертификата) = Тип("ДвоичныеДанные") Тогда + + СертификатКриптографии = Новый СертификатКриптографии(ДвоичныеДанныеСертификата); + СвойстваСубъектаСертификата = ЭлектроннаяПодпись.СвойстваСубъектаСертификата(СертификатКриптографии); + + УстановитьРеквизитИзСертификата(СведенияОВладельце, "ВладелецИНН", СвойстваСубъектаСертификата, "ИНН"); + УстановитьРеквизитИзСертификата(СведенияОВладельце, "СтраховойНомерПФР", СвойстваСубъектаСертификата, "СНИЛС"); + + Если ЗначениеЗаполнено(СвойстваСубъектаСертификата.ЭлектроннаяПочта) + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + СвойстваСубъектаСертификата.ЭлектроннаяПочта = МодульУправлениеКонтактнойИнформацией.КонтактнаяИнформацияВJSON( + СвойстваСубъектаСертификата.ЭлектроннаяПочта, Перечисления["ТипыКонтактнойИнформации"].АдресЭлектроннойПочты); + КонецЕсли; + + УстановитьРеквизитИзСертификата(СведенияОВладельце, "ЭлектроннаяПочта", СвойстваСубъектаСертификата, "ЭлектроннаяПочта"); + + УстановитьРеквизитИзСертификата(СведенияОбОрганизации, "ИНН", СвойстваСубъектаСертификата, "ИННЮЛ"); + УстановитьРеквизитИзСертификата(СведенияОбОрганизации, "ОГРН", СвойстваСубъектаСертификата, "ОГРН"); + УстановитьРеквизитИзСертификата(СведенияОбОрганизации, "НаименованиеСокращенное", СвойстваСубъектаСертификата, "ОбщееИмя"); + УстановитьРеквизитИзСертификата(СведенияОбОрганизации, "НаименованиеПолное", СвойстваСубъектаСертификата, "ОбщееИмя"); + + КонецЕсли; + + Если ЗначениеЗаполнено(ДанныеСертификата.Организация) Тогда + Организация = ДанныеСертификата.Организация; + ЗаполнитьРеквизитыОрганизации(); + КонецЕсли; + + Если ЗначениеЗаполнено(СведенияОбОрганизации.НаименованиеСокращенное) + И СведенияОбОрганизации.НаименованиеСокращенное <> НаименованиеСокращенное Тогда + + Организация = Неопределено; + УстановитьРеквизитыОрганизации(СведенияОбОрганизации, Истина); + КонецЕсли; + + ЗаполнитьЗначенияСвойств(СведенияОВладельце, ДанныеСертификата, "Фамилия, Имя, Отчество, Должность"); + УстановитьРеквизитыВладельца(СведенияОВладельце); КонецЕсли; КонецПроцедуры +&НаСервере +Процедура УстановитьРеквизитИзСертификата(Сведения, ИмяСведения, РеквизитыСертификата, ИмяРеквизита) + + Если Сведения.Свойство(ИмяСведения) = Неопределено + Или РеквизитыСертификата.Свойство(ИмяРеквизита) = Неопределено Тогда + Возврат; // Заполнение реквизита не внедрено. + КонецЕсли; + + Сведения[ИмяСведения] = РеквизитыСертификата[ИмяРеквизита]; + +КонецПроцедуры + &НаСервере Процедура ДозаполнитьРеквизитыИзСведений(Сведения, Реквизиты) @@ -2634,9 +2728,10 @@ Результат = Не ОбработкаМодуль.ПроверитьЗаполнениеРеквизитов(ЭтотОбъект, ПроверяемыеРеквизиты, ДокументыПартнерЭтоИП, Ложь); - Если Не ЗначениеЗаполнено(Объект.Программа) Тогда + Если Не ЗначениеЗаполнено(Объект.Программа) И Не ЗначениеЗаполнено(ПрограммаИдентификатор) Тогда ТекстОшибки = НСтр("ru = 'Программа:'") + " " + ОбработкаМодуль.ТекстОшибкиПолеНеЗаполнено(); - ОбработкаМодуль.СообщитьПользователю(ЭтотОбъект, ТекстОшибки, "Объект.Программа"); + ОбработкаМодуль.СообщитьПользователю(ЭтотОбъект, ТекстОшибки, + ?(Элементы.Программа.Видимость, "Объект.Программа", "ПредставлениеПрограммы")); Результат = Ложь; КонецЕсли; @@ -3234,7 +3329,9 @@ Возврат; КонецЕсли; КонецЕсли; - ПредставлениеПрограммы = ПоставляемоеПредставлениеПрограммы(СписокПрограмм, Объект.Программа); + + ПредставлениеПрограммы = ПоставляемоеПредставлениеПрограммы(СписокПрограмм, + ?(ЗначениеЗаполнено(Объект.Программа), Объект.Программа, ПрограммаИдентификатор)); СоздатьКлючИЗапросНаСертификат( Новый ОписаниеОповещения("ОбработатьЗаявлениеПослеСозданияКлючаИЗапросаНаСертификат", ЭтотОбъект)); @@ -3844,7 +3941,7 @@ Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда ПоказатьПредупреждение(,НСтр("ru = 'Невозможно подключиться к порталу интернет-поддержки по причине: - |Библиотека интернет поддержки пользователей не внедрена в конфигурацию.'")); + |Библиотека интернет-поддержки пользователей не внедрена в конфигурацию.'")); Возврат; КонецЕсли; @@ -3969,7 +4066,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ОписаниеОшибки.Текст = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ОписаниеОшибки.Текст = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); Возврат Ложь; @@ -3980,7 +4077,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ОписаниеОшибки.Текст = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ОписаниеОшибки.Текст = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); Возврат Ложь; @@ -4091,7 +4188,7 @@ Если Не ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда ОписаниеОшибки.Описание = НСтр("ru = 'Невозможно подключиться к порталу интернет-поддержки по причине: - |Библиотека интернет поддержки пользователей не внедрена в конфигурацию.'"); + |Библиотека интернет-поддержки пользователей не внедрена в конфигурацию.'"); Возврат Неопределено; КонецЕсли; @@ -4133,24 +4230,174 @@ #Область ПрограммыРаботыЭП &НаКлиенте -Процедура ПриИзмененииСоставаИлиНастроекПрограмм() +Процедура ПослеПолученияПрограммКриптографии(Результат, Параметры) Экспорт + + Если Не Результат.ПроверкаВыполнена Тогда + ПоказатьПодсказкуКриптопровайдеры(Результат); + Иначе + Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Ложь; + + ПрограммыАвто = Новый Соответствие; + Для Каждого Криптопровайдер Из Результат.Криптопровайдеры Цикл + ПрограммыАвто.Вставить(Криптопровайдер.Идентификатор, Криптопровайдер); + КонецЦикла; + КонецЕсли; Если Не ЗаполнитьСписокПрограмм() Тогда Возврат; КонецЕсли; ЗаполнитьПрограмму(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьПодсказкуКриптопровайдеры(Результат) + + Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Истина; + Элементы.ДекорацияПроверкаУстановкиКриптопровайдера.Заголовок = СтроковыеФункцииКлиент.ФорматированнаяСтрока( + НСтр( + "ru = 'Нажмите здесь, чтобы проверить установленные программы для работы с электронной подписью.'"), + "ПроверитьУстановкуПрограммКриптографии"); + Элементы.ДекорацияПроверкаУстановкиКриптопровайдераРасширеннаяПодсказка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось определить установленные программы по причине: + |%1'"), Результат.Ошибка); + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьПрограммуПослеПроверкиУстановленных(Результат, ВыбранноеЗначение) Экспорт + + Если Не Результат.ПроверкаВыполнена Тогда + ПоказатьПодсказкуКриптопровайдеры(Результат); + Иначе + Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Ложь; + ПрограммыАвто = Новый Соответствие; + Для Каждого Криптопровайдер Из Результат.Криптопровайдеры Цикл + ПрограммыАвто.Вставить(Криптопровайдер.Идентификатор, Криптопровайдер); + КонецЦикла; + + ПрограммаАвто = ПрограммыАвто.Получить(ВыбранноеЗначение); + Если ПрограммаАвто <> Неопределено Тогда + Если ЗначениеЗаполнено(Объект.Программа) Или ПрограммаИдентификатор <> ВыбранноеЗначение Тогда + ПриПотереГотовности(ЭтотОбъект); + КонецЕсли; + Объект.Программа = Неопределено; + ПрограммаИдентификатор = ВыбранноеЗначение; + УстановитьВидимостьПрограммы(); + ПредставлениеПрограммы = ПрограммаАвто.Представление; + ПодключитьОбработчикОжидания("ПослеВыбораПрограммыОбработчикОжидания", 0.1, Истина); + Возврат; + КонецЕсли; + КонецЕсли; + + ПоказатьДобавлениеВСправочник(ВыбранноеЗначение); +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьДобавлениеВСправочник(ВыбранноеЗначение) + + Представление = ПоставляемоеПредставлениеПрограммы(СписокПрограмм, ВыбранноеЗначение); + Если Не ЭтоПолноправныйПользователь Тогда + + ПоказатьПредупреждение( , СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Программа %1 еще не добавлена в список используемых программ и не найдена в установленных на компьютере. + |Обратитесь к администратору.'"), Представление)); + + ИначеЕсли ЭтоПодчиненныйУзелРИБ Тогда + + ПоказатьПредупреждение( , СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Программа %1 еще не добавлена в список используемых программ и не найдена в установленных на компьютере. + |Выполните добавление в главном узле информационной базы.'"), Представление)); + + Иначе + + Кнопки = Новый СписокЗначений; + Кнопки.Добавить("Добавить", НСтр("ru = 'Добавить'")); + Кнопки.Добавить("НеДобавлять", НСтр("ru = 'Не добавлять'")); + ПоказатьВопрос(Новый ОписаниеОповещения("ПрограммаОбработкаВыбораПродолжение", ЭтотОбъект, ВыбранноеЗначение), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Программа %1 еще не добавлена в список используемых программ и не найдена в установленных на компьютере. + |Добавить?'"), Представление), Кнопки, , "НеДобавлять"); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОпределитьУстановленныеПрограммыПослеПодключенияРасширения(Подключено, Контекст) Экспорт + + #Если ВебКлиент Тогда + ПодключитьОбработчикОжидания("ОбработчикОжиданияОпределитьУстановленныеПрограммы", 0.3, Истина); + #Иначе + ПодключитьОбработчикОжидания("ОбработчикОжиданияОпределитьУстановленныеПрограммы", 0.1, Истина); + #КонецЕсли + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработчикОжиданияОпределитьУстановленныеПрограммы() + + НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения( + "ОбработчикОжиданияОпределитьУстановленныеПрограммыПослеПодключенияРасширения", ЭтотОбъект)); + + #Если ВебКлиент Тогда + ПодключитьОбработчикОжидания("ОбработчикОжиданияДляПродолжения", 0.3, Истина); + #Иначе + ПодключитьОбработчикОжидания("ОбработчикОжиданияДляПродолжения", 0.1, Истина); + #КонецЕсли + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработчикОжиданияДляПродолжения() + + Возврат; + +КонецПроцедуры + +// Продолжение процедуры ОбработчикОжиданияОпределитьУстановленныеПрограммы. +&НаКлиенте +Процедура ОбработчикОжиданияОпределитьУстановленныеПрограммыПослеПодключенияРасширения(Подключено, Контекст) Экспорт + + Если Не Подключено Тогда + Если Не Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость Тогда + Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Истина; + Элементы.ДекорацияПроверкаУстановкиКриптопровайдера.Заголовок = СтроковыеФункцииКлиент.ФорматированнаяСтрока( + НСтр("ru = 'Нажмите здесь, чтобы установить расширение для работы с электронной подписью.'"), + "ПроверитьУстановкуПрограммКриптографии"); + КонецЕсли; + ПодключитьОбработчикОжидания("ОбработчикОжиданияОпределитьУстановленныеПрограммы", 3, Истина); + Возврат; + КонецЕсли; + + ПараметрыПроверки = Новый Структура; + ПараметрыПроверки.Вставить("УстанавливатьРасширение", Ложь); + ПараметрыПроверки.Вставить("УстанавливатьКомпоненту", Ложь); + ПараметрыПроверки.Вставить("ПроверятьНаСервере", Ложь); + + ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьУстановленныеКриптопровайдеры( + Новый ОписаниеОповещения("ПослеПолученияПрограммКриптографии", ЭтотОбъект), + ПараметрыПроверки); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриИзмененииСоставаИлиНастроекПрограмм() + + НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения( + "ОпределитьУстановленныеПрограммыПослеПодключенияРасширения", ЭтотОбъект)); КонецПроцедуры &НаКлиенте Функция ЗаполнитьСписокПрограмм(ОписаниеОшибки = "") - СписокПрограмм.Очистить(); НовыйСписокПрограмм = Новый Массив; // Массив из см. НовыйЭлементСпискаПрограмм ТекстОшибки = ЗаполнитьСписокПрограммНаСервере(НовыйСписокПрограмм, ВариантАлгоритмов, - ДанныеЗаявления.СостояниеЗаявления, КонтейнерКлючаПуть, ВстроенныйКриптопровайдер); + ДанныеЗаявления.СостояниеЗаявления, КонтейнерКлючаПуть, ВстроенныйКриптопровайдер, ПрограммыАвто); + + СписокПрограмм.Очистить(); Если ЗначениеЗаполнено(ТекстОшибки) Тогда ОписаниеОшибки = ТекстОшибки; @@ -4170,7 +4417,7 @@ &НаСервереБезКонтекста Функция ЗаполнитьСписокПрограммНаСервере(СписокПрограмм, ВариантАлгоритмов, - СостояниеЗаявления, КонтейнерКлючаПуть, ВстроенныйКриптопровайдер) + СостояниеЗаявления, КонтейнерКлючаПуть, ВстроенныйКриптопровайдер, ПрограммыАвто) Если Не ЗначениеЗаполнено(КонтейнерКлючаПуть) И СостояниеЗаявления = Перечисления.СостоянияЗаявленияНаВыпускСертификата.НеПодготовлено Тогда @@ -4214,7 +4461,12 @@ Строка = НовыйЭлементСпискаПрограмм(); ЗаполнитьЗначенияСвойств(Строка, Настройка); - СписокПрограмм.Добавить(Строка); + + ПрограммаАвто = ПрограммыАвто.Получить(Настройка.Идентификатор); + Если ПрограммаАвто <> Неопределено Тогда + Строка.Установлена = Истина; + Строка.ПутьКПрограмме = ПрограммаАвто.ПутьКПрограммеАвто; + КонецЕсли; ПрограммыВСправочнике = Программы.НайтиСтроки(Новый Структура("ИмяПрограммы, ТипПрограммы", Настройка.ИмяПрограммы, Настройка.ТипПрограммы)); @@ -4223,6 +4475,8 @@ Строка.Ссылка = ПрограммыВСправочнике[0].Ссылка; КонецЕсли; + СписокПрограмм.Добавить(Строка); + КонецЦикла; Если ЗначениеЗаполнено(ВстроенныйКриптопровайдер) Тогда @@ -4243,6 +4497,7 @@ // * Идентификатор - Строка // * ИмяПрограммы - Строка // * ТипПрограммы - Число +// * Установлена - Булево // &НаСервереБезКонтекста Функция НовыйЭлементСпискаПрограмм() @@ -4253,6 +4508,8 @@ НовыйЭлемент.Вставить("Идентификатор", ""); НовыйЭлемент.Вставить("ИмяПрограммы", ""); НовыйЭлемент.Вставить("ТипПрограммы", 0); + НовыйЭлемент.Вставить("Установлена", Ложь); + НовыйЭлемент.Вставить("ПутьКПрограмме", Ложь); Возврат НовыйЭлемент; @@ -4261,7 +4518,7 @@ &НаКлиенте Процедура ЗаполнитьПрограмму(Оповещение = Неопределено) - Если ЗначениеЗаполнено(Объект.Программа) Тогда + Если ЗначениеЗаполнено(Объект.Программа) Или ЗначениеЗаполнено(ПрограммаИдентификатор) Тогда ПослеВыбораПрограммы(Ложь, Оповещение); Возврат; КонецЕсли; @@ -4286,7 +4543,11 @@ Если СписокПрограмм.Количество() <= Контекст.Индекс + 1 Тогда Если Контекст.ПерваяДобавленнаяПрограмма <> Неопределено Тогда - Объект.Программа = Контекст.ПерваяДобавленнаяПрограмма; + Если ТипЗнч(Контекст.ПерваяДобавленнаяПрограмма) = Тип("СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования") Тогда + Объект.Программа = Контекст.ПерваяДобавленнаяПрограмма; + Иначе + ПрограммаИдентификатор = Контекст.ПерваяДобавленнаяПрограмма; + КонецЕсли; КонецЕсли; ПослеВыбораПрограммы(Ложь, Контекст.Оповещение); @@ -4297,14 +4558,27 @@ Контекст.Индекс = Контекст.Индекс + 1; Контекст.Вставить("Строка", СписокПрограмм[Контекст.Индекс]); - Если Контекст.ПерваяДобавленнаяПрограмма = Неопределено - И ЗначениеЗаполнено(Контекст.Строка.Ссылка) Тогда - - Контекст.ПерваяДобавленнаяПрограмма = Контекст.Строка.Ссылка; + Если Контекст.ПерваяДобавленнаяПрограмма = Неопределено Тогда + Если ЗначениеЗаполнено(Контекст.Строка.Ссылка) Тогда + Контекст.ПерваяДобавленнаяПрограмма = Контекст.Строка.Ссылка; + Иначе + Контекст.ПерваяДобавленнаяПрограмма = Контекст.Строка.Идентификатор; + КонецЕсли; КонецЕсли; ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыСозданияМенеджераКриптографии(); - ПараметрыСоздания.Программа = Контекст.Строка.Ссылка; + Если ЗначениеЗаполнено(Контекст.Строка.Ссылка) Тогда + ПараметрыСоздания.Программа = Контекст.Строка.Ссылка; + Иначе + ПрограммаАвто = ПрограммыАвто.Получить(Контекст.Строка.Идентификатор); + Если ПрограммаАвто <> Неопределено Тогда + ПараметрыСоздания.Программа = ПрограммаАвто; + Иначе + ЗаполнитьПрограммуЦиклНачало(Контекст); + Возврат; + КонецЕсли; + КонецЕсли; + ПараметрыСоздания.ПоказатьОшибку = Ложь; ПараметрыСоздания.ИнтерактивныйРежим = Истина; @@ -4328,7 +4602,15 @@ Возврат; КонецЕсли; - Объект.Программа = Контекст.Строка.Ссылка; + Если ЗначениеЗаполнено(Контекст.Строка.Ссылка) Тогда + Объект.Программа = Контекст.Строка.Ссылка; + Иначе + ПрограммаИдентификатор = Контекст.Строка.Идентификатор; + ПредставлениеПрограммы = ПрограммыАвто.Получить(ПрограммаИдентификатор).Представление; + КонецЕсли; + + УстановитьВидимостьПрограммы(); + Если Контекст.Оповещение <> Неопределено Тогда ВыполнитьОбработкуОповещения(Контекст.Оповещение); КонецЕсли; @@ -4359,9 +4641,10 @@ Криптография = Неопределено; РаботаСДвоичнымиДанными = Неопределено; - Если Не ЗначениеЗаполнено(Объект.Программа) - Или Объект.Программа = ВстроенныйКриптопровайдер Тогда + Если Не ЗначениеЗаполнено(Объект.Программа) И Не ЗначениеЗаполнено(ПрограммаИдентификатор) + Или ЗначениеЗаполнено(Объект.Программа) И Объект.Программа = ВстроенныйКриптопровайдер Тогда + УстановитьВидимостьПрограммы(); Если Оповещение <> Неопределено Тогда ВыполнитьОбработкуОповещения(Оповещение); КонецЕсли; @@ -4375,7 +4658,11 @@ Контекст.Вставить("Оповещение", Оповещение); ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыСозданияМенеджераКриптографии(); - ПараметрыСоздания.Программа = Объект.Программа; + Если ЗначениеЗаполнено(Объект.Программа) Тогда + ПараметрыСоздания.Программа = Объект.Программа; + Иначе + ПараметрыСоздания.Программа = ПрограммыАвто.Получить(ПрограммаИдентификатор); + КонецЕсли; ПараметрыСоздания.ПоказатьОшибку = Неопределено; ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографии( @@ -4390,6 +4677,7 @@ Если ТипЗнч(Менеджер) <> Тип("МенеджерКриптографии") Тогда Объект.Программа = Неопределено; + ПрограммаИдентификатор = Неопределено; Если Контекст.ПоказатьОшибку Тогда ЭлектроннаяПодписьСлужебныйКлиент.ПоказатьОшибкуОбращенияКПрограмме( @@ -4400,6 +4688,8 @@ КонецЕсли; + УстановитьВидимостьПрограммы(); + Если Контекст.Оповещение <> Неопределено Тогда ВыполнитьОбработкуОповещения(Контекст.Оповещение); КонецЕсли; @@ -4438,6 +4728,35 @@ КонецФункции +&НаКлиенте +Процедура УстановитьВидимостьПрограммы() + + ВидимостьПрограммы = ЗначениеЗаполнено(Объект.Программа); + Элементы.Программа.Видимость = ВидимостьПрограммы; + Элементы.ПредставлениеПрограммы.Видимость = Не ВидимостьПрограммы; + Элементы.ДекорацияПрограмма.Видимость = Не ВидимостьПрограммы; + + Если Не ВидимостьПрограммы Тогда + Если Не ЗначениеЗаполнено(ПрограммаИдентификатор) Тогда + Элементы.ДекорацияПрограмма.Заголовок = НСтр("ru = 'Программу не удалось определить автоматически.'"); + ИначеЕсли ЗначениеЗаполнено(ПрограммаИдентификатор) И ПрограммыАвто.Получить(ПрограммаИдентификатор) <> Неопределено Тогда + Элементы.ДекорацияПрограмма.Заголовок = НСтр("ru = 'Программа установлена на компьютере и определена автоматически.'"); + Иначе + Если ПрограммыАвто.Количество() > 0 Тогда + Элементы.ДекорацияПрограмма.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Программа %1 не установлена на компьютере.'"), ПредставлениеПрограммы); + ИначеЕсли ДанныеЗаявления.СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияНаВыпускСертификата.НеПодготовлено") Тогда + Элементы.ДекорацияПрограмма.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Программу %1 не удалось определить автоматически.'"), ПредставлениеПрограммы); + Иначе + Элементы.ДекорацияПрограмма.Видимость = Ложь; + КонецЕсли; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + + #КонецОбласти #Область WebСервис @@ -4543,9 +4862,9 @@ ОбщегоНазначения.КодОсновногоЯзыка()); ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка,,, - ЗаголовокОшибки + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ЗаголовокОшибки + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - ТекстОшибки = ЗаголовокОшибки + КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстОшибки = ЗаголовокОшибки + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); Возврат ""; КонецПопытки; @@ -5007,11 +5326,11 @@ КонтейнерКлючаПуть); Если Не ЗначениеЗаполнено(ПрограммаИмя) Тогда - Строки = СписокПрограмм.НайтиСтроки(Новый Структура("Ссылка", Объект.Программа)); - ПрограммаИмя = Строки[0].ИмяПрограммы; - ПрограммаТип = Строки[0].ТипПрограммы; + ДанныеПрограммы = ДанныеПрограммы(); + ПрограммаИмя = ДанныеПрограммы.ИмяПрограммы; + ПрограммаТип = ДанныеПрограммы.ТипПрограммы; КонецЕсли; - + СоздатьКлючИЗапросНаСертификатПослеПодготовкиКонтейнераКлюча(Контекст); ИначеЕсли ЗначениеЗаполнено(Результат.ТекстОшибки) Тогда @@ -5083,20 +5402,20 @@ АктивизироватьОкно(); - Строки = СписокПрограмм.НайтиСтроки(Новый Структура("Ссылка", Объект.Программа)); + ДанныеПрограммы = ДанныеПрограммы(); Если Не ЗначениеЗаполнено(Путь) Тогда ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ключ электронной подписи с помощью программы %1 не создан.'"), - Строки[0].Представление)); + ДанныеПрограммы.Представление)); ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь); Возврат; КонецЕсли; КонтейнерКлючаИмя = Контекст.КонтейнерКлючаНовоеИмя; КонтейнерКлючаПуть = Путь; - ПрограммаИмя = Строки[0].ИмяПрограммы; - ПрограммаТип = Строки[0].ТипПрограммы; + ПрограммаИмя = ДанныеПрограммы.ИмяПрограммы; + ПрограммаТип = ДанныеПрограммы.ТипПрограммы; Модифицированность = Истина; ПоказатьОповещениеПользователя(НСтр("ru = 'Создан новый контейнер ключа:'"),, КонтейнерКлючаПуть); @@ -5619,9 +5938,9 @@ КонецЕсли; ИменаКонтейнеровКлючей = ОписаниеИмен.ИменаКонтейнеровКлючей; - Строки = СписокПрограмм.НайтиСтроки(Новый Структура("Ссылка", Объект.Программа)); + ДанныеПрограммы = ДанныеПрограммы(); - Если СтрНачинаетсяС(Строки[0].Идентификатор, "CryptoPro") Тогда + Если СтрНачинаетсяС(ДанныеПрограммы.Идентификатор, "CryptoPro") Тогда Результат.Существует = НайтиБезУчетаРегистраИРазделителяПути( ИменаКонтейнеровКлючей, Контекст.ИмяДляСоздания) > 0; ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); @@ -5870,28 +6189,68 @@ Возврат; КонецЕсли; - ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьПутьКПрограмме( - Новый ОписаниеОповещения("СоздатьОбъектКриптографииПослеПолученияПутиКПрограмме", - ЭтотОбъект, Контекст), Объект.Программа); + Если ЗначениеЗаполнено(Объект.Программа) Тогда + ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьПутьКПрограмме( + Новый ОписаниеОповещения("СоздатьОбъектКриптографииПослеПолученияПутиКПрограмме", + ЭтотОбъект, Контекст), Объект.Программа); + Иначе + СоздатьОбъектКриптографииПослеПолученияПутиКПрограмме("", Контекст); + КонецЕсли; КонецПроцедуры // Продолжение процедуры ЗаполнитьАлгоритмыВыбраннойПрограммы. &НаКлиенте -Процедура СоздатьОбъектКриптографииПослеПолученияПутиКПрограмме(ОписаниеПути, Контекст) Экспорт +Асинх Процедура СоздатьОбъектКриптографииПослеПолученияПутиКПрограмме(ОписаниеПути, Контекст) Экспорт - Строки = СписокПрограмм.НайтиСтроки(Новый Структура("Ссылка", Объект.Программа)); - ИмяПрограммы = Строки[0].ИмяПрограммы; - ТипПрограммы = Строки[0].ТипПрограммы; + ДанныеПрограммы = ДанныеПрограммы(); + + Если Не ЗначениеЗаполнено(Объект.Программа) Тогда + + Если ПрограммыАвто.Количество() = 0 Тогда + КриптопровайдерыРезультат = Ждать ЭлектроннаяПодписьСлужебныйКлиент.УстановленныеКриптопровайдеры(, Истина); + Если КриптопровайдерыРезультат.ПроверкаВыполнена Тогда + ПрограммыАвто = Новый Соответствие; + Для Каждого Криптопровайдер Из КриптопровайдерыРезультат.Криптопровайдеры Цикл + ПрограммыАвто.Вставить(Криптопровайдер.Идентификатор, Криптопровайдер); + КонецЦикла; + Иначе + ВызватьИсключение КриптопровайдерыРезультат.Ошибка; + КонецЕсли; + КонецЕсли; + + ПрограммаАвто = ПрограммыАвто.Получить(ПрограммаИдентификатор); + Если ПрограммаАвто = Неопределено Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не установлена программа %1.'"), ПредставлениеПрограммы); + КонецЕсли; + + ПутьКПрограмме = ПрограммаАвто.ПутьКПрограммеАвто; + + Иначе + ПутьКПрограмме = ОписаниеПути.ПутьКПрограмме; + КонецЕсли; ОповещениеПослеВызоваСоздать = Новый ОписаниеОповещения("СоздатьОбъектКриптографииПослеВызоваСоздатьМенеджераКриптографии", ЭтотОбъект, Контекст, "СоздатьОбъектКриптографииПослеОшибкиВызоваСоздатьМенеджераКриптографии", ЭтотОбъект); Криптография.НачатьВызовСоздатьМенеджераКриптографии( - ОповещениеПослеВызоваСоздать, ИмяПрограммы, ОписаниеПути.ПутьКПрограмме, ТипПрограммы); - + ОповещениеПослеВызоваСоздать, ДанныеПрограммы.ИмяПрограммы, ПутьКПрограмме, ДанныеПрограммы.ТипПрограммы); + КонецПроцедуры +&НаКлиенте +Функция ДанныеПрограммы() + + Если ЗначениеЗаполнено(Объект.Программа) Тогда + Строки = СписокПрограмм.НайтиСтроки(Новый Структура("Ссылка", Объект.Программа)); + Иначе + Строки = СписокПрограмм.НайтиСтроки(Новый Структура("Идентификатор", ПрограммаИдентификатор)); + КонецЕсли; + + Возврат Строки[0]; + +КонецФункции + &НаКлиенте Процедура СоздатьОбъектКриптографииПослеОшибкиВызоваСоздатьМенеджераКриптографии(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт @@ -5975,7 +6334,7 @@ &НаКлиенте Процедура УстановитьСертификатПослеПодтвержденияИнформации() - Если Объект.Программа = ВстроенныйКриптопровайдер Тогда + Если ЗначениеЗаполнено(Объект.Программа) И Объект.Программа = ВстроенныйКриптопровайдер Тогда УстановитьСертификатОблачногоСервиса(); Иначе УстановитьСертификатВКонтейнер(Новый ОписаниеОповещения("ПослеУстановкиСертификата", ЭтотОбъект)); @@ -6502,7 +6861,7 @@ КонецЕсли; Если ТипЗнч(Контекст.ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда - ТекстОшибки = КраткоеПредставлениеОшибки(Контекст.ИнформацияОбОшибке); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(Контекст.ИнформацияОбОшибке); Иначе ТекстОшибки = Строка(Контекст.ИнформацияОбОшибке); КонецЕсли; @@ -6519,7 +6878,7 @@ Функция ПредставлениеОшибкиДляПользователя(ИнформацияОбОшибке) Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда - Возврат КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + Возврат ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); Иначе Возврат Строка(ИнформацияОбОшибке); КонецЕсли; @@ -7009,7 +7368,7 @@ &НаКлиенте Процедура СозданиеКлючаИЗапросаНаСертификатНачало() - Если Объект.Программа = ВстроенныйКриптопровайдер Тогда + Если ЗначениеЗаполнено(Объект.Программа) И Объект.Программа = ВстроенныйКриптопровайдер Тогда СоздатьЗапросВОблачныйСервис(Новый ОписаниеОповещения( "ОбработатьЗаявлениеПослеСозданияКлючаИЗапросаНаСертификат", ЭтотОбъект)); Иначе @@ -7156,5 +7515,4 @@ #КонецОбласти - #КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ManagerModule.bsl b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ManagerModule.bsl index 08ce57845..56786bf3b 100644 --- a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ManagerModule.bsl @@ -273,7 +273,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - Сообщение = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + Сообщение = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Возврат Сообщение; @@ -521,7 +521,7 @@ ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(ЗначениеРеквизита); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ТекстСообщения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстСообщения = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; КонецЕсли; @@ -929,7 +929,7 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); ДанныеЗаявления.ДатаОбновленияСостояния = ТекущаяДатаСеанса(); ДанныеЗаявления.СостояниеОбработкиЗаявления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ДанныеЗаявления.Записать(); Возврат Неопределено; КонецПопытки; @@ -1031,11 +1031,11 @@ ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось разобрать результат выполнения метода %1 сервиса 1С:Подпись по причине: %2'"), "ReceivePacket", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; - УдалитьФайлы(ИмяФайлаПакетОтвета); - УдалитьФайлы(ВременныйКаталог); + ФайловаяСистема.УдалитьВременныйФайл(ИмяФайлаПакетОтвета); + ФайловаяСистема.УдалитьВременныйКаталог(ВременныйКаталог); Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда ДанныеЗаявления.СостояниеОбработкиЗаявления = ОписаниеОшибки; @@ -1185,11 +1185,11 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось разобрать результат выполнения метода %1 сервиса 1С:Подпись по причине: %2'"), - "ReceiveUpdatedPacket", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + "ReceiveUpdatedPacket", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; - УдалитьФайлы(ИмяФайлаПакетОтвета); - УдалитьФайлы(ВременныйКаталог); + ФайловаяСистема.УдалитьВременныйФайл(ИмяФайлаПакетОтвета); + ФайловаяСистема.УдалитьВременныйКаталог(ВременныйКаталог); Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда ДанныеЗаявления.СостояниеОбработкиЗаявления = ОписаниеОшибки; diff --git a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/ЮридическоеЛицо/Template.mxlx b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/ЮридическоеЛицо/Template.mxlx index 33407bfeb..14fff7156 100644 --- a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/ЮридическоеЛицо/Template.mxlx +++ b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/ЮридическоеЛицо/Template.mxlx @@ -1537,10 +1537,6 @@ 3 3 - - 10 - 7 - 10 8 @@ -1556,10 +1552,6 @@ 3 3 - - 11 - 7 - 11 8 diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеПериодаИОтбора/Form.form b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеПериодаИОтбора/Form.form index a4aa7d64b..f97d233dd 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеПериодаИОтбора/Form.form +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеПериодаИОтбора/Form.form @@ -83,7 +83,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Form.form b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Form.form index e4abd0f0e..2445649cb 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Form.form @@ -147,7 +147,6 @@ UsualGroup Vertical - Auto true true Auto @@ -176,7 +175,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -663,7 +661,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Module.bsl index fd886202c..7392d1607 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Module.bsl @@ -473,7 +473,7 @@ КонецЕсли; КонецЦикла; - Строка.Количество = Формат(КоличествоВыгружать, "ЧН=") + " / " + Формат(КоличествоВсего, "ЧН="); + Строка.Количество = Формат(КоличествоВыгружать, "ЧН=0") + " / " + Формат(КоличествоВсего, "ЧН=0"); КонецЦикла; // Общие итоги @@ -491,7 +491,7 @@ ТекстКоличества = НСтр("ru = '<не рассчитано>'"); Иначе ТекстКоличества = НСтр("ru = 'Объектов: %1'"); - ТекстКоличества = СтрЗаменить(ТекстКоличества, "%1", Формат(Количество, "ЧН=")); + ТекстКоличества = СтрЗаменить(ТекстКоличества, "%1", Формат(Количество, "ЧН=0")); КонецЕсли; Элементы.ОбновитьКоличество.Заголовок = ТекстКоличества; diff --git a/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Form.form b/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Form.form index 4410599db..95043840d 100644 --- a/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Form.form @@ -324,7 +324,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -353,7 +352,6 @@ UsualGroup Vertical - Auto NormalSeparation true Auto @@ -382,7 +380,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/ObjectModule.bsl b/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/ObjectModule.bsl index acbd5438b..bd5198b44 100644 --- a/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/ObjectModule.bsl +++ b/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/ObjectModule.bsl @@ -237,7 +237,7 @@ Исключение Инфо = ИнформацияОбОшибке(); КодОшибки = Новый Структура("КраткоеПредставлениеОшибки, ПодробноеПредставлениеОшибки", - КраткоеПредставлениеОшибки(Инфо), ПодробноеПредставлениеОшибки(Инфо)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(Инфо), ОбработкаОшибок.ПодробноеПредставлениеОшибки(Инфо)); ОбменДаннымиXDTOСервер.ЗаписатьВПротоколВыполнения(КомпонентыОбмена, КодОшибки); ОбменДаннымиXDTOСервер.ЗавершитьВедениеПротоколаОбмена(КомпонентыОбмена); @@ -250,8 +250,21 @@ РазблокироватьДанныеДляРедактирования(КомпонентыОбмена.УзелКорреспондента); КонецЕсли; + Если КомпонентыОбмена.ФлагОшибки Тогда + + Попытка + УдалитьФайлы(ИмяФайлаОбмена); + Исключение + ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + КонецЕсли; + Если Отказ Тогда + Возврат; + КонецЕсли; ДанныеВыгрузкиXML = КомпонентыОбмена.ФайлОбмена.Закрыть(); @@ -376,7 +389,7 @@ Информация = ИнформацияОбОшибке(); СтрокаСообщения = НСтр("ru = 'Ошибка при загрузке данных: %1'"); СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - СтрокаСообщения, ПодробноеПредставлениеОшибки(Информация)); + СтрокаСообщения, ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); ОбменДаннымиXDTOСервер.ЗаписатьВПротоколВыполнения(КомпонентыОбмена, СтрокаСообщения, , , , , Истина); КомпонентыОбмена.ФлагОшибки = Истина; КонецПопытки; @@ -390,7 +403,7 @@ Информация = ИнформацияОбОшибке(); СтрокаСообщения = НСтр("ru = 'Ошибка при удалении временных объектов, созданных по ссылкам: %1'"); СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - СтрокаСообщения, ПодробноеПредставлениеОшибки(Информация)); + СтрокаСообщения, ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); ОбменДаннымиXDTOСервер.ЗаписатьВПротоколВыполнения(КомпонентыОбмена, СтрокаСообщения, , , , , Истина); КомпонентыОбмена.ФлагОшибки = Истина; КонецПопытки; @@ -477,7 +490,7 @@ Информация = ИнформацияОбОшибке(); СтрокаСообщения = НСтр("ru = 'Ошибка при загрузке данных: %1'"); СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - СтрокаСообщения, ПодробноеПредставлениеОшибки(Информация)); + СтрокаСообщения, ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); ОбменДаннымиXDTOСервер.ЗаписьЖурналаРегистрацииОбменДанными(СтрокаСообщения, КомпонентыОбмена, УровеньЖурналаРегистрации.Ошибка); КонецПопытки; @@ -487,7 +500,7 @@ Информация = ИнформацияОбОшибке(); СтрокаСообщения = НСтр("ru = 'Ошибка при удалении временных объектов, созданных по ссылкам: %1'"); СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - СтрокаСообщения, ПодробноеПредставлениеОшибки(Информация)); + СтрокаСообщения, ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); ОбменДаннымиXDTOСервер.ЗаписьЖурналаРегистрацииОбменДанными(СтрокаСообщения, КомпонентыОбмена, УровеньЖурналаРегистрации.Ошибка); КонецПопытки; ОбменДаннымиСлужебный.ОтключитьОбновлениеКлючейДоступа(Ложь); @@ -583,7 +596,7 @@ Исключение СтрокаСообщения = НСтр("ru = 'Ошибка при анализе данных: %1'"); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ОбменДаннымиXDTOСервер.ЗаписатьВПротоколВыполнения(КомпонентыОбмена, СтрокаСообщения,,,,,Истина); КонецПопытки; @@ -703,6 +716,8 @@ ТекстовыйДокумент.ДобавитьСтроку(ДанныеВыгрузкиXML); ТекстовыйДокумент.Записать(ИмяФайлаОбмена, , Символы.ПС); + РегистрыСведений.АрхивСообщенийОбменов.ПоместитьСообщениеВАрхив(УзелОбменаЗагрузкаДанных, ИмяФайлаОбмена); + ВыполнитьЗагрузкуДанных(); УдалитьФайлы(ИмяФайлаОбмена); diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl b/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl index 316022320..3f98e5307 100644 --- a/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl +++ b/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl @@ -22,8 +22,11 @@ //////////////////////////////////////////////////////////////////////////////// // ЭКСПОРТНЫЕ ПЕРЕМЕННЫЕ + Перем КлючСообщенияЖурналаРегистрации Экспорт; // строка сообщения для фиксации ошибок в журнале регистрации. + Перем ВнешнееСоединение Экспорт; // Содержит глобальный контекст внешнего соединения или Неопределено. + Перем Запросы Экспорт; // Структура, содержащая используемые запросы. //////////////////////////////////////////////////////////////////////////////// @@ -32,11 +35,13 @@ Перем Конвертация; // Структура свойств конвертации (Имя, Ид, обработчики событий обмена). Перем Алгоритмы; // Структура, содержащая используемые алгоритмы. + Перем ДопОбработки; // Структура, содержащая используемые внешние обработки. Перем Правила; // Структура, содержащая ссылки на ПКО. Перем Менеджеры; // Соответствие, содержащее поля Имя, ИмяТипа, ТипСсылкиСтрокой, Менеджер, ОбъектМД, ПКО. + Перем МенеджерыДляПлановОбмена; Перем ПараметрыДопОбработок; // Структура, содержащая параметры, используемых внешних обработок. @@ -44,6 +49,7 @@ Перем ПараметрыИнициализированы; // Если Истина, то необходимые параметры конвертации проинициализированы. Перем ФайлПротоколаДанных; // Файл для ведения протокола обмена данными. + Перем ФлагКомментироватьОбработкуОбъектов; //////////////////////////////////////////////////////////////////////////////// @@ -67,18 +73,31 @@ // ПЕРЕМЕННЫЕ ОБРАБОТОК ОБМЕНА (ОБЩИЕ ДЛЯ ВЫГРУЗКИ И ЗАГРУЗКИ) Перем ТипСтрока; // Тип("Строка") + Перем ТипБулево; // Тип("Булево") + Перем ТипЧисло; // Тип("Число") + Перем ТипДата; // Тип("Дата") + Перем ТипУникальныйИдентификатор; // Тип("УникальныйИдентификатор") + Перем ТипХранилищеЗначения; // Тип("ХранилищеЗначения") + Перем ТипДвоичныеДанные; // Тип("ДвоичныеДанные") + Перем ТипВидДвиженияНакопления; // Тип("ВидДвиженияНакопления") + Перем ТипУдалениеОбъекта; // Тип("УдалениеОбъекта") + Перем ТипВидСчета; // Тип("ВидСчета") + Перем ТипТип; // Тип("Тип") -Перем ТипСоответствие; // Тип("Соответствие"). -Перем ТипОписаниеТипов; // Тип("ОписаниеТипов"). + +Перем ТипСоответствие; // Тип("Соответствие") + +Перем ТипОписаниеТипов; // Тип("ОписаниеТипов") + Перем ТипСтрока36; Перем ТипСтрока255; @@ -95,17 +114,27 @@ //////////////////////////////////////////////////////////////////////////////// // ПЕРЕМЕННЫЕ МОДУЛЯ ОБРАБОТКИ ВЫГРУЗКИ -Перем СчетчикНПП; // Число - счетчик НПП +Перем СчетчикНПП; // Число + Перем НППЗаписанногоВФайл; -Перем ТаблицаПравилКонвертацииСвойств; // ТаблицаЗначений - шаблон для воссоздания структуры таблицы путем - // копирования. -Перем XMLПравила; // Xml-Строка, содержащая описание правил обмена. + +// ТаблицаЗначений - шаблон для воссоздания структуры таблицы путем копирования +Перем ТаблицаПравилКонвертацииСвойств; // ТаблицаЗначений + +Перем XMLПравила; // Xml-Строка, содержащая описание правил обмена. + Перем СтрокаТиповДляПриемника; + Перем ПолеДокументыДляОтложенногоПроведения; // Таблица значений для проведения документов после загрузки данных. -Перем СоответствиеДокументовДляОтложенногоПроведения; // Соответствие для хранения дополнительных свойств документов - // после загрузки данных. + + +// Соответствие для хранения дополнительных свойств документов после загрузки данных. +Перем СоответствиеДокументовДляОтложенногоПроведения; // Соответствие + Перем ПолеОбъектыДляОтложеннойЗаписи; // Соответствие для записи объектов ссылочных типов после загрузки данных. + Перем ФайлОбмена; // Последовательно записываемый/читаемый файл обмена. + Перем КоличествоОбъектовКВыгрузке; //Общее количество объектов подлежащих выгрузке. //////////////////////////////////////////////////////////////////////////////// @@ -119,6 +148,7 @@ Перем СоответствиеПустыхЗначенийТипов; Перем СоответствиеОписаниеТипов; Перем СоответствиеПравилКонвертации; // Соответствие для определения правила конвертации объекта по типу этого объекта. + Перем ПолеНомерСообщения; Перем ПолеНомерПринятогоСообщения; Перем РазрешитьПроведениеДокумента; @@ -149,31 +179,37 @@ Перем ПолеРезультатВыполненияОбмена; Перем ПолеСостояниеОбменаДанными; -Перем ПолеТаблицыДанныхСообщенияОбмена; // Соответствие с таблицами значений данных из сообщения обмена; - // Ключ - ИмяТипа (Строка); Значение - таблица с данными объектов (ТаблицаЗначений). -// +// Соответствие с таблицами значений данных из сообщения обмена; +// Ключ - ИмяТипа (Строка); Значение - таблица с данными объектов (ТаблицаЗначений). +Перем ПолеТаблицыДанныхСообщенияОбмена; // Соответствие + Перем ПолеТаблицаДанныхЗаголовкаПакета; // Таблица значений с данными из файла заголовка пакета сообщений обмена. + Перем ПолеСтрокаСообщенияОбОшибке; // Строка - переменная содержит строку с сообщением об ошибке. -// + Перем ПолеСоответствиеТиповДанныхДляЗагрузки; Перем ПолеСчетчикЗагруженныхОбъектов; // Счетчик загруженных объектов. + Перем ПолеСчетчикВыгруженныхОбъектов; // Счетчик выгруженных объектов. Перем ПолеПриоритетыРезультатовОбмена; // Массив - приоритеты результатов обмена данными по убыванию. -Перем ПолеТаблицыОписанийСвойствОбъектов; // Соответствие: Ключ - ОбъектМетаданных; Значение - ТаблицаЗначений - - // таблица описания свойств объекта метаданных. +// Соответствие: Ключ - ОбъектМетаданных; Значение - ТаблицаЗначений - +// таблица описания свойств объекта метаданных. +Перем ПолеТаблицыОписанийСвойствОбъектов; // Соответствие Перем ПолеВыгруженныеПоСсылкеОбъекты; // Массив объектов, выгруженных по ссылке. Элементы массива уникальны. + Перем ПолеСозданныеПриВыгрузкеОбъекты; // Массив объектов, созданных при выгрузке. Элементы массива уникальны. -Перем ПолеВыгружаемыеПоСсылкеОбъектыМетаданных; // Ккэш) Соответствие: Ключ - ОбъектМетаданных; Значение - признак - // выгрузки объекта по ссылке: Истина - надо выгружать объект по - // ссылке, Ложь - не надо. +// Соответствие, где Ключ - ОбъектМетаданных, а Значение - признак выгрузки объекта по ссылке. +// Истина - надо выгружать объект по ссылке, Ложь - не надо. +Перем ПолеВыгружаемыеПоСсылкеОбъектыМетаданных; // Соответствие -Перем ПолеПравилаРегистрацииОбъектов; // Ккэш) ТаблицаЗначений - содержит правила регистрации объектов (правила только - // с видом "Фильтр разрешенных объектов" и для текущего плана обмена). +// ТаблицаЗначений - содержит правила регистрации объектов (правила только +// с видом "Фильтр разрешенных объектов" и для текущего плана обмена). +Перем ПолеПравилаРегистрацииОбъектов; // ТаблицаЗначений Перем ПолеИмяПланаОбмена; @@ -181,6 +217,10 @@ Перем ПолеВерсияФорматаВходящегоСообщенияОбмена; +Перем ПоместитьСообщениеВАрхивПриВнешнемСоединении; +Перем ВременныйКаталогДляСборкиАрхива; +Перем НомерПакета; + #КонецОбласти #Область ПрограммныйИнтерфейс @@ -491,7 +531,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(64, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, НСтр("ru = 'ПередКонвертациейОбъекта (глобальный)'")); + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(64, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, НСтр("ru = 'ПередКонвертациейОбъекта (глобальный)'")); КонецПопытки; Если Отказ Тогда // Отказ от дальнейшей обработки правила. @@ -520,7 +560,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(41, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, "ПередВыгрузкойОбъекта"); + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(41, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, "ПередВыгрузкойОбъекта"); КонецПопытки; Если Отказ Тогда // Отказ от дальнейшей обработки правила. @@ -895,7 +935,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(42, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, "ПриВыгрузкеОбъекта"); + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(42, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, "ПриВыгрузкеОбъекта"); КонецПопытки; Если Отказ Тогда // Отказ от записи объекта в файл. @@ -973,7 +1013,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(43, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, "ПослеВыгрузкиОбъекта"); + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(43, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, "ПослеВыгрузкиОбъекта"); КонецПопытки; Если Отказ Тогда // Отказ от записи объекта в файл. @@ -1072,7 +1112,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(79, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, "ЕстьОбработчикПослеВыгрузкиВФайл"); + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(79, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, "ЕстьОбработчикПослеВыгрузкиВФайл"); КонецПопытки; КонецЕсли; @@ -1346,7 +1386,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(31, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "ПередОбработкойВыгрузкиДанных"); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(31, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "ПередОбработкойВыгрузкиДанных"); КонецПопытки; @@ -1464,7 +1504,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "ПослеОбработкиВыгрузкиДанных"); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "ПослеОбработкиВыгрузкиДанных"); КонецПопытки; @@ -1472,136 +1512,6 @@ КонецПроцедуры -// Выгружает регистр по отбору. -// -// Параметры: -// НаборЗаписейДляВыгрузки - Структура - содержащая отбор, или НаборЗаписей регистра. -// Правило - СтрокаТаблицыЗначений - из правил конвертации объектов: -// * Свойства - см. КоллекцияПравилаКонвертацииСвойств -// ВходящиеДанные - Произвольный - входящие данные для правила конвертации. -// НеВыгружатьОбъектыПоСсылкам - Булево - признак для выгрузки свойств по ссылкам.. -// ИмяПКО - Строка - имя правила конвертации. -// ПравилоВыгрузкиДанных - СтрокаТаблицыЗначений - из таблицы правил выгрузки данных. -// -Процедура ВыгрузитьРегистр(НаборЗаписейДляВыгрузки, - Правило = Неопределено, - ВходящиеДанные = Неопределено, - НеВыгружатьОбъектыПоСсылкам = Ложь, - ИмяПКО = "", - ПравилоВыгрузкиДанных = Неопределено) Экспорт - - ИсходящиеДанные = Неопределено; - - - ОпределитьПКОПоПараметрам(Правило, НаборЗаписейДляВыгрузки, ИмяПКО); - - ПриоритетОбъектовОбмена = Правило.ПриоритетОбъектовОбмена; - - Если ТипЗнч(НаборЗаписейДляВыгрузки) = Тип("Структура") Тогда - - ОтборНабораЗаписей = НаборЗаписейДляВыгрузки.Отбор; - СтрокиНабораЗаписей = НаборЗаписейДляВыгрузки.Строки; - - Иначе // НаборЗаписей - - ОтборНабораЗаписей = НаборЗаписейДляВыгрузки.Отбор; - СтрокиНабораЗаписей = НаборЗаписейДляВыгрузки; - - КонецЕсли; - - // Записываем сначала отбор потом набор записей - // отбор. - - Приемник = СоздатьУзел("НаборЗаписейРегистра"); - - КоличествоЗаписейВРегистре = СтрокиНабораЗаписей.Количество(); - - СчетчикНПП = СчетчикНПП + 1; - НПП = СчетчикНПП; - - УстановитьАтрибут(Приемник, "Нпп", НПП); - УстановитьАтрибут(Приемник, "Тип", СтрЗаменить(Правило.Приемник, "РегистрСведенийЗапись.", "РегистрСведенийНаборЗаписей.")); - УстановитьАтрибут(Приемник, "ИмяПравила", Правило.Имя); - - ЗаписатьПриоритетОбъектовОбмена(ПриоритетОбъектовОбмена, Приемник); - - ВыгружаемПустойНабор = КоличествоЗаписейВРегистре = 0; - Если ВыгружаемПустойНабор Тогда - УстановитьАтрибут(Приемник, "ПустойНабор", Истина); - КонецЕсли; - - Приемник.ЗаписатьНачалоЭлемента("Отбор"); - - СтруктураИсточник = Новый Структура; - МассивПКСДляВыгрузки = Новый Массив(); - - Для Каждого СтрокаОтбора Из ОтборНабораЗаписей Цикл - - Если СтрокаОтбора.Использование = Ложь Тогда - Продолжить; - КонецЕсли; - - СтрокаПКС = Правило.Свойства.Найти(СтрокаОтбора.Имя, "Источник"); - - Если СтрокаПКС = Неопределено Тогда - - СтрокаПКС = Правило.Свойства.Найти(СтрокаОтбора.Имя, "Приемник"); - - КонецЕсли; - - Если СтрокаПКС <> Неопределено - И (СтрокаПКС.ВидПриемника = "Свойство" - ИЛИ СтрокаПКС.ВидПриемника = "Измерение") Тогда - - МассивПКСДляВыгрузки.Добавить(СтрокаПКС); - - Ключ = ?(ПустаяСтрока(СтрокаПКС.Источник), СтрокаПКС.Приемник, СтрокаПКС.Источник); - - СтруктураИсточник.Вставить(Ключ, СтрокаОтбора.Значение); - - КонецЕсли; - - КонецЦикла; - - // Добавляем параметры для отбора. - Для Каждого СтрокаСвойстваПоиска Из Правило.СвойстваПоиска Цикл - - Если ПустаяСтрока(СтрокаСвойстваПоиска.Приемник) - И НЕ ПустаяСтрока(СтрокаСвойстваПоиска.ИмяПараметраДляПередачи) Тогда - - МассивПКСДляВыгрузки.Добавить(СтрокаСвойстваПоиска); - - КонецЕсли; - - КонецЦикла; - - ВыгрузитьСвойства(СтруктураИсточник, Неопределено, ВходящиеДанные, ИсходящиеДанные, Правило, МассивПКСДляВыгрузки, Приемник, - , , Истина, , , , ВыгружаемПустойНабор); - - Приемник.ЗаписатьКонецЭлемента(); - - Приемник.ЗаписатьНачалоЭлемента("СтрокиНабораЗаписей"); - - // Набор записей ВходящиеДанные = Неопределено; - Для Каждого СтрокаРегистра Из СтрокиНабораЗаписей Цикл - - ВыгрузкаОбъектаВыборки(СтрокаРегистра, ПравилоВыгрузкиДанных, , ВходящиеДанные, НеВыгружатьОбъектыПоСсылкам, Истина, - Приемник, , ИмяПКО, ЛОЖЬ); - - КонецЦикла; - - Приемник.ЗаписатьКонецЭлемента(); - - Приемник.ЗаписатьКонецЭлемента(); - - ЗаписатьВФайл(Приемник); - - ПровестиОбновлениеДанныхВВыгружаемыхДанных(); - - ПровестиУстановкуПризнаковВыгруженныхОбъектовВФайл(); - -КонецПроцедуры - // Добавляет в xml файл информацию о типах значения. // // Параметры: @@ -1794,7 +1704,7 @@ ЗаписатьОбъект = Ложь; - СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеВПротокол(26, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Объект, Тип); + СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеВПротокол(26, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Объект, Тип); Если Не ПродолжитьПриОшибке Тогда ВызватьИсключение СтрокаСообщенияОбОшибке; @@ -1847,7 +1757,7 @@ ЗаписатьОбъект = Ложь; - СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеВПротокол(26, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Объект, Тип); + СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеВПротокол(26, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Объект, Тип); Если Не ПродолжитьПриОшибке Тогда ВызватьИсключение СтрокаСообщенияОбОшибке; @@ -2244,7 +2154,7 @@ Попытка ВыполнитьВыгрузку(); Исключение - ЗаписатьВПротоколВыполнения(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьВПротоколВыполнения(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗавершитьВедениеПротоколаОбмена(); ФайлОбмена = Неопределено; ПолеВыгруженныеПоСсылкеОбъекты = Неопределено; @@ -2292,6 +2202,135 @@ КонецПроцедуры +// Выгружает регистр по отбору. +// +// Параметры: +// НаборЗаписейДляВыгрузки - Структура - содержащая отбор, или НаборЗаписей регистра. +// Правило - СтрокаТаблицыЗначений - из правил конвертации объектов: +// * Свойства - см. КоллекцияПравилаКонвертацииСвойств +// ВходящиеДанные - Произвольный - входящие данные для правила конвертации. +// НеВыгружатьОбъектыПоСсылкам - Булево - признак для выгрузки свойств по ссылкам.. +// ИмяПКО - Строка - имя правила конвертации. +// ПравилоВыгрузкиДанных - СтрокаТаблицыЗначений - из таблицы правил выгрузки данных. +// +Процедура ВыгрузитьРегистр(НаборЗаписейДляВыгрузки, + Правило = Неопределено, + ВходящиеДанные = Неопределено, + НеВыгружатьОбъектыПоСсылкам = Ложь, + ИмяПКО = "", + ПравилоВыгрузкиДанных = Неопределено) Экспорт + + ИсходящиеДанные = Неопределено; + + + ОпределитьПКОПоПараметрам(Правило, НаборЗаписейДляВыгрузки, ИмяПКО); + + ПриоритетОбъектовОбмена = Правило.ПриоритетОбъектовОбмена; + + Если ТипЗнч(НаборЗаписейДляВыгрузки) = Тип("Структура") Тогда + + ОтборНабораЗаписей = НаборЗаписейДляВыгрузки.Отбор; + СтрокиНабораЗаписей = НаборЗаписейДляВыгрузки.Строки; + + Иначе // НаборЗаписей + + ОтборНабораЗаписей = НаборЗаписейДляВыгрузки.Отбор; + СтрокиНабораЗаписей = НаборЗаписейДляВыгрузки; + + КонецЕсли; + + // Записываем сначала отбор потом набор записей + // отбор. + + Приемник = СоздатьУзел("НаборЗаписейРегистра"); + + КоличествоЗаписейВРегистре = СтрокиНабораЗаписей.Количество(); + + СчетчикНПП = СчетчикНПП + 1; + НПП = СчетчикНПП; + + УстановитьАтрибут(Приемник, "Нпп", НПП); + УстановитьАтрибут(Приемник, "Тип", СтрЗаменить(Правило.Приемник, "РегистрСведенийЗапись.", "РегистрСведенийНаборЗаписей.")); + УстановитьАтрибут(Приемник, "ИмяПравила", Правило.Имя); + + ЗаписатьПриоритетОбъектовОбмена(ПриоритетОбъектовОбмена, Приемник); + + ВыгружаемПустойНабор = КоличествоЗаписейВРегистре = 0; + Если ВыгружаемПустойНабор Тогда + УстановитьАтрибут(Приемник, "ПустойНабор", Истина); + КонецЕсли; + + Приемник.ЗаписатьНачалоЭлемента("Отбор"); + + СтруктураИсточник = Новый Структура; + МассивПКСДляВыгрузки = Новый Массив(); + + Для Каждого СтрокаОтбора Из ОтборНабораЗаписей Цикл + + Если СтрокаОтбора.Использование = Ложь Тогда + Продолжить; + КонецЕсли; + + СтрокаПКС = Правило.Свойства.Найти(СтрокаОтбора.Имя, "Источник"); + + Если СтрокаПКС = Неопределено Тогда + + СтрокаПКС = Правило.Свойства.Найти(СтрокаОтбора.Имя, "Приемник"); + + КонецЕсли; + + Если СтрокаПКС <> Неопределено + И (СтрокаПКС.ВидПриемника = "Свойство" + ИЛИ СтрокаПКС.ВидПриемника = "Измерение") Тогда + + МассивПКСДляВыгрузки.Добавить(СтрокаПКС); + + Ключ = ?(ПустаяСтрока(СтрокаПКС.Источник), СтрокаПКС.Приемник, СтрокаПКС.Источник); + + СтруктураИсточник.Вставить(Ключ, СтрокаОтбора.Значение); + + КонецЕсли; + + КонецЦикла; + + // Добавляем параметры для отбора. + Для Каждого СтрокаСвойстваПоиска Из Правило.СвойстваПоиска Цикл + + Если ПустаяСтрока(СтрокаСвойстваПоиска.Приемник) + И НЕ ПустаяСтрока(СтрокаСвойстваПоиска.ИмяПараметраДляПередачи) Тогда + + МассивПКСДляВыгрузки.Добавить(СтрокаСвойстваПоиска); + + КонецЕсли; + + КонецЦикла; + + ВыгрузитьСвойства(СтруктураИсточник, Неопределено, ВходящиеДанные, ИсходящиеДанные, Правило, МассивПКСДляВыгрузки, Приемник, + , , Истина, , , , ВыгружаемПустойНабор); + + Приемник.ЗаписатьКонецЭлемента(); + + Приемник.ЗаписатьНачалоЭлемента("СтрокиНабораЗаписей"); + + // Набор записей ВходящиеДанные = Неопределено; + Для Каждого СтрокаРегистра Из СтрокиНабораЗаписей Цикл + + ВыгрузкаОбъектаВыборки(СтрокаРегистра, ПравилоВыгрузкиДанных, , ВходящиеДанные, НеВыгружатьОбъектыПоСсылкам, Истина, + Приемник, , ИмяПКО, ЛОЖЬ); + + КонецЦикла; + + Приемник.ЗаписатьКонецЭлемента(); + + Приемник.ЗаписатьКонецЭлемента(); + + ЗаписатьВФайл(Приемник); + + ПровестиОбновлениеДанныхВВыгружаемыхДанных(); + + ПровестиУстановкуПризнаковВыгруженныхОбъектовВФайл(); + +КонецПроцедуры #КонецОбласти #Область ЗагрузкаДанных @@ -2418,7 +2457,7 @@ ЗаписатьВПротоколВыполнения(174,,,,,, Перечисления.РезультатыВыполненияОбмена.Предупреждение_СообщениеОбменаБылоРанееПринято); Иначе - ЗаписатьВПротоколВыполнения(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьВПротоколВыполнения(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецЕсли; КонецПопытки; @@ -2673,7 +2712,7 @@ ЗаписатьВПротоколВыполнения(174,,,,,, Перечисления.РезультатыВыполненияОбмена.Предупреждение_СообщениеОбменаБылоРанееПринято); Иначе - ЗаписатьВПротоколВыполнения(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьВПротоколВыполнения(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецЕсли; КонецПопытки; @@ -2712,6 +2751,8 @@ ФайлОбмена.УстановитьСтроку(СтрокаXML); + ЗаписатьПакетВФайлДляСборкиАрхива(СтрокаXML); + ЧтениеСообщения = Неопределено; Попытка @@ -2724,7 +2765,7 @@ ЗаписатьВПротоколВыполнения(174,,,,,, Перечисления.РезультатыВыполненияОбмена.Предупреждение_СообщениеОбменаБылоРанееПринято); Иначе - ЗаписатьВПротоколВыполнения(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьВПротоколВыполнения(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецЕсли; КонецПопытки; @@ -2751,7 +2792,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(22, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПередЗагрузкойДанных (конвертация)'")); + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(22, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПередЗагрузкойДанных (конвертация)'")); Отказ = Истина; КонецПопытки; @@ -2781,6 +2822,25 @@ ПолеСвойстваУзлаПланаОбмена = Неопределено; ПолеВерсияФорматаВходящегоСообщенияОбмена = Неопределено; + ПараметрыАрхива = РегистрыСведений.НастройкиАрхиваСообщенийОбменов.ПолучитьНастройки(УзелОбменаЗагрузкаДанных); + + Если ПараметрыАрхива <> Неопределено И ПараметрыАрхива.КоличествоФайлов > 0 Тогда + + ПоместитьСообщениеВАрхивПриВнешнемСоединении = Истина; + + НомерПакета = 0; + ВременныйКаталог = ПолучитьИмяВременногоФайла(); //АПК: 441 временный каталог будет удалена в процедуре СобратьИПоместитьСообщениеОбменаВАрхив + СоздатьКаталог(ВременныйКаталог); + ВременныйКаталогДляСборкиАрхива = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ВременныйКаталог); + + ЗаписатьЗаголовокСообщенияДляАрхива(); + + Иначе + + ПоместитьСообщениеВАрхивПриВнешнемСоединении = Ложь; + + КонецЕсли; + ГлобальныйСтекНеЗаписанныхОбъектов = Новый Соответствие; НомерПоследнегоПоискаПоСсылке = 0; @@ -2819,6 +2879,8 @@ // Процедура ВнешнееСоединениеПослеЗагрузкиДанных() Экспорт + СобратьИПоместитьСообщениеОбменаВАрхив(); + // Отложенная запись того, что не записали. ПровестиЗаписьНеЗаписанныхОбъектов(); @@ -2840,7 +2902,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(23, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПослеЗагрузкиДанных (конвертация)'")); + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(23, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПослеЗагрузкиДанных (конвертация)'")); КонецПопытки; КонецЕсли; @@ -2876,7 +2938,7 @@ ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - ЗаписатьИнформациюОбОшибкеВПротокол(173, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ОбъектУзла); + ЗаписатьИнформациюОбОшибкеВПротокол(173, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ОбъектУзла); КонецПопытки; КонецЕсли; @@ -3864,7 +3926,7 @@ Результат = "УникальныйИдентификатор"; ИначеЕсли ТипЗначения = ТипВидДвиженияНакопления Тогда Результат = "ВидДвиженияНакопления"; - ИначеЕсли ТипЗначения = ТипОписаниеТипов Тогда // Для конвертации элементов ПВХ + ИначеЕсли ТипЗначения = ТипОписаниеТипов Тогда Результат = "ОписаниеТипов"; Иначе Менеджер = Менеджеры[ТипЗначения]; @@ -3963,7 +4025,7 @@ ИначеЕсли ВРег(ЧтениеJSON.ТекущееЗначение) = ВРег("multiple") Тогда ЧтениеJSON.Прочитать(); - // Признак того, что это составной тип не используется + // Признак составного типа, далее не используется ИначеЕсли ВРег(ЧтениеJSON.ТекущееЗначение) = ВРег("typeFeatures") Тогда @@ -4002,7 +4064,7 @@ ТекстКомментария = НСтр("ru ='Метаданные не обнаружены: %1.'", ОбщегоНазначения.КодОсновногоЯзыка()); ТекстКомментария = СтрШаблон(ТекстКомментария, ИмяТипаСтрокой); - ЗаписьЖурналаРегистрацииОбменДанными(ТекстКомментария, УровеньЖурналаРегистрации.Предупреждение); + ЗаписьЖурналаРегистрацииОбменДанными(ТекстКомментария, УровеньЖурналаРегистрации.Предупреждение); КонецПопытки; @@ -4331,6 +4393,7 @@ КонецЕсли; КонецЦикла; + Если (Тип = ТипСтрока) ИЛИ (Тип = ТипБулево) @@ -4413,7 +4476,7 @@ |Описание ошибки: |%2'"), Строка(ИмяФайлаОбмена), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписатьВПротоколВыполнения(ПредставлениеОшибки); Возврат ""; КонецПопытки; @@ -4543,7 +4606,7 @@ ФайлПротоколаДанных = Неопределено; СтрокаСообщения = НСтр("ru = 'Ошибка при попытке записи в файл протокола данных: %1. Описание ошибки: %2'", ОбщегоНазначения.КодОсновногоЯзыка()); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ИмяФайлаПротоколаОбмена, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ИмяФайлаПротоколаОбмена, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрацииОбменДанными(СтрокаСообщения, УровеньЖурналаРегистрации.Предупреждение); КонецПопытки; @@ -5665,7 +5728,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеВПротокол(11, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Строка(НоваяСтрока.Источник)); + ЗаписатьИнформациюОбОшибкеВПротокол(11, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Строка(НоваяСтрока.Источник)); КонецПопытки; @@ -6903,7 +6966,7 @@ Менеджеры[СтрокаТаблицы.Источник].ПКО = СтрокаТаблицы; КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеВПротокол(11, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Строка(СтрокаТаблицы.Источник)); + ЗаписатьИнформациюОбОшибкеВПротокол(11, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Строка(СтрокаТаблицы.Источник)); КонецПопытки; КонецЕсли; @@ -7016,7 +7079,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(29, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, Объект, "ПередУдалениемОбъектаВыборки"); + ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(29, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, Объект, "ПередУдалениемОбъектаВыборки"); КонецПопытки; @@ -7034,7 +7097,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(24, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, Объект, ""); + ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(24, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, Объект, ""); КонецПопытки; @@ -7071,7 +7134,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(27, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "", "ПередОбработкойПравилаОчистки"); + ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(27, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "", "ПередОбработкойПравилаОчистки"); КонецПопытки; @@ -7176,7 +7239,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(28, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "", "ПослеОбработкиПравилаОчистки"); + ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(28, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "", "ПослеОбработкиПравилаОчистки"); КонецПопытки; @@ -7292,7 +7355,7 @@ КонецЕсли; Исключение - ВызватьИсключение ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(22, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПередЗагрузкойДанных (конвертация)'")); + ВызватьИсключение ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(22, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПередЗагрузкойДанных (конвертация)'")); КонецПопытки; Если Отказ Тогда @@ -7395,7 +7458,7 @@ | |Подробности: |%1'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры @@ -7418,7 +7481,7 @@ КонецЕсли; Исключение - ВызватьИсключение ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(23, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПослеЗагрузкиДанных (конвертация)'")); + ВызватьИсключение ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(23, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПослеЗагрузкиДанных (конвертация)'")); КонецПопытки; КонецЕсли; @@ -7507,7 +7570,7 @@ Исключение - ЗП = ЗаписьПротоколаОбмена(78, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ЗаписьПротоколаОбмена(78, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.Обработчик = "ПослеЗагрузкиПараметров"; СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(78, ЗП); @@ -8707,7 +8770,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(73, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), "", "", + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(73, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), "", "", ТипОбъекта, Неопределено, НСтр("ru = 'Последовательность полей поиска'")); КонецПопытки; @@ -8861,7 +8924,7 @@ Исключение - ЗП = ЗаписьПротоколаОбмена(26, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ЗаписьПротоколаОбмена(26, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.ИмяПКО = ИмяПКО; ЗП.Объект = Объект; ЗП.ТипОбъекта = ТипЗнч(Объект); @@ -9007,7 +9070,7 @@ Текст = НСтр("ru = 'Имя табличной части: %1'"); - ЗП = ЗаписьПротоколаОбмена(83, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ЗаписьПротоколаОбмена(83, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.Объект = Объект; ЗП.ТипОбъекта = ТипЗнч(Объект); ЗП.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Текст, ИмяТабличнойЧасти); @@ -9236,7 +9299,7 @@ Исключение - ЗП = ЗаписьПротоколаОбмена(26, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ЗаписьПротоколаОбмена(26, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.ИмяПКО = ИмяПКО; ЗП.Объект = Запись; ЗП.ТипОбъекта = ТипЗнч(Запись); @@ -9793,7 +9856,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(53, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(53, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Неопределено, НСтр("ru = 'ПередЗагрузкойОбъекта (глобальный)'")); КонецПопытки; @@ -9829,7 +9892,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(19, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(19, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Неопределено, "ПередЗагрузкойОбъекта"); КонецПопытки; @@ -9906,7 +9969,7 @@ Исключение - ЗП = ЗаписьПротоколаОбмена(26, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ЗаписьПротоколаОбмена(26, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.ИмяПКО = ИмяПравила; ЗП.Источник = Источник; ЗП.Объект = Объект; @@ -9947,7 +10010,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Объект, "ПриЗагрузкеОбъекта"); КонецПопытки; @@ -10000,7 +10063,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(21, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(21, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Объект, "ПослеЗагрузкиОбъекта"); КонецПопытки; @@ -10221,7 +10284,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(53, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(53, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Неопределено, НСтр("ru = 'ПередЗагрузкойОбъекта (глобальный)'")); КонецПопытки; @@ -10257,7 +10320,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(19, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(19, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Неопределено, "ПередЗагрузкойОбъекта"); КонецПопытки; @@ -10317,7 +10380,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Объект, "ПриЗагрузкеОбъекта"); КонецПопытки; @@ -10382,7 +10445,7 @@ Исключение - ЗП = ЗаписьПротоколаОбмена(26, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ЗаписьПротоколаОбмена(26, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.ИмяПКО = ИмяПравила; ЗП.НПП = НПП; ЗП.ГНПП = ГНПП; @@ -10481,7 +10544,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Объект, "ПриЗагрузкеОбъекта"); // КонецПопытки; @@ -10533,7 +10596,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Объект, "ПриЗагрузкеОбъекта"); КонецПопытки; @@ -10617,7 +10680,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(54, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(54, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Объект, НСтр("ru = 'ПослеЗагрузкиОбъекта (глобальный)'")); КонецПопытки; @@ -10642,7 +10705,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(21, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(21, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Объект, "ПослеЗагрузкиОбъекта"); КонецПопытки; @@ -10789,7 +10852,7 @@ Исключение - СтрокаОписанияОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СтрокаОписанияОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); Если ЗаписатьОбъект Тогда // Не смогли выполнить необходимые действия для документа. @@ -10916,6 +10979,25 @@ КонецФункции +Процедура ВыполнитьПереходНаНовыйОбмен() + + ИмяПланаОбмена = ИмяПланаОбмена(); + ИмяПланаОбменаДляПерехода = ПланыОбмена[ИмяПланаОбмена].ИмяПланаОбменаДляПереходаНаНовыйОбмен(); + + НастройкаСинхронизацииДанных = Неопределено; + Если ЗначениеЗаполнено(УзелДляОбмена) Тогда + НастройкаСинхронизацииДанных = УзелДляОбмена; + ИначеЕсли ЗначениеЗаполнено(УзелОбменаЗагрузкаДанных) Тогда + НастройкаСинхронизацииДанных = УзелОбменаЗагрузкаДанных; + КонецЕсли; + + ПланыОбмена[ИмяПланаОбменаДляПерехода].ВыполнитьПереходНаНовыйОбмен(НастройкаСинхронизацииДанных); + СтрокаСообщения = НСтр("ru = 'Выполнен автоматический переход на синхронизацию данных через формат EnterpriseData.'"); + ЗаписьЖурналаРегистрацииОбменДанными(СтрокаСообщения, УровеньЖурналаРегистрации.Информация); + ПолеРезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; + ВызватьИсключение НСтр("ru = 'Синхронизация данных по старой настройке отменена.'"); +КонецПроцедуры + Функция ЗагрузкаТабличнойЧастиПоддерживается(Объект, ИмяТабличнойЧасти) МетаданныеОбъекта = Объект.Метаданные(); @@ -10938,25 +11020,6 @@ КонецФункции -Процедура ВыполнитьПереходНаНовыйОбмен() - - ИмяПланаОбмена = ИмяПланаОбмена(); - ИмяПланаОбменаДляПерехода = ПланыОбмена[ИмяПланаОбмена].ИмяПланаОбменаДляПереходаНаНовыйОбмен(); - - НастройкаСинхронизацииДанных = Неопределено; - Если ЗначениеЗаполнено(УзелДляОбмена) Тогда - НастройкаСинхронизацииДанных = УзелДляОбмена; - ИначеЕсли ЗначениеЗаполнено(УзелОбменаЗагрузкаДанных) Тогда - НастройкаСинхронизацииДанных = УзелОбменаЗагрузкаДанных; - КонецЕсли; - - ПланыОбмена[ИмяПланаОбменаДляПерехода].ВыполнитьПереходНаНовыйОбмен(НастройкаСинхронизацииДанных); - СтрокаСообщения = НСтр("ru = 'Выполнен автоматический переход на синхронизацию данных через формат EnterpriseData.'"); - ЗаписьЖурналаРегистрацииОбменДанными(СтрокаСообщения, УровеньЖурналаРегистрации.Информация); - ПолеРезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; - ВызватьИсключение НСтр("ru = 'Синхронизация данных по старой настройке отменена.'"); -КонецПроцедуры - Процедура ЗаписатьРегистрыБухгалтерии(Регистратор, ТаблицыОтложеннойЗаписиДвижений) Если НЕ ЗначениеЗаполнено(Регистратор.Ссылка) Тогда @@ -11171,7 +11234,7 @@ Исключение - ЗП = ЗаписьПротоколаОбмена(48, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ЗаписьПротоколаОбмена(48, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.ПКО = ПКО.Имя + " (" + ПКО.Наименование + ")"; ЗП.ПКГС = ПКГС.Имя + " (" + ПКГС.Наименование + ")"; @@ -11277,7 +11340,7 @@ Исключение - ЗП = ЗаписьПротоколаОбмена(49, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ЗаписьПротоколаОбмена(49, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.ПКО = ПКО.Имя + " (" + ПКО.Наименование + ")"; ЗП.ПКГС = ПКГС.Имя + " (" + ПКГС.Наименование + ")"; @@ -11324,7 +11387,7 @@ Исключение - ЗП = ЗаписьПротоколаОбмена(66, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ЗаписьПротоколаОбмена(66, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.ПКО = ПКО.Имя + " (" + ПКО.Наименование + ")"; ЗП.ПКГС = ПКГС.Имя + " (" + ПКГС.Наименование + ")"; @@ -11399,7 +11462,7 @@ |Описание ошибки: |%2'"), Строка(ИмяФайлаЗаписей), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписатьВПротоколВыполнения(СтрокаСообщенияОбОшибке); @@ -11582,7 +11645,7 @@ Исключение - ЗП = ЗаписьПротоколаОбмена(49, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ЗаписьПротоколаОбмена(49, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.ПКО = ПКО.Имя + " (" + ПКО.Наименование + ")"; ЗП.ПКГС = ПКГС.Имя + " (" + ПКГС.Наименование + ")"; @@ -11706,7 +11769,7 @@ Исключение Если КодОшибки <> 14 Тогда - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(КодОшибки, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, ""); + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(КодОшибки, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, ""); КонецЕсли; КонецПопытки; @@ -11756,7 +11819,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(55, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(55, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, "ПередВыгрузкойСвойства", Значение); КонецПопытки; @@ -11809,7 +11872,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(56, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(56, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, "ПриВыгрузкеСвойства", Значение); КонецПопытки; @@ -11963,7 +12026,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(57, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(57, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, "ПослеВыгрузкиСвойства", Значение); КонецПопытки; @@ -12133,12 +12196,12 @@ Иначе СвойствоУстановлено = Ложь; - - КонецЕсли; - + + КонецЕсли; + ИначеЕсли ТипЗначения = ТипВидДвиженияНакопления Тогда - - Значение = Строка(Значение); + + Значение = Строка(Значение); ИначеЕсли ТипЗначения = ТипОписаниеТипов Тогда @@ -12464,7 +12527,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(55, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(55, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, "ПередВыгрузкойСвойства", Значение); КонецПопытки; @@ -12583,7 +12646,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(56, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(56, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, "ПриВыгрузкеСвойства", Значение); КонецПопытки; @@ -12783,7 +12846,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(57, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(57, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, "ПослеВыгрузкиСвойства", Значение); КонецПопытки; @@ -12963,7 +13026,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(65, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, НСтр("ru = 'ПередВыгрузкойОбъектаВыборки (глобальный)'"), Объект); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(65, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, НСтр("ru = 'ПередВыгрузкойОбъектаВыборки (глобальный)'"), Объект); КонецПопытки; Если Отказ Тогда @@ -12988,7 +13051,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(33, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "ПередВыгрузкойОбъектаВыборки", Объект); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(33, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "ПередВыгрузкойОбъектаВыборки", Объект); КонецПопытки; КонецЕсли; @@ -13016,7 +13079,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(69, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, НСтр("ru = 'ПослеВыгрузкиОбъектаВыборки (глобальный)'"), Объект); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(69, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, НСтр("ru = 'ПослеВыгрузкиОбъектаВыборки (глобальный)'"), Объект); КонецПопытки; КонецЕсли; @@ -13036,7 +13099,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(34, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "ПослеВыгрузкиОбъектаВыборки", Объект); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(34, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "ПослеВыгрузкиОбъектаВыборки", Объект); КонецПопытки; КонецЕсли; @@ -13236,7 +13299,7 @@ КонецЕсли; Исключение - СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(76, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПередОтправкойИнформацииОбУдалении (конвертация)'")); + СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(76, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПередОтправкойИнформацииОбУдалении (конвертация)'")); Если Не ПродолжитьПриОшибке Тогда ВызватьИсключение СтрокаСообщенияОбОшибке; @@ -13252,12 +13315,12 @@ КонецЕсли; КонецЕсли; - Менеджер = Менеджеры[ТипЗнч(Ссылка)]; + Отбор = Новый Структура("Источник", ТипЗнч(Ссылка)); + Правила = КоллекцияПравилаКонвертации().Скопировать(Отбор, "ТипПриемника,ТипИсточника"); + Правила.Свернуть("ТипПриемника, ТипИсточника"); - // Проверка на существование менеджера и ПКО. - Если Менеджер = Неопределено - ИЛИ Менеджер.ПКО = Неопределено Тогда - + Если Правила.Количество() = 0 Тогда + ЗП = ЗаписьПротоколаОбмена(45); ЗП.Объект = Ссылка; @@ -13268,7 +13331,9 @@ КонецЕсли; - ЗаписатьВФайлУдалениеОбъекта(Ссылка, Менеджер.ПКО.ТипПриемника, Менеджер.ПКО.ТипИсточника); + Для Каждого ПКО Из Правила Цикл + ЗаписатьВФайлУдалениеОбъекта(Ссылка, ПКО.ТипПриемника, ПКО.ТипИсточника); + КонецЦикла; КонецПроцедуры @@ -13285,13 +13350,6 @@ Возврат Неопределено; КонецЕсли; - Если РежимОбмена = "Загрузка" Тогда - ТаблицаРеквизитовРегистрацииОбъектов = Неопределено; - Иначе - // Получаем таблицу реквизитов регистрации для механизма выборочной регистрации объектов. - ТаблицаРеквизитовРегистрацииОбъектов = РеквизитыРегистрацииОбъектов(); - КонецЕсли; - // сохраняем запросы ЗапросыДляСохранения = Новый Структура; @@ -13327,478 +13385,12 @@ СтруктураПравилОбмена.Вставить("XMLПравила", XMLПравила); СтруктураПравилОбмена.Вставить("СтрокаТиповДляПриемника", СтрокаТиповДляПриемника); - СтруктураПравилОбмена.Вставить("ПравилаВыборочнойРегистрацииОбъектов", ТаблицаРеквизитовРегистрацииОбъектов); + // ПравилаВыборочнойРегистрацииОбъектов - далее хранятся в записях о правилах регистрации. Возврат СтруктураПравилОбмена; КонецФункции -Функция РеквизитыРегистрацииОбъектов() - - ТаблицаРеквизитовРегистрации = ИнициализацияТаблицыРеквизитовРегистрации(); - ТаблицаРезультат = ИнициализацияТаблицыРеквизитовРегистрации(); - - // Получаем предварительную таблицу из правил конвертации. - Для Каждого ПКО Из КоллекцияПравилаКонвертации() Цикл - - ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоПравилу(ПКО, ТаблицаРезультат); - - КонецЦикла; - - ТаблицаРезультатГруппировка = ТаблицаРезультат.Скопировать(); - - ТаблицаРезультатГруппировка.Свернуть("ИмяОбъекта, ИмяТабличнойЧасти"); - - // Получаем итоговую таблицу с учетом сгруппированных строк предварительной таблицы. - Для Каждого СтрокаТаблицы Из ТаблицаРезультатГруппировка Цикл - - Отбор = Новый Структура("ИмяОбъекта, ИмяТабличнойЧасти", СтрокаТаблицы.ИмяОбъекта, СтрокаТаблицы.ИмяТабличнойЧасти); - - МассивСтрокТаблицыРезультат = ТаблицаРезультат.НайтиСтроки(Отбор); - - ДополнитьТаблицуРеквизитовРегистрации(МассивСтрокТаблицыРезультат, ТаблицаРеквизитовРегистрации); - - КонецЦикла; - - // строки с ошибками удаляем - УдалитьСтрокиСОшибкамиТаблицыРеквизитовРегистрации(ТаблицаРеквизитовРегистрации); - - // Выполняем проверку на наличие требуемых реквизитов шапки и реквизитов табличных частей объектов метаданных. - ВыполнитьПроверкуРеквизитовРегистрацииОбъектов(ТаблицаРеквизитовРегистрации); - - // Заполняем таблицу значением имени Плана обмена. - ТаблицаРеквизитовРегистрации.ЗаполнитьЗначения(ИмяПланаОбменаВРО, "ИмяПланаОбмена"); - - Возврат ТаблицаРеквизитовРегистрации; - -КонецФункции - -// Возвращаемое значение: -// ТаблицаЗначений - коллекция реквизитов регистрации: -// * Порядок - Число -// * ИмяОбъекта - Строка -// * ТипОбъектаСтрокой - Строка -// * ИмяПланаОбмена - Строка -// * ИмяТабличнойЧасти - Строка -// * РеквизитыРегистрации - Строка -// * СтруктураРеквизитовРегистрации - Структура -// -Функция ИнициализацияТаблицыРеквизитовРегистрации() - - ТаблицаРезультат = Новый ТаблицаЗначений; - - ТаблицаРезультат.Колонки.Добавить("Порядок", одОписаниеТипа("Число")); - ТаблицаРезультат.Колонки.Добавить("ИмяОбъекта", одОписаниеТипа("Строка")); - ТаблицаРезультат.Колонки.Добавить("ТипОбъектаСтрокой", одОписаниеТипа("Строка")); - ТаблицаРезультат.Колонки.Добавить("ИмяПланаОбмена", одОписаниеТипа("Строка")); - ТаблицаРезультат.Колонки.Добавить("ИмяТабличнойЧасти", одОписаниеТипа("Строка")); - ТаблицаРезультат.Колонки.Добавить("РеквизитыРегистрации", одОписаниеТипа("Строка")); - ТаблицаРезультат.Колонки.Добавить("СтруктураРеквизитовРегистрации", одОписаниеТипа("Структура")); - - Возврат ТаблицаРезультат; - -КонецФункции - -Функция РеквизитыРегистрацииСвойств(ТаблицаПКС) - - СтруктураРеквизитовРегистрации = Новый Структура; - - МассивСтрокПКС = ТаблицаПКС.НайтиСтроки(Новый Структура("ЭтоГруппа", Ложь)); - - Для Каждого ПКС Из МассивСтрокПКС Цикл - - ИсточникПКС = ПКС.Источник; - - // Проверка на недопустимые символы в строке. - Если ПустаяСтрока(ИсточникПКС) - Или Лев(ИсточникПКС, 1) = "{" Тогда - - Продолжить; - КонецЕсли; - - Попытка - СтруктураРеквизитовРегистрации.Вставить(ИсточникПКС); - Исключение - ЗаписьЖурналаРегистрации(НСтр("ru = 'Обмен данными.Загрузка правил конвертации'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - КонецЦикла; - - Возврат СтруктураРеквизитовРегистрации; - -КонецФункции - -Функция РеквизитыРегистрацииПоМассивуСтрок(МассивСтрок) - - СтруктураРезультат = Новый Структура; - - Для Каждого СтрокаТаблицыРезультат Из МассивСтрок Цикл - - СтруктураРеквизитовРегистрации = СтрокаТаблицыРезультат.СтруктураРеквизитовРегистрации; - - Для Каждого РеквизитРегистрации Из СтруктураРеквизитовРегистрации Цикл - - СтруктураРезультат.Вставить(РеквизитРегистрации.Ключ); - - КонецЦикла; - - КонецЦикла; - - Возврат СтруктураРезультат; - -КонецФункции - -Функция РеквизитыРегистрации(СтруктураРеквизитовРегистрации) - - РеквизитыРегистрации = ""; - - Для Каждого РеквизитРегистрации Из СтруктураРеквизитовРегистрации Цикл - - РеквизитыРегистрации = РеквизитыРегистрации + РеквизитРегистрации.Ключ + ", "; - - КонецЦикла; - - СтроковыеФункцииКлиентСервер.УдалитьПоследнийСимволВСтроке(РеквизитыРегистрации, 2); - - Возврат РеквизитыРегистрации; - -КонецФункции - -Процедура ВыполнитьПроверкуРеквизитовРегистрацииОбъектов(ТаблицаРеквизитовРегистрации) - - Для Каждого СтрокаТаблицы Из ТаблицаРеквизитовРегистрации Цикл - - Попытка - ТипОбъекта = Тип(СтрокаТаблицы.ТипОбъектаСтрокой); - Исключение - - СтрокаСообщения = НСтр("ru = 'Тип объекта не определен: %1'"); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, СтрокаТаблицы.ТипОбъектаСтрокой); - ЗаписатьВПротоколВыполнения(СтрокаСообщения); - Продолжить; - - КонецПопытки; - - ОбъектМД = Метаданные.НайтиПоТипу(ТипОбъекта); - - // Проверку выполняем только для ссылочных типов. - Если Не ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(ОбъектМД) Тогда - Продолжить; - КонецЕсли; - - ТаблицаОбщихРеквизитов = ТаблицаОбщихРеквизитов(); - ЗаполнитьТаблицуОбщихРеквизитов(ТаблицаОбщихРеквизитов); - - Если ПустаяСтрока(СтрокаТаблицы.ИмяТабличнойЧасти) Тогда // реквизиты шапки - - Для Каждого Реквизит Из СтрокаТаблицы.СтруктураРеквизитовРегистрации Цикл - - Если ОбщегоНазначения.ЭтоЗадача(ОбъектМД) Тогда - - Если Не (ОбъектМД.Реквизиты.Найти(Реквизит.Ключ) <> Неопределено - Или ОбъектМД.РеквизитыАдресации.Найти(Реквизит.Ключ) <> Неопределено - Или ОбменДаннымиСервер.ЭтоСтандартныйРеквизит(ОбъектМД.СтандартныеРеквизиты, Реквизит.Ключ) - Или ЭтоОбщийРеквизит(Реквизит.Ключ, ОбъектМД.ПолноеИмя(), ТаблицаОбщихРеквизитов)) Тогда - - СтрокаСообщения = НСтр("ru = 'Неправильно указаны реквизиты шапки объекта ""%1"". Реквизит ""%2"" не существует.'"); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, Строка(ОбъектМД), Реквизит.Ключ); - ЗаписатьВПротоколВыполнения(СтрокаСообщения); - - КонецЕсли; - - ИначеЕсли ОбщегоНазначения.ЭтоПланСчетов(ОбъектМД) Тогда - - Если Не (ОбъектМД.Реквизиты.Найти(Реквизит.Ключ) <> Неопределено - Или ОбъектМД.ПризнакиУчета.Найти(Реквизит.Ключ) <> Неопределено - Или ОбменДаннымиСервер.ЭтоСтандартныйРеквизит(ОбъектМД.СтандартныеРеквизиты, Реквизит.Ключ) - Или ЭтоОбщийРеквизит(Реквизит.Ключ, ОбъектМД.ПолноеИмя(), ТаблицаОбщихРеквизитов)) Тогда - - СтрокаСообщения = НСтр("ru = 'Неправильно указаны реквизиты шапки объекта ""%1"". Реквизит ""%2"" не существует.'"); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, Строка(ОбъектМД), Реквизит.Ключ); - ЗаписатьВПротоколВыполнения(СтрокаСообщения); - - КонецЕсли; - - Иначе - - Если Не (ОбъектМД.Реквизиты.Найти(Реквизит.Ключ) <> Неопределено - Или ОбменДаннымиСервер.ЭтоСтандартныйРеквизит(ОбъектМД.СтандартныеРеквизиты, Реквизит.Ключ) - Или ЭтоОбщийРеквизит(Реквизит.Ключ, ОбъектМД.ПолноеИмя(), ТаблицаОбщихРеквизитов)) Тогда - - СтрокаСообщения = НСтр("ru = 'Неправильно указаны реквизиты шапки объекта ""%1"". Реквизит ""%2"" не существует.'"); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, Строка(ОбъектМД), Реквизит.Ключ); - ЗаписатьВПротоколВыполнения(СтрокаСообщения); - - КонецЕсли; - - КонецЕсли; - - КонецЦикла; - - Иначе - // Табличная часть, стандартная табличная часть, движения. - МетаТаблицы = МетаТабличнаяЧастьРеквизитовРегистрацииОбъектов(ОбъектМД, СтрокаТаблицы.ИмяТабличнойЧасти); - Если МетаТаблицы = Неопределено Тогда - ЗаписатьВПротоколВыполнения(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Табличная часть (стандартная табличная часть, движения) ""%1"" объекта ""%2"" не существует.'"), - СтрокаТаблицы.ИмяТабличнойЧасти, ОбъектМД)); - Продолжить; - КонецЕсли; - - // Пробуем найти каждый реквизит хоть где-нибудь. - Для Каждого Реквизит Из СтрокаТаблицы.СтруктураРеквизитовРегистрации Цикл - - РеквизитНайден = Ложь; - Для Каждого МетаТаблица Из МетаТаблицы Цикл - РеквизитНайден = РеквизитНайденВТабличнойЧастиРеквизитовРегистрацииОбъектов(МетаТаблица, Реквизит.Ключ); - Если РеквизитНайден Тогда - Прервать; - КонецЕсли; - КонецЦикла; - - Если Не РеквизитНайден Тогда - ЗаписатьВПротоколВыполнения(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Реквизит ""%3"" не существует в табличной части (стандартной табличной части, движениях) ""%1"" объекта ""%2"".'"), - СтрокаТаблицы.ИмяТабличнойЧасти, ОбъектМД, Реквизит.Ключ)); - Прервать; - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -// Параметры: -// * МетаданныеТекущегоОбъекта - ОбъектМетаданных - метаданные объекта. -// * ИмяИскомойТабличнойЧасти - Строка - имя табличной части. -// -// Возвращаемое значение: -// ОбъектМетаданныхТабличнаяЧасть, ОписаниеСтандартнойТабличнойЧасти - метаданные табличной части объекта. -// -Функция МетаТабличнаяЧастьРеквизитовРегистрацииОбъектов(МетаданныеТекущегоОбъекта, ИмяИскомойТабличнойЧасти) - - МетаТест = Новый Структура("ТабличныеЧасти, СтандартныеТабличныеЧасти, Движения"); - ЗаполнитьЗначенияСвойств(МетаТест, МетаданныеТекущегоОбъекта); - МетаТаблицы = Новый Массив; - - ИмяКандидата = ВРег(ИмяИскомойТабличнойЧасти); - - Для Каждого КлючЗначение Из МетаТест Цикл - МетаКоллекцияТаблиц = КлючЗначение.Значение; // КоллекцияОбъектовМетаданных, КоллекцияЗначенийСвойстваОбъектаМетаданных, ОписанияСтандартныхТабличныхЧастей - Если МетаКоллекцияТаблиц <> Неопределено Тогда - - Для Каждого МетаТаблица Из МетаКоллекцияТаблиц Цикл - Если ВРег(МетаТаблица.Имя) = ИмяКандидата Тогда - МетаТаблицы.Добавить(МетаТаблица); - КонецЕсли; - КонецЦикла; - - КонецЕсли; - КонецЦикла; - Если МетаТаблицы.Количество() > 0 Тогда - Возврат МетаТаблицы; - КонецЕсли; - - Возврат Неопределено; - -КонецФункции - -Функция РеквизитНайденВТабличнойЧастиРеквизитовРегистрацииОбъектов(МетаданныеТаблицы, ИмяИскомогоРеквизита) - - МетаТест = Новый Структура("Реквизиты, СтандартныеРеквизиты, Измерения, Ресурсы"); - ЗаполнитьЗначенияСвойств(МетаТест, МетаданныеТаблицы); - - ИмяКандидата = ВРег(ИмяИскомогоРеквизита); - Корреспонденция = Ложь; - Если ТипЗнч(МетаданныеТаблицы) = Тип("ОбъектМетаданных") И ОбщегоНазначения.ЭтоРегистрБухгалтерии(МетаданныеТаблицы) Тогда - Корреспонденция = МетаданныеТаблицы.Корреспонденция; - // Субконто Дт и Кт отсутствуют в измерениях, их не проверить. - // Счет - стандартный реквизит без признака баланса. - Если ИмяКандидата = "СУБКОНТОДТ" Или ИмяКандидата = "СУБКОНТОКТ" - Или ИмяКандидата = "СЧЕТДТ" Или ИмяКандидата = "СЧЕТКТ" Тогда - Возврат Истина; - КонецЕсли; - КонецЕсли; - - Для Каждого КлючЗначение Из МетаТест Цикл - МетаКоллекцияРеквизитов = КлючЗначение.Значение; // КоллекцияОбъектовМетаданных, ОписанияСтандартныхРеквизитов - - Если МетаКоллекцияРеквизитов <> Неопределено Тогда - - Для Каждого МетаРеквизит Из МетаКоллекцияРеквизитов Цикл - - Если ВРег(МетаРеквизит.Имя) = ИмяКандидата Тогда - Возврат Истина; - КонецЕсли; - - Если (КлючЗначение.Ключ = "Измерения" Или КлючЗначение.Ключ = "Ресурсы") И Корреспонденция И НЕ МетаРеквизит.Балансовый Тогда - Если ВРег(МетаРеквизит.Имя) + "ДТ" = ИмяКандидата - Или ВРег(МетаРеквизит.Имя) + "КТ" = ИмяКандидата Тогда - Возврат Истина; - КонецЕсли; - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - КонецЦикла; - - Возврат Ложь; - -КонецФункции - -Процедура ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоПравилу(ПКО, ТаблицаРезультат) - - ИмяОбъекта = СтрЗаменить(ПКО.ТипИсточника, "Ссылка", ""); - ТипОбъектаСтрокой = ПКО.ТипИсточника; - - // Заполняем таблицу реквизитами шапки (свойства). - ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоТаблице(ТипОбъектаСтрокой, ИмяОбъекта, "", -50, ПКО.Свойства, ТаблицаРезультат); - - // Заполняем таблицу реквизитами шапки (свойства поиска). - ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоТаблице(ТипОбъектаСтрокой, ИмяОбъекта, "", -50, ПКО.СвойстваПоиска, ТаблицаРезультат); - - // Заполняем таблицу реквизитами шапки (свойства отключенные). - ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоТаблице(ТипОбъектаСтрокой, ИмяОбъекта, "", -50, ПКО.СвойстваОтключенные, ТаблицаРезультат); - - // табличные части правила - МассивПКГС = ПКО.Свойства.НайтиСтроки(Новый Структура("ЭтоГруппа", Истина)); - - Для Каждого ПКГС Из МассивПКГС Цикл - - // Заполняем таблицу реквизитами табличной части. - ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоТаблице(ТипОбъектаСтрокой, ИмяОбъекта, ПКГС.Источник, ПКГС.Порядок, ПКГС.ПравилаГруппы, ТаблицаРезультат); - - // Заполняем таблицу реквизитами табличной части (отключенные). - ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоТаблице(ТипОбъектаСтрокой, ИмяОбъекта, ПКГС.Источник, ПКГС.Порядок, ПКГС.ПравилаГруппыОтключенные, ТаблицаРезультат); - - КонецЦикла; - - // Табличные части правила (отключенные). - МассивПКГС = ПКО.СвойстваОтключенные.НайтиСтроки(Новый Структура("ЭтоГруппа", Истина)); - - Для Каждого ПКГС Из МассивПКГС Цикл - - // Заполняем таблицу реквизитами табличной части. - ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоТаблице(ТипОбъектаСтрокой, ИмяОбъекта, ПКГС.Источник, ПКГС.Порядок, ПКГС.ПравилаГруппы, ТаблицаРезультат); - - // Заполняем таблицу реквизитами табличной части (отключенные). - ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоТаблице(ТипОбъектаСтрокой, ИмяОбъекта, ПКГС.Источник, ПКГС.Порядок, ПКГС.ПравилаГруппыОтключенные, ТаблицаРезультат); - - КонецЦикла; - -КонецПроцедуры - -Процедура ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоТаблице(ТипОбъектаСтрокой, ИмяОбъекта, ИмяТабличнойЧасти, Порядок, ТаблицаСвойств, ТаблицаРезультат) - - СтрокаТаблицыРезультат = ТаблицаРезультат.Добавить(); - - СтрокаТаблицыРезультат.Порядок = Порядок; - СтрокаТаблицыРезультат.ИмяОбъекта = ИмяОбъекта; - СтрокаТаблицыРезультат.ТипОбъектаСтрокой = ТипОбъектаСтрокой; - СтрокаТаблицыРезультат.ИмяТабличнойЧасти = ИмяТабличнойЧасти; - СтрокаТаблицыРезультат.СтруктураРеквизитовРегистрации = РеквизитыРегистрацииСвойств(ТаблицаСвойств); - -КонецПроцедуры - -Процедура ДополнитьТаблицуРеквизитовРегистрации(МассивСтрок, ТаблицаРеквизитовРегистрации) - - СтрокаТаблицы = ТаблицаРеквизитовРегистрации.Добавить(); - - СтрокаТаблицы.Порядок = МассивСтрок[0].Порядок; - СтрокаТаблицы.ИмяОбъекта = МассивСтрок[0].ИмяОбъекта; - СтрокаТаблицы.ТипОбъектаСтрокой = МассивСтрок[0].ТипОбъектаСтрокой; - СтрокаТаблицы.ИмяТабличнойЧасти = МассивСтрок[0].ИмяТабличнойЧасти; - СтрокаТаблицы.СтруктураРеквизитовРегистрации = РеквизитыРегистрацииПоМассивуСтрок(МассивСтрок); - СтрокаТаблицы.РеквизитыРегистрации = РеквизитыРегистрации(СтрокаТаблицы.СтруктураРеквизитовРегистрации); - -КонецПроцедуры - -Процедура УдалитьСтрокиСОшибкамиТаблицыРеквизитовРегистрации(ТаблицаРеквизитовРегистрации) - - КоличествоЭлементовКоллекции = ТаблицаРеквизитовРегистрации.Количество(); - - Для ОбратныйИндекс = 1 По КоличествоЭлементовКоллекции Цикл - - СтрокаТаблицы = ТаблицаРеквизитовРегистрации[КоличествоЭлементовКоллекции - ОбратныйИндекс]; - - // Если нет реквизитов регистрации, то удаляем строку. - Если ПустаяСтрока(СтрокаТаблицы.РеквизитыРегистрации) Тогда - - ТаблицаРеквизитовРегистрации.Удалить(СтрокаТаблицы); - - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -// Возвращает признак того, что реквизит входит в подмножество общих реквизитов. -// -Функция ЭтоОбщийРеквизит(ОбщийРеквизит, ИмяОМД, ТаблицаОбщихРеквизитов) - - ПараметрыПоиска = Новый Структура("ОбщийРеквизит, ОбъектМетаданных", ОбщийРеквизит, ИмяОМД); - НайденныеЗначения = ТаблицаОбщихРеквизитов.НайтиСтроки(ПараметрыПоиска); - - Если НайденныеЗначения.Количество() > 0 Тогда - - Возврат Истина; - - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -Функция ТаблицаОбщихРеквизитов() - - ТаблицаОбщихРеквизитов = Новый ТаблицаЗначений; - ТаблицаОбщихРеквизитов.Колонки.Добавить("ОбщийРеквизит"); - ТаблицаОбщихРеквизитов.Колонки.Добавить("ОбъектМетаданных"); - - ТаблицаОбщихРеквизитов.Индексы.Добавить("ОбщийРеквизит, ОбъектМетаданных"); - - Возврат ТаблицаОбщихРеквизитов; - -КонецФункции - -Процедура ЗаполнитьТаблицуОбщихРеквизитов(ТаблицаОбщихРеквизитов) - - Если Метаданные.ОбщиеРеквизиты.Количество() <> 0 Тогда - - АвтоиспользованиеОбщегоРеквизита = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.Авто; - ИспользованиеОбщегоРеквизита = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.Использовать; - - Для Каждого ОбщийРеквизит Из Метаданные.ОбщиеРеквизиты Цикл - - Если ОбщийРеквизит.ИспользованиеРазделенияДанных = Неопределено Тогда - - Автоиспользование = (ОбщийРеквизит.Автоиспользование = Метаданные.СвойстваОбъектов.АвтоИспользованиеОбщегоРеквизита.Использовать); - - Для Каждого Элемент Из ОбщийРеквизит.Состав Цикл - - Если Элемент.Использование = ИспользованиеОбщегоРеквизита - Или (Элемент.Использование = АвтоиспользованиеОбщегоРеквизита И Автоиспользование) Тогда - - НоваяСтрока = ТаблицаОбщихРеквизитов.Добавить(); - НоваяСтрока.ОбщийРеквизит = ОбщийРеквизит.Имя; - НоваяСтрока.ОбъектМетаданных = Элемент.Метаданные.ПолноеИмя(); - - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - -КонецПроцедуры - #КонецОбласти #Область ИнициализацияТаблицПравилОбмена @@ -14124,7 +13716,7 @@ ОбработкаВыгрузки.ОтключитьОбработкуДляОтладки(); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Обмен данными'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; ОбработкаВыгрузки = Неопределено; @@ -14134,7 +13726,7 @@ ОбработкаЗагрузки.ОтключитьОбработкуДляОтладки(); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Обмен данными'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; ОбработкаЗагрузки = Неопределено; @@ -15937,7 +15529,7 @@ Возврат; ИначеЕсли ПравилаОбмена.ТипУзла = ТипУзлаXMLНачалоЭлемента Тогда - + // это новый элемент НовоеСоответствие = Новый Соответствие; СоответствиеТипа.Вставить(ИмяУзла, НовоеСоответствие); @@ -16004,7 +15596,7 @@ КонецЕсли; - КонецЦикла; + КонецЦикла; КонецПроцедуры @@ -16150,12 +15742,14 @@ ПравилаОбмена.УстановитьСтроку(Источник); ПравилаОбмена.Прочитать(); + ЗаписатьПакетВФайлДляСборкиАрхива(Источник); + ИначеЕсли ТипИсточника="ЧтениеXML" Тогда ПравилаОбмена = Источник; КонецЕсли; - + Если Не ((ПравилаОбмена.ЛокальноеИмя = "ПравилаОбмена") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLНачалоЭлемента)) Тогда СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(7); Возврат; @@ -16370,7 +15964,7 @@ УдалитьФайлы(ИмяВременногоФайлаПравилОбмена); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Обмен данными'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; @@ -16408,7 +16002,7 @@ КонецЕсли; Исключение - СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(75, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПослеЗагрузкиПравилОбмена (конвертация)'")); + СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(75, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПослеЗагрузкиПравилОбмена (конвертация)'")); Если Не ПродолжитьПриОшибке Тогда ВызватьИсключение СтрокаСообщенияОбОшибке; @@ -16479,7 +16073,7 @@ КонецЕсли; Исключение - СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(77, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПриПолученииИнформацииОбУдалении (конвертация)'")); + СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(77, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПриПолученииИнформацииОбУдалении (конвертация)'")); Отказ = Истина; Если Не ПродолжитьПриОшибке Тогда @@ -16591,7 +16185,7 @@ ЗаписатьВПротоколВыполнения(174,,,,,, Перечисления.РезультатыВыполненияОбмена.Предупреждение_СообщениеОбменаБылоРанееПринято); Иначе - ЗаписатьВПротоколВыполнения(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьВПротоколВыполнения(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецЕсли; КонецПопытки; @@ -17127,7 +16721,7 @@ Исключение - ЗП = ЗаписьПротоколаОбмена(78, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ЗаписьПротоколаОбмена(78, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.Обработчик = "ПослеЗагрузкиПараметров"; СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(78, ЗП, Истина); @@ -17317,7 +16911,7 @@ КонецЕсли; Исключение - ВызватьИсключение ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(176, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПослеПолученияИнформацииОбУзлахОбмена (конвертация)'")); + ВызватьИсключение ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(176, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПослеПолученияИнформацииОбУзлахОбмена (конвертация)'")); КонецПопытки; КонецЕсли; @@ -17777,7 +17371,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(62, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПередВыгрузкойДанных (конвертация)'")); + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(62, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПередВыгрузкойДанных (конвертация)'")); Отказ = Истина; КонецПопытки; @@ -17862,7 +17456,7 @@ ВыполнитьВыгрузкуЗарегистрированныхДанных(ЗаписьСообщения, СтрокаСообщенияОбОшибке, ТаблицаПравилВыгрузкиИспользуемые); Исключение Отказ = Истина; - ЗаписатьВПротоколВыполнения(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьВПротоколВыполнения(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; // Выполняем регистрацию объектов на текущем узле, которые были выгружены по ссылке. @@ -17911,7 +17505,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(63, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПослеВыгрузкиДанных (конвертация)'")); + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(63, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПослеВыгрузкиДанных (конвертация)'")); КонецПопытки; КонецЕсли; @@ -17981,7 +17575,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(175, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПередПолучениемИзмененныхОбъектов (конвертация)'")); + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(175, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПередПолучениемИзмененныхОбъектов (конвертация)'")); Возврат; КонецПопытки; @@ -18094,7 +17688,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПравилоВыгрузкиДанныхПредыдущее["Имя"], "ПослеОбработкиВыгрузкиДанных"); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПравилоВыгрузкиДанныхПредыдущее["Имя"], "ПослеОбработкиВыгрузкиДанных"); КонецПопытки; КонецЕсли; @@ -18155,7 +17749,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(31, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПравилоВыгрузкиДанных.Имя, "ПередОбработкойВыгрузкиДанных"); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(31, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПравилоВыгрузкиДанных.Имя, "ПередОбработкойВыгрузкиДанных"); КонецПопытки; @@ -18250,7 +17844,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПравилоВыгрузкиДанных.Имя, "ПослеОбработкиВыгрузкиДанных"); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПравилоВыгрузкиДанных.Имя, "ПослеОбработкиВыгрузкиДанных"); КонецПопытки; КонецЕсли; @@ -18264,7 +17858,7 @@ ОтменитьТранзакциюПриЗагрузкеДанных(); - ВызватьИсключение(НСтр("ru = 'Ошибка при отправке данных'") + ": " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение(НСтр("ru = 'Ошибка при отправке данных'") + ": " + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки @@ -18411,6 +18005,90 @@ КонецПроцедуры +Процедура ЗаписатьПакетВФайлДляСборкиАрхива(Источник) + + Если НЕ ПоместитьСообщениеВАрхивПриВнешнемСоединении Тогда + Возврат; + КонецЕсли; + + ИмяФайла = ВременныйКаталогДляСборкиАрхива + НомерПакета + ".xml"; + НомерПакета = НомерПакета + 1; + + ТекстовыйДокумент = Новый ТекстовыйДокумент; + ТекстовыйДокумент.ДобавитьСтроку(Источник); + ТекстовыйДокумент.Записать(ИмяФайла, , Символы.ПС); + +КонецПроцедуры + +Процедура СобратьИПоместитьСообщениеОбменаВАрхив() + + Если НЕ ПоместитьСообщениеВАрхивПриВнешнемСоединении Тогда + Возврат; + КонецЕсли; + + ИмяОбщегоФайла = ВременныйКаталогДляСборкиАрхива + Строка(Новый УникальныйИдентификатор) + ".xml"; + + ТекстовыйДокумент = Новый ТекстовыйДокумент; + + Для Сч = 0 По (НомерПакета - 1) Цикл + + ИмяФайла = ВременныйКаталогДляСборкиАрхива + Сч + ".xml"; + Чтение = Новый ЧтениеТекста(ИмяФайла); + Строка = Чтение.Прочитать(); + Чтение = Неопределено; + + ТекстовыйДокумент.ДобавитьСтроку(Строка); + + КонецЦикла; + + ТекстовыйДокумент.ДобавитьСтроку(""); + ТекстовыйДокумент.Записать(ИмяОбщегоФайла, , Символы.ПС); + ТекстовыйДокумент = Неопределено; + + РегистрыСведений.АрхивСообщенийОбменов.ПоместитьСообщениеВАрхив(УзелОбменаЗагрузкаДанных, ИмяОбщегоФайла); + + УдалитьФайлы(ВременныйКаталогДляСборкиАрхива); + +КонецПроцедуры + +Процедура ЗаписатьЗаголовокСообщенияДляАрхива() + + ИмяФайла = ВременныйКаталогДляСборкиАрхива + НомерПакета + ".xml"; + + НомерПакета = НомерПакета + 1; + + ФайлОбмена = Новый ЗаписьТекста; + ФайлОбмена.Открыть(ИмяФайла, КодировкаТекста.UTF8); + + СтрокаИнформацииОXML = ""; + + ФайлОбмена.ЗаписатьСтроку(СтрокаИнформацииОXML); + + ВременныйЗаписьXML = Новый ЗаписьXML(); + + ВременныйЗаписьXML.УстановитьСтроку(); + + ВременныйЗаписьXML.ЗаписатьНачалоЭлемента("ФайлОбмена"); + + УстановитьАтрибут(ВременныйЗаписьXML, "ВерсияФормата", ВерсияФорматаСообщенияОбмена()); + УстановитьАтрибут(ВременныйЗаписьXML, "ДатаВыгрузки", ТекущаяДатаСеанса()); + УстановитьАтрибут(ВременныйЗаписьXML, "ИмяКонфигурацииИсточника", Конвертация().Источник); + УстановитьАтрибут(ВременныйЗаписьXML, "ВерсияКонфигурацииИсточника", Конвертация().ВерсияКонфигурацииИсточника); + УстановитьАтрибут(ВременныйЗаписьXML, "ИмяКонфигурацииПриемника", Конвертация().Приемник); + УстановитьАтрибут(ВременныйЗаписьXML, "ИдПравилКонвертации", Конвертация().Ид); + + ВременныйЗаписьXML.ЗаписатьКонецЭлемента(); + + Стр = ВременныйЗаписьXML.Закрыть(); + + Стр = СтрЗаменить(Стр, "/>", ">"); + + ФайлОбмена.ЗаписатьСтроку(Стр); + + ФайлОбмена.Закрыть(); + +КонецПроцедуры + #КонецОбласти #КонецОбласти diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl b/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl index d7a44c7f0..66d36346e 100644 --- a/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl +++ b/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl @@ -67,7 +67,7 @@ ЧтениеXML.ОткрытьФайл(ИмяФайлаСообщенияОбмена()); Исключение // Ошибка открытия файла сообщения обмена. - СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗафиксироватьЗавершениеОбмена(Отказ, СообщениеОбОшибке, ОшибкаОткрытияФайлаСообщенияОбмена()); Возврат; КонецПопытки; @@ -105,7 +105,7 @@ ЗаписьXML.ОткрытьФайл(ИмяФайлаСообщенияОбмена()); Исключение // Ошибка открытия файла сообщения обмена. - СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗафиксироватьЗавершениеОбмена(Отказ, СообщениеОбОшибке, ОшибкаОткрытияФайлаСообщенияОбмена()); Возврат; КонецПопытки; @@ -142,7 +142,7 @@ // Задан неизвестный план обмена; // указан узел, не входящий в план обмена; // номер сообщения не соответствует ожидаемому. - СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗафиксироватьЗавершениеОбмена(Отказ, СообщениеОбОшибке, ОшибкаНачалаЧтенияФайлаСообщенияОбмена()); Возврат; КонецПопытки; @@ -182,7 +182,7 @@ УстановитьПривилегированныйРежим(Ложь); ЧтениеСообщения.ПрерватьЧтение(); - СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗафиксироватьЗавершениеОбмена(Отказ, СообщениеОбОшибке, ОшибкаЧтенияФайлаСообщенияОбмена()); Возврат; КонецПопытки; @@ -203,7 +203,7 @@ ЧтениеСообщения.ПрерватьЧтение(); Исключение ЧтениеСообщения.ПрерватьЧтение(); - СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗафиксироватьЗавершениеОбмена(Отказ, СообщениеОбОшибке, ОшибкаЧтенияФайлаСообщенияОбмена()); Возврат КонецПопытки; @@ -238,7 +238,7 @@ КонецЕсли; ЧтениеСообщения.ПрерватьЧтение(); - СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗафиксироватьЗавершениеОбмена(Отказ, СообщениеОбОшибке, ОшибкаЧтенияФайлаСообщенияОбмена()); Возврат КонецПопытки; @@ -285,7 +285,7 @@ Попытка ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелИнформационнойБазы); Исключение - СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗафиксироватьЗавершениеОбмена(Отказ, СообщениеОбОшибке, ОшибкаНачалаЗаписиФайлаСообщенияОбмена()); Возврат; КонецПопытки; @@ -325,7 +325,7 @@ ЗаписьСообщения.ЗакончитьЗапись(); Исключение ЗаписьСообщения.ПрерватьЗапись(); - СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗафиксироватьЗавершениеОбмена(Отказ, СообщениеОбОшибке, ОшибкаЗаписиФайлаСообщенияОбмена()); Возврат; КонецПопытки; @@ -513,6 +513,13 @@ ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); + + СообщениеОбОшибке = НСтр("ru = 'Ошибка при загрузке приоритетных данных: ""%1"" (тип %2)'", ОбщегоНазначения.КодОсновногоЯзыка()); + СообщениеОбОшибке = СтрШаблон(СообщениеОбОшибке, Данные, ТипЗнч(Данные)); + СообщениеОбОшибке = СообщениеОбОшибке + Символы.ПС + ИнформацияОбОшибке().Описание; + + ЗафиксироватьЗавершениеОбмена(Отказ, СообщениеОбОшибке, ОшибкаЧтенияФайлаСообщенияОбмена()); + ВызватьИсключение; КонецПопытки; diff --git a/SSL/src/DataProcessors/КонструкторФормул/Forms/РедактированиеФормулы/Form.form b/SSL/src/DataProcessors/КонструкторФормул/Forms/РедактированиеФормулы/Form.form index d6e83d2f5..7febbb2b9 100644 --- a/SSL/src/DataProcessors/КонструкторФормул/Forms/РедактированиеФормулы/Form.form +++ b/SSL/src/DataProcessors/КонструкторФормул/Forms/РедактированиеФормулы/Form.form @@ -74,7 +74,6 @@ Vertical Center - Auto ru Доступные поля @@ -110,7 +109,6 @@ UsualGroup Vertical - Auto true true Auto @@ -139,7 +137,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto diff --git a/SSL/src/DataProcessors/КонструкторФормул/Forms/РедактированиеФормулы/Module.bsl b/SSL/src/DataProcessors/КонструкторФормул/Forms/РедактированиеФормулы/Module.bsl index b6ec4ef2e..d72fc676f 100644 --- a/SSL/src/DataProcessors/КонструкторФормул/Forms/РедактированиеФормулы/Module.bsl +++ b/SSL/src/DataProcessors/КонструкторФормул/Forms/РедактированиеФормулы/Module.bsl @@ -16,12 +16,14 @@ ПараметрыДобавленияСпискаПолей = КонструкторФормулСлужебный.ПараметрыДобавленияСпискаПолей(); ПараметрыДобавленияСпискаПолей.ИмяСписка = ИмяСпискаОперандов(); + ПараметрыДобавленияСпискаПолей.КоллекцииПолей.Добавить(ПрочитатьСписокОперандов()); ПараметрыДобавленияСпискаПолей.МестоРазмещенияСписка = Элементы.ГруппаДоступныеПоля; ПараметрыДобавленияСпискаПолей.ПодсказкаВводаСтрокиПоиска = НСтр("ru = 'Найти операнд...'"); ПараметрыДобавленияСпискаПолей.ИспользоватьИдентификаторыДляФормул = Не ДляЗапроса; ПараметрыДобавленияСпискаПолей.СкобкиПредставлений = СкобкиОперандов; ПараметрыДобавленияСпискаПолей.ОбработчикиСписка.Вставить("Выбор", "Подключаемый_СписокПолейВыбор"); + ПараметрыДобавленияСпискаПолей.ИспользоватьФоновыйПоиск = Истина; КонструкторФормулСлужебный.ДобавитьСписокПолейНаФорму(ЭтотОбъект, ПараметрыДобавленияСпискаПолей); ПараметрыДобавленияСпискаПолей = КонструкторФормулСлужебный.ПараметрыДобавленияСпискаПолей(); @@ -193,7 +195,7 @@ &НаКлиенте Процедура Подключаемый_ВыполнитьПоискВСпискеПолей() - + ВыполнитьПоискВСпискеПолей(); КонецПроцедуры @@ -201,7 +203,7 @@ &НаСервере Процедура ВыполнитьПоискВСпискеПолей() - КонструкторФормулСлужебный.ВыполнитьПоискВСпискеПолей(ЭтотОбъект); + КонструкторФормул.ВыполнитьПоискВСпискеПолей(ЭтотОбъект); КонецПроцедуры @@ -212,6 +214,26 @@ КонецПроцедуры +&НаКлиенте +Процедура Подключаемый_НачатьПоискВСпискеПолей() + + КонструкторФормулКлиент.НачатьПоискВСпискеПолей(ЭтотОбъект); + +КонецПроцедуры + +&НаСервере +Процедура Подключаемый_ОбработчикКонструктораФормулСервер(Параметр, ДополнительныеПараметры) + КонструкторФормул.ОбработчикКонструктораФормул(ЭтотОбъект, Параметр, ДополнительныеПараметры); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ОбработчикКонструктораФормулКлиент(Параметр, ДополнительныеПараметры = Неопределено) Экспорт // АПК:78 Процедура вызывается из КонструкторФормулКлиент.НачатьПоискВСпискеПолей + КонструкторФормулКлиент.ОбработчикКонструктораФормул(ЭтотОбъект, Параметр, ДополнительныеПараметры); + Если ДополнительныеПараметры.ВыполнитьНаСервере Тогда + Подключаемый_ОбработчикКонструктораФормулСервер(Параметр, ДополнительныеПараметры); + КонецЕсли; +КонецПроцедуры + #КонецОбласти #Область ДополнительныеОбработчикиПодключаемыхСписков @@ -313,7 +335,7 @@ Попытка Поле.УстановитьВыражениеДетальныхЗаписей(Выражение); Исключение - ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ВызватьИсключение ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; КонецПроцедуры @@ -325,7 +347,7 @@ Попытка ПроверитьВыражениеДляЗапроса(); Исключение - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); ВызватьИсключение ТекстСообщенияОбОшибкеПриПроверкеФормулы(ТекстОшибки); КонецПопытки; Иначе @@ -333,7 +355,7 @@ Попытка Результат = Вычислить(Выражение); Исключение - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); ВызватьИсключение ТекстСообщенияОбОшибкеПриПроверкеФормулы(ТекстОшибки); КонецПопытки; КонецЕсли; diff --git a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Form.form b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Form.form index 4f418f625..ec7215466 100644 --- a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Form.form +++ b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Form.form @@ -192,7 +192,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -221,7 +220,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ИнициализацияЗапросаРазрешений/Form.form b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ИнициализацияЗапросаРазрешений/Form.form index 244a54b4c..f607fab47 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ИнициализацияЗапросаРазрешений/Form.form +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ИнициализацияЗапросаРазрешений/Form.form @@ -102,7 +102,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ИнициализацияЗапросаРазрешений/Module.bsl b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ИнициализацияЗапросаРазрешений/Module.bsl index eca9b39f4..f8c57af07 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ИнициализацияЗапросаРазрешений/Module.bsl +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/ИнициализацияЗапросаРазрешений/Module.bsl @@ -159,18 +159,18 @@ КонецЕсли; Если Задание = Неопределено Тогда - ВызватьИсключение(НСтр("ru = 'При обработке запросов произошла ошибка - не найдено задание обработки запросов.'")); + ВызватьИсключение(НСтр("ru = 'Непредвиденная ситуация при обработке запросов разрешений на использование внешних ресурсов.'")); КонецЕсли; Если Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда ОшибкаЗадания = Задание.ИнформацияОбОшибке; Если ОшибкаЗадания <> Неопределено Тогда - ВызватьИсключение(ПодробноеПредставлениеОшибки(ОшибкаЗадания)); + ВызватьИсключение(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ОшибкаЗадания)); Иначе - ВызватьИсключение(НСтр("ru = 'При обработке запросов произошла ошибка - задание обработки запросов завершилось с неизвестной ошибкой.'")); + ВызватьИсключение(НСтр("ru = 'Не удалось обработать запросы разрешений на использование внешних ресурсов.'")); КонецЕсли; ИначеЕсли Задание.Состояние = СостояниеФоновогоЗадания.Отменено Тогда - ВызватьИсключение(НСтр("ru = 'При обработке запросов произошла ошибка - задание обработки запросов было отменено администратором.'")); + ВызватьИсключение(НСтр("ru = 'Не удалось обработать запросы разрешений на использование внешних ресурсов, т.к. задание было отменено администратором.'")); Иначе ИдентификаторЗадания = Неопределено; Возврат Истина; @@ -216,7 +216,7 @@ Исключение // Возможно задание как раз в этот момент закончилось и ошибки нет. ЗаписьЖурналаРегистрации(НСтр("ru = 'Настройка разрешений на использование внешних ресурсов.Отмена выполнения фонового задания'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Form.form b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Form.form index 08f9fcca5..8bba1dcfd 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Form.form +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Form.form @@ -457,7 +457,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -751,7 +750,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -780,7 +778,6 @@ UsualGroup Vertical - Auto true true Auto @@ -809,7 +806,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -985,7 +981,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1119,7 +1114,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1277,7 +1271,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1356,7 +1349,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1485,7 +1477,6 @@ UsualGroup Vertical - Auto true Button NormalSeparation @@ -1624,7 +1615,6 @@ UsualGroup Vertical - Auto true Button NormalSeparation @@ -1657,7 +1647,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1757,7 +1746,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2002,7 +1990,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2302,7 +2289,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2331,7 +2317,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Module.bsl b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Module.bsl index 18eb31b59..91661280c 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Module.bsl +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Module.bsl @@ -182,7 +182,7 @@ ОжидатьПримененияНастроекВКластере(); Исключение - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Элементы.ГруппаОшибка.Видимость = Истина; КонецПопытки; diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкиИспользованияПрофилейБезопасности/Form.form b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкиИспользованияПрофилейБезопасности/Form.form index 6b7894e44..d7ab8e171 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкиИспользованияПрофилейБезопасности/Form.form +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/Forms/НастройкиИспользованияПрофилейБезопасности/Form.form @@ -116,7 +116,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -226,7 +225,6 @@ UsualGroup Vertical - Auto true true Auto @@ -255,7 +253,6 @@ UsualGroup Vertical - Auto true true Auto @@ -354,7 +351,6 @@ UsualGroup Vertical - Auto true true Auto @@ -469,7 +465,6 @@ UsualGroup Vertical - Auto true true Auto @@ -498,7 +493,6 @@ UsualGroup Vertical - Auto true true Auto @@ -527,7 +521,6 @@ UsualGroup HorizontalIfPossible - Auto true true Equal @@ -631,7 +624,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -735,7 +727,6 @@ UsualGroup Vertical - Auto true true Auto @@ -764,7 +755,6 @@ UsualGroup Vertical - Auto true true Auto @@ -863,7 +853,6 @@ UsualGroup Vertical - Auto true true Auto @@ -892,7 +881,6 @@ UsualGroup Vertical - Auto true true Auto @@ -921,7 +909,6 @@ UsualGroup HorizontalIfPossible - Auto Button WeakSeparation true @@ -954,7 +941,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ManagerModule.bsl b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ManagerModule.bsl index 0637dc907..11d0e8724 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ManagerModule.bsl +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ManagerModule.bsl @@ -123,18 +123,24 @@ // Процедура ВыполнитьОбработкуЗапросовВосстановления(Знач АдресВременногоХранилища, Знач АдресВременногоХранилищаСостояния) Экспорт - НачатьТранзакцию(); - - ОчиститьПредоставленныеРазрешения(, Ложь); - - ИдентификаторыЗапросов = Новый Массив(); - ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ИдентификаторыЗапросов, РегистрыСведений.ЗапросыРазрешенийНаИспользованиеВнешнихРесурсов.ЗапросыЗамещенияДляВсехПредоставленныхРазрешений()); - ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ИдентификаторыЗапросов, РаботаВБезопасномРежимеСлужебный.ЗапросыОбновленияРазрешенийКонфигурации(Ложь)); - - ЗапросыXML = РегистрыСведений.ЗапросыРазрешенийНаИспользованиеВнешнихРесурсов.ЗаписатьЗапросыВСтрокуXML(ИдентификаторыЗапросов); - ВыполнитьОбработкуЗапросов(ИдентификаторыЗапросов, АдресВременногоХранилища, АдресВременногоХранилищаСостояния, Истина); - - ОтменитьТранзакцию(); + НачатьТранзакцию(); // АПК:326 Транзакция открывается только для целей отмены. + Попытка + ОчиститьПредоставленныеРазрешения(, Ложь); + + ИдентификаторыЗапросов = Новый Массив; + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ИдентификаторыЗапросов, + РегистрыСведений.ЗапросыРазрешенийНаИспользованиеВнешнихРесурсов.ЗапросыЗамещенияДляВсехПредоставленныхРазрешений()); + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ИдентификаторыЗапросов, + РаботаВБезопасномРежимеСлужебный.ЗапросыОбновленияРазрешенийКонфигурации(Ложь)); + + ЗапросыXML = РегистрыСведений.ЗапросыРазрешенийНаИспользованиеВнешнихРесурсов.ЗаписатьЗапросыВСтрокуXML(ИдентификаторыЗапросов); + ВыполнитьОбработкуЗапросов(ИдентификаторыЗапросов, АдресВременногоХранилища, АдресВременногоХранилищаСостояния, Истина); + + ОтменитьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; РегистрыСведений.ЗапросыРазрешенийНаИспользованиеВнешнихРесурсов.ПрочитатьЗапросыИзСтрокиXML(ЗапросыXML); @@ -148,20 +154,26 @@ ВызватьИсключение НСтр("ru = 'Транзакция активна'"); КонецЕсли; + НачатьТранзакцию(); // АПК:326 Транзакция открывается только для целей отмены. + Попытка + + ИдентификаторыЗапросов = Новый Массив; + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ИдентификаторыЗапросов, + РегистрыСведений.ЗапросыРазрешенийНаИспользованиеВнешнихРесурсов.ЗапросыЗамещенияДляВсехПредоставленныхРазрешений()); + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ИдентификаторыЗапросов, + РаботаВБезопасномРежимеСлужебный.ЗапросыОбновленияРазрешенийКонфигурации(Ложь)); + + Менеджер = РегистрыСведений.ЗапросыРазрешенийНаИспользованиеВнешнихРесурсов.МенеджерПримененияРазрешений(ИдентификаторыЗапросов); + ЗапросыXML = РегистрыСведений.ЗапросыРазрешенийНаИспользованиеВнешнихРесурсов.ЗаписатьЗапросыВСтрокуXML(ИдентификаторыЗапросов); + + ОтменитьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + Результат = Новый Структура(); - НачатьТранзакцию(); - - ИдентификаторыЗапросов = Новый Массив(); - ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ИдентификаторыЗапросов, РегистрыСведений.ЗапросыРазрешенийНаИспользованиеВнешнихРесурсов.ЗапросыЗамещенияДляВсехПредоставленныхРазрешений()); - ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ИдентификаторыЗапросов, РаботаВБезопасномРежимеСлужебный.ЗапросыОбновленияРазрешенийКонфигурации(Ложь)); - - Менеджер = РегистрыСведений.ЗапросыРазрешенийНаИспользованиеВнешнихРесурсов.МенеджерПримененияРазрешений(ИдентификаторыЗапросов); - - ЗапросыXML = РегистрыСведений.ЗапросыРазрешенийНаИспользованиеВнешнихРесурсов.ЗаписатьЗапросыВСтрокуXML(ИдентификаторыЗапросов); - - ОтменитьТранзакцию(); - Если Менеджер.ТребуетсяПрименениеРазрешенийВКластереСерверов() Тогда АдресВременногоХранилища = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор()); diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопирования/Form.form b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопирования/Form.form index db9cda2fb..3ce114b7e 100644 --- a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопирования/Form.form +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопирования/Form.form @@ -195,7 +195,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -346,7 +345,6 @@ UsualGroup Vertical - Auto true true Auto @@ -375,7 +373,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -592,7 +589,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -709,7 +705,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -738,7 +733,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1048,7 +1042,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1073,7 +1066,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -1242,7 +1234,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1267,7 +1258,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -1291,7 +1281,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1320,7 +1309,6 @@ UsualGroup HorizontalIfPossible - Auto true true auto @@ -1350,7 +1338,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1582,7 +1569,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1611,7 +1597,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1736,7 +1721,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопирования/Module.bsl b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопирования/Module.bsl index 96bd75463..f0684975e 100644 --- a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопирования/Module.bsl +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопирования/Module.bsl @@ -302,7 +302,7 @@ Попытка УдалитьФайлы(Объект.КаталогСРезервнымиКопиями, "*.test1С"); Исключение - // Исключение не обрабатываем т.к. на этом шаге не происходит удаления файлов. + // АПК:280 Не проблема, если на этом шаге не происходит удаления файлов. КонецПопытки; КонецЕсли; diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопированияКлиентСервер/Form.form b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопированияКлиентСервер/Form.form index 8526c183f..3538561f3 100644 --- a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопированияКлиентСервер/Form.form +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НастройкаРезервногоКопированияКлиентСервер/Form.form @@ -137,7 +137,6 @@ UsualGroup Vertical - Auto true true Auto @@ -166,7 +165,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/Forms/ЗависимостиОбъектаМетаданных/Form.form b/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/Forms/ЗависимостиОбъектаМетаданных/Form.form index 620302234..aa8b27987 100644 --- a/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/Forms/ЗависимостиОбъектаМетаданных/Form.form +++ b/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/Forms/ЗависимостиОбъектаМетаданных/Form.form @@ -623,8 +623,8 @@ Form.StandardCommand.Yes - Normal Auto + true true true UserCmds @@ -703,7 +703,6 @@ UsualGroup Vertical - Auto true true Auto @@ -731,7 +730,6 @@ UsualGroup - Auto true true Auto diff --git a/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/Forms/ЗависимостиОбъектаМетаданных/Module.bsl b/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/Forms/ЗависимостиОбъектаМетаданных/Module.bsl index 91b8a2645..1cd32fa0a 100644 --- a/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/Forms/ЗависимостиОбъектаМетаданных/Module.bsl +++ b/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/Forms/ЗависимостиОбъектаМетаданных/Module.bsl @@ -11,7 +11,7 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Параметры.ПолноеИмяОбъекта); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Параметры.ПолноеИмяОбъекта); Если ОбщегоНазначения.ЭтоКонстанта(ОбъектМетаданных) Тогда ПредставлениеТипаОбъекта = НСтр("ru = 'константе'"); @@ -98,7 +98,7 @@ ДобавитьКорневуюСтрокуДерева(Дерево, "ПланОбмена", НСтр("ru = 'Планы обмена'"), 15, БиблиотекаКартинок.ПланОбмена); Для Каждого Зависимость Из Параметры.ЗависимостиОбъекта Цикл - ДобавитьВложеннуюСтрокуДерева(Дерево, Метаданные.НайтиПоПолномуИмени(Зависимость)); + ДобавитьВложеннуюСтрокуДерева(Дерево, ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Зависимость)); КонецЦикла; Дерево.Колонки.Удалить(Дерево.Колонки["ПолноеИмя"]); diff --git a/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/Forms/НастройкаИспользованияСтандартногоИнтерфейсаOData/Form.form b/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/Forms/НастройкаИспользованияСтандартногоИнтерфейсаOData/Form.form index e54264be5..6c3cae120 100644 --- a/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/Forms/НастройкаИспользованияСтандартногоИнтерфейсаOData/Form.form +++ b/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/Forms/НастройкаИспользованияСтандартногоИнтерфейсаOData/Form.form @@ -86,7 +86,6 @@ UsualGroup Vertical - Auto true true @@ -245,7 +244,6 @@ UsualGroup - Auto true true Auto @@ -280,7 +278,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -917,7 +914,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/Forms/НастройкаИспользованияСтандартногоИнтерфейсаOData/Module.bsl b/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/Forms/НастройкаИспользованияСтандартногоИнтерфейсаOData/Module.bsl index 6606a1cac..f4f265d8d 100644 --- a/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/Forms/НастройкаИспользованияСтандартногоИнтерфейсаOData/Module.bsl +++ b/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/Forms/НастройкаИспользованияСтандартногоИнтерфейсаOData/Module.bsl @@ -37,7 +37,7 @@ УстановитьУсловноеОформление(); Элементы.ДекорацияДокументация.Заголовок = СтроковыеФункции.ФорматированнаяСтрока("%2", - "http://its.1c.ru/db/v83doc#bookmark:dev:ti000001358", + "http://its.1c.eu/db/v83doc#bookmark:dev:ti000001358", НСтр("ru = 'Документация по использованию автоматического REST-сервиса'")); КонецПроцедуры diff --git a/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/ManagerModule.bsl b/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/ManagerModule.bsl index 984c9acc0..6d3ceb369 100644 --- a/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/ManagerModule.bsl +++ b/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/ManagerModule.bsl @@ -89,8 +89,10 @@ ОписаниеПользователяИБ.Вставить("Действие", "Записать"); ОписаниеПользователяИБ.Вставить("Имя", НастройкиАвторизации.Логин); ОписаниеПользователяИБ.Вставить("АутентификацияСтандартная", Истина); - ОписаниеПользователяИБ.Вставить("АутентификацияОС", Ложь); ОписаниеПользователяИБ.Вставить("АутентификацияOpenID", Ложь); + ОписаниеПользователяИБ.Вставить("АутентификацияOpenIDConnect", Ложь); + ОписаниеПользователяИБ.Вставить("АутентификацияТокеномДоступа", Ложь); + ОписаниеПользователяИБ.Вставить("АутентификацияОС", Ложь); ОписаниеПользователяИБ.Вставить("ПоказыватьВСпискеВыбора", Ложь); Если НастройкиАвторизации.Свойство("Пароль") Тогда ОписаниеПользователяИБ.Вставить("Пароль", НастройкиАвторизации.Пароль); @@ -133,19 +135,11 @@ СокращенноеОписание.Удалить("ПользовательИБ"); Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполнена запись пользователя для стандартного интерфейса OData. - | - |Описание пользователя ИБ: - |------------------------------------------- - |%1 - |------------------------------------------- - | - |Результат: - |------------------------------------------- - |%2 - |-------------------------------------------'"), - ОбщегоНазначения.ЗначениеВСтрокуXML(СокращенноеОписание), - ПользовательСтандартногоИнтерфейсаOData.ДополнительныеСвойства.ОписаниеПользователяИБ.РезультатДействия); + НСтр("ru = 'Записан пользователь для стандартного интерфейса OData с результатом: %1 + |Описание пользователя: + |%2'"), + ПользовательСтандартногоИнтерфейсаOData.ДополнительныеСвойства.ОписаниеПользователяИБ.РезультатДействия, + ОбщегоНазначения.ЗначениеВСтрокуXML(СокращенноеОписание)); ЗаписьЖурналаРегистрации( НСтр("ru = 'Настройка стандартного интерфейса OData.Запись пользователя'", ОбщегоНазначения.КодОсновногоЯзыка()), @@ -162,19 +156,13 @@ ОписаниеПользователяИБ.Удалить("Пароль"); Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При записи пользователя для стандартного интерфейса OData произошла ошибка. - | - |Описание пользователя ИБ: - |------------------------------------------- + НСтр("ru = 'Не удалось записать пользователя для стандартного интерфейса OData по причине: |%1 - |------------------------------------------- | - |Текст ошибки: - |------------------------------------------- - |%2 - |-------------------------------------------'"), - ОбщегоНазначения.ЗначениеВСтрокуXML(ОписаниеПользователяИБ), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + |Описание пользователя: + |%2'"), + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ОбщегоНазначения.ЗначениеВСтрокуXML(ОписаниеПользователяИБ)); ЗаписьЖурналаРегистрации( НСтр("ru = 'Настройка стандартного интерфейса OData.Запись пользователя'", ОбщегоНазначения.КодОсновногоЯзыка()), @@ -397,7 +385,7 @@ МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); ЭтоРазделенныйОбъектМетаданных = ОписаниеОбъекта.РазделениеДанных.Свойство(МодульРаботаВМоделиСервиса.РазделительОсновныхДанных()); Иначе - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ОписаниеОбъекта.ПолноеИмя); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ОписаниеОбъекта.ПолноеИмя); Если ЭтоСсылочныеДанные(ОбъектМетаданных) ИЛИ ОбщегоНазначения.ЭтоРегистр(ОбъектМетаданных) ИЛИ ОбщегоНазначения.ЭтоКонстанта(ОбъектМетаданных) Тогда @@ -495,7 +483,7 @@ Процедура ЗаполнитьМодельДанныхПредоставляемыхДляСтандартногоИнтерфейсаOData(Знач Результат, Знач ПолноеИмя, Знач Исключаемые) - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмя); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмя); Если Не ЭтоДопустимыйОбъектМетаданныхOData(ОбъектМетаданных) Тогда Возврат; КонецЕсли; @@ -679,7 +667,7 @@ Если ТипЗнч(ОбъектМетаданных) = Тип("Строка") Тогда ИмяОбъектаМетаданных = ОбъектМетаданных; - ОбъектМетаданныхДляАнализа = Метаданные.НайтиПоПолномуИмени(ОбъектМетаданных); + ОбъектМетаданныхДляАнализа = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ОбъектМетаданных); Иначе ИмяОбъектаМетаданных = ОбъектМетаданных.ПолноеИмя(); ОбъектМетаданныхДляАнализа = ОбъектМетаданных; @@ -1095,7 +1083,7 @@ Если ОбщегоНазначения.ЭтоРегистрСведений(ОбъектМетаданных) Тогда Если ТипЗнч(ОбъектМетаданных) = Тип("Строка") Тогда - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ОбъектМетаданных); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ОбъектМетаданных); КонецЕсли; Возврат ОбъектМетаданных.РазрешитьИтогиСрезПервых diff --git a/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/ObjectModule.bsl b/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/ObjectModule.bsl index 94fc931af..2e7d61449 100644 --- a/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/ObjectModule.bsl +++ b/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/ObjectModule.bsl @@ -185,7 +185,7 @@ Функция ЭтоНезависимыйНаборЗаписей(Знач ОбъектМетаданных) Экспорт Если ТипЗнч(ОбъектМетаданных) = Тип("Строка") Тогда - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ОбъектМетаданных); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ОбъектМетаданных); КонецЕсли; Возврат ОбщегоНазначения.ЭтоРегистрСведений(ОбъектМетаданных) diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Form.form index 1066f25d0..9f22c66e3 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Form.form @@ -3,94 +3,6 @@ ОтображатьОтчет 67 - - БыстрыйПоиск - 50 - - Поиск - 48 - true - true - - true - - - Поиск - - Left - - ru - Введите слово или часть фразы для поиска настроек. Например: отчет - - - OnChange - ПоискПриИзменении - - - ПоискExtendedTooltip - 106 - Label - true - true - - Left - - - - ПоискКонтекстноеМеню - 49 - true - - InputField - Enter - true - Left - true - - true - true - false - true - true - true - true - true - Normal - - ru - слово или часть фразы - - - - true - true - - true - - - <key>ru</key> - <value>Быстрый поиск</value> - - - БыстрыйПоискExtendedTooltip - 105 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - true - Auto - Auto - - КоманднаяПанель 51 @@ -757,6 +669,7 @@ true true true + Top true true @@ -1186,6 +1099,7 @@ true true true + Top true true @@ -1615,6 +1529,7 @@ true true true + Top true true @@ -1743,7 +1658,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2034,27 +1948,6 @@ true - - Поиск - - <key>ru</key> - <value>Найти</value> - - 10 - - String - - - - true - - - true - - - Поиск - - ПользовательИнформационнойБазы 5 diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Module.bsl b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Module.bsl index 1492f98f2..f035970c7 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Module.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Module.bsl @@ -39,8 +39,6 @@ &НаСервере Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки) - Настройки.Вставить("ПоискСписокВыбора", Элементы.Поиск.СписокВыбора.ВыгрузитьЗначения()); - Настройки.Удалить("ВнешнийВид"); Настройки.Удалить("НастройкиОтчетов"); Настройки.Удалить("ПрочиеНастройки"); @@ -74,12 +72,6 @@ Возврат; КонецЕсли; - ПоискСписокВыбора = Настройки.Получить("ПоискСписокВыбора"); - Если ТипЗнч(ПоискСписокВыбора) = Тип("Массив") Тогда - Элементы.Поиск.СписокВыбора.ЗагрузитьЗначения(ПоискСписокВыбора); - КонецЕсли; - Поиск = ""; - ПомеченныеНастройкиВнешнегоВида = Настройки.Получить("ПомеченныеНастройкиВнешнегоВида"); ПомеченныеНастройкиОтчетов = Настройки.Получить("ПомеченныеНастройкиОтчетов"); ПомеченныеПрочиеНастройки = Настройки.Получить("ПомеченныеПрочиеНастройки"); @@ -106,31 +98,6 @@ КонецПроцедуры -&НаКлиенте -Процедура ПоискПриИзменении(Элемент) - - Если ЗначениеЗаполнено(Поиск) Тогда - СписокВыбора = Элементы.Поиск.СписокВыбора; - ЭлементСписка = СписокВыбора.НайтиПоЗначению(Поиск); - Если ЭлементСписка = Неопределено Тогда - СписокВыбора.Вставить(0, Поиск); - Если СписокВыбора.Количество() > 10 Тогда - СписокВыбора.Удалить(10); - КонецЕсли; - Иначе - Индекс = СписокВыбора.Индекс(ЭлементСписка); - Если Индекс <> 0 Тогда - СписокВыбора.Сдвинуть(Индекс, -Индекс); - КонецЕсли; - КонецЕсли; - ТекущийЭлемент = Элементы.Поиск; - КонецЕсли; - - ПоискНастроек = Истина; - ОбновитьСписокНастроек(); - -КонецПроцедуры - &НаКлиенте Процедура ДеревоНастроекВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) @@ -154,7 +121,6 @@ &НаКлиенте Процедура Обновить(Команда) - ПоискНастроек = Ложь; ОбновитьСписокНастроек(); КонецПроцедуры @@ -247,7 +213,6 @@ &НаКлиенте Процедура ОбновитьСписокНастроек() - Элементы.БыстрыйПоиск.Доступность = Ложь; Элементы.КоманднаяПанель.Доступность = Ложь; Элементы.СтраницыДлительнаяОперация.ТекущаяСтраница = Элементы.СтраницаДлительнаяОперация; Результат = ОбновлениеСпискаНастроек(); @@ -268,10 +233,6 @@ ДлительныеОперации.ОтменитьВыполнениеЗадания(РезультатВыполнения.ИдентификаторЗадания); КонецЕсли; - Если ПоискНастроек Тогда - ЗаполнитьПомеченныеЭлементыДерева(); - КонецЕсли; - ПараметрыДлительнойОперации = ПараметрыДлительнойОперации(); ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); @@ -296,7 +257,6 @@ ЗаполнитьНастройки(); РазвернутьДеревоЗначений(); Элементы.СтраницыДлительнаяОперация.ТекущаяСтраница = Элементы.СтраницаНастройки; - Элементы.БыстрыйПоиск.Доступность = Истина; Элементы.КоманднаяПанель.Доступность = Истина; ИначеЕсли Результат.Статус = "Ошибка" Тогда Элементы.СтраницыДлительнаяОперация.ТекущаяСтраница = Элементы.СтраницаНастройки; @@ -314,8 +274,7 @@ ЗначениеВРеквизитФормы(Результат.НастройкиВнешнегоВида, "ВнешнийВид"); ЗначениеВРеквизитФормы(Результат.ПрочиеНастройкиДерево, "ПрочиеНастройки"); - Если ПоискНастроек - Или Не НачальныеНастройкиЗагружены + Если Не НачальныеНастройкиЗагружены И ВсеВыбранныеНастройки <> Неопределено Тогда ЗагрузитьЗначенияПометок(НастройкиОтчетов, ВсеВыбранныеНастройки.ПомеченныеНастройкиОтчетов, "НастройкиОтчетов"); ЗагрузитьЗначенияПометок(ВнешнийВид, ВсеВыбранныеНастройки.ПомеченныеНастройкиВнешнегоВида, "ВнешнийВид"); @@ -568,43 +527,11 @@ КонецПроцедуры -&НаСервере -Процедура ЗаполнитьПомеченныеЭлементыДерева() - - НастройкиОтчетовДерево = РеквизитФормыВЗначение("НастройкиОтчетов"); - ВнешнийВидДерево = РеквизитФормыВЗначение("ВнешнийВид"); - ПрочиеНастройкиДерево = РеквизитФормыВЗначение("ПрочиеНастройки"); - - ПомеченныеНастройкиОтчетов = ПомеченныеНастройки(НастройкиОтчетовДерево); - ПомеченныеНастройкиВнешнегоВида = ПомеченныеНастройки(ВнешнийВидДерево); - ПомеченныеПрочиеНастройки = ПомеченныеНастройки(ПрочиеНастройкиДерево); - - Если ВсеВыбранныеНастройки = Неопределено Тогда - - ВсеВыбранныеНастройки = Новый Структура; - ВсеВыбранныеНастройки.Вставить("ПомеченныеНастройкиОтчетов", ПомеченныеНастройкиОтчетов); - ВсеВыбранныеНастройки.Вставить("ПомеченныеНастройкиВнешнегоВида", ПомеченныеНастройкиВнешнегоВида); - ВсеВыбранныеНастройки.Вставить("ПомеченныеПрочиеНастройки", ПомеченныеПрочиеНастройки); - - Иначе - - ВсеВыбранныеНастройки.ПомеченныеНастройкиОтчетов = - ПомеченныеПослеСравненияНастройки(ПомеченныеНастройкиОтчетов, НастройкиОтчетовДерево, "НастройкиОтчетов"); - ВсеВыбранныеНастройки.ПомеченныеНастройкиВнешнегоВида = - ПомеченныеПослеСравненияНастройки(ПомеченныеНастройкиВнешнегоВида, ВнешнийВидДерево, "ВнешнийВид"); - ВсеВыбранныеНастройки.ПомеченныеПрочиеНастройки = - ПомеченныеПослеСравненияНастройки(ПомеченныеПрочиеНастройки, ПрочиеНастройкиДерево, "ПрочиеНастройки"); - - КонецЕсли; - -КонецПроцедуры - &НаСервере Функция ПараметрыДлительнойОперации() ПараметрыДлительнойОперации = Новый Структура; ПараметрыДлительнойОперации.Вставить("ИмяФормы"); - ПараметрыДлительнойОперации.Вставить("Поиск"); ПараметрыДлительнойОперации.Вставить("ДействиеСНастройками"); ПараметрыДлительнойОперации.Вставить("ПользовательИнформационнойБазы"); ПараметрыДлительнойОперации.Вставить("ПользовательСсылка"); @@ -641,39 +568,6 @@ КонецФункции -&НаСервере -Функция ПомеченныеПослеСравненияНастройки(ПомеченныеНастройки, ДеревоНастроек, ТипНастроек) - - Если ТипНастроек = "НастройкиОтчетов" Тогда - ИсходныйСписокПомеченных = ВсеВыбранныеНастройки.ПомеченныеНастройкиОтчетов; - ИначеЕсли ТипНастроек = "ВнешнийВид" Тогда - ИсходныйСписокПомеченных = ВсеВыбранныеНастройки.ПомеченныеНастройкиВнешнегоВида; - ИначеЕсли ТипНастроек = "ПрочиеНастройки" Тогда - ИсходныйСписокПомеченных = ВсеВыбранныеНастройки.ПомеченныеПрочиеНастройки; - КонецЕсли; - - Если ИсходныйСписокПомеченных = Неопределено Тогда - Возврат Новый СписокЗначений; - КонецЕсли; - - Для Каждого Элемент Из ИсходныйСписокПомеченных Цикл - - НайденнаяНастройка = ПомеченныеНастройки.НайтиПоЗначению(Элемент.Значение); - Если НайденнаяНастройка = Неопределено Тогда - - ПараметрыОтбора = Новый Структура("ТипСтроки", Элемент.Значение); - НайденнаяНастройкаВДереве = ДеревоНастроек.Строки.НайтиСтроки(ПараметрыОтбора, Истина); - Если НайденнаяНастройкаВДереве.Количество() = 0 Тогда - ПомеченныеНастройки.Добавить(Элемент.Значение, , Элемент.Пометка); - КонецЕсли; - - КонецЕсли; - - КонецЦикла; - - Возврат ПомеченныеНастройки; -КонецФункции - &НаСервере Процедура ЗагрузитьЗначенияПометок(ДеревоЗначений, ПомеченныеНастройки, ВидНастроек) diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Form.form index 0801ac51c..160a8da2f 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Form.form @@ -33,17 +33,73 @@ UserCmds Auto - - ПометитьВсе - 27 + + ГруппаКомандФлажки + 107 + + ПометитьВсе + 27 + true + true + + true + + + ПометитьВсеExtendedTooltip + 53 + Label + true + true + + Left + + + Form.Command.ПометитьВсе + Normal + Auto + true + true + UserCmds + Auto + + + СнятьПометкуСоВсех + 28 + true + true + + true + + + СнятьПометкуСоВсехExtendedTooltip + 54 + Label + true + true + + Left + + + Form.Command.СнятьПометкуСоВсех + Normal + Auto + true + true + UserCmds + Auto + true true true + + <key>ru</key> + <value>Группа команд флажки</value> + - ПометитьВсеExtendedTooltip - 53 + ГруппаКомандФлажкиРасширеннаяПодсказка + 108 Label true true @@ -51,39 +107,9 @@ Left - Form.Command.ПометитьВсе - Normal - Auto - true - true - UserCmds - Auto - - - СнятьПометкуСоВсех - 28 - true - true - - true - - - СнятьПометкуСоВсехExtendedTooltip - 54 - Label - true - true - - Left - - - Form.Command.СнятьПометкуСоВсех - Normal - Auto - true - true - UserCmds - Auto + + Compact + ПометитьВыбранные @@ -165,6 +191,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 104 + + СтрокаПоискРасширеннаяПодсказка + 106 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 105 + true + + СписокПользователей + + true + + true true @@ -1000,7 +1058,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Module.bsl b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Module.bsl index 55d9b316e..0b175385a 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Module.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Module.bsl @@ -50,6 +50,14 @@ Источник = Параметры.Источник; + Если Не Пользователи.ФизическоеЛицоИспользуется() Тогда + Элементы.СписокПользователейФизическоеЛицо.Видимость = Ложь; + КонецЕсли; + + Если Не Пользователи.ПодразделениеИспользуется() Тогда + Элементы.СписокПользователейПодразделение.Видимость = Ложь; + КонецЕсли; + КонецПроцедуры &НаСервере diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Form.form index b8defca55..00e315ae5 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Form.form @@ -192,7 +192,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -221,7 +220,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -359,7 +357,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -388,7 +385,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Form.form index f034bd954..33b6f9de0 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Form.form @@ -73,62 +73,6 @@ Normal - - Поиск - 48 - true - true - - true - - - Поиск - - Left - - ru - Введите слово или часть фразы для поиска настроек. Например: отчет - - - OnChange - ПоискПриИзменении - - - ПоискExtendedTooltip - 122 - Label - true - true - - Left - - - - ПоискКонтекстноеМеню - 49 - true - - InputField - Enter - true - Left - true - - true - true - false - true - true - true - true - true - Normal - - ru - слово или часть фразы - - - true true @@ -151,7 +95,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1241,9 +1184,8 @@ true true true - None + Top None - None SelectionPresentation true @@ -1720,9 +1662,8 @@ true true true - None + Top None - None SelectionPresentation true @@ -2195,9 +2136,8 @@ true true true - None + Top None - None SelectionPresentation true @@ -2430,7 +2370,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2561,7 +2500,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2623,10 +2561,6 @@ -1 Right - - OnSaveDataInSettingsAtServer - ПриСохраненииДанныхВНастройкахНаСервере - NotificationProcessing ОбработкаОповещения @@ -2635,10 +2569,6 @@ OnOpen ПриОткрытии - - OnLoadDataFromSettingsAtServer - ПриЗагрузкеДанныхИзНастроекНаСервере - OnCreateAtServer ПриСозданииНаСервере @@ -2891,27 +2821,6 @@ true - - Поиск - - <key>ru</key> - <value>Найти</value> - - 10 - - String - - - - true - - - true - - - Поиск - - ПользовательИнформационнойБазы 5 diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Module.bsl b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Module.bsl index c29885a48..7868d48b1 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Module.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Module.bsl @@ -79,24 +79,6 @@ КонецПроцедуры -&НаСервере -Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) - - ПоискСписокВыбора = Настройки.Получить("ПоискСписокВыбора"); - Если ТипЗнч(ПоискСписокВыбора) = Тип("Массив") Тогда - Элементы.Поиск.СписокВыбора.ЗагрузитьЗначения(ПоискСписокВыбора); - КонецЕсли; - Поиск = ""; - -КонецПроцедуры - -&НаСервере -Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки) - - Настройки.Вставить("ПоискСписокВыбора", Элементы.Поиск.СписокВыбора.ВыгрузитьЗначения()); - -КонецПроцедуры - &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) @@ -131,30 +113,6 @@ КонецПроцедуры -&НаКлиенте -Процедура ПоискПриИзменении(Элемент) - - Если ЗначениеЗаполнено(Поиск) Тогда - СписокВыбора = Элементы.Поиск.СписокВыбора; - ЭлементСписка = СписокВыбора.НайтиПоЗначению(Поиск); - Если ЭлементСписка = Неопределено Тогда - СписокВыбора.Вставить(0, Поиск); - Если СписокВыбора.Количество() > 10 Тогда - СписокВыбора.Удалить(10); - КонецЕсли; - Иначе - Индекс = СписокВыбора.Индекс(ЭлементСписка); - Если Индекс <> 0 Тогда - СписокВыбора.Сдвинуть(Индекс, -Индекс); - КонецЕсли; - КонецЕсли; - ТекущийЭлемент = Элементы.Поиск; - КонецЕсли; - - ОбновитьСписокНастроек(); - -КонецПроцедуры - &НаКлиенте Процедура ПользовательСсылкаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) @@ -1462,7 +1420,6 @@ ПараметрыДлительнойОперации = Новый Структура; ПараметрыДлительнойОперации.Вставить("ИмяФормы"); - ПараметрыДлительнойОперации.Вставить("Поиск"); ПараметрыДлительнойОперации.Вставить("ДействиеСНастройками"); ПараметрыДлительнойОперации.Вставить("ПользовательИнформационнойБазы"); ПараметрыДлительнойОперации.Вставить("ПользовательСсылка"); diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Form.form index 5ef0632cf..9ccda628a 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Form.form @@ -132,7 +132,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -277,7 +276,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -444,15 +442,23 @@ - ПользователиКоторымОчищаютсяНастройки + ВыбранныеПользователи 6 - + + ValueList + true true + + + CatalogRef.ВнешниеПользователи + CatalogRef.Пользователи + + ВыбранныеНастройки diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Module.bsl b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Module.bsl index e6abb2c8c..ba937f30f 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Module.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Module.bsl @@ -12,7 +12,8 @@ Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ИспользоватьВнешнихПользователей = ПолучитьФункциональнуюОпцию("ИспользоватьВнешнихПользователей"); - ПользователиКоторымОчищаютсяНастройки = Новый Структура; + ВыбранныеПользователи.Добавить(Пользователи.ТекущийПользователь()); + ОбновитьСсылкуВыбораПользователей(ЭтотОбъект); ПереключательКомуОчищатьНастройки = "ВыбраннымПользователям"; ПереключательОчищаемыеНастройки = "ОчиститьВсе"; @@ -28,26 +29,8 @@ Возврат; КонецЕсли; - Если ПользователиКоторымОчищаютсяНастройки <> Неопределено Тогда - Элементы.ВыбратьНастройки.Заголовок = НСтр("ru = 'Выбрать'"); - ВыбранныеНастройки = Неопределено; - КоличествоНастроек = Неопределено; - КонецЕсли; - - ПользователиКоторымОчищаютсяНастройки = Новый Структура("МассивПользователей", Параметр.ПользователиПриемник); - - КоличествоПользователей = Параметр.ПользователиПриемник.Количество(); - Если КоличествоПользователей = 1 Тогда - Элементы.ВыбратьПользователей.Заголовок = Строка(Параметр.ПользователиПриемник[0]); - Элементы.ГруппаОчищаемыеНастройки.Доступность = Истина; - ИначеЕсли КоличествоПользователей > 1 Тогда - ЧислоИПредмет = Формат(КоличествоПользователей, "ЧДЦ=0") + " " - + ПользователиСлужебныйКлиентСервер.ПредметЦелогоЧисла(КоличествоПользователей, - "", НСтр("ru = 'пользователь,пользователя,пользователей,,,,,,0'")); - Элементы.ВыбратьПользователей.Заголовок = ЧислоИПредмет; - ПереключательОчищаемыеНастройки = "ОчиститьВсе"; - КонецЕсли; - Элементы.ВыбратьПользователей.Подсказка = ""; + ВыбранныеПользователи.ЗагрузитьЗначения(Параметр.ПользователиПриемник); + ОбновитьСсылкуВыбораПользователей(ЭтотОбъект); КонецЕсли; КонецПроцедуры @@ -108,7 +91,7 @@ Процедура ВыбратьНастройки(Элемент) Если КоличествоПользователей = 1 Тогда - ПользовательСсылка = ПользователиКоторымОчищаютсяНастройки.МассивПользователей[0]; + ПользовательСсылка = ВыбранныеПользователи[0].Значение; ПараметрыФормы = Новый Структура("Пользователь, ДействиеСНастройками, ОчиститьИсториюВыбораНастроек", ПользовательСсылка, "Очистка", ОчиститьИсториюВыбораНастроек); ОткрытьФорму("Обработка.НастройкиПользователей.Форма.ВыборНастроек", ПараметрыФормы, ЭтотОбъект,,,, @@ -145,6 +128,25 @@ #Область СлужебныеПроцедурыИФункции +&НаКлиентеНаСервереБезКонтекста +Процедура ОбновитьСсылкуВыбораПользователей(Форма) + Форма.КоличествоПользователей = Форма.ВыбранныеПользователи.Количество(); + Если Форма.КоличествоПользователей = 0 Тогда + Форма.Элементы.ВыбратьНастройки.Заголовок = НСтр("ru = 'Выбрать'"); + Форма.ВыбранныеНастройки = Неопределено; + Форма.КоличествоНастроек = Неопределено; + ИначеЕсли Форма.КоличествоПользователей = 1 Тогда + Форма.Элементы.ВыбратьПользователей.Заголовок = Строка(Форма.ВыбранныеПользователи[0].Значение); + Форма.Элементы.ГруппаОчищаемыеНастройки.Доступность = Истина; + Иначе + ЧислоИПредмет = Формат(Форма.КоличествоПользователей, "ЧДЦ=0") + " " + + ПользователиСлужебныйКлиентСервер.ПредметЦелогоЧисла(Форма.КоличествоПользователей, + "", НСтр("ru = 'пользователь,пользователя,пользователей,,,,,,0'")); + Форма.Элементы.ВыбратьПользователей.Заголовок = ЧислоИПредмет; + Форма.ПереключательОчищаемыеНастройки = "ОчиститьВсе"; + КонецЕсли; +КонецПроцедуры + &НаКлиенте Процедура ВыбратьПользователейНажатиеВыбратьЭлемент(ВыбранныйВариант, ДополнительныеПараметры) Экспорт @@ -166,13 +168,10 @@ &НаКлиенте Процедура ОткрытьФормуВыбораПользователей(Пользователь) - ВыбранныеПользователи = Неопределено; - ПользователиКоторымОчищаютсяНастройки.Свойство("МассивПользователей", ВыбранныеПользователи); - ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("Пользователь", Пользователь); ПараметрыФормы.Вставить("ТипДействия", "Очистка"); - ПараметрыФормы.Вставить("ВыбранныеПользователи", ВыбранныеПользователи); + ПараметрыФормы.Вставить("ВыбранныеПользователи", ВыбранныеПользователи.ВыгрузитьЗначения()); ПараметрыФормы.Вставить("Источник", ЭтотОбъект.ИмяФормы); ОткрытьФорму("Обработка.НастройкиПользователей.Форма.ВыборПользователей", ПараметрыФормы); @@ -231,7 +230,7 @@ Если КоличествоПользователей = 1 Тогда ПояснениеУКогоОчищеныНастройки = НСтр("ru = 'пользователя ""%1""'"); ПояснениеУКогоОчищеныНастройки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ПояснениеУКогоОчищеныНастройки, ПользователиКоторымОчищаютсяНастройки.МассивПользователей[0]); + ПояснениеУКогоОчищеныНастройки, ВыбранныеПользователи[0].Значение); Иначе ПояснениеУКогоОчищеныНастройки = НСтр("ru = '%1 пользователям'"); ПояснениеУКогоОчищеныНастройки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ПояснениеУКогоОчищеныНастройки, КоличествоПользователей); @@ -295,7 +294,7 @@ &НаСервере Процедура ОчиститьВыбранныеНастройки() - Источник = ПользователиКоторымОчищаютсяНастройки.МассивПользователей[0]; + Источник = ВыбранныеПользователи[0].Значение; Пользователь = Обработки.НастройкиПользователей.ИмяПользователяИБ(Источник); СведенияОПользователе = Новый Структура; СведенияОПользователе.Вставить("ПользовательСсылка", Источник); @@ -344,16 +343,15 @@ МассивНастроек.Добавить("ПрочиеПользовательскиеНастройки"); Если ПереключательКомуОчищатьНастройки = "ВыбраннымПользователям" Тогда - Источники = ПользователиКоторымОчищаютсяНастройки.МассивПользователей; + Источники = ВыбранныеПользователи.ВыгрузитьЗначения(); Иначе Источники = Новый Массив; ТаблицаПользователей = Новый ТаблицаЗначений; ТаблицаПользователей.Колонки.Добавить("Пользователь"); ТаблицаПользователей.Колонки.Добавить("Подразделение"); ТаблицаПользователей.Колонки.Добавить("ФизическоеЛицо"); - // Получаем список всех пользователей. + ТаблицаПользователей = Обработки.НастройкиПользователей.ПользователиДляКопирования("", ТаблицаПользователей, Ложь, Истина); - Для Каждого СтрокаТаблицы Из ТаблицаПользователей Цикл Источники.Добавить(СтрокаТаблицы.Пользователь); КонецЦикла; @@ -367,12 +365,8 @@ &НаСервере Процедура ОчиститьУстаревшиеНастройки() - Если ПереключательКомуОчищатьНастройки = "ВыбраннымПользователям" Тогда - Источники = ПользователиКоторымОчищаютсяНастройки.МассивПользователей; - Иначе - Источники = Неопределено; - КонецЕсли; - + Источники = ?(ПереключательКомуОчищатьНастройки = "ВыбраннымПользователям", + ВыбранныеПользователи.ВыгрузитьЗначения(), Неопределено); Обработки.НастройкиПользователей.УдалитьУстаревшиеНастройкиПользователей(Источники); КонецПроцедуры diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ПредупреждениеОКопированииНастроек/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ПредупреждениеОКопированииНастроек/Form.form index 61839b7bb..33e7ceb64 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ПредупреждениеОКопированииНастроек/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ПредупреждениеОКопированииНастроек/Form.form @@ -69,7 +69,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -173,7 +172,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/НастройкиПользователей/ManagerModule.bsl b/SSL/src/DataProcessors/НастройкиПользователей/ManagerModule.bsl index ad4f1f1b0..b213418b9 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/ManagerModule.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/ManagerModule.bsl @@ -28,30 +28,36 @@ // Добавление стандартных форм в список. СписокФорм.Добавить("ВнешняяОбработка.StandardEventLog.Форма.EventsJournal", - НСтр("ru = 'Стандартные.Журнал регистрации'") , Ложь, БиблиотекаКартинок.Форма); + ПрефиксСтандартныхФорм() + "." + НСтр("ru = 'Журнал регистрации'") , Ложь, БиблиотекаКартинок.Форма); СписокФорм.Добавить("ВнешняяОбработка.StandardEventLog.Форма.EventForm", - НСтр("ru = 'Стандартные.Журнал регистрации, Событие'") , Ложь, БиблиотекаКартинок.Форма); + ПрефиксСтандартныхФорм() + "." + НСтр("ru = 'Журнал регистрации, Событие'") , Ложь, БиблиотекаКартинок.Форма); СписокФорм.Добавить("ВнешняяОбработка.StandardEventLog.Форма.EventsJournalFilter", - НСтр("ru = 'Стандартные.Журнал регистрации, Настройка отбора событий'") , Ложь, БиблиотекаКартинок.Форма); + ПрефиксСтандартныхФорм() + "." + НСтр("ru = 'Журнал регистрации, Настройка отбора событий'") , Ложь, БиблиотекаКартинок.Форма); СписокФорм.Добавить("ВнешняяОбработка.StandardFindByRef.Форма.MainForm", - НСтр("ru = 'Стандартные.Поиск ссылок на объект'") , Ложь, БиблиотекаКартинок.Форма); + ПрефиксСтандартныхФорм() + "." + НСтр("ru = 'Поиск ссылок на объект'") , Ложь, БиблиотекаКартинок.Форма); СписокФорм.Добавить("ВнешняяОбработка.StandardFullTextSearchManagement.Форма.MainForm", - НСтр("ru = 'Стандартные.Управление полнотекстовым поиском'") , Ложь, БиблиотекаКартинок.Форма); + ПрефиксСтандартныхФорм() + "." + НСтр("ru = 'Управление полнотекстовым поиском'") , Ложь, БиблиотекаКартинок.Форма); СписокФорм.Добавить("ВнешняяОбработка.StandardDocumentsPosting.Форма.MainForm", - НСтр("ru = 'Стандартные.Проведение документов'") , Ложь, БиблиотекаКартинок.Форма); + ПрефиксСтандартныхФорм() + "." + НСтр("ru = 'Проведение документов'") , Ложь, БиблиотекаКартинок.Форма); СписокФорм.Добавить("ВнешняяОбработка.StandardDeleteMarkedObjects.Форма.Form", - НСтр("ru = 'Стандартные.Удаление помеченных объектов'") , Ложь, БиблиотекаКартинок.Форма); + ПрефиксСтандартныхФорм() + "." + НСтр("ru = 'Удаление помеченных объектов'") , Ложь, БиблиотекаКартинок.Форма); СписокФорм.Добавить("ВнешняяОбработка.StandardExternalDataSourceManagement.Форма.Form", - НСтр("ru = 'Стандартные.Управление внешними источниками данных'") , Ложь, БиблиотекаКартинок.Форма); + ПрефиксСтандартныхФорм() + "." + НСтр("ru = 'Управление внешними источниками данных'") , Ложь, БиблиотекаКартинок.Форма); СписокФорм.Добавить("ВнешняяОбработка.StandardTotalsManagement.Форма.MainForm", - НСтр("ru = 'Стандартные.Управление итогами'") , Ложь, БиблиотекаКартинок.Форма); + ПрефиксСтандартныхФорм() + "." + НСтр("ru = 'Управление итогами'") , Ложь, БиблиотекаКартинок.Форма); СписокФорм.Добавить("ВнешняяОбработка.StandardActiveUsers.Форма.ActiveUsersListForm", - НСтр("ru = 'Стандартные.Активные пользователи'") , Ложь, БиблиотекаКартинок.Форма); + ПрефиксСтандартныхФорм() + "." + НСтр("ru = 'Активные пользователи'") , Ложь, БиблиотекаКартинок.Форма); Возврат СписокНастроекФорм(СписокФорм, ИмяПользователя); КонецФункции +Функция ПрефиксСтандартныхФорм() + + Возврат НСтр("ru = 'Стандартные'"); + +КонецФункции + // Получает список форм, в конфигурации, при этом заполняются следующие поля: // Значение - имя формы, идентифицирующее ее. // Представление - синоним формы. @@ -559,7 +565,7 @@ Если ТипОбъектовПоддерживается Тогда ИмяОбъектаКорректно = Контекст.ИменаОбъектов.Получить(ВРег(ПолноеИмяОбъекта)); Если ИмяОбъектаКорректно = Неопределено Тогда - ИмяОбъектаКорректно = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта) <> Неопределено; + ИмяОбъектаКорректно = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта) <> Неопределено; Контекст.ИменаОбъектов.Вставить(ВРег(ПолноеИмяОбъекта), ИмяОбъектаКорректно); КонецЕсли; Если ИмяОбъектаКорректно Тогда @@ -1355,7 +1361,7 @@ ПолныйСоставГруппы = ПолныйСоставГруппыПользователей(ТаблицаГруппыИСостав, Группа.Ссылка); НоваяСтрокаГрупп.Состав = СоставГруппы; НоваяСтрокаГрупп.ПолныйСостав = ПолныйСоставГруппы; - НоваяСтрокаГрупп.Картинка = 3; + НоваяСтрокаГрупп.Картинка = ?(ПользовательВнешний, 9, 3); Иначе ГруппаРодитель = ДеревоГрупп.Строки.НайтиСтроки(Новый Структура("Группа", Группа.Родитель), Истина); НоваяСтрокаПодчиненныхГрупп = ГруппаРодитель[0].Строки.Добавить(); @@ -1364,7 +1370,7 @@ ПолныйСоставГруппы = ПолныйСоставГруппыПользователей(ТаблицаГруппыИСостав, Группа.Ссылка); НоваяСтрокаПодчиненныхГрупп.Состав = СоставГруппы; НоваяСтрокаПодчиненныхГрупп.ПолныйСостав = ПолныйСоставГруппы; - НоваяСтрокаПодчиненныхГрупп.Картинка = 3; + НоваяСтрокаПодчиненныхГрупп.Картинка = ?(ПользовательВнешний, 9, 3); КонецЕсли; МассивГруппРодителей.Добавить(Группа.Ссылка); @@ -2102,13 +2108,6 @@ Продолжить; КонецЕсли; - Если Не ПустаяСтрока(Параметры.Поиск) Тогда - Если СтрНайти(ВРег(ПредставлениеВариантаОтчета), ВРег(Параметры.Поиск)) = 0 - И СтрНайти(ВРег(НазваниеНастройки), ВРег(Параметры.Поиск)) = 0 Тогда - Продолжить; - КонецЕсли; - КонецЕсли; - // Заполняем строку варианта отчета. Если ТекущийОбъект <> ПредставлениеВариантаОтчета Тогда НоваяСтрокаВариантОтчета = Параметры.НастройкиОтчетовДерево.Строки.Добавить(); @@ -2148,14 +2147,6 @@ Продолжить; КонецЕсли; - Если Не ПустаяСтрока(Параметры.Поиск) Тогда - - Если СтрНайти(ВРег(ВариантОтчета.Представление), ВРег(Параметры.Поиск)) = 0 Тогда - Продолжить; - КонецЕсли; - - КонецЕсли; - НоваяСтрокаВариантОтчета = Параметры.НастройкиОтчетовДерево.Строки.Добавить(); // СтрокаДереваЗначений НоваяСтрокаВариантОтчета.Настройка = ВариантОтчета.Представление; НоваяСтрокаВариантОтчета.Картинка = КартинкаОтчет; @@ -2185,14 +2176,6 @@ ИмяОбъектаМетаданных = СтрРазделить(НастройкаФормы.Значение, ".", Ложь); ПредставлениеОбъектаМетаданных = СтрРазделить(НастройкаФормы.Представление, "~", Ложь); - Если Не ПустаяСтрока(Параметры.Поиск) Тогда - - Если СтрНайти(ВРег(НастройкаФормы.Представление), ВРег(Параметры.Поиск)) = 0 Тогда - Продолжить; - КонецЕсли; - - КонецЕсли; - Если ИмяОбъектаМетаданных[0] = "ОбщаяФорма" Тогда НоваяСтрокаОбщиеФормы = Параметры.НастройкиВнешнегоВида.Строки.Добавить(); НоваяСтрокаОбщиеФормы.Настройка = НастройкаФормы.Представление; @@ -2207,7 +2190,11 @@ ОбъединитьСпискиЗначений(НоваяСтрокаХранилищеНастроек.Ключи, НастройкаФормы.СписокКлючей); НоваяСтрокаХранилищеНастроек.ТипСтроки = "ХранилищеНастроек" + ИмяОбъектаМетаданных[2]; НоваяСтрокаХранилищеНастроек.Тип = "НастройкаВнешнегоВида"; - ИначеЕсли ПредставлениеОбъектаМетаданных[0] = НСтр("ru = 'Стандартные'") Тогда + ИначеЕсли СтрНачинаетсяС(НастройкаФормы.Значение, "ВнешняяОбработка.Standard") Тогда + + Если ПредставлениеОбъектаМетаданных.Количество() = 1 Тогда + ПредставлениеОбъектаМетаданных = СтрРазделить(НастройкаФормы.Представление, ".", Ложь); + КонецЕсли; // Группа дерева настроек Если ТекущийОбъект <> ПредставлениеОбъектаМетаданных[0] Тогда @@ -2294,22 +2281,15 @@ Ключи.Добавить(Настройка.КлючОбъекта, Настройка.КлючНастроек); КонецЦикла; - ВыводитьНастройку = Истина; Если Ключи.Количество() > 0 Тогда - - Если Не ПустаяСтрока(Параметры.Поиск) Тогда - Если СтрНайти(ВРег(НСтр("ru = 'Персональные настройки'")), ВРег(Параметры.Поиск)) = 0 Тогда - ВыводитьНастройку = Ложь; - КонецЕсли; - КонецЕсли; - - Если ВыводитьНастройку Тогда - Настройка = НСтр("ru = 'Персональные настройки'"); - ТипНастройки = "ПерсональныеНастройки"; + Настройка = НСтр("ru = 'Персональные настройки'"); + ТипНастройки = "ПерсональныеНастройки"; + Если ТипЗнч(Параметры.ПользовательСсылка) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда + Картинка = БиблиотекаКартинок.СостояниеПользователя08; + Иначе Картинка = БиблиотекаКартинок.СостояниеПользователя02; - ДобавитьСтрокуДерева(Параметры.ПрочиеНастройкиДерево, Настройка, Картинка, Ключи, ТипНастройки); КонецЕсли; - + ДобавитьСтрокуДерева(Параметры.ПрочиеНастройкиДерево, Настройка, Картинка, Ключи, ТипНастройки); КонецЕсли; // Заполнение настроек избранного и печати. @@ -2340,17 +2320,7 @@ КонецЦикла; // Добавление строки дерева "Настройки печати". - ВыводитьНастройку = Истина; - Если Не ПустаяСтрока(Параметры.Поиск) Тогда - - Если СтрНайти(ВРег(НСтр("ru = 'Настройки печати табличных документов'")), ВРег(Параметры.Поиск)) = 0 Тогда - ВыводитьНастройку = Ложь; - КонецЕсли; - - КонецЕсли; - - Если ЕстьНастройкиПечати - И ВыводитьНастройку Тогда + Если ЕстьНастройкиПечати Тогда Настройка = НСтр("ru = 'Настройки печати табличных документов'"); Картинка = БиблиотекаКартинок.Печать; ТипНастройки = "НастройкаПечати"; @@ -2358,17 +2328,7 @@ КонецЕсли; // Добавление строки дерева "Избранное". - ВыводитьНастройку = Истина; - Если Не ПустаяСтрока(Параметры.Поиск) Тогда - - Если СтрНайти(ВРег(НСтр("ru = 'Избранное'")), ВРег(Параметры.Поиск)) = 0 Тогда - ВыводитьНастройку = Ложь; - КонецЕсли; - - КонецЕсли; - - Если ЕстьИзбранное - И ВыводитьНастройку Тогда + Если ЕстьИзбранное Тогда Настройка = НСтр("ru = 'Избранное'"); Картинка = БиблиотекаКартинок.ДобавитьВИзбранное; @@ -2395,39 +2355,26 @@ Результат = ПрочаяНастройка.Значение; Если Результат.СписокНастроек.Количество() <> 0 Тогда - ВыводитьНастройку = Истина; - Если Не ПустаяСтрока(Параметры.Поиск) Тогда - - Если СтрНайти(ВРег(Результат.НазваниеНастройки), ВРег(Параметры.Поиск)) = 0 Тогда - ВыводитьНастройку = Ложь; - КонецЕсли; - + Если ПрочаяНастройка.Ключ = "НастройкаБыстрогоДоступа" Тогда + Для Каждого Элемент Из Результат.СписокНастроек Цикл + ЗначениеНастройки = Элемент[0]; + ИдентификаторНастройки = Элемент[1]; + Ключи.Добавить(ЗначениеНастройки, ИдентификаторНастройки); + КонецЦикла; + Иначе + Ключи = Результат.СписокНастроек.Скопировать(); КонецЕсли; - Если ВыводитьНастройку Тогда - - Если ПрочаяНастройка.Ключ = "НастройкаБыстрогоДоступа" Тогда - Для Каждого Элемент Из Результат.СписокНастроек Цикл - ЗначениеНастройки = Элемент[0]; - ИдентификаторНастройки = Элемент[1]; - Ключи.Добавить(ЗначениеНастройки, ИдентификаторНастройки); - КонецЦикла; - Иначе - Ключи = Результат.СписокНастроек.Скопировать(); - КонецЕсли; - - Настройка = Результат.НазваниеНастройки; - Если Результат.КартинкаНастройки = "" Тогда - Картинка = КартинкаПрочиеПользовательскиеНастройки; - Иначе - Картинка = Результат.КартинкаНастройки; - КонецЕсли; - Тип = "ПрочаяПользовательскаяНастройка"; - ТипНастройки = ПрочаяНастройка.Ключ; - ДобавитьСтрокуДерева(Параметры.ПрочиеНастройкиДерево, Настройка, Картинка, Ключи, Тип, ТипНастройки); - Ключи.Очистить(); - + Настройка = Результат.НазваниеНастройки; + Если Результат.КартинкаНастройки = "" Тогда + Картинка = КартинкаПрочиеПользовательскиеНастройки; + Иначе + Картинка = Результат.КартинкаНастройки; КонецЕсли; + Тип = "ПрочаяПользовательскаяНастройка"; + ТипНастройки = ПрочаяНастройка.Ключ; + ДобавитьСтрокуДерева(Параметры.ПрочиеНастройкиДерево, Настройка, Картинка, Ключи, Тип, ТипНастройки); + Ключи.Очистить(); КонецЕсли; @@ -2436,17 +2383,7 @@ КонецЕсли; // Прочие настройки, не попавшие в другие разделы. - ВыводитьНастройку = Истина; - Если Не ПустаяСтрока(Параметры.Поиск) Тогда - - Если СтрНайти(ВРег(НСтр("ru = 'Прочие настройки'")), ВРег(Параметры.Поиск)) = 0 Тогда - ВыводитьНастройку = Ложь; - КонецЕсли; - - КонецЕсли; - - Если ПрочиеКлючи.Количество() <> 0 - И ВыводитьНастройку Тогда + Если ПрочиеКлючи.Количество() <> 0 Тогда Настройка = НСтр("ru = 'Прочие настройки'"); Картинка = БиблиотекаКартинок.ПрочиеПользовательскиеНастройки; ТипНастройки = "ПрочаяНастройка"; @@ -2465,27 +2402,12 @@ // Процедура ДобавитьНастройкиРабочегоСтолаИКомандногоИнтерфейса(Параметры, ДеревоНастроек) - // АПК:1391-выкл Поиск по представлению настройки, описываемой в коде. - - Если Не ПустаяСтрока(Параметры.Поиск) Тогда - Если СтрНайти(ВРег(НСтр("ru = 'Командный интерфейс и начальная страница'")), ВРег(Параметры.Поиск)) = 0 Тогда - Возврат; - КонецЕсли; - КонецЕсли; - - // АПК:1391-вкл - Настройки = ЧтениеНастроекИзХранилища(ХранилищеСистемныхНастроек, Параметры.ПользовательИнформационнойБазы); КлючиНастроекРабочегоСтола = Новый СписокЗначений; КлючиНастроекИнтерфейса = Новый СписокЗначений; КлючиВсехНастроек = Новый СписокЗначений; - РежимСовместимости = СтандартныеПодсистемыСервер.ВерсияРежимаСовместимости(); - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(РежимСовместимости, "8.3.18.0") < 0 Тогда - СуффиксКлючаНастройки = "НастройкиОкна"; - Иначе - СуффиксКлючаНастройки = "НастройкиОкнаТонкогоКлиента"; - КонецЕсли; + СуффиксКлючаНастройки = "НастройкиОкнаТонкогоКлиента"; Для Каждого Настройка Из Настройки Цикл ИмяНастройки = СтрРазделить(Настройка.КлючОбъекта, "/", Ложь); diff --git a/SSL/src/DataProcessors/НастройкиЦентраМониторинга/Forms/ЗапросНаСборИОтправкуОтчетовОбОшибках/Form.form b/SSL/src/DataProcessors/НастройкиЦентраМониторинга/Forms/ЗапросНаСборИОтправкуОтчетовОбОшибках/Form.form index b6329842d..7338c5abd 100644 --- a/SSL/src/DataProcessors/НастройкиЦентраМониторинга/Forms/ЗапросНаСборИОтправкуОтчетовОбОшибках/Form.form +++ b/SSL/src/DataProcessors/НастройкиЦентраМониторинга/Forms/ЗапросНаСборИОтправкуОтчетовОбОшибках/Form.form @@ -99,7 +99,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -243,7 +242,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -385,7 +383,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/НастройкиЦентраМониторинга/Forms/НастройкиЦентраМониторинга/Form.form b/SSL/src/DataProcessors/НастройкиЦентраМониторинга/Forms/НастройкиЦентраМониторинга/Form.form index aef60e430..a93f68902 100644 --- a/SSL/src/DataProcessors/НастройкиЦентраМониторинга/Forms/НастройкиЦентраМониторинга/Form.form +++ b/SSL/src/DataProcessors/НастройкиЦентраМониторинга/Forms/НастройкиЦентраМониторинга/Form.form @@ -301,7 +301,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -417,7 +416,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/НастройкиЦентраМониторинга/Forms/НастройкиЦентраМониторинга/Module.bsl b/SSL/src/DataProcessors/НастройкиЦентраМониторинга/Forms/НастройкиЦентраМониторинга/Module.bsl index ebe5707f8..03118efea 100644 --- a/SSL/src/DataProcessors/НастройкиЦентраМониторинга/Forms/НастройкиЦентраМониторинга/Module.bsl +++ b/SSL/src/DataProcessors/НастройкиЦентраМониторинга/Forms/НастройкиЦентраМониторинга/Module.bsl @@ -165,7 +165,7 @@ АктуализироватьПараметры(); ИначеЕсли ПараметрыВидимости.Статус = "Выполнено" И НЕ РезультатВыполнения.Успешно ИЛИ ПараметрыВидимости.Статус = "Ошибка" Тогда Если ПараметрыВидимости.Статус = "Ошибка" Тогда - Пояснение = НСтр("ru = 'Ошибка при выполнении фонового задания.'"); + Пояснение = НСтр("ru = 'Возникла непредвиденная ситуация.'"); Иначе Пояснение = РезультатВыполнения.КраткоеПредставлениеОшибки; КонецЕсли; diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НеобходимоОбновитьПлатформу/Form.form b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НеобходимоОбновитьПлатформу/Form.form index d534b5ff6..be1bd4c19 100644 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НеобходимоОбновитьПлатформу/Form.form +++ b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НеобходимоОбновитьПлатформу/Form.form @@ -5,7 +5,7 @@ 1 КартинкаПредупреждение - 3 + 7 true true @@ -13,7 +13,7 @@ КартинкаПредупреждениеРасширеннаяПодсказка - 5 + 9 Label true true @@ -23,7 +23,7 @@ КартинкаПредупреждениеКонтекстноеМеню - 4 + 8 true true @@ -37,10 +37,10 @@ ГруппаИнструкции - 6 + 3 Предупреждение - 8 + 10 <key>ru</key> <value>Используемая версия платформы %1 может работать некорректно.%2 @@ -57,7 +57,7 @@ </userVisible> <extendedTooltip> <name>ПредупреждениеРасширеннаяПодсказка</name> - <id>10</id> + <id>12</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -67,7 +67,7 @@ </extendedTooltip> <contextMenu> <name>ПредупреждениеКонтекстноеМеню</name> - <id>9</id> + <id>11</id> <autoFill>true</autoFill> </contextMenu> <formatted>true</formatted> @@ -79,7 +79,7 @@ </items> <items xsi:type="form:Decoration"> <name>ДекорацияОтступ</name> - <id>11</id> + <id>13</id> <visible>true</visible> <enabled>true</enabled> <userVisible> @@ -87,7 +87,7 @@ </userVisible> <extendedTooltip> <name>ДекорацияОтступРасширеннаяПодсказка</name> - <id>13</id> + <id>15</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -97,7 +97,7 @@ </extendedTooltip> <contextMenu> <name>ДекорацияОтступКонтекстноеМеню</name> - <id>12</id> + <id>14</id> <autoFill>true</autoFill> </contextMenu> <type>Label</type> @@ -109,7 +109,7 @@ </items> <items xsi:type="form:FormGroup"> <name>ГруппаСсылки</name> - <id>14</id> + <id>5</id> <items xsi:type="form:Decoration"> <name>ИнструкцияПоУдалениюПлатформы</name> <id>16</id> @@ -193,7 +193,7 @@ </userVisible> <extendedTooltip> <name>ГруппаСсылкиРасширеннаяПодсказка</name> - <id>15</id> + <id>6</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -205,6 +205,7 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> <behavior>Auto</behavior> + <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -218,7 +219,7 @@ </userVisible> <extendedTooltip> <name>ГруппаИнструкцииРасширеннаяПодсказка</name> - <id>7</id> + <id>4</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -230,6 +231,7 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> <behavior>Auto</behavior> + <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -268,14 +270,14 @@ <id>-1</id> <items xsi:type="form:Button"> <name>ФормаПерезапустить</name> - <id>22</id> + <id>24</id> <enabled>true</enabled> <userVisible> <common>true</common> </userVisible> <extendedTooltip> <name>ФормаПерезапуститьРасширеннаяПодсказка</name> - <id>23</id> + <id>25</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -292,8 +294,8 @@ <representationInContextMenu>Auto</representationInContextMenu> </items> <items xsi:type="form:Button"> - <name>ОК</name> - <id>24</id> + <name>ФормаОК</name> + <id>22</id> <title> <key>ru</key> <value>Продолжить</value> @@ -304,8 +306,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ОКРасширеннаяПодсказка</name> - <id>25</id> + <name>ФормаОКРасширеннаяПодсказка</name> + <id>23</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -339,7 +341,7 @@ <showCloseButton>true</showCloseButton> <attributes> <name>КаталогПлатформы</name> - <id>3</id> + <id>1</id> <valueType> <types>String</types> <stringQualifiers/> @@ -353,7 +355,7 @@ </attributes> <attributes> <name>ТекущаяВерсия</name> - <id>4</id> + <id>2</id> <valueType> <types>String</types> <stringQualifiers/> diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НеобходимоОбновитьПлатформу/Module.bsl b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НеобходимоОбновитьПлатформу/Module.bsl index cb2d4ed60..9ac40e873 100644 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НеобходимоОбновитьПлатформу/Module.bsl +++ b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НеобходимоОбновитьПлатформу/Module.bsl @@ -147,7 +147,7 @@ Продолжить; КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсииБезНомераСборки(Платформа.ИмяБезРасширения, "8.3.17") < 0 Тогда + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсииБезНомераСборки(Платформа.ИмяБезРасширения, "8.3.21") < 0 Тогда Продолжить; КонецЕсли; @@ -202,7 +202,7 @@ Возврат Неопределено; КонецПопытки; НомерВерсии = НомерВерсии - 1; - Если НомерВерсии < 17 Тогда + Если НомерВерсии < 21 Тогда // 8.3.21 Возврат Неопределено; КонецЕсли; ВерсияЧастями[2] = Строка(НомерВерсии); @@ -221,4 +221,4 @@ КонецПроцедуры -#КонецОбласти \ No newline at end of file +#КонецОбласти diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Form.form b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Form.form index c048a75d6..9dbde1361 100644 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Form.form +++ b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Form.form @@ -106,7 +106,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -243,7 +242,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -272,7 +270,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Module.bsl b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Module.bsl index aef53fa22..425e6b97f 100644 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Module.bsl +++ b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Module.bsl @@ -38,7 +38,7 @@ ПорядокОбновленияПлатформы = МакетПорядокОбновления.ПолучитьТекст(); Если Параметры.УдалениеПрограммы Тогда - ПорядокОбновленияПлатформы = СтрЗаменить(ПорядокОбновленияПлатформы, "ТекущаяВерсия", "(" + Параметры.ВерсияПлатформы + ")"); + ПорядокОбновленияПлатформы = СтрЗаменить(ПорядокОбновленияПлатформы, "%1", "(" + Параметры.ВерсияПлатформы + ")"); КонецЕсли; Если ПустаяСтрока(ПорядокОбновленияПлатформы) Тогда diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокУдаленияПлатформы/ru.html b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокУдаленияПлатформы/ru.html index 70243f1a1..5ac409c05 100644 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокУдаленияПлатформы/ru.html +++ b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокУдаленияПлатформы/ru.html @@ -1,3 +1,3 @@ <!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="__STYLE__"></link></head><body> -<strong><font size="6">Порядок удаления версии программы 1С:Предприятие<span style="color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: "Times New Roman"; font-style: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; caret-color: rgb(0, 0, 0); font-variant-caps: normal; -webkit-text-stroke-width: 0px;"></span></font></strong><div style="color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: "Times New Roman"; font-style: normal; word-spacing: 0px; white-space: normal; caret-color: rgb(0, 0, 0); font-variant-caps: normal; -webkit-text-stroke-width: 0px;"><br></div><div style="color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: "Times New Roman"; font-style: normal; word-spacing: 0px; white-space: normal; caret-color: rgb(0, 0, 0); font-variant-caps: normal; -webkit-text-stroke-width: 0px;"><div>1. Введите <b>панель управления</b> в поле поиска на панели задач или в меню <b>Пуск</b>, а затем в списке результатов выберите "Панель управления".</div><div><br></div><div>2. Выберите <b>Программы</b> > <b>Программы и компоненты</b>.</div><div><br></div><div>3. Нажмите и удерживайте (или щелкните правой кнопкой мыши) на строке<span class="Apple-converted-space"> </span><b>1С:Предприятие 8</b> <b>ТекущаяВерсия</b> с версией платформы, которую требуется удалить, а затем выберите <b>Удалить</b> или <b>Удалить или изменить</b>. Затем следуйте инструкциям на экране.</div></div></body></html> \ No newline at end of file +<strong><font size="6">Порядок удаления версии программы 1С:Предприятие<span style="color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: "Times New Roman"; font-style: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; caret-color: rgb(0, 0, 0); font-variant-caps: normal; -webkit-text-stroke-width: 0px;"></span></font></strong><div style="color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: "Times New Roman"; font-style: normal; word-spacing: 0px; white-space: normal; caret-color: rgb(0, 0, 0); font-variant-caps: normal; -webkit-text-stroke-width: 0px;"><br></div><div style="color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: "Times New Roman"; font-style: normal; word-spacing: 0px; white-space: normal; caret-color: rgb(0, 0, 0); font-variant-caps: normal; -webkit-text-stroke-width: 0px;"><div>1. Введите <b>панель управления</b> в поле поиска на панели задач или в меню <b>Пуск</b>, а затем в списке результатов выберите "Панель управления".</div><div><br></div><div>2. Выберите <b>Программы</b> > <b>Программы и компоненты</b>.</div><div><br></div><div>3. Нажмите и удерживайте (или щелкните правой кнопкой мыши) на строке<span class="Apple-converted-space"> </span><b>1С:Предприятие 8</b> <b>%1</b> с версией платформы, которую требуется удалить, а затем выберите <b>Удалить</b> или <b>Удалить или изменить</b>. Затем следуйте инструкциям на экране.</div></div></body></html> \ No newline at end of file diff --git a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ОбъектыПересеченияОбработчика/Form.form b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ОбъектыПересеченияОбработчика/Form.form index 37667b64b..ba2fa9bf6 100644 --- a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ОбъектыПересеченияОбработчика/Form.form +++ b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ОбъектыПересеченияОбработчика/Form.form @@ -4,320 +4,686 @@ <key>ru</key> <value>Объекты пересечения обработчика</value> - - Пересечения - 1 - - <key>ru</key> - <value>Пересечения</value> - - true - true + + СтраницыТаблиц + 29 + + СтраницаПересечения + 31 + + Пересечения + 1 + + <key>ru</key> + <value>Пересечения</value> + + true + true + + true + + + Пересечения + + None + + ПересеченияЗаписьЧитаемых + 23 + true + true + + true + + + Пересечения.ЗаписьЧитаемых + + None + + ru + Текущий обработчик изменяет объекты, которые читаются другими обработчиками +или другие обработчики изменяют объекты, которые читает текущий обработчик. + + + ПересеченияЗаписьЧитаемыхРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ПересеченияЗаписьЧитаемыхКонтекстноеМеню + 24 + true + + CheckBoxField + true + Auto + true + + CommonPicture.АрхивАнкета + + Left + true + + + + ПересеченияПовторнаяЗапись + 26 + true + true + + true + + + Пересечения.ПовторнаяЗапись + + None + + ru + Повторная запись изменяемых объектов другими обработчиками. + + + ПересеченияПовторнаяЗаписьРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ПересеченияПовторнаяЗаписьКонтекстноеМеню + 27 + true + + CheckBoxField + true + Auto + true + + CommonPicture.Предупреждение + + 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 + + + + ПересеченияПроцедураПисатель + 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 + + + + ПересеченияПроцедураЧитательИлиПисатель2 + 17 + + <key>ru</key> + <value>Обработчик читатель (или писатель 2)</value> + + true + true + + true + + + Пересечения.ПроцедураЧитательИлиПисатель2 + + + ПересеченияПроцедураЧитательИлиПисатель2РасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ПересеченияПроцедураЧитательИлиПисатель2КонтекстноеМеню + 18 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПересеченияКоманднаяПанель + 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 + + true + true + true + ByContent + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + true + +
    + true + true + + true + + + <key>ru</key> + <value>Страница пересечения</value> + + + СтраницаПересеченияРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Page + + Vertical + auto + false + +
    + + СтраницаОбработчикиСНизкимПриоритетом + 33 + + ОбработчикиСНизкимПриоритетом + 35 + + <key>ru</key> + <value>Обработчики с низким приоритетом</value> + + true + true + + true + + + ОбработчикиСНизкимПриоритетом + + None + + ОбработчикиСНизкимПриоритетомОбъектМетаданных + 51 + true + true + + + ОбработчикиСНизкимПриоритетом.ОбъектМетаданных + + + ОбработчикиСНизкимПриоритетомОбъектМетаданныхРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ОбработчикиСНизкимПриоритетомОбъектМетаданныхКонтекстноеМеню + 52 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ОбработчикиСНизкимПриоритетомПроцедураПисатель + 48 + true + true + + true + + + ОбработчикиСНизкимПриоритетом.ПроцедураПисатель + + + ОбработчикиСНизкимПриоритетомПроцедураПисательРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + ОбработчикиСНизкимПриоритетомПроцедураПисательКонтекстноеМеню + 49 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ОбработчикиСНизкимПриоритетомПорядокПисатель + 54 + true + true + + true + + + ОбработчикиСНизкимПриоритетом.ПорядокПисатель + + + ОбработчикиСНизкимПриоритетомПорядокПисательРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + ОбработчикиСНизкимПриоритетомПорядокПисательКонтекстноеМеню + 55 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ОбработчикиСНизкимПриоритетомКоманднаяПанель + 37 + Left + true + + + ОбработчикиСНизкимПриоритетомСтрокаПоиска + 39 + + ОбработчикиСНизкимПриоритетомСтрокаПоискаРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ОбработчикиСНизкимПриоритетомСтрокаПоискаКонтекстноеМеню + 40 + true + + ОбработчикиСНизкимПриоритетом + + true + + + + ОбработчикиСНизкимПриоритетомСостояниеПросмотра + 42 + + ОбработчикиСНизкимПриоритетомСостояниеПросмотраРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ОбработчикиСНизкимПриоритетомСостояниеПросмотраКонтекстноеМеню + 43 + true + + ViewStatusAddition + ОбработчикиСНизкимПриоритетом + + true + + + + ОбработчикиСНизкимПриоритетомУправлениеПоиском + 45 + + ОбработчикиСНизкимПриоритетомУправлениеПоискомРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ОбработчикиСНизкимПриоритетомУправлениеПоискомКонтекстноеМеню + 46 + true + + SearchControlAddition + ОбработчикиСНизкимПриоритетом + + true + + + + ОбработчикиСНизкимПриоритетомРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ОбработчикиСНизкимПриоритетомКонтекстноеМеню + 36 + true + + true + true + true + true + ByContent + 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>Страница обработчики с низким приоритетом</value> + + + СтраницаОбработчикиСНизкимПриоритетомРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Page + + Vertical + auto + false + +
    + false true - - Пересечения - - None - - ПересеченияЗаписьЧитаемых - 23 - true - true - - true - - - Пересечения.ЗаписьЧитаемых - - None - - ru - Текущий обработчик изменяет объекты, которые читаются другими обработчиками -или другие обработчики изменяют объекты, которые читает текущий обработчик. - - - ПересеченияЗаписьЧитаемыхРасширеннаяПодсказка - 25 - Label - true - true - - Left - - - - ПересеченияЗаписьЧитаемыхКонтекстноеМеню - 24 - true - - CheckBoxField - true - Auto - true - - CommonPicture.АрхивАнкета - - Left - true - - - - ПересеченияПовторнаяЗапись - 26 - true - true - - true - - - Пересечения.ПовторнаяЗапись - - None - - ru - Повторная запись изменяемых объектов другими обработчиками. - - - ПересеченияПовторнаяЗаписьРасширеннаяПодсказка - 28 - Label - true - true - - Left - - - - ПересеченияПовторнаяЗаписьКонтекстноеМеню - 27 - true - - CheckBoxField - true - Auto - true - - CommonPicture.Предупреждение - - 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 - - - - ПересеченияПроцедураПисатель - 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 - - - - ПересеченияПроцедураЧитательИлиПисатель2 - 17 - - <key>ru</key> - <value>Обработчик читатель (или писатель 2)</value> - - true - true - - true - - - Пересечения.ПроцедураЧитательИлиПисатель2 - - - ПересеченияПроцедураЧитательИлиПисатель2РасширеннаяПодсказка - 19 - Label - true - true - - Left - - - - ПересеченияПроцедураЧитательИлиПисатель2КонтекстноеМеню - 18 - true - - InputField - true - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - - - ПересеченияКоманднаяПанель - 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 - - + + <key>ru</key> + <value>Страницы таблиц</value> + - ПересеченияРасширеннаяПодсказка - 4 + СтраницыТаблицРасширеннаяПодсказка + 30 Label true true @@ -325,34 +691,10 @@ Left
    - - ПересеченияКонтекстноеМеню - 2 - true - - true - true - true - ByContent - true - MultiRow -
    true
    - 1 - 1 - AutoUse - AutoUse - true - true - false - true - Auto - Auto - true - true - true - true - true - + Pages + + Auto + None false @@ -499,6 +841,80 @@
    + + ОбработчикиСНизкимПриоритетом + + <key>ru</key> + <value>Обработчики с низким приоритетом</value> + + 3 + + ValueTable + + + true + + + true + + + ПроцедураПисатель + + <key>ru</key> + <value>Обработчик</value> + + 1 + + String + + 350 + + + + true + + + true + + + + ОбъектМетаданных + + <key>ru</key> + <value>Объект метаданных</value> + + 3 + + String + + 300 + + + + true + + + true + + + + ПорядокПисатель + + <key>ru</key> + <value>Приоритет выполнения</value> + + 4 + + EnumRef.ПорядокОбработчиковОбновления + + + true + + + true + + + АдресДанных @@ -508,6 +924,12 @@ + + ЭтоОбработчикиСНизкимПриоритетом + + Boolean + + diff --git a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ОбъектыПересеченияОбработчика/Module.bsl b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ОбъектыПересеченияОбработчика/Module.bsl index 0b33fa0b6..6fc445d41 100644 --- a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ОбъектыПересеченияОбработчика/Module.bsl +++ b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ОбъектыПересеченияОбработчика/Module.bsl @@ -12,8 +12,17 @@ Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если ЗначениеЗаполнено(Параметры.АдресДанных) Тогда - Данные = ПолучитьИзВременногоХранилища(Параметры.АдресДанных); - Пересечения.Загрузить(Данные); + Если Параметры.ЭтоОбработчикиСНизкимПриоритетом Тогда + Данные = ПолучитьИзВременногоХранилища(Параметры.АдресДанных); + ОбработчикиСНизкимПриоритетом.Загрузить(Данные); + Элементы.СтраницыТаблиц.ТекущаяСтраница = Элементы.СтраницаОбработчикиСНизкимПриоритетом; + Заголовок = НСтр("ru = 'Обработчики с низким приоритетом'"); + Иначе + Данные = ПолучитьИзВременногоХранилища(Параметры.АдресДанных); + Пересечения.Загрузить(Данные); + Элементы.СтраницыТаблиц.ТекущаяСтраница = Элементы.СтраницаПересечения; + Заголовок = НСтр("ru = 'Объекты пересечения обработчика'"); + КонецЕсли; КонецЕсли; КонецПроцедуры diff --git a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаВыбораИдентификаторовОбъектовМетаданных/Form.form b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаВыбораИдентификаторовОбъектовМетаданных/Form.form index d5a130834..57ed034cb 100644 --- a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаВыбораИдентификаторовОбъектовМетаданных/Form.form +++ b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаВыбораИдентификаторовОбъектовМетаданных/Form.form @@ -275,6 +275,13 @@ true
    + + ОсновнойОбъектМетаданных + + String + + + diff --git a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаВыбораИдентификаторовОбъектовМетаданных/Module.bsl b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаВыбораИдентификаторовОбъектовМетаданных/Module.bsl index 5fce524ff..f6d86a91a 100644 --- a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаВыбораИдентификаторовОбъектовМетаданных/Module.bsl +++ b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаВыбораИдентификаторовОбъектовМетаданных/Module.bsl @@ -29,12 +29,17 @@ | СправочникИдентификаторыОбъектовМетаданных.Предопределенный КАК Предопределенный, | СправочникИдентификаторыОбъектовМетаданных.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных |ИЗ - | Справочник.ИдентификаторыОбъектовМетаданных КАК СправочникИдентификаторыОбъектовМетаданных"; + | Справочник.ИдентификаторыОбъектовМетаданных КАК СправочникИдентификаторыОбъектовМетаданных + |ГДЕ + | СправочникИдентификаторыОбъектовМетаданных.ПолноеИмя <> &ОсновнойОбъектМетаданных + | ИЛИ &ВсеИмена"; СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка(); СвойстваСписка.ОсновнаяТаблица = "Справочник.ИдентификаторыОбъектовМетаданных"; СвойстваСписка.ТекстЗапроса = ТекстЗапроса; - ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.СписокИдентификаторов, СвойстваСписка); + ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.СписокИдентификаторов, СвойстваСписка); + СписокИдентификаторов.Параметры.УстановитьЗначениеПараметра("ОсновнойОбъектМетаданных", Параметры.ОсновнойОбъектМетаданных); + СписокИдентификаторов.Параметры.УстановитьЗначениеПараметра("ВсеИмена", НЕ ЗначениеЗаполнено(Параметры.ОсновнойОбъектМетаданных)); КонецПроцедуры diff --git a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаОбработчика/Form.form b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаОбработчика/Form.form index 8f0bb976f..bffb7cc92 100644 --- a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаОбработчика/Form.form +++ b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаОбработчика/Form.form @@ -342,7 +342,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -485,7 +484,6 @@ UsualGroup Vertical - Auto true true Auto @@ -692,6 +690,47 @@ 10 + + ПриоритетВыполнения + 810 + true + true + + true + + + Объект.ОбработчикиОбновления[0].Порядок + + + ПриоритетВыполненияРасширеннаяПодсказка + 812 + Label + true + true + + Left + + + + ПриоритетВыполненияКонтекстноеМеню + 811 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + true true @@ -715,7 +754,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -744,7 +782,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -773,7 +810,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1144,7 +1180,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1491,7 +1526,6 @@ UsualGroup Vertical - Auto true true auto @@ -1572,7 +1606,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1601,7 +1634,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1834,6 +1866,53 @@ true + + ЧитаемыеОбъектыПредупреждение + 813 + true + true + + true + + + Объект.ЧитаемыеОбъекты.Предупреждение + + + ru + Обработчики с низкими приоритетом + + Balloon + + ЧитаемыеОбъектыПредупреждениеРасширеннаяПодсказка + 815 + Label + true + true + + Left + + + + ЧитаемыеОбъектыПредупреждениеКонтекстноеМеню + 814 + true + + PictureField + Auto + Left + true + + true + true + true + true + + + 1 + + AsFileRef + + ЧитаемыеОбъектыБлокироватьИнтерфейс 269 @@ -1874,9 +1953,39 @@ ЧитаемыеОбъектыКоманднаяПанель 104 + + ЧитаемыеОбъектыСведенияОБлокировке + 819 + true + true + + true + + + ЧитаемыеОбъектыСведенияОБлокировкеРасширеннаяПодсказка + 820 + Label + true + true + + Left + + + Form.Command.СведенияОБлокировке + Normal + Auto + true + true + UserCmds + Auto + Left true + + Selection + ЧитаемыеОбъектыВыбор + OnStartEdit ОбъектыПриНачалеРедактирования @@ -2021,32 +2130,6 @@ UserCmds Auto - - ЧитаемыеОбъектыДобавитьОбъектОбработчика - 777 - true - true - - true - - - ЧитаемыеОбъектыДобавитьОбъектОбработчикаРасширеннаяПодсказка - 778 - Label - true - true - - Left - - - Form.Command.ДобавитьОбъектОбработчикаВЧитаемые - Normal - Auto - true - true - UserCmds - Auto - ЧитаемыеОбъектыДобавитьТипыРеквизита 784 @@ -2249,7 +2332,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2478,6 +2560,47 @@ true + + ИзменяемыеОбъектыНовыеОбъекты + 816 + + <key>ru</key> + <value>Нов.</value> + + true + true + + true + + + Объект.ИзменяемыеОбъекты.НовыеОбъекты + + + ru + Создаются новые объекты + + + ИзменяемыеОбъектыНовыеОбъектыРасширеннаяПодсказка + 818 + Label + true + true + + Left + + + + ИзменяемыеОбъектыНовыеОбъектыКонтекстноеМеню + 817 + true + + CheckBoxField + Auto + true + Left + true + + ИзменяемыеОбъектыКоманднаяПанель 145 @@ -2731,7 +2854,6 @@ UsualGroup - Auto true true Auto @@ -2760,7 +2882,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -4206,7 +4327,6 @@ UsualGroup Vertical - Auto true true Auto @@ -4586,6 +4706,9 @@ Vertical auto + + Объект.ПриоритетыВыполнения.RowsCount + false @@ -4712,6 +4835,65 @@
    true
    true + + + Объект.ЧитаемыеОбъекты + + + Порядок + + <key>ru</key> + <value>Порядок</value> + + 1 + + String + + 30 + + + + true + + + true + + + + ЕстьПисательНизкогоПорядка + + <key>ru</key> + <value>Есть писатель низкого порядка</value> + + 2 + + Boolean + + + true + + + true + + + + Предупреждение + + <key>ru</key> + <value>Предупреждение</value> + + 3 + + Picture + + + true + + + true + + + МодулиПодсистем @@ -5103,6 +5285,77 @@ true + + ПисателиНизкогоПорядка + 22 + + ValueTable + + + true + + + true + + + ПроцедураПисатель + 1 + + String + + 350 + + + + true + + + true + + + + ОбъектМетаданных + 2 + + String + + 300 + + + + true + + + true + + + + Порядок + 3 + + EnumRef.ПорядокОбработчиковОбновления + + + true + + + true + + + + + ЕстьЧтениеНизкогоПорядка + 23 + + Boolean + + + true + + + true + + ЗаписатьИЗакрыть @@ -5369,6 +5622,28 @@ <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>СведенияОБлокировке</name> + <title> + <key>ru</key> + <value>Сведения о блокировке</value> + + 8 + + ru + Сведения о блокировке + + + true + + + + СведенияОБлокировке + + + Auto + Auto + НоваяСтрока diff --git a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаОбработчика/Module.bsl b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаОбработчика/Module.bsl index 0b29e2bec..6fba53886 100644 --- a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаОбработчика/Module.bsl +++ b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаОбработчика/Module.bsl @@ -71,6 +71,9 @@ ИначеЕсли СтрНайти(ТабличнаяЧасть.Ключ, "ПриоритетыВыполнения") > 0 Тогда ЗагрузитьПриоритетыОбработчика(ТабличнаяЧасть.Значение); + ИначеЕсли СтрНайти(ТабличнаяЧасть.Ключ, "ЧтениеНизкогоПорядка") > 0 Тогда + ЗагрузитьЧтениеНизкогоПорядка(ТабличнаяЧасть.Значение); + ИначеЕсли СтрНайти(ТабличнаяЧасть.Ключ, "КонфликтыОбработчиков") = 0 Тогда Объект[ТабличнаяЧасть.Ключ].Загрузить(ТабличнаяЧасть.Значение); @@ -233,6 +236,28 @@ КонецПроцедуры +&НаКлиенте +Процедура ПроцедураПроверкиОкончаниеВводаТекстаПослеВопроса(Результат, Текст) Экспорт + Если Результат <> КодВозвратаДиалога.Да Тогда + Объект.ОбработчикиОбновления[0].ПроцедураПроверки = ТекущееЗначениеПроцедурыПроверки; + Возврат; + КонецЕсли; + Объект.ОбработчикиОбновления[0].ПроцедураПроверки = Текст; + ТекущееЗначениеПроцедурыПроверки = Текст; + + Элементы.ДекорацияПредупреждение.Видимость = (ТекущееЗначениеПроцедурыПроверки <> СтандартнаяПроцедураПроверки()); + + Элементы.ПроцедураПроверки.ОтметкаНезаполненного = Не ЗначениеЗаполнено(Объект.ОбработчикиОбновления[0].ПроцедураПроверки); + Если НЕ ПустаяСтрока(Объект.ОбработчикиОбновления[0].ПроцедураПроверки) Тогда + ИмяОсновногоОбъектаМетаданных(Объект.ОбработчикиОбновления[0].ПроцедураПроверки, ЕдинственноеЧисло, МножественноеЧисло); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ДекорацияПредупреждениеНажатие(Элемент) + ПоказатьПредупреждение(, ТекстПредупрежденияИзмененаПроцедураПроверки()); +КонецПроцедуры + &НаКлиенте Процедура ПроцедураПроверкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) @@ -354,6 +379,45 @@ УстановитьОтметкуНезаполненногоПроцедураПроверки(); КонецПроцедуры +&НаКлиенте +Процедура СведенияОБлокировке(Команда) + + ТекстПредупреждения = НСтр("ru = '• Проверка на блокировку предыдущими очередями выполняется только для тех объектов которые зарегистрированы на плане обмена к обновлению для текущего обработчика; + | + |• Если необходимо чтобы данные к обновлению отбирались с учетом обновленных читаемых данных, то в параметрах выборки процедуры регистрации необходимо указать дополнительные источники; + | + | Дополнительные источники это таблицы читаемых данных, элементы которых должны быть зарегистрированы на плане обмена в очереди с номером ниже чем у текущего обработчика.'"); + + ПоказатьПредупреждение(, ТекстПредупреждения); + +КонецПроцедуры + +&НаКлиенте +Процедура ЧитаемыеОбъектыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Если Поле.Имя = Элементы.ЧитаемыеОбъектыПредупреждение.Имя Тогда + ИмяФормыОбработчика = "Обработка.ОписаниеОбработчиковОбновления.Форма.ОбъектыПересеченияОбработчика"; + Если НЕ ЗапускИзКонфигурации Тогда + ИмяФормыОбработчика = "ВнешняяОбработка.ОписаниеОбработчиковОбновления.Форма.ОбъектыПересеченияОбработчика"; + КонецЕсли; + + АдресДанных = ПоместитьОбработчикиСНизкимПриоритетомВХранилище(Элемент.ТекущиеДанные.ОбъектМетаданных); + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("АдресДанных", АдресДанных); + ПараметрыФормы.Вставить("ЭтоОбработчикиСНизкимПриоритетом", Истина); + + ОткрытьФорму(ИмяФормыОбработчика, + ПараметрыФормы, + ЭтотОбъект, + ЭтотОбъект.УникальныйИдентификатор, + , + , + , + РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + КонецЕсли; + +КонецПроцедуры + &НаКлиенте Процедура ПриоритетыВыполненияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) @@ -430,6 +494,7 @@ Возврат; КонецЕсли; + ОчиститьСообщения(); Адрес = ПоместитьДанныеОбработчикаВХранилище(ВладелецФормы.УникальныйИдентификатор); Оповестить("ИзменилосьОписаниеОбработчикаОбновления", Адрес); Элементы.Объявление.Видимость = Модифицированность; @@ -569,6 +634,19 @@ Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); + // + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ЧитаемыеОбъектыОбъектМетаданных.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ЧитаемыеОбъекты.ЕстьПисательНизкогоПорядка"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветОсобогоТекста); + КонецПроцедуры &НаКлиенте @@ -747,6 +825,10 @@ ТекущееЗначение = Элементы[ИмяТаблицы].ТекущиеДанные.ОбъектМетаданных; КонецЕсли; ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущееЗначение); + ПараметрыФормы.Вставить("ОсновнойОбъектМетаданных", Неопределено); + Если ЭтотОбъект.ТекущийЭлемент.Имя = Элементы.ЧитаемыеОбъекты.Имя Тогда + ПараметрыФормы.Вставить("ОсновнойОбъектМетаданных", ОсновнойОбъектМетаданных); + КонецЕсли; ПараметрыОбработчикаВыбора = ПараметрыОбработчикаВыбора(ИмяТаблицы, ТекущееЗначение); ОбработчикВыбора = Новый ОписаниеОповещения("ОбработкаВыбораОбъектаМетаданных", ЭтотОбъект, ПараметрыОбработчикаВыбора); @@ -902,6 +984,7 @@ Элементы.Обработчик1.РасширеннаяПодсказка.Заголовок = Данные.ТабличныеЧасти.ОбработчикиОбновления[0].Комментарий; ЗагрузитьПриоритетыОбработчика(Данные.ТабличныеЧасти.ПриоритетыВыполнения); + ЗагрузитьЧтениеНизкогоПорядка(Данные.ТабличныеЧасти.ЧтениеНизкогоПорядка); КонецПроцедуры @@ -948,6 +1031,34 @@ КонецПроцедуры +&НаСервере +Процедура ЗагрузитьЧтениеНизкогоПорядка(ЧтениеНизкогоПорядка) + + Объект.ЧтениеНизкогоПорядка.Загрузить(ЧтениеНизкогоПорядка); + Если ЧтениеНизкогоПорядка.Количество() > 0 Тогда + Элементы.ЧитаемыеОбъектыПредупреждение.Видимость = Истина; + Отбор = Новый Структура("ОбъектМетаданных"); + Для Каждого Читаемый Из Объект.ЧитаемыеОбъекты Цикл + Отбор.ОбъектМетаданных = Читаемый.ОбъектМетаданных; + НайденныеСтроки = Объект.ЧтениеНизкогоПорядка.НайтиСтроки(Отбор); + Если НайденныеСтроки.Количество() > 0 Тогда + Читаемый.ЕстьПисательНизкогоПорядка = Истина; + Читаемый.Предупреждение = БиблиотекаКартинок.Предупреждение; + КонецЕсли; + КонецЦикла; + ТекстСообщения = НСтр("ru = 'Среди читаемых объектов обработчика имеются объекты, которые обрабатываются обработчиками с более низким приоритетом чем текущий. + |Это приведет к тому что текущий обработчик будет ждать их завершения. Необходимо устранить это несоответствие.'"); + ОбщегоНазначения.СообщитьПользователю(ТекстСообщения); + Иначе + Элементы.ЧитаемыеОбъектыПредупреждение.Видимость = Ложь; + Для Каждого Читаемый Из Объект.ЧитаемыеОбъекты Цикл + Читаемый.ЕстьПисательНизкогоПорядка = Ложь; + Читаемый.Предупреждение = Неопределено; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + &НаСервере Функция ПоместитьПересеченияОбработчикаВХранилище(ТекущийОбработчик, КонфликтующийОбработчик) @@ -957,6 +1068,15 @@ КонецФункции +&НаСервере +Функция ПоместитьОбработчикиСНизкимПриоритетомВХранилище(ОбъектМетаданных) + + Данные = Объект.ЧтениеНизкогоПорядка.Выгрузить(Новый Структура("ОбъектМетаданных", ОбъектМетаданных)); + Адрес = ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор); + Возврат Адрес; + +КонецФункции + &НаСервере Процедура ЗаполнитьПересеченияОбработчика(ТекущийОбработчик, КонфликтующийОбработчик) @@ -1049,6 +1169,13 @@ ВключатьОбщиеМодули = Истина; ОбъектыМетаданных = НайтиОбъектыМетаданных(Текст, ВключатьОбщиеМодули, ОбщиеМодули); + Если ЭтотОбъект.ТекущийЭлемент.Имя = Элементы.ЧитаемыеОбъекты.Имя Тогда + Индекс = ОбъектыМетаданных.Найти(ОсновнойОбъектМетаданных); + Если Индекс <> Неопределено Тогда + ОбъектыМетаданных.Удалить(Индекс); + КонецЕсли; + КонецЕсли; + ДанныеВыбора = Новый СписокЗначений; ДанныеВыбора.ЗагрузитьЗначения(ОбъектыМетаданных); @@ -1062,7 +1189,7 @@ Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("ОбщиеМодули", ВсеОбщиеМодули.Выгрузить()); Запрос.УстановитьПараметр("ВключатьОбщиеМодули", ВключатьОбщиеМодули); - Запрос.УстановитьПараметр("ЧастьИмени", "%"+ЧастьИмени+"%"); + Запрос.УстановитьПараметр("ЧастьИмени", "%" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(ЧастьИмени) + "%"); Запрос.УстановитьПараметр("МассивКлассов", ДоступныеКлассыОбъектовМетаданных(ВключатьОбщиеМодули)); ОбъектыМетаданных = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); @@ -1090,7 +1217,7 @@ | Справочник.ИдентификаторыОбъектовМетаданных КАК ОбъектыМетаданных |ГДЕ | НЕ ОбъектыМетаданных.ПометкаУдаления - | И ОбъектыМетаданных.ПолноеИмя ПОДОБНО &ЧастьИмени + | И ОбъектыМетаданных.ПолноеИмя ПОДОБНО &ЧастьИмени СПЕЦСИМВОЛ ""~"" | | И ОбъектыМетаданных.Родитель.Имя В(&МассивКлассов) | И НЕ ОбъектыМетаданных.Родитель.ПометкаУдаления @@ -1102,7 +1229,7 @@ |ИЗ | ОбщиеМодули КАК ОбщиеМодули |ГДЕ - | ОбщиеМодули.Имя ПОДОБНО &ЧастьИмени + | ОбщиеМодули.Имя ПОДОБНО &ЧастьИмени СПЕЦСИМВОЛ ""~"" | |УПОРЯДОЧИТЬ ПО | Ссылка"; @@ -1189,7 +1316,7 @@ Функция РеквизитыОбъектаМетаданных(ИмяОбъекта) Результат = Новый СписокЗначений; - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъекта); ПолноеИмяОбъекта = МетаданныеОбъекта.ПолноеИмя(); ЕщеРеквизитыОбъекта = Новый Структура("СтандартныеРеквизиты, Измерения, Ресурсы, Реквизиты"); @@ -1230,7 +1357,7 @@ Реквизит = Метаданные.НайтиПоПолномуИмени(ПолноеИмяРеквизита); Если СтрНайти(ПолноеИмяРеквизита, "СтандартныйРеквизит") > 0 Тогда Имена = СтрРазделить(ПолноеИмяРеквизита, "."); - Реквизит = Метаданные.НайтиПоПолномуИмени(Имена[0]+ "." + Имена[1]).СтандартныеРеквизиты[Имена[3]]; + Реквизит = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Имена[0]+ "." + Имена[1]).СтандартныеРеквизиты[Имена[3]]; КонецЕсли; Если Реквизит = Неопределено Тогда @@ -1250,7 +1377,9 @@ Модифицированность = Истина; КонецЦикла; ГруппировкаОбъектов = "Ссылка,ОбъектМетаданных,ИндексКартинки,БлокироватьИнтерфейс"; - Если ИмяТаблицы = "БлокируемыеОбъекты" Тогда + Если ИмяТаблицы = "ИзменяемыеОбъекты" Тогда + ГруппировкаОбъектов = ГруппировкаОбъектов +",НовыеОбъекты"; + ИначеЕсли ИмяТаблицы = "БлокируемыеОбъекты" Тогда ГруппировкаОбъектов = "Ссылка,ОбъектМетаданных,ИндексКартинки"; КонецЕсли; Таблица.Свернуть(ГруппировкаОбъектов); @@ -1322,26 +1451,4 @@ КонецФункции -&НаКлиенте -Процедура ДекорацияПредупреждениеНажатие(Элемент) - ПоказатьПредупреждение(, ТекстПредупрежденияИзмененаПроцедураПроверки()); -КонецПроцедуры - -&НаКлиенте -Процедура ПроцедураПроверкиОкончаниеВводаТекстаПослеВопроса(Результат, Текст) Экспорт - Если Результат <> КодВозвратаДиалога.Да Тогда - Объект.ОбработчикиОбновления[0].ПроцедураПроверки = ТекущееЗначениеПроцедурыПроверки; - Возврат; - КонецЕсли; - Объект.ОбработчикиОбновления[0].ПроцедураПроверки = Текст; - ТекущееЗначениеПроцедурыПроверки = Текст; - - Элементы.ДекорацияПредупреждение.Видимость = (ТекущееЗначениеПроцедурыПроверки <> СтандартнаяПроцедураПроверки()); - - Элементы.ПроцедураПроверки.ОтметкаНезаполненного = Не ЗначениеЗаполнено(Объект.ОбработчикиОбновления[0].ПроцедураПроверки); - Если НЕ ПустаяСтрока(Объект.ОбработчикиОбновления[0].ПроцедураПроверки) Тогда - ИмяОсновногоОбъектаМетаданных(Объект.ОбработчикиОбновления[0].ПроцедураПроверки, ЕдинственноеЧисло, МножественноеЧисло); - КонецЕсли; -КонецПроцедуры - #КонецОбласти diff --git a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаСпискаОбработчиков/Form.form b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаСпискаОбработчиков/Form.form index ffcfebb84..7a91d4ac5 100644 --- a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаСпискаОбработчиков/Form.form +++ b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаСпискаОбработчиков/Form.form @@ -143,7 +143,6 @@ UsualGroup Vertical - Auto true true Auto @@ -366,7 +365,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -557,7 +555,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1551,6 +1548,82 @@ true + + ОбработчикиОбновленияИзмененаПроцедураПроверки + 262 + true + true + + + Объект.ОбработчикиОбновления.ИзмененаПроцедураПроверки + + None + + ru + Изменена процедура проверки + + + ОбработчикиОбновленияИзмененаПроцедураПроверкиРасширеннаяПодсказка + 264 + Label + true + true + + Left + + + + ОбработчикиОбновленияИзмененаПроцедураПроверкиКонтекстноеМеню + 263 + true + + CheckBoxField + true + Auto + true + + CommonPicture.ВидыСравнения + + Left + true + + + + ОбработчикиОбновленияЧтениеНизкогоПорядка + 265 + true + true + + + Объект.ОбработчикиОбновления.ЧтениеНизкогоПорядка + + None + + ОбработчикиОбновленияЧтениеНизкогоПорядкаРасширеннаяПодсказка + 267 + Label + true + true + + Left + + + + ОбработчикиОбновленияЧтениеНизкогоПорядкаКонтекстноеМеню + 266 + true + + CheckBoxField + true + Auto + true + + CommonPicture.ЗнакСтоп + + Left + true + + ОбработчикиОбновленияИзменен 198 @@ -1710,6 +1783,48 @@ Normal + + ОбработчикиОбновленияПорядок + 259 + true + true + + true + + + Объект.ОбработчикиОбновления.Порядок + + + ОбработчикиОбновленияПорядокРасширеннаяПодсказка + 261 + Label + true + true + + Left + + + + ОбработчикиОбновленияПорядокКонтекстноеМеню + 260 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + ОбработчикиОбновленияИмяОбъекта 239 @@ -2816,22 +2931,6 @@ true - - СтатусНетПроблем - 14 - - String - - 30 - - - - true - - - true - - СтатусНеобходимАнализ 15 @@ -3058,6 +3157,38 @@ РасширенныйРежимФормы + + СтатусИзмененаПроцедураПроверки + 27 + + String + + 30 + + + + true + + + true + + + + СтатусЧтениеНизкогоПорядка + 28 + + String + + 30 + + + + true + + + true + + ЗагрузитьОбработчики diff --git a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаСпискаОбработчиков/Module.bsl b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаСпискаОбработчиков/Module.bsl index d1010af42..e87dc66ec 100644 --- a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаСпискаОбработчиков/Module.bsl +++ b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаСпискаОбработчиков/Module.bsl @@ -31,9 +31,9 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) - #Если ВебКлиент Тогда +#Если ВебКлиент Тогда ВызватьИсключение НСтр("ru = 'Работа в web-клиенте не поддерживается.'"); - #КонецЕсли +#КонецЕсли Если СтрНайти(ПараметрЗапуска,"=") > 0 Тогда @@ -55,11 +55,11 @@ ФайлРезультата = СтруктураПараметров.ResultFile; КонецЕсли; - #Если НЕ ВебКлиент Тогда +#Если НЕ ВебКлиент Тогда Если СтруктураПараметров.Свойство("DetectionTime") И ЗначениеЗаполнено(СтруктураПараметров.DetectionTime) Тогда ДатаОбнаруженияОшибки = XMLЗначение(Тип("Дата"), СтруктураПараметров.DetectionTime); КонецЕсли; - #КонецЕсли +#КонецЕсли Если СтруктураПараметров.Свойство("RepoPath") Тогда АдресРепозитория = СтруктураПараметров.RepoPath; @@ -663,20 +663,6 @@ УсловноеОформление.Элементы.Очистить(); - #Область СтатусНеобходимАнализ - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОбработчикиОбновленияСтатусПроблемы.Имя); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Элементы.ОбработчикиОбновленияСтатусПроблемы.ПутьКДанным); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ОтборЭлемента.ПравоеЗначение = СтатусНеобходимАнализ; - - Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветОсобогоТекста); - #КонецОбласти - #Область СтатусИзмененаПроцедураПроверки Элемент = УсловноеОформление.Элементы.Добавить(); @@ -684,11 +670,55 @@ ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОбработчикиОбновленияСтатусПроблемы.Имя); ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ОбработчикиОбновления.ИзмененаПроцедураПроверки"); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Элементы.ОбработчикиОбновленияИзмененаПроцедураПроверки.ПутьКДанным); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; - Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Изменена процедура проверки'")); + Элемент.Оформление.УстановитьЗначениеПараметра("Текст", СтатусИзмененаПроцедураПроверки); + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Золотистый); + #КонецОбласти + + #Область СтатусЧтениеНизкогоПорядка + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОбработчикиОбновленияСтатусПроблемы.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Элементы.ОбработчикиОбновленияЧтениеНизкогоПорядка.ПутьКДанным); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("Текст", СтатусЧтениеНизкогоПорядка); + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветОсобогоТекста); + #КонецОбласти + + #Область СтатусНеобходимАнализ + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОбработчикиОбновленияСтатусПроблемы.Имя); + + ГруппаИ = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); + + ОтборЭлемента = ГруппаИ.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Элементы.ОбработчикиОбновленияЗаданПорядокВыполнения.ПутьКДанным); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Ложь; + + ГруппаИЛИ = ГруппаИ.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); + + ОтборЭлемента = ГруппаИЛИ.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Элементы.ОбработчикиОбновленияЗаписьЧитаемых.ПутьКДанным); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + ОтборЭлемента = ГруппаИЛИ.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Элементы.ОбработчикиОбновленияПовторнаяЗапись.ПутьКДанным); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветОсобогоТекста); #КонецОбласти #Область ТехническийПроект @@ -1357,6 +1387,7 @@ ТабЧасти.Вставить("ИзменяемыеОбъекты", Объект.ИзменяемыеОбъекты.Выгрузить(Отбор)); ТабЧасти.Вставить("БлокируемыеОбъекты", Объект.БлокируемыеОбъекты.Выгрузить(Отбор)); ТабЧасти.Вставить("ПриоритетыВыполнения", Объект.ПриоритетыВыполнения.Выгрузить(Отбор)); + ТабЧасти.Вставить("ЧтениеНизкогоПорядка", Объект.ЧтениеНизкогоПорядка.Выгрузить(Отбор)); Отбор = Новый Структура("ОбработчикПисатель", СсылкаОбработчика); ТабЧасти.Вставить("КонфликтыОбработчиков", Объект.КонфликтыОбработчиков.Выгрузить(Отбор)); @@ -1562,20 +1593,21 @@ МассивСтрок = Новый Массив; ПрочиеБыстрыеОтборы.Очистить(); - ДобавитьБыстрыйОтбор(ОписаниеОбработчиков, МассивСтрок, "СтатусПроблемы", СтатусНеобходимАнализ, ЦветаСтиля.ЦветОсобогоТекста); - ДобавитьБыстрыйОтбор(ОписаниеОбработчиков, МассивСтрок, "ИзмененаПроцедураПроверки", НСтр("ru = 'Изменена процедура проверки'"), WebЦвета.Золотистый); - ДобавитьБыстрыйОтбор(ОписаниеОбработчиков, МассивСтрок, "РежимВыполнения", НСтр("ru = 'Отложенно'")); - ДобавитьБыстрыйОтбор(ОписаниеОбработчиков, МассивСтрок, "РежимВыполнения", НСтр("ru = 'Монопольно'")); - ДобавитьБыстрыйОтбор(ОписаниеОбработчиков, МассивСтрок, "РежимВыполнения", НСтр("ru = 'Оперативно'")); - ДобавитьБыстрыйОтбор(ОписаниеОбработчиков, МассивСтрок, "ТехническийПроект", НСтр("ru = 'Тех.проект'")); + ДобавитьБыстрыйОтбор(ОписаниеОбработчиков, МассивСтрок, "СтатусПроблемы", СтатусНеобходимАнализ, "НеобходимАнализ", ЦветаСтиля.ЦветОсобогоТекста); + ДобавитьБыстрыйОтбор(ОписаниеОбработчиков, МассивСтрок, "ЧтениеНизкогоПорядка", СтатусЧтениеНизкогоПорядка, "ЧтениеНизкогоПорядка", ЦветаСтиля.ЦветОсобогоТекста); + ДобавитьБыстрыйОтбор(ОписаниеОбработчиков, МассивСтрок, "ИзмененаПроцедураПроверки", СтатусИзмененаПроцедураПроверки, "ИзмененаПроцедураПроверки", WebЦвета.Золотистый); + ДобавитьБыстрыйОтбор(ОписаниеОбработчиков, МассивСтрок, "РежимВыполнения", НСтр("ru = 'Отложенно'"), "Отложенно"); + ДобавитьБыстрыйОтбор(ОписаниеОбработчиков, МассивСтрок, "РежимВыполнения", НСтр("ru = 'Монопольно'"), "Монопольно"); + ДобавитьБыстрыйОтбор(ОписаниеОбработчиков, МассивСтрок, "РежимВыполнения", НСтр("ru = 'Оперативно'"), "Оперативно"); + ДобавитьБыстрыйОтбор(ОписаниеОбработчиков, МассивСтрок, "ТехническийПроект", НСтр("ru = 'Тех.проект'"), "ТехническийПроект"); - ДобавитьПрочийБыстрыйОтбор(ОписаниеОбработчиков, "РежимВыполненияОтложенныхОбработчиков", НСтр("ru = 'Параллельно'")); - ДобавитьПрочийБыстрыйОтбор(ОписаниеОбработчиков, "РежимВыполненияОтложенныхОбработчиков", НСтр("ru = 'Последовательно'")); - ДобавитьПрочийБыстрыйОтбор(ОписаниеОбработчиков, "НачальноеЗаполнение", НСтр("ru = 'Начальное заполнение'")); - ДобавитьПрочийБыстрыйОтбор(ОписаниеОбработчиков, "ВыполнятьВГруппеОбязательных", НСтр("ru = 'Обязательный'")); - ДобавитьПрочийБыстрыйОтбор(ОписаниеОбработчиков, "Многопоточный", НСтр("ru = 'Многопоточный'")); - ДобавитьПрочийБыстрыйОтбор(ОписаниеОбработчиков, "ЗаписьЧитаемых", НСтр("ru = 'Запись читаемых'")); - ДобавитьПрочийБыстрыйОтбор(ОписаниеОбработчиков, "ПовторнаяЗапись", НСтр("ru = 'Повторная запись'")); + ДобавитьПрочийБыстрыйОтбор(ОписаниеОбработчиков, "РежимВыполненияОтложенныхОбработчиков", НСтр("ru = 'Параллельно'"), "Параллельно"); + ДобавитьПрочийБыстрыйОтбор(ОписаниеОбработчиков, "РежимВыполненияОтложенныхОбработчиков", НСтр("ru = 'Последовательно'"), "Последовательно"); + ДобавитьПрочийБыстрыйОтбор(ОписаниеОбработчиков, "НачальноеЗаполнение", НСтр("ru = 'Начальное заполнение'"), "НачальноеЗаполнение"); + ДобавитьПрочийБыстрыйОтбор(ОписаниеОбработчиков, "ВыполнятьВГруппеОбязательных", НСтр("ru = 'Обязательный'"), "Обязательный"); + ДобавитьПрочийБыстрыйОтбор(ОписаниеОбработчиков, "Многопоточный", НСтр("ru = 'Многопоточный'"), "Многопоточный"); + ДобавитьПрочийБыстрыйОтбор(ОписаниеОбработчиков, "ЗаписьЧитаемых", НСтр("ru = 'Запись читаемых'"), "ЗаписьЧитаемых"); + ДобавитьПрочийБыстрыйОтбор(ОписаниеОбработчиков, "ПовторнаяЗапись", НСтр("ru = 'Повторная запись'"), "ПовторнаяЗапись"); ТекстСтатуса = НСтр("ru = 'Прочие'"); СтрокаГиперссылки = Новый ФорматированнаяСтрока( @@ -1600,7 +1632,7 @@ КонецПроцедуры &НаСервере -Процедура ДобавитьБыстрыйОтбор(ОписаниеОбработчиков, МассивСтрок, ИмяПоляОтбора, Знач ЗначениеОтбора, Знач Цвет = Неопределено) +Процедура ДобавитьБыстрыйОтбор(ОписаниеОбработчиков, МассивСтрок, ИмяПоляОтбора, Знач ЗначениеОтбора, ИдентификаторСсылки, Знач Цвет = Неопределено) Если Цвет = Неопределено Тогда Цвет = ЦветаСтиля.ЦветТекстаКнопки; @@ -1624,7 +1656,7 @@ ТекстСтатуса, , Цвет, , - СтрЗаменить(ТРег(ПредставлениеОтбора)," ","")); + ИдентификаторСсылки); МассивСтрок.Добавить(СтрокаГиперссылки); МассивСтрок.Добавить(" "); @@ -1633,7 +1665,7 @@ КонецПроцедуры &НаСервере -Процедура ДобавитьПрочийБыстрыйОтбор(ОписаниеОбработчиков, ИмяПоляОтбора, Знач ЗначениеОтбора) +Процедура ДобавитьПрочийБыстрыйОтбор(ОписаниеОбработчиков, ИмяПоляОтбора, Знач ЗначениеОтбора, ИдентификаторСсылки) ПредставлениеОтбора = ЗначениеОтбора; Для Каждого ТипПоля Из ОписаниеОбработчиков.Колонки[ИмяПоляОтбора].ТипЗначения.Типы() Цикл @@ -1647,7 +1679,7 @@ СтрокиОтбора = ОписаниеОбработчиков.Скопировать(Отбор); Если СтрокиОтбора.Количество() > 0 Тогда ТекстСтатуса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 (%2)", ПредставлениеОтбора, СтрокиОтбора.Количество()); - ПрочиеБыстрыеОтборы.Добавить(ИмяПоляОтбора, ТекстСтатуса); + ПрочиеБыстрыеОтборы.Добавить(ИдентификаторСсылки, ТекстСтатуса); КонецЕсли; КонецПроцедуры @@ -2554,6 +2586,10 @@ СтрокиОбработчика.Добавить("Обработчик.ЗапускатьИВПодчиненномУзлеРИБСФильтрами = Истина;"); КонецЕсли; + Если Обработчик.Порядок <> Перечисления.ПорядокОбработчиковОбновления.Обычный Тогда + СтрокиОбработчика.Добавить("Обработчик.Порядок = Перечисления.ПорядокОбработчиковОбновления."+Строка(Обработчик.Порядок)+";"); + КонецЕсли; + Если ПустаяСтрока(Обработчик.Комментарий)Тогда СтрокиОбработчика.Добавить("Обработчик.Комментарий = """";"); Иначе @@ -2573,6 +2609,11 @@ СтрокиОбработчика.Добавить(ТекстИзменяемыеОбъекты); КонецЕсли; + ТекстНовыеОбъекты = ТекстИнформацииОбОбъектах(Обработчик, "НовыеОбъекты", РазметкаКода, ТэгиОбработчика); + Если НЕ ПустаяСтрока(ТекстНовыеОбъекты) Тогда + СтрокиОбработчика.Добавить(ТекстНовыеОбъекты); + КонецЕсли; + Если ОтложенныйРежимВыполнения Тогда ТекстБлокируемыеОбъекты = ТекстИнформацииОбОбъектах(Обработчик, "БлокируемыеОбъекты", РазметкаКода, ТэгиОбработчика); Если НЕ ПустаяСтрока(ТекстБлокируемыеОбъекты) Тогда @@ -3640,7 +3681,7 @@ ПрочитатьСтрокиYAML(Результат, ТекстФайла); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстСообщения = Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось прочитать файл %1.'"), ИмяФайла); ТекстСообщения = ТекстСообщения + Символы.ПС + НСтр("ru = 'По причине'")+":" + Символы.ПС; ТекстСообщения = ТекстСообщения + ТекстОшибки; @@ -3701,7 +3742,7 @@ КонецЦикла; Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстСообщения = Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось разобрать строку: %1'"), СтрокаФайла); ТекстСообщения = ТекстСообщения + Символы.ПС + НСтр("ru = 'По причине'")+":" + Символы.ПС; ТекстСообщения = ТекстСообщения + ТекстОшибки; @@ -3784,7 +3825,7 @@ Ошибка.ОбъектМетаданных = ИмяОбъекта; Если ИнформацияОбОшибке <> Неопределено Тогда - Ошибка.ИсходнаяИнформация = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + Ошибка.ИсходнаяИнформация = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); КонецЕсли; Если ЗначениеЗаполнено(ДополнениеТекстаОшибки) Тогда @@ -4031,7 +4072,7 @@ Процедура ЗаписатьИнформациюОбОшибке(ФайлРезультата) Если ЗначениеЗаполнено(ФайлРезультата) Тогда - ТекстСообщения = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстСообщения = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); Результат = Новый ТекстовыйДокумент; Результат.УстановитьТекст(ТекстСообщения); Результат.Записать(ФайлРезультата); @@ -4047,8 +4088,9 @@ Обработка = ОбъектОбработки(); - СтатусНетПроблем = Обработка.СтатусНетПроблем; - СтатусНеобходимАнализ = Обработка.СтатусНеобходимАнализ; + СтатусНеобходимАнализ = НСтр("ru = 'Необходим анализ'"); + СтатусИзмененаПроцедураПроверки = НСтр("ru = 'Изменена процедура проверки'"); + СтатусЧтениеНизкогоПорядка = НСтр("ru = 'Чтение низкого порядка'"); РазрабатываемыеПодсистемы = Новый ФиксированныйМассив(Обработка.РазрабатываемыеПодсистемы()); МножественноеЧисло = Новый ФиксированноеСоответствие(Обработка.МножественноеЧисло); @@ -4338,48 +4380,56 @@ &НаКлиенте Процедура УстановитьБыстрыйОтбор(ИмяБыстрогоОтбора) - Если ИмяБыстрогоОтбора = СтрЗаменить(ТРег(СтатусНеобходимАнализ), " ", "") Тогда + Если ТипЗнч(ИмяБыстрогоОтбора) = Тип("ЭлементСпискаЗначений") Тогда + ИмяБыстрогоОтбора = ИмяБыстрогоОтбора.Значение; + КонецЕсли; + + Если ИмяБыстрогоОтбора = "НеобходимАнализ" Тогда Отбор = Новый Структура("СтатусПроблемы", СтатусНеобходимАнализ); - ИначеЕсли ИмяБыстрогоОтбора = НСтр("ru = 'Отложенно'") Тогда + ИначеЕсли ИмяБыстрогоОтбора = "Отложенно" Тогда Отбор = Новый Структура("РежимВыполнения", НСтр("ru = 'Отложенно'")); - ИначеЕсли ИмяБыстрогоОтбора = НСтр("ru = 'Монопольно'") Тогда + ИначеЕсли ИмяБыстрогоОтбора = "Монопольно" Тогда Отбор = Новый Структура("РежимВыполнения", НСтр("ru = 'Монопольно'")); - ИначеЕсли ИмяБыстрогоОтбора = НСтр("ru = 'Оперативно'") Тогда + ИначеЕсли ИмяБыстрогоОтбора = "Оперативно" Тогда Отбор = Новый Структура("РежимВыполнения", НСтр("ru = 'Оперативно'")); - ИначеЕсли ИмяБыстрогоОтбора = НСтр("ru = 'Последовательно'") Тогда + ИначеЕсли ИмяБыстрогоОтбора = "Последовательно" Тогда Отбор = Новый Структура("РежимВыполненияОтложенныхОбработчиков", НСтр("ru = 'Последовательно'")); - ИначеЕсли ИмяБыстрогоОтбора = НСтр("ru = 'Параллельно'") Тогда + ИначеЕсли ИмяБыстрогоОтбора = "Параллельно" Тогда Отбор = Новый Структура("РежимВыполненияОтложенныхОбработчиков", НСтр("ru = 'Параллельно'")); - ИначеЕсли СтрНайти(ИмяБыстрогоОтбора, НСтр("ru = 'Начальное заполнение'")) > 0 Тогда + ИначеЕсли ИмяБыстрогоОтбора = "НачальноеЗаполнение" Тогда Отбор = Новый Структура("НачальноеЗаполнение", Истина); ИначеЕсли ИмяБыстрогоОтбора = "ИзмененаПроцедураПроверки" Тогда Отбор = Новый Структура("ИзмененаПроцедураПроверки", Истина); - ИначеЕсли СтрНайти(ИмяБыстрогоОтбора, НСтр("ru = 'Обязательный'")) > 0 Тогда + ИначеЕсли ИмяБыстрогоОтбора = "ЧтениеНизкогоПорядка" Тогда + Отбор = Новый Структура("ЧтениеНизкогоПорядка", Истина); + + ИначеЕсли ИмяБыстрогоОтбора = "Обязательный" Тогда Отбор = Новый Структура("ВыполнятьВГруппеОбязательных", Истина); - ИначеЕсли СтрНайти(ИмяБыстрогоОтбора, НСтр("ru = 'Многопоточный'")) > 0 Тогда + ИначеЕсли ИмяБыстрогоОтбора = "Многопоточный" Тогда Отбор = Новый Структура("Многопоточный", Истина); - ИначеЕсли СтрНайти(ИмяБыстрогоОтбора, НСтр("ru = 'Запись читаемых'")) > 0 Тогда + ИначеЕсли ИмяБыстрогоОтбора = "ЗаписьЧитаемых" Тогда Отбор = Новый Структура("ЗаписьЧитаемых", Истина); - ИначеЕсли СтрНайти(ИмяБыстрогоОтбора, НСтр("ru = 'Повторная запись'")) > 0 Тогда + ИначеЕсли ИмяБыстрогоОтбора = "ПовторнаяЗапись" Тогда Отбор = Новый Структура("ПовторнаяЗапись", Истина); - ИначеЕсли СтрНайти(ИмяБыстрогоОтбора, НСтр("ru = 'Тех.проект'")) > 0 Тогда + ИначеЕсли ИмяБыстрогоОтбора = "ТехническийПроект" Тогда Отбор = Новый Структура("ТехническийПроект", Истина); Иначе ОтключитьОтборОбработчиков("СтатусПроблемы"); ОтключитьОтборОбработчиков("ИзмененаПроцедураПроверки"); + ОтключитьОтборОбработчиков("ЧтениеНизкогоПорядка"); ОтключитьОтборОбработчиков("РежимВыполнения"); ОтключитьОтборОбработчиков("РежимВыполненияОтложенныхОбработчиков"); ОтключитьОтборОбработчиков("НачальноеЗаполнение"); @@ -4398,19 +4448,17 @@ &НаСервере Функция ЗаполнитьПолеОтбораПоОбъектуНаСервере(ИмяТабличнойЧасти, Текст) - ТекстЗапроса = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | Т.Ссылка КАК Ссылка - |ПОМЕСТИТЬ вт - |ИЗ - | &тз КАК Т - |ГДЕ - | Т.ОбъектМетаданных ПОДОБНО &СтрокаПоиска"; - - Запрос = Новый Запрос(ТекстЗапроса); + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | Т.Ссылка КАК Ссылка + |ПОМЕСТИТЬ вт + |ИЗ + | &тз КАК Т + |ГДЕ + | Т.ОбъектМетаданных ПОДОБНО &СтрокаПоиска СПЕЦСИМВОЛ ""~"""); Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.УстановитьПараметр("тз", Объект[ИмяТабличнойЧасти].Выгрузить()); - Запрос.УстановитьПараметр("СтрокаПоиска", "%" + Текст + "%"); + Запрос.УстановитьПараметр("СтрокаПоиска", "%" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(Текст) + "%"); Запрос.Выполнить(); УникальныеСсылки = Запрос.МенеджерВременныхТаблиц.Таблицы["вт"].ПолучитьДанные().Выгрузить().ВыгрузитьКолонку("Ссылка"); @@ -4424,8 +4472,7 @@ КонецЦикла; КонецЦикла; - Отбор = Новый Структура(ИмяПоляОтбора, Текст); - + Отбор = Новый Структура(ИмяПоляОтбора, Текст); Возврат Отбор; КонецФункции @@ -4519,6 +4566,8 @@ ДанныеТЧ.Сортировать("Процедура1,Процедура2"); ИначеЕсли ТЧ.Имя = "КонфликтыОбработчиков" Тогда ДанныеТЧ.Сортировать("ОбъектМетаданных,ПроцедураПисатель,ПроцедураЧитательИлиПисатель2"); + ИначеЕсли ТЧ.Имя = "ЧтениеНизкогоПорядка" Тогда + ДанныеТЧ.Сортировать("ОбъектМетаданных,ПроцедураЧитатель,ПроцедураПисатель"); КонецЕсли; ТабДок = Новый ТабличныйДокумент; Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ДанныеТЧ); @@ -4567,6 +4616,10 @@ ДанныеТЧ2 = Объект[ИмяТЧ].Выгрузить(Отбор); ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(ДанныеТЧ2, ДанныеТЧ); + ИначеЕсли ИмяТЧ = "ЧтениеНизкогоПорядка" Тогда + Отбор = Новый Структура("Читатель", Ссылка); + ДанныеТЧ = Объект[ИмяТЧ].Выгрузить(Отбор); + КонецЕсли; Возврат ДанныеТЧ; diff --git a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/ObjectModule.bsl b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/ObjectModule.bsl index 8a24919b4..2badd210f 100644 --- a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/ObjectModule.bsl @@ -10,8 +10,6 @@ #Область ОписаниеПеременных -Перем СтатусНетПроблем Экспорт; -Перем СтатусНеобходимАнализ Экспорт; Перем МножественноеЧисло Экспорт; Перем ЕдинственноеЧисло Экспорт; Перем МодулиПодсистем Экспорт; @@ -171,12 +169,16 @@ Конфликты = РезультатЗапросов[ИндексПоследнегоЗапроса-2].Выгрузить(); КонфликтыОбработчиков.Загрузить(Конфликты); - ПорядкиНеРавны = 0; + ЧтениеПорядка = РезультатЗапросов[ИндексПоследнегоЗапроса-3].Выгрузить(); + ЧтениеНизкогоПорядка.Загрузить(ЧтениеПорядка); + + ПриоритетыПоЗаписи = 0; НеПоПриоритетуЗаписи = 0; ОбработчикиПоЗаписи = Новый Соответствие; ОбработчикиНеПоЗаписи = Новый СписокЗначений; ВсегоРазрабатываемыхОбъектов = 0; + ПорядкиНеРавны = 0; НеЛюбойПорядок = 0; ИнверсныйПорядок = 0; РазрабатываемыеПодсистемы = РазрабатываемыеПодсистемы(); @@ -360,9 +362,6 @@ Процедура ИнициализацияКонстант() - СтатусНетПроблем = НСтр("ru = 'Нет проблем'"); - СтатусНеобходимАнализ = НСтр("ru = 'Необходим анализ'"); - МножественноеЧисло = Новый Соответствие; МножественноеЧисло.Вставить("Константа", "Константы"); МножественноеЧисло.Вставить("Справочник", "Справочники"); @@ -411,12 +410,17 @@ НовоеОписание.ПорядокБиблиотеки = ДополнительныеСведения.ПорядокБиблиотеки; НовоеОписание.ИмяОбъекта = СтрСоединить(Имена,"."); НовоеОписание.РежимВыполненияОтложенныхОбработчиков = ДополнительныеСведения.РежимВыполненияОтложенныхОбработчиков; + НовоеОписание.Порядок = ОписаниеОбработчика.Порядок; + Если НЕ ЗначениеЗаполнено(НовоеОписание.Порядок) Тогда + НовоеОписание.Порядок = ДополнительныеСведения.Порядок; + КонецЕсли; НовоеОписание.ВерсияЧислом = ВерсияЧислом(ОписаниеОбработчика.Версия); ЗаполнитьВерсиюРедакции(НовоеОписание); ЗагрузитьОбъектыОбработчика("ЧитаемыеОбъекты", НовоеОписание.Ссылка, ОписаниеОбработчика.ЧитаемыеОбъекты); ЗагрузитьОбъектыОбработчика("ИзменяемыеОбъекты", НовоеОписание.Ссылка, ОписаниеОбработчика.ИзменяемыеОбъекты); ЗагрузитьОбъектыОбработчика("БлокируемыеОбъекты",НовоеОписание.Ссылка, ОписаниеОбработчика.БлокируемыеОбъекты); + ЗагрузитьОбъектыОбработчика("НовыеОбъекты",НовоеОписание.Ссылка, ОписаниеОбработчика.НовыеОбъекты); ЗагрузитьПриоритетыОбработчика(НовоеОписание.Ссылка, ОписаниеОбработчика.ПриоритетыВыполнения); КонецЦикла; @@ -432,12 +436,17 @@ Для Каждого ИмяОбъекта Из ИменаОбъектов Цикл Если ИмяТабличнойЧасти = "БлокируемыеОбъекты" Тогда - ВзведенФлагБлокировки = ВзвестиФлагБлокировки("ИзменяемыеОбъекты", ИмяОбъекта, СсылкаОбработчика); + ВзведенФлагБлокировки = ВзвестиФлаг("БлокироватьИнтерфейс", "ИзменяемыеОбъекты", ИмяОбъекта, СсылкаОбработчика); Если НЕ ВзведенФлагБлокировки Тогда - ВзведенФлагБлокировки = ВзвестиФлагБлокировки("ЧитаемыеОбъекты", ИмяОбъекта, СсылкаОбработчика); + ВзведенФлагБлокировки = ВзвестиФлаг("БлокироватьИнтерфейс", "ЧитаемыеОбъекты", ИмяОбъекта, СсылкаОбработчика); КонецЕсли; КонецЕсли; + Если ИмяТабличнойЧасти = "НовыеОбъекты" Тогда + ВзвестиФлаг("НовыеОбъекты", "ИзменяемыеОбъекты", ИмяОбъекта, СсылкаОбработчика); + Продолжить; + КонецЕсли; + Если ИмяТабличнойЧасти <> "БлокируемыеОбъекты" ИЛИ НЕ ВзведенФлагБлокировки Тогда ТабличнаяЧасть = ЭтотОбъект[ИмяТабличнойЧасти]; // см. Обработка.ОписаниеОбработчиковОбновления.ЧитаемыеОбъекты НовоеОписание = ТабличнаяЧасть.Добавить(); @@ -452,12 +461,12 @@ КонецПроцедуры -Функция ВзвестиФлагБлокировки(ИмяТЧ, ИмяОбъекта, СсылкаОбработчика) +Функция ВзвестиФлаг(ИмяФлага, ИмяТЧ, ИмяОбъекта, СсылкаОбработчика) Отбор = Новый Структура("Ссылка,ОбъектМетаданных", СсылкаОбработчика, ИмяОбъекта); НайденныеОбъекты = ЭтотОбъект[ИмяТЧ].НайтиСтроки(Отбор); Для Каждого НайденныйОбъект Из НайденныеОбъекты Цикл - НайденныйОбъект.БлокироватьИнтерфейс = Истина; + НайденныйОбъект[ИмяФлага] = Истина; КонецЦикла; Возврат НайденныеОбъекты.Количество() > 0; @@ -520,12 +529,11 @@ Функция ТекстЗапросаОбновленияДанныхОКонфликтах() - ТекстУничтожения = - "УНИЧТОЖИТЬ КонфликтыОбработчиков;"; + ТекстУничтожения = "УНИЧТОЖИТЬ КонфликтыОбработчиков"; - Текст = ТекстУничтожения + " - - |ВЫБРАТЬ + #Область ТекстПересечениеОбработчиков + ТекстПересечениеОбработчиков = + "ВЫБРАТЬ | Т.ОбъектМетаданных КАК ОбъектМетаданных, | Т.ОбработчикПисатель КАК ОбработчикПисатель, | МИНИМУМ(ПриоритетыОбновления1.ПорядокТипа) КАК ПорядокТипа1, @@ -556,6 +564,7 @@ | ГДЕ | ИзменяемыеОбъекты.РежимВыполненияОтложенныхОбработчиков = &Параллельно | И ИзменяемыеОбъекты.РежимВыполнения = &Отложенно + | И НЕ ИзменяемыеОбъекты.НовыеОбъекты | И ЧитаемыеОбъектыДругимиОбработчиками.РежимВыполненияОтложенныхОбработчиков = &Параллельно | И ЧитаемыеОбъектыДругимиОбработчиками.РежимВыполнения = &Отложенно | @@ -579,6 +588,7 @@ | ГДЕ | ИзменяемыеОбъекты.РежимВыполненияОтложенныхОбработчиков = &Параллельно | И ИзменяемыеОбъекты.РежимВыполнения = &Отложенно + | И НЕ ИзменяемыеОбъекты.НовыеОбъекты | И ИзменяемыеОбъектыДругимиОбработчиками.РежимВыполненияОтложенныхОбработчиков = &Параллельно | И ИзменяемыеОбъектыДругимиОбработчиками.РежимВыполнения = &Отложенно | @@ -595,11 +605,12 @@ | |ИНДЕКСИРОВАТЬ ПО | ОбработчикПисатель, - | ОбработчикЧитательИлиПисатель2 - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ + | ОбработчикЧитательИлиПисатель2"; + #КонецОбласти + + #Область ТекстВтКонфликты + ТекстВтКонфликты = + "ВЫБРАТЬ | Т.ОбработчикПисатель КАК ОбработчикПисатель, | Т.ОбработчикЧитательИлиПисатель2 КАК ОбработчикЧитательИлиПисатель2, | МИНИМУМ(Т.ПорядокТипа1) КАК ПорядокТипа1, @@ -643,11 +654,12 @@ | |ИНДЕКСИРОВАТЬ ПО | ОбработчикПисатель, - | ОбработчикЧитательИлиПисатель2 - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ОбработчикЧитательИлиПисатель2"; + #КонецОбласти + + #Область втПриоритетыПоЗаписи + втПриоритетыПоЗаписи = + "ВЫБРАТЬ РАЗЛИЧНЫЕ | Конфликты.ОбработчикПисатель КАК ОбработчикПисатель, | Конфликты.ОбработчикЧитательИлиПисатель2 КАК ОбработчикЧитательИлиПисатель2, | Конфликты.ПриоритетЗаписи КАК ПриоритетЗаписи @@ -659,11 +671,12 @@ | |ИНДЕКСИРОВАТЬ ПО | ОбработчикПисатель, - | ОбработчикЧитательИлиПисатель2 - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ОбработчикЧитательИлиПисатель2"; + #КонецОбласти + + #Область ТекстВтПриоритеты + ТекстВтПриоритеты = + "ВЫБРАТЬ РАЗЛИЧНЫЕ | Конфликты.ОбработчикПисатель КАК ОбработчикПисатель, | Конфликты.ОбработчикЧитательИлиПисатель2 КАК ОбработчикЧитательИлиПисатель2, | Конфликты.ЗаписьЧитаемых КАК ЗаписьЧитаемых, @@ -674,6 +687,13 @@ | КонфликтыЗеркально.ЭтоЧитатель КАК ЭтоЧитатель2, | Конфликты.ПорядокТипа1 КАК ПорядокТипа1, | Конфликты.ПорядокТипа2 КАК ПорядокТипа2, + | ЕСТЬNULL(Обработчики1.РедакцияЧислом, 0) КАК РедакцияЧислом1, + | ЕСТЬNULL(Обработчики2.РедакцияЧислом, 0) КАК РедакцияЧислом2, + | ЕСТЬNULL(Обработчики1.ВерсияЧислом, 0) КАК ВерсияЧислом1, + | ЕСТЬNULL(Обработчики2.ВерсияЧислом, 0) КАК ВерсияЧислом2, + | ЕСТЬNULL(Обработчики1.ПорядокБиблиотеки, 0) КАК ПорядокБиблиотеки1, + | ЕСТЬNULL(Обработчики2.ПорядокБиблиотеки, 0) КАК ПорядокБиблиотеки2, + | | ВЫБОР КОГДА ЕСТЬNULL(Приоритеты.Порядок, &ПустаяСтрока) = ЕСТЬNULL(ПриоритетыНаоборот.Порядок, &ПустаяСтрока) | И ЕСТЬNULL(Приоритеты.Порядок, &ПустаяСтрока) <> &Любой | ТОГДА &ПустаяСтрока @@ -699,6 +719,7 @@ | ТОГДА &До | КОГДА НЕ ПриоритетыПоЗаписиЗеркально.ПриоритетЗаписи ЕСТЬ NULL | ТОГДА &После + | | КОГДА Конфликты.ПорядокТипа1 = Конфликты.ПорядокТипа2 И Конфликты.ПовторнаяЗапись | ИЛИ Конфликты.ПорядокТипа1 = Конфликты.ПорядокТипа2 И Конфликты.ЭтоЧитатель = КонфликтыЗеркально.ЭтоЧитатель | ТОГДА &Любой @@ -708,6 +729,13 @@ | КОГДА Конфликты.ПорядокТипа1 < Конфликты.ПорядокТипа2 | ИЛИ (Конфликты.ПорядокТипа1 = Конфликты.ПорядокТипа2 И Конфликты.ЭтоЧитатель) | ТОГДА &До + | + | КОГДА ЕСТЬNULL(Обработчики1.ПорядокБиблиотеки, 0) = ЕСТЬNULL(Обработчики2.ПорядокБиблиотеки, 0) + | И ЕСТЬNULL(Обработчики1.ВерсияЧислом, 0) > ЕСТЬNULL(Обработчики2.ВерсияЧислом, 0) + | ТОГДА &После + | КОГДА ЕСТЬNULL(Обработчики1.ПорядокБиблиотеки, 0) = ЕСТЬNULL(Обработчики2.ПорядокБиблиотеки, 0) + | И ЕСТЬNULL(Обработчики1.ВерсияЧислом, 0) < ЕСТЬNULL(Обработчики2.ВерсияЧислом, 0) + | ТОГДА &До | ИНАЧЕ | &ПустаяСтрока | КОНЕЦ КАК ПорядокАвто @@ -730,17 +758,30 @@ | ПО Конфликты.ОбработчикПисатель = ПриоритетыПоЗаписиЗеркально.ОбработчикЧитательИлиПисатель2 | И Конфликты.ОбработчикЧитательИлиПисатель2 = ПриоритетыПоЗаписиЗеркально.ОбработчикПисатель | + | ЛЕВОЕ СОЕДИНЕНИЕ Обработчики КАК Обработчики1 + | ПО Конфликты.ОбработчикПисатель = Обработчики1.Ссылка + | + | ЛЕВОЕ СОЕДИНЕНИЕ Обработчики КАК Обработчики2 + | ПО Конфликты.ОбработчикЧитательИлиПисатель2 = Обработчики2.Ссылка + | |ИНДЕКСИРОВАТЬ ПО | ОбработчикПисатель, - | ОбработчикЧитательИлиПисатель2 - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ОбработчикЧитательИлиПисатель2"; + #КонецОбласти + + #Область ТекстНовыеПриоритеты + ТекстНовыеПриоритеты = + "ВЫБРАТЬ РАЗЛИЧНЫЕ | Приоритеты.ОбработчикПисатель КАК ОбработчикПисатель, | Приоритеты.ОбработчикЧитательИлиПисатель2 КАК ОбработчикЧитательИлиПисатель2, | ЕСТЬNULL(Обработчики1.ОчередьОтложеннойОбработки, """") КАК Очередь1, | ЕСТЬNULL(Обработчики2.ОчередьОтложеннойОбработки, """") КАК Очередь2, + | Приоритеты.РедакцияЧислом1 КАК РедакцияЧислом1, + | Приоритеты.РедакцияЧислом2 КАК РедакцияЧислом2, + | Приоритеты.ВерсияЧислом1 КАК ВерсияЧислом1, + | Приоритеты.ВерсияЧислом2 КАК ВерсияЧислом2, + | Приоритеты.ПорядокБиблиотеки1 КАК ПорядокБиблиотеки1, + | Приоритеты.ПорядокБиблиотеки2 КАК ПорядокБиблиотеки2, | Приоритеты.ЗаписьЧитаемых КАК ЗаписьЧитаемых, | Приоритеты.ЗаписьЧитаемых2 КАК ЗаписьЧитаемых2, | Приоритеты.ПовторнаяЗапись КАК ПовторнаяЗапись, @@ -813,33 +854,91 @@ | |ИНДЕКСИРОВАТЬ ПО | ОбработчикПисатель, - | ОбработчикЧитательИлиПисатель2 - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | Проблемы.ОбработчикПисатель КАК Обработчик, + | ОбработчикЧитательИлиПисатель2"; + #КонецОбласти + + #Область ТекстВтЧтениеНизкогоПорядка + ТекстВтЧтениеНизкогоПорядка = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | Читаемые.ОбъектМетаданных КАК ОбъектМетаданных, + | Читаемые.Порядок КАК ПорядокЧитатель, + | Изменяемые.Порядок КАК ПорядокПисатель, + | Читаемые.Ссылка КАК Читатель, + | Изменяемые.Ссылка КАК Писатель, + | Читаемые.Процедура КАК ПроцедураЧитатель, + | Изменяемые.Процедура КАК ПроцедураПисатель + | + |ПОМЕСТИТЬ ВтЧтениеНизкогоПорядка + |ИЗ ЧитаемыеОбъекты КАК Читаемые + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИзменяемыеОбъекты КАК Изменяемые + | ПО Читаемые.ОбъектМетаданных = Изменяемые.ОбъектМетаданных + |ГДЕ + | (Читаемые.Порядок = ЗНАЧЕНИЕ(Перечисление.ПорядокОбработчиковОбновления.Критичный) + | И Изменяемые.Порядок <> ЗНАЧЕНИЕ(Перечисление.ПорядокОбработчиковОбновления.Критичный)) + | ИЛИ (Читаемые.Порядок = ЗНАЧЕНИЕ(Перечисление.ПорядокОбработчиковОбновления.Обычный) + | И Изменяемые.Порядок = ЗНАЧЕНИЕ(Перечисление.ПорядокОбработчиковОбновления.Некритичный)) + |"; + #КонецОбласти + + #Область ТекстПроблемы + ТекстПроблемы = + "ВЫБРАТЬ + | Проблемы.Обработчик КАК Обработчик, | МАКСИМУМ(Проблемы.ЗаписьЧитаемых) КАК ЗаписьЧитаемых, | МАКСИМУМ(Проблемы.ПовторнаяЗапись) КАК ПовторнаяЗапись, - | МИНИМУМ(Проблемы.ЗаданПорядокВыполнения) КАК ЗаданПорядокВыполнения + | МИНИМУМ(Проблемы.ЗаданПорядокВыполнения) КАК ЗаданПорядокВыполнения, + | МАКСИМУМ(Проблемы.ЧтениеНизкогоПорядка) КАК ЧтениеНизкогоПорядка | |ПОМЕСТИТЬ Проблемы |ИЗ - | НовыеПриоритеты КАК Проблемы + | (ВЫБРАТЬ + | Проблемы.ОбработчикПисатель КАК Обработчик, + | Проблемы.ЗаписьЧитаемых КАК ЗаписьЧитаемых, + | Проблемы.ПовторнаяЗапись КАК ПовторнаяЗапись, + | Проблемы.ЗаданПорядокВыполнения КАК ЗаданПорядокВыполнения, + | ЛОЖЬ КАК ЧтениеНизкогоПорядка + | ИЗ + | НовыеПриоритеты КАК Проблемы + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЧтениеНизкогоПорядка.Читатель КАК Обработчик, + | ЛОЖЬ КАК ЗаписьЧитаемых, + | ЛОЖЬ КАК ПовторнаяЗапись, + | ИСТИНА КАК ЗаданПорядокВыполнения, + | ИСТИНА КАК ЧтениеНизкогоПорядка + | ИЗ + | ВтЧтениеНизкогоПорядка КАК ЧтениеНизкогоПорядка) КАК Проблемы | |СГРУППИРОВАТЬ ПО - | Проблемы.ОбработчикПисатель + | Проблемы.Обработчик | |ИНДЕКСИРОВАТЬ ПО - | Обработчик - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ + | Обработчик"; + #КонецОбласти + + #Область ТекстЧтениеНизкогоПорядка + ТекстЧтениеНизкогоПорядка = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЧтениеНизкогоПорядка.Читатель КАК Ссылка, + | ЧтениеНизкогоПорядка.ОбъектМетаданных КАК ОбъектМетаданных, + | ЧтениеНизкогоПорядка.ПорядокЧитатель КАК ПорядокЧитатель, + | ЧтениеНизкогоПорядка.ПорядокПисатель КАК ПорядокПисатель, + | ЧтениеНизкогоПорядка.Писатель КАК Писатель, + | ЧтениеНизкогоПорядка.ПроцедураЧитатель КАК ПроцедураЧитатель, + | ЧтениеНизкогоПорядка.ПроцедураПисатель КАК ПроцедураПисатель + | + |ИЗ ВтЧтениеНизкогоПорядка КАК ЧтениеНизкогоПорядка + |"; + #КонецОбласти + + #Область ТекстКонфликты + ТекстКонфликты = + "ВЫБРАТЬ | Конфликты.ОбъектМетаданных КАК ОбъектМетаданных, | Конфликты.ОбработчикПисатель КАК ОбработчикПисатель, | Конфликты.ОбработчикЧитательИлиПисатель2 КАК ОбработчикЧитательИлиПисатель2, - | Конфликты.ПриоритетЗаписи КАК ПриоритетЗаписи, | Конфликты.ЗаписьЧитаемых КАК ЗаписьЧитаемых, | Конфликты.ПовторнаяЗапись КАК ПовторнаяЗапись, | Конфликты.ЭтоЧитатель КАК ЭтоЧитатель, @@ -859,11 +958,12 @@ |УПОРЯДОЧИТЬ ПО | ОбъектМетаданных, | ПроцедураПисатель, - | ПроцедураЧитательИлиПисатель2 - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ + | ПроцедураЧитательИлиПисатель2"; + #КонецОбласти + + #Область ТекстПриоритеты + ТекстПриоритеты = + "ВЫБРАТЬ | Приоритеты.ОбработчикПисатель КАК Ссылка, | Приоритеты.ОбработчикЧитательИлиПисатель2 КАК Обработчик2, | Приоритеты.Порядок КАК Порядок, @@ -886,6 +986,12 @@ | Приоритеты.ЭтоЧитатель2 КАК ЭтоЧитатель2, | Приоритеты.ПорядокТипа1 КАК ПорядокТипа1, | Приоритеты.ПорядокТипа2 КАК ПорядокТипа2, + | Приоритеты.РедакцияЧислом1 КАК РедакцияЧислом1, + | Приоритеты.РедакцияЧислом2 КАК РедакцияЧислом2, + | Приоритеты.ВерсияЧислом1 КАК ВерсияЧислом1, + | Приоритеты.ВерсияЧислом2 КАК ВерсияЧислом2, + | Приоритеты.ПорядокБиблиотеки1 КАК ПорядокБиблиотеки1, + | Приоритеты.ПорядокБиблиотеки2 КАК ПорядокБиблиотеки2, | ЕСТЬNULL(ОбработчикиПисатели.Процедура, """") КАК Процедура1, | ЕСТЬNULL(ОбработчикиПисатели.Подсистема, """") КАК Подсистема1, | ЕСТЬNULL(ОбработчикиПисатели.Комментарий, """") КАК Комментарий1, @@ -902,11 +1008,12 @@ | |УПОРЯДОЧИТЬ ПО | Процедура1, - | Процедура2 - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ + | Процедура2"; + #КонецОбласти + + #Область ТекстОписание + ТекстОписание = + "ВЫБРАТЬ | Обработчики.Ссылка КАК Ссылка, | Обработчики.Подсистема КАК Подсистема, | Обработчики.ИмяОсновногоСерверногоМодуля КАК ИмяОсновногоСерверногоМодуля, @@ -933,17 +1040,14 @@ | Обработчики.ТехническийПроект КАК ТехническийПроект, | Обработчики.ИмяБиблиотеки КАК ИмяБиблиотеки, | Обработчики.ПорядокБиблиотеки КАК ПорядокБиблиотеки, + | Обработчики.Порядок КАК Порядок, | Обработчики.ИмяОбъекта КАК ИмяОбъекта, | Обработчики.РазрабатываемаяПодсистема КАК РазрабатываемаяПодсистема, | ЕСТЬNULL(Проблемы.ЗаписьЧитаемых, ЛОЖЬ) КАК ЗаписьЧитаемых, | ЕСТЬNULL(Проблемы.ПовторнаяЗапись, ЛОЖЬ) КАК ПовторнаяЗапись, | ЕСТЬNULL(Проблемы.ЗаданПорядокВыполнения, ЛОЖЬ) КАК ЗаданПорядокВыполнения, - | ВЫБОР - | КОГДА НЕ ЕСТЬNULL(Проблемы.ЗаданПорядокВыполнения, ЛОЖЬ) - | И (ЕСТЬNULL(Проблемы.ЗаписьЧитаемых, ЛОЖЬ) ИЛИ ЕСТЬNULL(Проблемы.ПовторнаяЗапись, ЛОЖЬ)) - | ТОГДА &НеобходимАнализ - | ИНАЧЕ &НетПроблем - | КОНЕЦ КАК СтатусПроблемы, + | ЕСТЬNULL(Проблемы.ЧтениеНизкогоПорядка, ЛОЖЬ) КАК ЧтениеНизкогоПорядка, + | &НетПроблем КАК СтатусПроблемы, | ВЫБОР | КОГДА Обработчики.ПроцедураПроверки <> """" | И Обработчики.ПроцедураПроверки <> &СтандартнаяПроцедураПроверки @@ -954,6 +1058,23 @@ | Обработчики КАК Обработчики | ЛЕВОЕ СОЕДИНЕНИЕ Проблемы КАК Проблемы | ПО Обработчики.Ссылка = Проблемы.Обработчик"; + #КонецОбласти + + МассивТекстов = Новый Массив; + МассивТекстов.Добавить(ТекстУничтожения); + МассивТекстов.Добавить(ТекстПересечениеОбработчиков); + МассивТекстов.Добавить(ТекстВтКонфликты); + МассивТекстов.Добавить(втПриоритетыПоЗаписи); + МассивТекстов.Добавить(ТекстВтПриоритеты); + МассивТекстов.Добавить(ТекстНовыеПриоритеты); + МассивТекстов.Добавить(ТекстВтЧтениеНизкогоПорядка); + МассивТекстов.Добавить(ТекстПроблемы); + МассивТекстов.Добавить(ТекстЧтениеНизкогоПорядка); + МассивТекстов.Добавить(ТекстКонфликты); + МассивТекстов.Добавить(ТекстПриоритеты); + МассивТекстов.Добавить(ТекстОписание); + + Текст = СтрСоединить(МассивТекстов, ОбщегоНазначения.РазделительПакетаЗапросов()); Возврат Текст; @@ -964,8 +1085,7 @@ Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.Текст = ТекстЗапросаВременныхТаблиц(); - Запрос.УстановитьПараметр("НеобходимАнализ", СтатусНеобходимАнализ); - Запрос.УстановитьПараметр("НетПроблем", СтатусНетПроблем); + Запрос.УстановитьПараметр("НетПроблем", НСтр("ru = 'Нет проблем'")); Запрос.УстановитьПараметр("СтандартнаяПроцедураПроверки", "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"); Запрос.УстановитьПараметр("До", "До"); Запрос.УстановитьПараметр("После", "После"); @@ -998,7 +1118,8 @@ | ЧитаемыеОбъекты.Ссылка КАК Ссылка, | ЧитаемыеОбъекты.ОбъектМетаданных КАК ОбъектМетаданных, | ЧитаемыеОбъекты.ПорядокТипа КАК ПорядокТипа, - | ЧитаемыеОбъекты.БлокироватьИнтерфейс КАК БлокироватьИнтерфейс + | ЧитаемыеОбъекты.БлокироватьИнтерфейс КАК БлокироватьИнтерфейс, + | &НовыеОбъекты КАК НовыеОбъекты |ПОМЕСТИТЬ втЧитаемыеОбъекты |ИЗ | &ЧитаемыеОбъекты КАК ЧитаемыеОбъекты @@ -1014,8 +1135,11 @@ | ЧитаемыеОбъекты.ПорядокТипа КАК ПорядокТипа, | Обработчики.РежимВыполнения КАК РежимВыполнения, | Обработчики.НачальноеЗаполнение КАК НачальноеЗаполнение, + | Обработчики.Процедура КАК Процедура, + | Обработчики.Порядок КАК Порядок, | Обработчики.РежимВыполненияОтложенныхОбработчиков КАК РежимВыполненияОтложенныхОбработчиков, - | ЧитаемыеОбъекты.БлокироватьИнтерфейс КАК БлокироватьИнтерфейс + | ЧитаемыеОбъекты.БлокироватьИнтерфейс КАК БлокироватьИнтерфейс, + | ЧитаемыеОбъекты.НовыеОбъекты КАК НовыеОбъекты |ПОМЕСТИТЬ ЧитаемыеОбъекты |ИЗ | втЧитаемыеОбъекты КАК ЧитаемыеОбъекты @@ -1029,11 +1153,13 @@ | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ втЧитаемыеОбъекты"; - ТекстыЗапросов.Добавить(ТекстЗапросаЧитаемыеОбъекты); + ТекстыЗапросов.Добавить(СтрЗаменить(ТекстЗапросаЧитаемыеОбъекты, "&НовыеОбъекты", "ЛОЖЬ")); #КонецОбласти #Область ИзменяемыеОбъекты - ТекстыЗапросов.Добавить(СтрЗаменить(ТекстЗапросаЧитаемыеОбъекты, "ЧитаемыеОбъекты", "ИзменяемыеОбъекты")); + ТекстЗапросаИзменяемыеОбъекты = СтрЗаменить(ТекстЗапросаЧитаемыеОбъекты, "&НовыеОбъекты", "ЧитаемыеОбъекты.НовыеОбъекты"); + ТекстЗапросаИзменяемыеОбъекты = СтрЗаменить(ТекстЗапросаИзменяемыеОбъекты, "ЧитаемыеОбъекты", "ИзменяемыеОбъекты"); + ТекстыЗапросов.Добавить(СтрЗаменить(ТекстЗапросаИзменяемыеОбъекты, "ЧитаемыеОбъекты", "ИзменяемыеОбъекты")); #КонецОбласти #Область ПриоритетыОбновленияТипов @@ -1163,6 +1289,7 @@ | Обработчики.ТехническийПроект КАК ТехническийПроект, | Обработчики.ИмяБиблиотеки КАК ИмяБиблиотеки, | Обработчики.ПорядокБиблиотеки КАК ПорядокБиблиотеки, + | Обработчики.Порядок КАК Порядок, | Обработчики.ИмяОбъекта КАК ИмяОбъекта, | Обработчики.Подсистема В (&РазрабатываемыеПодсистемы) КАК РазрабатываемаяПодсистема |ПОМЕСТИТЬ Обработчики @@ -1517,15 +1644,26 @@ ТекстыЗапросов.Добавить(ТекстЗапроса); Запрос.Текст = СтрСоединить(ТекстыЗапросов, ОбщегоНазначения.РазделительПакетаЗапросов()); - Выборка = Запрос.Выполнить().Выбрать(); - ВсеХорошо = Выборка.Количество() = 0; - Пока Выборка.Следующий() Цикл + ПустыеПриоритеты = Запрос.Выполнить().Выбрать(); + ВсеХорошо = ПустыеПриоритеты.Количество() = 0; + Пока ПустыеПриоритеты.Следующий() Цикл ТекстСообщения = НСтр("ru = 'Не завершены работы по паре обработчиков %Обработчик% - %СвязанныйОбработчик%.'"); ТекстСообщения = ТекстСообщения + Символы.ПС + НСтр("ru = 'Статус проблемы: %ПорядокПомещенияВОчередь%'"); - ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Обработчик%", Выборка.Обработчик1); - ТекстСообщения = СтрЗаменить(ТекстСообщения, "%СвязанныйОбработчик%", Выборка.Обработчик2); + ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Обработчик%", ПустыеПриоритеты.Обработчик1); + ТекстСообщения = СтрЗаменить(ТекстСообщения, "%СвязанныйОбработчик%", ПустыеПриоритеты.Обработчик2); ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ПорядокПомещенияВОчередь%", НСтр("ru = 'Не задан приоритет выполнения.'")); - ДобавитьОшибку(Выборка.Обработчик1, ТекстСообщения); + ДобавитьОшибку(ПустыеПриоритеты.Обработчик1, ТекстСообщения); + КонецЦикла; + + ВсеХорошо = ВсеХорошо И ЧтениеНизкогоПорядка.Количество() = 0; + ОшибочныеПриоритеты = ЧтениеНизкогоПорядка.Выгрузить(); + ОшибочныеПриоритеты.Свернуть("ПроцедураЧитатель"); + Для Каждого Обработчик Из ОшибочныеПриоритеты Цикл + ТекстСообщения = НСтр("ru = 'Среди читаемых объектов обработчика %Обработчик% + |имеются объекты, которые обрабатываются обработчиками с более низким приоритетом чем текущий. + |Это приведет к тому что текущий обработчик будет ждать их завершения. Необходимо устранить это несоответствие.'"); + ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Обработчик%", Обработчик.ПроцедураЧитатель); + ДобавитьОшибку(Обработчик.ПроцедураЧитатель, ТекстСообщения); КонецЦикла; Возврат ВсеХорошо; @@ -1602,7 +1740,7 @@ Если НЕ ПустаяСтрока(Ошибка.Обработчик) Тогда ОбработчикиОшибки = СтрРазделить(Ошибка.Обработчик, Символы.ПС); Если ОбработчикиОшибки.Количество() = 1 Тогда - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Ошибка.ОбъектМетаданных); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Ошибка.ОбъектМетаданных); КонецЕсли; ОбработчикиОшибки = СтрРазделить(Ошибка.Обработчик, Символы.ПС); Для Каждого Обработчик Из ОбработчикиОшибки Цикл @@ -2075,6 +2213,10 @@ ИначеЕсли МассивВерсий.Количество() = 3 Тогда Результат = Число(МассивВерсий[0]) * 1000000 + Число(МассивВерсий[1]) * 10000 + Число(МассивВерсий[2]); + + ИначеЕсли МассивВерсий.Количество() = 2 Тогда + Результат = Число(МассивВерсий[0]) * 10000 + Число(МассивВерсий[1]); + КонецЕсли; Возврат Результат; @@ -2096,7 +2238,9 @@ КонецФункции Функция ЕщеСведения() - Возврат Новый Структура("РежимВыполненияОтложенныхОбработчиков,ПорядокБиблиотеки"); + Результат = Новый Структура("РежимВыполненияОтложенныхОбработчиков,ПорядокБиблиотеки,Порядок"); + Результат.Порядок = Перечисления.ПорядокОбработчиковОбновления.Обычный; + Возврат Результат; КонецФункции Функция ЗаполнитьПриоритетыТиповМетаданных() @@ -2133,7 +2277,7 @@ Имена = СтрРазделить(ПолноеИмя,"."); ТипОбъекта = Имена[0]; Если ТипОбъекта = "РегистрСведений" Тогда - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмя); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмя); Если МетаданныеОбъекта.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый Тогда ТипОбъекта = ТипОбъекта + "Независимый"; КонецЕсли; diff --git a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/ОписаниеОбработчиковОбновления.mdo b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/ОписаниеОбработчиковОбновления.mdo index 8894892ca..c4a89083c 100644 --- a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/ОписаниеОбработчиковОбновления.mdo +++ b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/ОписаниеОбработчиковОбновления.mdo @@ -606,6 +606,36 @@ <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:UndefinedValue"/> </attributes> + <attributes uuid="c26283d2-dda1-438c-a444-05bdd2797691"> + <name>ЧтениеНизкогоПорядка</name> + <synonym> + <key>ru</key> + <value>Чтение низкого порядка</value> + </synonym> + <type> + <types>Boolean</types> + </type> + <toolTip> + <key>ru</key> + <value>Обработчик читает данные которые обрабатываются с более низким приоритетом</value> + </toolTip> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + </attributes> + <attributes uuid="3ae1ecf1-e062-4e89-96d6-9ac88bbc8aa8"> + <name>Порядок</name> + <synonym> + <key>ru</key> + <value>Порядок</value> + </synonym> + <type> + <types>EnumRef.ПорядокОбработчиковОбновления</types> + </type> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + </attributes> </tabularSections> <tabularSections uuid="62f9c12c-1837-4320-99b0-8f7ae44af735"> <producedTypes> @@ -786,6 +816,19 @@ <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:UndefinedValue"/> </attributes> + <attributes uuid="a8b828da-6172-4732-a01e-c5127175cd60"> + <name>НовыеОбъекты</name> + <synonym> + <key>ru</key> + <value>Новые объекты</value> + </synonym> + <type> + <types>Boolean</types> + </type> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + </attributes> <attributes uuid="6279f4bc-b77f-4618-9ce3-d50efc798871"> <name>ИндексКартинки</name> <synonym> @@ -1335,6 +1378,150 @@ <fillValue xsi:type="core:StringValue"/> </attributes> </tabularSections> + <tabularSections uuid="75daf728-ee8c-41a4-a249-8db123bb802e"> + <producedTypes> + <objectType typeId="9c70aa1b-552c-4500-80d4-ac46720ab15a" valueTypeId="32dcc63e-ca8b-484a-a611-f280dd4f9000"/> + <rowType typeId="22269597-5f0b-4cb5-85a8-f3e046441d9b" valueTypeId="0a632a32-cdc3-45b4-aba3-e20c79930034"/> + </producedTypes> + <name>ЧтениеНизкогоПорядка</name> + <synonym> + <key>ru</key> + <value>Чтение низкого порядка</value> + </synonym> + <standardAttributes> + <dataHistory>Use</dataHistory> + <name>LineNumber</name> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + </standardAttributes> + <attributes uuid="0b154103-47b5-4c54-a4ea-60aa41190940"> + <name>Ссылка</name> + <synonym> + <key>ru</key> + <value>Ссылка</value> + </synonym> + <type> + <types>String</types> + <stringQualifiers> + <length>36</length> + </stringQualifiers> + </type> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:StringValue"/> + </attributes> + <attributes uuid="1eb52621-8915-46f4-b1bb-db04bb58b065"> + <name>ОбъектМетаданных</name> + <synonym> + <key>ru</key> + <value>Объект метаданных</value> + </synonym> + <type> + <types>String</types> + <stringQualifiers> + <length>300</length> + </stringQualifiers> + </type> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillChecking>ShowError</fillChecking> + <fillValue xsi:type="core:StringValue"/> + </attributes> + <attributes uuid="d0fcb0f9-6d6c-444a-8b32-4287a963f72b"> + <name>Писатель</name> + <synonym> + <key>ru</key> + <value>Писатель</value> + </synonym> + <type> + <types>String</types> + <stringQualifiers> + <length>36</length> + </stringQualifiers> + </type> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:StringValue"/> + </attributes> + <attributes uuid="1d583292-1820-498a-890a-66f5b154e698"> + <name>ПорядокЧитатель</name> + <synonym> + <key>ru</key> + <value>Порядок читатель</value> + </synonym> + <type> + <types>EnumRef.ПорядокОбработчиковОбновления</types> + </type> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + </attributes> + <attributes uuid="a3b0430c-743d-4351-a928-9be3c8db9a0b"> + <name>ПорядокПисатель</name> + <synonym> + <key>ru</key> + <value>Порядок писатель</value> + </synonym> + <type> + <types>EnumRef.ПорядокОбработчиковОбновления</types> + </type> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + </attributes> + <attributes uuid="f094241b-ae82-426c-92b0-18be87566ad6"> + <name>ПроцедураЧитатель</name> + <synonym> + <key>ru</key> + <value>Процедура читатель</value> + </synonym> + <type> + <types>String</types> + <stringQualifiers> + <length>300</length> + </stringQualifiers> + </type> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillChecking>ShowError</fillChecking> + <fillValue xsi:type="core:StringValue"/> + </attributes> + <attributes uuid="1a570b62-6644-4427-a432-c6823c7d522a"> + <name>ПроцедураПисатель</name> + <synonym> + <key>ru</key> + <value>Процедура писатель</value> + </synonym> + <type> + <types>String</types> + <stringQualifiers> + <length>300</length> + </stringQualifiers> + </type> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillChecking>ShowError</fillChecking> + <fillValue xsi:type="core:StringValue"/> + </attributes> + <attributes uuid="7bae5ebc-85a5-43eb-8dfa-bc75cd54c013"> + <name>ИндексКартинки</name> + <synonym> + <key>ru</key> + <value>Индекс картинки</value> + </synonym> + <type> + <types>Number</types> + <numberQualifiers> + <precision>2</precision> + </numberQualifiers> + </type> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fillValue xsi:type="core:UndefinedValue"/> + </attributes> + </tabularSections> <forms uuid="0b2c1689-22ba-4ed6-80f3-10475f11db1a"> <name>ФормаСпискаОбработчиков</name> <synonym> diff --git a/SSL/src/DataProcessors/ОтложеннаяЗаписьУзла/Forms/Форма/Form.form b/SSL/src/DataProcessors/ОтложеннаяЗаписьУзла/Forms/Форма/Form.form index 4e03edb93..9678b902f 100644 --- a/SSL/src/DataProcessors/ОтложеннаяЗаписьУзла/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ОтложеннаяЗаписьУзла/Forms/Форма/Form.form @@ -103,7 +103,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -231,7 +230,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -415,7 +413,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Form.form b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Form.form index beff7db76..d6adfd97c 100644 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Form.form +++ b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Form.form @@ -99,7 +99,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -295,7 +294,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> <childrenAlign>None</childrenAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -371,7 +369,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -491,7 +488,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -520,7 +516,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -646,7 +641,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -766,7 +760,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ПодборЦелевогоВремениКлючевойОперации/Module.bsl b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ПодборЦелевогоВремениКлючевойОперации/Module.bsl index 16ce3e5c9..97b226656 100644 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ПодборЦелевогоВремениКлючевойОперации/Module.bsl +++ b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ПодборЦелевогоВремениКлючевойОперации/Module.bsl @@ -162,8 +162,8 @@ И Счетчик < МаксимальноеКоличествоИтераций Цикл Счетчик = Счетчик + 1; - ДанныеМинимум = ОтклонениеAPDEX(Минимум, ТекущееЦелевоеВремя, МВТ, ПараметрыПодбора.ЦелевойAPDEX); - ДанныеМаксимум = ОтклонениеAPDEX(Максимум, ТекущееЦелевоеВремя, МВТ, ПараметрыПодбора.ЦелевойAPDEX); + ДанныеМинимум = ОтклонениеAPDEX(Минимум, ТекущееЦелевоеВремя, МВТ, ПараметрыПодбора.ЦелевойAPDEX); // @skip-check query-in-loop - Итеративный подбор. + ДанныеМаксимум = ОтклонениеAPDEX(Максимум, ТекущееЦелевоеВремя, МВТ, ПараметрыПодбора.ЦелевойAPDEX); // @skip-check query-in-loop - Итеративный подбор. Если Максимум - Минимум <= 0.002 Тогда Прервать; diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ЭкспортЗамеровПроизводительности/Form.form b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ЭкспортЗамеровПроизводительности/Form.form index 00625f409..28ebbfb69 100644 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ЭкспортЗамеровПроизводительности/Form.form +++ b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ЭкспортЗамеровПроизводительности/Form.form @@ -119,7 +119,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/ИнтернетПоддержкаИСервисы/CommandModule.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/ИнтернетПоддержкаИСервисы/CommandModule.bsl index 9ec0c4b13..e5089049f 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/ИнтернетПоддержкаИСервисы/CommandModule.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/ИнтернетПоддержкаИСервисы/CommandModule.bsl @@ -11,12 +11,22 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - ОткрытьФорму( - "Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы", - Новый Структура, - ПараметрыВыполненияКоманды.Источник, - "Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы" + ?(ПараметрыВыполненияКоманды.Окно = Неопределено, ".ОтдельноеОкно", ""), - ПараметрыВыполненияКоманды.Окно); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.НастройкиПрограммы") Тогда + + МодульНастройкиПрограммыБИПКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("НастройкиПрограммыБИПКлиент"); + МодульНастройкиПрограммыБИПКлиент.ОткрытьНастройкиИнтернетПоддержкаИСервисы(ПараметрыВыполненияКоманды); + + Иначе + + ОткрытьФорму( + "Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы", + Новый Структура, + ПараметрыВыполненияКоманды.Источник, + "Обработка.ПанельАдминистрированияБСП.Форма.ИнтернетПоддержкаИСервисы" + + ?(ПараметрыВыполненияКоманды.Окно = Неопределено, ".ОтдельноеОкно", ""), + ПараметрыВыполненияКоманды.Окно); + + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/СинхронизацияДанных/CommandModule.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/СинхронизацияДанных/CommandModule.bsl index 89c18f409..0deda9ea6 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/СинхронизацияДанных/CommandModule.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/СинхронизацияДанных/CommandModule.bsl @@ -14,7 +14,7 @@ ИмяОбработки = ""; ИмяФормыОбработки = ""; - Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ДоступноИспользованиеРазделенныхДанных Тогда + Если ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда ИмяОбработки = "ПанельАдминистрированияБСП"; ИмяФормыОбработки = "СинхронизацияДанных"; Иначе diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ИнтернетПоддержкаИСервисы/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ИнтернетПоддержкаИСервисы/Form.form index 1a35fdb17..b07898e36 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ИнтернетПоддержкаИСервисы/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ИнтернетПоддержкаИСервисы/Form.form @@ -8,7 +8,7 @@ <id>1581</id> <title> <key>ru</key> - <value>Интернет-сервисы и поддержка. Обновление версии программы. Загрузка классификаторов.</value> + <value>Интернет-сервисы и поддержка. Загрузка классификаторов.</value> true true @@ -112,378 +112,41 @@ UsualGroup HorizontalIfPossible - Auto true true Auto Auto - - БИПГруппаНастройки - 1722 - - ГруппаПодключениеИПП - 1724 - - ДекорацияЛогинИПП - 1726 - - <key>ru</key> - <value><Логин ИПП></value> - - true - true - - true - - - ДекорацияЛогинИППРасширеннаяПодсказка - 1728 - Label - true - true - - Left - - - - ДекорацияЛогинИППКонтекстноеМеню - 1727 - true - - Label - true - true - - - URLProcessing - ДекорацияЛогинИППОбработкаНавигационнойСсылки - - Left - - - - ВойтиИлиВыйтиИПП - 1729 - true - true - - true - - - ВойтиИлиВыйтиИППРасширеннаяПодсказка - 1730 - - <key>ru</key> - <value>При отключении Интернет-поддержки логин и пароль для подключения к сервисам Интернет-поддержки будут удалены из программы.</value> - - Label - 36 - true - false - - Left - - - UsualButton - Form.Command.БИПВойтиИлиВыйти - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Подключение ИПП</value> - - - ru - Подключение к Интернет-поддержке пользователей - - true - true - false - - ГруппаПодключениеИППРасширеннаяПодсказка - 1725 - Label - true - true - - Left - - - UsualGroup - - Vertical - Half - Auto - NormalSeparation - true - true - Auto - Auto - - - - ГруппаНастройкиИППКолонки - 1731 - - ГруппаНастройкиИППЛеваяКолонка - 1733 - - БИПСообщениеВСлужбуТехническойПоддержки - 1735 - true - true - - true - - - БИПСообщениеВСлужбуТехническойПоддержкиРасширеннаяПодсказка - 1736 - Label - true - true - - Left - - - Hyperlink - Form.Command.БИПСообщениеВСлужбуТехническойПоддержки - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - - БИПИнформационноТехнологическоеСопровождение - 1993 - true - true - - true - - - БИПИнформационноТехнологическоеСопровождениеРасширеннаяПодсказка - 1994 - Label - true - true - - Left - - - Hyperlink - Form.Command.БИПИнформационноТехнологическоеСопровождение - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Настройки ИПП левая колонка</value> - - 44 - false - - ГруппаНастройкиИППЛеваяКолонкаРасширеннаяПодсказка - 1734 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаНастройкиИПППраваяКолонка - 1737 - - БИПМониторИнтернетПоддержки - 1739 - true - true - - true - - - БИПМониторИнтернетПоддержкиРасширеннаяПодсказка - 1740 - Label - true - true - - Left - - - Hyperlink - Form.Command.БИПМониторИнтернетПоддержки - Normal - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Настройки ИПП правая колонка</value> - - 43 - false - - ГруппаНастройкиИПППраваяКолонкаРасширеннаяПодсказка - 1738 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Настройки ИПП колонки</value> - - - ГруппаНастройкиИППКолонкиРасширеннаяПодсказка - 1732 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Настройки Интернет-поддержки</value> - - - БИПГруппаНастройкиРасширеннаяПодсказка - 1723 - Label - true - true - - Left - - - UsualGroup - - Vertical - Collapsible - Button - NormalSeparation - true - true - Equal - auto - Auto - Auto - - ГруппаКлассификаторы 1637 - БИПГруппаОбновлениеКлассификаторов - 1898 + АдресныйКлассификаторНастройки + 1874 - БИПОбновлениеКлассификаторов - 1900 - - <key>ru</key> - <value>Обновление классификаторов</value> - + ЗагрузкаАдресногоКлассификатора + 1876 true true true - БИПОбновлениеКлассификаторовРасширеннаяПодсказка - 1901 + ЗагрузкаАдресногоКлассификатораРасширеннаяПодсказка + 1877 <key>ru</key> - <value>Обновление классификаторов из файла на локальном диске, в сетевом каталоге или загрузка с Портала 1С:ИТС.</value> + <value>Для экономии трафика при автоподборе и проверке адресов, а также при работе без доступа к Интернету возможно загружать и обновлять адресные сведения в программу. Требуется до 2 Гб места на диске.</value> Label - true true Left Hyperlink - Form.Command.БИПОбновлениеКлассификаторов + Form.Command.ЗагрузкаАдресногоКлассификатора Normal Auto true @@ -492,303 +155,36 @@ ShowBottom Auto - - ГруппаНастройкаОбновления - 1902 - - БИПВариантОбновленияКлассификаторов - 1904 + + ОчисткаАдресныхСведений + 1878 + true + true + + true + + + ОчисткаАдресныхСведенийРасширеннаяПодсказка + 1879 <key>ru</key> - <value>Автоматическое обновление классификаторов</value> + <value>Очистка адресного классификатора.</value> - true - true - - true - - - БИПВариантОбновленияКлассификаторов - - Top - - OnChange - БИПВариантОбновленияКлассификаторовПриИзменении - - - БИПВариантОбновленияКлассификаторовРасширеннаяПодсказка - 1906 - Label - true - true - - Left - - - - БИПВариантОбновленияКлассификаторовКонтекстноеМеню - 1905 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Отключено - - - 0 - - - - - ru - По расписанию через Интернет - - - 1 - - - - - ru - По расписанию из файла - - - 2 - - - Vertical - - - - ГруппаКлассификаторыПредупреждения - 1907 - - БИПДекорацияСдвиг - 1909 - true - true - - true - - - БИПДекорацияСдвигРасширеннаяПодсказка - 1911 - Label - true - true - - Left - - - - БИПДекорацияСдвигКонтекстноеМеню - 1910 - true - - Label - true - 2 - true - - Left - - - - БИПДекорацияОбновлениеКлассификаторовНеВыполняется - 1912 - - <key>ru</key> - <value><link ываывавыа>Подключите </>Интернет-поддержку пользователей</value> - - true - true - - true - - - БИПДекорацияОбновлениеКлассификаторовНеВыполняетсяРасширеннаяПодсказка - 1914 - Label - true - true - - Left - - - - БИПДекорацияОбновлениеКлассификаторовНеВыполняетсяКонтекстноеМеню - 1913 - true - - true - Label - true - true - - - URLProcessing - БИПДекорацияОбновлениеКлассификаторовНеВыполняетсяОбработкаНавигационнойСсылки - - Left - - - true - true - - true - - - <key>ru</key> - <value>Классификаторы предупреждения</value> - - - ГруппаКлассификаторыПредупрежденияРасширеннаяПодсказка - 1908 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Настройка обновления</value> - - - ГруппаНастройкаОбновленияРасширеннаяПодсказка - 1903 Label - true true Left - UsualGroup - - AlwaysHorizontal - Auto - true - true - Auto - Auto - - - - БИПФайлКлассификаторов - 1915 - true - true - - true - - - БИПФайлКлассификаторов - - None - - OnChange - БИПФайлКлассификаторовПриИзменении - - - БИПФайлКлассификаторовРасширеннаяПодсказка - 1917 - Label - true - true - - Left - - - - БИПФайлКлассификаторовКонтекстноеМеню - 1916 - true - - InputField - Enter - true - Left - true - - - StartChoice - БИПФайлКлассификаторовНачалоВыбора - - true - true - true - true - true - true - true - Normal - - - - ДекорацияРасписаниеОбновленияКлассификаторов - 1918 - - <key>ru</key> - <value>Настроить расписание</value> - - true - true - - true - - - ДекорацияРасписаниеОбновленияКлассификаторовРасширеннаяПодсказка - 1920 - Label - true - true - - Left - - - - ДекорацияРасписаниеОбновленияКлассификаторовКонтекстноеМеню - 1919 - true - - Label - 1 + Hyperlink + Form.Command.ОчисткаАдресныхСведений + Normal + Auto + true true - true - - - Click - ДекорацияРасписаниеОбновленияКлассификаторовНажатие - - true - Left - Top - + UserCmds + ShowBottom + Auto true true @@ -797,13 +193,13 @@
    <key>ru</key> - <value>Обновление классификаторов</value> + <value>Адресный классификатор настройки</value> 43 false - БИПГруппаОбновлениеКлассификаторовРасширеннаяПодсказка - 1899 + АдресныйКлассификаторНастройкиРасширеннаяПодсказка + 1875 Label true true @@ -814,188 +210,45 @@ UsualGroup Vertical - Collapsible - true - Button - NormalSeparation true true - Equal Auto Auto - КлассификаторыБСП - 1896 - - АдресныйКлассификаторНастройки - 1874 - - РегистрСведенийАдресныеОбъектыЗагрузитьАдресныйКлассификатор - 1876 - - <key>ru</key> - <value>Загрузка адресного классификатора</value> - - true - true - - true - - - РегистрСведенийАдресныеОбъектыЗагрузитьАдресныйКлассификаторРасширеннаяПодсказка - 1877 - - <key>ru</key> - <value>Для экономии трафика при автоподборе и проверке адресов, а также при работе без доступа к Интернету возможно загружать и обновлять адресные сведения в программу. Требуется до 2 Гб места на диске.</value> - - Label - true - - Left - - - Hyperlink - InformationRegister.АдресныеОбъекты.Command.ЗагрузитьАдресныйКлассификатор - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - - РегистрСведенийАдресныеОбъектыОчиститьАдресныйКлассификатор - 1878 - - <key>ru</key> - <value>Очистка адресных сведений</value> - - true - true - - true - - - РегистрСведенийАдресныеОбъектыОчиститьАдресныйКлассификаторРасширеннаяПодсказка - 1879 - - <key>ru</key> - <value>Очистка адресного классификатора.</value> - - Label - true - - Left - - - Hyperlink - InformationRegister.АдресныеОбъекты.Command.ОчиститьАдресныйКлассификатор - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - + ГруппаОбработкаЗагрузкаКурсовВалют + 1643 + + ЗагрузкаКурсовВалют + 1645 true true true - - <key>ru</key> - <value>Адресный классификатор настройки</value> - - 43 - false - АдресныйКлассификаторНастройкиРасширеннаяПодсказка - 1875 + ЗагрузкаКурсовВалютРасширеннаяПодсказка + 1646 + + <key>ru</key> + <value>Загрузка курсов выбранных валют за указанный период с Портала 1С:ИТС.</value> + Label - true true Left - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаОбработкаЗагрузкаКурсовВалют - 1643 - - ОбработкаЗагрузкаКурсовВалютОткрыть - 1645 - true - true - - true - - - ОбработкаЗагрузкаКурсовВалютОткрытьРасширеннаяПодсказка - 1646 - - <key>ru</key> - <value>Загрузка курсов выбранных валют за указанный период с Портала 1С:ИТС.</value> - - Label - true - - Left - - - Hyperlink - DataProcessor.ЗагрузкаКурсовВалют.StandardCommand.Open - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Обработка загрузка курсов валют</value> - - 43 - false - - ГруппаОбработкаЗагрузкаКурсовВалютExtendedTooltip - 1644 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - + Hyperlink + Form.Command.ЗагрузкаКурсовВалют + Normal + Auto + true + true + UserCmds + ShowBottom + Auto true true @@ -1004,11 +257,13 @@
    <key>ru</key> - <value>Классификаторы БСП</value> + <value>Обработка загрузка курсов валют</value> + 43 + false - КлассификаторыБСПРасширеннаяПодсказка - 1897 + ГруппаОбработкаЗагрузкаКурсовВалютExtendedTooltip + 1644 Label true true @@ -1019,7 +274,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1046,1118 +300,6 @@ UsualGroup - - AlwaysHorizontal - Collapsible - true - Button - NormalSeparation - true - true - Equal - auto - Auto - Auto - - - - БИПГруппаНовости - 1744 - - ГруппаВключениеНовостей - 1746 - - БИПВключитьРаботуСНовостями - 1748 - - <key>ru</key> - <value>Включить работу с новостями</value> - - true - true - - true - - - БИПВключитьРаботуСНовостями - - Right - - ru - Настоятельно рекомендуется включить общую опцию получения новостей от фирмы 1С, что позволит оперативно получать важную информацию от службы поддержки. - - ShowBottom - - OnChange - БИПВключитьРаботуСНовостямиПриИзменении - - - БИПВключитьРаботуСНовостямиРасширеннаяПодсказка - 1750 - Label - true - true - - Left - Top - - - - БИПВключитьРаботуСНовостямиКонтекстноеМеню - 1749 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Включение новостей</value> - - true - 43 - false - - ГруппаВключениеНовостейРасширеннаяПодсказка - 1747 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаНастройкиНовостей - 1751 - - БИПУправлениеНовостями - 1753 - true - true - - true - - - БИПУправлениеНовостямиРасширеннаяПодсказка - 1754 - Label - true - true - - Left - - - Hyperlink - Form.Command.БИПУправлениеНовостями - Normal - Auto - 35 - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Настройки новостей</value> - - false - - ГруппаНастройкиНовостейРасширеннаяПодсказка - 1752 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Новости</value> - - true - true - false - - БИПГруппаНовостиРасширеннаяПодсказка - 1745 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Collapsible - true - Button - NormalSeparation - true - true - auto - Auto - Auto - - - - БИПГруппаОбновлениеПрограммы - 1755 - - ГруппаОбновлениеКолонки - 1757 - - ГруппаОбновлениеЛеваяКолонка - 1759 - - БИПОбновлениеПрограммы - 1761 - true - true - - true - - - БИПОбновлениеПрограммыРасширеннаяПодсказка - 1762 - Label - true - true - - Left - - - Hyperlink - Form.Command.БИПОбновлениеПрограммы - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Обновление левая колонка</value> - - 43 - false - - ГруппаОбновлениеЛеваяКолонкаРасширеннаяПодсказка - 1760 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаОбновлениеПраваяКолонка - 1763 - - ГруппаОткрытьОписаниеИзмененийСистемы - 1765 - - ОткрытьОписаниеИзмененийСистемы - 1767 - true - true - - true - - - ОткрытьОписаниеИзмененийСистемыExtendedTooltip - 1768 - Label - true - true - - Left - - - Hyperlink - CommonForm.ОписаниеИзмененийПрограммы.StandardCommand.Open - Normal - Auto - true - true - UserCmds - Auto - - - ПояснениеОткрытьОписаниеИзмененийСистемы - 1769 - - <key>ru</key> - <value>История изменений по версиям программы.</value> - - true - true - - true - - - ПояснениеОткрытьОписаниеИзмененийСистемыExtendedTooltip - 1771 - Label - true - true - - Left - - - - ПояснениеОткрытьОписаниеИзмененийСистемыКонтекстноеМеню - 1770 - true - - Label - true - true - - Style.ПоясняющийТекст - - - Left - - - true - true - - true - - - <key>ru</key> - <value>Открыть описание изменений системы</value> - - false - - ГруппаОткрытьОписаниеИзмененийСистемыExtendedTooltip - 1766 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Обновление правая колонка</value> - - false - - ГруппаОбновлениеПраваяКолонкаРасширеннаяПодсказка - 1764 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Обновление колонки</value> - - - ГруппаОбновлениеКолонкиРасширеннаяПодсказка - 1758 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - NormalSeparation - true - true - Auto - Auto - - - - ГруппаОбновлениеПрограммы_НастройкиСПодсказкой - 1986 - - ГруппаОбновлениеПрограммы_Настройки - 1772 - - АвтоматическаяПроверкаОбновлений - 1774 - true - true - - true - - - БИПАвтоматическаяПроверкаОбновлений - - Top - - OnChange - АвтоматическаяПроверкаОбновленийПриИзменении - - - АвтоматическаяПроверкаОбновленийРасширеннаяПодсказка - 1776 - Label - true - true - - Left - - - - АвтоматическаяПроверкаОбновленийКонтекстноеМеню - 1775 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Отключена - - - 0 - - - - - ru - При запуске программы - - - 1 - - - - - ru - По заданному расписанию - - - 2 - - - Vertical - - - - ГруппаРасписаниеПроверкиОбновлений - 1777 - - Декорация1 - 1779 - true - true - - true - - - Декорация1РасширеннаяПодсказка - 1781 - Label - true - true - - Left - - - - Декорация1КонтекстноеМеню - 1780 - true - - Label - 4 - true - false - false - - Left - - - - ДекорацияРасписаниеПроверкиОбновлений - 1782 - - <key>ru</key> - <value>Настроить расписание</value> - - true - true - - true - - - ДекорацияРасписаниеПроверкиОбновленийРасширеннаяПодсказка - 1784 - Label - true - true - - Left - - - - ДекорацияРасписаниеПроверкиОбновленийКонтекстноеМеню - 1783 - true - - Label - true - true - - - Click - ДекорацияРасписаниеПроверкиОбновленийНажатие - - true - Left - Top - - - true - true - - true - - - <key>ru</key> - <value>Расписание проверки обновлений</value> - - true - - ГруппаРасписаниеПроверкиОбновленийРасширеннаяПодсказка - 1778 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Обновление программы настройки</value> - - - Style.FormTextColor - - - Style.NormalTextFont - - true - 80 - false - false - - ГруппаОбновлениеПрограммы_НастройкиРасширеннаяПодсказка - 1773 - Label - true - true - - Left - - - UsualGroup - - AlwaysHorizontal - Auto - true - true - Auto - Auto - - - - ДекорацияПодсказкаАвтоматическойПроверкиОбновлений - 1988 - - <key>ru</key> - <value>Настройка автоматической проверки обновления выполняется для каждого пользователя.</value> - - true - true - - true - - - ДекорацияПодсказкаАвтоматическойПроверкиОбновленийРасширеннаяПодсказка - 1990 - Label - true - true - - Left - - - - ДекорацияПодсказкаАвтоматическойПроверкиОбновленийКонтекстноеМеню - 1989 - true - - Label - 40 - true - 3 - true - - Style.ПоясняющийТекст - - - Left - - - true - true - - true - - - <key>ru</key> - <value>Обновление программы настройки с подсказкой</value> - - - ГруппаОбновлениеПрограммы_НастройкиСПодсказкойРасширеннаяПодсказка - 1987 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаОбновлениеПрограммыИсправления - 1884 - - ГруппаНастройкаИсправленияПатчи - 1886 - - БИПЗагружатьИУстанавливатьИсправленияАвтоматически - 1888 - true - true - - true - - - БИПЗагружатьИУстанавливатьИсправленияАвтоматически - - Right - - ru - Получение информации, загрузка и установка доступных исправлений (патчей) конфигурации в "тихом режиме" без участия пользователя. - - ShowBottom - - OnChange - БИПЗагружатьИУстанавливатьИсправленияАвтоматическиПриИзменении - - - БИПЗагружатьИУстанавливатьИсправленияАвтоматическиРасширеннаяПодсказка - 1890 - Label - true - true - - Left - - - - БИПЗагружатьИУстанавливатьИсправленияАвтоматическиКонтекстноеМеню - 1889 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Настройка исправления патчи</value> - - 43 - - ГруппаНастройкаИсправленияПатчиРасширеннаяПодсказка - 1887 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ДекорацияРасписаниеУстановкаИсправлений - 1891 - - <key>ru</key> - <value>Настроить расписание</value> - - true - true - - true - - - ДекорацияРасписаниеУстановкаИсправленийРасширеннаяПодсказка - 1893 - Label - true - true - - Left - - - - ДекорацияРасписаниеУстановкаИсправленийКонтекстноеМеню - 1892 - true - - Label - 2 - true - true - - - Click - ДекорацияРасписаниеУстановкаИсправленийНажатие - - true - Left - Top - - - true - true - - true - - - <key>ru</key> - <value>Обновление программы исправления</value> - - - Style.FormTextColor - - - Style.NormalTextFont - - true - 80 - false - false - - ГруппаОбновлениеПрограммыИсправленияРасширеннаяПодсказка - 1885 - Label - true - true - - Left - - - UsualGroup - - AlwaysHorizontal - Auto - true - true - Auto - Auto - - - - ГруппаОбновлениеИОписаниеИзмененийВтораяСтрока - 1785 - - ГруппаОтложеннаяОбработкаДанных - 1787 - - РезультатыОбновленияИДополнительнаяОбработкаДанных - 1789 - true - true - - true - - - РезультатыОбновленияИДополнительнаяОбработкаДанныхExtendedTooltip - 1790 - - <key>ru</key> - <value>Сведения о ходе обновления версии программы, отложенное выполнение дополнительных процедур обработки данных.</value> - - Label - true - true - - Left - - - Hyperlink - Form.Command.РезультатыОбновленияИДополнительнаяОбработкаДанных - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Отложенная обработка данных</value> - - 43 - false - - ГруппаОтложеннаяОбработкаДанныхExtendedTooltip - 1788 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаДетализироватьОбновлениеИБВЖурналеРегистрации - 1791 - - ДетализироватьОбновлениеИБВЖурналеРегистрации - 1793 - - <key>ru</key> - <value>Детализировать ход обновления в журнале регистрации</value> - - true - true - - true - - - НаборКонстант.ДетализироватьОбновлениеИБВЖурналеРегистрации - - Right - ShowBottom - - OnChange - ДетализироватьОбновлениеИБВЖурналеРегистрацииПриИзменении - - - ДетализироватьОбновлениеИБВЖурналеРегистрацииExtendedTooltip - 1795 - - <key>ru</key> - <value>Записывать в журнал регистрации подробную информацию о ходе выполнения обновления.</value> - - Label - true - true - - Left - - - - ДетализироватьОбновлениеИБВЖурналеРегистрацииКонтекстноеМеню - 1794 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Детализировать обновление ИБВ журнале регистрации</value> - - false - - ГруппаДетализироватьОбновлениеИБВЖурналеРегистрацииExtendedTooltip - 1792 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Обновление и описание изменений вторая строка</value> - - - ГруппаОбновлениеИОписаниеИзмененийВтораяСтрокаРасширеннаяПодсказка - 1786 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - true - Auto - Auto - - - - КаталогДистрибутиваПлатформы - 1796 - true - true - - true - - - БИПКаталогДистрибутиваПлатформы - - Top - - КаталогДистрибутиваПлатформыРасширеннаяПодсказка - 1798 - Label - true - true - - Left - - - - КаталогДистрибутиваПлатформыКонтекстноеМеню - 1797 - true - - LabelField - Enter - true - Left - true - - - Click - КаталогДистрибутиваПлатформыНажатие - - true - true - - - true - true - - true - - - <key>ru</key> - <value>Обновление версии программы</value> - - 86 - false - - БИПГруппаОбновлениеПрограммыРасширеннаяПодсказка - 1756 - Label - true - true - - Left - - - UsualGroup Vertical Collapsible @@ -2172,309 +314,6 @@ Auto - - БИПГруппаПроверкаКонтрагентов - 1804 - - ЛеваяКолонкаПервойГруппы - 1806 - - ИспользоватьАвтоматическуюПроверкуКонтрагентов - 1808 - - <key>ru</key> - <value>Автоматически проверять контрагентов по ЕГРН</value> - - true - true - - true - - - БИПИспользоватьПроверкуКонтрагентов - - Right - ShowBottom - - OnChange - БИПИспользоватьПроверкуКонтрагентовПриИзменении - - - ИспользоватьАвтоматическуюПроверкуКонтрагентовРасширеннаяПодсказка - 1810 - - <key>ru</key> - <value><color #807A59>Включение автоматической проверки может замедлить открытие документов на медленных компьютерах. Для таких компьютеров рекомендуется использовать </><color #807A59>ручную</><color #807A59> проверку</><color #807A59> по кнопке в подменю "Еще".</> -<link e1cib/app/Обработка.ИнструкцияПоИспользованиюПроверкиКонтрагента>Подробнее о сервисе</></value> - - true - Label - true - - Left - - - - ИспользоватьАвтоматическуюПроверкуКонтрагентовКонтекстноеМеню - 1809 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Левая колонка первой группы</value> - - 43 - false - - ЛеваяКолонкаПервойГруппыРасширеннаяПодсказка - 1807 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ПраваяКолонкаПервойГруппы - 1811 - - ПроверитьДоступКСервису - 1813 - - <key>ru</key> - <value>Проверить доступ к веб-сервису</value> - - true - true - - true - - - ПроверитьДоступКСервисуРасширеннаяПодсказка - 1814 - Label - true - true - - Left - - - UsualButton - Form.Command.БИППроверкаКонтрагентовПроверитьДоступКВебСервису - Normal - Auto - true - true - UserCmds - Auto - - - ПредупреждениеПроТестовыйРежимПроверкиКонтрагента - 1815 - - <key>ru</key> - <value><Предупреждение про тестовый режим работы сервиса></value> - - true - true - - true - - - ПредупреждениеПроТестовыйРежимПроверкиКонтрагентаРасширеннаяПодсказка - 1817 - Label - true - true - - Left - - - - ПредупреждениеПроТестовыйРежимПроверкиКонтрагентаКонтекстноеМеню - 1816 - true - - Label - true - - Left - - - true - true - - true - - - <key>ru</key> - <value>Правая колонка первой группы</value> - - 43 - false - - ПраваяКолонкаПервойГруппыРасширеннаяПодсказка - 1812 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - - true - - - <key>ru</key> - <value>Проверка контрагентов</value> - - - БИПГруппаПроверкаКонтрагентовРасширеннаяПодсказка - 1805 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Collapsible - true - Button - NormalSeparation - true - true - Equal - auto - Auto - Auto - - - - БИПГруппаСПАРКРиски - 1799 - - БИПИспользоватьСервисСПАРКРиски - 1801 - - <key>ru</key> - <value>Сервис 1СПАРК Риски</value> - - true - true - - true - - - БИПИспользоватьСервисСПАРКРиски - - Right - ShowBottom - - OnChange - БИПИспользоватьСервисСПАРКРискиПриИзменении - - - БИПИспользоватьСервисСПАРКРискиРасширеннаяПодсказка - 1803 - - <key>ru</key> - <value>Оценка надежности и мониторинг контрагентов в программах 1С для принятия взвешенных решений о сотрудничестве и минимизации налоговых рисков. -<link https://portal.1c.ru/app/1spark-risks/>Подробнее о сервисе</></value> - - true - Label - 44 - true - true - - Left - - - - БИПИспользоватьСервисСПАРКРискиКонтекстноеМеню - 1802 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>1СПАРК Риски</value> - - true - - БИПГруппаСПАРКРискиРасширеннаяПодсказка - 1800 - Label - true - true - - Left - - - UsualGroup - - Vertical - Collapsible - true - Button - NormalSeparation - true - true - auto - Auto - Auto - - ГруппаОбсуждения 1818 @@ -2606,7 +445,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2679,188 +517,6 @@ Auto - - ГруппаИнтеграцияВызовОнлайнПоддержки - 1694 - - ГруппаРазрешениеНаВызовОнлайнПоддержки - 1696 - - ВызовОнлайнПоддержки - 1698 - - <key>ru</key> - <value>Онлайн-поддержка</value> - - true - true - - true - - - НаборКонстант.ИспользоватьОнлайнПоддержку - - Right - ShowBottom - - OnChange - ИнтеграцияВызовОнлайнПоддержкиПриИзменении - - - ВызовОнлайнПоддержкиРасширеннаяПодсказка - 1700 - - <key>ru</key> - <value>Разрешить запуск приложения для соединения со специалистом онлайн-поддержки.</value> - - Label - true - - Left - - - - ВызовОнлайнПоддержкиКонтекстноеМеню - 1699 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Разрешение на вызов онлайн поддержки</value> - - 43 - false - - ГруппаРазрешениеНаВызовОнлайнПоддержкиРасширеннаяПодсказка - 1697 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаНастройкаОнлайнПоддержки - 1701 - - НастройкаОнлайнПоддержки - 1703 - true - true - - true - - - НастройкаОнлайнПоддержкиРасширеннаяПодсказка - 1704 - - <key>ru</key> - <value>Настройка запуска приложения на этом компьютере.</value> - - Label - true - - Left - - - Hyperlink - Form.Command.НастройкаОнлайнПоддержки - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Настройка онлайн поддержки</value> - - 43 - false - - ГруппаНастройкаОнлайнПоддержкиРасширеннаяПодсказка - 1702 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Онлайн-поддержка</value> - - - ГруппаИнтеграцияВызовОнлайнПоддержкиРасширеннаяПодсказка - 1695 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Collapsible - true - Button - NormalSeparation - true - true - Equal - auto - Auto - Auto - - ГруппаСклонения 1705 @@ -2880,13 +536,13 @@ true
    - НаборКонстант.ИспользоватьСервисСклоненияMorpher + ИспользоватьСервисСклоненияMorpher Right ShowBottom OnChange - Подключаемый_ПриИзмененииРеквизита + ИспользоватьСервисСклоненияMorpherПриИзменении ИспользоватьСервисСклоненияMorpherРасширеннаяПодсказка @@ -2939,7 +595,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2950,7 +605,7 @@ ГруппаНастройкаСклонения 1712 - НастройкаДоступаКСервисуСклонения + НастройкаДоступаКСервисуMorpher 1714 true true @@ -2958,7 +613,7 @@ true
    - НастройкаДоступаКСервисуСклоненияРасширеннаяПодсказка + НастройкаДоступаКСервисуMorpherРасширеннаяПодсказка 1715 <key>ru</key> @@ -2971,7 +626,7 @@ </extInfo> </extendedTooltip> <type>Hyperlink</type> - <commandName>CommonForm.НастройкаДоступаКСервисуMorpher.StandardCommand.Open</commandName> + <commandName>Form.Command.НастройкаДоступаКСервисуMorpher</commandName> <buttonImportance>Normal</buttonImportance> <representation>Auto</representation> <autoMaxWidth>true</autoMaxWidth> @@ -3004,7 +659,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -3196,7 +850,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -3240,10 +893,6 @@ <items xsi:type="form:Button"> <name>ЦентрМониторингаНастройки</name> <id>1840</id> - <title> - <key>ru</key> - <value>Настройки центра мониторинга</value> - true false @@ -3260,7 +909,7 @@
    Hyperlink - DataProcessor.НастройкиЦентраМониторинга.Command.НастройкаОтправкиОтчетовОбОшибках + Form.Command.ЦентрМониторингаНастройки Normal Auto true @@ -3290,7 +939,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3334,10 +982,6 @@ ЦентрМониторингаОтправитьКонтактнуюИнформацию 1852 - - <key>ru</key> - <value>Сообщить о проблемах производительности</value> - true true @@ -3354,7 +998,7 @@ Hyperlink - DataProcessor.НастройкиЦентраМониторинга.Command.ПроблемыПроизводительности + Form.Command.ЦентрМониторингаОтправитьКонтактнуюИнформацию Normal Auto true @@ -3384,7 +1028,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3413,7 +1056,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3469,7 +1111,7 @@ None OnChange - РазрешитьОтправлятьДанныеПриИзменении + РазрешитьОтправлятьДанныеСтороннемуПриИзменении ЦентрМониторингаРазрешитьОтправлятьДанныеСтороннемуРасширеннаяПодсказка @@ -3528,7 +1170,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3640,7 +1281,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3695,7 +1335,7 @@ None OnChange - РазрешитьОтправлятьДанныеПриИзменении + ЗапретитьОтправлятьДанныеПриИзменении ЦентрМониторингаЗапретитьОтправлятьДанныеРасширеннаяПодсказка @@ -3753,7 +1393,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3805,19 +1444,15 @@ ГруппаУправлениеВнешнимиКомпонентами 1718 - ОбработкаУправлениеВнешнимиКомпонентами + ОткрытьВнешниеКомпоненты 1720 - - <key>ru</key> - <value>Настройка внешних компонент</value> - true true true - ОбработкаУправлениеВнешнимиКомпонентамиРасширеннаяПодсказка + ОткрытьВнешниеКомпонентыРасширеннаяПодсказка 1721 <key>ru</key> @@ -3831,7 +1466,7 @@ </extInfo> </extendedTooltip> <type>Hyperlink</type> - <commandName>Catalog.ВнешниеКомпоненты.StandardCommand.OpenList</commandName> + <commandName>Form.Command.ОткрытьВнешниеКомпоненты</commandName> <buttonImportance>Normal</buttonImportance> <representation>Auto</representation> <autoMaxWidth>true</autoMaxWidth> @@ -3864,7 +1499,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -3904,936 +1538,6 @@ <currentRowUse>Auto</currentRowUse> </extInfo> </items> - <items xsi:type="form:FormGroup"> - <name>БИПГруппаИнтеграцияСПлатежнымиСистемами</name> - <id>1921</id> - <items xsi:type="form:FormGroup"> - <name>БИПГруппаИнтеграцияСПлатежнымиСистемамиЛево</name> - <id>1995</id> - <items xsi:type="form:FormGroup"> - <name>БИПГруппаНастройкиИнтеграции</name> - <id>1941</id> - <items xsi:type="form:Button"> - <name>БИПНастройкаИнтеграцииСПлатежнымиСистемами</name> - <id>1923</id> - <title> - <key>ru</key> - <value>Настройки подключения</value> - - true - true - - true - - - БИПНастройкаИнтеграцииСПлатежнымиСистемамиРасширеннаяПодсказка - 1924 - - <key>ru</key> - <value>Настройка подключения и обмена данными с Системой быстрых платежей</value> - - Label - true - true - - Left - - - Hyperlink - Form.Command.БИПНастройкаИнтеграцииСПлатежнымиСистемами - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Настройки интеграции</value> - - 43 - - БИПГруппаНастройкиИнтеграцииРасширеннаяПодсказка - 1942 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - true - Auto - Auto - - - - БИПГруппаНастройкаШаблоновСБП - 1999 - - БИПОткрытьШаблоныСообщенийСБП - 2001 - true - true - - true - - - БИПОткрытьШаблоныСообщенийСБПРасширеннаяПодсказка - 2002 - - <key>ru</key> - <value>Шаблоны необходимы для отправки писем и SMS со счетами на оплату через СБП.</value> - - Label - true - true - - Left - - - Hyperlink - Form.Command.БИПОткрытьШаблоныСообщенийСБП - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа настройка шаблонов СБП</value> - - - БИПГруппаНастройкаШаблоновСБПРасширеннаяПодсказка - 2000 - Label - true - true - - Left - - - UsualGroup - - AlwaysHorizontal - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>БИП группа интеграция с платежными системами лево</value> - - - БИПГруппаИнтеграцияСПлатежнымиСистемамиЛевоРасширеннаяПодсказка - 1996 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - БИПГруппаИнтеграцияСПлатежнымиСистемамиПраво - 1997 - - БИПГруппаДлительностьОперации - 1943 - - БИПДлительностьОперацииПлатежнойСистемы - 1945 - - <key>ru</key> - <value>Длительность -операции</value> - - true - true - - true - - - БИПДлительностьОперацииПлатежнойСистемы - - Button - - OnChange - БИПДлительностьОперацииПлатежнойСистемыПриИзменении - - - БИПДлительностьОперацииПлатежнойСистемыРасширеннаяПодсказка - 1947 - Label - true - true - - Left - - - - БИПДлительностьОперацииПлатежнойСистемыКонтекстноеМеню - 1946 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - - БИПДекорацияЕдинициИзмерения - 1955 - - <key>ru</key> - <value>секунд</value> - - true - true - - true - - - ru - Длительность ожидания подтверждения -оплаты покупателем. - - Button - - БИПДекорацияЕдинициИзмеренияРасширеннаяПодсказка - 1957 - Label - true - true - - Left - - - - БИПДекорацияЕдинициИзмеренияКонтекстноеМеню - 1956 - true - - Label - true - true - - Left - - - true - true - - true - - - <key>ru</key> - <value>Длительность операции</value> - - - БИПГруппаДлительностьОперацииРасширеннаяПодсказка - 1944 - Label - true - true - - Left - - - UsualGroup - - AlwaysHorizontal - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>БИП группа интеграция с платежными системами право</value> - - - БИПГруппаИнтеграцияСПлатежнымиСистемамиПравоРасширеннаяПодсказка - 1998 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Система быстрых платежей</value> - - true - - БИПГруппаИнтеграцияСПлатежнымиСистемамиРасширеннаяПодсказка - 1922 - Label - true - true - - Left - - - UsualGroup - - AlwaysHorizontal - Collapsible - true - Button - NormalSeparation - true - true - auto - Auto - Auto - - - - БИПГруппаИнтеграцияСКоннект - 1925 - - БИПГруппаСервисКоннект - 1927 - - БИПИнтеграцияСКоннект - 1929 - true - true - - true - - - БИПИнтеграцияСКоннект - - Right - ShowBottom - - OnChange - БИПИнтеграцияСКоннектПриИзменении - - - БИПИнтеграцияСКоннектРасширеннаяПодсказка - 1931 - - <key>ru</key> - <value>Корпоративный чат с возможностью звонить, передавать файлы и удаленно подключаться к компьютеру. Оперативная поддержка пользователей программ 1С.</value> - - Label - true - true - - Left - - - - БИПИнтеграцияСКоннектКонтекстноеМеню - 1930 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>БИП группа сервис коннект</value> - - 43 - - БИПГруппаСервисКоннектРасширеннаяПодсказка - 1928 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - true - Auto - Auto - - - - БИПГруппаНастройкаКоннект - 1932 - - БИПНастройкаИнтеграцииСКоннект - 1934 - - <key>ru</key> - <value>Настройка интеграции</value> - - true - true - - true - - - БИПНастройкаИнтеграцииСКоннектРасширеннаяПодсказка - 1935 - - <key>ru</key> - <value>Настройка запуска приложения на этом компьютере.</value> - - Label - true - true - - Left - - - Hyperlink - Form.Command.БИПНастройкаИнтеграцииСКоннект - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>БИП группа настройка коннект</value> - - - БИПГруппаНастройкаКоннектРасширеннаяПодсказка - 1933 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>1С-Коннект</value> - - - БИПГруппаИнтеграцияСКоннектРасширеннаяПодсказка - 1926 - Label - true - true - - Left - - - UsualGroup - - AlwaysHorizontal - Collapsible - true - Button - NormalSeparation - true - true - auto - Auto - Auto - - - - БИПГруппаОнлайнОплаты - 1958 - - БИПОнлайнОплатыЛево - 1960 - - БИПИспользоватьОнлайнОплаты - 1962 - - <key>ru</key> - <value>Выставлять счета и принимать платежи</value> - - true - true - - true - - - БИПОнлайнОплаты - - Right - - ru - Позволяет выставлять счета для оплаты через ЮKassa и получать информацию о платежах. - - ShowBottom - - OnChange - БИПИспользоватьОнлайнОплатыПриИзменении - - - БИПИспользоватьОнлайнОплатыРасширеннаяПодсказка - 1964 - Label - true - true - - Left - - - - БИПИспользоватьОнлайнОплатыКонтекстноеМеню - 1963 - true - - CheckBoxField - Enter - true - Left - true - - - - ГруппаПолучениеУведомлений - 1965 - - БИПИспользоватьАвтоматическоеПолучениеУведомленияОтОнлайнОплат - 1967 - - <key>ru</key> - <value>Автоматическое получение уведомлений от сервиса</value> - - true - true - - true - - - БИПИспользоватьАвтоматическоеПолучениеУведомленияОтОнлайнОплат - - Right - - OnChange - БИПИспользоватьАвтоматическоеПолучениеУведомленияОтОнлайнОплатПриИзменении - - - БИПИспользоватьАвтоматическоеПолучениеУведомленияОтОнлайнОплатРасширеннаяПодсказка - 1969 - Label - true - true - - Left - - - - БИПИспользоватьАвтоматическоеПолучениеУведомленияОтОнлайнОплатКонтекстноеМеню - 1968 - true - - CheckBoxField - Enter - true - Left - true - - - - ДекорацияРасписаниеПолученияУведомленийОтОнлайнОплат - 1970 - - <key>ru</key> - <value>Настроить расписание</value> - - true - true - - true - - - ДекорацияРасписаниеПолученияУведомленийОтОнлайнОплатРасширеннаяПодсказка - 1972 - Label - true - true - - Left - - - - ДекорацияРасписаниеПолученияУведомленийОтОнлайнОплатКонтекстноеМеню - 1971 - true - - Label - true - true - - - Click - ДекорацияРасписаниеПолученияУведомленийОтОнлайнОплатНажатие - - true - Left - - - true - true - - true - - - <key>ru</key> - <value>Получение уведомлений</value> - - - ГруппаПолучениеУведомленийРасширеннаяПодсказка - 1966 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - WeakSeparation - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>БИП онлайн оплаты лево</value> - - - БИПОнлайнОплатыЛевоРасширеннаяПодсказка - 1961 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - БИПОнлайнОплатыПраво - 1973 - - ГруппаНастройкиОнлайнОплатыПраво - 1975 - - БИПОткрытьНастройкиОнлайнОплат - 1977 - - <key>ru</key> - <value>Настройки ЮКаssа</value> - - true - true - - true - - - БИПОткрытьНастройкиОнлайнОплатРасширеннаяПодсказка - 1978 - - <key>ru</key> - <value>Настройки выставления счетов и получения информации об оплатах через ЮKassa.</value> - - Label - true - true - - Left - - - Hyperlink - Form.Command.БИПОткрытьНастройкиОнлайнОплат - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - - ГруппаНастройкаШаблоновОнлайнОплат - 1982 - - БИПОткрытьШаблоныСообщенийОнлайнОплат - 1984 - true - true - - true - - - БИПОткрытьШаблоныСообщенийОнлайнОплатРасширеннаяПодсказка - 1985 - - <key>ru</key> - <value>Шаблоны необходимы для отправки писем со счетами на оплату через ЮKassa.</value> - - Label - true - true - - Left - - - Hyperlink - Form.Command.БИПОткрытьШаблоныСообщенийОнлайнОплат - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Настройка шаблонов онлайн оплат</value> - - - ГруппаНастройкаШаблоновОнлайнОплатРасширеннаяПодсказка - 1983 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа открыть профили ЮKassa</value> - - - ГруппаНастройкиОнлайнОплатыПравоРасширеннаяПодсказка - 1976 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа онлайн оплаты право</value> - - - БИПОнлайнОплатыПравоРасширеннаяПодсказка - 1974 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>ЮKassa</value> - - - БИПГруппаОнлайнОплатыРасширеннаяПодсказка - 1959 - Label - true - true - - Left - - - UsualGroup - - AlwaysHorizontal - Collapsible - true - Button - NormalSeparation - true - true - auto - Auto - Auto - - ФормаКоманднаяПанель -1 @@ -4863,8 +1567,6 @@ RestoreValues Retry SaveValues - Write - WriteAndClose Yes DontBlock true @@ -4875,20 +1577,6 @@ true auto true - - НаборКонстант - 1 - - ConstantsSet - - - true - - - true - -
    true
    -
    ЦентрМониторингаАдресСервиса @@ -4928,123 +1616,6 @@ <common>true</common> </edit> </attributes> - <attributes> - <name>БИПАвтоматическаяПроверкаОбновлений</name> - <title> - <key>ru</key> - <value>Автоматическая проверка обновлений</value> - - 18 - - Number - - 1 - - - - true - - - true - - - - БИПВключитьРаботуСНовостями - - <key>ru</key> - <value>Включить работу с новостями</value> - - 19 - - Boolean - - - true - - - true - - - - БИПДанныеАутентификации - 20 - - - true - - - true - - - - БИПИспользоватьСервисСПАРКРиски - - <key>ru</key> - <value>Сервис 1СПАРК Риски</value> - - 21 - - Boolean - - - true - - - true - - - - БИПКаталогДистрибутиваПлатформы - - <key>ru</key> - <value>Последний полученный дистрибутив платформы сохранен в каталог</value> - - 22 - - String - - - - true - - - true - - - - БИПИспользоватьПроверкуКонтрагентов - - <key>ru</key> - <value>Использовать проверку контрагентов</value> - - 24 - - Number - - 1 - true - - - - true - - - true - - - - ОбрабатыватьНастройкиБИП - 25 - - Boolean - - - true - - - true - - ЦентрМониторингаИдентификаторЗадания 26 @@ -5072,94 +1643,6 @@ true - - БИПЗагружатьИУстанавливатьИсправленияАвтоматически - - <key>ru</key> - <value>Загружать и устанавливать исправления (патчи) автоматически</value> - - 28 - - Boolean - - - true - - - true - - - - БИПФайлКлассификаторов - - <key>ru</key> - <value>БИП Файл классификаторов</value> - - 2 - - String - - - - true - - - true - - - - БИПВариантОбновленияКлассификаторов - - <key>ru</key> - <value>БИП Вариант обновления классификаторов</value> - - 3 - - Number - - 1 - - - - true - - - true - - - - БИПВариантОбновленияКлассификаторовПредыдущееЗначение - 4 - - Number - - 1 - - - - true - - - true - - - - БИПИнтеграцияСКоннект - - <key>ru</key> - <value>Сервис 1С-Коннект</value> - - 5 - - Boolean - - - true - - - true - - ОбсужденияПодключены 29 @@ -5174,17 +1657,10 @@ - БИПДлительностьОперацииПлатежнойСистемы - - <key>ru</key> - <value>Длительность операции</value> - + ЭтоАдминистраторСистемы 30 - Number - - 3 - + Boolean true @@ -5194,11 +1670,7 @@ - БИПОнлайнОплаты - - <key>ru</key> - <value>БИПОнлайн оплаты</value> - + РазделениеВключено 31 Boolean @@ -5211,11 +1683,7 @@ - БИПИспользоватьАвтоматическоеПолучениеУведомленияОтОнлайнОплат - - <key>ru</key> - <value>БИПИспользовать автоматическое получение уведомления от онлайн оплат</value> - + ЭтоАвтономноеРабочееМесто 32 Boolean @@ -5227,152 +1695,23 @@ true - - БИПВойтиИлиВыйти + + ИспользоватьСервисСклоненияMorpher <key>ru</key> - <value>Подключить</value> + <value>Использовать сервис склонения morpher</value> - 1 - + 33 + + Boolean + + true - - - - БИПВойтиИлиВыйти - - - DontUse - Auto - - - БИПМониторИнтернетПоддержки - - <key>ru</key> - <value>Монитор Портала 1С:ИТС</value> - - 2 - - ru - Информация о поддержке программного продукта и др. - - + + true - - - - БИПМониторИнтернетПоддержки - - - DontUse - Auto - - - БИПОбновлениеПрограммы - - <key>ru</key> - <value>Обновление программы</value> - - 3 - - ru - Получение информации об обновлениях программы и автоматическая установка обновлений. - - - true - - - - БИПОбновлениеПрограммы - - - DontUse - Auto - - - БИПСообщениеВСлужбуТехническойПоддержки - - <key>ru</key> - <value>Сообщение в службу технической поддержки</value> - - 4 - - ru - Отправка сообщения в службу технической поддержки - - - true - - - - БИПСообщениеВСлужбуТехническойПоддержки - - - DontUse - Auto - - - БИПУправлениеНовостями - - <key>ru</key> - <value>Управление новостями</value> - - 5 - - ru - Управление настройками новостей, а также ручное обновление классификаторов и списка новостей. - - - true - - - - БИПУправлениеНовостями - - - DontUse - Auto - - - РезультатыОбновленияИДополнительнаяОбработкаДанных - - <key>ru</key> - <value>Результаты обновления и дополнительная обработка данных</value> - - 6 - - ru - Результаты обновления и дополнительная обработка данных - - - true - - - - ОтложеннаяОбработкаДанных - - - DontUse - Auto - - - БИППроверкаКонтрагентовПроверитьДоступКВебСервису - - <key>ru</key> - <value>Проверить доступ к веб-сервису</value> - - 7 - - true - - - - БИППроверкаКонтрагентовПроверитьДоступКВебСервису - - - DontUse - Auto - + + ПодключитьОтключитьОбсуждения @@ -5391,82 +1730,6 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> - <formCommands> - <name>БИПОбновлениеКлассификаторов</name> - <title> - <key>ru</key> - <value>Обновление классификаторов</value> - - 9 - - true - - - - БИПОбновлениеКлассификаторов - - - Auto - Auto - - - БИПНастройкаИнтеграцииСПлатежнымиСистемами - - <key>ru</key> - <value>Настройка интеграции</value> - - 10 - - true - - - - БИПНастройкаИнтеграцииСПлатежнымиСистемами - - - Auto - Auto - - - НастройкаОнлайнПоддержки - - <key>ru</key> - <value>Настройка онлайн-поддержки</value> - - 11 - - true - - - - НастройкаОнлайнПоддержки - - - Auto - Auto - - - БИПНастройкаИнтеграцииСКоннект - - <key>ru</key> - <value>Настройка интеграции с 1С-Коннект</value> - - 12 - - ru - Настройка интеграции с 1С-Коннект - - - true - - - - БИПНастройкаИнтеграцииСКоннект - - - Auto - Auto - ОбсужденияНастроитьИнтеграциюСВнешнимиСистемами @@ -5491,10 +1754,10 @@ <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>БИПОткрытьНастройкиОнлайнОплат</name> + <name>ЗагрузкаАдресногоКлассификатора</name> <title> <key>ru</key> - <value>БИПОткрыть настройки онлайн оплат</value> + <value>Загрузка адресного классификатора</value> 14 @@ -5502,17 +1765,17 @@ - БИПОткрытьНастройкиОнлайнОплат + ЗагрузкаАдресногоКлассификатора Auto Auto - БИПОткрытьШаблоныСообщенийОнлайнОплат + ОчисткаАдресныхСведений <key>ru</key> - <value>Шаблоны сообщений</value> + <value>Очистка адресных сведений</value> 15 @@ -5520,39 +1783,53 @@ - БИПОткрытьШаблоныСообщенийОнлайнОплат + ОчисткаАдресныхСведений Auto Auto - БИПИнформационноТехнологическоеСопровождение + ЗагрузкаКурсовВалют <key>ru</key> - <value>Информационно-технологическое сопровождение (1С:ИТС)</value> + <value>Загрузка курсов валют</value> - 17 - - ru - Переход на портал информационно-технологического сопровождения 1С:ИТС. - + 16 true - БИПИнформационноТехнологическоеСопровождение + ЗагрузкаКурсовВалют Auto Auto - БИПОткрытьШаблоныСообщенийСБП + НастройкаДоступаКСервисуMorpher <key>ru</key> - <value>Шаблоны сообщений</value> + <value>Настройка доступа к сервису Морфер</value> + + 17 + + true + + + + НастройкаДоступаКСервисуMorpher + + + Auto + Auto + + + ЦентрМониторингаНастройки + + <key>ru</key> + <value>Настройки центра мониторинга</value> 18 @@ -5560,7 +1837,43 @@ - БИПОткрытьШаблоныСообщенийСБП + ЦентрМониторингаНастройки + + + Auto + Auto + + + ЦентрМониторингаОтправитьКонтактнуюИнформацию + + <key>ru</key> + <value>Сообщить о проблемах производительности</value> + + 19 + + true + + + + ЦентрМониторингаОтправитьКонтактнуюИнформацию + + + Auto + Auto + + + ОткрытьВнешниеКомпоненты + + <key>ru</key> + <value>Настройка внешних компонент</value> + + 20 + + true + + + + ОткрытьВнешниеКомпоненты Auto @@ -5570,5 +1883,4 @@ - diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ИнтернетПоддержкаИСервисы/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ИнтернетПоддержкаИСервисы/Help/ru.html index bdf0a49cc..7b9385397 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ИнтернетПоддержкаИСервисы/Help/ru.html +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ИнтернетПоддержкаИСервисы/Help/ru.html @@ -78,14 +78,7 @@ TD {
  • Результаты обновления и дополнительная обработка данных
  • Сведения о ходе обновления версии программы, отложенное выполнение дополнительных процедур обработки данных.
  • Детализировать ход обновления в журнале регистрации
  • -При включенном флажке в журнал регистрации записываются выполняемые обработчики обновления с указанием времени выполнения.

    Онлайн-поддержка

    -

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

    Склонения представлений объектов

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

    Склонения представлений объектов

    diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ИнтернетПоддержкаИСервисы/Module.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ИнтернетПоддержкаИСервисы/Module.bsl index 1d9b99d11..b42b9eacb 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ИнтернетПоддержкаИСервисы/Module.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ИнтернетПоддержкаИСервисы/Module.bsl @@ -9,7 +9,7 @@ #Область ОписаниеПеременных &НаКлиенте -Перем ОбновитьИнтерфейс; +Перем ОбновитьИнтерфейс; // Булево #КонецОбласти @@ -22,184 +22,28 @@ РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); ЭтоАвтономноеРабочееМесто = ОбщегоНазначения.ЭтоАвтономноеРабочееМесто(); - Элементы.ГруппаКлассификаторы.Видимость = Не РазделениеВключено; - - Если Элементы.ГруппаКлассификаторы.Видимость Тогда - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); - Если Не МодульАдресныйКлассификаторСлужебный.ЕстьПравоДобавлениеИзменениеАдресныхСведений() Тогда - Элементы.АдресныйКлассификаторНастройки.Видимость = Ложь; - КонецЕсли; - Иначе - Элементы.АдресныйКлассификаторНастройки.Видимость = Ложь; - КонецЕсли; - - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда - Элементы.ГруппаОбработкаЗагрузкаКурсовВалют.Видимость = - Не РазделениеВключено - И Не ЭтоАвтономноеРабочееМесто; - Иначе - Элементы.ГруппаОбработкаЗагрузкаКурсовВалют.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда - Элементы.ГруппаСклонения.Видимость = - Не РазделениеВключено - И Не ЭтоАвтономноеРабочееМесто - И ЭтоАдминистраторСистемы; - Иначе - Элементы.ГруппаСклонения.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВызовОнлайнПоддержки") Тогда - Элементы.ГруппаИнтеграцияВызовОнлайнПоддержки.Видимость = - ОбщегоНазначения.ЭтоWindowsКлиент(); - Иначе - Элементы.ГруппаИнтеграцияВызовОнлайнПоддержки.Видимость = Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда - Элементы.ГруппаЦентрМониторинга.Видимость = ЭтоАдминистраторСистемы; - Если ЭтоАдминистраторСистемы Тогда - ПараметрыЦентраМониторинга = ПолучитьПараметрыЦентраМониторинга(); - ЦентрМониторингаРазрешитьОтправлятьДанные = ПолучитьПереключательОтправкиДанных(ПараметрыЦентраМониторинга.ВключитьЦентрМониторинга, ПараметрыЦентраМониторинга.ЦентрОбработкиИнформацииОПрограмме); - - ПараметрыСервиса = Новый Структура("Сервер, АдресРесурса, Порт"); - Если ЦентрМониторингаРазрешитьОтправлятьДанные = 0 Тогда - ПараметрыСервиса.Сервер = ПараметрыЦентраМониторинга.СерверПоУмолчанию; - ПараметрыСервиса.АдресРесурса = ПараметрыЦентраМониторинга.АдресРесурсаПоУмолчанию; - ПараметрыСервиса.Порт = ПараметрыЦентраМониторинга.ПортПоУмолчанию; - ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 1 Тогда - ПараметрыСервиса.Сервер = ПараметрыЦентраМониторинга.Сервер; - ПараметрыСервиса.АдресРесурса = ПараметрыЦентраМониторинга.АдресРесурса; - ПараметрыСервиса.Порт = ПараметрыЦентраМониторинга.Порт; - ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 2 Тогда - ПараметрыСервиса = Неопределено; - КонецЕсли; - - Если ПараметрыСервиса <> Неопределено Тогда - Если ПараметрыСервиса.Порт = 80 Тогда - Схема = "http://"; - Порт = ""; - ИначеЕсли ПараметрыСервиса.Порт = 443 Тогда - Схема = "https://"; - Порт = ""; - Иначе - Схема = "http://"; - Порт = ":" + Формат(ПараметрыСервиса.Порт, "ЧН=0; ЧГ="); - КонецЕсли; - - ЦентрМониторингаАдресСервиса = Схема + ПараметрыСервиса.Сервер + Порт + "/" + ПараметрыСервиса.АдресРесурса; - Иначе - ЦентрМониторингаАдресСервиса = ""; - КонецЕсли; - - Элементы.ЦентрМониторингаАдресСервиса.Доступность = (ЦентрМониторингаРазрешитьОтправлятьДанные = 1); - Элементы.ЦентрМониторингаНастройки.Доступность = (ЦентрМониторингаРазрешитьОтправлятьДанные <> 2); - Элементы.ГруппаОтправитьКонтактнуюИнформацию.Видимость = ПараметрыЦентраМониторинга.ЗапросКонтактнойИнформации <> 2; - КонецЕсли; - Иначе - Элементы.ГруппаЦентрМониторинга.Видимость = Ложь; - КонецЕсли; - - ВидимостьГруппыВнешниеКомпоненты = Ложь; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда - - МодульВнешниеКомпонентыСлужебный = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыСлужебный"); - ВидимостьГруппыВнешниеКомпоненты = МодульВнешниеКомпонентыСлужебный.ДоступнаЗагрузкаСПортала(); - - КонецЕсли; - - Элементы.ГруппаВнешниеКомпоненты.Видимость = ВидимостьГруппыВнешниеКомпоненты; - - // Обновление состояния элементов. - УстановитьДоступность(); - - ОбрабатыватьНастройкиБИП = ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей"); - - Если ОбрабатыватьНастройкиБИП Тогда - МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ИнтернетПоддержкаИСервисы_ПриСозданииНаСервере(ЭтотОбъект); - Иначе - Элементы.БИПГруппаНастройки.Видимость = Ложь; - Элементы.БИПГруппаНовости.Видимость = Ложь; - Элементы.БИПГруппаОбновлениеПрограммы.Видимость = Ложь; - Элементы.БИПГруппаОбновлениеКлассификаторов.Видимость = Ложь; - Элементы.БИПГруппаПроверкаКонтрагентов.Видимость = Ложь; - Элементы.БИПГруппаСПАРКРиски.Видимость = Ложь; - Элементы.БИПГруппаИнтеграцияСКоннект.Видимость = Ложь; - Элементы.БИПГруппаИнтеграцияСПлатежнымиСистемами.Видимость = Ложь; - Элементы.БИПГруппаОнлайнОплаты.Видимость = Ложь; - КонецЕсли; - - // Дополнительная проверка необходимо, т.к. программа может содержать версию БИП - // ниже чем 2.4.1.51. Проверка будет удалена при переходе на новую редакцию БСП. - Если Не ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ИнтеграцияСКоннект") Тогда - Элементы.БИПГруппаИнтеграцияСКоннект.Видимость = Ложь; - КонецЕсли; - - // Дополнительная проверка необходимо, т.к. программа может содержать версию БИП - // ниже чем 2.6.1.25. Проверка будет удалена при переходе на новую редакцию БСП. - Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ИнтеграцияСПлатежнымиСистемами") Тогда - МодульИнтернетПоддержкаПользователейКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователейКлиентСервер"); - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии( - МодульИнтернетПоддержкаПользователейКлиентСервер.ВерсияБиблиотеки(), "2.6.1.25") < 0 Тогда - Элементы.БИПДлительностьОперацииПлатежнойСистемы.Видимость = Ложь; - КонецЕсли; - КонецЕсли; - - НастройкиПрограммыПереопределяемый.ИнтернетПоддержкаИСервисыПриСозданииНаСервере(ЭтотОбъект); - - Элементы.ГруппаОбсуждения.Видимость = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения"); - - СистемнаяИнформация = Новый СистемнаяИнформация(); - ВерсияПлатформы = СистемнаяИнформация.ВерсияПриложения; - - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии("8.3.17.0", ВерсияПлатформы) > 0 Тогда - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, - "ОбсужденияНастроитьИнтеграциюСВнешнимиСистемами", - "Видимость", - Ложь); - КонецЕсли; + НастройкиПрограммы.ИнтернетПоддержкаИСервисыПриСозданииНаСервере( + ЭтотОбъект, + Отказ, + СтандартнаяОбработка); КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) - ПриИзмененииСостоянияПодключенияОбсуждений(); + НастройкиПрограммыКлиент.ИнтернетПоддержкаИСервисыПриОткрытии(ЭтотОбъект, Отказ); КонецПроцедуры &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) - Если ИмяСобытия = "ИнтернетПоддержкаОтключена" Или ИмяСобытия = "ИнтернетПоддержкаПодключена" Тогда - ОбновитьПовторноИспользуемыеЗначения(); - КонецЕсли; - - Если ИмяСобытия = "СкрытиеКонфиденциальнойИнформации" И ОбрабатыватьНастройкиБИП Тогда - ОбновитьСостояниеИнтернетПоддержки(); - КонецЕсли; - - Если ОбрабатыватьНастройкиБИП Тогда - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.БазоваяФункциональностьБИП") Тогда - МодульИнтеграцияПодсистемБИПКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтеграцияПодсистемБИПКлиент"); - МодульИнтеграцияПодсистемБИПКлиент.ИнтернетПоддержкаИСервисы_ОбработкаОповещения( - ЭтотОбъект, - ИмяСобытия, - Параметр, - Источник); - КонецЕсли; - КонецЕсли; - - Если ИмяСобытия = "ОбсужденияПодключены" Тогда - ПриИзмененииСостоянияПодключенияОбсуждений(Параметр); - КонецЕсли; + НастройкиПрограммыКлиент.ИнтернетПоддержкаИСервисыОбработкаОповещения( + ЭтотОбъект, + ИмяСобытия, + Параметр, + Источник); КонецПроцедуры @@ -217,523 +61,124 @@ &НаКлиенте Процедура РазрешитьОтправлятьДанныеПриИзменении(Элемент) - Перем РезультатЗапуска; - Элементы.ЦентрМониторингаАдресСервиса.Доступность = (ЦентрМониторингаРазрешитьОтправлятьДанные = 1); - Элементы.ЦентрМониторингаНастройки.Доступность = (ЦентрМониторингаРазрешитьОтправлятьДанные <> 2); - Если ЦентрМониторингаРазрешитьОтправлятьДанные = 2 Тогда - ПараметрыЦентраМониторингаЗапись = Новый Структура("ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме", Ложь, Ложь); - ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 1 Тогда - ПараметрыЦентраМониторингаЗапись = Новый Структура("ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме", Ложь, Истина); - ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 0 Тогда - ПараметрыЦентраМониторингаЗапись = Новый Структура("ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме", Истина, Ложь); - КонецЕсли; - ЦентрМониторингаАдресСервиса = ПолучитьАдресСервиса(); - РазрешитьОтправлятьДанныеПриИзмененииНаСервере(ПараметрыЦентраМониторингаЗапись, РезультатЗапуска); - Если РезультатЗапуска <> Неопределено Тогда - ЦентрМониторингаИдентификаторЗадания = РезультатЗапуска.ИдентификаторЗадания; - ЦентрМониторингаАдресРезультатаЗадания = РезультатЗапуска.АдресРезультата; - МодульЦентрМониторингаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЦентрМониторингаКлиент"); - Оповещение = Новый ОписаниеОповещения("ПослеОбновленияИдентификатора", МодульЦентрМониторингаКлиент); - ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); - ПараметрыОжидания.ВыводитьОкноОжидания = Ложь; - ДлительныеОперацииКлиент.ОжидатьЗавершение(РезультатЗапуска, Оповещение, ПараметрыОжидания); - КонецЕсли; + + ПриИзмененииРежимаОтправкиДанныхВЦентрМониторинга(Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура РазрешитьОтправлятьДанныеСтороннемуПриИзменении(Элемент) + + ПриИзмененииРежимаОтправкиДанныхВЦентрМониторинга(Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗапретитьОтправлятьДанныеПриИзменении(Элемент) + + ПриИзмененииРежимаОтправкиДанныхВЦентрМониторинга(Элемент); + КонецПроцедуры &НаКлиенте Процедура ЦентрМониторингаАдресСервисаПриИзменении(Элемент) - Попытка - СтруктураАдреса = ОбщегоНазначенияКлиентСервер.СтруктураURI(ЦентрМониторингаАдресСервиса); - - Если СтруктураАдреса.Схема = "http" Тогда - СтруктураАдреса.Вставить("ЗащищенноеСоединение", Ложь); - ИначеЕсли СтруктураАдреса.Схема = "https" Тогда - СтруктураАдреса.Вставить("ЗащищенноеСоединение", Истина); - Иначе - СтруктураАдреса.Вставить("ЗащищенноеСоединение", Ложь); - КонецЕсли; - - Если НЕ ЗначениеЗаполнено(СтруктураАдреса.Порт) Тогда - Если СтруктураАдреса.Схема = "http" Тогда - СтруктураАдреса.Порт = 80; - ИначеЕсли СтруктураАдреса.Схема = "https" Тогда - СтруктураАдреса.Порт = 443; - Иначе - СтруктураАдреса.Порт = 80; - КонецЕсли; - КонецЕсли; - Исключение - // Внимание, формат адреса должен соответствовать RFC 3986 - // см. описание функции ОбщегоНазначенияКлиентСервер.СтруктураURI. - ОписаниеОшибки = НСтр("ru = 'Адрес сервиса'") + " " - + ЦентрМониторингаАдресСервиса + " " - + НСтр("ru = 'не является допустимым адресом веб-сервиса для отправки отчетов об использовании программы.'"); - ВызватьИсключение(ОписаниеОшибки); - КонецПопытки; - ЦентрМониторингаАдресСервисаПриИзмененииНаСервере(СтруктураАдреса); -КонецПроцедуры - -&НаКлиенте -Процедура ИнтеграцияВызовОнлайнПоддержкиПриИзменении(Элемент) - Подключаемый_ПриИзмененииРеквизита(Элемент); -КонецПроцедуры - -#Область ИнтернетПоддержкаПользователейОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура ДекорацияЛогинИППОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) - - МодульИнтеграцияПодсистемБИПКлиент = - ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтеграцияПодсистемБИПКлиент"); - МодульИнтеграцияПодсистемБИПКлиент.ИнтернетПоддержкаИСервисы_ДекорацияОбработкаНавигационнойСсылки( - ЭтотОбъект, - Элемент, - НавигационнаяСсылкаФорматированнойСтроки, - СтандартнаяОбработка); + ЦентрМониторингаАдресСервисаПриИзмененииНаСервере(Элемент.Имя); КонецПроцедуры &НаКлиенте -Процедура АвтоматическаяПроверкаОбновленийПриИзменении(Элемент) +Процедура ИспользоватьСервисСклоненияMorpherПриИзменении(Элемент) - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ПолучениеОбновленийПрограммы") Тогда - МодульПолучениеОбновленийПрограммыКлиент = - ОбщегоНазначенияКлиент.ОбщийМодуль("ПолучениеОбновленийПрограммыКлиент"); - МодульПолучениеОбновленийПрограммыКлиент.ИнтернетПоддержкаИСервисы_АвтоматическаяПроверкаОбновленийПриИзменении( - ЭтотОбъект, - Элемент); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ДекорацияРасписаниеПроверкиОбновленийНажатие(Элемент) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ПолучениеОбновленийПрограммы") Тогда - МодульПолучениеОбновленийПрограммыКлиент = - ОбщегоНазначенияКлиент.ОбщийМодуль("ПолучениеОбновленийПрограммыКлиент"); - МодульПолучениеОбновленийПрограммыКлиент.ИнтернетПоддержкаИСервисы_ДекорацияРасписаниеПроверкиОбновленийНажатие( - ЭтотОбъект, - Элемент); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура КаталогДистрибутиваПлатформыНажатие(Элемент, СтандартнаяОбработка) - - МодульПолучениеОбновленийПрограммыКлиент = - ОбщегоНазначенияКлиент.ОбщийМодуль("ПолучениеОбновленийПрограммыКлиент"); - МодульПолучениеОбновленийПрограммыКлиент.ИнтернетПоддержкаИСервисы_КаталогДистрибутиваПлатформыНажатие( - ЭтотОбъект, - Элемент, - СтандартнаяОбработка); - -КонецПроцедуры - -&НаКлиенте -Процедура ДетализироватьОбновлениеИБВЖурналеРегистрацииПриИзменении(Элемент) - Подключаемый_ПриИзмененииРеквизита(Элемент); -КонецПроцедуры - -&НаКлиенте -Процедура ДекорацияРасписаниеУстановкаИсправленийНажатие(Элемент) - - МодульПолучениеОбновленийПрограммыКлиент = - ОбщегоНазначенияКлиент.ОбщийМодуль("ПолучениеОбновленийПрограммыКлиент"); - МодульПолучениеОбновленийПрограммыКлиент.ИнтернетПоддержкаИСервисы_ДекорацияРасписаниеУстановкаИсправленийНажатие( + ПриИзмененииКонстантыНаСервере("ИспользоватьСервисСклоненияMorpher"); + НастройкиПрограммыКлиент.ИнтернетПоддержкаИСервисыПриИзмененииКонстанты( ЭтотОбъект, Элемент); КонецПроцедуры -&НаКлиенте -Процедура БИПВключитьРаботуСНовостямиПриИзменении(Элемент) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.Новости") Тогда - МодульОбработкаНовостейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбработкаНовостейКлиент"); - МодульОбработкаНовостейКлиент.ИнтернетПоддержкаИСервисы_ВключитьРаботуСНовостямиПриИзменении( - ЭтотОбъект, - Элемент); - ОбновитьИнтерфейс = Истина; - ПодключитьОбработчикОжидания("ОбновитьИнтерфейсПрограммы", 2, Истина); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПИспользоватьСервисСПАРКРискиПриИзменении(Элемент) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.СПАРКРиски") Тогда - МодульСПАРКРискиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СПАРКРискиКлиент"); - МодульСПАРКРискиКлиент.ИнтернетПоддержкаИСервисы_ИспользоватьСервисСПАРКРискиПриИзменении( - ЭтотОбъект, - Элемент); - ОбновитьИнтерфейс = Истина; - ПодключитьОбработчикОжидания("ОбновитьИнтерфейсПрограммы", 2, Истина); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПЗагружатьИУстанавливатьИсправленияАвтоматическиПриИзменении(Элемент) - - МодульПолучениеОбновленийПрограммыКлиент = - ОбщегоНазначенияКлиент.ОбщийМодуль("ПолучениеОбновленийПрограммыКлиент"); - МодульПолучениеОбновленийПрограммыКлиент.ИнтернетПоддержкаИСервисы_ЗагружатьИУстанавливатьИсправленияАвтоматическиПриИзменении( - ЭтотОбъект, - Элемент); - -КонецПроцедуры - -&НаКлиенте -Процедура БИПФайлКлассификаторовНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.РаботаСКлассификаторами") Тогда - МодульРаботаСКлассификаторамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСКлассификаторамиКлиент"); - МодульРаботаСКлассификаторамиКлиент.ИнтернетПоддержкаИСервисы_БИПФайлКлассификаторовНачалоВыбора( - ЭтотОбъект, - Элемент, - ДанныеВыбора, - СтандартнаяОбработка); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПВариантОбновленияКлассификаторовПриИзменении(Элемент) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.РаботаСКлассификаторами") Тогда - МодульРаботаСКлассификаторамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСКлассификаторамиКлиент"); - МодульРаботаСКлассификаторамиКлиент.ИнтернетПоддержкаИСервисы_БИПВариантОбновленияКлассификаторовПриИзменении( - ЭтотОбъект, - Элемент); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ДекорацияРасписаниеОбновленияКлассификаторовНажатие(Элемент) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.РаботаСКлассификаторами") Тогда - МодульРаботаСКлассификаторамиКлиент = - ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСКлассификаторамиКлиент"); - МодульРаботаСКлассификаторамиКлиент.ИнтернетПоддержкаИСервисы_ДекорацияРасписаниеОбновленияКлассификаторовНажатие( - ЭтотОбъект, - Элемент); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПИнтеграцияСКоннектПриИзменении(Элемент) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ИнтеграцияСКоннект") Тогда - МодульИнтеграцияСКоннектКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтеграцияСКоннектКлиент"); - МодульИнтеграцияСКоннектКлиент.ИнтернетПоддержкаИСервисы_БИПИнтеграцияСКоннектПриИзменении( - ЭтотОбъект, - Элемент); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПДлительностьОперацииПлатежнойСистемыПриИзменении(Элемент) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ИнтеграцияСПлатежнымиСистемами") Тогда - МодульИнтеграцияСПлатежнымиСистемамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтеграцияСПлатежнымиСистемамиКлиент"); - МодульИнтеграцияСПлатежнымиСистемамиКлиент.БИПДлительностьОперацииПлатежнойСистемыПриИзменении( - ЭтотОбъект, - Элемент); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПИспользоватьОнлайнОплатыПриИзменении(Элемент) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОнлайнОплаты") Тогда - МодульОнлайнОплаты = ОбщегоНазначенияКлиент.ОбщийМодуль("ОнлайнОплатыКлиент"); - МодульОнлайнОплаты.ИнтернетПоддержкаИСервисы_БИПОнлайнОплатыПриИзменении( - ЭтотОбъект, - Элемент); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПИспользоватьАвтоматическоеПолучениеУведомленияОтОнлайнОплатПриИзменении(Элемент) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОнлайнОплаты") Тогда - МодульПолучениеУведомленияОтОнлайнОплат = ОбщегоНазначенияКлиент.ОбщийМодуль("ОнлайнОплатыКлиент"); - МодульПолучениеУведомленияОтОнлайнОплат.ИнтернетПоддержкаИСервисы_ПолучениеУведомленияОтОнлайнОплатПриИзменении( - ЭтотОбъект, - Элемент); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ДекорацияРасписаниеПолученияУведомленийОтОнлайнОплатНажатие(Элемент) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОнлайнОплаты") Тогда - - МодульОнлайнОплатыКлиент = - ОбщегоНазначенияКлиент.ОбщийМодуль("ОнлайнОплатыКлиент"); - МодульОнлайнОплатыКлиент.ИнтернетПоддержкаИСервисы_ДекорацияРасписаниеПолученияУведомленийОтОнлайнОплатНажатие( - ЭтотОбъект, - Элемент); - - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПОткрытьНастройкиОнлайнОплат(Команда) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОнлайнОплаты") Тогда - ФормаСписка = "Справочник.НастройкиОнлайнОплат.Форма.ФормаСписка"; - ОткрытьФорму(ФормаСписка, , ЭтотОбъект); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПОткрытьШаблоныСообщенийОнлайнОплат(Команда) - - Если (ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОнлайнОплаты") - И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений")) Тогда - - МодульОнлайнОплатыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОнлайнОплатыКлиент"); - МодульОнлайнОплатыКлиент.ИнтернетПоддержкаИСервисы_ОткрытьШаблоныСообщенийОнлайнОплат(УникальныйИдентификатор); - - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПОткрытьШаблоныСообщенийСБП(Команда) - - Если (ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ИнтеграцияСПлатежнымиСистемами") - И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений")) Тогда - - МодульИнтеграцияСПлатежнымиСистемамиКлиент - = ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтеграцияСПлатежнымиСистемамиКлиент"); - МодульИнтеграцияСПлатежнымиСистемамиКлиент.ИнтернетПоддержкаИСервисы_ОткрытьШаблоныСообщенийСБП( - УникальныйИдентификатор); - - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - #КонецОбласти #Область ОбработчикиКомандФормы -// СтандартныеПодсистемы.ОбновлениеВерсииИБ &НаКлиенте -Процедура ОтложеннаяОбработкаДанных(Команда) +Процедура ЗагрузкаАдресногоКлассификатора(Команда) - ПараметрыФормы = Новый Структура("ОткрытиеИзПанелиАдминистрирования", Истина); - ОткрытьФорму( - "Обработка.РезультатыОбновленияПрограммы.Форма.РезультатыОбновленияПрограммы", - ПараметрыФормы); - -КонецПроцедуры -// Конец СтандартныеПодсистемы.ОбновлениеВерсииИБ - -#Область ИнтернетПоддержкаПользователейОбработчикиКомандФормы - -&НаКлиенте -Процедура БИПВойтиИлиВыйти(Команда) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.БазоваяФункциональностьБИП") Тогда - МодульИнтеграцияПодсистемБИПКлиент = - ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтеграцияПодсистемБИПКлиент"); - МодульИнтеграцияПодсистемБИПКлиент.ИнтернетПоддержкаИСервисы_БИПВойтиИлиВыйти( - ЭтотОбъект, - Команда); - КонецЕсли; + НастройкиПрограммыКлиент.ИнтернетПоддержкаИСервисыЗагрузкаАдресногоКлассификатора( + ЭтотОбъект, + Команда); КонецПроцедуры &НаКлиенте -Процедура БИПСообщениеВСлужбуТехническойПоддержки(Команда) +Процедура ОчисткаАдресныхСведений(Команда) - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.БазоваяФункциональностьБИП") Тогда - МодульИнтеграцияПодсистемБИПКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтеграцияПодсистемБИПКлиент"); - МодульИнтеграцияПодсистемБИПКлиент.ИнтернетПоддержкаИСервисы_СообщениеВСлужбуТехническойПоддержки( - ЭтотОбъект, - Команда); - КонецЕсли; + НастройкиПрограммыКлиент.ИнтернетПоддержкаИСервисыОчисткаАдресныхСведений( + ЭтотОбъект, + Команда); КонецПроцедуры &НаКлиенте -Процедура БИПМониторИнтернетПоддержки(Команда) +Процедура ЗагрузкаКурсовВалют(Команда) - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.МониторПортала1СИТС") Тогда - МодульМониторПортала1СИТСКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("МониторПортала1СИТСКлиент"); - МодульМониторПортала1СИТСКлиент.ИнтернетПоддержкаИСервисы_МониторПортала1СИТС( - ЭтотОбъект, - Команда); - КонецЕсли; + НастройкиПрограммыКлиент.ИнтернетПоддержкаИСервисыЗагрузкаКурсовВалют( + ЭтотОбъект, + Команда); КонецПроцедуры -&НаКлиенте -Процедура БИПУправлениеНовостями(Команда) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.Новости") Тогда - МодульОбработкаНовостейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбработкаНовостейКлиент"); - МодульОбработкаНовостейКлиент.ИнтернетПоддержкаИСервисы_УправлениеНовостями( - ЭтотОбъект, - Команда); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПОбновлениеПрограммы(Команда) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ПолучениеОбновленийПрограммы") Тогда - МодульПолучениеОбновленийПрограммыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПолучениеОбновленийПрограммыКлиент"); - МодульПолучениеОбновленийПрограммыКлиент.ИнтернетПоддержкаИСервисы_ОбновлениеПрограммы( - ЭтотОбъект, - Команда); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПОбновлениеКлассификаторов(Команда) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.РаботаСКлассификаторами") Тогда - МодульРаботаСКлассификаторамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСКлассификаторамиКлиент"); - МодульРаботаСКлассификаторамиКлиент.ИнтернетПоддержкаИСервисы_ОбновлениеКлассификаторов( - ЭтотОбъект, - Команда); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПФайлКлассификаторовПриИзменении(Элемент) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.РаботаСКлассификаторами") Тогда - МодульРаботаСКлассификаторамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСКлассификаторамиКлиент"); - МодульРаботаСКлассификаторамиКлиент.ИнтернетПоддержкаИСервисы_БИПФайлКлассификаторовПриИзменении( - ЭтотОбъект, - Элемент); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПДекорацияОбновлениеКлассификаторовНеВыполняетсяОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.РаботаСКлассификаторами") Тогда - МодульРаботаСКлассификаторамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСКлассификаторамиКлиент"); - МодульРаботаСКлассификаторамиКлиент.ИнтернетПоддержкаИСервисы_БИПДекорацияОбновлениеКлассификаторовНеВыполняетсяОбработкаНавигационнойСсылки( - ЭтотОбъект, - Элемент, - НавигационнаяСсылкаФорматированнойСтроки, - СтандартнаяОбработка); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПИспользоватьПроверкуКонтрагентовПриИзменении(Элемент) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.РаботаСКонтрагентами") Тогда - МодульРаботаСКонтрагентамиКлиент = - ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСКонтрагентамиКлиент"); - МодульРаботаСКонтрагентамиКлиент.ИнтернетПоддержкаИСервисы_ИспользоватьПроверкуКонтрагентовПриИзменении( - ЭтотОбъект, - Элемент); - ОбновитьИнтерфейс = Истина; - ПодключитьОбработчикОжидания("ОбновитьИнтерфейсПрограммы", 2, Истина); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИППроверкаКонтрагентовПроверитьДоступКВебСервису(Команда) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.РаботаСКонтрагентами") Тогда - МодульРаботаСКонтрагентамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСКонтрагентамиКлиент"); - МодульРаботаСКонтрагентамиКлиент.ИнтернетПоддержкаИСервисы_БИППроверкаКонтрагентовПроверитьДоступКВебСервису( - ЭтотОбъект, - Команда); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПНастройкаИнтеграцииСПлатежнымиСистемами(Команда) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ИнтеграцияСПлатежнымиСистемами") Тогда - МодульИнтеграцияСПлатежнымиСистемамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтеграцияСПлатежнымиСистемамиКлиент"); - МодульИнтеграцияСПлатежнымиСистемамиКлиент.ИнтернетПоддержкаИСервисы_БИПНастройкаИнтеграцииСПлатежнымиСистемами( - ЭтотОбъект, - Команда); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПНастройкаИнтеграцииСКоннект(Команда) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ИнтеграцияСКоннект") Тогда - МодульИнтеграцияСКоннектКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтеграцияСКоннектКлиент"); - МодульИнтеграцияСКоннектКлиент.ИнтернетПоддержкаИСервисы_БИПНастройкаИнтеграцииСКоннект( - ЭтотОбъект, - Команда); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура БИПИнформационноТехнологическоеСопровождение(Команда) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.БазоваяФункциональностьБИП") Тогда - МодульИнтернетПоддержкаПользователейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтернетПоддержкаПользователейКлиент"); - МодульИнтернетПоддержкаПользователейКлиент.ОткрытьСтраницуИнтегрированногоСайта( - "https://its.1c.ru"); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - &НаКлиенте Процедура ПодключитьОтключитьОбсуждения(Команда) - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда - - МодульОбсужденияСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбсужденияСлужебныйКлиент"); - - Если МодульОбсужденияСлужебныйКлиент.Подключены() Тогда - МодульОбсужденияСлужебныйКлиент.ПоказатьОтключение(); - Иначе - МодульОбсужденияСлужебныйКлиент.ПоказатьПодключение(); - КонецЕсли; - - КонецЕсли; + НастройкиПрограммыКлиент.ИнтернетПоддержкаИСервисыПодключитьОтключитьОбсуждения( + ЭтотОбъект, + Команда); КонецПроцедуры &НаКлиенте -Процедура НастройкаОнлайнПоддержки(Команда) +Процедура ОбсужденияНастроитьИнтеграциюСВнешнимиСистемами(Команда) - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ВызовОнлайнПоддержки") Тогда - МодульВызовОнлайнПоддержкиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ВызовОнлайнПоддержкиКлиент"); - МодульВызовОнлайнПоддержкиКлиент.ОткрытьФормуНастройкаОнлайнПоддержки(); - КонецЕсли; + НастройкиПрограммыКлиент.ИнтернетПоддержкаИСервисыПоказатьНастройкуИнтеграцииСВнешнимиСистемами( + ЭтотОбъект, + Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура НастройкаДоступаКСервисуMorpher(Команда) + + НастройкиПрограммыКлиент.ИнтернетПоддержкаИСервисыНастройкаДоступаКСервисуMorpher( + ЭтотОбъект, + Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура ЦентрМониторингаНастройки(Команда) + + НастройкиПрограммыКлиент.ИнтернетПоддержкаИСервисыЦентрМониторингаНастройки( + ЭтотОбъект, + Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура ЦентрМониторингаОтправитьКонтактнуюИнформацию(Команда) + + НастройкиПрограммыКлиент.ИнтернетПоддержкаИСервисыЦентрМониторингаОтправитьКонтактнуюИнформацию( + ЭтотОбъект, + Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьВнешниеКомпоненты(Команда) + + НастройкиПрограммыКлиент.ИнтернетПоддержкаИСервисыОткрытьВнешниеКомпоненты( + ЭтотОбъект, + Команда); КонецПроцедуры @@ -741,57 +186,50 @@ #Область СлужебныеПроцедурыИФункции -#Область СлужебныеОбработчикиСобытий +//////////////////////////////////////////////////////////////////////////////// +// Вызов сервера -&НаКлиенте -Процедура ПриИзмененииСостоянияПодключенияОбсуждений(ОбсужденияПодключены = Неопределено) +&НаСервере +Процедура ПриИзмененииКонстантыНаСервере(ИмяКонстанты) - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда - - Если ОбсужденияПодключены = Неопределено Тогда - МодульОбсужденияСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбсужденияСлужебныйКлиент"); - ОбсужденияПодключены = МодульОбсужденияСлужебныйКлиент.Подключены(); - КонецЕсли; - - Если ОбсужденияПодключены Тогда - Элементы.ПодключитьОтключитьОбсуждения.Заголовок = НСтр("ru = 'Отключить'"); - Элементы.СостояниеПодключенияОбсуждений.Заголовок = НСтр("ru = 'Обсуждения подключены.'"); - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, - "ОбсужденияНастроитьИнтеграциюСВнешнимиСистемами", - "Доступность", - Истина); - Иначе - Элементы.ПодключитьОтключитьОбсуждения.Заголовок = НСтр("ru = 'Подключить'"); - Элементы.СостояниеПодключенияОбсуждений.Заголовок = НСтр("ru = 'Подключение обсуждений не выполнено.'"); - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, - "ОбсужденияНастроитьИнтеграциюСВнешнимиСистемами", - "Доступность", - Ложь); - КонецЕсли; - - КонецЕсли; + НастройкиПрограммы.ИнтернетПоддержкаИСервисыПриИзмененииКонстанты( + ЭтотОбъект, + ИмяКонстанты, + ЭтотОбъект[ИмяКонстанты]); КонецПроцедуры -#КонецОбласти +&НаСервере +Процедура РазрешитьОтправлятьДанныеПриИзмененииНаСервере(ИмяЭлемента, ПараметрыОперации) + + НастройкиПрограммы.ИнтернетПоддержкаИСервисыРазрешитьОтправлятьДанныеПриИзменении( + ЭтотОбъект, + Элементы[ИмяЭлемента], + ПараметрыОперации); + +КонецПроцедуры + +&НаСервере +Процедура ЦентрМониторингаАдресСервисаПриИзмененииНаСервере(ИмяЭлемента) + + НастройкиПрограммы.ИнтернетПоддержкаИСервисыЦентрМониторингаАдресСервисаПриИзменении( + ЭтотОбъект, + Элементы[ИмяЭлемента]); + +КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Клиент &НаКлиенте -Процедура Подключаемый_ПриИзмененииРеквизита(Элемент, НеобходимоОбновлятьИнтерфейс = Истина) +Процедура ПриИзмененииРежимаОтправкиДанныхВЦентрМониторинга(Элемент) - ИмяКонстанты = ПриИзмененииРеквизитаСервер(Элемент.Имя); - ОбновитьПовторноИспользуемыеЗначения(); - - Если НеобходимоОбновлятьИнтерфейс Тогда - ОбновитьИнтерфейс = Истина; - ПодключитьОбработчикОжидания("ОбновитьИнтерфейсПрограммы", 2, Истина); - КонецЕсли; - - Если ИмяКонстанты <> "" Тогда - Оповестить("Запись_НаборКонстант", Новый Структура, ИмяКонстанты); - КонецЕсли; + ПараметрыЦентраМониторинга = Новый Структура(); + РазрешитьОтправлятьДанныеПриИзмененииНаСервере(Элемент.Имя, ПараметрыЦентраМониторинга); + НастройкиПрограммыКлиент.ИнтернетПоддержкаИСервисыРазрешитьОтправлятьДанныеПриИзменении( + ЭтотОбъект, + Элемент, + ПараметрыЦентраМониторинга); КонецПроцедуры @@ -805,195 +243,4 @@ КонецПроцедуры -&НаКлиенте -Функция ПолучитьАдресСервиса() - - ПараметрыЦентраМониторинга = ПолучитьПараметрыЦентраМониторинга(); - - ПараметрыСервиса = Новый Структура("Сервер, АдресРесурса, Порт"); - - Если ЦентрМониторингаРазрешитьОтправлятьДанные = 0 Тогда - ПараметрыСервиса.Сервер = ПараметрыЦентраМониторинга.СерверПоУмолчанию; - ПараметрыСервиса.АдресРесурса = ПараметрыЦентраМониторинга.АдресРесурсаПоУмолчанию; - ПараметрыСервиса.Порт = ПараметрыЦентраМониторинга.ПортПоУмолчанию; - ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 1 Тогда - ПараметрыСервиса.Сервер = ПараметрыЦентраМониторинга.Сервер; - ПараметрыСервиса.АдресРесурса = ПараметрыЦентраМониторинга.АдресРесурса; - ПараметрыСервиса.Порт = ПараметрыЦентраМониторинга.Порт; - ИначеЕсли ЦентрМониторингаРазрешитьОтправлятьДанные = 2 Тогда - ПараметрыСервиса = Неопределено; - КонецЕсли; - - Если ПараметрыСервиса <> Неопределено Тогда - Если ПараметрыСервиса.Порт = 80 Тогда - Схема = "http://"; - Порт = ""; - ИначеЕсли ПараметрыСервиса.Порт = 443 Тогда - Схема = "https://"; - Порт = ""; - Иначе - Схема = "http://"; - Порт = ":" + Формат(ПараметрыСервиса.Порт, "ЧН=0; ЧГ="); - КонецЕсли; - - АдресСервиса = Схема + ПараметрыСервиса.Сервер + Порт + "/" + ПараметрыСервиса.АдресРесурса; - Иначе - АдресСервиса = ""; - КонецЕсли; - - Возврат АдресСервиса; -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Вызов сервера - -&НаСервере -Функция ПриИзмененииРеквизитаСервер(ИмяЭлемента) - - РеквизитПутьКДанным = Элементы[ИмяЭлемента].ПутьКДанным; - ИмяКонстанты = СохранитьЗначениеРеквизита(РеквизитПутьКДанным); - УстановитьДоступность(РеквизитПутьКДанным); - - Если ИмяЭлемента = "ИспользоватьСервисСклоненияMorpher" - И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда - МодульСклонениеПредставленийОбъектов = ОбщегоНазначения.ОбщийМодуль("СклонениеПредставленийОбъектов"); - МодульСклонениеПредставленийОбъектов.УстановитьДоступностьСервисаСклонения(Истина); - КонецЕсли; - - ОбновитьПовторноИспользуемыеЗначения(); - Возврат ИмяКонстанты; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Сервер - -&НаСервере -Процедура ОбновитьСостояниеИнтернетПоддержки() - МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ИнтернетПоддержкаИСервисы_ПриСозданииНаСервере(ЭтотОбъект); -КонецПроцедуры - -&НаСервере -Процедура УстановитьДоступность(РеквизитПутьКДанным = "") - - Если Не Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда - Возврат; - КонецЕсли; - - Если (РеквизитПутьКДанным = "НаборКонстант.ИспользоватьОнлайнПоддержку" Или РеквизитПутьКДанным = "") - И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВызовОнлайнПоддержки") Тогда - Элементы.ГруппаНастройкаОнлайнПоддержки.Доступность = НаборКонстант.ИспользоватьОнлайнПоддержку; - КонецЕсли; - - Если (РеквизитПутьКДанным = "НаборКонстант.ИспользоватьСервисСклоненияMorpher" Или РеквизитПутьКДанным = "") - И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда - - ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( - Элементы, "ГруппаНастройкаСклонения", "Доступность", - НаборКонстант.ИспользоватьСервисСклоненияMorpher); - - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Функция СохранитьЗначениеРеквизита(РеквизитПутьКДанным) - - ЧастиИмени = СтрРазделить(РеквизитПутьКДанным, "."); - Если ЧастиИмени.Количество() <> 2 Тогда - Возврат ""; - КонецЕсли; - - ИмяКонстанты = ЧастиИмени[1]; - КонстантаМенеджер = Константы[ИмяКонстанты]; - КонстантаЗначение = НаборКонстант[ИмяКонстанты]; - - Если КонстантаМенеджер.Получить() <> КонстантаЗначение Тогда - КонстантаМенеджер.Установить(КонстантаЗначение); - КонецЕсли; - - Возврат ИмяКонстанты; - -КонецФункции - -&НаСервереБезКонтекста -Функция ПолучитьПереключательОтправкиДанных(ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме) - Состояние = ?(ВключитьЦентрМониторинга, "1", "0") + ?(ЦентрОбработкиИнформацииОПрограмме, "1", "0"); - - Если Состояние = "00" Тогда - Результат = 2; - ИначеЕсли Состояние = "01" Тогда - Результат = 1; - ИначеЕсли Состояние = "10" Тогда - Результат = 0; - ИначеЕсли Состояние = "11" Тогда - // А такого быть не может... - КонецЕсли; - - Возврат Результат; -КонецФункции - -&НаСервереБезКонтекста -Функция ПолучитьПараметрыЦентраМониторинга() - МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); - ПараметрыЦентраМониторинга = МодульЦентрМониторингаСлужебный.ПолучитьПараметрыЦентраМониторингаВнешнийВызов(); - - ПараметрыСервисаПоУмолчанию = МодульЦентрМониторингаСлужебный.ПолучитьПараметрыПоУмолчаниюВнешнийВызов(); - ПараметрыЦентраМониторинга.Вставить("СерверПоУмолчанию", ПараметрыСервисаПоУмолчанию.Сервер); - ПараметрыЦентраМониторинга.Вставить("АдресРесурсаПоУмолчанию", ПараметрыСервисаПоУмолчанию.АдресРесурса); - ПараметрыЦентраМониторинга.Вставить("ПортПоУмолчанию", ПараметрыСервисаПоУмолчанию.Порт); - - Возврат ПараметрыЦентраМониторинга; -КонецФункции - -&НаСервереБезКонтекста -Процедура РазрешитьОтправлятьДанныеПриИзмененииНаСервере(ПараметрыЦентраМониторинга, РезультатЗапуска) - МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); - МодульЦентрМониторингаСлужебный.УстановитьПараметрыЦентраМониторингаВнешнийВызов(ПараметрыЦентраМониторинга); - - ВключитьЦентрМониторинга = ПараметрыЦентраМониторинга.ВключитьЦентрМониторинга; - ЦентрОбработкиИнформацииОПрограмме = ПараметрыЦентраМониторинга.ЦентрОбработкиИнформацииОПрограмме; - - Результат = ПолучитьПереключательОтправкиДанных(ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме); - - Если Результат = 0 Или Результат = 1 Тогда - // Отправка ознакомительного пакета. - РезультатЗапуска = МодульЦентрМониторингаСлужебный.ЗапускОтправкиОзнакомительногоПакета(); - КонецЕсли; - - Если Результат = 0 Тогда - // Включение задания сбора и отправки статистики. - РегЗадание = МодульЦентрМониторингаСлужебный.ПолучитьРегламентноеЗаданиеВнешнийВызов("СборИОтправкаСтатистики", Истина); - МодульЦентрМониторингаСлужебный.УстановитьРасписаниеПоУмолчаниюВнешнийВызов(РегЗадание); - ИначеЕсли Результат = 1 Тогда - РегЗадание = МодульЦентрМониторингаСлужебный.ПолучитьРегламентноеЗаданиеВнешнийВызов("СборИОтправкаСтатистики", Истина); - МодульЦентрМониторингаСлужебный.УстановитьРасписаниеПоУмолчаниюВнешнийВызов(РегЗадание); - ИначеЕсли Результат = 2 Тогда - МодульЦентрМониторингаСлужебный.УдалитьРегламентноеЗаданиеВнешнийВызов("СборИОтправкаСтатистики"); - КонецЕсли; -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура ЦентрМониторингаАдресСервисаПриИзмененииНаСервере(СтруктураАдреса) - ПараметрыЦентраМониторинга = Новый Структура(); - ПараметрыЦентраМониторинга.Вставить("Сервер", СтруктураАдреса.Хост); - ПараметрыЦентраМониторинга.Вставить("АдресРесурса", СтруктураАдреса.ПутьНаСервере); - ПараметрыЦентраМониторинга.Вставить("Порт", СтруктураАдреса.Порт); - ПараметрыЦентраМониторинга.Вставить("ЗащищенноеСоединение", СтруктураАдреса.ЗащищенноеСоединение); - - МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); - МодульЦентрМониторингаСлужебный.УстановитьПараметрыЦентраМониторингаВнешнийВызов(ПараметрыЦентраМониторинга); -КонецПроцедуры - -&НаКлиенте -Процедура ОбсужденияНастроитьИнтеграциюСВнешнимиСистемами(Команда) - - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда - МодульОбсужденияСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбсужденияСлужебныйКлиент"); - МодульОбсужденияСлужебныйКлиент.ПоказатьНастройкуИнтеграцииСВнешнимиСистемами(); - КонецЕсли; - -КонецПроцедуры - #КонецОбласти diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Form.form index 75a3eff8b..0dee67c8e 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Form.form @@ -113,7 +113,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -205,6 +204,120 @@ true + + ГруппаВнешниеПользователи + 852 + + ИспользоватьВнешнихПользователей + 699 + + <key>ru</key> + <value>Разрешить доступ внешним пользователям</value> + + true + true + + true + + + НаборКонстант.ИспользоватьВнешнихПользователей + + Right + + ru + Предоставление удаленного доступа партнерам к программе. + + ShowBottom + + OnChange + ИспользоватьВнешнихПользователейПриИзменении + + + ИспользоватьВнешнихПользователейExtendedTooltip + 2072 + Label + true + true + + Left + + + + ИспользоватьВнешнихПользователейКонтекстноеМеню + 700 + true + + CheckBoxField + Enter + true + Left + true + + + + ОткрытьВнешниеПользователи + 2031 + true + true + + true + + + ОткрытьВнешниеПользователиРасширеннаяПодсказка + 2075 + + <key>ru</key> + <value>Ведение списка внешних пользователей, которым предоставлен удаленный доступ к программе.</value> + + Label + true + true + + Left + + + Hyperlink + Form.Command.ВнешниеПользователи + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Внешние пользователи</value> + + + ГруппаВнешниеПользователиРасширеннаяПодсказка + 2070 + Label + true + true + + Left + + + UsualGroup + + Vertical + Button + NormalSeparation + true + true + Equal + auto + Auto + Auto + + true true @@ -229,7 +342,6 @@ UsualGroup Vertical - Auto true true Auto @@ -334,7 +446,6 @@ UsualGroup Vertical - Auto true true Auto @@ -395,7 +506,6 @@ UsualGroup Vertical - Auto true true Auto @@ -435,326 +545,6 @@ Auto - - ГруппаВнешниеПользователи - 852 - - ГруппаИспользоватьВнешнихПользователей - 1883 - - ИспользоватьВнешнихПользователей - 699 - - <key>ru</key> - <value>Разрешить доступ внешним пользователям</value> - - true - true - - true - - - НаборКонстант.ИспользоватьВнешнихПользователей - - Right - - ru - Предоставление удаленного доступа партнерам к программе. - - ShowBottom - - OnChange - ИспользоватьВнешнихПользователейПриИзменении - - - ИспользоватьВнешнихПользователейExtendedTooltip - 2072 - Label - true - true - - Left - - - - ИспользоватьВнешнихПользователейКонтекстноеМеню - 700 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Использовать внешних пользователей</value> - - 43 - false - - ГруппаИспользоватьВнешнихПользователейРасширеннаяПодсказка - 2071 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - - ГруппаВнешниеПользователиИНастройкиВхода - 2192 - - ГруппаСписокВнешнихПользователейОтступ - 2158 - - <key>ru</key> - <value>Горизонтальный отступ</value> - - true - true - - true - - - ГруппаСписокВнешнихПользователейОтступРасширеннаяПодсказка - 2160 - Label - true - true - - Left - - - - ГруппаСписокВнешнихПользователейОтступКонтекстноеМеню - 2159 - true - - 1 - true - 1 - true - - - - ГруппаСписокВнешнихПользователей - 2186 - - ОткрытьВнешниеПользователи - 2031 - true - true - - true - - - ОткрытьВнешниеПользователиРасширеннаяПодсказка - 2075 - - <key>ru</key> - <value>Ведение списка внешних пользователей, которым предоставлен удаленный доступ к программе.</value> - - Label - true - true - - Left - - - Hyperlink - Form.Command.ВнешниеПользователи - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Список внешних пользователей</value> - - 41 - false - - ГруппаСписокВнешнихПользователейРасширеннаяПодсказка - 2187 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаНастройкиВходаВнешнихПользователей - 2147 - - НастройкиВходаВнешнихПользователей - 2149 - - <key>ru</key> - <value>Настройки входа</value> - - true - true - - true - - - НастройкиВходаВнешнихПользователейРасширеннаяПодсказка - 2150 - - <key>ru</key> - <value>Сложность и смена паролей, ограничение работы неактивных внешних пользователей.</value> - - Label - true - true - - Left - - - Hyperlink - Form.Command.НастройкиВходаВнешнихПользователей - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Настройки входа внешних пользователей</value> - - 43 - false - - ГруппаНастройкиВходаВнешнихПользователейРасширеннаяПодсказка - 2148 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Внешние пользователи и настройки входа</value> - - false - - ГруппаВнешниеПользователиИНастройкиВходаРасширеннаяПодсказка - 2193 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Внешние пользователи</value> - - - ГруппаВнешниеПользователиРасширеннаяПодсказка - 2070 - Label - true - true - - Left - - - UsualGroup - - Vertical - Collapsible - Button - NormalSeparation - true - true - Equal - auto - Auto - Auto - - ГруппаГруппыДоступа 2174 @@ -862,7 +652,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1037,7 +826,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1066,7 +854,6 @@ UsualGroup HorizontalIfPossible - Auto true true Equal @@ -1170,7 +957,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1235,7 +1021,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1264,7 +1049,6 @@ UsualGroup HorizontalIfPossible - Auto true true Equal @@ -1330,7 +1114,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1487,7 +1270,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1592,7 +1374,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1762,7 +1543,6 @@ UsualGroup - Auto true true Auto @@ -1791,7 +1571,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1820,7 +1599,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -1886,7 +1664,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2090,24 +1867,6 @@ DontUse Auto - - НастройкиВходаВнешнихПользователей - - <key>ru</key> - <value>Настройки входа внешних пользователей</value> - - 3 - - true - - - - НастройкиВходаВнешнихПользователей - - - DontUse - Auto - ОбновлениеДоступаНаУровнеЗаписей diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Help/ru.html index 6333b1661..612ddf59f 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Help/ru.html +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Help/ru.html @@ -7,24 +7,18 @@ TD { </style><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>В данной панели осуществляется администрирование пользователей и настройка прав доступа. Доступны команды:</p> <h3>Пользователи</h3> -<p>В данном подразделе сгруппированы команды для настройки пользователей программы и настроек входа пользователей.</p> +<p>В данном подразделе сгруппированы команды для настройки внутренних и внешних пользователей программы и настроек входа данных пользователей.</p> <ul><a name="СтандартныеПодсистемы.Пользователи"> </a> <li><a name="СтандартныеПодсистемы.Пользователи"></a><a name="СтандартныеПодсистемы.Пользователи"></a><a name="СтандартныеПодсистемы.Пользователи"></a><a href="Catalog.Пользователи/Help">Пользователи</a> - администрирование пользователей, которые работают с программой.</li> <li><a href="CommonForm.ВосстановлениеПаролей/Help">Восстановление паролей</a> - переход к настройке помощи при входе в программу и восстановление паролей пользователей. В программе предусмотрена возможность оперативного и безопасного восстановления паролей пользователей (и внешних пользователей), которые забыли свой пароль.</li> -<li><a href="CommonForm.НастройкиВходаПользователей/Help">Настройки входа</a> - переход к настройкам сложности и смены паролей пользователей. Можно установить сроки действия паролей, а также ограничение работы неактивных пользователей. -</li> +<li><a href="CommonForm.НастройкиВходаПользователей/Help">Настройки входа</a> - переход к настройкам сложности и смены паролей внутренних и внешних пользователей (можно установить отдельные настройки для внешних пользователей). Устанавливаются сроки действия паролей, ограничение работы неактивных пользователей и т.д., а также можно настроить список выбора пользователей. </li> <li><strong>Группы пользователей - </strong>включите флажок, для того чтобы можно было использовать группы для пользователей и внешних пользователей. Один пользователь может быть участником нескольких групп. Права доступа, указанные для группы, назначаются всем ее участникам. Использование групп имеет смысл, если пользователей программы много. </li> -<li><a href="Report.АнализПравДоступа/Help">Анализ прав доступа</a> - отчет показывает текущие настройки прав доступа пользователей к таблицам информационной базы.</li></ul><h3>Внешние пользователи</h3> -<p>В данном подразделе сгруппированы команды для настройки внешних пользователей программы и настроек входа внешних пользователей.<a name="СтандартныеПодсистемы.Пользователи"></a></p> -<ul><li><strong>Разрешить доступ внешним пользователям</strong> - включите флажок, для того чтобы настраивать доступ внешних пользователей и использовать их в программе. +<li><a href="Report.АнализПравДоступа/Help">Анализ прав доступа</a> - отчет показывает текущие настройки прав доступа пользователей к таблицам информационной базы.</li></ul><ul><li><strong>Разрешить доступ внешним пользователям</strong> - включите флажок, для того чтобы настраивать доступ внешних пользователей и использовать их в программе. </li> -<li><a href="Catalog.ВнешниеПользователи/Help">Внешние пользователи</a> - учет пользователей, которые работают с программой "извне". В качестве внешних пользователей программы могут выступать партнеры, респонденты различных опросов, клиенты интернет-магазина и др. Администрирование внешних пользователей выполняется аналогично пользователям программы. -</li> -<li> -<p><a href="CommonForm.НастройкиВходаПользователей/Help">Настройка входа</a> - настройки сложности и смены паролей, ограничение работы неактивных внешних пользователей.</p></li></ul><h3>Группы доступа</h3> +<li><a href="Catalog.ВнешниеПользователи/Help">Внешние пользователи</a> - учет пользователей, которые работают с программой "извне". В качестве внешних пользователей программы могут выступать партнеры, респонденты различных опросов, клиенты интернет-магазина и др. Администрирование внешних пользователей выполняется аналогично пользователям программы.</li></ul><h3>Группы доступа</h3> <ul><li><a name="СтандартныеПодсистемы.УправлениеДоступом"></a><a href="Catalog.ГруппыДоступа/Help">Группы доступа</a> - настройка прав доступа и ограничений для пользователей и групп пользователей. Группа доступа определяет совокупность действий с данными программы, которые могут выполнять участники этой группы. </li> <li><strong>Ограничивать доступ на уровне записей - </strong>включите этот флажок, для того чтобы максимально гибко настраивать прав доступа пользователей к справочникам, документам и другим данным программы. diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Module.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Module.bsl index 0b564ac5a..890682317 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Module.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Module.bsl @@ -20,8 +20,6 @@ Если Не Пользователи.ОбщиеНастройкиВходаИспользуются() Тогда Элементы.ГруппаНастройкиВходаПользователей.Видимость = Ложь; - Элементы.ГруппаСписокВнешнихПользователейОтступ.Видимость = Ложь; - Элементы.ГруппаНастройкиВходаВнешнихПользователей.Видимость = Ложь; Элементы.ГруппаВнешниеПользователи.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда; КонецЕсли; @@ -72,9 +70,8 @@ Элементы.ГруппаЗащитаПерсональныхДанных.Видимость = Ложь; КонецЕсли; - Если ОбщегоНазначения.РазделениеВключено() - Или Не ПользователиСлужебныйПовтИсп.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда - Элементы.ВосстановлениеПаролей.Видимость = Ложь; + Если ОбщегоНазначения.РазделениеВключено() Тогда + Элементы.ВосстановлениеПаролей.Видимость = Ложь; КонецЕсли; // Обновление состояния элементов. @@ -247,16 +244,6 @@ ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаСписка", , ЭтотОбъект); КонецПроцедуры -&НаКлиенте -Процедура НастройкиВходаВнешнихПользователей(Команда) - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ПоказатьНастройкиВнешнихПользователей", Истина); - - ОткрытьФорму("ОбщаяФорма.НастройкиВходаПользователей", ПараметрыФормы, ЭтотОбъект); - -КонецПроцедуры - &НаКлиенте Процедура ОбновлениеДоступаНаУровнеЗаписей(Команда) @@ -424,11 +411,7 @@ Если РеквизитПутьКДанным = "НаборКонстант.ИспользоватьВнешнихПользователей" Или РеквизитПутьКДанным = "" Тогда - ИспользоватьВнешнихПользователей = НаборКонстант.ИспользоватьВнешнихПользователей; - - Элементы.ОткрытьВнешниеПользователи.Доступность = ИспользоватьВнешнихПользователей; - Элементы.НастройкиВходаВнешнихПользователей.Доступность = ИспользоватьВнешнихПользователей; - + Элементы.ОткрытьВнешниеПользователи.Доступность = НаборКонстант.ИспользоватьВнешнихПользователей; КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Form.form index 80d46e1e4..dfe4cf91b 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Form.form @@ -111,7 +111,98 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> + <showLeftMargin>true</showLeftMargin> + <united>true</united> + <throughAlign>Auto</throughAlign> + <currentRowUse>Auto</currentRowUse> + </extInfo> + </items> + <items xsi:type="form:FormGroup"> + <name>ГруппаОбщие</name> + <id>2196</id> + <items xsi:type="form:FormGroup"> + <name>ГруппаФайлы</name> + <id>2208</id> + <items xsi:type="form:Button"> + <name>СправочникФайлы</name> + <id>2212</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>СправочникФайлыРасширеннаяПодсказка</name> + <id>2213</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <type>Hyperlink</type> + <commandName>Form.Command.СправочникФайлы</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <toolTipRepresentation>ShowBottom</toolTipRepresentation> + <representationInContextMenu>Auto</representationInContextMenu> + </items> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <title> + <key>ru</key> + <value>Файлы</value> + + + ГруппаФайлыРасширеннаяПодсказка + 2209 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Общие</value> + + false + + ГруппаОбщиеРасширеннаяПодсказка + 2197 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + NormalSeparation true true Auto @@ -227,7 +318,6 @@ UsualGroup Vertical - Auto true true Auto @@ -286,7 +376,6 @@ UsualGroup Vertical - Auto true true Auto @@ -315,7 +404,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -416,7 +504,6 @@ UsualGroup Vertical - Auto true true Auto @@ -492,7 +579,6 @@ UsualGroup Vertical - Auto true true Auto @@ -521,7 +607,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -653,7 +738,6 @@ UsualGroup HorizontalIfPossible - Auto true true auto @@ -682,7 +766,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -841,7 +924,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -869,7 +951,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1034,7 +1115,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1063,7 +1143,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1187,7 +1266,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1217,7 +1295,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1286,7 +1363,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1316,7 +1392,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1417,7 +1492,6 @@ Left - true true true @@ -1440,7 +1514,6 @@ UsualGroup Vertical - Auto true Auto Auto @@ -1557,7 +1630,6 @@ UsualGroup Vertical - Auto true Auto Auto @@ -1585,7 +1657,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1664,7 +1735,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1732,7 +1802,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1762,7 +1831,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1924,7 +1992,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1953,7 +2020,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -2017,7 +2083,7 @@ - ПояснениеЗапретЗагрузкиФайловПоРасширению2 + ПояснениеЗапретЗагрузкиФайловПоРасширению 2026 <key>ru</key> @@ -2030,7 +2096,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ПояснениеЗапретЗагрузкиФайловПоРасширению2ExtendedTooltip</name> + <name>ПояснениеЗапретЗагрузкиФайловПоРасширениюРасширеннаяПодсказка</name> <id>2092</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -2040,7 +2106,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ПояснениеЗапретЗагрузкиФайловПоРасширению2КонтекстноеМеню</name> + <name>ПояснениеЗапретЗагрузкиФайловПоРасширениюКонтекстноеМеню</name> <id>2027</id> <autoFill>true</autoFill> </contextMenu> @@ -2076,7 +2142,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <throughAlign>Auto</throughAlign> @@ -2171,7 +2236,6 @@ <horizontalAlign>Left</horizontalAlign> </extInfo> </items> - <visible>true</visible> <enabled>true</enabled> <userVisible> <common>true</common> @@ -2193,7 +2257,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <throughAlign>Auto</throughAlign> @@ -2222,7 +2285,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2251,7 +2313,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -2282,7 +2343,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -2602,6 +2662,28 @@ <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>СправочникФайлы</name> + <title> + <key>ru</key> + <value>Файлы</value> + + 38 + + ru + Задать структуру папок файлов и права доступа к ним, разместить шаблоны файлов. + + + true + + + + СправочникФайлы + + + Auto + Auto + diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Module.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Module.bsl index 134eb10bf..e9919981e 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Module.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Module.bsl @@ -251,6 +251,13 @@ #Область ОбработчикиКомандФормы +&НаКлиенте +Процедура СправочникФайлы(Команда) + + ОткрытьФорму("Справочник.Файлы.ФормаСписка", , ЭтотОбъект); + +КонецПроцедуры + &НаКлиенте Процедура СправочникТомаХраненияФайлов(Команда) diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Обслуживание/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Обслуживание/Form.form index 458226a7a..c28254b45 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Обслуживание/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Обслуживание/Form.form @@ -112,7 +112,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -252,7 +251,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -320,7 +318,6 @@ UsualGroup Vertical - Auto true true Auto @@ -393,7 +390,6 @@ UsualGroup Vertical - Auto true true Auto @@ -462,7 +458,6 @@ UsualGroup Vertical - Auto true true Auto @@ -491,7 +486,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -596,7 +590,6 @@ UsualGroup Vertical - Auto true true Auto @@ -661,7 +654,6 @@ UsualGroup Vertical - Auto true true Auto @@ -690,7 +682,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -757,7 +748,6 @@ UsualGroup Vertical - Auto true true Auto @@ -801,6 +791,87 @@ ГруппаРезервноеКопированиеИВосстановление 1467 + + ГруппаВыборВариантаХраненияРезервныхКопий + 2245 + + ХранениеРезервныхКопий + 2247 + true + + true + + + ХранениеРезервныхКопий + + + OnChange + ХранениеРезервныхКопийПриИзменении + + + ХранениеРезервныхКопийРасширеннаяПодсказка + 2249 + Label + true + true + + Left + + + + ХранениеРезервныхКопийКонтекстноеМеню + 2248 + true + + InputField + Enter + true + Left + true + + + Clearing + ХранениеРезервныхКопийОчистка + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Выбор варианта хранения резервных копий</value> + + true + + ГруппаВыборВариантаХраненияРезервныхКопийРасширеннаяПодсказка + 2246 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + + СтраницыРезервноеКопированиеИВосстановление 2119 @@ -907,7 +978,6 @@ UsualGroup Vertical - Auto true true Auto @@ -972,7 +1042,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1001,7 +1070,112 @@ UsualGroup HorizontalIfPossible - Auto + true + true + Auto + Auto + + + + ГруппаОблачныйАрхивРаботает + 2283 + + ИконкаОблачныйАрхивРаботает + 2285 + + <key>ru</key> + <value>Иконка облачный архив работает</value> + + true + true + + true + + + ИконкаОблачныйАрхивРаботаетРасширеннаяПодсказка + 2287 + Label + true + true + + Left + + + + ИконкаОблачныйАрхивРаботаетКонтекстноеМеню + 2286 + true + + 2 + true + 1 + true + + + + ПояснениеОблачныйАрхивРаботает + 2288 + + <key>ru</key> + <value>Выгрузка <link setting>резервных копий</> в облако Фирмы "1C" включена.</value> + + true + true + + true + + + ПояснениеОблачныйАрхивРаботаетРасширеннаяПодсказка + 2290 + Label + true + true + + Left + + + + ПояснениеОблачныйАрхивРаботаетКонтекстноеМеню + 2289 + true + + true + Label + + Style.ПоясняющийТекст + + + + URLProcessing + ПояснениеОблачныйАрхивРаботаетОбработкаНавигационнойСсылки + + Left + + + true + + true + + + <key>ru</key> + <value>Облачный архив работает</value> + + 86 + false + + ГруппаОблачныйАрхивРаботаетРасширеннаяПодсказка + 2284 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + NormalSeparation true true Auto @@ -1034,6 +1208,474 @@ false + + СтраницаОблачныйАрхив + 2250 + + СтраницыСостоянийОблачныйАрхив + 2252 + + СтраницаОблачныйАрхивРаботает + 2254 + + ГруппаОблачныйАрхивСохранениеВосстановление + 2256 + + ГруппаОблачныйАрхивРезервноеКопированиеПрограммы + 2258 + + ОблачныйАрхивСозданиеРезервнойКопии + 2260 + + <key>ru</key> + <value>Создание резервной копии</value> + + true + true + + true + + ShowBottom + + ОблачныйАрхивСозданиеРезервнойКопииРасширеннаяПодсказка + 2262 + + <key>ru</key> + <value>Запуск процедуры создания резервной копии.</value> + + Label + true + true + + Left + + + + ОблачныйАрхивСозданиеРезервнойКопииКонтекстноеМеню + 2261 + true + + Label + true + true + + + Click + ОблачныйАрхивСозданиеРезервнойКопииНажатие + + true + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа резервное копирование программы</value> + + 43 + false + + ГруппаОблачныйАрхивРезервноеКопированиеПрограммыРасширеннаяПодсказка + 2259 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + + + + ГруппаОблачныйАрхивВосстановлениеРезервнойКопии + 2263 + + ОблачныйАрхивОткрытьАрхивныеКопии + 2265 + + <key>ru</key> + <value>Архивные копии</value> + + true + true + + true + + ShowBottom + + ОблачныйАрхивОткрытьАрхивныеКопииРасширеннаяПодсказка + 2267 + + <key>ru</key> + <value>Переход к списку резервных копий.</value> + + Label + true + + Left + + + + ОблачныйАрхивОткрытьАрхивныеКопииКонтекстноеМеню + 2266 + true + + Label + true + true + + + Click + ОблачныйАрхивОткрытьАрхивныеКопииНажатие + + true + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа восстановление резервной копии</value> + + 43 + false + + ГруппаОблачныйАрхивВосстановлениеРезервнойКопииРасширеннаяПодсказка + 2264 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Облачный архив сохранение восстановление</value> + + + ГруппаОблачныйАрхивСохранениеВосстановлениеРасширеннаяПодсказка + 2257 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + + + + ГруппаОблачныйАрхивНастройкаРезервногоКопирования + 2268 + + ОблачныйАрхивНастройкаРезервногоКопирования + 2291 + true + true + + true + + + ОблачныйАрхивНастройкаРезервногоКопированияРасширеннаяПодсказка + 2292 + + <key>ru</key> + <value>Параметры выполнения резервных копий информационной базы.</value> + + Label + true + true + + Left + + + Hyperlink + Form.Command.ОблачныйАрхивНастройкаРезервногоКопирования + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа настройка резервного копирования</value> + + 43 + false + + ГруппаОблачныйАрхивНастройкаРезервногоКопированияРасширеннаяПодсказка + 2269 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница облачный архив работает</value> + + true + + СтраницаОблачныйАрхивРаботаетРасширеннаяПодсказка + 2255 + Label + true + true + + Left + + + Page + + HorizontalIfPossible + auto + false + + + + СтраницаОблачныйАрхивНеПодключен + 2273 + + ОблачныйАрхивПодключитьСервис + 2293 + + <key>ru</key> + <value>Подключить сервис</value> + + true + true + + true + + + ОблачныйАрхивПодключитьСервисРасширеннаяПодсказка + 2294 + + <key>ru</key> + <value>Подключиться к сервису 1С:Облачный архив.</value> + + Label + true + true + + Left + + + Hyperlink + Form.Command.ОблачныйАрхивНастройкаРезервногоКопирования + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Страница облачный архив не подключен</value> + + true + + СтраницаОблачныйАрхивНеПодключенРасширеннаяПодсказка + 2274 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаОблачныйАрхивЗаблокирован + 2278 + + ОблачныйАрхивВосстановитьРаботуСервиса + 2295 + + <key>ru</key> + <value>Восстановить работу сервиса</value> + + true + true + + true + + + ОблачныйАрхивВосстановитьРаботуСервисаРасширеннаяПодсказка + 2296 + + <key>ru</key> + <value>Обновить настройки резервного копирования в облако Фирмы 1С.</value> + + Label + true + true + + Left + + + Hyperlink + Form.Command.ОблачныйАрхивНастройкаРезервногоКопирования + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Страница облачный архив заблокирован</value> + + true + + СтраницаОблачныйАрхивЗаблокированРасширеннаяПодсказка + 2279 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Страницы состояний облачный архив</value> + + true + + СтраницыСостоянийОблачныйАрхивРасширеннаяПодсказка + 2253 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница облачный архив</value> + + + СтраницаОблачныйАрхивРасширеннаяПодсказка + 2251 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + true true @@ -1188,7 +1830,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1253,7 +1894,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1362,7 +2002,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1430,7 +2069,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1459,7 +2097,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1527,7 +2164,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1593,7 +2229,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1622,7 +2257,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1810,7 +2444,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1846,7 +2479,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1904,7 +2536,7 @@ ОчисткаУстаревшихДанных - 2245 + 2297 true true @@ -1912,7 +2544,7 @@ ОчисткаУстаревшихДанныхРасширеннаяПодсказка - 2246 + 2298 <key>ru</key> <value>Очистка данных вручную, когда при реструктуризации произошла ошибка «Записи регистра стали неуникальными»</value> @@ -1957,7 +2589,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1986,7 +2617,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2135,7 +2765,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2277,7 +2906,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2464,39 +3092,6 @@ <common>true</common> </edit> </attributes> - <attributes> - <name>ПрогрессПроверкиОблачногоАрхива</name> - <id>18</id> - <valueType> - <types>Number</types> - <numberQualifiers> - <precision>3</precision> - <nonNegative>true</nonNegative> - </numberQualifiers> - </valueType> - <view> - <common>true</common> - </view> - <edit> - <common>true</common> - </edit> - </attributes> - <attributes> - <name>СпособРезервногоКопирования</name> - <id>19</id> - <valueType> - <types>String</types> - <stringQualifiers> - <length>30</length> - </stringQualifiers> - </valueType> - <view> - <common>true</common> - </view> - <edit> - <common>true</common> - </edit> - </attributes> <attributes> <name>КоличествоПотоковОбновления</name> <title> @@ -2535,6 +3130,26 @@ <common>true</common> </edit> </attributes> + <attributes> + <name>ХранениеРезервныхКопий</name> + <title> + <key>ru</key> + <value>Хранение резервных копий</value> + + 20 + + String + + 100 + + + + true + + + true + + РазблокироватьРаботуСВнешнимиРесурсами @@ -2579,6 +3194,24 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>ОблачныйАрхивНастройкаРезервногоКопирования</name> + <title> + <key>ru</key> + <value>Настройка резервного копирования</value> + + 9 + + true + + + + ОблачныйАрхивНастройкаРезервногоКопирования + + + Auto + Auto + ОчисткаУстаревшихДанных diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Обслуживание/Module.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Обслуживание/Module.bsl index 1fd6dc7f6..a3456429b 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Обслуживание/Module.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Обслуживание/Module.bsl @@ -36,13 +36,20 @@ КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда - Элементы.ГруппаРезервноеКопированиеИВосстановление.Видимость = Пользователи.ЭтоПолноправныйПользователь( , - Истина) И Не ОбщегоНазначения.РазделениеВключено() И Не ОбщегоНазначения.КлиентПодключенЧерезВебСервер() + Элементы.СтраницаНаЛокальномКомпьютере.Видимость = + Пользователи.ЭтоПолноправныйПользователь( , Истина) + И Не ОбщегоНазначения.РазделениеВключено() + И Не ОбщегоНазначения.КлиентПодключенЧерезВебСервер() И ОбщегоНазначения.ЭтоWindowsКлиент(); ОбновитьНастройкиРезервногоКопирования(); Иначе - Элементы.ГруппаРезервноеКопированиеИВосстановление.Видимость = Ложь; + Элементы.СтраницаНаЛокальномКомпьютере.Видимость = Ложь; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив20") Тогда + МодульОблачныйАрхив20 = ОбщегоНазначения.ОбщийМодуль("ОблачныйАрхив20"); + МодульОблачныйАрхив20.Обслуживание_ПриСозданииНаСервере(ЭтотОбъект); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда @@ -60,8 +67,6 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ"); Элементы.ОбработкаБлокировкаСоединенийСИнформационнойБазойОткрыть.Видимость = МодульСоединенияИБ.ПодсистемаИспользуется(); - Иначе - Элементы.ОбработкаБлокировкаСоединенийСИнформационнойБазойОткрыть.Видимость = Ложь; КонецЕсли; Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПоискИУдалениеДублей") Тогда @@ -75,20 +80,12 @@ КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда - Элементы.ГруппаУстановленныеИсправления.Видимость = Пользователи.ЭтоПолноправныйПользователь(); - Иначе Элементы.ГруппаУстановкаОбновлений.Видимость = Ложь; Элементы.ГруппаУстановленныеИсправления.Видимость = Ложь; КонецЕсли; - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтрольВеденияУчета") Тогда - Если Элементы.Найти("ПравилПроверкиУчета") <> Неопределено Тогда - Элементы.ПравилаПроверкиУчета.Видимость = Ложь; - КонецЕсли; - КонецЕсли; - Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Или ОбщегоНазначения.РазделениеВключено() Тогда Элементы.ГруппаНастройкаПриоритетаОбновления.Видимость = Ложь; Иначе @@ -118,6 +115,11 @@ ИначеЕсли ИмяСобытия = "РазрешенаРаботаСВнешнимиРесурсами" Тогда Элементы.ГруппаБлокировкаРаботыСВнешнимиРесурсами.Видимость = Ложь; КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив20") Тогда + МодульОблачныйАрхив20Клиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхив20Клиент"); + МодульОблачныйАрхив20Клиент.Обслуживание_ОбработкаОповещения(ЭтотОбъект, ИмяСобытия, Параметр, Источник); + КонецЕсли; КонецПроцедуры @@ -133,6 +135,65 @@ #Область ОбработчикиСобытийЭлементовШапкиФормы +#Область ИнтернетПоддержкаПользователей_ОблачныйАрхив20 + +&НаКлиенте +Процедура ХранениеРезервныхКопийПриИзменении(Элемент) + + // В зависимости от выбранного варианта хранения, вывести правильную страницу. + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив20") Тогда + МодульОблачныйАрхив20Клиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхив20Клиент"); + МодульОблачныйАрхив20Клиент.Обслуживание_ХранениеРезервныхКопийПриИзменении(ЭтотОбъект, ХранениеРезервныхКопий); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ХранениеРезервныхКопийОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ОблачныйАрхивСозданиеРезервнойКопииНажатие(Элемент) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив20") Тогда + МодульОблачныйАрхив20Клиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхив20Клиент"); + МодульОблачныйАрхив20Клиент.ОткрытьФормуРезервногоКопирования(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОблачныйАрхивОткрытьАрхивныеКопииНажатие(Элемент) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив20") Тогда + МодульОблачныйАрхив20Клиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхив20Клиент"); + МодульОблачныйАрхив20Клиент.ОткрытьСписокРезервныхКопий(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПояснениеОблачныйАрхивРаботаетОбработкаНавигационнойСсылки( + Элемент, + НавигационнаяСсылкаФорматированнойСтроки, + СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив20") Тогда + МодульОблачныйАрхив20Клиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхив20Клиент"); + Если НавигационнаяСсылкаФорматированнойСтроки = "setting" Тогда + МодульОблачныйАрхив20Клиент.ОткрытьФормуНастройкиОблачногоАрхива(); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + &НаКлиенте Процедура ВыполнятьЗамерыПроизводительностиПриИзменении(Элемент) Подключаемый_ПриИзмененииРеквизита(Элемент); @@ -157,6 +218,20 @@ #Область ОбработчикиКомандФормы +#Область ИнтернетПоддержкаПользователей_ОблачныйАрхив20 + +&НаКлиенте +Процедура ОблачныйАрхивНастройкаРезервногоКопирования(Команда) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ОблачныйАрхив20") Тогда + МодульОблачныйАрхив20Клиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОблачныйАрхив20Клиент"); + МодульОблачныйАрхив20Клиент.ОткрытьФормуНастройкиОблачногоАрхива(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + &НаКлиенте Процедура РазблокироватьРаботуСВнешнимиРесурсами(Команда) РазблокироватьРаботуСВнешнимиРесурсамиНаСервере(); diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Form.form index 586eaa732..e76688d7a 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Form.form @@ -113,7 +113,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -222,7 +221,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -500,7 +498,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -569,7 +566,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -598,7 +594,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -702,7 +697,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -891,7 +885,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -958,7 +951,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1022,7 +1014,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1053,7 +1044,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <slaveItemsWidth>Equal</slaveItemsWidth> @@ -1195,7 +1185,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1336,7 +1325,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1499,7 +1487,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1526,6 +1513,7 @@ <value>Настройка сертификатов и программ, используемых для подписания и шифрования.</value> Label + 43 true Left @@ -1535,7 +1523,7 @@ CommonForm.НастройкиЭлектроннойПодписиИШифрования.StandardCommand.Open Normal Auto - true + 43 true UserCmds ShowBottom @@ -1564,7 +1552,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1573,7 +1560,7 @@ ОбщаяФормаРазрешенныеНеаккредитованныеУЦОткрыть - 2253 + 2256 true true @@ -1581,7 +1568,7 @@ ОбщаяФормаРазрешенныеНеаккредитованныеУЦОткрытьРасширеннаяПодсказка - 2254 + 2257 Label true true @@ -1619,12 +1606,16 @@ Top ShowBottom + + OnChange + ТипПодписиПриИзменении + ТипПодписиКриптографииПоУмолчанию1РасширеннаяПодсказка 2247 <key>ru</key> - <value>В приложении в Интернете типы подписи с метками времени можно выбрать при подписании сертификатом, установленным на компьютер при установленой программе электронной подписи.</value> + <value>В приложении в Интернете типы подписи с метками времени можно выбрать при подписании сертификатом, установленным на компьютер при установленной программе электронной подписи.</value> Label true @@ -1674,7 +1665,7 @@ 2177 <key>ru</key> - <value>В модели сервиса архивная подпись по умолчанию недоступна, этот тип подписи можно выбрать при подписании сертификатом, установленным на компьютер при установленой программе электронной подписи.</value> + <value>В модели сервиса архивная подпись по умолчанию недоступна, этот тип подписи можно выбрать при подписании сертификатом, установленным на компьютер при установленной программе электронной подписи.</value> Label true @@ -1756,7 +1747,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -1843,7 +1833,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -1873,7 +1862,6 @@ UsualGroup AlwaysHorizontal - Auto WeakSeparation true true @@ -2066,7 +2054,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -2175,7 +2162,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -2207,7 +2193,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -2288,7 +2273,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -2318,7 +2302,6 @@ UsualGroup AlwaysHorizontal - Auto WeakSeparation true true @@ -2360,7 +2343,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -2390,7 +2372,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -2519,7 +2500,118 @@ UsualGroup AlwaysHorizontal - Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаПодсказкаКриптопровайдеры + 2248 + + ДекорацияИнформацияКриптопровайдеры + 2253 + + <key>ru</key> + <value>Декорация информация</value> + + true + true + + true + + + ДекорацияИнформацияКриптопровайдерыРасширеннаяПодсказка + 2255 + Label + true + true + + Left + + + + ДекорацияИнформацияКриптопровайдерыКонтекстноеМеню + 2254 + true + + true + true + + + StdPicture.Information + + AsFileRef + + + + ДекорацияПроверкаУстановкиКриптопровайдера + 2250 + + <key>ru</key> + <value>Если планируется работа с усиленной квалифицированной электронной подписью, то на компьютере должна быть установлена сертифицированная программа (средство криптографической защиты информации).  +<link ПроверитьУстановкуПрограммКриптографии>Проверить и установить</></value> + + true + true + + true + + + ДекорацияПроверкаУстановкиКриптопровайдераРасширеннаяПодсказка + 2252 + Label + true + true + + Left + + + + ДекорацияПроверкаУстановкиКриптопровайдераКонтекстноеМеню + 2251 + true + + true + Label + true + + Style.ПоясняющийТекст + + + + URLProcessing + ДекорацияПроверкаУстановкиКриптопровайдераОбработкаНавигационнойСсылки + + Left + + + true + true + + true + + + <key>ru</key> + <value>Подсказка о криптопровайдерах</value> + + 86 + false + + ГруппаПодсказкаКриптопровайдерыРасширеннаяПодсказка + 2249 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible NormalSeparation true true @@ -2549,19 +2641,23 @@ ShowBottom OnChange - Подключаемый_ПриИзмененииРеквизита + ИспользоватьСервисОблачнойПодписиПриИзменении ИспользоватьСервисОблачнойПодписиРасширеннаяПодсказка 2117 <key>ru</key> - <value>Разрешает использовать для подписания сервисы подписи DSS.</value> + <value>В программном коде</value> Label true true + + URLProcessing + ИспользоватьСервисОблачнойПодписиРасширеннаяПодсказкаОбработкаНавигационнойСсылки + Left @@ -2668,7 +2764,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -2697,7 +2792,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2843,7 +2937,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2873,7 +2966,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2941,7 +3033,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3067,7 +3158,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3141,7 +3231,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3170,7 +3259,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3342,7 +3430,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3371,7 +3458,6 @@ UsualGroup HorizontalIfPossible - Auto true Button NormalSeparation @@ -3391,6 +3477,10 @@ NotificationProcessing ОбработкаОповещения + + OnOpen + ПриОткрытии + OnCreateAtServer ПриСозданииНаСервере diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Help/ru.html index 491f2ff5e..ad70ecb72 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Help/ru.html +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Help/ru.html @@ -51,6 +51,7 @@ TD {
  • Шифрование - включите флажок, для того чтобы разрешить шифрование файлов.
  • Сертификаты и программы электронной подписи и шифрования - переход к настройке параметров подключения средств криптографии: электронной подписи и шифрования. 
  • +
  • Разрешенные неаккредитованные УЦ - переходит в список ОГРН удостоверяющих центров, потерявших аккредитацию, но подписание сертификатами которых разрешено, при проверке подписи она будет считаться верной. Список вносится вручную, с новой строки или через запятую.
  • Тип подписи для документов - с помощью переключателя выберите, какой тип электронной подписи в зависимости от срока действия будет использоваться в программе:
    • Базовая подпись (CAdES-BES) - не содержит метку времени и становится недействительной после окончания срока действия сертификата подписанта (обычно в течение 1 года);
    • Подпись с меткой доверенного времени (CAdES-T) - действует после окончания срока действия сертификата подписанта, пока действует сертификат подписи метки времени (обычно до 15 лет). Рекомендуется к использованию при подписании документов, которые должны сохранять юридическую значимость в течение нескольких лет. 
    • @@ -58,7 +59,7 @@ TD {
    • Усовершенствовать подписи - выберите действие с подписями, добавленными ранее:
      • Не усовершенствовать - не будет предпринято никаких действий;
      • Автоматически (с помощью регламентного задания) - в списке регламентных заданий можно будет посмотреть и проверить действия программы;
      • -
      • В интерфейсе администратора - усовершенствовать вручную с помощью различных команд и отчета Продление срока действия электронных подписей.
    • Начиная с даты создания подписи - можно усовершенствовать подписи, созданные начиная с указанной даты. Ее необходимо выбрать в специальном поле.
    • +
    • В интерфейсе администратора - усовершенствовать вручную с помощью различных команд и отчета Продление срока действия электронных подписей.
  • Начиная с даты создания подписи - можно усовершенствовать подписи, созданные начиная с указанной даты. Ее необходимо написать в специальном поле.
  • Автоматически продлевать архивные подписи - будут добавляться новые метки времени в архивные подписи (CAdES-A) за месяц до окончания действия сертификата последней метки времени.
  • Проверять подписи и сертификаты на сервере - В этом случае проверка электронной подписи и сертификата будет происходить на сервере или веб-сервере, что позволяет не устанавливать программу на каждом компьютере, где требуются только такие операции.
  • diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Module.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Module.bsl index f9ff1d112..f176f26f5 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Module.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Module.bsl @@ -40,10 +40,6 @@ Если ОбщегоНазначения.РазделениеВключено() Тогда Элементы.СоздаватьЭлектронныеПодписиНаСервере.Видимость = Ложь; - МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); - Элементы.ПроверятьЭлектронныеПодписиНаСервере.Видимость = - МодульЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() - Или МодульЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса(); КонецЕсли; МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); @@ -64,11 +60,13 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодписьСервисаDSS") Тогда ЭтоАдминистратор = Пользователи.ЭтоПолноправныйПользователь(, Истина); - Элементы.ИспользоватьСервисОблачнойПодписи.Видимость = ЭтоАдминистратор И ОбщегоНазначения.РазделениеВключено(); + Элементы.ИспользоватьСервисОблачнойПодписи.Видимость = ЭтоАдминистратор; + Элементы.ИспользоватьСервисОблачнойПодписи.РасширеннаяПодсказка.Заголовок = СтроковыеФункции.ФорматированнаяСтрока( + "Разрешает использовать для подписания сервисы подписи DSS. Использование сервиса для формирования квалифицированной электронной подписи требует дополнительных настроек.") Иначе Элементы.ГруппаОблачнаяПодпись.Видимость = Ложь; КонецЕсли; - + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда Элементы.ГруппаВерсионирование.Видимость = Ложь; КонецЕсли; @@ -113,6 +111,13 @@ КонецПроцедуры +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ПодключитьОбработчикОжидания("УстановитьВидимостьОбработчикОжидания", 1, Истина); + +КонецПроцедуры + &НаКлиенте Процедура ПриЗакрытии(ЗавершениеРаботы) Если ЗавершениеРаботы Тогда @@ -299,6 +304,13 @@ Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка); КонецПроцедуры +&НаКлиенте +Процедура ДекорацияПроверкаУстановкиКриптопровайдераОбработкаНавигационнойСсылки( + Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + ОбработкаНавигационнойСсылкиОткрытиеНастроекЭП( + Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка); +КонецПроцедуры + &НаКлиенте Процедура ПроверятьЭлектронныеПодписиНаСервереРасширеннаяПодсказкаОбработкаНавигационнойСсылки( Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) @@ -333,12 +345,59 @@ СтандартнаяОбработка = Ложь; Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - МодульЭлектроннаяПодписьйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); - МодульЭлектроннаяПодписьйКлиент.ОткрытьОтчетПродлениеСрокаДействияЭлектронныхПодписей("ТребуетсяУсовершенствоватьПодписи") + МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); + МодульЭлектроннаяПодписьКлиент.ОткрытьОтчетПродлениеСрокаДействияЭлектронныхПодписей("ТребуетсяУсовершенствоватьПодписи") КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура ИспользоватьСервисОблачнойПодписиРасширеннаяПодсказкаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + Если НавигационнаяСсылкаФорматированнойСтроки = "НастройкиDSS" Тогда + ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(АдресСтатьиСервисаDSS()); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ИспользоватьСервисОблачнойПодписиПриИзменении(Элемент) + + Если НЕ ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодписьСервисаDSS") Тогда + Возврат; + КонецЕсли; + + Если НаборКонстант.ИспользоватьСервисDSS Тогда + + ПараметрыЦикла = Новый Структура; + ПараметрыЦикла.Вставить("Элемент", Элемент); + + ОповещениеСледующее = Новый ОписаниеОповещения("ПроверитьВключениеОпцииИспользованиеСервисаDSS", ЭтотОбъект, ПараметрыЦикла); + СписокКоманд = Новый СписокЗначений; + СписокКоманд.Добавить("ОК", НСтр("ru = 'Подтвердить'")); + СписокКоманд.Добавить("Нет", НСтр("ru = 'Отмена'"), Истина); + ТекстВопроса = НСтр("ru = 'Внимание, если сервис подписи DSS будет использоваться для формирования квалифицированной электронной подписи, то нужно самостоятельно произвести настройки для выполнения требований, предъявляемых к такой подписи.'") + + Символы.ПС + Символы.ПС + + НСтр("ru = 'Подтверждаете использование сервиса?'"); + + ТекстВопроса = СтроковыеФункцииКлиент.ФорматированнаяСтрока(ТекстВопроса, АдресСтатьиСервисаDSS()); + + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + МодульСервисКриптографииDSSКлиент.ВывестиВопрос( + ОповещениеСледующее, + ТекстВопроса, + СписокКоманд, + , + НСтр("ru = 'Требуются дополнительные настройки'")); + + Иначе + Подключаемый_ПриИзмененииРеквизита(Элемент); + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы @@ -425,6 +484,13 @@ #Область СлужебныеПроцедурыИФункции +&НаКлиенте +Процедура УстановитьВидимостьОбработчикОжидания() + + УстановитьВидимостьНаКлиенте(""); + +КонецПроцедуры + &НаКлиенте Процедура АдресПубликацииИнформационнойБазыВИнтернетеНачалоВыбораПродолжение() @@ -475,6 +541,8 @@ ПодключитьОбработчикОжидания("ОбновитьИнтерфейсПрограммы", 2, Истина); КонецЕсли; + УстановитьВидимостьНаКлиенте(ИмяКонстанты); + Если ИмяКонстанты <> "" Тогда Оповестить("Запись_НаборКонстант", Новый Структура, ИмяКонстанты); КонецЕсли; @@ -499,15 +567,43 @@ КонецЕсли; СтандартнаяОбработка = Ложь; + МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); + Если НавигационнаяСсылкаФорматированнойСтроки = "Программы" Тогда МодульЭлектроннаяПодписьКлиент.ОткрытьНастройкиЭлектроннойПодписиИШифрования("Программы"); + ИначеЕсли НавигационнаяСсылкаФорматированнойСтроки = "ПроверитьУстановкуПрограммКриптографии" Тогда + + ПараметрыПроверки = Новый Структура; + ПараметрыПроверки.Вставить("УстанавливатьРасширение", Истина); + ПараметрыПроверки.Вставить("УстанавливатьКомпоненту", Истина); + ПараметрыПроверки.Вставить("ПредлагатьУстановитьПрограмму", Истина); + МодульЭлектроннаяПодписьКлиент.ПроверитьУстановкуПрограммКриптографии(ЭтотОбъект, ПараметрыПроверки, + Новый ОписаниеОповещения("ПослеПроверкиПрограммКриптографии", ЭтотОбъект)); + Иначе МодульЭлектроннаяПодписьКлиент.ОткрытьНастройкиЭлектроннойПодписиИШифрования("Сертификаты"); КонецЕсли; КонецПроцедуры +&НаКлиенте +Функция АдресСтатьиСервисаDSS() + + Возврат "https://its.1c.ru/bmk/bsp_dss_reqs"; + +КонецФункции + +&НаКлиенте +Процедура ПроверитьВключениеОпцииИспользованиеСервисаDSS(РезультатВыбора, ПараметрыЦикла) Экспорт + + Если РезультатВыбора.Выполнено И РезультатВыбора.Результат = "ОК" Тогда + Подключаемый_ПриИзмененииРеквизита(ПараметрыЦикла.Элемент); + Иначе + НаборКонстант.ИспользоватьСервисDSS = Ложь; + КонецЕсли; + +КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Вызов сервера @@ -582,82 +678,8 @@ КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - Если РеквизитПутьКДанным = "НаборКонстант.ИспользоватьЭлектронныеПодписи" Или РеквизитПутьКДанным - = "НаборКонстант.ИспользоватьШифрование" Или РеквизитПутьКДанным = "" Тогда - - Элементы.НастройкиЭлектроннойПодписиИШифрования.Доступность = НаборКонстант.ИспользоватьЭлектронныеПодписи - Или НаборКонстант.ИспользоватьШифрование; - Элементы.ГруппаУсовершенствованнаяПодпись.Доступность = НаборКонстант.ИспользоватьЭлектронныеПодписи; - Элементы.ГруппаПроверятьПодписиНаСервере.Доступность = НаборКонстант.ИспользоватьЭлектронныеПодписи - Или НаборКонстант.ИспользоватьШифрование; - - Если НаборКонстант.ИспользоватьЭлектронныеПодписи И (РеквизитПутьКДанным - = "НаборКонстант.ИспользоватьЭлектронныеПодписи" Или РеквизитПутьКДанным = "") Тогда - Если ДоступнаУсовершенствованнаяПодпись Тогда - КонстантаАдресаСерверовМетокВремени = Константы["АдресаСерверовМетокВремени"].Получить(); - КонстантаУсовершенствоватьПодписиАвтоматически = Константы["УсовершенствоватьПодписиАвтоматически"].Получить(); - КонстантаДобавлятьМеткиВремениАвтоматически = Константы["ДобавлятьМеткиВремениАвтоматически"].Получить(); - КонстантаТипПодписиКриптографииПоУмолчанию = Константы["ТипПодписиКриптографииПоУмолчанию"].Получить(); - КонстантаУсовершенствоватьПодписиСДаты = Константы["УсовершенствоватьПодписиСДаты"].Получить(); - УстановитьЗаголовокПодсказкиУсовершенствования(); - КонецЕсли; - Если Элементы.СоздаватьЭлектронныеПодписиНаСервере.Видимость Тогда - КонстантаСоздаватьЭлектронныеПодписиНаСервере = Константы["СоздаватьЭлектронныеПодписиНаСервере"].Получить(); - КонецЕсли; - Если Элементы.ПроверятьЭлектронныеПодписиНаСервере.Видимость Тогда - КонстантаПроверятьЭлектронныеПодписиНаСервере = Константы["ПроверятьЭлектронныеПодписиНаСервере"].Получить(); - КонецЕсли; - КонецЕсли; - УстановитьЗаголовокЭлектроннаяПодписьНаСервере(); - ИначеЕсли (РеквизитПутьКДанным = "КонстантаТипПодписиКриптографииПоУмолчанию" Или РеквизитПутьКДанным - = "КонстантаУсовершенствоватьПодписиАвтоматически") И ДоступнаУсовершенствованнаяПодпись Тогда - УстановитьЗаголовокПодсказкиУсовершенствования(); - КонстантаТипПодписиКриптографииПоУмолчанию = Константы["ТипПодписиКриптографииПоУмолчанию"].Получить(); - КонстантаУсовершенствоватьПодписиАвтоматически = Константы["УсовершенствоватьПодписиАвтоматически"].Получить(); - КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодписьСервисаDSS") - И ДоступнаУсовершенствованнаяПодпись - И (РеквизитПутьКДанным = "НаборКонстант.ИспользоватьСервисDSS" Или РеквизитПутьКДанным = "") Тогда - - Если ОбщегоНазначения.РазделениеВключено() Тогда - МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); - ЭтоМодельСервисаСДоступнымУсовершенствованием = МодульЭлектроннаяПодпись.ОбщиеНастройки().ЭтоМодельСервисаСДоступнымУсовершенствованием; - Элементы.ГруппаАвтоматическаяОбработкаПодписей.Видимость = ЭтоМодельСервисаСДоступнымУсовершенствованием; - Элементы.ГруппаДобавлятьМеткиАвтоматически.Видимость = Ложь; - Элементы.ТипПодписиКриптографииПоУмолчанию.ОтображениеПодсказки = ОтображениеПодсказки.ОтображатьСнизу; - Если ЭтоМодельСервисаСДоступнымУсовершенствованием Тогда - Элементы.ТипПодписиКриптографииПоУмолчанию.Видимость = Истина; - Элементы.ТипПодписиКриптографииПоУмолчанию1.Видимость = Ложь; - МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); - МодульЭлектроннаяПодписьСлужебный.ЗаполнитьСписокТиповПодписейКриптографии( - Элементы.ТипПодписиКриптографииПоУмолчанию.СписокВыбора, "Настройки"); - Элементы.ТипПодписиКриптографииПоУмолчаниюРасширеннаяПодсказка.Заголовок = СтроковыеФункции.ФорматированнаяСтрока( - НСтр("ru = 'В приложении в Интернете архивная подпись по умолчанию недоступна, этот тип подписи можно выбрать при подписании сертификатом, установленным на компьютер при установленой программе электронной подписи.'")); - Иначе - Элементы.ТипПодписиКриптографииПоУмолчанию.Видимость = Ложь; - Элементы.ТипПодписиКриптографииПоУмолчанию1.Видимость = Истина; - Элементы.ТипПодписиКриптографииПоУмолчанию1РасширеннаяПодсказка.Заголовок = СтроковыеФункции.ФорматированнаяСтрока( - НСтр("ru = 'В приложении в Интернете по умолчанию установлен тип подписи Базовая, типы подписи с метками времени можно выбрать при подписании сертификатом, установленным на компьютер при установленой программе электронной подписи.'")); - КонецЕсли; - Иначе - МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); - МодульЭлектроннаяПодписьСлужебный.ЗаполнитьСписокТиповПодписейКриптографии( - Элементы.ТипПодписиКриптографииПоУмолчанию.СписокВыбора, "Настройки"); - Элементы.ТипПодписиКриптографииПоУмолчанию.ОтображениеПодсказки = ОтображениеПодсказки.Нет; - Элементы.ТипПодписиКриптографииПоУмолчанию.Видимость = Истина; - Элементы.ТипПодписиКриптографииПоУмолчанию1.Видимость = Ложь; - КонецЕсли; - Иначе - Элементы.ТипПодписиКриптографииПоУмолчанию.ОтображениеПодсказки = ОтображениеПодсказки.Нет; - Если РеквизитПутьКДанным = "" И ДоступнаУсовершенствованнаяПодпись Тогда - Элементы.ТипПодписиКриптографииПоУмолчанию.Видимость = Истина; - Элементы.ТипПодписиКриптографииПоУмолчанию1.Видимость = Ложь; - МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); - МодульЭлектроннаяПодписьСлужебный.ЗаполнитьСписокТиповПодписейКриптографии( - Элементы.ТипПодписиКриптографииПоУмолчанию.СписокВыбора, "Настройки"); - КонецЕсли; - КонецЕсли; + МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); + МодульЭлектроннаяПодписьСлужебный.НастроитьФормуОбщихНастроек(ЭтотОбъект, РеквизитПутьКДанным); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда @@ -694,107 +716,49 @@ КонецПроцедуры -&НаСервере -Процедура УстановитьЗаголовокПодсказкиУсовершенствования() +&НаКлиенте +Процедура УстановитьВидимостьНаКлиенте(ИмяКонстанты) - Если ЗначениеЗаполнено(КонстантаТипПодписиКриптографииПоУмолчанию) Тогда - - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - Возврат; - КонецЕсли; - - МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); - Элементы.ГруппаУсовершенствоватьПодписи.Доступность = - МодульЭлектроннаяПодписьСлужебный.ДоступностьНастроекУсовершенствованияПодписи(КонстантаТипПодписиКриптографииПоУмолчанию); - - Если Элементы.ГруппаУсовершенствоватьПодписи.Доступность Тогда + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + Если ИмяКонстанты = "ИспользоватьЭлектронныеПодписи" + Или ИмяКонстанты = "ИспользоватьШифрование" + Или ИмяКонстанты = "СоздаватьЭлектронныеПодписиНаСервере" + Или ИмяКонстанты = "ПроверятьЭлектронныеПодписиНаСервере" + Или ИмяКонстанты = "" Тогда + + МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); - Элементы.ДекорацияУсовершенствованиеРасширеннаяПодсказка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Подписи, добавленные ранее и полученные извне, будут усовершенствованы для длительного хранения до выбранного типа: %1.'"), - КонстантаТипПодписиКриптографииПоУмолчанию); - - Иначе - Элементы.ДекорацияУсовершенствованиеРасширеннаяПодсказка.Заголовок = - НСтр("ru = 'Подписи, добавленные ранее и полученные извне, будут усовершенствованы для длительного хранения до выбранного типа.'"); + Если Не МодульЭлектроннаяПодписьКлиент.СоздаватьЭлектронныеПодписиНаСервере() + И Не МодульЭлектроннаяПодписьКлиент.ПроверятьЭлектронныеПодписиНаСервере() + И (МодульЭлектроннаяПодписьКлиент.ИспользоватьЭлектронныеПодписи() + Или МодульЭлектроннаяПодписьКлиент.ИспользоватьШифрование()) Тогда + + ПараметрыПроверки = Новый Структура; + ПараметрыПроверки.Вставить("УстанавливатьРасширение", Ложь); + ПараметрыПроверки.Вставить("УстанавливатьКомпоненту", Ложь); + ПараметрыПроверки.Вставить("ПредлагатьУстановитьПрограмму", Ложь); + + МодульЭлектроннаяПодписьКлиент.ПроверитьУстановкуПрограммКриптографии(ЭтотОбъект, ПараметрыПроверки, + Новый ОписаниеОповещения("ПослеПроверкиПрограммКриптографии", ЭтотОбъект)); + Иначе + Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Ложь; + КонецЕсли; КонецЕсли; - Иначе - Элементы.ДекорацияУсовершенствованиеРасширеннаяПодсказка.Заголовок = - НСтр("ru = 'Не выбран тип подписи для документов.'"); - Элементы.ГруппаУсовершенствоватьПодписи.Доступность = Ложь; + Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Ложь; КонецЕсли; - + КонецПроцедуры -&НаСервере -Процедура УстановитьЗаголовокЭлектроннаяПодписьНаСервере() +&НаКлиенте +Процедура ПослеПроверкиПрограммКриптографии(Результат, ДополнительныеПараметры) Экспорт - Если ОбщегоНазначения.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - - ИнформационнаяБазаФайловая = ОбщегоНазначения.ИнформационнаяБазаФайловая(); - - Если НаборКонстант.ИспользоватьЭлектронныеПодписи Тогда - ЗаголовокФлажка = НСтр("ru = 'Проверять подписи и сертификаты на сервере'"); - ПодсказкаФлажка = - НСтр("ru = 'Позволяет не устанавливать программу электронной подписи на компьютер пользователя для проверки электронных подписей и сертификатов.'"); + Если Результат.Программы.Количество() = 0 И Результат.ПрограммыНаСервере.Количество() = 0 Тогда + Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Истина; Иначе - ЗаголовокФлажка = НСтр("ru = 'Проверять сертификаты на сервере'"); - ПодсказкаФлажка = - НСтр("ru = 'Позволяет не устанавливать программу электронной подписи на компьютер пользователя для проверки сертификатов.'"); + Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Ложь; КонецЕсли; - - Элементы.ПроверятьЭлектронныеПодписиНаСервере.Заголовок = ЗаголовокФлажка; - - Если ИнформационнаяБазаФайловая Тогда - ПодсказкаНаСервере = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Важно: на компьютер, где работает веб-сервер, подключенный к файловой информационной базе, должна быть установлена хотя бы одна %1.'"), - НСтр("ru = 'программа электронной подписи из списка'")); - Иначе - ПодсказкаНаСервере = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Важно: на каждый компьютер, где работает сервер 1С:Предприятия, должна быть установлена хотя бы одна %1.'"), - НСтр("ru = 'программа электронной подписи из списка'")); - КонецЕсли; - - ПодсказкаФлажка = ПодсказкаФлажка + Символы.ПС + Символы.ПС + ПодсказкаНаСервере; - - Элементы.ПроверятьЭлектронныеПодписиНаСервереРасширеннаяПодсказка.Заголовок = - СтроковыеФункции.ФорматированнаяСтрока(ПодсказкаФлажка); - - Если Не НаборКонстант.ИспользоватьЭлектронныеПодписи Тогда - ЗаголовокФлажка = НСтр("ru = 'Шифровать и расшифровывать на сервере'"); - ПодсказкаФлажка = - НСтр("ru = 'Позволяет не устанавливать программу электронной подписи и сертификат на компьютер пользователя для шифрования и расшифровки.'"); - - ИначеЕсли Не НаборКонстант.ИспользоватьШифрование Тогда - ЗаголовокФлажка = НСтр("ru = 'Подписывать на сервере'"); - ПодсказкаФлажка = - НСтр("ru = 'Позволяет не устанавливать программу электронной подписи и сертификат на компьютер пользователя для подписания.'"); - Иначе - ЗаголовокФлажка = НСтр("ru = 'Подписывать и шифровать на сервере'"); - ПодсказкаФлажка = - НСтр("ru = 'Позволяет не устанавливать программу электронной подписи и сертификат на компьютер пользователя для подписания, шифрования и расшифровки.'"); - КонецЕсли; - - Элементы.СоздаватьЭлектронныеПодписиНаСервере.Заголовок = ЗаголовокФлажка; - - Если ИнформационнаяБазаФайловая Тогда - ПодсказкаНаСервере = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Важно: на компьютер, где работает веб-сервер, подключенный к файловой информационной базе, должна быть установлена %1 и %2.'"), - НСтр("ru = 'программа электронной подписи'"), - НСтр("ru = 'сертификат с закрытым ключом'")); - Иначе - ПодсказкаНаСервере = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Важно: на каждый компьютер, где работает сервер 1С:Предприятия, должна быть установлена %1 и %2.'"), - НСтр("ru = 'программа электронной подписи'"), - НСтр("ru = 'сертификат с закрытым ключом'")); - КонецЕсли; - - ПодсказкаФлажка = ПодсказкаФлажка + Символы.ПС + Символы.ПС + ПодсказкаНаСервере; - Элементы.СоздаватьЭлектронныеПодписиНаСервереРасширеннаяПодсказка.Заголовок = - СтроковыеФункции.ФорматированнаяСтрока(ПодсказкаФлажка); - + КонецПроцедуры &НаСервере diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Form.form index 79d275c22..094f15277 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Form.form @@ -112,7 +112,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -201,7 +200,6 @@ UsualGroup Vertical - Auto true true Auto @@ -281,7 +279,6 @@ UsualGroup Vertical - Auto true true Auto @@ -306,7 +303,6 @@ UsualGroup HorizontalIfPossible - Auto true true Equal @@ -390,7 +386,6 @@ UsualGroup Vertical - Auto true true Auto @@ -471,7 +466,6 @@ UsualGroup Vertical - Auto true true Auto @@ -496,7 +490,6 @@ UsualGroup HorizontalIfPossible - Auto true true Equal @@ -572,7 +565,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -598,7 +590,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -667,7 +658,6 @@ UsualGroup Vertical - Auto true true Auto @@ -732,7 +722,6 @@ UsualGroup Vertical - Auto true true Auto @@ -757,7 +746,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -946,7 +934,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1026,7 +1013,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1055,7 +1041,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1137,7 +1122,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1222,7 +1206,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1283,7 +1266,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1312,7 +1294,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1432,7 +1413,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1497,7 +1477,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1522,7 +1501,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1637,7 +1615,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1718,7 +1695,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1743,7 +1719,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1859,7 +1834,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1940,7 +1914,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1965,7 +1938,6 @@ UsualGroup HorizontalIfPossible - Auto true true Equal @@ -2103,7 +2075,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2134,7 +2105,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2190,7 +2160,6 @@ UsualGroup HorizontalIfPossible - Auto true true Equal @@ -2328,7 +2297,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2359,7 +2327,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2415,7 +2382,6 @@ UsualGroup HorizontalIfPossible - Auto true true Equal diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Help/ru.html index 9f0c6cf50..d3737f2ce 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Help/ru.html +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Help/ru.html @@ -9,7 +9,7 @@ TD {

    Почта

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

      -
    • Почтовый клиент - включите флажок, для того чтобы использовать возможности встроенного в программу почтового клиента для взаимодействий с помощью электронных писем (e-mail). Использование всех типов взаимодействий без почтового клиента невозможно. После включения становятся доступными команды для настройки взаимодействий: +
    • Почтовый клиент - включите флажок, для того чтобы использовать возможности встроенного в программу почтового клиента для взаимодействий с помощью электронных писем (e-mail). Использование всех типов взаимодействий без почтового клиента невозможно. После включения становятся доступными команды для настройки взаимодействий:
      • Исходящие письма в формате HTML - включите флажок, для того чтобы редактировать исходящие письма в формате HTML.
      • Звонки, SMS, встречи и запланированные взаимодействия - включите флажок, для того чтобы регистрировать в программе звонки, встречи, сообщения SMS и запланированные взаимодействия. diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Form.form index 8a82329a6..23434854a 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Form.form @@ -112,7 +112,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -216,7 +215,6 @@ UsualGroup Vertical - Auto true true Auto @@ -372,7 +370,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -403,7 +400,6 @@ UsualGroup Vertical - Auto true true Auto @@ -432,7 +428,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -445,23 +440,57 @@ ГруппаВариантыРассылки 1575 - ГруппаОтчеты - 1674 - - ОткрытьВариантыОтчетов - 1391 + ГруппаОтчетыУниверсальныйОтчет + 1740 + + ГруппаОтчеты + 1674 + + ОткрытьВариантыОтчетов + 1391 + true + true + + true + + + ОткрытьВариантыОтчетовExtendedTooltip + 1610 + + <key>ru</key> + <value>Администрирование списка всех вариантов отчетов, назначение ответственных и настройка видимости.</value> + + Label + true + true + + Left + + + Hyperlink + Catalog.ВариантыОтчетов.StandardCommand.OpenList + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + true true true + + <key>ru</key> + <value>Отчеты</value> + + 43 + false - ОткрытьВариантыОтчетовExtendedTooltip - 1610 - - <key>ru</key> - <value>Администрирование списка всех вариантов отчетов, назначение ответственных и настройка видимости.</value> - + ГруппаОтчетыРасширеннаяПодсказка + 1675 Label true true @@ -469,15 +498,178 @@ Left - Hyperlink - Catalog.ВариантыОтчетов.StandardCommand.OpenList - Normal - Auto - true - true - UserCmds - ShowBottom - Auto + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + + ГруппаУниверсальныйОтчетКолонтитулы + 1641 + + ГруппаУниверсальныйОтчет + 1670 + + УниверсальныйОтчет + 1678 + true + true + + true + + + УниверсальныйОтчетРасширеннаяПодсказка + 1679 + + <key>ru</key> + <value>Просмотр произвольных справочников, документов, регистров и т.д.</value> + + Label + true + + Left + + + Hyperlink + Report.УниверсальныйОтчет.StandardCommand.Open + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Универсальный отчет</value> + + 43 + false + + ГруппаУниверсальныйОтчетРасширеннаяПодсказка + 1671 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + + ГруппаНастройкаКолонтитулов + 1692 + + НастройкаКолонтитулов + 1694 + + <key>ru</key> + <value>Настройка колонтитулов</value> + + true + true + + true + + + НастройкаКолонтитуловРасширеннаяПодсказка + 1695 + + <key>ru</key> + <value>Установка номеров страниц, даты и других полей в колонтитулах отчетов при печати.</value> + + Label + true + true + + Left + + + Hyperlink + CommonCommand.НастройкаКолонтитулов + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Настройка колонтитулов</value> + + + ГруппаНастройкаКолонтитуловРасширеннаяПодсказка + 1693 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Универсальный отчет и настройка колонтитулов</value> + + + ГруппаУниверсальныйОтчетКолонтитулыРасширеннаяПодсказка + 1642 + Label + true + true + + Left + + + UsualGroup + + Vertical + NormalSeparation + true + true + Equal + Auto + Auto + true true @@ -486,13 +678,11 @@ <key>ru</key> - <value>Отчеты</value> + <value>Отчеты и универсальный отчет</value> - 43 - false - ГруппаОтчетыРасширеннаяПодсказка - 1675 + ГруппаОтчетыУниверсальныйОтчетРасширеннаяПодсказка + 1741 Label true true @@ -502,7 +692,7 @@ UsualGroup - HorizontalIfPossible + Vertical Auto true true @@ -526,7 +716,7 @@ 1613 <key>ru</key> - <value>Настройка списка рассылок отчетов, отправка по требованию или автоматически по расписанию.</value> + <value>Настройка автоматических рассылок отчетов по почте, публикации в папку, на FTP-ресурс по заданному расписанию или по требованию.</value> Label true @@ -545,6 +735,159 @@ ShowBottom Auto + + ГруппаНастройкиИсторииРассылкиОтчетов + 1728 + + ХранитьИсториюРассылкиОтчетов + 1725 + + <key>ru</key> + <value>Хранить историю за последние</value> + + true + true + + true + + + НаборКонстант.ХранитьИсториюРассылкиОтчетов + + Right + + OnChange + ХранитьИсториюРассылкиОтчетовПриИзменении + + + ХранитьИсториюРассылкиОтчетовРасширеннаяПодсказка + 1727 + Label + true + true + + Left + + + + ХранитьИсториюРассылкиОтчетовКонтекстноеМеню + 1726 + true + + CheckBoxField + Enter + true + Left + true + + + + КоличествоМесяцевХраненияИсторииРассылкиОтчетов + 1732 + true + true + + true + + + НаборКонстант.КоличествоМесяцевХраненияИсторииРассылкиОтчетов + + None + + OnChange + КоличествоМесяцевХраненияИсторииРассылкиОтчетовПриИзменении + + + КоличествоМесяцевХраненияИсторииРассылкиОтчетовРасширеннаяПодсказка + 1734 + Label + true + true + + Left + + + + КоличествоМесяцевХраненияИсторииРассылкиОтчетовКонтекстноеМеню + 1733 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ОчиститьИсториюРассылкиОтчетов + 1738 + true + true + + true + + + ОчиститьИсториюРассылкиОтчетовРасширеннаяПодсказка + 1739 + Label + true + true + + Left + + + UsualButton + Form.Command.ОчиститьИсториюРассылкиОтчетов + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа настройки истории рассылки отчетов</value> + + ShowBottom + + ГруппаНастройкиИсторииРассылкиОтчетовРасширеннаяПодсказка + 1729 + + <key>ru</key> + <value>Позволяет узнать, когда, кому и с каким результатом были разосланы отчеты. Для ограничения объема хранимых данных устаревшая история рассылок удаляется автоматически. </value> + + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + true true @@ -568,8 +911,7 @@ UsualGroup - HorizontalIfPossible - Auto + Vertical true true Auto @@ -598,174 +940,6 @@ UsualGroup HorizontalIfPossible - Auto - NormalSeparation - true - true - Equal - Auto - Auto - - - - ГруппаУниверсальныйОтчетРасширения - 1641 - - ГруппаУниверсальныйОтчет - 1670 - - УниверсальныйОтчет - 1678 - true - true - - true - - - УниверсальныйОтчетРасширеннаяПодсказка - 1679 - - <key>ru</key> - <value>Просмотр произвольных справочников, документов, регистров и т.д.</value> - - Label - true - - Left - - - Hyperlink - Report.УниверсальныйОтчет.StandardCommand.Open - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Универсальный отчет</value> - - 43 - false - - ГруппаУниверсальныйОтчетРасширеннаяПодсказка - 1671 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - true - Auto - Auto - - - - ГруппаНастройкаКолонтитулов - 1692 - - НастройкаКолонтитулов - 1694 - - <key>ru</key> - <value>Настройка колонтитулов</value> - - true - true - - true - - - НастройкаКолонтитуловРасширеннаяПодсказка - 1695 - - <key>ru</key> - <value>Установка номеров страниц, даты и других полей в колонтитулах отчетов при печати.</value> - - Label - true - true - - Left - - - Hyperlink - CommonCommand.НастройкаКолонтитулов - Normal - Auto - true - true - UserCmds - ShowBottom - Auto - - true - true - - true - - - <key>ru</key> - <value>Настройка колонтитулов</value> - - - ГруппаНастройкаКолонтитуловРасширеннаяПодсказка - 1693 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Универсальный отчет расширения</value> - - - ГруппаУниверсальныйОтчетРасширенияРасширеннаяПодсказка - 1642 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto NormalSeparation true true @@ -836,7 +1010,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -902,7 +1075,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -931,7 +1103,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1017,7 +1188,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1082,7 +1252,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1111,7 +1280,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1142,7 +1310,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1225,7 +1392,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1294,7 +1460,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1324,7 +1489,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1413,6 +1577,28 @@ Auto Auto + + ОчиститьИсториюРассылкиОтчетов + + <key>ru</key> + <value>Очистить</value> + + 3 + + ru + Очистить историю рассылки отчетов + + + true + + + + ОчиститьИсториюРассылкиОтчетов + + + Auto + Auto + diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Module.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Module.bsl index 33cbca8f8..5eb53bbb4 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Module.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Module.bsl @@ -30,7 +30,18 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); - Элементы.ОткрытьРассылкиОтчетов.Видимость = МодульРассылкаОтчетов.ПравоДобавления(); + Элементы.ОткрытьРассылкиОтчетов.Видимость = МодульРассылкаОтчетов.ПравоДобавления(); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда + ТекстПодсказки = НСтр("ru = 'Позволяет узнать, когда, кому и с каким результатом были разосланы отчеты. Для ограничения объема хранимых данных + |устаревшая история рассылок удаляется автоматически. Вместе с историей рассылок отчетов бессрочно сохраняются отправленные электронные письма.'"); + Элементы.ГруппаНастройкиИсторииРассылкиОтчетов.РасширеннаяПодсказка.Заголовок = ТекстПодсказки; + КонецЕсли; + ФорматЧисла = НСтр("ru = '%Число% %Месяцев%'"); + ФорматЧисла = СтрЗаменить(ФорматЧисла, "%Число%", "Ч"); + ФорматЧисла = СтрЗаменить(ФорматЧисла, "%Месяцев%", НСтр("ru = 'мес.'")); + Элементы.КоличествоМесяцевХраненияИсторииРассылкиОтчетов.ФорматРедактирования = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ЧФ='%1'", ФорматЧисла); + Элементы.КоличествоМесяцевХраненияИсторииРассылкиОтчетов.Ширина = СтрДлина(ФорматЧисла); Иначе Элементы.ГруппаРассылкиОтчетов.Видимость = Ложь; КонецЕсли; @@ -93,6 +104,25 @@ КонецПроцедуры +&НаКлиенте +Процедура ХранитьИсториюРассылкиОтчетовПриИзменении(Элемент) + + Подключаемый_ПриИзмененииРеквизита(Элемент); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда + МодульРассылкаОтчетовВызовСервера = ОбщегоНазначенияКлиент.ОбщийМодуль("РассылкаОтчетовВызовСервера"); + МодульРассылкаОтчетовВызовСервера.ПриИзмененииХранитьИсториюРассылкиОтчетов(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура КоличествоМесяцевХраненияИсторииРассылкиОтчетовПриИзменении(Элемент) + + Подключаемый_ПриИзмененииРеквизита(Элемент); + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы @@ -105,11 +135,20 @@ МодульДополнительныеОтчетыИОбработкиКлиент.ОткрытьСписокДополнительныхОтчетовИОбработок(); КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОчиститьИсториюРассылкиОтчетов(Команда) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда + МодульРассылкаОтчетовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РассылкаОтчетовКлиент"); + МодульРассылкаОтчетовКлиент.ОчиститьИсториюРассылкиОтчетов(ЭтотОбъект); + КонецЕсли; + КонецПроцедуры #КонецОбласти - #Область СлужебныеПроцедурыИФункции &НаКлиенте @@ -245,8 +284,13 @@ Если РеквизитПутьКДанным = "НаборКонстант.ИспользоватьУчетОригиналовПервичныхДокументов" ИЛИ РеквизитПутьКДанным = "" И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов") Тогда Элементы.ОткрытьСостоянияОригиналовПервичныхДокументов.Доступность = НаборКонстант.ИспользоватьУчетОригиналовПервичныхДокументов; - КонецЕсли; + КонецЕсли; + Если РеквизитПутьКДанным = "НаборКонстант.ХранитьИсториюРассылкиОтчетов" ИЛИ РеквизитПутьКДанным = "" + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда + Элементы.КоличествоМесяцевХраненияИсторииРассылкиОтчетов.Доступность = НаборКонстант["ХранитьИсториюРассылкиОтчетов"]; + КонецЕсли; + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Form.form index 5f6cc4d71..eb6e86c0d 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Form.form @@ -112,7 +112,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -195,7 +194,6 @@ UsualGroup Vertical - Auto true true Auto @@ -261,7 +259,6 @@ UsualGroup Vertical - Auto true true Auto @@ -290,7 +287,6 @@ UsualGroup HorizontalIfPossible - Auto true true Equal @@ -412,7 +408,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -446,7 +441,6 @@ UsualGroup Vertical - Auto true true Auto @@ -475,7 +469,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -545,7 +538,6 @@ UsualGroup Vertical - Auto true true Auto @@ -615,7 +607,6 @@ UsualGroup Vertical - Auto true true Auto @@ -644,7 +635,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -766,7 +756,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -900,7 +889,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -966,7 +954,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/ПанельАдминистрированияБСП.mdo b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/ПанельАдминистрированияБСП.mdo index ef70c744a..13aa09373 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/ПанельАдминистрированияБСП.mdo +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/ПанельАдминистрированияБСП.mdo @@ -239,7 +239,7 @@ Auto ru - Интернет-сервисы и поддержка. Обновление версии программы. Загрузка классификаторов. + Интернет-сервисы и поддержка. Загрузка классификаторов. diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСПВМоделиСервиса/Forms/СинхронизацияДанныхДляАдминистратораСервиса/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСПВМоделиСервиса/Forms/СинхронизацияДанныхДляАдминистратораСервиса/Form.form index ef4c44980..ba5ba851b 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСПВМоделиСервиса/Forms/СинхронизацияДанныхДляАдминистратораСервиса/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСПВМоделиСервиса/Forms/СинхронизацияДанныхДляАдминистратораСервиса/Form.form @@ -63,7 +63,6 @@ UsualGroup Vertical - Auto true true Auto @@ -183,7 +182,6 @@ UsualGroup Vertical - Auto true true Auto @@ -216,7 +214,6 @@ UsualGroup Vertical - Auto true true Auto @@ -363,7 +360,6 @@ UsualGroup Vertical - Auto true true Auto @@ -473,7 +469,6 @@ UsualGroup Vertical - Auto true true Auto @@ -583,7 +578,6 @@ UsualGroup Vertical - Auto true true Auto @@ -608,7 +602,6 @@ UsualGroup Vertical - Auto true true Auto @@ -636,7 +629,6 @@ UsualGroup - Auto true true Auto @@ -666,7 +658,6 @@ UsualGroup Vertical - Auto true true Auto @@ -889,7 +880,6 @@ UsualGroup Vertical - Auto true true Auto @@ -982,7 +972,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1006,7 +995,6 @@ UsualGroup - Auto NormalSeparation true true @@ -1173,7 +1161,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/ПереносФайлов/Forms/Форма/Form.form b/SSL/src/DataProcessors/ПереносФайлов/Forms/Форма/Form.form index 3ffbd01b6..d9cbc12de 100644 --- a/SSL/src/DataProcessors/ПереносФайлов/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ПереносФайлов/Forms/Форма/Form.form @@ -185,7 +185,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -300,7 +299,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -416,7 +414,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -583,7 +580,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -612,7 +608,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -732,7 +727,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -842,7 +836,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -870,7 +863,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/DataProcessors/ПереносФайлов/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ПереносФайлов/Forms/Форма/Module.bsl index 780771e18..cbf7316cb 100644 --- a/SSL/src/DataProcessors/ПереносФайлов/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ПереносФайлов/Forms/Форма/Module.bsl @@ -359,9 +359,11 @@ И МетаданныеВладельца.Реквизиты.ВладелецФайла.Тип.СодержитТип(Тип(ТипВладельцаСтрокой)) Тогда ОтборПоВладельцуУстановлен = Истина; - ТекстЗапроса = ТекстЗапроса + " + ДополнительноеУсловие = " |ГДЕ - | ВерсииФайлов.Владелец.ВладелецФайла ССЫЛКА " + ВладелецФайлов; // @query-part + | ВерсииФайлов.Владелец.ВладелецФайла ССЫЛКА Справочник.Файлы"; // @query-part + ДополнительноеУсловие = СтрЗаменить(ДополнительноеУсловие, "Справочник.Файлы", ВладелецФайлов); + ТекстЗапроса = ТекстЗапроса + ДополнительноеУсловие; КонецЕсли; diff --git a/SSL/src/DataProcessors/ПереносФайлов/ManagerModule.bsl b/SSL/src/DataProcessors/ПереносФайлов/ManagerModule.bsl index 61a3b3913..4e5b5f5b9 100644 --- a/SSL/src/DataProcessors/ПереносФайлов/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ПереносФайлов/ManagerModule.bsl @@ -221,8 +221,8 @@ ОписаниеОшибки.Вставить("Ошибка", ""); ОписаниеОшибки.Вставить("ПодробноеПредставлениеОшибки", ""); ОписаниеОшибки.Вставить("Версия", ФайлСсылка); - ОписаниеОшибки.Ошибка = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - ОписаниеОшибки.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ОписаниеОшибки.Ошибка = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ОписаниеОшибки.ПодробноеПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); Возврат ОписаниеОшибки; КонецФункции diff --git a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/НастройкиСообщенийИзДругихПрограмм/Module.bsl b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/НастройкиСообщенийИзДругихПрограмм/Module.bsl index ad850d34e..1a297ff8b 100644 --- a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/НастройкиСообщенийИзДругихПрограмм/Module.bsl +++ b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/НастройкиСообщенийИзДругихПрограмм/Module.bsl @@ -66,14 +66,14 @@ ТипыИнтеграции.Вставить(ТипИнтеграции.Тип, ТипИнтеграции); КонецЦикла; - Для каждого Интеграция Из Вычислить("СистемаВзаимодействия.ПолучитьИнтеграции()") Цикл // АПК:488-безопасный код + Для каждого Интеграция Из СистемаВзаимодействия.ПолучитьИнтеграции() Цикл Категория = ТипыИнтеграции[Интеграция.ТипВнешнейСистемы]; Если Категория <> Неопределено Тогда НоваяИнтеграция = Категория.ПолучитьЭлементы().Добавить(); ИнтеграцияВДанныеФормы(Интеграция, НоваяИнтеграция); Иначе - ЗаписьЖурналаРегистрации(ОбсужденияСлужебный.СобытиеЖурналаРегистрации(), + ЗаписьЖурналаРегистрации(ОбсужденияСлужебный.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, НСтр("ru='Не поддерживаемый тип внешней интеграции'")); КонецЕсли; diff --git a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаВКонтакте/Form.form b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаВКонтакте/Form.form index 81668f77d..e2451d27a 100644 --- a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаВКонтакте/Form.form +++ b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаВКонтакте/Form.form @@ -107,7 +107,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -278,7 +277,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаВКонтакте/Module.bsl b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаВКонтакте/Module.bsl index 13d8adfd0..b6ad1b6ae 100644 --- a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаВКонтакте/Module.bsl +++ b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаВКонтакте/Module.bsl @@ -12,7 +12,7 @@ Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если Параметры.Идентификатор <> Неопределено Тогда - ОписаниеИнтеграции = Вычислить("СистемаВзаимодействия.ПолучитьИнтеграцию(Параметры.Идентификатор)"); // АПК:488-безопасный код + ОписаниеИнтеграции = СистемаВзаимодействия.ПолучитьИнтеграцию(Параметры.Идентификатор); Если ОписаниеИнтеграции <> Неопределено Тогда Наименование = ОписаниеИнтеграции.Представление; Токен = ОписаниеИнтеграции.ПараметрыВнешнейСистемы.Получить("token"); @@ -60,8 +60,8 @@ АктивироватьСервер(); Закрыть(Истина); Исключение - ПоказатьПредупреждение(, НСтр("ru='Во время активизации чат-бота произошла ошибка'") - + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ПоказатьПредупреждение(, НСтр("ru='Не удалось активировать чат-бот по причине:'") + + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры @@ -81,7 +81,7 @@ Исключение ЗаписьЖурналаРегистрации(ОбсужденияСлужебный.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -107,8 +107,8 @@ ОтключитьСервер(); Закрыть(Истина); Исключение - ПоказатьПредупреждение(, НСтр("ru='Во время отключение чат-бота произошла ошибка'") - + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ПоказатьПредупреждение(, НСтр("ru='Не удалось отключить чат-бот по причине:'") + + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры diff --git a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаТелеграм/Form.form b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаТелеграм/Form.form index f223a836b..e409953d2 100644 --- a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаТелеграм/Form.form +++ b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаТелеграм/Form.form @@ -113,7 +113,6 @@ HorizontalIfPossible Center - Auto true true Auto @@ -236,7 +235,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаТелеграм/Module.bsl b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаТелеграм/Module.bsl index a3b2b791f..32fa79638 100644 --- a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаТелеграм/Module.bsl +++ b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаТелеграм/Module.bsl @@ -12,7 +12,7 @@ Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если Параметры.Идентификатор <> Неопределено Тогда - ОписаниеИнтеграции = Вычислить("СистемаВзаимодействия.ПолучитьИнтеграцию(Параметры.Идентификатор)"); // АПК:488-безопасный код + ОписаниеИнтеграции = СистемаВзаимодействия.ПолучитьИнтеграцию(Параметры.Идентификатор); Если ОписаниеИнтеграции <> Неопределено Тогда Наименование = ОписаниеИнтеграции.Представление; @@ -52,8 +52,8 @@ АктивироватьСервер(); Закрыть(Истина); Исключение - ПоказатьПредупреждение(, НСтр("ru='Во время активизации чат-бота произошла ошибка'") - + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ПоказатьПредупреждение(, НСтр("ru='Не удалось активировать чат-бот по причине:'") + + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры @@ -72,7 +72,7 @@ Исключение ЗаписьЖурналаРегистрации(ОбсужденияСлужебный.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -98,8 +98,8 @@ ОтключитьСервер(); Закрыть(Истина); Исключение - ПоказатьПредупреждение(, НСтр("ru='Во время отключение чат-бота произошла ошибка'") - + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ПоказатьПредупреждение(, НСтр("ru='Не удалось отключить чат-бота по причине:'") + + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры diff --git a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/Форма/Form.form b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/Форма/Form.form index 8511d8d6c..9515c276e 100644 --- a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/Форма/Form.form @@ -550,7 +550,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -611,7 +610,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1167,7 +1165,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/Форма/Module.bsl index f6c9d1349..620de1065 100644 --- a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/Форма/Module.bsl @@ -146,7 +146,7 @@ Процедура ПриОбработкеОшибкиПолученияКодаРегистрации(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; - ПоказатьИнформациюОбОшибке(ИнформацияОбОшибке); + ОбработкаОшибок.ПоказатьИнформациюОбОшибке(ИнформацияОбОшибке); СостояниеРегистрации = "НеЗарегистрирована"; ПриИзмененииСостоянияФормы(ЭтотОбъект); @@ -196,7 +196,7 @@ Процедура ПриОбработкеОшибкиРегистрации(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; - ПоказатьИнформациюОбОшибке(ИнформацияОбОшибке); + ОбработкаОшибок.ПоказатьИнформациюОбОшибке(ИнформацияОбОшибке); СостояниеРегистрации = "ОжиданиеВводаКодаПодтверждения"; ПриИзмененииСостоянияФормы(ЭтотОбъект); diff --git a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ОбластьПоискаДублей/Form.form b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ОбластьПоискаДублей/Form.form index c76965550..41a954fbf 100644 --- a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ОбластьПоискаДублей/Form.form +++ b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ОбластьПоискаДублей/Form.form @@ -215,6 +215,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 28 + + СтрокаПоискаРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 29 + true + + ОбластиПоискаДублей + + true + + Left diff --git a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Form.form b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Form.form index 75ee466e6..b2604ffb0 100644 --- a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Form.form +++ b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Form.form @@ -183,7 +183,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1198,7 +1197,7 @@ Left - 0 + Form.Item.НайденныеДубли.StandardCommand.OutputList Normal Auto true @@ -1271,6 +1270,7 @@ true true true + Top true @@ -1487,6 +1487,7 @@ true true true + Top true @@ -1627,7 +1628,6 @@ UsualGroup HorizontalIfPossible - Auto ru ... @@ -1662,7 +1662,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1778,7 +1777,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1988,7 +1986,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2128,7 +2125,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2411,6 +2407,7 @@ true true AsFileRef + Top true @@ -2956,52 +2953,6 @@ UserCmds Auto - - НеобработанныеДублиКонтекстноеМенюГруппаИзменитьФорму - 440 - - НеобработанныеДублиКонтекстноеМенюИзменитьФорму - 438 - true - true - - true - - - НеобработанныеДублиКонтекстноеМенюИзменитьФормуРасширеннаяПодсказка - 439 - Label - true - true - - Left - - - 0 - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - НеобработанныеДублиКонтекстноеМенюГруппаИзменитьФормуРасширеннаяПодсказка - 441 - Label - true - true - - Left - - - - true Tree @@ -3025,6 +2976,7 @@ true true true + Top true @@ -3283,6 +3235,7 @@ true true true + Top true @@ -3486,7 +3439,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3595,7 +3547,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3628,7 +3579,6 @@ UsualGroup Vertical - Auto true true Auto @@ -4092,7 +4042,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -4291,7 +4240,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Module.bsl b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Module.bsl index 40f7dd7a8..42dbbbfec 100644 --- a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Module.bsl +++ b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Module.bsl @@ -1296,7 +1296,7 @@ Возврат; КонецЕсли; - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ОбластьПоискаДублей); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ОбластьПоискаДублей); // 2. Инициализация СКД, которая используется для отборов. СхемаКомпоновки = Новый СхемаКомпоновкиДанных; diff --git a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПравилаОтбора/Form.form b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПравилаОтбора/Form.form index b4a1624fa..73d54acec 100644 --- a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПравилаОтбора/Form.form +++ b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПравилаОтбора/Form.form @@ -135,6 +135,7 @@ true true true + CommandBar true All false diff --git a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПравилаПоиска/Form.form b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПравилаПоиска/Form.form index 3749a104c..ed979c1c5 100644 --- a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПравилаПоиска/Form.form +++ b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПравилаПоиска/Form.form @@ -298,6 +298,7 @@ true true true + Top true @@ -445,7 +446,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/DataProcessors/ПоискИУдалениеДублей/ObjectModule.bsl b/SSL/src/DataProcessors/ПоискИУдалениеДублей/ObjectModule.bsl index 26411dd25..be39aba0d 100644 --- a/SSL/src/DataProcessors/ПоискИУдалениеДублей/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ПоискИУдалениеДублей/ObjectModule.bsl @@ -20,7 +20,7 @@ // ПланыСчетовМенеджер, ПланыВидовРасчетаМенеджер - менеджер объекта. // Функция МенеджерОбластиПоискаДублей(Знач ИмяОбластиПоискаДанных) Экспорт - ОбластьПоискаДанных = Метаданные.НайтиПоПолномуИмени(ИмяОбластиПоискаДанных); + ОбластьПоискаДанных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбластиПоискаДанных); Если Метаданные.Справочники.Содержит(ОбластьПоискаДанных) Тогда Возврат Справочники[ОбластьПоискаДанных.Имя]; @@ -40,35 +40,33 @@ НСтр("ru = 'Некорректный тип объекта метаданных ""%1""'"), ИмяОбластиПоискаДанных); КонецФункции -// Поиск дублей во всех данных информационной базы. +// Выполняет поиск дублей во всех данных информационной базы. +// Возвращает свойство МестаИспользования, если ПараметрыПоиска.РассчитыватьМестаИспользования = Истина. // // Параметры: // ПараметрыПоиска - см. ПоискИУдалениеДублей.ПараметрыПоискаДублей -// ЭталонныйОбъект - Произвольный - объект, для которого производится поиск дублей. +// ЭталонныйОбъект - ЛюбаяСсылка, СправочникОбъект - элемент, для которого производится поиск дублей. // // Возвращаемое значение: -// Структура - результаты поиска дублей: -// * ТаблицаДублей - ТаблицаЗначений - найденные дубли (в интерфейс выводятся в 2 уровня: Родители и Элементы), где: +// Структура: +// * ТаблицаДублей - ТаблицаЗначений: // ** Ссылка - ЛюбаяСсылка - ссылка элемента. // ** Код - Строка // - Число - код элемента. // ** Наименование - Строка - наименование элемента. -// ** Родитель - Произвольный - родитель группы дублей. Если Родитель пустой, то элемент является -// родителем группы дублей. +// ** Родитель - ЛюбаяСсылка - родитель группы дублей. Если Родитель пустой, то элемент является +// родителем группы дублей. // ** ДругиеПоля - Произвольный - значение соответствующего полей отборов и критериев сравнения дублей. // * ОписаниеОшибки - Неопределено - ошибки не возникло. // - Строка - описание ошибки, возникшей в процессе поиска дублей. // * ВозвращеноМеньшеЧемНайдено - Булево - Истина, если превышен размер возвращаемой порции. -// * МестаИспользования - Неопределено -// - ТаблицаЗначений - заполняется, если -// ПараметрыПоиска.РассчитыватьМестаИспользования = Истина. -// Описание колонок таблицы см. в ОбщегоНазначения.МестаИспользования. +// * МестаИспользования - см. ОбщегоНазначения.МестаИспользования // Функция ГруппыДублей(Знач ПараметрыПоиска, Знач ЭталонныйОбъект = Неопределено) Экспорт Перем МестаИспользования; ПолноеИмяОбъектаМетаданных = ПараметрыПоиска.ОбластьПоискаДублей; - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъектаМетаданных); // Уточняем входные параметры. РазмерВозвращаемойПорции = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыПоиска, "МаксимальноеЧислоДублей"); @@ -317,9 +315,13 @@ // Результат и цикл поиска КоллекцияДублей = КоллекцияДублей(ПараметрыПоиска, ПоляДляСравненияНаПодобие, ПоляДляСравненияНаРавенство); - ТаблицаДублей = КоллекцияДублей.ТаблицаДублей; - Результат = Результат(ТаблицаДублей); + + Результат = Новый Структура; + Результат.Вставить("ТаблицаДублей", ТаблицаДублей); + Результат.Вставить("ОписаниеОшибки"); + Результат.Вставить("ВозвращеноМеньшеЧемНайдено", Ложь); + Результат.Вставить("МестаИспользования"); СтруктураПолей = Новый Структура; СтруктураПолей.Вставить("РасшифровкаДополнительныхПолей", РасшифровкаДополнительныхПолей); @@ -343,14 +345,14 @@ Если ПоляДляСравненияНаПодобие.Количество() > 0 Тогда СравнениеСтрокНаПодобие = ПрикладныеПараметрыПоиска.СравнениеСтрокНаПодобие; - СловаИсключения = НРег(СтрСоединить(СравнениеСтрокНаПодобие.СловаИсключения, "~")); - НечеткийПоиск = ОбщегоНазначения.ПодключитьКомпонентуИзМакета("FuzzyStringMatchExtension", "ОбщийМакет.КомпонентаПоискаСтрок"); - - Если НечеткийПоиск = Неопределено Тогда + Попытка + ПараметрыПоискаПохожихСтрок = ПоискИУдалениеДублей.ПараметрыПоискаПохожихСтрок(); + Исключение Результат.ОписаниеОшибки = НСтр("ru = 'Не удалось подключить компоненту нечеткого поиска. Подробнее см. в журнале регистрации.'"); Возврат Результат; - КонецЕсли; + КонецПопытки; + ЗаполнитьЗначенияСвойств(ПараметрыПоискаПохожихСтрок, СравнениеСтрокНаПодобие); Для Каждого ПолеТаблицы Из ПоляДляСравненияНаПодобие Цикл @@ -361,9 +363,9 @@ КонецЦикла; ИскомыеСтроки = СтрСоединить(ЗначенияПоля, "~"); СтрокаДляПоиска = ЭталонныйЭлемент[ИмяПоля]; - ИндексыСтрок = НечеткийПоиск.StringSearch(НРег(СтрокаДляПоиска), НРег(ИскомыеСтроки), "~", - СравнениеСтрокНаПодобие.ДлинаНебольшихСтрок, СравнениеСтрокНаПодобие.ПроцентСовпаденияНебольшихСтрок, - СравнениеСтрокНаПодобие.ПроцентСовпаденияСтрок, СловаИсключения); + + ИндексыСтрок = ПоискИУдалениеДублей.НайтиПохожиеСтроки(ИскомыеСтроки, СтрокаДляПоиска, "~", ПараметрыПоискаПохожихСтрок); + Если ПустаяСтрока(ИндексыСтрок) Тогда Продолжить; КонецЕсли; @@ -442,8 +444,7 @@ МестаИспользования = МестаИспользования.Скопировать( МестаИспользования.НайтиСтроки(Новый Структура("ВспомогательныеДанные", Ложь))); МестаИспользования.Индексы.Добавить("Ссылка"); - - Результат.Вставить("МестаИспользования", МестаИспользования); + Результат.МестаИспользования = МестаИспользования; КонецЕсли; @@ -520,15 +521,15 @@ Результат = Новый ТаблицаЗначений; СтрокаДанных = Результат.Добавить(); - МетаОбъект = ОбъектДанных.Метаданные(); + МетаданныеОбъекты = ОбъектДанных.Метаданные(); - Для Каждого МетаРеквизит Из МетаОбъект.СтандартныеРеквизиты Цикл + Для Каждого МетаРеквизит Из МетаданныеОбъекты.СтандартныеРеквизиты Цикл Имя = МетаРеквизит.Имя; Результат.Колонки.Добавить(Имя, МетаРеквизит.Тип); СтрокаДанных[Имя] = ОбъектДанных[Имя]; КонецЦикла; - Для Каждого МетаРеквизит Из МетаОбъект.Реквизиты Цикл + Для Каждого МетаРеквизит Из МетаданныеОбъекты.Реквизиты Цикл Имя = МетаРеквизит.Имя; Результат.Колонки.Добавить(Имя, МетаРеквизит.Тип); СтрокаДанных[Имя] = ОбъектДанных[Имя]; @@ -967,18 +968,6 @@ КонецФункции -Функция Результат(ТаблицаДублей) - Перем Результат; - - Результат = Новый Структура; - Результат.Вставить("ТаблицаДублей", ТаблицаДублей); - Результат.Вставить("ОписаниеОшибки"); - Результат.Вставить("ВозвращеноМеньшеЧемНайдено", Ложь); - Результат.Вставить("МестаИспользования"); - - Возврат Результат; -КонецФункции - // Возвращаемое значение: // ТаблицаЗначений: // * Ссылка1 - ЛюбаяСсылка diff --git a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/ВыборОбластиПоиска/Form.form b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/ВыборОбластиПоиска/Form.form index 74f454ac3..e8b28c18e 100644 --- a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/ВыборОбластиПоиска/Form.form +++ b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/ВыборОбластиПоиска/Form.form @@ -245,7 +245,6 @@ HorizontalIfPossible Bottom - Auto true true Auto diff --git a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Form.form b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Form.form index feb6c80ec..ca10d7831 100644 --- a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Form.form +++ b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Form.form @@ -111,7 +111,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -177,7 +176,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -238,7 +236,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -395,7 +392,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -460,7 +456,6 @@ UsualGroup Vertical - Auto true true Auto @@ -650,7 +645,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -683,7 +677,6 @@ UsualGroup Vertical - Auto true true Auto @@ -708,7 +701,6 @@ UsualGroup Vertical - Auto true true Auto @@ -870,7 +862,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -982,7 +973,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -1006,7 +996,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1036,7 +1025,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Module.bsl b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Module.bsl index bfea5ed12..5f6e37472 100644 --- a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Module.bsl +++ b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Module.bsl @@ -333,7 +333,7 @@ УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Результат.Вставить("НеУдалосьУстановитьРежимПолнотекстовогоПоиска", Истина); Возврат Результат; КонецПопытки; diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/ВыгрузкаДанныхДляСопоставления/Form.form b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/ВыгрузкаДанныхДляСопоставления/Form.form index 2240e2c45..f8f5a1d01 100644 --- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/ВыгрузкаДанныхДляСопоставления/Form.form +++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/ВыгрузкаДанныхДляСопоставления/Form.form @@ -159,7 +159,6 @@ UsualGroup Vertical - Auto true true Auto @@ -188,7 +187,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -391,7 +389,6 @@ UsualGroup Vertical - Auto true true Auto @@ -420,7 +417,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -496,7 +492,7 @@ 103 <key>ru</key> - <value>Введите пароль для доступа к "%НаименованиеПриложения%" через Интернет</value> + <value>Введите пароль для доступа к "%1" через Интернет</value> true true @@ -592,7 +588,6 @@ UsualGroup Vertical - Auto true true Auto @@ -621,7 +616,6 @@ UsualGroup AlwaysHorizontal - Auto NormalSeparation true true @@ -751,7 +745,6 @@ AlwaysHorizontal Center - Auto true true Auto @@ -880,7 +873,6 @@ AlwaysHorizontal Center - Auto true true Auto @@ -957,7 +949,7 @@ 88 <key>ru</key> - <value>Выполняется выгрузка данных для "%НаименованиеПриложения%". + <value>Выполняется выгрузка данных для "%1". Пожалуйста, подождите...</value> true @@ -1009,7 +1001,6 @@ AlwaysHorizontal Center - Auto true true Auto @@ -1056,7 +1047,7 @@ 128 <key>ru</key> - <value>Выгрузка данных для "%НаименованиеПриложения%"</value> + <value>Выгрузка данных для "%1"</value> true true @@ -1148,7 +1139,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1178,7 +1168,6 @@ AlwaysHorizontal Center - Auto true true Auto @@ -1263,7 +1252,7 @@ ru Выгрузка успешно завершена. -Теперь можно перейти в программу "%НаименованиеПриложения%" и выполнить сопоставление и загрузку полученных данных. +Теперь можно перейти в программу "%1" и выполнить сопоставление и загрузку полученных данных. true true @@ -1316,7 +1305,6 @@ AlwaysHorizontal Top - Auto true true Auto @@ -1492,7 +1480,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1521,7 +1508,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1697,7 +1683,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1726,7 +1711,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1900,7 +1884,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1929,7 +1912,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -3018,6 +3000,19 @@ true + + КонечнаяТочка + 18 + + DefinedType.КонечнаяТочкаОбменаСообщениями + + + true + + + true + + КомандаГотово diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/ВыгрузкаДанныхДляСопоставления/Module.bsl b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/ВыгрузкаДанныхДляСопоставления/Module.bsl index 5654953e8..7c375fc0b 100644 --- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/ВыгрузкаДанныхДляСопоставления/Module.bsl +++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/ВыгрузкаДанныхДляСопоставления/Module.bsl @@ -177,7 +177,7 @@ Процедура ПриНачалеПроверкиПодключенияНаСервере(ПродолжитьОжидание) Если ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WS - И ЗапроситьПароль Тогда + И (ЗапроситьПароль Или ЗначениеЗаполнено(КонечнаяТочка)) Тогда НастройкиПодключения = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспортаWS(УзелОбмена, WSПароль); Иначе НастройкиПодключения = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспорта(УзелОбмена, ВидТранспорта); @@ -548,7 +548,9 @@ &НаСервере Процедура ИнициализироватьПараметрыТранспорта() - ВидТранспорта = РегистрыСведений.НастройкиТранспортаОбменаДанными.ВидТранспортаСообщенийОбменаПоУмолчанию(УзелОбмена); + НастройкиТранспорта = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспорта(УзелОбмена); + НастройкиТранспорта.Свойство("ВидТранспортаСообщенийОбменаПоУмолчанию", ВидТранспорта); + НастройкиТранспорта.Свойство("WSКонечнаяТочкаКорреспондента", КонечнаяТочка); Если Не ЗначениеЗаполнено(ВидТранспорта) Тогда ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим; @@ -588,17 +590,17 @@ &НаСервере Процедура УстановитьНаименованиеПриложенияВНадписяхФормы() - Элементы.ДекорацияНадписьПароль.Заголовок = СтрЗаменить(Элементы.ДекорацияНадписьПароль.Заголовок, - "%НаименованиеПриложения%", НаименованиеПриложения); + Элементы.ДекорацияНадписьПароль.Заголовок = + СтрШаблон(Элементы.ДекорацияНадписьПароль.Заголовок, НаименованиеПриложения); - Элементы.ДекорацияНадписьВыгрузкаДанныхБезПрогресса.Заголовок = СтрЗаменить(Элементы.ДекорацияНадписьВыгрузкаДанныхБезПрогресса.Заголовок, - "%НаименованиеПриложения%", НаименованиеПриложения); + Элементы.ДекорацияНадписьВыгрузкаДанныхБезПрогресса.Заголовок = + СтрШаблон(Элементы.ДекорацияНадписьВыгрузкаДанныхБезПрогресса.Заголовок, НаименованиеПриложения); - Элементы.ДекорацияНадписьВыгрузкаДанныхПрогресс.Заголовок = СтрЗаменить(Элементы.ДекорацияНадписьВыгрузкаДанныхПрогресс.Заголовок, - "%НаименованиеПриложения%", НаименованиеПриложения); + Элементы.ДекорацияНадписьВыгрузкаДанныхПрогресс.Заголовок = + СтрШаблон(Элементы.ДекорацияНадписьВыгрузкаДанныхПрогресс.Заголовок, НаименованиеПриложения); - Элементы.ДекорацияНадписьВыгрузкаЗавершена.Заголовок = СтрЗаменить(Элементы.ДекорацияНадписьВыгрузкаЗавершена.Заголовок, - "%НаименованиеПриложения%", НаименованиеПриложения); + Элементы.ДекорацияНадписьВыгрузкаЗавершена.Заголовок = + СтрШаблон(Элементы.ДекорацияНадписьВыгрузкаЗавершена.Заголовок, НаименованиеПриложения); КонецПроцедуры diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Form.form b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Form.form index 48724379d..b62432b9b 100644 --- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Form.form @@ -7,6 +7,134 @@ <items xsi:type="form:FormGroup"> <name>ПанельОсновная</name> <id>168</id> + <items xsi:type="form:FormGroup"> + <name>СтраницаПроверкаЗадачОбмена</name> + <id>1019</id> + <items xsi:type="form:FormGroup"> + <name>Группа3</name> + <id>1021</id> + <items xsi:type="form:Decoration"> + <name>ЗадачаВОчереди</name> + <id>1023</id> + <title> + <key>ru</key> + <value>Задача в очереди</value> + + true + true + + true + + + ЗадачаВОчередиРасширеннаяПодсказка + 1025 + Label + true + true + + Left + + + + ЗадачаВОчередиКонтекстноеМеню + 1024 + true + + true + true + + + CommonPicture.СинхронизацияДанныхНедоступна + + + + + СтатусЗадачаВОчереди + 1026 + + <key>ru</key> + <value>Для узла уже выполняется синхронизация.</value> + + true + true + + true + + + СтатусЗадачаВОчередиРасширеннаяПодсказка + 1028 + Label + true + true + + Left + + + + СтатусЗадачаВОчередиКонтекстноеМеню + 1027 + true + + true + Label + true + true + + Left + Center + + + true + true + + true + + true + + Группа3РасширеннаяПодсказка + 1022 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Проверка очереди задач обмена</value> + + + СтраницаПроверкаЗадачОбменаРасширеннаяПодсказка + 1020 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + СтраницаНачала 250 @@ -162,7 +290,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -225,7 +352,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -421,7 +547,6 @@ UsualGroup Vertical - Auto true true Auto @@ -455,7 +580,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -484,7 +608,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -655,7 +778,6 @@ AlwaysHorizontal Top - Auto WeakSeparation true true @@ -755,7 +877,6 @@ UsualGroup Vertical - Auto true true Auto @@ -823,7 +944,6 @@ UsualGroup Vertical - Auto true true Auto @@ -853,7 +973,6 @@ AlwaysHorizontal Center - Auto WeakSeparation true true @@ -1114,7 +1233,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -2131,7 +2249,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -2360,7 +2477,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2389,7 +2505,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2694,7 +2809,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2723,7 +2837,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2752,7 +2865,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2781,7 +2893,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2934,7 +3045,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3089,7 +3199,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3118,7 +3227,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3147,7 +3255,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3470,7 +3577,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3499,7 +3605,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3528,7 +3633,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3556,7 +3660,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -3586,7 +3689,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3615,7 +3717,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -3743,7 +3844,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3772,7 +3872,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -3938,7 +4037,6 @@ AlwaysHorizontal Center - Auto WeakSeparation true true @@ -4038,7 +4136,6 @@ UsualGroup Vertical - Auto true true Auto @@ -4106,7 +4203,6 @@ UsualGroup Vertical - Auto true true Auto @@ -4140,7 +4236,6 @@ HorizontalIfPossible Center - Auto WeakSeparation true true @@ -4324,7 +4419,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -4508,7 +4602,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -5050,7 +5143,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -5457,7 +5549,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -5486,7 +5577,6 @@ UsualGroup Vertical - Auto true true Auto @@ -5515,7 +5605,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -5656,7 +5745,6 @@ UsualGroup Vertical - Auto true true Auto @@ -5685,7 +5773,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -5759,7 +5846,6 @@ UsualGroup Vertical - Auto true true Auto @@ -5865,7 +5951,6 @@ UsualGroup Vertical - Auto true true Auto @@ -5894,7 +5979,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -5927,7 +6011,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -6811,7 +6894,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -8034,9 +8116,73 @@ true + + ОбменЧерезВнутреннююПубликацию + 6 + + Boolean + + + true + + + true + + + + ПараметрыОбменаЧерезВнутреннююПубликацию + 12 + + + true + + + true + + + + ПоУзлуЗапланированОбмен + 13 + + Boolean + + + true + + + true + + + + СценарийВыполненияЧерезВнутреннююПубликацию + 17 + + CatalogRef.СценарииОбменовДанными + + + true + + + true + + + + ИдентификаторОбменаЧерезВнутреннююПубликацию + 18 + + String + + + + true + + + true + + ОтменаСопоставления - 65 + 22 Boolean diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Module.bsl index f324d2e96..12a8eefab 100644 --- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Module.bsl @@ -118,6 +118,14 @@ ИнициализироватьНастройкиТранспортаСообщенийОбмена(); + Если ОбменЧерезВнутреннююПубликацию Тогда + МодульОбменДаннымиВнутренняяПубликация = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВнутренняяПубликация"); + ПоУзлуЗапланированОбмен = МодульОбменДаннымиВнутренняяПубликация.ПоУзлуЗапланированОбмен( + Объект.УзелИнформационнойБазы, + СценарийВыполненияЧерезВнутреннююПубликацию, + ИдентификаторОбменаЧерезВнутреннююПубликацию); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -1155,7 +1163,10 @@ &НаСервере Процедура ИнициализироватьНастройкиТранспортаСообщенийОбмена() - ВидТранспортаПоУмолчанию = РегистрыСведений.НастройкиТранспортаОбменаДанными.ВидТранспортаСообщенийОбменаПоУмолчанию(Объект.УзелИнформационнойБазы); + НастройкиТранспорта = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспорта(Объект.УзелИнформационнойБазы); + ВидТранспортаПоУмолчанию = НастройкиТранспорта.ВидТранспортаСообщенийОбменаПоУмолчанию; + КонечнаяТочкаКорреспондента = НастройкиТранспорта.WSКонечнаяТочкаКорреспондента; + НастроенныеВидыТранспорта = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастроенныеВидыТранспорта(Объект.УзелИнформационнойБазы); ПропускатьСтраницуТранспорта = Истина; @@ -1174,7 +1185,11 @@ ОбменМеждуПриложениямиВСервисе = МодельСервиса И (Объект.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.FILE Или Объект.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.FTP); - + + ОбменЧерезВнутреннююПубликацию = МодельСервиса + И Объект.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.WS + И ЗначениеЗаполнено(КонечнаяТочкаКорреспондента); + ПриИзмененииВидаТранспортаСообщенийОбмена(Истина, НастроенныеВидыТранспорта); КонецПроцедуры @@ -1193,7 +1208,7 @@ КонецЕсли; КонецЕсли; - ИспользоватьПрогрессБар = Не ОбменЧерезВебСервис И Не ОбменМеждуПриложениямиВСервисе; + ИспользоватьПрогрессБар = Не ОбменЧерезВебСервис И Не ОбменМеждуПриложениямиВСервисе И Не ОбменЧерезВнутреннююПубликацию; Если Инициализация Тогда ПропускатьСтраницуТранспорта = ПропускатьСтраницуТранспорта И (Не ОбменЧерезВебСервис Или WSЗапомнитьПароль); @@ -2036,7 +2051,7 @@ НастройкаЗавершена = Истина; ПолученыДанныеДляСопоставления = Ложь; - ЕстьПодключение = ОбменДаннымиСервер.ЕстьПодключениеККорреспонденту(Объект.УзелИнформационнойБазы, + ЕстьПодключение = ОбменДаннымиВебСервис.ЕстьПодключениеККорреспонденту(Объект.УзелИнформационнойБазы, ПараметрыПодключения, СообщениеОбОшибкеПользователю, НастройкаЗавершена, ПолученыДанныеДляСопоставления); Если Не ЕстьПодключение Тогда @@ -2090,6 +2105,65 @@ КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Страницы проверки запущенной синхронизации. + +&НаКлиенте +Функция Подключаемый_СтраницаПроверкаЗадачОбмена_ПриОткрытии(Отказ, ПропуститьСтраницу, ЭтоПереходДалее) + + Если ПоУзлуЗапланированОбмен Тогда + + Если ЗначениеЗаполнено(СценарийВыполненияЧерезВнутреннююПубликацию) Тогда + + Шаблон = НСтр("ru = 'Синхронизация для узла ""%1"" уже запланирована + |в сценарии ""%2"". + | + |Нажмите Далее, что бы отменить выполнение сценария + |и запустить синхронизацию по узлу.'"); + ТекстСообщения = СтрШаблон(Шаблон, Строка(Объект.УзелИнформационнойБазы), Строка(СценарийВыполненияЧерезВнутреннююПубликацию)); + + Иначе + + Шаблон = НСтр("ru = 'Для узла ""%1"" уже выполняется синхронизация. + | + |Нажмите Далее, что-бы прервать текущую синхронизации + |и запустить ее снова'"); + ТекстСообщения = СтрШаблон(Шаблон, Строка(Объект.УзелИнформационнойБазы)); + + КонецЕсли; + + Элементы.СтатусЗадачаВОчереди.Заголовок = ТекстСообщения; + + Иначе + + ПропуститьСтраницу = Истина; + + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +&НаКлиенте +Функция Подключаемый_СтраницаПроверкаЗадачОбмена_ПриПереходеДалее(Отказ) + + ОтменитьОчередьИПродолжитьНаСервере(); + ВыполнитьПереходДалее(); + + Возврат Неопределено; + +КонецФункции + +&НаСервере +Процедура ОтменитьОчередьИПродолжитьНаСервере() + + МодульОбменДаннымиВнутренняяПубликация = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВнутренняяПубликация"); + МодульОбменДаннымиВнутренняяПубликация.ОтменитьОчередьЗадач(Объект.УзелИнформационнойБазы, + СценарийВыполненияЧерезВнутреннююПубликацию, + ИдентификаторОбменаЧерезВнутреннююПубликацию); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Страницы обработки получения данных (транспорт сообщения обмена). @@ -2755,6 +2829,17 @@ Иначе ПриЗавершенииВыгрузкиДанных(); КонецЕсли; + + ИначеЕсли ОбменЧерезВнутреннююПубликацию Тогда + + ПриНачалеВыгрузкиДанныхЧерезВнутреннююПубликациюНаСервере(); + + ОбменДаннымиКлиент.ИнициализироватьПараметрыОбработчикаОжидания( + ПараметрыОбработчикаОжиданияВыгрузкиДанных); + + ПодключитьОбработчикОжидания("ПриОжиданииВыгрузкиДанныхЧерезВнутреннююПубликацию", + ПараметрыОбработчикаОжиданияВыгрузкиДанных.ТекущийИнтервал, Истина); + Иначе ПолучитьПарольИзСеансовыхДанных = (Не ПропускатьСтраницуТранспорта И Не WSЗапомнитьПароль); @@ -2944,6 +3029,53 @@ КонецПроцедуры +&НаСервере +Процедура ПриНачалеВыгрузкиДанныхЧерезВнутреннююПубликациюНаСервере() + + СтруктураДополнение = Неопределено; + ПодготовитьСтруктуруДополненияВыгрузки(СтруктураДополнение); + + МодульОбменДаннымиВнутренняяПубликация = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВнутренняяПубликация"); + МодульОбменДаннымиВнутренняяПубликация.ВыполнитьОбменДаннымиВручную(Объект.УзелИнформационнойБазы, + ПараметрыОбменаЧерезВнутреннююПубликацию, СтруктураДополнение); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОжиданииВыгрузкиДанныхЧерезВнутреннююПубликацию() + + ПродолжитьОжидание = Ложь; + ПриОжиданииВыгрузкиДанныхЧерезВнутреннююПубликациюНаСервере(ПараметрыОбменаЧерезВнутреннююПубликацию, ПродолжитьОжидание); + + Если ПродолжитьОжидание Тогда + ОбменДаннымиКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжиданияВыгрузкиДанных); + + ПодключитьОбработчикОжидания("ПриОжиданииВыгрузкиДанныхЧерезВнутреннююПубликацию", + ПараметрыОбработчикаОжиданияВыгрузкиДанных.ТекущийИнтервал, Истина); + Иначе + ПриЗавершенииВыгрузкиДанныхЧерезВнутреннююПубликацию(); + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ПриОжиданииВыгрузкиДанныхЧерезВнутреннююПубликациюНаСервере(ПараметрыОбмена, ПродолжитьОжидание) + + МодульОбменДаннымиВнутренняяПубликация = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВнутренняяПубликация"); + МодульОбменДаннымиВнутренняяПубликация.ПриОжиданииВыгрузкиДанных(ПараметрыОбмена, ПродолжитьОжидание); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗавершенииВыгрузкиДанныхЧерезВнутреннююПубликацию() + + ВыводитьОписаниеОшибкиПользователю = Истина; + СообщениеОбОшибке = ПараметрыОбменаЧерезВнутреннююПубликацию.СообщениеОбОшибке; + + ИзменитьПорядковыйНомерПерехода(+1); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Страницы итоговой информации @@ -2980,7 +3112,7 @@ ТаблицаПереходовНоваяСтрока("СтраницаНачала", "СтраницаНавигацииНачало", "Подключаемый_СтраницаНачала_ПриОткрытии", "Подключаемый_СтраницаНачала_ПриПереходеДалее"); - Если ОбменМеждуПриложениямиВСервисе Тогда + Если ОбменМеждуПриложениямиВСервисе Или ОбменЧерезВнутреннююПубликацию Тогда Если ПолученоСообщениеДляСопоставленияДанных Тогда // Получение данных (транспорт сообщения обмена). @@ -3004,6 +3136,13 @@ "Подключаемый_ЗагрузкаДанных_ПриОткрытии"); ИначеЕсли ОтправитьДанные Тогда + + Если ОбменЧерезВнутреннююПубликацию Тогда + ТаблицаПереходовНоваяСтрока("СтраницаПроверкаЗадачОбмена", "СтраницаНавигацииПродолжение", + "Подключаемый_СтраницаПроверкаЗадачОбмена_ПриОткрытии", + "Подключаемый_СтраницаПроверкаЗадачОбмена_ПриПереходеДалее"); + КонецЕсли; + Если РежимДополненияВыгрузки Тогда РезультатВыгрузкиДанных = ""; ТаблицаПереходовНоваяСтрока("СтраницаВопросОСоставеВыгрузки", "СтраницаНавигацииПродолжение", "Подключаемый_СтраницаВопросОСоставеВыгрузки_ПриОткрытии"); diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ManagerModule.bsl b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ManagerModule.bsl index b0d91e331..e88cac76b 100644 --- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ManagerModule.bsl @@ -95,7 +95,7 @@ ИначеЕсли Параметры.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.WS Тогда - СтруктураДанных = ОбменДаннымиСервер.ПолучитьСообщениеОбменаВоВременныйКаталогИзИнформационнойБазыКорреспондентаЧерезВебСервис( + СтруктураДанных = ОбменДаннымиВебСервис.ПолучитьСообщениеОбменаВоВременныйКаталогИзИнформационнойБазыКорреспондентаЧерезВебСервис( Отказ, Параметры.УзелИнформационнойБазы, Параметры.ИдентификаторФайла, @@ -127,7 +127,7 @@ УстановитьПривилегированныйРежим(Истина); - СтруктураДанных = ОбменДаннымиСервер.ПолучитьСообщениеОбменаВоВременныйКаталогИзИнформационнойБазыКорреспондентаЧерезВебСервисЗавершениеДлительнойОперации( + СтруктураДанных = ОбменДаннымиВебСервис.ПолучитьСообщениеОбменаВоВременныйКаталогИзИнформационнойБазыКорреспондентаЧерезВебСервисЗавершениеДлительнойОперации( Отказ, Параметры.УзелИнформационнойБазы, Параметры.ИдентификаторФайла, @@ -339,11 +339,11 @@ Информация = ИнформацияОбОшибке(); Результат.СообщениеОбОшибке = НСтр("ru = 'Возникла проблема при добавлении данных к выгрузке:'") - + Символы.ПС + КраткоеПредставлениеОшибки(Информация) + + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация) + Символы.ПС + НСтр("ru = 'Измените условия отбора.'"); ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(Информация)); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); КонецПопытки; ПоместитьВоВременноеХранилище(Результат, АдресРезультата); @@ -375,7 +375,7 @@ НастройкиВыгрузки.УзелОбмена, ПараметрыОбмена, Отказ); Исключение Результат.ДанныеВыгружены = Ложь; - Результат.СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Результат.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииВыгрузкаДанныхДляСопоставления(), УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибке); @@ -443,7 +443,7 @@ ЗаданиеВыполнено = ДлительныеОперации.ЗаданиеВыполнено(ПараметрыОбработчика.ИдентификаторОперации); Исключение ПараметрыОбработчика.Отказ = Истина; - ПараметрыОбработчика.СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПараметрыОбработчика.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(), УровеньЖурналаРегистрации.Ошибка, , , ПараметрыОбработчика.СообщениеОбОшибке); diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДаннымиВМоделиСервиса/ManagerModule.bsl b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДаннымиВМоделиСервиса/ManagerModule.bsl index 8c19cbd7c..1644b43d6 100644 --- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДаннымиВМоделиСервиса/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДаннымиВМоделиСервиса/ManagerModule.bsl @@ -182,10 +182,10 @@ Информация = ИнформацияОбОшибке(); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииМониторСинхронизацииДанных(), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(Информация)); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); ПараметрыОбработчика.Отказ = Истина; - ПараметрыОбработчика.СообщениеОбОшибке = КраткоеПредставлениеОшибки(Информация); + ПараметрыОбработчика.СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация); ПараметрыОбработчика.ИдентификаторОперации = Неопределено; КонецПопытки; @@ -264,7 +264,7 @@ ПараметрыОбработчика.ИдентификаторОперации).Получить(); Исключение ПараметрыОбработчика.Отказ = Истина; - ПараметрыОбработчика.СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ПараметрыОбработчика.СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); ПараметрыОбработчика.ИдентификаторОперации = Неопределено; ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииСинхронизацииДанных(), @@ -388,7 +388,7 @@ Попытка СтатусСессии = СтатусСессии(ПараметрыОбработчика.ИдентификаторОперации); Исключение - СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииМониторСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); @@ -480,7 +480,7 @@ ЗаданиеВыполнено = ДлительныеОперации.ЗаданиеВыполнено(ПараметрыОбработчика.ИдентификаторОперации); Исключение ПараметрыОбработчика.Отказ = Истина; - ПараметрыОбработчика.СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПараметрыОбработчика.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(), УровеньЖурналаРегистрации.Ошибка, , , ПараметрыОбработчика.СообщениеОбОшибке); @@ -547,7 +547,7 @@ ОбменДаннымиВМоделиСервиса.ВыполнитьВыгрузкуДанных(Отказ, НастройкиВыгрузки.Корреспондент); Исключение Результат.ДанныеВыгружены = Ложь; - Результат.СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Результат.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибке); @@ -598,7 +598,7 @@ ОтменитьТранзакцию(); ПараметрыОбработчикаСессии.Отказ = Истина; - ПараметрыОбработчикаСессии.СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПараметрыОбработчикаСессии.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка, , , ПараметрыОбработчикаСессии.СообщениеОбОшибке); @@ -630,9 +630,6 @@ ЗаполнитьЗначенияСвойств(Обработка, ОбработкаВыгрузки, , "ДополнительнаяРегистрация, ДополнительнаяРегистрацияСценарияУзла"); Обработка.КомпоновщикОтбораВсехДокументов.ЗагрузитьНастройки(ОбработкаВыгрузки.КомпоновщикОтбораВсехДокументовНастройки); - - ОбменДаннымиСервер.ЗаполнитьТаблицуЗначений(Обработка.ДополнительнаяРегистрация, ОбработкаВыгрузки.ДополнительнаяРегистрация); - ОбменДаннымиСервер.ЗаполнитьТаблицуЗначений(Обработка.ДополнительнаяРегистрацияСценарияУзла, ОбработкаВыгрузки.ДополнительнаяРегистрацияСценарияУзла); Иначе Обработка = ОбработкаВыгрузки; КонецЕсли; @@ -650,6 +647,17 @@ Обработка.КомпоновщикОтбораВсехДокументов = Неопределено; Обработка.ПериодОтбораВсехДокументов = Неопределено; + ОбменДаннымиСервер.ЗаполнитьТаблицуЗначений(Обработка.ДополнительнаяРегистрация, ОбработкаВыгрузки.ДополнительнаяРегистрация); + + ИначеЕсли Обработка.ВариантВыгрузки = 3 Тогда + // По сценарию узла, имитируем детальное. + Обработка.ВариантВыгрузки = 2; + + Обработка.КомпоновщикОтбораВсехДокументов = Неопределено; + Обработка.ПериодОтбораВсехДокументов = Неопределено; + + ОбменДаннымиСервер.ЗаполнитьТаблицуЗначений(Обработка.ДополнительнаяРегистрация, ОбработкаВыгрузки.ДополнительнаяРегистрацияСценарияУзла); + КонецЕсли; Обработка.ЗарегистрироватьДополнительныеИзменения(); @@ -710,10 +718,10 @@ Информация = ИнформацияОбОшибке(); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(Информация)); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); ПараметрыОбработчика.Отказ = Истина; - ПараметрыОбработчика.СообщениеОбОшибке = КраткоеПредставлениеОшибки(Информация); + ПараметрыОбработчика.СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация); ПараметрыОбработчика.ИдентификаторОперации = Неопределено; ПродолжитьОжидание = Ложь; diff --git a/SSL/src/DataProcessors/ПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете/ManagerModule.bsl b/SSL/src/DataProcessors/ПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете/ManagerModule.bsl index eac80b548..92003b5c5 100644 --- a/SSL/src/DataProcessors/ПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете/ManagerModule.bsl @@ -138,10 +138,10 @@ Информация = ИнформацияОбОшибке(); ПараметрыОбработчикаСессии.Отказ = Истина; - ПараметрыОбработчикаСессии.СообщениеОбОшибке = КраткоеПредставлениеОшибки(Информация); + ПараметрыОбработчикаСессии.СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(Информация)); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); КонецПопытки; Если Не ПараметрыОбработчикаСессии.Отказ Тогда @@ -198,7 +198,7 @@ Исключение ОтменитьТранзакцию(); - СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииМониторСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); @@ -283,11 +283,11 @@ Информация = ИнформацияОбОшибке(); ПараметрыОбработчика.Отказ = Истина; - ПараметрыОбработчика.СообщениеОбОшибке = КраткоеПредставлениеОшибки(Информация); + ПараметрыОбработчика.СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация); ПараметрыОбработчика.ИдентификаторОперации = Неопределено; ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииМониторСинхронизацииДанных(), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(Информация)); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); Возврат; КонецПопытки; @@ -408,10 +408,10 @@ Информация = ИнформацияОбОшибке(); СтатусЗавершения.Отказ = Истина; - СтатусЗавершения.СообщениеОбОшибке = КраткоеПредставлениеОшибки(Информация); + СтатусЗавершения.СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииМониторСинхронизацииДанных(), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(Информация)); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); КонецПопытки; КонецЕсли; @@ -466,7 +466,7 @@ Исключение ОтменитьТранзакцию(); - СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); @@ -529,7 +529,7 @@ Исключение СтатусЗавершения.Отказ = Истина; - СтатусЗавершения.СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СтатусЗавершения.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка, , , СтатусЗавершения.СообщениеОбОшибке); @@ -730,7 +730,7 @@ ОтменитьТранзакцию(); - СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); @@ -782,6 +782,98 @@ #КонецОбласти +#Область ИзменениеТранспорта + +// Для внутреннего использования. +// +Процедура ПриНачалеОтключенияОтМС(Настройки, ПараметрыОбработчика, ПродолжитьОжидание) Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса") Тогда + Возврат; + КонецЕсли; + + МодульСообщенияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервиса"); + + ПараметрыОбработчика = ПараметрыОбработчикаДлительнойОперации(); + + УстановитьПривилегированныйРежим(Истина); + + НачатьТранзакцию(); + Попытка + // Отправляем сообщение Менеджеру сервиса. + Сообщение = МодульСообщенияВМоделиСервиса.НовоеСообщение( + СообщенияАдминистрированиеОбменаДаннымиУправлениеИнтерфейс.СообщениеОтключитьСинхронизациюЧерезМС()); + + Сообщение.Body.CorrespondentZone = Настройки.ОбластьДанныхКорреспондента; + Сообщение.Body.ExchangePlan = Настройки.ИмяПланаОбмена; + + ПараметрыОбработчика.ИдентификаторОперации = ОбменДаннымиВМоделиСервиса.ОтправитьСообщение(Сообщение); + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Отключение синхронизации данных через менеджер сервиса (переход на веб-сервис) ""%1"" с приложением ""%2"".'"), + Настройки.ИмяПланаОбмена, XMLСтрока(Настройки.ОбластьДанныхКорреспондента)); + + ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), + УровеньЖурналаРегистрации.Информация, , , ТекстСообщения); + + ЗафиксироватьТранзакцию(); + Исключение + + ОтменитьТранзакцию(); + + СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), + УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); + + ПараметрыОбработчика.Отказ = Истина; + ПараметрыОбработчика.СообщениеОбОшибке = СообщениеОбОшибке; + ПараметрыОбработчика.ИдентификаторОперации = Неопределено; + + ПродолжитьОжидание = Ложь; + Возврат; + КонецПопытки; + + МодульСообщенияВМоделиСервиса.ДоставитьБыстрыеСообщения(); + ПродолжитьОжидание = Истина; + +КонецПроцедуры + +// Для внутреннего использования. +// +Процедура ПриОжиданииОтключенияОтМС(ПараметрыОбработчика, ПродолжитьОжидание) Экспорт + + ПриОжиданииСессииОбменаСообщениямиСистемы(ПараметрыОбработчика, ПродолжитьОжидание); + +КонецПроцедуры + +// Для внутреннего использования. +// +Процедура ПриЗавершенииОтключенияОтМС(ПараметрыОбработчика, СтатусЗавершения) Экспорт + + ИнициализироватьСтатусЗавершенияДлительнойОперации(СтатусЗавершения); + + Если ПараметрыОбработчика.Отказ Тогда + ЗаполнитьЗначенияСвойств(СтатусЗавершения, ПараметрыОбработчика, "Отказ, СообщениеОбОшибке"); + Иначе + + Результат = Новый Структура; + Результат.Вставить("ТранспортИзменен", Истина); + Результат.Вставить("ТранспортИзмененВКорреспонденте", Истина); + Результат.Вставить("СообщениеОбОшибке", ""); + Результат.Вставить("СообщениеОбОшибкеВКорреспонденте", ""); + + СтатусЗавершения.Результат = Результат; + + КонецЕсли; + + ПараметрыОбработчика = Неопределено; + +КонецПроцедуры + +#КонецОбласти + + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -794,7 +886,7 @@ Попытка СтатусСессии = СтатусСессии(ПараметрыОбработчика.ИдентификаторОперации); Исключение - СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииМониторСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); @@ -814,6 +906,7 @@ ИначеЕсли СтатусСессии = "Ошибка" Тогда ПараметрыОбработчика.Отказ = Истина; + ПараметрыОбработчика.СообщениеОбОшибке = ОписаниеОшибкиСессии(ПараметрыОбработчика.ИдентификаторОперации); ПараметрыОбработчика.ИдентификаторОперации = Неопределено; ПродолжитьОжидание = Ложь; @@ -833,6 +926,14 @@ КонецФункции +Функция ОписаниеОшибкиСессии(Знач Сессия) + + УстановитьПривилегированныйРежим(Истина); + + Возврат РегистрыСведений.СессииОбменаСообщениямиСистемы.ОписаниеОшибкиСессии(Сессия); + +КонецФункции + #КонецОбласти #Область РаботаСДлительнымиОперациями @@ -886,7 +987,7 @@ ЗаданиеВыполнено = ДлительныеОперации.ЗаданиеВыполнено(ПараметрыОбработчика.ИдентификаторОперации); Исключение ПараметрыОбработчика.Отказ = Истина; - ПараметрыОбработчика.СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПараметрыОбработчика.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(), УровеньЖурналаРегистрации.Ошибка, , , ПараметрыОбработчика.СообщениеОбОшибке); @@ -993,7 +1094,7 @@ Исключение ОтменитьТранзакцию(); - СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииМониторСинхронизацииДанных(), УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); @@ -1055,10 +1156,10 @@ Информация = ИнформацияОбОшибке(); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(Информация)); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); ПараметрыОбработчика.Отказ = Истина; - ПараметрыОбработчика.СообщениеОбОшибке = КраткоеПредставлениеОшибки(Информация); + ПараметрыОбработчика.СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация); ПараметрыОбработчика.ИдентификаторОперации = Неопределено; ПродолжитьОжидание = Ложь; @@ -1075,6 +1176,8 @@ НастройкиСинхронизацииИзМенеджераСервиса = Параметры.НастройкиСинхронизацииИзМенеджераСервиса.Получить(); ОбластиДляОпределенияКодовУзлов = Параметры.ОбластиДляОпределенияКодовУзлов.Получить(); + ДоступенExchangeAdministrationManage_3_0_1_1 = ОбменДаннымиВнутренняяПубликация.ВСервисеДоступенExchangeAdministrationManage_3_0_1_1(); + ТаблицаПриложений = Новый ТаблицаЗначений; ТаблицаПриложений.Колонки.Добавить("НаименованиеПриложения", Новый ОписаниеТипов("Строка")); ТаблицаПриложений.Колонки.Добавить("Префикс", Новый ОписаниеТипов("Строка")); @@ -1085,6 +1188,7 @@ ТаблицаПриложений.Колонки.Добавить("ФорматОбмена", Новый ОписаниеТипов("Строка")); ТаблицаПриложений.Колонки.Добавить("ОбластьДанных", Новый ОписаниеТипов("Число")); + ТаблицаПриложений.Колонки.Добавить("КонечнаяТочка", Новый ОписаниеТипов("ПланОбменаСсылка.ОбменСообщениями")); ТаблицаПриложений.Колонки.Добавить("КонечнаяТочкаКорреспондента", Новый ОписаниеТипов("ПланОбменаСсылка.ОбменСообщениями")); ТаблицаПриложений.Колонки.Добавить("Корреспондент"); @@ -1092,30 +1196,39 @@ ТаблицаПриложений.Колонки.Добавить("НастройкаСинхронизацииНедоступна", Новый ОписаниеТипов("Булево")); ТаблицаПриложений.Колонки.Добавить("СообщениеОбОшибке", Новый ОписаниеТипов("Строка")); + ТаблицаПриложений.Колонки.Добавить("ДоступенExchangeAdministrationManage_3_0_1_1", Новый ОписаниеТипов("Булево")); + Если НастройкиСинхронизацииИзМенеджераСервиса.Количество() = 0 Тогда Возврат ТаблицаПриложений; КонецЕсли; + СписокСвойств = "НаименованиеПриложения, + |Префикс, + |ПрефиксКорреспондента, + |ВерсияКорреспондента, + |РольКорреспондента, + |ФорматОбмена, + |ОбластьДанных"; + + Если ДоступенExchangeAdministrationManage_3_0_1_1 Тогда + СписокСвойств = СписокСвойств + ",ДоступенExchangeAdministrationManage_3_0_1_1"; + КонецЕсли; + УстановитьПривилегированныйРежим(Истина); Для Каждого НастройкаИзМенеджераСервиса Из НастройкиСинхронизацииИзМенеджераСервиса Цикл СтрокаПриложение = ТаблицаПриложений.Добавить(); - - ЗаполнитьЗначенияСвойств(СтрокаПриложение, НастройкаИзМенеджераСервиса, - "НаименованиеПриложения, - |Префикс, - |ПрефиксКорреспондента, - |ВерсияКорреспондента, - |РольКорреспондента, - |ФорматОбмена, - |ОбластьДанных"); - + ЗаполнитьЗначенияСвойств(СтрокаПриложение, НастройкаИзМенеджераСервиса, СписокСвойств); СтрокаПриложение.ИмяПланаОбмена = НастройкаИзМенеджераСервиса.ПланОбмена; - СтрокаПриложение.КонечнаяТочкаКорреспондента = ПланыОбмена["ОбменСообщениями"].НайтиПоКоду( НастройкаИзМенеджераСервиса.КонечнаяТочкаКорреспондента); + Если ДоступенExchangeAdministrationManage_3_0_1_1 Тогда + СтрокаПриложение.КонечнаяТочка = ПланыОбмена["ОбменСообщениями"].НайтиПоКоду( + НастройкаИзМенеджераСервиса.КонечнаяТочка); + КонецЕсли; + Если СтрокаПриложение.КонечнаяТочкаКорреспондента.Пустая() Тогда СтрокаПриложение.НастройкаСинхронизацииНедоступна = Истина; СтрокаПриложение.СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -1136,7 +1249,7 @@ Информация = ИнформацияОбОшибке(); ЗаписьЖурналаРегистрации(ОбменДаннымиВМоделиСервиса.СобытиеЖурналаРегистрацииНастройкаСинхронизацииДанных(), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(Информация)); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); СтрокаПриложение.НастройкаСинхронизацииНедоступна = Истина; СтрокаПриложение.СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -1144,7 +1257,7 @@ |%2 |Повторите попытку позднее.'"), НастройкаИзМенеджераСервиса.НаименованиеПриложения, - КраткоеПредставлениеОшибки(Информация)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация)); КонецПопытки; КонецЕсли; @@ -1188,6 +1301,11 @@ "ОбластьДанныхКорреспондента", НастройкаИзМенеджераСервиса.ОбластьДанных); КонецЕсли; + Если ДоступенExchangeAdministrationManage_3_0_1_1 Тогда + РегистрыСведений.НастройкиОбменаДаннымиXDTO.ОбновитьНастройкиКорреспондента(СтрокаПриложение.Корреспондент, + "ДоступенExchangeAdministrationManage_3_0_1_1", СтрокаПриложение.ДоступенExchangeAdministrationManage_3_0_1_1); + КонецЕсли; + КонецЕсли; Если Параметры.Режим = "НеНастроенныеОбмены" @@ -1197,7 +1315,7 @@ И Не ЗначениеЗаполнено(СтрокаПриложение.Корреспондент) Тогда ТаблицаПриложений.Удалить(СтрокаПриложение); КонецЕсли; - + КонецЦикла; Возврат ТаблицаПриложений; diff --git a/SSL/src/DataProcessors/ПомощникСозданияАвтономногоРабочегоМеста/Forms/НастройкаНаСторонеСервиса/Form.form b/SSL/src/DataProcessors/ПомощникСозданияАвтономногоРабочегоМеста/Forms/НастройкаНаСторонеСервиса/Form.form index d834c283f..524ad6ecb 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияАвтономногоРабочегоМеста/Forms/НастройкаНаСторонеСервиса/Form.form +++ b/SSL/src/DataProcessors/ПомощникСозданияАвтономногоРабочегоМеста/Forms/НастройкаНаСторонеСервиса/Form.form @@ -106,7 +106,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -489,7 +488,6 @@ UsualGroup - Auto true true Auto @@ -573,7 +571,6 @@ UsualGroup - Auto true true Auto @@ -638,7 +635,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -811,7 +807,6 @@ UsualGroup - Auto NormalSeparation true true @@ -1085,7 +1080,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1150,7 +1144,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1250,7 +1243,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1325,7 +1317,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1353,7 +1344,6 @@ UsualGroup - Auto NormalSeparation true true @@ -1495,7 +1485,6 @@ UsualGroup - Auto NormalSeparation true true @@ -1680,7 +1669,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -1815,7 +1803,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1840,7 +1827,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -2807,7 +2793,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/DataProcessors/ПомощникСозданияАвтономногоРабочегоМеста/Forms/НастройкаНаСторонеСервиса/Module.bsl b/SSL/src/DataProcessors/ПомощникСозданияАвтономногоРабочегоМеста/Forms/НастройкаНаСторонеСервиса/Module.bsl index bd547ff58..ba2abaee9 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияАвтономногоРабочегоМеста/Forms/НастройкаНаСторонеСервиса/Module.bsl +++ b/SSL/src/DataProcessors/ПомощникСозданияАвтономногоРабочегоМеста/Forms/НастройкаНаСторонеСервиса/Module.bsl @@ -120,7 +120,7 @@ ПерейтиНаСтраницуОшибки(); ПоказатьПредупреждение(, НСтр("ru = 'Не удалось выполнить операцию.'")); - ТекстОшибкиВыполнения = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибкиВыполнения = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписатьОшибкуВЖурналРегистрации( ТекстОшибкиВыполнения, @@ -316,7 +316,7 @@ УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры @@ -731,7 +731,7 @@ Исключение Отказ = Истина; - ТекстОшибкиВыполнения = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибкиВыполнения = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписатьОшибкуВЖурналРегистрации( ТекстОшибкиВыполнения, diff --git a/SSL/src/DataProcessors/ПомощникСозданияАвтономногоРабочегоМеста/ObjectModule.bsl b/SSL/src/DataProcessors/ПомощникСозданияАвтономногоРабочегоМеста/ObjectModule.bsl index 59f81c8b6..5f856db63 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияАвтономногоРабочегоМеста/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ПомощникСозданияАвтономногоРабочегоМеста/ObjectModule.bsl @@ -83,7 +83,7 @@ Исключение ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -132,7 +132,7 @@ УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); УдаляемыеФайлы = Новый Массив(); УдаляемыеФайлы.Добавить( @@ -151,7 +151,7 @@ УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЦикла; @@ -191,7 +191,7 @@ Константы.НастройкиПодчиненногоУзлаРИБ.Установить(""); Исключение ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); // Хранить настройки для автономного рабочего места в ИБ небезопасно. Константы.НастройкиПодчиненногоУзлаРИБ.Установить(""); @@ -240,7 +240,7 @@ УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; ФайлПакетаУстановки = Новый Файл(ПараметрыЗаписи.ИмяФайлаПакетаУстановки); @@ -272,7 +272,7 @@ УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/ИзменениеПрефиксаУзлаИБ/Form.form b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/ИзменениеПрефиксаУзлаИБ/Form.form index 740ab54e0..8f4833e40 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/ИзменениеПрефиксаУзлаИБ/Form.form +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/ИзменениеПрефиксаУзлаИБ/Form.form @@ -103,7 +103,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -179,6 +178,7 @@ true true true + NN true true true @@ -470,7 +470,6 @@ UsualGroup Vertical - Auto true true Auto @@ -644,7 +643,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1277,7 +1275,6 @@ Vertical Bottom - Auto WeakSeparation true true diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/ИзменениеПрефиксаУзлаИБ/Module.bsl b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/ИзменениеПрефиксаУзлаИБ/Module.bsl index a82408fab..8be84ad56 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/ИзменениеПрефиксаУзлаИБ/Module.bsl +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/ИзменениеПрефиксаУзлаИБ/Module.bsl @@ -400,7 +400,7 @@ Результат = Истина; Исключение ОшибкаУстановкиМонопольногоРежима = НСтр("ru = 'Техническая информация:'") + " " - + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Если МонопольныйРежим() Тогда УстановитьМонопольныйРежим(Ложь); @@ -517,6 +517,4 @@ КонецПроцедуры - - #КонецОбласти diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаПодключения/Form.form b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаПодключения/Form.form index 06802e8f9..1935fc4a1 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаПодключения/Form.form +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаПодключения/Form.form @@ -9,65 +9,6 @@ ГруппаСпособНастройкиПодключения 738 - - СпособНастройкиПодключения - 740 - true - true - - true - - - СпособНастройкиПодключения - - None - - OnChange - СпособНастройкиПодключенияПриИзменении - - - СпособНастройкиПодключенияРасширеннаяПодсказка - 742 - Label - true - true - - Left - - - - СпособНастройкиПодключенияКонтекстноеМеню - 741 - true - - RadioButtonField - Enter - true - Left - true - - Tumbler - - - ru - Выбрать приложение из списка - - - ПриложениеИзСписка - - - - - ru - Настроить подключение вручную - - - НастроитьВручную - - - Vertical - - ПанельСпособыНастройкиПодключения 734 @@ -379,7 +320,6 @@ AlwaysHorizontal Center - Auto true true Auto @@ -540,6 +480,10 @@ Left true + + OnActivateRow + ПриложенияВСервисеПриАктивизацииСтроки + ПриложенияВСервисеСтрокаПоиска 70 @@ -656,17 +600,186 @@ true - - Декорация10 - 725 - true + + ГруппаСпособыНастройкиПодключения + 841 + + СпособНастройкиПодключенияИнтернет + 740 + true + true + + true + + + СпособНастройкиПодключенияВСервисе + + None + Button + + OnChange + СпособНастройкиПодключенияПриИзменении + + + СпособНастройкиПодключенияИнтернетРасширеннаяПодсказка + 742 + + <key>ru</key> + <value>Обмен происходит через внутренние ресурсы сервиса. Есть возможность настроить расписание синхронизаций. +Самый быстрый из предложенных вариантов.</value> + + Label + 70 + true + + Left + + + + СпособНастройкиПодключенияИнтернетКонтекстноеМеню + 741 + true + + RadioButtonField + Enter + true + Left + true + + RadioButtons + + + ru + Подключение через интернет (авто) + + + ИнтернетАвто + + + Vertical + + + + СпособНастройкиПодключенияМС + 843 + true + true + + true + + + СпособНастройкиПодключенияВСервисе + + None + Button + + OnChange + СпособНастройкиПодключенияПриИзменении + + + СпособНастройкиПодключенияМСРасширеннаяПодсказка + 845 + + <key>ru</key> + <value>Обмен запускает управляющая программа (менеджер сервиса), расписание настраивается администратором сервиса и недоступно для редактирования.</value> + + Label + 70 + true + + Left + + + + СпособНастройкиПодключенияМСКонтекстноеМеню + 844 + true + + RadioButtonField + Enter + true + Left + true + + RadioButtons + + + ru + Подключение через управляющую программу (менеджер сервиса) + + + МенеджерСервиса + + + Vertical + + + + СпособНастройкиПодключенияВручную + 846 + true + true + + true + + + СпособНастройкиПодключенияВСервисе + + None + Button + + OnChange + СпособНастройкиПодключенияПриИзменении + + + СпособНастройкиПодключенияВручнуюРасширеннаяПодсказка + 848 + + <key>ru</key> + <value>Необходимо указать данные для авторизации в другой программе. Нет возможности настроить график синхронизации. Обмен происходит только в ручном режиме. Подходит для настройки обмена с программой, которая расположена вне сервиса.</value> + + Label + 75 + true + + Left + + + + СпособНастройкиПодключенияВручнуюКонтекстноеМеню + 847 + true + + RadioButtonField + Enter + true + Left + true + + RadioButtons + + + ru + Подключение через интернет (вручную) + + + ИнтернетВручную + + + Vertical + + true true + + <key>ru</key> + <value>Способы подключения</value> + - Декорация10РасширеннаяПодсказка - 727 + ГруппаСпособыНастройкиПодключенияРасширеннаяПодсказка + 842 Label true true @@ -674,15 +787,129 @@ Left - - Декорация10КонтекстноеМеню - 726 - true - - true - 1 - true - + UsualGroup + + Vertical + true + true + auto + Auto + Auto + + + + ГруппаБольшеНастроек + 834 + + Декорация10 + 725 + true + true + + true + + + Декорация10РасширеннаяПодсказка + 727 + Label + true + true + + Left + + + + Декорация10КонтекстноеМеню + 726 + true + + 1 + true + true + + + + НастроитьВручную + 854 + true + true + + true + + + НастроитьВручнуюРасширеннаяПодсказка + 855 + Label + true + true + + Left + + + Hyperlink + Form.Command.НастроитьВручную + Normal + Auto + true + true + UserCmds + Auto + + + БольшеНастроек + 836 + true + true + + true + + + БольшеНастроекРасширеннаяПодсказка + 837 + Label + true + true + + Left + + + Hyperlink + Form.Command.БольшеНастроек + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Больше настроек</value> + + + ГруппаБольшеНастроекРасширеннаяПодсказка + 835 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + WeakSeparation + true + true + Auto + Auto + true true @@ -706,7 +933,6 @@ UsualGroup Vertical - Auto Button WeakSeparation true @@ -1056,7 +1282,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1085,7 +1310,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1304,7 +1528,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1371,7 +1594,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1400,7 +1622,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1429,7 +1650,6 @@ UsualGroup Vertical - Auto Button WeakSeparation true @@ -1495,7 +1715,7 @@ <key>ru</key> - <value>Варианты настройки подключения</value> + <value>Настройка подключения</value> ГруппаСпособНастройкиПодключенияРасширеннаяПодсказка @@ -1510,7 +1730,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -1777,7 +1996,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1833,7 +2051,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1862,7 +2079,6 @@ UsualGroup AlwaysHorizontal - Auto WeakSeparation true true @@ -2226,7 +2442,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2255,7 +2470,6 @@ UsualGroup AlwaysHorizontal - Auto Button true true @@ -2342,8 +2556,8 @@ ru Использовать учетную запись операционной системы - - ОперационнаяСистема + + 0 Vertical @@ -2391,8 +2605,8 @@ ru Использовать указанные имя пользователя и пароль - - 1СПредприятие + + 1 Vertical @@ -2505,7 +2719,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2534,7 +2747,6 @@ UsualGroup AlwaysHorizontal - Auto true true auto @@ -2564,7 +2776,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2593,7 +2804,6 @@ UsualGroup AlwaysHorizontal - Auto WeakSeparation true true @@ -2745,7 +2955,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -2937,7 +3146,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -3055,7 +3263,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3204,7 +3411,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -3294,7 +3500,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3562,7 +3767,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -3591,7 +3795,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3851,7 +4054,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -4019,7 +4221,6 @@ UsualGroup AlwaysHorizontal - Auto WeakSeparation true true @@ -4151,7 +4352,6 @@ UsualGroup AlwaysHorizontal - Auto WeakSeparation true true @@ -4355,7 +4555,6 @@ UsualGroup AlwaysHorizontal - Auto Button true true @@ -4477,7 +4676,6 @@ UsualGroup AlwaysHorizontal - Auto Button true true @@ -4604,7 +4802,6 @@ UsualGroup Vertical - Auto Button true true @@ -4817,7 +5014,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -4886,7 +5082,6 @@ UsualGroup Vertical - Auto true true Auto @@ -4915,7 +5110,6 @@ UsualGroup AlwaysHorizontal - Auto WeakSeparation true true @@ -4945,7 +5139,6 @@ UsualGroup AlwaysHorizontal - Auto NormalSeparation true true @@ -4956,13 +5149,13 @@ ГруппаВосстановлениеНастроекОбмена - 834 + 856 Группа7 - 836 + 858 Декорация21 - 838 + 860 true true @@ -4970,7 +5163,7 @@ Декорация21РасширеннаяПодсказка - 840 + 862 Label true true @@ -4980,7 +5173,7 @@ Декорация21КонтекстноеМеню - 839 + 861 true true @@ -4994,11 +5187,12 @@ Декорация12 - 841 + 863 <key>ru</key> <value><colorstyle -16>Внимание!</> -Продолжение настройки приведет к изменению кода узла обмена для этой информационной базы. Если в базе уже существуют настроенные обмены, то это может привезти к их неработоспособности.</value> + +Продолжение настройки приведет к изменению кода узла обмена для этой информационной базы. Если в базе уже существуют настроенные обмены, то это может привезти к их неработоспособности.</value> true true @@ -5007,7 +5201,7 @@ Декорация12РасширеннаяПодсказка - 843 + 865 Label true true @@ -5017,7 +5211,7 @@ Декорация12КонтекстноеМеню - 842 + 864 true true @@ -5036,7 +5230,7 @@ Группа7РасширеннаяПодсказка - 837 + 859 Label true true @@ -5047,7 +5241,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -5065,7 +5258,7 @@ ГруппаВосстановлениеНастроекОбменаРасширеннаяПодсказка - 835 + 857 Label true true @@ -5076,7 +5269,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -5107,7 +5299,6 @@ UsualGroup Vertical - Auto Button WeakSeparation true @@ -5236,7 +5427,6 @@ UsualGroup AlwaysHorizontal - Auto WeakSeparation true true @@ -5367,7 +5557,6 @@ AlwaysHorizontal Center - Auto true true Auto @@ -5396,7 +5585,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -6158,6 +6346,32 @@ true + + ДоступенExchangeAdministrationManage_3_0_1_1 + 15 + + Boolean + + + true + + + true + + + + КонечнаяТочка + 13 + + DefinedType.КонечнаяТочкаОбменаСообщениями + + + true + + + true + + ТаблицаПереходов @@ -6445,8 +6659,8 @@ 12 - String - + Number + true @@ -6826,7 +7040,7 @@ 38 - CatalogRef.УчетныеЗаписиЭлектроннойПочты + DefinedType.ОбменДаннымиУчетныеЗаписиЭлектроннойПочты true @@ -7560,10 +7774,10 @@ - СпособНастройкиПодключения + СпособНастройкиПодключенияВСервисе <key>ru</key> - <value>Способ настройки подключения</value> + <value>Способ настройки подключения в сервисе</value> 114 @@ -7719,8 +7933,47 @@ - ВосстановлениеНастроекОбмена + ДоступенExchangeAdministrationManage_3_0_1_1 20 + + Boolean + + + true + + + true + + + + БольшеНастроекВидимость + 21 + + Boolean + + + true + + + true + + + + КонечнаяТочка + 29 + + DefinedType.КонечнаяТочкаОбменаСообщениями + + + true + + + true + + + + ВосстановлениеНастроекОбмена + 44 String @@ -7734,7 +7987,7 @@ НомерОтправленного - 21 + 45 Number @@ -7750,10 +8003,12 @@ НомерПринятого - 29 + 46 - String - + Number + + 10 + true @@ -7970,6 +8225,50 @@ Auto Auto + + БольшеНастроек + + <key>ru</key> + <value>Больше настроек...</value> + + 9 + + ru + Больше настроек + + + true + + + + БольшеНастроек + + + Auto + Auto + + + НастроитьВручную + + <key>ru</key> + <value>Настроить вручную...</value> + + 11 + + ru + Настроить вручную + + + true + + + + НастроитьВручную + + + Auto + Auto + diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаПодключения/Module.bsl b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаПодключения/Module.bsl index 9c9728574..404f4ac00 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаПодключения/Module.bsl +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаПодключения/Module.bsl @@ -237,6 +237,63 @@ КонецПроцедуры +&НаКлиенте +Процедура БольшеНастроек(Команда) + + БольшеНастроекВидимость = Ложь; + + Элементы.БольшеНастроек.Видимость = Ложь; + Элементы.ГруппаСпособыНастройкиПодключения.Видимость = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура НастроитьВручную(Команда) + + СпособНастройкиПодключенияВСервисе = "ИнтернетВручную"; + ПриИзмененииСпособНастройкиПодключения(); + + ИзменитьПорядковыйНомерПерехода(+1); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриложенияВСервисеПриАктивизацииСтроки(Элемент) + + Если Элементы.ПанельОсновная.ТекущаяСтраница <> Элементы.СтраницаСпособНастройкиПодключения Тогда + Возврат; + КонецЕсли; + + ВыбратьНаилучшийСпособНастройкиПодключения(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыбратьНаилучшийСпособНастройкиПодключения() + + ТекущаяСтрока = Элементы.ПриложенияВСервисе.ТекущиеДанные; + + Если ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ДоступенExchangeAdministrationManage_3_0_1_1 + И ТекущаяСтрока.ДоступенExchangeAdministrationManage_3_0_1_1 Тогда + + СпособНастройкиПодключенияВСервисе = "ИнтернетАвто"; + Элементы.СпособНастройкиПодключенияИнтернет.Видимость = Истина; + + Иначе + + СпособНастройкиПодключенияВСервисе = "МенеджерСервиса"; + Элементы.СпособНастройкиПодключенияИнтернет.Видимость = Ложь; + + КонецЕсли; + + ПриИзмененииСпособНастройкиПодключения(); + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы @@ -394,8 +451,9 @@ КонецЕсли; ПараметрыПомощника = Новый Структура; - ПараметрыПомощника.Вставить("Режим", "НеНастроенныеОбмены"); - ПараметрыПомощника.Вставить("ИмяПланаОбмена", ИмяПланаОбмена); + ПараметрыПомощника.Вставить("Режим", "НеНастроенныеОбмены"); + ПараметрыПомощника.Вставить("ИмяПланаОбмена", ИмяПланаОбмена); + Если ЗначениеЗаполнено(ФорматОбмена) Тогда ПараметрыПомощника.Вставить("ФорматОбмена", ФорматОбмена); Иначе @@ -1132,7 +1190,7 @@ // Настройки транспорта. СтруктураНастроекПомощника.Вставить("COMАутентификацияОперационнойСистемы", - ВнешнееСоединениеВидАутентификации = "ОперационнаяСистема"); + ВнешнееСоединениеВидАутентификации = 0); // Операционная система СтруктураНастроекПомощника.Вставить("COMВариантРаботыИнформационнойБазы", ?(ВнешнееСоединениеВариантРаботыИнформационнойБазы = "Файловый", 0, 1)); СтруктураНастроекПомощника.Вставить("COMИмяИнформационнойБазыНаСервере1СПредприятия", @@ -1220,6 +1278,22 @@ СтруктураНастроекПомощника.Вставить("УзелКорреспондентаЕстьВЭтойБазе", УзелКорреспондентаЕстьВЭтойБазе); СтруктураНастроекПомощника.Вставить("ЭтотУзелЕстьВКорреспонденте", ЭтотУзелЕстьВКорреспонденте); + Если СпособНастройкиПодключенияВСервисе = "ИнтернетАвто" Тогда + + СтруктураНастроекПомощника.Вставить("WSКонечнаяТочкаКорреспондента", КонечнаяТочкаКорреспондента); + СтруктураНастроекПомощника.Вставить("WSОбластьДанныхКорреспондента", ОбластьДанныхКорреспондента); + СтруктураНастроекПомощника.Вставить("WSКонечнаяТочка", КонечнаяТочка); + СтруктураНастроекПомощника.Вставить("WSОбластьДанных", ПараметрыСеанса["ОбластьДанныхЗначение"]); + + Иначе + + СтруктураНастроекПомощника.Вставить("WSКонечнаяТочкаКорреспондента", Неопределено); + СтруктураНастроекПомощника.Вставить("WSОбластьДанныхКорреспондента", 0); + СтруктураНастроекПомощника.Вставить("WSКонечнаяТочка", Неопределено); + СтруктураНастроекПомощника.Вставить("WSОбластьДанных", 0); + + КонецЕсли; + СтруктураНастроекПомощника.Вставить("ВосстановлениеНастроекОбмена", ВосстановлениеНастроекОбмена); СтруктураНастроекПомощника.Вставить("НомерОтправленного", НомерОтправленного); СтруктураНастроекПомощника.Вставить("НомерПринятого", НомерПринятого); @@ -1266,7 +1340,7 @@ // Настройки транспорта. ВнешнееСоединениеВидАутентификации = - ?(СтруктураНастроекПомощника.COMАутентификацияОперационнойСистемы, "ОперационнаяСистема", "1СПредприятие"); + ?(СтруктураНастроекПомощника.COMАутентификацияОперационнойСистемы, 0, 1); // 0 - Операционная система, 1 - 1с Предприятие ВнешнееСоединениеВариантРаботыИнформационнойБазы = ?(СтруктураНастроекПомощника.COMВариантРаботыИнформационнойБазы = 0, "Файловый", "КлиентСерверный"); ВнешнееСоединениеИмяИнформационнойБазы = @@ -1359,9 +1433,9 @@ КонецЕсли; КонецЕсли; - + НомерОтправленного = СтруктураНастроекПомощника.НомерОтправленного; - НомерПринятого = СтруктураНастроекПомощника.НомерПринятого; + НомерПринятого = СтруктураНастроекПомощника.НомерПринятого КонецПроцедуры @@ -1672,7 +1746,7 @@ ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "НаименованиеКорреспондента", "ТолькоПросмотр", Не ДоступноИзменениеНаименованияКорреспондента); - + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "ПрефиксКорреспондента", "ТолькоПросмотр", Не ДоступноИзменениеПрефиксаКорреспондента); @@ -1738,7 +1812,7 @@ ВидПодключения = "ВнешнееСоединение"; ВнешнееСоединениеВариантРаботыИнформационнойБазы = "Файловый"; - ВнешнееСоединениеВидАутентификации = "1СПредприятие"; + ВнешнееСоединениеВидАутентификации = 1; // 1с Предприятие ИначеЕсли ДоступныеВидыТранспорта.Свойство("WS") Тогда ВидПодключения = "Интернет"; ИначеЕсли ДоступныеВидыТранспорта.Свойство("FILE") @@ -1762,7 +1836,39 @@ ОбычныеКаналыСвязиFTPПассивныйРежим = Истина; КонецЕсли; - СпособНастройкиПодключения = ?(МодельСервиса, "ПриложениеИзСписка", "НастроитьВручную"); + // Проверка, поддерживает ли менеджер сервиса настройку через внутреннюю публикацию. Только для обмена через + // универсальный формат. + Если НастройкаXDTO + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда + + МодульОбменДаннымиВнутренняяПубликация = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВнутренняяПубликация"); + ДоступенExchangeAdministrationManage_3_0_1_1 = + МодульОбменДаннымиВнутренняяПубликация.ВСервисеДоступенExchangeAdministrationManage_3_0_1_1(); + + Иначе + + ДоступенExchangeAdministrationManage_3_0_1_1 = Ложь; + + КонецЕсли; + + Если ДоступенExchangeAdministrationManage_3_0_1_1 + И МодельСервиса + И (ДоступныеВидыТранспорта.Свойство("WS") Или ДоступныеВидыТранспорта.Свойство("WSПассивныйРежим")) Тогда + + СпособНастройкиПодключенияВСервисе = "ИнтернетАвто"; + + ИначеЕсли МодельСервиса Тогда + + СпособНастройкиПодключенияВСервисе = "МенеджерСервиса"; + ЭтоОбменСПриложениемВСервисе = Истина; + + Иначе + + СпособНастройкиПодключенияВСервисе = ""; + + КонецЕсли; + + БольшеНастроекВидимость = ВидимостьКнопкиБольшеНастроек(); ЗначенияНастроекДляВарианта = ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена, "ИмяКонфигурацииКорреспондента, @@ -1851,6 +1957,13 @@ КонецПроцедуры +&НаСервере +Функция ВидимостьКнопкиБольшеНастроек() + + Возврат Ложь; + +КонецФункции + #КонецОбласти #Область СценарииРаботыПомощника @@ -1921,32 +2034,44 @@ &НаКлиенте Процедура ПриИзмененииСпособНастройкиПодключения() - ЭтоОбменСПриложениемВСервисе = (СпособНастройкиПодключения = "ПриложениеИзСписка"); - - Если СпособНастройкиПодключения = "ПриложениеИзСписка" Тогда - Элементы.ПанельСпособыНастройкиПодключения.ТекущаяСтраница = Элементы.СтраницаМоиПриложения; - - НачатьПолучениеСпискаПриложенийДляПодключения(); - ИначеЕсли СпособНастройкиПодключения = "НастроитьВручную" Тогда - - Элементы.ВидПодключенияВнешнееСоединение.Видимость = ДоступныеВидыТранспорта.Свойство("COM"); - Элементы.ВидПодключенияИнтернет.Видимость = ДоступныеВидыТранспорта.Свойство("WS"); - Элементы.ВидПодключенияОбычныеКаналыСвязи.Видимость = ДоступныеВидыТранспорта.Свойство("FILE") - Или ДоступныеВидыТранспорта.Свойство("FTP") - Или ДоступныеВидыТранспорта.Свойство("EMAIL"); + Если СпособНастройкиПодключенияВСервисе = "ИнтернетАвто" Тогда + + ЭтоОбменСПриложениемВСервисе = Ложь; + ВидПодключения = "Интернет"; + + ИначеЕсли СпособНастройкиПодключенияВСервисе = "МенеджерСервиса" Тогда - Элементы.ВидПодключенияПассивныйРежим.Видимость = ДоступныеВидыТранспорта.Свойство("WSПассивныйРежим"); - - Элементы.ГруппаФайлНастройкиПассивныйРежим.Видимость = ДоступныеВидыТранспорта.Свойство("WSПассивныйРежим"); - Элементы.ГруппаФайлНастройкиОбычныеКаналыСвязи.Видимость = ДоступныеВидыТранспорта.Свойство("FILE") - Или ДоступныеВидыТранспорта.Свойство("FTP") - Или ДоступныеВидыТранспорта.Свойство("EMAIL"); - - Элементы.ПанельСпособыНастройкиПодключения.ТекущаяСтраница = Элементы.СтраницаВидыПодключения; - ПриИзмененииВидПодключения(); + ЭтоОбменСПриложениемВСервисе = Истина; + ВидПодключения = ""; + + ИначеЕсли СпособНастройкиПодключенияВСервисе = "ИнтернетВручную" Тогда + ЭтоОбменСПриложениемВСервисе = Ложь; + ВидПодключения = "Интернет"; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриПереходеНаСтраницуВидыПодключения() + + Элементы.ВидПодключенияВнешнееСоединение.Видимость = ДоступныеВидыТранспорта.Свойство("COM"); + Элементы.ВидПодключенияИнтернет.Видимость = ДоступныеВидыТранспорта.Свойство("WS"); + Элементы.ВидПодключенияОбычныеКаналыСвязи.Видимость = ДоступныеВидыТранспорта.Свойство("FILE") + Или ДоступныеВидыТранспорта.Свойство("FTP") + Или ДоступныеВидыТранспорта.Свойство("EMAIL"); + Элементы.ВидПодключенияПассивныйРежим.Видимость = ДоступныеВидыТранспорта.Свойство("WSПассивныйРежим"); + + Элементы.ГруппаФайлНастройкиПассивныйРежим.Видимость = ДоступныеВидыТранспорта.Свойство("WSПассивныйРежим"); + Элементы.ГруппаФайлНастройкиОбычныеКаналыСвязи.Видимость = ДоступныеВидыТранспорта.Свойство("FILE") + Или ДоступныеВидыТранспорта.Свойство("FTP") + Или ДоступныеВидыТранспорта.Свойство("EMAIL"); + + Элементы.ПанельСпособыНастройкиПодключения.ТекущаяСтраница = Элементы.СтраницаВидыПодключения; + ПриИзмененииВидПодключения(); + КонецПроцедуры &НаКлиенте @@ -1979,7 +2104,7 @@ "ГруппаОбычныеКаналыСвязиFILEИспользование", "Доступность", ОбычныеКаналыСвязиFILEИспользование); КонецПроцедуры - + &НаКлиенте Процедура ПриИзмененииОбычныеКаналыСвязиFTPИспользование() @@ -2022,11 +2147,11 @@ ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "ВнешнееСоединениеИмяПользователя", - "Доступность", ВнешнееСоединениеВидАутентификации = "1СПредприятие"); + "Доступность", ВнешнееСоединениеВидАутентификации = 1); // 1с Предприятие ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "ВнешнееСоединениеПароль", - "Доступность", ВнешнееСоединениеВидАутентификации = "1СПредприятие"); + "Доступность", ВнешнееСоединениеВидАутентификации = 1); // 1с Предприятие КонецПроцедуры @@ -2075,11 +2200,23 @@ &НаКлиенте Функция Подключаемый_СтраницаСпособНастройкиПодключения_ПриОткрытии(Отказ, ПропуститьСтраницу, ЭтоПереходДалее) - Элементы.СпособНастройкиПодключения.Видимость = МодельСервиса - И (ДоступныеВидыТранспорта.Свойство("WS") Или ДоступныеВидыТранспорта.Свойство("WSПассивныйРежим")); - + Элементы.БольшеНастроек.Видимость = БольшеНастроекВидимость; + Если ЭтоПереходДалее Тогда - ПриИзмененииСпособНастройкиПодключения(); + + Если МодельСервиса Тогда + НачатьПолучениеСпискаПриложенийДляПодключения(); + ПриИзмененииСпособНастройкиПодключения() + Иначе + ПриПереходеНаСтраницуВидыПодключения(); + КонецЕсли; + + Иначе + + Если МодельСервиса Тогда + ВыбратьНаилучшийСпособНастройкиПодключения(); + КонецЕсли; + КонецЕсли; Возврат Неопределено; @@ -2089,31 +2226,52 @@ &НаКлиенте Функция Подключаемый_СтраницаСпособНастройкиПодключения_ПриПереходеДалее(Отказ) - Если СпособНастройкиПодключения = "ПриложениеИзСписка" Тогда + Если СпособНастройкиПодключенияВСервисе = "ИнтернетАвто" + Или СпособНастройкиПодключенияВСервисе = "МенеджерСервиса" Тогда ТекущиеДанные = Элементы.ПриложенияВСервисе.ТекущиеДанные; Если ТекущиеДанные = Неопределено Тогда + ОбщегоНазначенияКлиент.СообщитьПользователю( НСтр("ru = 'Выберите приложение из списка для продолжения настройки подключения.'"), , "ПриложенияВСервисе", , Отказ); Возврат Неопределено; + ИначеЕсли ТекущиеДанные.НастройкаСинхронизацииНедоступна Тогда + ПоказатьПредупреждение(, ТекущиеДанные.СообщениеОбОшибке); Отказ = Истина; Возврат Неопределено; + Иначе + ПрефиксОбласти = ТекущиеДанные.Префикс; НаименованиеКорреспондента = ТекущиеДанные.НаименованиеПриложения; ПрефиксОбластиКорреспондента = ТекущиеДанные.ПрефиксКорреспондента; + КонечнаяТочка = ТекущиеДанные.КонечнаяТочка; КонечнаяТочкаКорреспондента = ТекущиеДанные.КонечнаяТочкаКорреспондента; ОбластьДанныхКорреспондента = ТекущиеДанные.ОбластьДанных; - ВидПодключения = ""; + Если СпособНастройкиПодключенияВСервисе = "ИнтернетАвто" Тогда + + ВидПодключения = "Интернет"; + + Иначе + + ВидПодключения = ""; + + ИнтернетВебАдрес = ""; + ИнтернетИмяПользователя = ""; + ИнтернетПароль = ""; + ИнтернетЗапомнитьПароль = Ложь; + + КонецЕсли; + КонецЕсли; - ИначеЕсли СпособНастройкиПодключения = "НастроитьВручную" Тогда + ИначеЕсли СпособНастройкиПодключенияВСервисе = "ИнтернетВручную" Тогда Если ВидПодключения = "ОбычныеКаналыСвязи" И ЗагрузитьПараметрыПодключенияИзФайла Тогда @@ -2132,6 +2290,8 @@ КонецЕсли; КонецЕсли; + ОбластьДанныхКорреспондента = 0; + КонецЕсли; Возврат Неопределено; @@ -2141,7 +2301,8 @@ &НаКлиенте Функция Подключаемый_СтраницаПараметрыПодключенияИнтернет_ПриОткрытии(Отказ, ПропуститьСтраницу, ЭтоПереходДалее) - Если ВидПодключения <> "Интернет" Тогда + Если (Не МодельСервиса И ВидПодключения <> "Интернет") + Или (МодельСервиса И СпособНастройкиПодключенияВСервисе <> "ИнтернетВручную") Тогда ПропуститьСтраницу = Истина; Возврат Неопределено; КонецЕсли; @@ -2159,7 +2320,7 @@ Возврат Неопределено; КонецЕсли; - Если ПустаяСтрока(ИнтернетВебАдрес) Тогда + Если ПустаяСтрока(ИнтернетВебАдрес) И СпособНастройкиПодключенияВСервисе <> "ИнтернетАвто" Тогда ОбщегоНазначенияКлиент.СообщитьПользователю( НСтр("ru = 'Укажите адрес программы в Интернет.'"), , "ИнтернетВебАдрес", , Отказ); @@ -2446,7 +2607,7 @@ Если УзелКорреспондентаЕстьВЭтойБазе Тогда ТекстПодсказки = НСтр("ru = '- Удаление узла ""%1""'"); ТекстПодсказки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПодсказки, УзелДляУдаления); - Подсказки.Добавить(ТекстПодсказки); + Подсказки.Добавить(ТекстПодсказки); КонецЕсли; Элементы.ДекорацияПояснениеКИсправить.Заголовок = СтрСоединить(Подсказки, Символы.ПС); @@ -2456,10 +2617,10 @@ Элементы.ГруппаДублированиеНастроекСинхронизации.Видимость = Ложь; КонецЕсли; - + Элементы.ГруппаВосстановлениеНастроекОбмена.Видимость = ВосстановлениеНастроекОбмена = "ВосстановлениеСПредупреждением"; - + Возврат Неопределено; КонецФункции diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаСинхронизации/Form.form b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаСинхронизации/Form.form index 57b3a5097..099864b47 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаСинхронизации/Form.form +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаСинхронизации/Form.form @@ -82,7 +82,6 @@ UsualGroup Vertical - Auto true true Auto @@ -181,7 +180,6 @@ AlwaysHorizontal Center - Auto Button true true @@ -459,7 +457,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -734,7 +731,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1008,7 +1004,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1283,7 +1278,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1558,7 +1552,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1833,7 +1826,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1862,7 +1854,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -2413,7 +2404,7 @@ true - CommonPicture.УдалитьИнформация + StdPicture.Information diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаСинхронизации/Module.bsl b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаСинхронизации/Module.bsl index bd8a84357..9865dbfe7 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаСинхронизации/Module.bsl +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаСинхронизации/Module.bsl @@ -304,7 +304,7 @@ ПараметрыПодключения = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспортаWS(УзелОбмена, Неопределено); - ЕстьПодключение = ОбменДаннымиСервер.ЕстьПодключениеККорреспонденту(УзелОбмена, + ЕстьПодключение = ОбменДаннымиВебСервис.ЕстьПодключениеККорреспонденту(УзелОбмена, ПараметрыПодключения, ДанныеПроверки.СообщениеОбОшибкеПользователю, ДанныеПроверки.НастройкаЗавершена, ДанныеПроверки.ПолученыДанныеДляСопоставления); Если НЕ ЕстьПодключение Тогда diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НоваяСинхронизацияДанных/Form.form b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НоваяСинхронизацияДанных/Form.form index a5ec51b6e..24f11714e 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НоваяСинхронизацияДанных/Form.form +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НоваяСинхронизацияДанных/Form.form @@ -97,7 +97,6 @@ AlwaysHorizontal Center - Auto true true Auto @@ -300,7 +299,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -421,7 +419,6 @@ UsualGroup Vertical - Auto true true Auto @@ -546,7 +543,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -679,7 +675,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1032,7 +1027,7 @@ 2 ru - Подключить интернет поддержку + Подключить Интернет-поддержку пользователей true diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НовыйКодПредопределенногоУзла/Form.form b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НовыйКодПредопределенногоУзла/Form.form index 6e2ff9e27..ee230f433 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НовыйКодПредопределенногоУзла/Form.form +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НовыйКодПредопределенногоУзла/Form.form @@ -103,7 +103,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/ПереходНаИнтернетСоединение/Form.form b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/ПереходНаИнтернетСоединение/Form.form new file mode 100644 index 000000000..5a0516c3c --- /dev/null +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/ПереходНаИнтернетСоединение/Form.form @@ -0,0 +1,2663 @@ + + + + ГруппаКомпоновки + 46 + + ПанельОсновная + 3 + + СтраницаНачало + 328 + + ГруппаНачало + 176 + + Декорация1 + 178 + + <key>ru</key> + <value>Декорация1</value> + + true + true + + true + + + Декорация1РасширеннаяПодсказка + 180 + Label + true + true + + Left + + + + Декорация1КонтекстноеМеню + 179 + true + + true + true + + + CommonPicture.Информация32 + + AsFileRef + + + + Декорация2 + 181 + + <key>ru</key> + <value>Все готово для перехода на обмен через Интернет (Веб-сервис) + +<b><colorstyle -16>Внимание!</></> + - Данная операция является необратимой. + - Она может занять продолжительное время. + - В процессе перехода форму помощника закрывать не рекомендуется. + - Повторно помощник можно запустить из меню <b>Ещё</> узла обмена. + +Нажмите <b>Далее</> для продолжения.</value> + + true + true + + true + + + Декорация2РасширеннаяПодсказка + 183 + Label + true + true + + Left + + + + Декорация2КонтекстноеМеню + 182 + true + + true + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Начало</value> + + + ГруппаНачалоРасширеннаяПодсказка + 177 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница начало</value> + + + СтраницаНачалоРасширеннаяПодсказка + 329 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаПерехода + 270 + + ГруппаОжидание + 272 + + Декорация3 + 274 + + <key>ru</key> + <value>Декорация3</value> + + true + true + + true + + + Декорация3РасширеннаяПодсказка + 276 + Label + true + true + + Left + + + + Декорация3КонтекстноеМеню + 275 + true + + 6 + true + 2 + true + + + CommonPicture.ДлительнаяОперация48 + + + + + Декорация4 + 277 + + <key>ru</key> + <value>Выполняется переход на обмен через Интернет (Веб-сервис). +Пожалуйста, подождите...</value> + + true + true + + true + + + Декорация4РасширеннаяПодсказка + 279 + Label + true + true + + Left + + + + Декорация4КонтекстноеМеню + 278 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Ожидание</value> + + + ГруппаОжиданиеРасширеннаяПодсказка + 273 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Center + WeakSeparation + true + true + Auto + Auto + + + + ГруппаЭтапыНастройки + 330 + + ГруппаПолучениеНастроек + 332 + + ПанельПолучениеНастроек + 334 + + СтраницаПолучениеНастроекПустой + 346 + + Декорация15 + 348 + true + true + + true + + + Декорация15РасширеннаяПодсказка + 350 + Label + true + true + + Left + + + + Декорация15КонтекстноеМеню + 349 + true + + 2 + true + 1 + true + + + true + true + + true + + + <key>ru</key> + <value>Страница получение настроек пустой</value> + + + СтраницаПолучениеНастроекПустойРасширеннаяПодсказка + 347 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаПолучениеНастроекУспешно + 336 + + Декорация7 + 338 + true + true + + true + + + Декорация7РасширеннаяПодсказка + 340 + Label + true + true + + Left + + + + Декорация7КонтекстноеМеню + 339 + true + + 2 + true + 1 + true + + + CommonPicture.Успешно + + + + true + true + + true + + + <key>ru</key> + <value>Страница получение настроек успешно</value> + + + СтраницаПолучениеНастроекУспешноРасширеннаяПодсказка + 337 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаПолучениеНастроекТекущий + 341 + + Декорация8 + 343 + true + true + + true + + + Декорация8РасширеннаяПодсказка + 345 + Label + true + true + + Left + + + + Декорация8КонтекстноеМеню + 344 + true + + 2 + true + 1 + true + + + StdPicture.BusinessProcessStart + + + + true + true + + true + + + <key>ru</key> + <value>Страница получение настроек текущий</value> + + + СтраницаПолучениеНастроекТекущийРасширеннаяПодсказка + 342 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Панель получение настроек</value> + + + ПанельПолучениеНастроекРасширеннаяПодсказка + 335 + Label + true + true + + Left + + + Pages + + Auto + + + + ДекорацияПолучениеНастроек + 458 + + <key>ru</key> + <value>Получение настроек из менеджера сервиса</value> + + true + true + + true + + + ДекорацияПолучениеНастроекРасширеннаяПодсказка + 460 + Label + true + true + + Left + + + + ДекорацияПолучениеНастроекКонтекстноеМеню + 459 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Настройка подключения</value> + + + ГруппаПолучениеНастроекРасширеннаяПодсказка + 333 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + + ГруппаОтключениеОтМенеджераСервиса + 353 + + ПанельОтключениеОтМенеджераСервиса + 355 + + СтраницаОтключениеОтМенеджераСервисаПустой + 367 + + Декорация21 + 369 + true + true + + true + + + Декорация21РасширеннаяПодсказка + 371 + Label + true + true + + Left + + + + Декорация21КонтекстноеМеню + 370 + true + + 2 + true + 1 + true + + + true + true + + true + + + <key>ru</key> + <value>Страница отключение от менеджера сервиса пустой</value> + + + СтраницаОтключениеОтМенеджераСервисаПустойРасширеннаяПодсказка + 368 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаОтключениеОтМенеджераСервисаУспешно + 357 + + Декорация19 + 359 + true + true + + true + + + Декорация19РасширеннаяПодсказка + 361 + Label + true + true + + Left + + + + Декорация19КонтекстноеМеню + 360 + true + + 2 + true + 1 + true + + + CommonPicture.Успешно + + + + true + true + + true + + + <key>ru</key> + <value>Страница отключение от менеджера сервиса успешно</value> + + + СтраницаОтключениеОтМенеджераСервисаУспешноРасширеннаяПодсказка + 358 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаОтключениеОтМенеджераСервисаТекущий + 362 + + Декорация20 + 364 + true + true + + true + + + Декорация20РасширеннаяПодсказка + 366 + Label + true + true + + Left + + + + Декорация20КонтекстноеМеню + 365 + true + + 2 + true + 1 + true + + + StdPicture.BusinessProcessStart + + + + true + true + + true + + + <key>ru</key> + <value>Страница отключение от менеджера сервиса текущий</value> + + + СтраницаОтключениеОтМенеджераСервисаТекущийРасширеннаяПодсказка + 363 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Панель отключение от менеджера сервиса</value> + + + ПанельОтключениеОтМенеджераСервисаРасширеннаяПодсказка + 356 + Label + true + true + + Left + + + Pages + + Auto + + + + ДекорацияОтключениеОтМенеджераСервиса + 461 + + <key>ru</key> + <value>Отключение от менеджера сервиса</value> + + true + true + + true + + + ДекорацияОтключениеОтМенеджераСервисаРасширеннаяПодсказка + 463 + Label + true + true + + Left + + + + ДекорацияОтключениеОтМенеджераСервисаКонтекстноеМеню + 462 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Отключение от менеджера сервиса</value> + + + ГруппаОтключениеОтМенеджераСервисаРасширеннаяПодсказка + 354 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + + ГруппаНастройкаКоррУзла + 395 + + ПанельНастройкаКоррУзла + 397 + + СтраницаНастройкаКоррУзлаПустой + 409 + + Декорация14 + 411 + true + true + + true + + + Декорация14РасширеннаяПодсказка + 413 + Label + true + true + + Left + + + + Декорация14КонтекстноеМеню + 412 + true + + 2 + true + 1 + true + + + true + true + + true + + + <key>ru</key> + <value>Страница настройка корр узла пустой</value> + + + СтраницаНастройкаКоррУзлаПустойРасширеннаяПодсказка + 410 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаНастройкаКоррУзлаУспешно + 399 + + Декорация12 + 401 + true + true + + true + + + Декорация12РасширеннаяПодсказка + 403 + Label + true + true + + Left + + + + Декорация12КонтекстноеМеню + 402 + true + + 2 + true + 1 + true + + + CommonPicture.Успешно + + + + true + true + + true + + + <key>ru</key> + <value>Страница настройка корр узла успешно</value> + + + СтраницаНастройкаКоррУзлаУспешноРасширеннаяПодсказка + 400 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаНастройкаКоррУзлаТекущий + 404 + + Декорация13 + 406 + true + true + + true + + + Декорация13РасширеннаяПодсказка + 408 + Label + true + true + + Left + + + + Декорация13КонтекстноеМеню + 407 + true + + 2 + true + 1 + true + + + StdPicture.BusinessProcessStart + + + + true + true + + true + + + <key>ru</key> + <value>Страница настройка корр узла текущий</value> + + + СтраницаНастройкаКоррУзлаТекущийРасширеннаяПодсказка + 405 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Панель настройка корр узла</value> + + + ПанельНастройкаКоррУзлаРасширеннаяПодсказка + 398 + Label + true + true + + Left + + + Pages + + Auto + + + + ДекорацияНастройкаКоррУзла + 467 + + <key>ru</key> + <value>Настройка узла обмена в корреспондирующей базе</value> + + true + true + + true + + + ДекорацияНастройкаКоррУзлаРасширеннаяПодсказка + 469 + Label + true + true + + Left + + + + ДекорацияНастройкаКоррУзлаКонтекстноеМеню + 468 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Настройка корр. узла</value> + + + ГруппаНастройкаКоррУзлаРасширеннаяПодсказка + 396 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + + ГруппаНастройкаУзла + 374 + + ПанельНастройкаУзла + 376 + + СтраницаНастройкаУзлаПустой + 388 + + Декорация11 + 390 + true + true + + true + + + Декорация11РасширеннаяПодсказка + 392 + Label + true + true + + Left + + + + Декорация11КонтекстноеМеню + 391 + true + + 2 + true + 1 + true + + + true + true + + true + + + <key>ru</key> + <value>Страница настройка узла пустой</value> + + + СтраницаНастройкаУзлаПустойРасширеннаяПодсказка + 389 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаНастройкаУзлаУспешно + 378 + + Декорация9 + 380 + true + true + + true + + + Декорация9РасширеннаяПодсказка + 382 + Label + true + true + + Left + + + + Декорация9КонтекстноеМеню + 381 + true + + 2 + true + 1 + true + + + CommonPicture.Успешно + + + + true + true + + true + + + <key>ru</key> + <value>Страница настройка узла успешно</value> + + + СтраницаНастройкаУзлаУспешноРасширеннаяПодсказка + 379 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаНастройкаУзлаТекущий + 383 + + Декорация10 + 385 + true + true + + true + + + Декорация10РасширеннаяПодсказка + 387 + Label + true + true + + Left + + + + Декорация10КонтекстноеМеню + 386 + true + + 2 + true + 1 + true + + + StdPicture.BusinessProcessStart + + + + true + true + + true + + + <key>ru</key> + <value>Страница настройка узла текущий</value> + + + СтраницаНастройкаУзлаТекущийРасширеннаяПодсказка + 384 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Панель настройка узла</value> + + + ПанельНастройкаУзлаРасширеннаяПодсказка + 377 + Label + true + true + + Left + + + Pages + + Auto + + + + ДекорацияНастройкаУзла + 464 + + <key>ru</key> + <value>Настройка узла обмена +</value> + + true + true + + true + + + ДекорацияНастройкаУзлаРасширеннаяПодсказка + 466 + Label + true + true + + Left + + + + ДекорацияНастройкаУзлаКонтекстноеМеню + 465 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Настройка узла</value> + + + ГруппаНастройкаУзлаРасширеннаяПодсказка + 375 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Этапы настройки</value> + + + ГруппаЭтапыНастройкиРасширеннаяПодсказка + 331 + Label + true + true + + Left + + + UsualGroup + + Vertical + WeakSeparation + true + true + Auto + Auto + + + + Декорация16 + 470 + true + true + + true + + + Декорация16РасширеннаяПодсказка + 472 + Label + true + true + + Left + + + + Декорация16КонтекстноеМеню + 471 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Страница перехода</value> + + + СтраницаПереходаРасширеннаяПодсказка + 271 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаОкончание + 245 + + ГруппаОкончание + 247 + + Декорация5 + 249 + + <key>ru</key> + <value>Декорация5</value> + + true + true + + true + + + Декорация5РасширеннаяПодсказка + 251 + Label + true + true + + Left + + + + Декорация5КонтекстноеМеню + 250 + true + + 6 + true + 2 + true + + + CommonPicture.Успешно32 + + + + + Декорация6 + 252 + + <key>ru</key> + <value>Переход на Интернет соединение завершен успешно.</value> + + true + true + + true + + + Декорация6РасширеннаяПодсказка + 254 + Label + true + true + + Left + + + + Декорация6КонтекстноеМеню + 253 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Окончание</value> + + + ГруппаОкончаниеРасширеннаяПодсказка + 248 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Center + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница окончание</value> + + + СтраницаОкончаниеРасширеннаяПодсказка + 246 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Панель основная</value> + + + ПанельОсновнаяExtendedTooltip + 103 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Компоновки</value> + + + ГруппаКомпоновкиExtendedTooltip + 95 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + + РамкаПанелиНавигации + 51 + + ПанельНавигации + 1 + + СтраницаНавигацииНачало + 7 + + КоманднаяПанельСлева1 + 150 + + КомандаНазад + 72 + true + + true + + + КомандаНазадExtendedTooltip + 125 + Label + true + true + + Left + + + Form.Command.КомандаНазад + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель слева 1</value> + + + КоманднаяПанельСлева1РасширеннаяПодсказка + 151 + Label + true + true + + Left + + + CommandBar + + Left + + + + КоманднаяПанельСправа1 + 70 + + КомандаДалее + 71 + true + true + + true + + true + + КомандаДалееExtendedTooltip + 126 + Label + true + true + + Left + + + Form.Command.КомандаДалее + Auto + true + true + true + UserCmds + Auto + + + КомандаОтмена + 73 + true + true + + true + + + КомандаОтменаExtendedTooltip + 127 + Label + true + true + + Left + + + Form.Command.КомандаОтмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель справа 1</value> + + true + + КоманднаяПанельСправа1РасширеннаяПодсказка + 124 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Страница навигации начало</value> + + + СтраницаНавигацииНачалоExtendedTooltip + 123 + Label + true + true + + Left + + + Page + + HorizontalIfPossible + auto + false + + + + СтраницаНавигацииОжидание + 63 + + КоманднаяПанельСлева4 + 165 + + КомандаНазад3 + 86 + true + false + + true + + + КомандаНазад3ExtendedTooltip + 143 + Label + true + true + + Left + + + Form.Command.КомандаНазад + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель слева 4</value> + + + КоманднаяПанельСлева4РасширеннаяПодсказка + 166 + Label + true + true + + Left + + + CommandBar + + Left + + + + КоманднаяПанельСправа4 + 85 + + КомандаДалее3 + 87 + + <key>ru</key> + <value>Далее ></value> + + true + false + + true + + true + + КомандаДалее3ExtendedTooltip + 144 + Label + true + true + + Left + + + Form.Command.КомандаНазад + Normal + Auto + true + true + UserCmds + Auto + + + КомандаОтмена3 + 88 + true + false + + true + + + КомандаОтмена3ExtendedTooltip + 145 + Label + true + true + + Left + + + Form.Command.КомандаОтмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель справа 4</value> + + true + + КоманднаяПанельСправа4РасширеннаяПодсказка + 142 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Страница навигации ожидание</value> + + + СтраницаНавигацииОжиданиеExtendedTooltip + 141 + Label + true + true + + Left + + + Page + + HorizontalIfPossible + auto + false + + + + СтраницаНавигацииОкончание + 9 + + КоманднаяПанельСлева3 + 160 + true + true + + true + + + <key>ru</key> + <value>Командная панель слева 3</value> + + + КоманднаяПанельСлева3РасширеннаяПодсказка + 161 + Label + true + true + + Left + + + CommandBar + + Left + + + + КоманднаяПанельСправа3 + 80 + + КомандаГотово + 90 + true + true + + true + + + КомандаГотовоExtendedTooltip + 138 + Label + true + true + + Left + + + Form.Command.КомандаГотово + Normal + Auto + true + true + UserCmds + Auto + + + КомандаОтмена2 + 83 + true + false + + true + + + КомандаОтмена2ExtendedTooltip + 139 + Label + true + true + + Left + + + Form.Command.КомандаОтмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель справа 3</value> + + true + + КоманднаяПанельСправа3РасширеннаяПодсказка + 136 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Страница навигации окончание</value> + + + СтраницаНавигацииОкончаниеExtendedTooltip + 135 + Label + true + true + + Left + + + Page + + HorizontalIfPossible + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Панель навигации</value> + + true + + ПанельНавигацииExtendedTooltip + 122 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Рамка панели навигации</value> + + true + + РамкаПанелиНавигацииExtendedTooltip + 121 + Label + true + true + + Left + + + UsualGroup + + Vertical + Bottom + WeakSeparation + true + true + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + + OnClose + ПриЗакрытии + + Abort + Cancel + Close + CustomizeForm + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + String + + + + true + + + true + +
        true
        +
        + + ПорядковыйНомерПерехода + 2 + + Number + + 3 + true + + + + true + + + true + + + + ТаблицаПереходов + 3 + + ValueTable + + + true + + + true + + + ПорядковыйНомерПерехода + 1 + + Number + + 3 + true + + + + true + + + true + + + + ИмяОсновнойСтраницы + 2 + + String + + + + true + + + true + + + + ИмяСтраницыДекорации + 3 + + String + + + + true + + + true + + + + ИмяСтраницыНавигации + 4 + + String + + + + true + + + true + + + + ИмяОбработчикаПриОткрытии + 5 + + String + + + + true + + + true + + + + ИмяОбработчикаПриПереходеДалее + 6 + + String + + + + true + + + true + + + + ИмяОбработчикаПриПереходеНазад + 7 + + String + + + + true + + + true + + + + ДлительнаяОперация + 8 + + Boolean + + + true + + + true + + + + ИмяОбработчикаДлительнойОперации + 9 + + String + + + + true + + + true + + + + + ЗакрытьФормуБезусловно + 4 + + Boolean + + + true + + + true + + + + УзелОбмена + 6 + + ExchangePlanRef + + + true + + + true + + + + ОбластьДанных + 10 + + Number + + 10 + + + + true + + + true + + + + ПараметрыОбработчика + 11 + + + true + + + true + + + + ПараметрыОбработчикаОжидания + 12 + + + true + + + true + + + + ЭтапыНастройки + 13 + + ValueTable + + + true + + + true + + + Название + 3 + + String + + + + true + + + true + + + + Надпись + 1 + + String + + + + true + + + true + + + + Группа + 2 + + String + + + + true + + + true + + + + Панель + 4 + + String + + + + true + + + true + + + + СтраницаУспешно + 5 + + String + + + + true + + + true + + + + СтраницаТекущий + 6 + + String + + + + true + + + true + + + + СтраницаПустой + 7 + + String + + + + true + + + true + + + + + ТекущийЭтап + 14 + + Number + + 10 + + + + true + + + true + + + + КонечнаяТочка + 5 + + DefinedType.КонечнаяТочкаОбменаСообщениями + + + true + + + true + + + + КонечнаяТочкаКорреспондента + 7 + + DefinedType.КонечнаяТочкаОбменаСообщениями + + + true + + + true + + + + КомандаДалее + + <key>ru</key> + <value>Далее ></value> + + 1 + + true + + + + КомандаДалее + + + DontUse + Auto + + + КомандаНазад + + <key>ru</key> + <value>< Назад</value> + + 2 + + true + + + + КомандаНазад + + + DontUse + Auto + + + КомандаОтмена + + <key>ru</key> + <value>Отмена</value> + + 3 + + true + + + + КомандаОтмена + + + DontUse + Auto + + + КомандаГотово + + <key>ru</key> + <value>Готово</value> + + 4 + + true + + + + КомандаГотово + + + DontUse + Auto + + + + + +
        diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/ПереходНаИнтернетСоединение/Module.bsl b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/ПереходНаИнтернетСоединение/Module.bsl new file mode 100644 index 000000000..613b7f314 --- /dev/null +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/ПереходНаИнтернетСоединение/Module.bsl @@ -0,0 +1,882 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Параметры.Свойство("УзелОбмена", УзелОбмена); + + // Получение текущего этапа + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Настройки.ПереходНаWS_Этап КАК ПереходНаWS_Этап, + | Настройки.ПереходНаWS_ОбластьДанных КАК ОбластьДанных, + | Настройки.ПереходНаWS_КонечнаяТочка КАК КонечнаяТочка, + | Настройки.ПереходНаWS_КонечнаяТочкаКорреспондента КАК КонечнаяТочкаКорреспондента + |ИЗ + | РегистрСведений.ОбщиеНастройкиУзловИнформационныхБаз КАК Настройки + |ГДЕ + | Настройки.УзелИнформационнойБазы = &УзелИнформационнойБазы"; + + Запрос.УстановитьПараметр("УзелИнформационнойБазы", УзелОбмена); + + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + + ТекущийЭтап = Выборка.ПереходНаWS_Этап + 1; + ЗаполнитьЗначенияСвойств(ЭтаФорма, Выборка, "ОбластьДанных,КонечнаяТочка,КонечнаяТочкаКорреспондента"); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + // Устанавливаем текущую таблицу переходов. + ТаблицаПереходовПоСценарию(); + + // Позиционируемся на первом шаге помощника. + УстановитьПорядковыйНомерПерехода(1); + + ЗаполнитьТаблицуЭтаповПерехода(); + + ОбновитьОтображениеЭтапов(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + ТекстПредупреждения = НСтр("ru = 'Закрыть помощник?'"); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияПроизвольнойФормы( + ЭтотОбъект, Отказ, ЗавершениеРаботы, ТекстПредупреждения, "ЗакрытьФормуБезусловно"); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытии(ЗавершениеРаботы) + + Если НЕ ЗавершениеРаботы + И ТекущийЭтап > 0 Тогда + + Оповестить("ЗакрытаФормаПомощникаПереходаНаИнтернетСоединение"); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура КомандаДалее(Команда) + + ИзменитьПорядковыйНомерПерехода(+1); + +КонецПроцедуры + +&НаКлиенте +Процедура КомандаНазад(Команда) + + ИзменитьПорядковыйНомерПерехода(-1); + +КонецПроцедуры + +&НаКлиенте +Процедура КомандаГотово(Команда) + + ЗакрытьФормуБезусловно = Истина; + + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура КомандаОтмена(Команда) + + Закрыть(); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ИзменитьПорядковыйНомерПерехода(Итератор) + + ОчиститьСообщения(); + + УстановитьПорядковыйНомерПерехода(ПорядковыйНомерПерехода + Итератор); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьПорядковыйНомерПерехода(Знач Значение) + + ЭтоПереходДалее = (Значение > ПорядковыйНомерПерехода); + + ПорядковыйНомерПерехода = Значение; + + Если ПорядковыйНомерПерехода < 0 Тогда + + ПорядковыйНомерПерехода = 0; + + КонецЕсли; + + ПорядковыйНомерПереходаПриИзменении(ЭтоПереходДалее); + +КонецПроцедуры + +&НаКлиенте +Процедура ПорядковыйНомерПереходаПриИзменении(Знач ЭтоПереходДалее) + + // Выполняем обработчики событий перехода. + ВыполнитьОбработчикиСобытийПерехода(ЭтоПереходДалее); + + // Устанавливаем отображение страниц. + СтрокиПереходаТекущие = ТаблицаПереходов.НайтиСтроки(Новый Структура("ПорядковыйНомерПерехода", ПорядковыйНомерПерехода)); + + Если СтрокиПереходаТекущие.Количество() = 0 Тогда + ВызватьИсключение НСтр("ru = 'Не определена страница для отображения.'"); + КонецЕсли; + + СтрокаПереходаТекущая = СтрокиПереходаТекущие[0]; + + Элементы.ПанельОсновная.ТекущаяСтраница = Элементы[СтрокаПереходаТекущая.ИмяОсновнойСтраницы]; + Элементы.ПанельНавигации.ТекущаяСтраница = Элементы[СтрокаПереходаТекущая.ИмяСтраницыНавигации]; + + Если Не ПустаяСтрока(СтрокаПереходаТекущая.ИмяСтраницыДекорации) Тогда + + Элементы.ПанельДекорации.ТекущаяСтраница = Элементы[СтрокаПереходаТекущая.ИмяСтраницыДекорации]; + + КонецЕсли; + + // Устанавливаем текущую кнопку по умолчанию. + КнопкаДалее = ПолучитьКнопкуФормыПоИмениКоманды(Элементы.ПанельНавигации.ТекущаяСтраница, "КомандаДалее"); + + Если КнопкаДалее <> Неопределено Тогда + + КнопкаДалее.КнопкаПоУмолчанию = Истина; + + Иначе + + КнопкаГотово = ПолучитьКнопкуФормыПоИмениКоманды(Элементы.ПанельНавигации.ТекущаяСтраница, "КомандаГотово"); + + Если КнопкаГотово <> Неопределено Тогда + + КнопкаГотово.КнопкаПоУмолчанию = Истина; + + КонецЕсли; + + КонецЕсли; + + Если ЭтоПереходДалее И СтрокаПереходаТекущая.ДлительнаяОперация Тогда + + ПодключитьОбработчикОжидания("ВыполнитьОбработчикДлительнойОперации", 0.1, Истина); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьОбработчикиСобытийПерехода(Знач ЭтоПереходДалее) + + // Обработчики событий переходов. + Если ЭтоПереходДалее Тогда + + СтрокиПерехода = ТаблицаПереходов.НайтиСтроки(Новый Структура("ПорядковыйНомерПерехода", ПорядковыйНомерПерехода - 1)); + + Если СтрокиПерехода.Количество() > 0 Тогда + + СтрокаПерехода = СтрокиПерехода[0]; + + // Обработчик ПриПереходеДалее. + Если Не ПустаяСтрока(СтрокаПерехода.ИмяОбработчикаПриПереходеДалее) + И Не СтрокаПерехода.ДлительнаяОперация Тогда + + ИмяПроцедуры = "[ИмяОбработчика](Отказ)"; + ИмяПроцедуры = СтрЗаменить(ИмяПроцедуры, "[ИмяОбработчика]", СтрокаПерехода.ИмяОбработчикаПриПереходеДалее); + + Отказ = Ложь; + + Результат = Вычислить(ИмяПроцедуры); + + Если Отказ Тогда + + ПорядковыйНомерПерехода = ПорядковыйНомерПерехода - 1; + Возврат; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Иначе + + СтрокиПерехода = ТаблицаПереходов.НайтиСтроки(Новый Структура("ПорядковыйНомерПерехода", ПорядковыйНомерПерехода + 1)); + + Если СтрокиПерехода.Количество() > 0 Тогда + + СтрокаПерехода = СтрокиПерехода[0]; + + // Обработчик ПриПереходеНазад. + Если Не ПустаяСтрока(СтрокаПерехода.ИмяОбработчикаПриПереходеНазад) + И Не СтрокаПерехода.ДлительнаяОперация Тогда + + ИмяПроцедуры = "[ИмяОбработчика](Отказ)"; + ИмяПроцедуры = СтрЗаменить(ИмяПроцедуры, "[ИмяОбработчика]", СтрокаПерехода.ИмяОбработчикаПриПереходеНазад); + + Отказ = Ложь; + + Результат = Вычислить(ИмяПроцедуры); + + Если Отказ Тогда + + ПорядковыйНомерПерехода = ПорядковыйНомерПерехода + 1; + Возврат; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + СтрокиПереходаТекущие = ТаблицаПереходов.НайтиСтроки(Новый Структура("ПорядковыйНомерПерехода", ПорядковыйНомерПерехода)); + + Если СтрокиПереходаТекущие.Количество() = 0 Тогда + ВызватьИсключение НСтр("ru = 'Не определена страница для отображения.'"); + КонецЕсли; + + СтрокаПереходаТекущая = СтрокиПереходаТекущие[0]; + + Если СтрокаПереходаТекущая.ДлительнаяОперация И Не ЭтоПереходДалее Тогда + + УстановитьПорядковыйНомерПерехода(ПорядковыйНомерПерехода - 1); + Возврат; + КонецЕсли; + + // обработчик ПриОткрытии + Если Не ПустаяСтрока(СтрокаПереходаТекущая.ИмяОбработчикаПриОткрытии) Тогда + + ИмяПроцедуры = "[ИмяОбработчика](Отказ, ПропуститьСтраницу, ЭтоПереходДалее)"; + ИмяПроцедуры = СтрЗаменить(ИмяПроцедуры, "[ИмяОбработчика]", СтрокаПереходаТекущая.ИмяОбработчикаПриОткрытии); + + Отказ = Ложь; + ПропуститьСтраницу = Ложь; + + Результат = Вычислить(ИмяПроцедуры); + + Если Отказ Тогда + + ПорядковыйНомерПерехода = ПорядковыйНомерПерехода - 1; + Возврат; + + ИначеЕсли ПропуститьСтраницу Тогда + + Если ЭтоПереходДалее Тогда + + УстановитьПорядковыйНомерПерехода(ПорядковыйНомерПерехода + 1); + Возврат; + + Иначе + + УстановитьПорядковыйНомерПерехода(ПорядковыйНомерПерехода - 1); + Возврат; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьОбработчикДлительнойОперации() + + СтрокиПереходаТекущие = ТаблицаПереходов.НайтиСтроки(Новый Структура("ПорядковыйНомерПерехода", ПорядковыйНомерПерехода)); + + Если СтрокиПереходаТекущие.Количество() = 0 Тогда + ВызватьИсключение НСтр("ru = 'Не определена страница для отображения.'"); + КонецЕсли; + + СтрокаПереходаТекущая = СтрокиПереходаТекущие[0]; + + // Обработчик ОбработкаДлительнойОперации. + Если Не ПустаяСтрока(СтрокаПереходаТекущая.ИмяОбработчикаДлительнойОперации) Тогда + + ИмяПроцедуры = "[ИмяОбработчика](Отказ, ПерейтиДалее)"; + ИмяПроцедуры = СтрЗаменить(ИмяПроцедуры, "[ИмяОбработчика]", СтрокаПереходаТекущая.ИмяОбработчикаДлительнойОперации); + + Отказ = Ложь; + ПерейтиДалее = Истина; + + Результат = Вычислить(ИмяПроцедуры); + + Если Отказ Тогда + + ПорядковыйНомерПерехода = ПорядковыйНомерПерехода - 1; + Возврат; + + ИначеЕсли ПерейтиДалее Тогда + + УстановитьПорядковыйНомерПерехода(ПорядковыйНомерПерехода + 1); + Возврат; + + КонецЕсли; + + Иначе + + УстановитьПорядковыйНомерПерехода(ПорядковыйНомерПерехода + 1); + Возврат; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ПолучитьКнопкуФормыПоИмениКоманды(ЭлементФормы, ИмяКоманды) + + Для Каждого Элемент Из ЭлементФормы.ПодчиненныеЭлементы Цикл + + Если ТипЗнч(Элемент) = Тип("ГруппаФормы") Тогда + + ЭлементФормыПоИмениКоманды = ПолучитьКнопкуФормыПоИмениКоманды(Элемент, ИмяКоманды); + + Если ЭлементФормыПоИмениКоманды <> Неопределено Тогда + + Возврат ЭлементФормыПоИмениКоманды; + + КонецЕсли; + + ИначеЕсли ТипЗнч(Элемент) = Тип("КнопкаФормы") + И СтрНайти(Элемент.ИмяКоманды, ИмяКоманды) > 0 Тогда + + Возврат Элемент; + + Иначе + + Продолжить; + + КонецЕсли; + + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +&НаКлиенте +Функция Подключаемый_СтраницаПерехода_ПриОткрытии(Отказ, ПропуститьСтраницу, Знач ЭтоПереходДалее) + + Если ТекущийЭтап = 1 Тогда + ПриНачалеПолученияСпискаПриложений(); + ИначеЕсли ТекущийЭтап = 2 Тогда + ПриНачалеОтключенияОтМС(); + ИначеЕсли ТекущийЭтап = 3 Тогда + ПриНачалеНастройкиУзлаКорреспондента(); + ИначеЕсли ТекущийЭтап = 4 Тогда + ПриНачалеНастройкиУзла(); + КонецЕсли; + +КонецФункции + +#Область ПолучениеНастроек + +&НаКлиенте +Процедура ПриНачалеПолученияСпискаПриложений() + + ПараметрыОбработчика = Неопределено; + ПродолжитьОжидание = Ложь; + + ПриНачалеПолученияСпискаПриложенийНаСервере(ПараметрыОбработчика, ПродолжитьОжидание, УзелОбмена, ОбластьДанных); + + Если ПродолжитьОжидание Тогда + ОбменДаннымиКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания); + + ПодключитьОбработчикОжидания("ПриОжиданииПолученияСпискаПриложений", + ПараметрыОбработчикаОжидания.ТекущийИнтервал, Истина); + + Иначе + ПриЗавершенииПолученияСпискаПриложений(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОжиданииПолученияСпискаПриложений() + + ПродолжитьОжидание = Ложь; + ПриОжиданииПолученияСпискаПриложенийНаСервере(ПараметрыОбработчика, ПродолжитьОжидание); + + Если ПродолжитьОжидание Тогда + ОбменДаннымиКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания); + + ПодключитьОбработчикОжидания("ПриОжиданииПолученияСпискаПриложений", + ПараметрыОбработчикаОжидания.ТекущийИнтервал, Истина); + Иначе + ПараметрыОбработчикаОжидания = Неопределено; + ПриЗавершенииПолученияСпискаПриложений(); + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ПриОжиданииПолученияСпискаПриложенийНаСервере(ПараметрыОбработчика, ПродолжитьОжидание) + + МодульПомощникНастройки = ОбменДаннымиСервер.МодульПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете(); + + Если МодульПомощникНастройки = Неопределено Тогда + ПродолжитьОжидание = Ложь; + Возврат; + КонецЕсли; + + МодульПомощникНастройки.ПриОжиданииПолученияСпискаПриложений( + ПараметрыОбработчика, ПродолжитьОжидание); + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ПриНачалеПолученияСпискаПриложенийНаСервере(ПараметрыОбработчика, ПродолжитьОжидание, Узел, ОбластьДанных) + + МодульПомощникНастройки = ОбменДаннымиСервер.МодульПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете(); + + Если МодульПомощникНастройки = Неопределено Тогда + ПродолжитьОжидание = Ложь; + Возврат; + КонецЕсли; + + ПараметрыПомощника = Новый Структура("Режим", "НастроенныеОбмены"); + + МодульПомощникНастройки.ПриНачалеПолученияСпискаПриложений(ПараметрыПомощника, + ПараметрыОбработчика, ПродолжитьОжидание); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗавершенииПолученияСпискаПриложений() + + ПерейтиДалее = Истина; + ПриЗавершенииПолученияСпискаПриложенийНаСервере(ПерейтиДалее); + + Если ПерейтиДалее Тогда + ТекущийЭтап = ТекущийЭтап + 1; + ОбновитьОтображениеЭтапов(); + ПриНачалеОтключенияОтМС(); + Иначе + УстановитьПорядковыйНомерПерехода(1); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗавершенииПолученияСпискаПриложенийНаСервере(ПерейтиДалее) + + МодульПомощникНастройки = ОбменДаннымиСервер.МодульПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете(); + + Если МодульПомощникНастройки = Неопределено Тогда + ПерейтиДалее = Ложь; + Возврат; + КонецЕсли; + + СтатусЗавершения = Неопределено; + МодульПомощникНастройки.ПриЗавершенииПолученияСпискаПриложений(ПараметрыОбработчика, СтатусЗавершения); + + Если СтатусЗавершения.Отказ Тогда + + ОбщегоНазначения.СообщитьПользователю(СтатусЗавершения.СообщениеОбОшибке); + ПерейтиДалее = Ложь; + + Иначе + + ТаблицаПриложений = СтатусЗавершения.Результат; + СтрокаПриложение = ТаблицаПриложений.Найти(УзелОбмена, "Корреспондент"); + Если Не СтрокаПриложение = Неопределено Тогда + + КонечнаяТочка = СтрокаПриложение.КонечнаяТочка; + ОбластьДанных = СтрокаПриложение.ОбластьДанных; + КонечнаяТочкаКорреспондента = СтрокаПриложение.КонечнаяТочкаКорреспондента; + + // Запись этапа + СтруктураЗаписи = Новый Структура; + СтруктураЗаписи.Вставить("УзелИнформационнойБазы" , УзелОбмена); + СтруктураЗаписи.Вставить("ПереходНаWS_КонечнаяТочкаКорреспондента" , КонечнаяТочкаКорреспондента); + СтруктураЗаписи.Вставить("ПереходНаWS_ОбластьДанных" , ОбластьДанных); + СтруктураЗаписи.Вставить("ПереходНаWS_КонечнаяТочка" , КонечнаяТочка); + СтруктураЗаписи.Вставить("ПереходНаWS_Этап" , ТекущийЭтап); + + ОбменДаннымиСлужебный.ОбновитьЗаписьВРегистрСведений(СтруктураЗаписи, "ОбщиеНастройкиУзловИнформационныхБаз"); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОтключениеОтМС + +&НаКлиенте +Процедура ПриНачалеОтключенияОтМС() + + ПродолжитьОжидание = Истина; + + ПриНачалеОтключенияОтМСНаСервере(ПродолжитьОжидание); + + Если ПродолжитьОжидание Тогда + ОбменДаннымиКлиент.ИнициализироватьПараметрыОбработчикаОжидания( + ПараметрыОбработчикаОжидания); + + ПодключитьОбработчикОжидания("ПриОжиданииОтключенияОтМС", + ПараметрыОбработчикаОжидания.ТекущийИнтервал, Истина); + Иначе + ПриЗавершенииОтключенияОтМС(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриНачалеОтключенияОтМСНаСервере(ПродолжитьОжидание) + + Настройки = Новый Структура; + + ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелОбмена); + + Настройки.Вставить("ИмяПланаОбмена", ИмяПланаОбмена); + Настройки.Вставить("ОбластьДанныхКорреспондента", ОбластьДанных); + + МодульОтключенияОтМС = ОбменДаннымиСервер.МодульПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете(); + + Если МодульОтключенияОтМС = Неопределено Тогда + ПродолжитьОжидание = Ложь; + Возврат; + КонецЕсли; + + МодульОтключенияОтМС.ПриНачалеОтключенияОтМС(Настройки, ПараметрыОбработчика, ПродолжитьОжидание); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОжиданииОтключенияОтМС() + + ПродолжитьОжидание = Ложь; + ПриОжиданииОтключенияОтМСНаСервере(ПараметрыОбработчика, ПродолжитьОжидание); + + Если ПродолжитьОжидание Тогда + ОбменДаннымиКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания); + + ПодключитьОбработчикОжидания("ПриОжиданииОтключенияОтМС", + ПараметрыОбработчикаОжидания.ТекущийИнтервал, Истина); + Иначе + ПараметрыОбработчикаОжидания = Неопределено; + ПриЗавершенииОтключенияОтМС(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗавершенииОтключенияОтМС() + + СообщениеОбОшибке = ""; + ПерейтиДалее = Истина; + + ПриЗавершенииОтключенияОтМСНаСервере(ПерейтиДалее, СообщениеОбОшибке); + + Если ПерейтиДалее Тогда + ТекущийЭтап = ТекущийЭтап + 1; + ОбновитьОтображениеЭтапов(); + ПриНачалеНастройкиУзлаКорреспондента(); + Иначе + УстановитьПорядковыйНомерПерехода(1); + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ПриОжиданииОтключенияОтМСНаСервере(ПараметрыОбработчика, ПродолжитьОжидание) + + МодульПомощникПерехода = ОбменДаннымиСервер.МодульПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете(); + + Если МодульПомощникПерехода = Неопределено Тогда + ПродолжитьОжидание = Ложь; + Возврат; + КонецЕсли; + + ПродолжитьОжидание = Ложь; + МодульПомощникПерехода.ПриОжиданииОтключенияОтМС(ПараметрыОбработчика, ПродолжитьОжидание); + +КонецПроцедуры + +&НаСервере +Процедура ПриЗавершенииОтключенияОтМСНаСервере(ПерейтиДалее, СообщениеОбОшибке) + + МодульПомощникПерехода = ОбменДаннымиСервер.МодульПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете(); + + Если МодульПомощникПерехода = Неопределено Тогда + ПерейтиДалее = Ложь; + Возврат; + КонецЕсли; + + СтатусЗавершения = Неопределено; + + МодульПомощникПерехода.ПриЗавершенииОтключенияОтМС(ПараметрыОбработчика, СтатусЗавершения); + + Если СтатусЗавершения.Отказ Тогда + + ОбщегоНазначения.СообщитьПользователю(СтатусЗавершения.СообщениеОбОшибке); + ПерейтиДалее = Ложь; + + Иначе + + ЗафиксироватьЭтапПерехода(); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область НастройкаУзлаКорреспондента + +&НаКлиенте +Процедура ПриНачалеНастройкиУзлаКорреспондента() + + ДлительнаяОперация = ПриНачалеНастройкиУзлаКорреспондентаНаСервере(); + + ОповещениеОЗавершении = Новый ОписаниеОповещения("ЗавершениеНастройкиКорреспондентаУзла", ЭтотОбъект); + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания()); + +КонецПроцедуры + +&НаСервере +Функция ПриНачалеНастройкиУзлаКорреспондентаНаСервере() + + Возврат ДлительныеОперации.ВыполнитьПроцедуру(, + "Обработки.ПомощникСозданияОбменаДанными.ИзменитьТранспортУзлаКорреспондентаНаWS", + УзелОбмена, + КонечнаяТочка, + КонечнаяТочкаКорреспондента, + ОбластьДанных); + +КонецФункции + +&НаКлиенте +Процедура ЗавершениеНастройкиКорреспондентаУзла(Результат, ДополнительныеПараметры) Экспорт + + Если Результат = Неопределено Тогда // отменено пользователем + Возврат; + КонецЕсли; + + Если Результат.Статус = "Ошибка" Тогда + ОбщегоНазначенияКлиент.СообщитьПользователю(Результат.КраткоеПредставлениеОшибки); + УстановитьПорядковыйНомерПерехода(1); + Иначе + ТекущийЭтап = ТекущийЭтап + 1; + ОбновитьОтображениеЭтапов(); + ЗафиксироватьЭтапПерехода(); + ПриНачалеНастройкиУзла(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область НастройкаУзла + +&НаКлиенте +Процедура ПриНачалеНастройкиУзла() + + ДлительнаяОперация = ПриНачалеНастройкиУзлаНаСервере(); + + ОповещениеОЗавершении = Новый ОписаниеОповещения("ЗавершениеНастройкиУзла", ЭтотОбъект); + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания()); + +КонецПроцедуры + +&НаСервере +Функция ПриНачалеНастройкиУзлаНаСервере() + + Возврат ДлительныеОперации.ВыполнитьПроцедуру(, + "Обработки.ПомощникСозданияОбменаДанными.ИзменитьТранспортУзлаНаWS", + УзелОбмена, + КонечнаяТочкаКорреспондента, + ОбластьДанных); + +КонецФункции + +&НаКлиенте +Процедура ЗавершениеНастройкиУзла(Результат, ДополнительныеПараметры) Экспорт + + Если Результат = Неопределено Тогда // отменено пользователем + Возврат; + КонецЕсли; + + Если Результат.Статус = "Ошибка" Тогда + ОбщегоНазначенияКлиент.СообщитьПользователю(Результат.КраткоеПредставлениеОшибки); + УстановитьПорядковыйНомерПерехода(1); + Иначе + ТекущийЭтап = ТекущийЭтап + 1; + ОбновитьОтображениеЭтапов(); + ОчиститьЭтапыПереходаВРегистре(); + ПодключитьОбработчикОжидания("ПослеЗавершенияВсехЭтапов",1,Истина); // Чтобы отобразился последний этап + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗавершенияВсехЭтапов() + + ИзменитьПорядковыйНомерПерехода(+1); + +КонецПроцедуры + +#КонецОбласти + +&НаСервере +Процедура ЗафиксироватьЭтапПерехода() + + СтруктураЗаписи = Новый Структура; + СтруктураЗаписи.Вставить("УзелИнформационнойБазы" , УзелОбмена); + СтруктураЗаписи.Вставить("ПереходНаWS_Этап" , ТекущийЭтап); + ОбменДаннымиСлужебный.ОбновитьЗаписьВРегистрСведений(СтруктураЗаписи, "ОбщиеНастройкиУзловИнформационныхБаз"); + +КонецПроцедуры + +&НаСервере +Процедура ОчиститьЭтапыПереходаВРегистре() + + СтруктураЗаписи = Новый Структура; + СтруктураЗаписи.Вставить("УзелИнформационнойБазы" , УзелОбмена); + СтруктураЗаписи.Вставить("ПереходНаWS_КонечнаяТочкаКорреспондента" , Неопределено); + СтруктураЗаписи.Вставить("ПереходНаWS_КонечнаяТочка" , Неопределено); + СтруктураЗаписи.Вставить("ПереходНаWS_ОбластьДанных" , 0); + СтруктураЗаписи.Вставить("ПереходНаWS_Этап" , 0); + + ОбменДаннымиСлужебный.ОбновитьЗаписьВРегистрСведений(СтруктураЗаписи, "ОбщиеНастройкиУзловИнформационныхБаз"); + +КонецПроцедуры + +&НаКлиенте +Функция ПараметрыОжидания() + + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); + ПараметрыОжидания.ТекстСообщения = ""; + ПараметрыОжидания.ВыводитьПрогрессВыполнения = Ложь; + ПараметрыОжидания.ОповещениеОПрогрессеВыполнения = Неопределено; + ПараметрыОжидания.ОповещениеПользователя.Показать = Истина; + ПараметрыОжидания.ВыводитьОкноОжидания = Ложь; + ПараметрыОжидания.ВыводитьСообщения = Ложь; + Возврат ПараметрыОжидания; + +КонецФункции + +&НаКлиенте +Процедура ТаблицаПереходовПоСценарию() + + ТаблицаПереходов.Очистить(); + + Переход = ТаблицаПереходов.Добавить(); + Переход.ПорядковыйНомерПерехода = 1; + Переход.ИмяОсновнойСтраницы = "СтраницаНачало"; + Переход.ИмяСтраницыНавигации = "СтраницаНавигацииНачало"; + + Переход = ТаблицаПереходов.Добавить(); + Переход.ПорядковыйНомерПерехода = 2; + Переход.ИмяОсновнойСтраницы = "СтраницаПерехода"; + Переход.ИмяСтраницыНавигации = "СтраницаНавигацииОжидание"; + Переход.ИмяОбработчикаПриОткрытии = "Подключаемый_СтраницаПерехода_ПриОткрытии"; + + Переход = ТаблицаПереходов.Добавить(); + Переход.ПорядковыйНомерПерехода = 3; + Переход.ИмяОсновнойСтраницы = "СтраницаОкончание"; + Переход.ИмяСтраницыНавигации = "СтраницаНавигацииОкончание"; + +КонецПроцедуры + +&НаКлиенте +Функция ДобавитьЭтапПерехода(Название, Панель, Надпись, Текущая, Успешно) + + СтрокаЭтап = ЭтапыНастройки.Добавить(); + СтрокаЭтап.Название = Название; + СтрокаЭтап.Надпись = Надпись; + СтрокаЭтап.Панель = Панель; + СтрокаЭтап.СтраницаУспешно = Успешно; + СтрокаЭтап.СтраницаТекущий = Текущая; + + Возврат СтрокаЭтап; + +КонецФункции + +&НаКлиенте +Процедура ЗаполнитьТаблицуЭтаповПерехода() + + ЭтапыНастройки.Очистить(); + + ДобавитьЭтапПерехода("ПолучениеНастроек", + Элементы.ПанельПолучениеНастроек.Имя, + Элементы.ДекорацияПолучениеНастроек.Имя, + Элементы.СтраницаПолучениеНастроекТекущий.Имя, + Элементы.СтраницаПолучениеНастроекУспешно.Имя); + + ДобавитьЭтапПерехода("ОтключениеОтМС", + Элементы.ПанельОтключениеОтМенеджераСервиса.Имя, + Элементы.ДекорацияОтключениеОтМенеджераСервиса.Имя, + Элементы.СтраницаОтключениеОтМенеджераСервисаТекущий.Имя, + Элементы.СтраницаОтключениеОтМенеджераСервисаУспешно.Имя); + + ДобавитьЭтапПерехода("НастройкаКоррУзла", + Элементы.ПанельНастройкаКоррУзла.Имя, + Элементы.ДекорацияНастройкаКоррУзла.Имя, + Элементы.СтраницаНастройкаКоррУзлаТекущий.Имя, + Элементы.СтраницаНастройкаКоррУзлаУспешно.Имя); + + ДобавитьЭтапПерехода("НастройкаУзла", + Элементы.ПанельНастройкаУзла.Имя, + Элементы.ДекорацияНастройкаУзла.Имя, + Элементы.СтраницаНастройкаУзлаТекущий.Имя, + Элементы.СтраницаНастройкаУзлаУспешно.Имя); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьОтображениеЭтапов() + + НомерСтроки = 1; + Для Каждого Строка Из ЭтапыНастройки Цикл + + Панель = Элементы[Строка.Панель]; + + Если НомерСтроки = ТекущийЭтап Тогда + Элементы[Строка.Панель].ТекущаяСтраница = Элементы[Строка.СтраницаТекущий]; + Элементы[Строка.Надпись].Шрифт = Новый Шрифт(,,Истина); + ИначеЕсли НомерСтроки < ТекущийЭтап Тогда + Элементы[Строка.Панель].ТекущаяСтраница = Элементы[Строка.СтраницаУспешно]; + Элементы[Строка.Надпись].Шрифт = Новый Шрифт; + Иначе + Элементы[Строка.Надпись].Шрифт = Новый Шрифт; + КонецЕсли; + + НомерСтроки = НомерСтроки + 1; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/УдалениеНастройкиСинхронизации/Form.form b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/УдалениеНастройкиСинхронизации/Form.form index 0199afc0c..0e9e5755b 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/УдалениеНастройкиСинхронизации/Form.form +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/УдалениеНастройкиСинхронизации/Form.form @@ -100,7 +100,6 @@ AlwaysHorizontal Center - Auto WeakSeparation true true @@ -276,7 +275,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -305,7 +303,6 @@ UsualGroup Vertical - Auto true true Auto @@ -334,7 +331,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -464,7 +460,6 @@ AlwaysHorizontal Center - Auto WeakSeparation true true @@ -594,7 +589,6 @@ AlwaysHorizontal Center - Auto true true Auto diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Help/ru.html b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Help/ru.html index cbfd3698b..e0e217829 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Help/ru.html +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Help/ru.html @@ -48,7 +48,7 @@

        Синхронизация данных через локальный или сетевой каталог

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

        Синхронизация данных через электронную почту

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

        Дополнительные настройки при синхронизации через файл

      • Включите флажок Транслитерировать имена файлов сообщений обмена, в этом случае имена файлов будут автоматически написаны на латинице. @@ -107,9 +107,9 @@
      • Напишите Имя информационной базы в кластере.
      • -
         Выберите параметры в поле Защищенное соединение.
        +
         Выберите параметры в поле Защищенное соединение.
      • -
         Выберите Тип СУБД.
        +
         Выберите Тип СУБД.
      • Укажите Сервер базы данных.
      • diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ManagerModule.bsl b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ManagerModule.bsl index 66f544557..b85d30df6 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ManagerModule.bsl @@ -341,6 +341,101 @@ #КонецОбласти +#Область ПереходНаВебСервис + +Процедура ИзменитьТранспортУзлаНаWS(Узел, КонечнаяТочка, ОбластьДанныхКорреспондента) Экспорт + + СтруктураЗаписи = Новый Структура; + СтруктураЗаписи.Вставить("Корреспондент", Узел); + СтруктураЗаписи.Вставить("ВидТранспортаСообщенийОбменаПоУмолчанию", Перечисления.ВидыТранспортаСообщенийОбмена.WS); + СтруктураЗаписи.Вставить("WSКонечнаяТочкаКорреспондента", КонечнаяТочка); + СтруктураЗаписи.Вставить("WSЗапомнитьПароль", Истина); + СтруктураЗаписи.Вставить("WSОбластьДанныхКорреспондента", ОбластьДанныхКорреспондента); + СтруктураЗаписи.Вставить("WSИспользоватьПередачуБольшогоОбъемаДанных", Истина); + + Попытка + + РегистрыСведений.НастройкиТранспортаОбменаДанными.ДобавитьЗапись(СтруктураЗаписи); + + СтруктураЗаписи = Новый Структура("Корреспондент", Узел); + ОбменДаннымиСлужебный.УдалитьНаборЗаписейВРегистреСведений(СтруктураЗаписи,"НастройкиТранспортаОбменаОбластиДанных"); + + Исключение + + СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + ЗаписьЖурналаРегистрации(ОбменДаннымиВебСервис.СобытиеЖурналаРегистрацииИзменениеТранспортаНаWS(), + УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); + + ВызватьИсключение СообщениеОбОшибке; + + КонецПопытки; + +КонецПроцедуры + +Процедура ИзменитьТранспортУзлаКорреспондентаНаWS(Узел, КонечнаяТочка, КонечнаяТочкаКорреспондента, ОбластьДанных) Экспорт + + СтруктураНастроекОбмена = ОбменДаннымиСервер.НастройкиОбменаДляУзлаИнформационнойБазы( + Узел, "ИзменениеТранспортаУзлаКорреспондента", Неопределено, Ложь); + + УстановитьПривилегированныйРежим(Истина); + + МодульНастройкиТранспортаОбменаСообщениями = ОбщегоНазначения.ОбщийМодуль("РегистрыСведений.НастройкиТранспортаОбменаСообщениями"); + СтруктураНастроекАутентификации = МодульНастройкиТранспортаОбменаСообщениями.НастройкиТранспортаWS(КонечнаяТочкаКорреспондента); + + КодКонечнойТочки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(КонечнаяТочка,"Код"); + + УстановитьПривилегированныйРежим(Ложь); + + Попытка + + ВерсииИнтерфейса = ОбменДаннымиПовтИсп.ВерсииКорреспондента(СтруктураНастроекАутентификации); + + Исключение + + СообщениеОбОшибкеВКорреспонденте = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеОбменаДанными(), + УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибкеВКорреспонденте); + + ВызватьИсключение СообщениеОбОшибкеВКорреспонденте; + + КонецПопытки; + + СтрокаСообщенияОбОшибке = ""; + Прокси = Неопределено; + Если ВерсииИнтерфейса.Найти("3.0.2.1") <> Неопределено Тогда + Прокси = ОбменДаннымиСервер.ПолучитьWSПрокси_3_0_2_1(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке); + КонецЕсли; + + КодУзлаКорреспондента = ОбменДаннымиПовтИсп.ПолучитьКодЭтогоУзлаДляПланаОбмена(СтруктураНастроекОбмена.ИмяПланаОбмена); + ОбластьДанныхКорреспондента = ПараметрыСеанса["ОбластьДанныхЗначение"]; + + Параметры = Новый Структура; + Параметры.Вставить("ИмяПланаОбмена", СтруктураНастроекОбмена.ИмяПланаОбмена); + Параметры.Вставить("КодУзлаКорреспондента", КодУзлаКорреспондента); + Параметры.Вставить("КонечнаяТочкаКорреспондента", КодКонечнойТочки); + Параметры.Вставить("ОбластьДанныхКорреспондента", ОбластьДанныхКорреспондента); + + Попытка + + Прокси.ChangeNodeTransportToWSInt(СериализаторXDTO.ЗаписатьXDTO(Параметры), ОбластьДанных); + + Исключение + + СообщениеОбОшибкеВКорреспонденте = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеОбменаДанными(), + УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибкеВКорреспонденте); + + ВызватьИсключение СообщениеОбОшибкеВКорреспонденте; + + КонецПопытки; + +КонецПроцедуры + +#КонецОбласти + Функция ВерсияФорматаНастроекОбменаДанными() Экспорт Возврат "1.2"; @@ -784,7 +879,8 @@ РезультатПроверки.ПодключениеУстановлено = Истина; РезультатПроверки.ВерсииИнтерфейса = ОбменДаннымиСервер.ВерсииИнтерфейсаЧерезВнешнееСоединение(ВнешнееСоединение); - Если РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.1.1") <> Неопределено Тогда + Если РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.1.1") <> Неопределено + Или РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.2.1") <> Неопределено Тогда СообщениеОбОшибке = ""; ПараметрыИнформационнойБазы = ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.ПолучитьПараметрыИнформационнойБазы_2_0_1_6( @@ -837,11 +933,10 @@ ИначеЕсли НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.WS Тогда - Корреспондент = Новый Структура("WSURLВебСервиса, WSИмяПользователя, WSПароль"); - ЗаполнитьЗначенияСвойств(Корреспондент, НастройкиПодключения); + СтруктураНастроекАутентификации = СтруктураНастроекАутентификации(НастройкиПодключения); Попытка - РезультатПроверки.ВерсииИнтерфейса = ОбменДаннымиПовтИсп.ВерсииКорреспондента(Корреспондент); + РезультатПроверки.ВерсииИнтерфейса = ОбменДаннымиПовтИсп.ВерсииКорреспондента(СтруктураНастроекАутентификации); Исключение Информация = ИнформацияОбОшибке(); РезультатПроверки.СообщениеОбОшибке = КраткоеПредставлениеОшибки(Информация); @@ -856,22 +951,21 @@ СтрокаСообщенияОбОшибке = ""; WSПрокси = Неопределено; - Если РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.1.1") <> Неопределено Тогда - - WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси_3_0_1_1(Корреспондент, СтрокаСообщенияОбОшибке); - + Если РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.2.1") <> Неопределено Тогда + WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси_3_0_2_1(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке); + ТекущаяВерсия = "3.0.2.1" + ИначеЕсли РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.1.1") <> Неопределено Тогда + WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси_3_0_1_1(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке); + ТекущаяВерсия = "3.0.1.1"; ИначеЕсли РезультатПроверки.ВерсииИнтерфейса.Найти("2.1.1.7") <> Неопределено Тогда - - WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси_2_1_1_7(Корреспондент, СтрокаСообщенияОбОшибке); - + WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси_2_1_1_7(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке); + ТекущаяВерсия = "2.1.1.7"; ИначеЕсли РезультатПроверки.ВерсииИнтерфейса.Найти("2.0.1.6") <> Неопределено Тогда - - WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси_2_0_1_6(Корреспондент, СтрокаСообщенияОбОшибке); - + WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси_2_0_1_6(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке); + ТекущаяВерсия = "2.0.1.6"; Иначе - - WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси(Корреспондент, СтрокаСообщенияОбОшибке); - + WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси(СтруктураНастроекАутентификации, СтрокаСообщенияОбОшибке); + ТекущаяВерсия = "0.0.0.0"; КонецЕсли; Если WSПрокси = Неопределено Тогда @@ -884,11 +978,17 @@ РезультатПроверки.ПодключениеУстановлено = Истина; - Если РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.1.1") <> Неопределено Тогда - - СообщениеОбОшибке = ""; - ПараметрыИнформационнойБазы = WSПрокси.GetIBParameters(НастройкиПодключения.ИмяПланаОбмена, НастройкиПодключения.ИдентификаторИнформационнойБазыИсточника, СообщениеОбОшибке); + Если РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.1.1") <> Неопределено + Или РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.2.1") <> Неопределено Тогда + СообщениеОбОшибке = ""; + + ПараметрыИнформационнойБазы = ОбменДаннымиВебСервис.ПолучитьПараметрыИБ(WSПрокси, ТекущаяВерсия, + НастройкиПодключения.ИмяПланаОбмена, + НастройкиПодключения.ИдентификаторИнформационнойБазыИсточника, + СообщениеОбОшибке, + НастройкиПодключения.WSОбластьДанныхКорреспондента); + ПараметрыКорреспондента = СериализаторXDTO.ПрочитатьXDTO(ПараметрыИнформационнойБазы); Если Не ПараметрыКорреспондента.ПланОбменаСуществует Тогда РезультатПроверки.СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -908,8 +1008,9 @@ Иначе РезультатПроверки.ПодключениеРазрешено = Ложь; - РезультатПроверки.СообщениеОбОшибке = НСтр("ru = 'Корреспондент не поддерживает версию 3.0.1.1 интерфейса ""ОбменДанными"". - |Для настройки подключения обновите конфигурацию корреспондента, или начните настройку из него.'"); + РезультатПроверки.СообщениеОбОшибке = + НСтр("ru = 'Корреспондент не поддерживает версию интерфейса 3.0.1.1 или 3.0.2.1 ""ОбменДанными"". + |Для настройки подключения обновите конфигурацию корреспондента, или начните настройку из него.'"); ПоместитьВоВременноеХранилище(РезультатПроверки, АдресРезультата); Возврат; @@ -1188,7 +1289,12 @@ ИначеЕсли НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.WS Тогда - WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси_3_0_1_1(НастройкиПодключения); + СтруктураНастроекАутентификации = СтруктураНастроекАутентификации(НастройкиПодключения); + ДополнительныеПараметры = Новый Структура("СтруктураНастроекАутентификации", СтруктураНастроекАутентификации); + + СообщениеОбОшибке = ""; + WSПрокси = ОбменДаннымиВебСервис.WSПроксиДляУзлаИнформационнойБазы(НастройкиПодключения.УзелИнформационнойБазы, + СообщениеОбОшибке, ДополнительныеПараметры); Если WSПрокси = Неопределено Тогда Отказ = Истина; @@ -1222,15 +1328,22 @@ НастройкиПодключенияКорреспондента.ПоддерживаемыеОбъектыФормата = Новый ХранилищеЗначения(ТаблицаОбъекты, Новый СжатиеДанных(9)); КонецЕсли; - - Сериализатор = Новый СериализаторXDTO(WSПрокси.ФабрикаXDTO); + + Если ЗначениеЗаполнено(НастройкиПодключения.WSКонечнаяТочка) Тогда + УстановитьПривилегированныйРежим(Истина); + НастройкиПодключенияКорреспондента.WSКонечнаяТочкаКорреспондента = + ОбщегоНазначения.ЗначениеРеквизитаОбъекта(НастройкиПодключения.WSКонечнаяТочка, "Код"); + УстановитьПривилегированныйРежим(Ложь); + НастройкиПодключенияКорреспондента.WSОбластьДанныхКорреспондента = НастройкиПодключения.WSОбластьДанных; + КонецЕсли; ПараметрыПодключения = Новый Структура; ПараметрыПодключения.Вставить("НастройкиПодключения", НастройкиПодключенияКорреспондента); ПараметрыПодключения.Вставить("СтрокаПараметровXML", Результат.СтрокаНастроекПодключенияXML); Попытка - WSПрокси.CreateExchangeNode(Сериализатор.ЗаписатьXDTO(ПараметрыПодключения)); + ОбменДаннымиВебСервис.СоздатьУзелОбмена(WSПрокси, ДополнительныеПараметры.ТекущаяВерсия, + ПараметрыПодключения, НастройкиПодключения.WSОбластьДанныхКорреспондента); Исключение Отказ = Истина; Результат.СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); @@ -1588,14 +1701,12 @@ НастройкиПодключения = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспортаWS( НастройкиУдаления.УзелОбмена); - СтруктураНастроекОбмена = Новый Структура; - СтруктураНастроекОбмена.Вставить("ИмяПланаОбмена", ИмяПланаОбмена); - СтруктураНастроекОбмена.Вставить("УзелИнформационнойБазы", НастройкиУдаления.УзелОбмена); - СтруктураНастроекОбмена.Вставить("КлючСообщенияЖурналаРегистрации", ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеОбменаДанными()); - СтруктураНастроекОбмена.Вставить("ТекущийУзелПланаОбмена", ОбменДаннымиПовтИсп.ПолучитьЭтотУзелПланаОбмена(ИмяПланаОбмена)); - СтруктураНастроекОбмена.Вставить("ТекущийУзелПланаОбменаКод", ИдентификаторУзла); - СтруктураНастроекОбмена.Вставить("ДействиеПриОбмене", Неопределено); - + СтруктураНастроекОбмена = ОбменДаннымиСервер.НастройкиОбменаДляУзлаИнформационнойБазы( + НастройкиУдаления.УзелОбмена, "УдалениеУзла", Неопределено, Ложь); + + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеОбменаДанными(); + СтруктураНастроекОбмена.ДействиеПриОбмене = Неопределено; + ПараметрыПрокси = Новый Структура; ПараметрыПрокси.Вставить("ПараметрыАутентификации", Неопределено); ПараметрыПрокси.Вставить("МинимальнаяВерсия", "3.0.1.1"); @@ -1604,7 +1715,7 @@ Отказ = Ложь; СостояниеНастройки = Неопределено; СообщениеОбОшибке = ""; - ОбменДаннымиСервер.ИнициализироватьWSПроксиДляУправленияОбменомДанными( + ОбменДаннымиВебСервис.ИнициализироватьWSПроксиДляУправленияОбменомДанными( WSПрокси, СтруктураНастроекОбмена, ПараметрыПрокси, Отказ, СостояниеНастройки, СообщениеОбОшибке); Если Отказ Тогда @@ -1617,7 +1728,7 @@ КонецЕсли; Попытка - WSПрокси.RemoveExchangeNode(ИмяПланаОбмена, СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод); + ОбменДаннымиВебСервис.УдалитьУзелОбмена(WSПрокси, ПараметрыПрокси.ТекущаяВерсия, СтруктураНастроекОбмена); Исключение Результат.НастройкаУдаленаВКорреспонденте = Ложь; Результат.СообщениеОбОшибкеВКорреспонденте = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); @@ -1878,6 +1989,8 @@ "ПоддерживаемыеОбъекты", НастройкиПодключения.ПоддерживаемыеОбъектыФормата.Получить()); КонецЕсли; + ОбменДаннымиКонтрольЗацикливания.ОбновитьКонтур(НастройкиПодключения.ИмяПланаОбмена); + СтруктураЗаписи = Новый Структура; СтруктураЗаписи.Вставить("УзелИнформационнойБазы", НовыйУзел.Ссылка); СтруктураЗаписи.Вставить("ИмяПланаОбменаКорреспондента", НастройкиПодключения.ИмяПланаОбменаКорреспондента); @@ -1949,7 +2062,10 @@ СтруктураЗаписи.Вставить("WSИмяПользователя"); СтруктураЗаписи.Вставить("WSПароль"); СтруктураЗаписи.Вставить("WSЗапомнитьПароль"); - + + СтруктураЗаписи.Вставить("WSОбластьДанныхКорреспондента"); + СтруктураЗаписи.Вставить("WSКонечнаяТочкаКорреспондента"); + СтруктураЗаписи.Вставить("WSИспользоватьПередачуБольшогоОбъемаДанных", Истина); СтруктураЗаписи.Вставить("ПарольАрхиваСообщенияОбмена"); @@ -1960,6 +2076,31 @@ КонецПроцедуры +Функция СтруктураНастроекАутентификации(НастройкиПодключения) + + Результат = Новый Структура("WSURLВебСервиса,WSИмяПользователя,WSПароль"); + + Если ЗначениеЗаполнено(НастройкиПодключения.WSКонечнаяТочкаКорреспондента) Тогда + + УстановитьПривилегированныйРежим(Истина); + + МодульНастройкиТранспортаОбменаСообщениями = ОбщегоНазначения.ОбщийМодуль("РегистрыСведений.НастройкиТранспортаОбменаСообщениями"); + Настройки = МодульНастройкиТранспортаОбменаСообщениями.НастройкиТранспортаWS(НастройкиПодключения.WSКонечнаяТочкаКорреспондента); + + УстановитьПривилегированныйРежим(Ложь); + + ЗаполнитьЗначенияСвойств(Результат, Настройки); + + Иначе + + ЗаполнитьЗначенияСвойств(Результат, НастройкиПодключения); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + #Область НастройкиВФорматеXML Процедура ЗаполнитьНастройкиПодключенияИзКонстанты(НастройкиПодключения) Экспорт @@ -1986,7 +2127,7 @@ ИмяПланаОбменаВНастройках = ""; Если СтруктураНастроек.Свойство("ИмяПланаОбмена", ИмяПланаОбменаВНастройках) - И СтруктураНастроек.ИмяПланаОбмена = НастройкиПодключения.ИмяПланаОбмена Тогда + И ОбменДаннымиТрансляцияФорматаПовтИсп.ТранслироватьИмя(СтруктураНастроек.ИмяПланаОбмена, "en") = НастройкиПодключения.ИмяПланаОбмена Тогда КорректныйФайлНастроек = Истина; Иначе КорректныйФайлНастроек = Ложь; @@ -2023,6 +2164,15 @@ Или Не ОбменДаннымиXDTOСервер.ПоддерживаетсяВерсияСИдентификаторомОбменаДанными(ПустаяСсылкаПланаОбмена); КонецЕсли; + ВидТранспортаСообщенийОбмена = ""; + Если СтруктураНастроек.Свойство("ВидТранспортаСообщенийОбмена", ВидТранспортаСообщенийОбмена) + И ТипЗнч(ВидТранспортаСообщенийОбмена) = Тип("Строка") Тогда + + ИмяВидаТранспорта = ОбменДаннымиТрансляцияФорматаПовтИсп.ТранслироватьИмя(СтруктураНастроек.ВидТранспортаСообщенийОбмена, "en"); + НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена[ИмяВидаТранспорта]; + + КонецЕсли; + Если Не ЭтоПодключениеОнлайн Тогда КодНовогоУзлаВторойБазы = Неопределено; СтруктураНастроек.Свойство("КодНовогоУзлаВторойБазы", КодНовогоУзлаВторойБазы); @@ -2082,8 +2232,8 @@ Если НастройкиПодключения.ВерсияФорматаФайлаНастроекОбменаДанными = "1.0" Тогда НастройкиПодключения.НаименованиеЭтойБазы = НСтр("ru = 'Эта информационная база'"); - НастройкиПодключения.НаименованиеВторойБазы = СтруктураНастроек.НаименованиеНастройкиВыполненияОбмена; - НастройкиПодключения.КодНовогоУзлаВторойБазы = СтруктураНастроек.КодНовогоУзла; + СтруктураНастроек.Свойство("НаименованиеНастройкиВыполненияОбмена", НастройкиПодключения.НаименованиеВторойБазы); + СтруктураНастроек.Свойство("КодНовогоУзла", НастройкиПодключения.КодНовогоУзлаВторойБазы); КонецЕсли; @@ -2158,47 +2308,51 @@ Процедура ЗаписатьПараметрыПодключения(ЗаписьXML, НастройкиПодключения) ЗаписьXML.ЗаписатьНачалоЭлемента("ОсновныеПараметрыОбмена"); + + ИмяПланаОбмена = ОбменДаннымиТрансляцияФорматаПовтИсп.ТранслироватьИмя(НастройкиПодключения.ИмяПланаОбмена, "ru"); + ДобавитьЗаписьXML(ЗаписьXML, ИмяПланаОбмена, "ИмяПланаОбмена"); // @Non-NLS - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ИмяПланаОбмена, "ИмяПланаОбмена"); + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.НаименованиеЭтойБазы, "НаименованиеВторойБазы"); // @Non-NLS + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.НаименованиеВторойБазы, "НаименованиеЭтойБазы"); // @Non-NLS - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.НаименованиеЭтойБазы, "НаименованиеВторойБазы"); - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.НаименованиеВторойБазы, "НаименованиеЭтойБазы"); - - ДобавитьЗаписьXML(ЗаписьXML, КодУзла(НастройкиПодключения), "КодНовогоУзлаВторойБазы"); - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ПрефиксИнформационнойБазыПриемника, "ПрефиксИнформационнойБазыИсточника"); + ДобавитьЗаписьXML(ЗаписьXML, КодУзла(НастройкиПодключения), "КодНовогоУзлаВторойБазы"); // @Non-NLS + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ПрефиксИнформационнойБазыПриемника, "ПрефиксИнформационнойБазыИсточника"); // @Non-NLS // Настройки транспорта сообщений обмена. - Если НастройкиПодключения.ВидТранспортаСообщенийОбмена <> Перечисления.ВидыТранспортаСообщенийОбмена.WS Тогда - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ВидТранспортаСообщенийОбмена, "ВидТранспортаСообщенийОбмена"); + Если ЗначениеЗаполнено(НастройкиПодключения.ВидТранспортаСообщенийОбмена) + И НастройкиПодключения.ВидТранспортаСообщенийОбмена <> Перечисления.ВидыТранспортаСообщенийОбмена.WS Тогда + ИмяВидаТранспорта = ИмяЗначенияПеречисления(НастройкиПодключения.ВидТранспортаСообщенийОбмена); + ИмяВидаТранспорта = ОбменДаннымиТрансляцияФорматаПовтИсп.ТранслироватьИмя(ИмяВидаТранспорта, "ru"); + ДобавитьЗаписьXML(ЗаписьXML, ИмяВидаТранспорта, "ВидТранспортаСообщенийОбмена"); // @Non-NLS Иначе - ДобавитьЗаписьXML(ЗаписьXML, Неопределено, "ВидТранспортаСообщенийОбмена"); + ДобавитьЗаписьXML(ЗаписьXML, Неопределено, "ВидТранспортаСообщенийОбмена"); // @Non-NLS КонецЕсли; - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ПарольАрхиваСообщенияОбмена, "ПарольАрхиваСообщенияОбмена"); + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ПарольАрхиваСообщенияОбмена, "ПарольАрхиваСообщенияОбмена"); // @Non-NLS Если НастройкиПодключения.ИспользоватьПараметрыТранспортаEMAIL Тогда - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.EMAILМаксимальныйДопустимыйРазмерСообщения, "EMAILМаксимальныйДопустимыйРазмерСообщения"); - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.EMAILСжиматьФайлИсходящегоСообщения, "EMAILСжиматьФайлИсходящегоСообщения"); - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.EMAILУчетнаяЗапись, "EMAILУчетнаяЗапись"); + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.EMAILМаксимальныйДопустимыйРазмерСообщения, "EMAILМаксимальныйДопустимыйРазмерСообщения"); // @Non-NLS + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.EMAILСжиматьФайлИсходящегоСообщения, "EMAILСжиматьФайлИсходящегоСообщения"); // @Non-NLS + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.EMAILУчетнаяЗапись, "EMAILУчетнаяЗапись"); // @Non-NLS КонецЕсли; Если НастройкиПодключения.ИспользоватьПараметрыТранспортаFILE Тогда - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FILEКаталогОбменаИнформацией, "FILEКаталогОбменаИнформацией"); - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FILEСжиматьФайлИсходящегоСообщения, "FILEСжиматьФайлИсходящегоСообщения"); + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FILEКаталогОбменаИнформацией, "FILEКаталогОбменаИнформацией"); // @Non-NLS + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FILEСжиматьФайлИсходящегоСообщения, "FILEСжиматьФайлИсходящегоСообщения"); // @Non-NLS КонецЕсли; Если НастройкиПодключения.ИспользоватьПараметрыТранспортаFTP Тогда - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСжиматьФайлИсходящегоСообщения, "FTPСжиматьФайлИсходящегоСообщения"); - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеМаксимальныйДопустимыйРазмерСообщения, "FTPСоединениеМаксимальныйДопустимыйРазмерСообщения"); - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеПароль, "FTPСоединениеПароль"); - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеПассивноеСоединение, "FTPСоединениеПассивноеСоединение"); - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеПользователь, "FTPСоединениеПользователь"); - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеПорт, "FTPСоединениеПорт"); - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеПуть, "FTPСоединениеПуть"); + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСжиматьФайлИсходящегоСообщения, "FTPСжиматьФайлИсходящегоСообщения"); // @Non-NLS + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеМаксимальныйДопустимыйРазмерСообщения, "FTPСоединениеМаксимальныйДопустимыйРазмерСообщения"); // @Non-NLS + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеПароль, "FTPСоединениеПароль"); // @Non-NLS + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеПассивноеСоединение, "FTPСоединениеПассивноеСоединение"); // @Non-NLS + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеПользователь, "FTPСоединениеПользователь"); // @Non-NLS + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеПорт, "FTPСоединениеПорт"); // @Non-NLS + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.FTPСоединениеПуть, "FTPСоединениеПуть"); // @Non-NLS КонецЕсли; @@ -2216,27 +2370,27 @@ АутентификацияОС = ПользовательИБ.АутентификацияОС; ИмяПользователя = ПользовательИБ.Имя; - ДобавитьЗаписьXML(ЗаписьXML, ВариантРаботыИнформационнойБазы, "COMВариантРаботыИнформационнойБазы"); - ДобавитьЗаписьXML(ЗаписьXML, ИмяИнформационнойБазыНаСервере1СПредприятия, "COMИмяИнформационнойБазыНаСервере1СПредприятия"); - ДобавитьЗаписьXML(ЗаписьXML, ИмяСервера1СПредприятия, "COMИмяСервера1СПредприятия"); - ДобавитьЗаписьXML(ЗаписьXML, КаталогИнформационнойБазы, "COMКаталогИнформационнойБазы"); - ДобавитьЗаписьXML(ЗаписьXML, АутентификацияОС, "COMАутентификацияОперационнойСистемы"); + ДобавитьЗаписьXML(ЗаписьXML, ВариантРаботыИнформационнойБазы, "COMВариантРаботыИнформационнойБазы"); // @Non-NLS + ДобавитьЗаписьXML(ЗаписьXML, ИмяИнформационнойБазыНаСервере1СПредприятия, "COMИмяИнформационнойБазыНаСервере1СПредприятия"); // @Non-NLS + ДобавитьЗаписьXML(ЗаписьXML, ИмяСервера1СПредприятия, "COMИмяСервера1СПредприятия"); // @Non-NLS + ДобавитьЗаписьXML(ЗаписьXML, КаталогИнформационнойБазы, "COMКаталогИнформационнойБазы"); // @Non-NLS + ДобавитьЗаписьXML(ЗаписьXML, АутентификацияОС, "COMАутентификацияОперационнойСистемы"); // @Non-NLS ДобавитьЗаписьXML(ЗаписьXML, ИмяПользователя, "COMИмяПользователя"); КонецЕсли; - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ИспользоватьПараметрыТранспортаEMAIL, "ИспользоватьПараметрыТранспортаEMAIL"); - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ИспользоватьПараметрыТранспортаFILE, "ИспользоватьПараметрыТранспортаFILE"); - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ИспользоватьПараметрыТранспортаFTP, "ИспользоватьПараметрыТранспортаFTP"); + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ИспользоватьПараметрыТранспортаEMAIL, "ИспользоватьПараметрыТранспортаEMAIL"); // @Non-NLS + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ИспользоватьПараметрыТранспортаFILE, "ИспользоватьПараметрыТранспортаFILE"); // @Non-NLS + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.ИспользоватьПараметрыТранспортаFTP, "ИспользоватьПараметрыТранспортаFTP"); // @Non-NLS // Поддержка файла настроек обмена формата версии 1.0. - ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.НаименованиеЭтойБазы, "НаименованиеНастройкиВыполненияОбмена"); + ДобавитьЗаписьXML(ЗаписьXML, НастройкиПодключения.НаименованиеЭтойБазы, "НаименованиеНастройкиВыполненияОбмена"); // @Non-NLS - ДобавитьЗаписьXML(ЗаписьXML, КодУзла(НастройкиПодключения), "КодНовогоУзла"); + ДобавитьЗаписьXML(ЗаписьXML, КодУзла(НастройкиПодключения), "КодНовогоУзла"); // @Non-NLS - КодУзлаИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(НастройкиПодключения.УзелИнформационнойБазы, "Код"); + КодУзлаИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(НастройкиПодключения.УзелИнформационнойБазы, "Код"); // @Non-NLS - ДобавитьЗаписьXML(ЗаписьXML, КодУзлаИБ, "КодПредопределенногоУзла"); + ДобавитьЗаписьXML(ЗаписьXML, КодУзлаИБ, "КодПредопределенногоУзла"); // @Non-NLS НомерОтправленного = НастройкиПодключения.УзелИнформационнойБазы.НомерОтправленного; Если НомерОтправленного > 0 Тогда @@ -2252,6 +2406,17 @@ КонецПроцедуры +Функция ИмяЗначенияПеречисления(Значение) Экспорт + + ОбъектМД = Значение.Метаданные(); + + МенеджерПеречисления = Перечисления[ОбъектМД.Имя]; + ИндексЗначения = МенеджерПеречисления.Индекс(Значение); + + Возврат ОбъектМД.ЗначенияПеречисления.Получить(ИндексЗначения).Имя; + +КонецФункции + Процедура ЗаписатьУчетнуюЗаписьЭлектроннойПочты(ЗаписьXML, НастройкиПодключения) EMAILУчетнаяЗапись = Неопределено; @@ -2338,12 +2503,21 @@ ЧтениеXML.Прочитать(); Пока ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента Цикл + + ИмяУзла = ОбменДаннымиТрансляцияФорматаПовтИсп.ТранслироватьИмя(ЧтениеXML.Имя, "en"); - ИмяУзла = ЧтениеXML.Имя; - СтруктураНастроек.Вставить(ИмяУзла, ПрочитатьXML(ЧтениеXML)); + Попытка + СтруктураНастроек.Вставить(ИмяУзла, ПрочитатьXML(ЧтениеXML)); + Исключение + + Для Сч = 0 По ЧтениеXML.КоличествоАтрибутов() Цикл + ЧтениеXML.Прочитать(); + КонецЦикла; + + КонецПопытки; КонецЦикла; - + ЧтениеXML.Прочитать(); КонецПроцедуры diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ObjectModule.bsl b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ObjectModule.bsl index a212f3dd0..3646d3918 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ObjectModule.bsl @@ -729,9 +729,9 @@ Процедура СообщитьИнформациюОбОшибке(ИнформацияОбОшибке, Отказ) - ПолеСтрокаСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ПолеСтрокаСообщенияОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); - ОбменДаннымиСервер.СообщитьОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Отказ); + ОбменДаннымиСервер.СообщитьОбОшибке(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Отказ); ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(), УровеньЖурналаРегистрации.Ошибка,,, СтрокаСообщенияОбОшибке()); diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo index 9d2c405b5..5bc43911f 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo @@ -93,36 +93,6 @@ - - НомерОтправленного - - ru - Номер отправленного - - - Number - - 10 - - - - - - - НомерПринятого - - ru - Номер принятого - - - Number - - 10 - - - - - COMКаталогИнформационнойБазы @@ -924,6 +894,46 @@ + + КонтурСинхронизации + + ru + Контур синхронизации + + + + + + + НомерОтправленного + + ru + Номер отправленного + + + Number + + 10 + + + + + + + НомерПринятого + + ru + Номер принятого + + + Number + + 10 + + + + + НоваяСинхронизацияДанных @@ -987,4 +997,13 @@ PersonalComputer MobileDevice + + ПереходНаИнтернетСоединение + + ru + Переход на интернет соединение + + PersonalComputer + MobileDevice + diff --git a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/ВстроенныйКриптопровайдер/Form.form b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/ВстроенныйКриптопровайдер/Form.form index fce18e30e..831bcc2db 100644 --- a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/ВстроенныйКриптопровайдер/Form.form +++ b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/ВстроенныйКриптопровайдер/Form.form @@ -100,7 +100,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаCryptoProCSPРегистрационныеДанные/Form.form b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаCryptoProCSPРегистрационныеДанные/Form.form new file mode 100644 index 000000000..bdc7e0db9 --- /dev/null +++ b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаCryptoProCSPРегистрационныеДанные/Form.form @@ -0,0 +1,520 @@ + + + + <key>ru</key> + <value>Регистрационная информация</value> + + + Пояснение + 36 + + <key>ru</key> + <value>Укажите информацию для загрузки программы КриптоПро CSP. +Данные будут переданы в ООО "КРИПТО-ПРО". +</value> + + true + true + + true + + + ПояснениеРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ПояснениеКонтекстноеМеню + 37 + true + + Label + 2 + true + + Left + Top + + + + ФИО + 1 + + <key>ru</key> + <value>ФИО полностью</value> + + true + true + + true + + + КонтактноеЛицо + + + ФИОРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + ФИОКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + Normal + + + + ЭлектроннаяПочта + 4 + + <key>ru</key> + <value>Контактный e-mail</value> + + true + true + + true + + + ЭлектроннаяПочта + + + ЭлектроннаяПочтаРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + ЭлектроннаяПочтаКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + СерийныйНомер + 45 + true + true + + true + + + СерийныйНомер + + + ru + Серийный номер обычно содержится в документе с лицензией на программу КриптоПро CSP + + ShowBottom + + OnChange + СерийныйНомерПриИзменении + + + СерийныйНомерРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + СерийныйНомерКонтекстноеМеню + 46 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + ru + Например: 40XXX-XXXXX-XXXXX-XXXXX-XXXXX + + + + + Декорация2 + 48 + true + true + + true + + + Декорация2РасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + Декорация2КонтекстноеМеню + 49 + true + + Label + true + true + + Left + + + + Декорация3 + 51 + + <key>ru</key> + <value><b>Внимание</>: программа КриптоПро CSP - платная. Подробнее о программе и условиях ее приобретения - на сайте компании <link https://www.cryptopro.ru/buy>ООО</><link https://www.cryptopro.ru/buy> </><link https://www.cryptopro.ru/buy>"</><link https://www.cryptopro.ru/>КРИПТО</><link https://www.cryptopro.ru/buy>-ПРО"</></value> + + true + true + + true + + + Декорация3РасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + Декорация3КонтекстноеМеню + 52 + true + + true + Label + true + + Left + + + + Декорация1 + 42 + true + true + + true + + + Декорация1РасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + Декорация1КонтекстноеМеню + 43 + true + + Label + true + true + + Left + + + + ВыполнятьКонтрольЦелостности + 39 + true + true + + true + + + ВыполнятьКонтрольЦелостности + + Right + + ВыполнятьКонтрольЦелостностиРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ВыполнятьКонтрольЦелостностиКонтекстноеМеню + 40 + true + + CheckBoxField + Enter + true + Left + true + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаЗагрузить + 32 + true + true + + true + + + ФормаЗагрузитьРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.Command.Загрузить + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 34 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + + FillCheckProcessingAtServer + ОбработкаПроверкиЗаполненияНаСервере + + 50 + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + String + + + + true + + + true + +
        true
        +
        + + КонтактноеЛицо + + <key>ru</key> + <value>ФИО (полностью)</value> + + 2 + + String + + + + true + + + true + + ShowError + + + ЭлектроннаяПочта + + <key>ru</key> + <value>Электронная почта</value> + + 3 + + String + + + + true + + + true + + ShowError + + + ВыполнятьКонтрольЦелостности + + <key>ru</key> + <value>Я хочу выполнить контроль целостности дистрибутива перед установкой.</value> + + 4 + + Boolean + + + true + + + true + + + + СерийныйНомер + + <key>ru</key> + <value>Серийный номер</value> + + 5 + + String + + + + true + + + true + + + + Продукт + 6 + + String + + + + true + + + true + + + + Загрузить + + <key>ru</key> + <value>Загрузить</value> + + 3 + + true + + + + Загрузить + + + DontUse + Auto + + + + + +
        diff --git a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаCryptoProCSPРегистрационныеДанные/Module.bsl b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаCryptoProCSPРегистрационныеДанные/Module.bsl new file mode 100644 index 000000000..ebd7cfbe5 --- /dev/null +++ b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаCryptoProCSPРегистрационныеДанные/Module.bsl @@ -0,0 +1,150 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Продукт = "csp40"; + ЗаполнитьРегистрационныеДанные(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ОпределитьПродукт(); + + Если ЗначениеЗаполнено(КонтактноеЛицо) И ЗначениеЗаполнено(ЭлектроннаяПочта) Тогда + ТекущийЭлемент = Элементы.СерийныйНомер; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) + + Если ЗначениеЗаполнено(ЭлектроннаяПочта) + И Не ОбщегоНазначенияКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям(ЭлектроннаяПочта) Тогда + ОбщегоНазначения.СообщитьПользователю( + НСтр("ru = 'Некорректно заполнен адрес электронной почты.'"),, "ЭлектроннаяПочта",, Отказ); + КонецЕсли; + + СимволыСерийногоНомера = Новый Массив; + Если ЗначениеЗаполнено(СерийныйНомер) Тогда + Для Индекс = 1 По СтрДлина(СерийныйНомер) Цикл + ТекущийСимвол = ВРег(Сред(СерийныйНомер, Индекс, 1)); + Код = КодСимвола(ТекущийСимвол); + Если (Код > 64 И Код < 91) ИЛИ (Код > 47 И Код < 58) Тогда + СимволыСерийногоНомера.Добавить(ТекущийСимвол); + КонецЕсли; + КонецЦикла; + + ЧистыйСерийныйНомер = СтрСоединить(СимволыСерийногоНомера, ""); + Если СтрДлина(ЧистыйСерийныйНомер) <> 25 Тогда + ОбщегоНазначения.СообщитьПользователю( + НСтр("ru = 'Некорректно заполнен серийный номер.'"),, "СерийныйНомер",, Отказ); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура СерийныйНомерПриИзменении(Элемент) + + СерийныйНомер = СокрЛП(СерийныйНомер); + ОпределитьПродукт(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Загрузить(Команда) + + Если ПроверитьЗаполнение() Тогда + ПараметрыРегистрации = Новый Структура; + ПараметрыРегистрации.Вставить("КонтактноеЛицо", СокрЛП(КонтактноеЛицо)); + ПараметрыРегистрации.Вставить("ЭлектроннаяПочта", СокрЛП(ЭлектроннаяПочта)); + ПараметрыРегистрации.Вставить("СерийныйНомер", СокрЛП(СерийныйНомер)); + ПараметрыРегистрации.Вставить("Продукт", Продукт); + ПараметрыРегистрации.Вставить("ВыполнятьКонтрольЦелостности", ВыполнятьКонтрольЦелостности); + ПараметрыРегистрации.Вставить("ИмяПрограммы", ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыКриптоПро()); + + Если Не ЗначениеЗаполнено(СерийныйНомер) Тогда + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Без указания серийного номера программа %1 будет работать ограниченное время. + | + |Продолжить?'"), ПараметрыРегистрации.ИмяПрограммы); + Оповещение = Новый ОписаниеОповещения("ЗагрузитьПослеОтветаНаВопрос", ЭтотОбъект, ПараметрыРегистрации); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Нет); + Иначе + ЗагрузитьПослеОтветаНаВопрос(КодВозвратаДиалога.Да, ПараметрыРегистрации); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ЗагрузитьПослеОтветаНаВопрос(Ответ, ВходящийКонтекст) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + Закрыть(ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьРегистрационныеДанные() + + ТекущийПользователь = Пользователи.ТекущийПользователь(); + КонтактноеЛицо = ТекущийПользователь; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + + КонтактнаяИнформация = МодульУправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ТекущийПользователь, + "АдресЭлектроннойПочты", ТекущаяДатаСеанса(), Ложь); + Если КонтактнаяИнформация.Количество() > 0 И ОбщегоНазначенияКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям( + КонтактнаяИнформация[0].Представление) Тогда + ЭлектроннаяПочта = КонтактнаяИнформация[0].Представление; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОпределитьПродукт() + + СистемнаяИнформация = Новый СистемнаяИнформация; + + Если СтрНачинаетсяС(СерийныйНомер, "40") + Или СтрНайти(СистемнаяИнформация.ВерсияОС, "Windows Vista") <> 0 + Или СтрНайти(СистемнаяИнформация.ВерсияОС, "Windows XP") <> 0 + Или СтрНайти(СистемнаяИнформация.ВерсияОС, "Windows 2000") <> 0 Тогда + Продукт = "csp40"; + Иначе + Продукт = "csp50r2_win"; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + diff --git a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаViPNetCSPРегистрационныеДанные/Form.form b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаViPNetCSPРегистрационныеДанные/Form.form new file mode 100644 index 000000000..8d12e6d5d --- /dev/null +++ b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаViPNetCSPРегистрационныеДанные/Form.form @@ -0,0 +1,400 @@ + + + + <key>ru</key> + <value>Регистрационная информация</value> + + + Пояснение + 36 + + <key>ru</key> + <value>Укажите информацию для загрузки программы ViPNet CSP. +Данные будут переданы в ОАО "Инфотекс". +</value> + + true + true + + true + + + ПояснениеРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ПояснениеКонтекстноеМеню + 37 + true + + Label + 2 + true + + Left + Top + + + + ФИО + 1 + + <key>ru</key> + <value>ФИО полностью</value> + + true + true + + true + + + КонтактноеЛицо + + + ФИОРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + ФИОКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + Normal + + + + ЭлектроннаяПочта + 4 + + <key>ru</key> + <value>Контактный e-mail</value> + + true + true + + true + + + ЭлектроннаяПочта + + + ЭлектроннаяПочтаРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + ЭлектроннаяПочтаКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ДекорацияОтступ + 42 + true + true + + true + + + ДекорацияОтступРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ДекорацияОтступКонтекстноеМеню + 43 + true + + Label + true + true + + Left + + + + Декорация1 + 45 + + <key>ru</key> + <value>Подробнее о программе - на сайте компании <link СсылкаVipNet>ОАО</><link СсылкаVipNet> </><link СсылкаVipNet>"Инфотекс"</></value> + + true + true + + true + + + Декорация1РасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + Декорация1КонтекстноеМеню + 46 + true + + true + Label + true + + Left + + + + ВыполнятьКонтрольЦелостности + 51 + true + true + + true + + + ВыполнятьКонтрольЦелостности + + Right + + ВыполнятьКонтрольЦелостностиРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ВыполнятьКонтрольЦелостностиКонтекстноеМеню + 52 + true + + CheckBoxField + Enter + true + Left + true + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаЗагрузить + 32 + true + true + + true + + + ФормаЗагрузитьРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.Command.Загрузить + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 34 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + + FillCheckProcessingAtServer + ОбработкаПроверкиЗаполненияНаСервере + + 50 + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + String + + + + true + + + true + +
        true
        +
        + + КонтактноеЛицо + + <key>ru</key> + <value>ФИО (полностью)</value> + + 2 + + String + + + + true + + + true + + ShowError + + + ЭлектроннаяПочта + + <key>ru</key> + <value>Электронная почта</value> + + 3 + + String + + + + true + + + true + + ShowError + + + ВыполнятьКонтрольЦелостности + + <key>ru</key> + <value>Я хочу выполнить контроль целостности дистрибутива перед установкой.</value> + + 4 + + Boolean + + + true + + + true + + + + Загрузить + + <key>ru</key> + <value>Загрузить</value> + + 3 + + true + + + + Загрузить + + + DontUse + Auto + + + + + +
        diff --git a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаViPNetCSPРегистрационныеДанные/Module.bsl b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаViPNetCSPРегистрационныеДанные/Module.bsl new file mode 100644 index 000000000..de94d381b --- /dev/null +++ b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаViPNetCSPРегистрационныеДанные/Module.bsl @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЗаполнитьРегистрационныеДанные(); + +КонецПроцедуры + +&НаСервере +Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) + + Если ЗначениеЗаполнено(ЭлектроннаяПочта) + И Не ОбщегоНазначенияКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям(ЭлектроннаяПочта) Тогда + ОбщегоНазначения.СообщитьПользователю( + НСтр("ru = 'Некорректно заполнен адрес электронной почты.'"),, "ЭлектроннаяПочта",, Отказ); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Загрузить(Команда) + + Если ПроверитьЗаполнение() Тогда + + ПараметрыРегистрации = Новый Структура; + ПараметрыРегистрации.Вставить("КонтактноеЛицо", СокрЛП(КонтактноеЛицо)); + ПараметрыРегистрации.Вставить("ЭлектроннаяПочта", СокрЛП(ЭлектроннаяПочта)); + ПараметрыРегистрации.Вставить("ВыполнятьКонтрольЦелостности", ВыполнятьКонтрольЦелостности); + ПараметрыРегистрации.Вставить("ИмяПрограммы", ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыVipNet()); + + Закрыть(ПараметрыРегистрации); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура ЗаполнитьРегистрационныеДанные() + + ТекущийПользователь = Пользователи.ТекущийПользователь(); + КонтактноеЛицо = ТекущийПользователь; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + + КонтактнаяИнформация = МодульУправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ТекущийПользователь, + "АдресЭлектроннойПочты", ТекущаяДатаСеанса(), Ложь); + Если КонтактнаяИнформация.Количество() > 0 И ОбщегоНазначенияКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям( + КонтактнаяИнформация[0].Представление) Тогда + ЭлектроннаяПочта = КонтактнаяИнформация[0].Представление; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + diff --git a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаКриптопровайдераИнформацияОДистрибутиве/Form.form b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаКриптопровайдераИнформацияОДистрибутиве/Form.form new file mode 100644 index 000000000..b3be51156 --- /dev/null +++ b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаКриптопровайдераИнформацияОДистрибутиве/Form.form @@ -0,0 +1,318 @@ + + + + <key>ru</key> + <value>Установка ViPNet CSP</value> + + + ДекорацияДистрибутивЗагружен + 13 + + <key>ru</key> + <value>Дистрибутив ViPNet CSP успешно загружен и готов к установке.</value> + + true + true + + true + + + ДекорацияДистрибутивЗагруженРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + ДекорацияДистрибутивЗагруженКонтекстноеМеню + 14 + true + + Label + 2 + true + + Left + Top + + + + Дистрибутив + 4 + true + true + + true + + + Дистрибутив + + Top + ShowBottom + + ДистрибутивРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + ДистрибутивКонтекстноеМеню + 5 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + КонтрольнаяСумма + 1 + + <key>ru</key> + <value>Контрольная сумма (GOST R 34.11-94)</value> + + true + true + + true + + + КонтрольнаяСумма + + Top + ShowBottom + + КонтрольнаяСуммаРасширеннаяПодсказка + 3 + + <key>ru</key> + <value>Контрольную сумму можно проверить с помощью программы ViPNet HashCalc. +Программу можно скачать с сайта <link https://www.infotecs.ru>www.infotecs.ru</>.</value> + + true + Label + true + + Left + + + + КонтрольнаяСуммаКонтекстноеМеню + 2 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаУстановить + 11 + true + true + + true + + true + + ФормаУстановитьРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + Form.Command.Установить + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 9 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + 60 + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + String + + + + true + + + true + +
        true
        +
        + + Дистрибутив + + <key>ru</key> + <value>Дистрибутив</value> + + 2 + + String + + + + true + + + true + + + + КонтрольнаяСумма + + <key>ru</key> + <value>Контрольная сумма</value> + + 3 + + String + + 64 + + + + true + + + true + + + + Версия + 4 + + String + + + + true + + + true + + + + ИмяПрограммы + 5 + + String + + + + 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 new file mode 100644 index 000000000..ae97ec098 --- /dev/null +++ b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаКриптопровайдераИнформацияОДистрибутиве/Module.bsl @@ -0,0 +1,44 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Параметры.Свойство("КонтрольнаяСумма", КонтрольнаяСумма); + Параметры.Свойство("Дистрибутив", Дистрибутив); + Параметры.Свойство("Версия", Версия); + Параметры.Свойство("ИмяПрограммы", ИмяПрограммы); + + Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Установка %1'"), ИмяПрограммы); + Элементы.ДекорацияДистрибутивЗагружен.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Дистрибутив %1 успешно загружен и готов к установке.'"), ИмяПрограммы); + Элементы.Дистрибутив.Подсказка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Версия: %1'"), Версия); + + Если ИмяПрограммы = ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыVipNet() Тогда + Элементы.КонтрольнаяСуммаРасширеннаяПодсказка.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(НСтр("ru = 'Контрольную сумму можно проверить с помощью программы ViPNet HashCalc. + |Программу можно скачать с сайта www.infotecs.ru.'")); + Иначе + Элементы.КонтрольнаяСуммаРасширеннаяПодсказка.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(НСтр("ru = 'Контрольную сумму можно проверить с помощью программы cpverify.exe + |Программу можно скачать с сайта www.cryptopro.ru.'")); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Установить(Команда) + + Закрыть(Истина); + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаПрограммКриптопровайдеров/Form.form b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаПрограммКриптопровайдеров/Form.form new file mode 100644 index 000000000..908571b88 --- /dev/null +++ b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаПрограммКриптопровайдеров/Form.form @@ -0,0 +1,356 @@ + + + + ДекорацияЗаголовок + 1 + + <key>ru</key> + <value>Для работы с усиленной квалифицированной электронной подписью на компьютере или на сервере должна быть установлена сертифицированная* программа (средство криптографической защиты информации). С ее помощью вы сможете работать с любым количеством электронных подписей, но только на том компьютере или ноутбуке, на котором она установлена. Если необходимо работать на разных компьютерах, то следует для каждого приобрести дополнительную лицензию или настроить работу на сервере (этим занимается администратор).</value> + + true + true + + true + + + ДекорацияЗаголовокРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + ДекорацияЗаголовокКонтекстноеМеню + 2 + true + + true + Label + 80 + true + + Left + + + + ДекорацияПрограммы + 4 + + <key>ru</key> + <value> Выберите одну из программ для установки на этом компьютере: +</value> + + true + true + + true + + + ДекорацияПрограммыРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + ДекорацияПрограммыКонтекстноеМеню + 5 + true + + true + Label + 80 + true + + Left + + + + Программы + 14 + + УстановитьVipNet + 16 + true + true + + true + + + УстановитьVipNetРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + UsualButton + Form.Command.УстановитьVipNet + Normal + Auto + true + true + UserCmds + Auto + + + УстановитьКриптоПро + 10 + true + true + + true + + + УстановитьКриптоПроРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + UsualButton + Form.Command.УстановитьКриптоПро + Normal + Auto + true + true + UserCmds + Auto + + + УстановитьLISSI + 12 + true + true + + true + + + УстановитьLISSIРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + Hyperlink + Form.Command.УстановитьLISSI + Normal + Auto + true + true + UserCmds + Auto + + + УстановитьSignalCOM + 18 + true + true + + true + + + УстановитьSignalCOMРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Hyperlink + Form.Command.УстановитьSignalCOM + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + ПрограммыРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + UsualGroup + + Vertical + NormalSeparation + true + true + Auto + Auto + + + + ДекорацияПрограммы2 + 20 + + <key>ru</key> + <value>    *Программа, сертифицированная ФСБ и ФСТЭК, соответствует стандартам безопасности, принятым в России и поддерживает отечественные стандарты безопасности ГОСТ Р 34.11-2012 и ГОСТ Р 34.10-2012.</value> + + true + true + + true + + + ДекорацияПрограммы2РасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ДекорацияПрограммы2КонтекстноеМеню + 21 + true + + true + Label + 80 + true + + Left + + + + ФормаКоманднаяПанель + -1 + Left + + DontBlock + true + true + true + Vertical + true + true + true + auto + true + + УстановитьКриптоПро + + <key>ru</key> + <value>КриптоПро CSP</value> + + 1 + + true + + + CommonPicture.ЗначокЩита + + + + УстановитьКриптоПро + + + TextPicture + Auto + Auto + + + УстановитьLISSI + + <key>ru</key> + <value>LISSI-CSP</value> + + 2 + + true + + + CommonPicture.ТипГиперссылка + + + + УстановитьLISSI + + + TextPicture + Auto + Auto + + + УстановитьVipNet + + <key>ru</key> + <value>ViPNet CSP</value> + + 3 + + true + + + CommonPicture.ЗначокЩита + + + + УстановитьVipNet + + + TextPicture + Auto + Auto + + + УстановитьSignalCOM + + <key>ru</key> + <value>Signal-COM CSP</value> + + 4 + + true + + + CommonPicture.ТипГиперссылка + + + + УстановитьSignalCOM + + + TextPicture + Auto + Auto + + + + + + diff --git a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаПрограммКриптопровайдеров/Module.bsl b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаПрограммКриптопровайдеров/Module.bsl new file mode 100644 index 000000000..39659d234 --- /dev/null +++ b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Forms/УстановкаПрограммКриптопровайдеров/Module.bsl @@ -0,0 +1,125 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ВходящиеКонтексты; + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура УстановитьVipNet(Команда) + + ОповещениеОЗавершении = Новый ОписаниеОповещения("ПовторнаяПроверкаПрограммКриптографии", ЭтотОбъект); + + ВходящийКонтекст = Неопределено; + Если ТипЗнч(ВходящиеКонтексты) = Тип("Соответствие") Тогда + ВходящийКонтекст = ВходящиеКонтексты.Получить(ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыVipNet()); + КонецЕсли; + + ЭлектроннаяПодписьСлужебныйКлиент.УстановитьVipNet(ЭтотОбъект, ОповещениеОЗавершении, ВходящийКонтекст); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьКриптоПро(Команда) + + ВходящийКонтекст = Неопределено; + Если ТипЗнч(ВходящиеКонтексты) = Тип("Соответствие") Тогда + ВходящийКонтекст = ВходящиеКонтексты.Получить(ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыКриптоПро()); + КонецЕсли; + + ОповещениеОЗавершении = Новый ОписаниеОповещения("ПовторнаяПроверкаПрограммКриптографии", ЭтотОбъект); + ЭлектроннаяПодписьСлужебныйКлиент.УстановитьКриптоПро(ЭтотОбъект, ОповещениеОЗавершении, ВходящийКонтекст); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьLISSI(Команда) + + ЭлектроннаяПодписьСлужебныйКлиент.УстановитьLISSI(); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьSignalCOM(Команда) + + ЭлектроннаяПодписьСлужебныйКлиент.УстановитьSignalCOM(); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Асинх Процедура ПовторнаяПроверкаПрограммКриптографии(Результат, ДополнительныеПараметры) Экспорт + + Если Не ТипЗнч(Результат) = Тип("Структура") Тогда + Возврат; + КонецЕсли; + + Если Результат.Выполнено = Истина Тогда + + ОбновитьПовторноИспользуемыеЗначения(); + + Ответ = Ждать ВопросАсинх( + НСтр("ru = 'Для работы с только что установленным криптопровайдером перезапустите сеанс. Перезапустить сейчас?'"), + РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Нет, НСтр("ru = 'После установки криптопровайдера'")); + + Если Ответ = КодВозвратаДиалога.Да Тогда + ПараметрыПриложения.Вставить("СтандартныеПодсистемы.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы", Истина); + ЗавершитьРаботуСистемы(Истина, Истина); + Возврат; + КонецЕсли; + + Закрыть(); + Возврат; + + КонецЕсли; + + Если ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Результат, "ВходящийКонтекст", Неопределено) <> Неопределено Тогда + Если ВходящиеКонтексты = Неопределено Тогда + ВходящиеКонтексты = Новый Соответствие; + КонецЕсли; + ВходящиеКонтексты.Вставить(Результат.ВходящийКонтекст.ИмяПрограммы, Результат.ВходящийКонтекст); + КонецЕсли; + + Если ЗначениеЗаполнено(Результат.ОписаниеОшибки) Тогда + ПоказатьПредупреждение(, УстановитьГиперссылку(Результат.ОписаниеОшибки)); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция УстановитьГиперссылку(Строка) + + МассивСсылок = Новый Массив; + МассивСсылок.Добавить(Новый Структура("Текст, Гиперссылка", "www.infotecs.ru", "https://infotecs.ru/")); + МассивСсылок.Добавить(Новый Структура("Текст, Гиперссылка", "www.cryptopro.ru", "https://cryptopro.ru/")); + + Для Каждого ТекущаяСсылка Из МассивСсылок Цикл + Позиция = СтрНайти(Строка, ТекущаяСсылка.Текст); + Если Позиция = 0 Тогда + Продолжить; + КонецЕсли; + + СтрокаСоСсылкой = Новый ФорматированнаяСтрока(ТекущаяСсылка.Текст, , , , ТекущаяСсылка.Гиперссылка); + + Возврат Новый ФорматированнаяСтрока(Лев(Строка, Позиция - 1), СтрокаСоСсылкой, Сред(Строка, Позиция + СтрДлина( + ТекущаяСсылка.Текст))); + КонецЦикла; + + Возврат Новый ФорматированнаяСтрока(Строка); + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl index 8aa3fe109..c5da3721c 100644 --- a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl @@ -66,7 +66,7 @@ Настройка.АлгоритмыШифрования.Добавить("GOST 28147-89"); Настройка.АлгоритмыПроверкиПодписи.Добавить("GOST R 34.10-2001"); Настройка.АлгоритмыПроверкиПодписи.Добавить("GR 34.10-2012 512"); - + // КриптоПро CSP (ГОСТ 2012/256) KC1. Настройка = Настройки.Добавить(); Настройка.Представление = НСтр("ru = 'КриптоПро CSP (ГОСТ 2012/256) KC1'"); @@ -117,7 +117,6 @@ Настройка.АлгоритмыПроверкиПодписи.Добавить("GOST R 34.10-2001"); Настройка.АлгоритмыПроверкиПодписи.Добавить("GR 34.10-2012 256"); - // КриптоПро CSP (ГОСТ 2012/512) KC1. Настройка = Настройки.Добавить(); Настройка.Представление = НСтр("ru = 'КриптоПро CSP (ГОСТ 2012/512) KC1'"); @@ -211,7 +210,6 @@ Настройка.АлгоритмыХеширования.Добавить("GR 34.11-2012 512"); Настройка.АлгоритмыШифрования.Добавить("GOST 28147-89"); - // КриптоПро CSP (ГОСТ 2001). Настройка = Настройки.Добавить(); Настройка.Представление = НСтр("ru = 'КриптоПро CSP (ГОСТ 2001)'"); @@ -357,13 +355,6 @@ #Область ОбновлениеИнформационнойБазы -Процедура ДобавитьПрограммыНачальногоЗаполнения(Программы) Экспорт - - Программы.Вставить("Infotecs GOST 2012/512 Cryptographic Service Provider", 77); - Программы.Вставить("Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", 80); - -КонецПроцедуры - Процедура ОбновитьВстроенныйКриптопровайдер(Отложенно = Ложь, ОбъектовОбработано = 0, ПроблемныхОбъектов = 0) Экспорт Запрос = Новый Запрос; @@ -411,7 +402,7 @@ Если ВстроенныйКриптопровайдер <> Неопределено Тогда ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обновить программу ""%1"" по причине: - |%2'"), Строка(Программа), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + |%2'"), Строка(Программа), ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Если Отложенно Тогда ПроблемныхОбъектов = ПроблемныхОбъектов + 1; @@ -423,7 +414,7 @@ Иначе ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось добавить программу ""%1"" по причине: - |%2'"), Представление, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + |%2'"), Представление, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецЕсли; ВызватьИсключение ТекстСообщения; КонецПопытки; diff --git a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Templates/КлассификаторОшибокКриптографии/Template.bin b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Templates/КлассификаторОшибокКриптографии/Template.bin index b700afb7a..415c33bcf 100644 --- a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Templates/КлассификаторОшибокКриптографии/Template.bin +++ b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/Templates/КлассификаторОшибокКриптографии/Template.bin @@ -80,16 +80,18 @@ { "Anchor": "Модуль криптографии не поддерживает алгоритм", "Reason": "- Сертификат некорректно связан с закрытым ключом.\n- Программа электронной подписи установлена некорректно.", -"Solution": "- Переустановите сертификат в Личное хранилище через оснастку программы электронной подписи с привязкой к закрытому ключу. См. инструкцию\n- Удалите все программы электронной подписи и установите только одну из них, так как установка нескольких программ электронной подписи на одном компьютере может вызвать эту ошибку.", +"Solution": "- Установите сертификат в контейнер прямо из программы.\n- Переустановите сертификат в Личное хранилище через оснастку программы электронной подписи с привязкой к закрытому ключу. См. инструкцию\n- Удалите все программы электронной подписи и установите только одну из них, так как установка нескольких программ электронной подписи на одном компьютере может вызвать эту ошибку.", "ErrorText": "Модуль криптографии не поддерживает алгоритмов подписи", -"RepairMethods": "" +"RepairMethods": "", +"Client": true }, { "Anchor": "Модуль криптографии неверный", "Reason": "- При установке сертификата в операционной системе Windows закрытая часть ключа оказалась связана с некорректным типом в программе электронной подписи ViPNet CSP или КриптоПро CSP.\n- Отличается программа электронной подписи, заданная в настройках сертификата в информационной базе и у закрытой части ключа.", -"Solution": "- Переустановите сертификат через оснастку программы электронной подписи Vipnet CSP с привязкой к закрытому ключу. См. инструкцию\n- Переустановите сертификат через оснастку программы электронной подписи КриптоПро CSP с привязкой к закрытому ключу. См. инструкцию\n- Откройте карточку сертификата и выберите правильную программу электронной подписи.\n- Добавьте новую программу электронной подписи. Открыть список программ электронной подписи.", +"Solution": "- Установите сертификат в контейнер прямо из программы.\n- Переустановите сертификат через оснастку программы электронной подписи Vipnet CSP с привязкой к закрытому ключу. См. инструкцию\n- Переустановите сертификат через оснастку программы электронной подписи КриптоПро CSP с привязкой к закрытому ключу. См. инструкцию\n- Откройте карточку сертификата и выберите правильную программу электронной подписи.\n- Добавьте новую программу электронной подписи. Открыть список программ электронной подписи.", "ErrorText": "Сертификат, связанный с закрытым ключом, указывает на модуль криптографии, отличный от текущего", -"RepairMethods": "" +"RepairMethods": "", +"Client": true }, { "Anchor": "не заполнена программа", @@ -157,9 +159,9 @@ { "Anchor": "Нет корневого сертификата", "Reason": "Корневой сертификат не включен в список доверенных.", -"Solution": "Установите корневой сертификат удостоверяющего центра.", +"Solution": "- Установите корневой сертификат удостоверяющего центра. См. инструкцию ", "ErrorText": "Цепочка сертификатов обработана, но прервана на корневом сертификате, который не является доверенным.", -"RepairMethods": "{\r\n\"МетодикиУстранения\": [\r\n\"УстановкаКорневогоСертификатаГУЦ\"\r\n]\r\n}" +"RepairMethods": "{\"МетодикиУстранения\": [\"УстановитьКорневойСертификат\"]}" }, { "Anchor": "Нет прав на получение сертификата", @@ -178,30 +180,26 @@ { "Anchor": "Нет связи с закрытым ключом", "Reason": "- Закрытый ключ для выбранного сертификата не установлен.\n- Закрытый ключ установлен, но сертификат не имеет с ним связи.", -"Solution": "- Установите закрытый ключ (вставить токен или флешку с файлом закрытого ключа).\n- Переустановите сертификат через оснастку программы электронной подписи с привязкой к закрытому ключу (см. инструкцию)\n- Подайте заявление на новый сертификат, если закрытый ключ утерян.", -"ErrorText": "0x00000000", -"RepairMethods": "" -}, -{ -"Anchor": "Нет связи с закрытым ключом", -"Reason": "- Закрытый ключ для выбранного сертификата не установлен.\n- Закрытый ключ установлен, но сертификат не имеет с ним связи.", -"Solution": "- Установите закрытый ключ (вставить токен или флешку с файлом закрытого ключа).\n- Переустановите сертификат через оснастку программы электронной подписи с привязкой к закрытому ключу (см. инструкцию)\n- Подайте заявление на новый сертификат, если закрытый ключ утерян.", +"Solution": "- Установите закрытый ключ (вставить токен или флешку с файлом закрытого ключа).\n- Установите сертификат в контейнер прямо из программы.\n- Переустановите сертификат через оснастку программы электронной подписи с привязкой к закрытому ключу (см. инструкцию)\n- Подайте заявление на новый сертификат, если закрытый ключ утерян.", "ErrorText": "Отсутствует набор ключей", -"RepairMethods": "" +"RepairMethods": "", +"Client": true }, { "Anchor": "Нет связи с закрытым ключом", "Reason": "- Закрытый ключ для выбранного сертификата не установлен.\n- Закрытый ключ установлен, но сертификат не имеет с ним связи.", -"Solution": "- Установите закрытый ключ (вставить токен или флешку с файлом закрытого ключа).\n- Переустановите сертификат через оснастку программы электронной подписи с привязкой к закрытому ключу (см. инструкцию)\n- Подайте заявление на новый сертификат, если закрытый ключ утерян.", +"Solution": "- Установите закрытый ключ (вставить токен или флешку с файлом закрытого ключа).\n- Установите сертификат в контейнер прямо из программы.\n- Переустановите сертификат через оснастку программы электронной подписи с привязкой к закрытому ключу (см. инструкцию)\n- Подайте заявление на новый сертификат, если закрытый ключ утерян.", "ErrorText": "Сертификат не имеет связи с закрытым ключом", -"RepairMethods": "" +"RepairMethods": "", +"Client": true }, { "Anchor": "Нет связи с закрытым ключом", "Reason": "- Закрытый ключ для выбранного сертификата не установлен.\n- Закрытый ключ установлен, но сертификат не имеет с ним связи.", -"Solution": "- Установите закрытый ключ (вставить токен или флешку с файлом закрытого ключа).\n- Переустановите сертификат через оснастку программы электронной подписи с привязкой к закрытому ключу (см. инструкцию)\n- Подайте заявление на новый сертификат, если закрытый ключ утерян.", +"Solution": "- Установите закрытый ключ (вставить токен или флешку с файлом закрытого ключа).\n- Установите сертификат в контейнер прямо из программы.\n- Переустановите сертификат через оснастку программы электронной подписи с привязкой к закрытому ключу (см. инструкцию)\n- Подайте заявление на новый сертификат, если закрытый ключ утерян.", "ErrorText": "Отсутствует ключ", -"RepairMethods": "" +"RepairMethods": "", +"Client": true }, { "Anchor": "Ошибка доступа", @@ -236,28 +234,31 @@ "Reason": "- Не установлен список отозванных сертификатов или сервис проверки отозванных сертификатов недоступен.\n- Закончился срок действия списка отзыва.", "Solution": "- Получите список отозванных сертификатов в Удостоверяющем центре и установите его. См. инструкцию\n- Обратитесь в Удостоверяющий центр для обновления списка отзыва (в случае окончания его срока действия).", "ErrorText": "Не удалось проверить сертификат в списке отозванных", -"RepairMethods": "{\r\n\"МетодикиУстранения\": [\r\n\"УстановкаСпискаОтзываСертификатов\"\r\n]\r\n}" +"RepairMethods": "{\"МетодикиУстранения\": [\"УстановитьСписокОтзываСертификата\"]}" }, { "Anchor": "сертификат не установлен на компьютере", "Reason": "Выбранный сертификат не установлен в Личное хранилище сертификатов или был удален из него.", -"Solution": "Установите сертификат в Личное хранилище сертификатов пользователя операционной системы. См. инструкцию", +"Solution": "- Установите сертификат в Личное хранилище сертификатов пользователя операционной системы. См. инструкцию", "ErrorText": "Сертификат не найден на компьютере", -"RepairMethods": "" +"RepairMethods": "", +"Client": true }, { "Anchor": "сертификат не установлен на компьютере", "Reason": "Выбранный сертификат не установлен в Личное хранилище сертификатов или был удален из него.", -"Solution": "Установите сертификат в Личное хранилище сертификатов пользователя операционной системы. См. инструкцию", +"Solution": "Установите сертификат в Личное хранилище сертификатов пользователя операционной системы. См. инструкцию", "ErrorText": "Сертификат не установлен на компьютере", -"RepairMethods": "" +"RepairMethods": "", +"Client": true }, { "Anchor": "Указан неверный алгоритм", "Reason": "- Сертификат некорректно связан с закрытым ключом.\n- Включен Winlogon в КриптоПро CSP.", -"Solution": "- Переустановите сертификат через оснастку программы электронной подписи с привязкой к закрытому ключу. См. инструкцию\n- Отключите Winlogon в программе электронной подписи КриптоПро CSP.", +"Solution": "- Установите сертификат в контейнер прямо из программы\n- Переустановите сертификат через оснастку программы электронной подписи с привязкой к закрытому ключу. См. инструкцию\n- Отключите Winlogon в программе электронной подписи КриптоПро CSP\n", "ErrorText": "Указан неверный алгоритм", -"RepairMethods": "" +"RepairMethods": "", +"Client": true }, { "Anchor": "Файл не существует", @@ -331,12 +332,113 @@ }, { "Anchor": "", +"Reason": "Не установлена компонента для работы с криптографией ExtraCryptoAPI", +"Solution": "Установите компоненту ExtraCryptoAPI. ", +"ErrorText": "Не установлена компонента ExtraCryptoAPI", +"RepairMethods": "" +}, +{ +"Anchor": "", +"Reason": "Для сертификата нет возможности определить программу автоматически", +"Solution": "Настройте программу вручную в списке программ и выберите ее в карточке сертификата.", +"ErrorText": "Не найдено подходящих программ по открытому ключу сертификата", +"RepairMethods": "" +}, +{ +"Anchor": "", +"Reason": "Программы не найдены на компьютере", +"Solution": "Проверьте настройки в списке программ.", +"ErrorText": "Не установлены программы для работы с электронной подписью", +"RepairMethods": "" +}, +{ +"Anchor": "", +"Reason": "- Закрытый ключ для выбранного сертификата не установлен.\n- Закрытый ключ установлен, но сертификат не имеет с ним связи.", +"Solution": "- Установите сертификат в контейнер прямо из программы\n- Переустановите сертификат через оснастку программы электронной подписи с привязкой к закрытому ключу. См. инструкцию", +"ErrorText": "Не удалось определить программу по закрытому ключу сертификата", +"RepairMethods": "", +"Client": true +}, +{ +"Anchor": "", +"Reason": "- Закрытый ключ для выбранного сертификата не установлен.\n- Закрытый ключ установлен, но сертификат не имеет с ним связи.", +"Solution": "- Переустановите сертификат через оснастку программы электронной подписи с привязкой к закрытому ключу. См. инструкцию", +"ErrorText": "Не удалось определить программу по закрытому ключу сертификата", +"RepairMethods": "", +"Server": true +}, +{ +"Anchor": "Нет связи с закрытым ключом", +"Reason": "- Закрытый ключ для выбранного сертификата не установлен.\n- Закрытый ключ установлен, но сертификат не имеет с ним связи.", +"Solution": "- Установите закрытый ключ (вставить токен или флешку с файлом закрытого ключа).\n- Установите сертификат в контейнер прямо из программы.\n- Переустановите сертификат через оснастку программы электронной подписи с привязкой к закрытому ключу (см. инструкцию)\n- Подайте заявление на новый сертификат, если закрытый ключ утерян.", +"ErrorText": "0x00000000", +"RepairMethods": "", +"Client": true +}, +{ +"Anchor": "Нет связи с закрытым ключом", +"Reason": "- Закрытый ключ для выбранного сертификата не установлен.\n- Закрытый ключ установлен, но сертификат не имеет с ним связи.", +"Solution": "- Установите закрытый ключ на сервере (вставить токен или флешку с файлом закрытого ключа).\n- Переустановите сертификат на сервере через оснастку программы электронной подписи с привязкой к закрытому ключу (см. инструкцию)\n- Подайте заявление на новый сертификат, если закрытый ключ утерян.", +"ErrorText": "0x00000000", +"RepairMethods": "", +"Server": true +}, +{ +"Anchor": "Модуль криптографии не поддерживает алгоритм", +"Reason": "- Сертификат некорректно связан с закрытым ключом.\n- Программа электронной подписи установлена некорректно.", +"Solution": "- Переустановите сертификат в Личное хранилище через оснастку программы электронной подписи с привязкой к закрытому ключу. См. инструкцию\n- Удалите все программы электронной подписи и установите только одну из них, так как установка нескольких программ электронной подписи на одном компьютере может вызвать эту ошибку.", +"ErrorText": "Модуль криптографии не поддерживает алгоритмов подписи", +"RepairMethods": "", +"Server": true +}, +{ +"Anchor": "Модуль криптографии неверный", +"Reason": "- При установке сертификата в операционной системе Windows закрытая часть ключа оказалась связана с некорректным типом в программе электронной подписи ViPNet CSP или КриптоПро CSP.\n- Отличается программа электронной подписи, заданная в настройках сертификата в информационной базе и у закрытой части ключа.", +"Solution": "- Переустановите сертификат через оснастку программы электронной подписи Vipnet CSP с привязкой к закрытому ключу. См. инструкцию\n- Переустановите сертификат через оснастку программы электронной подписи КриптоПро CSP с привязкой к закрытому ключу. См. инструкцию\n- Откройте карточку сертификата и выберите правильную программу электронной подписи.\n- Добавьте новую программу электронной подписи. Открыть список программ электронной подписи.", +"ErrorText": "Сертификат, связанный с закрытым ключом, указывает на модуль криптографии, отличный от текущего", +"RepairMethods": "", +"Client": true +}, +{ +"Anchor": "Указан неверный алгоритм", +"Reason": "- Сертификат некорректно связан с закрытым ключом.\n- Включен Winlogon в КриптоПро CSP.", +"Solution": "- Переустановите сертификат через оснастку программы электронной подписи с привязкой к закрытому ключу. См. инструкцию\n- Отключите Winlogon в программе электронной подписи КриптоПро CSP\n", +"ErrorText": "Указан неверный алгоритм", +"RepairMethods": "", +"Server": true +}, +{ +"Anchor": "Нет связи с закрытым ключом", +"Reason": "- Закрытый ключ для выбранного сертификата не установлен.\n- Закрытый ключ установлен, но сертификат не имеет с ним связи.", +"Solution": "- Установите закрытый ключ на сервере (вставить токен или флешку с файлом закрытого ключа).\n- Переустановите сертификат на сервере через оснастку программы электронной подписи с привязкой к закрытому ключу (см. инструкцию)\n- Подайте заявление на новый сертификат, если закрытый ключ утерян.", +"ErrorText": "Отсутствует ключ", +"RepairMethods": "", +"Server": true +}, +{ +"Anchor": "Нет связи с закрытым ключом", +"Reason": "- Закрытый ключ для выбранного сертификата не установлен.\n- Закрытый ключ установлен, но сертификат не имеет с ним связи.", +"Solution": "- Установите закрытый ключ на сервере (вставить токен или флешку с файлом закрытого ключа).\n- Переустановите сертификат на сервере через оснастку программы электронной подписи с привязкой к закрытому ключу (см. инструкцию)\n- Подайте заявление на новый сертификат, если закрытый ключ утерян.", +"ErrorText": "Сертификат не имеет связи с закрытым ключом", +"RepairMethods": "", +"Server": true +}, +{ +"Anchor": "Нет связи с закрытым ключом", +"Reason": "- Закрытый ключ для выбранного сертификата не установлен.\n- Закрытый ключ установлен, но сертификат не имеет с ним связи.", +"Solution": "- Установите закрытый ключ на сервере (вставить токен или флешку с файлом закрытого ключа).\n- Переустановите сертификат на сервере через оснастку программы электронной подписи с привязкой к закрытому ключу (см. инструкцию)\n- Подайте заявление на новый сертификат, если закрытый ключ утерян.", +"ErrorText": "Отсутствует набор ключей", +"RepairMethods": "", +"Server": true +}, +{ +"Anchor": "", "Reason": "Сертификат, которым был зашифрован файл, не установлен в личное хранилище.", "Solution": "Установите в личное хранилище сертификат, которым был зашифрован файл, и выберите его при расшифровке.", "ErrorText": "Требуемый персональный сертификат не найден", "RepairMethods": "" } ], -"LastChangeDate": "2023-01-19T00:13:59", -"Version": "2.0.0.9" +"LastChangeDate": "2023-01-18T23:50:46", +"Version": "3.0.0.5" } \ No newline at end of file diff --git a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/ПрограммыЭлектроннойПодписиИШифрования.mdo b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/ПрограммыЭлектроннойПодписиИШифрования.mdo index 6d881c88e..8b5916005 100644 --- a/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/ПрограммыЭлектроннойПодписиИШифрования.mdo +++ b/SSL/src/DataProcessors/ПрограммыЭлектроннойПодписиИШифрования/ПрограммыЭлектроннойПодписиИШифрования.mdo @@ -19,6 +19,42 @@ PersonalComputer MobileDevice + + УстановкаПрограммКриптопровайдеров + + ru + Установка программ криптопровайдеров + + PersonalComputer + MobileDevice + + + УстановкаCryptoProCSPРегистрационныеДанные + + ru + Установка CryptoPro CSP: Регистрационные данные + + PersonalComputer + MobileDevice + + + УстановкаViPNetCSPРегистрационныеДанные + + ru + Установка ViPNet CSP: Регистрационные данные + + PersonalComputer + MobileDevice + + + УстановкаКриптопровайдераИнформацияОДистрибутиве + + ru + Установка криптопровайдера: Информация о дистрибутиве + + PersonalComputer + MobileDevice + КлассификаторАУЦ_1_0_0_1 diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсияПрисоединенногоФайла/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсияПрисоединенногоФайла/Form.form index 1c31ef3ac..fc71490d9 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсияПрисоединенногоФайла/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсияПрисоединенногоФайла/Form.form @@ -121,7 +121,6 @@ UsualGroup Vertical - Auto true true Auto @@ -292,7 +291,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -322,7 +320,6 @@ HorizontalIfPossible Center - Auto true true Auto @@ -539,7 +536,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -786,7 +782,6 @@ UsualGroup HorizontalIfPossible - Auto true true LeftNarrowest @@ -855,7 +850,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсияПрисоединенногоФайла/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсияПрисоединенногоФайла/Module.bsl index 7d4376c24..fd39e4f58 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсияПрисоединенногоФайла/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВерсияПрисоединенногоФайла/Module.bsl @@ -220,7 +220,7 @@ РаботаСФайламиСлужебныйКлиент.КорректноеИмяФайла(ЭтотОбъект.Объект.Наименование); Исключение ОбщегоНазначенияКлиент.СообщитьПользователю( - КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ,"Наименование", "Объект"); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ,"Наименование", "Объект"); Возврат Ложь; КонецПопытки; @@ -256,7 +256,7 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Ошибка записи версии присоединенного файла'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВопросПриИмпортеФайлов/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВопросПриИмпортеФайлов/Form.form index 7252f7dfe..7ca197949 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВопросПриИмпортеФайлов/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВопросПриИмпортеФайлов/Form.form @@ -215,7 +215,7 @@ Auto true true - None + Top None None SelectionPresentationAndChoice diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Form.form index d14e93524..78a20cc98 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Form.form @@ -29,7 +29,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -689,20 +688,17 @@ СписокКонтекстноеМеню 11 - СписокКонтекстноеМенюИзменить - 120 - - <key>ru</key> - <value>Открыть карточку</value> - + СписокКонтекстноеМенюПросмотреть + 80 true true true + false - СписокКонтекстноеМенюИзменитьРасширеннаяПодсказка - 121 + СписокКонтекстноеМенюПросмотретьРасширеннаяПодсказка + 97 Label true true @@ -710,7 +706,7 @@ Left - 0 + Form.Command.Просмотреть Normal Auto true @@ -721,33 +717,6 @@ СписокКонтекстноеМенюГруппаКомандОсновные 134 - - СписокКонтекстноеМенюПросмотреть - 80 - true - true - - true - - false - - СписокКонтекстноеМенюПросмотретьРасширеннаяПодсказка - 97 - Label - true - true - - Left - - - Form.Command.Просмотреть - Normal - Auto - true - true - UserCmds - Auto - СписокКонтекстноеМенюОсвободить 83 @@ -1364,12 +1333,48 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 163 + + СтрокаПоискаРасширеннаяПодсказка + 165 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 164 + true + + Список + + true + + Left NotificationProcessing ОбработкаОповещения + + OnOpen + ПриОткрытии + OnCreateAtServer ПриСозданииНаСервере @@ -1403,10 +1408,10 @@ Список.Редактирует - Список.РедактируетТекущийПользователь + Список.Ссылка - Список.Ссылка + Список.ФайлРедактируетТекущийПользователь Список.ХранитьВерсии @@ -1431,7 +1436,7 @@ КОГДА СведенияОФайлах.Редактирует = &ТекущийПользователь ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ - КОНЕЦ КАК РедактируетТекущийПользователь, + КОНЕЦ КАК ФайлРедактируетТекущийПользователь, СведенияОФайлах.ВладелецФайла КАК ВладелецФайла, СведенияОФайлах.Расширение КАК Расширение, СведенияОФайлах.ХранитьВерсии КАК ХранитьВерсии, diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Module.bsl index 1bb4b725a..d25eed731 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВсеФайлы/Module.bsl @@ -49,6 +49,11 @@ КонецПроцедуры +&НаКлиенте +Процедура ПриОткрытии(Отказ) + УстановитьДоступностьКоманд(Ложь, Ложь); +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыСписок @@ -108,12 +113,7 @@ КонецЕсли; Обработчик = Новый ОписаниеОповещения("ОсвободитьЗавершение", ЭтотОбъект); - ТекущиеДанные = Элементы.Список.ТекущиеДанные; - ПараметрыОсвобожденияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОсвобожденияФайла(Обработчик, Элементы.Список.ТекущиеДанные.Ссылка); - ПараметрыОсвобожденияФайла.ХранитьВерсии = ТекущиеДанные.ХранитьВерсии; - ПараметрыОсвобожденияФайла.ФайлРедактируетТекущийПользователь = ТекущиеДанные.РедактируетТекущийПользователь; - ПараметрыОсвобожденияФайла.Редактирует = ТекущиеДанные.Редактирует; - РаботаСФайламиСлужебныйКлиент.ОсвободитьФайлСОповещением(ПараметрыОсвобожденияФайла); + РаботаСФайламиСлужебныйКлиент.ОсвободитьФайлы(Элементы.Список); Элементы.Список.Обновить(); КонецПроцедуры @@ -203,11 +203,11 @@ &НаКлиенте Функция ФайловыеКомандыДоступны() - Если Элементы.Список.ТекущиеДанные = Неопределено Тогда + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда Возврат Ложь; КонецЕсли; - Если ТипЗнч(Элементы.Список.ТекущиеДанные.Ссылка) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Если ТипЗнч(Элементы.Список.ТекущаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда Возврат Ложь; КонецЕсли; @@ -218,15 +218,30 @@ &НаКлиенте Процедура УстановитьДоступностьФайловыхКоманд() - ТекущиеДанные = Элементы.Список.ТекущиеДанные; - Если ТекущиеДанные <> Неопределено - И ТипЗнч(ТекущиеДанные.Ссылка) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + РедактируетТекущийПользователь = Ложь; + ВыбраныРедактируемыеФайлы = Ложь; + + ТекущаяСтрока = Элементы.Список.ТекущаяСтрока; + Если ТекущаяСтрока <> Неопределено + И ТипЗнч(ТекущаяСтрока) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - УстановитьДоступностьКоманд(ТекущиеДанные.РедактируетТекущийПользователь, - ТекущиеДанные.Редактирует, ТекущиеДанные.Автор); + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + ВыбраныРедактируемыеФайлы = ЗначениеЗаполнено(ТекущиеДанные.Редактирует); + Если Не ВыбраныРедактируемыеФайлы Тогда + Для Каждого Элемент Из Элементы.Список.ВыделенныеСтроки Цикл + ВыбраныРедактируемыеФайлы = ЗначениеЗаполнено(Элементы.Список.ДанныеСтроки(Элемент).Редактирует); + Если ВыбраныРедактируемыеФайлы Тогда + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + РедактируетТекущийПользователь = ТекущиеДанные.ФайлРедактируетТекущийПользователь; + КонецЕсли; + УстановитьДоступностьКоманд(РедактируетТекущийПользователь, ВыбраныРедактируемыеФайлы); + КонецПроцедуры &НаСервереБезКонтекста @@ -242,15 +257,12 @@ КонецПроцедуры &НаКлиенте -Процедура УстановитьДоступностьКоманд(РедактируетТекущийПользователь, Редактирует, Автор) +Процедура УстановитьДоступностьКоманд(РедактируетТекущийПользователь, ВыбраныРедактируемыеФайлы) - Элементы.ФормаОсвободить.Доступность = ЗначениеЗаполнено(Редактирует); - Элементы.СписокКонтекстноеМенюОсвободить.Доступность = ЗначениеЗаполнено(Редактирует); - - АвторТекущийПользователь = - Элементы.Список.ТекущиеДанные.Автор = ПользователиКлиент.АвторизованныйПользователь(); - Элементы.ФормаУдалить.Доступность = АвторТекущийПользователь; - Элементы.СписокКонтекстноеМенюУдалить.Доступность = АвторТекущийПользователь; + Элементы.ФормаОсвободить.Доступность = ВыбраныРедактируемыеФайлы; + Элементы.СписокКонтекстноеМенюОсвободить.Доступность = ВыбраныРедактируемыеФайлы; + Элементы.ФормаУдалить.Доступность = РедактируетТекущийПользователь; + Элементы.СписокКонтекстноеМенюУдалить.Доступность = РедактируетТекущийПользователь; КонецПроцедуры diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборГруппы/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборГруппы/Form.form index bbd1850d9..12884f1da 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборГруппы/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборГруппы/Form.form @@ -128,6 +128,49 @@ true + + СписокСсылка + 38 + + <key>ru</key> + <value>Ссылка</value> + + true + true + + + Список.Ссылка + + + СписокСсылкаРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + СписокСсылкаКонтекстноеМеню + 39 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + СписокКоманднаяПанель 3 diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборКодировки/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборКодировки/Form.form index 456973430..b2631f95c 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборКодировки/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ВыборКодировки/Form.form @@ -181,7 +181,7 @@ СписокКодировок.Picture - None + Top None None true diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Form.form index 47ee91c6b..2f2b9729f 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Form.form @@ -110,7 +110,6 @@ UsualGroup Vertical - Auto true true Auto @@ -225,7 +224,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -340,7 +338,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Module.bsl index 518db9dae..a2547347d 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Module.bsl @@ -240,7 +240,7 @@ РаботаСФайламиСлужебныйКлиент.КорректноеИмяФайла(ЭтотОбъект.Объект.Наименование); Исключение ОбщегоНазначенияКлиент.СообщитьПользователю( - КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ,"Наименование", "Объект"); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ,"Наименование", "Объект"); Возврат Ложь; КонецПопытки; @@ -284,7 +284,7 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Ошибка записи группы присоединенных файлов'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) ); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) ); ВызватьИсключение; КонецПопытки; diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Form.form index 428c7d55e..58b6b1b32 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Form.form @@ -72,7 +72,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -291,7 +290,6 @@ HorizontalIfPossible Center - Auto true true Auto @@ -334,7 +332,6 @@ OutputList Refresh SaveDynamicListSettings - SearchHistory ShowMultipleSelection СписокНомерКартинкиПодписанЗашифрован @@ -1723,7 +1720,7 @@ СписокКонтекстноеМенюГруппаКомандОтСписка 69 - СписокКонтекстноеМенюНайти + СписокКонтекстноеМенюВывестиСписок 70 true true @@ -1731,7 +1728,7 @@ true - СписокКонтекстноеМенюНайтиExtendedTooltip + СписокКонтекстноеМенюВывестиСписокРасширеннаяПодсказка 147 Label true @@ -1740,33 +1737,7 @@ Left - 0 - Normal - Auto - true - true - UserCmds - Auto - - - СписокКонтекстноеМенюОтменитьПоиск - 71 - true - true - - true - - - СписокКонтекстноеМенюОтменитьПоискExtendedTooltip - 148 - Label - true - true - - Left - - - 0 + Form.StandardCommand.OutputList Normal Auto true @@ -1908,7 +1879,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1937,7 +1907,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2769,82 +2738,6 @@ - - ФормаГруппаКомандПоиска - 12 - - ФормаНайти - 10 - true - - true - - - ФормаНайтиExtendedTooltip - 125 - Label - true - true - - Left - - - Form.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ФормаОтменитьПоиск - 11 - true - - true - - - ФормаОтменитьПоискExtendedTooltip - 126 - Label - true - true - - Left - - - Form.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - true - true - - true - - - <key>ru</key> - <value>Форма группа команд поиска</value> - - - ФормаГруппаКомандПоискаРасширеннаяПодсказка - 124 - Label - true - true - - Left - - - - НастроитьСинхронизацию 283 @@ -3760,6 +3653,38 @@ Normal + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + ФормаСписокСтрокаПоиска + 374 + + ФормаСписокСтрокаПоискаРасширеннаяПодсказка + 376 + Label + true + true + + Left + + + + ФормаСписокСтрокаПоискаКонтекстноеМеню + 375 + true + + Список + + true + + ФормаСправка 9 diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Module.bsl index 6dc9c6715..a8559ab8f 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Module.bsl @@ -33,11 +33,13 @@ КонецЕсли; КонецЕсли; - Элементы.ФормаРедактировать.ТолькоВоВсехДействиях = Параметры.ПростаяФорма; - Элементы.ФормаОткрыть.ТолькоВоВсехДействиях = Параметры.ПростаяФорма; - Элементы.ФормаЗакончитьРедактирование.ТолькоВоВсехДействиях = Параметры.ПростаяФорма; - Элементы.СписокВажныеРеквизиты.Видимость = Не Параметры.ПростаяФорма; - Предпросмотр = Параметры.ПростаяФорма; + ПоложениеВКоманднойПанели = ?(Параметры.ПростаяФорма, ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю, + ПоложениеКнопкиВКоманднойПанели.Авто); + Элементы.ФормаРедактировать.ПоложениеВКоманднойПанели = ПоложениеВКоманднойПанели; + Элементы.ФормаОткрыть.ПоложениеВКоманднойПанели = ПоложениеВКоманднойПанели; + Элементы.ФормаЗакончитьРедактирование.ПоложениеВКоманднойПанели = ПоложениеВКоманднойПанели; + Элементы.СписокВажныеРеквизиты.Видимость = Не Параметры.ПростаяФорма; + Предпросмотр = Параметры.ПростаяФорма; ПоказыватьКолонкуРазмер = РаботаСФайламиСлужебный.ПолучитьПоказыватьКолонкуРазмер(); Если Не ПоказыватьКолонкуРазмер Тогда @@ -66,17 +68,10 @@ НастройкиФайлов = РаботаСФайламиСлужебный.НастройкиФайлов(); - ИмяСправочникаХранилищаФайлов = Неопределено; - - ЗаголовокОшибки = НСтр("ru = 'Ошибка при настройке динамического списка присоединенных файлов.'"); - ОкончаниеОшибки = НСтр("ru = 'В этом случае настройка динамического списка невозможна.'"); - - ИмяСправочникаХранилищаФайлов = РаботаСФайламиСлужебный.ИмяСправочникаХраненияФайлов( - Параметры.ВладелецФайла, "", ЗаголовокОшибки, ОкончаниеОшибки); + ИмяСправочникаХранилищаФайлов = РаботаСФайламиСлужебный.ИмяСправочникаХраненияФайлов(Параметры.ВладелецФайла); ТипСправочникаСФайлами = Тип("СправочникСсылка." + ИмяСправочникаХранилищаФайлов); МетаданныеСправочникаСФайлами = Метаданные.НайтиПоТипу(ТипСправочникаСФайлами); - ИмяСправочникаХранилищаВерсийФайлов = РаботаСФайламиСлужебный.ИмяСправочникаХраненияВерсийФайлов( - Параметры.ВладелецФайла, "", ЗаголовокОшибки, ОкончаниеОшибки); + ИмяСправочникаХранилищаВерсийФайлов = РаботаСФайламиСлужебный.ИмяСправочникаХраненияВерсийФайлов(Параметры.ВладелецФайла); ЕстьГруппыФайлов = МетаданныеСправочникаСФайлами.Иерархический; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда @@ -115,7 +110,7 @@ СкрытьКнопкиИзменения(); КонецЕсли; - ИменаВсехКомандФормы = ПолучитьИменаКомандФормы(); + ИменаКомандФормы = ИменаКомандФормы(); ИменаЭлементов = Новый Массив; Для Каждого ЭлементФормы Из Элементы Цикл @@ -124,8 +119,8 @@ Продолжить; КонецЕсли; - Если ИменаВсехКомандФормы.Найти(ЭлементФормы.ИмяКоманды) <> Неопределено - Или ИменаВсехКомандФормы.Найти(ЭлементФормы.Имя) <> Неопределено Тогда + Если ИменаКомандФормы.Найти(ЭлементФормы.ИмяКоманды) <> Неопределено + Или ИменаКомандФормы.Найти(ЭлементФормы.Имя) <> Неопределено Тогда ИменаЭлементов.Добавить(ЭлементФормы.Имя); КонецЕсли; @@ -188,8 +183,8 @@ Процедура ПриОткрытии(Отказ) Если ЕстьПравоДобавления Тогда - ДоступнаКомандаСканировать = РаботаСФайламиСлужебныйКлиент.ДоступнаКомандаСканировать(); - Элементы.ДобавитьФайлСоСканера.Видимость = ДоступнаКомандаСканировать; + ДоступнаКомандаСканировать = РаботаСФайламиСлужебныйКлиент.ДоступнаКомандаСканировать(); + Элементы.ДобавитьФайлСоСканера.Видимость = ДоступнаКомандаСканировать; Элементы.СписокКонтекстноеМенюДобавитьФайлСоСканера.Видимость = ДоступнаКомандаСканировать; КонецЕсли; @@ -326,7 +321,7 @@ ТекущиеДанные = ТекущиеДанные(); ПараметрыФормы = Новый Структура; - ПараметрыФормы = Новый Структура("ЗначениеКопирования", ТекущиеДанные.Ссылка); + ПараметрыФормы = Новый Структура("ЗначениеКопирования", ТекущиеДанные); Если ТекущиеДанные.ЭтоГруппа Тогда ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ГруппаФайлов", ПараметрыФормы); @@ -498,7 +493,8 @@ ОповеститьОбИзменении(ТекущиеДанные.Ссылка); Возврат; КонецЕсли; - ФайлСсылка = Элементы.Список.ТекущиеДанные.Ссылка; + ТекущиеДанные = ТекущиеДанные(); + ФайлСсылка = ТекущиеДанные.Ссылка; ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ФайлСсылка, Неопределено, УникальныйИдентификатор, Неопределено, Неопределено); @@ -608,9 +604,13 @@ Возврат; КонецЕсли; - ДокументСоШтампом = РаботаСФайламиСлужебныйВызовСервера.ТабличныйДокументСоШтампом(ТекущиеДанные.Ссылка, ТекущиеДанные.Ссылка); - РаботаСФайламиСлужебныйКлиент.ПечатьФайлаСоШтампом(ДокументСоШтампом); - + Если ТекущиеДанные.Расширение = "mxl" Тогда + ДокументСоШтампом = РаботаСФайламиСлужебныйВызовСервера.ТабличныйДокументСоШтампом(ТекущиеДанные.Ссылка, ТекущиеДанные.Ссылка); + РаботаСФайламиСлужебныйКлиент.ПечатьФайлаСоШтампом(ДокументСоШтампом); + ИначеЕсли ТекущиеДанные.Расширение = "docx" Тогда + ДокументСоШтампом = РаботаСФайламиСлужебныйВызовСервера.ОфисныйДокументСоШтампом(ТекущиеДанные.Ссылка, ТекущиеДанные.Ссылка); + ФайловаяСистемаКлиент.ОткрытьФайл(ДокументСоШтампом, , ТекущиеДанные.Наименование+".docx"); + КонецЕсли; КонецПроцедуры &НаКлиенте @@ -655,6 +655,9 @@ ПараметрыФормы = Новый Структура; ТекущиеДанные = ТекущиеДанные(); + Если ТекущиеДанные <> Неопределено И ТекущиеДанные.ВладелецФайла <> ВладелецФайла Тогда + ТекущиеДанные = Неопределено; + КонецЕсли; Если ТекущиеДанные <> Неопределено Тогда ПараметрыФормы.Вставить("Родитель", ТекущиеДанные.Ссылка); @@ -768,6 +771,7 @@ Ссылка1 = Элементы.Список.ВыделенныеСтроки[0]; Ссылка2 = Элементы.Список.ВыделенныеСтроки[1]; + ТекущиеДанные = ТекущиеДанные(); Расширение = НРег(ТекущиеДанные.Расширение); @@ -805,16 +809,9 @@ Возврат; КонецЕсли; - ТекущиеДанные = ТекущиеДанные(); - - Если ТекущиеДанные.ФайлРедактируется - ИЛИ ТекущиеДанные.Зашифрован Тогда - Возврат; - КонецЕсли; - ОписаниеОповещения = Новый ОписаниеОповещения("ДобавлениеПодписейЗавершить", ЭтотОбъект); ДополнительныеПараметры = Новый Структура("ОбработкаРезультата", ОписаниеОповещения); - РаботаСФайламиКлиент.ПодписатьФайл(ТекущиеДанные.Ссылка, УникальныйИдентификатор, ДополнительныеПараметры); + РаботаСФайламиКлиент.ПодписатьФайл(Элементы.Список.ВыделенныеСтроки, УникальныйИдентификатор, ДополнительныеПараметры); КонецПроцедуры @@ -922,15 +919,14 @@ МассивФайловВРабочемКаталогеДляУдаления, ИмяРабочегоКаталога, ОбъектСсылка) - Зашифровать = Истина; + ПараметрыЗаписиИнформацииОШифровании = РаботаСФайламиСлужебный.ПараметрыЗаписиИнформацииОШифровании(); + ПараметрыЗаписиИнформацииОШифровании.ИмяРабочегоКаталога = ИмяРабочегоКаталога; + ПараметрыЗаписиИнформацииОШифровании.МассивДанныхДляЗанесенияВБазу = МассивДанныхДляЗанесенияВБазу; + ПараметрыЗаписиИнформацииОШифровании.МассивОтпечатков = МассивОтпечатков; + ПараметрыЗаписиИнформацииОШифровании.МассивФайловВРабочемКаталогеДляУдаления = МассивФайловВРабочемКаталогеДляУдаления; + РаботаСФайламиСлужебный.ЗаписатьИнформациюОШифровании( - ОбъектСсылка, - Зашифровать, - МассивДанныхДляЗанесенияВБазу, - Неопределено, // УникальныйИдентификатор - ИмяРабочегоКаталога, - МассивФайловВРабочемКаталогеДляУдаления, - МассивОтпечатков); + ОбъектСсылка, ПараметрыЗаписиИнформацииОШифровании); КонецПроцедуры @@ -989,18 +985,13 @@ Процедура РасшифроватьСервер(МассивДанныхДляЗанесенияВБазу, ИмяРабочегоКаталога, ОбъектСсылка) - Зашифровать = Ложь; - МассивОтпечатков = Новый Массив; - МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + ПараметрыЗаписиИнформацииОШифровании = РаботаСФайламиСлужебный.ПараметрыЗаписиИнформацииОШифровании(); + ПараметрыЗаписиИнформацииОШифровании.Зашифровать = Ложь; + ПараметрыЗаписиИнформацииОШифровании.ИмяРабочегоКаталога = ИмяРабочегоКаталога; + ПараметрыЗаписиИнформацииОШифровании.МассивДанныхДляЗанесенияВБазу = МассивДанныхДляЗанесенияВБазу; РаботаСФайламиСлужебный.ЗаписатьИнформациюОШифровании( - ОбъектСсылка, - Зашифровать, - МассивДанныхДляЗанесенияВБазу, - Неопределено, // УникальныйИдентификатор - ИмяРабочегоКаталога, - МассивФайловВРабочемКаталогеДляУдаления, - МассивОтпечатков); + ОбъектСсылка, ПараметрыЗаписиИнформацииОШифровании); КонецПроцедуры @@ -1108,12 +1099,12 @@ &НаКлиенте Процедура Удалить(Команда) - ТекущиеДанные = ТекущиеДанные(); - - Если ТекущиеДанные = Неопределено Тогда + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда Возврат; КонецЕсли; + ТекущиеДанные = ТекущиеДанные(); + РаботаСФайламиСлужебныйКлиент.УдалитьДанные( Новый ОписаниеОповещения("ПослеУдаленияДанных", ЭтотОбъект), ТекущиеДанные.Ссылка, УникальныйИдентификатор); @@ -1421,7 +1412,7 @@ Если ТекущиеДанные <> Неопределено Тогда Элементы.ПечатьСоШтампом.Видимость = ЕстьЭлектроннаяПодпись - И (ТекущиеДанные.Расширение = "mxl") + И (ТекущиеДанные.Расширение = "mxl") ИЛИ (ТекущиеДанные.Расширение = "docx") И ТекущиеДанные.ПодписанЭП; КонецЕсли; @@ -1516,6 +1507,7 @@ | Файлы.Редактирует КАК РедактируетПользователь, | &ЭтоГруппа КАК ЭтоГруппа, | &Служебный КАК Служебный, + | &ГруппаФайла КАК ГруппаФайла, | Файлы.ВладелецФайла КАК ВладелецФайла, | Файлы.ХранитьВерсии КАК ХранитьВерсии |ИЗ @@ -1528,6 +1520,8 @@ ПолноеИмяСправочника = "Справочник." + ИмяСправочникаХранилищаФайлов; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", ПолноеИмяСправочника); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Служебный", ?(ЕстьРеквизитСлужебный, "Файлы.Служебный", "ЛОЖЬ")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ГруппаФайла", ?(ЕстьГруппыФайлов, "Файлы.Родитель", "НЕОПРЕДЕЛЕНО")); + СвойстваСписка.ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ЭтоГруппа", ?(ЕстьГруппыФайлов, "Файлы.ЭтоГруппа", "ЛОЖЬ")); @@ -1554,7 +1548,7 @@ &НаКлиентеНаСервереБезКонтекста -Функция ПолучитьИменаКомандФормы() +Функция ИменаКомандФормы() ИменаКоманд = ПолучитьИменаКомандИзмененияОбъектов(); Для Каждого ИмяКоманды Из ПолучитьИменаПростыхКомандОбъектов() Цикл @@ -1626,7 +1620,7 @@ &НаКлиентеНаСервереБезКонтекста Функция ПолучитьДоступныеКоманды(ТекущиеДанныеФайла, ФайлыРедактируютсяВОблачномСервисе, ВозможностьОсвободитьФайл, АвторизованныйПользователь) - ИменаКоманд = ПолучитьИменаКомандФормы(); + ИменаКоманд = ИменаКомандФормы(); ФайлРедактируетТекущийПользователь = ТекущиеДанныеФайла.ФайлРедактируетТекущийПользователь; АвторТекущийПользователь = ТекущиеДанныеФайла.Автор = АвторизованныйПользователь; @@ -1829,7 +1823,7 @@ Исключение // Если файла не существует, то будет вызвано исключение. АдресДанныхФайла = Неопределено; - ТекстНевыбраннойКартинки = НСтр("ru = 'Предварительный просмотр недоступен по причине:'") + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстНевыбраннойКартинки = НСтр("ru = 'Предварительный просмотр недоступен по причине:'") + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Иначе diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Form.form index 2aa4dcdef..19602574b 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Form.form @@ -1156,7 +1156,6 @@ HorizontalIfPossible Center - Auto true true @@ -1413,7 +1412,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1498,7 +1496,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1717,7 +1714,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1841,7 +1837,6 @@ HorizontalIfPossible Center - Auto true true Auto @@ -1905,7 +1900,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1934,7 +1928,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1963,7 +1956,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2191,7 +2183,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2302,7 +2293,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2331,7 +2321,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2550,7 +2539,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2674,7 +2662,6 @@ HorizontalIfPossible Center - Auto true true Auto @@ -2739,7 +2726,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3308,6 +3294,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоискаЭлектронныеПодписи + 294 + + СтрокаПоискаЭлектронныеПодписиРасширеннаяПодсказка + 296 + Label + true + true + + Left + + + + СтрокаПоискаЭлектронныеПодписиКонтекстноеМеню + 295 + true + + ЭлектронныеПодписи + + true + + Left @@ -3584,6 +3602,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоискаСертификатыШифрования + 297 + + СтрокаПоискаСертификатыШифрованияРасширеннаяПодсказка + 299 + Label + true + true + + Left + + + + СтрокаПоискаСертификатыШифрованияКонтекстноеМеню + 298 + true + + СертификатыШифрования + + true + + Left diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Module.bsl index 1624e6f12..3b4eb8f5d 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Module.bsl @@ -54,9 +54,9 @@ // Конец СтандартныеПодсистемы.ПодключаемыеКоманды Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда - Элементы.Описание.Высота = 0; - Элементы.Наименование.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; - Элементы.ВладелецФайла.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; + Элементы["Описание"].Высота = 0; + Элементы["Наименование"].ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; + Элементы["ВладелецФайла"].ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; Элементы.ГруппаСведенияЧасть1.ВыравниваниеЭлементовИЗаголовков = ВариантВыравниванияЭлементовИЗаголовков.ЭлементыПравоЗаголовкиЛево; Элементы.ГруппаСведенияЧасть2.ВыравниваниеЭлементовИЗаголовков = @@ -1029,7 +1029,7 @@ КонецЕсли; КонецЦикла; - ДоступнаПечатьСоШтампом = Форма.Объект.Расширение = "mxl" И Форма.Объект.ПодписанЭП; + ДоступнаПечатьСоШтампом = (Форма.Объект.Расширение = "mxl" ИЛИ Форма.Объект.Расширение = "docx") И Форма.Объект.ПодписанЭП; Элементы.ПечатьСоШтампом.Видимость = ДоступнаПечатьСоШтампом; @@ -1280,17 +1280,16 @@ МассивФайловВРабочемКаталогеДляУдаления, ИмяРабочегоКаталога) - Зашифровать = Истина; + ПараметрыЗаписиИнформацииОШифровании = РаботаСФайламиСлужебный.ПараметрыЗаписиИнформацииОШифровании(); + ПараметрыЗаписиИнформацииОШифровании.ИмяРабочегоКаталога = ИмяРабочегоКаталога; + ПараметрыЗаписиИнформацииОШифровании.МассивДанныхДляЗанесенияВБазу = МассивДанныхДляЗанесенияВБазу; + ПараметрыЗаписиИнформацииОШифровании.МассивОтпечатков = МассивОтпечатков; + ПараметрыЗаписиИнформацииОШифровании.МассивФайловВРабочемКаталогеДляУдаления = МассивФайловВРабочемКаталогеДляУдаления; + ПараметрыЗаписиИнформацииОШифровании.УникальныйИдентификатор = УникальныйИдентификатор; РаботаСФайламиСлужебный.ЗаписатьИнформациюОШифровании( - ТекущаяСсылкаНаФайлСервер(), - Зашифровать, - МассивДанныхДляЗанесенияВБазу, - УникальныйИдентификатор, - ИмяРабочегоКаталога, - МассивФайловВРабочемКаталогеДляУдаления, - МассивОтпечатков); - + ТекущаяСсылкаНаФайлСервер(), ПараметрыЗаписиИнформацииОШифровании); + ОбновитьИнформациюОСертификатахОбъекта(); КонецПроцедуры @@ -1298,19 +1297,15 @@ &НаСервере Процедура РасшифроватьСервер(МассивДанныхДляЗанесенияВБазу, ИмяРабочегоКаталога) - Зашифровать = Ложь; - МассивОтпечатков = Новый Массив; - МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + ПараметрыЗаписиИнформацииОШифровании = РаботаСФайламиСлужебный.ПараметрыЗаписиИнформацииОШифровании(); + ПараметрыЗаписиИнформацииОШифровании.Зашифровать = Ложь; + ПараметрыЗаписиИнформацииОШифровании.ИмяРабочегоКаталога = ИмяРабочегоКаталога; + ПараметрыЗаписиИнформацииОШифровании.МассивДанныхДляЗанесенияВБазу = МассивДанныхДляЗанесенияВБазу; + ПараметрыЗаписиИнформацииОШифровании.УникальныйИдентификатор = УникальныйИдентификатор; РаботаСФайламиСлужебный.ЗаписатьИнформациюОШифровании( - ТекущаяСсылкаНаФайлСервер(), - Зашифровать, - МассивДанныхДляЗанесенияВБазу, - УникальныйИдентификатор, - ИмяРабочегоКаталога, - МассивФайловВРабочемКаталогеДляУдаления, - МассивОтпечатков); - + ТекущаяСсылкаНаФайлСервер(), ПараметрыЗаписиИнформацииОШифровании); + ОбновитьИнформациюОСертификатахОбъекта(); КонецПроцедуры @@ -1348,7 +1343,7 @@ РаботаСФайламиСлужебныйКлиент.КорректноеИмяФайла(ЭтотОбъект.Объект.Наименование); Исключение ОбщегоНазначенияКлиент.СообщитьПользователю( - КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ,"Наименование", "Объект"); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ,"Наименование", "Объект"); Возврат Ложь; КонецПопытки; diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактированиеТекстовогоФайла/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактированиеТекстовогоФайла/Form.form index 891d2410c..57966d74a 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактированиеТекстовогоФайла/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактированиеТекстовогоФайла/Form.form @@ -67,7 +67,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Form.form index ee61bfea2..81f980e78 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Form.form @@ -29,7 +29,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/РежимСозданияФайлаДляСохранитьКак/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РежимСозданияФайлаДляСохранитьКак/Form.form index 19402e0c9..4e16a8583 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/РежимСозданияФайлаДляСохранитьКак/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РежимСозданияФайлаДляСохранитьКак/Form.form @@ -105,7 +105,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -212,7 +211,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -241,7 +239,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Form.form index bffaaccea..8f46aa228 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -131,6 +130,38 @@ Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 124 + + СтрокаПоискаРасширеннаяПодсказка + 126 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 125 + true + + Список + + true + + true true diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВопроса/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВопроса/Form.form index 8c72cb0db..51d6d9770 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВопроса/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВопроса/Form.form @@ -216,7 +216,7 @@ Файлы.Picture - None + Top None None true diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВыбораРежимаОткрытия/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВыбораРежимаОткрытия/Form.form index 1b63bc4d7..21ec0d5d9 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВыбораРежимаОткрытия/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаВыбораРежимаОткрытия/Form.form @@ -88,7 +88,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЗавершениеРедактирования/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЗавершениеРедактирования/Form.form index 93def18c9..89b8e6f82 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЗавершениеРедактирования/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЗавершениеРедактирования/Form.form @@ -264,7 +264,7 @@ Style.BorderColor - None + Top None None SelectionPresentationAndChoice @@ -293,7 +293,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаПапки/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаПапки/Form.form index 34cd3ffd5..96f14f2bd 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаПапки/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаПапки/Form.form @@ -247,7 +247,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -340,7 +339,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаФайлов/Form.form b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаФайлов/Form.form index 1a8c6787d..0b280c38b 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаФайлов/Form.form +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаИмпортаФайлов/Form.form @@ -114,7 +114,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -383,7 +382,7 @@ Style.BorderColor - None + Top None None SelectionPresentationAndChoice @@ -412,7 +411,6 @@ UsualGroup Vertical - Auto true true Auto @@ -665,7 +663,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЭкспортаПапки/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЭкспортаПапки/Module.bsl index bdaa49eef..862fea206 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЭкспортаПапки/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЭкспортаПапки/Module.bsl @@ -114,7 +114,7 @@ |%3'"), Строка(ЧтоСохраняем), ПапкаДляЭкспорта, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; Если ТекстОшибки <> "" Тогда ПоказатьПредупреждение(, ТекстОшибки); @@ -398,9 +398,11 @@ Попытка СоздатьКаталог(ПараметрыВыполнения.БазовыйКаталогСохраненияФайла); Исключение - ТекстОшибки = НСтр("ru = 'Ошибка создания папки ""%1"":'"); - ТекстОшибки = СтрЗаменить(ТекстОшибки, "%1", ПараметрыВыполнения.БазовыйКаталогСохраненияФайла); - ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось создать каталог ""%1"" по причине: + |%2'"), + ПараметрыВыполнения.БазовыйКаталогСохраненияФайла, + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Если ТекстОшибки <> "" Тогда @@ -737,12 +739,12 @@ Процедура ОбойтиДеревоФайлов15(ИнформацияОбОшибке, ПараметрыВыполнения) // Ошибка при записи файла и изменении его атрибутов. ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка записи файла - |""%1"". - | - |%2.'"), + НСтр("ru = 'Не удалось записать файл + |""%1"" + |по причине: + |%2'"), ПараметрыВыполнения.ПолноеИмяФайла, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); РаботаСФайламиСлужебныйКлиент.УстановитьПризнакБлокирующейФормы(ПараметрыВыполнения, Истина); Обработчик = Новый ОписаниеОповещения("ОбойтиДеревоФайлов16", ЭтотОбъект, ПараметрыВыполнения); diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Form.form b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Form.form index 6a2880883..3031bc05f 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Form.form +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Form.form @@ -735,7 +735,6 @@ AlwaysHorizontal Center - Auto true true @@ -833,7 +832,6 @@ AlwaysHorizontal ItemsLeftTitlesLeft None - Auto true Auto Auto @@ -929,7 +927,6 @@ HorizontalIfPossible Left - Auto true true Auto @@ -1212,7 +1209,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1366,7 +1362,6 @@ UsualGroup AlwaysHorizontal - Auto true Auto Auto @@ -1518,7 +1513,6 @@ UsualGroup AlwaysHorizontal - Auto true Auto Auto @@ -1549,7 +1543,6 @@ UsualGroup Vertical - Auto true Auto Auto @@ -1690,7 +1683,6 @@ UsualGroup AlwaysHorizontal - Auto true Auto Auto @@ -1721,7 +1713,6 @@ UsualGroup Vertical - Auto true Auto Auto @@ -1779,7 +1770,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -1810,7 +1800,6 @@ UsualGroup Vertical - Auto true true DontUse @@ -1965,7 +1954,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1992,7 +1980,6 @@ UsualGroup - Auto true true auto @@ -2205,7 +2192,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -2235,7 +2221,6 @@ AlwaysHorizontal Left - Auto true true Auto @@ -2405,7 +2390,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2538,7 +2522,6 @@ UsualGroup Vertical - Auto true Auto Auto @@ -2700,7 +2683,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -2729,7 +2711,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -3378,7 +3359,6 @@ AlwaysHorizontal Center - Auto true true Auto @@ -4440,6 +4420,19 @@ true + + ИсключатьГородИзМуниципальногоАдреса + 58 + + Boolean + + + true + + + true + + КомандаОК @@ -4591,7 +4584,7 @@ <id>9</id> <toolTip> <key>ru</key> - <value>Подключить интернет поддержку</value> + <value>Подключить Интернет-поддержку пользователей</value> </toolTip> <use> <common>true</common> diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl index 732085d40..1081cc528 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl @@ -523,21 +523,25 @@ &НаКлиенте Процедура ПомещениеПриИзменении(Элемент) + ОбновитьДополнительныеЗдания = Истина; Если ПустаяСтрока(ЭтотОбъект[Элемент.Имя]) Тогда УдалитьПомещениеИзАдреса(ЭтотОбъект["ТипПомещения"]); Иначе ИнформацияОПомещении = ЗначениеСтроенияИлиПомещения(ТипПомещения, Помещение); Если НаселенныйПунктДетально.Apartments.Количество() = 0 Тогда НаселенныйПунктДетально.Apartments.Добавить(ИнформацияОПомещении); + ОбновитьДополнительныеЗдания = Ложь; Иначе Если СтрСравнить(НаселенныйПунктДетально.Apartments[0].type, ТипПомещения) = 0 Тогда НаселенныйПунктДетально.Apartments[0] = ИнформацияОПомещении; + ОбновитьДополнительныеЗдания = Ложь; Иначе НаселенныйПунктДетально.Apartments.Вставить(0, ИнформацияОПомещении); КонецЕсли; КонецЕсли; КонецЕсли; - ОбработкаИзмененияАдреса(); + + ОбработкаИзмененияАдреса(ОбновитьДополнительныеЗдания); КонецПроцедуры @@ -1415,6 +1419,7 @@ КонецФункции + &НаКлиентеНаСервереБезКонтекста Процедура ПереопределитьТипаАдресаПоСтране(Страна, НаселенныйПунктДетально, СведенияОСтране, МеждународныйФорматАдреса) @@ -1494,7 +1499,8 @@ СписокЭлементовАдреса.Добавить(СокрЛП(СтроениеВАдресе["Type"] + " " + СтроениеВАдресе["Number"])); КонецЦикла; НаселенныйПунктДетально["buildings"] = Новый Массив; - Строение = ""; + Строение = ""; + Помещение = ""; КонецЕсли; Если НаселенныйПунктДетально.Свойство("Apartments") И ТипЗнч(НаселенныйПунктДетально["Apartments"]) = Тип("Массив") Тогда @@ -1502,7 +1508,6 @@ СписокЭлементовАдреса.Добавить(СокрЛП(ПомещениеВАдресе["Type"] + " " + ПомещениеВАдресе["Number"])); КонецЦикла; НаселенныйПунктДетально["Apartments"] = Новый Массив; - Помещение = ""; КонецЕсли; НаселенныйПунктДетально["Street"] = СтрСоединить(СписокЭлементовАдреса, ", "); @@ -2420,6 +2425,7 @@ &НаКлиенте Процедура ОбновитьДополнительныеЗдания() ОтобразитьДополнительныеЗдания(); + ОбновитьМенюДобавленияСтроенийИПомещений(); КонецПроцедуры &НаСервере @@ -3873,7 +3879,7 @@ КонецПроцедуры &НаКлиенте -Процедура ОбработкаИзмененияАдреса() +Процедура ОбработкаИзмененияАдреса(ОбновитьДополнительныеЗдания = Истина) НаселенныйПункт = ПредставлениеНаселенногоПунктаАдреса(НаселенныйПунктДетально); @@ -3923,7 +3929,9 @@ КонецЕсли; УстановитьФлагиВМенюПоТипуАдреса(); - ПодключитьОбработчикОжидания("ОбновитьДополнительныеЗдания", 0.1, Истина); + Если ОбновитьДополнительныеЗдания Тогда + ПодключитьОбработчикОжидания("ОбновитьДополнительныеЗдания", 0.1, Истина); + КонецЕсли; Если ЗначениеЗаполнено(Комментарий) Тогда Элементы.ОсновныеСтраницы.ОтображениеСтраниц = ОтображениеСтраницФормы.ЗакладкиСверху; @@ -4319,7 +4327,4 @@ КонецПроцедуры - -#КонецОбласти - - +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Form.form b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Form.form index fe8fddccf..7f46d2bb2 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Form.form +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Form.form @@ -7,361 +7,6 @@ <items xsi:type="form:FormGroup"> <name>ГруппаКоманднаяПанель</name> <id>67</id> - <items xsi:type="form:FormGroup"> - <name>ГруппаВыбрать</name> - <id>69</id> - <items xsi:type="form:Button"> - <name>ВариантыАдресаВыбрать</name> - <id>62</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <extendedTooltip> - <name>ВариантыАдресаВыбратьРасширеннаяПодсказка</name> - <id>63</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <commandName>Form.Command.Выбрать</commandName> - <representation>Auto</representation> - <defaultButton>true</defaultButton> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <placementArea>UserCmds</placementArea> - <representationInContextMenu>Auto</representationInContextMenu> - </items> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <title> - <key>ru</key> - <value>Выбрать</value> - - - ГруппаВыбратьРасширеннаяПодсказка - 70 - Label - true - true - - Left - - - CommandBar - - Left - - - - ГруппаНайти - 71 - - Найти - 64 - true - true - - true - - - Найти - - true - None - - НайтиРасширеннаяПодсказка - 66 - Label - true - true - - Left - - - - НайтиКонтекстноеМеню - 65 - true - - InputField - Enter - true - Left - true - - - AutoComplete - НайтиАвтоПодбор - - - Clearing - НайтиОчистка - - true - true - true - true - true - true - true - DontUse - Normal - - ru - Введите первые буквы названия улицы - - - - true - true - - true - - - <key>ru</key> - <value>Найти</value> - - - ГруппаНайтиРасширеннаяПодсказка - 72 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - true - Auto - Auto - - - - ГруппаЕще - 73 - - ВариантыАдресаГруппаКнопокПоиска - 37 - - ВариантыАдресаНайти - 25 - true - true - - true - - - ВариантыАдресаНайтиРасширеннаяПодсказка - 26 - Label - true - true - - Left - - - Form.Item.ВариантыАдреса.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ВариантыАдресаОтменитьПоиск - 27 - true - true - - true - - - ВариантыАдресаОтменитьПоискРасширеннаяПодсказка - 28 - Label - true - true - - Left - - - Form.Item.ВариантыАдреса.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - true - true - - true - - - <key>ru</key> - <value>Варианты адреса группа кнопок поиска</value> - - - ВариантыАдресаГруппаКнопокПоискаРасширеннаяПодсказка - 38 - Label - true - true - - Left - - - - - - ВариантыАдресаОбновить - 31 - true - true - - true - - - ВариантыАдресаОбновитьРасширеннаяПодсказка - 32 - Label - true - true - - Left - - - Form.Command.Обновить - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ВариантыАдресаВывестиСписок - 33 - true - true - - true - - - ВариантыАдресаВывестиСписокРасширеннаяПодсказка - 34 - Label - true - true - - Left - - - Form.Item.ВариантыАдреса.StandardCommand.OutputList - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ВариантыАдресаИзменитьФорму - 35 - true - true - - true - - - ВариантыАдресаИзменитьФормуРасширеннаяПодсказка - 36 - Label - true - true - - Left - - - Form.StandardCommand.CustomizeForm - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ВариантыАдресаСправка - 29 - true - true - - true - - - ВариантыАдресаСправкаРасширеннаяПодсказка - 30 - Label - true - true - - Left - - - Form.StandardCommand.Help - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - true - true - - true - - - <key>ru</key> - <value>Еще</value> - - - ГруппаЕщеРасширеннаяПодсказка - 74 - Label - true - true - - Left - - - CommandBar - - Left - - true true @@ -384,7 +29,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -453,7 +97,116 @@ ВариантыАдресаКоманднаяПанель 10 + + ГруппаВыбрать + 69 + + ВариантыАдресаВыбрать + 62 + true + true + + true + + + ВариантыАдресаВыбратьРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + Form.Command.Выбрать + Auto + true + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Выбрать</value> + + + ГруппаВыбратьРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + ВариантыАдресаОбновить + 31 + true + true + + true + + + ВариантыАдресаОбновитьРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Form.Command.Обновить + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ВариантыАдресаИзменитьФорму + 35 + true + true + + true + + + ВариантыАдресаИзменитьФормуРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + Left + true Selection @@ -800,19 +553,6 @@ true - - ЗагруженныеДанные - 9 - - Boolean - - - true - - - true - - ОбщаяЧастьПредставления @@ -872,24 +612,6 @@ true - - Найти - - <key>ru</key> - <value>Найти</value> - - 7 - - String - - - - true - - - true - - Обновить diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Module.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Module.bsl index 77c1c766c..1c3cca96a 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Module.bsl +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоПочтовомуИндексу/Module.bsl @@ -57,10 +57,7 @@ ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиФормы.Авто; - Элементы.Переместить(Элементы.ВариантыАдресаГруппаКнопокПоиска, Элементы.ФормаКоманднаяПанель); Элементы.Переместить(Элементы.ВариантыАдресаОбновить, Элементы.ФормаКоманднаяПанель); - Элементы.Переместить(Элементы.ВариантыАдресаВывестиСписок, Элементы.ФормаКоманднаяПанель); - Элементы.Переместить(Элементы.ВариантыАдресаСправка, Элементы.ФормаКоманднаяПанель); ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "ВариантыАдресаВыбрать", "Видимость", Ложь); ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "Найти", "ПоложениеЗаголовка", ПоложениеЗаголовкаЭлементаФормы.Авто); @@ -81,29 +78,6 @@ #КонецОбласти -#Область ОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура НайтиАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) - - Если ЗначениеЗаполнено(Текст) Тогда - - РаботаСАдресамиКлиент.ПреобразоватьВводАдреса(Текст); - Элементы.ВариантыАдреса.ОтборСтрок = Новый ФиксированнаяСтруктура("Представление", Текст); - - Иначе - Элементы.ВариантыАдреса.ОтборСтрок = Неопределено; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура НайтиОчистка(Элемент, СтандартнаяОбработка) - Элементы.ВариантыАдреса.ОтборСтрок = Неопределено; -КонецПроцедуры - -#КонецОбласти - #Область ОбработчикиСобытийЭлементовТаблицыФормыВариантыАдреса &НаКлиенте @@ -175,5 +149,4 @@ КонецПроцедуры -#КонецОбласти - +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Form.form b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Form.form index a63a169e8..223411bea 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Form.form +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Form.form @@ -134,7 +134,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -301,7 +300,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -619,7 +617,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -752,9 +749,7 @@ <id>5</id> <valueType> <types>String</types> - <stringQualifiers> - <length>300</length> - </stringQualifiers> + <stringQualifiers/> </valueType> <view> <common>true</common> @@ -769,7 +764,7 @@ <valueType> <types>String</types> <stringQualifiers> - <length>100</length> + <length>20</length> </stringQualifiers> </valueType> <view> @@ -781,11 +776,11 @@ </columns> <columns> <name>Уровень</name> - <id>14</id> + <id>13</id> <valueType> <types>Number</types> <numberQualifiers> - <precision>1</precision> + <precision>10</precision> </numberQualifiers> </valueType> <view> diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl index c1d6cc2a8..461fc28bf 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl @@ -410,4 +410,4 @@ КонецФункции -#КонецОбласти +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборДома/Form.form b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборДома/Form.form index bb6745420..f4bcdbf00 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборДома/Form.form +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборДома/Form.form @@ -4,181 +4,6 @@ <key>ru</key> <value>Выбрать дом, строение</value> - - ГруппаКоманднаяПанель - 59 - - ГруппаКнопкаВыбрать - 61 - - ФормаВыбрать - 57 - true - true - - true - - - ФормаВыбратьРасширеннаяПодсказка - 58 - Label - true - true - - Left - - - Form.Command.Выбрать - Auto - true - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Кнопка выбрать</value> - - - ГруппаКнопкаВыбратьРасширеннаяПодсказка - 62 - Label - true - true - - Left - - - CommandBar - - Left - - - - ГруппаСписокДомов - 35 - - Найти - 54 - true - true - - true - - - Найти - - - ru - Поиск по номеру дома или номеру строения - - - НайтиРасширеннаяПодсказка - 56 - Label - true - true - - Left - - - - НайтиКонтекстноеМеню - 55 - true - - InputField - Enter - true - Left - true - - - AutoComplete - НомерДомаСтроенияАвтоПодбор - - - Clearing - НайтиОчистка - - true - true - true - true - true - true - true - DontUse - Normal - - ru - Номер дома, корпуса - - - - true - true - - true - - - <key>ru</key> - <value>Список домов</value> - - - ГруппаСписокДомовРасширеннаяПодсказка - 36 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Командная панель</value> - - - ГруппаКоманднаяПанельРасширеннаяПодсказка - 60 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - СписокАдресныхОбъектов 3 @@ -200,6 +25,10 @@ Copy Delete EndEdit + MoveDown + MoveUp + SortListAsc + SortListDesc СписокДомовДом 16 @@ -249,7 +78,35 @@ СписокАдресныхОбъектовКоманднаяПанель 5 + + ФормаВыбрать + 57 + true + true + + true + + + ФормаВыбратьРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + Form.Command.Выбрать + Auto + true + true + true + UserCmds + Auto + InCommandBar + Left + true Selection @@ -523,24 +380,6 @@ - - Найти - - <key>ru</key> - <value>Найти</value> - - 8 - - String - - - - true - - - true - - АдресныйОбъект 9 diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборДома/Module.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборДома/Module.bsl index 7b371b73c..12ba840e1 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборДома/Module.bsl +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборДома/Module.bsl @@ -16,12 +16,12 @@ Если СтрСравнить(Параметры.ТипДома, РаботаСАдресамиКлиентСервер.НаименованиеЗемельногоУчастка()) <> 0 Тогда ТипВыбора = "СписокДомов"; Иначе + ТипВыбора = "ЗемельныеУчастки"; Заголовок = НСтр("ru = 'Выбрать земельный участок'"); - Элементы.Найти.Подсказка = НСтр("ru = 'Поиск по номеру земельного участка'"); - Элементы.Найти.ПодсказкаВвода = НСтр("ru = 'Номер земельного участка'"); + КонецЕсли; - + ЗаполнитьСписок(?(Параметры.Отбор, Параметры.Номер, Неопределено)); // позиционирование @@ -63,25 +63,6 @@ КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура НайтиОчистка(Элемент, СтандартнаяОбработка) - СписокАдресныхОбъектов.Очистить(); - ЗаполнитьСписок(Неопределено); -КонецПроцедуры - -&НаКлиенте -Процедура НомерДомаСтроенияАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) - - ТекстПоиска = ?(ПустаяСтрока(Текст), Найти, Текст); - ПодключитьОбработчикОжидания("НайтиИЗаполнитьСписокДомов", 0.2, Истина); - -КонецПроцедуры - #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыСписокАдресныхОбъектов @@ -107,11 +88,6 @@ #Область СлужебныеПроцедурыИФункции -&НаКлиенте -Процедура НайтиИЗаполнитьСписокДомов() - ЗаполнитьСписок(ТекстПоиска + "%"); -КонецПроцедуры - &НаСервере Процедура ЗаполнитьСписок(Текст) @@ -156,5 +132,4 @@ КонецПроцедуры -#КонецОбласти - +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборУлицы/Form.form b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборУлицы/Form.form index e03b38c8a..7828ec793 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборУлицы/Form.form +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборУлицы/Form.form @@ -4,12 +4,77 @@ ru Выберите улицу - - ГруппаКоманднаяПанель - 148 - - ГруппаКонтактнаяИнформацияВыбрать - 165 + + ВариантыАдреса + 8 + + <key>ru</key> + <value>Варианты адреса</value> + + true + true + + true + + + ВариантыАдреса + + None + Add + Change + Choose + Copy + Delete + EndEdit + MoveDown + MoveUp + SortListAsc + SortListDesc + + ВариантыАдресаПредставление + 15 + true + true + + true + + + ВариантыАдреса.Представление + + + ВариантыАдресаПредставлениеРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + ВариантыАдресаПредставлениеКонтекстноеМеню + 16 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ВариантыАдресаКоманднаяПанель + 10 Выбрать 175 @@ -36,122 +101,6 @@ UserCmds Auto - true - true - - true - - - <key>ru</key> - <value>Контактная информация выбрать</value> - - 11 - - ГруппаКонтактнаяИнформацияВыбратьРасширеннаяПодсказка - 166 - Label - true - true - - Left - - - CommandBar - - Left - - - - ГруппаНайтиВебСервис - 155 - - Найти - 150 - true - true - - true - - - Найти - - None - - НайтиРасширеннаяПодсказка - 152 - Label - true - true - - Left - - - - НайтиКонтекстноеМеню - 151 - true - - InputField - Enter - true - Left - true - - - AutoComplete - НайтиАвтоПодбор - - - Clearing - НайтиОчистка - - true - true - true - true - true - true - true - DontUse - Normal - - ru - Введите первые буквы названия улицы - - - - true - true - - true - - - <key>ru</key> - <value>Найти веб сервис</value> - - - ГруппаНайтиВебСервисРасширеннаяПодсказка - 156 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаКоманднаяПанельЕще - 153 ВариантыАдресаНайти 167 @@ -259,131 +208,6 @@ Auto InAdditionalSubmenu - true - true - - true - - - <key>ru</key> - <value>Еще</value> - - true - - ГруппаКоманднаяПанельЕщеРасширеннаяПодсказка - 154 - Label - true - true - - Left - - - CommandBar - - Left - Form - - - true - true - - true - - - <key>ru</key> - <value>Командная панель</value> - - - ГруппаКоманднаяПанельРасширеннаяПодсказка - 149 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ВариантыАдреса - 8 - - <key>ru</key> - <value>Варианты адреса</value> - - true - true - - true - - - ВариантыАдреса - - None - Add - Change - Choose - Copy - Delete - EndEdit - MoveDown - MoveUp - SortListAsc - SortListDesc - - ВариантыАдресаПредставление - 15 - true - true - - true - - - ВариантыАдреса.Представление - - - ВариантыАдресаПредставлениеРасширеннаяПодсказка - 17 - Label - true - true - - Left - - - - ВариантыАдресаПредставлениеКонтекстноеМеню - 16 - true - - InputField - true - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - - - ВариантыАдресаКоманднаяПанель - 10 Left @@ -757,24 +581,6 @@ true - - Найти - - <key>ru</key> - <value>Найти</value> - - 17 - - String - - - - true - - - true - - НаселенныйПунктДетально 19 diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборУлицы/Module.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборУлицы/Module.bsl index 11bf993cf..36aa77cb4 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборУлицы/Module.bsl +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборУлицы/Module.bsl @@ -59,25 +59,6 @@ #Область ОбработчикиСобытийЭлементовШапкиФормы -&НаКлиенте -Процедура НайтиАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) - - Если Ожидание = 0 Тогда - // Формирование списка быстрого выбора, стандартную обработку не надо трогать. - Возврат; - КонецЕсли; - - Если ЗначениеЗаполнено(Текст) Тогда - - РаботаСАдресамиКлиент.ПреобразоватьВводАдреса(Текст); - Элементы.ВариантыАдреса.ОтборСтрок = Новый ФиксированнаяСтруктура("Представление", Текст); - - Иначе - Элементы.ВариантыАдреса.ОтборСтрок = Неопределено; - КонецЕсли; - -КонецПроцедуры - &НаКлиенте Процедура ВариантыАдресаВыборЗначения(Элемент, Значение, СтандартнаяОбработка) @@ -85,11 +66,6 @@ КонецПроцедуры -&НаКлиенте -Процедура НайтиОчистка(Элемент, СтандартнаяОбработка) - Элементы.ВариантыАдреса.ОтборСтрок = Неопределено; -КонецПроцедуры - #КонецОбласти #Область ОбработчикиКомандФормы diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ИсправлениеАдресов/Form.form b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ИсправлениеАдресов/Form.form index 74fe43f1e..b92c3eb01 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ИсправлениеАдресов/Form.form +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ИсправлениеАдресов/Form.form @@ -188,7 +188,7 @@ 24 <key>ru</key> - <value>Исправлено %1 из %2.</value> + <value>Исправлено элементов: %1 из %2</value> true true @@ -222,6 +222,40 @@ Center + + ДополнительнаяИнформацияУспешноеИсправление + 38 + + <key>ru</key> + <value>Если не удалось автоматически исправить адрес, то его следует скорректировать вручную, открыв форму ввода адреса.</value> + + true + true + + true + + + ДополнительнаяИнформацияУспешноеИсправлениеРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + ДополнительнаяИнформацияУспешноеИсправлениеКонтекстноеМеню + 39 + true + + Label + true + true + + Left + + true true @@ -247,7 +281,7 @@ Page - HorizontalIfPossible + Vertical auto false @@ -290,6 +324,40 @@ Center + + ДополнительнаяИнформация + 35 + + <key>ru</key> + <value>Если не удалось автоматически исправить адрес, то его следует скорректировать вручную, открыв форму ввода адреса.</value> + + true + true + + true + + + ДополнительнаяИнформацияРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + ДополнительнаяИнформацияКонтекстноеМеню + 36 + true + + Label + true + true + + Left + + true true @@ -315,7 +383,7 @@ Page - HorizontalIfPossible + Vertical auto false diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ИсправлениеАдресов/Module.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ИсправлениеАдресов/Module.bsl index 8d4de2296..5e92f5f7a 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ИсправлениеАдресов/Module.bsl +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ИсправлениеАдресов/Module.bsl @@ -133,7 +133,7 @@ УстановитьТекущуюСтраницу(ЭтотОбъект, "ИдетИсправлениеПроблемы"); ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); - ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Исправление адресов контактной информации с типом здания Литер'"); + ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Исправление адресов контактной информации с типом здания Литер'"); ПараметрыВыполненияФоновогоЗадания = Новый Структура; ПараметрыВыполненияФоновогоЗадания.Вставить("ИдентификаторПроверки", ИдентификаторПроверки); @@ -159,7 +159,7 @@ Результат = ПолучитьИзВременногоХранилища(Результат.АдресРезультата); Если ТипЗнч(Результат) = Тип("Структура") Тогда Элементы.НадписьУспешноеИсправление.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - Элементы.НадписьУспешноеИсправление.Заголовок, Результат.ИсправленоОбъектов, Результат.ВсегоОбъектов); + Элементы.НадписьУспешноеИсправление.Заголовок, Результат.ИсправленоЭлементов, Результат.ВсегоЭлементов); КонецЕсли; УстановитьТекущуюСтраницу(ЭтотОбъект, "ИсправлениеУспешноВыполнено"); diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Form.form b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Form.form index 87ac0ee94..0ac4b1f9b 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Form.form +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Form.form @@ -509,7 +509,6 @@ UsualGroup Vertical - Auto true true Auto @@ -744,21 +743,6 @@ true - - ВнутригородскойРайон - 12 - - String - - - - true - - - true - - true - НаселенныйПункт @@ -860,6 +844,19 @@ <common>true</common> </edit> </attributes> + <attributes> + <name>ИсключатьГородИзМуниципальногоАдреса</name> + <id>21</id> + <valueType> + <types>Boolean</types> + </valueType> + <view> + <common>true</common> + </view> + <edit> + <common>true</common> + </edit> + </attributes> <formCommands> <name>КомандаОК</name> <title> diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НастройкиАдреса/Form.form b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НастройкиАдреса/Form.form index ffb13792b..b7ca55573 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НастройкиАдреса/Form.form +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НастройкиАдреса/Form.form @@ -205,7 +205,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <throughAlign>Auto</throughAlign> <currentRowUse>Auto</currentRowUse> @@ -232,7 +231,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -261,7 +259,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -332,7 +329,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/ManagerModule.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/ManagerModule.bsl index de447e300..cd6f784a1 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/ManagerModule.bsl +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/ManagerModule.bsl @@ -33,6 +33,14 @@ #КонецОбласти +#Область СлужебныйПрограммныйИнтерфейс + +Функция ДоступныДополнительныеНастройкиАдреса() Экспорт + Возврат Метаданные.Обработки.РасширенныйВводКонтактнойИнформации.Формы.Найти("НастройкиАдреса") <> Неопределено; +КонецФункции + +#КонецОбласти + #Область СлужебныеПроцедурыИФункции // Возвращает имя формы для редактирования типа контактной информации. diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборКонстанты/Form.form b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборКонстанты/Form.form index 5465d0773..1501d4c87 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборКонстанты/Form.form +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборКонстанты/Form.form @@ -522,7 +522,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборОбъектовОтбором/Form.form b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборОбъектовОтбором/Form.form index 957a43560..661dbb2d2 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборОбъектовОтбором/Form.form +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/ВыборОбъектовОтбором/Form.form @@ -353,7 +353,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -387,7 +386,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Настройки/Form.form b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Настройки/Form.form index 6cf2392a5..241974f6b 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Настройки/Form.form +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Настройки/Form.form @@ -142,7 +142,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -170,7 +169,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -259,7 +257,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -289,7 +286,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -417,7 +413,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -446,7 +441,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -474,7 +468,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -546,7 +539,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/НомераСообщенийУзлаПланаОбмена/Form.form b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/НомераСообщенийУзлаПланаОбмена/Form.form index 4eb535a0a..2d9cb0ee5 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/НомераСообщенийУзлаПланаОбмена/Form.form +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/НомераСообщенийУзлаПланаОбмена/Form.form @@ -125,7 +125,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/УзлыРегистрацииОбъекта/Form.form b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/УзлыРегистрацииОбъекта/Form.form index e31241b3b..6ea3c6ed0 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/УзлыРегистрацииОбъекта/Form.form +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/УзлыРегистрацииОбъекта/Form.form @@ -695,7 +695,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <showTitle>auto</showTitle> diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Форма/Form.form b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Форма/Form.form index f75663c9e..44f65c81b 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Форма/Form.form @@ -206,7 +206,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1788,7 +1787,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2515,7 +2513,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -3288,7 +3285,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -4023,7 +4019,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -4116,7 +4111,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -4146,7 +4140,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Form.form b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Form.form index 3ac28adae..933c852dc 100644 --- a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Form.form +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Form.form @@ -97,7 +97,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -174,7 +173,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -328,7 +326,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -539,7 +536,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -695,7 +691,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -782,7 +777,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Form.form b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Form.form index f272aa84d..709d6f341 100644 --- a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Form.form +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Form.form @@ -101,7 +101,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1064,7 +1063,7 @@ <horizontalAlign>Left</horizontalAlign> </extInfo> </extendedTooltip> - <commandName>0</commandName> + <commandName>Form.Command.ОбновитьРегламентныеЗадания</commandName> <buttonImportance>Normal</buttonImportance> <representation>Auto</representation> <autoMaxWidth>true</autoMaxWidth> @@ -1620,7 +1619,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1859,7 +1857,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1888,7 +1885,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2013,7 +2009,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2042,7 +2037,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -3860,50 +3854,7 @@ <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <commandInterface> - <navigationPanel> - <cmiFragmentRecord> - <command>0</command> - <group>FormNavigationPanelImportant</group> - <index>2</index> - </cmiFragmentRecord> - <cmiFragmentRecord> - <command>0</command> - <group>FormNavigationPanelImportant</group> - <index>0</index> - </cmiFragmentRecord> - <cmiFragmentRecord> - <command>0</command> - <group>FormNavigationPanelImportant</group> - <index>1</index> - </cmiFragmentRecord> - <cmiFragmentRecord> - <command>0</command> - <type>Added</type> - <group>FormNavigationPanelGoTo</group> - <index>1</index> - <userVisible> - <common>true</common> - </userVisible> - </cmiFragmentRecord> - <cmiFragmentRecord> - <command>0</command> - <type>Added</type> - <group>FormNavigationPanelImportant</group> - <index>0</index> - <userVisible> - <common>true</common> - </userVisible> - </cmiFragmentRecord> - <cmiFragmentRecord> - <command>0</command> - <type>Added</type> - <group>FormNavigationPanelGoTo</group> - <index>0</index> - <userVisible> - <common>true</common> - </userVisible> - </cmiFragmentRecord> - </navigationPanel> + <navigationPanel/> <commandBar/> </commandInterface> <extInfo xsi:type="form:ObjectFormExtInfo"/> diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Module.bsl b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Module.bsl index cf6a40e5b..534b076b5 100644 --- a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Module.bsl +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Module.bsl @@ -33,8 +33,8 @@ Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда - Элементы.ТаблицаРегламентныеЗаданияОбновитьДанные.ТолькоВоВсехДействиях = Истина; - Элементы.ТаблицаРегламентныеЗаданияНастроитьРасписание.ТолькоВоВсехДействиях = Истина; + Элементы.ТаблицаРегламентныеЗаданияОбновитьДанные.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; + Элементы.ТаблицаРегламентныеЗаданияНастроитьРасписание.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; Элементы.ГруппаШапка.ОтображатьЗаголовок = Истина; КонецЕсли; @@ -279,7 +279,7 @@ КоличествоОшибок = МассивСообщенийОбОшибках.Количество(); Если КоличествоОшибок > 0 Тогда ЗаголовокТекстаПроОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Задания выполнены с ошибками (%1 из %2)'"), + НСтр("ru = 'Задания не выполнены (%1 из %2)'"), Формат(КоличествоОшибок, "ЧГ="), Формат(ВыделенныеСтроки.Количество(), "ЧГ=")); diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Form.form b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Form.form index f47357c45..3a26c63fa 100644 --- a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Form.form +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Form.form @@ -230,7 +230,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -383,7 +382,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -500,7 +498,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Form.form b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Form.form index d9b487a71..4e1cd1d70 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Form.form +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Form.form @@ -174,7 +174,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -307,7 +306,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -413,7 +411,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -631,7 +628,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -661,7 +657,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -806,7 +801,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -945,7 +939,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1032,7 +1025,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1062,7 +1054,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -1199,7 +1190,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1295,7 +1285,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Module.bsl b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Module.bsl index 9cece8c37..f160eca21 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Module.bsl +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Module.bsl @@ -284,7 +284,16 @@ Иначе - ZipФайл = Новый ЧтениеZipФайла(ИмяФайла); + Попытка + ZipФайл = Новый ЧтениеZipФайла(ИмяФайла); + Исключение + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = 'Выбранный файл архива с резервной копией поврежден или не является архивом (%1).'"), + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения,, "Объект.ФайлЗагрузкиРезервнойКопии"); + Возврат Ложь; + КонецПопытки; + Если ZipФайл.Элементы.Количество() <> 1 Тогда ТекстСообщения = НСтр("ru = 'Выбранный файл не является архивом с резервной копией (содержит более одного файла).'"); diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Form.form b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Form.form index 59c43c04e..54c341c95 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Form.form +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Form.form @@ -248,7 +248,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -457,7 +456,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -668,7 +666,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -931,7 +928,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1135,7 +1131,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1164,7 +1159,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1194,7 +1188,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -1387,7 +1380,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1490,7 +1482,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -1594,7 +1585,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1722,7 +1712,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1751,7 +1740,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Module.bsl b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Module.bsl index 34aa82b38..e019f8de0 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Module.bsl +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Module.bsl @@ -382,7 +382,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Нет прав на запись в каталог с резервными копиями. |Не удалось создать тестовый файл %1 по причине: %2'"), - ИмяФайла, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ИмяФайла, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения,, "Объект.КаталогСРезервнымиКопиями"); РеквизитыЗаполнены = Ложь; КонецПопытки; diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаВосстановления/Template.txt b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаВосстановления/Template.txt index 241266a46..1c1fbe164 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаВосстановления/Template.txt +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаВосстановления/Template.txt @@ -2,7 +2,7 @@ <html> <head> - <meta http-equiv="Content-Type" content="application/hta; charset=UTF-16"> + <meta http-equiv="Content-Type" content="application/hta; charset=UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=EmulateIE7"> <hta:application id="oHTA" border="none" caption="no" contextmenu="no" selection="no" icon="splash.ico" innerborder="no" navigable="yes" showintaskbar="yes" scroll="no" version="1.0.0.0" /> diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаРезервногоКопирования/Template.txt b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаРезервногоКопирования/Template.txt index 38795ba1b..b359da57a 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаРезервногоКопирования/Template.txt +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаРезервногоКопирования/Template.txt @@ -2,7 +2,7 @@ <html> <head> - <meta http-equiv="Content-Type" content="application/hta; charset=UTF-16"> + <meta http-equiv="Content-Type" content="application/hta; charset=UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=EmulateIE7"> <hta:application id="oHTA" border="none" caption="no" contextmenu="no" selection="no" icon="splash.ico" innerborder="no" navigable="yes" showintaskbar="yes" scroll="no" version="1.0.0.0" /> diff --git a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОбновлениеВерсииПрограммы/Module.bsl b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОбновлениеВерсииПрограммы/Module.bsl index c75a5e8de..89669a262 100644 --- a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОбновлениеВерсииПрограммы/Module.bsl +++ b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОбновлениеВерсииПрограммы/Module.bsl @@ -154,8 +154,8 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); ДополнительныеПараметры = Новый Структура; ДополнительныеПараметры.Вставить("ОшибкаУдаленияИсправлений"); - ДополнительныеПараметры.Вставить("КраткоеПредставлениеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - ДополнительныеПараметры.Вставить("ПодробноеПредставлениеОшибки", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ДополнительныеПараметры.Вставить("КраткоеПредставлениеОшибки", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ДополнительныеПараметры.Вставить("ПодробноеПредставлениеОшибки", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат ДополнительныеПараметры; КонецПопытки; Если Результат.ЕстьИзменения Тогда @@ -205,9 +205,9 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); ОбработанныйРезультат = Новый Структура; ОбработанныйРезультат.Вставить("КраткоеПредставлениеОшибки", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ОбработанныйРезультат.Вставить("ПодробноеПредставлениеОшибки", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; Если ЗначениеЗаполнено(ОбработанныйРезультат.КраткоеПредставлениеОшибки) Тогда @@ -249,9 +249,9 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); ОбработанныйРезультат = Новый Структура; ОбработанныйРезультат.Вставить("КраткоеПредставлениеОшибки", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ОбработанныйРезультат.Вставить("ПодробноеПредставлениеОшибки", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; Если ЗначениеЗаполнено(ОбработанныйРезультат.КраткоеПредставлениеОшибки) Тогда @@ -303,9 +303,9 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); ОбработанныйРезультат = Новый Структура; ОбработанныйРезультат.Вставить("КраткоеПредставлениеОшибки", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); ОбработанныйРезультат.Вставить("ПодробноеПредставлениеОшибки", - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; Если ЗначениеЗаполнено(ОбработанныйРезультат.КраткоеПредставлениеОшибки) Тогда @@ -323,14 +323,14 @@ ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ДополнительныеПараметры.Вставить("КраткоеПредставлениеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - ДополнительныеПараметры.Вставить("ПодробноеПредставлениеОшибки", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ДополнительныеПараметры.Вставить("КраткоеПредставлениеОшибки", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ДополнительныеПараметры.Вставить("ПодробноеПредставлениеОшибки", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); СообщениеОНеудачномОбновлении(ДополнительныеПараметры, Неопределено); Возврат; КонецПопытки; Если Не ТолькоОбновлениеПараметровРаботыПрограммы - И ПараметрыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда + И ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда ВыполнитьОбработкуОповещения(ПараметрыПродолжения.ОбработкаПродолжения); Возврат; @@ -341,8 +341,8 @@ ОбновлениеИнформационнойБазыСлужебныйВызовСервера.ВыполнитьОбновлениеИнформационнойБазы(Истина); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ДополнительныеПараметры.Вставить("КраткоеПредставлениеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - ДополнительныеПараметры.Вставить("ПодробноеПредставлениеОшибки", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ДополнительныеПараметры.Вставить("КраткоеПредставлениеОшибки", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ДополнительныеПараметры.Вставить("ПодробноеПредставлениеОшибки", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; Если ЗначениеЗаполнено(ДополнительныеПараметры.КраткоеПредставлениеОшибки) Тогда СообщениеОНеудачномОбновлении(ДополнительныеПараметры, Неопределено); @@ -650,6 +650,8 @@ ВсегоПроцедур = 0; Обработчики = ОбновлениеИнформационнойБазыСлужебный.ОбработчикиДляОтложеннойРегистрацииДанных(Истина); + СведенияОбОбновлении = ОбновлениеИнформационнойБазыСлужебный.СведенияОбОбновленииИнформационнойБазы(); + ВерсииПодсистемНаНачалоОбновления = СведенияОбОбновлении.ВерсииПодсистемНаНачалоОбновления; Для Каждого Обработчик Из Обработчики Цикл Если ОбработанныеБиблиотеки.Найти(Обработчик.ИмяБиблиотеки) <> Неопределено Тогда Продолжить; @@ -660,6 +662,7 @@ ОбработанныеБиблиотеки.Добавить(Обработчик.ИмяБиблиотеки); Продолжить; КонецЕсли; + ВерсияПодсистемыНаНачалоОбновления = ВерсииПодсистемНаНачалоОбновления[Обработчик.ИмяБиблиотеки]; ПараллельноСВерсии = ОписанияБиблиотек[Обработчик.ИмяБиблиотеки].ПараллельноеОтложенноеОбновлениеСВерсии; @@ -681,7 +684,9 @@ ОписаниеОбрабатываемыхДанных.ИмяОбработчика = Обработчик.ИмяОбработчика; ОписаниеОбрабатываемыхДанных.Очередь = Обработчик.ОчередьОтложеннойОбработки; + ОписаниеОбрабатываемыхДанных.АктуальныеДанные = ОбновлениеИнформационнойБазы.ПараметрыВыборкиАктуальныхДанных(); ОписаниеОбрабатываемыхДанных.ПроцедураЗаполнения = Обработчик.ПроцедураЗаполненияДанныхОбновления; + ОписаниеОбрабатываемыхДанных.ВерсияПодсистемыНаНачалоОбновления = ВерсияПодсистемыНаНачалоОбновления; ОписаниеОбрабатываемыхДанных = Новый ХранилищеЗначения(ОписаниеОбрабатываемыхДанных, Новый СжатиеДанных(9)); ОбновлениеИнформационнойБазыСлужебный.УстановитьСвойствоОбработчика(Обработчик.ИмяОбработчика, "ОбрабатываемыеДанные", ОписаниеОбрабатываемыхДанных); diff --git a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОтложенноеОбновлениеНеЗавершено/Form.form b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОтложенноеОбновлениеНеЗавершено/Form.form index b26c786fd..ea8eb12a9 100644 --- a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОтложенноеОбновлениеНеЗавершено/Form.form +++ b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОтложенноеОбновлениеНеЗавершено/Form.form @@ -97,7 +97,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -244,7 +243,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОтложенныеОбработчики/Form.form b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОтложенныеОбработчики/Form.form index 689413e4b..792f0bbbe 100644 --- a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОтложенныеОбработчики/Form.form +++ b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОтложенныеОбработчики/Form.form @@ -168,7 +168,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -436,7 +435,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1404,7 +1402,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1533,7 +1530,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -1563,7 +1559,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОтложенныеОбработчики/Module.bsl b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОтложенныеОбработчики/Module.bsl index 5d13d71ca..91a7d234a 100644 --- a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОтложенныеОбработчики/Module.bsl +++ b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОтложенныеОбработчики/Module.bsl @@ -572,6 +572,11 @@ ДлительностьВыполнения = СтатистикаВыполнения["ДлительностьВыполнения"]; ПрогрессВыполнения = СтатистикаВыполнения["ПрогрессВыполнения"]; + МаксимальнаяДлительность = 0; + Если ЗначениеЗаполнено(ЗавершениеОбработкиДанных) И ЗначениеЗаполнено(НачалоОбработкиДанных) Тогда + МаксимальнаяДлительность = ЗавершениеОбработкиДанных - НачалоОбработкиДанных; + КонецЕсли; + Прогресс = Неопределено; Если ПрогрессВыполнения <> Неопределено И ПрогрессВыполнения.ВсегоОбъектов <> 0 @@ -599,7 +604,7 @@ ОбработчикиНеВыполнялись = Ложь; ПредставлениеСтатусаВыполнения = НСтр("ru = 'завершилась успешно'"); СтрокаСписка.СтатусПредставление = НСтр("ru = 'Выполнено'"); - СтрокаСписка.ДлительностьВыполнения = ДлительностьВыполненияПроцедурыОбновления(ДлительностьВыполнения); + СтрокаСписка.ДлительностьВыполнения = ДлительностьВыполненияПроцедурыОбновления(ДлительностьВыполнения, МаксимальнаяДлительность); ИначеЕсли СтрокаОбработчика.Статус = Перечисления.СтатусыОбработчиковОбновления.Выполняется Тогда ОбработчикиНеВыполнялись = Ложь; @@ -619,7 +624,7 @@ ПредставлениеСтатусаВыполнения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ПредставлениеСтатусаВыполнения, СтрокаОбработчика.ИмяОбработчика); СтрокаСписка.ИнформацияОПроцедуреОбновления = ПредставлениеСтатусаВыполнения + СтрокаОбработчика.ИнформацияОбОшибке; СтрокаСписка.СтатусПредставление = НСтр("ru = 'Ошибка'"); - СтрокаСписка.ДлительностьВыполнения = ДлительностьВыполненияПроцедурыОбновления(ДлительностьВыполнения); + СтрокаСписка.ДлительностьВыполнения = ДлительностьВыполненияПроцедурыОбновления(ДлительностьВыполнения, МаксимальнаяДлительность); ИначеЕсли СтрокаОбработчика.Статус = Перечисления.СтатусыОбработчиковОбновления.Приостановлен Тогда ОбработчикиНеВыполнялись = Ложь; @@ -673,12 +678,17 @@ КонецФункции &НаСервере -Функция ДлительностьВыполненияПроцедурыОбновления(ДлительностьВыполнения) +Функция ДлительностьВыполненияПроцедурыОбновления(ДлительностьВыполнения, МаксимальнаяДлительность) Если ДлительностьВыполнения = Неопределено Тогда Возврат ""; КонецЕсли; + Если ЗначениеЗаполнено(МаксимальнаяДлительность) + И ДлительностьВыполнения > МаксимальнаяДлительность Тогда + ДлительностьВыполнения = МаксимальнаяДлительность; + КонецЕсли; + ШаблонСекунды = НСтр("ru = '%1 сек.'"); ШаблонМинуты = НСтр("ru = '%1 мин. %2 сек.'"); ШаблонЧасы = НСтр("ru = '%1 ч. %2 мин.'"); @@ -769,7 +779,7 @@ ТекущийОбработчик = Строка.Обработчик; Продолжить; КонецЕсли; - НовыйМассивИзменяемыхОбработчиков = ИзменяемыеОбработчики(Строка.Обработчик, + НовыйМассивИзменяемыхОбработчиков = ИзменяемыеОбработчики(Строка.Обработчик, // @skip-check query-in-loop - рекурсивная выборка зависимых обработчиков. ОбрабатываемыеДанныеТаблица, Строка.Очередь, ПриоритетЖелательноБыстрее, diff --git a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОчисткаУстаревшихДанных/Form.form b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОчисткаУстаревшихДанных/Form.form index 7044e505d..8da12a317 100644 --- a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОчисткаУстаревшихДанных/Form.form +++ b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОчисткаУстаревшихДанных/Form.form @@ -88,7 +88,7 @@ </userVisible> <title> <key>ru</key> - <value>Группа пояснение</value> + <value>Пояснение</value> ГруппаПояснениеРасширеннаяПодсказка @@ -104,7 +104,6 @@ AlwaysHorizontal Center - Auto true true Auto @@ -196,7 +195,7 @@ <key>ru</key> - <value>Группа предупреждение</value> + <value>Предупреждение</value> ГруппаПредупреждениеРасширеннаяПодсказка @@ -211,7 +210,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -591,7 +589,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -605,7 +602,7 @@ <key>ru</key> - <value>Группа шапка</value> + <value>Шапка</value> ГруппаШапкаРасширеннаяПодсказка @@ -620,7 +617,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ПредупреждениеБезопасности/Form.form b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ПредупреждениеБезопасности/Form.form index 24e6cc483..dc9ed4016 100644 --- a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ПредупреждениеБезопасности/Form.form +++ b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ПредупреждениеБезопасности/Form.form @@ -102,7 +102,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true diff --git a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/РезультатыОбновленияПрограммы/Form.form b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/РезультатыОбновленияПрограммы/Form.form index 24dd38111..d01e413da 100644 --- a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/РезультатыОбновленияПрограммы/Form.form +++ b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/РезультатыОбновленияПрограммы/Form.form @@ -101,7 +101,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -346,7 +345,6 @@ UsualGroup Vertical - Auto true true Auto @@ -504,7 +502,6 @@ UsualGroup Vertical - Auto true true Auto @@ -635,7 +632,6 @@ UsualGroup Vertical - Auto true true Auto @@ -710,7 +706,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -820,7 +815,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -920,7 +914,6 @@ UsualGroup Vertical - Auto true true Auto @@ -949,7 +942,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1082,7 +1074,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1245,7 +1236,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1348,7 +1338,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1420,7 +1409,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1529,7 +1517,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1637,7 +1624,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1733,7 +1719,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1801,7 +1786,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1830,7 +1814,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1859,7 +1842,6 @@ UsualGroup AlwaysHorizontal - Auto NormalSeparation true true @@ -1889,7 +1871,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1951,7 +1932,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2112,7 +2092,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2255,7 +2234,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2284,7 +2262,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2313,7 +2290,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2342,7 +2318,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -2508,7 +2483,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -2570,7 +2544,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2683,7 +2656,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2791,7 +2763,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -2851,7 +2822,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2919,7 +2889,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2948,7 +2917,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -2977,7 +2945,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/РезультатыОбновленияПрограммы/Module.bsl b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/РезультатыОбновленияПрограммы/Module.bsl index a6edbac43..4215d3f23 100644 --- a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/РезультатыОбновленияПрограммы/Module.bsl +++ b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/РезультатыОбновленияПрограммы/Module.bsl @@ -474,6 +474,8 @@ ОбновлениеИнформационнойБазыСлужебный.ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении); + Константы.ОтложенноеОбновлениеЗавершеноУспешно.Установить(Ложь); + Если Не ИБФайловая Тогда ВключитьРегламентноеЗадание(); Возврат; diff --git a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/СообщениеДляНеполноправногоПользователя/Module.bsl b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/СообщениеДляНеполноправногоПользователя/Module.bsl index 4bdbe10e6..e97c8c922 100644 --- a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/СообщениеДляНеполноправногоПользователя/Module.bsl +++ b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/СообщениеДляНеполноправногоПользователя/Module.bsl @@ -73,7 +73,7 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазыСлужебный.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат "ОшибкаБлокировки"; КонецПопытки; diff --git a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/СообщениеОНеудачномОбновлении/Form.form b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/СообщениеОНеудачномОбновлении/Form.form index f0e315feb..4243e7cf1 100644 --- a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/СообщениеОНеудачномОбновлении/Form.form +++ b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/СообщениеОНеудачномОбновлении/Form.form @@ -98,7 +98,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -201,7 +200,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/СообщениеОНеудачномОбновлении/Module.bsl b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/СообщениеОНеудачномОбновлении/Module.bsl index 2957d8f88..f4fb96fec 100644 --- a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/СообщениеОНеудачномОбновлении/Module.bsl +++ b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/СообщениеОНеудачномОбновлении/Module.bsl @@ -25,7 +25,7 @@ , , Параметры.ПодробноеПредставлениеОшибки); КонецЕсли; - ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'При обновлении версии программы возникла ошибка: + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Программа не была обновлена на новую версию по причине: | |%1'"), Параметры.КраткоеПредставлениеОшибки); @@ -58,7 +58,8 @@ МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей"); МодульИнтернетПоддержкаПользователейКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователейКлиентСервер"); ВерсияБИП = МодульИнтернетПоддержкаПользователейКлиентСервер.ВерсияБиблиотеки(); - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияБИП, "2.6.3.0") < 0 Тогда + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияБИП, "2.6.3.0") < 0 + Или Не Пользователи.ЭтоПолноправныйПользователь() Тогда Элементы.ФормаПроверитьНаличиеИсправлений.Видимость = Ложь; Иначе ДанныеАутентификации = МодульИнтернетПоддержкаПользователей.ДанныеАутентификацииПользователяИнтернетПоддержки(); diff --git a/SSL/src/DataProcessors/СдвигГраницыИтогов/Forms/ОсновнаяФорма/Form.form b/SSL/src/DataProcessors/СдвигГраницыИтогов/Forms/ОсновнаяФорма/Form.form index 1df4e95a5..5b9fc14db 100644 --- a/SSL/src/DataProcessors/СдвигГраницыИтогов/Forms/ОсновнаяФорма/Form.form +++ b/SSL/src/DataProcessors/СдвигГраницыИтогов/Forms/ОсновнаяФорма/Form.form @@ -48,7 +48,7 @@ 20 <key>ru</key> - <value><fontstyle -31>Выполняется сдвиг границы рассчитанных итогов...</> + <value><b><fontstyle -31>Выполняется сдвиг границы рассчитанных итогов...</></> <fontstyle -31>Пожалуйста, подождите, это может занять некоторое время.</></value> true @@ -103,7 +103,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/Сканирование/Forms/НастройкаСканирования/Form.form b/SSL/src/DataProcessors/Сканирование/Forms/НастройкаСканирования/Form.form index 88514d865..d7887ab77 100644 --- a/SSL/src/DataProcessors/Сканирование/Forms/НастройкаСканирования/Form.form +++ b/SSL/src/DataProcessors/Сканирование/Forms/НастройкаСканирования/Form.form @@ -326,7 +326,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -445,7 +444,6 @@ UsualGroup Vertical - Auto true true Auto @@ -474,7 +472,6 @@ UsualGroup Vertical - Auto true true Auto @@ -624,7 +621,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -737,7 +733,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -853,7 +848,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -931,7 +925,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -962,7 +955,6 @@ UsualGroup Vertical - Auto true true Auto @@ -991,7 +983,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/Сканирование/Forms/НастройкаСканированияНаСеанс/Form.form b/SSL/src/DataProcessors/Сканирование/Forms/НастройкаСканированияНаСеанс/Form.form index a5172cc47..5878b6eb8 100644 --- a/SSL/src/DataProcessors/Сканирование/Forms/НастройкаСканированияНаСеанс/Form.form +++ b/SSL/src/DataProcessors/Сканирование/Forms/НастройкаСканированияНаСеанс/Form.form @@ -276,7 +276,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -397,7 +396,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -510,7 +508,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -626,7 +623,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -704,7 +700,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -735,7 +730,6 @@ UsualGroup Vertical - Auto true true Auto @@ -764,7 +758,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/Сканирование/Forms/РезультатСканирования/Form.form b/SSL/src/DataProcessors/Сканирование/Forms/РезультатСканирования/Form.form index 79e50b2d4..ba5af9c71 100644 --- a/SSL/src/DataProcessors/Сканирование/Forms/РезультатСканирования/Form.form +++ b/SSL/src/DataProcessors/Сканирование/Forms/РезультатСканирования/Form.form @@ -218,7 +218,7 @@ true true true - None + Top None None true @@ -296,7 +296,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -464,7 +463,6 @@ UsualGroup Vertical - Auto true true Auto @@ -494,7 +492,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/Сканирование/Forms/РезультатСканирования/Module.bsl b/SSL/src/DataProcessors/Сканирование/Forms/РезультатСканирования/Module.bsl index c82725842..ee92a48c8 100644 --- a/SSL/src/DataProcessors/Сканирование/Forms/РезультатСканирования/Module.bsl +++ b/SSL/src/DataProcessors/Сканирование/Forms/РезультатСканирования/Module.bsl @@ -286,9 +286,9 @@ Если РасширениеРезультата = "pdf" Тогда - #Если НЕ ВебКлиент И НЕ МобильныйКлиент Тогда - ПараметрыВыполнения.ФайлРезультата = ПолучитьИмяВременногоФайла("pdf"); - #КонецЕсли +#Если НЕ ВебКлиент И НЕ МобильныйКлиент Тогда + ПараметрыВыполнения.ФайлРезультата = ПолучитьИмяВременногоФайла("pdf"); // АПК:441 Удаление временного файла см. ПринятьЗавершение. +#КонецЕсли СтрокаВсехПутей = ПутьКФайлуЛокальный; ПараметрыПриложения["СтандартныеПодсистемы.КомпонентаTwain"].ОбъединитьВМногостраничныйФайл( @@ -299,6 +299,7 @@ ТекстСообщения = ТекстСообщенияОшибкиПреобразованияВPDF(ПараметрыВыполнения.ФайлРезультата); ПоказатьПредупреждение(, ТекстСообщения); УдалитьФайлы(ПутьКФайлуЛокальный); + УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата); Результат.ТекстОшибки = ТекстСообщения; ПринятьЗавершение(Результат, ПараметрыВыполнения); @@ -307,7 +308,6 @@ УдалитьФайлы(ПутьКФайлуЛокальный); ПутьКФайлуЛокальный = ПараметрыВыполнения.ФайлРезультата; - КонецЕсли; Если НЕ ПустаяСтрока(ПутьКФайлуЛокальный) Тогда @@ -324,7 +324,6 @@ ПараметрыДобавления.Вставить("ЭтоФайл", ЭтоФайл); РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширением(ПараметрыДобавления); - Возврат; КонецЕсли; @@ -387,18 +386,19 @@ СтрокаВсехПутей = СтрокаВсехПутей + Строка.ПутьКФайлу; КонецЦикла; - #Если НЕ ВебКлиент И НЕ МобильныйКлиент Тогда - РасширениеРезультата = Строка(ФорматХраненияМногостраничный); - РасширениеРезультата = НРег(РасширениеРезультата); - ПараметрыВыполнения.ФайлРезультата = ПолучитьИмяВременногоФайла(РасширениеРезультата); - #КонецЕсли +#Если НЕ ВебКлиент И НЕ МобильныйКлиент Тогда + РасширениеРезультата = Строка(ФорматХраненияМногостраничный); + РасширениеРезультата = НРег(РасширениеРезультата); + ПараметрыВыполнения.ФайлРезультата = ПолучитьИмяВременногоФайла(РасширениеРезультата); // АПК:441 Удаление временного файла см. ПринятьВсеКакОдинФайлЗавершение +#КонецЕсли ПараметрыПриложения["СтандартныеПодсистемы.КомпонентаTwain"].ОбъединитьВМногостраничныйФайл( СтрокаВсехПутей, ПараметрыВыполнения.ФайлРезультата, ПутьКПрограммеКонвертации); ОбъектФайлРезультата = Новый Файл(ПараметрыВыполнения.ФайлРезультата); Если НЕ ОбъектФайлРезультата.Существует() Тогда ТекстСообщения = ТекстСообщенияОшибкиПреобразованияВPDF(ПараметрыВыполнения.ФайлРезультата); - ПараметрыВыполнения.ФайлРезультата = ""; + УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата); + ПараметрыВыполнения.ФайлРезультата = ""; Результат.ТекстОшибки = ТекстСообщения; ПоказатьПредупреждение(, ТекстСообщения); ПринятьВсеКакОдинФайлЗавершение(Результат, ПараметрыВыполнения); @@ -421,7 +421,6 @@ ПараметрыДобавления.Вставить("ЭтоФайл", ЭтоФайл); РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширением(ПараметрыДобавления); - Возврат; КонецЕсли; @@ -688,9 +687,9 @@ &НаКлиенте Процедура ПринятьВсеКакОдинФайлЗавершение(Результат, ПараметрыВыполнения) Экспорт + УдалитьВременныеФайлы(ПараметрыВыполнения.МассивФайловКопия); УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата); - Закрыть(Результат); КонецПроцедуры diff --git a/SSL/src/DataProcessors/СкрытиеКонфиденциальнойИнформации/Forms/ВыборПравилОбработки/Form.form b/SSL/src/DataProcessors/СкрытиеКонфиденциальнойИнформации/Forms/ВыборПравилОбработки/Form.form index 396184f53..9848a4c69 100644 --- a/SSL/src/DataProcessors/СкрытиеКонфиденциальнойИнформации/Forms/ВыборПравилОбработки/Form.form +++ b/SSL/src/DataProcessors/СкрытиеКонфиденциальнойИнформации/Forms/ВыборПравилОбработки/Form.form @@ -117,7 +117,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -303,7 +302,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -399,7 +397,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -559,7 +556,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -654,7 +650,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/DataProcessors/СкрытиеКонфиденциальнойИнформации/Forms/Форма/Form.form b/SSL/src/DataProcessors/СкрытиеКонфиденциальнойИнформации/Forms/Форма/Form.form index a172bf5a4..011f66939 100644 --- a/SSL/src/DataProcessors/СкрытиеКонфиденциальнойИнформации/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/СкрытиеКонфиденциальнойИнформации/Forms/Форма/Form.form @@ -97,7 +97,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -864,6 +863,7 @@ true true true + Top true true @@ -1199,7 +1199,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1228,7 +1227,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1356,7 +1354,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1457,7 +1454,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1558,7 +1554,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1852,7 +1847,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1881,7 +1875,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1958,7 +1951,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -2026,7 +2018,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -2200,7 +2191,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/СкрытиеКонфиденциальнойИнформации/ObjectModule.bsl b/SSL/src/DataProcessors/СкрытиеКонфиденциальнойИнформации/ObjectModule.bsl index 364d010f6..db9343efc 100644 --- a/SSL/src/DataProcessors/СкрытиеКонфиденциальнойИнформации/ObjectModule.bsl +++ b/SSL/src/DataProcessors/СкрытиеКонфиденциальнойИнформации/ObjectModule.bsl @@ -66,9 +66,9 @@ КонецЕсли; Если СтрНайти(ОбъектМетаданных.Тип, "Регистры") > 0 Тогда - ОбработатьРегистры(ОбъектМетаданных, ПараметрыОтбора); + ОбработатьРегистры(ОбъектМетаданных, ПараметрыОтбора); // @skip-check query-in-loop - пакетное скрытие конфиденциальной информации. Иначе - ОбработатьОбъектМетаданных(ОбъектМетаданных, ПараметрыОтбора); + ОбработатьОбъектМетаданных(ОбъектМетаданных, ПараметрыОтбора); // @skip-check query-in-loop - пакетное скрытие конфиденциальной информации. КонецЕсли; КонецЦикла; @@ -76,7 +76,7 @@ КонецЦикла; ИмяРегистраВерсииОбъектов = "ВерсииОбъектов"; - Если Метаданные.НайтиПоПолномуИмени("РегистрСведений." + ИмяРегистраВерсииОбъектов) <> Неопределено + Если Метаданные.РегистрыСведений.Найти(ИмяРегистраВерсииОбъектов) <> Неопределено И Не ЗначениеЗаполнено(ПараметрыОтбора.Субъекты)Тогда НаборЗаписей = РегистрыСведений[ИмяРегистраВерсииОбъектов].СоздатьНаборЗаписей(); @@ -176,7 +176,7 @@ ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "&ИмяТаблицы", ОбъектМетаданных.ПолноеИмя); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяИзмерения", "Регистр." + Измерение.Имя); Запрос = Новый Запрос(ТекстЗапроса); - Результат = Запрос.Выполнить().Выгрузить(); + Результат = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - порционная обработка данных Строка = ОписанияИзмерений.Добавить(); Строка.Измерение = Измерение.Имя; @@ -441,7 +441,7 @@ Если ЗначениеЗаполнено(Субъекты) Тогда - Объект = Метаданные.НайтиПоПолномуИмени(ОбъектМетаданных.ПолноеИмя); + Объект = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ОбъектМетаданных.ПолноеИмя); МассивОбъектов = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Объект); Результат = НайтиПоСсылкам(Субъекты, Новый Массив, МассивОбъектов, Новый Массив); @@ -739,7 +739,7 @@ Функция ПроверитьРегистрДляУдаленияФайловВыбран(ДеревоОбрабатываемыхОбъектов) ИмяРегистраДвоичныхДанных = "ДвоичныеДанныеФайлов"; - Если Метаданные.НайтиПоПолномуИмени("РегистрСведений." + ИмяРегистраДвоичныхДанных) = Неопределено Тогда + Если Метаданные.РегистрыСведений.Найти(ИмяРегистраДвоичныхДанных) = Неопределено Тогда Возврат Истина; КонецЕсли; @@ -763,7 +763,7 @@ КонецЕсли; ИмяРегистраДвоичныхДанных = "ДвоичныеДанныеФайлов"; - Если Метаданные.НайтиПоПолномуИмени("РегистрСведений." + ИмяРегистраДвоичныхДанных) = Неопределено Тогда + Если Метаданные.РегистрыСведений.Найти(ИмяРегистраДвоичныхДанных) = Неопределено Тогда Возврат; КонецЕсли; diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/РезультатАвтоматическогоСопоставления/Form.form b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/РезультатАвтоматическогоСопоставления/Form.form index 181fcdfda..b6ea0a68d 100644 --- a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/РезультатАвтоматическогоСопоставления/Form.form +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/РезультатАвтоматическогоСопоставления/Form.form @@ -1006,7 +1006,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1074,7 +1073,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1103,7 +1101,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1136,7 +1133,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1237,7 +1233,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1305,7 +1300,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1338,7 +1332,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1402,7 +1395,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1557,7 +1549,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1626,7 +1617,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1659,7 +1649,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1723,7 +1712,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/РезультатАвтоматическогоСопоставления/Module.bsl b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/РезультатАвтоматическогоСопоставления/Module.bsl index 759e9dc2d..8b70c87e5 100644 --- a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/РезультатАвтоматическогоСопоставления/Module.bsl +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/РезультатАвтоматическогоСопоставления/Module.bsl @@ -547,7 +547,7 @@ ПослеСопоставленияОбъектов(ПолучитьИзВременногоХранилища(АдресВременногоХранилища)); Исключение Отказ = Истина; - ЗафиксироватьОшибку(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗафиксироватьОшибку(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат; КонецПопытки; diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Form.form b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Form.form index 1cba42b21..06252c821 100644 --- a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Form.form @@ -111,7 +111,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -606,7 +605,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -649,6 +647,53 @@ SelectAll SortListAsc SortListDesc + + ТаблицаСопоставленияСопоставлениеПоСсылкеКартинка + 419 + true + true + + true + + + ТаблицаСопоставления.СопоставлениеПоСсылкеКартинка + + None + + ТаблицаСопоставленияСопоставлениеПоСсылкеКартинкаРасширеннаяПодсказка + 421 + Label + true + true + + Left + + + + ТаблицаСопоставленияСопоставлениеПоСсылкеКартинкаКонтекстноеМеню + 420 + true + + PictureField + Enter + true + Left + true + + true + true + true + true + + StdPicture.GetURL + + + + 1 + + AsFileRef + + ДанныеЭтойПрограммы 306 @@ -1733,7 +1778,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1801,7 +1845,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1830,7 +1873,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1863,7 +1905,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1964,7 +2005,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2032,7 +2072,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2065,7 +2104,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -2098,7 +2136,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -2193,7 +2230,7 @@ false - CommonPicture.УдалитьИнформация + StdPicture.Information @@ -2369,7 +2406,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2866,6 +2902,39 @@ true + + СопоставлениеПоСсылке + 27 + + Boolean + + + true + + + true + + + + СопоставлениеПоСсылкеКартинка + + <key>ru</key> + <value>Сопоставление по ссылке картинка</value> + + 28 + + Number + + 10 + + + + true + + + true + + ОтборПоСтатусуСопоставления diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Module.bsl index 476dda18e..8fdf9ef3c 100644 --- a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Module.bsl @@ -431,6 +431,51 @@ ВыделенныеСтроки = Элементы.ТаблицаСопоставления.ВыделенныеСтроки; + ЕстьСопоставлениеПоСсылке = Ложь; + Для Каждого ИдентификаторСтроки Из ВыделенныеСтроки Цикл + Строка = ТаблицаСопоставления.НайтиПоИдентификатору(ИдентификаторСтроки); + Если Строка.СопоставлениеПоСсылке Тогда + ЕстьСопоставлениеПоСсылке = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Если ЕстьСопоставлениеПоСсылке Тогда + + ТекстВопроса = НСтр( + "ru = 'Вы пытаетесь отменить связь объектов сопоставленных по ссылкам. + |Для этих объектов необходимо сразу установить новое соответствие, иначе они будут снова сопоставлены по ссылке. + | + |Разорвать связь?'", + ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + Заголовок = НСтр("ru = 'Отменить сопоставление'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + Оповещение = Новый ОписаниеОповещения("ОтменитьСопоставлениеЗавершение", ЭтотОбъект); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет,,, Заголовок); + + Иначе + + ОтменитьСопоставлениеНаКлиенте(); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтменитьСопоставлениеЗавершение(Результат, ДополнительныеПараметры) Экспорт + + Если Результат = КодВозвратаДиалога.Да Тогда + ОтменитьСопоставлениеНаКлиенте() + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтменитьСопоставлениеНаКлиенте() + + ВыделенныеСтроки = Элементы.ТаблицаСопоставления.ВыделенныеСтроки; + ОтменитьСопоставлениеНаСервере(ВыделенныеСтроки); // Обновляем отбор в табличных частях. @@ -438,6 +483,8 @@ КонецПроцедуры + + &НаКлиенте Процедура ЗаписатьОбновить(Команда) @@ -686,6 +733,20 @@ Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Нет соответствия'")); + // + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТаблицаСопоставленияСопоставлениеПоСсылкеКартинка.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаСопоставления.СопоставлениеПоСсылке"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Ложь; + + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); + КонецПроцедуры &НаКлиенте @@ -834,6 +895,10 @@ // И обновляем номера НоваяСтрокаИсточника.НомерПоПорядку = СледующийНомерПоПорядкуСопоставления(); НоваяСтрокаПриемника.НомерПоПорядку = СледующийНомерПоПорядкуСопоставления(); + + НоваяСтрокаИсточника.СопоставлениеПоСсылке = Ложь; + НоваяСтрокаПриемника.СопоставлениеПоСсылке = Ложь; + КонецПроцедуры &НаСервере @@ -1188,6 +1253,8 @@ // И обновляем номера НоваяСтрокаНеутвержденные.НомерПоПорядку = СледующийНомерПоПорядкуСопоставления(); + НоваяСтрокаНеутвержденные.СопоставлениеПоСсылке = ОбъектыСопоставленыПоСсылке(НоваяСтрокаНеутвержденные); + // Устанавливаем отбор и обновляем данные в таблице сопоставления. УстановитьОтборТабличныхЧастей(); КонецПроцедуры @@ -1442,6 +1509,10 @@ ТаблицаСопоставления.Загрузить(РезультатСопоставления.ТаблицаСопоставления); + Для Каждого Строка Из ТаблицаСопоставления Цикл + Строка.СопоставлениеПоСсылке = ОбъектыСопоставленыПоСсылке(Строка); + КонецЦикла; + ОбработкаОбъект = Обработки.СопоставлениеОбъектовИнформационныхБаз.Создать(); ОбменДаннымиСервер.ЗагрузитьКонтекстОбъекта(РезультатСопоставления.КонтекстОбъекта, ОбработкаОбъект); @@ -1468,6 +1539,14 @@ КонецПроцедуры +&НаКлиентеНаСервереБезКонтекста +Функция ОбъектыСопоставленыПоСсылке(Строка) + + Возврат ЗначениеЗаполнено(Строка.УникальныйИдентификаторПриемника) + И Строка(Строка.УникальныйИдентификаторПриемника.УникальныйИдентификатор()) = Строка.УникальныйИдентификаторИсточника; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Инициализация переходов помощника. diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/ObjectModule.bsl b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/ObjectModule.bsl index 7682f2452..abfc5dbfe 100644 --- a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/ObjectModule.bsl +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/ObjectModule.bsl @@ -589,7 +589,7 @@ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "СоответствияОбъектовИнформационныхБаз.Ссылка = &ЭмуляцияСтрокиЗамены", - "СоответствияОбъектовИнформационныхБаз.Ссылка ССЫЛКА #ТаблицаПриемника#"); + "ТИПЗНАЧЕНИЯ(СоответствияОбъектовИнформационныхБаз.Ссылка) = ТИП(#ТаблицаПриемника#)"); Иначе @@ -680,7 +680,7 @@ | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника = ТаблицаИсточника.УникальныйИдентификатор | И СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника = &СоответствияОбъектовИнформационныхБаз | ЛЕВОЕ СОЕДИНЕНИЕ - | Справочник.СценарииОбменовДанными КАК ТаблицаПриемника // СтрокаАвтоматическойЗамены + | Справочник.СценарииОбменовДанными КАК ТаблицаПриемника | ПО | ТаблицаИсточника.Ссылка = ТаблицаПриемника.Ссылка | ГДЕ @@ -725,7 +725,7 @@ | СоответствияОбъектовИнформационныхБаз.ТипПриемника КАК ТипИсточника, | СоответствияОбъектовИнформационныхБаз.ТипИсточника КАК ТипПриемника | ИЗ - | Справочник.СценарииОбменовДанными КАК ТаблицаПриемника // СтрокаАвтоматическойЗамены + | Справочник.СценарииОбменовДанными КАК ТаблицаПриемника | ЛЕВОЕ СОЕДИНЕНИЕ | ТаблицаРегистраСоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз | ПО @@ -812,10 +812,10 @@ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника = &СоответствияОбъектовИнформационныхБаз", - "И СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника ССЫЛКА #ТаблицаПриемника#"); + "И ТИПЗНАЧЕНИЯ(СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника) = ТИП(#ТаблицаПриемника#)"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, - "Справочник.СценарииОбменовДанными КАК ТаблицаПриемника // СтрокаАвтоматическойЗамены", + "Справочник.СценарииОбменовДанными КАК ТаблицаПриемника", "#ТаблицаПриемника# КАК ТаблицаПриемника"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, @@ -840,7 +840,7 @@ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника = &ТаблицаПриемника", - "ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника ССЫЛКА #ТаблицаПриемника#"); + "ТИПЗНАЧЕНИЯ(ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника) = ТИП(#ТаблицаПриемника#)"); Иначе @@ -927,7 +927,7 @@ | СоответствияОбъектовИнформационныхБаз.ТипПриемника КАК ТипИсточника, | СоответствияОбъектовИнформационныхБаз.ТипИсточника КАК ТипПриемника | ИЗ - | Справочник.СценарииОбменовДанными КАК ТаблицаПриемника // СтрокаАвтоматическойЗамены + | Справочник.СценарииОбменовДанными КАК ТаблицаПриемника | ЛЕВОЕ СОЕДИНЕНИЕ | ТаблицаРегистраСоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз | ПО @@ -1022,7 +1022,7 @@ "#ТаблицаПриемникаЭтоГруппа#"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, - "Справочник.СценарииОбменовДанными КАК ТаблицаПриемника // СтрокаАвтоматическойЗамены", + "Справочник.СценарииОбменовДанными КАК ТаблицаПриемника", "#ТаблицаПриемника# КАК ТаблицаПриемника"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, @@ -1308,7 +1308,7 @@ | Неопределено КАК ТипИсточника, | &ТипПриемника КАК ТипПриемника | ИЗ - | Справочник.СценарииОбменовДанными КАК ТаблицаПриемника // СтрокаАвтоматическойЗамены + | Справочник.СценарииОбменовДанными КАК ТаблицаПриемника | ЛЕВОЕ СОЕДИНЕНИЕ | ТаблицаСопоставленныхОбъектов КАК ТаблицаСопоставленныхОбъектов | ПО @@ -1361,7 +1361,7 @@ "#ТаблицаПриемникаЭтоГруппа#"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, - "Справочник.СценарииОбменовДанными КАК ТаблицаПриемника // СтрокаАвтоматическойЗамены", + "Справочник.СценарииОбменовДанными КАК ТаблицаПриемника", "#ТаблицаПриемника# КАК ТаблицаПриемника"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаИсточника#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаИсточникаПараметр.# КАК #,")); diff --git a/SSL/src/DataProcessors/ТекущиеДела/Forms/НастройкаТекущихДел/Form.form b/SSL/src/DataProcessors/ТекущиеДела/Forms/НастройкаТекущихДел/Form.form index 71fc14ed5..a94b82369 100644 --- a/SSL/src/DataProcessors/ТекущиеДела/Forms/НастройкаТекущихДел/Form.form +++ b/SSL/src/DataProcessors/ТекущиеДела/Forms/НастройкаТекущихДел/Form.form @@ -309,6 +309,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 72 + + СтрокаПоискРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 73 + true + + ДеревоОтображаемыхДел + + true + + Left @@ -488,7 +520,6 @@ UsualGroup Vertical - Auto true true Auto @@ -654,7 +685,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/ТекущиеДела/Forms/Форма/Form.form b/SSL/src/DataProcessors/ТекущиеДела/Forms/Форма/Form.form index d8cde0f99..0bfa87b9b 100644 --- a/SSL/src/DataProcessors/ТекущиеДела/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ТекущиеДела/Forms/Форма/Form.form @@ -28,7 +28,6 @@ UsualGroup Vertical - Auto true true Auto @@ -91,7 +90,6 @@ UsualGroup Vertical - Auto true true Auto @@ -187,7 +185,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -330,7 +327,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/ТранспортСообщенийОбменаEMAIL/ObjectModule.bsl b/SSL/src/DataProcessors/ТранспортСообщенийОбменаEMAIL/ObjectModule.bsl index 8ef2e19ad..81e46e7bb 100644 --- a/SSL/src/DataProcessors/ТранспортСообщенийОбменаEMAIL/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ТранспортСообщенийОбменаEMAIL/ObjectModule.bsl @@ -12,19 +12,26 @@ Перем СтрокаСообщенияОбОшибке Экспорт; Перем СтрокаСообщенияОбОшибкеЖР Экспорт; -Перем СообщенияОшибок; // Соответствие с предопределенными сообщениями ошибок обработки. -Перем ИмяОбъекта; // имя объекта метаданных +// Соответствие с предопределенными сообщениями ошибок обработки. +Перем СообщенияОшибок; // Соответствие + +Перем ИмяОбъекта; // Имя объекта метаданных + +Перем ВременныйФайлСообщенияОбмена; // Временный файл сообщения обмена для выгрузки/загрузки данных. -Перем ВременныйФайлСообщенияОбмена; // временный файл сообщения обмена для выгрузки/загрузки данных. Перем ВременныйКаталогСообщенийОбмена; // Временный каталог для сообщений обмена. -Перем ТемаСообщения; // шаблон темы сообщения -Перем ТелоСообщенияПростое; // Текст тела сообщения с вложением - файлом XML. -Перем ТелоСообщенияСжатое; // Текст тела сообщения с вложением - сжатым файлом. -Перем ТелоСообщенияПакетное; // Текст тела сообщения с вложением - сжатый файл, в котором с набор файлов. -Перем ОбщийМодульРаботаСПочтовымиСообщениями; +Перем ТемаСообщения; // Шаблон темы сообщения +Перем ТелоСообщенияПростое; // Текст тела сообщения с вложением - файлом XML. + +Перем ТелоСообщенияСжатое; // Текст тела сообщения с вложением - сжатым файлом. + +Перем ТелоСообщенияПакетное; // Текст тела сообщения с вложением - сжатый файл, в котором с набор файлов. + +Перем ОбщийМодульРаботаСПочтовымиСообщениями; Перем ИдентификаторКаталога; + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -225,7 +232,7 @@ ИмяВременногоКаталога = ОбменДаннымиСервер.СоздатьВременныйКаталогСообщенийОбмена(ИдентификаторКаталога); Исключение ПолучитьСообщениеОбОшибке(4); - ДополнитьСообщениеОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ДополнитьСообщениеОбОшибке(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат Ложь; КонецПопытки; @@ -281,7 +288,7 @@ Результат = Ложь; ПолучитьСообщениеОбОшибке(3); - ДополнитьСообщениеОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ДополнитьСообщениеОбОшибке(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; @@ -365,7 +372,7 @@ Попытка НаборСообщений = ОбщийМодульРаботаСПочтовымиСообщениями.ЗагрузитьПочтовыеСообщения(EMAILУчетнаяЗапись, ПараметрыЗагрузки); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПолучитьСообщениеОбОшибке(103); ДополнитьСообщениеОбОшибке(ТекстОшибки); Возврат Ложь; @@ -420,7 +427,7 @@ Попытка НаборСообщений = ОбщийМодульРаботаСПочтовымиСообщениями.ЗагрузитьПочтовыеСообщения(EMAILУчетнаяЗапись, ПараметрыЗагрузки); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПолучитьСообщениеОбОшибке(105); ДополнитьСообщениеОбОшибке(ТекстОшибки); Возврат Ложь; @@ -464,12 +471,14 @@ Попытка ДвоичныеДанные.Записать(ИмяВременногоФайлаАрхива); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПолучитьСообщениеОбОшибке(106); ДополнитьСообщениеОбОшибке(ТекстОшибки); Возврат Ложь; КонецПопытки; + РегистрыСведений.АрхивСообщенийОбменов.ПоместитьСообщениеВАрхив(УзелИнформационнойБазы, ИмяВременногоФайлаАрхива); + // Распаковываем временный файл архива. УспешноРаспаковано = ОбменДаннымиСервер.РаспаковатьZipФайл(ИмяВременногоФайлаАрхива, ИмяКаталогаСообщенияОбмена(), ПарольАрхиваСообщенияОбмена); @@ -506,12 +515,14 @@ Попытка ДвоичныеДанные.Записать(ИмяФайлаСообщенияОбмена()); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПолучитьСообщениеОбОшибке(106); ДополнитьСообщениеОбОшибке(ТекстОшибки); Возврат Ложь; КонецПопытки; + РегистрыСведений.АрхивСообщенийОбменов.ПоместитьСообщениеВАрхив(ИмяФайлаСообщенияОбмена(), ИмяВременногоФайлаАрхива); + КонецЕсли; КонецЕсли; @@ -621,7 +632,7 @@ НовоеПисьмо = ОбщийМодульРаботаСПочтовымиСообщениями.ПодготовитьПисьмо(EMAILУчетнаяЗапись, ПараметрыСообщения); ОбщийМодульРаботаСПочтовымиСообщениями.ОтправитьПисьмо(EMAILУчетнаяЗапись, НовоеПисьмо); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПолучитьСообщениеОбОшибке(102); ДополнитьСообщениеОбОшибке(ТекстОшибки); Возврат Ложь; diff --git a/SSL/src/DataProcessors/ТранспортСообщенийОбменаEMAIL/ТранспортСообщенийОбменаEMAIL.mdo b/SSL/src/DataProcessors/ТранспортСообщенийОбменаEMAIL/ТранспортСообщенийОбменаEMAIL.mdo index a989d3bb0..f8a471937 100644 --- a/SSL/src/DataProcessors/ТранспортСообщенийОбменаEMAIL/ТранспортСообщенийОбменаEMAIL.mdo +++ b/SSL/src/DataProcessors/ТранспортСообщенийОбменаEMAIL/ТранспортСообщенийОбменаEMAIL.mdo @@ -49,7 +49,7 @@ Учетная запись электронной почты - CatalogRef.УчетныеЗаписиЭлектроннойПочты + DefinedType.ОбменДаннымиУчетныеЗаписиЭлектроннойПочты ru @@ -97,6 +97,18 @@ + + УзелИнформационнойБазы + + ru + Узел информационной базы + + + ExchangePlanRef + + + + Форма diff --git a/SSL/src/DataProcessors/ТранспортСообщенийОбменаFILE/ObjectModule.bsl b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFILE/ObjectModule.bsl index f722b6293..c12b8b290 100644 --- a/SSL/src/DataProcessors/ТранспортСообщенийОбменаFILE/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFILE/ObjectModule.bsl @@ -263,7 +263,7 @@ ИмяВременногоКаталога = ОбменДаннымиСервер.СоздатьВременныйКаталогСообщенийОбмена(ИдентификаторКаталога); Исключение ПолучитьСообщениеОбОшибке(6); - ДополнитьСообщениеОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ДополнитьСообщениеОбОшибке(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат Ложь; КонецПопытки; @@ -323,7 +323,7 @@ Исключение Результат = Ложь; ПолучитьСообщениеОбОшибке(5); - ДополнитьСообщениеОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ДополнитьСообщениеОбОшибке(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Архиватор = Неопределено; @@ -418,6 +418,7 @@ ШаблонИмениФайлаСообщения = СтруктураИмениФайла.ИмяБезРасширения; КонецЕсли; + РегистрыСведений.АрхивСообщенийОбменов.ПоместитьСообщениеВАрхив(УзелИнформационнойБазы, ФайлВходящегоСообщения.ПолноеИмя); Если ФайлЗапакован Тогда @@ -487,7 +488,7 @@ ТекстовыйДокумент.Записать(ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ИмяКаталогаОбменаИнформацией(), ИмяФайлаПроверки)); Исключение - ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат Ложь; КонецПопытки; @@ -501,7 +502,7 @@ УдалитьФайлы(ИмяКаталогаОбменаИнформацией(), ИмяФайлаПроверки); Исключение - ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат Ложь; КонецПопытки; @@ -521,7 +522,7 @@ СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ИмяФайлаИсточника, ИмяФайлаПриемника, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); УстановитьСтрокуСообщенияОбОшибке(СтрокаСообщения); Возврат Ложь diff --git a/SSL/src/DataProcessors/ТранспортСообщенийОбменаFILE/ТранспортСообщенийОбменаFILE.mdo b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFILE/ТранспортСообщенийОбменаFILE.mdo index b49840326..e421098b7 100644 --- a/SSL/src/DataProcessors/ТранспортСообщенийОбменаFILE/ТранспортСообщенийОбменаFILE.mdo +++ b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFILE/ТранспортСообщенийОбменаFILE.mdo @@ -74,6 +74,18 @@ + + УзелИнформационнойБазы + + ru + Узел информационной базы + + + ExchangePlanRef + + + + Форма diff --git a/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ObjectModule.bsl b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ObjectModule.bsl index 838c7a058..1b75876dc 100644 --- a/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ObjectModule.bsl @@ -246,7 +246,7 @@ ИмяВременногоКаталога = ОбменДаннымиСервер.СоздатьВременныйКаталогСообщенийОбмена(ИдентификаторКаталога); Исключение ПолучитьСообщениеОбОшибке(4); - ДополнитьСообщениеОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ДополнитьСообщениеОбОшибке(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат Ложь; КонецПопытки; @@ -302,7 +302,7 @@ Результат = Ложь; ПолучитьСообщениеОбОшибке(3); - ДополнитьСообщениеОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ДополнитьСообщениеОбОшибке(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; @@ -363,7 +363,7 @@ Попытка FTPСоединение = ПолучитьFTPСоединение(ТаймаутОтправкиПолученияДанных); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПолучитьСообщениеОбОшибке(102); ДополнитьСообщениеОбОшибке(ТекстОшибки); Возврат Ложь; @@ -373,7 +373,7 @@ Попытка МассивНайденныхФайлов = FTPСоединение.НайтиФайлы(КаталогНаFTPСервере, ШаблонИмениФайлаСообщенияДляПоиска + ".*", Ложь); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПолучитьСообщениеОбОшибке(104); ДополнитьСообщениеОбОшибке(ТекстОшибки); Возврат Ложь; @@ -435,6 +435,8 @@ ФайлЗапакован = (ВРег(ФайлВходящегоСообщения.Расширение) = ".ZIP"); + РегистрыСведений.АрхивСообщенийОбменов.ПоместитьСообщениеВАрхив(УзелИнформационнойБазы, ФайлВходящегоСообщения.ПолноеИмя); + Если ФайлЗапакован Тогда // Получаем имя для временного файла архива. @@ -443,7 +445,7 @@ Попытка FTPСоединение.Получить(ФайлВходящегоСообщения.ПолноеИмя, ИмяВременногоФайлаАрхива); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПолучитьСообщениеОбОшибке(105); ДополнитьСообщениеОбОшибке(ТекстОшибки); Возврат Ложь; @@ -485,7 +487,7 @@ Попытка FTPСоединение.Получить(ФайлВходящегоСообщения.ПолноеИмя, ИмяФайлаСообщенияОбмена()); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПолучитьСообщениеОбОшибке(105); ДополнитьСообщениеОбОшибке(ТекстОшибки); Возврат Ложь; @@ -601,7 +603,7 @@ Попытка FTPСоединение = ПолучитьFTPСоединение(Таймаут); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПолучитьСообщениеОбОшибке(102); ДополнитьСообщениеОбОшибке(ТекстОшибки); Возврат Ложь; @@ -619,7 +621,7 @@ Попытка FTPСоединение.Записать(ИмяФайлаИсточника, КаталогНаСервере + ИмяФайлаПриемника); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПолучитьСообщениеОбОшибке(103); ДополнитьСообщениеОбОшибке(ТекстОшибки); Возврат Ложь; @@ -628,7 +630,7 @@ Попытка МассивФайлов = FTPСоединение.НайтиФайлы(КаталогНаСервере, ИмяФайлаПриемника, Ложь); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПолучитьСообщениеОбОшибке(104); ДополнитьСообщениеОбОшибке(ТекстОшибки); Возврат Ложь; @@ -648,7 +650,7 @@ Попытка FTPСоединение = ПолучитьFTPСоединение(ТаймаутПроверкиСоединения); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПолучитьСообщениеОбОшибке(102); ДополнитьСообщениеОбОшибке(ТекстОшибки); Возврат Ложь; @@ -657,7 +659,7 @@ Попытка FTPСоединение.Удалить(КаталогНаСервере + ИмяФайла); Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПолучитьСообщениеОбОшибке(106); ДополнитьСообщениеОбОшибке(ТекстОшибки); diff --git a/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ТранспортСообщенийОбменаFTP.mdo b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ТранспортСообщенийОбменаFTP.mdo index 6d4dc5c3c..f65f4c7bc 100644 --- a/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ТранспортСообщенийОбменаFTP.mdo +++ b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ТранспортСообщенийОбменаFTP.mdo @@ -150,6 +150,18 @@ + + УзелИнформационнойБазы + + ru + Узел информационной базы + + + ExchangePlanRef + + + + Форма diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ВыборОбъектовМетаданныхПоПодсистемам/Form.form b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ВыборОбъектовМетаданныхПоПодсистемам/Form.form index 4907dc3f0..15cc20bc0 100644 --- a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ВыборОбъектовМетаданныхПоПодсистемам/Form.form +++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ВыборОбъектовМетаданныхПоПодсистемам/Form.form @@ -93,6 +93,34 @@ Vertical
        + + true + true + + true + + СтрокаПоиска + 48 + + СтрокаПоискаРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 49 + true + + ДеревоРазделовПоиска + + true + + КоманднаяПанель 31 @@ -271,7 +299,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/НастройкиУдаленияОбъектов/Form.form b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/НастройкиУдаленияОбъектов/Form.form index 16ebf3ae7..51b932c13 100644 --- a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/НастройкиУдаленияОбъектов/Form.form +++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/НастройкиУдаленияОбъектов/Form.form @@ -519,7 +519,6 @@ UsualGroup Vertical - Auto Button NormalSeparation true @@ -627,7 +626,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -693,7 +691,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -838,6 +835,34 @@ + + true + true + + true + + СтрокаПоиска + 85 + + СтрокаПоискаРасширеннаяПодсказка + 87 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 86 + true + + НастройкиОтображенияОбъектов + + true + + Left true diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/НастройкиУдаленияОбъектов/Module.bsl b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/НастройкиУдаленияОбъектов/Module.bsl index 8b9a4ce5f..35cfef9ff 100644 --- a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/НастройкиУдаленияОбъектов/Module.bsl +++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/НастройкиУдаленияОбъектов/Module.bsl @@ -212,7 +212,7 @@ Функция РеквизитыМетаданных(Знач ОбъектМетаданных) Результат = Новый СписокЗначений; - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ОбъектМетаданных); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ОбъектМетаданных); Для Каждого Реквизит Из ОбъектМетаданных.Реквизиты Цикл Результат.Добавить(Реквизит.Имя, Реквизит.Синоним); КонецЦикла; diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Form.form b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Form.form index 0c9ad4b12..9405f65b6 100644 --- a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Form.form +++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Form.form @@ -96,7 +96,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -720,6 +719,34 @@ UserCmds Auto + + true + true + + true + + СтрокаПоискаНаУдаление + 737 + + СтрокаПоискаНаУдалениеРасширеннаяПодсказка + 739 + Label + true + true + + Left + + + + СтрокаПоискаНаУдалениеКонтекстноеМеню + 738 + true + + ДеревоПомеченныхНаУдаление + + true + + true true @@ -882,7 +909,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2013,6 +2039,34 @@ НеУдаленныеКоманднаяПанель 222 + + true + true + + true + + СтрокаПоискаНеудаленные + 740 + + СтрокаПоискаНеудаленныеРасширеннаяПодсказка + 742 + Label + true + true + + Left + + + + СтрокаПоискаНеудаленныеКонтекстноеМеню + 741 + true + + НеУдаленные + + true + + Left @@ -2243,7 +2297,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2451,6 +2504,34 @@ СвязиНеУдаленныхКоманднаяПанель 237 + + true + true + + true + + СтрокаПоискаМестаИспользованияНеудаленных + 743 + + СтрокаПоискаМестаИспользованияНеудаленныхРасширеннаяПодсказка + 745 + Label + true + true + + Left + + + + СтрокаПоискаМестаИспользованияНеудаленныхКонтекстноеМеню + 744 + true + + МестаИспользованияНеудаленных + + true + + Left @@ -2731,7 +2812,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2810,7 +2890,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2839,7 +2918,6 @@ UsualGroup HorizontalIfPossible - Auto true true Equal @@ -3089,7 +3167,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Module.bsl b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Module.bsl index 890712daa..59743b8bb 100644 --- a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Module.bsl +++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Module.bsl @@ -10,14 +10,13 @@ // Информация о текущем выполняемом фоновом задании &НаКлиенте -Перем ВыполняемаяОперация;// Неопределено, см. ДлительныеОперации.ВыполнитьФункцию +Перем ВыполняемаяОперация; // см. ДлительныеОперации.ВыполнитьФункцию &НаКлиенте -Перем ПредставлениеОперации;// Строка +Перем ПредставлениеОперации; // Строка -// Результат, который возвращает УдалениеПомеченныхОбъектовКлиент.НачатьУдалениеПомеченных &НаКлиенте -Перем СведенияОРезультатахУдаления;// см. УдалениеПомеченныхОбъектовСлужебныйКлиентСервер.НовыйСведенияОРезультатахУдаления, Неопределено +Перем СведенияОРезультатахУдаления; // см. УдалениеПомеченныхОбъектовСлужебныйКлиентСервер.НовыйСведенияОРезультатахУдаления &НаКлиенте Перем ОчередьЗаданийФормы; // Массив из Строка @@ -590,56 +589,51 @@ Возврат; КонецЕсли; - Изменения = УстановитьСнятьПометкуУдаленияНаСервере(СсылкиДляОбработки); - Если ТипЗнч(Изменения) = Тип("Строка") Тогда - Ошибка = НСтр("ru='Произошла ошибка при изменении пометки удаления по причине:'") - + Символы.ПС + Изменения; - ПоказатьПредупреждение(, Ошибка,, - НСтр("ru='Ошибка при изменении пометки удаления.'")); - Иначе + Изменения = Неопределено; + Попытка + Изменения = УстановитьСнятьПометкуУдаленияНаСервере(СсылкиДляОбработки); + Исключение + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = НСтр("ru='Не удалось изменить пометку удаления по причине:'") + + Символы.ПС + ТекстОшибки; + ПоказатьПредупреждение(, ТекстОшибки); + КонецПопытки; + + Если Изменения <> Неопределено Тогда СтандартныеПодсистемыКлиент.ОповеститьФормыОбИзменении(Изменения); - КонецЕсли; - + КонецЕсли; СтандартныеПодсистемыКлиент.РазвернутьУзлыДерева(ЭтотОбъект, "НеУдаленные", "*", Истина); КонецПроцедуры &НаСервере Функция УстановитьСнятьПометкуУдаленияНаСервере(Ссылки) - Кеш = Новый Соответствие; - - Результат = Новый Массив; Попытка Изменения = УдалениеПомеченныхОбъектовСлужебный.СнятьУстановитьПометкуУдаления(Ссылки); Исключение - Ошибка = ИнформацияОбОшибке(); ЗаписьЖурналаРегистрации( НСтр("ru='Удаление помеченных.Установка / снятие пометки удаления'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(Ошибка)); - Возврат КраткоеПредставлениеОшибки(Ошибка); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение; КонецПопытки; + Результат = Новый Массив; ДеревоНеудаленные = РеквизитФормыВЗначение("НеУдаленные"); + ИнформацияОТипах = УдалениеПомеченныхОбъектовСлужебный.ИнформацияОТипах(Изменения.ВыгрузитьКолонку("Ссылка")); + Для каждого Изменение Из Изменения Цикл - ИнформацияОТипе = УдалениеПомеченныхОбъектовСлужебный.ИнформацияОТипе( - ТипЗнч(Изменение.Ссылка), - Кеш); + ИнформацияОТипе = ИнформацияОТипах[ТипЗнч(Изменение.Ссылка)]; // см. УдалениеПомеченныхОбъектовСлужебный.ИнформацияОТипе СтрокиМетаданных = ДеревоНеудаленные.Строки.НайтиСтроки( - Новый Структура("УдаляемыйСсылка", ВРег(ИнформацияОТипе.ПолноеИмя)))[0].Строки; - Данные = СтрокиМетаданных.НайтиСтроки( - Новый Структура("УдаляемыйСсылка", Изменение.Ссылка))[0]; + Новый Структура("УдаляемыйСсылка", ИнформацияОТипе.ПолноеИмя))[0].Строки; + Данные = СтрокиМетаданных.НайтиСтроки(Новый Структура("УдаляемыйСсылка", Изменение.Ссылка))[0]; - Данные.НомерКартинки = УдалениеПомеченныхОбъектовСлужебный.НомерКартинки( - Изменение.Ссылка, - ИнформацияОТипе.Ссылочный, - ИнформацияОТипе.Вид, - ?(Изменение.НовоеЗначениеПометкиУдаления = Истина, "Удален", Неопределено)); - - Результат.Добавить(Изменение.Ссылка); - + Данные.НомерКартинки = УдалениеПомеченныхОбъектовСлужебный.НомерКартинки(Изменение.Ссылка, + ИнформацияОТипе.Ссылочный, ИнформацияОТипе.Вид, + ?(Изменение.НовоеЗначениеПометкиУдаления = Истина, "Удален", Неопределено)); + Результат.Добавить(Изменение.Ссылка); + Если НЕ Изменение.НовоеЗначениеПометкиУдаления Тогда ЭлементыБезПометкиУдаления.Добавить(Изменение.Ссылка); Иначе @@ -648,12 +642,12 @@ ЭлементыБезПометкиУдаления.Удалить(ЭлементСписка); КонецЕсли; КонецЕсли; - + КонецЦикла; - - ЗначениеВРеквизитФормы(ДеревоНеудаленные, "НеУдаленные"); - + + ЗначениеВРеквизитФормы(ДеревоНеудаленные, "НеУдаленные"); Возврат СтандартныеПодсистемыСервер.ПодготовитьОповещениеФормОбИзменении(Результат); + КонецФункции #КонецОбласти @@ -679,6 +673,7 @@ Элементы.ГруппаНастройкиОтбораПоиска.Доступность = Истина; Элементы.ПредставлениеПрогресса.Видимость = Ложь; Элементы.ДеревоПомеченныхНаУдалениеУдалитьВыбранные.КнопкаПоУмолчанию = Истина; + Элементы.СтрокаПоискаНаУдаление.Видимость = Истина; КонецПроцедуры &НаСервере @@ -698,6 +693,7 @@ Элементы.ПредставлениеПрогресса.Видимость = Ложь; Элементы.ДеревоПомеченныхНаУдалениеУдалитьВыбранные.КнопкаПоУмолчанию = Истина; Элементы.ГруппаАктивныПослеПоискаПомеченные.Доступность = ДеревоПомеченныхНаУдаление.ПолучитьЭлементы().Количество() > 0;; + Элементы.СтрокаПоискаНаУдаление.Видимость = Ложь; КонецПроцедуры &НаСервере @@ -720,6 +716,7 @@ Элементы.КоманднаяПанельФормы.Видимость = Истина; Элементы.ВыполнитьДействияИУдалить.КнопкаПоУмолчанию = Истина; Элементы.СсылкаПодробнее.Видимость = Ложь; + Элементы.СтрокаПоискаНаУдаление.Видимость = Ложь; КонецПроцедуры &НаСервере @@ -746,6 +743,7 @@ Элементы.ГруппаНеУдаленные.Видимость = Ложь; КонецЕсли; Элементы.СсылкаПодробнее.Видимость = Ложь; + Элементы.СтрокаПоискаНаУдаление.Видимость = Ложь; КонецПроцедуры #КонецОбласти @@ -974,8 +972,7 @@ Возврат; КонецЕсли; ПараметрДействия = ?(ДополнительныеПараметры.КоличествоВсего = ДополнительныеПараметры.КоличествоВыбранных, - "ПолноеУдаление", - ""); + "ПолноеУдаление", ""); ДобавитьЗадание(ЗаданияФормы().УдалениеПомеченных, ПараметрДействия); ЗапуститьЗадание(); КонецПроцедуры @@ -1011,7 +1008,7 @@ Результат = Новый СписокЗначений; Для каждого ВыбранныеМетаданные Из ОтборМетаданных Цикл - Если Метаданные.НайтиПоПолномуИмени(ВыбранныеМетаданные.Значение) = Неопределено Тогда + Если ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ВыбранныеМетаданные.Значение) = Неопределено Тогда Продолжить; КонецЕсли; @@ -1027,7 +1024,7 @@ Перем УстановленныйОтбор; УстановленныйОтбор = Новый СписокЗначений; Для Каждого Элемент Из Параметры.ОтборМетаданных Цикл - УстановленныйОтбор.Добавить(Элемент.Значение, Метаданные.НайтиПоПолномуИмени(Элемент.Значение).Представление()); + УстановленныйОтбор.Добавить(Элемент.Значение, ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Элемент.Значение).Представление()); КонецЦикла; УстановитьОтборМетаданных(ЭтотОбъект, УстановленныйОтбор); Параметры.ОтборМетаданных = УстановленныйОтбор; @@ -1594,8 +1591,8 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); Результат.Успешно = Ложь; - Результат.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + Результат.КраткоеПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + Результат.ПодробноеПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); ИнформацияОбОшибке = ИнформацияОбОшибке(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Удаление помеченных'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, @@ -1662,12 +1659,9 @@ СведенияОРезультатахУдаления = ОбработатьРезультатУдаленияОшибка(ЭтотОбъект, Результат); ИначеЕсли Результат.Статус = "Выполнено" Тогда - - СведенияОРезультатахУдаления = ОбработатьРезультатУдаленияУспех( - Результат, - УникальныйИдентификаторСУчетомВладельца(), - СведенияОРезультатахУдаления); - + УникальныйИдентификаторСУчетомВладельца = ?(ВладелецФормы = Неопределено, УникальныйИдентификатор, ВладелецФормы.УникальныйИдентификатор); + СведенияОРезультатахУдаления = ОбработатьРезультатУдаленияУспех(Результат, + УникальныйИдентификаторСУчетомВладельца, СведенияОРезультатахУдаления); ОбщегоНазначенияКлиент.ОповеститьОбИзмененииОбъектов(СведенияОРезультатахУдаления.Удаленные); КонецЕсли; @@ -1688,15 +1682,14 @@ &НаСервере Функция ОбработатьРезультатУдаленияУспех(Результат, УникальныйИдентификаторФормы, СведенияОРезультатахУдаления) - СведенияОРезультатахУдаления = ЗагрузитьРезультатУдаления( - Результат, - УникальныйИдентификаторФормы, - СведенияОРезультатахУдаления); - + + СведенияОРезультатахУдаления = ЗагрузитьРезультатУдаления(Результат, + УникальныйИдентификаторФормы, СведенияОРезультатахУдаления); ОбработатьРезультатВыполненияУдаления(СведенияОРезультатахУдаления); УстановитьМонопольныйРежимНаСервере(Ложь); Возврат СведенияОРезультатахУдаления; + КонецФункции // Параметры: @@ -1746,7 +1739,6 @@ Возврат Результат; КонецФункции -// Дополняет/формирует сведения о результате удаления для клиентского АПИ. &НаСервере Функция СформироватьРезультатУдаления(СведенияОРезультате, РезультатВыполненияВФоне, ИдентификаторХранилищаРезультата) Результат = ?(СведенияОРезультате = Неопределено, @@ -1757,9 +1749,7 @@ ПолучитьИзВременногоХранилища(Результат.АдресРезультата), УдалениеПомеченныхОбъектовСлужебный.ПрепятствующиеУдалению()); - Результат.Удаленные = УдалениеПомеченныхОбъектовСлужебный.ОбъединениеМассивов( - Результат.Удаленные, - РезультатВыполненияВФоне.Удаленные); + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат.Удаленные, РезультатВыполненияВФоне.Удаленные); Результат.УдаленныеКоличество = РезультатВыполненияВФоне.КоличествоУдаленных + Результат.УдаленныеКоличество; Результат.НеУдаленныеКоличество = РезультатВыполненияВФоне.КоличествоНеУдаленных + Результат.НеУдаленныеКоличество; Результат.Успешно = Результат.УдаленныеКоличество > 0 И Результат.НеУдаленныеКоличество = 0; @@ -1894,11 +1884,6 @@ #КонецОбласти -&НаКлиенте -Функция УникальныйИдентификаторСУчетомВладельца() - Возврат ?(ВладелецФормы = Неопределено, УникальныйИдентификатор, ВладелецФормы.УникальныйИдентификатор); -КонецФункции - &НаСервере Процедура ЗаполнитьКоллекциюЭлементовДереваДанныхФормы(ДанныеФормы, ДеревоЗначений) СтрокиДанныхФормы = ДанныеФормы.ПолучитьЭлементы(); diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/ManagerModule.bsl b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/ManagerModule.bsl index 791bf3626..65600f00d 100644 --- a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/ManagerModule.bsl +++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/ManagerModule.bsl @@ -10,15 +10,23 @@ #Область СлужебныеПроцедурыИФункции -Функция УдалитьПомеченныеОбъекты(ПараметрыВыполнения, ИдентификаторЗадания = Неопределено) Экспорт +// Удалить помеченные объекты. +// +// Параметры: +// ПараметрыУдаления - см. ПараметрыУдаления +// ИдентификаторЗадания - УникальныйИдентификатор +// +// Возвращаемое значение: +// см. РезультатУдаления +// +Функция УдалитьПомеченныеОбъекты(ПараметрыУдаления, ИдентификаторЗадания = Неопределено) Экспорт Если НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда ВызватьИсключение НСтр("ru = 'Недостаточно прав для выполнения операции.'"); КонецЕсли; - Замер = ТекущаяУниверсальнаяДатаВМиллисекундах(); - - УдалениеПомеченныхОбъектовПереопределяемый.ПередПоискомПомеченныхНаУдаление(ПараметрыВыполнения); + Замер = ТекущаяУниверсальнаяДатаВМиллисекундах(); + УдалениеПомеченныхОбъектовПереопределяемый.ПередПоискомПомеченныхНаУдаление(ПараметрыУдаления); // АПК:222 Для обратной совместимости. Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); @@ -26,18 +34,18 @@ КонецЕсли; Попытка - УдаляемыеОбъекты = ПараметрыВыполнения.ПользовательскиеОбъекты; - ПараметрыУдаления = ПараметрыУдаления(УдаляемыеОбъекты, ПараметрыВыполнения); + УдаляемыеОбъекты = ПараметрыУдаления.ПользовательскиеОбъекты; + РезультатУдаления = РезультатУдаления(УдаляемыеОбъекты, ПараметрыУдаления); // Для отмены задания с клиента Если ЗначениеЗаполнено(ИдентификаторЗадания)Тогда - ПараметрыУдаления.ИдентификаторЗадания = ИдентификаторЗадания; + РезультатУдаления.ИдентификаторЗадания = ИдентификаторЗадания; КонецЕсли; - Если ПараметрыУдаления.Монопольно Тогда - УдалитьПомеченныеОбъектыМонопольно(УдаляемыеОбъекты, ПараметрыУдаления); + Если РезультатУдаления.Монопольно Тогда + УдалитьПомеченныеОбъектыМонопольно(УдаляемыеОбъекты, РезультатУдаления); Иначе - УдалитьПомеченныеОбъектыКонкурентно(УдаляемыеОбъекты, ПараметрыУдаления); + УдалитьПомеченныеОбъектыКонкурентно(УдаляемыеОбъекты, РезультатУдаления); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда @@ -54,20 +62,20 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); - МодульВзаимодействия.ПослеУдаленияПомеченных(ПараметрыУдаления); + МодульВзаимодействия.ПослеУдаленияПомеченных(РезультатУдаления); КонецЕсли; Замер = ТекущаяУниверсальнаяДатаВМиллисекундах() - Замер; - ОтправитьСтатистику(ПараметрыВыполнения.Режим, Замер, ПараметрыУдаления.Всего); + ОтправитьСтатистику(ПараметрыУдаления.Режим, Замер, РезультатУдаления.Всего); - Возврат ПараметрыУдаления; + Возврат РезультатУдаления; КонецФункции #Область КонкурентноеУдаление // Параметры: // УдаляемыеОбъекты - Массив из ЛюбаяСсылка -// ПараметрыУдаления - см. ПараметрыУдаления +// ПараметрыУдаления - см. РезультатУдаления // Процедура УдалитьПомеченныеОбъектыКонкурентно(УдаляемыеОбъекты, ПараметрыУдаления) @@ -83,21 +91,18 @@ #Область ПреобразованиеКФорматуРезультата // Параметры: -// ПараметрыУдаления - см. ПараметрыУдаления +// ПараметрыУдаления - см. РезультатУдаления // НеУдаленные - см. РезультатОбработки // Процедура ОтразитьНеУдаленные(ПараметрыУдаления, НеУдаленные) - Если Не (ПараметрыУдаления.Свойство("ИнформацияОТипах")) Тогда - ПараметрыУдаления.Вставить("ИнформацияОТипах", Новый Соответствие); - КонецЕсли; Для Каждого Элемент Из НеУдаленные Цикл + Если Элемент = Неопределено Тогда Продолжить; КонецЕсли; - // Объект может быть не удален из-за ПометкаУдаления = Ложь, - // но удален как подчиненный + // Объект может быть не удален из-за ПометкаУдаления = Ложь, но удален как подчиненный. Если ОбъектУдален(Элемент.УдаляемыйСсылка) Тогда Продолжить; КонецЕсли; @@ -109,16 +114,15 @@ Если Элемент.РезультатУдаления = КодыРезультатаУдаления().ОшибкаПриУдалении Тогда Причина = ПараметрыУдаления.ПрепятствующиеУдалению.Добавить(); - Причина.УдаляемыйСсылка = Элемент.УдаляемыйСсылка; - Причина.ОписаниеОшибки = КраткоеПредставлениеОшибки(Элемент.ИнформацияОбОшибке) + Элемент.Сообщения; - Причина.ПодробноеОписаниеОшибки = ПодробноеПредставлениеОшибки(Элемент.ИнформацияОбОшибке); + Причина.УдаляемыйСсылка = Элемент.УдаляемыйСсылка; + Причина.ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(Элемент.ИнформацияОбОшибке) + Элемент.Сообщения; + Причина.ПодробноеОписаниеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(Элемент.ИнформацияОбОшибке); ИначеЕсли Элемент.РезультатУдаления = КодыРезультатаУдаления().НеПомеченНаУдаление Тогда Причина = ПараметрыУдаления.ПрепятствующиеУдалению.Добавить(); Причина.УдаляемыйСсылка = Элемент.УдаляемыйСсылка; Причина.ОписаниеОшибки = НСтр("ru='Удаляемый объект не помечен на удаление'"); КонецЕсли; - - СформироватьИнформациюОТипах(ПараметрыУдаления, ТипЗнч(Элемент.УдаляемыйСсылка)) + КонецЦикла; КонецПроцедуры @@ -151,7 +155,7 @@ #Область УдалениеОбъектов // Параметры: -// ПараметрыУдаления - см. ПараметрыУдаления +// ПараметрыУдаления - см. РезультатУдаления // УдаляемыеОбъекты - см. УдаляемыеОбъекты // СведенияОМетаданных - см. СведенияОМетаданных // @@ -166,7 +170,8 @@ Для Каждого ЭлементОчереди Из УдаляемыеОбъекты Цикл Если НЕ Пакет.Найти(ЭлементОчереди.УдаляемыйСсылка, "УдаляемыйСсылка") <> Неопределено Тогда - ЭлементОчередиВПакете = ЭлементОчередиВПакет(ЭлементОчереди, СведенияОМетаданных, Пакет); + // @skip-check query-in-loop - Порционная обработка больших объемов данных. + ЭлементОчередиВПакете = ЭлементОчередиВПакет(ЭлементОчереди, СведенияОМетаданных, Пакет); Если ЗапрещенаОбработкаЭлемента(ЭлементОчередиВПакете) Тогда ОбъектыСЗапретомУдаления = ОбъединениеТаблиц(ОбъектыСЗапретомУдаления, ЭлементОчередиВПакете); @@ -388,7 +393,7 @@ #Область ОчисткаСсылокНаУдаляемыеОбъекты // Параметры: -// ПараметрыУдаления - см. ПараметрыУдаления +// ПараметрыУдаления - см. РезультатУдаления // РезультатОбработкиПакета - см. РезультатОбработки // Процедура ОчиститьСсылкиНаУдаляемыеОбъекты(ПараметрыУдаления, РезультатОбработкиПакета) @@ -521,6 +526,7 @@ // см. ТаблицаДочернихПодчиненныхЭлементов // Функция ДочерниеПодчиненныеЭлементы(УдаляемыйСсылка, ИнформацияОМетаданных) + УстановитьПривилегированныйРежим(Истина); ДочерниеПодчиненныеЭлементы = ТаблицаДочернихПодчиненныхЭлементов(); @@ -544,16 +550,19 @@ Если ИнформацияОМетаданных.ОписаниеПодчиненныхОбъектов.Количество() > 0 Тогда ВыборкаПодчиненныхЭлементов = РезультатПакета[РезультатПакета.Количество()-1].Выбрать(); - ДочерниеПодчиненныеЭлементы = ОбъединениеТаблиц(ДочерниеПодчиненныеЭлементы, ПодчиненныеЭлементы(ВыборкаПодчиненныхЭлементов)); + ДочерниеПодчиненныеЭлементы = ОбъединениеТаблиц(ДочерниеПодчиненныеЭлементы, + ПодчиненныеЭлементы(ВыборкаПодчиненныхЭлементов)); КонецЕсли; Если ИнформацияОМетаданных.Иерархический Тогда ВыборкаДочернихЭлементов = РезультатПакета[0].Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); - ДочерниеПодчиненныеЭлементы = ОбъединениеТаблиц(ДочерниеПодчиненныеЭлементы, ДочерниеЭлементы(УдаляемыйСсылка, ВыборкаДочернихЭлементов)); + ДочерниеПодчиненныеЭлементы = ОбъединениеТаблиц(ДочерниеПодчиненныеЭлементы, + ДочерниеЭлементы(УдаляемыйСсылка, ВыборкаДочернихЭлементов)); КонецЕсли; КонецЕсли; Возврат ДочерниеПодчиненныеЭлементы; + КонецФункции // Рекурсивно формирует таблицу дочерних элементов. @@ -671,20 +680,14 @@ // РезультатОбработки - см. РезультатОбработки // Функция ОбъединитьРезультатУдаления(РезультатыУдаления, РезультатОбработки) + Результат = РезультатОбработки(); - - Результат.НеудаленныеОбъекты = ОбъединениеТаблиц( - РезультатыУдаления.НеудаленныеОбъекты, - РезультатОбработки.НеудаленныеОбъекты); - Результат.МестаИспользования = ОбъединениеТаблиц( - РезультатыУдаления.МестаИспользования, - РезультатОбработки.МестаИспользования); - - Результат.УдаленныеОбъекты = УдалениеПомеченныхОбъектовСлужебный.ОбъединениеМассивов( - РезультатыУдаления.УдаленныеОбъекты, - РезультатОбработки.УдаленныеОбъекты); - + Результат.НеудаленныеОбъекты = ОбъединениеТаблиц(РезультатыУдаления.НеудаленныеОбъекты, РезультатОбработки.НеудаленныеОбъекты); + Результат.МестаИспользования = ОбъединениеТаблиц(РезультатыУдаления.МестаИспользования, РезультатОбработки.МестаИспользования); + Результат.УдаленныеОбъекты = ОбщегоНазначения.СкопироватьРекурсивно(РезультатыУдаления.УдаленныеОбъекты); + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат.УдаленныеОбъекты, РезультатОбработки.УдаленныеОбъекты); Возврат Результат; + КонецФункции // Параметры: @@ -729,7 +732,7 @@ КонецФункции // Параметры: -// ПараметрыУдаления - см. ПараметрыУдаления +// ПараметрыУдаления - см. РезультатУдаления // РезультатОбработкиПакета - см. РезультатОбработки // Элемент - см. ПакетУдаляемыхОбъектов // РезультатУдаления - см. УдалитьЭлементПакета @@ -777,7 +780,7 @@ // Обработать пакет в одной транзакции. // // Параметры: -// ПараметрыУдаления - см. ПараметрыУдаления +// ПараметрыУдаления - см. РезультатУдаления // Пакет - см. ПакетУдаляемыхОбъектов // // Возвращаемое значение: @@ -807,20 +810,17 @@ КонецЦикла; ЗафиксироватьТранзакцию(); - ПослеУдаленияГруппыОбъектов(Контекст, Истина); Исключение - // Не смогли удалить ни один объект - // Будем отображать ошибку, произошедшую на предыдущем этапе удаления ОтменитьТранзакцию(); Результат.НеудаленныеОбъекты = Пакет.Скопировать(); - ПослеУдаленияГруппыОбъектов(Контекст, Истина); КонецПопытки; + ПослеУдаленияГруппыОбъектов(Контекст, Истина); Возврат Результат; КонецФункции // Параметры: -// ПараметрыУдаления - см. ПараметрыУдаления +// ПараметрыУдаления - см. РезультатУдаления // Элемент - СтрокаТаблицыЗначений: см. ПакетУдаляемыхОбъектов // МестаИспользования - см. МестаИспользования // НеудаленныеЭлементы - Массив из ЛюбаяСсылка @@ -897,8 +897,8 @@ Функция ЗаписьСуществует(СведенияОМестеИспользования) МенеджерРегистра = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(СведенияОМестеИспользования.Метаданные.ПолноеИмя());// РегистрСведенийМенеджер, РегистрБухгалтерииМенеджер, РегистрРасчетаМенеджер, РегистрНакопленияМенеджер Набор = МенеджерРегистра.СоздатьНаборЗаписей(); - Для Сч = 0 По Набор.Отбор.Количество() - 1 Цикл - ЭлементОтбора = Набор.Отбор[Сч]; + Для Индекс = 0 По Набор.Отбор.Количество() - 1 Цикл + ЭлементОтбора = Набор.Отбор[Индекс]; ЭлементОтбора.Установить(СведенияОМестеИспользования.МестоИспользования[ЭлементОтбора.Имя]); КонецЦикла; Набор.Прочитать(); @@ -906,28 +906,17 @@ КонецФункции Функция СсылкаВВедущемИзмерении(СведенияОМестеИспользования) - Результат = Ложь; - МетаданныеМестаИспользования = СведенияОМестеИспользования.Метаданные; - Контейнер = Новый Структура("Измерения", Новый Массив); - ЗаполнитьЗначенияСвойств(Контейнер, МетаданныеМестаИспользования); - Измерения = Контейнер.Измерения; // КоллекцияОбъектовМетаданных + ИменаИзмерений = УдалениеПомеченныхОбъектовПовтИсп.ВедущиеИзмеренияРегистра(СведенияОМестеИспользования.Метаданные.ПолноеИмя()); + Измерения = Новый Структура(ИменаИзмерений); + ЗаполнитьЗначенияСвойств(Измерения, СведенияОМестеИспользования.МестоИспользования); Для каждого Измерение Из Измерения Цикл - Контейнер = Новый Структура(); - Контейнер.Вставить("Ведущее", Ложь); - Контейнер.Вставить(Измерение.Имя); - ЗаполнитьЗначенияСвойств(Контейнер, Измерение); - ЗаполнитьЗначенияСвойств(Контейнер, СведенияОМестеИспользования.МестоИспользования); - - Если Контейнер.Ведущее - И Контейнер[Измерение.Имя] = СведенияОМестеИспользования.УдаляемыйСсылка Тогда - - Результат = Истина; - Прервать; + Если Измерение.Значение = СведенияОМестеИспользования.УдаляемыйСсылка Тогда + Возврат Истина; КонецЕсли; КонецЦикла; + Возврат Ложь; - Возврат Результат; КонецФункции // Параметры: @@ -973,7 +962,7 @@ КонецПроцедуры // Параметры: -// ПараметрыУдаления - см. ПараметрыУдаления +// ПараметрыУдаления - см. РезультатУдаления // Процедура ОповеститьОПрогрессе(ПараметрыВыполнения) ТекущееВремя = ТекущаяУниверсальнаяДатаВМиллисекундах(); @@ -1024,33 +1013,28 @@ Для Каждого СведенияОМестеИспользования Из МестаИспользования Цикл ЭтоСсылка = СведенияОМестеИспользования.МестоИспользования <> Неопределено И ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(СведенияОМестеИспользования.МестоИспользования, "ВерсияДанных"); - ЭтоКонстанта = Метаданные.Константы.Содержит(СведенияОМестеИспользования.Метаданные); Если ЭтоСсылка - И (НЕ ОбъектУдален(СведенияОМестеИспользования.МестоИспользования) - ИЛИ СведенияОМестеИспользования.МестоИспользования = СсылкаИсключение) - И НЕ СведенияОМестеИспользования.ЭтоСлужебныеДанные Тогда + И (НЕ ОбъектУдален(СведенияОМестеИспользования.МестоИспользования) + ИЛИ СведенияОМестеИспользования.МестоИспользования = СсылкаИсключение) + И НЕ СведенияОМестеИспользования.ЭтоСлужебныеДанные Тогда ЗаполнитьЗначенияСвойств(Результат.Добавить(), СведенияОМестеИспользования); КонецЕсли; Если ОбщегоНазначения.ЭтоПоследовательность(СведенияОМестеИспользования.Метаданные) Тогда - // Если ссылка есть в таблице границ, но больше её нигде нет, то данные можно удалить. + // Если ссылка есть в таблице границ, но больше ее нигде нет, то данные можно удалить. Продолжить; КонецЕсли; - Если НЕ ЭтоСсылка - И НЕ ЭтоКонстанта - И ЗаписьСуществует(СведенияОМестеИспользования) - И НЕ СведенияОМестеИспользования.ЭтоСлужебныеДанные - И НЕ СсылкаВВедущемИзмерении(СведенияОМестеИспользования) Тогда - + Если НЕ ЭтоСсылка И НЕ ЭтоКонстанта И НЕ СведенияОМестеИспользования.ЭтоСлужебныеДанные + И ЗаписьСуществует(СведенияОМестеИспользования) + И НЕ СсылкаВВедущемИзмерении(СведенияОМестеИспользования) Тогда ЗаполнитьЗначенияСвойств(Результат.Добавить(), СведенияОМестеИспользования); КонецЕсли; - Если НЕ ЭтоСсылка - И ЭтоКонстанта - И СведенияОМестеИспользования.МестоИспользования = Неопределено Тогда + Если НЕ ЭтоСсылка И ЭтоКонстанта + И СведенияОМестеИспользования.МестоИспользования = Неопределено Тогда ЗаполнитьЗначенияСвойств(Результат.Добавить(), СведенияОМестеИспользования); КонецЕсли; КонецЦикла; @@ -1128,9 +1112,31 @@ #Область Конструкторы -// Параметры: +// Возвращаемое значение: +// Структура: +// * ПользовательскиеОбъекты - Массив из ЛюбаяСсылка +// * Монопольно - Булево +// * ОчищатьСсылкиВМестахИспользования - Булево +// * Режим - Строка +// * ЭтоРегламентноеЗадание - Булево +// * РазмерПакета - Число +// +Функция ПараметрыУдаления() Экспорт + + Результат = Новый Структура; + Результат.Вставить("ПользовательскиеОбъекты", Новый Массив); + Результат.Вставить("Монопольно", Ложь); + Результат.Вставить("ОчищатьСсылкиВМестахИспользования", Ложь); + Результат.Вставить("Режим", ""); + Результат.Вставить("ЭтоРегламентноеЗадание", Ложь); + Результат.Вставить("РазмерПакета", 100); + Возврат Результат; + +КонецФункции + +// ПараметрыУдаления: // УдаляемыеОбъекты - Массив из ЛюбаяСсылка -// Параметры - Структура +// ПараметрыУдаления - см. ПараметрыУдаления // // Возвращаемое значение: // Структура: @@ -1142,9 +1148,9 @@ // ** ОбнаруженныйСтатус - Строка // ** ПодробноеОписаниеОшибки - Строка // ** ОписаниеОшибки - Строка -// * НеУдаленные - Массив -// * Удаленные - Массив -// * ПользовательскиеОбъекты - Массив +// * НеУдаленные - Массив из ЛюбаяСсылка +// * Удаленные - Массив из ЛюбаяСсылка +// * ПользовательскиеОбъекты - Массив из ЛюбаяСсылка // * Монопольно - Булево // * ОчищатьСсылкиВМестахИспользования - Булево // * КешИнформацииОТипах - Соответствие @@ -1154,19 +1160,16 @@ // * ВремяОповещения - Число - время последнего оповещения в миллисекундах // * ПериодОповещения - Число - количество миллисекунд между оповещениями // -Функция ПараметрыУдаления(УдаляемыеОбъекты, Параметры) +Функция РезультатУдаления(УдаляемыеОбъекты, ПараметрыУдаления) ИсключенияПоискаСсылок = ИсключенияПоискаСсылокПриУдалении(); ПараметрыОбработки = Новый Структура; - ПараметрыОбработки.Вставить("Монопольно", - ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "Монопольно", Ложь)); + ПараметрыОбработки.Вставить("Монопольно", ПараметрыУдаления.Монопольно); ПараметрыОбработки.Вставить("ИсключающиеПравила", Новый Соответствие); ПараметрыОбработки.Вставить("ИсключенияПоискаСсылок", ИсключенияПоискаСсылок); - ПараметрыОбработки.Вставить("РазмерПакета", ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, - "РазмерПакета", 100)); + ПараметрыОбработки.Вставить("РазмерПакета", ПараметрыУдаления.РазмерПакета); ПараметрыОбработки.Вставить("КешИнформацииОТипах", Новый Соответствие); - ПараметрыОбработки.Вставить("ОчищатьСсылкиВМестахИспользования", ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( - Параметры, "ОчищатьСсылкиВМестахИспользования", Ложь)); + ПараметрыОбработки.Вставить("ОчищатьСсылкиВМестахИспользования", ПараметрыУдаления.ОчищатьСсылкиВМестахИспользования); ПараметрыОбработки.Вставить("ПользовательскиеОбъекты", Новый Массив); @@ -1198,8 +1201,7 @@ // Уменьшение расхода памяти rmngr на хранение сообщений ПараметрыОбработки.Вставить("ВремяОповещения", 0); ПараметрыОбработки.Вставить("ПериодОповещения", 60000); // миллисекунды - ПараметрыОбработки.Вставить("ЭтоРегламентноеЗадание", ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( - Параметры, "ЭтоРегламентноеЗадание", Ложь)); + ПараметрыОбработки.Вставить("ЭтоРегламентноеЗадание", ПараметрыУдаления.ЭтоРегламентноеЗадание); Возврат ПараметрыОбработки; КонецФункции @@ -1346,19 +1348,19 @@ // * ОписаниеПодчиненныхОбъектов - ТаблицаЗначений // Функция СведенияОМетаданных(ПараметрыУдаления, УдаляемыеОбъекты) - СведенияОМетаданных = Новый ТаблицаЗначений(); - СведенияОМетаданных.Колонки.Добавить("Метаданные", Новый ОписаниеТипов("ОбъектМетаданных")); - СведенияОМетаданных.Колонки.Добавить("Иерархический", Новый ОписаниеТипов("Булево")); - СведенияОМетаданных.Колонки.Добавить("Приоритет", Новый ОписаниеТипов("Число")); - СведенияОМетаданных.Колонки.Добавить("ЕстьПодчиненныеОбъекты", Новый ОписаниеТипов("Булево")); - СведенияОМетаданных.Колонки.Добавить("Тип", Новый ОписаниеТипов("Тип")); - СведенияОМетаданных.Колонки.Добавить("ОписаниеПодчиненныхОбъектов", Новый ОписаниеТипов("ТаблицаЗначений")); - СведенияОМетаданных.Индексы.Добавить("Тип"); - СведенияОМетаданных.Индексы.Добавить("Метаданные"); - ЗаполнитьСведенияОМетаданных(СведенияОМетаданных, УдаляемыеОбъекты); + Результат = Новый ТаблицаЗначений(); + Результат.Колонки.Добавить("Метаданные", Новый ОписаниеТипов("ОбъектМетаданных")); + Результат.Колонки.Добавить("Иерархический", Новый ОписаниеТипов("Булево")); + Результат.Колонки.Добавить("Приоритет", Новый ОписаниеТипов("Число")); + Результат.Колонки.Добавить("ЕстьПодчиненныеОбъекты", Новый ОписаниеТипов("Булево")); + Результат.Колонки.Добавить("Тип", Новый ОписаниеТипов("Тип")); + Результат.Колонки.Добавить("ОписаниеПодчиненныхОбъектов", Новый ОписаниеТипов("ТаблицаЗначений")); + Результат.Индексы.Добавить("Тип"); + Результат.Индексы.Добавить("Метаданные"); + ЗаполнитьСведенияОМетаданных(Результат, УдаляемыеОбъекты); + Возврат Результат; - Возврат СведенияОМетаданных; КонецФункции // Возвращаемое значение: @@ -1386,14 +1388,7 @@ ИнформацияОМетаданных.Приоритет = 0; ИнформацияОМетаданных.Тип = ТипЗнч(Элемент); ИнформацияОМетаданных.ОписаниеПодчиненныхОбъектов = ТаблицаПоискаПодчиненныхОбъектов(); - Кеш = Новый Структура("Иерархический"); - Если ОбщегоНазначения.ЭтоПланСчетов(ИнформацияОМетаданных.Метаданные) Тогда - Кеш.Иерархический = Истина; - Иначе - ЗаполнитьЗначенияСвойств(Кеш, ИнформацияОМетаданных.Метаданные); - КонецЕсли; - - ИнформацияОМетаданных.Иерархический = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Кеш, "Иерархический", Ложь); + ИнформацияОМетаданных.Иерархический = ЭтоИерархическийОбъектМетаданных(ИнформацияОМетаданных.Метаданные); КонецЕсли; КонецЦикла; @@ -1513,14 +1508,28 @@ КонецЦикла; КонецПроцедуры +Функция ЭтоИерархическийОбъектМетаданных(ОбъектМетаданных) + + Если ОбщегоНазначения.ЭтоПланСчетов(ОбъектМетаданных) Тогда + Возврат Истина; + Иначе + ЗначениеРеквизита = Новый Структура("Иерархический"); + ЗаполнитьЗначенияСвойств(ЗначениеРеквизита, ОбъектМетаданных); + Возврат ЗначениеРеквизита.Иерархический; + КонецЕсли; + +КонецФункции + #КонецОбласти #КонецОбласти #Область МонопольноеУдаление -// Основная механика удаления помеченных объектов. -// +// Параметры: +// УдаляемыеОбъекты - Массив из ЛюбаяСсылка +// ПараметрыВыполнения - см. +// Процедура УдалитьПомеченныеОбъектыМонопольно(УдаляемыеОбъекты, ПараметрыВыполнения) ПараметрыВыполнения.ИсключенияПоискаСсылок = ОбщегоНазначения.ИсключенияПоискаСсылок(); @@ -1533,9 +1542,10 @@ КонецЕсли; СведенияОМетаданных = СведенияОМетаданных(ПараметрыВыполнения, УдаляемыеОбъекты); + ИнформацияОТипах = УдалениеПомеченныхОбъектовСлужебный.ИнформацияОТипах(УдаляемыеОбъекты); ПодчиненныеОбъекты = Новый Массив; - Для Сч = -(УдаляемыеОбъекты.Количество() - 1) По 0 Цикл - УдаляемыйОбъект = УдаляемыеОбъекты[-Сч]; + Для Индекс = -(УдаляемыеОбъекты.Количество() - 1) По 0 Цикл + УдаляемыйОбъект = УдаляемыеОбъекты[-Индекс]; Если НЕ ОбъектУдален(УдаляемыйОбъект) И НЕ ОбщегоНазначения.ЗначениеРеквизитаОбъекта(УдаляемыйОбъект, "ПометкаУдаления") Тогда @@ -1543,16 +1553,16 @@ ПричинаНеудаления.Вставить("УдаляемыйСсылка", УдаляемыйОбъект); ПричинаНеудаления.Вставить("МестоИспользования", НСтр("ru='Удаляемый объект не помечен на удаление'")); ПричинаНеудаления.Вставить("ОбнаруженныйМетаданные"); - ЗаписатьПричинуВРезультат(ПараметрыВыполнения, ПричинаНеудаления); - УдаляемыеОбъекты.Удалить(-Сч); + ЗаписатьПричинуВРезультат(ПараметрыВыполнения, ПричинаНеудаления, ИнформацияОТипах); + УдаляемыеОбъекты.Удалить(-Индекс); Продолжить; КонецЕсли; ИнформацияОМетаданных = СведенияОМетаданных.Найти(ТипЗнч(УдаляемыйОбъект), "Тип"); - ИнформацияОМетаданных.Иерархический = Ложь;// Выполняем поиск только подчиненных элементов - ДочерниеПодчиненныеОбъекты = ДочерниеПодчиненныеЭлементы( - УдаляемыйОбъект, ИнформацияОМетаданных); - + ИнформацияОМетаданных.Иерархический = Ложь; // Выполняем поиск только подчиненных элементов + + // @skip-check query-in-loop - Порционная обработка больших объемов данных. + ДочерниеПодчиненныеОбъекты = ДочерниеПодчиненныеЭлементы(УдаляемыйОбъект, ИнформацияОМетаданных); Для Каждого ПодчиненныйОбъект Из ДочерниеПодчиненныеОбъекты Цикл Если ПодчиненныйОбъект.ПометкаУдаления ИЛИ ПодчиненныйОбъект.ТипЭлемента = "Подчиненный" Тогда ПодчиненныеОбъекты.Добавить(ПодчиненныйОбъект.Элемент); @@ -1564,27 +1574,24 @@ Контекст = Новый Структура; ПередУдалениемГруппыОбъектов(Контекст, УдаляемыеОбъекты); + ИнформацияОТипах = Новый Соответствие; Пока УдаляемыеОбъекты.Количество() > 0 Цикл ПрепятствующиеУдалению = Новый ТаблицаЗначений; // Попытка удалить с контролем ссылочной целостности. УстановитьПривилегированныйРежим(Истина); - Попытка УдалитьОбъекты(УдаляемыеОбъекты, Истина, ПрепятствующиеУдалению); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ЗаписатьПредупреждение(Неопределено, ИнформацияОбОшибке); - - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + Сообщения = ДлительныеОперации.СообщенияПользователю(Истина); Для каждого Сообщение Из Сообщения Цикл ОписаниеОшибки = ОписаниеОшибки + Символы.ПС + Символы.ПС + Сообщение.Текст; КонецЦикла; - ПослеУдаленияГруппыОбъектов(Контекст, Ложь); ВызватьИсключение ОписаниеОшибки; @@ -1596,6 +1603,8 @@ ВызватьИсключение НСтр("ru = 'Не удалось выполнить удаление объектов.'"); КонецЕсли; + СлужебныеСвязиДанных = ОбщегоНазначения.СлужебныеСвязиДанных(ПрепятствующиеУдалению, ПараметрыВыполнения.ИсключенияПоискаСсылок); + // Назначение имен колонок для таблицы конфликтов, возникших при удалении. ПрепятствующиеУдалению.Колонки[0].Имя = "УдаляемыйСсылка"; ПрепятствующиеУдалению.Колонки[1].Имя = "МестоИспользования"; @@ -1605,15 +1614,14 @@ ПослеУдаленияГруппыОбъектов(Контекст, ПрепятствующиеУдалению.Количество() = 0); - // Анализ причин не удаления (мест использования помеченных на удаление). + ИнформацияОТипах = УдалениеПомеченныхОбъектовСлужебный.ИнформацияОТипах( + ПрепятствующиеУдалению.ВыгрузитьКолонку("УдаляемыйСсылка"), ИнформацияОТипах); + + // Анализ мест использования помеченных на удаление. Для Каждого СтрокаТаблицы Из ПрепятствующиеУдалению Цикл // Проверка исключающих правил. - ОписаниеСвязиДанных = Новый Структура("Ссылка, Данные, Метаданные"); - ОписаниеСвязиДанных.Ссылка = СтрокаТаблицы.УдаляемыйСсылка; - ОписаниеСвязиДанных.Данные = СтрокаТаблицы.МестоИспользования; - ОписаниеСвязиДанных.Метаданные = СтрокаТаблицы.Метаданные; - Если ОбщегоНазначения.ЭтоСлужебнаяСвязьДанных(ОписаниеСвязиДанных, ПараметрыВыполнения.ИсключенияПоискаСсылок) - ИЛИ СвязьТолькоСВедущимиИзмерениямиРегистров(ОписаниеСвязиДанных) + Если СлужебныеСвязиДанных[СтрокаТаблицы] <> Неопределено + ИЛИ СвязьТолькоСВедущимиИзмерениямиРегистров(СтрокаТаблицы) ИЛИ ОбщегоНазначения.ЭтоПоследовательность(СтрокаТаблицы.Метаданные) Тогда Продолжить; // Связь не препятствует удалению. КонецЕсли; @@ -1633,8 +1641,7 @@ УдаляемыеОбъекты.Удалить(Индекс); КонецЕсли; - // Регистрация связи для вывода пользователю. - ЗаписатьПричинуВРезультат(ПараметрыВыполнения, СтрокаТаблицы); + ЗаписатьПричинуВРезультат(ПараметрыВыполнения, СтрокаТаблицы, ИнформацияОТипах); КонецЦикла; // Удаление без контроля, если все связи в исключениях поиска ссылок. @@ -1643,42 +1650,28 @@ УдалитьОбъекты(УдаляемыеОбъекты, Ложь); ПослеУдаленияГруппыОбъектов(Контекст, Истина); УстановитьПривилегированныйРежим(Ложь); - Прервать; // Выход из цикла. + Прервать; КонецЕсли; КонецЦикла; ПараметрыВыполнения.Вставить("Удаленные", УдаляемыеОбъекты); КонецПроцедуры -// Формирует информацию о типе объекта метаданных, как то: полное имя, представления, вид и т.п. -// -Функция СформироватьИнформациюОТипах(ПараметрыВыполнения, Тип) - КешИнформацииОТипах = ПараметрыВыполнения.КешИнформацииОТипах; - Информация = УдалениеПомеченныхОбъектовСлужебный.ИнформацияОТипе(Тип, КешИнформацииОТипах); - Возврат Информация; -КонецФункции - -// Регистрирует предупреждение в журнале регистрации. -// Процедура ЗаписатьПредупреждение(Ссылка, ИнформацияОбОшибке) Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда - ТекстДляЖурнала = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстДляЖурнала = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); Иначе ТекстДляЖурнала = ИнформацияОбОшибке; КонецЕсли; - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Удаление помеченных'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Предупреждение, - , - Ссылка, - ТекстДляЖурнала); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Удаление помеченных'", ОбщегоНазначения.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Предупреждение,, Ссылка, ТекстДляЖурнала); КонецПроцедуры -Процедура ЗаписатьПричинуВРезультат(ПараметрыВыполнения, СтрокаТаблицы) - УдаляемыйТип = ТипЗнч(СтрокаТаблицы.УдаляемыйСсылка); - УдаляемыйИнформация = СформироватьИнформациюОТипах(ПараметрыВыполнения, УдаляемыйТип); - Если УдаляемыйИнформация.Технический Тогда +Процедура ЗаписатьПричинуВРезультат(ПараметрыВыполнения, СтрокаТаблицы, ИнформацияОТипах) + ТипОбъекта = ТипЗнч(СтрокаТаблицы.УдаляемыйСсылка); + ИнформацияОТипе = ИнформацияОТипах[ТипОбъекта]; // см. УдалениеПомеченныхОбъектовСлужебный.ИнформацияОТипе + Если ИнформацияОТипе.Технический Тогда Возврат; КонецЕсли; @@ -1686,57 +1679,54 @@ Если ПараметрыВыполнения.НеУдаленные.Найти(СтрокаТаблицы.УдаляемыйСсылка) = Неопределено Тогда ПараметрыВыполнения.НеУдаленные.Добавить(СтрокаТаблицы.УдаляемыйСсылка); КонецЕсли; - + Причина = ПараметрыВыполнения.ПрепятствующиеУдалению.Добавить(); ЗаполнитьЗначенияСвойств(Причина, СтрокаТаблицы); - - МестоИспользования = СтрокаТаблицы.МестоИспользования; - + + МестоИспользования = СтрокаТаблицы.МестоИспользования; Если ТипЗнч(МестоИспользования) = Тип("Строка") Тогда Причина.ОписаниеОшибки = МестоИспользования; Причина.МестоИспользования = Неопределено; КонецЕсли; - - Если МестоИспользования = Неопределено Тогда - Если НЕ Метаданные.Константы.Содержит(СтрокаТаблицы.Метаданные) Тогда + + Если МестоИспользования = Неопределено + И НЕ Метаданные.Константы.Содержит(СтрокаТаблицы.Метаданные) Тогда Причина.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Обнаружены неразрешимые ссылки (%1)'"), СтрокаТаблицы.Метаданные.Представление()); - Возврат; - КонецЕсли; КонецЕсли; КонецПроцедуры Функция СвязьТолькоСВедущимиИзмерениямиРегистров(ОписаниеСвязиДанных) - Результат = Ложь; - Если ОбщегоНазначения.ЭтоРегистр(ОписаниеСвязиДанных.Метаданные) Тогда - - Для каждого Измерение Из ОписаниеСвязиДанных.Метаданные.Измерения Цикл - - Если ОписаниеСвязиДанных.Данные[Измерение.Имя] = ОписаниеСвязиДанных.Ссылка - И Измерение.Ведущее Тогда - Результат = Истина; - Прервать; - КонецЕсли; - - Если ОписаниеСвязиДанных.Данные["Регистратор"] = ОписаниеСвязиДанных.Ссылка Тогда - Результат = Истина; - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - + Результат = Ложь; + Если Не ОбщегоНазначения.ЭтоРегистр(ОписаниеСвязиДанных.Метаданные) Тогда + Возврат Результат; + КонецЕсли; + + Для каждого Измерение Из ОписаниеСвязиДанных.Метаданные.Измерения Цикл + + Если ОписаниеСвязиДанных.МестоИспользования[Измерение.Имя] = ОписаниеСвязиДанных.УдаляемыйСсылка + И Измерение.Ведущее Тогда + Результат = Истина; + Прервать; + КонецЕсли; + + Если ОписаниеСвязиДанных.МестоИспользования["Регистратор"] = ОписаниеСвязиДанных.УдаляемыйСсылка Тогда + Результат = Истина; + КонецЕсли; + + КонецЦикла; Возврат Результат; + КонецФункции //////////////////////////////////////////////////////////////////////////////// // Передача информации на клиент. // Параметры: -// ПараметрыВыполнения - см. ПараметрыУдаления +// ПараметрыВыполнения - см. РезультатУдаления // ИмяКоллекции - Строка // Процедура ОтметитьПрогрессОбходаКоллекции(ПараметрыВыполнения, ИмяКоллекции) diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФорма/Form.form b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФорма/Form.form index 63e871440..6a7332a3d 100644 --- a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФорма/Form.form +++ b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФорма/Form.form @@ -121,7 +121,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -535,7 +534,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -862,7 +860,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -987,7 +984,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1256,7 +1252,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1339,7 +1334,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2239,7 +2233,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2350,7 +2343,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2813,7 +2805,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3268,7 +3259,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3417,7 +3407,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -4125,7 +4114,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -4459,7 +4447,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФорма/Module.bsl b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФорма/Module.bsl index 768aed4e3..17d34dc7a 100644 --- a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФорма/Module.bsl +++ b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФорма/Module.bsl @@ -1428,7 +1428,7 @@ Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Универсальный обмен данными в формате XML'", ОбъектДляСервера.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; ОбъектДляСервера.Параметры.Очистить(); diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФормаНастройкиОтладкиОбработчиков/Form.form b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФормаНастройкиОтладкиОбработчиков/Form.form index 749cca729..f3947a8d2 100644 --- a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФормаНастройкиОтладкиОбработчиков/Form.form +++ b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФормаНастройкиОтладкиОбработчиков/Form.form @@ -311,7 +311,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -340,7 +339,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -436,7 +434,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -465,7 +462,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -537,7 +533,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -784,7 +779,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/ObjectModule.bsl b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/ObjectModule.bsl index 44fc43071..5aeaeba37 100644 --- a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/ObjectModule.bsl +++ b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/ObjectModule.bsl @@ -1551,7 +1551,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(29, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, Объект, "ПередУдалениемОбъектаВыборки"); + ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(29, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, Объект, "ПередУдалениемОбъектаВыборки"); КонецПопытки; @@ -1570,7 +1570,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(24, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, Объект, ""); + ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(24, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, Объект, ""); КонецПопытки; @@ -1722,7 +1722,7 @@ Исключение ИмяОбработчика = НСтр("ru = '%1 (глобальный)'"); - ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(64, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(64, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПередКонвертациейОбъекта")); КонецПопытки; @@ -1750,7 +1750,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(41, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, "ПередВыгрузкойОбъекта"); + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(41, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, "ПередВыгрузкойОбъекта"); КонецПопытки; Если Отказ Тогда // Отказ от дальнейшей обработки правила. @@ -2026,7 +2026,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(42, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, "ПриВыгрузкеОбъекта"); + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(42, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, "ПриВыгрузкеОбъекта"); КонецПопытки; Если Отказ Тогда // Отказ от записи объекта в файл. @@ -2063,7 +2063,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(43, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, "ПослеВыгрузкиОбъекта"); + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(43, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, "ПослеВыгрузкиОбъекта"); КонецПопытки; Если Отказ Тогда // Отказ от записи объекта в файл. @@ -2126,7 +2126,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(76, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, "ЕстьОбработчикПослеВыгрузкиВФайл"); + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(76, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, "ЕстьОбработчикПослеВыгрузкиВФайл"); КонецПопытки; КонецЕсли; @@ -2818,7 +2818,7 @@ ДеструкторВнешнейОбработкиОбработчиковСобытий(); - СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + СообщитьПользователю(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписатьВПротоколВыполнения(78); РаботаВозможна = Ложь; @@ -2852,7 +2852,7 @@ ВнешняяОбработкаОбработчиковСобытий.Деструктор(); Исключение - СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + СообщитьПользователю(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; @@ -2881,7 +2881,7 @@ Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Универсальный обмен данными в формате XML'", КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; @@ -2986,7 +2986,7 @@ ВременныйФайлЗаписей.Открыть(ИмяФайлаЗаписей, КодировкаТекста.UTF8); Исключение ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(1000, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'Ошибка при создании временного файла для выгрузки данных'")); ВызватьИсключение; КонецПопытки; @@ -3011,7 +3011,7 @@ ВременныйФайл.Открыть(ИмяВременногоФайла, КодировкаТекста.UTF8); Исключение ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(1000, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'Ошибка при открытии временного файла для переноса данных в файл обмена'")); ВызватьИсключение; КонецПопытки; @@ -3919,7 +3919,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеВПротокол(11, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Строка(НоваяСтрока.Источник)); + ЗаписатьИнформациюОбОшибкеВПротокол(11, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Строка(НоваяСтрока.Источник)); КонецПопытки; @@ -6062,7 +6062,7 @@ Менеджеры[Источник].ПКО = СтрокаТаблицы; КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеВПротокол(11, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Строка(Источник)); + ЗаписатьИнформациюОбОшибкеВПротокол(11, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Строка(Источник)); КонецПопытки; КонецЕсли; @@ -6166,7 +6166,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(27, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "", "ПередОбработкойПравилаОчистки"); + ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(27, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "", "ПередОбработкойПравилаОчистки"); КонецПопытки; @@ -6272,7 +6272,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(28, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "", "ПослеОбработкиПравилаОчистки"); + ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(28, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "", "ПослеОбработкиПравилаОчистки"); КонецПопытки; @@ -6407,7 +6407,7 @@ Исключение - СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеВПротокол(26, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Объект, Тип); + СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеВПротокол(26, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Объект, Тип); Если Не ФлагРежимОтладки Тогда ВызватьИсключение СтрокаСообщенияОбОшибке; @@ -7723,7 +7723,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(73, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), "", "", + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(73, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), "", "", ТипОбъекта, Неопределено, НСтр("ru = 'Последовательность полей поиска'")); КонецПопытки; @@ -7893,7 +7893,7 @@ Исключение - ЗП = ПолучитьСтруктуруЗаписиПротокола(26, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ПолучитьСтруктуруЗаписиПротокола(26, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.ИмяПКО = ИмяПКО; ЗП.Объект = Объект; ЗП.ТипОбъекта = ТипЗнч(Объект); @@ -8589,7 +8589,7 @@ Исключение ИмяОбработчика = НСтр("ru = '%1 (глобальный)'"); - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(53, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(53, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Неопределено, ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПередЗагрузкойОбъекта")); @@ -8624,7 +8624,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(19, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(19, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Неопределено, "ПередЗагрузкойОбъекта"); КонецПопытки; @@ -8681,7 +8681,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Объект, "ПриЗагрузкеОбъекта"); КонецПопытки; @@ -8758,7 +8758,7 @@ Исключение - ЗП = ПолучитьСтруктуруЗаписиПротокола(26, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ПолучитьСтруктуруЗаписиПротокола(26, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.ИмяПКО = ИмяПравила; ЗП.НПП = НПП; ЗП.ГНПП = ГНПП; @@ -8854,7 +8854,7 @@ Исключение УдалитьИзСтекаНеЗаписанныхОбъектов(НПП, ГНПП); - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Объект, "ПриЗагрузкеОбъекта"); КонецПопытки; @@ -8898,7 +8898,7 @@ Исключение УдалитьИзСтекаНеЗаписанныхОбъектов(НПП, ГНПП); - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Объект, "ПриЗагрузкеОбъекта"); КонецПопытки; @@ -8966,7 +8966,7 @@ УдалитьИзСтекаНеЗаписанныхОбъектов(НПП, ГНПП); ИмяОбработчика = НСтр("ru = '%1 (глобальный)'"); - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(54, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(54, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Объект, ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПослеЗагрузкиОбъекта")); @@ -8996,7 +8996,7 @@ Исключение УдалитьИзСтекаНеЗаписанныхОбъектов(НПП, ГНПП); - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(21, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(21, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, ТипОбъекта, Объект, "ПослеЗагрузкиОбъекта"); КонецПопытки; @@ -9072,7 +9072,7 @@ ЗаписатьДокументВБезопасномРежиме(Объект, ТипОбъекта); - ЗП = ПолучитьСтруктуруЗаписиПротокола(25, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ПолучитьСтруктуруЗаписиПротокола(25, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.ИмяПКО = ИмяПравила; Если Не ПустаяСтрока(Источник) Тогда @@ -9531,7 +9531,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(48, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКГС, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(48, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКГС, Источник, "ПередОбработкойВыгрузкиГруппыСвойств",, Ложь); КонецПопытки; @@ -9620,7 +9620,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(49, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКГС, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(49, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКГС, Источник, "ПослеОбработкиВыгрузкиГруппыСвойств",, Ложь); КонецПопытки; @@ -9651,7 +9651,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(66, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКГС, Источник,,,Ложь); + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(66, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКГС, Источник,,,Ложь); Возврат; КонецПопытки; @@ -9723,7 +9723,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(50, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКГС, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(50, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКГС, Источник, "ПередВыгрузкойГруппыСвойств",, Ложь); Прервать; @@ -9765,7 +9765,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(51, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКГС, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(51, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКГС, Источник, "ПриВыгрузкеГруппыСвойств",, Ложь); Прервать; @@ -9807,7 +9807,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(52, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКГС, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(52, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКГС, Источник, "ПослеВыгрузкиГруппыСвойств",, Ложь); Прервать; @@ -9865,7 +9865,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(49, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКГС, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(49, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКГС, Источник, "ПослеОбработкиВыгрузкиГруппыСвойств",, Ложь); КонецПопытки; @@ -9950,7 +9950,7 @@ Исключение Если КодОшибки <> 14 Тогда - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(КодОшибки, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, ""); + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(КодОшибки, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, ""); КонецЕсли; КонецПопытки; @@ -10009,7 +10009,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(55, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(55, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, "ПередВыгрузкойСвойства", Значение); КонецПопытки; @@ -10055,7 +10055,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(56, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(56, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, "ПриВыгрузкеСвойства", Значение); КонецПопытки; @@ -10182,7 +10182,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(57, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(57, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, "ПослеВыгрузкиСвойства", Значение); КонецПопытки; @@ -10600,7 +10600,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(55, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(55, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, "ПередВыгрузкойСвойства", Значение); КонецПопытки; @@ -10731,7 +10731,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(56, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(56, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, "ПриВыгрузкеСвойства", Значение); КонецПопытки; @@ -10850,7 +10850,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПКС(57, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(57, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, ПКС, Источник, "ПослеВыгрузкиСвойства", Значение); КонецПопытки; @@ -10924,7 +10924,7 @@ Исключение ИмяОбработчика = НСтр("ru = '%1 (глобальный)'"); - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(65, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(65, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПередВыгрузкойОбъектаВыборки"), Объект); @@ -10953,7 +10953,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(33, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "ПередВыгрузкойОбъектаВыборки", Объект); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(33, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "ПередВыгрузкойОбъектаВыборки", Объект); КонецПопытки; Если Отказ Тогда @@ -10984,7 +10984,7 @@ Исключение ИмяОбработчика = НСтр("ru = '%1 (глобальный)'"); - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(69, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(69, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПослеВыгрузкиОбъектаВыборки"), Объект); @@ -11009,7 +11009,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(34, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "ПослеВыгрузкиОбъектаВыборки", Объект); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(34, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "ПослеВыгрузкиОбъектаВыборки", Объект); КонецПопытки; КонецЕсли; @@ -11259,7 +11259,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(31, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "ПередОбработкойВыгрузкиДанных"); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(31, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "ПередОбработкойВыгрузкиДанных"); КонецПопытки; @@ -11388,7 +11388,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "ПослеОбработкиВыгрузкиДанных"); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, "ПослеОбработкиВыгрузкиДанных"); КонецПопытки; @@ -11687,7 +11687,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПоследняяСтрокаПравилаВыгрузки.Имя, "ПослеОбработкиВыгрузкиДанных"); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПоследняяСтрокаПравилаВыгрузки.Имя, "ПослеОбработкиВыгрузкиДанных"); КонецПопытки; @@ -11727,7 +11727,7 @@ Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(31, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ТекущаяСтрокаПравилаВыгрузки.Имя, "ПередОбработкойВыгрузкиДанных"); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(31, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ТекущаяСтрокаПравилаВыгрузки.Имя, "ПередОбработкойВыгрузкиДанных"); КонецПопытки; @@ -11810,7 +11810,7 @@ ОтменитьТранзакцию(); КонецЕсли; - ЗП = ПолучитьСтруктуруЗаписиПротокола(72, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ПолучитьСтруктуруЗаписиПротокола(72, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.УзелПланаОбмена = УзелОбмена; ЗП.Объект = Данные; ЗП.ТипОбъекта = ТипДанныхДляВыгрузки; @@ -11841,7 +11841,7 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПоследняяСтрокаПравилаВыгрузки.Имя, "ПослеОбработкиВыгрузкиДанных"); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПоследняяСтрокаПравилаВыгрузки.Имя, "ПослеОбработкиВыгрузкиДанных"); КонецПопытки; @@ -12675,7 +12675,7 @@ УдалитьФайлы(ИмяВременногоФайлаПравилОбмена); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Универсальный обмен данными в формате XML'", КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; @@ -12686,7 +12686,7 @@ УдалитьФайлы(Источник); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Универсальный обмен данными в формате XML'", КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; @@ -12724,7 +12724,7 @@ Исключение Текст = НСтр("ru = 'Обработчик: ""%1"": %2'"); - Текст = ПодставитьПараметрыВСтроку(Текст, "ПослеЗагрузкиПравилОбмена", КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Текст = ПодставитьПараметрыВСтроку(Текст, "ПослеЗагрузкиПравилОбмена", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(НСтр("ru = 'Универсальный обмен данными в формате XML'", КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, Текст); @@ -12841,7 +12841,7 @@ Исключение - ЗП = ПолучитьСтруктуруЗаписиПротокола(75, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ПолучитьСтруктуруЗаписиПротокола(75, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.Обработчик = "ПослеЗагрузкиПараметров"; СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(75, ЗП, Истина); @@ -12873,7 +12873,7 @@ Исключение - ЗП = ПолучитьСтруктуруЗаписиПротокола(39, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ПолучитьСтруктуруЗаписиПротокола(39, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗП.Обработчик = "АлгоритмФайлаОбмена"; СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(39, ЗП, Истина); @@ -12910,7 +12910,7 @@ Исключение - СтрокаОшибки = ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при загрузке данных: %1'"), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + СтрокаОшибки = ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при загрузке данных: %1'"), ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); РезультирующаяСтрокаСИнформациейОбОшибке = ЗаписатьВПротоколВыполнения(СтрокаОшибки, Неопределено, Истина, , , Истина); @@ -13028,7 +13028,7 @@ Исключение ИмяОбработчика = НСтр("ru = '%1 (конвертация)'"); - ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(22, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(22, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПередЗагрузкойДанных")); Отказ = Истина; @@ -13089,7 +13089,7 @@ Исключение ИмяОбработчика = НСтр("ru = '%1 (конвертация)'"); - ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(23, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(23, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПослеЗагрузкиДанных")); КонецПопытки; @@ -13162,7 +13162,7 @@ Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Универсальный обмен данными в формате XML'", КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры @@ -13195,7 +13195,7 @@ Исключение - ЗП = ПолучитьСтруктуруЗаписиПротокола(2, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗП = ПолучитьСтруктуруЗаписиПротокола(2, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписатьВПротоколВыполнения(2, ЗП, Истина); Возврат ""; @@ -13397,7 +13397,7 @@ Исключение ИмяОбработчика = НСтр("ru = '%1 (конвертация)'"); - ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(62, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(62, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПередВыгрузкойДанных")); Отказ = Истина; @@ -13457,7 +13457,7 @@ Исключение ИмяОбработчика = НСтр("ru = '%1 (конвертация)'"); - ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(63, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(63, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПослеВыгрузкиДанных")); КонецПопытки; @@ -13495,7 +13495,7 @@ КонецЕсли; Отказ = Истина; - СтрокаОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СтрокаОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписатьВПротоколВыполнения(ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка при выгрузке данных: %1'"), СтрокаОшибки), Неопределено, Истина, , , Истина); @@ -14357,7 +14357,7 @@ СтрокаСообщенияОбОшибке = НСтр("ru = 'При попытке соединения с COM-сервером произошла следующая ошибка: |%1'"); - СтрокаСообщенияОбОшибке = ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + СтрокаСообщенияОбОшибке = ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); СообщитьПользователю(СтрокаСообщенияОбОшибке); @@ -14470,7 +14470,7 @@ Исключение Текст = НСтр("ru = 'При попытке создания обработки %1 произошла ошибка: %2'"); - Текст = ПодставитьПараметрыВСтроку(Текст, Метаданные().Имя, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Текст = ПодставитьПараметрыВСтроку(Текст, Метаданные().Имя, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); СообщитьПользователю(Текст); РезультатПодключения = Неопределено; diff --git a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Form.form b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Form.form index 390b4acb6..a0534a9d6 100644 --- a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Form.form +++ b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Form.form @@ -110,7 +110,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -212,7 +211,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -241,7 +239,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -348,7 +345,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -449,7 +445,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -477,7 +472,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -3212,7 +3206,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Module.bsl b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Module.bsl index 09a4b75b9..a3c3082e2 100644 --- a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Module.bsl +++ b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Module.bsl @@ -1107,7 +1107,7 @@ ПодробныйТекстОшибок = ПодробныйТекстОшибок + ?(ПустаяСтрока(ПодробныйТекстОшибок), "", Символы.ПС + Символы.ПС) + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1: %2'"), ИмяРегистраНакопления, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Продолжить; КонецПопытки; @@ -1350,7 +1350,7 @@ ОбщегоНазначения.СообщитьПользователю( СообщениеОбОшибке + Символы.ПС - + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), + + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), , ПолеОшибки); Возврат Ложь; @@ -1396,7 +1396,7 @@ Исключение - СообщениеОбОшибке = ПараметрыСервера.СообщениеОбОшибке + " (" + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + ")"; + СообщениеОбОшибке = ПараметрыСервера.СообщениеОбОшибке + " (" + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + ")"; ОбщегоНазначения.СообщитьПользователю(СообщениеОбОшибке); Результат.Успешно = Ложь; diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПароля/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПароля/Form.form index 23913060b..6499a02bf 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПароля/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПароля/Form.form @@ -273,7 +273,6 @@ UsualGroup Vertical - Auto true true Auto @@ -302,7 +301,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПароля/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПароля/Module.bsl index cbd16319d..c715bd3ef 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПароля/Module.bsl +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПароля/Module.bsl @@ -24,7 +24,7 @@ НастройкиПользователя = Параметры.НастройкиПользователя; ВозможноСохранять = Параметры.ВозможноСохранять; Логин = Параметры.Логин; - СкрыватьПароль = СервисКриптографииDSSСлужебный.НужнаяВерсияПлатформы("8.3.19.0"); + СкрыватьПароль = Истина; НастроитьУсловноеОформление(); ПодготовитьФорму(Параметры); @@ -170,11 +170,17 @@ &НаКлиенте Процедура ОткрытьВидимостьЭлемента(ИмяЭлемента) - Элементы[ИмяЭлемента].КартинкаКнопкиВыбора = КартинкаОткрыть; - Элементы[ИмяЭлемента].РежимПароля = Ложь; - ЭтотОбъект[ИмяЭлемента] = Элементы[ИмяЭлемента].ТекстРедактирования; - Если СкрыватьПароль Тогда - ПодключитьОбработчикОжидания("ПодключаемыйОтключитьВидимостьПароля", 2, Истина); + ЭлементПароля = Элементы[ИмяЭлемента]; + Если ЭлементПароля.РежимПароля Тогда + Элементы[ИмяЭлемента].КартинкаКнопкиВыбора = КартинкаОткрыть; + ЭтотОбъект[ИмяЭлемента] = Элементы[ИмяЭлемента].ТекстРедактирования; + ЭлементПароля.РежимПароля = Ложь; + Если СкрыватьПароль Тогда + ПодключитьОбработчикОжидания("ПодключаемыйОтключитьВидимостьПароля", 2, Истина); + КонецЕсли; + ИначеЕсли СкрыватьПароль Тогда + ЭлементПароля.РежимПароля = Истина; + Элементы[ИмяЭлемента].КартинкаКнопкиВыбора = КартинкаЗакрыть; КонецЕсли; КонецПроцедуры @@ -183,7 +189,8 @@ Процедура ПодключаемыйОтключитьВидимостьПароля() ЭлементФормы = Элементы["Пароль"]; - Если ЭлементФормы.РежимПароля <> Истина Тогда + Если НЕ ЭлементФормы.РежимПароля Тогда + ЭлементФормы.КартинкаКнопкиВыбора = КартинкаЗакрыть; ЭлементФормы.РежимПароля = Истина; КонецЕсли; @@ -221,15 +228,14 @@ Элементы.ЗаголовокФормы.Заголовок = ЗаголовокФормы; - КартинкаОткрыть = БиблиотекаКартинок.ВидимостьПароляОткрыто; - КартинкаЗакрыть = БиблиотекаКартинок.ВидимостьПароляЗакрыто; + КартинкаОткрыть = СервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ВводимыеСимволыСкрыты"); + КартинкаЗакрыть = СервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ВводимыеСимволыВидны"); Сохранить = ВозможноСохранять = "Обязательно"; Элементы.Пароль.КартинкаКнопкиВыбора = КартинкаЗакрыть; Если НастройкиПользователя <> Неопределено Тогда - //@skip-warning Сервер = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(НастройкиПользователя.Подключение, "Сервер", ""); Логин = НастройкиПользователя.Логин; КоличествоПопыток = НастройкиПользователя.НеудачныхПопыток; diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПинКода/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПинКода/Form.form index aa5b477a3..eacdad28b 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПинКода/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПинКода/Form.form @@ -61,7 +61,6 @@ UsualGroup Vertical - Auto true true Auto @@ -224,7 +223,6 @@ UsualGroup Vertical - Auto true true Auto @@ -253,7 +251,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -392,7 +389,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПинКода/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПинКода/Module.bsl index 7e39e76aa..129a149d0 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПинКода/Module.bsl +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПинКода/Module.bsl @@ -23,7 +23,7 @@ Если Сертификат <> Неопределено Тогда СертификатПредставление = Сертификат.Представление; КонецЕсли; - СкрыватьПароль = СервисКриптографииDSSСлужебный.НужнаяВерсияПлатформы("8.3.19.0"); + СкрыватьПароль = Истина; ПодготовитьФорму(Параметры); УправлениеФормой(ЭтотОбъект); @@ -139,11 +139,17 @@ &НаКлиенте Процедура ОткрытьВидимостьЭлемента(ИмяЭлемента) - Элементы[ИмяЭлемента].КартинкаКнопкиВыбора = КартинкаОткрыть; - Элементы[ИмяЭлемента].РежимПароля = Ложь; - ЭтотОбъект[ИмяЭлемента] = Элементы[ИмяЭлемента].ТекстРедактирования; - Если СкрыватьПароль Тогда - ПодключитьОбработчикОжидания("ПодключаемыйОтключитьВидимостьПароля", 2, Истина); + ЭлементПароля = Элементы[ИмяЭлемента]; + Если ЭлементПароля.РежимПароля Тогда + Элементы[ИмяЭлемента].КартинкаКнопкиВыбора = КартинкаОткрыть; + ЭтотОбъект[ИмяЭлемента] = Элементы[ИмяЭлемента].ТекстРедактирования; + ЭлементПароля.РежимПароля = Ложь; + Если СкрыватьПароль Тогда + ПодключитьОбработчикОжидания("ПодключаемыйОтключитьВидимостьПароля", 2, Истина); + КонецЕсли; + ИначеЕсли СкрыватьПароль Тогда + ЭлементПароля.РежимПароля = Истина; + Элементы[ИмяЭлемента].КартинкаКнопкиВыбора = КартинкаЗакрыть; КонецЕсли; КонецПроцедуры @@ -152,12 +158,9 @@ Процедура ПодключаемыйОтключитьВидимостьПароля() ЭлементФормы = Элементы["Пароль"]; - Если ЭлементФормы.РежимПароля <> Истина Тогда - ТекущийТекст = ЭлементФормы.ТекстРедактирования; + Если НЕ ЭлементФормы.РежимПароля Тогда ЭлементФормы.КартинкаКнопкиВыбора = КартинкаЗакрыть; ЭлементФормы.РежимПароля = Истина; - ЭтотОбъект["Пароль"] = ТекущийТекст; - ЭлементФормы.ОбновитьТекстРедактирования(); КонецЕсли; КонецПроцедуры @@ -209,8 +212,8 @@ КонецЕсли; Элементы.ЗаголовокФормы.Заголовок = ЗаголовокФормы; - КартинкаОткрыть = СервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ВидимостьПароляОткрыто"); - КартинкаЗакрыть = СервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ВидимостьПароляЗакрыто"); + КартинкаОткрыть = СервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ВводимыеСимволыСкрыты"); + КартинкаЗакрыть = СервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ВводимыеСимволыВидны"); Элементы.Пароль.КартинкаКнопкиВыбора = КартинкаЗакрыть; diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВебАутентификация/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВебАутентификация/Form.form index 0f06e857f..bdfb91da7 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВебАутентификация/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВебАутентификация/Form.form @@ -160,7 +160,6 @@ Vertical Center Center - Auto true true Auto diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВывестиИнформацию/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВывестиИнформацию/Form.form index 356954dfc..b14edd378 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВывестиИнформацию/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВывестиИнформацию/Form.form @@ -66,7 +66,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -293,7 +292,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -438,7 +436,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВывестиИнформацию/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВывестиИнформацию/Module.bsl index 63ebdb437..f020e5420 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВывестиИнформацию/Module.bsl +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВывестиИнформацию/Module.bsl @@ -156,6 +156,7 @@ НовыйЭлемент = Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), Элементы.ГруппаВопросы); НовыйЭлемент.ИмяКоманды = ИмяКоманды; + НовыйЭлемент.АвтоМаксимальнаяШирина = Истина; Если ПервыйЭлемент = Неопределено ИЛИ СтрокаКоманды.Пометка Тогда ПервыйЭлемент = НовыйЭлемент; @@ -205,8 +206,6 @@ // Параметры: // Команда - КомандаФормы // -//@skip-warning -// &НаКлиенте Процедура Подключаемый_НажатиеКнопки(Команда) diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ЗаявлениеНаИзменениеРеквизитовПодключения/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ЗаявлениеНаИзменениеРеквизитовПодключения/Form.form index 62872d980..8e5ec0cc3 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ЗаявлениеНаИзменениеРеквизитовПодключения/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ЗаявлениеНаИзменениеРеквизитовПодключения/Form.form @@ -145,7 +145,6 @@ AlwaysHorizontal Center - Auto true true Auto @@ -256,7 +255,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -285,7 +283,6 @@ UsualGroup Vertical - Auto true true Auto @@ -399,7 +396,6 @@ AlwaysHorizontal Center - Auto true true Auto @@ -512,7 +508,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -541,7 +536,6 @@ UsualGroup Vertical - Auto true true Auto @@ -655,7 +649,6 @@ AlwaysHorizontal Center - Auto true true Auto @@ -766,7 +759,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -875,7 +867,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -904,7 +895,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1018,7 +1008,6 @@ AlwaysHorizontal Center - Auto true true Auto @@ -1162,7 +1151,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1298,7 +1286,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1327,7 +1314,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1356,7 +1342,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1385,7 +1370,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1414,7 +1398,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1824,7 +1807,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ЗаявлениеНаИзменениеРеквизитовПодключения/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ЗаявлениеНаИзменениеРеквизитовПодключения/Module.bsl index 74050c1d8..3aa8b4e5b 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ЗаявлениеНаИзменениеРеквизитовПодключения/Module.bsl +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ЗаявлениеНаИзменениеРеквизитовПодключения/Module.bsl @@ -339,7 +339,7 @@ Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда ПоказатьОшибку(ОповещениеОЗавершении, НСтр("ru = 'Невозможно подключиться к порталу интернет-поддержки по причине: - |Библиотека интернет поддержки пользователей не внедрена в конфигурацию.'")); + |Библиотека интернет-поддержки пользователей не внедрена в конфигурацию.'")); Возврат; КонецЕсли; diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/НовыйЗапросНаСертификат/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/НовыйЗапросНаСертификат/Form.form index acbeb456e..abead00d2 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/НовыйЗапросНаСертификат/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/НовыйЗапросНаСертификат/Form.form @@ -164,7 +164,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -381,7 +380,6 @@ UsualGroup HorizontalIfPossible - Auto true true auto @@ -594,7 +592,6 @@ UsualGroup HorizontalIfPossible - Auto true true auto @@ -855,7 +852,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1019,7 +1015,6 @@ UsualGroup HorizontalIfPossible - Auto true true auto diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Form.form index eb30ed784..29d1b65f9 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Form.form @@ -81,7 +81,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -221,7 +220,6 @@ UsualGroup Vertical - Auto true true Auto @@ -317,6 +315,45 @@ true + + Ссылка + 130 + true + true + + + СписокВыбор.Ссылка + + + СсылкаРасширеннаяПодсказка + 132 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 131 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + None СписокВыборКоманднаяПанель @@ -472,7 +509,6 @@ UsualGroup Vertical - Auto true true Auto @@ -626,7 +662,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -706,7 +741,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Module.bsl index 66092e04b..873b8e392 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Module.bsl +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Module.bsl @@ -25,9 +25,7 @@ Сервер = Параметры.Сервер; ВыборНовойУчетнойЗаписи = Параметры.ВыборНовойУчетнойЗаписи; УчетнаяЗапись = Параметры.УчетнаяЗапись; - //@skip-warning НастройкиНовойУчетнойЗаписи = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(Параметры, "НастройкиНовойУчетнойЗаписи", Истина); - //@skip-warning ДополнитьСервера = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(Параметры, "ДополнитьСервера", Истина); Если Параметры.СписокСерверов <> Неопределено Тогда diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборСпособа/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборСпособа/Form.form index 16add33d8..cb158bc47 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборСпособа/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборСпособа/Form.form @@ -168,7 +168,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -197,7 +196,6 @@ UsualGroup Vertical - Auto true true Auto @@ -303,7 +301,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -332,7 +329,6 @@ UsualGroup Vertical - Auto true true Auto @@ -438,7 +434,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -467,7 +462,6 @@ UsualGroup Vertical - Auto true true Auto @@ -573,7 +567,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -602,7 +595,6 @@ UsualGroup Vertical - Auto true true Auto @@ -703,7 +695,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -732,7 +723,6 @@ UsualGroup Vertical - Auto true true Auto @@ -833,7 +823,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -862,7 +851,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииКодПодтверждения/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииКодПодтверждения/Form.form index 29433bf32..bc24e4b41 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииКодПодтверждения/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииКодПодтверждения/Form.form @@ -113,7 +113,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -142,7 +141,6 @@ UsualGroup Vertical - Auto true true Auto @@ -267,7 +265,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -469,7 +466,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -498,7 +494,6 @@ UsualGroup Vertical - Auto true true Auto @@ -652,7 +647,6 @@ UsualGroup AlwaysHorizontal - Auto true true DontUse diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииКодПодтверждения/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииКодПодтверждения/Module.bsl index 66cc9715e..33e113651 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииКодПодтверждения/Module.bsl +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииКодПодтверждения/Module.bsl @@ -157,7 +157,6 @@ КонецПроцедуры -//@skip-warning &НаКлиенте Процедура Подключаемый_ПодтверждениеОбработчикОжидания() diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииМобильноеПриложение/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииМобильноеПриложение/Form.form index 76f7f5b65..c6d913735 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииМобильноеПриложение/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииМобильноеПриложение/Form.form @@ -114,7 +114,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -143,7 +142,6 @@ UsualGroup Vertical - Auto true true Auto @@ -305,7 +303,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -436,7 +433,6 @@ UsualGroup Vertical - Auto true true Auto @@ -561,7 +557,6 @@ UsualGroup AlwaysHorizontal - Auto true true DontUse diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииМобильноеПриложение/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииМобильноеПриложение/Module.bsl index 75ad43b30..6bccd69f5 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииМобильноеПриложение/Module.bsl +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииМобильноеПриложение/Module.bsl @@ -122,7 +122,6 @@ КонецПроцедуры -//@skip-warning &НаКлиенте Процедура Подключаемый_ПодтверждениеОбработчикОжидания() diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОфлайн/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОфлайн/Form.form index 09e21c305..594f4c316 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОфлайн/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОфлайн/Form.form @@ -113,7 +113,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -142,7 +141,6 @@ UsualGroup Vertical - Auto true Auto Auto @@ -266,7 +264,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -411,7 +408,6 @@ UsualGroup Vertical - Auto true true Auto @@ -618,7 +614,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -647,7 +642,6 @@ UsualGroup Vertical - Auto true true Auto @@ -801,7 +795,6 @@ UsualGroup HorizontalIfPossible - Auto true true DontUse diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОфлайн/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОфлайн/Module.bsl index 0d3c5d425..6c7374cba 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОфлайн/Module.bsl +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОфлайн/Module.bsl @@ -138,7 +138,6 @@ КонецПроцедуры -//@skip-warning &НаКлиенте Процедура Подключаемый_ПодтверждениеОбработчикОжидания() diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОшибка/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОшибка/Form.form index 20fb42982..57657a7fe 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОшибка/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОшибка/Form.form @@ -95,7 +95,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -182,7 +181,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеПользователя/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеПользователя/Form.form index 69c9890b8..1d2866180 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеПользователя/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеПользователя/Form.form @@ -233,7 +233,6 @@ UsualGroup Vertical - Auto true true Auto @@ -262,7 +261,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -392,7 +390,6 @@ UsualGroup Vertical - Auto true true Auto @@ -421,7 +418,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -542,7 +538,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеПользователя/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеПользователя/Module.bsl index f3e3018ad..58ebafa93 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеПользователя/Module.bsl +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеПользователя/Module.bsl @@ -118,8 +118,6 @@ // Параметры: // Команда - КомандаФормы // -//@skip-warning -// &НаКлиенте Процедура Подключаемый_НажатиеКнопки(Команда) diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПроверкаСервиса/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПроверкаСервиса/Form.form index 3f081e267..3debaffc0 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПроверкаСервиса/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПроверкаСервиса/Form.form @@ -107,7 +107,6 @@ HorizontalIfPossible Right - Auto WeakSeparation true true @@ -165,7 +164,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -195,7 +193,6 @@ UsualGroup Vertical - Auto true true @@ -264,7 +261,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -328,7 +324,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СвойствоСертификата/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СвойствоСертификата/Form.form index 368dbd7ec..10ced494c 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СвойствоСертификата/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СвойствоСертификата/Form.form @@ -262,7 +262,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -338,7 +337,6 @@ UsualGroup Vertical - Auto true true Auto @@ -499,7 +497,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -818,7 +815,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СменаПинКода/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СменаПинКода/Form.form index f74fb567a..75efffe8f 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СменаПинКода/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СменаПинКода/Form.form @@ -98,7 +98,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -217,7 +216,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -335,7 +333,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -453,7 +450,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -551,7 +547,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -638,7 +633,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СменаПинКода/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СменаПинКода/Module.bsl index 351ec8945..6aca65dbc 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СменаПинКода/Module.bsl +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СменаПинКода/Module.bsl @@ -26,7 +26,7 @@ ПояснениеОперации = Параметры.ПояснениеОперации; Обязательно = Параметры.Обязательно; НастройкиПользователя = Параметры.НастройкиПользователя; - СкрыватьПароль = СервисКриптографииDSSСлужебный.НужнаяВерсияПлатформы("8.3.19.0"); + СкрыватьПароль = Истина; КлючСохраненияПоложенияОкна = "НастройкиФормы_" + РежимФормы; ПодготовитьФорму(); @@ -176,11 +176,17 @@ &НаКлиенте Процедура ОткрытьВидимостьЭлемента(ИмяЭлемента) - Элементы[ИмяЭлемента].КартинкаКнопкиВыбора = КартинкаОткрыть; - Элементы[ИмяЭлемента].РежимПароля = Ложь; - ЭтотОбъект[ИмяЭлемента] = Элементы[ИмяЭлемента].ТекстРедактирования; - Если СкрыватьПароль Тогда - ПодключитьОбработчикОжидания("ПодключаемыйОтключитьВидимостьПароля", 2, Истина); + ЭлементПароля = Элементы[ИмяЭлемента]; + Если ЭлементПароля.РежимПароля Тогда + Элементы[ИмяЭлемента].КартинкаКнопкиВыбора = КартинкаОткрыть; + ЭтотОбъект[ИмяЭлемента] = Элементы[ИмяЭлемента].ТекстРедактирования; + ЭлементПароля.РежимПароля = Ложь; + Если СкрыватьПароль Тогда + ПодключитьОбработчикОжидания("ПодключаемыйОтключитьВидимостьПароля", 2, Истина); + КонецЕсли; + ИначеЕсли СкрыватьПароль Тогда + ЭлементПароля.РежимПароля = Истина; + Элементы[ИмяЭлемента].КартинкаКнопкиВыбора = КартинкаЗакрыть; КонецЕсли; КонецПроцедуры @@ -195,12 +201,9 @@ Для каждого СтрокаМассива Из МассивЭлементов Цикл ЭлементФормы = Элементы[СтрокаМассива]; - Если ЭлементФормы.РежимПароля <> Истина Тогда - ТекущийТекст = ЭлементФормы.ТекстРедактирования; + Если НЕ ЭлементФормы.РежимПароля Тогда ЭлементФормы.КартинкаКнопкиВыбора = КартинкаЗакрыть; ЭлементФормы.РежимПароля = Истина; - ЭтотОбъект[СтрокаМассива] = ТекущийТекст; - ЭлементФормы.ОбновитьТекстРедактирования(); КонецЕсли; КонецЦикла; @@ -224,8 +227,8 @@ &НаСервере Процедура ПодготовитьФорму() - КартинкаОткрыть = БиблиотекаКартинок.ВидимостьПароляОткрыто; - КартинкаЗакрыть = БиблиотекаКартинок.ВидимостьПароляЗакрыто; + КартинкаОткрыть = СервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ВводимыеСимволыСкрыты"); + КартинкаЗакрыть = СервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ВводимыеСимволыВидны"); КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); Если РежимФормы = "Установка" Тогда diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаУчетнойЗаписи/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаУчетнойЗаписи/Form.form index 1c56b58d7..6c9aab849 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаУчетнойЗаписи/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаУчетнойЗаписи/Form.form @@ -228,7 +228,6 @@ UsualGroup HorizontalIfPossible - Auto true true @@ -402,7 +401,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -488,7 +486,6 @@ UsualGroup Vertical - Auto true true Auto @@ -651,7 +648,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -788,7 +784,6 @@ Vertical Left - Auto true true Auto @@ -940,7 +935,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -971,7 +965,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаЭкземпляраСервераDSS/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаЭкземпляраСервераDSS/Form.form index c1cc831db..455df658f 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаЭкземпляраСервераDSS/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаЭкземпляраСервераDSS/Form.form @@ -119,7 +119,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -148,7 +147,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -284,7 +282,6 @@ UsualGroup AlwaysHorizontal - Auto true true auto @@ -429,7 +426,6 @@ UsualGroup AlwaysHorizontal - Auto true true auto @@ -528,7 +524,6 @@ UsualGroup HorizontalIfPossible - Auto true true auto @@ -624,7 +619,6 @@ UsualGroup HorizontalIfPossible - Auto true true auto @@ -714,7 +708,6 @@ UsualGroup HorizontalIfPossible - Auto true true auto @@ -800,7 +793,6 @@ UsualGroup HorizontalIfPossible - Auto true true auto @@ -906,7 +898,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/ManagerModule.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/ManagerModule.bsl index 88521bb94..ef5a56964 100644 --- a/SSL/src/DataProcessors/УправлениеПодключениемDSS/ManagerModule.bsl +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/ManagerModule.bsl @@ -366,7 +366,7 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат ПодготовитьРезультатВызова(Результат, АдресРезультата, ВидОперации); @@ -386,7 +386,7 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат ПодготовитьРезультатВызова(Результат, АдресРезультата, ВидОперации); @@ -454,7 +454,7 @@ Если Не ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда Результат.Ошибка = НСтр("ru = 'Невозможно подключиться к порталу интернет-поддержки по причине: - |Библиотека интернет поддержки пользователей не внедрена в конфигурацию.'"); + |Библиотека интернет-поддержки пользователей не внедрена в конфигурацию.'"); Возврат ПодготовитьРезультатВызова(Результат, АдресРезультата, ВидОперации); КонецЕсли; @@ -1036,7 +1036,7 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат Результат; КонецПопытки; @@ -1139,7 +1139,7 @@ + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось разобрать результат выполнения метода %1 сервиса 1С:Подпись по причине: %2'"), "ReceivePacket", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; УдалитьФайлы(ИмяФайлаПакетОтвета); @@ -1258,7 +1258,7 @@ Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось разобрать результат выполнения метода %1 сервиса 1С:Подпись по причине: %2'"), "ReceiveUpdatedPacket", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; УдалитьФайлы(ИмяФайлаПакетОтвета); @@ -1287,7 +1287,7 @@ Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось разобрать результат выполнения метода %1 сервиса 1С:Подпись по причине: %2'"), "ReceiveUpdatedPacket", - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; КонецЕсли; @@ -1605,7 +1605,7 @@ ИнформацияОбОшибке = ПолучитьИнформациюОбОшибке(ИнформацияОбОшибке()); ВидОперации = НСтр("ru = 'Установление соединения с сервером интернета.'", ОбщегоНазначения.КодОсновногоЯзыка()); - ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); ПодготовитьРезультатВызова(ОписаниеОшибки, Неопределено, ВидОперации); Возврат Неопределено; @@ -1667,7 +1667,7 @@ ДанныеОшибки = ИнформацияОбОшибке(); ВидОперации = НСтр("ru = 'Вызов REST сервиса.'", ОбщегоНазначения.КодОсновногоЯзыка()) + ПараметрыПодключения.АдресСервера; - Результат.Ошибка = КраткоеПредставлениеОшибки(ДанныеОшибки); + Результат.Ошибка = ОбработкаОшибок.КраткоеПредставлениеОшибки(ДанныеОшибки); ПодготовитьРезультатВызова(Результат.Ошибка, Неопределено, ВидОперации); КонецПопытки; diff --git a/SSL/src/DataProcessors/УстановкаОбновлений/Forms/НастройкаРезервнойКопии/Form.form b/SSL/src/DataProcessors/УстановкаОбновлений/Forms/НастройкаРезервнойКопии/Form.form index e72e02c45..724689161 100644 --- a/SSL/src/DataProcessors/УстановкаОбновлений/Forms/НастройкаРезервнойКопии/Form.form +++ b/SSL/src/DataProcessors/УстановкаОбновлений/Forms/НастройкаРезервнойКопии/Form.form @@ -146,7 +146,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -452,7 +451,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/DataProcessors/УстановкаОбновлений/Forms/ОбновлениеНеПодходит/Form.form b/SSL/src/DataProcessors/УстановкаОбновлений/Forms/ОбновлениеНеПодходит/Form.form index 2314cf676..b67527098 100644 --- a/SSL/src/DataProcessors/УстановкаОбновлений/Forms/ОбновлениеНеПодходит/Form.form +++ b/SSL/src/DataProcessors/УстановкаОбновлений/Forms/ОбновлениеНеПодходит/Form.form @@ -96,7 +96,6 @@ UsualGroup AlwaysHorizontal - Auto NormalSeparation true true @@ -316,6 +315,7 @@ true true AsFileRef + Top true Bottom diff --git a/SSL/src/DataProcessors/УстановкаОбновлений/Forms/Форма/Form.form b/SSL/src/DataProcessors/УстановкаОбновлений/Forms/Форма/Form.form index 09a3e7e91..197d13ffc 100644 --- a/SSL/src/DataProcessors/УстановкаОбновлений/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/УстановкаОбновлений/Forms/Форма/Form.form @@ -151,7 +151,6 @@ UsualGroup Vertical - Auto true true Auto @@ -180,7 +179,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -289,7 +287,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -703,7 +700,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -733,7 +729,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -802,7 +797,6 @@ HorizontalIfPossible Bottom - Auto true true Auto @@ -1488,7 +1482,6 @@ UsualGroup HorizontalIfPossible - Auto true true @@ -1522,7 +1515,6 @@ HorizontalIfPossible Center - Auto NormalSeparation true true @@ -1631,7 +1623,6 @@ HorizontalIfPossible Bottom - Auto NormalSeparation true true @@ -1661,7 +1652,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1845,7 +1835,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2004,7 +1993,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2366,7 +2354,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2558,7 +2545,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2587,7 +2573,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -2617,7 +2602,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -2754,7 +2738,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -2816,7 +2799,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -2953,7 +2935,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3025,7 +3006,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -3055,7 +3035,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -3191,7 +3170,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3293,7 +3271,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3322,7 +3299,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -3553,7 +3529,6 @@ HorizontalIfPossible Bottom - Auto true true Auto diff --git a/SSL/src/DataProcessors/УстановкаОбновлений/Templates/ЗаставкаОбновленияКонфигурации/Template.txt b/SSL/src/DataProcessors/УстановкаОбновлений/Templates/ЗаставкаОбновленияКонфигурации/Template.txt index c0b2e0bc8..14a53a878 100644 --- a/SSL/src/DataProcessors/УстановкаОбновлений/Templates/ЗаставкаОбновленияКонфигурации/Template.txt +++ b/SSL/src/DataProcessors/УстановкаОбновлений/Templates/ЗаставкаОбновленияКонфигурации/Template.txt @@ -2,7 +2,7 @@ - + diff --git a/SSL/src/DefinedTypes/ВерсионируемыеДанные/ВерсионируемыеДанные.mdo b/SSL/src/DefinedTypes/ВерсионируемыеДанные/ВерсионируемыеДанные.mdo index ec5363a52..27b8e3fc3 100644 --- a/SSL/src/DefinedTypes/ВерсионируемыеДанные/ВерсионируемыеДанные.mdo +++ b/SSL/src/DefinedTypes/ВерсионируемыеДанные/ВерсионируемыеДанные.mdo @@ -9,6 +9,7 @@ Версионируемые данные + CatalogRef.РассылкиОтчетов CatalogRef.ИдентификаторыОбъектовМетаданных CatalogRef.ВидыКонтактнойИнформации diff --git a/SSL/src/DefinedTypes/ВерсионируемыеДанныеОбъект/ВерсионируемыеДанныеОбъект.mdo b/SSL/src/DefinedTypes/ВерсионируемыеДанныеОбъект/ВерсионируемыеДанныеОбъект.mdo index 5728bd9ab..441201b90 100644 --- a/SSL/src/DefinedTypes/ВерсионируемыеДанныеОбъект/ВерсионируемыеДанныеОбъект.mdo +++ b/SSL/src/DefinedTypes/ВерсионируемыеДанныеОбъект/ВерсионируемыеДанныеОбъект.mdo @@ -9,6 +9,7 @@ Версионируемые данные объект + CatalogObject.РассылкиОтчетов CatalogObject.ВидыКонтактнойИнформации CatalogObject.ИдентификаторыОбъектовМетаданных diff --git a/SSL/src/DefinedTypes/ВладелецДополнительныхСведений/ВладелецДополнительныхСведений.mdo b/SSL/src/DefinedTypes/ВладелецДополнительныхСведений/ВладелецДополнительныхСведений.mdo index d7d55ce4e..827d59daf 100644 --- a/SSL/src/DefinedTypes/ВладелецДополнительныхСведений/ВладелецДополнительныхСведений.mdo +++ b/SSL/src/DefinedTypes/ВладелецДополнительныхСведений/ВладелецДополнительныхСведений.mdo @@ -19,6 +19,7 @@ DocumentRef.Встреча CatalogRef.Файлы DocumentRef.ОтзывСогласияНаОбработкуПерсональныхДанных + CatalogRef.ДополнительныеОтчетыИОбработки DocumentRef.СообщениеSMS CatalogRef.Пользователи diff --git a/SSL/src/DefinedTypes/МестоХраненияФункциональныхОпций/МестоХраненияФункциональныхОпций.mdo b/SSL/src/DefinedTypes/МестоХраненияФункциональныхОпций/МестоХраненияФункциональныхОпций.mdo index 28eb3bd3b..3fa4affab 100644 --- a/SSL/src/DefinedTypes/МестоХраненияФункциональныхОпций/МестоХраненияФункциональныхОпций.mdo +++ b/SSL/src/DefinedTypes/МестоХраненияФункциональныхОпций/МестоХраненияФункциональныхОпций.mdo @@ -39,7 +39,6 @@ ConstantValueManager.ИспользоватьДополнительныеОтчетыИОбработки ConstantValueManager.ИспользоватьДополнительныеРеквизитыИСведения ConstantValueManager.ДатаОбновленияПовторноИспользуемыхЗначенийМРО - ConstantValueManager.ИспользоватьОнлайнПоддержку ConstantValueManager.ИспользоватьРазделениеПоОбластямДанных ConstantValueManager.ИспользоватьСинхронизациюДанныхВМоделиСервисаСЛокальнойПрограммой ConstantValueManager.ИспользоватьГруппыПользователей diff --git a/SSL/src/DefinedTypes/ОбменДаннымиУчетныеЗаписиЭлектроннойПочты/ОбменДаннымиУчетныеЗаписиЭлектроннойПочты.mdo b/SSL/src/DefinedTypes/ОбменДаннымиУчетныеЗаписиЭлектроннойПочты/ОбменДаннымиУчетныеЗаписиЭлектроннойПочты.mdo new file mode 100644 index 000000000..0d939e4f8 --- /dev/null +++ b/SSL/src/DefinedTypes/ОбменДаннымиУчетныеЗаписиЭлектроннойПочты/ОбменДаннымиУчетныеЗаписиЭлектроннойПочты.mdo @@ -0,0 +1,14 @@ + + + + + + ОбменДаннымиУчетныеЗаписиЭлектроннойПочты + + ru + Обмен данными учетные записи электронной почты + + + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + diff --git a/SSL/src/DocumentJournals/Взаимодействия/Forms/НастройкиРаботыСПочтой/Form.form b/SSL/src/DocumentJournals/Взаимодействия/Forms/НастройкиРаботыСПочтой/Form.form index 35042a03b..c0fbdab10 100644 --- a/SSL/src/DocumentJournals/Взаимодействия/Forms/НастройкиРаботыСПочтой/Form.form +++ b/SSL/src/DocumentJournals/Взаимодействия/Forms/НастройкиРаботыСПочтой/Form.form @@ -169,7 +169,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -394,7 +393,6 @@ UsualGroup Vertical - Auto true true Auto @@ -743,7 +741,6 @@ UsualGroup Vertical - Auto true true Auto @@ -944,7 +941,6 @@ UsualGroup Vertical - Auto true true auto diff --git a/SSL/src/DocumentJournals/Взаимодействия/Forms/НастройкиРаботыСПочтой/Module.bsl b/SSL/src/DocumentJournals/Взаимодействия/Forms/НастройкиРаботыСПочтой/Module.bsl index 085b6ea4e..64eda5346 100644 --- a/SSL/src/DocumentJournals/Взаимодействия/Forms/НастройкиРаботыСПочтой/Module.bsl +++ b/SSL/src/DocumentJournals/Взаимодействия/Forms/НастройкиРаботыСПочтой/Module.bsl @@ -14,7 +14,7 @@ ИнформационнаяБазаФайловая = ОбщегоНазначения.ИнформационнаяБазаФайловая(); ОтправлятьПисьмаВФорматеHTML = ПолучитьФункциональнуюОпцию("ОтправлятьПисьмаВФорматеHTML"); - НастройкиХранилище = Взаимодействия.ПолучитьНастройкуРаботаСПочтой(); + НастройкиХранилище = Взаимодействия.НастройкиРаботыСПочтой(); ВключатьПодписьДляНовыхСообщений = ?(НастройкиХранилище.Свойство("ВключатьПодписьДляНовыхСообщений"), НастройкиХранилище.ВключатьПодписьДляНовыхСообщений,Истина); @@ -228,7 +228,7 @@ СтруктураНастройки.Вставить("ВключатьТелоИсходногоПисьма", ВключатьТелоИсходногоПисьма); СтруктураНастройки.Вставить("ОтправлятьСообщенияСразу", ОтправлятьСообщенияСразу); - Взаимодействия.СохранитьНастройкуРаботаСПочтой(СтруктураНастройки); + Взаимодействия.СохранитьНастройкиРаботыСПочтой(СтруктураНастройки); КонецПроцедуры diff --git a/SSL/src/DocumentJournals/Взаимодействия/Forms/ПараметрыЭлектронногоПисьма/Form.form b/SSL/src/DocumentJournals/Взаимодействия/Forms/ПараметрыЭлектронногоПисьма/Form.form index c134656ff..b0118564a 100644 --- a/SSL/src/DocumentJournals/Взаимодействия/Forms/ПараметрыЭлектронногоПисьма/Form.form +++ b/SSL/src/DocumentJournals/Взаимодействия/Forms/ПараметрыЭлектронногоПисьма/Form.form @@ -123,7 +123,6 @@ UsualGroup Vertical - Auto true true Auto @@ -233,7 +232,6 @@ UsualGroup Vertical - Auto true true Auto @@ -262,7 +260,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -411,7 +408,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/DocumentJournals/Взаимодействия/Forms/ПечатьЭлектронногоПисьма/Form.form b/SSL/src/DocumentJournals/Взаимодействия/Forms/ПечатьЭлектронногоПисьма/Form.form index ae72e61c8..d8310b78f 100644 --- a/SSL/src/DocumentJournals/Взаимодействия/Forms/ПечатьЭлектронногоПисьма/Form.form +++ b/SSL/src/DocumentJournals/Взаимодействия/Forms/ПечатьЭлектронногоПисьма/Form.form @@ -90,7 +90,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -203,7 +202,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1195,6 +1193,16 @@ DocumentRef.ЭлектронноеПисьмоВходящее + + Письмо + + DocumentRef.ЭлектронноеПисьмоИсходящее + CatalogRef.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы + DocumentRef.ЭлектронноеПисьмоВходящее + CatalogRef.ЭлектронноеПисьмоВходящееПрисоединенныеФайлы + + true + diff --git a/SSL/src/DocumentJournals/Взаимодействия/Forms/ПечатьЭлектронногоПисьма/Module.bsl b/SSL/src/DocumentJournals/Взаимодействия/Forms/ПечатьЭлектронногоПисьма/Module.bsl index 71b8d1425..cf492a1ab 100644 --- a/SSL/src/DocumentJournals/Взаимодействия/Forms/ПечатьЭлектронногоПисьма/Module.bsl +++ b/SSL/src/DocumentJournals/Взаимодействия/Forms/ПечатьЭлектронногоПисьма/Module.bsl @@ -11,16 +11,9 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - Если НЕ Параметры.Свойство("Письмо") Тогда - Отказ = Истина; - Возврат; - КонецЕсли; - ЗапрещенныеРасширения = РаботаСФайламиСлужебный.СписокЗапрещенныхРасширений(); - ЗаполнитьЗначенияСвойств(ЭтотОбъект,Параметры,, "ЗакрыватьПриВыборе, ЗакрыватьПриЗакрытииВладельца, ТолькоПросмотр"); Письмо = Параметры.Письмо; - Элементы.ГруппаПисьмоОснованиеПечать.Видимость = НеВызыватьКомандуПечати; УстановитьТекстПисьмаHTML(Отказ); @@ -375,9 +368,7 @@ Процедура СформироватьЗаголовокФормы(Письмо) Если НЕ НеВызыватьКомандуПечати Тогда - Возврат; - КонецЕсли; Если ТипЗнч(Письмо) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") Тогда @@ -401,7 +392,7 @@ &НаКлиенте Функция ПараметрыОткрытияПисьмаВложения() - ПараметрыВложения = ВзаимодействияКлиент.ПустаяСтруктураПараметровПисьмаВложения(); + ПараметрыВложения = ВзаимодействияКлиент.ПараметрыПисьмаВложения(); ПараметрыВложения.ДатаПисьмаОснования = ДатаПисьма; ПараметрыВложения.ТемаПисьмаОснования = ТемаПисьма; diff --git a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Form.form b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Form.form index ce2ae16b2..6ab4eae45 100644 --- a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Form.form +++ b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Form.form @@ -106,7 +106,6 @@ UsualGroup AlwaysHorizontal - Auto WeakSeparation true true @@ -137,7 +136,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -539,7 +537,6 @@ UsualGroup AlwaysHorizontal - Auto true Button true @@ -2430,7 +2427,7 @@ Left - 0 + Form.Item.КонтактыПанелиНавигации.StandardCommand.OutputList Normal Auto true @@ -3354,6 +3351,45 @@ true + + ЗакладкиСсылка + 940 + true + true + + + Закладки.Ref + + + ЗакладкиСсылкаРасширеннаяПодсказка + 942 + Label + true + true + + Left + + + + ЗакладкиСсылкаКонтекстноеМеню + 941 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + ЗакладкиКоманднаяПанель 121 @@ -5567,7 +5603,6 @@ UsualGroup Vertical - Auto true true Auto @@ -6845,7 +6880,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -7008,7 +7042,6 @@ UsualGroup Vertical - Auto true true Auto @@ -7037,7 +7070,6 @@ UsualGroup AlwaysHorizontal - Auto true true LeftNarrowest @@ -7067,7 +7099,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Module.bsl b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Module.bsl index ccdc37766..743eceb73 100644 --- a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Module.bsl @@ -866,10 +866,8 @@ &НаКлиенте Процедура ОтправитьПолучитьПочтуВыполнить(Команда) - ОчиститьСообщения(); - - Если (Не РазделениеВключено) - И (Не ИнформационнаяБазаФайловая) Тогда + ОчиститьСообщения(); + Если Не РазделениеВключено И Не ИнформационнаяБазаФайловая Тогда Возврат; КонецЕсли; @@ -3544,31 +3542,21 @@ ВзаимодействияКлиентСервер.ОтборДинамическогоСписка(Список).Элементы, "ОтборПанелиНавигации"); Если ГруппаОтбораПоПанелиНавигации = Неопределено Тогда - Результат.ТекстСообщенияОшибка = НСтр("ru = 'Не выбран элемент для добавления в закладки.'"); - Возврат Результат; + Результат.ТекстСообщенияОшибка = НСтр("ru = 'Не выбран элемент для добавления в закладки.'"); + Возврат Результат; КонецЕсли; СкопироватьОтбор(КомпоновщикНастроек.Настройки.Отбор, ГруппаОтбораПоПанелиНавигации, Истина); Если ИмяЭлементаФормы = "ПредметыПанельНавигации" Тогда Если ОбщегоНазначения.ЗначениеСсылочногоТипа(ДанныеДляОбработки.Значение) Тогда - НаименованиеЗакладки = НСтр("ru = 'Предмет'") + " = " + Строка(ДанныеДляОбработки.Значение); Текст = ?(ТолькоПочта, НСтр("ru = 'Письма по предмету %1'"), НСтр("ru = 'Взаимодействия по предмету %1'")); Результат.ПредставлениеЭлемента = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Текст, ОбщегоНазначения.ПредметСтрокой(ДанныеДляОбработки.Значение)); Результат.НавигационнаяСсылкаЭлемента = ПолучитьНавигационнуюСсылку(ДанныеДляОбработки.Значение); - - ИначеЕсли ДанныеДляОбработки.Значение = "НеУказан" Тогда - - НаименованиеЗакладки = НСтр("ru = 'Предмет не указан'"); - Результат.ПредставлениеЭлемента = ?(ТолькоПочта, НСтр("ru = 'Письма без предмета'"), НСтр("ru = 'Взаимодействия без предмета'")); - Иначе - - НаименованиеЗакладки = НСтр("ru = 'Тип предмета'") + " " + Строка(ДанныеДляОбработки.ОписаниеТипов.Типы()[0]); - Результат.ПредставлениеЭлемента = ?(ТолькоПочта, НСтр("ru = 'Письма по: %1'"), НСтр("ru = 'Взаимодействия по: %1'")); - Результат.ПредставлениеЭлемента = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Результат.ПредставлениеЭлемента, ДанныеДляОбработки.ОписаниеТипов.Типы()[0]); - + Результат.ТекстСообщенияОшибка = НСтр("ru = 'Не выбран элемент для добавления в закладки.'"); + Возврат Результат; КонецЕсли; ИначеЕсли ИмяЭлементаФормы = "Свойства" Тогда @@ -3596,24 +3584,14 @@ ИначеЕсли ИмяЭлементаФормы = "КонтактыПанелиНавигации" Тогда Если ОбщегоНазначения.ЗначениеСсылочногоТипа(ДанныеДляОбработки.Значение) Тогда - НаименованиеЗакладки = НСтр("ru = 'Контакт'") + " = " + Строка(ДанныеДляОбработки.Значение); Текст = ?(ТолькоПочта, НСтр("ru = 'Письма по контакту %1'"), НСтр("ru = 'Взаимодействия по контакту %1'")); Результат.ПредставлениеЭлемента = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Текст, ОбщегоНазначения.ПредметСтрокой(ДанныеДляОбработки.Значение)); Результат.НавигационнаяСсылкаЭлемента = ПолучитьНавигационнуюСсылку(ДанныеДляОбработки.Значение); - - ИначеЕсли ДанныеДляОбработки.Значение = НСтр("ru = 'Контакт не подобран'") Тогда - - НаименованиеЗакладки = НСтр("ru = 'Контакт не указан'"); - Результат.ПредставлениеЭлемента = ?(ТолькоПочта, НСтр("ru = 'Письма без подобранных контактов'"), НСтр("ru = 'Взаимодействия без подобранных контактов'")); - Иначе - - НаименованиеЗакладки = НСтр("ru = 'Тип контакта'") + " " + Строка(ДанныеДляОбработки.ОписаниеТипов.Типы()[0]); - Результат.ПредставлениеЭлемента = ?(ТолькоПочта, НСтр("ru = 'Письма по контактам: %1'"), НСтр("ru = 'Взаимодействия по контактам: %1'")); - Результат.ПредставлениеЭлемента = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Результат.ПредставлениеЭлемента, ДанныеДляОбработки.ОписаниеТипов.Типы()[0]); - + Результат.ТекстСообщенияОшибка = НСтр("ru = 'Не выбран элемент для добавления в закладки.'"); + Возврат Результат; КонецЕсли; ИначеЕсли ИмяЭлементаФормы = "Папки" Тогда @@ -3845,9 +3823,10 @@ Если Не Результат.ЕстьОшибка Тогда РасширенныйПоиск = Истина; - ТекстОповещения = ?(ТолькоПочта, НСтр("ru = 'Найдено писем - %1.'"), НСтр("ru = 'Найдено взаимодействий - %1.'")); - ТекстОповещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОповещения, Строка(Результат.КоличествоЭлементовНайдено)); - ПоказатьОповещениеПользователя(ТекстОповещения); + ТекстОповещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ?(ТолькоПочта, НСтр("ru = 'Найдено писем: %1.'"), НСтр("ru = 'Найдено взаимодействий: %1.'")), + Строка(Результат.КоличествоЭлементовНайдено)); + ПоказатьОповещениеПользователя(НСтр("ru = 'Результаты поиска'"),, ТекстОповещения); ТекущиеДанные = Элементы.Список.ТекущиеДанные; Если ТекущиеДанные <> Неопределено Тогда ЗаполнитьОписаниеНайденоПолнотекстовымПоиском(Элементы.Список.ТекущиеДанные.Ссылка); @@ -4308,9 +4287,8 @@ Процедура ОтправитьПолучитьПочтуПользователяКлиент(ВыводитьПрогресс = Ложь) ОчиститьСообщения(); - - УправлениеЭлектроннойПочтойКлиент.ОтправитьЗагрузитьПочтуПользователя(УникальныйИдентификатор, ЭтотОбъект, Элементы.Список, ВыводитьПрогресс); - + УправлениеЭлектроннойПочтойКлиент.ОтправитьЗагрузитьПочтуПользователя(УникальныйИдентификатор, ЭтотОбъект, + Элементы.Список, ВыводитьПрогресс); ПодключитьОбработчикОжидания("ПроверитьНеобходимостьОтправкиПолученияПочты", 30, Истина); КонецПроцедуры diff --git a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСпискаПараметрическая/Form.form b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСпискаПараметрическая/Form.form index 5b72002d4..e14a4b24b 100644 --- a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСпискаПараметрическая/Form.form +++ b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСпискаПараметрическая/Form.form @@ -27,7 +27,6 @@ UsualGroup Vertical - Auto true true auto @@ -393,7 +392,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto diff --git a/SSL/src/DocumentJournals/СогласияНаОбработкуПерсональныхДанных/Forms/ФормаСписка/Form.form b/SSL/src/DocumentJournals/СогласияНаОбработкуПерсональныхДанных/Forms/ФормаСписка/Form.form index 1033da058..a91c2add9 100644 --- a/SSL/src/DocumentJournals/СогласияНаОбработкуПерсональныхДанных/Forms/ФормаСписка/Form.form +++ b/SSL/src/DocumentJournals/СогласияНаОбработкуПерсональныхДанных/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -412,6 +411,45 @@ true + + Ссылка + 50 + true + true + + + Список.Ref + + + СсылкаРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 51 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + None СписокКоманднаяПанель diff --git a/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Form.form b/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Form.form index dcb0e9cb9..6d8704024 100644 --- a/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Form.form +++ b/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Form.form @@ -528,7 +528,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -686,7 +685,6 @@ UsualGroup Vertical - Auto true true Auto @@ -850,7 +848,6 @@ UsualGroup Vertical - Auto true true Auto @@ -879,7 +876,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1053,7 +1049,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1320,6 +1315,7 @@ CommonPicture.КоллекцияДеревоАнкеты + Top true true @@ -1347,7 +1343,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1413,7 +1408,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -1559,7 +1553,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1591,7 +1584,6 @@ Vertical Center Center - Auto WeakSeparation true true @@ -1621,7 +1613,6 @@ UsualGroup HorizontalIfPossible - Auto true true LeftNarrowest diff --git a/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Module.bsl b/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Module.bsl index 0906bf0be..244217250 100644 --- a/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Module.bsl +++ b/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Module.bsl @@ -383,7 +383,7 @@ Если СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда - ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(СтрокаДерева.ЭлементарныйВопрос,ЭтотОбъект); + ВариантыОтветовНаВопрос = Анкетирование.ВариантыОтветовНаВопрос(СтрокаДерева.ЭлементарныйВопрос,ЭтотОбъект); Пока ВыборкаВопрос.Следующий() Цикл @@ -628,7 +628,7 @@ Если ВыборкаВопрос.ЭлементарныйВопрос.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда - ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(ВыборкаВопрос.ЭлементарныйВопрос,ЭтотОбъект); + ВариантыОтветовНаВопрос = Анкетирование.ВариантыОтветовНаВопрос(ВыборкаВопрос.ЭлементарныйВопрос,ЭтотОбъект); ПараметрыОтвета = НайтиОтветВМассиве(ВыборкаВопрос.Ответ,ВариантыОтветовНаВопрос); @@ -990,7 +990,7 @@ Иначе - ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(СтрокаДерева.ЭлементарныйВопрос,ЭтотОбъект); + ВариантыОтветовНаВопрос = Анкетирование.ВариантыОтветовНаВопрос(СтрокаДерева.ЭлементарныйВопрос,ЭтотОбъект); Счетчик = 0; Для каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл @@ -1042,7 +1042,7 @@ Иначе - ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(СтрокаКомплексногоВопроса.ЭлементарныйВопрос,ЭтотОбъект); + ВариантыОтветовНаВопрос = Анкетирование.ВариантыОтветовНаВопрос(СтрокаКомплексногоВопроса.ЭлементарныйВопрос,ЭтотОбъект); Счетчик = 0; Для каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл @@ -1353,19 +1353,17 @@ Для каждого ЭлементКоллекции Из ПодчиненныеВопросы Цикл - ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(ЭлементКоллекции.Вопрос); - + ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(ЭлементКоллекции.Вопрос); Для каждого ПодчиненныйВопрос Из ЭлементКоллекции.Подчиненные Цикл - Элементы[ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса].ТолькоПросмотр = (НЕ ЭтотОбъект[ИмяВопроса]); - Если СтрЧислоВхождений(ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса,"Реквизит") = 0 Тогда - + ЭлементПодчиненногоВопроса = Элементы[ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса]; + ЭлементПодчиненногоВопроса.ТолькоПросмотр = Не ЭтотОбъект[ИмяВопроса]; + Если СтрЧислоВхождений(ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса, "Реквизит") = 0 Тогда Попытка - Элементы[ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса].АвтоОтметкаНезаполненного = (ЭтотОбъект[ИмяВопроса] И ПодчиненныйВопрос.Обязательный); + ЭлементПодчиненногоВопроса.АвтоОтметкаНезаполненного = ЭтотОбъект[ИмяВопроса] И ПодчиненныйВопрос.Обязательный; Исключение - // У флажка и переключателя нет свойства АвтоОтметкаНезаполненного. + // АПК:280 У флажка и переключателя нет свойства АвтоОтметкаНезаполненного. КонецПопытки; - КонецЕсли; КонецЦикла; КонецЦикла; @@ -1452,7 +1450,7 @@ УстановитьОбработчикСобытияПриИзмененииДляКомплексныхВопросов(СтрокаТаблицы, ИмяВопроса); Иначе Если СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда - ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(СтрокаТаблицы.ЭлементарныйВопрос,ЭтотОбъект); + ВариантыОтветовНаВопрос = Анкетирование.ВариантыОтветовНаВопрос(СтрокаТаблицы.ЭлементарныйВопрос,ЭтотОбъект); Для инд = 1 По ВариантыОтветовНаВопрос.Количество() Цикл Элементы[ИмяВопроса + "_Реквизит_" + инд].УстановитьДействие("ПриИзменении","Подключаемый_ПриИзмененииВопроса"); Если ВариантыОтветовНаВопрос[инд-1].ТребуетОткрытогоОтвета Тогда @@ -1485,7 +1483,7 @@ КонецЕсли; Если РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда - ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(СтрокаКомплексногоВопроса.ЭлементарныйВопрос,ЭтотОбъект); + ВариантыОтветовНаВопрос = Анкетирование.ВариантыОтветовНаВопрос(СтрокаКомплексногоВопроса.ЭлементарныйВопрос,ЭтотОбъект); Для инд = 1 По ВариантыОтветовНаВопрос.Количество() Цикл ИмяРеквизитаВопроса = ИмяВопроса + "_Ответ_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки, "ЧГ=") + "_Реквизит_" + инд; Элементы[ИмяРеквизитаВопроса].УстановитьДействие("ПриИзменении","Подключаемый_ПриИзмененииВопроса"); diff --git a/SSL/src/Documents/Анкета/Forms/ФормаСписка/Form.form b/SSL/src/Documents/Анкета/Forms/ФормаСписка/Form.form index aa63b08d9..d50238a08 100644 --- a/SSL/src/Documents/Анкета/Forms/ФормаСписка/Form.form +++ b/SSL/src/Documents/Анкета/Forms/ФормаСписка/Form.form @@ -23,7 +23,6 @@ UsualGroup Vertical - Auto true true auto diff --git a/SSL/src/Documents/Анкета/ManagerModule.bsl b/SSL/src/Documents/Анкета/ManagerModule.bsl index 67e5138c3..becc9ad21 100644 --- a/SSL/src/Documents/Анкета/ManagerModule.bsl +++ b/SSL/src/Documents/Анкета/ManagerModule.bsl @@ -89,7 +89,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать анкету %1 по причине: |%2'"), - Выборка.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Выборка.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Метаданные.Документы.Анкета, Выборка.Ссылка, ТекстСообщения); КонецПопытки; diff --git a/SSL/src/Documents/Встреча/Forms/ФормаВыбора/Form.form b/SSL/src/Documents/Встреча/Forms/ФормаВыбора/Form.form index db9a313da..5d7886e49 100644 --- a/SSL/src/Documents/Встреча/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Documents/Встреча/Forms/ФормаВыбора/Form.form @@ -23,7 +23,6 @@ UsualGroup Vertical - Auto true true auto diff --git a/SSL/src/Documents/Встреча/Forms/ФормаДокумента/Form.form b/SSL/src/Documents/Встреча/Forms/ФормаДокумента/Form.form index 7b04291b3..44cc4cfbf 100644 --- a/SSL/src/Documents/Встреча/Forms/ФормаДокумента/Form.form +++ b/SSL/src/Documents/Встреча/Forms/ФормаДокумента/Form.form @@ -137,7 +137,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -277,7 +276,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -307,7 +305,6 @@ UsualGroup Vertical - Auto true true Auto @@ -937,7 +934,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1128,7 +1124,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1473,7 +1468,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1503,7 +1497,6 @@ Vertical Bottom - Auto true true Auto diff --git a/SSL/src/Documents/Встреча/Forms/ФормаСписка/Form.form b/SSL/src/Documents/Встреча/Forms/ФормаСписка/Form.form index e7246391f..181b6121b 100644 --- a/SSL/src/Documents/Встреча/Forms/ФормаСписка/Form.form +++ b/SSL/src/Documents/Встреча/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Documents/ЗапланированноеВзаимодействие/Forms/ФормаВыбора/Form.form b/SSL/src/Documents/ЗапланированноеВзаимодействие/Forms/ФормаВыбора/Form.form index cecd258b7..de2dfe426 100644 --- a/SSL/src/Documents/ЗапланированноеВзаимодействие/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Documents/ЗапланированноеВзаимодействие/Forms/ФормаВыбора/Form.form @@ -23,7 +23,6 @@ UsualGroup Vertical - Auto true true auto diff --git a/SSL/src/Documents/ЗапланированноеВзаимодействие/Forms/ФормаДокумента/Form.form b/SSL/src/Documents/ЗапланированноеВзаимодействие/Forms/ФормаДокумента/Form.form index 5b6851e44..72d7d2767 100644 --- a/SSL/src/Documents/ЗапланированноеВзаимодействие/Forms/ФормаДокумента/Form.form +++ b/SSL/src/Documents/ЗапланированноеВзаимодействие/Forms/ФормаДокумента/Form.form @@ -737,7 +737,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1084,7 +1083,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1114,7 +1112,6 @@ Vertical Bottom - Auto true true Auto diff --git a/SSL/src/Documents/ЗапланированноеВзаимодействие/Forms/ФормаСписка/Form.form b/SSL/src/Documents/ЗапланированноеВзаимодействие/Forms/ФормаСписка/Form.form index 7d36cea6c..f5a8db2f0 100644 --- a/SSL/src/Documents/ЗапланированноеВзаимодействие/Forms/ФормаСписка/Form.form +++ b/SSL/src/Documents/ЗапланированноеВзаимодействие/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаВыбора/Form.form b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаВыбора/Form.form index 365bb7340..15bdc332d 100644 --- a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаВыбора/Form.form @@ -23,7 +23,6 @@ UsualGroup Vertical - Auto true true auto diff --git a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаДокумента/Form.form b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаДокумента/Form.form index 9bcd9ec09..9035aa3c4 100644 --- a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаДокумента/Form.form +++ b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаДокумента/Form.form @@ -111,7 +111,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -290,7 +289,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -413,7 +411,6 @@ UsualGroup Vertical - Auto true true Auto @@ -559,7 +556,6 @@ UsualGroup Vertical - Auto true true Auto @@ -588,7 +584,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1055,6 +1050,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 136 + + СтрокаПоискаРасширеннаяПодсказка + 138 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 137 + true + + Респонденты + + true + + Left diff --git a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаСписка/Form.form b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаСписка/Form.form index 1c42f6966..d20df17d3 100644 --- a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаСписка/Form.form @@ -23,7 +23,6 @@ UsualGroup Vertical - Auto true true auto diff --git a/SSL/src/Documents/НазначениеОпросов/ManagerModule.bsl b/SSL/src/Documents/НазначениеОпросов/ManagerModule.bsl index a4995c7a0..2e11dafb7 100644 --- a/SSL/src/Documents/НазначениеОпросов/ManagerModule.bsl +++ b/SSL/src/Documents/НазначениеОпросов/ManagerModule.bsl @@ -114,6 +114,7 @@ // // Параметры: // ПолучателиПисьма - ТаблицаЗначений - список получается письма: +// * ВариантОтправки - Строка - вариант отправки для получателя письма: Кому, Копия, СкрытаяКопия, ОбратныйАдрес; // * Адрес - Строка - адрес электронной почты получателя; // * Представление - Строка - представление получателя письма; // * Контакт - Произвольный - контакт, которому принадлежит адрес электронной почты. diff --git a/SSL/src/Documents/ОтзывСогласияНаОбработкуПерсональныхДанных/Forms/ФормаДокумента/Form.form b/SSL/src/Documents/ОтзывСогласияНаОбработкуПерсональныхДанных/Forms/ФормаДокумента/Form.form index 4b01d81ad..82356a0fc 100644 --- a/SSL/src/Documents/ОтзывСогласияНаОбработкуПерсональныхДанных/Forms/ФормаДокумента/Form.form +++ b/SSL/src/Documents/ОтзывСогласияНаОбработкуПерсональныхДанных/Forms/ФормаДокумента/Form.form @@ -107,7 +107,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -232,7 +231,6 @@ UsualGroup Vertical - Auto true true Auto @@ -358,7 +356,6 @@ UsualGroup Vertical - Auto true true Auto @@ -387,7 +384,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -470,7 +466,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -499,7 +494,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -688,7 +682,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -721,7 +714,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -842,7 +834,6 @@ UsualGroup HorizontalIfPossible - Auto true true LeftWide diff --git a/SSL/src/Documents/ОтзывСогласияНаОбработкуПерсональныхДанных/Forms/ФормаСписка/Form.form b/SSL/src/Documents/ОтзывСогласияНаОбработкуПерсональныхДанных/Forms/ФормаСписка/Form.form index 67709a369..7328fb8ff 100644 --- a/SSL/src/Documents/ОтзывСогласияНаОбработкуПерсональныхДанных/Forms/ФормаСписка/Form.form +++ b/SSL/src/Documents/ОтзывСогласияНаОбработкуПерсональныхДанных/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Documents/СогласиеНаОбработкуПерсональныхДанных/Forms/ФормаДокумента/Form.form b/SSL/src/Documents/СогласиеНаОбработкуПерсональныхДанных/Forms/ФормаДокумента/Form.form index 83e48fb10..40b0f7adf 100644 --- a/SSL/src/Documents/СогласиеНаОбработкуПерсональныхДанных/Forms/ФормаДокумента/Form.form +++ b/SSL/src/Documents/СогласиеНаОбработкуПерсональныхДанных/Forms/ФормаДокумента/Form.form @@ -107,7 +107,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -236,7 +235,6 @@ UsualGroup HorizontalIfPossible - Auto true true DontUse @@ -310,7 +308,6 @@ UsualGroup Vertical - Auto true true Auto @@ -436,7 +433,6 @@ UsualGroup Vertical - Auto true true Auto @@ -465,7 +461,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -592,7 +587,6 @@ UsualGroup Vertical - Auto true true Auto @@ -707,7 +701,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -814,7 +807,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -937,7 +929,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -970,7 +961,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -1091,7 +1081,6 @@ UsualGroup HorizontalIfPossible - Auto true true LeftWide diff --git a/SSL/src/Documents/СогласиеНаОбработкуПерсональныхДанных/Forms/ФормаСписка/Form.form b/SSL/src/Documents/СогласиеНаОбработкуПерсональныхДанных/Forms/ФормаСписка/Form.form index da976162a..0edc52448 100644 --- a/SSL/src/Documents/СогласиеНаОбработкуПерсональныхДанных/Forms/ФормаСписка/Form.form +++ b/SSL/src/Documents/СогласиеНаОбработкуПерсональныхДанных/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Documents/СогласиеНаОбработкуПерсональныхДанных/ManagerModule.bsl b/SSL/src/Documents/СогласиеНаОбработкуПерсональныхДанных/ManagerModule.bsl index da226eb30..b99f79276 100644 --- a/SSL/src/Documents/СогласиеНаОбработкуПерсональныхДанных/ManagerModule.bsl +++ b/SSL/src/Documents/СогласиеНаОбработкуПерсональныхДанных/ManagerModule.bsl @@ -14,6 +14,17 @@ // СтандартныеПодсистемы.Печать +// Переопределяет настройки печати для объекта. +// +// Параметры: +// Настройки - см. УправлениеПечатью.НастройкиПечатиОбъекта. +// +Процедура ПриОпределенииНастроекПечати(Настройки) Экспорт + + Настройки.ПриДобавленииКомандПечати = Истина; + +КонецПроцедуры + // Заполняет список команд печати. // // Параметры: @@ -25,13 +36,14 @@ КомандаПечати.Идентификатор = "СогласиеНаОбработкуПерсональныхДанных"; КомандаПечати.Представление = НСтр("ru = 'Согласие на обработку ПДн (табличный документ 1С:Предприятия)'"); - // В формате Microsoft Word. + // Счет на оплату в формате Office Open XML (на основе СКД) КомандаПечати = КомандыПечати.Добавить(); - КомандаПечати.Идентификатор = "СогласиеНаОбработкуПерсональныхДанных(OfficeOpenXML)"; - КомандаПечати.Представление = НСтр("ru = 'Согласие на обработку ПДн (документ Office Open XML)'"); - КомандаПечати.Картинка = БиблиотекаКартинок.ФорматWord2007; + КомандаПечати.МенеджерПечати = "УправлениеПечатью"; + КомандаПечати.Идентификатор = "Документ.СогласиеНаОбработкуПерсональныхДанных.ПФ_DOC_СогласиеНаОбработкуПерсональныхДанных_ru"; + КомандаПечати.Представление = НСтр("ru = 'Счет на оплату в Office Open XML (на основе СКД)'"); + КомандаПечати.Картинка = БиблиотекаКартинок.ФорматWord; КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; - + КонецПроцедуры // Формирует печатные формы. @@ -74,91 +86,9 @@ ПечатнаяФорма.ПолныйПутьКМакету = "Документ.СогласиеНаОбработкуПерсональныхДанных.ПФ_MXL_СогласиеНаОбработкуПерсональныхДанных"; ПечатнаяФорма.ИмяФайлаПечатнойФормы = ИменаФайлов; КонецЕсли; - - ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СогласиеНаОбработкуПерсональныхДанных(OfficeOpenXML)"); - Если ПечатнаяФорма <> Неопределено Тогда - ИмяМакета = "СогласиеНаОбработкуПерсональныхДанных(OfficeOpenXML)"; - МакетИДанныеОбъекта = УправлениеПечатьюВызовСервера.МакетыИДанныеОбъектовДляПечати("Документ.СогласиеНаОбработкуПерсональныхДанных", ИмяМакета, МассивОбъектов); - - ОфисныеДокументы = Новый Соответствие; - - Шаблон = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Согласие на обработку ПДн [%1] - [%2] (№[%3] получено [%4])'"), - "Субъект", - "Организация", - "Номер", - "ДатаПолучения"); - ЗначенияРеквизитовДокументов = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(МассивОбъектов, "Организация,Субъект,Номер,ДатаПолучения,Ссылка"); - Для Каждого Ссылка Из МассивОбъектов Цикл - ЗначенияРеквизитовДокумента = ЗначенияРеквизитовДокументов[Ссылка]; - ПроверитьВозможностьОформленияСогласия(ЗначенияРеквизитовДокумента.Субъект); - ЗначенияРеквизитовДокумента.ДатаПолучения = Формат(ЗначенияРеквизитовДокумента.ДатаПолучения, "ДЛФ=D"); - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрефиксацияОбъектов") Тогда - МодульПрефиксацияОбъектовКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПрефиксацияОбъектовКлиентСервер"); - ЗначенияРеквизитовДокумента.Номер = МодульПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ЗначенияРеквизитовДокумента.Номер); - КонецЕсли; - ИмяДокумента = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(Шаблон, ЗначенияРеквизитовДокументов[Ссылка]); - АдресХранилищаОфисныйДокумент = НапечататьСогласиеНаОбработкуПерсональныхДанныхСубъекта(Ссылка, МакетИДанныеОбъекта, ИмяМакета); - - ОфисныеДокументы.Вставить(АдресХранилищаОфисныйДокумент, ИмяДокумента); - КонецЦикла; - - ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Согласие на обработку персональных данных (документ Microsoft Word)'"); - ПечатнаяФорма.ОфисныеДокументы = ОфисныеДокументы; - КонецЕсли; - КонецПроцедуры -// Подготавливает данные объекта к выводу на печать. -// -// Параметры: -// Согласия - Массив - ссылки на документы, для которых запрашиваются данные для печати; -// МассивИменМакетов - Массив - имена макетов (Строка), в которые подставляются данные для печати. -// -// Возвращаемое значение: -// Соответствие из КлючИЗначение - коллекция ссылок на объекты и их данные: -// * Ключ - ЛюбаяСсылка - ссылка на объект информационной базы; -// * Значение - Структура: -// ** Ключ - Строка - имя макета, -// ** Значение - Структура - данные объекта. -// -Функция ПолучитьДанныеПечати(Знач Согласия, Знач МассивИменМакетов) Экспорт - - ДанныеПоВсемОбъектам = Новый Соответствие; - - СоответствиеПоСогласиям = СоответствиеДанныхДляПечатиСогласий(Согласия); - - Для Каждого ОбъектСсылка Из Согласия Цикл - ДанныеОбъектаПоМакетам = Новый Соответствие; - Для Каждого ИмяМакета Из МассивИменМакетов Цикл - ДанныеОбъектаПоМакетам.Вставить(ИмяМакета, СоответствиеПоСогласиям[ОбъектСсылка]); - КонецЦикла; - ДанныеПоВсемОбъектам.Вставить(ОбъектСсылка, ДанныеОбъектаПоМакетам); - КонецЦикла; - - ОписаниеОбластей = Новый Соответствие; - ДвоичныеДанныеМакетов = Новый Соответствие; - - Для Каждого ИмяМакета Из МассивИменМакетов Цикл - Если ИмяМакета = "СогласиеНаОбработкуПерсональныхДанных(OfficeOpenXML)" Тогда - ДвоичныеДанныеМакетов.Вставить(ИмяМакета, УправлениеПечатью.МакетПечатнойФормы("Документ.СогласиеНаОбработкуПерсональныхДанных.ПФ_DOC_СогласиеНаОбработкуПерсональныхДанных")); - КонецЕсли; - ОписаниеОбластей.Вставить(ИмяМакета, ОписаниеОбластейМакетаОфисногоДокумента()); - КонецЦикла; - - Макеты = Новый Структура("ОписаниеОбластей, ДвоичныеДанныеМакетов"); - Макеты.ОписаниеОбластей = ОписаниеОбластей; - Макеты.ДвоичныеДанныеМакетов = ДвоичныеДанныеМакетов; - - ДанныеПечати = Новый Структура("Данные, Макеты"); - ДанныеПечати.Данные = ДанныеПоВсемОбъектам; - ДанныеПечати.Макеты = Макеты; - - Возврат ДанныеПечати; - -КонецФункции - // Конец СтандартныеПодсистемы.Печать // СтандартныеПодсистемы.ПодключаемыеКоманды @@ -308,30 +238,6 @@ КонецФункции -// Структура данных для подготовки печатных форм. -// -// Параметры: -// Согласия - Массив из ДокументСсылка.СогласиеНаОбработкуПерсональныхДанных. -// -// Возвращаемое значение: -// Соответствие из КлючИЗначение: -// * Ключ - ДокументСсылка.СогласиеНаОбработкуПерсональныхДанных -// * Значение - см. Документ.СогласиеНаОбработкуПерсональныхДанных.ОписаниеСогласия -// -Функция СоответствиеДанныхДляПечатиСогласий(Согласия) - - Соответствие = Новый Соответствие; - - ДанныеДляПечати = ДанныеДляПечатиСогласий(Согласия); - - Для Каждого ОписаниеСогласия Из ДанныеДляПечати Цикл - Соответствие.Вставить(ОписаниеСогласия.ДокументОснование, ОписаниеСогласия); - КонецЦикла; - - Возврат Соответствие; - -КонецФункции - // Возвращаемое значение: // Структура: // * ДатаСогласия - Строка @@ -412,90 +318,6 @@ //////////////////////////////////////////////////////////////////////////////// // Работа с макетами офисных документов. -// Формирует печатную форму документа Согласие на обработку персональных данных с использованием макета -// в формате офисного документа Office Open XML. -// -// Параметры: -// ДокументСсылка - ЛюбаяСсылка - объект, по которому требуется сформировать печатную форму. -// МакетИДанныеОбъекта - Соответствие - коллекция ссылок на объекты и их данные. -// ИмяМакета - Строка - наименование макета для печати. -// -// Возвращаемое значение: -// Строка - адрес хранилища, куда помещается сформированный файл. -// -Функция НапечататьСогласиеНаОбработкуПерсональныхДанныхСубъекта(ДокументСсылка, МакетИДанныеОбъекта, ИмяМакета) - - ТипМакета = МакетИДанныеОбъекта.Макеты.ТипыМакетов[ИмяМакета]; - ДвоичныеДанныеМакетов = МакетИДанныеОбъекта.Макеты.ДвоичныеДанныеМакетов; - Области = МакетИДанныеОбъекта.Макеты.ОписаниеОбластей; - ДанныеОбъекта = МакетИДанныеОбъекта.Данные[ДокументСсылка][ИмяМакета]; - - Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакетов[ИмяМакета], ТипМакета, ИмяМакета); - Если Макет = Неопределено Тогда - Возврат ""; - КонецЕсли; - - ЗакрытьОкноПечатнойФормы = Ложь; - Попытка - ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(ТипМакета, Макет.НастройкиСтраницыМакета, Макет); - АдресХранилищаПечатнойФормы = ""; - Если ПечатнаяФорма = Неопределено Тогда - УправлениеПечатью.ОчиститьСсылки(Макет); - Возврат ""; - КонецЕсли; - - // Вывод обычных областей с параметрами. - Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["Заголовок"]); - УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта, Ложь); - - Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["НомерДата"]); - УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта, Ложь); - - Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["Преамбула"]); - УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта, Ложь); - - Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["ОсновнойТекст"]); - УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта, Ложь); - - Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["РеквизитыОператора"]); - УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта, Ложь); - - Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["РеквизитыСубъекта"]); - УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта, Ложь); - - Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["Подпись"]); - УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта, Ложь); - - АдресХранилищаПечатнойФормы = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма); - Исключение - ОбщегоНазначения.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); - ЗакрытьОкноПечатнойФормы = Истина; - Возврат ""; - КонецПопытки; - - УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма, ЗакрытьОкноПечатнойФормы); - УправлениеПечатью.ОчиститьСсылки(Макет); - - Возврат АдресХранилищаПечатнойФормы; - -КонецФункции - -Функция ОписаниеОбластейМакетаОфисногоДокумента() - - ОписаниеОбластей = Новый Структура; - - УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Заголовок", "Общая"); - УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "НомерДата", "Общая"); - УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Преамбула", "Общая"); - УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ОсновнойТекст", "Общая"); - УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "РеквизитыОператора", "Общая"); - УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "РеквизитыСубъекта", "Общая"); - УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Подпись", "Общая"); - - Возврат ОписаниеОбластей; - -КонецФункции - Процедура ПроверитьВозможностьОформленияСогласия(СубъектПДн) Экспорт Если ЗащитаПерсональныхДанных.ЭтоОбъектСоСкрытымиПерсональнымиДанными(СубъектПДн) Тогда diff --git a/SSL/src/Documents/СогласиеНаОбработкуПерсональныхДанных/Templates/ПФ_DOC_СогласиеНаОбработкуПерсональныхДанных_ru/Template.bin b/SSL/src/Documents/СогласиеНаОбработкуПерсональныхДанных/Templates/ПФ_DOC_СогласиеНаОбработкуПерсональныхДанных_ru/Template.bin index 604be7ba1966c39d96e0f3547b31a5ffe6b69ae2..c9a2d500c032ba006a988f489443888594b8d10d 100644 GIT binary patch literal 18998 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 W0iuG^p9xA*01hfq`OxI&w|@av>5r5E diff --git a/SSL/src/Documents/СообщениеSMS/Forms/ФормаВыбора/Form.form b/SSL/src/Documents/СообщениеSMS/Forms/ФормаВыбора/Form.form index 78094bab9..b0718b7af 100644 --- a/SSL/src/Documents/СообщениеSMS/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Documents/СообщениеSMS/Forms/ФормаВыбора/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Documents/СообщениеSMS/Forms/ФормаДокумента/Form.form b/SSL/src/Documents/СообщениеSMS/Forms/ФормаДокумента/Form.form index f19f4e6b8..05c2bb53e 100644 --- a/SSL/src/Documents/СообщениеSMS/Forms/ФормаДокумента/Form.form +++ b/SSL/src/Documents/СообщениеSMS/Forms/ФормаДокумента/Form.form @@ -738,7 +738,6 @@ UsualGroup Vertical - Auto true true Auto @@ -929,7 +928,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1241,7 +1239,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1415,7 +1412,6 @@ Vertical Bottom - Auto WeakSeparation true true @@ -1445,7 +1441,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1480,7 +1475,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1509,7 +1503,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/Documents/СообщениеSMS/Forms/ФормаСписка/Form.form b/SSL/src/Documents/СообщениеSMS/Forms/ФормаСписка/Form.form index ec4e36921..c56a13ae0 100644 --- a/SSL/src/Documents/СообщениеSMS/Forms/ФормаСписка/Form.form +++ b/SSL/src/Documents/СообщениеSMS/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Documents/ТелефонныйЗвонок/Forms/ФормаВыбора/Form.form b/SSL/src/Documents/ТелефонныйЗвонок/Forms/ФормаВыбора/Form.form index 1226e6eef..fe1006c16 100644 --- a/SSL/src/Documents/ТелефонныйЗвонок/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Documents/ТелефонныйЗвонок/Forms/ФормаВыбора/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Documents/ТелефонныйЗвонок/Forms/ФормаДокумента/Form.form b/SSL/src/Documents/ТелефонныйЗвонок/Forms/ФормаДокумента/Form.form index c8bbd7526..90b029783 100644 --- a/SSL/src/Documents/ТелефонныйЗвонок/Forms/ФормаДокумента/Form.form +++ b/SSL/src/Documents/ТелефонныйЗвонок/Forms/ФормаДокумента/Form.form @@ -115,7 +115,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -542,7 +541,6 @@ UsualGroup Vertical - Auto true true Auto @@ -998,7 +996,6 @@ Vertical Bottom - Auto true true Auto @@ -1028,7 +1025,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Documents/ТелефонныйЗвонок/Forms/ФормаСписка/Form.form b/SSL/src/Documents/ТелефонныйЗвонок/Forms/ФормаСписка/Form.form index 072b06ce7..ecc9febd3 100644 --- a/SSL/src/Documents/ТелефонныйЗвонок/Forms/ФормаСписка/Form.form +++ b/SSL/src/Documents/ТелефонныйЗвонок/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Documents/ЭлектронноеПисьмоВходящее/Forms/ФормаВыбора/Form.form b/SSL/src/Documents/ЭлектронноеПисьмоВходящее/Forms/ФормаВыбора/Form.form index 34dfc2776..f68abc9d9 100644 --- a/SSL/src/Documents/ЭлектронноеПисьмоВходящее/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Documents/ЭлектронноеПисьмоВходящее/Forms/ФормаВыбора/Form.form @@ -23,7 +23,6 @@ UsualGroup Vertical - Auto true true auto diff --git a/SSL/src/Documents/ЭлектронноеПисьмоВходящее/Forms/ФормаДокумента/Form.form b/SSL/src/Documents/ЭлектронноеПисьмоВходящее/Forms/ФормаДокумента/Form.form index 4e284e546..64bb24240 100644 --- a/SSL/src/Documents/ЭлектронноеПисьмоВходящее/Forms/ФормаДокумента/Form.form +++ b/SSL/src/Documents/ЭлектронноеПисьмоВходящее/Forms/ФормаДокумента/Form.form @@ -424,7 +424,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -653,7 +652,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1475,7 +1473,6 @@ Vertical Bottom - Auto true true LeftWide @@ -1505,7 +1502,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/Documents/ЭлектронноеПисьмоВходящее/Forms/ФормаДокумента/Module.bsl b/SSL/src/Documents/ЭлектронноеПисьмоВходящее/Forms/ФормаДокумента/Module.bsl index b29ce9e19..bb9f79b93 100644 --- a/SSL/src/Documents/ЭлектронноеПисьмоВходящее/Forms/ФормаДокумента/Module.bsl +++ b/SSL/src/Documents/ЭлектронноеПисьмоВходящее/Forms/ФормаДокумента/Module.bsl @@ -462,19 +462,16 @@ Процедура СохранитьВложениеВыполнить() ТекущиеДанные = Элементы.Вложения.ТекущиеДанные; - - Если ТекущиеДанные <> Неопределено Тогда - - Если НЕ ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиКлиент.ДанныеФайла( - ТекущиеДанные.Ссылка, УникальныйИдентификатор); - - РаботаСФайламиКлиент.СохранитьФайлКак(ДанныеФайла); - + Если ТекущиеДанные = Неопределено Тогда + Возврат; КонецЕсли; + + Если НЕ ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиКлиент.ДанныеФайла(ТекущиеДанные.Ссылка, УникальныйИдентификатор); + РаботаСФайламиКлиент.СохранитьФайлКак(ДанныеФайла); КонецПроцедуры @@ -573,28 +570,22 @@ Процедура ОткрытьВложение() ТекущиеДанные = Элементы.Вложения.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; - Если ТекущиеДанные <> Неопределено Тогда - - Если НЕ ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда - Возврат; - КонецЕсли; - - Если ВзаимодействияКлиентСервер.ЭтоФайлПисьмо(ТекущиеДанные.ИмяФайла) Тогда - - ПараметрыВложения = ВзаимодействияКлиент.ПустаяСтруктураПараметровПисьмаВложения(); - ПараметрыВложения.ДатаПисьмаОснования = Объект.ДатаПолучения; - ПараметрыВложения.ПисьмоОснование = Объект.Ссылка; - ПараметрыВложения.ТемаПисьмаОснования = Объект.Тема; - - ВзаимодействияКлиент.ОткрытьВложениеПисьмо(ТекущиеДанные.Ссылка, ПараметрыВложения, ЭтотОбъект); - - Иначе - - УправлениеЭлектроннойПочтойКлиент.ОткрытьВложение(ТекущиеДанные.Ссылка, ЭтотОбъект); - - КонецЕсли; + Если НЕ ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда + Возврат; + КонецЕсли; + Если ВзаимодействияКлиентСервер.ЭтоФайлПисьмо(ТекущиеДанные.ИмяФайла) Тогда + ПараметрыВложения = ВзаимодействияКлиент.ПараметрыПисьмаВложения(); + ПараметрыВложения.ДатаПисьмаОснования = Объект.ДатаПолучения; + ПараметрыВложения.ПисьмоОснование = Объект.Ссылка; + ПараметрыВложения.ТемаПисьмаОснования = Объект.Тема; + ВзаимодействияКлиент.ОткрытьВложениеПисьмо(ТекущиеДанные.Ссылка, ПараметрыВложения, ЭтотОбъект); + Иначе + УправлениеЭлектроннойПочтойКлиент.ОткрытьВложение(ТекущиеДанные.Ссылка, ЭтотОбъект); КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Documents/ЭлектронноеПисьмоВходящее/Forms/ФормаСписка/Form.form b/SSL/src/Documents/ЭлектронноеПисьмоВходящее/Forms/ФормаСписка/Form.form index a5c87efc1..0e4ba74ce 100644 --- a/SSL/src/Documents/ЭлектронноеПисьмоВходящее/Forms/ФормаСписка/Form.form +++ b/SSL/src/Documents/ЭлектронноеПисьмоВходящее/Forms/ФормаСписка/Form.form @@ -23,7 +23,6 @@ UsualGroup Vertical - Auto true true auto diff --git a/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаВыбора/Form.form b/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаВыбора/Form.form index cfee3b020..dec12122b 100644 --- a/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаВыбора/Form.form @@ -23,7 +23,6 @@ UsualGroup Vertical - Auto true true auto diff --git a/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаДокумента/Form.form b/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаДокумента/Form.form index fe921dec8..7962f36e5 100644 --- a/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаДокумента/Form.form +++ b/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаДокумента/Form.form @@ -102,7 +102,6 @@ UsualGroup AlwaysHorizontal - Auto WeakSeparation true true @@ -1042,7 +1041,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1673,7 +1671,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1752,7 +1749,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1784,7 +1780,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1813,7 +1808,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1996,7 +1990,6 @@ UsualGroup Vertical - Auto true true Auto @@ -2390,7 +2383,7 @@ Left - 0 + Form.Command.СохранитьВложение Normal Auto true @@ -2615,7 +2608,7 @@ Left - 0 + Form.Command.СохранитьВложение Normal Auto true @@ -3123,7 +3116,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -3240,7 +3232,6 @@ Vertical Bottom - Auto true true Auto @@ -3269,7 +3260,6 @@ UsualGroup Vertical - Auto true true Auto @@ -3298,7 +3288,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -4406,6 +4395,24 @@ DontUse Auto + + СохранитьВложение + + <key>ru</key> + <value>Сохранить вложение...</value> + + 14 + + true + + + + СохранитьВложение + + + Auto + Auto + Отправитель @@ -4433,22 +4440,6 @@ - - 0 - - - - 0 - - - - 0 - - - - 0 - - CommonCommand.ПрисоединенныеФайлы diff --git a/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаДокумента/Module.bsl b/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаДокумента/Module.bsl index c8f58eed6..e694d20b5 100644 --- a/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаДокумента/Module.bsl +++ b/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаДокумента/Module.bsl @@ -231,7 +231,7 @@ СтрокаТаблицыВложений.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(Данные, ""); СтрокаТаблицыВложений.Расположение = 4; Исключение - ОбщегоНазначенияКлиент.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()),,"Вложения",, Отказ); + ОбщегоНазначенияКлиент.СообщитьПользователю(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()),,"Вложения",, Отказ); КонецПопытки; КонецЕсли; КонецЦикла; @@ -1388,41 +1388,21 @@ Если (ТекущиеДанные.Расположение = 0) ИЛИ (ТекущиеДанные.Расположение = 1) Тогда Если ВзаимодействияКлиентСервер.ЭтоФайлПисьмо(ТекущиеДанные.ИмяФайла) Тогда - ВзаимодействияКлиент.ОткрытьВложениеПисьмо(ТекущиеДанные.Ссылка, ПараметрыПисьмаВложения(), ЭтотОбъект); - Иначе - ДляРедактирования = Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик"); - - УправлениеЭлектроннойПочтойКлиент.ОткрытьВложение(ТекущиеДанные.Ссылка, - ЭтотОбъект, - ДляРедактирования); - + УправлениеЭлектроннойПочтойКлиент.ОткрытьВложение(ТекущиеДанные.Ссылка, ЭтотОбъект, ДляРедактирования); Если ДляРедактирования Тогда ТекущиеДанные.Редактируется = Истина; Модифицированность = Истина; КонецЕсли; - КонецЕсли; ИначеЕсли ТекущиеДанные.Расположение = 2 Тогда ПутьКФайлу = ТекущиеДанные.ИмяФайлаНаКомпьютере; - Если ВзаимодействияКлиентСервер.ЭтоФайлПисьмо(ТекущиеДанные.ИмяФайла) Тогда - - Попытка - - Данные = Новый ДвоичныеДанные(ТекущиеДанные.ИмяФайлаНаКомпьютере); - - ВзаимодействияКлиент.ОткрытьВложениеПисьмо(ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор), - ПараметрыПисьмаВложения(), - ЭтотОбъект); - - Исключение - ФайловаяСистемаКлиент.ОткрытьФайл(ПутьКФайлу); - КонецПопытки; + ВзаимодействияКлиент.ОткрытьВложениеПисьмо(ТекущиеДанные.Письмо, ПараметрыПисьмаВложения(), ЭтотОбъект); Иначе ФайловаяСистемаКлиент.ОткрытьФайл(ПутьКФайлу); КонецЕсли; @@ -1433,19 +1413,33 @@ ИначеЕсли ТекущиеДанные.Расположение = 5 Тогда - ПараметрыВложения = ВзаимодействияКлиент.ПустаяСтруктураПараметровПисьмаВложения(); + ПараметрыВложения = ВзаимодействияКлиент.ПараметрыПисьмаВложения(); ПараметрыВложения.ДатаПисьмаОснования = ?(ЗначениеЗаполнено(Объект.ДатаОтправления), Объект.ДатаОтправления , Объект.Дата); ПараметрыВложения.ПисьмоОснование = Объект.Ссылка; ПараметрыВложения.ТемаПисьмаОснования = Объект.Тема; - - ВзаимодействияКлиент.ОткрытьВложениеПисьмо(ТекущиеДанные.Письмо, - ПараметрыПисьмаВложения(), - ЭтотОбъект); + ВзаимодействияКлиент.ОткрытьВложениеПисьмо(ТекущиеДанные.Письмо, ПараметрыВложения, ЭтотОбъект); КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура СохранитьВложение(Команда) + + ТекущиеДанные = Элементы.Вложения.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиКлиент.ДанныеФайла(ТекущиеДанные.Ссылка, УникальныйИдентификатор); + РаботаСФайламиКлиент.СохранитьФайлКак(ДанныеФайла); + +КонецПроцедуры + &НаСервере Процедура ЗаполнитьВложения(ПереданныеПараметры = Неопределено) @@ -1972,10 +1966,27 @@ Если ПустаяСтрока(Адрес) Тогда Продолжить; КонецЕсли; - НоваяСтрока = Объект.ПолучателиПисьма.Добавить(); + + ВариантОтправки = ?(ЭлементМассива.Свойство("ВариантОтправки"), ЭлементМассива.ВариантОтправки, "Кому"); + + Если Элементы.СписокПолучателейВариантОтправки.СписокВыбора.НайтиПоЗначению(ВариантОтправки) = Неопределено Тогда + ВариантОтправки = "Кому"; + КонецЕсли; + + Если ВариантОтправки = "Копия" Тогда + НоваяСтрока = Объект.ПолучателиКопий.Добавить(); + ИначеЕсли ВариантОтправки = "СкрытаяКопия" Тогда + НоваяСтрока = Объект.ПолучателиСкрытыхКопий.Добавить(); + ИначеЕсли ВариантОтправки = "ОбратныйАдрес" Тогда + НоваяСтрока = Объект.ПолучателиОтвета.Добавить(); + Иначе + НоваяСтрока = Объект.ПолучателиПисьма.Добавить(); + КонецЕсли; + НоваяСтрока.Адрес = СокрЛП(Адрес); НоваяСтрока.Представление = ОбработанноеПредставлениеАдресата(ЭлементМассива.Представление); НоваяСтрока.Контакт = ЭлементМассива.ИсточникКонтактнойИнформации; + КонецЦикла; КонецЦикла; @@ -2175,7 +2186,7 @@ Элементы.Отправить.Заголовок = НСтр("ru = 'Отправить сейчас'"); ИначеЕсли Объект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик Тогда Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда - НастройкиРаботыСПочтой = Взаимодействия.ПолучитьНастройкуРаботаСПочтой(); + НастройкиРаботыСПочтой = Взаимодействия.НастройкиРаботыСПочтой(); Если НастройкиРаботыСПочтой.Свойство("ОтправлятьСообщенияСразу") И НастройкиРаботыСПочтой.ОтправлятьСообщенияСразу Тогда ОтправлятьСообщенияСразу = Истина; КонецЕсли; @@ -2492,7 +2503,7 @@ ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, , ПисьмоОбъект.Ссылка, ТекстОшибки); - Результат.ТекстСообщения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Результат.ТекстСообщения = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Результат.ОшибкаПодключения = Истина; Возврат Результат; КонецПопытки; @@ -2870,8 +2881,8 @@ &НаКлиенте Функция ПараметрыПисьмаВложения() - ПараметрыВложения = ВзаимодействияКлиент.ПустаяСтруктураПараметровПисьмаВложения(); - ПараметрыВложения.ДатаПисьмаОснования = ?(ЗначениеЗаполнено(Объект.ДатаОтправления), Объект.ДатаОтправления , Объект.Дата); + ПараметрыВложения = ВзаимодействияКлиент.ПараметрыПисьмаВложения(); + ПараметрыВложения.ДатаПисьмаОснования = ?(ЗначениеЗаполнено(Объект.ДатаОтправления), Объект.ДатаОтправления, Объект.Дата); ПараметрыВложения.ПисьмоОснование = Объект.Ссылка; ПараметрыВложения.ТемаПисьмаОснования = Объект.Тема; diff --git a/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаСписка/Form.form b/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаСписка/Form.form index 0044e801e..fd98b4d99 100644 --- a/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаСписка/Form.form +++ b/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормированиеВнешнейСсылкиНаОбъект/Form.form b/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормированиеВнешнейСсылкиНаОбъект/Form.form index 6a977ccaa..eafe27114 100644 --- a/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормированиеВнешнейСсылкиНаОбъект/Form.form +++ b/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормированиеВнешнейСсылкиНаОбъект/Form.form @@ -122,7 +122,6 @@ UsualGroup Vertical - Auto true true Auto @@ -247,7 +246,6 @@ UsualGroup Vertical - Auto true true Auto @@ -276,7 +274,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -410,7 +407,6 @@ AlwaysHorizontal Right - Auto true true Auto diff --git a/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/ManagerModule.bsl b/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/ManagerModule.bsl index b3d8411a9..7861e7485 100644 --- a/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/ManagerModule.bsl +++ b/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/ManagerModule.bsl @@ -281,11 +281,11 @@ ОтменитьТранзакцию(); - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта); + МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта); ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать %1 %2 по причине: |%3'"), - ПолноеИмяОбъекта, ОбъектыДляОбработки.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ПолноеИмяОбъекта, ОбъектыДляОбработки.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, МетаданныеОбъекта, diff --git a/SSL/src/Enums/ДействияПриОбменеВнутренняяПубликация/ДействияПриОбменеВнутренняяПубликация.mdo b/SSL/src/Enums/ДействияПриОбменеВнутренняяПубликация/ДействияПриОбменеВнутренняяПубликация.mdo new file mode 100644 index 000000000..eaef8ddf7 --- /dev/null +++ b/SSL/src/Enums/ДействияПриОбменеВнутренняяПубликация/ДействияПриОбменеВнутренняяПубликация.mdo @@ -0,0 +1,66 @@ + + + + + + + + ДействияПриОбменеВнутренняяПубликация + + ru + Действия при обмене (внутренняя публикация) + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + ЗагрузкаДанных + + ru + Загрузка данных + + + + ВыгрузкаДанных + + ru + Выгрузка данных + + + + ЗагрузкаДанныхКорреспондент + + ru + Загрузка данных в корреспонденте + + + + ВыгрузкаДанныхКорреспондент + + ru + Выгрузка данных в корреспонденте + + + + ДополнительнаяРегистрация + + ru + Дополнительная регистрация + + + diff --git a/SSL/src/Enums/ПорядокОбработчиковОбновления/ПорядокОбработчиковОбновления.mdo b/SSL/src/Enums/ПорядокОбработчиковОбновления/ПорядокОбработчиковОбновления.mdo new file mode 100644 index 000000000..7a00d49da --- /dev/null +++ b/SSL/src/Enums/ПорядокОбработчиковОбновления/ПорядокОбработчиковОбновления.mdo @@ -0,0 +1,52 @@ + + + + + + + + ПорядокОбработчиковОбновления + + ru + Порядок обработчиков обновления + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + Критичный + + ru + Критичный + + + + Обычный + + ru + Обычный + + + + Некритичный + + ru + Некритичный + + + diff --git a/SSL/src/Enums/РежимыИспользованияПрограммыЭлектроннойПодписи/РежимыИспользованияПрограммыЭлектроннойПодписи.mdo b/SSL/src/Enums/РежимыИспользованияПрограммыЭлектроннойПодписи/РежимыИспользованияПрограммыЭлектроннойПодписи.mdo new file mode 100644 index 000000000..e0c858156 --- /dev/null +++ b/SSL/src/Enums/РежимыИспользованияПрограммыЭлектроннойПодписи/РежимыИспользованияПрограммыЭлектроннойПодписи.mdo @@ -0,0 +1,52 @@ + + + + + + + + РежимыИспользованияПрограммыЭлектроннойПодписи + + ru + Режимы использования программы электронной подписи + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + QuickChoice + + Настроена + + ru + Настроена вручную + + + + Автоматически + + ru + Автоматически + + + + НеИспользуется + + ru + Не используется + + + diff --git a/SSL/src/Enums/СтатусыЭлектронныхПисем/СтатусыЭлектронныхПисем.mdo b/SSL/src/Enums/СтатусыЭлектронныхПисем/СтатусыЭлектронныхПисем.mdo new file mode 100644 index 000000000..3f8acb250 --- /dev/null +++ b/SSL/src/Enums/СтатусыЭлектронныхПисем/СтатусыЭлектронныхПисем.mdo @@ -0,0 +1,52 @@ + + + + + + + + СтатусыЭлектронныхПисем + + ru + Статусы электронных писем + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + НеДоставлено + + ru + Не доставлено + + + + Доставлено + + ru + Доставлено + + + + Прочитано + + ru + Прочитано + + + diff --git a/SSL/src/Enums/ТипыКонтактнойИнформации/ТипыКонтактнойИнформации.mdo b/SSL/src/Enums/ТипыКонтактнойИнформации/ТипыКонтактнойИнформации.mdo index b60b41157..4845dcaee 100644 --- a/SSL/src/Enums/ТипыКонтактнойИнформации/ТипыКонтактнойИнформации.mdo +++ b/SSL/src/Enums/ТипыКонтактнойИнформации/ТипыКонтактнойИнформации.mdo @@ -60,7 +60,7 @@ ВебСтраница ru - Веб страница + Веб-страница diff --git a/SSL/src/Enums/ТипыПроблемОбменаДанными/ТипыПроблемОбменаДанными.mdo b/SSL/src/Enums/ТипыПроблемОбменаДанными/ТипыПроблемОбменаДанными.mdo index e7807ab4f..25f0cec3f 100644 --- a/SSL/src/Enums/ТипыПроблемОбменаДанными/ТипыПроблемОбменаДанными.mdo +++ b/SSL/src/Enums/ТипыПроблемОбменаДанными/ТипыПроблемОбменаДанными.mdo @@ -70,4 +70,11 @@ Ошибка проверки сконвертированного объекта + + СообщениеОбменаНеПомещеноВАрхив + + ru + Сообщение обмена не помещено в архив + + diff --git a/SSL/src/Enums/ФорматыСохраненияОтчетов/ФорматыСохраненияОтчетов.mdo b/SSL/src/Enums/ФорматыСохраненияОтчетов/ФорматыСохраненияОтчетов.mdo index 83c01acd4..87316a3f7 100644 --- a/SSL/src/Enums/ФорматыСохраненияОтчетов/ФорматыСохраненияОтчетов.mdo +++ b/SSL/src/Enums/ФорматыСохраненияОтчетов/ФорматыСохраненияОтчетов.mdo @@ -39,6 +39,7 @@ ru Веб-страница (.html) + Html5 HTML4 diff --git a/SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанных/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанных.mdo b/SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанных/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанных.mdo deleted file mode 100644 index 6a5f92109..000000000 --- a/SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанных/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанных.mdo +++ /dev/null @@ -1,18 +0,0 @@ - - - АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанных - - ru - Автономная работа проверить возможность записи общих данных - - - BusinessProcessObject - ChartOfCalculationTypesObject - ChartOfAccountsObject - ChartOfCharacteristicTypesObject - CatalogObject - TaskObject - - BeforeWrite - CommonModule.ОбменДаннымиВМоделиСервиса.АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанных - diff --git a/SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхДокумент/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхДокумент.mdo b/SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхДокумент/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхДокумент.mdo deleted file mode 100644 index d8412794c..000000000 --- a/SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхДокумент/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхДокумент.mdo +++ /dev/null @@ -1,13 +0,0 @@ - - - АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхДокумент - - ru - Автономная работа проверить возможность записи общих данных документ - - - DocumentObject - - BeforeWrite - CommonModule.ОбменДаннымиВМоделиСервиса.АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхДокумент - diff --git a/SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхКонстанта/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхКонстанта.mdo b/SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхКонстанта/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхКонстанта.mdo deleted file mode 100644 index 0e48e026c..000000000 --- a/SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхКонстанта/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхКонстанта.mdo +++ /dev/null @@ -1,13 +0,0 @@ - - - АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхКонстанта - - ru - Автономная работа проверить возможность записи общих данных константа - - - ConstantValueManager - - BeforeWrite - CommonModule.ОбменДаннымиВМоделиСервиса.АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхКонстанта - diff --git a/SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписей/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписей.mdo b/SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписей/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписей.mdo deleted file mode 100644 index 774d124cf..000000000 --- a/SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписей/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписей.mdo +++ /dev/null @@ -1,15 +0,0 @@ - - - АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписей - - ru - Автономная работа проверить возможность записи общих данных набор записей - - - InformationRegisterRecordSet - AccountingRegisterRecordSet - AccumulationRegisterRecordSet - - BeforeWrite - CommonModule.ОбменДаннымиВМоделиСервиса.АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписей - diff --git a/SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписейРасчета/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписейРасчета.mdo b/SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписейРасчета/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписейРасчета.mdo deleted file mode 100644 index 355f16d92..000000000 --- a/SSL/src/EventSubscriptions/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписейРасчета/АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписейРасчета.mdo +++ /dev/null @@ -1,13 +0,0 @@ - - - АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписейРасчета - - ru - Автономная работа проверить возможность записи общих данных набор записей расчета - - - CalculationRegisterRecordSet - - BeforeWrite - CommonModule.ОбменДаннымиВМоделиСервиса.АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхНаборЗаписейРасчета - diff --git a/SSL/src/EventSubscriptions/КонтрольНеразделенныхОбъектовПриЗаписи/КонтрольНеразделенныхОбъектовПриЗаписи.mdo b/SSL/src/EventSubscriptions/КонтрольНеразделенныхОбъектовПриЗаписи/КонтрольНеразделенныхОбъектовПриЗаписи.mdo index 8c129c733..7f96d3ef7 100644 --- a/SSL/src/EventSubscriptions/КонтрольНеразделенныхОбъектовПриЗаписи/КонтрольНеразделенныхОбъектовПриЗаписи.mdo +++ b/SSL/src/EventSubscriptions/КонтрольНеразделенныхОбъектовПриЗаписи/КонтрольНеразделенныхОбъектовПриЗаписи.mdo @@ -37,7 +37,6 @@ ConstantValueManager.ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском ConstantValueManager.УдалитьЛогинДоступаКСервисуMorpher ConstantValueManager.СтандартныеПодсистемыВАвтономномРежиме - CatalogObject.СценарииОбменовДанными ConstantValueManager.ПутьКТомуБезУчетаРегиональныхНастроек ConstantValueManager.РазрешитьВыполнениеДООРегламентнымиЗаданиямиВМоделиСервиса ConstantValueManager.ДанныеДляИзмененияМультиязычныхРеквизитов @@ -82,6 +81,7 @@ CatalogObject.ОбщиеВнешниеКомпоненты CatalogObject.ИдентификаторыОбъектовМетаданных ConstantValueManager.ДополнительныйЯзык1 + ConstantValueManager.ПорядокОбрабатываемыхДанных ConstantValueManager.КаталогВременныхФайловДляLinux ConstantValueManager.ЗагрузитьРасширенияИзменяющиеСтруктуруДанных ConstantValueManager.КоличествоЭлементовВТранзакцииЗагрузкиДанных diff --git a/SSL/src/ExchangePlans/ОбновлениеИнформационнойБазы/ОбновлениеИнформационнойБазы.mdo b/SSL/src/ExchangePlans/ОбновлениеИнформационнойБазы/ОбновлениеИнформационнойБазы.mdo index 56341ed64..85d4bb5af 100644 --- a/SSL/src/ExchangePlans/ОбновлениеИнформационнойБазы/ОбновлениеИнформационнойБазы.mdo +++ b/SSL/src/ExchangePlans/ОбновлениеИнформационнойБазы/ОбновлениеИнформационнойБазы.mdo @@ -90,6 +90,9 @@ 9 Variable 25 + + InformationRegister.ИсторияРассылкиОтчетов + InformationRegister.СостоянияРассылокОтчетов @@ -132,6 +135,9 @@ InformationRegister.ПериодыНерабочихДнейКалендаря + + InformationRegister.АрхивСообщенийОбменов + Catalog.ПапкиЭлектронныхПисем @@ -201,6 +207,9 @@ Constant.ВерсияДатЗапретаИзменения + + InformationRegister.ОбъектыНезарегистрированныеПриЗацикливании + Constant.НастройкаПроксиСервера @@ -270,6 +279,9 @@ Constant.ИспользоватьСинхронизациюДанныхВЛокальномРежиме + + InformationRegister.ЗадачиОбменаДаннымиВнутренняяПубликация + InformationRegister.ИсторияАдминистративнойИерархии @@ -561,6 +573,9 @@ Constant.ПараметрыБлокировкиРаботыСВнешнимиРесурсами + + InformationRegister.СертификатыПолучателейРассылкиОтчетов + Constant.ПриоритетОбновленияВОбластяхДанных @@ -639,6 +654,9 @@ InformationRegister.СведенияОФайлах + + InformationRegister.КонтурСинхронизации + Constant.КоличествоПотоковОбновленияДоступа @@ -843,9 +861,6 @@ Constant.НастройкиКолонтитулов - - Constant.ИспользоватьОнлайнПоддержку - InformationRegister.СертификатыПользователяDSS @@ -1062,12 +1077,18 @@ BusinessProcess.Задание + + InformationRegister.НастройкиАрхиваСообщенийОбменов + Catalog.МакетыПечатныхФорм InformationRegister.ИдентификаторыОбъектовВерсийРасширений + + InformationRegister.ФиксацияОбработкиДанныхОбработчиками + Constant.СинхронизироватьДанныеСПриложениемВИнтернетеПриЗавершенииРаботыПрограммы diff --git a/SSL/src/FilterCriteria/ФайлыВТоме/Forms/ФормаСписка/Form.form b/SSL/src/FilterCriteria/ФайлыВТоме/Forms/ФормаСписка/Form.form index 4fe37ef26..6856e04f8 100644 --- a/SSL/src/FilterCriteria/ФайлыВТоме/Forms/ФормаСписка/Form.form +++ b/SSL/src/FilterCriteria/ФайлыВТоме/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/FunctionalOptions/ИспользоватьНастройкиПодключенияВМоделиСервиса/ИспользоватьНастройкиПодключенияВМоделиСервиса.mdo b/SSL/src/FunctionalOptions/ИспользоватьНастройкиПодключенияВМоделиСервиса/ИспользоватьНастройкиПодключенияВМоделиСервиса.mdo new file mode 100644 index 000000000..9f48ec72b --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьНастройкиПодключенияВМоделиСервиса/ИспользоватьНастройкиПодключенияВМоделиСервиса.mdo @@ -0,0 +1,11 @@ + + + ИспользоватьНастройкиПодключенияВМоделиСервиса + + ru + Использовать настройки подключения в модели сервиса + + InformationRegister.ОбщиеНастройкиУзловИнформационныхБаз.Resource.ИспользоватьНастройкиПодключенияВМоделиСервиса + true + CommonCommand.НастройкиПодключения + diff --git a/SSL/src/FunctionalOptions/ИспользоватьОнлайнПоддержку/ИспользоватьОнлайнПоддержку.mdo b/SSL/src/FunctionalOptions/ИспользоватьОнлайнПоддержку/ИспользоватьОнлайнПоддержку.mdo deleted file mode 100644 index 89ff33666..000000000 --- a/SSL/src/FunctionalOptions/ИспользоватьОнлайнПоддержку/ИспользоватьОнлайнПоддержку.mdo +++ /dev/null @@ -1,14 +0,0 @@ - - - ИспользоватьОнлайнПоддержку - - ru - Использовать онлайн-поддержку - - Constant.ИспользоватьОнлайнПоддержку - true - CommonCommand.НастройкаОнлайнПоддержки - CommonForm.НастройкаОнлайнПоддержки - CommonForm.ПоискИсполняемогоФайлаОнлайнПоддержки - CommonCommand.СвязатьсяСоСпециалистомОнлайнПоддержки - diff --git a/SSL/src/FunctionalOptions/ИспользоватьСинхронизациюДанныхВМоделиСервиса/ИспользоватьСинхронизациюДанныхВМоделиСервиса.mdo b/SSL/src/FunctionalOptions/ИспользоватьСинхронизациюДанныхВМоделиСервиса/ИспользоватьСинхронизациюДанныхВМоделиСервиса.mdo index 35bf5a2d2..b279854b2 100644 --- a/SSL/src/FunctionalOptions/ИспользоватьСинхронизациюДанныхВМоделиСервиса/ИспользоватьСинхронизациюДанныхВМоделиСервиса.mdo +++ b/SSL/src/FunctionalOptions/ИспользоватьСинхронизациюДанныхВМоделиСервиса/ИспользоватьСинхронизациюДанныхВМоделиСервиса.mdo @@ -8,4 +8,5 @@ Constant.ИспользоватьСинхронизациюДанныхВМоделиСервиса true CommonForm.МониторСинхронизацииДанныхВМоделиСервиса + Catalog.СценарииОбменовДанными diff --git a/SSL/src/FunctionalOptions/ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете/ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете.mdo b/SSL/src/FunctionalOptions/ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете/ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете.mdo index 60d81757a..f2feaf430 100644 --- a/SSL/src/FunctionalOptions/ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете/ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете.mdo +++ b/SSL/src/FunctionalOptions/ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете/ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете.mdo @@ -8,5 +8,5 @@ Constant.ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете true CommonCommand.НастройкиСинхронизацииДанныхВМоделиСервиса - CommonCommand.НастройкиПодключения + CommonCommand.ПомощникПереходаНаИнтернетВнутренняяПубликация diff --git a/SSL/src/FunctionalOptions/ИспользоватьСценарииВМоделиСервиса/ИспользоватьСценарииВМоделиСервиса.mdo b/SSL/src/FunctionalOptions/ИспользоватьСценарииВМоделиСервиса/ИспользоватьСценарииВМоделиСервиса.mdo new file mode 100644 index 000000000..7d51df18c --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьСценарииВМоделиСервиса/ИспользоватьСценарииВМоделиСервиса.mdo @@ -0,0 +1,11 @@ + + + ИспользоватьСценарииВМоделиСервиса + + ru + Использовать сценарии в модели сервиса + + InformationRegister.ОбщиеНастройкиУзловИнформационныхБаз.Resource.ИспользоватьСценарииВМоделиСервиса + true + CommonCommand.СценарииСинхронизации + diff --git a/SSL/src/FunctionalOptions/ХранитьИсториюРассылкиОтчетов/ХранитьИсториюРассылкиОтчетов.mdo b/SSL/src/FunctionalOptions/ХранитьИсториюРассылкиОтчетов/ХранитьИсториюРассылкиОтчетов.mdo new file mode 100644 index 000000000..3a4c85b7d --- /dev/null +++ b/SSL/src/FunctionalOptions/ХранитьИсториюРассылкиОтчетов/ХранитьИсториюРассылкиОтчетов.mdo @@ -0,0 +1,12 @@ + + + ХранитьИсториюРассылкиОтчетов + + ru + Хранить историю рассылки отчетов + + Constant.ХранитьИсториюРассылкиОтчетов + true + Report.КонтрольРассылкиОтчетов + InformationRegister.ИсторияРассылкиОтчетов + diff --git a/SSL/src/FunctionalOptions/ХранитьФайлыВТомахНаДиске/ХранитьФайлыВТомахНаДиске.mdo b/SSL/src/FunctionalOptions/ХранитьФайлыВТомахНаДиске/ХранитьФайлыВТомахНаДиске.mdo index 4191ccf6f..bbb02a82d 100644 --- a/SSL/src/FunctionalOptions/ХранитьФайлыВТомахНаДиске/ХранитьФайлыВТомахНаДиске.mdo +++ b/SSL/src/FunctionalOptions/ХранитьФайлыВТомахНаДиске/ХранитьФайлыВТомахНаДиске.mdo @@ -8,4 +8,5 @@ Constant.ХранитьФайлыВТомахНаДиске true Catalog.ТомаХраненияФайлов + Report.ПроверкаЦелостностиТома diff --git a/SSL/src/FunctionalOptionsParameters/ОбщиеНастройкиУзлов/ОбщиеНастройкиУзлов.mdo b/SSL/src/FunctionalOptionsParameters/ОбщиеНастройкиУзлов/ОбщиеНастройкиУзлов.mdo new file mode 100644 index 000000000..29c743573 --- /dev/null +++ b/SSL/src/FunctionalOptionsParameters/ОбщиеНастройкиУзлов/ОбщиеНастройкиУзлов.mdo @@ -0,0 +1,9 @@ + + + ОбщиеНастройкиУзлов + + ru + Общие настройки узлов + + InformationRegister.ОбщиеНастройкиУзловИнформационныхБаз.Dimension.УзелИнформационнойБазы + diff --git a/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ЗагрузкаАдресногоКлассификатора/Form.form b/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ЗагрузкаАдресногоКлассификатора/Form.form index de49585a8..236df51ad 100644 --- a/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ЗагрузкаАдресногоКлассификатора/Form.form +++ b/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ЗагрузкаАдресногоКлассификатора/Form.form @@ -13,333 +13,6 @@ ГруппаКоманднаяПанельРегионов 206 - - ГруппаУстановитьСнятьФлажки - 208 - - КнопкиВыбора - 239 - - СубъектыРФУстановитьФлажки - 47 - true - true - - true - - - СубъектыРФУстановитьФлажкиРасширеннаяПодсказка - 48 - 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 - - true - true - - true - - - <key>ru</key> - <value>Выбрать все</value> - - - КнопкиВыбораРасширеннаяПодсказка - 240 - Label - true - true - - Left - - - - Compact - - - true - true - - true - - - <key>ru</key> - <value>Установить снять флажки</value> - - - ГруппаУстановитьСнятьФлажкиРасширеннаяПодсказка - 209 - Label - true - true - - Left - - - CommandBar - - Left - - - - Поиск - 203 - true - true - - true - - - Поиск - - None - - ПоискРасширеннаяПодсказка - 205 - Label - true - true - - Left - - - - ПоискКонтекстноеМеню - 204 - true - - InputField - Enter - true - Left - true - - - AutoComplete - ПоискАвтоПодбор - - - Clearing - ПоискОчистка - - - TextEditEnd - ПоискОкончаниеВводаТекста - - true - true - true - true - true - true - true - Normal - - ru - Введите первые буквы названия региона - - - - - ГруппаЕще - 210 - - СубъектыРФУстановитьФлажки1 - 241 - true - true - - true - - - СубъектыРФУстановитьФлажки1РасширеннаяПодсказка - 242 - Label - true - true - - Left - - - Form.Command.УстановитьФлажки - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - СубъектыРФСнятьФлажки1 - 243 - true - true - - true - - - СубъектыРФСнятьФлажки1РасширеннаяПодсказка - 244 - Label - true - true - - Left - - - Form.Command.СнятьФлажки - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - СубъектыРФНайти - 43 - true - true - - true - - - СубъектыРФНайтиРасширеннаяПодсказка - 44 - Label - true - true - - Left - - - Form.Item.СубъектыРФ.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - СубъектыРФОтменитьПоиск - 45 - true - true - - true - - - СубъектыРФОтменитьПоискРасширеннаяПодсказка - 46 - Label - true - true - - Left - - - Form.Item.СубъектыРФ.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - Справка - 217 - true - true - - true - - - СправкаРасширеннаяПодсказка - 218 - Label - true - true - - Left - - - Form.StandardCommand.Help - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Еще</value> - - false - Right - - ГруппаЕщеРасширеннаяПодсказка - 211 - Label - true - true - - Left - - - CommandBar - - Left - - true true @@ -361,7 +34,6 @@ UsualGroup - Auto true true Auto @@ -558,7 +230,110 @@ СубъектыРФКоманднаяПанель 3 + + ГруппаУстановитьСнятьФлажки + 208 + + КнопкиВыбора + 239 + + СубъектыРФУстановитьФлажки + 47 + true + true + + true + + + СубъектыРФУстановитьФлажкиРасширеннаяПодсказка + 48 + 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 + + true + true + + true + + + <key>ru</key> + <value>Выбрать все</value> + + + КнопкиВыбораРасширеннаяПодсказка + 240 + Label + true + true + + Left + + + + Compact + + + true + true + + true + + + <key>ru</key> + <value>Установить снять флажки</value> + + + ГруппаУстановитьСнятьФлажкиРасширеннаяПодсказка + 209 + Label + true + true + + Left + + + + Left + true Selection @@ -787,7 +562,6 @@ HorizontalIfPossible Right - Auto true true Auto @@ -815,7 +589,6 @@ UsualGroup - Auto true true Auto @@ -970,7 +743,6 @@ UsualGroup - Auto true Auto Auto @@ -1108,7 +880,6 @@ UsualGroup - Auto true Auto Auto @@ -1136,7 +907,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1249,7 +1019,6 @@ UsualGroup - Auto NormalSeparation true true @@ -1382,7 +1151,6 @@ UsualGroup - Auto true true Auto @@ -1548,7 +1316,6 @@ Vertical Bottom - Auto true true Auto @@ -1714,7 +1481,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1742,7 +1508,6 @@ UsualGroup - Auto true true Auto @@ -1832,7 +1597,6 @@ UsualGroup Bottom - Auto true true Auto @@ -2017,7 +1781,6 @@ Vertical Bottom - Auto true true Auto @@ -2448,10 +2211,6 @@ Поиск - - <key>ru</key> - <value>Поиск</value> - 17 String diff --git a/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ЗагрузкаАдресногоКлассификатора/Module.bsl b/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ЗагрузкаАдресногоКлассификатора/Module.bsl index 0c188ac5b..d5818eb7a 100644 --- a/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ЗагрузкаАдресногоКлассификатора/Module.bsl +++ b/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ЗагрузкаАдресногоКлассификатора/Module.bsl @@ -255,25 +255,6 @@ КонецПроцедуры -&НаКлиенте -Процедура ПоискАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) - - Если Ожидание > 0 Тогда - УстановитьОтборВСпискеРегионов(Текст); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПоискОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка) - УстановитьОтборВСпискеРегионов(Текст); -КонецПроцедуры - -&НаКлиенте -Процедура ПоискОчистка(Элемент, СтандартнаяОбработка) - Элементы.СубъектыРФ.ОтборСтрок = Неопределено; -КонецПроцедуры - #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыСубъектыРФ @@ -532,18 +513,6 @@ Элементы.АдресЗагрузки.Доступность = КодИсточникаЗагрузки = "КАТАЛОГ"; КонецПроцедуры - -&НаКлиенте -Процедура УстановитьОтборВСпискеРегионов(Знач Текст) - - Если ЗначениеЗаполнено(Текст) Тогда - Отбор = Новый ФиксированнаяСтруктура(Новый Структура("Представление", ПреобразоватьВводАдреса(Текст))); - Элементы.СубъектыРФ.ОтборСтрок = Отбор; - Иначе - Элементы.СубъектыРФ.ОтборСтрок = Неопределено; - КонецЕсли; - -КонецПроцедуры &НаКлиенте Процедура УстановитьПометкиСпискаРегионов(Знач Пометка) @@ -954,7 +923,7 @@ Исключение ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение,,, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; @@ -1042,24 +1011,4 @@ Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", ШрифтыСтиля.ВажнаяНадписьШрифт); КонецПроцедуры -// Преобразует введенные английские буквы к русской раскладке при подборе адреса -// -&НаКлиенте -Функция ПреобразоватьВводАдреса(Текст) - - РусскиеКлавиши = "ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЁ"; - АнглийскиеКлавиши = "QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,`"; - Текст = ВРег(Текст); - Для Позиция = 0 По СтрДлина(Текст) Цикл - Символ = Сред(Текст, Позиция, 1); - ПозицияСимвола = СтрНайти(АнглийскиеКлавиши, Символ); - Если ПозицияСимвола > 0 Тогда - Текст = СтрЗаменить(Текст, Символ, Сред(РусскиеКлавиши, ПозицияСимвола, 1)); - КонецЕсли; - КонецЦикла; - - Возврат Текст; - -КонецФункции - #КонецОбласти \ No newline at end of file diff --git a/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ОчисткаАдресногоКлассификатора/Form.form b/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ОчисткаАдресногоКлассификатора/Form.form index ae6d9eb74..77b6a6a47 100644 --- a/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ОчисткаАдресногоКлассификатора/Form.form +++ b/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ОчисткаАдресногоКлассификатора/Form.form @@ -325,6 +325,7 @@ InAdditionalSubmenu Left + true Selection @@ -553,7 +554,6 @@ HorizontalIfPossible Right - Auto true true Auto @@ -582,7 +582,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -666,7 +665,6 @@ UsualGroup - Auto NormalSeparation true true @@ -800,7 +798,6 @@ UsualGroup - Auto true true Auto @@ -924,7 +921,6 @@ Vertical Bottom - Auto true true Auto @@ -1059,7 +1055,6 @@ UsualGroup - Auto true true Auto @@ -1144,7 +1139,6 @@ UsualGroup Bottom - Auto true true Auto diff --git a/SSL/src/InformationRegisters/АдресныеОбъекты/ManagerModule.bsl b/SSL/src/InformationRegisters/АдресныеОбъекты/ManagerModule.bsl index 89d379db5..67731427d 100644 --- a/SSL/src/InformationRegisters/АдресныеОбъекты/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/АдресныеОбъекты/ManagerModule.bsl @@ -103,7 +103,7 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(АдресныйКлассификаторСлужебный.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; diff --git a/SSL/src/InformationRegisters/АрхивСообщенийОбменов/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/АрхивСообщенийОбменов/Forms/ФормаЗаписи/Form.form new file mode 100644 index 000000000..3cd052b92 --- /dev/null +++ b/SSL/src/InformationRegisters/АрхивСообщенийОбменов/Forms/ФормаЗаписи/Form.form @@ -0,0 +1,363 @@ + + + + Период + 1 + true + true + + true + + + Запись.Period + + + ПериодРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + ПериодКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + 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 + Normal + + + + ПолноеИмяФайла + 7 + true + true + + true + + + Запись.ПолноеИмяФайла + + + ПолноеИмяФайлаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ПолноеИмяФайлаКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + НомерПринятогоСообщения + 10 + true + true + + true + + + Запись.НомерПринятогоСообщения + + + НомерПринятогоСообщенияРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + НомерПринятогоСообщенияКонтекстноеМеню + 11 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ИмяФайла + 13 + true + true + + true + + + Запись.ИмяФайла + + + ИмяФайлаРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + ИмяФайлаКонтекстноеМеню + 14 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + РасширениеФайла + 16 + true + true + + true + + + Запись.РасширениеФайла + + + РасширениеФайлаРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + РасширениеФайлаКонтекстноеМеню + 17 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + РазмерФайла + 19 + true + true + + true + + + Запись.РазмерФайла + + + РазмерФайлаРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + РазмерФайлаКонтекстноеМеню + 20 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФайлБольше100Мб + 22 + true + true + + true + + + Запись.ФайлБольше100Мб + + + ФайлБольше100МбРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ФайлБольше100МбКонтекстноеМеню + 23 + true + + CheckBoxField + Enter + true + Left + true + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + Запись + 1 + + InformationRegisterRecordManager.АрхивСообщенийОбменов + + + true + + + true + +
        true
        + true +
        + + + + + +
        diff --git a/SSL/src/CommonCommands/НастройкаОнлайнПоддержки/CommandModule.bsl b/SSL/src/InformationRegisters/АрхивСообщенийОбменов/Forms/ФормаЗаписи/Module.bsl similarity index 69% rename from SSL/src/CommonCommands/НастройкаОнлайнПоддержки/CommandModule.bsl rename to SSL/src/InformationRegisters/АрхивСообщенийОбменов/Forms/ФормаЗаписи/Module.bsl index 2ed96bd0f..8c790ffad 100644 --- a/SSL/src/CommonCommands/НастройкаОнлайнПоддержки/CommandModule.bsl +++ b/SSL/src/InformationRegisters/АрхивСообщенийОбменов/Forms/ФормаЗаписи/Module.bsl @@ -6,13 +6,14 @@ // 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 similarity index 100% rename from SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss rename to SSL/src/InformationRegisters/АрхивСообщенийОбменов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/АрхивСообщенийОбменов/Forms/ФормаСписка/Form.form similarity index 68% rename from SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Form.form rename to SSL/src/InformationRegisters/АрхивСообщенийОбменов/Forms/ФормаСписка/Form.form index a1c4ae818..48108ae5d 100644 --- a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/АрхивСообщенийОбменов/Forms/ФормаСписка/Form.form @@ -1,8 +1,8 @@ - ГруппаПользовательскихНастроек - 28 + СписокКомпоновщикНастроекПользовательскиеНастройки + 1 true true @@ -12,9 +12,10 @@ ru Группа пользовательских настроек + false - ГруппаПользовательскихНастроекРасширеннаяПодсказка - 29 + СписокКомпоновщикНастроекПользовательскиеНастройкиРасширеннаяПодсказка + 2 Label true true @@ -25,71 +26,16 @@ UsualGroup Vertical - Auto + WeakSeparation true true Auto Auto - - КоманднаяПанель - 30 - - УдалитьЗаписи - 14 - true - true - - true - - false - - УдалитьЗаписиExtendedTooltip - 15 - Label - true - true - - Left - - - Form.Command.УдалитьЗаписи - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Командная панель</value> - - - КоманднаяПанельРасширеннаяПодсказка - 31 - Label - true - true - - Left - - - CommandBar - - Left - Form - - Список - 1 + 3 <key>ru</key> <value>Список</value> @@ -103,63 +49,23 @@ <segments>Список</segments> </dataPath> <defaultItem>true</defaultItem> - <skipOnInput>false</skipOnInput> <titleLocation>None</titleLocation> - <excludedCommands>Change</excludedCommands> <excludedCommands>Copy</excludedCommands> - <excludedCommands>Create</excludedCommands> - <excludedCommands>Delete</excludedCommands> + <excludedCommands>CopyToClipboard</excludedCommands> <items xsi:type="form:FormField"> - <name>Объект</name> - <id>4</id> + <name>Период</name> + <id>16</id> <visible>true</visible> <enabled>true</enabled> <userVisible> <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Список.Объект</segments> + <segments>Список.Period</segments> </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>ОбъектExtendedTooltip</name> - <id>17</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>ОбъектКонтекстноеМеню</name> - <id>5</id> - <autoFill>true</autoFill> - </contextMenu> - <type>LabelField</type> - <editMode>Enter</editMode> - <showInHeader>true</showInHeader> - <headerHorizontalAlign>Left</headerHorizontalAlign> - <showInFooter>true</showInFooter> - <extInfo xsi:type="form:LabelFieldExtInfo"> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - </extInfo> - </items> - <items xsi:type="form:FormField"> - <name>НомерВерсии</name> - <id>6</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <dataPath xsi:type="form:DataPath"> - <segments>Список.НомерВерсии</segments> - </dataPath> - <defaultItem>true</defaultItem> - <extendedTooltip> - <name>НомерВерсииExtendedTooltip</name> + <name>ПериодРасширеннаяПодсказка</name> <id>18</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -169,8 +75,8 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>НомерВерсииКонтекстноеМеню</name> - <id>7</id> + <name>ПериодКонтекстноеМеню</name> + <id>17</id> <autoFill>true</autoFill> </contextMenu> <type>LabelField</type> @@ -184,90 +90,18 @@ </extInfo> </items> <items xsi:type="form:FormField"> - <name>АвторВерсии</name> - <id>8</id> + <name>УзелИнформационнойБазы</name> + <id>19</id> <visible>true</visible> <enabled>true</enabled> <userVisible> <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Список.АвторВерсии</segments> + <segments>Список.УзелИнформационнойБазы</segments> </dataPath> - <defaultItem>true</defaultItem> <extendedTooltip> - <name>АвторВерсииExtendedTooltip</name> - <id>19</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>АвторВерсииКонтекстноеМеню</name> - <id>9</id> - <autoFill>true</autoFill> - </contextMenu> - <type>LabelField</type> - <editMode>Enter</editMode> - <showInHeader>true</showInHeader> - <headerHorizontalAlign>Left</headerHorizontalAlign> - <showInFooter>true</showInFooter> - <extInfo xsi:type="form:LabelFieldExtInfo"> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - </extInfo> - </items> - <items xsi:type="form:FormField"> - <name>ДатаВерсии</name> - <id>10</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <dataPath xsi:type="form:DataPath"> - <segments>Список.ДатаВерсии</segments> - </dataPath> - <defaultItem>true</defaultItem> - <extendedTooltip> - <name>ДатаВерсииExtendedTooltip</name> - <id>20</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>ДатаВерсииКонтекстноеМеню</name> - <id>11</id> - <autoFill>true</autoFill> - </contextMenu> - <type>LabelField</type> - <editMode>Enter</editMode> - <showInHeader>true</showInHeader> - <headerHorizontalAlign>Left</headerHorizontalAlign> - <showInFooter>true</showInFooter> - <extInfo xsi:type="form:LabelFieldExtInfo"> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - </extInfo> - </items> - <items xsi:type="form:FormField"> - <name>Сжато</name> - <id>12</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <defaultItem>true</defaultItem> - <extendedTooltip> - <name>СжатоExtendedTooltip</name> + <name>УзелИнформационнойБазыРасширеннаяПодсказка</name> <id>21</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -277,28 +111,33 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СжатоКонтекстноеМеню</name> - <id>13</id> + <name>УзелИнформационнойБазыКонтекстноеМеню</name> + <id>20</id> <autoFill>true</autoFill> </contextMenu> - <type>CheckBoxField</type> + <type>LabelField</type> <editMode>Enter</editMode> <showInHeader>true</showInHeader> <headerHorizontalAlign>Left</headerHorizontalAlign> <showInFooter>true</showInFooter> - <extInfo xsi:type="form:CheckBoxFieldExtInfo"/> + <extInfo xsi:type="form:LabelFieldExtInfo"> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + </extInfo> </items> <items xsi:type="form:FormField"> - <name>РазмерДанных</name> + <name>ПолноеИмяФайла</name> <id>22</id> <visible>true</visible> <enabled>true</enabled> - <userVisible/> + <userVisible> + <common>true</common> + </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Список.РазмерДанных</segments> + <segments>Список.ПолноеИмяФайла</segments> </dataPath> <extendedTooltip> - <name>РазмерДанныхРасширеннаяПодсказка</name> + <name>ПолноеИмяФайлаРасширеннаяПодсказка</name> <id>24</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -308,7 +147,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>РазмерДанныхКонтекстноеМеню</name> + <name>ПолноеИмяФайлаКонтекстноеМеню</name> <id>23</id> <autoFill>true</autoFill> </contextMenu> @@ -323,16 +162,18 @@ </extInfo> </items> <items xsi:type="form:FormField"> - <name>КонтрольнаяСумма</name> + <name>НомерПринятогоСообщения</name> <id>25</id> <visible>true</visible> <enabled>true</enabled> - <userVisible/> + <userVisible> + <common>true</common> + </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Список.КонтрольнаяСумма</segments> + <segments>Список.НомерПринятогоСообщения</segments> </dataPath> <extendedTooltip> - <name>КонтрольнаяСуммаРасширеннаяПодсказка</name> + <name>НомерПринятогоСообщенияРасширеннаяПодсказка</name> <id>27</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -342,7 +183,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>КонтрольнаяСуммаКонтекстноеМеню</name> + <name>НомерПринятогоСообщенияКонтекстноеМеню</name> <id>26</id> <autoFill>true</autoFill> </contextMenu> @@ -356,23 +197,20 @@ <autoMaxHeight>true</autoMaxHeight> </extInfo> </items> - <commandBarLocation>None</commandBarLocation> - <autoCommandBar> - <name>СписокКоманднаяПанель</name> - <id>3</id> - <horizontalAlign>Left</horizontalAlign> - <autoFill>true</autoFill> - </autoCommandBar> - <handlers> - <event>BeforeAddRow</event> - <name>СписокПередНачаломДобавления</name> - </handlers> - <searchStringAddition> - <name>СписокSearchString</name> - <id>32</id> + <items xsi:type="form:FormField"> + <name>ИмяФайла</name> + <id>28</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Список.ИмяФайла</segments> + </dataPath> <extendedTooltip> - <name>СписокSearchStringExtendedTooltip</name> - <id>34</id> + <name>ИмяФайлаРасширеннаяПодсказка</name> + <id>30</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -381,8 +219,147 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СписокSearchStringContextMenu</name> + <name>ИмяФайлаКонтекстноеМеню</name> + <id>29</id> + <autoFill>true</autoFill> + </contextMenu> + <type>LabelField</type> + <editMode>Enter</editMode> + <showInHeader>true</showInHeader> + <headerHorizontalAlign>Left</headerHorizontalAlign> + <showInFooter>true</showInFooter> + <extInfo xsi:type="form:LabelFieldExtInfo"> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + </extInfo> + </items> + <items xsi:type="form:FormField"> + <name>РасширениеФайла</name> + <id>31</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Список.РасширениеФайла</segments> + </dataPath> + <extendedTooltip> + <name>РасширениеФайлаРасширеннаяПодсказка</name> <id>33</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>РасширениеФайлаКонтекстноеМеню</name> + <id>32</id> + <autoFill>true</autoFill> + </contextMenu> + <type>LabelField</type> + <editMode>Enter</editMode> + <showInHeader>true</showInHeader> + <headerHorizontalAlign>Left</headerHorizontalAlign> + <showInFooter>true</showInFooter> + <extInfo xsi:type="form:LabelFieldExtInfo"> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + </extInfo> + </items> + <items xsi:type="form:FormField"> + <name>РазмерФайла</name> + <id>34</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Список.РазмерФайла</segments> + </dataPath> + <extendedTooltip> + <name>РазмерФайлаРасширеннаяПодсказка</name> + <id>36</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>РазмерФайлаКонтекстноеМеню</name> + <id>35</id> + <autoFill>true</autoFill> + </contextMenu> + <type>LabelField</type> + <editMode>Enter</editMode> + <showInHeader>true</showInHeader> + <headerHorizontalAlign>Left</headerHorizontalAlign> + <showInFooter>true</showInFooter> + <extInfo xsi:type="form:LabelFieldExtInfo"> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + </extInfo> + </items> + <items xsi:type="form:FormField"> + <name>ФайлБольше100Мб</name> + <id>37</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Список.ФайлБольше100Мб</segments> + </dataPath> + <extendedTooltip> + <name>ФайлБольше100МбРасширеннаяПодсказка</name> + <id>39</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>ФайлБольше100МбКонтекстноеМеню</name> + <id>38</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> + <commandBarLocation>None</commandBarLocation> + <autoCommandBar> + <name>СписокКоманднаяПанель</name> + <id>5</id> + <horizontalAlign>Left</horizontalAlign> + </autoCommandBar> + <searchStringAddition> + <name>СписокСтрокаПоиска</name> + <id>7</id> + <extendedTooltip> + <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> + <id>9</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>СписокСтрокаПоискаКонтекстноеМеню</name> + <id>8</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -391,11 +368,11 @@ </extInfo> </searchStringAddition> <viewStatusAddition> - <name>СписокViewStatus</name> - <id>35</id> + <name>СписокСостояниеПросмотра</name> + <id>10</id> <extendedTooltip> - <name>СписокViewStatusExtendedTooltip</name> - <id>37</id> + <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> + <id>12</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -404,8 +381,8 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СписокViewStatusContextMenu</name> - <id>36</id> + <name>СписокСостояниеПросмотраКонтекстноеМеню</name> + <id>11</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -415,11 +392,11 @@ </extInfo> </viewStatusAddition> <searchControlAddition> - <name>СписокSearchControl</name> - <id>38</id> + <name>СписокУправлениеПоиском</name> + <id>13</id> <extendedTooltip> - <name>СписокSearchControlExtendedTooltip</name> - <id>40</id> + <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> + <id>15</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -428,8 +405,8 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СписокSearchControlContextMenu</name> - <id>39</id> + <name>СписокУправлениеПоискомКонтекстноеМеню</name> + <id>14</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -439,8 +416,8 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокExtendedTooltip</name> - <id>16</id> + <name>СписокРасширеннаяПодсказка</name> + <id>6</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -450,7 +427,7 @@ </extendedTooltip> <contextMenu> <name>СписокКонтекстноеМеню</name> - <id>2</id> + <id>4</id> <autoFill>true</autoFill> </contextMenu> <changeRowSet>true</changeRowSet> @@ -468,9 +445,11 @@ <verticalLines>true</verticalLines> <searchOnInput>Auto</searchOnInput> <initialListView>Auto</initialListView> + <initialTreeView>ExpandTopLevel</initialTreeView> <horizontalStretch>true</horizontalStretch> <verticalStretch>true</verticalStretch> <enableStartDrag>true</enableStartDrag> + <fileDragMode>AsFileRef</fileDragMode> <rowPictureDataPath xsi:type="form:DataPath"> <segments>Список.DefaultPicture</segments> </rowPictureDataPath> @@ -484,18 +463,43 @@ <topLevelParent xsi:type="core:UndefinedValue"/> <showRoot>true</showRoot> <allowGettingCurrentRowURL>true</allowGettingCurrentRowURL> - <userSettingsGroup>ГруппаПользовательскихНастроек</userSettingsGroup> + <userSettingsGroup>СписокКомпоновщикНастроекПользовательскиеНастройки</userSettingsGroup> </extInfo> </items> <autoCommandBar> <name>ФормаКоманднаяПанель</name> <id>-1</id> + <items xsi:type="form:Button"> + <name>ФормаСохранить</name> + <id>40</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ФормаСохранитьРасширеннаяПодсказка</name> + <id>41</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Command.Сохранить</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> <horizontalAlign>Left</horizontalAlign> + <autoFill>true</autoFill> </autoCommandBar> - <excludedCommands>Change</excludedCommands> <excludedCommands>Copy</excludedCommands> <excludedCommands>Create</excludedCommands> - <excludedCommands>Delete</excludedCommands> <windowOpeningMode>DontBlock</windowOpeningMode> <saveWindowSettings>true</saveWindowSettings> <autoTitle>true</autoTitle> @@ -520,37 +524,77 @@ </edit> <main>true</main> <extInfo xsi:type="form:DynamicListExtInfo"> - <mainTable>InformationRegister.ВерсииОбъектов</mainTable> + <mainTable>InformationRegister.АрхивСообщенийОбменов</mainTable> <dynamicDataRead>true</dynamicDataRead> <autoFillAvailableFields>true</autoFillAvailableFields> <autoSaveUserSettings>true</autoSaveUserSettings> <getInvisibleFieldPresentations>true</getInvisibleFieldPresentations> </extInfo> </attributes> + <attributes> + <name>КлючиРегистра</name> + <id>2</id> + <valueType> + <types>ValueTable</types> + </valueType> + <view> + <common>true</common> + </view> + <edit> + <common>true</common> + </edit> + <columns> + <name>УзелИнформационнойБазы</name> + <id>1</id> + <valueType> + <types>ExchangePlanRef</types> + </valueType> + <view> + <common>true</common> + </view> + <edit> + <common>true</common> + </edit> + </columns> + <columns> + <name>Период</name> + <id>2</id> + <valueType> + <types>Date</types> + <dateQualifiers/> + </valueType> + <view> + <common>true</common> + </view> + <edit> + <common>true</common> + </edit> + </columns> + </attributes> <formCommands> - <name>УдалитьЗаписи</name> + <name>Сохранить</name> <title> <key>ru</key> - <value>Удалить записи по версиям</value> + <value>Сохранить</value> 1 ru - Удалить записи + Сохранить true - StdPicture.Delete + StdPicture.SaveFile - УдалитьЗаписи + Сохранить TextPicture - DontUse + Auto Auto diff --git a/SSL/src/InformationRegisters/АрхивСообщенийОбменов/Forms/ФормаСписка/Module.bsl b/SSL/src/InformationRegisters/АрхивСообщенийОбменов/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..3ed4943ed --- /dev/null +++ b/SSL/src/InformationRegisters/АрхивСообщенийОбменов/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,108 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Сохранить(Команда) + + ВыделенныеСтроки = Элементы.Список.ВыделенныеСтроки; + + Если ВыделенныеСтроки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + КлючиРегистра.Очистить(); + Для Каждого Строка Из ВыделенныеСтроки Цикл + СтрокаСписка = Элементы.Список.ДанныеСтроки(Строка); + НоваяСтрока = КлючиРегистра.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаСписка); + КонецЦикла; + + ФайлыДляСкачивания = ПодготовитьФайлыНаСервере(); + + Если ФайлыДляСкачивания.Количество() <> 0 Тогда + Заголовок = НСтр("ru = 'Выберите каталог для сохранения файлов'"); + ПараметрыДиалога = Новый ПараметрыДиалогаПолученияФайлов(Заголовок, Истина); + НачатьПолучениеФайловССервера(ФайлыДляСкачивания, ПараметрыДиалога); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Функция ПодготовитьФайлыНаСервере() + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | КлючиРегистра.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | КлючиРегистра.Период КАК Период + |ПОМЕСТИТЬ ВТ_КлючиРегистра + |ИЗ + | &КлючиРегистра КАК КлючиРегистра + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Архив.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | Архив.Период КАК Период, + | Архив.ПолноеИмяФайла КАК ПолноеИмяФайла, + | Архив.НомерПринятогоСообщения КАК НомерПринятогоСообщения, + | Архив.Хранилище КАК Хранилище, + | Архив.ИмяФайла КАК ИмяФайла, + | Архив.РасширениеФайла КАК РасширениеФайла + |ИЗ + | ВТ_КлючиРегистра КАК ВТ_КлючиРегистра + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АрхивСообщенийОбменов КАК Архив + | ПО (Архив.УзелИнформационнойБазы = ВТ_КлючиРегистра.УзелИнформационнойБазы) + | И (Архив.Период = ВТ_КлючиРегистра.Период) + | И (НЕ Архив.ФайлБольше100Мб)"; + + Запрос.УстановитьПараметр("КлючиРегистра", КлючиРегистра.Выгрузить()); + + Выборка = Запрос.Выполнить().Выбрать(); + + Результат = Новый Массив; + + Пока Выборка.Следующий() Цикл + + Если Выборка.ПолноеИмяФайла <> "" Тогда + ДвоичныеДанные = Новый ДвоичныеДанные(Выборка.ПолноеИмяФайла); + Иначе + ДвоичныеДанные = Выборка.Хранилище.Получить(); + КонецЕсли; + + Если ДвоичныеДанные = Неопределено Тогда + + Шаблон = НСтр("ru = 'Не обнаружено сообщение №%1 для узла ""%2"" от %3'"); + ТекстСообщения = СтрШаблон(Шаблон, + Выборка.НомерПринятогоСообщения, + Выборка.УзелИнформационнойБазы, + Выборка.Период); + + ОбщегоНазначения.СообщитьПользователю(ТекстСообщения); + + Продолжить; + + КонецЕсли; + + Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные); + ИмяФайла = Выборка.ИмяФайла + "." + Выборка.РасширениеФайла; + Результат.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла, Адрес)) + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/InformationRegisters/АрхивСообщенийОбменов/ManagerModule.bsl b/SSL/src/InformationRegisters/АрхивСообщенийОбменов/ManagerModule.bsl new file mode 100644 index 000000000..596127c0f --- /dev/null +++ b/SSL/src/InformationRegisters/АрхивСообщенийОбменов/ManagerModule.bsl @@ -0,0 +1,174 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ПоместитьСообщениеВАрхив(УзелИнформационнойБазы, ПутьКИсходномуФайлу) Экспорт + + Если НЕ ЗначениеЗаполнено(УзелИнформационнойБазы) Тогда + Возврат; + КонецЕсли; + + Настройки = РегистрыСведений.НастройкиАрхиваСообщенийОбменов.ПолучитьНастройки(УзелИнформационнойБазы); + + Если Настройки = Неопределено Или Настройки.КоличествоФайлов = 0 Тогда + Возврат; + КонецЕсли; + + НачатьТранзакцию(); + + Попытка + + ПоместитьВАрхив(УзелИнформационнойБазы, ПутьКИсходномуФайлу, Настройки); + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + + СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииПомещениеСообщенияВАрхив(), + УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); + + КонецПопытки; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ПоместитьВАрхив(УзелИнформационнойБазы, ПутьКИсходномуФайлу, Настройки) + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.АрхивСообщенийОбменов"); + ЭлементБлокировки.УстановитьЗначение("УзелИнформационнойБазы", УзелИнформационнойБазы); + Блокировка.Заблокировать(); + + Набор = РегистрыСведений.АрхивСообщенийОбменов.СоздатьНаборЗаписей(); + Набор.Отбор.УзелИнформационнойБазы.Установить(УзелИнформационнойБазы); + Набор.Прочитать(); + + КоличествоЗаписей = Набор.Количество(); + Для Сч = 1 По КоличествоЗаписей Цикл + + Индекс = КоличествоЗаписей - Сч; + Запись = Набор[Индекс]; + Если Запись.ФайлБольше100Мб Тогда + Набор.Удалить(Индекс); + КонецЕсли; + + КонецЦикла; + + Для Сч = 1 По Набор.Количество() - Настройки.КоличествоФайлов + 1 Цикл + + Запись = Набор.Получить(0); + + Если Запись.ПолноеИмяФайла <> "" Тогда + УдалитьФайлы(Запись.ПолноеИмяФайла); + КонецЕсли; + + Набор.Удалить(0); + + КонецЦикла; + + Если СтрЗаканчиваетсяНа(НРег(ПутьКИсходномуФайлу), "zip") Тогда + РасширениеФайла = "zip"; + Иначе + РасширениеФайла = "xml"; + КонецЕсли; + + УдалитьФайлПослеПомещения = Ложь; + Если Настройки.СжиматьФайлы И РасширениеФайла <> "zip" Тогда + + УдалитьФайлПослеПомещения = Истина; + РасширениеФайла = "zip"; + ИмяФайла = ПолучитьИмяВременногоФайла(РасширениеФайла); + + ОбменДаннымиСервер.ЗапаковатьВZipФайл(ИмяФайла, ПутьКИсходномуФайлу); + + Иначе + + ИмяФайла = ПутьКИсходномуФайлу; + + КонецЕсли; + + Файл = Новый Файл(ИмяФайла); + РазмерФайла = Файл.Размер() / (1024 * 1024); + + Шаблон = "%1_%2_%3"; + ИмяФайлаВАрхиве = СтрШаблон(Шаблон, + УзелИнформационнойБазы.Код, + УзелИнформационнойБазы.НомерПринятого, + Строка(Новый УникальныйИдентификатор)); + + НовыйАрхив = Набор.Добавить(); + НовыйАрхив.УзелИнформационнойБазы = УзелИнформационнойБазы; + НовыйАрхив.Период = ТекущаяДатаСеанса(); + НовыйАрхив.НомерПринятогоСообщения = УзелИнформационнойБазы.НомерПринятого; + НовыйАрхив.РазмерФайла = РазмерФайла; + НовыйАрхив.ИмяФайла = ИмяФайлаВАрхиве; + НовыйАрхив.РасширениеФайла = РасширениеФайла; + + Если Настройки.ХранитьНаДиске Тогда + + Шаблон = "%1%2.%3"; + + ИмяПапки = Настройки.ПолныйПуть; + + ПолноеИмяФайлаВПапке = СтроковыеФункции.ФорматированнаяСтрока(Шаблон, + ИмяПапки, + ИмяФайлаВАрхиве, + РасширениеФайла); + + КопироватьФайл(ИмяФайла, ПолноеИмяФайлаВПапке); + НовыйАрхив.ПолноеИмяФайла = ПолноеИмяФайлаВПапке; + + Иначе + + Если ОбщегоНазначения.РазделениеВключено() И РазмерФайла > 100 Тогда + + НовыйАрхив.ФайлБольше100Мб = Истина; + + Причина = НСтр("ru = 'Сообщение обмена больше 100 Мб. Файл не был помещен в архив.'"); + + ПараметрыЗаписи = Новый Структура; + ПараметрыЗаписи.Вставить("УзелИнформационнойБазы", УзелИнформационнойБазы); + ПараметрыЗаписи.Вставить("Причина", Причина); + ПараметрыЗаписи.Вставить("ТипПроблемы", Перечисления.ТипыПроблемОбменаДанными.СообщениеОбменаНеПомещеноВАрхив); + + РегистрыСведений.РезультатыОбменаДанными.ДобавитьЗаписьОРезультатахОбмена(ПараметрыЗаписи); + + Иначе + + НовыйАрхив.Хранилище = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайла)); + + КонецЕсли; + + КонецЕсли; + + Если УдалитьФайлПослеПомещения Тогда + УдалитьФайлы(ИмяФайла); + КонецЕсли; + + Набор.Записать(); + +КонецПроцедуры + +Функция СобытиеЖурналаРегистрацииПомещениеСообщенияВАрхив() + + Возврат НСтр("ru = 'Обмен данными.Помещение сообщения в архив'", ОбщегоНазначения.КодОсновногоЯзыка()); + +КонецФункции + +#КонецОбласти + +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/InformationRegisters/АрхивСообщенийОбменов/RecordSetModule.bsl b/SSL/src/InformationRegisters/АрхивСообщенийОбменов/RecordSetModule.bsl new file mode 100644 index 000000000..42522590c --- /dev/null +++ b/SSL/src/InformationRegisters/АрхивСообщенийОбменов/RecordSetModule.bsl @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область ОбработчикиСобытий + +Процедура ПередЗаписью(Отказ, Замещение) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если Количество() = 0 Тогда + + Прочитать(); + + Если Количество() > 0 Тогда + Запись = ЭтотОбъект[0]; + Если Запись.ПолноеИмяФайла <> "" Тогда + УдалитьФайлы(Запись.ПолноеИмяФайла); + КонецЕсли; + КонецЕсли; + + Очистить(); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Иначе +ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'"); +#КонецЕсли diff --git a/SSL/src/InformationRegisters/АрхивСообщенийОбменов/АрхивСообщенийОбменов.mdo b/SSL/src/InformationRegisters/АрхивСообщенийОбменов/АрхивСообщенийОбменов.mdo new file mode 100644 index 000000000..9d3bec587 --- /dev/null +++ b/SSL/src/InformationRegisters/АрхивСообщенийОбменов/АрхивСообщенийОбменов.mdo @@ -0,0 +1,209 @@ + + + + + + + + + + + + АрхивСообщенийОбменов + + ru + Архив сообщений обменов + + InDialog + InformationRegister.АрхивСообщенийОбменов.Form.ФормаЗаписи + InformationRegister.АрхивСообщенийОбменов.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Second + Managed + + ПолноеИмяФайла + + ru + Полное имя файла + + + String + + + + + Use + Use + + + + Хранилище + + ru + Хранилище + + + ValueStorage + + + + Use + Use + + + + НомерПринятогоСообщения + + ru + Номер принятого сообщения + + + Number + + 15 + + + + + Use + Use + + + + ИмяФайла + + ru + Имя файла + + + String + + + + + Use + Use + + + + РасширениеФайла + + ru + Расширение файла + + + String + + 3 + + + + + Use + Use + + + + РазмерФайла + + ru + Размер файла (Мб) + + + Number + + 15 + + + + + Use + Use + + + + ФайлБольше100Мб + + ru + Файл больше100 мб + + + Boolean + + + + Use + Use + + + + УзелИнформационнойБазы + + ru + Узел информационной базы + + АПК:1330 универсальный механизм + + ExchangePlanRef + + + + true + Use + 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 a504ce880..a24837849 100644 --- a/SSL/src/InformationRegisters/БуферОперацийСтатистики/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/БуферОперацийСтатистики/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборРеквизитовОбъекта/Form.form b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборРеквизитовОбъекта/Form.form index 98acace6a..2dc676642 100644 --- a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборРеквизитовОбъекта/Form.form +++ b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборРеквизитовОбъекта/Form.form @@ -223,6 +223,38 @@ UserCmds Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 43 + + СтрокаПоискаРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 44 + true + + РеквизитыОбъекта + + true + + Left
        diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Form.form b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Form.form index 018e146ac..bf923eb70 100644 --- a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Form.form +++ b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Form.form @@ -200,6 +200,38 @@ Auto InAdditionalSubmenu + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 121 + + СтрокаПоискаРасширеннаяПодсказка + 123 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 122 + true + + ДеревоВерсий + + true + + true true diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Module.bsl b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Module.bsl deleted file mode 100644 index 8e895e8ca..000000000 --- a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Module.bsl +++ /dev/null @@ -1,63 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////// -// Copyright (c) 2023, ООО 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 index 0e4ae0893..574fa4c4b 100644 --- a/SSL/src/InformationRegisters/ВерсииОбъектов/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ВерсииОбъектов/ManagerModule.bsl @@ -102,7 +102,6 @@ | ВерсииОбъектов.АвторВерсии = &АвторВерсии"; Запрос.УстановитьПараметр("АвторВерсии", АвторВерсии); - Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Количество() > 0 Цикл @@ -1692,7 +1691,7 @@ // другом сеансе (или по другим причинам), отменить транзакцию и записать сведения об ошибке в журнал регистрации. ОтменитьТранзакцию(); - ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/ВерсииОбъектов.mdo b/SSL/src/InformationRegisters/ВерсииОбъектов/ВерсииОбъектов.mdo index 6c0b4f08a..45c6039ca 100644 --- a/SSL/src/InformationRegisters/ВерсииОбъектов/ВерсииОбъектов.mdo +++ b/SSL/src/InformationRegisters/ВерсииОбъектов/ВерсииОбъектов.mdo @@ -404,15 +404,6 @@ true - - ФормаСписка - - ru - Форма списка - - PersonalComputer - MobileDevice - ОтчетПоВерсиямОбъекта diff --git a/SSL/src/InformationRegisters/ВерсииПодсистем/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ВерсииПодсистем/Forms/ФормаЗаписи/Form.form index bf8e32069..524367e4b 100644 --- a/SSL/src/InformationRegisters/ВерсииПодсистем/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/ВерсииПодсистем/Forms/ФормаЗаписи/Form.form @@ -159,7 +159,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/InformationRegisters/ВерсииПодсистем/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ВерсииПодсистем/Forms/ФормаСписка/Form.form index 8d1d072cb..bcf18a06e 100644 --- a/SSL/src/InformationRegisters/ВерсииПодсистем/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ВерсииПодсистем/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/Forms/ФормаСписка/Form.form index dd9bd933e..2b4e71885 100644 --- a/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -609,11 +608,7 @@ ВЫБРАТЬ ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(ГруппыЗначенийДоступа.ЗначениеДоступа) = ТИП(Справочник.Пользователи) - ТОГДА ВЫБОР - КОГДА ВЫРАЗИТЬ(ГруппыЗначенийДоступа.ЗначениеДоступа КАК Справочник.Пользователи).ПометкаУдаления - ТОГДА 0 - ИНАЧЕ 1 - КОНЕЦ + ТОГДА ЕСТЬNULL(ЗначениеДоступаСведения.НомерКартинкиСостояния, 0) - 1 КОГДА ТИПЗНАЧЕНИЯ(ГруппыЗначенийДоступа.ЗначениеДоступа) = ТИП(Справочник.ГруппыПользователей) ТОГДА ВЫБОР КОГДА ВЫРАЗИТЬ(ГруппыЗначенийДоступа.ЗначениеДоступа КАК Справочник.ГруппыПользователей).ПометкаУдаления @@ -621,11 +616,7 @@ ИНАЧЕ 3 КОНЕЦ КОГДА ТИПЗНАЧЕНИЯ(ГруппыЗначенийДоступа.ЗначениеДоступа) = ТИП(Справочник.ВнешниеПользователи) - ТОГДА ВЫБОР - КОГДА ВЫРАЗИТЬ(ГруппыЗначенийДоступа.ЗначениеДоступа КАК Справочник.ВнешниеПользователи).ПометкаУдаления - ТОГДА 6 - ИНАЧЕ 7 - КОНЕЦ + ТОГДА ЕСТЬNULL(ЗначениеДоступаСведения.НомерКартинкиСостояния, 0) - 1 КОГДА ТИПЗНАЧЕНИЯ(ГруппыЗначенийДоступа.ЗначениеДоступа) = ТИП(Справочник.ГруппыВнешнихПользователей) ТОГДА ВЫБОР КОГДА ВЫРАЗИТЬ(ГруппыЗначенийДоступа.ЗначениеДоступа КАК Справочник.ГруппыВнешнихПользователей).ПометкаУдаления @@ -634,15 +625,11 @@ КОНЕЦ ИНАЧЕ -1 КОНЕЦ КАК НомерКартинкиЗначенияДоступа, - ТипЗначения(ГруппыЗначенийДоступа.ЗначениеДоступа) КАК ТипЗначенияДоступа, - ГруппыЗначенийДоступа.ЗначениеДоступа, + ТИПЗНАЧЕНИЯ(ГруппыЗначенийДоступа.ЗначениеДоступа) КАК ТипЗначенияДоступа, + ГруппыЗначенийДоступа.ЗначениеДоступа КАК ЗначениеДоступа, ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(ГруппыЗначенийДоступа.ГруппаЗначенийДоступа) = ТИП(Справочник.Пользователи) - ТОГДА ВЫБОР - КОГДА ВЫРАЗИТЬ(ГруппыЗначенийДоступа.ГруппаЗначенийДоступа КАК Справочник.Пользователи).ПометкаУдаления - ТОГДА 0 - ИНАЧЕ 1 - КОНЕЦ + ТОГДА ЕСТЬNULL(ГруппаЗначенийДоступаСведения.НомерКартинкиСостояния, 0) - 1 КОГДА ТИПЗНАЧЕНИЯ(ГруппыЗначенийДоступа.ГруппаЗначенийДоступа) = ТИП(Справочник.ГруппыПользователей) ТОГДА ВЫБОР КОГДА ВЫРАЗИТЬ(ГруппыЗначенийДоступа.ГруппаЗначенийДоступа КАК Справочник.ГруппыПользователей).ПометкаУдаления @@ -650,11 +637,7 @@ ИНАЧЕ 3 КОНЕЦ КОГДА ТИПЗНАЧЕНИЯ(ГруппыЗначенийДоступа.ГруппаЗначенийДоступа) = ТИП(Справочник.ВнешниеПользователи) - ТОГДА ВЫБОР - КОГДА ВЫРАЗИТЬ(ГруппыЗначенийДоступа.ГруппаЗначенийДоступа КАК Справочник.ВнешниеПользователи).ПометкаУдаления - ТОГДА 6 - ИНАЧЕ 7 - КОНЕЦ + ТОГДА ЕСТЬNULL(ГруппаЗначенийДоступаСведения.НомерКартинкиСостояния, 0) - 1 КОГДА ТИПЗНАЧЕНИЯ(ГруппыЗначенийДоступа.ГруппаЗначенийДоступа) = ТИП(Справочник.ГруппыВнешнихПользователей) ТОГДА ВЫБОР КОГДА ВЫРАЗИТЬ(ГруппыЗначенийДоступа.ГруппаЗначенийДоступа КАК Справочник.ГруппыВнешнихПользователей).ПометкаУдаления @@ -663,10 +646,14 @@ КОНЕЦ ИНАЧЕ -1 КОНЕЦ КАК НомерКартинкиГруппыЗначенийДоступа, - ГруппыЗначенийДоступа.ГруппаЗначенийДоступа, - ГруппыЗначенийДоступа.ГруппаДанных + ГруппыЗначенийДоступа.ГруппаЗначенийДоступа КАК ГруппаЗначенийДоступа, + ГруппыЗначенийДоступа.ГруппаДанных КАК ГруппаДанных ИЗ - РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа + РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа + ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК ЗначениеДоступаСведения + ПО (ЗначениеДоступаСведения.Пользователь = ГруппыЗначенийДоступа.ЗначениеДоступа) + ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК ГруппаЗначенийДоступаСведения + ПО (ГруппаЗначенийДоступаСведения.Пользователь = ГруппыЗначенийДоступа.ГруппаЗначенийДоступа) InformationRegister.ГруппыЗначенийДоступа true true diff --git a/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/ManagerModule.bsl b/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/ManagerModule.bsl index b9b07bdc3..d9e44140f 100644 --- a/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/ManagerModule.bsl @@ -203,6 +203,7 @@ Для Каждого ИмяТаблицы Из ЗначенияДоступаСГруппами.ИменаТаблицДляОбновления Цикл Запрос.Текст = СтрЗаменить(ТекстЗапроса, "&ТекущаяТаблица", ИмяТаблицы); + // @skip-check query-in-loop - Малый цикл из одной или двух итераций Выборка = Запрос.Выполнить().Выбрать(); МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИмяТаблицы); @@ -582,7 +583,7 @@ Строка(ЗначениеДоступа), Строка(ТипЗначенияДоступа), "Ссылка", - КраткоеПредставлениеОшибки(Ошибка)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(Ошибка)); ВызватьИсключение ТекстОшибки; ИначеЕсли СвойстваВидаДоступа.НесколькоГруппЗначений Тогда @@ -610,7 +611,7 @@ Строка(ТипЗначенияДоступа), "ГруппыДоступа", "ГруппаДоступа", - КраткоеПредставлениеОшибки(Ошибка)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(Ошибка)); ВызватьИсключение ТекстОшибки; КонецЕсли; Иначе @@ -629,7 +630,7 @@ Строка(ЗначениеДоступа), Строка(ТипЗначенияДоступа), "ГруппаДоступа", - КраткоеПредставлениеОшибки(Ошибка)); + ОбработкаОшибок.КраткоеПредставлениеОшибки(Ошибка)); ВызватьИсключение ТекстОшибки; КонецЕсли; КонецЕсли; diff --git a/SSL/src/InformationRegisters/ДампыПлатформы/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ДампыПлатформы/Forms/ФормаСписка/Form.form index bc1e2bfbf..2bf462cce 100644 --- a/SSL/src/InformationRegisters/ДампыПлатформы/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ДампыПлатформы/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ДампыПлатформы/ManagerModule.bsl b/SSL/src/InformationRegisters/ДампыПлатформы/ManagerModule.bsl index 2f5605a40..8a9adfd9e 100644 --- a/SSL/src/InformationRegisters/ДампыПлатформы/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ДампыПлатформы/ManagerModule.bsl @@ -112,8 +112,10 @@ Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УслВерсияПлатформы", "ИСТИНА"); КонецЕсли; - РезультатЗапроса = Запрос.Выполнить(); - Возврат РезультатЗапроса; + ТаблицаДампов = Запрос.Выполнить().Выгрузить(); + ТаблицаДампов.Колонки[0].Имя = "dumpVariant"; + ТаблицаДампов.Колонки[1].Имя = "quantity"; + Возврат ТаблицаДампов; КонецФункции #КонецОбласти diff --git a/SSL/src/InformationRegisters/ДанныеБизнесПроцессов/Forms/МоиБизнесПроцессы/Form.form b/SSL/src/InformationRegisters/ДанныеБизнесПроцессов/Forms/МоиБизнесПроцессы/Form.form index 749918632..8eb66df9a 100644 --- a/SSL/src/InformationRegisters/ДанныеБизнесПроцессов/Forms/МоиБизнесПроцессы/Form.form +++ b/SSL/src/InformationRegisters/ДанныеБизнесПроцессов/Forms/МоиБизнесПроцессы/Form.form @@ -30,7 +30,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/InformationRegisters/ДанныеБизнесПроцессов/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ДанныеБизнесПроцессов/Forms/ФормаСписка/Form.form index 69ceb25fe..b2fd5da9d 100644 --- a/SSL/src/InformationRegisters/ДанныеБизнесПроцессов/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ДанныеБизнесПроцессов/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Form.form b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Form.form index b217563e0..ffd68f0a8 100644 --- a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Form.form +++ b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Form.form @@ -171,7 +171,6 @@ HorizontalIfPossible Center - Auto true true Auto @@ -491,10 +490,6 @@ ПользователиДатЗапрета.Комментарий - - ru - Причина отдельного запрета для пользователя или группы пользователей - OnChange ПользователиКомментарийПриИзменении @@ -609,6 +604,38 @@ Item.Пользователи + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + ПользователиСтрокаПоиск + 496 + + ПользователиСтрокаПоискРасширеннаяПодсказка + 498 + Label + true + true + + Left + + + + ПользователиСтрокаПоискКонтекстноеМеню + 497 + true + + Пользователи + + true + + Left @@ -779,7 +806,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1026,7 +1052,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1100,7 +1125,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -1447,7 +1471,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1577,7 +1600,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -2131,6 +2153,38 @@ Item.ДатыЗапрета + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + ДатыЗапретаСтрокаПоиск + 499 + + ДатыЗапретаСтрокаПоискРасширеннаяПодсказка + 501 + Label + true + true + + Left + + + + ДатыЗапретаСтрокаПоискКонтекстноеМеню + 500 + true + + ДатыЗапрета + + true + + Left @@ -2630,7 +2684,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -2660,7 +2713,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -3006,7 +3058,7 @@ Number - 1 + 2 @@ -3448,6 +3500,19 @@ true + + ЕстьНедоступныеОбъектыПоПользователям + 8 + + Boolean + + + true + + + true + + ПодобратьОбъекты diff --git a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Module.bsl b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Module.bsl index 8339a5772..7eb943133 100644 --- a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Module.bsl +++ b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Module.bsl @@ -22,25 +22,44 @@ СвойстваРазделов = ДатыЗапретаИзмененияСлужебный.СвойстваРазделов(); - // Проверки прав доступа. + // Проверка прав доступа. + // АПК:515-выкл - №737.4 проверка по ролям, так как право есть всегда. + ЕстьПравоПросмотраЗапретаИзмененияДанных = + Пользователи.РолиДоступны("ЧтениеДатЗапретаИзменения, ДобавлениеИзменениеДатЗапретаИзменения",, Ложь); + + ЕстьПравоРедактированияЗапретаИзмененияДанных = ЕстьПравоПросмотраЗапретаИзмененияДанных + И Пользователи.РолиДоступны("ДобавлениеИзменениеДатЗапретаИзменения",, Ложь); + + ЕстьПравоПросмотраЗапретаЗагрузкиДанных = + СвойстваРазделов.ДатыЗапретаЗагрузкиВнедрены + И Пользователи.РолиДоступны("ЧтениеДатЗапретаЗагрузки, ДобавлениеИзменениеДатЗапретаЗагрузки",, Ложь); + + ЕстьПравоРедактированияЗапретаЗагрузкиДанных = ЕстьПравоПросмотраЗапретаЗагрузкиДанных + И Пользователи.РолиДоступны("ДобавлениеИзменениеДатЗапретаЗагрузки",, Ложь); + // АПК:515-вкл Если Параметры.ДатыЗапретаЗагрузкиДанных Тогда Если Не СвойстваРазделов.ДатыЗапретаЗагрузкиВнедрены Тогда ВызватьИсключение ДатыЗапретаИзмененияСлужебный.ТекстОшибкиДатыЗапретаЗагрузкиНеВнедрены(); КонецЕсли; + Если Не ЕстьПравоПросмотраЗапретаЗагрузкиДанных Тогда + ВызватьИсключение НСтр("ru = 'Недостаточно прав для просмотра дат запрета загрузки данных прошлых периодов из других программ.'"); + КонецЕсли; + ИначеЕсли Не ЕстьПравоПросмотраЗапретаИзмененияДанных Тогда + ВызватьИсключение НСтр("ru = 'Недостаточно прав для просмотра дат запрета ввода и редактирования данных прошлых периодов.'"); + КонецЕсли; + + Если Не Параметры.ДатыЗапретаЗагрузкиДанных + И Не ЕстьПравоРедактированияЗапретаИзмененияДанных + Или Параметры.ДатыЗапретаЗагрузкиДанных + И Не ЕстьПравоРедактированияЗапретаЗагрузкиДанных Тогда - Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда - ВызватьИсключение НСтр("ru = 'Недостаточно прав для настройки дат запрета загрузки данных прошлых периодов из других программ.'"); - КонецЕсли; - ЕстьПраваЗапретаИзмененияДанных = ПравоДоступа("Редактирование", Метаданные.РегистрыСведений.ДатыЗапретаИзменения) - И ПравоДоступа("Просмотр", Метаданные.ПланыВидовХарактеристик.РазделыДатЗапретаИзменения) - И ПолучитьФункциональнуюОпцию("ИспользоватьДатыЗапретаИзменения"); - Иначе - Если Не ПравоДоступа("Редактирование", Метаданные.РегистрыСведений.ДатыЗапретаИзменения) - Или Не ПравоДоступа("Просмотр", Метаданные.ПланыВидовХарактеристик.РазделыДатЗапретаИзменения) Тогда - ВызватьИсключение НСтр("ru = 'Недостаточно прав для настройки дат запрета ввода и редактирования данных прошлых периодов.'"); - КонецЕсли; - ЕстьПраваЗапретаЗагрузкиДанных = СвойстваРазделов.ДатыЗапретаЗагрузкиВнедрены И Пользователи.ЭтоПолноправныйПользователь() - И ПолучитьФункциональнуюОпцию("ИспользоватьДатыЗапретаЗагрузки"); + Элементы.УстановкаДатыЗапрета.Доступность = Ложь; + Элементы.Пользователи.ТолькоПросмотр = Истина; + Элементы.ПользователиПодобрать.Доступность = Ложь; + Элементы.ДатыЗапрета.ТолькоПросмотр = Истина; + Элементы.ДатыЗапретаОписаниеДатыЗапретаПредставление.ГиперссылкаЯчейки = Ложь; + Элементы.СпособУказанияОбщаяДата.ТолькоПросмотр = Истина; + Элементы.ГруппаРасширенныеВозможности.ТолькоПросмотр = Истина; КонецЕсли; // Кэширование текущей даты на сервере. @@ -95,6 +114,9 @@ Элементы.ПользователиПолноеПредставление.Заголовок = НСтр("ru = 'Программа: информационная база'"); + Элементы.ПользователиКомментарий.Подсказка = + НСтр("ru = 'Описывает причину отдельного запрета для информационной базы или программы'"); + ЗначениеДляВсехПользователей = Перечисления.ВидыНазначенияДатЗапрета.ДляВсехИнформационныхБаз; ТипыПользователя = @@ -114,18 +136,27 @@ Элементы.Пользователи.КартинкаСтрок = БиблиотекаКартинок.ПиктограммыПланОбменаУзел; НавигационнаяСсылка = "e1cib/command/РегистрСведений.ДатыЗапретаИзменения.Команда.ДатыЗапретаЗагрузкиДанных"; - Если ЕстьПраваЗапретаИзмененияДанных Тогда - ПереходКДругимДатамЗапрета = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Также можно настроить <a href=""%1"">даты запрета ввода и редактирования данных</a> прошлых периодов.'"), - "e1cib/command/РегистрСведений.ДатыЗапретаИзменения.Команда.ДатыЗапретаИзмененияДанных"); - КонецЕсли; - + Если ПолучитьФункциональнуюОпцию("ИспользоватьДатыЗапретаИзменения") Тогда + Если ЕстьПравоРедактированияЗапретаИзмененияДанных Тогда + ПереходКДругимДатамЗапрета = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Также можно настроить <a href=""%1"">даты запрета ввода и редактирования данных</a> прошлых периодов.'"), + "e1cib/command/РегистрСведений.ДатыЗапретаИзменения.Команда.ДатыЗапретаИзмененияДанных"); + + ИначеЕсли ЕстьПравоПросмотраЗапретаИзмененияДанных Тогда + ПереходКДругимДатамЗапрета = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Также можно посмотреть <a href=""%1"">даты запрета ввода и редактирования данных</a> прошлых периодов.'"), + "e1cib/command/РегистрСведений.ДатыЗапретаИзменения.Команда.ДатыЗапретаИзмененияДанных"); + КонецЕсли; + КонецЕсли; Иначе Элементы.ИспользованиеДатЗапретаВыключеноНадпись.Заголовок = НСтр("ru = 'Даты запрета ввода и редактирования данных прошлых периодов отключены в настройках программы.'"); Элементы.ПользователиПолноеПредставление.Заголовок = ?(ПолучитьФункциональнуюОпцию("ИспользоватьГруппыПользователей"), НСтр("ru = 'Пользователь, группа пользователей'"), НСтр("ru = 'Пользователь'")); + Элементы.ПользователиКомментарий.Подсказка = + НСтр("ru = '1. Определяет порядок групп пользователей при расчете дат запрета + |2. Описывает причину отдельного запрета для пользователя или группы пользователей'"); ЗначениеДляВсехПользователей = Перечисления.ВидыНазначенияДатЗапрета.ДляВсехПользователей; СписокТиповПользователей.Добавить( Тип("СправочникСсылка.Пользователи"), НСтр("ru = 'Пользователь'")); @@ -134,11 +165,18 @@ НавигационнаяСсылка = "e1cib/command/РегистрСведений.ДатыЗапретаИзменения.Команда.ДатыЗапретаИзмененияДанных"; - Если ЕстьПраваЗапретаЗагрузкиДанных Тогда - ПереходКДругимДатамЗапрета = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Также можно настроить <a href=""%1"">даты запрета загрузки данных</a> из других программ.'"), - "e1cib/command/РегистрСведений.ДатыЗапретаИзменения.Команда.ДатыЗапретаЗагрузкиДанных"); - КонецЕсли; + Если ПолучитьФункциональнуюОпцию("ИспользоватьДатыЗапретаЗагрузки") Тогда + Если ЕстьПравоРедактированияЗапретаЗагрузкиДанных Тогда + ПереходКДругимДатамЗапрета = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Также можно настроить <a href=""%1"">даты запрета загрузки данных</a> из других программ.'"), + "e1cib/command/РегистрСведений.ДатыЗапретаИзменения.Команда.ДатыЗапретаЗагрузкиДанных"); + + ИначеЕсли ЕстьПравоПросмотраЗапретаЗагрузкиДанных Тогда + ПереходКДругимДатамЗапрета = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Также можно посмотреть <a href=""%1"">даты запрета загрузки данных</a> из других программ.'"), + "e1cib/command/РегистрСведений.ДатыЗапретаИзменения.Команда.ДатыЗапретаЗагрузкиДанных"); + КонецЕсли; + КонецЕсли; КонецЕсли; Список = Элементы.СпособУказанияДатыЗапрета.СписокВыбора; @@ -271,10 +309,11 @@ ТекущаяУстановкаДатыЗапрета = ТекущаяУстановкаДатыЗапрета(Параметры.ДатыЗапретаЗагрузкиДанных); Если ТекущаяУстановкаДатыЗапрета = "ПоПользователям" И ВыбранноеЗначение = "ДляВсехПользователей" Тогда - Если ЕстьНедоступныеОбъекты Тогда + Если ЕстьНедоступныеОбъектыПоПользователям Тогда + УстановкаДатыЗапретаНовое = ТекущаяУстановкаДатыЗапрета; ПоказатьПредупреждение(, НСтр("ru = 'Недостаточно прав для изменения дат запрета.'")); - Возврат; - КонецЕсли; + Возврат; + КонецЕсли; ТекстВопроса = НСтр("ru = 'Отключить все даты запрета, кроме установленных для всех пользователей? | @@ -565,11 +604,10 @@ Для Каждого Значение Из ВыбранноеЗначение Цикл Отбор.Пользователь = Значение; Если ПользователиДатЗапрета.НайтиСтроки(Отбор).Количество() = 0 Тогда - ЗаблокироватьИЗаписатьПустыеДаты(АдресУстановленныхБлокировок, - РазделПустаяСсылка, РазделПустаяСсылка, Отбор.Пользователь, ""); ОписаниеПользователя = ПользователиДатЗапрета.Добавить(); ОписаниеПользователя.Пользователь = Отбор.Пользователь; + ОписаниеПользователя.БезДатыЗапрета = Истина; ОписаниеПользователя.Представление = ТекстПредставленияПользователя( ЭтотОбъект, Отбор.Пользователь); @@ -678,6 +716,13 @@ ЗаписатьКомментарий(ТекущиеДанные.Пользователь, ТекущиеДанные.Комментарий); ОповеститьОбИзменении(Тип("РегистрСведенийКлючЗаписи.ДатыЗапретаИзменения")); + Если Не ТекущиеДанные.БезДатыЗапрета + И ( ТипЗнч(ТекущиеДанные.Пользователь) = Тип("СправочникСсылка.ГруппыПользователей") + Или ТипЗнч(ТекущиеДанные.Пользователь) = Тип("СправочникСсылка.ГруппыВнешнихПользователей")) Тогда + + ОбновитьНаСервере(); + КонецЕсли; + КонецПроцедуры #КонецОбласти @@ -998,6 +1043,7 @@ ОписаниеОбъекта.Представление = Строка(ТекущийОбъект); ОписаниеОбъекта.ПолноеПредставление = ОписаниеОбъекта.Представление; ОписаниеОбъекта.ОписаниеДатыЗапрета = "ПроизвольнаяДата"; + ОписаниеОбъекта.ДатаЗапрета = '39991231'; ОписаниеОбъекта.ЗаписьСуществует = ЗаписатьДаты; КонецЦикла; УстановитьВычисляемыеПоля(КоллекцияОбъектов); @@ -1289,14 +1335,18 @@ &НаКлиенте Процедура ДатыЗапретаИзменитьСтроку() - Элементы.ДатыЗапрета.ИзменитьСтроку(); + Если Не Элементы.ДатыЗапрета.ТолькоПросмотр Тогда + Элементы.ДатыЗапрета.ИзменитьСтроку(); + КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПользователиИзменитьСтроку() - Элементы.Пользователи.ИзменитьСтроку(); + Если Не Элементы.Пользователи.ТолькоПросмотр Тогда + Элементы.Пользователи.ИзменитьСтроку(); + КонецЕсли; КонецПроцедуры @@ -1384,7 +1434,9 @@ ТекущийПользователь, УстановкаДатыЗапрета); - Элементы.Пользователи.Обновить(); + Если УстановкаДатыЗапрета = "ПоПользователям" Тогда + Элементы.Пользователи.Обновить(); + КонецЕсли; ТекстОшибки = ""; ПрочитатьДанныеПользователя(ЭтотОбъект, ТекстОшибки, @@ -1572,6 +1624,7 @@ КонецЕсли; ТекущийРаздел = ТекущиеДанные.ПолучитьРодителя(); + // @skip-check query-in-loop - По-объектная запись данных УдалитьЗаписьПользователя(АдресУстановленныхБлокировок, ?(ТекущийРаздел <> Неопределено, ТекущийРаздел.Раздел, Неопределено), ТекущиеДанные.Объект, ТекущийПользователь); @@ -1812,7 +1865,28 @@ ОписаниеВсехПользователей.Представление = ТекстПредставленияДляВсехПользователей(ЭтотОбъект); ОписаниеВсехПользователей.ПолноеПредставление = ОписаниеВсехПользователей.Представление; - Выгрузка.Сортировать("ОбщееНазначение Возр, ПолноеПредставление Возр"); + Выгрузка.Колонки.Добавить("ДополнительныйПорядок", Новый ОписаниеТипов("Строка")); + Для Каждого Строка Из Выгрузка Цикл + Если Строка.ОбщееНазначение = 0 Тогда + Продолжить; + КонецЕсли; + Если Не ЗначениеЗаполнено(Строка.Пользователь) Тогда + Продолжить; + КонецЕсли; + Если ТипЗнч(Строка.Пользователь) = Тип("СправочникСсылка.ГруппыПользователей") Тогда + Строка.ДополнительныйПорядок = "1 " + Строка.Комментарий; + ИначеЕсли ТипЗнч(Строка.Пользователь) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда + Строка.ДополнительныйПорядок = "2 " + Строка.Комментарий; + ИначеЕсли ТипЗнч(Строка.Пользователь) = Тип("СправочникСсылка.Пользователи") Тогда + Строка.ДополнительныйПорядок = "3 "; + ИначеЕсли ТипЗнч(Строка.Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда + Строка.ДополнительныйПорядок = "4 "; + Иначе + Строка.ДополнительныйПорядок = "5 " + Строка(ТипЗнч(Строка.Пользователь)); + КонецЕсли; + КонецЦикла; + Выгрузка.Сортировать("ОбщееНазначение Возр, ДополнительныйПорядок Возр, ПолноеПредставление Возр"); + ЗначениеВРеквизитФормы(Выгрузка, "ПользователиДатЗапрета"); ЗаполнитьНомераКартинокПользователейДатЗапрета(ЭтотОбъект); @@ -1892,7 +1966,7 @@ Форма.Элементы.РазрешитьИзменениеДанныхДоДатыЗапрета.ТолькоПросмотр = Истина; Форма.Элементы.КоличествоДнейРазрешения.ТолькоПросмотр = Истина; - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Возврат; КонецЕсли; @@ -1919,6 +1993,7 @@ ДатыЗапрета = ДатыЗапретаПользователя(ПараметрыДатЗапрета); Форма.ПоказыватьРазделыТекущегоПользователя = ДатыЗапрета.ПоказыватьРазделыТекущегоПользователя; + Форма.ЕстьНедоступныеОбъектыПоПользователям = ДатыЗапрета.ЕстьНедоступныеОбъектыПоПользователям; Форма.ЕстьНедоступныеОбъекты = ДатыЗапрета.ЕстьНедоступныеОбъекты; // Загрузка данных пользователя в коллекцию. @@ -1984,6 +2059,7 @@ Или Форма.СпособУказанияДатыЗапрета = "ПоРазделам" Или Форма.СпособУказанияДатыЗапрета = "ПоРазделамИОбъектам"); Результат.Вставить("ЕстьНедоступныеОбъекты", Ложь); + Результат.Вставить("ЕстьНедоступныеОбъектыПоПользователям", Ложь); Результат.Вставить("ДатыЗапрета", Новый СписокЗначений); // Подготовка дерева значений дат запрета изменения. @@ -2000,6 +2076,11 @@ Форма.Пользователь, Форма.ЕдинственныйРаздел); КонецЕсли; + Если ЕстьНедоступныеОбъектыПоПользователям(Форма.ДатыЗапретаЗагрузкиДанных) Тогда + Результат.ЕстьНедоступныеОбъектыПоПользователям = Истина; + КонецЕсли; + НедоступныеОбъекты = НедоступныеОбъекты(Форма.Пользователь); + // Для возможности передачи с сервера на клиент в толстом клиенте. ПоляСтроки = "ПолноеПредставление, Представление, Раздел, Объект, |ДатаЗапрета, ОписаниеДатыЗапрета, КоличествоДнейРазрешения, @@ -2012,15 +2093,14 @@ НоваяСтрока.СписокПодстрок = Новый СписокЗначений; Для Каждого Подстрока Из Строка.Строки Цикл - - Если Не СсылкаДоступнаДляЧтения(НоваяСтрока.Объект) Тогда + Если НедоступныеОбъекты.Получить(Подстрока.Объект) <> Неопределено Тогда Результат.ЕстьНедоступныеОбъекты = Истина; - КонецЕсли; + Продолжить; + КонецЕсли; НоваяПодстрока = Новый Структура(ПоляСтроки); ЗаполнитьЗначенияСвойств(НоваяПодстрока, Подстрока); СписокПодстрок = НоваяСтрока.СписокПодстрок; // СписокЗначений СписокПодстрок.Добавить(НоваяПодстрока); - КонецЦикла; Результат.ДатыЗапрета.Добавить(НоваяСтрока); @@ -2248,24 +2328,76 @@ КонецФункции &НаСервереБезКонтекста -Функция СсылкаДоступнаДляЧтения(ПроверяемаяСсылка) - - ТекстЗапроса = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 - | ИСТИНА КАК ЗначениеИстина - |ИЗ - | &ИмяТаблицы КАК ТекущаяТаблица - |ГДЕ - | ТекущаяТаблица.Ссылка = &Ссылка"; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, - "&ИмяТаблицы", ОбщегоНазначения.ИмяТаблицыПоСсылке(ПроверяемаяСсылка)); +Функция ЕстьНедоступныеОбъектыПоПользователям(ДатыЗапретаЗагрузкиДанных) Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - Запрос.УстановитьПараметр("Ссылка", ПроверяемаяСсылка); + Запрос.УстановитьПараметр("ДатыЗапретаЗагрузкиДанных", ДатыЗапретаЗагрузкиДанных); + // АПК:1377-выкл - №654.2.1 Использование типов "через точку" необходимо + // и допустимо, так как объем данных небольшой (от единиц до сотен). + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ЕСТЬNULL(СУММА(ВЫБОР + | КОГДА НЕ ДатыЗапретаИзменения.Объект.Ссылка ЕСТЬ NULL + | ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ), 0) КАК КоличествоОбъектов + |ИЗ + | РегистрСведений.ДатыЗапретаИзменения КАК ДатыЗапретаИзменения + |ГДЕ + | ДатыЗапретаИзменения.Пользователь <> НЕОПРЕДЕЛЕНО + | И ТИПЗНАЧЕНИЯ(ДатыЗапретаИзменения.Пользователь) <> ТИП(Перечисление.ВидыНазначенияДатЗапрета) + | И ВЫБОР + | КОГДА ТИПЗНАЧЕНИЯ(ДатыЗапретаИзменения.Пользователь) = ТИП(Справочник.Пользователи) + | ИЛИ ТИПЗНАЧЕНИЯ(ДатыЗапретаИзменения.Пользователь) = ТИП(Справочник.ГруппыПользователей) + | ИЛИ ТИПЗНАЧЕНИЯ(ДатыЗапретаИзменения.Пользователь) = ТИП(Справочник.ВнешниеПользователи) + | ИЛИ ТИПЗНАЧЕНИЯ(ДатыЗапретаИзменения.Пользователь) = ТИП(Справочник.ГруппыВнешнихПользователей) + | ТОГДА &ДатыЗапретаЗагрузкиДанных = ЛОЖЬ + | ИНАЧЕ &ДатыЗапретаЗагрузкиДанных = ИСТИНА + | КОНЕЦ"; + // АПК:1377-вкл. - Возврат НЕ Запрос.Выполнить().Пустой(); + УстановитьПривилегированныйРежим(Истина); + Выборка = Запрос.Выполнить().Выбрать(); + КоличествоОбъектов = ?(Выборка.Следующий(), Выборка.КоличествоОбъектов, 0); + УстановитьПривилегированныйРежим(Ложь); + + Выборка = Запрос.Выполнить().Выбрать(); + КоличествоДоступныхОбъектов = ?(Выборка.Следующий(), Выборка.КоличествоОбъектов, 0); + + Возврат КоличествоОбъектов > КоличествоДоступныхОбъектов; + +КонецФункции + +&НаСервереБезКонтекста +Функция НедоступныеОбъекты(Пользователь) + + // АПК:1377-выкл - №654.2.1 Использование типов "через точку" необходимо + // и допустимо, так как объем данных небольшой (от единиц до сотен). + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Пользователь", Пользователь); + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | ДатыЗапретаИзменения.Объект КАК Объект + |ИЗ + | РегистрСведений.ДатыЗапретаИзменения КАК ДатыЗапретаИзменения + |ГДЕ + | ДатыЗапретаИзменения.Пользователь = &Пользователь + | И ДатыЗапретаИзменения.Объект.Ссылка ЕСТЬ NULL"; + // АПК:1377-вкл. + + УстановитьПривилегированныйРежим(Истина); + НесуществующиеОбъекты = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Объект"); + УстановитьПривилегированныйРежим(Ложь); + + Результат = Новый Соответствие; + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Если НесуществующиеОбъекты.Найти(Выборка.Объект) = Неопределено Тогда + Результат.Вставить(Выборка.Объект, Истина); + КонецЕсли; + КонецЦикла; + + Возврат Результат; КонецФункции @@ -2747,6 +2879,7 @@ КонецЕсли; Для Каждого ТекущийОбъект Из Объекты Цикл + // @skip-check query-in-loop - В этом вызове ветка с запросом не выполняется ЗаблокироватьЗаписьПользователяНаСервере(АдресУстановленныхБлокировок, Раздел, ТекущийОбъект, Пользователь); КонецЦикла; @@ -3002,11 +3135,15 @@ &НаКлиенте Процедура ДатыЗапретаУстановитьДоступностьКоманд(Знач ДоступностьКоманд) + Если Элементы.ДатыЗапрета.ТолькоПросмотр Тогда + ДоступностьКоманд = Ложь; + КонецЕсли; + Элементы.ДатыЗапретаИзменить.Доступность = ДоступностьКоманд; Элементы.ДатыЗапретаКонтекстноеМенюИзменить.Доступность = ДоступностьКоманд; Если СпособУказанияДатыЗапрета = "ПоОбъектам" Тогда - ДоступностьКоманд = Истина; + ДоступностьКоманд = Элементы.ДатыЗапрета.ТолькоПросмотр; КонецЕсли; Элементы.ДатыЗапретаПодобрать.Доступность = ДоступностьКоманд; @@ -3286,6 +3423,7 @@ // Блокировка удаляемых записей. Для Каждого ЗначенияКлючаЗаписи Из ЗначенияКлючейЗаписей Цикл + // @skip-check query-in-loop - По-объектная запись данных ЗаблокироватьЗаписьПользователяНаСервере(АдресУстановленныхБлокировок, ЗначенияКлючаЗаписи.Раздел, ЗначенияКлючаЗаписи.Объект, @@ -3294,6 +3432,7 @@ // Удаление заблокированных записей. Для Каждого ЗначенияКлючаЗаписи Из ЗначенияКлючейЗаписей Цикл + // @skip-check query-in-loop - По-объектная запись данных УдалитьЗаписьПользователя(АдресУстановленныхБлокировок, ЗначенияКлючаЗаписи.Раздел, ЗначенияКлючаЗаписи.Объект, @@ -3528,7 +3667,7 @@ // Блокировка записей выделенных строк. Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл ТекущиеДанные = ДатыЗапрета.НайтиПоИдентификатору(ВыделеннаяСтрока); - + // @skip-check query-in-loop - В этом вызове ветка с запросом не выполняется ПрочитанныеСвойства = ЗаблокироватьЗаписьПользователяНаСервере(АдресУстановленныхБлокировок, ТекущийРаздел(ТекущиеДанные), ТекущиеДанные.Объект, ТекущийПользователь); @@ -3709,6 +3848,7 @@ КонецЕсли; Для Каждого ТекущийОбъект Из ОбъектыДляДобавления Цикл + // @skip-check query-in-loop - По-объектная запись данных ЗаблокироватьЗаписьПользователяНаСервере(АдресУстановленныхБлокировок, Раздел, ТекущийОбъект, Пользователь); КонецЦикла; diff --git a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/РедактированиеДатыЗапрета/Form.form b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/РедактированиеДатыЗапрета/Form.form index 657d8de53..7629d6490 100644 --- a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/РедактированиеДатыЗапрета/Form.form +++ b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/РедактированиеДатыЗапрета/Form.form @@ -173,7 +173,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -247,7 +246,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -594,7 +592,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -724,7 +721,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -1094,7 +1090,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <currentRowUse>Auto</currentRowUse> diff --git a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ФормаЗаписи/Form.form index 74252b5ab..7f8d2b10c 100644 --- a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ФормаЗаписи/Form.form @@ -113,7 +113,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ФормаСписка/Form.form index 2e4ea1dfa..0d962fd65 100644 --- a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Help/ru.html b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Help/ru.html index 2cce7c452..f61970231 100644 --- a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Help/ru.html +++ b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Help/ru.html @@ -75,5 +75,24 @@ <ul><li>по разделам/объектам: выберите отчет <strong>Даты запрета по разделам и объектам для пользователей </strong>(<strong>Даты запрета по разделам и объектам для информационных баз</strong>); </li> <li>по пользователям (по информационным базам): выберите отчет <strong>Даты запрета по пользователям </strong>(<strong>Даты запрета по информационным базам</strong>). </li></ul><p>Отчеты позволяют увидеть результирующие даты запрета, установленные для пользователей/групп пользователей (информационных баз) с учетом приоритетов.</p> -<h3>См. также:</h3> +<h3>Работа дат запрета изменения</h3> +<p>Для конкретного вида документов (<strong>Заказ</strong>, <strong>Реализация</strong> и т. д.) может быть определена проверка даты запрета в трёх вариантах: </p> +<ul><li>по дате документа (без учета раздела и объекта);</li> +<li>по дате документа и разделу;</li> +<li>по дате документа, разделу и объекту раздела (например, организации).</li></ul><p>При проверке даты запрета программа производит поиск даты запрета, назначенной с максимальной подробностью, которая определена для проверки документа (максимальная подробность: Раздел, Объект).</p> +<p>Сначала выбирается один вариант из сделанных настроек по порядку:</p> +<ol><li>Для текущего пользователя.</li> +<li>Для группы пользователей (последней по порядку в интерфейсе, в которую входит текущий пользователь).</li> +<li>Для всех пользователей.</li></ol><p>Далее поиск даты запрета выполняется в пределах выбранной настройки по порядку:</p> +<ol><li>Для раздела, объекта.</li> +<li>Для раздела, любого объекта.</li> +<li>Для любого раздела, любого объекта.</li></ol><p>Когда дата найдена, то проверяется, что и дата уже записанного документа, и новая дата, указанная для документа, больше даты запрета. Если не больше, то выводится сообщение об ошибке.</p> +<p style="margin-right: 0px;" dir="ltr">Таким образом, настройка дат запрета представляет собой уточняющий характер.</p> +<p>Сначала принимается решение о необходимой точности настройки для субъекта:</p> +<ul><li>для всех пользователей;</li> +<li>для групп пользователей;</li> +<li>для пользователя.</li></ul><p>Далее выполняется уточняющая настройка в пределах субъекта:</p> +<ul><li>общая дата для субъекта;</li> +<li>уточнение запрета по разделу (для всех объектов раздела);</li> +<li>уточнение запрета по разделу и объекту этого раздела.</li></ul><h3>См. также:</h3> <ul><li><a href="v8help://frame/form_common">Работа с формами</a>.</li></ul></body></html> \ No newline at end of file diff --git a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/ManagerModule.bsl b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/ManagerModule.bsl index f3f058dec..079378896 100644 --- a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/ManagerModule.bsl @@ -19,14 +19,46 @@ // Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт + // АПК:336-выкл - №737.3 проверка по ролям, так как право есть всегда. Ограничение.Текст = - "РазрешитьЧтениеИзменение + "РазрешитьЧтение |ГДЕ - | ТИПЗНАЧЕНИЯ(Пользователь) = ТИП(Справочник.Пользователи) - | ИЛИ ТИПЗНАЧЕНИЯ(Пользователь) = ТИП(Справочник.ГруппыПользователей) - | ИЛИ ТИПЗНАЧЕНИЯ(Пользователь) = ТИП(Справочник.ВнешниеПользователи) - | ИЛИ ТИПЗНАЧЕНИЯ(Пользователь) = ТИП(Справочник.ГруппыВнешнихПользователей) - | ИЛИ Пользователь = ЗНАЧЕНИЕ(Перечисление.ВидыНазначенияДатЗапрета.ДляВсехПользователей)"; + | ( РольДоступна(ЧтениеДатЗапретаИзменения) + | ИЛИ РольДоступна(ДобавлениеИзменениеДатЗапретаИзменения)) + | И ( ТИПЗНАЧЕНИЯ(Пользователь) = ТИП(Справочник.Пользователи) + | ИЛИ ТИПЗНАЧЕНИЯ(Пользователь) = ТИП(Справочник.ГруппыПользователей) + | ИЛИ ТИПЗНАЧЕНИЯ(Пользователь) = ТИП(Справочник.ВнешниеПользователи) + | ИЛИ ТИПЗНАЧЕНИЯ(Пользователь) = ТИП(Справочник.ГруппыВнешнихПользователей) + | ИЛИ Пользователь = ЗНАЧЕНИЕ(Перечисление.ВидыНазначенияДатЗапрета.ДляВсехПользователей)) + | ИЛИ + | ( РольДоступна(ЧтениеДатЗапретаЗагрузки) + | ИЛИ РольДоступна(ДобавлениеИзменениеДатЗапретаЗагрузки)) + | И ТИПЗНАЧЕНИЯ(Пользователь) <> ТИП(Справочник.Пользователи) + | И ТИПЗНАЧЕНИЯ(Пользователь) <> ТИП(Справочник.ГруппыПользователей) + | И ТИПЗНАЧЕНИЯ(Пользователь) <> ТИП(Справочник.ВнешниеПользователи) + | И ТИПЗНАЧЕНИЯ(Пользователь) <> ТИП(Справочник.ГруппыВнешнихПользователей) + | И Пользователь <> НЕОПРЕДЕЛЕНО + | И Пользователь <> ЗНАЧЕНИЕ(Перечисление.ВидыНазначенияДатЗапрета.ПустаяСсылка) + | И Пользователь <> ЗНАЧЕНИЕ(Перечисление.ВидыНазначенияДатЗапрета.ДляВсехПользователей) + |; + |РазрешитьИзменениеЕслиРазрешеноЧтение + |ГДЕ + | РольДоступна(ДобавлениеИзменениеДатЗапретаИзменения) + | И ( ТИПЗНАЧЕНИЯ(Пользователь) = ТИП(Справочник.Пользователи) + | ИЛИ ТИПЗНАЧЕНИЯ(Пользователь) = ТИП(Справочник.ГруппыПользователей) + | ИЛИ ТИПЗНАЧЕНИЯ(Пользователь) = ТИП(Справочник.ВнешниеПользователи) + | ИЛИ ТИПЗНАЧЕНИЯ(Пользователь) = ТИП(Справочник.ГруппыВнешнихПользователей) + | ИЛИ Пользователь = ЗНАЧЕНИЕ(Перечисление.ВидыНазначенияДатЗапрета.ДляВсехПользователей)) + | ИЛИ + | РольДоступна(ДобавлениеИзменениеДатЗапретаЗагрузки) + | И ТИПЗНАЧЕНИЯ(Пользователь) <> ТИП(Справочник.Пользователи) + | И ТИПЗНАЧЕНИЯ(Пользователь) <> ТИП(Справочник.ГруппыПользователей) + | И ТИПЗНАЧЕНИЯ(Пользователь) <> ТИП(Справочник.ВнешниеПользователи) + | И ТИПЗНАЧЕНИЯ(Пользователь) <> ТИП(Справочник.ГруппыВнешнихПользователей) + | И Пользователь <> НЕОПРЕДЕЛЕНО + | И Пользователь <> ЗНАЧЕНИЕ(Перечисление.ВидыНазначенияДатЗапрета.ПустаяСсылка) + | И Пользователь <> ЗНАЧЕНИЕ(Перечисление.ВидыНазначенияДатЗапрета.ДляВсехПользователей)"; + // АПК:336-вкл КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/RecordSetModule.bsl b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/RecordSetModule.bsl index ffbd38642..7f45305b3 100644 --- a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/RecordSetModule.bsl +++ b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/RecordSetModule.bsl @@ -131,6 +131,10 @@ Функция ДополненнаяСтрока(Значение, ШиринаКолонки) Строка = Строка(Значение); + Если Не ЗначениеЗаполнено(Строка) + И ТипЗнч(Значение) <> Тип("Строка") Тогда + Строка = "<> (" + Строка(ТипЗнч(Значение)) + ")"; + КонецЕсли; ДлинаСтроки = СтрДлина(Строка); Если ТипЗнч(ШиринаКолонки) <> Тип("Число") Или ШиринаКолонки <= ДлинаСтроки Тогда diff --git a/SSL/src/InformationRegisters/ДвоичныеДанныеФайлов/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ДвоичныеДанныеФайлов/Forms/ФормаЗаписи/Form.form index ae990b260..93ef545cc 100644 --- a/SSL/src/InformationRegisters/ДвоичныеДанныеФайлов/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/ДвоичныеДанныеФайлов/Forms/ФормаЗаписи/Form.form @@ -62,7 +62,7 @@ <horizontalAlign>Left</horizontalAlign> </extInfo> </extendedTooltip> - <commandName>0</commandName> + <commandName>Form.Command.ВключитьВозможностьРедактирования</commandName> <buttonImportance>Normal</buttonImportance> <representation>Auto</representation> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/InformationRegisters/ДвоичныеДанныеФайлов/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ДвоичныеДанныеФайлов/Forms/ФормаСписка/Form.form index 9651e6ed0..9533a85b4 100644 --- a/SSL/src/InformationRegisters/ДвоичныеДанныеФайлов/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ДвоичныеДанныеФайлов/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/InformationRegisters/ДвоичныеДанныеФайлов/ManagerModule.bsl b/SSL/src/InformationRegisters/ДвоичныеДанныеФайлов/ManagerModule.bsl index cd32d5c2b..00d0dd22e 100644 --- a/SSL/src/InformationRegisters/ДвоичныеДанныеФайлов/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ДвоичныеДанныеФайлов/ManagerModule.bsl @@ -117,7 +117,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать двоичные данные файла %1 по причине: |%2'"), - Выборка.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Выборка.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Выборка.Ссылка.Метаданные(), Выборка.Ссылка, ТекстСообщения); КонецПопытки; @@ -195,7 +195,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать файл %1 по причине: |%2'"), - Выборка.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Выборка.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Выборка.Ссылка.Метаданные(), Выборка.Ссылка, ТекстСообщения); diff --git a/SSL/src/InformationRegisters/ДлительныеОперации/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ДлительныеОперации/Forms/ФормаЗаписи/Form.form new file mode 100644 index 000000000..beebfef75 --- /dev/null +++ b/SSL/src/InformationRegisters/ДлительныеОперации/Forms/ФормаЗаписи/Form.form @@ -0,0 +1,760 @@ +<?xml version="1.0" encoding="UTF-8"?> +<form:Form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:form="http://g5.1c.ru/v8/dt/form"> + <items xsi:type="form:FormGroup"> + <name>Страницы</name> + <id>28</id> + <items xsi:type="form:FormGroup"> + <name>СтраницаОсновное</name> + <id>30</id> + <items xsi:type="form:FormField"> + <name>ДатаСоздания</name> + <id>4</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Запись.ДатаСоздания</segments> + </dataPath> + <extendedTooltip> + <name>ДатаСозданияРасширеннаяПодсказка</name> + <id>6</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>ДатаСозданияКонтекстноеМеню</name> + <id>5</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> + <wrap>true</wrap> + <chooseType>true</chooseType> + <typeDomainEnabled>true</typeDomainEnabled> + <textEdit>true</textEdit> + <textSize>Normal</textSize> + </extInfo> + </items> + <items xsi:type="form:FormField"> + <name>ИдентификаторПроцесса</name> + <id>36</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>ИдентификаторПроцесса</segments> + </dataPath> + <extendedTooltip> + <name>ИдентификаторПроцессаРасширеннаяПодсказка</name> + <id>38</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>ИдентификаторПроцессаКонтекстноеМеню</name> + <id>37</id> + <autoFill>true</autoFill> + </contextMenu> + <type>InputField</type> + <readOnly>true</readOnly> + <editMode>Enter</editMode> + <showInHeader>true</showInHeader> + <headerHorizontalAlign>Left</headerHorizontalAlign> + <showInFooter>true</showInFooter> + <extInfo xsi:type="form:InputFieldExtInfo"> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <wrap>true</wrap> + <chooseType>true</chooseType> + <typeDomainEnabled>true</typeDomainEnabled> + <textEdit>true</textEdit> + <textSize>Normal</textSize> + </extInfo> + </items> + <items xsi:type="form:FormField"> + <name>ИдентификаторПотока</name> + <id>39</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>ИдентификаторПотока</segments> + </dataPath> + <extendedTooltip> + <name>ИдентификаторПотокаРасширеннаяПодсказка</name> + <id>41</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>ИдентификаторПотокаКонтекстноеМеню</name> + <id>40</id> + <autoFill>true</autoFill> + </contextMenu> + <type>InputField</type> + <readOnly>true</readOnly> + <editMode>Enter</editMode> + <showInHeader>true</showInHeader> + <headerHorizontalAlign>Left</headerHorizontalAlign> + <showInFooter>true</showInFooter> + <extInfo xsi:type="form:InputFieldExtInfo"> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <wrap>true</wrap> + <chooseType>true</chooseType> + <typeDomainEnabled>true</typeDomainEnabled> + <textEdit>true</textEdit> + <textSize>Normal</textSize> + </extInfo> + </items> + <items xsi:type="form:FormField"> + <name>Статус</name> + <id>25</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Запись.Статус</segments> + </dataPath> + <extendedTooltip> + <name>СтатусРасширеннаяПодсказка</name> + <id>27</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>СтатусКонтекстноеМеню</name> + <id>26</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> + <wrap>true</wrap> + <chooseType>true</chooseType> + <typeDomainEnabled>true</typeDomainEnabled> + <textEdit>true</textEdit> + <textSize>Normal</textSize> + </extInfo> + </items> + <items xsi:type="form:FormField"> + <name>НомерПопытки</name> + <id>19</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Запись.НомерПопытки</segments> + </dataPath> + <extendedTooltip> + <name>НомерПопыткиРасширеннаяПодсказка</name> + <id>21</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>НомерПопыткиКонтекстноеМеню</name> + <id>20</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> + <wrap>true</wrap> + <chooseType>true</chooseType> + <typeDomainEnabled>true</typeDomainEnabled> + <textEdit>true</textEdit> + <textSize>Normal</textSize> + </extInfo> + </items> + <items xsi:type="form:FormField"> + <name>ИдентификаторЗадания</name> + <id>42</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>ИдентификаторЗадания</segments> + </dataPath> + <extendedTooltip> + <name>ИдентификаторЗаданияРасширеннаяПодсказка</name> + <id>44</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>ИдентификаторЗаданияКонтекстноеМеню</name> + <id>43</id> + <autoFill>true</autoFill> + </contextMenu> + <type>InputField</type> + <readOnly>true</readOnly> + <editMode>Enter</editMode> + <showInHeader>true</showInHeader> + <headerHorizontalAlign>Left</headerHorizontalAlign> + <showInFooter>true</showInFooter> + <extInfo xsi:type="form:InputFieldExtInfo"> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <wrap>true</wrap> + <chooseType>true</chooseType> + <typeDomainEnabled>true</typeDomainEnabled> + <textEdit>true</textEdit> + <textSize>Normal</textSize> + </extInfo> + </items> + <items xsi:type="form:FormField"> + <name>ИмяМетода</name> + <id>7</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Запись.ИмяМетода</segments> + </dataPath> + <extendedTooltip> + <name>ИмяМетодаРасширеннаяПодсказка</name> + <id>9</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>ИмяМетодаКонтекстноеМеню</name> + <id>8</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> + <wrap>true</wrap> + <chooseType>true</chooseType> + <typeDomainEnabled>true</typeDomainEnabled> + <textEdit>true</textEdit> + <textSize>Normal</textSize> + </extInfo> + </items> + <items xsi:type="form:FormField"> + <name>ИмяПользователя</name> + <id>10</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Запись.ИмяПользователя</segments> + </dataPath> + <extendedTooltip> + <name>ИмяПользователяРасширеннаяПодсказка</name> + <id>12</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>ИмяПользователяКонтекстноеМеню</name> + <id>11</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> + <wrap>true</wrap> + <chooseType>true</chooseType> + <typeDomainEnabled>true</typeDomainEnabled> + <textEdit>true</textEdit> + <textSize>Normal</textSize> + </extInfo> + </items> + <items xsi:type="form:FormField"> + <name>Наименование</name> + <id>16</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Запись.Наименование</segments> + </dataPath> + <extendedTooltip> + <name>НаименованиеРасширеннаяПодсказка</name> + <id>18</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>НаименованиеКонтекстноеМеню</name> + <id>17</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> + <wrap>true</wrap> + <chooseType>true</chooseType> + <typeDomainEnabled>true</typeDomainEnabled> + <textEdit>true</textEdit> + <textSize>Normal</textSize> + </extInfo> + </items> + <items xsi:type="form:FormField"> + <name>АдресРезультата</name> + <id>1</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Запись.АдресРезультата</segments> + </dataPath> + <extendedTooltip> + <name>АдресРезультатаРасширеннаяПодсказка</name> + <id>3</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>АдресРезультатаКонтекстноеМеню</name> + <id>2</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> + <wrap>true</wrap> + <chooseType>true</chooseType> + <typeDomainEnabled>true</typeDomainEnabled> + <textEdit>true</textEdit> + <textSize>Normal</textSize> + </extInfo> + </items> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <title> + <key>ru</key> + <value>Основное</value> + + + СтраницаОсновноеРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаКраткоеПредставлениеОшибки + 34 + + КраткоеПредставлениеОшибки + 13 + true + true + + true + + + Запись.КраткоеПредставлениеОшибки + + None + + КраткоеПредставлениеОшибкиРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + КраткоеПредставлениеОшибкиКонтекстноеМеню + 14 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Краткое представление ошибки</value> + + + СтраницаКраткоеПредставлениеОшибкиРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаПодробноеПредставлениеОшибки + 32 + + ПодробноеПредставлениеОшибки + 22 + true + true + + true + + + Запись.ПодробноеПредставлениеОшибки + + None + + ПодробноеПредставлениеОшибкиРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ПодробноеПредставлениеОшибкиКонтекстноеМеню + 23 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Подробное представление ошибки</value> + + + СтраницаПодробноеПредставлениеОшибкиРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Страницы</value> + + + СтраницыРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + + + + ФормаКоманднаяПанель + -1 + + ФормаВключитьВозможностьРедактирования + 45 + true + true + + true + + + ФормаВключитьВозможностьРедактированияРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + Form.Command.ВключитьВозможностьРедактирования + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + Запись + 1 + + InformationRegisterRecordManager.ДлительныеОперации + + + true + + + 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> + + 4 + + String + + + + 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..050721255 --- /dev/null +++ b/SSL/src/InformationRegisters/ДлительныеОперации/Forms/ФормаЗаписи/Module.bsl @@ -0,0 +1,34 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 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..bce7ee21b --- /dev/null +++ b/SSL/src/InformationRegisters/ДлительныеОперации/Forms/ФормаСписка/Form.form @@ -0,0 +1,729 @@ + + + + ГруппаПользовательскихНастроек + 1 + true + true + + true + + + <key>ru</key> + <value>Группа пользовательских настроек</value> + + false + + ГруппаПользовательскихНастроекРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + Vertical + WeakSeparation + true + true + Auto + Auto + + + + Список + 3 + + <key>ru</key> + <value>Список</value> + + true + true + + true + + + Список + + true + None + + ДатаСоздания + 19 + true + true + + true + + + Список.ДатаСоздания + + true + + ДатаСозданияРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + ДатаСозданияКонтекстноеМеню + 20 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ИдентификаторПроцесса + 43 + + <key>ru</key> + <value>Процесс</value> + + true + true + + true + + + Список.ИдентификаторПроцесса + + + ИдентификаторПроцессаРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + ИдентификаторПроцессаКонтекстноеМеню + 44 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ИдентификаторПотока + 46 + + <key>ru</key> + <value>Поток</value> + + true + true + + true + + + Список.ИдентификаторПотока + + + ИдентификаторПотокаРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + ИдентификаторПотокаКонтекстноеМеню + 47 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Статус + 40 + true + true + + true + + + Список.Статус + + true + + СтатусРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + СтатусКонтекстноеМеню + 41 + true + + LabelField + Enter + true + Left + true + + true + true + + + + НомерПопытки + 34 + true + true + + true + + + Список.НомерПопытки + + true + + НомерПопыткиРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + НомерПопыткиКонтекстноеМеню + 35 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ИдентификаторЗадания + 49 + + <key>ru</key> + <value>Задание</value> + + true + true + + true + + + Список.ИдентификаторЗадания + + + ИдентификаторЗаданияРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + + ИдентификаторЗаданияКонтекстноеМеню + 50 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ИмяМетода + 22 + true + true + + true + + + Список.ИмяМетода + + true + + ИмяМетодаРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ИмяМетодаКонтекстноеМеню + 23 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ИмяПользователя + 25 + true + true + + true + + + Список.ИмяПользователя + + true + + ИмяПользователяРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + ИмяПользователяКонтекстноеМеню + 26 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Наименование + 31 + true + true + + true + + + Список.Наименование + + true + + НаименованиеРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 32 + true + + LabelField + Enter + true + Left + true + + true + true + + + + АдресРезультата + 16 + true + true + + true + + + Список.АдресРезультата + + true + + АдресРезультатаРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + АдресРезультатаКонтекстноеМеню + 17 + true + + LabelField + Enter + true + Left + true + + true + true + + + + КраткоеПредставлениеОшибки + 28 + true + true + + true + + + Список.КраткоеПредставлениеОшибки + + true + + КраткоеПредставлениеОшибкиРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + КраткоеПредставлениеОшибкиКонтекстноеМеню + 29 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ПодробноеПредставлениеОшибки + 37 + true + true + + true + + + Список.ПодробноеПредставлениеОшибки + + true + + ПодробноеПредставлениеОшибкиРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + ПодробноеПредставлениеОшибкиКонтекстноеМеню + 38 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 5 + Left + + + СписокСтрокаПоиска + 7 + + СписокСтрокаПоискаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 8 + true + + Список + + true + + + + СписокСостояниеПросмотра + 10 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 11 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 13 + + СписокУправлениеПоискомРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 14 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 4 + true + + true + true + true + true + true + MultiRow +
        true
        + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + AsFileRef + + Список.DefaultPicture + + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + ГруппаПользовательскихНастроек + +
        + + ФормаКоманднаяПанель + -1 + + ФормаВключитьВозможностьРедактирования + 52 + true + true + + true + + + ФормаВключитьВозможностьРедактированияРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + Form.Command.ВключитьВозможностьРедактирования + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + 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 + + + + + + +
        diff --git a/SSL/src/InformationRegisters/ДлительныеОперации/Forms/ФормаСписка/Module.bsl b/SSL/src/InformationRegisters/ДлительныеОперации/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..7e0e499db --- /dev/null +++ b/SSL/src/InformationRegisters/ДлительныеОперации/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,30 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ТолькоПросмотр = Истина; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ВключитьВозможностьРедактирования(Команда) + + ТолькоПросмотр = Ложь; + Элементы.ФормаВключитьВозможностьРедактирования.Доступность = Ложь; + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/InformationRegisters/ДлительныеОперации/ДлительныеОперации.mdo b/SSL/src/InformationRegisters/ДлительныеОперации/ДлительныеОперации.mdo index 03e05fa64..bbacf4a54 100644 --- a/SSL/src/InformationRegisters/ДлительныеОперации/ДлительныеОперации.mdo +++ b/SSL/src/InformationRegisters/ДлительныеОперации/ДлительныеОперации.mdo @@ -16,6 +16,8 @@
        true InDialog + InformationRegister.ДлительныеОперации.Form.ФормаЗаписи + InformationRegister.ДлительныеОперации.Form.ФормаСписка Use Active @@ -66,15 +68,20 @@ - - КлючПотока + + ДатаСоздания ru - Ключ потока + Дата создания - ValueStorage + Date + + + ru + Дата добавления записи в базу данных + Use @@ -90,22 +97,90 @@ UUID + + ru + Идентификатор фонового задания (всегда первый для управляющего потока без учета перезапусков, для исполняющего потока последний с учетом перезапусков) + - - ИдентификаторПроцесса + + ИмяМетода ru - Идентификатор процесса + Имя метода - UUID + String + + 255 + + + + ru + Имя процедуры длительной операции + + + + Use + Use + + + + ИмяПользователя + + ru + Имя пользователя + + + String + + 255 + + + + ru + Имя пользователя, который запустил длительную операцию + + + + Use + Use + + + + КлючПотока + + ru + Ключ потока + + + ValueStorage + + + ru + Идентификатор порции данных (для исполняющего потока) +Идентификатор последнего фонового задания после перезапуска (для управляющего потока) + + + + Use + Use + + + + КраткоеПредставлениеОшибки + + ru + Краткое представление ошибки + + + String + - Index Use Use @@ -126,6 +201,47 @@ + + НомерПопытки + + ru + Номер попытки + + + Number + + 2 + + + + ru + Номер попытки перезапуска управляющего или исполняющего потока + + + + Use + Use + + + + ПараметрыВыполнения + + ru + Параметры выполнения + + + ValueStorage + + + ru + Параметры процедуры управляющего потока + + + + Use + Use + + ПараметрыМетода @@ -139,6 +255,102 @@ + + ПараметрыПотока + + ru + Параметры потока + + + ValueStorage + + + ru + Параметры метода исполняющего потока + + + + Use + Use + + + + ПодробноеПредставлениеОшибки + + ru + Подробное представление ошибки + + + String + + + + + Use + Use + + + + Результат + + ru + Результат + + + ValueStorage + + + ru + Результат функции исполняющего потока + + + + Use + Use + + + + Статус + + ru + Статус + + + String + + 20 + + + + ru + Статус управляющего или исполняющего потока + + + + Use + Use + + + + ИдентификаторПроцесса + + ru + Идентификатор процесса + + + UUID + + + ru + Уникальный идентификатор управляющего потока многопоточной операции + + + + Use + Use + + true + ИдентификаторПотока @@ -148,10 +360,33 @@ UUID + + ru + Уникальный идентификатор исполняющего потока многопоточной операции (пустой для управляющего потока) + + Index Use true + + ФормаЗаписи + + ru + Форма записи + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + diff --git a/SSL/src/InformationRegisters/ЗависимостиПравДоступа/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ЗависимостиПравДоступа/Forms/ФормаСписка/Form.form index 67b9684a3..9a3d0c7df 100644 --- a/SSL/src/InformationRegisters/ЗависимостиПравДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ЗависимостиПравДоступа/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ЗависимостиПравДоступа/ManagerModule.bsl b/SSL/src/InformationRegisters/ЗависимостиПравДоступа/ManagerModule.bsl index 2e90a2490..4387722e1 100644 --- a/SSL/src/InformationRegisters/ЗависимостиПравДоступа/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ЗависимостиПравДоступа/ManagerModule.bsl @@ -97,7 +97,7 @@ Для каждого Строка Из Таблица Цикл НоваяСтрока = ЗависимостиПравДоступа.Добавить(); - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Строка.ПодчиненнаяТаблица); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Строка.ПодчиненнаяТаблица); Если ОбъектМетаданных = Неопределено Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка в процедуре %1 @@ -112,7 +112,7 @@ НоваяСтрока.ПодчиненнаяТаблица = ОбщегоНазначения.ИдентификаторОбъектаМетаданных( Строка.ПодчиненнаяТаблица); - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Строка.ВедущаяТаблица); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Строка.ВедущаяТаблица); Если ОбъектМетаданных = Неопределено Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка в процедуре %1 diff --git a/SSL/src/InformationRegisters/ЗадачиОбменаДаннымиВнутренняяПубликация/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ЗадачиОбменаДаннымиВнутренняяПубликация/Forms/ФормаЗаписи/Form.form new file mode 100644 index 000000000..33943c955 --- /dev/null +++ b/SSL/src/InformationRegisters/ЗадачиОбменаДаннымиВнутренняяПубликация/Forms/ФормаЗаписи/Form.form @@ -0,0 +1,431 @@ + + + + ДатаСоздания + 28 + true + true + + true + + + Запись.ДатаСоздания + + + ДатаСозданияРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ДатаСозданияКонтекстноеМеню + 29 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + НомерЗадачи + 10 + true + true + + true + + + Запись.НомерЗадачи + + + НомерЗадачиРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + НомерЗадачиКонтекстноеМеню + 11 + true + + InputField + Enter + true + Left + 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 + Normal + + + + Узел + 7 + true + true + + true + + + Запись.УзелИнформационнойБазы + + + УзелРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + УзелКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ИдентификаторОбмена + 31 + true + true + + true + + + Запись.ИдентификаторОбмена + + + ИдентификаторОбменаРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + ИдентификаторОбменаКонтекстноеМеню + 32 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ИдентификаторЗадачи + 13 + true + true + + true + + + Запись.ИдентификаторЗадачи + + + ИдентификаторЗадачиРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + ИдентификаторЗадачиКонтекстноеМеню + 14 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Действие + 16 + true + true + + true + + + Запись.Действие + + + ДействиеРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + ДействиеКонтекстноеМеню + 17 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ЗавершенаУспешно + 19 + true + true + + true + + + Запись.ЗавершенаУспешно + + + ЗавершенаУспешноРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + ЗавершенаУспешноКонтекстноеМеню + 20 + true + + CheckBoxField + Enter + true + Left + true + + + + ЗавершенаСОшибкой + 22 + true + true + + true + + + Запись.ЗавершенаСОшибкой + + + ЗавершенаСОшибкойРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ЗавершенаСОшибкойКонтекстноеМеню + 23 + true + + CheckBoxField + Enter + true + Left + true + + + + Ошибка + 25 + true + true + + true + + + Запись.Ошибка + + + ОшибкаРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + ОшибкаКонтекстноеМеню + 26 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + true + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + Запись + 1 + + InformationRegisterRecordManager.ЗадачиОбменаДаннымиВнутренняяПубликация + + + true + + + true + +
        true
        + true +
        + + + + + +
        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..c2f3d7286 --- /dev/null +++ b/SSL/src/InformationRegisters/ЗадачиОбменаДаннымиВнутренняяПубликация/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,25 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + ДатаСоздания + 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..9ad20831b --- /dev/null +++ b/SSL/src/InformationRegisters/ЗадачиОбменаДаннымиВнутренняяПубликация/Forms/ФормаСписка/Form.form @@ -0,0 +1,601 @@ + + + + СписокКомпоновщикНастроекПользовательскиеНастройки + 1 + true + true + + true + + + <key>ru</key> + <value>Группа пользовательских настроек</value> + + false + + СписокКомпоновщикНастроекПользовательскиеНастройкиРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + Vertical + WeakSeparation + true + true + Auto + Auto + + + + Список + 3 + + <key>ru</key> + <value>Список</value> + + true + true + + true + + + Список + + true + None + + ДатаСоздания + 43 + true + true + + true + + + Список.ДатаСоздания + + + ДатаСозданияРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + ДатаСозданияКонтекстноеМеню + 44 + true + + LabelField + Enter + true + Left + true + + 10 + true + true + false + + + + НомерЗадачи + 25 + + <key>ru</key> + <value>N</value> + + true + true + + true + + + Список.НомерЗадачи + + true + + НомерЗадачиРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + НомерЗадачиКонтекстноеМеню + 26 + true + + LabelField + Enter + true + Left + true + + 3 + true + true + false + + + + ИдентификаторОбмена + 46 + true + true + + true + + + Список.ИдентификаторОбмена + + + ИдентификаторОбменаРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + ИдентификаторОбменаКонтекстноеМеню + 47 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ИдентификаторЗадачи + 28 + true + true + + true + + + Список.ИдентификаторЗадачи + + true + + ИдентификаторЗадачиРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ИдентификаторЗадачиКонтекстноеМеню + 29 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Действие + 31 + true + true + + true + + + Список.Действие + + true + + ДействиеРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + ДействиеКонтекстноеМеню + 32 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Узел + 22 + true + true + + true + + + Список.УзелИнформационнойБазы + + true + + УзелРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + УзелКонтекстноеМеню + 23 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Сценарий + 19 + true + true + + true + + + Список.Сценарий + + true + + СценарийРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + СценарийКонтекстноеМеню + 20 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ЗавершенаУспешно + 34 + + <key>ru</key> + <value>Успешно</value> + + true + true + + true + + + Список.ЗавершенаУспешно + + true + + ЗавершенаУспешноРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ЗавершенаУспешноКонтекстноеМеню + 35 + true + + CheckBoxField + Enter + true + Left + true + + + + ЗавершенаСОшибкой + 37 + + <key>ru</key> + <value>С ошибкой</value> + + true + true + + true + + + Список.ЗавершенаСОшибкой + + true + + ЗавершенаСОшибкойРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + ЗавершенаСОшибкойКонтекстноеМеню + 38 + true + + CheckBoxField + Enter + true + Left + true + + + + Ошибка + 40 + true + true + + true + + + Список.Ошибка + + true + + ОшибкаРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + ОшибкаКонтекстноеМеню + 41 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 5 + Left + + + СписокСтрокаПоиска + 7 + + СписокСтрокаПоискаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 8 + true + + Список + + true + + + + СписокСостояниеПросмотра + 10 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 11 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 13 + + СписокУправлениеПоискомРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 14 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 4 + true + + true + true + true + true + true + MultiRow +
        true
        + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + 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 + + DynamicList + + + true + + + true + +
        true
        + + InformationRegister.ЗадачиОбменаДаннымиВнутренняяПубликация + true + true + true + true + +
        + + + + + +
        diff --git a/SSL/src/InformationRegisters/ЗадачиОбменаДаннымиВнутренняяПубликация/ЗадачиОбменаДаннымиВнутренняяПубликация.mdo b/SSL/src/InformationRegisters/ЗадачиОбменаДаннымиВнутренняяПубликация/ЗадачиОбменаДаннымиВнутренняяПубликация.mdo new file mode 100644 index 000000000..7eef99cc6 --- /dev/null +++ b/SSL/src/InformationRegisters/ЗадачиОбменаДаннымиВнутренняяПубликация/ЗадачиОбменаДаннымиВнутренняяПубликация.mdo @@ -0,0 +1,256 @@ + + + + + + + + + + + + ЗадачиОбменаДаннымиВнутренняяПубликация + + ru + Задачи обмена данными (внутренняя публикация) + + true + InDialog + InformationRegister.ЗадачиОбменаДаннымиВнутренняяПубликация.Form.ФормаЗаписи + InformationRegister.ЗадачиОбменаДаннымиВнутренняяПубликация.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + Сценарий + + ru + Сценарий + + Сценарий или идентификатор обмена при ручной синхронизации + + CatalogRef.СценарииОбменовДанными + + + + Use + Use + + + + Действие + + ru + Действие + + + EnumRef.ДействияПриОбменеВнутренняяПубликация + + + + Use + Use + + + + ЗавершенаУспешно + + ru + Завершена успешно + + + Boolean + + + + Use + Use + + + + ЗавершенаСОшибкой + + ru + Завершена с ошибкой + + + Boolean + + + + Use + Use + + + + Ошибка + + ru + Ошибка + + + String + + + + + Use + Use + + + + Параметры + + ru + Параметры + + + ValueStorage + + + + Use + Use + + + + ДатаСоздания + + ru + Дата создания + + + Date + + + + + Use + Use + + true + + + УзелИнформационнойБазы + + ru + Узел информационной базы + + АПК:1330 универсальный механизм + + ExchangePlanRef + + + + Use + Use + + true + + + НомерЗадачи + + ru + Номер задачи + + + Number + + 4 + + + + + Use + Use + + true + + + ИдентификаторОбмена + + ru + Идентификатор обмена + + + String + + 36 + + + + + Use + Use + + true + + + ИдентификаторЗадачи + + ru + Идентификатор задачи + + + String + + 36 + + + + + Use + Use + + true + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаЗаписи + + ru + Форма записи + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/ЗамерыВремени/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ЗамерыВремени/Forms/ФормаСписка/Form.form index 74b555a81..699fb33fc 100644 --- a/SSL/src/InformationRegisters/ЗамерыВремени/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ЗамерыВремени/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ЗамерыКомментарииСтатистики/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ЗамерыКомментарииСтатистики/Forms/ФормаСписка/Form.form index 279fb56a0..275b37d19 100644 --- a/SSL/src/InformationRegisters/ЗамерыКомментарииСтатистики/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ЗамерыКомментарииСтатистики/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ЗамерыКомментарииСтатистики/ManagerModule.bsl b/SSL/src/InformationRegisters/ЗамерыКомментарииСтатистики/ManagerModule.bsl index 564421c1c..fd09715db 100644 --- a/SSL/src/InformationRegisters/ЗамерыКомментарииСтатистики/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ЗамерыКомментарииСтатистики/ManagerModule.bsl @@ -119,7 +119,6 @@ |ГДЕ | ЗамерыКомментарииСтатистики.Период >= &ДатаНачала | И ЗамерыКомментарииСтатистики.ПериодОкончание <= &ДатаОкончания - | И ЗамерыКомментарииСтатистики.ИдентификаторУдаления < ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2015,1,1),СЕКУНДА, ВЫРАЗИТЬ((РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2015,1,1), &ДатаОкончания, СЕКУНДА) + 63555667200)/&ПериодУдаления - 0.5 КАК ЧИСЛО(11,0)) * &ПериодУдаления - 63555667200) |СГРУППИРОВАТЬ ПО | ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2015,1,1),СЕКУНДА, ВЫРАЗИТЬ((РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2015,1,1), ЗамерыКомментарииСтатистики.Период, СЕКУНДА) + 63555667200)/&ПериодУдаления - 0.5 КАК ЧИСЛО(11,0)) * &ПериодУдаления - 63555667200), | ОперацииСтатистики.Наименование, diff --git a/SSL/src/InformationRegisters/ЗамерыОбластиСтатистики/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ЗамерыОбластиСтатистики/Forms/ФормаСписка/Form.form index 1a2c83891..a543965b7 100644 --- a/SSL/src/InformationRegisters/ЗамерыОбластиСтатистики/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ЗамерыОбластиСтатистики/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ЗамерыОбластиСтатистики/ManagerModule.bsl b/SSL/src/InformationRegisters/ЗамерыОбластиСтатистики/ManagerModule.bsl index e7a19778d..5106fb802 100644 --- a/SSL/src/InformationRegisters/ЗамерыОбластиСтатистики/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ЗамерыОбластиСтатистики/ManagerModule.bsl @@ -115,7 +115,6 @@ |ГДЕ | ЗамерыОбластиСтатистики.Период >= &ДатаНачала | И ЗамерыОбластиСтатистики.ПериодОкончание <= &ДатаОкончания - | И ЗамерыОбластиСтатистики.ИдентификаторУдаления < ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2015,1,1),СЕКУНДА, ВЫРАЗИТЬ((РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2015,1,1), &ДатаОкончания, СЕКУНДА) + 63555667200)/&ПериодУдаления - 0.5 КАК ЧИСЛО(11,0)) * &ПериодУдаления - 63555667200) |СГРУППИРОВАТЬ ПО | ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2015,1,1),СЕКУНДА, ВЫРАЗИТЬ((РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2015,1,1), ЗамерыОбластиСтатистики.Период, СЕКУНДА) + 63555667200)/&ПериодУдаления - 0.5 КАК ЧИСЛО(11,0)) * &ПериодУдаления - 63555667200), | ОперацииСтатистики.Наименование, diff --git a/SSL/src/InformationRegisters/ЗамерыОперацииСтатистики/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ЗамерыОперацииСтатистики/Forms/ФормаСписка/Form.form index 3c5909c7b..b10d0b8d2 100644 --- a/SSL/src/InformationRegisters/ЗамерыОперацииСтатистики/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ЗамерыОперацииСтатистики/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ЗамерыОперацииСтатистики/ManagerModule.bsl b/SSL/src/InformationRegisters/ЗамерыОперацииСтатистики/ManagerModule.bsl index 4f333601a..f5e45ade2 100644 --- a/SSL/src/InformationRegisters/ЗамерыОперацииСтатистики/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ЗамерыОперацииСтатистики/ManagerModule.bsl @@ -110,8 +110,7 @@ | ЗамерыОперацииСтатистики.ОперацияСтатистики = ОперацииСтатистики.ИдентификаторОперации |ГДЕ | ЗамерыОперацииСтатистики.Период >= &ДатаНачала - | И ЗамерыОперацииСтатистики.ПериодОкончание <= &ДатаОкончания - | И ЗамерыОперацииСтатистики.ИдентификаторУдаления < ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2015,1,1),СЕКУНДА, ВЫРАЗИТЬ((РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2015,1,1), &ДатаОкончания, СЕКУНДА) + 63555667200)/&ПериодУдаления - 0.5 КАК ЧИСЛО(11,0)) * &ПериодУдаления - 63555667200) + | И ЗамерыОперацииСтатистики.ПериодОкончание <= &ДатаОкончания |СГРУППИРОВАТЬ ПО | ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2015,1,1),СЕКУНДА, ВЫРАЗИТЬ((РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2015,1,1), ЗамерыОперацииСтатистики.Период, СЕКУНДА) + 63555667200)/&ПериодУдаления - 0.5 КАК ЧИСЛО(11,0)) * &ПериодУдаления - 63555667200), | ОперацииСтатистики.Наименование diff --git a/SSL/src/InformationRegisters/ЗамерыСтатистики/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ЗамерыСтатистики/Forms/ФормаСписка/Form.form index 9422cd769..9b87ae30d 100644 --- a/SSL/src/InformationRegisters/ЗамерыСтатистики/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ЗамерыСтатистики/Forms/ФормаСписка/Form.form @@ -30,7 +30,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ЗаявленияНаВыпускСертификата/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ЗаявленияНаВыпускСертификата/Forms/ФормаСписка/Form.form index b18cbe325..b3bf40623 100644 --- a/SSL/src/InformationRegisters/ЗаявленияНаВыпускСертификата/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ЗаявленияНаВыпускСертификата/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ЗначенияГруппДоступа/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ЗначенияГруппДоступа/Forms/ФормаСписка/Form.form index 161551ba1..c9bbbda7b 100644 --- a/SSL/src/InformationRegisters/ЗначенияГруппДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ЗначенияГруппДоступа/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ЗначенияГруппДоступа/ManagerModule.bsl b/SSL/src/InformationRegisters/ЗначенияГруппДоступа/ManagerModule.bsl index a5ea47f37..87138755c 100644 --- a/SSL/src/InformationRegisters/ЗначенияГруппДоступа/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ЗначенияГруппДоступа/ManagerModule.bsl @@ -68,8 +68,20 @@ Процедура ОбновитьДанныеРегистра(ГруппыДоступа = Неопределено, ЕстьИзменения = Неопределено) Экспорт Блокировка = Новый БлокировкаДанных; - Блокировка.Добавить("РегистрСведений.ЗначенияГруппДоступа"); - Блокировка.Добавить("РегистрСведений.ЗначенияГруппДоступаПоУмолчанию"); + + Если ГруппыДоступа = Неопределено Тогда + Блокировка.Добавить("РегистрСведений.ЗначенияГруппДоступа"); + Блокировка.Добавить("РегистрСведений.ЗначенияГруппДоступаПоУмолчанию"); + Иначе + ЗначенияБлокировки = ?(ТипЗнч(ГруппыДоступа) = Тип("Массив"), ГруппыДоступа, + ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ГруппыДоступа)); + Для Каждого ЗначениеБлокировки Из ЗначенияБлокировки Цикл + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЗначенияГруппДоступа"); + ЭлементБлокировки.УстановитьЗначение("ГруппаДоступа", ЗначениеБлокировки); + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЗначенияГруппДоступаПоУмолчанию"); + ЭлементБлокировки.УстановитьЗначение("ГруппаДоступа", ЗначениеБлокировки); + КонецЦикла; + КонецЕсли; Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрофилиГруппДоступа"); @@ -103,9 +115,10 @@ ОбновитьПовторноИспользуемыеЗначения(); КонецЕсли; СвойстваВидовДоступа = УправлениеДоступомСлужебный.СвойстваВидовДоступа(); + ВсеИспользуемыеВидыДоступа = УправлениеДоступомСлужебный.ИспользуемыеВидыДоступа(); Для Каждого СвойстваВидаДоступа Из СвойстваВидовДоступа.Массив Цикл - Если Не УправлениеДоступомСлужебный.ВидДоступаИспользуется(СвойстваВидаДоступа.Ссылка) Тогда + Если ВсеИспользуемыеВидыДоступа.Получить(СвойстваВидаДоступа.Ссылка) = Неопределено Тогда Продолжить; КонецЕсли; НоваяСтрока = ИспользуемыеВидыДоступа.Добавить(); diff --git a/SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/Forms/ФормаСписка/Form.form index 6fbf2ca79..c0c9aad47 100644 --- a/SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ИдентификаторыОбъектовВерсийРасширений/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ИдентификаторыОбъектовВерсийРасширений/Forms/ФормаСписка/Form.form index c822de610..07c73cba1 100644 --- a/SSL/src/InformationRegisters/ИдентификаторыОбъектовВерсийРасширений/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ИдентификаторыОбъектовВерсийРасширений/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ИсполнителиРолиСОбъектомАдресации/Form.form b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ИсполнителиРолиСОбъектомАдресации/Form.form index 539c1f67d..1431315c8 100644 --- a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ИсполнителиРолиСОбъектомАдресации/Form.form +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ИсполнителиРолиСОбъектомАдресации/Form.form @@ -66,7 +66,6 @@ UsualGroup Vertical - Auto true true Auto @@ -387,6 +386,38 @@ Item.Список + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 52 + + СтрокаПоискаРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 53 + true + + Список + + true + + Left true diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/РолиИИсполнителиЗадач/Form.form b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/РолиИИсполнителиЗадач/Form.form index 45e284814..eeb3ea0a4 100644 --- a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/РолиИИсполнителиЗадач/Form.form +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/РолиИИсполнителиЗадач/Form.form @@ -729,6 +729,38 @@ + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 102 + + СтрокаПоискаРасширеннаяПодсказка + 104 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 103 + true + + Список + + true + + Left true diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаЗаписи/Form.form index bd4315943..d5c4d429e 100644 --- a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаЗаписи/Form.form @@ -229,7 +229,6 @@ UsualGroup Vertical - Auto true Auto Auto @@ -257,7 +256,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -286,7 +284,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаСписка/Form.form index d2af2816f..fac262e39 100644 --- a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаСписка/Form.form index 6d2c96e82..972522552 100644 --- a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаСписка/Form.form index f422bfaff..1a36fa1a8 100644 --- a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ИсторияРассылкиОтчетов/ManagerModule.bsl b/SSL/src/InformationRegisters/ИсторияРассылкиОтчетов/ManagerModule.bsl new file mode 100644 index 000000000..a2338adad --- /dev/null +++ b/SSL/src/InformationRegisters/ИсторияРассылкиОтчетов/ManagerModule.bsl @@ -0,0 +1,50 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныеПроцедурыИФункции + +// Для внутреннего использования. +// +Процедура ЗафиксироватьРезультатВыполненияРассылкиПолучателю(ПоляИстории) Экспорт + УстановитьПривилегированныйРежим(Истина); + + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных(); + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ИсторияРассылкиОтчетов"); + ЭлементБлокировки.УстановитьЗначение("РассылкаОтчетов", ПоляИстории.РассылкаОтчетов); + ЭлементБлокировки.УстановитьЗначение("Получатель", ПоляИстории.Получатель); + ЭлементБлокировки.УстановитьЗначение("ЗапускРассылки", ПоляИстории.ЗапускРассылки); + Блокировка.Заблокировать(); + + МенеджерЗаписи = СоздатьМенеджерЗаписи(); + МенеджерЗаписи.РассылкаОтчетов = ПоляИстории.РассылкаОтчетов; + МенеджерЗаписи.Получатель = ПоляИстории.Получатель; + МенеджерЗаписи.ЗапускРассылки = ПоляИстории.ЗапускРассылки; + МенеджерЗаписи.УчетнаяЗапись = ПоляИстории.УчетнаяЗапись; + МенеджерЗаписи.АдресЭП = ПоляИстории.АдресЭП; + МенеджерЗаписи.Период = ПоляИстории.Период; + МенеджерЗаписи.Прочитать(); + + МенеджерЗаписи.Комментарий = ?(ЗначениеЗаполнено(МенеджерЗаписи.Комментарий), МенеджерЗаписи.Комментарий + Символы.ПС + + ПоляИстории.Комментарий, ПоляИстории.Комментарий); + ЗаполнитьЗначенияСвойств(МенеджерЗаписи, ПоляИстории, , "Комментарий"); + + МенеджерЗаписи.Записать(Истина); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; +КонецПроцедуры + +#КонецОбласти + +#КонецЕсли diff --git a/SSL/src/InformationRegisters/ЗагруженныеВерсииАдресныхСведений/RecordSetModule.bsl b/SSL/src/InformationRegisters/ИсторияРассылкиОтчетов/RecordSetModule.bsl similarity index 100% rename from SSL/src/InformationRegisters/ЗагруженныеВерсииАдресныхСведений/RecordSetModule.bsl rename to SSL/src/InformationRegisters/ИсторияРассылкиОтчетов/RecordSetModule.bsl diff --git a/SSL/src/InformationRegisters/ИсторияРассылкиОтчетов/ИсторияРассылкиОтчетов.mdo b/SSL/src/InformationRegisters/ИсторияРассылкиОтчетов/ИсторияРассылкиОтчетов.mdo new file mode 100644 index 000000000..5c5d755d1 --- /dev/null +++ b/SSL/src/InformationRegisters/ИсторияРассылкиОтчетов/ИсторияРассылкиОтчетов.mdo @@ -0,0 +1,275 @@ + + + + + + + + + + + + ИсторияРассылкиОтчетов + + ru + История рассылки отчетов + + true + InDialog + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Second + Managed + + Выполнена + + ru + Выполнена + + + Boolean + + + + Use + Use + + + + Комментарий + + ru + Комментарий + + + String + + + + + Use + Use + + + + НомерСеанса + + ru + Номер сеанса + + Используется для отбора журнала регистрации по номеру сеанса рассылки отчетов. Подробнее см. НомерСеансаИнформационнойБазы в синтакс-помощнике. + + Number + + 25 + + + + ru + Номер сеанса, в котором выполнялся запуск рассылки (для отбора событий в журнале регистрации) + + + + Use + Use + + + + ЭлектронноеПисьмоИсходящее + + ru + Электронное письмо исходящее + + + DocumentRef.ЭлектронноеПисьмоИсходящее + + + + Use + Use + + + + СпособПолучения + + ru + Способ получения + + + String + + 500 + + + + + Use + Use + + + + Статус + + ru + Статус + + + EnumRef.СтатусыЭлектронныхПисем + + + + Use + Use + + + + ИдентификаторПисьма + + ru + Идентификатор письма + + + String + + 255 + + + + + Index + Use + Use + + + + ДатаДоставки + + ru + Дата доставки + + + Date + + + + + Use + Use + + + + РассылкаОтчетов + + ru + Рассылка отчетов + + + CatalogRef.РассылкиОтчетов + + + + Use + Use + + true + + + Получатель + + ru + Получатель + + + DefinedType.ПолучательРассылки + + + + Use + Use + + true + + + ЗапускРассылки + + ru + Запуск рассылки + + + Date + + + + + Use + Use + + true + + + УчетнаяЗапись + + ru + Учетная запись + + + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + + + Use + Use + + true + + + АдресЭП + + ru + Адрес ЭП + + + String + + 100 + + + + + Use + Use + + true + + diff --git a/SSL/src/InformationRegisters/КалендарныеГрафики/ManagerModule.bsl b/SSL/src/InformationRegisters/КалендарныеГрафики/ManagerModule.bsl index 4d2291d3e..44d311126 100644 --- a/SSL/src/InformationRegisters/КалендарныеГрафики/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/КалендарныеГрафики/ManagerModule.bsl @@ -108,7 +108,7 @@ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ПредставлениеОтбора, Выборка.Календарь), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации( ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, @@ -173,8 +173,8 @@ // Процедура ОбновитьГрафикиРаботыПоДаннымПроизводственныхКалендарей(УсловияОбновления) Экспорт - // Выявим графики, которые нужно обновить - // получаем данные этих графиков + // Выявим графики, которые нужно обновить, + // получаем данные этих графиков, // последовательно обновляем за каждый год. ТекстЗапроса = @@ -332,14 +332,15 @@ ПараметрыЗаполнения.ДатаОтсчета = ВыборкаПоГрафикам.ДатаОтсчета; ДниВключенныеВГрафик = РегистрыСведений.КалендарныеГрафики.ДниВключенныеВГрафик( ВыборкаПоГрафикам.ДатаНачала, ВыборкаПоГрафикам.ДатаОкончания, ПараметрыЗаполнения); - ЗаписатьДанныеГрафикаВРегистр( - ВыборкаПоГрафикам.ГрафикРаботы, ДниВключенныеВГрафик, ВыборкаПоГрафикам.ДатаНачала, ВыборкаПоГрафикам.ДатаОкончания); + // @skip-check query-in-loop - Запись данных по наборам с чтением в цикле. + ЗаписатьДанныеГрафикаВРегистр(ВыборкаПоГрафикам.ГрафикРаботы, ДниВключенныеВГрафик, + ВыборкаПоГрафикам.ДатаНачала, ВыборкаПоГрафикам.ДатаОкончания); КонецЦикла; КонецЦикла; КонецПроцедуры -// Функция читает данные графика работы из регистра. +// Читает данные графика работы из регистра. // // Параметры: // ГрафикРаботы - ссылка на текущий элемент справочника. 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 0626157c4..47e5b024b 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаВнешнихПользователей/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/КлючиДоступаВнешнихПользователей/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/КлючиДоступаГруппДоступа/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/КлючиДоступаГруппДоступа/Forms/ФормаСписка/Form.form index 487183094..f312b47b7 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаГруппДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/КлючиДоступаГруппДоступа/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/КлючиДоступаКОбъектам/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/КлючиДоступаКОбъектам/Forms/ФормаСписка/Form.form index 550203734..be2688bfd 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаКОбъектам/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/КлючиДоступаКОбъектам/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/КлючиДоступаКРегистрам/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/КлючиДоступаКРегистрам/Forms/ФормаСписка/Form.form index 07520685b..7302d78b2 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаКРегистрам/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/КлючиДоступаКРегистрам/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/КлючиДоступаНаборовГруппДоступа/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/КлючиДоступаНаборовГруппДоступа/Forms/ФормаСписка/Form.form index 40de74f89..a7697f814 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаНаборовГруппДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/КлючиДоступаНаборовГруппДоступа/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/КлючиДоступаПользователей/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/КлючиДоступаПользователей/Forms/ФормаСписка/Form.form index a3677cbee..be77a8fbd 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаПользователей/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/КлючиДоступаПользователей/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/КодировкиФайлов/ManagerModule.bsl b/SSL/src/InformationRegisters/КодировкиФайлов/ManagerModule.bsl index f51bcc558..1d4ed38ae 100644 --- a/SSL/src/InformationRegisters/КодировкиФайлов/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/КодировкиФайлов/ManagerModule.bsl @@ -79,257 +79,11 @@ КонецЕсли; ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(ПрисоединенныйФайл, Ложь); - Если ДвоичныеДанные <> Неопределено Тогда - Кодировка = КодировкаИзДвоичныхДанных(ДвоичныеДанные); - Если Не ЗначениеЗаполнено(Кодировка) Тогда - Если СтрЗаканчиваетсяНа(НРег(Расширение), "xml") Тогда - Кодировка = КодировкаИзОбъявленияXML(ДвоичныеДанные); - Иначе - Кодировка = КодировкаИзСоответствияАлфавиту(ДвоичныеДанные); - КонецЕсли; - - Если НРег(Кодировка) = "utf-8" Тогда - Кодировка = НРег(Кодировка) + "_WithoutBOM"; - КонецЕсли; - - КонецЕсли; - КонецЕсли; + Кодировка = РаботаСФайламиСлужебныйКлиентСервер.ОпределитьКодировкуДвоичныхДанных(ДвоичныеДанные, Расширение); Возврат Кодировка; КонецФункции -// Возвращает кодировку, полученную из двоичных данных файла, если -// файл содержит сигнатуру BOM в начале. -// -// Параметры: -// ДвоичныеДанные - ДвоичныеДанные - двоичные данные файла. -// -// Возвращаемое значение: -// Строка - кодировка файла. Если файл не содержит сигнатуру BOM, -// возвращает пустую строку. -// -Функция КодировкаИзДвоичныхДанных(ДвоичныеДанные) - - ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные); - БуферДвоичныхДанных = ЧтениеДанных.ПрочитатьВБуферДвоичныхДанных(5); - - Возврат КодировкаBOM(БуферДвоичныхДанных); - -КонецФункции - -// Возвращает кодировку, полученную из двоичных данных файла, если -// файл содержит объявление XML. -// -// Параметры: -// ДвоичныеДанные - ДвоичныеДанные- двоичные данные файла. -// -// Возвращаемое значение: -// Строка - кодировка файла. Если невозможно прочитать -// объявление XML, возвращает пустую строку. -// -Функция КодировкаИзОбъявленияXML(ДвоичныеДанные) - - БуферДвоичныхДанных = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ДвоичныеДанные); - ПотокВПамяти = Новый ПотокВПамяти(БуферДвоичныхДанных); - ЧтениеXML = Новый ЧтениеXML; - ЧтениеXML.ОткрытьПоток(ПотокВПамяти); - Попытка - ЧтениеXML.ПерейтиКСодержимому(); - КодировкаXML = ЧтениеXML.КодировкаXML; - Исключение - КодировкаXML = ""; - КонецПопытки; - ЧтениеXML.Закрыть(); - ПотокВПамяти.Закрыть(); - - Возврат КодировкаXML; - -КонецФункции - -// Возвращает кодировку текста, полученную из сигнатуры BOM в начале. -// -// Параметры: -// БуферДвоичныхДанных - Число - коллекция байтов для определения кодировки. -// -// Возвращаемое значение: -// Строка - кодировка файла. Если файл не содержит сигнатуру BOM, -// возвращает пустую строку. -// -Функция КодировкаBOM(БуферДвоичныхДанных) - - ПрочитанныеБайты = Новый Массив(5); - Для Индекс = 0 По 4 Цикл - Если Индекс < БуферДвоичныхДанных.Размер Тогда - ПрочитанныеБайты[Индекс] = БуферДвоичныхДанных[Индекс]; - Иначе - ПрочитанныеБайты[Индекс] = ЧислоИзШестнадцатеричнойСтроки("0xA5"); - КонецЕсли; - КонецЦикла; - - Если ПрочитанныеБайты[0] = ЧислоИзШестнадцатеричнойСтроки("0xFE") - И ПрочитанныеБайты[1] = ЧислоИзШестнадцатеричнойСтроки("0xFF") Тогда - Кодировка = "UTF-16BE"; - ИначеЕсли ПрочитанныеБайты[0] = ЧислоИзШестнадцатеричнойСтроки("0xFF") - И ПрочитанныеБайты[1] = ЧислоИзШестнадцатеричнойСтроки("0xFE") Тогда - Если ПрочитанныеБайты[2] = ЧислоИзШестнадцатеричнойСтроки("0x00") - И ПрочитанныеБайты[3] = ЧислоИзШестнадцатеричнойСтроки("0x00") Тогда - Кодировка = "UTF-32LE"; - Иначе - Кодировка = "UTF-16LE"; - КонецЕсли; - ИначеЕсли ПрочитанныеБайты[0] = ЧислоИзШестнадцатеричнойСтроки("0xEF") - И ПрочитанныеБайты[1] = ЧислоИзШестнадцатеричнойСтроки("0xBB") - И ПрочитанныеБайты[2] = ЧислоИзШестнадцатеричнойСтроки("0xBF") Тогда - Кодировка = "UTF-8"; - ИначеЕсли ПрочитанныеБайты[0] = ЧислоИзШестнадцатеричнойСтроки("0x00") - И ПрочитанныеБайты[1] = ЧислоИзШестнадцатеричнойСтроки("0x00") - И ПрочитанныеБайты[2] = ЧислоИзШестнадцатеричнойСтроки("0xFE") - И ПрочитанныеБайты[3] = ЧислоИзШестнадцатеричнойСтроки("0xFF") Тогда - Кодировка = "UTF-32BE"; - ИначеЕсли ПрочитанныеБайты[0] = ЧислоИзШестнадцатеричнойСтроки("0x0E") - И ПрочитанныеБайты[1] = ЧислоИзШестнадцатеричнойСтроки("0xFE") - И ПрочитанныеБайты[2] = ЧислоИзШестнадцатеричнойСтроки("0xFF") Тогда - Кодировка = "SCSU"; - ИначеЕсли ПрочитанныеБайты[0] = ЧислоИзШестнадцатеричнойСтроки("0xFB") - И ПрочитанныеБайты[1] = ЧислоИзШестнадцатеричнойСтроки("0xEE") - И ПрочитанныеБайты[2] = ЧислоИзШестнадцатеричнойСтроки("0x28") Тогда - Кодировка = "BOCU-1"; - ИначеЕсли ПрочитанныеБайты[0] = ЧислоИзШестнадцатеричнойСтроки("0x2B") - И ПрочитанныеБайты[1] = ЧислоИзШестнадцатеричнойСтроки("0x2F") - И ПрочитанныеБайты[2] = ЧислоИзШестнадцатеричнойСтроки("0x76") - И (ПрочитанныеБайты[3] = ЧислоИзШестнадцатеричнойСтроки("0x38") - Или ПрочитанныеБайты[3] = ЧислоИзШестнадцатеричнойСтроки("0x39") - Или ПрочитанныеБайты[3] = ЧислоИзШестнадцатеричнойСтроки("0x2B") - Или ПрочитанныеБайты[3] = ЧислоИзШестнадцатеричнойСтроки("0x2F")) Тогда - Кодировка = "UTF-7"; - ИначеЕсли ПрочитанныеБайты[0] = ЧислоИзШестнадцатеричнойСтроки("0xDD") - И ПрочитанныеБайты[1] = ЧислоИзШестнадцатеричнойСтроки("0x73") - И ПрочитанныеБайты[2] = ЧислоИзШестнадцатеричнойСтроки("0x66") - И ПрочитанныеБайты[3] = ЧислоИзШестнадцатеричнойСтроки("0x73") Тогда - Кодировка = "UTF-EBCDIC"; - Иначе - Кодировка = ""; - КонецЕсли; - - Возврат Кодировка; - -КонецФункции - -// Возвращает наиболее подходящую кодировку текста, полученную путем сравнения с алфавитом. -// -// Параметры: -// ДанныеТекста - ДвоичныеДанные - двоичные данные файла. -// -// Возвращаемое значение: -// Строка - кодировка файла. -// -Функция КодировкаИзСоответствияАлфавиту(ДанныеТекста) - - Кодировки = РаботаСФайламиСлужебный.Кодировки(); - Кодировки.Удалить(Кодировки.НайтиПоЗначению("utf-8_WithoutBOM")); - - КодировкаKOI8R = Кодировки.НайтиПоЗначению("koi8-r"); - Кодировки.Сдвинуть(КодировкаKOI8R, -Кодировки.Индекс(КодировкаKOI8R)); - - КодировкаWin1251 = Кодировки.НайтиПоЗначению("windows-1251"); - Кодировки.Сдвинуть(КодировкаWin1251, -Кодировки.Индекс(КодировкаWin1251)); - - КодировкаUTF8 = Кодировки.НайтиПоЗначению("utf-8"); - Кодировки.Сдвинуть(КодировкаUTF8, -Кодировки.Индекс(КодировкаUTF8)); - - СоответствующаяКодировка = ""; - МаксимальноеСоответствиеКодировки = 0; - Для Каждого Кодировка Из Кодировки Цикл - - СоответствиеКодировки = ПроцентСоответствияАлфавиту(ДанныеТекста, Кодировка.Значение); - Если СоответствиеКодировки > 0.95 Тогда - Возврат Кодировка.Значение; - КонецЕсли; - - Если СоответствиеКодировки > МаксимальноеСоответствиеКодировки Тогда - СоответствующаяКодировка = Кодировка.Значение; - МаксимальноеСоответствиеКодировки = СоответствиеКодировки; - КонецЕсли; - - КонецЦикла; - - Возврат СоответствующаяКодировка; - -КонецФункции - -Функция ПроцентСоответствияАлфавиту(ДвоичныеДанные, ПроверяемаяКодировка) - - // АПК:1036-выкл, АПК:163-выкл - алфавит не требует проверки орфографии. - Алфавит = "АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя" - + "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz" - + "1234567890 "; - // АПК:1036-вкл, АПК:163-вкл - - ПотокАлфавита = Новый ПотокВПамяти(); - ЗаписьАлфавита = Новый ЗаписьДанных(ПотокАлфавита); - ЗаписьАлфавита.ЗаписатьСтроку(Алфавит, ПроверяемаяКодировка); - ЗаписьАлфавита.Закрыть(); - - ДанныеАлфавита = ПотокАлфавита.ЗакрытьИПолучитьДвоичныеДанные(); - ЧтениеДанныхАлфавита = Новый ЧтениеДанных(ДанныеАлфавита); - БуферАлфавитаВКодировке = ЧтениеДанныхАлфавита.ПрочитатьВБуферДвоичныхДанных(); - - Индекс = 0; - СимволыАлфавита = Новый Массив; - Пока Индекс <= БуферАлфавитаВКодировке.Размер - 1 Цикл - - ТекущийСимвол = БуферАлфавитаВКодировке[Индекс]; - - // Символы кириллицы в кодировке UTF-8 - двухбайтовые. - Если ПроверяемаяКодировка = "utf-8" - И (ТекущийСимвол = 208 - Или ТекущийСимвол = 209) Тогда - - Индекс = Индекс + 1; - ТекущийСимвол = Формат(ТекущийСимвол, "ЧН=0; ЧГ=") + Формат(БуферАлфавитаВКодировке[Индекс], "ЧН=0; ЧГ="); - КонецЕсли; - - Индекс = Индекс + 1; - СимволыАлфавита.Добавить(ТекущийСимвол); - - КонецЦикла; - - ЧтениеДанныхТекста = Новый ЧтениеДанных(ДвоичныеДанные); - БуферДанныхТекста = ЧтениеДанныхТекста.ПрочитатьВБуферДвоичныхДанных(?(ПроверяемаяКодировка = "utf-8", 200, 100)); - РазмерБуфераТекста = БуферДанныхТекста.Размер; - КоличествоСимволов = РазмерБуфераТекста; - - Индекс = 0; - КоличествоВхождений = 0; - Пока Индекс <= РазмерБуфераТекста - 1 Цикл - - ТекущийСимвол = БуферДанныхТекста[Индекс]; - Если ПроверяемаяКодировка = "utf-8" - И (ТекущийСимвол = 208 - Или ТекущийСимвол = 209) Тогда - - // Если последний байт в буфере является первым байтом двухбайтового символа, игнорируем его. - Если Индекс = РазмерБуфераТекста - 1 Тогда - Прервать; - КонецЕсли; - - Индекс = Индекс + 1; - КоличествоСимволов = КоличествоСимволов - 1; - ТекущийСимвол = Формат(ТекущийСимвол, "ЧН=0; ЧГ=") + Формат(БуферДанныхТекста[Индекс], "ЧН=0; ЧГ="); - - КонецЕсли; - - Индекс = Индекс + 1; - Если СимволыАлфавита.Найти(ТекущийСимвол) <> Неопределено Тогда - КоличествоВхождений = КоличествоВхождений + 1; - КонецЕсли; - - КонецЦикла; - - Возврат ?(КоличествоСимволов = 0, 100, КоличествоВхождений/КоличествоСимволов); - -КонецФункции - #КонецОбласти #КонецЕсли diff --git a/SSL/src/InformationRegisters/КонтурСинхронизации/Forms/ЗацикливаниеСинхронизации/Form.form b/SSL/src/InformationRegisters/КонтурСинхронизации/Forms/ЗацикливаниеСинхронизации/Form.form new file mode 100644 index 000000000..39f8b8c38 --- /dev/null +++ b/SSL/src/InformationRegisters/КонтурСинхронизации/Forms/ЗацикливаниеСинхронизации/Form.form @@ -0,0 +1,931 @@ + + + + ОтступЛево + 41 + true + true + + true + + + ОтступЛевоРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + ОтступЛевоКонтекстноеМеню + 42 + true + + Label + 1 + true + true + + Left + + + + Группа1 + 47 + + ОтступВерх + 51 + true + true + + true + + + ОтступВерхРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ОтступВерхКонтекстноеМеню + 52 + true + + Label + true + true + + Left + + + + ГруппаКартинкаИнформация + 49 + + КартинкаПредупреждение + 79 + true + true + + true + + + КартинкаПредупреждениеРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + КартинкаПредупреждениеКонтекстноеМеню + 80 + true + + true + true + + + CommonPicture.Предупреждение32 + + AsFileRef + + + + ИнформацияОбнаруженоЗацикливание + 82 + + <key>ru</key> + <value>Обнаружено зацикливание синхронизации между информационными базами: +%1</value> + + true + true + + true + + + ИнформацияОбнаруженоЗацикливаниеРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + + ИнформацияОбнаруженоЗацикливаниеКонтекстноеМеню + 83 + true + + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Картинка информация</value> + + + ГруппаКартинкаИнформацияРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + + Отступ1 + 88 + true + true + + true + + + Отступ1РасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + Отступ1КонтекстноеМеню + 89 + true + + Label + true + true + + Left + + + + ИнформацияРазрывЗацикливания + 94 + + <key>ru</key> + <value>Чтобы устранить зацикливание, необходимо удалить синхронизацию между любыми из перечисленных выше баз. Это можно сделать в форме настройки синхронизации.</value> + + true + true + + true + + + ИнформацияРазрывЗацикливанияРасширеннаяПодсказка + 96 + Label + true + true + + Left + + + + ИнформацияРазрывЗацикливанияКонтекстноеМеню + 95 + true + + Label + true + + Left + + + + Отступ2 + 91 + true + true + + true + + + Отступ2РасширеннаяПодсказка + 93 + Label + true + true + + Left + + + + Отступ2КонтекстноеМеню + 92 + true + + Label + true + true + + Left + + + + ГруппаЭтаБаза + 127 + + ИнформацияСписокУзлов + 97 + + <key>ru</key> + <value>Для следующих узлов была приостановлена регистрация данных, полученных при обмене:</value> + + true + true + + true + + + ИнформацияСписокУзловРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + + ИнформацияСписокУзловКонтекстноеМеню + 98 + true + + Label + true + + Left + + + + ТаблицаУзлов + 103 + true + true + + true + + + ТаблицаУзлов + + None + Add + CancelSearch + Change + Copy + CopyToClipboard + Delete + EndEdit + Find + FindByCurrentValue + MoveDown + MoveUp + OutputList + SearchEverywhere + SelectAll + ShowMultipleSelection + ShowRowRearrangement + SortListAsc + SortListDesc + + ТаблицаУзловУзелИнформационнойБазы + 122 + true + true + + true + + + ТаблицаУзлов.УзелИнформационнойБазы + + + ТаблицаУзловУзелИнформационнойБазыРасширеннаяПодсказка + 124 + Label + true + true + + Left + + + + ТаблицаУзловУзелИнформационнойБазыКонтекстноеМеню + 123 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаУзловРегистрацияДанныхОбменаПриЗацикливании + 134 + + <key>ru</key> + <value>Возобновить/Приостановить</value> + + true + true + + true + + + ТаблицаУзлов.РегистрацияДанныхОбменаПриЗацикливании + + + ТаблицаУзловРегистрацияДанныхОбменаПриЗацикливанииРасширеннаяПодсказка + 136 + Label + true + true + + Left + + + + ТаблицаУзловРегистрацияДанныхОбменаПриЗацикливанииКонтекстноеМеню + 135 + true + + InputField + true + Auto + true + true + Left + true + Show + Always + + true + true + true + true + true + true + Normal + + + + ТаблицаУзловНезарегистрированныеДанные + 137 + true + true + + true + + + ТаблицаУзлов.НезарегистрированныеДанные + + + ТаблицаУзловНезарегистрированныеДанныеРасширеннаяПодсказка + 139 + Label + true + true + + Left + + + + ТаблицаУзловНезарегистрированныеДанныеКонтекстноеМеню + 138 + true + + InputField + Auto + true + true + Left + true + Show + Always + + true + true + true + true + true + true + Normal + + + + ТаблицаУзловКоманднаяПанель + 105 + Left + + + Selection + ТаблицаУзловВыбор + + + ТаблицаУзловСтрокаПоиска + 107 + + ТаблицаУзловСтрокаПоискаРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + + ТаблицаУзловСтрокаПоискаКонтекстноеМеню + 108 + true + + ТаблицаУзлов + + true + + + + ТаблицаУзловСостояниеПросмотра + 110 + + ТаблицаУзловСостояниеПросмотраРасширеннаяПодсказка + 112 + Label + true + true + + Left + + + + ТаблицаУзловСостояниеПросмотраКонтекстноеМеню + 111 + true + + ViewStatusAddition + ТаблицаУзлов + + true + + + + ТаблицаУзловУправлениеПоиском + 113 + + ТаблицаУзловУправлениеПоискомРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + + ТаблицаУзловУправлениеПоискомКонтекстноеМеню + 114 + true + + SearchControlAddition + ТаблицаУзлов + + true + + + + ТаблицаУзловРасширеннаяПодсказка + 106 + Label + true + true + + Left + + + + ТаблицаУзловКонтекстноеМеню + 104 + true + + true + true + true + 4 + true + true + MultiRow +
        true
        + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + AsFileRef + true + +
        + + ИнформацияВозобновлениеРегистрации + 100 + + <key>ru</key> + <value><b><colorstyle -16>Внимание!</></> Включение регистрации при зацикливании может привести к избыточности отправляемых и получаемых данных, а также к увеличению времени обмена.</value> + + true + true + + true + + + ИнформацияВозобновлениеРегистрацииРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + + ИнформацияВозобновлениеРегистрацииКонтекстноеМеню + 101 + true + + true + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Эта база</value> + + + ГруппаЭтаБазаРасширеннаяПодсказка + 128 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + +
        + + ГруппаДругаяБаза + 129 + + ИнформацияДругаяБаза + 131 + + <key>ru</key> + <value>Для возобновления регистрации необходимо перейти в базу "%1" и воспользоваться аналогичной формой.</value> + + true + true + + true + + + ИнформацияДругаяБазаРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + + ИнформацияДругаяБазаКонтекстноеМеню + 132 + true + + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Другая база</value> + + + ГруппаДругаяБазаРасширеннаяПодсказка + 130 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + + + + ОтступНиз + 85 + true + true + + true + + + ОтступНизРасширеннаяПодсказка + 87 + Label + true + true + + Left + + + + ОтступНизКонтекстноеМеню + 86 + true + + Label + true + true + + Left + + + true + true + + true + + + Группа1РасширеннаяПодсказка + 48 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + +
        + + ОтступПраво + 44 + true + true + + true + + + ОтступПравоРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ОтступПравоКонтекстноеМеню + 45 + true + + Label + 1 + true + true + + Left + + + + ФормаКоманднаяПанель + -1 + + ФормаЗакрытьФорму + 39 + true + true + + true + + + ФормаЗакрытьФормуРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + Form.Command.ЗакрытьФорму + Auto + true + true + true + UserCmds + Auto + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + 70 + LockOwner + true + true + true + AlwaysHorizontal + 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> + + 3 + + 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..ffa7ab37b --- /dev/null +++ b/SSL/src/InformationRegisters/КонтурСинхронизации/Forms/ЗацикливаниеСинхронизации/Module.bsl @@ -0,0 +1,164 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Элементы.ИнформацияОбнаруженоЗацикливание.Заголовок = СтроковыеФункции.ФорматированнаяСтрока( + Элементы.ИнформацияОбнаруженоЗацикливание.Заголовок, + ОбменДаннымиКонтрольЗацикливания.ВсеЗацикленныеУзлыПредставление()); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Настройки.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | Настройки.РегистрацияДанныхОбменаПриЗацикливании КАК РегистрацияДанныхОбменаПриЗацикливании + |ИЗ + | РегистрСведений.ОбщиеНастройкиУзловИнформационныхБаз КАК Настройки + |ГДЕ + | Настройки.ОбнаруженоЗацикливание"; + + Таблица = Запрос.Выполнить().Выгрузить(); + ТаблицаУзлов.Загрузить(Таблица); + + Если ТаблицаУзлов.Количество() > 0 Тогда + + Элементы.ГруппаЭтаБаза.Видимость = Истина; + Элементы.ГруппаДругаяБаза.Видимость = Ложь; + + Иначе + + Элементы.ГруппаЭтаБаза.Видимость = Ложь; + Элементы.ГруппаДругаяБаза.Видимость = Истина; + + Элементы.ИнформацияДругаяБаза.Заголовок = СтроковыеФункции.ФорматированнаяСтрока( + Элементы.ИнформацияДругаяБаза.Заголовок, + ОбменДаннымиКонтрольЗацикливания.БазаСПриостановленнойРегистрациейПредставление()); + + КонецЕсли; + + УстановитьУсловноеОформление(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаУзлов + +&НаКлиенте +Процедура ТаблицаУзловВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Если Поле.Имя = "ТаблицаУзловРегистрацияДанныхОбменаПриЗацикливании" Тогда + + Строка = ТаблицаУзлов.НайтиПоИдентификатору(ВыбраннаяСтрока); + Строка.РегистрацияДанныхОбменаПриЗацикливании = НЕ Строка.РегистрацияДанныхОбменаПриЗацикливании; + + ВозобновитьПриостановитьРегистрацию(Строка.УзелИнформационнойБазы, Строка.РегистрацияДанныхОбменаПриЗацикливании); + + ИначеЕсли Поле.Имя = "ТаблицаУзловНезарегистрированныеДанные" Тогда + + Строка = ТаблицаУзлов.НайтиПоИдентификатору(ВыбраннаяСтрока); + ПараметрыФормы = Новый Структура("УзелИнформационнойБазы", Строка.УзелИнформационнойБазы); + + ОткрытьФорму("РегистрСведений.ОбъектыНезарегистрированныеПриЗацикливании.ФормаСписка", ПараметрыФормы); + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ВозобновитьПриостановитьРегистрацию(УзелИнформационнойБазы, РегистрацияДанныхОбменаПриЗацикливании) + + УстановитьПривилегированныйРежим(Истина); + + Попытка + + РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.УстановитьЗацикливание( + УзелИнформационнойБазы,, + РегистрацияДанныхОбменаПриЗацикливании); + + Исключение + + ЗаписьЖурналаРегистрации(, УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + КонецПопытки; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ЗакрытьФорму(Команда) + + Закрыть(); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура УстановитьУсловноеОформление() + + УсловноеОформление.Элементы.Очистить(); + + // Возобновить регистрацию + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ТаблицаУзловРегистрацияДанныхОбменаПриЗацикливании"); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаУзлов.РегистрацияДанныхОбменаПриЗацикливании"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Ложь; + + Текст = НСтр("ru = 'Возобновить регистрацию'"); + Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Текст); + Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Синий); + + // Приостановить регистрацию + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ТаблицаУзловРегистрацияДанныхОбменаПриЗацикливании"); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаУзлов.РегистрацияДанныхОбменаПриЗацикливании"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Текст = НСтр("ru = 'Приостановить регистрацию'"); + Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Текст); + Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Синий); + + // Перейти + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ТаблицаУзловНезарегистрированныеДанные"); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаУзлов.УзелИнформационнойБазы"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено; + + Текст = НСтр("ru = 'Перейти'"); + Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Текст); + Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Синий); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/InformationRegisters/КонтурСинхронизации/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/КонтурСинхронизации/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..02d1b1bcc --- /dev/null +++ b/SSL/src/InformationRegisters/КонтурСинхронизации/Forms/ФормаСписка/Form.form @@ -0,0 +1,595 @@ + + + + <key>ru</key> + <value>Контур синхронизации</value> + + + Контур + 1 + + <key>ru</key> + <value>Контур</value> + + true + true + + true + + + Контур + + None + + КонтурИмя + 17 + true + true + + true + + + Контур.Имя + + + КонтурИмяРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + КонтурИмяКонтекстноеМеню + 18 + true + + InputField + Auto + true + Left + true + + true + true + false + true + true + true + true + Normal + + + + КонтурКод + 14 + true + true + + true + + + Контур.Код + + + КонтурКодРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + КонтурКодКонтекстноеМеню + 15 + true + + InputField + Auto + true + Left + true + + true + true + false + true + true + true + true + Normal + + + + КонтурПоследнееОбновление + 20 + true + true + + true + + + Контур.ПоследнееОбновление + + + КонтурПоследнееОбновлениеРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + КонтурПоследнееОбновлениеКонтекстноеМеню + 21 + true + + InputField + Auto + true + Left + true + + true + true + false + true + true + true + true + Normal + + + + КонтурЗацикливание + 30 + true + true + + true + + + Контур.Зацикливание + + + КонтурЗацикливаниеРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + КонтурЗацикливаниеКонтекстноеМеню + 31 + true + + CheckBoxField + Auto + true + Left + true + + + + КонтурПустаяКолонка + 27 + true + true + + true + + + Контур.ПустаяКолонка + + + КонтурПустаяКолонкаРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + КонтурПустаяКолонкаКонтекстноеМеню + 28 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + КонтурКоманднаяПанель + 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 + + Tree + true + true + true + true + true + true + MultiRow +
        true
        + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + ExpandAllLevels + true + true + true + true + AsFileRef + true +
        + + ФормаКоманднаяПанель + -1 + + ФормаЗакрыть + 23 + true + true + + true + + + ФормаЗакрытьРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + Form.Command.ЗакрытьФорму + Auto + true + true + true + UserCmds + Auto + + + ФормаОбновить + 25 + true + true + + true + + + ФормаОбновитьРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + Form.Command.Обновить + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + auto + true + + Контур + + <key>ru</key> + <value>Контур</value> + + 1 + + ValueTree + + + true + + + true + + + Код + + <key>ru</key> + <value>Код</value> + + 1 + + String + + + + true + + + true + + + + Имя + + <key>ru</key> + <value>Имя</value> + + 2 + + String + + + + true + + + true + + + + ЭтоУзел + 3 + + Boolean + + + true + + + true + + + + ПоследнееОбновление + + <key>ru</key> + <value>Последнее обновление</value> + + 4 + + Date + + + + true + + + true + + + + ПустаяКолонка + 5 + + String + + + + true + + + true + + + + Зацикливание + + <key>ru</key> + <value>Зацикливание</value> + + 6 + + Boolean + + + true + + + true + + + + Порядок + 7 + + Number + + 10 + + + + true + + + true + + + + + Обновить + + <key>ru</key> + <value>Обновить</value> + + 1 + + ru + Обновить + + + true + + + StdPicture.Refresh + + + + Обновить + + + 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..98528d1ad --- /dev/null +++ b/SSL/src/InformationRegisters/КонтурСинхронизации/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,128 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УстановитьУсловноеОформление(); + + ОбновитьКонтур(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Обновить(Команда) + + ОбновитьКонтур(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФорму(Команда) + + Закрыть(); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура УстановитьУсловноеОформление() + + УсловноеОформление.Элементы.Очистить(); + + // Шрифт для этого узла + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("Контур"); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контур.ЭтоУзел"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(,,Истина)); + + // Цвет фона + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("Контур"); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контур.Порядок"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = 0; + + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоЖелтый); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьКонтур() + + Контур.ПолучитьЭлементы().Очистить(); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Контур.КодУзла КАК Код, + | Контур.КодУзлаКорреспондента КАК КодУзлаКорреспондента, + | Контур.ИмяУзла КАК Имя, + | Контур.ИмяУзлаКорреспондента КАК ИмяУзлаКорреспондента, + | Контур.ПоследнееОбновление КАК ПоследнееОбновление, + | Контур.Зацикливание КАК Зацикливание, + | ВЫБОР + | КОГДА Контур.УзелИнформационнойБазы = НЕОПРЕДЕЛЕНО + | ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ КАК Порядок + |ИЗ + | РегистрСведений.КонтурСинхронизации КАК Контур + | + |УПОРЯДОЧИТЬ ПО + | Порядок + |ИТОГИ + | МАКСИМУМ(ИмяУзла), + | МАКСИМУМ(ПоследнееОбновление), + | МАКСИМУМ(Зацикливание), + | МАКСИМУМ(Порядок) + |ПО + | КодУзла"; + + ВыборкаПоУзлам = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + + Пока ВыборкаПоУзлам.Следующий() Цикл + + НовыйУзел = Контур.ПолучитьЭлементы().Добавить(); + ЗаполнитьЗначенияСвойств(НовыйУзел, ВыборкаПоУзлам); + НовыйУзел.ЭтоУзел = Истина; + + ВыборкаПоКоррУзлам = ВыборкаПоУзлам.Выбрать(); + + Пока ВыборкаПоКоррУзлам.Следующий() Цикл + НовыйКорневойУзел = НовыйУзел.ПолучитьЭлементы().Добавить(); + ЗаполнитьЗначенияСвойств(НовыйКорневойУзел, ВыборкаПоУзлам); + НовыйКорневойУзел.Код = ВыборкаПоКоррУзлам.КодУзлаКорреспондента; + НовыйКорневойУзел.Имя = ВыборкаПоКоррУзлам.ИмяУзлаКорреспондента; + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/InformationRegisters/КонтурСинхронизации/ManagerModule.bsl b/SSL/src/InformationRegisters/КонтурСинхронизации/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/InformationRegisters/КонтурСинхронизации/КонтурСинхронизации.mdo b/SSL/src/InformationRegisters/КонтурСинхронизации/КонтурСинхронизации.mdo new file mode 100644 index 000000000..0f9fb1507 --- /dev/null +++ b/SSL/src/InformationRegisters/КонтурСинхронизации/КонтурСинхронизации.mdo @@ -0,0 +1,228 @@ + + + + + + + + + + + + КонтурСинхронизации + + ru + Контур синхронизации + + true + InDialog + InformationRegister.КонтурСинхронизации.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + ИмяУзла + + ru + Имя узла + + + String + + 125 + + + + + Use + Use + + + + ИмяУзлаКорреспондента + + ru + Имя узла корреспондента + + + String + + 125 + + + + + Use + Use + + + + СинхронизацияУдалена + + ru + Синхронизация удалена + + + Boolean + + + + Use + Use + + + + ПоследнееОбновление + + ru + Последнее обновление + + Время по Гринвичу + + Date + + + + + Use + Use + + + + Префикс + + ru + Префикс + + + String + + 2 + + + + + Use + Use + + + + Зацикливание + + ru + Зацикливание + + + Boolean + + + + Use + Use + + + + УзелИнформационнойБазы + + ru + Узел информационной базы + + АПК:1330 универсальный механизм + + ExchangePlanRef + + + + Use + Use + + true + + + КодУзла + + ru + Код узла + + + String + + 36 + + + + + Use + Use + + true + + + КодУзлаКорреспондента + + ru + Код узла корреспондента + + + String + + 36 + + + + + Use + Use + + true + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ЗацикливаниеСинхронизации + + ru + Зацикливание синхронизации + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/КурсыВалют/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/КурсыВалют/Forms/ФормаСписка/Form.form index a7c2439c0..906a2a47e 100644 --- a/SSL/src/InformationRegisters/КурсыВалют/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/КурсыВалют/Forms/ФормаСписка/Form.form @@ -32,7 +32,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/КурсыВалют/RecordSetModule.bsl b/SSL/src/InformationRegisters/КурсыВалют/RecordSetModule.bsl index d8a019fcb..9665b9203 100644 --- a/SSL/src/InformationRegisters/КурсыВалют/RecordSetModule.bsl +++ b/SSL/src/InformationRegisters/КурсыВалют/RecordSetModule.bsl @@ -222,16 +222,16 @@ ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Расчет курса валюты ""%1"" по формуле ""%2"" за период ""%3""не выполнен:'", ОбщегоНазначения.КодОсновногоЯзыка()), Валюта, Формула, Период); - ОбщегоНазначения.СообщитьПользователю(ТекстОшибки + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке), + ОбщегоНазначения.СообщитьПользователю(ТекстОшибки + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Валюта, "Объект.ФормулаРасчетаКурса"); Если ДополнительныеСвойства.Свойство("ОбновитьКурсЗависимойВалюты") Тогда - ВызватьИсключение ТекстОшибки + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ВызватьИсключение ТекстОшибки + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); КонецЕсли; ЗаписьЖурналаРегистрации(НСтр("ru = 'Валюты.Загрузка курсов валют'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, Валюта.Метаданные(), Валюта, - ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ТекстОшибки + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецЕсли; Результат = Неопределено; КонецПопытки; @@ -264,7 +264,7 @@ КонецФункции -Функция ФорматироватьЧисла(Строка) Экспорт +Функция ФорматироватьЧисла(Строка) Результат = ""; Число = ""; diff --git a/SSL/src/InformationRegisters/КэшПрограммныхИнтерфейсов/ManagerModule.bsl b/SSL/src/InformationRegisters/КэшПрограммныхИнтерфейсов/ManagerModule.bsl index c84d21408..34be83a0e 100644 --- a/SSL/src/InformationRegisters/КэшПрограммныхИнтерфейсов/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/КэшПрограммныхИнтерфейсов/ManagerModule.bsl @@ -351,7 +351,7 @@ |по причине: |%2'"), АдресWSDL, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета"); @@ -398,7 +398,7 @@ НСтр("ru = 'Не удалось получить WS-определения из кэша |по причине: |%1'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение ТекстОшибки; КонецПопытки; @@ -406,7 +406,7 @@ УдалитьФайлы(ИмяФайлаWSDL); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Получение WSDL'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Возврат Определения; @@ -499,7 +499,7 @@ |Результат диагностики: |%3'"), Адрес, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), РезультатДиагностики.ОписаниеОшибки); СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -533,7 +533,7 @@ УдалитьФайлы(ОписаниеФайла.Путь); Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Получение WSDL'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Возврат ДанныеФайла; diff --git a/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаЗаписи/Form.form index 43b464ea2..d0cf555f5 100644 --- a/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаЗаписи/Form.form @@ -328,7 +328,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -357,7 +356,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаСписка/Form.form index b431fc4d1..17985fabb 100644 --- a/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/НаличиеФайлов/ManagerModule.bsl b/SSL/src/InformationRegisters/НаличиеФайлов/ManagerModule.bsl index 973e8ba14..b7b12d3b7 100644 --- a/SSL/src/InformationRegisters/НаличиеФайлов/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/НаличиеФайлов/ManagerModule.bsl @@ -38,6 +38,7 @@ | Ссылка"; Запрос.УстановитьПараметр("Ссылка", Ссылка); + // @skip-check query-in-loop - Порционная обработка данных МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, МассивСсылок); @@ -102,7 +103,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать сведения о наличие файлов %1 по причине: |%2'"), - Выборка.Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Выборка.Ссылка, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Выборка.Ссылка.Метаданные(), Выборка.Ссылка, ТекстСообщения); КонецПопытки; diff --git a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/МоиНапоминания/Form.form b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/МоиНапоминания/Form.form index 0593f5b13..189a1da0f 100644 --- a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/МоиНапоминания/Form.form +++ b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/МоиНапоминания/Form.form @@ -29,7 +29,6 @@ UsualGroup Vertical - Auto true true Auto diff --git a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Form.form b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Form.form index fbbc9662f..1cb86feb0 100644 --- a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Form.form +++ b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Form.form @@ -97,7 +97,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -395,7 +394,7 @@ 99:99 ru - ДФ=ЧЧ:мм + ДЛФ=T 10 true @@ -661,7 +660,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -776,7 +774,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -968,7 +965,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Module.bsl b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Module.bsl index 7d10f10a9..553937326 100644 --- a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Module.bsl +++ b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Module.bsl @@ -158,7 +158,7 @@ ОповеститьОбИзменении(Объект.Источник); КонецЕсли; - Оповестить("Запись_НапоминанияПользователя", Новый Структура, ЭтотОбъект); + Оповестить("Запись_НапоминанияПользователя", СтруктураПараметров, ЭтотОбъект); КонецПроцедуры &НаКлиенте @@ -359,8 +359,8 @@ Для Час = 0 По 23 Цикл Для Период = 0 По 1 Цикл Время = Час*60*60 + Период*30*60; - Элементы.Время.СписокВыбора.Добавить(НачалоДня(Объект.ВремяСобытия) + Время, - "" + Час + ":" + Формат(Период*30,"ЧЦ=2; ЧН=00")); + Дата = НачалоДня(Объект.ВремяСобытия) + Время; + Элементы.Время.СписокВыбора.Добавить(Дата, Формат(Дата,"ДЛФ=T;")); КонецЦикла; КонецЦикла; КонецПроцедуры diff --git a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/ФормаОповещения/Form.form b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/ФормаОповещения/Form.form index a50f0d595..88bb1c7d3 100644 --- a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/ФормаОповещения/Form.form +++ b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/ФормаОповещения/Form.form @@ -236,7 +236,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/ФормаОповещения/Module.bsl b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/ФормаОповещения/Module.bsl index 8d1d92a0a..114ef5e8b 100644 --- a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/ФормаОповещения/Module.bsl +++ b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/ФормаОповещения/Module.bsl @@ -21,8 +21,8 @@ Элементы.СрокПовторногоОповещения.Видимость = Ложь; Элементы.КнопкаОтложить.Заголовок = НСтр("ru = 'Отложить'"); Элементы.КнопкаОтложить.КнопкаПоУмолчанию = Истина; - Элементы.КнопкаОткрыть.ТолькоВоВсехДействиях = Истина; - Элементы.КнопкаПрекратить.ТолькоВоВсехДействиях = Истина; + Элементы.КнопкаОткрыть.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; + Элементы.КнопкаПрекратить.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю; КонецЕсли; КонецПроцедуры diff --git a/SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/Forms/ФормаСписка/Form.form index b9c757e6b..e87425738 100644 --- a/SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/ManagerModule.bsl b/SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/ManagerModule.bsl index a88ee8640..991aa810c 100644 --- a/SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/ManagerModule.bsl @@ -40,9 +40,11 @@ Для каждого КлючИЗначение Из ВозможныеПрава.ПоПолнымИменам Цикл Запрос.Текст = СтрЗаменить(ТекстЗапроса, "&ТекущаяТаблица", КлючИЗначение.Ключ); + // @skip-check query-in-loop - Малый цикл из одной или двух итераций Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл + // @skip-check query-in-loop - Обход иерархии элементов с обновлением порциями ОбновитьРодителейВладельца(Выборка.Ссылка, ЕстьИзменения); КонецЦикла; КонецЦикла; @@ -50,6 +52,7 @@ ИначеЕсли ТипЗнч(ВладельцыНастроекПрав) = Тип("Массив") Тогда Для каждого ВладелецНастроекПрав Из ВладельцыНастроекПрав Цикл + // @skip-check query-in-loop - Обход иерархии элементов с обновлением порциями ОбновитьРодителейВладельца(ВладелецНастроекПрав, ЕстьИзменения); КонецЦикла; Иначе @@ -252,6 +255,7 @@ Прервать; КонецЕсли; + // @skip-check query-in-loop - Обход иерархии элементов с обновлением порциями СвойстваТекущегоРодителя = СвойстваРодителя(СвойстваТекущегоРодителя.Ссылка); КонецЦикла; @@ -299,7 +303,7 @@ Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл - + // @skip-check query-in-loop - Обход иерархии элементов с обновлением порциями НовыеЗаписи = РодителиОбъекта(Выборка.ПодчиненнаяСсылка, Ссылка); НаборЗаписей = СоздатьНаборЗаписей(); 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..f58255a67 --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкиАрхиваСообщенийОбменов/Forms/ФормаЗаписи/Form.form @@ -0,0 +1,914 @@ + + + + ГруппаСтраницы + 27 + + ГруппаНастройки + 29 + + УзелИнформационнойБазы + 1 + true + true + + true + + + Запись.УзелИнформационнойБазы + + + УзелИнформационнойБазыРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 2 + true + + InputField + true + Enter + true + Left + true + + true + true + true + false + true + true + true + Normal + + + + КоличествоФайлов + 4 + true + true + + true + + + Запись.КоличествоФайлов + + + OnChange + КоличествоФайловПриИзменении + + + КоличествоФайловРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + КоличествоФайловКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + СжиматьФайлы + 58 + true + true + + true + + + Запись.СжиматьФайлы + + + СжиматьФайлыРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + СжиматьФайлыКонтекстноеМеню + 59 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаМестоХранения + 64 + + МестоХранения + 16 + true + true + + true + + + МестоХранения + + + ru + Файлы размером более 100 Мб игнорируются + + ShowRight + + OnChange + МестоХраненияПриИзменении + + + МестоХраненияРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + МестоХраненияКонтекстноеМеню + 17 + true + + RadioButtonField + Enter + true + Left + true + + Tumbler + + + ru + На диске + + + 1 + + + + + ru + В информационной базе + + + 0 + + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Место хранения</value> + + + ГруппаМестоХраненияРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + + ГруппаПапка + 19 + + ПолныйПуть + 10 + + <key>ru</key> + <value>Полный путь к общей папке на компьютере</value> + + true + true + + true + + + Запись.ПолныйПуть + + Top + + OnChange + ПолныйПутьПриИзменении + + + ПолныйПутьРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + ПолныйПутьКонтекстноеМеню + 11 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПолныйПутьНачалоВыбора + + true + true + true + true + true + true + Normal + + + + ПроверитьДоступностьПапки + 82 + + <key>ru</key> + <value>Проверить доступность</value> + + 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 + + ГруппаПапкаРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Настройки</value> + + + ГруппаНастройкиРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + ГруппаАрхивСообщений + 31 + + АрхивСообщенийОбменов + 33 + true + true + + true + + + АрхивСообщенийОбменов + + None + CancelSearch + Change + ChangeHistory + Copy + CopyToClipboard + Create + DynamicListStandardSettings + Find + FindByCurrentValue + LoadDynamicListSettings + SaveDynamicListSettings + SearchEverywhere + ShowMultipleSelection + + АрхивСообщенийОбменовПериод + 61 + + <key>ru</key> + <value>Дата создания</value> + + true + true + + true + + + АрхивСообщенийОбменов.Период + + + АрхивСообщенийОбменовПериодРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + + АрхивСообщенийОбменовПериодКонтекстноеМеню + 62 + true + + LabelField + Enter + true + Left + true + + true + true + + + + АрхивСообщенийОбменовНомерПринятогоСообщения + 66 + true + true + + true + + + АрхивСообщенийОбменов.НомерПринятогоСообщения + + + АрхивСообщенийОбменовНомерПринятогоСообщенияРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + АрхивСообщенийОбменовНомерПринятогоСообщенияКонтекстноеМеню + 67 + true + + LabelField + Enter + true + Left + true + + true + + + + АрхивСообщенийОбменовРазмерФайла + 72 + true + true + + true + + + АрхивСообщенийОбменов.РазмерФайла + + + АрхивСообщенийОбменовРазмерФайлаРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + АрхивСообщенийОбменовРазмерФайлаКонтекстноеМеню + 73 + true + + LabelField + Enter + true + Left + true + + true + true + + + + АрхивСообщенийОбменовФайлБольше100Мб + 79 + + <key>ru</key> + <value>> 100 Мб</value> + + true + true + + true + + + АрхивСообщенийОбменов.ФайлБольше100Мб + + + АрхивСообщенийОбменовФайлБольше100МбРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + АрхивСообщенийОбменовФайлБольше100МбКонтекстноеМеню + 80 + true + + CheckBoxField + Enter + true + Left + true + + + + АрхивСообщенийОбменовКоманднаяПанель + 35 + + АрхивСообщенийОбменовСохранить + 75 + true + true + + true + + + АрхивСообщенийОбменовСохранитьРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + Form.Command.Сохранить + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + false + АрхивСообщенийОбменовСтрокаПоиска + 37 + + АрхивСообщенийОбменовСтрокаПоискаРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + АрхивСообщенийОбменовСтрокаПоискаКонтекстноеМеню + 38 + true + + АрхивСообщенийОбменов + + true + + + + false + АрхивСообщенийОбменовСостояниеПросмотра + 40 + + АрхивСообщенийОбменовСостояниеПросмотраРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + АрхивСообщенийОбменовСостояниеПросмотраКонтекстноеМеню + 41 + true + + ViewStatusAddition + АрхивСообщенийОбменов + + true + + + + АрхивСообщенийОбменовУправлениеПоиском + 43 + + АрхивСообщенийОбменовУправлениеПоискомРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + АрхивСообщенийОбменовУправлениеПоискомКонтекстноеМеню + 44 + true + + SearchControlAddition + АрхивСообщенийОбменов + + true + + + + АрхивСообщенийОбменовРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + АрхивСообщенийОбменовКонтекстноеМеню + 34 + true + + HierarchicalList + true + true + true + 10 + true + true + true + MultiRow +
        true
        + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + true + AsFileRef + + АрхивСообщенийОбменов.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
        + true + true + + true + + + <key>ru</key> + <value>Архив сообщений</value> + + + ГруппаАрхивСообщенийРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Page + + Vertical + auto + false + +
        + true + true + + true + + + <key>ru</key> + <value>Страницы</value> + + + ГруппаСтраницыРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + +
        + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + Запись + 1 + + InformationRegisterRecordManager.НастройкиАрхиваСообщенийОбменов + + + true + + + true + +
        true
        + true +
        + + МестоХранения + + <key>ru</key> + <value>Место хранения</value> + + 2 + + Number + + 1 + + + + true + + + true + + + + АрхивСообщенийОбменов + + <key>ru</key> + <value>Архив сообщений обменов</value> + + 3 + + DynamicList + + + true + + + true + + + АрхивСообщенийОбменов.УзелИнформационнойБазы + + + ВЫБРАТЬ + Архив.Период КАК Период, + Архив.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + Архив.ПолноеИмяФайла КАК ПолноеИмяФайла, + Архив.Хранилище КАК Хранилище, + Архив.НомерПринятогоСообщения КАК НомерПринятогоСообщения, + Архив.РазмерФайла КАК РазмерФайла, + Архив.ФайлБольше100Мб КАК ФайлБольше100Мб +ИЗ + РегистрСведений.АрхивСообщенийОбменов КАК Архив + InformationRegister.АрхивСообщенийОбменов + true + true + true + true + true + + + + РазделениеВключено + 4 + + Boolean + + + true + + + true + + + + ПроверитьДоступностьПапки + + <key>ru</key> + <value>Проверить доступность папки</value> + + 1 + + ru + Проверить доступность папки + + + true + + + + ПроверитьДоступностьПапки + + + Auto + Auto + + + Сохранить + + <key>ru</key> + <value>Сохранить</value> + + 3 + + ru + Сохранить + + + true + + + StdPicture.SaveFile + + + + Сохранить + + + 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..dda85d433 --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкиАрхиваСообщенийОбменов/Forms/ФормаЗаписи/Module.bsl @@ -0,0 +1,237 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); + + Если Не ЗначениеЗаполнено(Запись.ИсходныйКлючЗаписи.УзелИнформационнойБазы) Тогда + Запись.КоличествоФайлов = 1; + Запись.ХранитьНаДиске = Истина; + КонецЕсли; + + МестоХранения = Запись.ХранитьНаДиске; + + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( + АрхивСообщенийОбменов, "УзелИнформационнойБазы", Запись.УзелИнформационнойБазы); + + ДоступностьЭлементов(); + + УстановитьУсловноеОформление(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура МестоХраненияПриИзменении(Элемент) + + Запись.ХранитьНаДиске = МестоХранения; + + ДоступностьЭлементов(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолныйПутьНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Заголовок = НСтр("ru = 'Выбор папки для хранения файлов обмена'"); + ОбработчикЗавершения = Новый ОписаниеОповещения("ПолныйПутьЗавершениеВыбора", ЭтотОбъект); + + ФайловаяСистемаКлиент.ВыбратьКаталог(ОбработчикЗавершения, Заголовок, Запись.ПолныйПуть); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолныйПутьПриИзменении(Элемент) + + ДополнитьПолныйПуть(); + +КонецПроцедуры + +&НаКлиенте +Процедура КоличествоФайловПриИзменении(Элемент) + + Если РазделениеВключено Тогда + Запись.КоличествоФайлов = Мин(Запись.КоличествоФайлов, 1); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Сохранить(Команда) + + ВыделенныеСтроки = Элементы.АрхивСообщенийОбменов.ВыделенныеСтроки; + + Если ВыделенныеСтроки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Периоды = Новый Массив; + Для Каждого Строка Из ВыделенныеСтроки Цикл + СтрокаСписка = Элементы.АрхивСообщенийОбменов.ДанныеСтроки(Строка); + Периоды.Добавить(СтрокаСписка.Период); + КонецЦикла; + + ФайлыДляСкачивания = ПодготовитьФайлыНаСервере(Запись.УзелИнформационнойБазы, Периоды); + Если ФайлыДляСкачивания.Количество() <> 0 Тогда + Заголовок = НСтр("ru = 'Выберите каталог для сохранения файлов'"); + ПараметрыДиалога = Новый ПараметрыДиалогаПолученияФайлов(Заголовок, Истина); + НачатьПолучениеФайловССервера(ФайлыДляСкачивания, ПараметрыДиалога); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьДоступностьПапки(Команда) + ПроверитьДоступностьПапкиНаСервере(); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура УстановитьУсловноеОформление() + + УсловноеОформление.Элементы.Очистить(); + + // Особый цвет шрифта с файлом больше 100 Мб + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("АрхивСообщенийОбменов"); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("АрхивСообщенийОбменов.ФайлБольше100Мб"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветОсобогоТекста); + +КонецПроцедуры + +&НаСервере +Процедура ДоступностьЭлементов() + + Элементы.ГруппаПапка.Доступность = Запись.ХранитьНаДиске; + + Если РазделениеВключено И Не Запись.ХранитьНаДиске Тогда + Элементы.МестоХранения.ОтображениеПодсказки = ОтображениеПодсказки.ОтображатьСправа; + Иначе + Элементы.МестоХранения.ОтображениеПодсказки = ОтображениеПодсказки.Нет + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПолныйПутьЗавершениеВыбора(Результат, ДополнительныеПараметры) Экспорт + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Запись.ПолныйПуть = Результат; + + ДополнитьПолныйПуть(); + +КонецПроцедуры + +&НаСервере +Процедура ПроверитьДоступностьПапкиНаСервере() + + КаталогСправки = Новый Файл(Запись.ПолныйПуть); + Если КаталогСправки.Существует() Тогда + ОбщегоНазначения.СообщитьПользователю(НСтр("ru = 'Каталог доступен'")); + Иначе + ОбщегоНазначения.СообщитьПользователю(НСтр("ru = 'Каталог не доступен'")); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ДополнитьПолныйПуть() + + Если Не ПустаяСтрока(Запись.ПолныйПуть) Тогда + + ПолныйПуть = СокрЛП(Запись.ПолныйПуть); + Запись.ПолныйПуть = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолныйПуть); + + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПодготовитьФайлыНаСервере(УзелИнформационнойБазы, Периоды) + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Архив.ПолноеИмяФайла КАК ПолноеИмяФайла, + | Архив.Период КАК Период, + | Архив.НомерПринятогоСообщения КАК НомерПринятогоСообщения, + | Архив.Хранилище КАК Хранилище, + | Архив.ИмяФайла КАК ИмяФайла, + | Архив.РасширениеФайла КАК РасширениеФайла + |ИЗ + | РегистрСведений.АрхивСообщенийОбменов КАК Архив + |ГДЕ + | Архив.Период В(&Периоды) + | И Архив.УзелИнформационнойБазы = &УзелИнформационнойБазы + | И НЕ Архив.ФайлБольше100Мб"; + + Запрос.УстановитьПараметр("УзелИнформационнойБазы", УзелИнформационнойБазы); + Запрос.УстановитьПараметр("Периоды", Периоды); + + Выборка = Запрос.Выполнить().Выбрать(); + + Результат = Новый Массив; + + Пока Выборка.Следующий() Цикл + + Если Выборка.ПолноеИмяФайла <> "" Тогда + ДвоичныеДанные = Новый ДвоичныеДанные(Выборка.ПолноеИмяФайла); + Иначе + ДвоичныеДанные = Выборка.Хранилище.Получить(); + КонецЕсли; + + Если ДвоичныеДанные = Неопределено Тогда + + Шаблон = НСтр("ru = 'Не обнаружено сообщение №%1 от %2'"); + ТекстСообщения = СтрШаблон(Шаблон, + Выборка.НомерПринятогоСообщения, + Выборка.Период); + + ОбщегоНазначения.СообщитьПользователю(ТекстСообщения); + + Продолжить; + + КонецЕсли; + + Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные); + ИмяФайла = Выборка.ИмяФайла + "." + Выборка.РасширениеФайла; + Результат.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла, Адрес)) + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +#КонецОбласти \ No newline at end of file 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..4e6bc215e --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкиАрхиваСообщенийОбменов/Forms/ФормаСписка/Form.form @@ -0,0 +1,371 @@ + + + + СписокКомпоновщикНастроекПользовательскиеНастройки + 1 + true + true + + true + + + <key>ru</key> + <value>Группа пользовательских настроек</value> + + false + + СписокКомпоновщикНастроекПользовательскиеНастройкиРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + Vertical + WeakSeparation + true + true + Auto + Auto + + + + Список + 3 + + <key>ru</key> + <value>Список</value> + + true + true + + true + + + Список + + true + None + Copy + CopyToClipboard + Create + + УзелИнформационнойБазы + 16 + true + true + + true + + + Список.УзелИнформационнойБазы + + true + + УзелИнформационнойБазыРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 17 + true + + LabelField + Enter + true + Left + true + + true + true + + + + КоличествоФайлов + 19 + true + true + + true + + + Список.КоличествоФайлов + + true + + КоличествоФайловРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + КоличествоФайловКонтекстноеМеню + 20 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ХранитьНаДиске + 22 + true + true + + true + + + Список.ХранитьНаДиске + + true + + ХранитьНаДискеРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ХранитьНаДискеКонтекстноеМеню + 23 + true + + CheckBoxField + Enter + true + Left + true + + + + СжиматьФайлы + 31 + true + true + + true + + + Список.СжиматьФайлы + + true + + СжиматьФайлыРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + СжиматьФайлыКонтекстноеМеню + 32 + true + + CheckBoxField + Enter + true + Left + true + + + None + + СписокКоманднаяПанель + 5 + Left + true + + + СписокСтрокаПоиска + 7 + + СписокСтрокаПоискаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 8 + true + + Список + + true + + + + СписокСостояниеПросмотра + 10 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 11 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 13 + + СписокУправлениеПоискомРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 14 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 4 + true + + true + true + true + true + true + MultiRow +
        true
        + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + AsFileRef + + Список.DefaultPicture + + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + СписокКомпоновщикНастроекПользовательскиеНастройки + +
        + + ФормаКоманднаяПанель + -1 + Left + true + + Copy + Create + DontBlock + true + true + true + Vertical + true + true + true + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
        true
        + + InformationRegister.НастройкиАрхиваСообщенийОбменов + true + true + true + true + +
        + + + + + +
        diff --git a/SSL/src/InformationRegisters/НастройкиАрхиваСообщенийОбменов/ManagerModule.bsl b/SSL/src/InformationRegisters/НастройкиАрхиваСообщенийОбменов/ManagerModule.bsl new file mode 100644 index 000000000..18ed47669 --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкиАрхиваСообщенийОбменов/ManagerModule.bsl @@ -0,0 +1,44 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 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/InformationRegisters/НастройкиАрхиваСообщенийОбменов/НастройкиАрхиваСообщенийОбменов.mdo b/SSL/src/InformationRegisters/НастройкиАрхиваСообщенийОбменов/НастройкиАрхиваСообщенийОбменов.mdo new file mode 100644 index 000000000..378a966a1 --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкиАрхиваСообщенийОбменов/НастройкиАрхиваСообщенийОбменов.mdo @@ -0,0 +1,181 @@ + + + + + + + + + + + + НастройкиАрхиваСообщенийОбменов + + ru + Настройки архива сообщений обменов + + InDialog + InformationRegister.НастройкиАрхиваСообщенийОбменов.Form.ФормаЗаписи + InformationRegister.НастройкиАрхиваСообщенийОбменов.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + КоличествоФайлов + + ru + Количество файлов + + + Number + + 2 + true + + + + + Use + Use + + + + ХранитьНаДиске + + ru + Хранить на диске + + + Boolean + + + + Use + Use + + + + ПолныйПуть + + ru + Полный путь + + + String + + + + ru + Полный путь в UNC формате + + + + Use + Use + + + + ПолныйПутьLinux + + ru + Полный путь linux + + + String + + + + ru + Полный путь в Linux + + + + Use + Use + + + + СжиматьФайлы + + ru + Сжимать файлы + + + Boolean + + + + Use + Use + + + + УзелИнформационнойБазы + + ru + Узел информационной базы + + АПК:1330 универсальный механизм + + ExchangePlanRef + + + + true + Use + Use + true + + true + true + + + ФормаЗаписи + + ru + Форма записи + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/НастройкиВариантовОтчетов/ManagerModule.bsl b/SSL/src/InformationRegisters/НастройкиВариантовОтчетов/ManagerModule.bsl index 694dfd0c3..4abb57880 100644 --- a/SSL/src/InformationRegisters/НастройкиВариантовОтчетов/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/НастройкиВариантовОтчетов/ManagerModule.bsl @@ -146,7 +146,7 @@ #Область ЗапросПользователейВарианта - // АПК:96-вкл При получении результата объединения второго и третьего запросов, в результат могут попасть неуникальные записи. + // АПК:96-выкл При получении результата объединения второго и третьего запросов, в результат могут попасть неуникальные записи. Запрос = Новый Запрос( "ВЫБРАТЬ РАЗРЕШЕННЫЕ @@ -156,6 +156,8 @@ | ВЫБОР | КОГДА ТИПЗНАЧЕНИЯ(Настройки.Пользователь) = ТИП(Справочник.Пользователи) | ТОГДА ""СостояниеПользователя02"" + | КОГДА ТИПЗНАЧЕНИЯ(Настройки.Пользователь) = ТИП(Справочник.ВнешниеПользователи) + | ТОГДА ""СостояниеПользователя08"" | КОГДА ТИПЗНАЧЕНИЯ(Настройки.Пользователь) = ТИП(Справочник.ГруппыВнешнихПользователей) | ТОГДА ""СостояниеПользователя10"" | ИНАЧЕ ""СостояниеПользователя04"" @@ -251,7 +253,7 @@ Запрос.УстановитьПараметр("ИспользоватьВнешнихПользователей", ИспользоватьВнешнихПользователей); Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.АвторизованныйПользователь()); - // АПК:96-выкл При получении результата объединения второго и третьего запросов, в результат могут попасть неуникальные записи. + // АПК:96-вкл При получении результата объединения второго и третьего запросов, в результат могут попасть неуникальные записи. #КонецОбласти @@ -517,8 +519,6 @@ // Процедура ОповеститьПользователейВариантаОтчета(Записи) Экспорт - #Область Проверка - Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда Возврат; КонецЕсли; @@ -533,11 +533,6 @@ МодульОбсуждения = ОбщегоНазначения.ОбщийМодуль("Обсуждения");; УстановитьПривилегированныйРежим(Истина); - - #КонецОбласти - - #Область АнализСостоянияНастроекДоступностиВариантаОтчета - Получатели = Новый Массив; ЭлементОтбора = Записи.Отбор.Найти("Вариант"); @@ -551,39 +546,28 @@ Возврат; КонецЕсли; - #КонецОбласти - - #Область ГенерацияОповещенияНовыхПользователейВариантаОтчета ВариантОтчета = Записи[0].Вариант; - Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Настроен отчет %1'"), ПолучитьНавигационнуюСсылку(ВариантОтчета)); Сообщение = МодульОбсуждения.ОписаниеСообщения(Текст); - Попытка - МодульОбсуждения.ОтправитьСообщение( - Пользователи.ТекущийПользователь(), - Получатели, - Сообщение, - ВариантОтчета); + МодульОбсуждения.ОтправитьСообщение(Пользователи.ТекущийПользователь(), Получатели, + Сообщение, ВариантОтчета); Исключение КодОсновногоЯзыка = ОбщегоНазначения.КодОсновногоЯзыка(); ПредставлениеВариантаОтчета = Строка(ВариантОтчета); - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Варианты отчетов.Оповещение о предоставлении доступа к варианту отчета'", КодОсновногоЯзыка), + НСтр("ru = 'Варианты отчетов'", КодОсновногоЯзыка), УровеньЖурналаРегистрации.Ошибка,, ПредставлениеВариантаОтчета, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; - #КонецОбласти - КонецПроцедуры Функция ПользователиВариантаОтчета(ВариантОтчета, ВыбранныеПользователи = Неопределено) Экспорт @@ -726,7 +710,7 @@ ШаблонКомментария, Вариант.Ссылка, ПредставлениеРегистра, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации( ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), @@ -797,4 +781,4 @@ #КонецОбласти -#КонецЕсли +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/InformationRegisters/НастройкиВерсионированияОбъектов/Forms/НастройкиХраненияИстории/Form.form b/SSL/src/InformationRegisters/НастройкиВерсионированияОбъектов/Forms/НастройкиХраненияИстории/Form.form index b14da1d10..e04cb68c2 100644 --- a/SSL/src/InformationRegisters/НастройкиВерсионированияОбъектов/Forms/НастройкиХраненияИстории/Form.form +++ b/SSL/src/InformationRegisters/НастройкиВерсионированияОбъектов/Forms/НастройкиХраненияИстории/Form.form @@ -844,7 +844,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -946,7 +945,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1012,7 +1010,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1449,6 +1446,38 @@ Auto InAdditionalSubmenu + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 132 + + СтрокаПоискаРасширеннаяПодсказка + 134 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 133 + true + + ДеревоОбъектовМетаданных + + true + + Left true diff --git a/SSL/src/InformationRegisters/НастройкиОбменаДаннымиXDTO/ManagerModule.bsl b/SSL/src/InformationRegisters/НастройкиОбменаДаннымиXDTO/ManagerModule.bsl index b536a939e..af6ce112d 100644 --- a/SSL/src/InformationRegisters/НастройкиОбменаДаннымиXDTO/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/НастройкиОбменаДаннымиXDTO/ManagerModule.bsl @@ -195,7 +195,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать набор записей регистра ""%1"" с отбором %2 по причине: - |%3'"), ПредставлениеРегистра, ПредставлениеОтбора, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + |%3'"), ПредставлениеРегистра, ПредставлениеОтбора, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, МетаданныеРегистра, , ТекстСообщения); diff --git a/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ДобавленияУсловияПоДате/Form.form b/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ДобавлениеУсловияПоДате/Form.form similarity index 99% rename from SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ДобавленияУсловияПоДате/Form.form rename to SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ДобавлениеУсловияПоДате/Form.form index c3bda3faa..bd64717ab 100644 --- a/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ДобавленияУсловияПоДате/Form.form +++ b/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ДобавлениеУсловияПоДате/Form.form @@ -115,7 +115,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаДобавленияУсловияПоДате/Module.bsl b/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ДобавлениеУсловияПоДате/Module.bsl similarity index 100% rename from SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаДобавленияУсловияПоДате/Module.bsl rename to SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ДобавлениеУсловияПоДате/Module.bsl diff --git a/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаЗаписи/Form.form index d1f854d7c..d47038b3c 100644 --- a/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаЗаписи/Form.form @@ -356,6 +356,38 @@ Auto InCommandBarAndInAdditionalSubmenu + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 50 + + СтрокаПоискаРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 51 + true + + ПравилоНастройкиОтбор + + true + + Left true diff --git a/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаЗаписи/Module.bsl b/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаЗаписи/Module.bsl index 5a3867182..8bc71af79 100644 --- a/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаЗаписи/Module.bsl +++ b/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаЗаписи/Module.bsl @@ -44,7 +44,7 @@ &НаКлиенте Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - Если ИсточникВыбора.ИмяФормы = "РегистрСведений.НастройкиОчисткиФайлов.Форма.ФормаДобавленияУсловияПоДате" Тогда + Если ИсточникВыбора.ИмяФормы = "РегистрСведений.НастройкиОчисткиФайлов.Форма.ДобавлениеУсловияПоДате" Тогда ДобавитьВОтборИнтервалИсключение(ВыбранноеЗначение); КонецЕсли; @@ -134,7 +134,7 @@ ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("МассивЗначений", МассивРеквизитовСТипомДата); - ОткрытьФорму("РегистрСведений.НастройкиОчисткиФайлов.Форма.ФормаДобавленияУсловияПоДате", ПараметрыФормы, ЭтотОбъект); + ОткрытьФорму("РегистрСведений.НастройкиОчисткиФайлов.Форма.ДобавлениеУсловияПоДате", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры diff --git a/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаСписка/Form.form index d0100874d..9d009b78f 100644 --- a/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -822,7 +821,6 @@ UsualGroup Vertical - Auto true true Auto @@ -853,7 +851,6 @@ HorizontalIfPossible Center - Auto WeakSeparation true true @@ -1075,7 +1072,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1141,7 +1137,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1498,6 +1493,38 @@ Auto InCommandBarAndInAdditionalSubmenu + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 153 + + СтрокаПоискаРасширеннаяПодсказка + 155 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 154 + true + + ДеревоОбъектовМетаданных + + true + + Left true diff --git a/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/НастройкиОчисткиФайлов.mdo b/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/НастройкиОчисткиФайлов.mdo index f58af8801..a2930ac14 100644 --- a/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/НастройкиОчисткиФайлов.mdo +++ b/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/НастройкиОчисткиФайлов.mdo @@ -200,13 +200,13 @@ ФормаСписка ru - Настройки очистки файлов + Форма списка PersonalComputer MobileDevice
        - ФормаДобавленияУсловияПоДате + ДобавлениеУсловияПоДате ru Добавление условия по дате diff --git a/SSL/src/InformationRegisters/НастройкиПравОбъектов/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/НастройкиПравОбъектов/Forms/ФормаЗаписи/Form.form index 4b08a5b83..c0b6d537f 100644 --- a/SSL/src/InformationRegisters/НастройкиПравОбъектов/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/НастройкиПравОбъектов/Forms/ФормаЗаписи/Form.form @@ -216,7 +216,6 @@ UsualGroup Vertical - Auto true true Auto @@ -420,7 +419,6 @@ UsualGroup Vertical - Auto true true Auto @@ -534,7 +532,6 @@ UsualGroup Vertical - Auto true true Auto @@ -648,7 +645,6 @@ UsualGroup Vertical - Auto true true Auto @@ -677,7 +673,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -706,7 +701,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/НастройкиПравОбъектов/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/НастройкиПравОбъектов/Forms/ФормаСписка/Form.form index b6c7a40ec..18de46345 100644 --- a/SSL/src/InformationRegisters/НастройкиПравОбъектов/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/НастройкиПравОбъектов/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаДобавленияУсловияПоДате/Form.form b/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ДобавлениеУсловияПоДате/Form.form similarity index 99% rename from SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаДобавленияУсловияПоДате/Form.form rename to SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ДобавлениеУсловияПоДате/Form.form index c3bda3faa..bd64717ab 100644 --- a/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаДобавленияУсловияПоДате/Form.form +++ b/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ДобавлениеУсловияПоДате/Form.form @@ -115,7 +115,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ДобавленияУсловияПоДате/Module.bsl b/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ДобавлениеУсловияПоДате/Module.bsl similarity index 100% rename from SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ДобавленияУсловияПоДате/Module.bsl rename to SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ДобавлениеУсловияПоДате/Module.bsl diff --git a/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/НастройкиСинхронизацииФайлов/Form.form b/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/НастройкиСинхронизацииФайлов/Form.form index 88b672caf..4820e20ef 100644 --- a/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/НастройкиСинхронизацииФайлов/Form.form +++ b/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/НастройкиСинхронизацииФайлов/Form.form @@ -774,7 +774,6 @@ HorizontalIfPossible Center - Auto true true Auto @@ -840,7 +839,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -1092,6 +1090,38 @@ + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 119 + + СтрокаПоискаРасширеннаяПодсказка + 121 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 120 + true + + ДеревоОбъектовМетаданных + + true + + Left true diff --git a/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/НастройкиСинхронизацииФайлов/Module.bsl b/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/НастройкиСинхронизацииФайлов/Module.bsl index 91c37410c..543dd3f11 100644 --- a/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/НастройкиСинхронизацииФайлов/Module.bsl +++ b/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/НастройкиСинхронизацииФайлов/Module.bsl @@ -524,7 +524,6 @@ Процедура ОткрытьФормуНастроек() ТекущиеДанные = Элементы.ДеревоОбъектовМетаданных.ТекущиеДанные; - Если Не ЗначениеЗаполнено(ТекущиеДанные.ВладелецФайла) Или Не ЗначениеЗаполнено(ТекущиеДанные.ТипВладельцаФайла) Тогда Возврат; @@ -536,20 +535,16 @@ Отбор.Вставить("УчетнаяЗапись", ТекущиеДанные.УчетнаяЗапись); Если ЗначениеЗаполнено(ТекущиеДанные.УчетнаяЗапись) Тогда - - ТипЗначения = Тип("РегистрСведенийКлючЗаписи.НастройкиСинхронизацииФайлов"); - ПараметрыКлюча = Новый Массив(1); - ПараметрыКлюча[0] = Отбор; - - КлючЗаписи = Новый(ТипЗначения, ПараметрыКлюча); + ПараметрыКлюча = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Отбор); + КлючЗаписи = Новый(Тип("РегистрСведенийКлючЗаписи.НастройкиСинхронизацииФайлов"), ПараметрыКлюча); ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("Ключ", КлючЗаписи); + ПараметрыФормы.Вставить("ЗапрещатьИзменятьУчетнуюЗапись", Истина); Иначе ПараметрыФормы = Отбор; ПараметрыФормы.Вставить("ЭтоФайл", ТекущиеДанные.ЭтоФайл); КонецЕсли; - ПараметрыФормы.Вставить("ЗапрещатьИзменятьУчетнуюЗапись", Истина); ДополнительныеПараметры = Новый Структура(); Если ТекущиеДанные.ВозможностьДетализации Тогда diff --git a/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ФормаЗаписиНастройки/Form.form b/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ФормаЗаписиНастройки/Form.form index d9788acd9..2934e21db 100644 --- a/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ФормаЗаписиНастройки/Form.form +++ b/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ФормаЗаписиНастройки/Form.form @@ -117,7 +117,6 @@ UsualGroup Vertical - Auto true true Auto @@ -256,7 +255,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -337,7 +335,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -562,6 +559,38 @@ Auto InAdditionalSubmenu + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 163 + + СтрокаПоискаРасширеннаяПодсказка + 165 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 164 + true + + ПравилоНастройкиОтбор + + true + + Left @@ -925,7 +954,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ФормаЗаписиНастройки/Module.bsl b/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ФормаЗаписиНастройки/Module.bsl index b939f03e5..dc098a59b 100644 --- a/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ФормаЗаписиНастройки/Module.bsl +++ b/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ФормаЗаписиНастройки/Module.bsl @@ -168,7 +168,7 @@ &НаКлиенте Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - Если ИсточникВыбора.ИмяФормы = "РегистрСведений.НастройкиСинхронизацииФайлов.Форма.ДобавленияУсловияПоДате" Тогда + Если ИсточникВыбора.ИмяФормы = "РегистрСведений.НастройкиСинхронизацииФайлов.Форма.ДобавлениеУсловияПоДате" Тогда ДобавитьВОтборИнтервалИсключение(ВыбранноеЗначение); КонецЕсли; @@ -282,7 +282,7 @@ ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("МассивЗначений", МассивРеквизитовСТипомДата); - ОткрытьФорму("РегистрСведений.НастройкиСинхронизацииФайлов.Форма.ДобавленияУсловияПоДате", ПараметрыФормы, ЭтотОбъект); + ОткрытьФорму("РегистрСведений.НастройкиСинхронизацииФайлов.Форма.ДобавлениеУсловияПоДате", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры diff --git a/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/НастройкиСинхронизацииФайлов.mdo b/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/НастройкиСинхронизацииФайлов.mdo index 5379ed1bb..4d0114bd5 100644 --- a/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/НастройкиСинхронизацииФайлов.mdo +++ b/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/НастройкиСинхронизацииФайлов.mdo @@ -199,7 +199,7 @@ MobileDevice - ДобавленияУсловияПоДате + ДобавлениеУсловияПоДате ru Добавление условия по дате diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/НастройкаПодключенияКСервису/Form.form b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/НастройкаПодключенияКСервису/Form.form index d9b76cbfe..f4a83c79a 100644 --- a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/НастройкаПодключенияКСервису/Form.form +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/НастройкаПодключенияКСервису/Form.form @@ -160,7 +160,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -266,7 +265,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -295,7 +293,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/НастройкаПодключенияКСервису/Module.bsl b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/НастройкаПодключенияКСервису/Module.bsl index 90302ee48..63404d6fc 100644 --- a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/НастройкаПодключенияКСервису/Module.bsl +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/НастройкаПодключенияКСервису/Module.bsl @@ -123,7 +123,7 @@ КонецЕсли; СообщениеПользователю = ""; - Если Не ОбменДаннымиСервер.ЕстьПодключениеККорреспонденту(Запись.Корреспондент, ПараметрыПодключения, СообщениеПользователю) Тогда + Если Не ОбменДаннымиВебСервис.ЕстьПодключениеККорреспонденту(Запись.Корреспондент, ПараметрыПодключения, СообщениеПользователю) Тогда ОбщегоНазначения.СообщитьПользователю(СообщениеПользователю,, "WSПароль",, Отказ); Иначе // Проверка подключения прошла успешно, записываем пароль, если он был изменен diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ПовторнаяСинхронизацияДанныхПередЗапуском/Form.form b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ПовторнаяСинхронизацияДанныхПередЗапуском/Form.form index c2d96c676..a80141670 100644 --- a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ПовторнаяСинхронизацияДанныхПередЗапуском/Form.form +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ПовторнаяСинхронизацияДанныхПередЗапуском/Form.form @@ -534,7 +534,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ПовторнаяСинхронизацияДанныхПередЗапуском/Module.bsl b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ПовторнаяСинхронизацияДанныхПередЗапуском/Module.bsl index 90849fb59..8f9118e8d 100644 --- a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ПовторнаяСинхронизацияДанныхПередЗапуском/Module.bsl +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ПовторнаяСинхронизацияДанныхПередЗапуском/Module.bsl @@ -176,7 +176,7 @@ // сделать выгрузку в режиме 1С:Предприятия. КлючСообщенияЖурналаРегистрации = ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(); ЗаписьЖурналаРегистрации(КлючСообщенияЖурналаРегистрации, - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; ИначеЕсли КонфигурацияИзменена() Тогда @@ -257,7 +257,7 @@ Исключение ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры @@ -269,7 +269,7 @@ ЗагрузитьСообщениеПередОбновлениемИнформационнойБазы(); Исключение ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЕстьОшибки = Истина; КонецПопытки; @@ -398,7 +398,7 @@ ЗагрузитьПриоритетныеДанныеВПодчиненныйУзелРИБ(); Исключение ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЕстьОшибки = Истина; КонецПопытки; @@ -669,13 +669,13 @@ УстановитьПривилегированныйРежим(Истина); Попытка - ФайлСообщенияОбмена = ОбменДаннымиСервер.ПолучитьФайлИзХранилищаВСервисе(Новый УникальныйИдентификатор(ИдентификаторФайла), + ФайлСообщенияОбмена = ОбменДаннымиВебСервис.ПолучитьФайлИзХранилищаВСервисе(Новый УникальныйИдентификатор(ИдентификаторФайла), УзелИнформационнойБазы,, ПараметрыАутентификации); Исключение ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбменаСОшибкой(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных, ДатаНачалаОперации, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЕстьОшибки = Истина; Возврат; КонецПопытки; @@ -687,7 +687,7 @@ УдалитьФайлы(ФайлСообщенияОбмена); Исключение ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Попытка @@ -713,7 +713,7 @@ Исключение ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЕстьОшибки = Истина; КонецПопытки; @@ -736,10 +736,10 @@ СообщениеОбОшибке); Исключение Информация = ИнформацияОбОшибке(); - СообщениеОбОшибке = КраткоеПредставлениеОшибки(Информация); + СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация); ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(Информация)); + УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация)); КонецПопытки; Возврат СостояниеОперации; diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ФормаЗаписи/Form.form index 4138fb890..59b0748e9 100644 --- a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ФормаЗаписи/Form.form @@ -492,7 +492,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -748,7 +747,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -777,7 +775,6 @@ UsualGroup Vertical - Auto true true Auto @@ -785,25 +782,19 @@ - WSИспользоватьПередачуБольшогоОбъемаДанных - 204 + WSКонечнаяТочкаКорреспондента + 210 true true true - Запись.WSИспользоватьПередачуБольшогоОбъемаДанных + WSКонечнаяТочкаКорреспондента - Right - - ru - Рекомендуется использовать в тех случаях, если в синхронизации участвует более одного объекта (справочника, документа). - - Button - WSИспользоватьПередачуБольшогоОбъемаДанныхРасширеннаяПодсказка - 206 + WSКонечнаяТочкаКорреспондентаРасширеннаяПодсказка + 212 Label true true @@ -812,16 +803,71 @@ - WSИспользоватьПередачуБольшогоОбъемаДанныхКонтекстноеМеню - 205 + WSКонечнаяТочкаКорреспондентаКонтекстноеМеню + 211 true - CheckBoxField + InputField + true Enter true Left true - + + true + true + true + true + true + true + Normal + + + + WSОбластьДанныхКорреспондента + 207 + + <key>ru</key> + <value>Область данных</value> + + true + true + + true + + + Запись.WSОбластьДанныхКорреспондента + + + WSОбластьДанныхКорреспондентаРасширеннаяПодсказка + 209 + Label + true + true + + Left + + + + WSОбластьДанныхКорреспондентаКонтекстноеМеню + 208 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + ПараметрыДоступаВИнтернет @@ -1063,7 +1109,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1278,7 +1323,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1397,7 +1441,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1504,7 +1547,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1679,7 +1721,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -1930,7 +1971,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -2044,7 +2084,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -2544,6 +2583,24 @@ + + WSКонечнаяТочкаКорреспондента + + <key>ru</key> + <value>Конечная точка</value> + + 12 + + String + + + + true + + + true + + ПроверитьПодключениеFTP diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ФормаЗаписи/Module.bsl b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ФормаЗаписи/Module.bsl index 255156f9c..29e9060f2 100644 --- a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ФормаЗаписи/Module.bsl +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ФормаЗаписи/Module.bsl @@ -14,7 +14,7 @@ ЗаполнитьДоступныеВидыТранспорта(); СобытиеЖурналаРегистрацииУстановкаПодключенияКWebСервису = - ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУстановкаПодключенияКWebСервису(); + ОбменДаннымиВебСервис.СобытиеЖурналаРегистрацииУстановкаПодключенияКWebСервису(); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда Элементы.ПараметрыДоступаВИнтернет.Видимость = Истина; @@ -36,6 +36,31 @@ КонецЦикла; КонецЕсли; + Если ОбщегоНазначения.РазделениеВключено() Тогда + + Если ЗначениеЗаполнено(Запись.WSКонечнаяТочкаКорреспондента) Тогда + Элементы.WSURLВебСервиса.Видимость = Ложь; + Элементы.ПользовательИПарольWS.Видимость = Ложь; + Элементы.ПараметрыДоступаВИнтернет.Видимость = Ложь; + + УстановитьПривилегированныйРежим(Истина); + WSКонечнаяТочкаКорреспондента = Строка(Запись.WSКонечнаяТочкаКорреспондента); + УстановитьПривилегированныйРежим(Истина); + Иначе + Элементы.WSКонечнаяТочкаКорреспондента.Видимость = Ложь; + Элементы.WSОбластьДанныхКорреспондента.Видимость = Ложь; + КонецЕсли; + + Элементы.ПроверитьПодключениеWS.Видимость = Ложь; + Элементы.WSОбластьДанныхКорреспондента.ТолькоПросмотр = Не Пользователи.ЭтоПолноправныйПользователь(, Истина); + + Иначе + + Элементы.WSКонечнаяТочкаКорреспондента.Видимость = Ложь; + Элементы.WSОбластьДанныхКорреспондента.Видимость = Ложь; + + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -361,7 +386,7 @@ КонецЕсли; СообщениеПользователю = ""; - Если Не ОбменДаннымиСервер.ЕстьПодключениеККорреспонденту(Запись.Корреспондент, ПараметрыПодключения, СообщениеПользователю) Тогда + Если Не ОбменДаннымиВебСервис.ЕстьПодключениеККорреспонденту(Запись.Корреспондент, ПараметрыПодключения, СообщениеПользователю) Тогда ОбщегоНазначения.СообщитьПользователю(СообщениеПользователю,,,, Отказ); КонецЕсли; diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ФормаСписка/Form.form index 543e5ef71..1e8c16207 100644 --- a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Help/ru.html b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Help/ru.html index d90bbf350..cc02113ec 100644 --- a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Help/ru.html +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Help/ru.html @@ -25,6 +25,6 @@ </li><li>Укажите <strong>Максимальный размер файла</strong>, для того чтобы ограничить объем пересылаемого сообщения. </li><li>При необходимости включите флажок <strong>Пассивное соединение</strong>. </li><li>Перейдите по ссылке <strong>Параметры доступа в Интернет</strong>, для того чтобы настроить параметры прокси-сервера.</li></ul><h3>Почтовые сообщения</h3> -<ul><li>В поле <strong>Учетная запись электронной почты</strong> выберите из <a href="Catalog.УчетныеЗаписиЭлектроннойПочты/Help">списка</a> нужную <a href="Catalog.УчетныеЗаписиЭлектроннойПочты.Form.ФормаЭлемента/Help">учетную запись</a> или введите новую. +<ul><li>В поле <strong>Учетная запись электронной почты</strong> выберите элемент из списка или создайте новый. </li><li>Укажите <strong>Допустимый размер вложения письма</strong>, для того чтобы ограничить объем пересылаемого сообщения.</li></ul><h3>См. также:</h3> <ul><li><a href="v8help://frame/form_common">Работа с формами</a>.</li></ul></body></html> \ No newline at end of file diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/ManagerModule.bsl b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/ManagerModule.bsl index b39818c85..a6f4e49c3 100644 --- a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/ManagerModule.bsl @@ -64,6 +64,19 @@ СтруктураНастроек = СоставНастроекТранспортаОбмена("WS"); Результат = ПолучитьДанныеРегистраПоСтруктуре(Корреспондент, СтруктураНастроек); + Результат.Вставить("ИдентификаторИнформационнойБазыИсточника", ""); + + Если ЗначениеЗаполнено(Результат.WSКонечнаяТочкаКорреспондента) Тогда + + МодульНастройкиТранспортаОбменаСообщениями = ОбщегоНазначения.ОбщийМодуль("РегистрыСведений.НастройкиТранспортаОбменаСообщениями"); + Настройки = МодульНастройкиТранспортаОбменаСообщениями.НастройкиТранспортаWS(Результат.WSКонечнаяТочкаКорреспондента); + + Результат.Вставить("WSПароль"); + ЗаполнитьЗначенияСвойств(Результат, Настройки); + Возврат Результат; + + КонецЕсли; + WSПароль = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Корреспондент, "WSПароль"); УстановитьПривилегированныйРежим(Ложь); @@ -102,8 +115,6 @@ Результат.WSПароль = ПараметрыАутентификации; КонецЕсли; - Результат.Вставить("ИдентификаторИнформационнойБазыИсточника", ""); - Возврат Результат; КонецФункции @@ -620,7 +631,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать набор записей регистра ""%1"" с отбором ""УзелИнформационнойБазы = %2"" по причине: - |%3'"), ПредставлениеРегистра, Выборка.УзелИнформационнойБазы, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + |%3'"), ПредставлениеРегистра, Выборка.УзелИнформационнойБазы, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, МетаданныеРегистра, , ТекстСообщения); diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/НастройкиТранспортаОбменаДанными.mdo b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/НастройкиТранспортаОбменаДанными.mdo index 6efd60396..ed141d2ab 100644 --- a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/НастройкиТранспортаОбменаДанными.mdo +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/НастройкиТранспортаОбменаДанными.mdo @@ -220,7 +220,7 @@ <value>Учетная запись электронной почты</value> </synonym> <type> - <types>CatalogRef.УчетныеЗаписиЭлектроннойПочты</types> + <types>DefinedType.ОбменДаннымиУчетныеЗаписиЭлектроннойПочты</types> </type> <toolTip> <key>ru</key> @@ -534,6 +534,24 @@ <value>true</value> </fillValue> </resources> + <resources uuid="e59e9cfc-43b2-4bdf-a512-b6f87f781cee"> + <name>WSОбластьДанныхКорреспондента</name> + <synonym> + <key>ru</key> + <value>WS Область данных корреспондента</value> + </synonym> + <type> + <types>Number</types> + <numberQualifiers> + <precision>7</precision> + </numberQualifiers> + </type> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + <fillValue xsi:type="core:UndefinedValue"/> + </resources> <resources uuid="eb551461-ae0d-41dd-89fa-2f6e7f3c4840"> <name>ВидТранспортаСообщенийОбменаПоУмолчанию</name> <synonym> @@ -614,6 +632,22 @@ <dataHistory>Use</dataHistory> <fillValue xsi:type="core:UndefinedValue"/> </resources> + <resources uuid="178342fd-1ba5-422d-89d2-4f486e45dae9"> + <name>WSКонечнаяТочкаКорреспондента</name> + <synonym> + <key>ru</key> + <value>WS Конечная точка корреспондента</value> + </synonym> + <comment>Используется только в сервисе и только при автоматической настройки через внутреннюю публикацию</comment> + <type> + <types>DefinedType.КонечнаяТочкаОбменаСообщениями</types> + </type> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <dataHistory>Use</dataHistory> + <fillValue xsi:type="core:UndefinedValue"/> + </resources> <dimensions uuid="7e9fadd6-d0ad-4856-a195-1058f00bf488"> <name>Корреспондент</name> <synonym> diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаОбластейДанных/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаОбластейДанных/Forms/ФормаЗаписи/Form.form index 37ae5cf02..72780ecb6 100644 --- a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаОбластейДанных/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаОбластейДанных/Forms/ФормаЗаписи/Form.form @@ -236,7 +236,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -383,7 +382,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -501,7 +499,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -604,7 +601,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -776,7 +772,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаОбластейДанных/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаОбластейДанных/Forms/ФормаСписка/Form.form index 648fdd9dc..0f6856378 100644 --- a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаОбластейДанных/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаОбластейДанных/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаОбластиДанных/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаОбластиДанных/Forms/ФормаСписка/Form.form index 00ced35a6..1d59f4c22 100644 --- a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаОбластиДанных/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаОбластиДанных/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаОбластиДанных/ManagerModule.bsl b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаОбластиДанных/ManagerModule.bsl index 68a693ad5..ab9ecd948 100644 --- a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаОбластиДанных/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаОбластиДанных/ManagerModule.bsl @@ -33,7 +33,9 @@ | НастройкиТранспортаОбластейДанных.FTPСоединениеПорт, | НастройкиТранспортаОбластейДанных.ВидТранспортаСообщенийОбменаПоУмолчанию, | НастройкиТранспорта.АдресВебСервиса КАК WSURLВебСервиса, - | НастройкиТранспорта.ИмяПользователя КАК WSИмяПользователя + | НастройкиТранспорта.ИмяПользователя КАК WSИмяПользователя, + | """" КАК WSОбластьДанныхКорреспондента, + | """" КАК WSКонечнаяТочкаКорреспондента |ИЗ | РегистрСведений.НастройкиТранспортаОбменаОбластиДанных КАК НастройкиТранспортаОбластиДанных | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиТранспортаОбменаОбластейДанных КАК НастройкиТранспортаОбластейДанных diff --git a/SSL/src/InformationRegisters/НастройкиУчетныхЗаписейЭлектроннойПочты/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/НастройкиУчетныхЗаписейЭлектроннойПочты/Forms/ФормаЗаписи/Form.form index 40e8e0ed5..2c2146086 100644 --- a/SSL/src/InformationRegisters/НастройкиУчетныхЗаписейЭлектроннойПочты/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/НастройкиУчетныхЗаписейЭлектроннойПочты/Forms/ФормаЗаписи/Form.form @@ -97,7 +97,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -166,7 +165,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -354,7 +352,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -429,7 +426,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -572,7 +568,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -732,7 +727,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -956,7 +950,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1114,7 +1107,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1339,7 +1331,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/InformationRegisters/НастройкиУчетныхЗаписейЭлектроннойПочты/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/НастройкиУчетныхЗаписейЭлектроннойПочты/Forms/ФормаСписка/Form.form index 3f90d5f01..5c9e56b38 100644 --- a/SSL/src/InformationRegisters/НастройкиУчетныхЗаписейЭлектроннойПочты/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/НастройкиУчетныхЗаписейЭлектроннойПочты/Forms/ФормаСписка/Form.form @@ -30,7 +30,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаНаУровнеЗаписей/Form.form b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаНаУровнеЗаписей/Form.form index 98527c9d7..fd8209601 100644 --- a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаНаУровнеЗаписей/Form.form +++ b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаНаУровнеЗаписей/Form.form @@ -90,7 +90,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -188,7 +187,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -327,7 +325,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -454,7 +451,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -620,7 +616,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -798,7 +793,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -925,7 +919,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1080,7 +1073,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1252,7 +1244,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1424,7 +1415,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1562,7 +1552,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1985,7 +1974,6 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2014,7 +2002,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <verticalAlign>Center</verticalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -2027,6 +2014,40 @@ <items xsi:type="form:FormGroup"> <name>РасчетПрогрессаПоКоличествуДанных</name> <id>282</id> + <items xsi:type="form:Addition"> + <title> + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 339 + + СтрокаПоискРасширеннаяПодсказка + 341 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 340 + true + + Списки + + 15 + true + false + + РассчитыватьПоКоличествуДанных 93 @@ -2325,7 +2346,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto diff --git a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаНаУровнеЗаписей/Module.bsl b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаНаУровнеЗаписей/Module.bsl index fda078500..1be00c707 100644 --- a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаНаУровнеЗаписей/Module.bsl +++ b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаНаУровнеЗаписей/Module.bsl @@ -164,13 +164,9 @@ СтандартнаяОбработка = Ложь; Если НавигационнаяСсылкаФорматированнойСтроки = "ПоказатьТекстОшибки" Тогда - #Если МобильныйКлиент Тогда - ПоказатьПредупреждение(, ТекстОшибкиОбновленияДоступа); - #Иначе ТекстовыйДокумент = Новый ТекстовыйДокумент; ТекстовыйДокумент.УстановитьТекст(ТекстОшибкиОбновленияДоступа); ТекстовыйДокумент.Показать(НСтр("ru = 'Ошибка обновления доступа'")); - #КонецЕсли КонецЕсли; КонецПроцедуры @@ -909,11 +905,7 @@ ХранимыеДанные = ПолучитьИзВременногоХранилища(АдресХранимыхДанных); Иначе ЗапускПриОткрытии = Истина; - ХранимыеДанные = Новый Структура; - ХранимыеДанные.Вставить("СтрокиСписков", Новый Соответствие); - ХранимыеДанные.Вставить("СвойстваСписков", Новый Соответствие); - ХранимыеДанные.Вставить("КоличествоКлючей", 0); - ХранимыеДанные.Вставить("ДатаПоследнегоОбновления", '00010101'); + ХранимыеДанные = УправлениеДоступомСлужебный.НовыеХранимыеДанныеОбновленияПрогресса(); АдресХранимыхДанных = ПоместитьВоВременноеХранилище(ХранимыеДанные, ИдентификаторФормы); КонецЕсли; @@ -975,7 +967,7 @@ Исключение ИдентификаторЗаданияОбновленияПрогресса = Неопределено; Контекст = Новый Структура("СостояниеЗаданияОбновленияДоступа", СостояниеЗаданияОбновленияДоступа()); - Контекст.Вставить("ТекстОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Контекст.Вставить("ТекстОшибки", ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат Истина; КонецПопытки; Если Не ЗаданиеВыполнено Тогда diff --git a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаРучноеУправление/Form.form b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаРучноеУправление/Form.form index 09fa4ce0d..f209797f8 100644 --- a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаРучноеУправление/Form.form +++ b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаРучноеУправление/Form.form @@ -175,7 +175,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -204,7 +203,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -216,6 +214,360 @@ ГруппаПланированиеОбновлениеДоступа 11 + + СпискиДляОбновления + 18 + + <key>ru</key> + <value>Списки для обновления</value> + + true + true + + true + + + СпискиДляОбновления + + None + + СпискиДляОбновленияГруппа + 53 + + СпискиДляОбновленияПометка + 34 + + <key>ru</key> + <value>Пометка</value> + + true + true + + true + + + СпискиДляОбновления.Check + + + СпискиДляОбновленияПометкаРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + СпискиДляОбновленияПометкаКонтекстноеМеню + 35 + true + + CheckBoxField + Auto + true + Left + true + + + + СпискиДляОбновленияПредставление + 31 + + <key>ru</key> + <value>Представление</value> + + true + true + + true + + + СпискиДляОбновления.Presentation + + + СпискиДляОбновленияПредставлениеРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + СпискиДляОбновленияПредставлениеКонтекстноеМеню + 32 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Списки для обновления группа</value> + + + СпискиДляОбновленияГруппаРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + СпискиДляОбновленияКоманднаяПанель + 20 + + СпискиДляОбновленияГруппаКомандФлажки + 70 + + СпискиДляОбновленияУстановитьФлажки + 39 + true + true + + true + + + СпискиДляОбновленияУстановитьФлажкиРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + Form.Item.СпискиДляОбновления.StandardCommand.CheckAll + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + СпискиДляОбновленияСнятьФлажки + 41 + true + true + + true + + + СпискиДляОбновленияСнятьФлажкиРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + Form.Item.СпискиДляОбновления.StandardCommand.UncheckAll + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Списки для обновления группа команд флажки</value> + + + СпискиДляОбновленияГруппаКомандФлажкиРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + + Compact + + + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиск + 67 + + СтрокаПоискРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + + СтрокаПоискКонтекстноеМеню + 68 + true + + СпискиДляОбновления + + true + + + Left + + + СпискиДляОбновленияСтрокаПоиска + 22 + + СпискиДляОбновленияСтрокаПоискаРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + СпискиДляОбновленияСтрокаПоискаКонтекстноеМеню + 23 + true + + СпискиДляОбновления + + true + + + + СпискиДляОбновленияСостояниеПросмотра + 25 + + СпискиДляОбновленияСостояниеПросмотраРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + СпискиДляОбновленияСостояниеПросмотраКонтекстноеМеню + 26 + true + + ViewStatusAddition + СпискиДляОбновления + + true + + + + СпискиДляОбновленияУправлениеПоиском + 28 + + СпискиДляОбновленияУправлениеПоискомРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + СпискиДляОбновленияУправлениеПоискомКонтекстноеМеню + 29 + true + + SearchControlAddition + СпискиДляОбновления + + true + + + + СпискиДляОбновленияРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + СпискиДляОбновленияКонтекстноеМеню + 19 + true + + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + + СпискиДляОбновления.Picture + + true + ОбновитьКлючиДоступаКЭлементамДанных 58 @@ -342,296 +694,21 @@ true - - СпискиДляОбновления - 18 + + ЗапланироватьОбновлениеДоступаСписков + 37 <key>ru</key> - <value>Списки для обновления</value> + <value>Запланировать обновление</value> true true true - - СпискиДляОбновления - - None - - СпискиДляОбновленияГруппа - 53 - - СпискиДляОбновленияПометка - 34 - - <key>ru</key> - <value>Пометка</value> - - true - true - - true - - - СпискиДляОбновления.Check - - - СпискиДляОбновленияПометкаРасширеннаяПодсказка - 36 - Label - true - true - - Left - - - - СпискиДляОбновленияПометкаКонтекстноеМеню - 35 - true - - CheckBoxField - Auto - true - Left - true - - - - СпискиДляОбновленияПредставление - 31 - - <key>ru</key> - <value>Представление</value> - - true - true - - true - - - СпискиДляОбновления.Presentation - - - СпискиДляОбновленияПредставлениеРасширеннаяПодсказка - 33 - Label - true - true - - Left - - - - СпискиДляОбновленияПредставлениеКонтекстноеМеню - 32 - true - - InputField - true - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Списки для обновления группа</value> - - - СпискиДляОбновленияГруппаРасширеннаяПодсказка - 54 - Label - true - true - - Left - - - ColumnGroup - - auto - true - - - - СпискиДляОбновленияКоманднаяПанель - 20 - - СпискиДляОбновленияУстановитьФлажки - 39 - true - true - - true - - - СпискиДляОбновленияУстановитьФлажкиРасширеннаяПодсказка - 40 - Label - true - true - - Left - - - Form.Item.СпискиДляОбновления.StandardCommand.CheckAll - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu - - - СпискиДляОбновленияСнятьФлажки - 41 - true - true - - true - - - СпискиДляОбновленияСнятьФлажкиРасширеннаяПодсказка - 42 - Label - true - true - - Left - - - Form.Item.СпискиДляОбновления.StandardCommand.UncheckAll - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu - - - СпискиЗапланироватьОбновлениеДоступаСписков - 37 - - <key>ru</key> - <value>Запланировать обновление</value> - - true - true - - true - - - СпискиЗапланироватьОбновлениеДоступаСписковРасширеннаяПодсказка - 38 - Label - true - true - - Left - - - Form.Command.ЗапланироватьОбновлениеДоступаСписков - Normal - Auto - true - true - UserCmds - Auto - - Left - - - СпискиДляОбновленияСтрокаПоиска - 22 - - СпискиДляОбновленияСтрокаПоискаРасширеннаяПодсказка - 24 - Label - true - true - - Left - - - - СпискиДляОбновленияСтрокаПоискаКонтекстноеМеню - 23 - true - - СпискиДляОбновления - - true - - - - СпискиДляОбновленияСостояниеПросмотра - 25 - - СпискиДляОбновленияСостояниеПросмотраРасширеннаяПодсказка - 27 - Label - true - true - - Left - - - - СпискиДляОбновленияСостояниеПросмотраКонтекстноеМеню - 26 - true - - ViewStatusAddition - СпискиДляОбновления - - true - - - - СпискиДляОбновленияУправлениеПоиском - 28 - - СпискиДляОбновленияУправлениеПоискомРасширеннаяПодсказка - 30 - Label - true - true - - Left - - - - СпискиДляОбновленияУправлениеПоискомКонтекстноеМеню - 29 - true - - SearchControlAddition - СпискиДляОбновления - - true - - - СпискиДляОбновленияРасширеннаяПодсказка - 21 + ЗапланироватьОбновлениеДоступаСписковРасширеннаяПодсказка + 38 Label true true @@ -639,33 +716,14 @@ Left - - СпискиДляОбновленияКонтекстноеМеню - 19 - true - + UsualButton + Form.Command.ЗапланироватьОбновлениеДоступаСписков + Normal + Auto true true - true - MultiRow - 1 - 1 - AutoUse - AutoUse - true - true - false - false - false - true - Auto - Auto - true - true - - СпискиДляОбновления.Picture - - true + UserCmds + Auto true true @@ -689,7 +747,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ФормаСписка/Form.form index 8464f1faf..4f11880e6 100644 --- a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаПользователей/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаПользователей/Forms/ФормаСписка/Form.form index c252f4eea..2cc4294d1 100644 --- a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаПользователей/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаПользователей/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаТекущиеЗадания/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаТекущиеЗадания/Forms/ФормаСписка/Form.form index 26a62823c..ae2efed45 100644 --- a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаТекущиеЗадания/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаТекущиеЗадания/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаТекущиеЗадания/Forms/ФормаСписка/Module.bsl b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаТекущиеЗадания/Forms/ФормаСписка/Module.bsl index 7681cde0b..fbd0ec90f 100644 --- a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаТекущиеЗадания/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаТекущиеЗадания/Forms/ФормаСписка/Module.bsl @@ -63,7 +63,7 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); ТекстРезультата = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось отменить фоновое задание по причине: - |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ОбработчикиОбновления/Forms/ПерезапускОтложенногоОбновления/Form.form b/SSL/src/InformationRegisters/ОбработчикиОбновления/Forms/ПерезапускОтложенногоОбновления/Form.form index 9a1d32a8b..8ba767c4a 100644 --- a/SSL/src/InformationRegisters/ОбработчикиОбновления/Forms/ПерезапускОтложенногоОбновления/Form.form +++ b/SSL/src/InformationRegisters/ОбработчикиОбновления/Forms/ПерезапускОтложенногоОбновления/Form.form @@ -147,7 +147,6 @@ UsualGroup Vertical - Auto true true Auto @@ -176,7 +175,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto diff --git a/SSL/src/InformationRegisters/ОбработчикиОбновления/Forms/ФормаВыбора/Form.form b/SSL/src/InformationRegisters/ОбработчикиОбновления/Forms/ФормаВыбора/Form.form index 458bb9bdf..cde7d9e09 100644 --- a/SSL/src/InformationRegisters/ОбработчикиОбновления/Forms/ФормаВыбора/Form.form +++ b/SSL/src/InformationRegisters/ОбработчикиОбновления/Forms/ФормаВыбора/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ОбработчикиОбновления/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ОбработчикиОбновления/Forms/ФормаЗаписи/Form.form index 04b720951..eff75605f 100644 --- a/SSL/src/InformationRegisters/ОбработчикиОбновления/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/ОбработчикиОбновления/Forms/ФормаЗаписи/Form.form @@ -197,7 +197,6 @@ UsualGroup Vertical - Auto true true Auto @@ -311,7 +310,6 @@ UsualGroup Vertical - Auto true true Auto @@ -340,7 +338,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -491,7 +488,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -534,6 +530,47 @@ true + + Порядок + 100 + true + true + + true + + + Запись.Порядок + + + ПорядокРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + + ПорядокКонтекстноеМеню + 101 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + true true @@ -556,7 +593,6 @@ UsualGroup Vertical - Auto true true DontUse @@ -855,7 +891,6 @@ UsualGroup AlwaysHorizontal - Auto true true DontUse @@ -1054,7 +1089,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1209,7 +1243,6 @@ UsualGroup Vertical - Auto true true Auto @@ -1238,7 +1271,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -1366,6 +1398,117 @@ Normal + + ДлительностьРегистрацииДанных + 103 + + <key>ru</key> + <value>Длительность регистрации, секунд</value> + + true + true + + true + + + Запись.ДлительностьРегистрацииДанных + + + ДлительностьРегистрацииДанныхРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + + ДлительностьРегистрацииДанныхКонтекстноеМеню + 104 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ИспользуетсяРазделениеПоКритичности + 106 + true + true + + true + + + Запись.ИспользуетсяРазделениеПоКритичности + + + ИспользуетсяРазделениеПоКритичностиРасширеннаяПодсказка + 108 + Label + true + true + + Left + + + + ИспользуетсяРазделениеПоКритичностиКонтекстноеМеню + 107 + true + + CheckBoxField + Enter + true + Left + true + + + + ОбработаныАктуальныеДанные + 109 + true + true + + true + + + Запись.ОбработаныАктуальныеДанные + + + ОбработаныАктуальныеДанныеРасширеннаяПодсказка + 111 + Label + true + true + + Left + + + + ОбработаныАктуальныеДанныеКонтекстноеМеню + 110 + true + + CheckBoxField + Enter + true + Left + true + + true true diff --git a/SSL/src/InformationRegisters/ОбработчикиОбновления/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ОбработчикиОбновления/Forms/ФормаСписка/Form.form index 99eba79de..07b5850f3 100644 --- a/SSL/src/InformationRegisters/ОбработчикиОбновления/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ОбработчикиОбновления/Forms/ФормаСписка/Form.form @@ -110,6 +110,32 @@ КоманднаяПанель 69 + + ИзменитьФорму + 89 + true + true + + true + + + ИзменитьФормуРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + true true @@ -157,7 +183,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -190,7 +215,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -441,6 +465,166 @@ true + + Порядок + 77 + true + true + + + Список.Order + + + ПорядокРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + ПорядокКонтекстноеМеню + 78 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДлительностьОбработки + 80 + true + true + + + Список.ДлительностьОбработки + + + ДлительностьОбработкиРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + + ДлительностьОбработкиКонтекстноеМеню + 81 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ИмяБиблиотеки + 83 + true + true + + + Список.ИмяБиблиотеки + + + ИмяБиблиотекиРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + + ИмяБиблиотекиКонтекстноеМеню + 84 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДлительностьРегистрацииДанных + 86 + + <key>ru</key> + <value>Длительность регистрации, секунд</value> + + true + true + + + Список.ДлительностьРегистрацииДанных + + + ДлительностьРегистрацииДанныхРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + ДлительностьРегистрацииДанныхКонтекстноеМеню + 87 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + None СписокКоманднаяПанель @@ -648,38 +832,37 @@
        true
        - ВЫБРАТЬ - ОбработчикиОбновления.ИмяОбработчика, - ОбработчикиОбновления.Статус, - ОбработчикиОбновления.Версия, - ОбработчикиОбновления.ИмяБиблиотеки, - ОбработчикиОбновления.ДлительностьОбработки, - ОбработчикиОбновления.РежимВыполнения, - ОбработчикиОбновления.ВерсияРегистрации, - ОбработчикиОбновления.ВерсияПорядок, - ОбработчикиОбновления.Идентификатор, - ОбработчикиОбновления.ЧислоПопыток, - ОбработчикиОбновления.СтатистикаВыполнения, - ОбработчикиОбновления.ИнформацияОбОшибке, - ОбработчикиОбновления.Комментарий, - ОбработчикиОбновления.Приоритет, - ОбработчикиОбновления.ПроцедураПроверки, - ОбработчикиОбновления.ПроцедураЗаполненияДанныхОбновления, - ОбработчикиОбновления.ОчередьОтложеннойОбработки, - ОбработчикиОбновления.ЗапускатьТолькоВГлавномУзле, - ОбработчикиОбновления.ЗапускатьИВПодчиненномУзлеРИБСФильтрами, - ОбработчикиОбновления.Многопоточный, - ОбработчикиОбновления.ОбработкаПорцииЗавершена, - ОбработчикиОбновления.ГруппаОбновления, - ОбработчикиОбновления.ИтерацияЗапуска, - ОбработчикиОбновления.ОбрабатываемыеДанные, - ОбработчикиОбновления.РежимВыполненияОтложенногоОбработчика, - ОбработчикиОбновления.ИзменяемыеОбъекты, - ОбработчикиОбновления.ОбластьДанныхВспомогательныеДанные - ИЗ - РегистрСведений.ОбработчикиОбновления - КАК - ОбработчикиОбновления + ВЫБРАТЬ + ОбработчикиОбновления.ИмяОбработчика, + ОбработчикиОбновления.Статус, + ОбработчикиОбновления.Версия, + ОбработчикиОбновления.ИмяБиблиотеки, + ОбработчикиОбновления.ДлительностьОбработки, + ОбработчикиОбновления.РежимВыполнения, + ОбработчикиОбновления.ВерсияРегистрации, + ОбработчикиОбновления.ВерсияПорядок, + ОбработчикиОбновления.Идентификатор, + ОбработчикиОбновления.ЧислоПопыток, + ОбработчикиОбновления.СтатистикаВыполнения, + ОбработчикиОбновления.ИнформацияОбОшибке, + ОбработчикиОбновления.Комментарий, + ОбработчикиОбновления.Приоритет, + ОбработчикиОбновления.ПроцедураПроверки, + ОбработчикиОбновления.ПроцедураЗаполненияДанныхОбновления, + ОбработчикиОбновления.ОчередьОтложеннойОбработки, + ОбработчикиОбновления.ЗапускатьТолькоВГлавномУзле, + ОбработчикиОбновления.ЗапускатьИВПодчиненномУзлеРИБСФильтрами, + ОбработчикиОбновления.Многопоточный, + ОбработчикиОбновления.ОбработкаПорцииЗавершена, + ОбработчикиОбновления.ГруппаОбновления, + ОбработчикиОбновления.ИтерацияЗапуска, + ОбработчикиОбновления.ОбрабатываемыеДанные, + ОбработчикиОбновления.РежимВыполненияОтложенногоОбработчика, + ОбработчикиОбновления.ИзменяемыеОбъекты, + ОбработчикиОбновления.ОбластьДанныхВспомогательныеДанные, + ОбработчикиОбновления.ДлительностьРегистрацииДанных +ИЗ + РегистрСведений.ОбработчикиОбновления КАК ОбработчикиОбновления true true true diff --git a/SSL/src/InformationRegisters/ОбработчикиОбновления/ОбработчикиОбновления.mdo b/SSL/src/InformationRegisters/ОбработчикиОбновления/ОбработчикиОбновления.mdo index 314078387..728e2fb7a 100644 --- a/SSL/src/InformationRegisters/ОбработчикиОбновления/ОбработчикиОбновления.mdo +++ b/SSL/src/InformationRegisters/ОбработчикиОбновления/ОбработчикиОбновления.mdo @@ -109,6 +109,24 @@ Use + + ДлительностьРегистрацииДанных + + ru + Длительность регистрации данных + + + Number + + 10 + + + + + Use + Use + + ДлительностьОбработки @@ -142,6 +160,21 @@ Use + + Порядок + + ru + Порядок + + + EnumRef.ПорядокОбработчиковОбновления + + + + Use + Use + + ВерсияРегистрации @@ -475,6 +508,36 @@ Use + + ИспользуетсяРазделениеПоКритичности + + ru + Используется разделение по критичности + + + Boolean + + + + Use + Use + + + + ОбработаныАктуальныеДанные + + ru + Обработаны актуальные данные + + + Boolean + + + + Use + Use + + ИмяОбработчика diff --git a/SSL/src/InformationRegisters/ОбщиеНастройкиУзловИнформационныхБаз/ManagerModule.bsl b/SSL/src/InformationRegisters/ОбщиеНастройкиУзловИнформационныхБаз/ManagerModule.bsl index 10b61ded0..964d35061 100644 --- a/SSL/src/InformationRegisters/ОбщиеНастройкиУзловИнформационныхБаз/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ОбщиеНастройкиУзловИнформационныхБаз/ManagerModule.bsl @@ -412,6 +412,44 @@ КонецПроцедуры +Процедура УстановитьЗацикливание(УзелОбмена, ОбнаруженоЗацикливание = "", РегистрацияДанныхОбменаПриЗацикливании = "") Экспорт + + СтруктураЗаписи = Новый Структура; + СтруктураЗаписи.Вставить("УзелИнформационнойБазы", УзелОбмена); + + Если ЗначениеЗаполнено(ОбнаруженоЗацикливание) Тогда + СтруктураЗаписи.Вставить("ОбнаруженоЗацикливание", ОбнаруженоЗацикливание); + КонецЕсли; + + Если ЗначениеЗаполнено(РегистрацияДанныхОбменаПриЗацикливании) Тогда + СтруктураЗаписи.Вставить("РегистрацияДанныхОбменаПриЗацикливании", РегистрацияДанныхОбменаПриЗацикливании); + КонецЕсли; + + ОбновитьЗапись(СтруктураЗаписи); + +КонецПроцедуры + +Функция РегистрацияПриЗацикливании(УзелОбмена) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Настройки.УзелИнформационнойБазы КАК УзелИнформационнойБазы + |ИЗ + | РегистрСведений.ОбщиеНастройкиУзловИнформационныхБаз КАК Настройки + |ГДЕ + | Настройки.УзелИнформационнойБазы = &УзелОбмена + | И (НЕ Настройки.ОбнаруженоЗацикливание + | ИЛИ Настройки.РегистрацияДанныхОбменаПриЗацикливании)"; + + Запрос.УстановитьПараметр("УзелОбмена", УзелОбмена); + + Результат = Запрос.Выполнить(); + + Возврат НЕ Результат.Пустой(); + +КонецФункции + // Процедура обновляет запись в регистре по переданным значениям структуры. // Процедура ОбновитьЗапись(СтруктураЗаписи) @@ -556,7 +594,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать набор записей регистра ""%1"" с отбором %2 по причине: - |%3'"), ПредставлениеРегистра, ПредставлениеОтбора, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + |%3'"), ПредставлениеРегистра, ПредставлениеОтбора, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, МетаданныеРегистра, , ТекстСообщения); diff --git a/SSL/src/InformationRegisters/ОбщиеНастройкиУзловИнформационныхБаз/ОбщиеНастройкиУзловИнформационныхБаз.mdo b/SSL/src/InformationRegisters/ОбщиеНастройкиУзловИнформационныхБаз/ОбщиеНастройкиУзловИнформационныхБаз.mdo index 4e1823adf..8d6a58897 100644 --- a/SSL/src/InformationRegisters/ОбщиеНастройкиУзловИнформационныхБаз/ОбщиеНастройкиУзловИнформационныхБаз.mdo +++ b/SSL/src/InformationRegisters/ОбщиеНастройкиУзловИнформационныхБаз/ОбщиеНастройкиУзловИнформационныхБаз.mdo @@ -202,6 +202,66 @@ Use + + ОбнаруженоЗацикливание + + ru + Обнаружено зацикливание + + + Boolean + + + + Use + Use + + + + РегистрацияДанныхОбменаПриЗацикливании + + ru + Регистрация данных обмена при зацикливании + + + Boolean + + + + Use + Use + + + + ИспользоватьСценарииВМоделиСервиса + + ru + Использовать сценарии в модели сервиса + + + Boolean + + + + Use + Use + + + + ИспользоватьНастройкиПодключенияВМоделиСервиса + + ru + Использовать настройки подключения в модели сервиса + + + Boolean + + + + Use + Use + + НомерОтправленного @@ -282,6 +342,72 @@ Use + + ПереходНаWS_Этап + + ru + Переход на WS, этап + + + Number + + 1 + + + + + Use + Use + + + + ПереходНаWS_КонечнаяТочкаКорреспондента + + ru + Переход на WS, конечная точка корреспондента + + + DefinedType.КонечнаяТочкаОбменаСообщениями + + + + Use + Use + + + + ПереходНаWS_КонечнаяТочка + + ru + Переход на WS, конечная точка + + + DefinedType.КонечнаяТочкаОбменаСообщениями + + + + Use + Use + + + + ПереходНаWS_ОбластьДанных + + ru + Переход на WS, область данных + + + String + + 7 + + + + + Use + Use + + УзелИнформационнойБазы diff --git a/SSL/src/InformationRegisters/ОбщиеПоставляемыеМакетыПечати/ManagerModule.bsl b/SSL/src/InformationRegisters/ОбщиеПоставляемыеМакетыПечати/ManagerModule.bsl index 70fece17a..3e9b2852d 100644 --- a/SSL/src/InformationRegisters/ОбщиеПоставляемыеМакетыПечати/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ОбщиеПоставляемыеМакетыПечати/ManagerModule.bsl @@ -80,12 +80,12 @@ ТекстОшибки = НСтр("ru = 'Не удалось записать сведения о макете'") + Символы.ПС + Макет.ПолноеИмя() + Символы.ПС - + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); ЗаписьЖурналаРегистрации(НСтр("ru = 'Контроль изменения поставляемых макетов'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, Макет, , ТекстОшибки); - СписокОшибок.Добавить(ИмяВладельца + "." + ИмяМакета + ": " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + СписокОшибок.Добавить(ИмяВладельца + "." + ИмяМакета + ": " + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЦикла; diff --git a/SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/Forms/ФормаЗаписи/Form.form new file mode 100644 index 000000000..7715e5561 --- /dev/null +++ b/SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/Forms/ФормаЗаписи/Form.form @@ -0,0 +1,248 @@ + + + + УзелИнформационнойБазы + 1 + true + true + + true + + + Запись.УзелИнформационнойБазы + + + УзелИнформационнойБазыРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + 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 + Normal + + + + КлючРегистраСведений + 7 + true + true + + true + + + Запись.КлючРегистраСведений + + + КлючРегистраСведенийРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + КлючРегистраСведенийКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ИмяРегистраСведений + 10 + true + true + + true + + + Запись.ИмяРегистраСведений + + + ИмяРегистраСведенийРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + ИмяРегистраСведенийКонтекстноеМеню + 11 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПредставлениеОбъекта + 13 + true + true + + true + + + Запись.ПредставлениеОбъекта + + + ПредставлениеОбъектаРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + ПредставлениеОбъектаКонтекстноеМеню + 14 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + Запись + 1 + + InformationRegisterRecordManager.ОбъектыНезарегистрированныеПриЗацикливании + + + true + + + true + +
        true
        + true +
        + + + + + +
        diff --git a/SSL/src/CommonCommands/СвязатьсяСоСпециалистомОнлайнПоддержки/CommandModule.bsl b/SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/Forms/ФормаЗаписи/Module.bsl similarity index 69% rename from SSL/src/CommonCommands/СвязатьсяСоСпециалистомОнлайнПоддержки/CommandModule.bsl rename to SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/Forms/ФормаЗаписи/Module.bsl index 3e273ade9..25e40dae5 100644 --- a/SSL/src/CommonCommands/СвязатьсяСоСпециалистомОнлайнПоддержки/CommandModule.bsl +++ b/SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/Forms/ФормаЗаписи/Module.bsl @@ -6,11 +6,13 @@ // 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..72cc667a6 --- /dev/null +++ b/SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/Forms/ФормаСписка/Form.form @@ -0,0 +1,464 @@ + + + + СписокКомпоновщикНастроекПользовательскиеНастройки + 1 + true + true + + true + + + <key>ru</key> + <value>Группа пользовательских настроек</value> + + false + + СписокКомпоновщикНастроекПользовательскиеНастройкиРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + Vertical + WeakSeparation + true + true + Auto + Auto + + + + Список + 3 + + <key>ru</key> + <value>Список</value> + + true + true + + true + + + Список + + None + Copy + CopyToClipboard + Create + + УзелИнформационнойБазы + 16 + true + true + + true + + + Список.УзелИнформационнойБазы + + true + + УзелИнформационнойБазыРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 17 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ПредставлениеОбъекта + 28 + true + true + + true + + + Список.ПредставлениеОбъекта + + true + + ПредставлениеОбъектаРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ПредставлениеОбъектаКонтекстноеМеню + 29 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СписокКоманднаяПанель + 5 + Left + + + СписокСтрокаПоиска + 7 + + СписокСтрокаПоискаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 8 + true + + Список + + true + + + + СписокСостояниеПросмотра + 10 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 11 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 13 + + СписокУправлениеПоискомРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 14 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 4 + true + + true + true + true + true + true + MultiRow +
        true
        + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + AsFileRef + + Список.DefaultPicture + + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + СписокКомпоновщикНастроекПользовательскиеНастройки + +
        + + ФормаКоманднаяПанель + -1 + + ФормаРегистрироватьВсе + 31 + true + true + + true + + + ФормаРегистрироватьВсеРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Form.Command.РегистрироватьВсе + Normal + Auto + true + true + UserCmds + Auto + + + ФормаРегистрироватьВыбранное + 33 + true + true + + true + + + ФормаРегистрироватьВыбранноеРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Form.Command.РегистрироватьВыбранное + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + Copy + Create + DontBlock + true + true + true + Vertical + true + true + true + auto + true + + Список + 1 + + DynamicList + + + true + + + true + + + Список.КлючРегистраСведений + + + Список.Объект + + + Список.УзелИнформационнойБазы + +
        true
        + + InformationRegister.ОбъектыНезарегистрированныеПриЗацикливании + true + true + true + true + +
        + + ТаблицаОбъектов + 2 + + ValueTable + + + true + + + true + + + УзелИнформационнойБазы + 1 + + ExchangePlanRef + + + true + + + true + + + + Объект + 2 + + AnyRef + + + true + + + true + + + + КлючРегистраСведений + 3 + + String + + 36 + + + + 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..e173a7f7f --- /dev/null +++ b/SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,116 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("УзелИнформационнойБазы") Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( + Список, "УзелИнформационнойБазы", Параметры.УзелИнформационнойБазы); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура РегистрироватьВсе(Команда) + + ДлительнаяОперация = НачатьВыполнениеРегистрации(); + + ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбработатьРезультат", ЭтотОбъект); + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания()); + +КонецПроцедуры + +&НаКлиенте +Процедура РегистрироватьВыбранное(Команда) + + ВыделенныеСтроки = Элементы.Список.ВыделенныеСтроки; + Если ВыделенныеСтроки.Количество() = 0 Тогда + ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Для продолжения необходимо выделить строки'")); + Возврат; + КонецЕсли; + + ТаблицаОбъектов.Очистить(); + Для Каждого Строка Из ВыделенныеСтроки Цикл + НоваяСтрока = ТаблицаОбъектов.Добавить(); + ЗначенияСтроки = Элементы.Список.ДанныеСтроки(Строка); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ЗначенияСтроки); + КонецЦикла; + + ДлительнаяОперация = НачатьВыполнениеРегистрацииВыбранного(); + + ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбработатьРезультат", ЭтотОбъект); + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания()); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Функция ПараметрыОжидания() + + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); + ПараметрыОжидания.ТекстСообщения = ""; + ПараметрыОжидания.ВыводитьПрогрессВыполнения = Ложь; + ПараметрыОжидания.ОповещениеОПрогрессеВыполнения = Неопределено; + ПараметрыОжидания.ОповещениеПользователя.Показать = Ложь; + ПараметрыОжидания.ОповещениеПользователя.НавигационнаяСсылка = Неопределено; + ПараметрыОжидания.ВыводитьОкноОжидания = Истина; + ПараметрыОжидания.ВыводитьСообщения = Ложь; + + Возврат ПараметрыОжидания; + +КонецФункции + +&НаСервере +Функция НачатьВыполнениеРегистрацииВыбранного() + + Адрес = ПоместитьВоВременноеХранилище(ТаблицаОбъектов.Выгрузить()); + + Возврат ДлительныеОперации.ВыполнитьПроцедуру(, + "РегистрыСведений.ОбъектыНезарегистрированныеПриЗацикливании.РегистрироватьВыбранное", + Адрес); + +КонецФункции + +&НаСервере +Функция НачатьВыполнениеРегистрации() + + Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных(); + Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных(); + + Возврат ДлительныеОперации.ВыполнитьПроцедуру(, + "РегистрыСведений.ОбъектыНезарегистрированныеПриЗацикливании.РегистрироватьВсе", + Схема, Настройки); + +КонецФункции + +&НаКлиенте +Процедура ОбработатьРезультат(Результат, ДополнительныеПараметры) Экспорт + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Результат.Статус = "Ошибка" Тогда + ПоказатьПредупреждение(,Результат.КраткоеПредставлениеОшибки); + КонецЕсли; + + Элементы.Список.Обновить(); + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/ManagerModule.bsl b/SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/ManagerModule.bsl new file mode 100644 index 000000000..777918f18 --- /dev/null +++ b/SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/ManagerModule.bsl @@ -0,0 +1,111 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныеПроцедурыИФункции + +Процедура РегистрироватьВсе(Схема, Настройки) Экспорт + + КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных(); + МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , ,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); + + Запрос = Новый Запрос; + ТекстЗапроса = МакетКомпоновки.НаборыДанных.НаборДанныхДинамическогоСписка.Запрос; + + СхемаЗапрос = Новый СхемаЗапроса; + СхемаЗапрос.УстановитьТекстЗапроса(ТекстЗапроса); + + ВыбираемыеПоля = СхемаЗапрос.ПакетЗапросов[0].Операторы[0].ВыбираемыеПоля; + ВыбираемыеПоля.Добавить("РегистрСведенийОбъектыНезарегистрированныеПриЗацикливании.ИмяРегистраСведений"); + ВыбираемыеПоля.Добавить("РегистрСведенийОбъектыНезарегистрированныеПриЗацикливании.ИзмеренияРегистраСведений"); + + Запрос.Текст = СхемаЗапрос.ПолучитьТекстЗапроса(); + + Для Каждого ЗначениеПараметра Из МакетКомпоновки.ЗначенияПараметров Цикл + Запрос.УстановитьПараметр(ЗначениеПараметра.Имя,ЗначениеПараметра.Значение); + КонецЦикла; + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + РегистрацияИУдалениеЗаписи(Выборка); + КонецЦикла; + +КонецПроцедуры + +Процедура РегистрироватьВыбранное(Адрес) Экспорт + + ТаблицаОбъектов = ПолучитьИзВременногоХранилища(Адрес); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ТаблицаОбъектов.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | ТаблицаОбъектов.Объект КАК Объект, + | ТаблицаОбъектов.КлючРегистраСведений КАК КлючРегистраСведений + |ПОМЕСТИТЬ ВТ_ТаблицаОбъектов + |ИЗ + | &ТаблицаОбъектов КАК ТаблицаОбъектов + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Объекты.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | Объекты.Объект КАК Объект, + | Объекты.КлючРегистраСведений КАК КлючРегистраСведений, + | Объекты.ИмяРегистраСведений КАК ИмяРегистраСведений, + | Объекты.ИзмеренияРегистраСведений КАК ИзмеренияРегистраСведений + |ИЗ + | ВТ_ТаблицаОбъектов КАК ВТ_ТаблицаОбъектов + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОбъектыНезарегистрированныеПриЗацикливании КАК Объекты + | ПО ВТ_ТаблицаОбъектов.УзелИнформационнойБазы = Объекты.УзелИнформационнойБазы + | И ВТ_ТаблицаОбъектов.Объект = Объекты.Объект + | И ВТ_ТаблицаОбъектов.КлючРегистраСведений = Объекты.КлючРегистраСведений"; + + Запрос.УстановитьПараметр("ТаблицаОбъектов", ТаблицаОбъектов); + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + РегистрацияИУдалениеЗаписи(Выборка); + КонецЦикла; + +КонецПроцедуры + +Процедура РегистрацияИУдалениеЗаписи(Параметры) + + Если ЗначениеЗаполнено(Параметры.Объект) Тогда + + ПланыОбмена.ЗарегистрироватьИзменения(Параметры.УзелИнформационнойБазы, Параметры.Объект); + + Иначе + + ИмяРегистра = Параметры.ИмяРегистраСведений; + Отбор = Параметры.ИзмеренияРегистраСведений.Получить(); + + Набор = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей(); + + Для Каждого Измерение Из Метаданные.РегистрыСведений[ИмяРегистра].Измерения Цикл + Набор.Отбор[Измерение.Имя].Установить(Отбор[Измерение.Имя]); + КонецЦикла; + + Набор.Прочитать(); + + ПланыОбмена.ЗарегистрироватьИзменения(Параметры.УзелИнформационнойБазы, Набор); + + КонецЕсли; + + Запись = РегистрыСведений.ОбъектыНезарегистрированныеПриЗацикливании.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(Запись, Параметры, "УзелИнформационнойБазы,Объект,КлючРегистраСведений"); + Запись.Прочитать(); + Запись.Удалить(); + +КонецПроцедуры + +#КонецОбласти + +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/ОбъектыНезарегистрированныеПриЗацикливании.mdo b/SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/ОбъектыНезарегистрированныеПриЗацикливании.mdo new file mode 100644 index 000000000..4d59f4948 --- /dev/null +++ b/SSL/src/InformationRegisters/ОбъектыНезарегистрированныеПриЗацикливании/ОбъектыНезарегистрированныеПриЗацикливании.mdo @@ -0,0 +1,176 @@ + + + + + + + + + + + + ОбъектыНезарегистрированныеПриЗацикливании + + ru + Объекты незарегистрированные при зацикливании + + InDialog + InformationRegister.ОбъектыНезарегистрированныеПриЗацикливании.Form.ФормаЗаписи + InformationRegister.ОбъектыНезарегистрированныеПриЗацикливании.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + ИмяРегистраСведений + + ru + Имя регистра сведений + + + String + + 80 + + + + + Use + Use + + + + ИзмеренияРегистраСведений + + ru + Измерения регистра сведений + + + ValueStorage + + + + Use + Use + + + + ПредставлениеОбъекта + + ru + Представление объекта + + + String + + + + + Use + Use + + + + УзелИнформационнойБазы + + ru + Узел информационной базы + + АПК:1330 универсальный механизм + + ExchangePlanRef + + + + Use + Use + true + + true + true + + + Объект + + ru + Объект + + АПК:1330 универсальный механизм + + AnyRef + + + + Use + Use + + true + + + КлючРегистраСведений + + ru + Ключ регистра сведений + + + String + + 36 + + + + + Use + Use + + true + + + ФормаЗаписи + + ru + Форма записи + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/ОперацииСтатистики/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ОперацииСтатистики/Forms/ФормаСписка/Form.form index 330258da8..4aab4db72 100644 --- a/SSL/src/InformationRegisters/ОперацииСтатистики/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ОперацииСтатистики/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ОтправленныеСерверныеОповещения/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ОтправленныеСерверныеОповещения/Forms/ФормаЗаписи/Form.form index ef8dda657..9bb4889f5 100644 --- a/SSL/src/InformationRegisters/ОтправленныеСерверныеОповещения/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/ОтправленныеСерверныеОповещения/Forms/ФормаЗаписи/Form.form @@ -204,7 +204,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -360,7 +359,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -623,6 +621,10 @@ true + + <key>ru</key> + <value>Страницы</value> + СтраницыРасширеннаяПодсказка 51 diff --git a/SSL/src/InformationRegisters/ОтправленныеСерверныеОповещения/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ОтправленныеСерверныеОповещения/Forms/ФормаСписка/Form.form index 9e661b337..e2a1d2e2a 100644 --- a/SSL/src/InformationRegisters/ОтправленныеСерверныеОповещения/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ОтправленныеСерверныеОповещения/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -92,6 +91,10 @@ Список 3 + + <key>ru</key> + <value>Список</value> + true true diff --git a/SSL/src/InformationRegisters/ПакетыДляОтправки/ManagerModule.bsl b/SSL/src/InformationRegisters/ПакетыДляОтправки/ManagerModule.bsl index 3b845bc26..6d9967dba 100644 --- a/SSL/src/InformationRegisters/ПакетыДляОтправки/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ПакетыДляОтправки/ManagerModule.bsl @@ -27,8 +27,8 @@ Процедура ЗаписатьНовыйПакет(ДатаЗаписи, JSONСтруктура, СледующийНомерПакета) Экспорт JSONСтруктура.Вставить("pn", Формат(СледующийНомерПакета, "ЧН=0; ЧГ=0")); - JSONСтруктура.Вставить("Конфигурация", Строка(Метаданные.Имя)); - JSONСтруктура.Вставить("ВерсияКонфигурации", Строка(Метаданные.Версия)); + JSONСтруктура.Вставить("application", Строка(Метаданные.Имя)); + JSONСтруктура.Вставить("applicationVersion", Строка(Метаданные.Версия)); ТелоПакета = ЦентрМониторингаСлужебный.СтруктураJSONВСтроку(JSONСтруктура); ХешMD5 = Новый ХешированиеДанных(ХешФункция.MD5); @@ -94,7 +94,7 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, Метаданные.РегистрыСведений.ПакетыДляОтправки,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -130,7 +130,7 @@ ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, Метаданные.РегистрыСведений.ПакетыДляОтправки,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ПараметрыОграниченияДоступа/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ПараметрыОграниченияДоступа/Forms/ФормаСписка/Form.form index 8e6836015..29df4caae 100644 --- a/SSL/src/InformationRegisters/ПараметрыОграниченияДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ПараметрыОграниченияДоступа/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ПараметрыОграниченияДоступа/ManagerModule.bsl b/SSL/src/InformationRegisters/ПараметрыОграниченияДоступа/ManagerModule.bsl index 9e4581ea2..03e75c22d 100644 --- a/SSL/src/InformationRegisters/ПараметрыОграниченияДоступа/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ПараметрыОграниченияДоступа/ManagerModule.bsl @@ -84,7 +84,7 @@ Если ФоновоеЗадание.Состояние <> СостояниеФоновогоЗадания.Завершено Тогда Если ТипЗнч(ФоновоеЗадание.ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда - ТекстОшибки = ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке); ИначеЕсли ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Отменено Тогда ТекстОшибки = НСтр("ru = 'Фоновое задание отменено'"); Иначе @@ -135,7 +135,7 @@ КонецЕсли; Если Не Результат.ТребуетсяПерезапускСеанса Или Не СтандартныеПодсистемыСервер.ЭтоОшибкаТребованияПерезапускаСеанса(ИнформацияОбОшибке) Тогда - Результат.ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + Результат.ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); КонецЕсли; КонецПопытки; @@ -396,7 +396,7 @@ КонецЕсли; Для Каждого ЗависимыйСписок Из ЗависимыеСписки Цикл - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ЗависимыйСписок); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ЗависимыйСписок); Если ОбъектМетаданных = Неопределено Тогда Продолжить; КонецЕсли; @@ -471,7 +471,7 @@ Если СпискиСЗаписьюКлючейДляЗависимыхСписковБезКлючей.Получить(КлючИЗначение.Ключ) = Неопределено Тогда Продолжить; КонецЕсли; - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(КлючИЗначение.Ключ); + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(КлючИЗначение.Ключ); Если ОбъектМетаданных = Неопределено Тогда Продолжить; КонецЕсли; diff --git a/SSL/src/InformationRegisters/ПараметрыРаботыВерсийРасширений/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ПараметрыРаботыВерсийРасширений/Forms/ФормаСписка/Form.form index bd0ba21ec..329ff1cd7 100644 --- a/SSL/src/InformationRegisters/ПараметрыРаботыВерсийРасширений/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ПараметрыРаботыВерсийРасширений/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ПараметрыРаботыВерсийРасширений/ManagerModule.bsl b/SSL/src/InformationRegisters/ПараметрыРаботыВерсийРасширений/ManagerModule.bsl index de0d459be..3c6af3077 100644 --- a/SSL/src/InformationRegisters/ПараметрыРаботыВерсийРасширений/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ПараметрыРаботыВерсийРасширений/ManagerModule.bsl @@ -285,7 +285,7 @@ ЗаполнитьВсеПараметрыРаботыРасширений(); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; КонецЕсли; @@ -346,7 +346,7 @@ Отбор = Новый Структура("УникальныйИдентификатор", ФоновоеЗадание.УникальныйИдентификатор); ФоновоеЗадание = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор)[0]; Если ФоновоеЗадание.ИнформацияОбОшибке <> Неопределено Тогда - ТекстОшибки = ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке); ВызватьИсключение ТекстОшибки; КонецЕсли; @@ -495,7 +495,7 @@ ТребуетсяПерезапускСеанса = СтандартныеПодсистемыСервер.ТребуетсяПерезапускСеанса(); Если Не ТребуетсяПерезапускСеанса Или Не СтандартныеПодсистемыСервер.ЭтоОшибкаТребованияПерезапускаСеанса(ИнформацияОбОшибке) Тогда - ТекущаяОшибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ТекущаяОшибка = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); Если ПредыдущаяОшибка = ТекущаяОшибка Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'При попытке заполнения %1 из %2 повторилась ошибка предыдущей попытки.'", @@ -693,7 +693,7 @@ Если ФоновоеЗадание.Состояние <> СостояниеФоновогоЗадания.Завершено Тогда Если ТипЗнч(ФоновоеЗадание.ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда - ТекстОшибки = ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке); ИначеЕсли ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Отменено Тогда ТекстОшибки = НСтр("ru = 'Фоновое задание отменено'"); Иначе diff --git a/SSL/src/InformationRegisters/ПараметрыРаботыПрограммы/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ПараметрыРаботыПрограммы/Forms/ФормаСписка/Form.form index f69f7d090..cb8834120 100644 --- a/SSL/src/InformationRegisters/ПараметрыРаботыПрограммы/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ПараметрыРаботыПрограммы/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ПараметрыРаботыПрограммы/ManagerModule.bsl b/SSL/src/InformationRegisters/ПараметрыРаботыПрограммы/ManagerModule.bsl index 7d390aeb2..621e7e8c9 100644 --- a/SSL/src/InformationRegisters/ПараметрыРаботыПрограммы/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ПараметрыРаботыПрограммы/ManagerModule.bsl @@ -401,17 +401,12 @@ ВызватьИсключение ТекстОшибки; КонецЕсли; - Возврат ДлительныеОперации.ВыполнитьВФоне(ИмяПроцедурыФоновогоЗадания(), + Возврат ДлительныеОперации.ВыполнитьВФоне( + "РегистрыСведений.ПараметрыРаботыПрограммы.ОбработчикДлительнойОперацииОбновленияПараметровРаботыПрограммы", СообщитьПрогресс, ПараметрыОперации); КонецФункции -Функция ИмяПроцедурыФоновогоЗадания() Экспорт - - Возврат "РегистрыСведений.ПараметрыРаботыПрограммы.ОбработчикДлительнойОперацииОбновленияПараметровРаботыПрограммы"; - -КонецФункции - // Для вызова из формы ОбновлениеВерсииПрограммы. // // Возвращаемое значение: @@ -613,7 +608,7 @@ Если ФоновоеЗадание.Состояние <> СостояниеФоновогоЗадания.Завершено Тогда Если ТипЗнч(ФоновоеЗадание.ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда - ТекстОшибки = ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке); + ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке); ИначеЕсли ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Отменено Тогда ТекстОшибки = НСтр("ru = 'Фоновое задание отменено'"); Иначе @@ -775,8 +770,8 @@ ЗагрузитьПараметрыРаботыПрограммыCУчетомРежимаВыполнения(СообщитьПрогресс); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - РезультатВыполнения.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - РезультатВыполнения.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + РезультатВыполнения.КраткоеПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + РезультатВыполнения.ПодробноеПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); // Переход в режим открытия формы повторной синхронизации данных перед запуском // с двумя вариантами "Синхронизировать и продолжить" и "Продолжить". Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") @@ -801,8 +796,8 @@ ОбновитьПараметрыРаботыПрограммыCУчетомРежимаВыполнения(СообщитьПрогресс); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - РезультатВыполнения.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - РезультатВыполнения.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + РезультатВыполнения.КраткоеПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + РезультатВыполнения.ПодробноеПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); // Переход в режим открытия формы повторной синхронизации данных перед запуском // с двумя вариантами "Синхронизировать и продолжить" и "Продолжить". Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") @@ -827,8 +822,8 @@ ОбновитьПараметрыРаботыВерсийРасширенийCУчетомРежимаВыполнения(СообщитьПрогресс); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - РезультатВыполнения.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - РезультатВыполнения.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + РезультатВыполнения.КраткоеПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + РезультатВыполнения.ПодробноеПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); // Переход в режим открытия формы повторной синхронизации данных перед запуском // с двумя вариантами "Синхронизировать и продолжить" и "Продолжить". Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") diff --git a/SSL/src/InformationRegisters/ПериодическиеСерверныеОповещения/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ПериодическиеСерверныеОповещения/Forms/ФормаЗаписи/Form.form index d9f9f95c3..1e38c2ea1 100644 --- a/SSL/src/InformationRegisters/ПериодическиеСерверныеОповещения/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/ПериодическиеСерверныеОповещения/Forms/ФормаЗаписи/Form.form @@ -323,6 +323,10 @@ true + + <key>ru</key> + <value>Страницы</value> + СтраницыРасширеннаяПодсказка 19 diff --git a/SSL/src/InformationRegisters/ПериодическиеСерверныеОповещения/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ПериодическиеСерверныеОповещения/Forms/ФормаСписка/Form.form index dd1ef5846..27064f90c 100644 --- a/SSL/src/InformationRegisters/ПериодическиеСерверныеОповещения/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ПериодическиеСерверныеОповещения/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -92,6 +91,10 @@ Список 3 + + <key>ru</key> + <value>Список</value> + true true diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Form.form b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Form.form index d64ab952b..94d6b8525 100644 --- a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Form.form +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Form.form @@ -84,7 +84,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Form.form b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Form.form index 0f5c6a354..3a7e420b6 100644 --- a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Form.form +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Form.form @@ -114,6 +114,10 @@ ОтборПоЯзыку + + OnChange + ОтборПоЯзыкуПриИзменении + ОтборПоЯзыкуРасширеннаяПодсказка 113 @@ -187,6 +191,10 @@ EditTextChange СтрокаПоискаИзменениеТекстаРедактирования
        + + Clearing + СтрокаПоискаОчистка + 31 true true @@ -204,6 +212,41 @@
        + + ВыполняетсяПоиск + 237 + true + + true + + + ВыполняетсяПоискРасширеннаяПодсказка + 239 + Label + true + true + + Left + + + + ВыполняетсяПоискКонтекстноеМеню + 238 + true + + 2 + true + 1 + true + false + false + + + CommonPicture.ДлительнаяОперация16 + + AsFileRef + + true true @@ -226,7 +269,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -252,7 +294,6 @@ Add Change Copy - CopyToClipboard Delete EndEdit HierarchicalList @@ -266,64 +307,23 @@ SortListAsc SortListDesc Tree - - МакетыКартинкаГруппы - 135 - true - - true - - - Макеты.КартинкаГруппы - - - МакетыКартинкаГруппыРасширеннаяПодсказка - 137 - Label - true - true - - Left - - - - МакетыКартинкаГруппыКонтекстноеМеню - 136 - true - - PictureField - Auto - Left - true - - true - true - true - true - - - 1 - - AsFileRef - - - МакетыГруппа1 + ГруппаКартинкаИМакет 144 - МакетыКартинка - 149 + МакетыКартинкаГруппы + 240 true true true - Макеты.Картинка + Макеты.КартинкаГруппы - МакетыКартинкаРасширеннаяПодсказка - 151 + МакетыКартинкаГруппыРасширеннаяПодсказка + 242 Label true true @@ -332,8 +332,8 @@ - МакетыКартинкаКонтекстноеМеню - 150 + МакетыКартинкаГруппыКонтекстноеМеню + 241 true PictureField @@ -345,9 +345,6 @@ true true true - - CommonPicture.ТипыМакетов - 1 @@ -386,6 +383,7 @@ true InputField + true Auto true Left @@ -409,10 +407,10 @@ <key>ru</key> - <value>Макеты группа 1</value> + <value>Картинка и макет</value> - МакетыГруппа1РасширеннаяПодсказка + ГруппаКартинкаИМакетРасширеннаяПодсказка 145 Label true @@ -439,6 +437,11 @@ Макеты.Используется + None + + ru + Показывать в подменю "Печать" + МакетыИспользуетсяРасширеннаяПодсказка 190 @@ -456,11 +459,11 @@ CheckBoxField Auto + true CommonPicture.ВводимыеСимволыВидны Left - true @@ -474,6 +477,7 @@ Макеты.КартинкаИспользования + None ru Используется измененный макет @@ -496,11 +500,11 @@ PictureField true Auto + true CommonPicture.РедактироватьМакет Left - true true true @@ -526,6 +530,11 @@ Макеты.ДоступнаНастройкаВидимости + None + + ru + Условия видимости + МакетыКнопкаНастройкиДоступностиРасширеннаяПодсказка 184 @@ -544,11 +553,11 @@ PictureField Auto true + true StdPicture.DataCompositionOutputParameters Left - true Show Always @@ -608,6 +617,7 @@ Макеты.ДоступенПеревод + None ru Доступен перевод на другие языки @@ -630,11 +640,11 @@ PictureField Auto + true CommonPicture.ПереводТекста Left - true true true @@ -676,6 +686,7 @@ true InputField + true Auto true Left @@ -737,21 +748,77 @@ МакетыКоманднаяПанель 124 - - МакетыДобавитьМакет - 162 - - <key>ru</key> - <value>Создать</value> - + + МакетыГруппаДобавитьМакет + 200 + + МакетыДобавитьМакет + 162 + + <key>ru</key> + <value>Создать макет табличного документа</value> + + true + true + + true + + + МакетыДобавитьМакетРасширеннаяПодсказка + 163 + Label + true + true + + Left + + + Form.Command.ДобавитьМакет + Normal + Auto + true + true + UserCmds + Auto + + + МакетыДобавитьМакетOfficeOpenXML + 202 + true + true + + true + + + МакетыДобавитьМакетOfficeOpenXMLРасширеннаяПодсказка + 203 + Label + true + true + + Left + + + Form.Command.ДобавитьМакетOfficeOpenXML + Normal + Auto + true + true + UserCmds + Auto + true true true + + <key>ru</key> + <value>Создать</value> + - МакетыДобавитьМакетРасширеннаяПодсказка - 163 + МакетыГруппаДобавитьМакетРасширеннаяПодсказка + 201 Label true true @@ -759,13 +826,11 @@ Left - Form.Command.ДобавитьМакет - Normal - Auto - true - true - UserCmds - Auto + Popup + + Auto + Normal + МакетыСкопировать @@ -901,6 +966,32 @@ Compact + + ФормаПоказатьВСписке + 204 + true + true + + true + + + ФормаПоказатьВСпискеРасширеннаяПодсказка + 205 + Label + true + true + + Left + + + Form.Command.ПоказатьВСписке + Normal + Auto + true + true + UserCmds + Auto + МакетыПечатныхФормУдалитьИзмененныйМакет 160 @@ -1019,6 +1110,10 @@ OnActivateRow МакетыПриАктивизацииСтроки
        + + BeforeExpand + МакетыПередРазворачиванием + OnChange МакетыПриИзменении @@ -1177,7 +1272,6 @@ true Auto Auto - ExpandTopLevel true true true @@ -1287,7 +1381,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -1314,11 +1407,16 @@ BeforeClose ПередЗакрытием + + OnLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + OnCreateAtServer ПриСозданииНаСервере DontBlock + Use true true true @@ -1479,10 +1577,6 @@ Картинка - - <key>ru</key> - <value>Картинка</value> - 4 Number @@ -1761,6 +1855,73 @@ true + + ЭтоПодраздел + 28 + + Boolean + + + true + + + true + + + + СоответствуетОтбору + 30 + + Boolean + + + true + + + true + + + + ИсточникМакета + 36 + + String + + + + true + + + true + + + + ЕстьЭлементыСоответствующиеОтбору + 38 + + Boolean + + + true + + + true + + + + ИсточникиДанных + 42 + + String + + + + true + + + true + + ПоказыватьИзмененные @@ -1814,6 +1975,66 @@ true + + ОбъектыСКомандамиПечати + 32 + + ValueList + + + true + + + true + + + + + + + ПозицияВДереве + 34 + + String + + + + true + + + true + + + ПозицияВДереве + + + + РазворачиваемыеВетки + 37 + + String + + + + true + + + true + + + + ВыполняетсяЗагрузкаДанных + 43 + + Boolean + + + true + + + true + + ИспользоватьИзмененныйМакет @@ -1900,6 +2121,7 @@ <use> <common>true</common> </use> + <shortcut>F2</shortcut> <picture xsi:type="core:PictureRef"> <picture>CommonPicture.РедактироватьМакет</picture> </picture> @@ -2000,6 +2222,7 @@ <use> <common>true</common> </use> + <shortcut>F9</shortcut> <picture xsi:type="core:PictureRef"> <picture>StdPicture.CloneListItem</picture> </picture> @@ -2051,15 +2274,38 @@ <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>СоздатьМакетOfficeOpenXML</name> + <name>ДобавитьМакетOfficeOpenXML</name> <title> <key>ru</key> - <value>Создать макет office open XML</value> + <value>Создать макет Office Open XML</value> 12 true + + + ДобавитьМакетOfficeOpenXML + + + Auto + Auto + + + ПоказатьВСписке + + <key>ru</key> + <value>Показать в списке</value> + + 13 + + true + + + + ПерейтиВСписок + + Auto Auto diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Module.bsl b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Module.bsl index ae87a7973..6c1575b1e 100644 --- a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Module.bsl +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Module.bsl @@ -11,6 +11,9 @@ &НаКлиенте Перем КонтекстВыбора; +&НаСервере +Перем ПодчиненныеСправочники; + #КонецОбласти #Область ОбработчикиСобытийФормы @@ -20,7 +23,9 @@ УстановитьУсловноеОформление(); - ЗаполнитьТаблицуМакетовПечатныхФорм(); + ЗаполнитьОбъектыСКомандамиПечати(); + ЗаполнитьСписокМакетовПоРазделам(); + Если Параметры.Свойство("ПоказыватьТолькоПользовательскиеИзмененные") Тогда ОтборПоИспользованиюМакета = "ИспользуемыеИзмененные"; Иначе @@ -28,9 +33,11 @@ КонецЕсли; ЕстьПравоИзменения = ПравоДоступа("Изменение", Метаданные.РегистрыСведений.ПользовательскиеМакетыПечати); - ТолькоПросмотр = Не ЕстьПравоИзменения; - Элементы.МакетыПечатныхФормГруппаПереключениеИспользуемогоМакета.Видимость = ЕстьПравоИзменения; - Элементы.МакетыПечатныхФормУдалитьИзмененныйМакет.Видимость = ЕстьПравоИзменения; + Если Не ЕстьПравоИзменения Тогда + ТекстСообщения = НСтр("ru = 'Недостаточно прав для изменения макетов.'"); + СтандартнаяОбработка = Ложь; + ВызватьИсключение ТекстСообщения; + КонецЕсли; ЕстьДополнительныеЯзыки = Ложь; @@ -55,7 +62,7 @@ Элементы.МакетыДоступныеЯзыки.Видимость = ЕстьДополнительныеЯзыки; Элементы.МакетыДоступенПеревод.Видимость = ЕстьДополнительныеЯзыки; - РежимОткрытияМакетаПросмотр = Не ЕстьПравоИзменения; + РежимОткрытияМакетаПросмотр = Ложь; Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда СпрашиватьРежимОткрытияМакета = Ложь; @@ -68,14 +75,26 @@ КонецПроцедуры +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + + ПерейтиКЭлементу(ПозицияВДереве); + +КонецПроцедуры + &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) - Если (ИмяСобытия = "Запись_ТабличныйДокумент" Или ИмяСобытия = "Запись_ПользовательскиеМакетыПечати") И Источник.ВладелецФормы = ЭтотОбъект Тогда + Если (ИмяСобытия = "Запись_ТабличныйДокумент" Или ИмяСобытия = "Запись_ОфисныйДокумент" + Или ИмяСобытия = "Запись_ПользовательскиеМакетыПечати") И Источник.ВладелецФормы = ЭтотОбъект Тогда Если Не ТолькоПросмотр Тогда - Элементы.Макеты.ТекущаяСтрока = ОбновитьОтображениеМакета(Параметр); + ИдентификаторыИзмененныхСтрок = ОбновитьОтображениеМакета(Параметр); + Если Элементы.Макеты.ТекущиеДанные <> Неопределено И Элементы.Макеты.ТекущиеДанные.ЭтоГруппа Тогда + Элементы.Макеты.ТекущаяСтрока = ИдентификаторыИзмененныхСтрок[Элементы.Макеты.ТекущиеДанные.ПолучитьИдентификатор()]; + Элементы.Макеты.ТекущиеДанные.СоответствуетОтбору = Истина; + КонецЕсли; КонецЕсли; - ОбновитьОтображениеМакетов(); + УстановитьДоступностьКнопокКоманднойПанели(); КонецЕсли; КонецПроцедуры @@ -83,33 +102,54 @@ &НаСервере Функция ОбновитьОтображениеМакета(Знач Параметр) + ИдентификаторыИзмененныхСтрок = Новый Соответствие; ИдентификаторМакета = Параметр.ИмяОбъектаМетаданныхМакета; - Макет = НайтиМакет(ИдентификаторМакета); - Если Макет = Неопределено Тогда - Для Каждого ГруппаМакетов Из Макеты.ПолучитьЭлементы() Цикл - Если ГруппаМакетов.Владелец = Параметр.Владелец Тогда - ДополнитьСписокМакетов(ГруппаМакетов.ПолучитьЭлементы(), ИдентификаторМакета); - Макет = НайтиМакет(ИдентификаторМакета); - ДополнитьОписаниеМакета(Макет); - Прервать; - КонецЕсли; - КонецЦикла; - Иначе - ИзмененныеМакеты = ИзмененныеМакеты(); - - Макет.Изменен = ИзмененныеМакеты[ИдентификаторМакета] <> Неопределено Или Не Макет.Поставляемый; - Макет.ИспользуетсяИзмененный = Макет.Изменен И (ИзмененныеМакеты[ИдентификаторМакета] = Истина Или Не Макет.Поставляемый); - Макет.ДоступныеЯзыки = ДоступныеЯзыкиМакета(Параметр.ИмяОбъектаМетаданныхМакета); - Макет.КартинкаИспользования = -1; - Если Макет.Изменен Тогда - Макет.КартинкаИспользования = Число(Макет.Изменен) + Число(Макет.ИспользуетсяИзмененный); - КонецЕсли; - Если Параметр.Свойство("Представление") Тогда - Макет.Представление = Параметр.Представление; - КонецЕсли; - КонецЕсли; + ИсточникиДанных = Параметр.ИсточникиДанных; - Возврат Макет.ПолучитьИдентификатор(); + НайденныеМакеты = НайтиМакеты(ИдентификаторМакета, Макеты); + Для Каждого Макет Из НайденныеМакеты Цикл + ИсточникДанных = Макет.ПолучитьРодителя(); + Если ИсточникиДанных.Найти(ИсточникДанных.Владелец) = Неопределено Тогда + ИсточникДанных.ПолучитьЭлементы().Удалить(Макет); + ОчиститьКэш(ИсточникДанных.Идентификатор, ОбъектыСКомандамиПечати); + КонецЕсли; + КонецЦикла; + + Для Каждого ИсточникДанных Из ИсточникиДанных Цикл + ВеткиВладельцаМакетов = НайтиВеткиВладельцаМакетов(ИсточникДанных, Макеты); + Для Каждого Ветка Из ВеткиВладельцаМакетов Цикл + Если Ветка.ПолучитьЭлементы().Количество() > 0 И Не ЗначениеЗаполнено(Ветка.ПолучитьЭлементы()[0].Идентификатор) Тогда + Продолжить; + КонецЕсли; + + ОчиститьКэш(Ветка.Идентификатор, ОбъектыСКомандамиПечати); + + Макет = НайтиМакет(ИдентификаторМакета, Ветка); + Если Макет = Неопределено Тогда + РегистрыСведений.ПользовательскиеМакетыПечати.ДобавитьПользовательскиеМакеты(Ветка.ПолучитьЭлементы(), ИдентификаторМакета); + Макет = НайтиМакет(ИдентификаторМакета, Ветка); + Макет.СоответствуетОтбору = Истина; + ИдентификаторыИзмененныхСтрок.Вставить(Ветка.ПолучитьИдентификатор(), Макет.ПолучитьИдентификатор()); + Продолжить; + КонецЕсли; + + ИдентификаторыИзмененныхСтрок.Вставить(Ветка.ПолучитьИдентификатор(), Макет.ПолучитьИдентификатор()); + + Макет.Изменен = Не Макет.Поставляемый Или УправлениеПечатью.ИспользуетсяПользовательскийМакет(ИдентификаторМакета); + Макет.ИспользуетсяИзмененный = Макет.Изменен; + Макет.ДоступныеЯзыки = РегистрыСведений.ПользовательскиеМакетыПечати.ДоступныеЯзыкиМакета(Параметр.ИмяОбъектаМетаданныхМакета); + Макет.КартинкаИспользования = -1; + Если Макет.Изменен Тогда + Макет.КартинкаИспользования = Число(Макет.Изменен) + Число(Макет.ИспользуетсяИзмененный); + КонецЕсли; + Если Параметр.Свойство("Представление") Тогда + Макет.Представление = Параметр.Представление; + КонецЕсли; + + КонецЦикла; + КонецЦикла; + + Возврат ИдентификаторыИзмененныхСтрок; КонецФункции @@ -131,13 +171,61 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) + УстановитьОтборМакетов(); + КонецПроцедуры #КонецОбласти #Область ОбработчикиСобытийЭлементовШапкиФормы +&НаКлиенте +Процедура ОтборПоЯзыкуПриИзменении(Элемент) + + ОбновитьВидимостьМакетов(); + +КонецПроцедуры + +&НаКлиенте +Процедура СтрокаПоискаОчистка(Элемент, СтандартнаяОбработка) + + ОбновитьВидимостьМакетов(); + +КонецПроцедуры + +&НаКлиенте +Процедура СтрокаПоискаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + СтрокаПоиска = Текст; + + ОбновитьВидимостьМакетов(); + +КонецПроцедуры + +&НаКлиенте +Процедура СтрокаПоискаПриИзменении(Элемент) + + Если ЗначениеЗаполнено(СтрокаПоиска) И Элементы.СтрокаПоиска.СписокВыбора.НайтиПоЗначению(СтрокаПоиска) = Неопределено Тогда + Элементы.СтрокаПоиска.СписокВыбора.Добавить(СтрокаПоиска); + КонецЕсли; + + ОбновитьВидимостьМакетов(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтборПоВидуИспользуемогоМакетаПриИзменении(Элемент) + УстановитьОтборМакетов(); +КонецПроцедуры + +&НаКлиенте +Процедура ОтборПоИспользованиюМакетаОчистка(Элемент, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + ОтборПоИспользованиюМакета = Элементы.ОтборПоИспользованиюМакета.СписокВыбора[0].Значение; + УстановитьОтборМакетов(); +КонецПроцедуры + &НаКлиенте Процедура ДополнительнаяИнформацияОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) @@ -177,7 +265,9 @@ &НаКлиенте Процедура МакетыПриАктивизацииСтроки(Элемент) - УстановитьДоступностьКнопокКоманднойПанели(); + ПозицияВДереве = ПутьКМакетуВДереве(Элементы.Макеты.ТекущиеДанные); + ОтключитьОбработчикОжидания("УстановитьДоступностьКнопокКоманднойПанели"); + ПодключитьОбработчикОжидания("УстановитьДоступностьКнопокКоманднойПанели", 0.1, Истина); КонецПроцедуры @@ -187,6 +277,11 @@ ТекущиеДанные = Элемент.ТекущиеДанные; Если ТекущиеДанные <> Неопределено И ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда УстановитьИспользованиеМакета(ТекущиеДанные.Ссылка, ТекущиеДанные.Используется); + НайденныеМакеты = НайтиМакеты(ТекущиеДанные.Идентификатор, Макеты); + Для Каждого Макет Из НайденныеМакеты Цикл + Макет.Используется = ТекущиеДанные.Используется; + КонецЦикла; + ОчиститьКэш(ТекущиеДанные.ПолучитьРодителя().Идентификатор, ОбъектыСКомандамиПечати); КонецЕсли; КонецПроцедуры @@ -199,6 +294,62 @@ КонецПроцедуры +&НаКлиенте +Процедура МакетыПередРазворачиванием(Элемент, Строка, Отказ) + + КоллекцияЭлементов = Макеты.НайтиПоИдентификатору(Строка).ПолучитьЭлементы(); + Если КоллекцияЭлементов.Количество() > 0 И Не ЗначениеЗаполнено(КоллекцияЭлементов[0].Идентификатор) Тогда + Отказ = Истина; + РазворачиваемыеВетки = РазворачиваемыеВетки + Формат(Строка, "ЧГ=0;") + ";"; + ПодключитьОбработчикОжидания("Подключаемый_РазвернутьВетки", 0.1, Истина); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_РазвернутьВетки() + + ЗагрузитьПодчиненныеЭлементы(РазворачиваемыеВетки); + + Для Каждого ИдентификаторСтроки Из СтрРазделить(РазворачиваемыеВетки, ";", Ложь) Цикл + Ветка = Макеты.НайтиПоИдентификатору(ИдентификаторСтроки); + ОтметитьЭлементыСоответствующиеОтбору(Ветка); + Элементы.Макеты.Развернуть(ИдентификаторСтроки); + КонецЦикла; + + РазворачиваемыеВетки = ""; + +КонецПроцедуры + +&НаСервере +Процедура ЗагрузитьПодчиненныеЭлементы(ИдентификаторыСтрок) + + Для Каждого ИдентификаторСтроки Из СтрРазделить(ИдентификаторыСтрок, ";", Ложь) Цикл + ТекущиеДанные = Макеты.НайтиПоИдентификатору(ИдентификаторСтроки); + КоллекцияЭлементов = ТекущиеДанные.ПолучитьЭлементы(); + + Если КоллекцияЭлементов.Количество() = 0 Или ЗначениеЗаполнено(КоллекцияЭлементов[0].Идентификатор) Тогда + Возврат; + КонецЕсли; + + КоллекцияЭлементов.Очистить(); + + ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ТекущиеДанные.Идентификатор); + Если ОбъектМетаданных = Неопределено Тогда + Возврат; + КонецЕсли; + + ВывестиМакеты(ТекущиеДанные); + + Если ОбщегоНазначения.ЭтоЖурналДокументов(ОбъектМетаданных) Тогда + ВывестиКоллекцию(ТекущиеДанные, ОбъектМетаданных.РегистрируемыеДокументы); + ИначеЕсли ОбщегоНазначения.ЭтоСправочник(ОбъектМетаданных) Тогда + ВывестиКоллекцию(ТекущиеДанные, ПодчиненныеСправочники(ОбъектМетаданных)); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы @@ -234,11 +385,29 @@ &НаКлиенте Процедура ДобавитьМакет(Команда) - ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореИмениМакета", ЭтотОбъект, Ложь); - ПоказатьВводСтроки(ОписаниеОповещения, НСтр("ru = 'Новая печатная форма'"), НСтр("ru = 'Введите наименование макета'"), 100, Ложь) + ПараметрыОповещения = Новый Структура("Копирование, ТипМакета", Ложь, "MXL"); + ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореИмениМакета", ЭтотОбъект, ПараметрыОповещения); + УникальноеНаименование = ПолучитьУникальноеНаименование(НСтр("ru = 'Новая печатная форма'"), Ложь); + ПоказатьВводСтроки(ОписаниеОповещения, УникальноеНаименование, НСтр("ru = 'Введите наименование макета'"), 100, Ложь) КонецПроцедуры +&НаКлиенте +Процедура ПерейтиВСписок(Команда) + ПерейтиКСписку(); +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьМакетOfficeOpenXML(Команда) + + ПараметрыОповещения = Новый Структура("Копирование, ТипМакета", Ложь, "DOCX"); + ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореИмениМакета", ЭтотОбъект, ПараметрыОповещения); + УникальноеНаименование = ПолучитьУникальноеНаименование(НСтр("ru = 'Новая печатная форма'"), Ложь); + ПоказатьВводСтроки(ОписаниеОповещения, УникальноеНаименование, НСтр("ru = 'Введите наименование макета'"), 100, Ложь) + +КонецПроцедуры + + &НаКлиенте Процедура УсловияДоступности(Команда) @@ -261,257 +430,10 @@ #Область СлужебныеПроцедурыИФункции -// Начальное заполнение - -&НаСервере -Процедура ЗаполнитьТаблицуМакетовПечатныхФорм() - - СписокМакетов = Новый ТаблицаЗначений(); - СписокМакетов.Колонки.Добавить("ОбъектМетаданных"); - СписокМакетов.Колонки.Добавить("Идентификатор"); - СписокМакетов.Колонки.Добавить("Представление"); - СписокМакетов.Колонки.Добавить("Владелец"); - СписокМакетов.Колонки.Добавить("ТипМакета"); - СписокМакетов.Колонки.Добавить("Картинка"); - СписокМакетов.Колонки.Добавить("СтрокаПоиска"); - СписокМакетов.Колонки.Добавить("ДоступныеЯзыки"); - СписокМакетов.Колонки.Добавить("Изменен"); - СписокМакетов.Колонки.Добавить("ИспользуетсяИзмененный"); - СписокМакетов.Колонки.Добавить("КартинкаИспользования"); - СписокМакетов.Колонки.Добавить("ДоступенПеревод"); - СписокМакетов.Колонки.Добавить("Ссылка"); - СписокМакетов.Колонки.Добавить("Используется"); - СписокМакетов.Колонки.Добавить("ДоступнаНастройкаВидимости"); - СписокМакетов.Колонки.Добавить("Поставляемый"); - СписокМакетов.Колонки.Добавить("ЭтоПечатнаяФорма"); - СписокМакетов.Колонки.Добавить("ДоступноСоздание"); - - ИзмененныеМакеты = ИзмененныеМакеты(); - ДоступныеДляПереводаМакеты = Новый Соответствие; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда - МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); - ДоступныеДляПереводаМакеты = МодульУправлениеПечатьюМультиязычность.ДоступныеДляПереводаМакеты(); - КонецЕсли; - - Для Каждого ОписаниеМакета Из УправлениеПечатью.МакетыПечатныхФорм() Цикл - - Владелец = ОписаниеМакета.Значение; - ИмяВладельца = ?(Метаданные.ОбщиеМакеты = Владелец, "ОбщийМакет", Владелец.ПолноеИмя()); - - ОбъектМетаданных = ОписаниеМакета.Ключ; - ИмяОбъектаМетаданныхМакета = ИмяВладельца + "." + ОбъектМетаданных.Имя; - ПредставлениеМакета = ОбъектМетаданных.Представление(); - - ТипМакета = ТипМакета(ОбъектМетаданных.Имя, ИмяВладельца); - - Макет = СписокМакетов.Добавить(); - Макет.ОбъектМетаданных = ОбъектМетаданных; - Макет.Идентификатор = ИмяОбъектаМетаданныхМакета; - Макет.Представление = ПредставлениеМакета; - Макет.Владелец = ?(Владелец = Метаданные.ОбщиеМакеты, Неопределено, Владелец); - Макет.ТипМакета = ТипМакета; - Макет.Картинка = ИндексКартинки(ТипМакета); - Макет.Изменен = ИзмененныеМакеты[ИмяОбъектаМетаданныхМакета] <> Неопределено; - Макет.ИспользуетсяИзмененный = Макет.Изменен И ИзмененныеМакеты[ИмяОбъектаМетаданныхМакета]; - Макет.ДоступенПеревод = ДоступныеДляПереводаМакеты[ОбъектМетаданных] = Истина; - Макет.Используется = Истина; - Макет.Поставляемый = Истина; - КонецЦикла; - - ВладельцыМакетов = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(СписокМакетов.ВыгрузитьКолонку("Владелец"), Ложь); - - Для Каждого Макет Из СписокМакетов Цикл - Если Макет.Владелец <> Неопределено И ВладельцыМакетов[Макет.Владелец.ПолноеИмя()] <> Неопределено Тогда - Макет.Владелец = ВладельцыМакетов[Макет.Владелец.ПолноеИмя()]; - Макет.ЭтоПечатнаяФорма = УправлениеПечатью.ЭтоПечатнаяФорма(Макет.Идентификатор, Макет.Владелец); - Макет.ДоступенПеревод = Макет.ДоступенПеревод Или Макет.ЭтоПечатнаяФорма; - КонецЕсли; - КонецЦикла; - - ДополнитьСписокМакетов(СписокМакетов); - - ИсточникиКомандПечати = УправлениеПечатью.ИсточникиКомандПечати(); - ИсточникиДанныхПечати = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ИсточникиКомандПечати, Ложь); - ОбщегоНазначенияКлиентСервер.ДополнитьСоответствие(ИсточникиДанныхПечати, ВладельцыМакетов, Ложь); - - ВладельцыМакетов = Новый СписокЗначений(); - Для Каждого Источник Из ИсточникиДанныхПечати Цикл - Если Не ЗначениеЗаполнено(Источник.Значение) Тогда - Продолжить; - КонецЕсли; - ВладельцыМакетов.Добавить(Источник.Значение, Источник.Значение); - КонецЦикла; - - ИдентификаторыОбъектовМетаданных = ВладельцыМакетов.ВыгрузитьЗначения(); - ЗначенияПустойСсылки = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(ИдентификаторыОбъектовМетаданных, "ЗначениеПустойСсылки"); - - ВладельцыМакетов.СортироватьПоПредставлению(); - ВладельцыМакетов.Добавить(Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка(), НСтр("ru = 'Прочие'")); - - ДоступноДобавлениеМакетов = ПравоДоступа("Добавление", Метаданные.Справочники.МакетыПечатныхФорм); - - ОбъектыМетаданных = ОбщегоНазначения.ОбъектыМетаданныхПоИдентификаторам(ИдентификаторыОбъектовМетаданных, Ложь); - ДоступностьОбъектов = ДоступностьОбъектов(); - - ГруппыМакетов = Новый Соответствие(); - Для Каждого Владелец Из ВладельцыМакетов Цикл - Если ДоступностьОбъектов[ОбъектыМетаданных[Владелец.Значение]] = Ложь Тогда - Продолжить; - КонецЕсли; - - ГруппаМакетов = Макеты.ПолучитьЭлементы().Добавить(); - ГруппаМакетов.Представление = Владелец.Представление; - ГруппаМакетов.КартинкаГруппы = БиблиотекаКартинок.Папка; - ГруппаМакетов.Картинка = -1; - ГруппаМакетов.КартинкаИспользования = -1; - ГруппаМакетов.ЭтоГруппа = Истина; - ГруппаМакетов.Используется = Истина; - ГруппаМакетов.Владелец = Владелец.Значение; - ГруппаМакетов.ДоступноСоздание = ДоступноДобавлениеМакетов И ЗначенияПустойСсылки[Владелец.Значение] <> Неопределено; - - ГруппыМакетов.Вставить(Владелец.Значение, ГруппаМакетов); - КонецЦикла; - - СписокМакетов.Сортировать("Владелец, Представление"); - ГруппаМакетов = Неопределено; - Для Каждого ОписаниеМакета Из СписокМакетов Цикл - Если Не ЗначениеЗаполнено(ОписаниеМакета.Владелец) - Или ГруппыМакетов[ОписаниеМакета.Владелец] = Неопределено Тогда - ОписаниеМакета.Владелец = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка(); - КонецЕсли; - - ГруппаМакетов = ГруппыМакетов[ОписаниеМакета.Владелец]; - Макет = ГруппаМакетов.ПолучитьЭлементы().Добавить(); - ЗаполнитьЗначенияСвойств(Макет, ОписаниеМакета); - ДополнитьОписаниеМакета(Макет); - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Процедура ДополнитьОписаниеМакета(Макет) - - Макет.ИмяОбъектаМетаданныхМакета = Макет.Идентификатор; - Макет.ДоступныеЯзыки = ДоступныеЯзыкиМакета(Макет.Идентификатор); - Макет.КартинкаИспользования = -1; - Если Макет.Изменен Тогда - Макет.КартинкаИспользования = Число(Макет.Изменен) + Число(Макет.ИспользуетсяИзмененный); - КонецЕсли; - Макет.СтрокаПоиска = Макет.Представление + " " + Макет.ТипМакета; - Макет.ДоступноСоздание = Макет.ПолучитьРодителя().ДоступноСоздание; - -КонецПроцедуры - -&НаСервере -Процедура ДополнитьСписокМакетов(СписокМакетов, Знач Идентификатор = Неопределено) - - Если ЗначениеЗаполнено(Идентификатор) Тогда - Идентификатор = Новый УникальныйИдентификатор(Сред(Идентификатор, 4)); - Иначе - Идентификатор = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); - КонецЕсли; - - ТекстЗапроса = - "ВЫБРАТЬ - | МакетыПечатныхФорм.Ссылка, - | МакетыПечатныхФорм.ИсточникДанных КАК Владелец, - | МакетыПечатныхФорм.Представление, - | МакетыПечатныхФорм.Используется, - | МакетыПечатныхФорм.ТипМакета, - | МакетыПечатныхФорм.Идентификатор - |ИЗ - | Справочник.МакетыПечатныхФорм КАК МакетыПечатныхФорм - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыОбъектовМетаданных - | ПО МакетыПечатныхФорм.ИсточникДанных = ИдентификаторыОбъектовМетаданных.Ссылка - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовРасширений КАК ИдентификаторыОбъектовРасширений - | ПО МакетыПечатныхФорм.ИсточникДанных = ИдентификаторыОбъектовРасширений.Ссылка - |ГДЕ - | (НЕ &ОтборУстановлен - | ИЛИ МакетыПечатныхФорм.Идентификатор = &Идентификатор) - | И НЕ МакетыПечатныхФорм.ПометкаУдаления"; - - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("ОтборУстановлен", ЗначениеЗаполнено(Идентификатор)); - Запрос.УстановитьПараметр("Идентификатор", Идентификатор); - Выборка = Запрос.Выполнить().Выбрать(); - - Пока Выборка.Следующий() Цикл - Макет = СписокМакетов.Добавить(); - ЗаполнитьЗначенияСвойств(Макет, Выборка); - - Макет.Картинка = ИндексКартинки(Макет.ТипМакета); - Макет.Изменен = Истина; - Макет.ИспользуетсяИзмененный = Истина; - Макет.ДоступенПеревод = Истина; - Макет.Идентификатор = "ПФ_" + Строка(Макет.Идентификатор); - Макет.ДоступнаНастройкаВидимости = Истина; - Макет.ЭтоПечатнаяФорма = Истина; - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Функция ДоступныеЯзыкиМакета(Знач ИмяОбъектаМетаданныхМакета) - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда - МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); - Возврат МодульУправлениеПечатьюМультиязычность.ПредставлениеЯзыковМакета(ИмяОбъектаМетаданныхМакета); - КонецЕсли; - - Возврат ""; - -КонецФункции - -&НаСервере -Функция ТипМакета(ИмяОбъектаМетаданныхМакета, ИмяОбъекта = "ОбщийМакет") - - Позиция = СтрНайти(ИмяОбъектаМетаданныхМакета, "ПФ_"); - Если Позиция = 0 Тогда - Возврат Неопределено; - КонецЕсли; - - Если ИмяОбъекта = "ОбщийМакет" Тогда - МакетПечатнойФормы = ПолучитьОбщийМакет(ИмяОбъектаМетаданныхМакета); - Иначе - УстановитьОтключениеБезопасногоРежима(Истина); - УстановитьПривилегированныйРежим(Истина); - - МакетПечатнойФормы = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИмяОбъекта).ПолучитьМакет(ИмяОбъектаМетаданныхМакета); - - УстановитьПривилегированныйРежим(Ложь); - УстановитьОтключениеБезопасногоРежима(Ложь); - КонецЕсли; - - ТипМакета = Неопределено; - - Если ТипЗнч(МакетПечатнойФормы) = Тип("ТабличныйДокумент") Тогда - ТипМакета = "MXL"; - ИначеЕсли ТипЗнч(МакетПечатнойФормы) = Тип("ДвоичныеДанные") Тогда - ТипМакета = ВРег(УправлениеПечатьюСлужебный.ОпределитьРасширениеФайлаДанныхПоСигнатуре(МакетПечатнойФормы)); - КонецЕсли; - - Возврат ТипМакета; - -КонецФункции - -&НаСервере -Функция ИндексКартинки(Знач ТипМакета) - - ТипыМакетов = Новый Соответствие; - ТипыМакетов.Вставить("DOC", 0); - ТипыМакетов.Вставить("DOCX", 0); - ТипыМакетов.Вставить("ODT", 1); - ТипыМакетов.Вставить("MXL", 2); - - Результат = ТипыМакетов[ВРег(ТипМакета)]; - Возврат ?(Результат = Неопределено, -1, Результат); - -КонецФункции - -// Отборы +#Область Отборы &НаКлиенте -Процедура УстановитьОтборМакетов(Текст = Неопределено); +Процедура УстановитьОтборМакетов(); ПоказыватьИзмененные = Истина; ПоказыватьНеизмененные = Истина; @@ -529,33 +451,20 @@ ПоказыватьНеизмененные = Ложь; ПоказыватьИспользуемые = Ложь; КонецЕсли; - + + ОбновитьВидимостьМакетов(); + КонецПроцедуры &НаКлиенте -Процедура СтрокаПоискаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка) - СтандартнаяОбработка = Ложь; - СтрокаПоиска = Текст; +Процедура ОбновитьВидимостьМакетов(Интервал = 0.5); + + ОтключитьОбработчикОжидания("ПрименитьОтбор"); + ПодключитьОбработчикОжидания("ПрименитьОтбор", Интервал, Истина); + КонецПроцедуры -&НаКлиенте -Процедура СтрокаПоискаПриИзменении(Элемент) - Если ЗначениеЗаполнено(СтрокаПоиска) И Элементы.СтрокаПоиска.СписокВыбора.НайтиПоЗначению(СтрокаПоиска) = Неопределено Тогда - Элементы.СтрокаПоиска.СписокВыбора.Добавить(СтрокаПоиска); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ОтборПоВидуИспользуемогоМакетаПриИзменении(Элемент) - УстановитьОтборМакетов(); -КонецПроцедуры - -&НаКлиенте -Процедура ОтборПоИспользованиюМакетаОчистка(Элемент, СтандартнаяОбработка) - СтандартнаяОбработка = Ложь; - ОтборПоИспользованиюМакета = Элементы.ОтборПоИспользованиюМакета.СписокВыбора[0].Значение; - УстановитьОтборМакетов(); -КонецПроцедуры +#КонецОбласти // Открытие макета @@ -584,6 +493,15 @@ ПараметрыОткрытия.Вставить("ИмяДокумента", ТекущиеДанные.Представление); ОткрытьФорму("ОбщаяФорма.РедактированиеТабличногоДокумента", ПараметрыОткрытия, ЭтотОбъект); Возврат; + ИначеЕсли ТекущиеДанные.ТипМакета = "DOCX" Тогда + Если ВерсияМакета(ТекущиеДанные.Идентификатор, ТекущиеДанные.ТипМакета) = "Области" Тогда + ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыОткрытия, ЭтотОбъект); + Возврат; + КонецЕсли; + ПараметрыОткрытия.Вставить("ИмяДокумента", ТекущиеДанные.Представление); + ПараметрыОткрытия.Вставить("Редактирование", Ложь); + ОткрытьФорму("ОбщаяФорма.РедактированиеДокументаOfficeOpen", ПараметрыОткрытия, ЭтотОбъект); + Возврат; КонецЕсли; ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыОткрытия, ЭтотОбъект); @@ -599,13 +517,25 @@ ПараметрыОткрытия.Вставить("ИмяОбъектаМетаданныхМакета", ТекущиеДанные.ИмяОбъектаМетаданныхМакета); ПараметрыОткрытия.Вставить("ТипМакета", ТекущиеДанные.ТипМакета); ПараметрыОткрытия.Вставить("Ссылка", ТекущиеДанные.Ссылка); - ПараметрыОткрытия.Вставить("Владелец", ТекущиеДанные.Владелец); + ПараметрыОткрытия.Вставить("ИсточникДанных", ТекущиеДанные.Владелец); + ПараметрыОткрытия.Вставить("ИсточникиДанных", ТекущиеДанные.ИсточникиДанных); + ПараметрыОткрытия.Вставить("ЭтоПечатнаяФорма", ТекущиеДанные.ЭтоПечатнаяФорма); + ПараметрыОткрытия.Вставить("ДоступноНазначение", Не ТекущиеДанные.Поставляемый); Если ТекущиеДанные.ТипМакета = "MXL" Тогда ПараметрыОткрытия.Вставить("ИмяДокумента", ТекущиеДанные.Представление); ПараметрыОткрытия.Вставить("Редактирование", Не ТолькоПросмотр); ОткрытьФорму("ОбщаяФорма.РедактированиеТабличногоДокумента", ПараметрыОткрытия, ЭтотОбъект); Возврат; + ИначеЕсли ТекущиеДанные.ТипМакета = "DOCX" Тогда + Если ВерсияМакета(ТекущиеДанные.Идентификатор, ТекущиеДанные.ТипМакета) = "Области" Тогда + ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыОткрытия, ЭтотОбъект); + Возврат; + КонецЕсли; + ПараметрыОткрытия.Вставить("ИмяДокумента", ТекущиеДанные.Представление); + ПараметрыОткрытия.Вставить("Редактирование", Истина); + ОткрытьФорму("ОбщаяФорма.РедактированиеДокументаOfficeOpen", ПараметрыОткрытия, ЭтотОбъект); + Возврат; КонецЕсли; ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыОткрытия, ЭтотОбъект); @@ -614,6 +544,22 @@ // Действия с макетами +&НаСервереБезКонтекста +Функция ВерсияМакета(Идентификатор, ТипМакета) + Макет = УправлениеПечатью.МакетПечатнойФормы(Идентификатор); + ДанныеМакета = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(Макет, ТипМакета); + + Если ДанныеМакета.СтруктураДокумента.ОбластиДокумента.Количество() > 1 + ИЛИ ДанныеМакета.СтруктураДокумента.ОбластиДокумента["Абзац"] = Неопределено Тогда + ВерсияМакета = "Области"; + Иначе + ВерсияМакета = "Параметры"; + КонецЕсли; + + ДанныеМакета.Вставить("ВерсияМакета", ВерсияМакета); + Возврат ДанныеМакета.ВерсияМакета; +КонецФункции + &НаКлиенте Процедура ПереключитьИспользованиеВыбранныхМакетов(ИспользуетсяИзмененный) ПереключаемыеМакеты = Новый Массив; @@ -659,13 +605,6 @@ КонецПроцедуры -&НаКлиенте -Процедура ОбновитьОтображениеМакетов(); - - УстановитьДоступностьКнопокКоманднойПанели(); - -КонецПроцедуры - // Общие &НаКлиенте @@ -700,11 +639,12 @@ Элементы.МакетыПечатныхФормИспользоватьСтандартныйМакет.Доступность = ИспользоватьСтандартныйМакетДоступность; Элементы.МакетыПечатныхФормУдалитьИзмененныйМакет.Доступность = УдалитьИзмененныйМакетДоступность; - Элементы.МакетыКонтекстноеМенюУдалитьИзмененныйМакет.Видимость = УдалитьИзмененныйМакетДоступность; - Элементы.МакетыКонтекстноеМенюУдалитьМакет.Видимость = УдалитьМакетВидимость; + Элементы.МакетыКонтекстноеМенюУдалитьИзмененныйМакет.Видимость = УдалитьИзмененныйМакетДоступность И Не ТолькоПросмотр; + Элементы.МакетыКонтекстноеМенюУдалитьМакет.Видимость = УдалитьМакетВидимость И Не ТолькоПросмотр; Элементы.МакетыУсловияДоступности.Доступность = ТекущийМакетВыбран И ТекущийМакет.ДоступнаНастройкаВидимости; - Элементы.МакетыСкопировать.Доступность = ТекущийМакетВыбран И ТекущийМакет.ЭтоПечатнаяФорма И Не ВыбраноНесколькоМакетов И ТекущийМакет.ДоступноСоздание; + Элементы.МакетыСкопировать.Доступность = ТекущийМакетВыбран И ТекущийМакет.ЭтоПечатнаяФорма И Не ВыбраноНесколькоМакетов И ТекущийМакет.ДоступноСоздание И Не ТолькоПросмотр; Элементы.МакетыДобавитьМакет.Доступность = ТекущийМакетВыбран И ТекущийМакет.ДоступноСоздание; + Элементы.МакетыДобавитьМакетOfficeOpenXML.Доступность = ТекущийМакетВыбран И ТекущийМакет.ДоступноСоздание; Элементы.МакетыИзменитьМакет.Доступность = ТекущийМакетВыбран И Не ТекущийМакет.ЭтоГруппа; КонецПроцедуры @@ -712,13 +652,41 @@ &НаКлиенте Процедура Скопировать(Команда) - ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореИмениМакета", ЭтотОбъект, Истина); - ПоказатьВводСтроки(ОписаниеОповещения, НСтр("ru = 'Новая печатная форма'"), НСтр("ru = 'Введите наименование макета'"), 100, Ложь) + ПараметрыОповещения = Новый Структура("Копирование, ТипМакета", Истина); + ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореИмениМакета", ЭтотОбъект, ПараметрыОповещения); + ТекущийМакет = Элементы.Макеты.ТекущиеДанные; + НаименованиеКопии = ПолучитьУникальноеНаименование(ТекущийМакет.Представление); + ПоказатьВводСтроки(ОписаниеОповещения, НаименованиеКопии, НСтр("ru = 'Введите наименование макета'"), 100, Ложь) КонецПроцедуры +&НаСервере +Функция ПолучитьУникальноеНаименование(НаименованиеМакета, ЭтоКопирование = Истина) + + НовоеНаименование = НаименованиеМакета; + ОкончаниеКопии = ""; + Счетчик = 1; + ДеревоМакетов = ДанныеФормыВЗначение(Макеты, Тип("ДеревоЗначений")); + Пока ДеревоМакетов.Строки.Найти(НовоеНаименование + ОкончаниеКопии, "Представление", Истина) <> Неопределено Цикл + Если ЭтоКопирование Тогда + ОкончаниеКопии = " - " + НСтр("ru = 'копия'"); + Иначе + ОкончаниеКопии = ""; + КонецЕсли; + + Если Счетчик > 1 Тогда + ОкончаниеКопии = ОкончаниеКопии + " ("+Формат(Счетчик, "ЧДЦ=0; ЧГ=;")+")"; + КонецЕсли; + Счетчик = Счетчик + 1; + КонецЦикла; + Возврат НовоеНаименование + ОкончаниеКопии; + +КонецФункции + &НаКлиенте -Процедура ПриВыбореИмениМакета(ИмяМакета, Копирование) Экспорт +Процедура ПриВыбореИмениМакета(ИмяМакета, ПараметрыОповещения) Экспорт + + Копирование = ПараметрыОповещения.Копирование; Если Не ЗначениеЗаполнено(ИмяМакета) Тогда Возврат; @@ -726,11 +694,11 @@ ТекущиеДанные = Элементы.Макеты.ТекущиеДанные; - ТипМакета = "MXL"; + ТипМакета = ?(ПараметрыОповещения.ТипМакета = Неопределено, ТекущиеДанные.ТипМакета, ПараметрыОповещения.ТипМакета); ПараметрыОткрытия = Новый Структура; ПараметрыОткрытия.Вставить("ТипМакета", ТипМакета); - ПараметрыОткрытия.Вставить("Владелец", ТекущиеДанные.Владелец); + ПараметрыОткрытия.Вставить("Владелец", ?(ЗначениеЗаполнено(ТекущиеДанные.Владелец), ТекущиеДанные.Владелец, ТекущиеДанные.Идентификатор)); ПараметрыОткрытия.Вставить("ИмяДокумента", ИмяМакета); Если Копирование Тогда @@ -738,72 +706,86 @@ ПараметрыОткрытия.Вставить("Копирование", Копирование); КонецЕсли; + ПараметрыОткрытия.Вставить("ИсточникДанных", ТекущиеДанные.Владелец); + ПараметрыОткрытия.Вставить("ЭтоПечатнаяФорма", Истина); + ПараметрыОткрытия.Вставить("ДоступноНазначение", Истина); + Если ТипМакета = "MXL" Тогда ПараметрыОткрытия.Вставить("Редактирование", Истина); ОткрытьФорму("ОбщаяФорма.РедактированиеТабличногоДокумента", ПараметрыОткрытия, ЭтотОбъект); Возврат; КонецЕсли; + Если ТипМакета = "DOCX" Тогда + ПараметрыОткрытия.Вставить("Редактирование", Истина); + ОткрытьФорму("ОбщаяФорма.РедактированиеДокументаOfficeOpen", ПараметрыОткрытия, ЭтотОбъект); + Возврат; + КонецЕсли; + ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыОткрытия, ЭтотОбъект); КонецПроцедуры -&НаСервере -Функция ИзмененныеМакеты() +&НаКлиенте +Процедура ПерейтиКСписку() - ТекстЗапроса = - "ВЫБРАТЬ - | ИзмененныеМакеты.ИмяМакета, - | ИзмененныеМакеты.Объект, - | ИзмененныеМакеты.Использование - |ИЗ - | РегистрСведений.ПользовательскиеМакетыПечати КАК ИзмененныеМакеты"; - - Запрос = Новый Запрос(ТекстЗапроса); - ИзмененныеМакеты = Запрос.Выполнить().Выгрузить(); - - ЯзыкиПечатныхФорм = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ОбщегоНазначения.КодОсновногоЯзыка()); - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда - МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); - ЯзыкиПечатныхФорм = МодульУправлениеПечатьюМультиязычность.ДоступныеЯзыки(); + ВладелецКоманд = Элементы.Макеты.ТекущиеДанные; + Если ВладелецКоманд = Неопределено Или СтрНачинаетсяС(ВладелецКоманд.Идентификатор, "Подсистема") Тогда + Возврат; КонецЕсли; - Результат = Новый Соответствие; + Родитель = ВладелецКоманд.ПолучитьРодителя(); + Если Родитель <> Неопределено И Не СтрНачинаетсяС(Родитель.Идентификатор, "Подсистема") Тогда + ВладелецКоманд = Родитель; + КонецЕсли; - Для Каждого Макет Из ИзмененныеМакеты Цикл - ИмяМакета = Макет.ИмяМакета; - - ИменаМакета = Новый Массив; - ИменаМакета.Добавить(ИмяМакета); - - Для Каждого КодЯзыка Из ЯзыкиПечатныхФорм Цикл - Если СтрНайти(ИмяМакета, "_MXL_") И СтрЗаканчиваетсяНа(ИмяМакета, "_" + КодЯзыка) Тогда - ИмяМакета = Лев(ИмяМакета, СтрДлина(ИмяМакета) - СтрДлина(КодЯзыка) - 1); - ИменаМакета.Добавить(ИмяМакета); - Прервать; - КонецЕсли; - КонецЦикла; - - Для Каждого ИмяМакета Из ИменаМакета Цикл - ИмяОбъектаМетаданныхМакета = Макет.Объект + "." + ИмяМакета; - Результат.Вставить(ИмяОбъектаМетаданныхМакета, Макет.Использование); - КонецЦикла; + НавигационнаяСсылкаСписка = ПолучитьНавигационнуюСсылкуНаФормуСписка(ВладелецКоманд.Владелец); + Для Каждого ОкноКлиентскогоПриложения Из ПолучитьОкна() Цикл + Если ОкноКлиентскогоПриложения.ПолучитьНавигационнуюСсылку() = НавигационнаяСсылкаСписка Тогда + Форма = ОкноКлиентскогоПриложения.Содержимое[0]; + ОписаниеОповещения = Новый ОписаниеОповещения("ПерейтиКСпискуЗавершение", ЭтотОбъект, + Новый Структура("Форма, НавигационнаяСсылка", Форма, НавигационнаяСсылкаСписка)); + Кнопки = Новый СписокЗначений; + Кнопки.Добавить("Переоткрыть", НСтр("ru = 'Переоткрыть'")); + Кнопки.Добавить("Отмена", НСтр("ru = 'Не переоткрывать'")); + ТекстВопроса = + НСтр("ru = 'Список уже открыт. Переоткрыть список, + |чтобы увидеть изменения меню печать?'"); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки, , "Переоткрыть"); + Возврат; + КонецЕсли; КонецЦикла; - Возврат Результат; - + ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(НавигационнаяСсылкаСписка); +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПолучитьНавигационнуюСсылкуНаФормуСписка(ИдентификаторОбъектаМетаданных) + Возврат "e1cib/list/" + ИдентификаторОбъектаМетаданных.ПолноеИмя; КонецФункции -&НаСервере -Функция НайтиМакет(Идентификатор) +&НаКлиенте +Процедура ПерейтиКСпискуЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт + Если РезультатВопроса = "Отмена" Тогда + Возврат; + КонецЕсли; - ГруппыМакетов = Макеты.ПолучитьЭлементы(); - Для Каждого ГруппаМакетов Из ГруппыМакетов Цикл - Для Каждого Макет Из ГруппаМакетов.ПолучитьЭлементы() Цикл - Если Макет.Идентификатор = Идентификатор Тогда - Возврат Макет; - КонецЕсли; - КонецЦикла; + ДополнительныеПараметры.Форма.Закрыть(); + ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(ДополнительныеПараметры.НавигационнаяСсылка); +КонецПроцедуры + + +&НаСервере +Функция НайтиМакет(Идентификатор, Знач Ветка = Неопределено) + + Если Ветка = Неопределено Тогда + Ветка = Макеты; + КонецЕсли; + + Для Каждого Макет Из Ветка.ПолучитьЭлементы() Цикл + Если Макет.Идентификатор = Идентификатор Тогда + Возврат Макет; + КонецЕсли; КонецЦикла; Возврат Неопределено; @@ -820,7 +802,10 @@ ИдентификаторМакета = ТекущиеДанные.Идентификатор; УдалитьМакетНаСервере(ИдентификаторМакета); - Элементы.Макеты.ТекущиеДанные.ПолучитьРодителя().ПолучитьЭлементы().Удалить(Элементы.Макеты.ТекущиеДанные); + НайденныеМакеты = НайтиМакеты(ИдентификаторМакета, Макеты); + Для Каждого Макет Из НайденныеМакеты Цикл + Макет.ПолучитьРодителя().ПолучитьЭлементы().Удалить(Макет); + КонецЦикла; КонецПроцедуры @@ -835,6 +820,20 @@ Процедура УстановитьУсловноеОформление() УсловноеОформление.Элементы.Очистить(); + + // Разделы + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("Макеты"); + + ЭлементОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ЭтоПодраздел"); + ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбора.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветРазделаПанелиФункций); // Цвет отключенных @@ -878,178 +877,541 @@ ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); - // Поиск по строке + // Отбор + + ЭлементОформления = УсловноеОформление.Элементы.Добавить(); + + ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); + ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Макеты"); + + ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.СоответствуетОтбору"); + ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбора.ПравоеЗначение = Ложь; + + ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ЕстьЭлементыСоответствующиеОтбору"); + ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбора.ПравоеЗначение = Ложь; + + ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); + ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + + // Не соответствующие отбору ЭлементОформления = УсловноеОформление.Элементы.Добавить(); ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Макеты"); + ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.СоответствуетОтбору"); + ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбора.ПравоеЗначение = Ложь; + + ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ЕстьЭлементыСоответствующиеОтбору"); + ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбора.ПравоеЗначение = Истина; + ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.СтрокаПоиска"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеСодержит; ЭлементОтбора.ПравоеЗначение = Новый ПолеКомпоновкиДанных("СтрокаПоиска"); - - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ЭтоГруппа"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ПравоеЗначение = Ложь; - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); - - // Поиск по языку - - ЭлементОформления = УсловноеОформление.Элементы.Добавить(); - - ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); - ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Макеты"); - - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ОтборПоЯзыку"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено; - - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ДоступныеЯзыки"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеСодержит; - ЭлементОтбора.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ОтборПоЯзыку"); - - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ЭтоГруппа"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ПравоеЗначение = Ложь; - - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); - - // ПоказыватьИзмененные - - ЭлементОформления = УсловноеОформление.Элементы.Добавить(); - - ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); - ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Макеты"); - - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПоказыватьИзмененные"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ПравоеЗначение = Ложь; - - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.Изменен"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ПравоеЗначение = Истина; - - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ЭтоГруппа"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ПравоеЗначение = Ложь; - - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); - - // ПоказыватьИспользуемые - - ЭлементОформления = УсловноеОформление.Элементы.Добавить(); - - ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); - ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Макеты"); - - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПоказыватьИспользуемые"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ПравоеЗначение = Ложь; - - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.Используется"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ПравоеЗначение = Истина; - - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ЭтоГруппа"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ПравоеЗначение = Ложь; - - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); - - // ПоказыватьНеизмененные - - ЭлементОформления = УсловноеОформление.Элементы.Добавить(); - - ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); - ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Макеты"); - - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПоказыватьНеизмененные"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ПравоеЗначение = Ложь; - - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.Изменен"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ПравоеЗначение = Ложь; - - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ЭтоГруппа"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ПравоеЗначение = Ложь; - - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); - - // ПоказыватьНеиспользуемые - - ЭлементОформления = УсловноеОформление.Элементы.Добавить(); - - ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); - ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Макеты"); - - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПоказыватьНеиспользуемые"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ПравоеЗначение = Ложь; - - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.Используется"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ПравоеЗначение = Ложь; - - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ЭтоГруппа"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ПравоеЗначение = Ложь; - - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); КонецПроцедуры &НаСервере -Функция ДоступностьОбъектов() +Процедура ЗаполнитьСписокМакетовПоРазделам() - ДоступностьОбъектов = Новый Соответствие; - Для Каждого ФункциональнаяОпция Из Метаданные.ФункциональныеОпции Цикл - Если Не Метаданные.Константы.Содержит(ФункциональнаяОпция.Хранение) Тогда + Макеты.ПолучитьЭлементы().Очистить(); + ВывестиКоллекцию(Макеты, Метаданные.Подсистемы); + +КонецПроцедуры + +&НаСервере +Процедура ВывестиКоллекцию(Знач Ветка, Знач КоллекцияОбъектовМетаданных) + + Для Каждого ОбъектМетаданных Из КоллекцияОбъектовМетаданных Цикл + Если ТипЗнч(Ветка) = Тип("ДанныеФормыЭлементДерева") И ОбъектМетаданных.ПолноеИмя() = Ветка.Идентификатор Тогда Продолжить; КонецЕсли; - Значение = ПолучитьФункциональнуюОпцию(ФункциональнаяОпция.Имя, Новый Структура); - Для Каждого Элемент Из ФункциональнаяОпция.Состав Цикл - Если Элемент.Объект = Неопределено Тогда - Продолжить; - КонецЕсли; - Если Значение = Истина Тогда - ДоступностьОбъектов.Вставить(Элемент.Объект, Истина); - Иначе - Если ДоступностьОбъектов[Элемент.Объект] = Неопределено Тогда - ДоступностьОбъектов.Вставить(Элемент.Объект, Ложь); - КонецЕсли; - КонецЕсли; - КонецЦикла; + + Если Не ЭтоПодсистема(ОбъектМетаданных) И Не ОбщегоНазначения.ЭтоЖурналДокументов(ОбъектМетаданных) + И ОбъектыСКомандамиПечати.НайтиПоЗначению(ОбъектМетаданных.ПолноеИмя()) = Неопределено Тогда + Продолжить; + КонецЕсли; + + Если Не ОбъектМетаданныхДоступен(ОбъектМетаданных) Тогда + Продолжить; + КонецЕсли; + + НоваяВетка = Ветка.ПолучитьЭлементы().Добавить(); + НоваяВетка.Представление = ОбъектМетаданных.Представление(); + НоваяВетка.КартинкаГруппы = КартинкаВИнтерфейсе(ОбъектМетаданных); + НоваяВетка.Идентификатор = ОбъектМетаданных.ПолноеИмя(); + НоваяВетка.КартинкаИспользования = -1; + НоваяВетка.ЭтоГруппа = Истина; + НоваяВетка.Используется = Истина; + НоваяВетка.СтрокаПоиска = НРег(НоваяВетка.Представление); + + Если ЭтоПодсистема(ОбъектМетаданных) Тогда + ВывестиКоллекцию(НоваяВетка, ОбъектМетаданных.Состав); + ВывестиКоллекцию(НоваяВетка, ОбъектМетаданных.Подсистемы); + НоваяВетка.ЭтоПодраздел = КоллекцияОбъектовМетаданных <> Метаданные.Подсистемы; + Иначе + НоваяВетка.Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(НоваяВетка.Идентификатор, Ложь); + НоваяВетка.ДоступноСоздание = Не ОбщегоНазначения.ЭтоЖурналДокументов(ОбъектМетаданных); + НоваяВетка.ПолучитьЭлементы().Добавить(); + КонецЕсли; + + Если ЭтоПодсистема(ОбъектМетаданных) И НоваяВетка.ПолучитьЭлементы().Количество() = 0 Тогда + Индекс = Ветка.ПолучитьЭлементы().Индекс(НоваяВетка); + Ветка.ПолучитьЭлементы().Удалить(Индекс); + КонецЕсли; КонецЦикла; - Возврат ДоступностьОбъектов; +КонецПроцедуры + +&НаСервере +Функция КартинкаВИнтерфейсе(ОбъектМетаданных) + + СвойстваОбъекта = Новый Структура("Картинка"); + ЗаполнитьЗначенияСвойств(СвойстваОбъекта, ОбъектМетаданных); + Если ЗначениеЗаполнено(СвойстваОбъекта.Картинка) Тогда + Возврат СвойстваОбъекта.Картинка; + КонецЕсли; + + Возврат Неопределено; КонецФункции +&НаСервереБезКонтекста +Функция ЭтоПодсистема(ОбъектМетаданных) + Возврат СтрНачинаетсяС(ОбъектМетаданных.ПолноеИмя(), "Подсистема"); +КонецФункции + +&НаСервере +Функция ОбъектМетаданныхДоступен(ОбъектМетаданных) + + Если Не ОбщегоНазначения.ЭтоСправочник(ОбъектМетаданных) + И Не ОбщегоНазначения.ЭтоДокумент(ОбъектМетаданных) + И Не ОбщегоНазначения.ЭтоЖурналДокументов(ОбъектМетаданных) + И Не ОбщегоНазначения.ЭтоПланВидовХарактеристик(ОбъектМетаданных) + И Не ОбщегоНазначения.ЭтоПланВидовХарактеристик(ОбъектМетаданных) + И Не ОбщегоНазначения.ЭтоПланСчетов(ОбъектМетаданных) + И Не ОбщегоНазначения.ЭтоПланВидовРасчета(ОбъектМетаданных) + И Не ОбщегоНазначения.ЭтоБизнесПроцесс(ОбъектМетаданных) + И Не ОбщегоНазначения.ЭтоЗадача(ОбъектМетаданных) + И Не ЭтоПодсистема(ОбъектМетаданных) Тогда + Возврат Ложь; + КонецЕсли; + + ДоступенПоПравам = ПравоДоступа("Просмотр", ОбъектМетаданных); + ДоступенПоФункциональнымОпциям = ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(ОбъектМетаданных); + + СвойстваМетаданного = Новый Структура("ПолнотекстовыйПоиск, ВключатьВКомандныйИнтерфейс"); + ЗаполнитьЗначенияСвойств(СвойстваМетаданного, ОбъектМетаданных); + + Если СвойстваМетаданного.ПолнотекстовыйПоиск = Неопределено Тогда + ИспользованиеПолнотекстовогоПоиска = Истина; + Иначе + ИспользованиеПолнотекстовогоПоиска = (СвойстваМетаданного.ПолнотекстовыйПоиск = + Метаданные.СвойстваОбъектов.ИспользованиеПолнотекстовогоПоиска.Использовать); + КонецЕсли; + + Если СвойстваМетаданного.ВключатьВКомандныйИнтерфейс = Неопределено Тогда + ВключатьВКомандныйИнтерфейс = Истина; + Иначе + ВключатьВКомандныйИнтерфейс = СвойстваМетаданного.ВключатьВКомандныйИнтерфейс; + КонецЕсли; + + Возврат ДоступенПоПравам И ДоступенПоФункциональнымОпциям + И ИспользованиеПолнотекстовогоПоиска И ВключатьВКомандныйИнтерфейс; + +КонецФункции + +&НаСервере +Функция ПодчиненныеСправочники(ОбъектМетаданных) + + Если ПодчиненныеСправочники = Неопределено Тогда + ПодчиненныеСправочники = Новый Соответствие; + + Для Каждого Справочник Из Метаданные.Справочники Цикл + Если ПодчиненныеСправочники[Справочник] = Неопределено Тогда + ПодчиненныеСправочники[Справочник] = Новый Массив; + КонецЕсли; + Для Каждого ВладелецСправочника Из Справочник.Владельцы Цикл + Если ПодчиненныеСправочники[ВладелецСправочника] = Неопределено Тогда + ПодчиненныеСправочники[ВладелецСправочника] = Новый Массив; + КонецЕсли; + СписокСправочников = ПодчиненныеСправочники[ВладелецСправочника]; // Массив + СписокСправочников.Добавить(Справочник); + КонецЦикла; + КонецЦикла; + КонецЕсли; + + Возврат ПодчиненныеСправочники[ОбъектМетаданных]; + +КонецФункции + +&НаСервере +Процедура ВывестиМакеты(ОписаниеОбъекта) + + Если Не ЗначениеЗаполнено(ОписаниеОбъекта.Идентификатор) Тогда + Возврат; + КонецЕсли; + + МакетыОбъекта = МакетыОбъекта(ОписаниеОбъекта.Идентификатор); + Ветка = ОписаниеОбъекта; + КоллекцияЭлементов = Ветка.ПолучитьЭлементы(); + + Для Индекс = 0 По МакетыОбъекта.Количество() -1 Цикл + ОписаниеМакета = МакетыОбъекта[Индекс]; + Макет = КоллекцияЭлементов.Вставить(Индекс); + ЗаполнитьЗначенияСвойств(Макет, ОписаниеМакета); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Функция МакетыОбъекта(ИмяОбъектаМетаданных) + + НайденныйЭлемент = ОбъектыСКомандамиПечати.НайтиПоЗначению(ИмяОбъектаМетаданных); + Если НайденныйЭлемент = Неопределено Тогда + Возврат Новый ТаблицаЗначений; + КонецЕсли; + + Если ЗначениеЗаполнено(НайденныйЭлемент.Представление) Тогда + МакетыОбъекта = ОбщегоНазначения.ЗначениеИзСтрокиXML(НайденныйЭлемент.Представление); + Иначе + МакетыОбъекта = РегистрыСведений.ПользовательскиеМакетыПечати.МакетыОбъекта(ИмяОбъектаМетаданных); + НайденныйЭлемент.Представление = ОбщегоНазначения.ЗначениеВСтрокуXML(МакетыОбъекта); + КонецЕсли; + + Возврат МакетыОбъекта; + +КонецФункции + +&НаСервере +Функция НайтиВеткиВладельцаМакетов(Владелец, ТекущаяВетка, НайденныеВетки = Неопределено) + + Если НайденныеВетки = Неопределено Тогда + НайденныеВетки = Новый Массив; + КонецЕсли; + + Для Каждого Ветка Из ТекущаяВетка.ПолучитьЭлементы() Цикл + Если Ветка.ЭтоГруппа И Ветка.Владелец = Владелец Тогда + НайденныеВетки.Добавить(Ветка); + Иначе + НайтиВеткиВладельцаМакетов(Владелец, Ветка, НайденныеВетки) + КонецЕсли; + КонецЦикла; + + Возврат НайденныеВетки; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция НайтиМакеты(Знач Идентификатор, Знач Ветка) + + Результат = Новый Массив; + + Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл + Если Элемент.Идентификатор = Идентификатор Тогда + Результат.Добавить(Элемент); + Иначе + ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, НайтиМакеты(Идентификатор, Элемент)); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Процедура ПрименитьОтбор() + + Если ОтборУстановлен() Тогда + ЗагрузитьСписокМакетов(); + КонецЕсли; + + ОтметитьЭлементыСоответствующиеОтбору(); + + Если Не ОтборУстановлен() Тогда + Возврат; + КонецЕсли; + + РазвернутьЭлементыСоответствующиеОтбору(); + + Если Элементы.Макеты.ТекущиеДанные <> Неопределено Тогда + Если СоответствуетОтбору(Элементы.Макеты.ТекущиеДанные) Тогда + // Переход к текущей строке, если она не видна после изменения состава видимых строк. + ТекущаяСтрока = Элементы.Макеты.ТекущаяСтрока; + Элементы.Макеты.ТекущаяСтрока = 0; + Элементы.Макеты.ТекущаяСтрока = ТекущаяСтрока; + Иначе + ПерейтиКПервомуНайденномуМакету(); + КонецЕсли; + КонецЕсли; + + УстановитьДоступностьКнопокКоманднойПанели(); + +КонецПроцедуры + +&НаКлиенте +Процедура РазвернутьЭлементыСоответствующиеОтбору(Ветка = Неопределено) + + Если Не ЗначениеЗаполнено(СтрокаПоиска) Тогда + Возврат; + КонецЕсли;; + + Если Ветка = Неопределено Тогда + Ветка = Макеты; + КонецЕсли; + + Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл + КоллекцияПодчиненныхЭлементов = Элемент.ПолучитьЭлементы(); + Если Элемент.ЕстьЭлементыСоответствующиеОтбору И КоллекцияПодчиненныхЭлементов.Количество() > 0 + И ЗначениеЗаполнено(КоллекцияПодчиненныхЭлементов[0].Идентификатор) Тогда + Элементы.Макеты.Развернуть(Элемент.ПолучитьИдентификатор(), Ложь); + РазвернутьЭлементыСоответствующиеОтбору(Элемент); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Функция ОтметитьЭлементыСоответствующиеОтбору(Знач Ветка = Неопределено) + + Если Ветка = Неопределено Тогда + Ветка = Макеты; + КонецЕсли; + + ЕстьЭлементыСоответствующиеОтбору = Не ОтборУстановлен(); + + Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл + Элемент.СоответствуетОтбору = СоответствуетОтбору(Элемент); + Элемент.ЕстьЭлементыСоответствующиеОтбору = ОтметитьЭлементыСоответствующиеОтбору(Элемент); + + ЕстьЭлементыСоответствующиеОтбору = ЕстьЭлементыСоответствующиеОтбору + Или Элемент.СоответствуетОтбору Или Элемент.ЕстьЭлементыСоответствующиеОтбору; + КонецЦикла; + + Возврат ЕстьЭлементыСоответствующиеОтбору; + +КонецФункции + +&НаКлиенте +Функция СоответствуетОтбору(Элемент) + + Возврат (Не ЗначениеЗаполнено(СтрокаПоиска) Или СтрНайти(Элемент.СтрокаПоиска, НРег(СокрЛП(СтрокаПоиска)))) + И (Не Элемент.ЭтоГруппа И ПоказыватьИзмененные И Элемент.Изменен + И (ПоказыватьИспользуемые И Элемент.Используется Или ПоказыватьНеиспользуемые И Не Элемент.Используется) + Или ПоказыватьНеизмененные И Не Элемент.Изменен) + И (Не ЗначениеЗаполнено(ОтборПоЯзыку) Или СтрНайти(Элемент.ДоступныеЯзыки, ОтборПоЯзыку)); + +КонецФункции + +&НаКлиенте +Функция ОтборУстановлен() + + Возврат ЗначениеЗаполнено(СтрокаПоиска) + Или ОтборПоИспользованиюМакета <> "ВсеМакеты" + Или ЗначениеЗаполнено(ОтборПоЯзыку); + +КонецФункции + +&НаСервере +Процедура ЗаполнитьОбъектыСКомандамиПечати() + + Для Каждого ОбъектМетаданных Из УправлениеПечатью.ИсточникиКомандПечати() Цикл + ОбъектыСКомандамиПечати.Добавить(ОбъектМетаданных.ПолноеИмя()); + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Функция ПерейтиКПервомуНайденномуМакету(Знач Ветка = Неопределено) + + Если Ветка = Неопределено Тогда + Ветка = Макеты; + КонецЕсли; + + Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл + Если Элемент.СоответствуетОтбору Тогда + Элементы.Макеты.ТекущаяСтрока = Элемент.ПолучитьИдентификатор(); + Возврат Истина; + КонецЕсли; + Если ПерейтиКПервомуНайденномуМакету(Элемент) Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +&НаСервере +Процедура ПерейтиКЭлементу(Знач ПутьКЭлементу, Знач Ветка = Неопределено) + + Если Ветка = Неопределено Тогда + Ветка = Макеты; + КонецЕсли; + + ЧастиПути = СтрРазделить(ПутьКЭлементу, "/", Ложь); + Если ЧастиПути.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ИдентификаторТекущейВетки = ЧастиПути[0]; + Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл + Если Элемент.Идентификатор = ИдентификаторТекущейВетки Тогда + Если ЧастиПути.Количество() = 1 Тогда + Элементы.Макеты.ТекущаяСтрока = Элемент.ПолучитьИдентификатор(); + Возврат; + КонецЕсли; + + ЗагрузитьПодчиненныеЭлементы(Элемент.ПолучитьИдентификатор()); + + ЧастиПути.Удалить(0); + ПутьКЭлементу = СтрСоединить(ЧастиПути, "/"); + ПерейтиКЭлементу(ПутьКЭлементу, Элемент); + Возврат; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Функция ПутьКМакетуВДереве(Макет) + + Если Макет = Неопределено Тогда + Возврат ""; + КонецЕсли; + + Возврат ПутьКМакетуВДереве(Макет.ПолучитьРодителя()) + "/" + Макет.Идентификатор; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Процедура ОчиститьКэш(ИмяОбъектаМетаданных, ОбъектыСКомандамиПечати) + + НайденныйЭлемент = ОбъектыСКомандамиПечати.НайтиПоЗначению(ИмяОбъектаМетаданных); + НайденныйЭлемент.Представление = ""; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗагрузитьСписокМакетов() + + Если ВыполняетсяЗагрузкаДанных Или Не ЕстьОбъектыБезКэша() Тогда + Возврат; + КонецЕсли; + + ВыполняетсяЗагрузкаДанных = Истина; + Элементы.ВыполняетсяПоиск.Видимость = Истина; + + ДлительнаяОперация = НачатьВыполнениеНаСервере(); + ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбработатьРезультат", ЭтотОбъект); + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); + ПараметрыОжидания.ВыводитьОкноОжидания = Ложь; + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания); + +КонецПроцедуры + +&НаСервере +Функция НачатьВыполнениеНаСервере() + + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(УникальныйИдентификатор); + Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, + "РегистрыСведений.ПользовательскиеМакетыПечати.МакетыОбъектов", ОбъектыБезКэша()); + +КонецФункции + +&НаКлиенте +Процедура ОбработатьРезультат(Результат, ДополнительныеПараметры) Экспорт + + ВыполняетсяЗагрузкаДанных = Ложь; + Элементы.ВыполняетсяПоиск.Видимость = Ложь; + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + ОбработатьРезультатНаСервере(Результат.АдресРезультата); + ОбновитьВидимостьМакетов(); + +КонецПроцедуры + +&НаСервере +Процедура ОбработатьРезультатНаСервере(АдресРезультата) + + МакетыОбъектов = ПолучитьИзВременногоХранилища(АдресРезультата); // См. РегистрыСведений.ПользовательскиеМакетыПечати.МакетыОбъектов + ЗаписатьКэшМакетов(МакетыОбъектов); + + ЗагрузитьВетку(Макеты); + +КонецПроцедуры + +&НаКлиенте +Функция ЕстьОбъектыБезКэша() + + Для Каждого Элемент Из ОбъектыСКомандамиПечати Цикл + Если Не ЗначениеЗаполнено(Элемент.Представление) Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +&НаСервере +Функция ОбъектыБезКэша() + + Результат = Новый Массив; + Для Каждого Элемент Из ОбъектыСКомандамиПечати Цикл + Если Не ЗначениеЗаполнено(Элемент.Представление) Тогда + Результат.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Элемент.Значение)); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +&НаСервере +Процедура ЗаписатьКэшМакетов(МакетыОбъектов) + + ИдентификаторыОбъектовМетаданных = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ОбъектыСКомандамиПечати.ВыгрузитьЗначения()); + + Для Каждого Элемент Из ОбъектыСКомандамиПечати Цикл + Если ЗначениеЗаполнено(Элемент.Представление) Тогда + Продолжить; + КонецЕсли; + + Владелец = ИдентификаторыОбъектовМетаданных[Элемент.Значение]; + НайденныеМакеты = МакетыОбъектов.НайтиСтроки(Новый Структура("Владелец", Владелец)); + МакетыОбъекта = МакетыОбъектов.Скопировать(НайденныеМакеты); + Элемент.Представление = ОбщегоНазначения.ЗначениеВСтрокуXML(МакетыОбъекта); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ЗагрузитьВетку(Ветка) + + Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл + ЗагрузитьПодчиненныеЭлементы(Элемент.ПолучитьИдентификатор()); + Для Каждого ПодчиненныйЭлемент Из Элемент.ПолучитьЭлементы() Цикл + ЗагрузитьВетку(ПодчиненныйЭлемент); + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ПроверкаПечатныхФорм/Form.form b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ПроверкаПечатныхФорм/Form.form index 2595cf3d8..d25db1de1 100644 --- a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ПроверкаПечатныхФорм/Form.form +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ПроверкаПечатныхФорм/Form.form @@ -96,7 +96,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/РедактированиеМакета/Form.form b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/РедактированиеМакета/Form.form index f23b7765d..cada61c4c 100644 --- a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/РедактированиеМакета/Form.form +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/РедактированиеМакета/Form.form @@ -823,7 +823,6 @@ HorizontalIfPossible Bottom - Auto true true Auto diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/РедактированиеМакета/Module.bsl b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/РедактированиеМакета/Module.bsl index dfae64f6f..18b97a23f 100644 --- a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/РедактированиеМакета/Module.bsl +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/РедактированиеМакета/Module.bsl @@ -164,23 +164,50 @@ АдресПрограммыДляОткрытияМакета = ""; КонецЕсли; - ОписаниеДействия = ?(Параметры.ТолькоОткрытие, НСтр("ru = 'открытия'"), НСтр("ru = 'внесения изменений'")); + ПерейтиНаСтаницуПрограммы = НСтр("ru = 'Перейти на страницу программы ""%1"" для установки'"); + ПерейтиНаСтаницуПрограммы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ПерейтиНаСтаницуПрограммы, НазваниеПрограммыДляОткрытияМакета); + Элементы.СсылкаНаСтраницуПрограммыПередЗагрузкойВебКлиент.Заголовок = ПерейтиНаСтаницуПрограммы; + Элементы.СсылкаНаСтраницуПрограммыПередЗагрузкойНеВебКлиент.Заголовок = ПерейтиНаСтаницуПрограммы; + Элементы.СсылкаНаСтраницуПрограммыЗавершениеИзмененияВебКлиент.Заголовок = ПерейтиНаСтаницуПрограммы; + Элементы.СсылкаНаСтраницуПрограммыЗавершениеИзмененияНеВебКлиент.Заголовок = ПерейтиНаСтаницуПрограммы; - ЗаполняемыеЭлементы = Новый Массив; // Массив из ДекорацияФормы - ЗаполняемыеЭлементы.Добавить(Элементы.СсылкаНаСтраницуПрограммыПередЗагрузкойВебКлиент); - ЗаполняемыеЭлементы.Добавить(Элементы.СсылкаНаСтраницуПрограммыПередЗагрузкойНеВебКлиент); - ЗаполняемыеЭлементы.Добавить(Элементы.СсылкаНаСтраницуПрограммыЗавершениеИзмененияВебКлиент); - ЗаполняемыеЭлементы.Добавить(Элементы.СсылкаНаСтраницуПрограммыЗавершениеИзмененияНеВебКлиент); - ЗаполняемыеЭлементы.Добавить(Элементы.НадписьПередЗагрузкойМакетаПрограммаВебКлиент); - ЗаполняемыеЭлементы.Добавить(Элементы.НадписьПередЗагрузкойМакетаПрограммаНеВебКлиент); - ЗаполняемыеЭлементы.Добавить(Элементы.НадписьЗавершениеИзмененияВебКлиент); - ЗаполняемыеЭлементы.Добавить(Элементы.НадписьЗавершениеИзмененияНеВебКлиент); + Элементы.НадписьПередЗагрузкойМакетаИнструкцияВебКлиент.Заголовок = + НСтр("ru = 'Нажмите на кнопку ""Продолжить"", чтобы начать загрузку.'"); + Элементы.НадписьПередЗагрузкойМакетаИнструкцияНеВебКлиент.Заголовок = + НСтр("ru = 'Нажмите на кнопку ""Продолжить"" для открытия макета в другой программе. Внесите в макет изменения, закройте его и следуйте дальнейшим инструкциям.'"); - Для Каждого Элемент Из ЗаполняемыеЭлементы Цикл - Элемент.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Элемент.Заголовок, ПредставлениеМакета, - НазваниеПрограммыДляОткрытияМакета, ОписаниеДействия); - КонецЦикла; + Если Параметры.ТолькоОткрытие Тогда + Элементы.НадписьПередЗагрузкойМакетаПрограммаВебКлиент.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл макета ""%1"" подготовлен для загрузки на компьютер и открытия с помощью другой программы. + | + |Если программа для редактирования еще не установлена, рекомендуется установить ""%2"".'"), ПредставлениеМакета, + НазваниеПрограммыДляОткрытияМакета); + Иначе + Элементы.НадписьПередЗагрузкойМакетаПрограммаВебКлиент.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл макета ""%1"" подготовлен для загрузки на компьютер и внесения изменений с помощью другой программы. + | + |Если программа для редактирования еще не установлена, рекомендуется установить ""%2"".'"), ПредставлениеМакета, + НазваниеПрограммыДляОткрытияМакета); + КонецЕсли; + Элементы.НадписьПередЗагрузкойМакетаПрограммаНеВебКлиент.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл макета ""%1"" подготовлен для внесения изменений с помощью другой программы. Если программа для редактирования еще не установлена, рекомендуется установить ""%2"".'"), + ПредставлениеМакета, НазваниеПрограммыДляОткрытияМакета); + + Элементы.НадписьЗавершениеИзмененияВебКлиент.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Дождитесь окончания загрузки файла макета, затем откройте и отредактируйте его. + | + |После завершения редактирования, закройте файл макета, подтвердив изменения. Затем нажмите на кнопку ""Завершить изменение"" и выберите этот файл в следующем диалоге. + | + |Если программа для редактирования еще не установлена, рекомендуется установить ""%1"".'"), НазваниеПрограммыДляОткрытияМакета); + + Элементы.НадписьЗавершениеИзмененияНеВебКлиент.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Дождитесь открытия макета в программе для редактирования. + | + |После завершения редактирования, закройте макет, подтвердив изменения. Затем нажмите на кнопку ""Завершить изменение"". + | + |Если программа для редактирования еще не установлена, рекомендуется установить ""%1"".'"), НазваниеПрограммыДляОткрытияМакета); + ВидимостьСсылкиНаСтраницуПрограммы = (ОбщегоНазначения.ЭтоВебКлиент() Или ТипФайла <> "mxl") И ТипФайла <> "docx"; Элементы.СсылкаНаСтраницуПрограммыПередЗагрузкойВебКлиент.Видимость = ВидимостьСсылкиНаСтраницуПрограммы; Элементы.СсылкаНаСтраницуПрограммыПередЗагрузкойНеВебКлиент.Видимость = ВидимостьСсылкиНаСтраницуПрограммы; @@ -201,7 +228,7 @@ Результат = ИмяМакета; - Владелец = Метаданные.НайтиПоПолномуИмени(ИмяВладельца); + Владелец = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяВладельца); Если Владелец <> Неопределено Тогда Макет = Владелец.Макеты.Найти(ИмяМакета); Если Макет <> Неопределено Тогда diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/ManagerModule.bsl b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/ManagerModule.bsl index 565e3d226..f58055dde 100644 --- a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/ManagerModule.bsl @@ -102,6 +102,41 @@ КонецПроцедуры +Функция ПолучитьКлючЗаписиМакета(ИдентификаторМакета) Экспорт + МассивСловИдентификатора = СтрРазделить(ИдентификаторМакета, ".", Ложь); + + ИмяМакета = МассивСловИдентификатора[МассивСловИдентификатора.ВГраница()]; + МассивСловИдентификатора.Удалить(МассивСловИдентификатора.ВГраница()); + ИмяОбъекта = СтрСоединить(МассивСловИдентификатора, "."); + + ТекстЗапроса = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ПользовательскиеМакетыПечати.Объект КАК Объект, + | ПользовательскиеМакетыПечати.ИмяМакета КАК ИмяМакета + |ИЗ + | РегистрСведений.ПользовательскиеМакетыПечати КАК ПользовательскиеМакетыПечати + |ГДЕ + | ПользовательскиеМакетыПечати.Объект = &Объект + | И ПользовательскиеМакетыПечати.ИмяМакета ПОДОБНО &ИмяМакета + | И ПользовательскиеМакетыПечати.Использование"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.Параметры.Вставить("Объект", ИмяОбъекта); + Запрос.Параметры.Вставить("ИмяМакета", ИмяМакета + "%"); + Результат = Запрос.Выполнить(); + Выборка = Результат.Выбрать(); + + + Если Выборка.Следующий() Тогда + СтруктураКлюча = Новый Структура("Объект, ИмяМакета"); + ЗаполнитьЗначенияСвойств(СтруктураКлюча, Выборка); + КлючОбъектаРедактирования = СоздатьКлючЗаписи(СтруктураКлюча); + Возврат КлючОбъектаРедактирования; + Иначе + Возврат Неопределено + КонецЕсли; +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -114,9 +149,16 @@ Процедура УстановитьИспользованиеИзмененныхМакетов(Макеты, ИспользуетсяИзмененный) Экспорт + ТаблицаДляПоиска = Новый ТаблицаЗначений; + ТаблицаДляПоиска.Колонки.Добавить("ИмяМакета", Новый ОписаниеТипов("Строка", , + Новый КвалификаторыСтроки(100, ДопустимаяДлина.Переменная))); + ТаблицаДляПоиска.Колонки.Добавить("ИмяВладельца", Новый ОписаниеТипов("Строка", , + Новый КвалификаторыСтроки(255, ДопустимаяДлина.Переменная))); + Для Каждого ИмяОбъектаМетаданныхМакета Из Макеты Цикл + СтрокаТаблицы = ТаблицаДляПоиска.Добавить(); ЧастиИмени = СтрРазделить(ИмяОбъектаМетаданныхМакета, "."); - ИмяМакета = ЧастиИмени[ЧастиИмени.ВГраница()]; + СтрокаТаблицы.ИмяМакета = ЧастиИмени[ЧастиИмени.ВГраница()]; ИмяВладельца = ""; Для НомерЧасти = 0 По ЧастиИмени.ВГраница()-1 Цикл @@ -126,34 +168,422 @@ ИмяВладельца = ИмяВладельца + ЧастиИмени[НомерЧасти]; КонецЦикла; - ТекстЗапроса = - "ВЫБРАТЬ - | ПользовательскиеМакетыПечати.ИмяМакета КАК ИмяМакета - |ИЗ - | РегистрСведений.ПользовательскиеМакетыПечати КАК ПользовательскиеМакетыПечати - |ГДЕ - | ПользовательскиеМакетыПечати.Объект = &Объект - | И ПользовательскиеМакетыПечати.ИмяМакета ПОДОБНО &ИмяМакета"; + СтрокаТаблицы.ИмяВладельца = ИмяВладельца; + КонецЦикла; - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.Параметры.Вставить("Объект", ИмяВладельца); - Запрос.Параметры.Вставить("ИмяМакета", ИмяМакета + "%"); - Выборка = Запрос.Выполнить().Выбрать(); - - Пока Выборка.Следующий() Цикл - Запись = РегистрыСведений.ПользовательскиеМакетыПечати.СоздатьМенеджерЗаписи(); - Запись.Объект = ИмяВладельца; + ТекстЗапроса = + "ВЫБРАТЬ + | ТаблицаДляПоиска.ИмяМакета ИмяМакета, + | ТаблицаДляПоиска.ИмяВладельца ИмяВладельца + |ПОМЕСТИТЬ ВТТаблицаДляПоиска + |ИЗ + | &ТаблицаДляПоиска КАК ТаблицаДляПоиска + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ТаблицаДляПоиска.ИмяВладельца, + | ТаблицаДляПоиска.ИмяМакета КАК ИмяМакетаДляПоиска, + | ПользовательскиеМакетыПечати.ИмяМакета + |ИЗ + | ВТТаблицаДляПоиска КАК ТаблицаДляПоиска + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПользовательскиеМакетыПечати КАК ПользовательскиеМакетыПечати + | ПО ПользовательскиеМакетыПечати.Объект = ТаблицаДляПоиска.ИмяВладельца"; + + Запрос = Новый Запрос(ТекстЗапроса); + + Запрос.УстановитьПараметр("ТаблицаДляПоиска", ТаблицаДляПоиска); + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + Если СтрНачинаетсяС(Выборка.ИмяМакета, Выборка.ИмяМакетаДляПоиска) Тогда + Запись = СоздатьМенеджерЗаписи(); + Запись.Объект = Выборка.ИмяВладельца; Запись.ИмяМакета = Выборка.ИмяМакета; Запись.Прочитать(); Если Запись.Выбран() Тогда Запись.Использование = ИспользуетсяИзмененный; Запись.Записать(); КонецЕсли; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Параметры: +// ИмяОбъекта - Строка +// +Функция МакетыОбъекта(ИмяОбъекта) Экспорт + + ИдентификаторОбъектаМетаданных = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ИмяОбъекта); + Возврат МакетыОбъектов(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ИдентификаторОбъектаМетаданных)); + +КонецФункции + +// Возвращаемое значение: +// ТаблицаЗначений +// +Функция МакетыОбъектов(ИдентификаторыОбъектовМетаданных) Экспорт + + СписокМакетов = Новый ТаблицаЗначений(); + СписокМакетов.Колонки.Добавить("ИсточникМакета"); + СписокМакетов.Колонки.Добавить("ИсточникиДанных"); + СписокМакетов.Колонки.Добавить("Идентификатор"); + СписокМакетов.Колонки.Добавить("Представление"); + СписокМакетов.Колонки.Добавить("Владелец"); + СписокМакетов.Колонки.Добавить("ТипМакета"); + СписокМакетов.Колонки.Добавить("Картинка"); + СписокМакетов.Колонки.Добавить("КартинкаГруппы"); + СписокМакетов.Колонки.Добавить("СтрокаПоиска"); + СписокМакетов.Колонки.Добавить("ДоступныеЯзыки"); + СписокМакетов.Колонки.Добавить("Изменен"); + СписокМакетов.Колонки.Добавить("ИспользуетсяИзмененный"); + СписокМакетов.Колонки.Добавить("КартинкаИспользования"); + СписокМакетов.Колонки.Добавить("ДоступенПеревод"); + СписокМакетов.Колонки.Добавить("Ссылка"); + СписокМакетов.Колонки.Добавить("Используется"); + СписокМакетов.Колонки.Добавить("ДоступнаНастройкаВидимости"); + СписокМакетов.Колонки.Добавить("Поставляемый"); + СписокМакетов.Колонки.Добавить("ЭтоПечатнаяФорма"); + СписокМакетов.Колонки.Добавить("ДоступноСоздание"); + СписокМакетов.Колонки.Добавить("ИмяОбъектаМетаданныхМакета"); + + СписокМакетов.Индексы.Добавить("Владелец"); + + ДобавитьПользовательскиеМакеты(СписокМакетов, , ИдентификаторыОбъектовМетаданных); + ДобавитьМакетыИзМетаданных(СписокМакетов, ИдентификаторыОбъектовМетаданных); + + СписокМакетов.Сортировать("Представление"); + + Возврат СписокМакетов; + +КонецФункции + +Процедура ДобавитьМакетыИзМетаданных(СписокМакетов, ИдентификаторыОбъектовМетаданных) + + ОбъектыМетаданныхПоИдентификаторам = ОбщегоНазначения.ОбъектыМетаданныхПоИдентификаторам(ИдентификаторыОбъектовМетаданных); + + ОбъектыМетаданных = Новый Массив; + Для Каждого ОписаниеОбъектаМетаданных Из ОбъектыМетаданныхПоИдентификаторам Цикл + ОбъектМетаданных = ОписаниеОбъектаМетаданных.Значение; + ОбъектыМетаданных.Добавить(ОбъектМетаданных); + КонецЦикла; + + ИзмененныеМакеты = ИзмененныеМакеты(); + + ДоступныеДляПереводаМакеты = Новый Соответствие; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда + МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); + ДоступныеДляПереводаМакеты = МодульУправлениеПечатьюМультиязычность.ДоступныеДляПереводаМакеты(); + КонецЕсли; + + Для Каждого ОписаниеОбъектаМетаданных Из ОбъектыМетаданныхПоИдентификаторам Цикл + + ОбъектМетаданныхВладелецМакета = ОписаниеОбъектаМетаданных.Значение; + ПодключенныеМакеты = ПодключенныеМакеты(ОписаниеОбъектаМетаданных.Ключ); + Владелец = ?(Метаданные.ОбщиеМакеты = ОбъектМетаданныхВладелецМакета, + Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка(), ОписаниеОбъектаМетаданных.Ключ); + + КоллекцииМакетов = Новый Массив; + КоллекцииМакетов.Добавить(ОбъектМетаданныхВладелецМакета.Макеты); + КоллекцииМакетов.Добавить(ПодключенныеМакеты); + + Для Каждого КоллекцияМакетов Из КоллекцииМакетов Цикл + Для Каждого Элемент Из КоллекцияМакетов Цикл + ИмяВладельца = ?(Метаданные.ОбщиеМакеты = ОбъектМетаданныхВладелецМакета, + "ОбщийМакет", ОбъектМетаданныхВладелецМакета.ПолноеИмя()); + + ОбъектМетаданныхМакет = Элемент; + ИсточникМакета = ИмяВладельца; + ИсточникиДанных = ИмяВладельца; + + Если ТипЗнч(КоллекцияМакетов) = Тип("ТаблицаЗначений") Тогда + ОбъектМетаданныхМакет = Элемент.ОбъектМетаданных; + ИсточникМакета = Элемент.ИсточникМакета; + ИсточникиДанных = Элемент.ИсточникиДанных; + КонецЕсли; + + Если Не СтрНайти(ОбъектМетаданныхМакет.Имя, "ПФ_") Тогда + Продолжить; + КонецЕсли; + + ИмяОбъектаМетаданныхМакета = ИсточникМакета + "." + ОбъектМетаданныхМакет.Имя; + ПредставлениеМакета = ОбъектМетаданныхМакет.Представление(); + + ТипМакета = ТипМакета(ОбъектМетаданныхМакет.Имя, ИсточникМакета); + + Макет = СписокМакетов.Добавить(); + Макет.ИсточникМакета = ИсточникМакета; + Макет.ИсточникиДанных = ИсточникиДанных; + Макет.Идентификатор = ИмяОбъектаМетаданныхМакета; + Макет.Представление = ПредставлениеМакета; + Макет.Владелец = Владелец; + Макет.ТипМакета = ТипМакета; + Макет.Картинка = ИндексКартинки(ТипМакета); + Макет.КартинкаГруппы = КартинкаМакета(ТипМакета); + Макет.Изменен = ИзмененныеМакеты[ИмяОбъектаМетаданныхМакета] <> Неопределено; + Макет.ИспользуетсяИзмененный = Макет.Изменен И ИзмененныеМакеты[ИмяОбъектаМетаданныхМакета]; + Макет.ДоступенПеревод = ДоступныеДляПереводаМакеты[ОбъектМетаданныхМакет] = Истина; + Макет.Используется = Истина; + Макет.Поставляемый = Истина; + + Если ЗначениеЗаполнено(Макет.Владелец) Тогда + Макет.ЭтоПечатнаяФорма = УправлениеПечатью.ЭтоПечатнаяФорма(Макет.Идентификатор, Макет.Владелец); + Макет.ДоступенПеревод = Макет.ДоступенПеревод Или Макет.ЭтоПечатнаяФорма; + КонецЕсли; + + Макет.ИмяОбъектаМетаданныхМакета = Макет.Идентификатор; + Макет.ДоступныеЯзыки = ДоступныеЯзыкиМакета(Макет.Идентификатор); + Макет.КартинкаИспользования = -1; + Если Макет.Изменен Тогда + Макет.КартинкаИспользования = Число(Макет.Изменен) + Число(Макет.ИспользуетсяИзмененный); + КонецЕсли; + Макет.СтрокаПоиска = НРег(Макет.Представление + " " + Макет.ТипМакета); + Макет.ДоступноСоздание = ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(ОбъектМетаданныхВладелецМакета); + + КонецЦикла; КонецЦикла; КонецЦикла; КонецПроцедуры +Функция ПодключенныеМакеты(ИдентификаторОбъектаМетаданных) + + Результат = Новый ТаблицаЗначений; + Результат.Колонки.Добавить("ОбъектМетаданных"); + Результат.Колонки.Добавить("ИсточникМакета"); + Результат.Колонки.Добавить("ИсточникиДанных"); + + ПодключенныеОтчетыИОбработки = ПодключаемыеКоманды.ПодключенныеОбъекты(ИдентификаторОбъектаМетаданных); + Для Каждого ПодключенныйОбъект Из ПодключенныеОтчетыИОбработки Цикл + ИсточникиДанных = Новый Массив; + Для Каждого ОбъектМетаданных Из ПодключенныйОбъект.Размещение Цикл + ИсточникиДанных.Добавить(ОбъектМетаданных.ПолноеИмя()); + КонецЦикла; + Для Каждого Макет Из ПодключенныйОбъект.Метаданные.Макеты Цикл + Если СтрНачинаетсяС(Макет.Имя, "ПФ_") Тогда + ОписаниеМакета = Результат.Добавить(); + ОписаниеМакета.ОбъектМетаданных = Макет; + ОписаниеМакета.ИсточникМакета = ПодключенныйОбъект.Метаданные.ПолноеИмя(); + ОписаниеМакета.ИсточникиДанных = СтрСоединить(ИсточникиДанных, ","); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ИзмененныеМакеты(ОбъектыМетаданных = Неопределено) + + ТекстЗапроса = + "ВЫБРАТЬ + | ИзмененныеМакеты.ИмяМакета, + | ИзмененныеМакеты.Объект, + | ИзмененныеМакеты.Использование + |ИЗ + | РегистрСведений.ПользовательскиеМакетыПечати КАК ИзмененныеМакеты + |ГДЕ + | НЕ &ОтборУстановлен + | ИЛИ ИзмененныеМакеты.Объект В(&Объекты)"; + + ИменаОбъектов = Неопределено; + Если ОбъектыМетаданных <> Неопределено Тогда + ИменаОбъектов = Новый Массив; + Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл + ИменаОбъектов.Добавить(ОбъектМетаданных.ПолноеИмя()); + КонецЦикла; + КонецЕсли; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("ОтборУстановлен", ЗначениеЗаполнено(ИменаОбъектов)); + Запрос.УстановитьПараметр("Объекты", ИменаОбъектов); + ИзмененныеМакеты = Запрос.Выполнить().Выгрузить(); + + ЯзыкиПечатныхФорм = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ОбщегоНазначения.КодОсновногоЯзыка()); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда + МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); + ЯзыкиПечатныхФорм = МодульУправлениеПечатьюМультиязычность.ДоступныеЯзыки(); + КонецЕсли; + + Результат = Новый Соответствие; + + Для Каждого Макет Из ИзмененныеМакеты Цикл + ИмяМакета = Макет.ИмяМакета; + + ИменаМакета = Новый Массив; + ИменаМакета.Добавить(ИмяМакета); + + Для Каждого КодЯзыка Из ЯзыкиПечатныхФорм Цикл + Если СтрНайти(ИмяМакета, "_MXL_") И СтрЗаканчиваетсяНа(ИмяМакета, "_" + КодЯзыка) Тогда + ИмяМакета = Лев(ИмяМакета, СтрДлина(ИмяМакета) - СтрДлина(КодЯзыка) - 1); + ИменаМакета.Добавить(ИмяМакета); + Прервать; + КонецЕсли; + КонецЦикла; + + Для Каждого ИмяМакета Из ИменаМакета Цикл + ИмяОбъектаМетаданныхМакета = Макет.Объект + "." + ИмяМакета; + Результат.Вставить(ИмяОбъектаМетаданныхМакета, Макет.Использование); + КонецЦикла; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Процедура ДобавитьПользовательскиеМакеты(СписокМакетов, Знач Идентификатор = Неопределено, Знач ИсточникиДанных = Неопределено) Экспорт + + Если ЗначениеЗаполнено(Идентификатор) Тогда + Идентификатор = Новый УникальныйИдентификатор(Сред(Идентификатор, 4)); + Иначе + Идентификатор = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ + | МакетыПечатныхФорм.Ссылка, + | МакетыПечатныхФорм.Представление, + | МакетыПечатныхФорм.Используется, + | МакетыПечатныхФорм.ТипМакета, + | МакетыПечатныхФорм.Идентификатор, + | МакетыПечатныхФормИсточникиДанных.ИсточникДанных КАК Владелец + |ИЗ + | Справочник.МакетыПечатныхФорм.ИсточникиДанных КАК МакетыПечатныхФормИсточникиДанных + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.МакетыПечатныхФорм КАК МакетыПечатныхФорм + | ПО МакетыПечатныхФормИсточникиДанных.Ссылка = МакетыПечатныхФорм.Ссылка + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыОбъектовМетаданных + | ПО МакетыПечатныхФормИсточникиДанных.Ссылка = ИдентификаторыОбъектовМетаданных.Ссылка + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовРасширений КАК ИдентификаторыОбъектовРасширений + | ПО МакетыПечатныхФормИсточникиДанных.Ссылка = ИдентификаторыОбъектовРасширений.Ссылка + |ГДЕ + | НЕ МакетыПечатныхФорм.ПометкаУдаления + | И ((НЕ &ОтборПоИсточникамДанныхУстановлен + | ИЛИ МакетыПечатныхФормИсточникиДанных.ИсточникДанных В (&ИсточникиДанных)) + | И (НЕ &ОтборПоИдентификаторуУстановлен + | ИЛИ МакетыПечатныхФорм.Идентификатор = &Идентификатор))"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("ОтборПоИдентификаторуУстановлен", ЗначениеЗаполнено(Идентификатор)); + Запрос.УстановитьПараметр("Идентификатор", Идентификатор); + Запрос.УстановитьПараметр("ОтборПоИсточникамДанныхУстановлен", ИсточникиДанных <> Неопределено); + Запрос.УстановитьПараметр("ИсточникиДанных", ИсточникиДанных); + + ТаблицаМакетов = Запрос.Выполнить().Выгрузить(); + Для Каждого СтрокаТаблицы Из ТаблицаМакетов Цикл + Макет = СписокМакетов.Добавить(); + ЗаполнитьЗначенияСвойств(Макет, СтрокаТаблицы); + + НайденныеСтроки = ТаблицаМакетов.НайтиСтроки(Новый Структура("Идентификатор", Макет.Идентификатор)); + ИсточникиДанных = Новый Массив; + Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл + ИсточникиДанных.Добавить(НайденнаяСтрока.Владелец); + КонецЦикла; + + ОбъектыМетаданныхПоИдентификаторам = ОбщегоНазначения.ОбъектыМетаданныхПоИдентификаторам(ИсточникиДанных, Ложь); + + ИсточникиДанных = Новый Массив; + Для Каждого ОбъектМетаданных Из ОбъектыМетаданныхПоИдентификаторам Цикл + Если ОбъектМетаданных.Значение <> Неопределено Тогда + ИсточникиДанных.Добавить(ОбъектМетаданных.Значение.ПолноеИмя()); + КонецЕсли; + КонецЦикла; + + Макет.ИсточникиДанных = СтрСоединить(ИсточникиДанных, ","); + Макет.Изменен = Истина; + Макет.ИспользуетсяИзмененный = Истина; + Макет.ДоступенПеревод = Истина; + Макет.Идентификатор = "ПФ_" + Строка(Макет.Идентификатор); + Макет.ДоступнаНастройкаВидимости = Истина; + Макет.ЭтоПечатнаяФорма = Истина; + + Макет.ИмяОбъектаМетаданныхМакета = Макет.Идентификатор; + Макет.ДоступныеЯзыки = ДоступныеЯзыкиМакета(Макет.Идентификатор); + + Макет.Картинка = ИндексКартинки(Макет.ТипМакета); + Макет.КартинкаГруппы = КартинкаМакета(Макет.ТипМакета); + Макет.КартинкаИспользования = -1; + + Если Макет.Изменен Тогда + Макет.КартинкаИспользования = Число(Макет.Изменен) + Число(Макет.ИспользуетсяИзмененный); + КонецЕсли; + Макет.СтрокаПоиска = НРег(Макет.Представление + " " + Макет.ТипМакета); + Если ЗначениеЗаполнено(Макет.Владелец) Тогда + ОбъектМетаданныхВладелецМакета = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(Макет.Владелец); + Макет.ДоступноСоздание = ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(ОбъектМетаданныхВладелецМакета); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Функция ДоступныеЯзыкиМакета(Знач ИмяОбъектаМетаданныхМакета) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда + МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); + Возврат МодульУправлениеПечатьюМультиязычность.ПредставлениеЯзыковМакета(ИмяОбъектаМетаданныхМакета); + КонецЕсли; + + Возврат ""; + +КонецФункции + +Функция ТипМакета(ИмяОбъектаМетаданныхМакета, ИмяОбъекта = "ОбщийМакет") + + Позиция = СтрНайти(ИмяОбъектаМетаданныхМакета, "ПФ_"); + Если Позиция = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + Если ИмяОбъекта = "ОбщийМакет" Тогда + МакетПечатнойФормы = ПолучитьОбщийМакет(ИмяОбъектаМетаданныхМакета); + Иначе + УстановитьОтключениеБезопасногоРежима(Истина); + УстановитьПривилегированныйРежим(Истина); + + МакетПечатнойФормы = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИмяОбъекта).ПолучитьМакет(ИмяОбъектаМетаданныхМакета); + + УстановитьПривилегированныйРежим(Ложь); + УстановитьОтключениеБезопасногоРежима(Ложь); + КонецЕсли; + + ТипМакета = Неопределено; + + Если ТипЗнч(МакетПечатнойФормы) = Тип("ТабличныйДокумент") Тогда + ТипМакета = "MXL"; + ИначеЕсли ТипЗнч(МакетПечатнойФормы) = Тип("ДвоичныеДанные") Тогда + ТипМакета = ВРег(УправлениеПечатьюСлужебный.ОпределитьРасширениеФайлаДанныхПоСигнатуре(МакетПечатнойФормы)); + КонецЕсли; + + Возврат ТипМакета; + +КонецФункции + +Функция ИндексКартинки(Знач ТипМакета) + + ТипыМакетов = Новый Соответствие; + ТипыМакетов.Вставить("DOC", 0); + ТипыМакетов.Вставить("DOCX", 0); + ТипыМакетов.Вставить("ODT", 1); + ТипыМакетов.Вставить("MXL", 2); + + Результат = ТипыМакетов[ВРег(ТипМакета)]; + Возврат ?(Результат = Неопределено, -1, Результат); + +КонецФункции + +Функция КартинкаМакета(Знач ТипМакета) + + ТипыМакетов = Новый Соответствие; + ТипыМакетов.Вставить("DOC", БиблиотекаКартинок.ФорматWord); + ТипыМакетов.Вставить("DOCX", БиблиотекаКартинок.ФорматWord2007); + ТипыМакетов.Вставить("ODT", БиблиотекаКартинок.ФорматOpenOfficeCalc); + ТипыМакетов.Вставить("MXL", БиблиотекаКартинок.ФорматMXL); + + Результат = ТипыМакетов[ВРег(ТипМакета)]; + Возврат ?(Результат = Неопределено, Новый Картинка, Результат); + +КонецФункции + #КонецОбласти #КонецЕсли diff --git a/SSL/src/InformationRegisters/ПоставляемыеМакетыПечати/ManagerModule.bsl b/SSL/src/InformationRegisters/ПоставляемыеМакетыПечати/ManagerModule.bsl index ceed7c30f..70d28eefa 100644 --- a/SSL/src/InformationRegisters/ПоставляемыеМакетыПечати/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ПоставляемыеМакетыПечати/ManagerModule.bsl @@ -85,12 +85,12 @@ ТекстОшибки = НСтр("ru = 'Не удалось записать сведения о макете'") + Символы.ПС + Макет.ПолноеИмя() + Символы.ПС - + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); ЗаписьЖурналаРегистрации(НСтр("ru = 'Контроль изменения поставляемых макетов'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, Макет, , ТекстОшибки); - СписокОшибок.Добавить(ИмяВладельца + "." + ИмяМакета + ": " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + СписокОшибок.Добавить(ИмяВладельца + "." + ИмяМакета + ": " + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); МакетыТребующиеОбновленияКонтрольнойСуммы.Вставить(ОписаниеМакета.Ключ, ОписаниеМакета.Значение); КонецПопытки; КонецЦикла; diff --git a/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаЗаписи/Form.form index d0053a2ad..743001cc1 100644 --- a/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаЗаписи/Form.form @@ -223,7 +223,6 @@ UsualGroup Vertical - Auto true true Auto @@ -357,7 +356,6 @@ UsualGroup Vertical - Auto true true Auto @@ -386,7 +384,6 @@ UsualGroup HorizontalIfPossible - Auto WeakSeparation true true @@ -522,7 +519,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаСписка/Form.form index f5682cb15..bf3b4a59c 100644 --- a/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ЗагрузитьПравилаСинхронизацииДанных/Form.form b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ЗагрузитьПравилаСинхронизацииДанных/Form.form index a043ba184..888224282 100644 --- a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ЗагрузитьПравилаСинхронизацииДанных/Form.form +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ЗагрузитьПравилаСинхронизацииДанных/Form.form @@ -121,7 +121,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -150,7 +149,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -283,7 +281,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -358,7 +355,6 @@ UsualGroup Vertical - Auto NormalSeparation true true @@ -561,7 +557,6 @@ UsualGroup Vertical - Auto true true Auto @@ -681,7 +676,6 @@ UsualGroup Vertical - Auto true true Auto @@ -802,7 +796,6 @@ UsualGroup Vertical - Auto true true Auto @@ -873,7 +866,6 @@ UsualGroup Vertical - Auto true true Auto @@ -902,7 +894,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -940,71 +931,6 @@ Auto - - ГруппаДополнительно - 18 - - ИспользоватьФильтрВыборочнойРегистрацииОбъектов - 13 - true - true - - true - - - ИспользоватьФильтрВыборочнойРегистрацииОбъектов - - Right - - ИспользоватьФильтрВыборочнойРегистрацииОбъектовExtendedTooltip - 81 - Label - true - true - - Left - - - - ИспользоватьФильтрВыборочнойРегистрацииОбъектовКонтекстноеМеню - 14 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - - <key>ru</key> - <value>Дополнительно</value> - - - ГруппаДополнительноExtendedTooltip - 80 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - true - LeftWidest - Auto - Auto - - Top true @@ -1264,23 +1190,6 @@ true - - ИспользоватьФильтрВыборочнойРегистрацииОбъектов - - <key>ru</key> - <value>Использовать фильтр выборочной регистрации объектов</value> - - 9 - - Boolean - - - true - - - true - - НеОстанавливатьПоОшибке diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ЗагрузитьПравилаСинхронизацииДанных/Module.bsl b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ЗагрузитьПравилаСинхронизацииДанных/Module.bsl index 634e6bbb5..6d0b1c7a3 100644 --- a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ЗагрузитьПравилаСинхронизацииДанных/Module.bsl +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ЗагрузитьПравилаСинхронизацииДанных/Module.bsl @@ -674,7 +674,6 @@ | ПравилаДляОбменаДанными.ИмяФайлаПравил КАК ИмяФайлаПравилКонвертации, | ПравилаДляОбменаДанными.ИмяФайлаПротоколаОбмена, | ПравилаДляОбменаДанными.ИнформацияОПравилах КАК ИнформацияОПравилахКонвертации, - | ПравилаДляОбменаДанными.ИспользоватьФильтрВыборочнойРегистрацииОбъектов, | ПравилаДляОбменаДанными.ИсточникПравил КАК ИсточникПравилКонвертации, | ПравилаДляОбменаДанными.НеОстанавливатьПоОшибке, | ПравилаДляОбменаДанными.РежимОтладки, diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаКонвертацииОбъектов/Form.form b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаКонвертацииОбъектов/Form.form index 69bd02ca5..f5cdf05c2 100644 --- a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаКонвертацииОбъектов/Form.form +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаКонвертацииОбъектов/Form.form @@ -78,7 +78,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -327,7 +326,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <throughAlign>Auto</throughAlign> <currentRowUse>Auto</currentRowUse> @@ -482,7 +480,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -511,7 +508,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <throughAlign>Auto</throughAlign> <currentRowUse>Auto</currentRowUse> @@ -539,7 +535,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <showTitle>auto</showTitle> @@ -785,7 +780,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -905,7 +899,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1026,7 +1019,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1093,7 +1085,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1122,7 +1113,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1160,71 +1150,6 @@ <currentRowUse>Auto</currentRowUse> </extInfo> </items> - <items xsi:type="form:FormGroup"> - <name>ГруппаДополнительно</name> - <id>18</id> - <items xsi:type="form:FormField"> - <name>ИспользоватьФильтрВыборочнойРегистрацииОбъектов</name> - <id>13</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <dataPath xsi:type="form:DataPath"> - <segments>Запись.ИспользоватьФильтрВыборочнойРегистрацииОбъектов</segments> - </dataPath> - <titleLocation>Right</titleLocation> - <extendedTooltip> - <name>ИспользоватьФильтрВыборочнойРегистрацииОбъектовExtendedTooltip</name> - <id>81</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>ИспользоватьФильтрВыборочнойРегистрацииОбъектовКонтекстноеМеню</name> - <id>14</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> - <visible>true</visible> - <enabled>true</enabled> - <userVisible/> - <title> - <key>ru</key> - <value>Дополнительно</value> - - - ГруппаДополнительноExtendedTooltip - 80 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - true - LeftWidest - Auto - Auto - - ФормаКоманднаяПанель -1 diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаРегистрацииОбъектов/Form.form b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаРегистрацииОбъектов/Form.form index 2b31e442e..7accc99b6 100644 --- a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаРегистрацииОбъектов/Form.form +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаРегистрацииОбъектов/Form.form @@ -78,7 +78,6 @@ UsualGroup Vertical - Auto true true Auto @@ -319,7 +318,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -463,7 +461,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -590,7 +587,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -748,7 +744,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -838,7 +833,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -867,7 +861,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -896,7 +889,6 @@ UsualGroup HorizontalIfPossible - Auto true Auto Auto @@ -924,7 +916,6 @@ UsualGroup Vertical - Auto true true auto diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаРегистрацииОбъектов/Module.bsl b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаРегистрацииОбъектов/Module.bsl index 0a204444c..ab94fadfd 100644 --- a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаРегистрацииОбъектов/Module.bsl +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаРегистрацииОбъектов/Module.bsl @@ -54,7 +54,7 @@ Если ИсточникПравил = ПредопределенноеЗначение("Перечисление.ИсточникиПравилДляОбменаДанными.МакетКонфигурации") Тогда Запись.РежимОтладки = Ложь; КонецЕсли; - + Элементы.ИмяМенеджераРегистрации.Доступность = ИсточникПравил = ПредопределенноеЗначение("Перечисление.ИсточникиПравилДляОбменаДанными.МенеджерПользовательский"); @@ -200,11 +200,11 @@ Макет = ПланыОбмена[Запись.ИмяПланаОбмена].ПолучитьМакет(ИмяМакета); Макет.Записать(ИмяВременногоФайла); - ДД = Новый ДвоичныеДанные(ИмяВременногоФайла); + ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла); УдалитьФайлы(ИмяВременногоФайла); - Возврат ПоместитьВоВременноеХранилище(ДД); + Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные); КонецФункции @@ -546,4 +546,5 @@ КонецФункции + #КонецОбласти diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПроверкаСинхронизацииДанных/Form.form b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПроверкаСинхронизацииДанных/Form.form index 1ce3fb516..5bf0c79c8 100644 --- a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПроверкаСинхронизацииДанных/Form.form +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПроверкаСинхронизацииДанных/Form.form @@ -96,7 +96,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/СообщениеОНеудачномОбновлении/Form.form b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/СообщениеОНеудачномОбновлении/Form.form index ada3900fe..490f55cd7 100644 --- a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/СообщениеОНеудачномОбновлении/Form.form +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/СообщениеОНеудачномОбновлении/Form.form @@ -130,7 +130,6 @@ UsualGroup Vertical - Auto true true Auto @@ -159,7 +158,6 @@ UsualGroup HorizontalIfPossible - Auto NormalSeparation true true @@ -257,7 +255,6 @@ UsualGroup Vertical - Auto NormalSeparation true true diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаСписка/Form.form index 7ad0f5322..0f8c8340b 100644 --- a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаСписка/Form.form @@ -29,7 +29,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ManagerModule.bsl b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ManagerModule.bsl index dfcd65709..7958ef7b6 100644 --- a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ManagerModule.bsl @@ -229,7 +229,6 @@ ЗаписьПравилКонвертации.ПравилаЗачитанные = Новый ХранилищеЗначения(ПравилаЗачитанные); ЗаписьПравилКонвертации.ПравилаЗачитанныеКорреспондента = Новый ХранилищеЗначения(ПравилаЗачитанныеКорреспондента); ЗаписьПравилКонвертации.РежимОтладки = Ложь; - ЗаписьПравилКонвертации.ИспользоватьФильтрВыборочнойРегистрацииОбъектов = Истина; ЗаписьПравилКонвертации.ПравилаЗагружены = Истина; ЗаписьПравилКонвертации.Записать(); diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ПравилаДляОбменаДанными.mdo b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ПравилаДляОбменаДанными.mdo index bcb682a3e..df6ca4d62 100644 --- a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ПравилаДляОбменаДанными.mdo +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ПравилаДляОбменаДанными.mdo @@ -441,11 +441,26 @@ Use - - ИспользоватьФильтрВыборочнойРегистрацииОбъектов + + ПараметрыВыборочнойРегистрации ru - Использовать фильтр выборочной регистрации объектов + Параметры выборочной регистрации + + + ValueStorage + + + + Use + Use + + + + УдалитьИспользоватьФильтрВыборочнойРегистрацииОбъектов + + ru + Удалить использовать фильтр выборочной регистрации объектов Boolean diff --git a/SSL/src/InformationRegisters/ПредметыПапкиВзаимодействий/ManagerModule.bsl b/SSL/src/InformationRegisters/ПредметыПапкиВзаимодействий/ManagerModule.bsl index aa2d2af1d..e7f77ae49 100644 --- a/SSL/src/InformationRegisters/ПредметыПапкиВзаимодействий/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ПредметыПапкиВзаимодействий/ManagerModule.bsl @@ -86,72 +86,85 @@ СоздаватьИЗаписывать = (НаборЗаписей = Неопределено); - Если Папка = Неопределено И Предмет = Неопределено И Рассмотрено = Неопределено - И РассмотретьПосле = Неопределено Тогда - + Если Папка = Неопределено И Предмет = Неопределено И Рассмотрено = Неопределено + И РассмотретьПосле = Неопределено Тогда Возврат; + КонецЕсли; - ИначеЕсли Папка = Неопределено ИЛИ Предмет = Неопределено ИЛИ Рассмотрено = Неопределено - ИЛИ РассмотретьПосле = Неопределено Тогда + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных(); + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ПредметыПапкиВзаимодействий"); + ЭлементБлокировки.УстановитьЗначение("Взаимодействие", Взаимодействие); + Блокировка.Заблокировать(); - Запрос = Новый Запрос; - Запрос.Текст = " - |ВЫБРАТЬ - | ПредметыПапкиВзаимодействий.Предмет, - | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма, - | ПредметыПапкиВзаимодействий.Рассмотрено, - | ПредметыПапкиВзаимодействий.РассмотретьПосле - |ИЗ - | РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий - |ГДЕ - | ПредметыПапкиВзаимодействий.Взаимодействие = &Взаимодействие"; - - Запрос.УстановитьПараметр("Взаимодействие", Взаимодействие); - - Результат = Запрос.Выполнить(); - Если НЕ Результат.Пустой() Тогда + Если Папка = Неопределено ИЛИ Предмет = Неопределено ИЛИ Рассмотрено = Неопределено + ИЛИ РассмотретьПосле = Неопределено Тогда - Выборка = Результат.Выбрать(); - Выборка.Следующий(); + Запрос = Новый Запрос; + Запрос.Текст = " + |ВЫБРАТЬ + | ПредметыПапкиВзаимодействий.Предмет, + | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма, + | ПредметыПапкиВзаимодействий.Рассмотрено, + | ПредметыПапкиВзаимодействий.РассмотретьПосле + |ИЗ + | РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий + |ГДЕ + | ПредметыПапкиВзаимодействий.Взаимодействие = &Взаимодействие"; - Если Папка = Неопределено Тогда - Папка = Выборка.ПапкаЭлектронногоПисьма; + Запрос.УстановитьПараметр("Взаимодействие", Взаимодействие); + + Результат = Запрос.Выполнить(); + Если НЕ Результат.Пустой() Тогда + + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + + Если Папка = Неопределено Тогда + Папка = Выборка.ПапкаЭлектронногоПисьма; + КонецЕсли; + + Если Предмет = Неопределено Тогда + Предмет = Выборка.Предмет; + КонецЕсли; + + Если Рассмотрено = Неопределено Тогда + Рассмотрено = Выборка.Рассмотрено; + КонецЕсли; + + Если РассмотретьПосле = Неопределено Тогда + РассмотретьПосле = Выборка.РассмотретьПосле; + КонецЕсли; + КонецЕсли; - - Если Предмет = Неопределено Тогда - Предмет = Выборка.Предмет; - КонецЕсли; - - Если Рассмотрено = Неопределено Тогда - Рассмотрено = Выборка.Рассмотрено; - КонецЕсли; - - Если РассмотретьПосле = Неопределено Тогда - РассмотретьПосле = Выборка.РассмотретьПосле; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Если СоздаватьИЗаписывать Тогда - НаборЗаписей = СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.Взаимодействие.Установить(Взаимодействие); - КонецЕсли; - Запись = НаборЗаписей.Добавить(); - Запись.Взаимодействие = Взаимодействие; - Запись.Предмет = Предмет; - Запись.ПапкаЭлектронногоПисьма = Папка; - Запись.Рассмотрено = Рассмотрено; - Запись.РассмотретьПосле = РассмотретьПосле; - НаборЗаписей.ДополнительныеСвойства.Вставить("РассчитыватьРассмотрено", РассчитыватьРассмотрено); - - Если СоздаватьИЗаписывать Тогда - НаборЗаписей.Записать(); - КонецЕсли; + + Если СоздаватьИЗаписывать Тогда + НаборЗаписей = СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Взаимодействие.Установить(Взаимодействие); + КонецЕсли; + Запись = НаборЗаписей.Добавить(); + Запись.Взаимодействие = Взаимодействие; + Запись.Предмет = Предмет; + Запись.ПапкаЭлектронногоПисьма = Папка; + Запись.Рассмотрено = Рассмотрено; + Запись.РассмотретьПосле = РассмотретьПосле; + НаборЗаписей.ДополнительныеСвойства.Вставить("РассчитыватьРассмотрено", РассчитыватьРассмотрено); + + Если СоздаватьИЗаписывать Тогда + НаборЗаписей.Записать(); + КонецЕсли; + ЗафиксироватьТранзакцию(); + + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецПроцедуры -// Устанавливает блокировку на РС ПредметыПапокВзаимодействий +// Устанавливает блокировку на РС ПредметыПапокВзаимодействий. // // Параметры: // Блокировка - БлокировкаДанных - устанавливаемая блокировка 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 d9a9092d8..b77d3a253 100644 --- a/SSL/src/InformationRegisters/ПроцессыДляЗапуска/Forms/НастройкаОтложенногоСтартаПроцесса/Form.form +++ b/SSL/src/InformationRegisters/ПроцессыДляЗапуска/Forms/НастройкаОтложенногоСтартаПроцесса/Form.form @@ -179,7 +179,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -291,7 +290,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -426,7 +424,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -628,7 +625,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto @@ -884,7 +880,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/InformationRegisters/ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux/Forms/ФормаСписка/Form.form index 78f1f10f0..a3381990f 100644 --- a/SSL/src/InformationRegisters/ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/РабочиеКаталогиФайлов/RecordSetModule.bsl b/SSL/src/InformationRegisters/РабочиеКаталогиФайлов/RecordSetModule.bsl index e27143163..ecda4699f 100644 --- a/SSL/src/InformationRegisters/РабочиеКаталогиФайлов/RecordSetModule.bsl +++ b/SSL/src/InformationRegisters/РабочиеКаталогиФайлов/RecordSetModule.bsl @@ -48,7 +48,7 @@ РабочийКаталог = РабочийКаталог + Выборка.Наименование; РабочийКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(РабочийКаталог); - РаботаСФайламиСлужебныйВызовСервера.СохранитьРабочийКаталогПапки( + РаботаСФайламиСлужебный.СохранитьРабочийКаталогПапки( Выборка.Ссылка, РабочийКаталог); КонецЦикла; diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийКоллизии/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийКоллизии/Module.bsl index 34bea8188..5fcb7263a 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийКоллизии/Module.bsl +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийКоллизии/Module.bsl @@ -254,7 +254,7 @@ Исключение - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); ВыделеннаяСтрока.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки, Символы.ПС, ТекстОшибки); ВыделеннаяСтрока.НеудачнаяПопытка = Истина; diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПоДатеЗапретаЗагрузки/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПоДатеЗапретаЗагрузки/Module.bsl index 690095e30..9e2b86060 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПоДатеЗапретаЗагрузки/Module.bsl +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПоДатеЗапретаЗагрузки/Module.bsl @@ -175,7 +175,7 @@ Исключение - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); ВыделеннаяСтрока.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки, Символы.ПС, ТекстОшибки); ВыделеннаяСтрока.НеудачнаяПопытка = Истина; diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПроведения/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПроведения/Module.bsl index 8037f523d..047715f08 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПроведения/Module.bsl +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПроведения/Module.bsl @@ -177,7 +177,7 @@ ОтменитьТранзакцию(); - ВыделеннаяСтрока.РезультатИсправления = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ВыделеннаяСтрока.РезультатИсправления = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); ВыделеннаяСтрока.НеудачнаяПопытка = Истина; КонецПопытки; diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборПредупрежденийПоТипам/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборПредупрежденийПоТипам/Form.form index b06720a98..e4d3db096 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборПредупрежденийПоТипам/Form.form +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборПредупрежденийПоТипам/Form.form @@ -136,7 +136,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -382,6 +381,40 @@ true + + СообщениеОбменаНеПомещеноВАрхив + 48 + true + true + + true + + + СообщениеОбменаНеПомещеноВАрхив + + Right + + СообщениеОбменаНеПомещеноВАрхивРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + СообщениеОбменаНеПомещеноВАрхивКонтекстноеМеню + 49 + true + + CheckBoxField + Enter + true + Left + true + + true true @@ -406,7 +439,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -437,7 +469,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -753,6 +784,23 @@ true + + СообщениеОбменаНеПомещеноВАрхив + + <key>ru</key> + <value>Сообщение обмена не помещено в архив</value> + + 12 + + Boolean + + + true + + + true + + ОК diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборПредупрежденийПоТипам/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборПредупрежденийПоТипам/Module.bsl index 42290e817..b4e104bc0 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборПредупрежденийПоТипам/Module.bsl +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборПредупрежденийПоТипам/Module.bsl @@ -20,6 +20,7 @@ КэшЗначений.Вставить("ПринятыеДанныеПоКоллизии", Неопределено); КэшЗначений.Вставить("НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе", Неопределено); КэшЗначений.Вставить("НепринятыйПоДатеЗапретаОбъектСуществуетВБазе", Неопределено); + КэшЗначений.Вставить("СообщениеОбменаНеПомещеноВАрхив", Неопределено); Если ПодсистемаВерсионированияСуществует Тогда @@ -55,6 +56,7 @@ СоответствиеРеквизитов.Вставить("ОшибкаПроверкиПередОтправкойXTDO", ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.ОшибкаПроверкиСконвертированногоОбъекта")); СоответствиеРеквизитов.Вставить("ОшибкаВыполненияКодаОбработчиковПриПолученииДанных", ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриПолученииДанных")); СоответствиеРеквизитов.Вставить("ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных", ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных")); + СоответствиеРеквизитов.Вставить("СообщениеОбменаНеПомещеноВАрхив", ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.СообщениеОбменаНеПомещеноВАрхив")); Если КэшЗначений.ПодсистемаВерсионированияСуществует Тогда @@ -93,6 +95,7 @@ НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе = Ложь; НепринятыйПоДатеЗапретаОбъектСуществуетВБазе = Ложь; ПринятыеДанныеПоКоллизии = Ложь; + СообщениеОбменаНеПомещеноВАрхив = Ложь; КонецПроцедуры @@ -116,6 +119,7 @@ СоответствиеРеквизитов.Вставить(Перечисления.ТипыПроблемОбменаДанными.ОшибкаПроверкиСконвертированногоОбъекта, "ОшибкаПроверкиПередОтправкойXTDO"); СоответствиеРеквизитов.Вставить(Перечисления.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриПолученииДанных, "ОшибкаВыполненияКодаОбработчиковПриПолученииДанных"); СоответствиеРеквизитов.Вставить(Перечисления.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных, "ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных"); + СоответствиеРеквизитов.Вставить(Перечисления.ТипыПроблемОбменаДанными.СообщениеОбменаНеПомещеноВАрхив, "СообщениеОбменаНеПомещеноВАрхив"); Если КэшЗначений.ПодсистемаВерсионированияСуществует Тогда diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборСинхронизаций/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборСинхронизаций/Form.form index 88a179fa1..09f0a4293 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборСинхронизаций/Form.form +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборСинхронизаций/Form.form @@ -234,7 +234,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеАдминистрированияПриложения/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеАдминистрированияПриложения/Form.form index 2c270de52..f9ec6a3c0 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеАдминистрированияПриложения/Form.form +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеАдминистрированияПриложения/Form.form @@ -277,7 +277,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> <horizontalAlign>Right</horizontalAlign> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -419,6 +418,7 @@ <id>5</id> <valueType> <types>EnumRef.ТипыПроблемОбменаДанными</types> + <types>EnumRef.ТипыВерсийОбъекта</types> </valueType> <view> <common>true</common> diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеКонвертацииОбъектаПриОтправке/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеКонвертацииОбъектаПриОтправке/Form.form index ea74f69da..ec17cf2ef 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеКонвертацииОбъектаПриОтправке/Form.form +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеКонвертацииОбъектаПриОтправке/Form.form @@ -321,7 +321,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> <horizontalAlign>Right</horizontalAlign> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНезаполненногоРеквизита/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНезаполненногоРеквизита/Form.form index 08293737d..37004faf6 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНезаполненногоРеквизита/Form.form +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНезаполненногоРеквизита/Form.form @@ -320,7 +320,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> <horizontalAlign>Right</horizontalAlign> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНепроведенногоДокумента/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНепроведенногоДокумента/Form.form index 58cb0e48a..39f79ddb8 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНепроведенногоДокумента/Form.form +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНепроведенногоДокумента/Form.form @@ -213,7 +213,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -379,7 +378,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> <horizontalAlign>Right</horizontalAlign> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеОКоллизии/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеОКоллизии/Form.form index 748b899ba..7c0000d94 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеОКоллизии/Form.form +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеОКоллизии/Form.form @@ -186,7 +186,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -483,7 +482,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> <horizontalAlign>Right</horizontalAlign> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеПоДатеЗапретаЗагрузки/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеПоДатеЗапретаЗагрузки/Form.form index ae9cb4398..33d169857 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеПоДатеЗапретаЗагрузки/Form.form +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеПоДатеЗапретаЗагрузки/Form.form @@ -185,7 +185,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -482,7 +481,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> <horizontalAlign>Right</horizontalAlign> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияОбработчиковОтправкиПолучения/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияОбработчиковОтправкиПолучения/Form.form index 3e5383058..f3f529e16 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияОбработчиковОтправкиПолучения/Form.form +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияОбработчиковОтправкиПолучения/Form.form @@ -319,7 +319,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> <horizontalAlign>Right</horizontalAlign> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияСинхронизаций/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияСинхронизаций/Form.form index 4845aa81f..b3cab5e07 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияСинхронизаций/Form.form +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияСинхронизаций/Form.form @@ -176,7 +176,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <collapsedRepresentationTitle> <key>ru</key> <value>(Синхронизация с ERP - БП, Тип проблемы: Все...)</value> @@ -1580,7 +1579,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -1610,7 +1608,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -1673,7 +1670,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <representation>WeakSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -1736,7 +1732,6 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> <horizontalAlign>Right</horizontalAlign> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> @@ -1765,7 +1760,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>AlwaysHorizontal</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/УдалениеУстаревшихПредупреждений/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/УдалениеУстаревшихПредупреждений/Form.form index 310f4eca1..75f4dc42e 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/УдалениеУстаревшихПредупреждений/Form.form +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/УдалениеУстаревшихПредупреждений/Form.form @@ -236,7 +236,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Form.form index 18f8b5742..48fc58133 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Form.form +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Form.form @@ -185,7 +185,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>HorizontalIfPossible</group> - <behavior>Auto</behavior> <showLeftMargin>true</showLeftMargin> <united>true</united> <throughAlign>Auto</throughAlign> diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Module.bsl index fca0909ce..21ff89848 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Module.bsl +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Module.bsl @@ -771,7 +771,7 @@ НСтр("ru = 'Не удалось провести документ ""%1"" по причине: |%2.'"), ВыделеннаяСтрока.ПроблемныйОбъект, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецЕсли; СчетчикНеПроведенные = СчетчикНеПроведенные + 1; КонецПопытки; @@ -1375,7 +1375,7 @@ НСтр("ru = 'Не удалось принять версию объекта ""%1"" по причине: |%2.'"), ПредставлениеОбъекта, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке()))); + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()))); СчетчикНеПринятые = СчетчикНеПринятые + 1; КонецПопытки; КонецЕсли; diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/ManagerModule.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/ManagerModule.bsl index bc273eebc..e40a8b3e0 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/ManagerModule.bsl @@ -391,9 +391,11 @@ КонецЕсли; - Шаблон = НСтр("ru = 'Удалено %1 из %1'"); - ТекстПрогресса = СтрШаблон(Шаблон, ПараметрыУдаления.КоличествоОперацийМаксимум); - ДлительныеОперации.СообщитьПрогресс(100, ТекстПрогресса); + ТекстПрогресса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Удалено %1 из %1'", ОбщегоНазначения.КодОсновногоЯзыка()), + ПараметрыУдаления.КоличествоОперацийМаксимум); + + ДлительныеОперации.СообщитьПрогресс(100, ТекстПрогресса); КонецПроцедуры @@ -673,9 +675,10 @@ ЗаголовокПредупреждения = ""; Иначе - - ШаблонЗаголовка = НСтр("ru ='предупреждений %1'", ОбщегоНазначения.КодОсновногоЯзыка()); - ЗаголовокПредупреждения = СтрШаблон(ШаблонЗаголовка, КоличествоПредупреждений); + + ЗаголовокПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru ='предупреждений %1'", ОбщегоНазначения.КодОсновногоЯзыка()), + КоличествоПредупреждений); КонецЕсли; @@ -748,13 +751,15 @@ Если ИтераторВыборки = 0 Тогда - Шаблон = НСтр("ru = 'Выполнено итераций %1 из %2'", ОбщегоНазначения.КодОсновногоЯзыка()); - ТекстПрогресса = СтрШаблон(Шаблон, ТекущийШаг, Максимум); + ТекстПрогресса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполнено итераций %1 из %2'", ОбщегоНазначения.КодОсновногоЯзыка()), + ТекущийШаг, Максимум); Иначе - - Шаблон = НСтр("ru = 'Выполнено итераций %1 из %2 (%3)'", ОбщегоНазначения.КодОсновногоЯзыка()); - ТекстПрогресса = СтрШаблон(Шаблон, ТекущийШаг, Максимум, ИтераторВыборки); + + ТекстПрогресса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполнено итераций %1 из %2 (%3)'", ОбщегоНазначения.КодОсновногоЯзыка()), + ТекущийШаг, Максимум, ИтераторВыборки); КонецЕсли; @@ -874,7 +879,7 @@ ОтменитьТранзакцию(); ИмяСобытия = НСтр("ru = 'Обмен данными'", ОбщегоНазначения.КодОсновногоЯзыка()); - ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -943,7 +948,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать набор записей регистра ""%1"" по причине: - |%2'"), ПредставлениеРегистра, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + |%2'"), ПредставлениеРегистра, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, МетаданныеРегистра, , ТекстСообщения); diff --git a/SSL/src/InformationRegisters/РезультатыПроверкиУчета/ManagerModule.bsl b/SSL/src/InformationRegisters/РезультатыПроверкиУчета/ManagerModule.bsl index 1d9e3e302..ab82159fc 100644 --- a/SSL/src/InformationRegisters/РезультатыПроверкиУчета/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/РезультатыПроверкиУчета/ManagerModule.bsl @@ -59,7 +59,7 @@ | КлючУникальности"; Запрос.УстановитьПараметр("КлючУникальности", КлючУникальности); - Результат = Запрос.Выполнить().Выгрузить(); + Результат = Запрос.Выполнить().Выгрузить(); // @skip-check query-in-loop - порционная регистрация данных для обновления. ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, Результат, ДополнительныеПараметры); @@ -147,7 +147,7 @@ ПроблемныхОбъектов = ПроблемныхОбъектов + 1; ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать результаты проверки ведения учета с отбором %2 по причине: - |%3'"), ПредставлениеОтбора, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + |%3'"), ПредставлениеОтбора, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, МетаданныеРегистра, , ТекстСообщения); diff --git a/SSL/src/InformationRegisters/СведенияОПользователях/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/СведенияОПользователях/Forms/ФормаЗаписи/Form.form index f8339634e..4f493f557 100644 --- a/SSL/src/InformationRegisters/СведенияОПользователях/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/СведенияОПользователях/Forms/ФормаЗаписи/Form.form @@ -66,7 +66,6 @@ <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> - <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> @@ -75,135 +74,26 @@ </extInfo> </items> <items xsi:type="form:FormGroup"> - <name>ГруппаНастройки</name> - <id>26</id> - <items xsi:type="form:FormField"> - <name>ПотребоватьСменуПароляПриВходе</name> - <id>15</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <dataPath xsi:type="form:DataPath"> - <segments>Запись.ПотребоватьСменуПароляПриВходе</segments> - </dataPath> - <titleLocation>Right</titleLocation> - <extendedTooltip> - <name>ПотребоватьСменуПароляПриВходеРасширеннаяПодсказка</name> - <id>17</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>ПотребоватьСменуПароляПриВходеКонтекстноеМеню</name> - <id>16</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> - <items xsi:type="form:FormField"> - <name>СрокДействияНеОграничен</name> - <id>35</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <dataPath xsi:type="form:DataPath"> - <segments>Запись.СрокДействияНеОграничен</segments> - </dataPath> - <titleLocation>Right</titleLocation> - <extendedTooltip> - <name>СрокДействияНеОграниченРасширеннаяПодсказка</name> - <id>37</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>СрокДействияНеОграниченКонтекстноеМеню</name> - <id>36</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> - <items xsi:type="form:FormField"> - <name>СрокДействия</name> - <id>18</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <dataPath xsi:type="form:DataPath"> - <segments>Запись.СрокДействия</segments> - </dataPath> - <extendedTooltip> - <name>СрокДействияРасширеннаяПодсказка</name> - <id>20</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>СрокДействияКонтекстноеМеню</name> - <id>19</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> - <wrap>true</wrap> - <chooseType>true</chooseType> - <typeDomainEnabled>true</typeDomainEnabled> - <textEdit>true</textEdit> - <textSize>Normal</textSize> - </extInfo> - </items> + <name>Страницы</name> + <id>44</id> <items xsi:type="form:FormGroup"> - <name>ГруппаПросрочка</name> - <id>30</id> + <name>ГруппаНастройки</name> + <id>26</id> <items xsi:type="form:FormField"> - <name>ПросрочкаРаботыВПрограммеДоЗапрещенияВхода</name> - <id>21</id> + <name>ПотребоватьСменуПароляПриВходе</name> + <id>15</id> <visible>true</visible> <enabled>true</enabled> <userVisible> <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Запись.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода</segments> + <segments>Запись.ПотребоватьСменуПароляПриВходе</segments> </dataPath> - <titleLocation>Left</titleLocation> + <titleLocation>Right</titleLocation> <extendedTooltip> - <name>ПросрочкаРаботыВПрограммеДоЗапрещенияВходаРасширеннаяПодсказка</name> - <id>23</id> + <name>ПотребоватьСменуПароляПриВходеРасширеннаяПодсказка</name> + <id>17</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -212,8 +102,75 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ПросрочкаРаботыВПрограммеДоЗапрещенияВходаКонтекстноеМеню</name> - <id>22</id> + <name>ПотребоватьСменуПароляПриВходеКонтекстноеМеню</name> + <id>16</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> + <items xsi:type="form:FormField"> + <name>СрокДействияНеОграничен</name> + <id>35</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Запись.СрокДействияНеОграничен</segments> + </dataPath> + <titleLocation>Right</titleLocation> + <extendedTooltip> + <name>СрокДействияНеОграниченРасширеннаяПодсказка</name> + <id>37</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>СрокДействияНеОграниченКонтекстноеМеню</name> + <id>36</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> + <items xsi:type="form:FormField"> + <name>СрокДействия</name> + <id>18</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Запись.СрокДействия</segments> + </dataPath> + <extendedTooltip> + <name>СрокДействияРасширеннаяПодсказка</name> + <id>20</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>СрокДействияКонтекстноеМеню</name> + <id>19</id> <autoFill>true</autoFill> </contextMenu> <type>InputField</type> @@ -231,21 +188,96 @@ <textSize>Normal</textSize> </extInfo> </items> - <items xsi:type="form:Decoration"> - <name>ПояснениеПросрочкаРаботыВПрограммеДоЗапрещенияВхода</name> - <id>32</id> - <title> - <key>ru</key> - <value>дн.</value> - + + ГруппаПросрочка + 30 + + ПросрочкаРаботыВПрограммеДоЗапрещенияВхода + 21 + true + true + + true + + + Запись.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода + + Left + + ПросрочкаРаботыВПрограммеДоЗапрещенияВходаРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + ПросрочкаРаботыВПрограммеДоЗапрещенияВходаКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПояснениеПросрочкаРаботыВПрограммеДоЗапрещенияВхода + 32 + + <key>ru</key> + <value>дн.</value> + + true + true + + true + + + ПояснениеПросрочкаРаботыВПрограммеДоЗапрещенияВходаРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ПояснениеПросрочкаРаботыВПрограммеДоЗапрещенияВходаКонтекстноеМеню + 33 + true + + Label + true + + Left + + true true true + + <key>ru</key> + <value>Просрочка</value> + - ПояснениеПросрочкаРаботыВПрограммеДоЗапрещенияВходаРасширеннаяПодсказка - 34 + ГруппаПросрочкаРасширеннаяПодсказка + 31 Label true true @@ -253,15 +285,13 @@ Left - - ПояснениеПросрочкаРаботыВПрограммеДоЗапрещенияВходаКонтекстноеМеню - 33 - true - - Label - true - - Left + UsualGroup + + HorizontalIfPossible + true + true + Auto + Auto true @@ -271,11 +301,11 @@
        <key>ru</key> - <value>Просрочка</value> + <value>Настройки</value> - ГруппаПросрочкаРасширеннаяПодсказка - 31 + ГруппаНастройкиРасширеннаяПодсказка + 27 Label true true @@ -283,14 +313,1039 @@ Left
        - UsualGroup - - HorizontalIfPossible - Auto - true - true - Auto - Auto + Page + + Vertical + auto + false + + + + ГруппаАктивность + 24 + + ДатаРазрешенияВходаВПрограмму + 38 + true + true + + true + + + Запись.ДатаРазрешенияВходаВПрограмму + + + ДатаРазрешенияВходаВПрограммуРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + ДатаРазрешенияВходаВПрограммуКонтекстноеМеню + 39 + true + + InputField + Enter + true + Left + 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 + Normal + + + + ДатаАвтоматическогоЗапрещенияВхода + 7 + true + true + + true + + + Запись.ДатаАвтоматическогоЗапрещенияВхода + + + ДатаАвтоматическогоЗапрещенияВходаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ДатаАвтоматическогоЗапрещенияВходаКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПоследнийИспользуемыйКлиент + 46 + true + true + + true + + + Запись.ПоследнийИспользуемыйКлиент + + + ПоследнийИспользуемыйКлиентРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + ПоследнийИспользуемыйКлиентКонтекстноеМеню + 47 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + УдалитьДатаНачалаИспользованияПароля + 116 + true + true + + true + + + Запись.УдалитьДатаНачалаИспользованияПароля + + + УдалитьДатаНачалаИспользованияПароляРасширеннаяПодсказка + 118 + Label + true + true + + Left + + + + УдалитьДатаНачалаИспользованияПароляКонтекстноеМеню + 117 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Активность</value> + + + ГруппаАктивностьРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + ГруппаСвойства + 49 + + ПраваяКолонка + 106 + + ВходВПрограммуРазрешен + 51 + true + true + + true + + + Запись.ВходВПрограммуРазрешен + + Right + + ВходВПрограммуРазрешенРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ВходВПрограммуРазрешенКонтекстноеМеню + 52 + true + + CheckBoxField + Enter + true + Left + true + + + + ВходВПрограммуОграничен + 54 + true + true + + true + + + Запись.ВходВПрограммуОграничен + + Right + + ВходВПрограммуОграниченРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + ВходВПрограммуОграниченКонтекстноеМеню + 55 + true + + CheckBoxField + Enter + true + Left + true + + + + НетРолей + 57 + true + true + + true + + + Запись.НетПрав + + Right + + НетРолейРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + НетРолейКонтекстноеМеню + 58 + true + + CheckBoxField + Enter + true + Left + true + + + + НедостаточноПравДляВхода + 60 + true + true + + true + + + Запись.НедостаточноПравДляВхода + + Right + + НедостаточноПравДляВходаРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + НедостаточноПравДляВходаКонтекстноеМеню + 61 + true + + CheckBoxField + Enter + true + Left + true + + + + Имя + 63 + true + true + + true + + + Запись.Имя + + + ИмяРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + + ИмяКонтекстноеМеню + 64 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + АдресЭлектроннойПочты + 66 + true + true + + true + + + Запись.АдресЭлектроннойПочты + + + АдресЭлектроннойПочтыРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + АдресЭлектроннойПочтыКонтекстноеМеню + 67 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + АутентификацияСтандартная + 69 + true + true + + true + + + Запись.АутентификацияСтандартная + + Right + + АутентификацияСтандартнаяРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + + АутентификацияСтандартнаяКонтекстноеМеню + 70 + true + + CheckBoxField + Enter + true + Left + true + + + + ПараметрыСтандартнойАутентификации + 102 + + ЗапрещеноВосстанавливатьПароль + 75 + true + true + + true + + + Запись.ЗапрещеноВосстанавливатьПароль + + Right + + ЗапрещеноВосстанавливатьПарольРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + + ЗапрещеноВосстанавливатьПарольКонтекстноеМеню + 76 + true + + CheckBoxField + Enter + true + Left + true + + + + ЗапрещеноИзменятьПароль + 72 + true + true + + true + + + Запись.ЗапрещеноИзменятьПароль + + Right + + ЗапрещеноИзменятьПарольРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + ЗапрещеноИзменятьПарольКонтекстноеМеню + 73 + true + + CheckBoxField + Enter + true + Left + true + + + + ПоказыватьВСпискеВыбора + 78 + true + true + + true + + + Запись.ПоказыватьВСпискеВыбора + + Right + + ПоказыватьВСпискеВыбораРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + + ПоказыватьВСпискеВыбораКонтекстноеМеню + 79 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Параметры стандартной аутентификации</value> + + + ПараметрыСтандартнойАутентификацииРасширеннаяПодсказка + 103 + Label + true + true + + Left + + + UsualGroup + + Vertical + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Правая колонка</value> + + + ПраваяКолонкаРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + + + + ЛеваяКолонка + 108 + + АутентификацияOpenID + 81 + true + true + + true + + + Запись.АутентификацияOpenID + + Right + + АутентификацияOpenIDРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + + АутентификацияOpenIDКонтекстноеМеню + 82 + true + + CheckBoxField + Enter + true + Left + true + + + + АутентификацияOpenIDConnect + 84 + true + true + + true + + + Запись.АутентификацияOpenIDConnect + + Right + + АутентификацияOpenIDConnectРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + АутентификацияOpenIDConnectКонтекстноеМеню + 85 + true + + CheckBoxField + Enter + true + Left + true + + + + АутентификацияТокеномДоступа + 87 + true + true + + true + + + Запись.АутентификацияТокеномДоступа + + Right + + АутентификацияТокеномДоступаРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + + АутентификацияТокеномДоступаКонтекстноеМеню + 88 + true + + CheckBoxField + Enter + true + Left + true + + + + НастройкиАутентификацииОС + 104 + + АутентификацияОС + 90 + true + true + + true + + + Запись.АутентификацияОС + + Right + + АутентификацияОСРасширеннаяПодсказка + 92 + Label + true + true + + Left + + + + АутентификацияОСКонтекстноеМеню + 91 + true + + CheckBoxField + Enter + true + Left + true + + + + ПользовательОС + 93 + true + true + + true + + + Запись.ПользовательОС + + + ПользовательОСРасширеннаяПодсказка + 95 + Label + true + true + + Left + + + + ПользовательОСКонтекстноеМеню + 94 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Настройки аутентификации ОС</value> + + + НастройкиАутентификацииОСРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + UsualGroup + + Vertical + NormalSeparation + true + true + Auto + Auto + + + + Язык + 96 + true + true + + true + + + Запись.Язык + + + ЯзыкРасширеннаяПодсказка + 98 + Label + true + true + + Left + + + + ЯзыкКонтекстноеМеню + 97 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ЗащитаОтОпасныхДействий + 99 + true + true + + true + + + Запись.ЗащитаОтОпасныхДействий + + Right + + ЗащитаОтОпасныхДействийРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + + ЗащитаОтОпасныхДействийКонтекстноеМеню + 100 + true + + CheckBoxField + Enter + true + Left + true + + + + НомерКартинкиСостояния + 113 + true + true + + true + + + Запись.НомерКартинкиСостояния + + + НомерКартинкиСостоянияРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + + НомерКартинкиСостоянияКонтекстноеМеню + 114 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Левая колонка</value> + + + ЛеваяКолонкаРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + UsualGroup + + Vertical + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Свойства</value> + + + ГруппаСвойстваРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + Page + + AlwaysHorizontal + auto + false true @@ -300,11 +1355,11 @@ <key>ru</key> - <value>Настройки</value> + <value>Страницы</value> - ГруппаНастройкиРасширеннаяПодсказка - 27 + СтраницыРасширеннаяПодсказка + 45 Label true true @@ -312,213 +1367,9 @@ Left - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - auto - Auto - Auto - - - - ГруппаСведения - 24 - - ДатаРазрешенияВходаВПрограмму - 38 - true - true - - true - - - Запись.ДатаРазрешенияВходаВПрограмму - - - ДатаРазрешенияВходаВПрограммуРасширеннаяПодсказка - 40 - Label - true - true - - Left - - - - ДатаРазрешенияВходаВПрограммуКонтекстноеМеню - 39 - true - - InputField - Enter - true - Left - 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 - Normal - - - - ДатаАвтоматическогоЗапрещенияВхода - 7 - true - true - - true - - - Запись.ДатаАвтоматическогоЗапрещенияВхода - - - ДатаАвтоматическогоЗапрещенияВходаРасширеннаяПодсказка - 9 - Label - true - true - - Left - - - - ДатаАвтоматическогоЗапрещенияВходаКонтекстноеМеню - 8 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - - ДатаНачалаИспользованияПароля - 12 - true - true - - true - - - Запись.ДатаНачалаИспользованияПароля - - - ДатаНачалаИспользованияПароляРасширеннаяПодсказка - 14 - Label - true - true - - Left - - - - ДатаНачалаИспользованияПароляКонтекстноеМеню - 13 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Сведения</value> - - - ГруппаСведенияРасширеннаяПодсказка - 25 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - auto - Auto + Pages + + TabsOnTop Auto diff --git a/SSL/src/InformationRegisters/СведенияОПользователях/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/СведенияОПользователях/Forms/ФормаСписка/Form.form index 7ec1333f8..32def577b 100644 --- a/SSL/src/InformationRegisters/СведенияОПользователях/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/СведенияОПользователях/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -63,6 +62,33 @@ Auto InAdditionalSubmenu + + ФормаОбновитьДанныеРегистра + 53 + true + true + + true + + + ФормаОбновитьДанныеРегистраРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + Form.Command.ОбновитьДанныеРегистра + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + true true @@ -142,6 +168,51 @@ true + + НомерКартинкиСостояния + 55 + + <key>ru</key> + <value>Номер +картинки +состояния</value> + + true + true + + + Список.НомерКартинкиСостояния + + + НомерКартинкиСостоянияРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + НомерКартинкиСостоянияКонтекстноеМеню + 56 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + ПотребоватьСменуПароляПриВходе 32 @@ -429,49 +500,6 @@ true - - ДатаНачалаИспользованияПароля - 29 - - <key>ru</key> - <value>Дата начала -использования -пароля</value> - - true - true - - true - - - Список.ДатаНачалаИспользованияПароля - - - ДатаНачалаИспользованияПароляРасширеннаяПодсказка - 31 - Label - true - true - - Left - - - - ДатаНачалаИспользованияПароляКонтекстноеМеню - 30 - true - - LabelField - Enter - true - Left - true - - 12 - true - true - - ПоследнийИспользуемыйКлиент 44 @@ -514,6 +542,48 @@ Normal + + УдалитьДатаНачалаИспользованияПароля + 58 + + <key>ru</key> + <value>(не используется) +Дата начала +использования пароля</value> + + true + true + + true + + + Список.УдалитьДатаНачалаИспользованияПароля + + + УдалитьДатаНачалаИспользованияПароляРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + УдалитьДатаНачалаИспользованияПароляКонтекстноеМеню + 59 + true + + LabelField + Enter + true + Left + true + + true + true + + None СписокКоманднаяПанель @@ -626,8 +696,11 @@ true true - Список.DefaultPicture + Список.НомерКартинки + + CommonPicture.СостоянияПользователей + true 60 @@ -674,9 +747,42 @@
        true
        + ВЫБРАТЬ + Сведения.НомерКартинкиСостояния - 1 КАК НомерКартинки, + Сведения.Пользователь КАК Пользователь, + Сведения.ПотребоватьСменуПароляПриВходе КАК ПотребоватьСменуПароляПриВходе, + Сведения.СрокДействияНеОграничен КАК СрокДействияНеОграничен, + Сведения.СрокДействия КАК СрокДействия, + Сведения.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода КАК ПросрочкаРаботыВПрограммеДоЗапрещенияВхода, + Сведения.ДатаРазрешенияВходаВПрограмму КАК ДатаРазрешенияВходаВПрограмму, + Сведения.ДатаПоследнейАктивности КАК ДатаПоследнейАктивности, + Сведения.ДатаАвтоматическогоЗапрещенияВхода КАК ДатаАвтоматическогоЗапрещенияВхода, + Сведения.УдалитьДатаНачалаИспользованияПароля КАК УдалитьДатаНачалаИспользованияПароля, + Сведения.ПоследнийИспользуемыйКлиент КАК ПоследнийИспользуемыйКлиент, + Сведения.НомерКартинкиСостояния КАК НомерКартинкиСостояния, + Сведения.ВходВПрограммуРазрешен КАК ВходВПрограммуРазрешен, + Сведения.ВходВПрограммуОграничен КАК ВходВПрограммуОграничен, + Сведения.НетПрав КАК НетПрав, + Сведения.НедостаточноПравДляВхода КАК НедостаточноПравДляВхода, + Сведения.Имя КАК Имя, + Сведения.АдресЭлектроннойПочты КАК АдресЭлектроннойПочты, + Сведения.АутентификацияСтандартная КАК АутентификацияСтандартная, + Сведения.ЗапрещеноИзменятьПароль КАК ЗапрещеноИзменятьПароль, + Сведения.ЗапрещеноВосстанавливатьПароль КАК ЗапрещеноВосстанавливатьПароль, + Сведения.ПоказыватьВСпискеВыбора КАК ПоказыватьВСпискеВыбора, + Сведения.АутентификацияOpenID КАК АутентификацияOpenID, + Сведения.АутентификацияOpenIDConnect КАК АутентификацияOpenIDConnect, + Сведения.АутентификацияТокеномДоступа КАК АутентификацияТокеномДоступа, + Сведения.АутентификацияОС КАК АутентификацияОС, + Сведения.ПользовательОС КАК ПользовательОС, + Сведения.Язык КАК Язык, + Сведения.ЗащитаОтОпасныхДействий КАК ЗащитаОтОпасныхДействий +ИЗ + РегистрСведений.СведенияОПользователях КАК Сведения InformationRegister.СведенияОПользователях true true + true true true @@ -703,6 +809,28 @@ DontUse 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 index e566a0499..1811e0a61 100644 --- a/SSL/src/InformationRegisters/СведенияОПользователях/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/InformationRegisters/СведенияОПользователях/Forms/ФормаСписка/Module.bsl @@ -26,4 +26,36 @@ КонецПроцедуры +&НаКлиенте +Процедура ОбновитьДанныеРегистра(Команда) + + ЕстьИзменения = Ложь; + + ОбновитьДанныеРегистраНаСервере(ЕстьИзменения); + + Если ЕстьИзменения Тогда + Текст = НСтр("ru = 'Обновление выполнено успешно.'"); + Иначе + Текст = НСтр("ru = 'Обновление не требуется.'"); + КонецЕсли; + + ПоказатьПредупреждение(, Текст); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура ОбновитьДанныеРегистраНаСервере(ЕстьИзменения) + + УстановитьПривилегированныйРежим(Истина); + + РегистрыСведений.СведенияОПользователях.ОбновитьДанныеРегистра(, ЕстьИзменения); + + Элементы.Список.Обновить(); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/InformationRegisters/СведенияОПользователях/ManagerModule.bsl b/SSL/src/InformationRegisters/СведенияОПользователях/ManagerModule.bsl new file mode 100644 index 000000000..f5ff5805f --- /dev/null +++ b/SSL/src/InformationRegisters/СведенияОПользователях/ManagerModule.bsl @@ -0,0 +1,781 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныеПроцедурыИФункции + +// Для форм элементов справочников Пользователи и ВнешниеПользователи. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения: +// * Объект - СправочникОбъект.Пользователи +// - СправочникОбъект.ВнешниеПользователи +// +Процедура ПрочитатьСведенияОПользователе(Форма) Экспорт + + Если ОбщегоНазначения.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + Пользователь = Форма.Объект.Ссылка; + + Если Не ЗначениеЗаполнено(Пользователь) Тогда + Возврат; + КонецЕсли; + + УровеньДоступа = ПользователиСлужебный.УровеньДоступаКСвойствамПользователя(Форма.Объект); + + НаборЗаписей = РегистрыСведений.СведенияОПользователях.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Пользователь.Установить(Пользователь); + НаборЗаписей.Прочитать(); + + Форма.ПотребоватьСменуПароляПриВходе = Ложь; + Форма.СрокДействияНеОграничен = Ложь; + Форма.СрокДействия = Неопределено; + Форма.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода = 0; + + Если НаборЗаписей.Количество() > 0 Тогда + + Если УровеньДоступа.УправлениеСписком + Или УровеньДоступа.ИзменениеТекущего Тогда + + ЗаполнитьЗначенияСвойств(Форма, НаборЗаписей[0], + "ПотребоватьСменуПароляПриВходе, + |СрокДействияНеОграничен, + |СрокДействия, + |ПросрочкаРаботыВПрограммеДоЗапрещенияВхода"); + Иначе + Форма.ПотребоватьСменуПароляПриВходе = НаборЗаписей[0].ПотребоватьСменуПароляПриВходе; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Для форм элементов справочников Пользователи и ВнешниеПользователи. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// ТекущийОбъект - СправочникОбъект.Пользователи +// - СправочникОбъект.ВнешниеПользователи +// +Процедура УстановитьСведенияОПользователе(Форма, ТекущийОбъект) Экспорт + + Если ОбщегоНазначения.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + СведенияОПользователе = Новый Структура( + "ПотребоватьСменуПароляПриВходе, + |СрокДействияНеОграничен, + |СрокДействия, + |ПросрочкаРаботыВПрограммеДоЗапрещенияВхода"); + + ЗаполнитьЗначенияСвойств(СведенияОПользователе, Форма); + + ТекущийОбъект.ДополнительныеСвойства.Вставить("РасширенныеСвойстваПользователяИБ", + СведенияОПользователе); + +КонецПроцедуры + +// Параметры: +// ОписаниеПользователя - ПользовательИнформационнойБазы +// - УникальныйИдентификатор - идентификатор пользователя ИБ. +// +// Возвращаемое значение: +// Структура: +// * НетПрав - Булево +// * НедостаточноПравДляВхода - Булево +// +Функция НаличиеПрав(ОписаниеПользователя) Экспорт + + Результат = Новый Структура; + Результат.Вставить("НетПрав", Ложь); + Результат.Вставить("НедостаточноПравДляВхода", Ложь); + + Если ТипЗнч(ОписаниеПользователя) = Тип("УникальныйИдентификатор") Тогда + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( + ОписаниеПользователя); + + Если ПользовательИБ = Неопределено Тогда + Возврат Результат; + КонецЕсли; + Иначе + ПользовательИБ = ОписаниеПользователя; + КонецЕсли; + + Для Каждого Роль Из ПользовательИБ.Роли Цикл + Прервать; + КонецЦикла; + + Результат.НетПрав = (Роль = Неопределено); + + Результат.НедостаточноПравДляВхода = + Не Пользователи.ЕстьПраваДляВходаВПрограмму(ПользовательИБ, Ложь); + + Возврат Результат; + +КонецФункции + +// Параметры: +// ПользовательОбъект - СправочникОбъект.Пользователи +// - СправочникОбъект.ВнешниеПользователи - или ДанныеФормыСтруктура этих объектов. +// +Функция ОтличаютсяСохраненныеСвойстваПользователяИБ(ПользовательОбъект) Экспорт + + Запрос = ЗапросСвойств(ПользовательОбъект.Ссылка); + + Выборка = Запрос.Выполнить().Выбрать(); + Если Не Выборка.Следующий() Тогда + Выборка = Неопределено; + КонецЕсли; + + Свойства = НовыеСвойстваПользователя(ПользовательОбъект.Ссылка, Выборка, ПользовательОбъект); + + Возврат Свойства <> Неопределено; + +КонецФункции + +// Возвращаемое значение: +// Булево +// +Функция ЗадатьВопросПроОтключениеOpenIDConnect(Признак = Null) Экспорт + + РешениеПринято = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить( + "ОтключениеАутентификацииOpenIDConnectПослеОбновленияИБ", "РешениеПринято", Неопределено, , ""); + + Возврат РешениеПринято = Признак; + +КонецФункции + +// Параметры: +// Отключить - Булево +// +Процедура ОбработатьОтветПроОтключениеOpenIDConnect(Отключить) Экспорт + + Если Отключить Тогда + СброситьАутентификациюOpenIDConnectУВсехПользователей(); + КонецЕсли; + + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить( + "ОтключениеАутентификацииOpenIDConnectПослеОбновленияИБ", "РешениеПринято", Отключить, , ""); + +КонецПроцедуры + +// Процедура обновляет данные регистра при изменении свойств пользователя ИБ, +// связанного с элементом справочника Пользователи и ВнешниеПользователи. +// +// Параметры: +// Пользователь - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// - Неопределено - для всех. +// +// ЕстьИзменения - Булево - (возвращаемое значение) - если производилась запись, +// устанавливается Истина, иначе не изменяется. +// +Процедура ОбновитьДанныеРегистра(Пользователь = Неопределено, ЕстьИзменения = Неопределено) Экспорт + + Если Пользователь = Неопределено Тогда + УдалитьСведенияОбУдаленныхПользователях(Пользователь, ЕстьИзменения); + КонецЕсли; + + Запрос = ЗапросСвойств(Пользователь); + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + Свойства = НовыеСвойстваПользователя(Выборка.Ссылка, Выборка); + Если Свойства = Неопределено Тогда + Продолжить; + КонецЕсли; + // @skip-check query-in-loop - Порционная обработка данных в транзакции + ОбновитьСведенияОПользователе(Выборка.Ссылка,,, ЕстьИзменения); + КонецЦикла; + +КонецПроцедуры + +// Параметры: +// Пользователь - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// +// Выборка - ВыборкаИзРезультатаЗапроса +// - СтрокаТаблицыЗначений +// +// ПользовательОбъект - СправочникОбъект.Пользователи +// - СправочникОбъект.ВнешниеПользователи +// - ДанныеФормыСтруктура +// - Неопределено +// +// ПользовательИБ - ПользовательИнформационнойБазы +// - Неопределено +// +Функция НовыеСвойстваПользователя(Пользователь, Выборка, + ПользовательОбъект = Неопределено, ПользовательИБ = Неопределено) Экспорт + + ТекущиеСвойства = Новый Структура; + ТекущиеСвойства.Вставить("ПометкаУдаления", Ложь); + ТекущиеСвойства.Вставить("ИдентификаторПользователяИБ", + ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор()); + + ЭтоВнешнийПользователь = ТипЗнч(Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи"); + Свойства = НовыеСвойства(ЭтоВнешнийПользователь); + + Если Выборка <> Неопределено И Выборка.СрокДействия <> Null Тогда + ЗаполнитьЗначенияСвойств(Свойства, Выборка, + "ПотребоватьСменуПароляПриВходе, + |СрокДействияНеОграничен, + |СрокДействия, + |ПросрочкаРаботыВПрограммеДоЗапрещенияВхода"); + КонецЕсли; + + ИменаСвойствАутентификации = + "АутентификацияСтандартная, + |АутентификацияOpenID, + |АутентификацияOpenIDConnect, + |АутентификацияТокеномДоступа, + |АутентификацияОС"; + + Если ПользовательОбъект <> Неопределено Тогда + Если ТипЗнч(ПользовательОбъект) <> Тип("ДанныеФормыСтруктура") + И ПользовательОбъект.ДополнительныеСвойства.Свойство("РасширенныеСвойстваПользователяИБ") + И ТипЗнч(ПользовательОбъект.ДополнительныеСвойства.РасширенныеСвойстваПользователяИБ) = Тип("Структура") Тогда + + РасширенныеСвойства = ПользовательОбъект.ДополнительныеСвойства.РасширенныеСвойстваПользователяИБ; + УровеньДоступа = ПользователиСлужебный.УровеньДоступаКСвойствамПользователя(ПользовательОбъект); + Если УровеньДоступа.НастройкиДляВхода Тогда + ЗаполнитьЗначенияСвойств(Свойства, РасширенныеСвойства, + "ПотребоватьСменуПароляПриВходе, + |СрокДействияНеОграничен, + |СрокДействия, + |ПросрочкаРаботыВПрограммеДоЗапрещенияВхода"); + Иначе + Свойства.ПотребоватьСменуПароляПриВходе = + РасширенныеСвойства.ПотребоватьСменуПароляПриВходе; + КонецЕсли; + КонецЕсли; + Если ТипЗнч(ПользовательОбъект) <> Тип("ДанныеФормыСтруктура") + И ПользовательОбъект.ДополнительныеСвойства.Свойство("ХранимыеСвойстваПользователяИБ") + И ТипЗнч(ПользовательОбъект.ДополнительныеСвойства.ХранимыеСвойстваПользователяИБ) = Тип("Структура") Тогда + + ХранимыеСвойства = ПользовательОбъект.ДополнительныеСвойства.ХранимыеСвойстваПользователяИБ; + ПромежуточнаяСтруктура = Новый Структура(ИменаСвойствАутентификации); + ЗаполнитьЗначенияСвойств(ПромежуточнаяСтруктура, Свойства); + ЗаполнитьЗначенияСвойств(ПромежуточнаяСтруктура, ХранимыеСвойства); + ЗаполнитьЗначенияСвойств(Свойства, ПромежуточнаяСтруктура); + КонецЕсли; + ЗаполнитьЗначенияСвойств(ТекущиеСвойства, ПользовательОбъект); + + ИначеЕсли Выборка <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(ТекущиеСвойства, Выборка); + КонецЕсли; + + Если ПользовательИБ = Неопределено Тогда + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( + ТекущиеСвойства.ИдентификаторПользователяИБ); + КонецЕсли; + + Свойства.ВходВПрограммуОграничен = ЗначениеЗаполнено(Свойства.СрокДействия) + Или ЗначениеЗаполнено(Свойства.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода); + + Если ПользовательИБ <> Неопределено Тогда + ВходВПрограммуРазрешен = Пользователи.ВходВПрограммуРазрешен(ПользовательИБ); + ЗаполнитьЗначенияСвойств(Свойства, ПользовательИБ,, + "Язык, ЗащитаОтОпасныхДействий" + ?(ВходВПрограммуРазрешен, "", + "," + ИменаСвойствАутентификации)); + + Если Не ВходВПрограммуРазрешен + И ХранимыеСвойства = Неопределено + И Выборка <> Неопределено Тогда + + ЗаполнитьЗначенияСвойств(Свойства, Выборка, ИменаСвойствАутентификации); + КонецЕсли; + + Если ТипЗнч(ПользовательИБ.Язык) = Тип("ОбъектМетаданных") Тогда + Свойства.Язык = ПользовательИБ.Язык.Имя; + КонецЕсли; + Свойства.ЗащитаОтОпасныхДействий = + ПользовательИБ.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях; + Свойства.ВходВПрограммуРазрешен = ВходВПрограммуРазрешен; + НаличиеПрав = НаличиеПрав(ПользовательИБ); + ЗаполнитьЗначенияСвойств(Свойства, НаличиеПрав); + КонецЕсли; + + Если ТекущиеСвойства.ПометкаУдаления Тогда + Свойства.НомерКартинкиСостояния = 1 + ?(ЭтоВнешнийПользователь, 6, 0); + + ИначеЕсли ПользовательИБ = Неопределено Тогда + Свойства.НомерКартинкиСостояния = 15 + ?(ЭтоВнешнийПользователь, 3, 0); + + ИначеЕсли Не Свойства.ВходВПрограммуРазрешен + Или Свойства.НетПрав + Или Свойства.НедостаточноПравДляВхода Тогда + + Свойства.НомерКартинкиСостояния = 13 + ?(ЭтоВнешнийПользователь, 3, 0); + + ИначеЕсли Свойства.ВходВПрограммуОграничен Тогда + Свойства.НомерКартинкиСостояния = 14 + ?(ЭтоВнешнийПользователь, 3, 0); + Иначе + Свойства.НомерКартинкиСостояния = 2 + ?(ЭтоВнешнийПользователь, 6, 0); + КонецЕсли; + + Если Выборка = Неопределено Тогда + Возврат Свойства; + КонецЕсли; + + Для Каждого КлючИЗначение Из Свойства Цикл + Если Выборка[КлючИЗначение.Ключ] <> Свойства[КлючИЗначение.Ключ] Тогда + Возврат Свойства; + КонецЕсли; + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +// Параметры: +// Пользователь - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// +// ПользовательОбъект - СправочникОбъект.Пользователи +// - СправочникОбъект.ВнешниеПользователи +// - Неопределено +// +// ПользовательИБ - ПользовательИнформационнойБазы +// - Неопределено +// +// ЕстьИзменения - Булево - возвращаемое значение. +// +Процедура ОбновитьСведенияОПользователе(Пользователь, ПользовательОбъект = Неопределено, + ПользовательИБ = Неопределено, ЕстьИзменения = Ложь) Экспорт + + Блокировка = Новый БлокировкаДанных; + Если ТипЗнч(Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда + ЭлементБлокировки = Блокировка.Добавить("Справочник.ВнешниеПользователи"); + Иначе + ЭлементБлокировки = Блокировка.Добавить("Справочник.Пользователи"); + КонецЕсли; + ЭлементБлокировки.УстановитьЗначение("Ссылка", Пользователь); + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.СведенияОПользователях"); + ЭлементБлокировки.УстановитьЗначение("Пользователь", Пользователь); + + Запрос = ЗапросСвойств(Пользователь); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + Выборка = Запрос.Выполнить().Выбрать(); + Если Не Выборка.Следующий() Тогда + Выборка = Неопределено; + КонецЕсли; + Свойства = НовыеСвойстваПользователя(Пользователь, Выборка, ПользовательОбъект, ПользовательИБ); + Если Свойства <> Неопределено Тогда + НаборЗаписей = СлужебныйНаборЗаписей(РегистрыСведений.СведенияОПользователях); + НаборЗаписей.Отбор.Пользователь.Установить(Пользователь); + НаборЗаписей.Прочитать(); + Если НаборЗаписей.Количество() = 0 Тогда + Запись = НаборЗаписей.Добавить(); + Запись.Пользователь = Пользователь; + Иначе + Запись = НаборЗаписей[0]; + КонецЕсли; + ЗаполнитьЗначенияСвойств(Запись, Свойства); + НаборЗаписей.Записать(); + ЕстьИзменения = Истина; + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +Функция НовыеСвойства(ЭтоВнешнийПользователь) + + Свойства = Новый Структура; + Свойства.Вставить("НомерКартинкиСостояния", 0); + + Свойства.Вставить("ПотребоватьСменуПароляПриВходе", Ложь); + Свойства.Вставить("СрокДействияНеОграничен", Ложь); + Свойства.Вставить("СрокДействия", '00010101'); + Свойства.Вставить("ПросрочкаРаботыВПрограммеДоЗапрещенияВхода", 0); + + Свойства.Вставить("ВходВПрограммуРазрешен", Ложь); + Свойства.Вставить("ВходВПрограммуОграничен", Ложь); + Свойства.Вставить("НетПрав", Ложь); + Свойства.Вставить("НедостаточноПравДляВхода", Ложь); + Свойства.Вставить("Имя", ""); + Свойства.Вставить("АдресЭлектроннойПочты", ""); + Свойства.Вставить("АутентификацияСтандартная", Ложь); + Свойства.Вставить("ЗапрещеноИзменятьПароль", Ложь); + Свойства.Вставить("ЗапрещеноВосстанавливатьПароль", Ложь); + Свойства.Вставить("ПоказыватьВСпискеВыбора", Ложь); + Свойства.Вставить("АутентификацияOpenID", Ложь); + Свойства.Вставить("АутентификацияOpenIDConnect", Ложь); + Свойства.Вставить("АутентификацияТокеномДоступа", Ложь); + Свойства.Вставить("АутентификацияОС", Ложь); + Свойства.Вставить("ПользовательОС", ""); + Свойства.Вставить("Язык", ""); + Свойства.Вставить("ЗащитаОтОпасныхДействий", Ложь); + + Возврат Свойства; + +КонецФункции + +Функция ЗапросСвойств(Пользователь) Экспорт + + ТекстЗапроса = + "ВЫБРАТЬ + | ЕСТЬNULL(Пользователи.Ссылка, СведенияОПользователях.Пользователь) КАК Ссылка, + | Пользователи.ИдентификаторПользователяИБ КАК ИдентификаторПользователяИБ, + | Пользователи.ПометкаУдаления КАК ПометкаУдаления, + | СведенияОПользователях.ПотребоватьСменуПароляПриВходе КАК ПотребоватьСменуПароляПриВходе, + | СведенияОПользователях.СрокДействияНеОграничен КАК СрокДействияНеОграничен, + | СведенияОПользователях.СрокДействия КАК СрокДействия, + | СведенияОПользователях.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода КАК ПросрочкаРаботыВПрограммеДоЗапрещенияВхода, + | СведенияОПользователях.НомерКартинкиСостояния КАК НомерКартинкиСостояния, + | СведенияОПользователях.ВходВПрограммуРазрешен КАК ВходВПрограммуРазрешен, + | СведенияОПользователях.ВходВПрограммуОграничен КАК ВходВПрограммуОграничен, + | СведенияОПользователях.НетПрав КАК НетПрав, + | СведенияОПользователях.НедостаточноПравДляВхода КАК НедостаточноПравДляВхода, + | СведенияОПользователях.Имя КАК Имя, + | СведенияОПользователях.АдресЭлектроннойПочты КАК АдресЭлектроннойПочты, + | СведенияОПользователях.АутентификацияСтандартная КАК АутентификацияСтандартная, + | СведенияОПользователях.ЗапрещеноИзменятьПароль КАК ЗапрещеноИзменятьПароль, + | СведенияОПользователях.ЗапрещеноВосстанавливатьПароль КАК ЗапрещеноВосстанавливатьПароль, + | СведенияОПользователях.ПоказыватьВСпискеВыбора КАК ПоказыватьВСпискеВыбора, + | СведенияОПользователях.АутентификацияOpenID КАК АутентификацияOpenID, + | СведенияОПользователях.АутентификацияOpenIDConnect КАК АутентификацияOpenIDConnect, + | СведенияОПользователях.АутентификацияТокеномДоступа КАК АутентификацияТокеномДоступа, + | СведенияОПользователях.АутентификацияОС КАК АутентификацияОС, + | СведенияОПользователях.ПользовательОС КАК ПользовательОС, + | СведенияОПользователях.Язык КАК Язык, + | СведенияОПользователях.ЗащитаОтОпасныхДействий КАК ЗащитаОтОпасныхДействий + |ИЗ + | Справочник.Пользователи КАК Пользователи + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях + | ПО (СведенияОПользователях.Пользователь = Пользователи.Ссылка) + |ГДЕ + | &ОтборПоПользователю"; + + Запрос = Новый Запрос; + + Если Пользователь = Неопределено Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоПользователю", "ИСТИНА"); + Запрос.Текст = ТекстЗапроса + Символы.ПС + Символы.ПС + + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС + Символы.ПС + + СтрЗаменить(ТекстЗапроса, "Справочник.Пользователи", + "Справочник.ВнешниеПользователи"); + Иначе + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ЛЕВОЕ СОЕДИНЕНИЕ", "ПОЛНОЕ СОЕДИНЕНИЕ"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоПользователю", + "Пользователи.Ссылка = &Пользователь + | ИЛИ СведенияОПользователях.Пользователь = &Пользователь"); + Запрос.УстановитьПараметр("Пользователь", Пользователь); + Если ТипЗнч(Пользователь) = Тип("СправочникСсылка.Пользователи") Тогда + Запрос.Текст = ТекстЗапроса; + Иначе + Запрос.Текст = СтрЗаменить(ТекстЗапроса, "Справочник.Пользователи", + "Справочник.ВнешниеПользователи"); + КонецЕсли; + КонецЕсли; + + Возврат Запрос; + +КонецФункции + +Процедура УдалитьСведенияОбУдаленныхПользователях(Пользователь, ЕстьИзменения = Ложь) + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | СведенияОПользователях.Пользователь КАК Ссылка + |ИЗ + | РегистрСведений.СведенияОПользователях КАК СведенияОПользователях + |ГДЕ + | СведенияОПользователях.Пользователь.Ссылка ЕСТЬ NULL + | И &ОтборПоПользователю"; + + Если Пользователь = Неопределено Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПоПользователю", "ИСТИНА"); + Иначе + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПоПользователю", + "СведенияОПользователях.Пользователь = &Пользователь"); + Запрос.УстановитьПараметр("Пользователь", Пользователь); + КонецЕсли; + + // АПК:1328-выкл - №648.1.1 блокировка данных не требуется при очистке избыточных записей. + Выборка = Запрос.Выполнить().Выбрать(); + // АПК:1328-вкл + Пока Выборка.Следующий() Цикл + НаборЗаписей = РегистрыСведений.СведенияОПользователях.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Пользователь.Установить(Выборка.Ссылка); + НаборЗаписей.Записать(); + ЕстьИзменения = Истина; + КонецЦикла; + +КонецПроцедуры + +// Создает служебный элемент справочника, который не участвует в подписках на события. +// +// Параметры: +// Ссылка - СправочникСсылка +// +Функция СлужебныйЭлемент(Ссылка) + + ЭлементСправочника = Ссылка.ПолучитьОбъект(); + Если ЭлементСправочника = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + ЭлементСправочника.ДополнительныеСвойства.Вставить("НеВыполнятьКонтрольУдаляемых"); + ЭлементСправочника.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов"); + ЭлементСправочника.ОбменДанными.Получатели.АвтоЗаполнение = Ложь; + ЭлементСправочника.ОбменДанными.Загрузка = Истина; + + Возврат ЭлементСправочника; + +КонецФункции + +// Создает набор записей служебного регистра, который не участвует в подписках на события. +Функция СлужебныйНаборЗаписей(МенеджерРегистра) + + НаборЗаписей = МенеджерРегистра.СоздатьНаборЗаписей(); + НаборЗаписей.ДополнительныеСвойства.Вставить("НеВыполнятьКонтрольУдаляемых"); + НаборЗаписей.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов"); + НаборЗаписей.ОбменДанными.Получатели.АвтоЗаполнение = Ложь; + НаборЗаписей.ОбменДанными.Загрузка = Истина; + + Возврат НаборЗаписей; + +КонецФункции + +Процедура ОбновитьСведенияОПользователяхИОтключитьАутентификацию() Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Пользователи.Ссылка КАК Пользователь + |ИЗ + | Справочник.Пользователи КАК Пользователи + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ВнешниеПользователи.Ссылка + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | СведенияОПользователях.Пользователь + |ИЗ + | РегистрСведений.СведенияОПользователях КАК СведенияОПользователях + |ГДЕ + | СведенияОПользователях.Пользователь.Ссылка ЕСТЬ NULL"; + + Выборка = Запрос.Выполнить().Выбрать(); + + ТаблицаПользователей = РегистрыСведений.СведенияОПользователях.СоздатьНаборЗаписей().Выгрузить(, "Пользователь"); + ТаблицаПользователей.Добавить(); + + Пока Выборка.Следующий() Цикл + Пользователь = Выборка.Пользователь; + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.СведенияОПользователях"); + ЭлементБлокировки.УстановитьЗначение("Пользователь", Пользователь); + Если ТипЗнч(Пользователь) = Тип("СправочникСсылка.Пользователи") Тогда + ЭлементБлокировки = Блокировка.Добавить("Справочник.Пользователи"); + ИначеЕсли ТипЗнч(Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда + ЭлементБлокировки = Блокировка.Добавить("Справочник.ВнешниеПользователи"); + Иначе + Продолжить; + КонецЕсли; + ЭлементБлокировки.УстановитьЗначение("Ссылка", Пользователь); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + ЕстьИзменения = Ложь; + // @skip-check query-in-loop - Порционная обработка данных в транзакции + УдалитьСведенияОбУдаленныхПользователях(Пользователь, ЕстьИзменения); + Если Не ЕстьИзменения Тогда + ПользовательОбъект = СлужебныйЭлемент(Пользователь); + Если ПользовательОбъект <> Неопределено Тогда + СброситьАутентификациюНедействительногоПользователя(ПользовательОбъект); + СброситьЛишнююАутентификациюOpenIDConnect(ПользовательОбъект); + СтарыеСвойства = ПользовательОбъект.УдалитьСвойстваПользователяИБ.Получить(); + Если СтарыеСвойства <> Неопределено Тогда + ПользовательОбъект.УдалитьСвойстваПользователяИБ = Новый ХранилищеЗначения(Неопределено); + Если ТипЗнч(СтарыеСвойства) = Тип("Структура") Тогда + ПользовательОбъект.ДополнительныеСвойства.Вставить("ХранимыеСвойстваПользователяИБ", + ПользователиСлужебный.ХранимыеСвойстваПользователяИБ(СтарыеСвойства)); + КонецЕсли; + КонецЕсли; + // @skip-check query-in-loop - Порционная обработка данных в транзакции + ОбновитьСведенияОПользователе(Пользователь, ПользовательОбъект); + Если ПользовательОбъект.Модифицированность() Тогда + // АПК:1363-выкл - служебная очистка хранимых свойств аутентификации, которые не участвует в обмене данными. + ПользовательОбъект.Записать(); + // АПК:1363-вкл + КонецЕсли; + КонецЕсли; + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + КонецЦикла; + + Если СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() Тогда + СброситьАутентификациюOpenIDConnectУВсехПользователей(); + + ИначеЕсли ЗадатьВопросПроОтключениеOpenIDConnect(Неопределено) + И ЕстьВключеннаяАутентификациюOpenIDConnect() Тогда + + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить( + "ОтключениеАутентификацииOpenIDConnectПослеОбновленияИБ", "РешениеПринято", Null, , ""); + КонецЕсли; + +КонецПроцедуры + +Процедура СброситьАутентификациюНедействительногоПользователя(ПользовательОбъект) + + Если Не ПользовательОбъект.Недействителен + И Не ПользовательОбъект.ПометкаУдаления Тогда + Возврат; + КонецЕсли; + + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( + ПользовательОбъект.ИдентификаторПользователяИБ); + + Если ПользовательИБ = Неопределено Тогда + Возврат; + КонецЕсли; + + Записать = Ложь; + Если ПользовательИБ.АутентификацияСтандартная Тогда + ПользовательИБ.АутентификацияСтандартная = Ложь; + Записать = Истина; + КонецЕсли; + + Если ПользовательИБ.АутентификацияOpenID Тогда + ПользовательИБ.АутентификацияOpenID = Ложь; + Записать = Истина; + КонецЕсли; + + Если ПользовательИБ.АутентификацияOpenIDConnect Тогда + ПользовательИБ.АутентификацияOpenIDConnect = Ложь; + Записать = Истина; + КонецЕсли; + + Если ПользовательИБ.АутентификацияТокеномДоступа Тогда + ПользовательИБ.АутентификацияТокеномДоступа = Ложь; + Записать = Истина; + КонецЕсли; + + Если ПользовательИБ.АутентификацияОС Тогда + ПользовательИБ.АутентификацияОС = Ложь; + Записать = Истина; + КонецЕсли; + + Если Записать Тогда + ПользовательИБ.Записать(); + КонецЕсли; + +КонецПроцедуры + +Процедура СброситьЛишнююАутентификациюOpenIDConnect(ПользовательОбъект) + + Если ПользовательОбъект.Недействителен + Или ПользовательОбъект.ПометкаУдаления Тогда + Возврат; + КонецЕсли; + + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( + ПользовательОбъект.ИдентификаторПользователяИБ); + + Если ПользовательИБ = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Не ПользовательИБ.АутентификацияСтандартная + И Не ПользовательИБ.АутентификацияOpenID + И ПользовательИБ.АутентификацияOpenIDConnect + И Не ПользовательИБ.АутентификацияТокеномДоступа + И Не ПользовательИБ.АутентификацияОС Тогда + + ПользовательИБ.АутентификацияOpenIDConnect = Ложь; + ПользовательИБ.Записать(); + КонецЕсли; + +КонецПроцедуры + +Процедура СброситьАутентификациюOpenIDConnectУВсехПользователей() + + ВсеПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Пользователи.Ссылка КАК Ссылка, + | Пользователи.ИдентификаторПользователяИБ КАК ИдентификаторПользователяИБ + |ИЗ + | Справочник.Пользователи КАК Пользователи + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ВнешниеПользователи.Ссылка, + | ВнешниеПользователи.ИдентификаторПользователяИБ + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи"; + Выгрузка = Запрос.Выполнить().Выгрузить(); + + Для Каждого ПользовательИБ Из ВсеПользователиИБ Цикл + Если Не ПользовательИБ.АутентификацияOpenIDConnect Тогда + Продолжить; + КонецЕсли; + ПользовательИБ.АутентификацияOpenIDConnect = Ложь; + Строка = Выгрузка.Найти(ПользовательИБ.УникальныйИдентификатор, "ИдентификаторПользователяИБ"); + НачатьТранзакцию(); + Попытка + ПользовательИБ.Записать(); + Если Строка <> Неопределено Тогда + // @skip-check query-in-loop - Порционная обработка данных в транзакции + ОбновитьСведенияОПользователе(Строка.Ссылка); + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + КонецЦикла; + +КонецПроцедуры + +Функция ЕстьВключеннаяАутентификациюOpenIDConnect() + + ВсеПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); + + Для Каждого ПользовательИБ Из ВсеПользователиИБ Цикл + Если ПользовательИБ.АутентификацияOpenIDConnect Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +#КонецОбласти + +#КонецЕсли diff --git a/SSL/src/InformationRegisters/СведенияОПользователях/СведенияОПользователях.mdo b/SSL/src/InformationRegisters/СведенияОПользователях/СведенияОПользователях.mdo index a55defea8..6cf016d39 100644 --- a/SSL/src/InformationRegisters/СведенияОПользователях/СведенияОПользователях.mdo +++ b/SSL/src/InformationRegisters/СведенияОПользователях/СведенияОПользователях.mdo @@ -219,10 +219,10 @@ - ДатаНачалаИспользованияПароля + УдалитьДатаНачалаИспользованияПароля ru - Дата начала использования пароля + (не используется) Дата начала использования пароля Date @@ -244,10 +244,10 @@ - ИспользованныеПароли + УдалитьИспользованныеПароли ru - Использованные пароли + (не используется) Использованные пароли ValueStorage @@ -284,6 +284,366 @@ Use + + НомерКартинкиСостояния + + ru + Номер картинки состояния + + + Number + + 2 + true + + + + ru + Номер картинки состояния пользователя для форм списка справочников Пользователи и Внешние пользователи + + + + Use + Use + + + + ВходВПрограммуРазрешен + + ru + Вход в программу разрешен + + + Boolean + + + ru + Пользователю разрешен вход в программу указанными способами аутентификации + + + + Use + Use + + + + ВходВПрограммуОграничен + + ru + Вход в программу ограничен + + + Boolean + + + ru + Установлен срок действия входа или просрочка входа в программу + + + + Use + Use + + + + НетПрав + + ru + Нет прав + + + Boolean + + + ru + У пользователя информационной базы пустой список ролей + + + + Use + Use + + + + НедостаточноПравДляВхода + + ru + Недостаточно прав для входа + + + Boolean + + + ru + У пользователя информационной базы нет ролей с правами на вход в программу + + + + Use + Use + + + + Имя + + ru + Имя (для входа) + + + String + + 255 + + + + ru + Имя пользователя информационной базы + + + + Use + Use + + + + АдресЭлектроннойПочты + + ru + Адрес электронной почты + + + String + + 255 + + + + ru + Адрес электронной почты, используемый для восстановления пароля + + + + Use + Use + + + + АутентификацияСтандартная + + ru + Аутентификация стандартная + + + Boolean + + + ru + Способ входа в программу с помощью имени и пароля, +указанного для пользователя 1С:Предприятия + + + + Use + Use + + + + ЗапрещеноИзменятьПароль + + ru + Запрещено изменять пароль + + + Boolean + + + ru + Запрещает изменение своего пароля +неполноправному пользователю, +а также при входе + + + + Use + Use + + + + ЗапрещеноВосстанавливатьПароль + + ru + Запрещено восстанавливать пароль + + + Boolean + + + ru + Запрещает восстановление пароля пользователю + + + + Use + Use + + + + ПоказыватьВСпискеВыбора + + ru + Показывать в списке выбора + + + Boolean + + + ru + Показывать имя (для входа) в списке выбора диалога стандартной аутентификации 1С:Предприятия + + + + Use + Use + + + + АутентификацияOpenID + + ru + Аутентификация OpenID + + + Boolean + + + ru + Способ входа в программу с помощью имени, указанного для пользователя 1С:Предприятия, +которое передается службе аутентификации по протоколу OpenID. +Используется только при подключении через веб-сервер (адрес службы должен быть настроен) + + + + Use + Use + + + + АутентификацияOpenIDConnect + + ru + Аутентификация OpenID-Connect + + + Boolean + + + ru + Способ входа в программу с проверкой личности по протоколу OpenID-Connect, +сопоставление имени, как при использовании аутентификации по протоколу OpenID. +Используется только при подключении через веб-сервер (адрес службы должен быть настроен) + + + + Use + Use + + + + АутентификацияТокеномДоступа + + ru + Аутентификация токеном доступа + + + Boolean + + + ru + Аутентификация с помощью JWT-токенов (стандарт RFC 7519). +Более продвинутая аутентификация по сравнению с OpenID и OpenID-Connect + + + + Use + Use + + + + АутентификацияОС + + ru + Аутентификация операционной системы + + + Boolean + + + ru + Способ входа в программу с помощью имени и пароля, +указанного для пользователя операционной системы, +связанного с пользователем 1С:Предприятия + + + + Use + Use + + + + ПользовательОС + + ru + Пользователь операционной системы + + + String + + 255 + + + + + Use + Use + + + + Язык + + ru + Язык интерфейса + + + String + + 100 + + + + + Use + Use + + + + ЗащитаОтОпасныхДействий + + ru + Защита от опасных действий + + + Boolean + + + ru + Показывать подтверждение при выполнении некоторых действий с операционной системой + + + + Use + Use + + Пользователь diff --git a/SSL/src/InformationRegisters/СведенияОФайлах/ManagerModule.bsl b/SSL/src/InformationRegisters/СведенияОФайлах/ManagerModule.bsl index a4844f3e0..98cec8ece 100644 --- a/SSL/src/InformationRegisters/СведенияОФайлах/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/СведенияОФайлах/ManagerModule.bsl @@ -36,6 +36,7 @@ | СведенияОФайлах.Файл > &Файл | И СведенияОФайлах.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ПустаяСсылка)"; Запрос.УстановитьПараметр("Файл", Файл); + // @skip-check query-in-loop - Порционная обработка данных ИзмеренияРегистра = Запрос.Выполнить().Выгрузить(); ДополнительныеПараметры = ОбновлениеИнформационнойБазы.ДополнительныеПараметрыОтметкиОбработки(); @@ -99,7 +100,7 @@ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать сведения о файле %1 по причине: |%2'"), - Строка.Файл, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Строка.Файл, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, Строка.Файл.Метаданные(), Строка.Файл, ТекстСообщения); КонецПопытки; diff --git a/SSL/src/InformationRegisters/СертификатыПолучателейРассылкиОтчетов/ManagerModule.bsl b/SSL/src/InformationRegisters/СертификатыПолучателейРассылкиОтчетов/ManagerModule.bsl new file mode 100644 index 000000000..10c42a3b9 --- /dev/null +++ b/SSL/src/InformationRegisters/СертификатыПолучателейРассылкиОтчетов/ManagerModule.bsl @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2023, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныеПроцедурыИФункции + +// Для внутреннего использования. +// +Процедура СохранитьСертификатДляПолучателяРассылки(ПолучательРассылки, СертификатДляШифрования) Экспорт + УстановитьПривилегированныйРежим(Истина); + + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных(); + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.СертификатыПолучателейРассылкиОтчетов"); + ЭлементБлокировки.УстановитьЗначение("ПолучательРассылки", ПолучательРассылки); + Блокировка.Заблокировать(); + + МенеджерЗаписи = СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ПолучательРассылки= ПолучательРассылки; + МенеджерЗаписи.Прочитать(); + + МенеджерЗаписи.ПолучательРассылки = ПолучательРассылки; + МенеджерЗаписи.СертификатДляШифрования = СертификатДляШифрования; + + МенеджерЗаписи.Записать(Истина); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; +КонецПроцедуры + +#КонецОбласти + +#КонецЕсли 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/СертификатыПолучателейРассылкиОтчетов/СертификатыПолучателейРассылкиОтчетов.mdo b/SSL/src/InformationRegisters/СертификатыПолучателейРассылкиОтчетов/СертификатыПолучателейРассылкиОтчетов.mdo new file mode 100644 index 000000000..f7dbaaeac --- /dev/null +++ b/SSL/src/InformationRegisters/СертификатыПолучателейРассылкиОтчетов/СертификатыПолучателейРассылкиОтчетов.mdo @@ -0,0 +1,86 @@ + + + + + + + + + + + + СертификатыПолучателейРассылкиОтчетов + + ru + Сертификаты получателей рассылки отчетов + + true + InDialog + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + СертификатДляШифрования + + ru + Сертификат для шифрования + + + CatalogRef.СертификатыКлючейЭлектроннойПодписиИШифрования + + + + Use + Use + + + + ПолучательРассылки + + ru + Получатель рассылки + + + DefinedType.ПолучательРассылки + + + + Use + Use + true + + true + true + + diff --git a/SSL/src/InformationRegisters/СессииОбменаСообщениямиСистемы/ManagerModule.bsl b/SSL/src/InformationRegisters/СессииОбменаСообщениямиСистемы/ManagerModule.bsl index 8a422b853..592e97b5b 100644 --- a/SSL/src/InformationRegisters/СессииОбменаСообщениямиСистемы/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/СессииОбменаСообщениямиСистемы/ManagerModule.bsl @@ -61,12 +61,13 @@ // Отмечает неуспешное выполнение сессии // -Процедура ЗафиксироватьНеуспешноеВыполнениеСессии(Знач Сессия) Экспорт +Процедура ЗафиксироватьНеуспешноеВыполнениеСессии(Знач Сессия, Знач ОписаниеОшибки = "") Экспорт СтруктураЗаписи = Новый Структура; СтруктураЗаписи.Вставить("Сессия", Сессия); СтруктураЗаписи.Вставить("ЗавершенаУспешно", Ложь); СтруктураЗаписи.Вставить("ЗавершенаСОшибкой", Истина); + СтруктураЗаписи.Вставить("ОписаниеОшибки", ОписаниеОшибки); ОбновитьЗапись(СтруктураЗаписи); @@ -120,6 +121,24 @@ КонецФункции +// Получает описание ошибки сессии. +// +Функция ОписаниеОшибкиСессии(Знач Сессия) Экспорт + + ТекстЗапроса = + "ВЫБРАТЬ + | СессииОбменаСообщениямиСистемы.ОписаниеОшибки КАК ОписаниеОшибки + |ИЗ + | РегистрСведений.СессииОбменаСообщениямиСистемы КАК СессииОбменаСообщениямиСистемы + |ГДЕ + | СессииОбменаСообщениямиСистемы.Сессия = &Сессия"; + + Запись = ЗаписьСессияОбменаСообщениями(ТекстЗапроса, Сессия); + + Возврат Запись.ОписаниеОшибки; + +КонецФункции + // Вспомогательные процедуры и функции Функция ЗаписьСессияОбменаСообщениями(ТекстЗапроса, Сессия) diff --git a/SSL/src/InformationRegisters/СессииОбменаСообщениямиСистемы/СессииОбменаСообщениямиСистемы.mdo b/SSL/src/InformationRegisters/СессииОбменаСообщениямиСистемы/СессииОбменаСообщениямиСистемы.mdo index 97ec31655..5f94d0dbb 100644 --- a/SSL/src/InformationRegisters/СессииОбменаСообщениямиСистемы/СессииОбменаСообщениямиСистемы.mdo +++ b/SSL/src/InformationRegisters/СессииОбменаСообщениямиСистемы/СессииОбменаСообщениямиСистемы.mdo @@ -127,6 +127,22 @@ Use + + ОписаниеОшибки + + ru + Описание ошибки + + + String + + + + + Use + Use + + Сессия diff --git a/SSL/src/InformationRegisters/СоставыГруппПользователей/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/СоставыГруппПользователей/Forms/ФормаСписка/Form.form index 2bcbc1dd7..e4262e962 100644 --- a/SSL/src/InformationRegisters/СоставыГруппПользователей/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/СоставыГруппПользователей/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Form.form b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Form.form index a48881379..740e03df4 100644 --- a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Form.form +++ b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Form.form @@ -101,7 +101,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto @@ -290,7 +289,6 @@ AlwaysHorizontal Single - Auto true true Auto @@ -488,7 +486,6 @@ AlwaysHorizontal Half - Auto true true Auto @@ -674,7 +671,6 @@ AlwaysHorizontal Right - Auto true true Auto @@ -705,7 +701,6 @@ HorizontalIfPossible Single - Auto true true Auto @@ -1301,7 +1296,6 @@ AlwaysHorizontal Bottom - Auto true true Auto diff --git a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Module.bsl b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Module.bsl index b5513986d..e9e00d043 100644 --- a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Module.bsl +++ b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Module.bsl @@ -183,8 +183,6 @@ // Параметры: // Команда - КомандаФормы // -//@skip-warning -// &НаКлиенте Процедура Подключаемый_УстановитьСостояниеОригинала(Команда) @@ -206,28 +204,20 @@ &НаКлиенте Процедура УстановитьСостояниеОригинала(Команда) + ОригиналПолучен = ПредопределенноеЗначение("Справочник.СостоянияОригиналовПервичныхДокументов.ОригиналПолучен"); НайденноеСостояние = Элементы.Найти(Команда); - - Если Не НайденноеСостояние = Неопределено Тогда + Если НайденноеСостояние <> Неопределено Тогда ИмяСостояния = НайденноеСостояние.Заголовок; ИначеЕсли Команда = "УстановитьОригиналПолучен" Тогда - ИмяСостояния = "Оригинал получен"; + ИмяСостояния = ОригиналПолучен; Иначе Возврат; КонецЕсли; Для Каждого СтрокаСписка Из Элементы.КомплектПечатныхФорм.ВыделенныеСтроки Цикл ДанныеСтроки = Элементы.КомплектПечатныхФорм.ДанныеСтроки(СтрокаСписка); - - ДанныеСтроки.Состояние = НайтиСостояниеВСправочнике(ИмяСостояния); - - Если ДанныеСтроки.Состояние = ПредопределенноеЗначение("Справочник.СостоянияОригиналовПервичныхДокументов.ОригиналПолучен") Тогда - ДанныеСтроки.ОригиналПолученКартинка = 1; - Иначе - ДанныеСтроки.ОригиналПолученКартинка = 0; - КонецЕсли; - ДанныеСтроки.Состояние = НайтиСостояниеВСправочнике(ИмяСостояния); + ДанныеСтроки.ОригиналПолученКартинка = ?(ДанныеСтроки.Состояние = ОригиналПолучен, 1, 0); КонецЦикла; Элементы.КомплектПечатныхФорм.Обновить(); @@ -307,13 +297,16 @@ &НаСервере Процедура ЗаполнитьПервоначальныйСписокПечатныхФорм() - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда - МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); - Иначе + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда Возврат; КонецЕсли; - - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ОбщегоНазначения.ИмяТаблицыПоСсылке(Запись.Владелец)); + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); + + // Для отключения проверки конфигурации. + СвойстваЗаписи = Новый Структура("Ссылка", Запись.Владелец); + + ОбъектМетаданных = СвойстваЗаписи.Ссылка.Метаданные(); + СписокОбъектов = Новый Массив; СписокОбъектов.Добавить(ОбъектМетаданных); @@ -326,33 +319,31 @@ ОбъектыПечати.Добавить(Запись.Владелец); УчетОригиналовПервичныхДокументов.ПриОпределенииСпискаПечатныхФорм(ОбъектыПечати, СписокПечатныхФорм); - ОбъектМетаданных = ОбщегоНазначения.ИмяТаблицыПоСсылке(Запись.Владелец); + ПолноеИмяОМД = ОбъектМетаданных.ПолноеИмя(); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); ЗапросТаблицаКоманд = МодульДополнительныеОтчетыИОбработки.НовыйЗапросПоДоступнымКомандам( - Перечисления["ВидыДополнительныхОтчетовИОбработок"].ПечатнаяФорма,ОбъектМетаданных, Истина); + Перечисления["ВидыДополнительныхОтчетовИОбработок"].ПечатнаяФорма, ПолноеИмяОМД, Истина); ТаблицаКоманд = ЗапросТаблицаКоманд.Выполнить().Выгрузить(); КонецЕсли; - ТабличнаяЧасть = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьМногосотрудниковаДокумента(Запись.Владелец); + МодульФизическиеЛицаКлиентСервер = Неопределено; + ТабличнаяЧасть = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьССотрудниками(Запись.Владелец); Если ТабличнаяЧасть <> "" Тогда - МодульФизическиеЛицаКлиентСервер = Неопределено; // Инициализация переменной для международной версии - + // Локализация + МодульФизическиеЛицаКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ФизическиеЛицаКлиентСервер"); + // Конец Локализация Для Каждого Сотрудник Из Запись.Владелец[ТабличнаяЧасть] Цикл - СотрудникИзТЧ = Сотрудник.Сотрудник; // СправочникСсылка - - ФИО = СотрудникИзТЧ.Наименование; - // Локализация - МодульФизическиеЛицаКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ФизическиеЛицаКлиентСервер"); + СотрудникИзТЧ = Сотрудник.Сотрудник; // СправочникСсылка Если МодульФизическиеЛицаКлиентСервер <> Неопределено Тогда ФИО = МодульФизическиеЛицаКлиентСервер.ФамилияИнициалы(СотрудникИзТЧ.Наименование); Иначе ФИО = СотрудникИзТЧ.Наименование; КонецЕсли; - // Конец Локализация Для Каждого ТекСтрока Из СписокПечатныхФорм Цикл - Значения = Новый Структура("Представление, ФИО", ТекСтрока.Представление,ФИО); + Значения = Новый Структура("Представление, ФИО", ТекСтрока.Представление, ФИО); НоваяСтрока = КомплектПечатныхФорм.Добавить(); НоваяСтрока.ИмяМакета = ТекСтрока.Значение; НоваяСтрока.Представление = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(НСтр("ru='[Представление] [ФИО]'"), Значения); @@ -369,7 +360,7 @@ ФИО = СотрудникИзТЧ.Наименование; КонецЕсли; Для Каждого ТекСтрока Из ТаблицаКоманд Цикл - Значения = Новый Структура("Представление, ФИО", ТекСтрока.Представление,ФИО); + Значения = Новый Структура("Представление, ФИО", ТекСтрока.Представление, ФИО); Если КомплектПечатныхФорм.НайтиСтроки(Новый Структура("ИмяМакета", ТекСтрока.Идентификатор)) = 0 Тогда НоваяСтрока = КомплектПечатныхФорм.Добавить(); НоваяСтрока.ИмяМакета = ТекСтрока.Значение; @@ -407,12 +398,12 @@ КонецЕсли; КонецЕсли; - НенужныеСтроки = КомплектПечатныхФорм.НайтиСтроки(Новый Структура("Представление","Комплект документов на принтер")); + НенужныеСтроки = КомплектПечатныхФорм.НайтиСтроки(Новый Структура("Представление", НСтр("ru='Комплект документов на принтер'"))); Для Каждого НеНужнаяСтрока Из НенужныеСтроки Цикл КомплектПечатныхФорм.Удалить(НеНужнаяСтрока); КонецЦикла; - НенужныеСтроки = КомплектПечатныхФорм.НайтиСтроки(Новый Структура("Представление","Комплект документов с настройкой...")); + НенужныеСтроки = КомплектПечатныхФорм.НайтиСтроки(Новый Структура("Представление", НСтр("ru='Комплект документов с настройкой...'"))); Для Каждого НеНужнаяСтрока Из НенужныеСтроки Цикл КомплектПечатныхФорм.Удалить(НеНужнаяСтрока); КонецЦикла; @@ -536,7 +527,7 @@ Процедура УдалитьДубликатыФорм() Для Каждого Строка Из КомплектПечатныхФорм Цикл - ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьМногосотрудниковаДокумента(Запись.Владелец); + ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьССотрудниками(Запись.Владелец); Если ТЧ <> "" Тогда Отбор = Новый Структура("Представление",Строка.Представление); Иначе @@ -602,7 +593,7 @@ СвойстваЗаписи = Новый Структура("Ссылка", Запись.Владелец); Документ = СвойстваЗаписи.Ссылка.ПолучитьОбъект(); - ТипДокумента = Метаданные.НайтиПоПолномуИмени(ОбщегоНазначения.ИмяТаблицыПоСсылке(Запись.Владелец)); + ТипДокумента = СвойстваЗаписи.Ссылка.Метаданные(); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрефиксацияОбъектов") Тогда Значения = Новый Структура("Документ,Номер,Дата",СокрЛП(ТипДокумента), @@ -616,11 +607,10 @@ КонецПроцедуры &НаСервере -Функция НайтиСостояниеВСправочнике(ИмяСостояния) +Функция НайтиСостояниеВСправочнике(Знач ИмяСостояния) - СостояниеОригинала = Справочники.СостоянияОригиналовПервичныхДокументов.НайтиПоНаименованию(ИмяСостояния); - - Возврат СостояниеОригинала + Возврат ?(ТипЗнч(ИмяСостояния) = Тип("Строка"), + Справочники.СостоянияОригиналовПервичныхДокументов.НайтиПоНаименованию(ИмяСостояния), ИмяСостояния); КонецФункции @@ -667,7 +657,7 @@ Для Каждого ПечатнаяФорма Из КомплектПечатныхФорм Цикл Если ЗначениеЗаполнено(ПечатнаяФорма.Состояние) Тогда - ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьМногосотрудниковаДокумента(Запись.Владелец); + ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьССотрудниками(Запись.Владелец); Если ТЧ = "" Тогда ПроверкаЗаписьСостоянияОригинала.Отбор.ПервичныйДокумент.Установить(ПечатнаяФорма.ИмяМакета); ПроверкаЗаписьСостоянияОригинала.Прочитать(); diff --git a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ФормаЗаписи/Form.form index bb06ad9d9..7db6b1f8e 100644 --- a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ФормаЗаписи/Form.form @@ -305,7 +305,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl index f112b315b..e46cc690e 100644 --- a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl @@ -25,18 +25,19 @@ Если ПечатныеФормы.Количество() > 1 Тогда Для Каждого Документ Из ОбъектыПечати Цикл Если УчетОригиналовПервичныхДокументов.ЭтоОбъектУчета(Документ.Значение) Тогда - // Записываем общее состояние ЗаписатьОбщееСостояниеОригиналаДокумента(Документ.Значение,Состояние); - ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьМногосотрудниковаДокумента(Документ.Значение); + ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьССотрудниками(Документ.Значение); Если ТЧ <> "" Тогда Для Каждого Сотрудник Из Документ.Значение[ТЧ] Цикл - Для Каждого Форма Из ПечатныеФормы Цикл //Если документов и форм несколько, записываем для каждого документа, состояние каждой формы - ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ.Значение, Форма.Значение, Форма.Представление, Состояние, Ложь, Сотрудник.Сотрудник); + Для Каждого Форма Из ПечатныеФормы Цикл + ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ.Значение, + Форма.Значение, Форма.Представление, Состояние, Ложь, Сотрудник.Сотрудник); КонецЦикла; КонецЦикла; Иначе - Для Каждого Форма Из ПечатныеФормы Цикл //Если документов и форм несколько, записываем для каждого документа, состояние каждой формы - ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ.Значение, Форма.Значение, Форма.Представление, Состояние, Ложь); + Для Каждого Форма Из ПечатныеФормы Цикл + ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ.Значение, Форма.Значение, + Форма.Представление, Состояние, Ложь); КонецЦикла; КонецЕсли; Записано = Истина; @@ -45,13 +46,16 @@ Иначе Для Каждого Документ Из ОбъектыПечати Цикл Если УчетОригиналовПервичныхДокументов.ЭтоОбъектУчета(Документ.Значение) Тогда - ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьМногосотрудниковаДокумента(Документ.Значение); + ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьССотрудниками(Документ.Значение); Если ТЧ <> "" Тогда Для Каждого Сотрудник Из Документ.Значение[ТЧ] Цикл - ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ.Значение, ПечатныеФормы[0].Значение,ПечатныеФормы[0].Представление, Состояние, Ложь,Сотрудник.Сотрудник); + ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ.Значение, + ПечатныеФормы[0].Значение,ПечатныеФормы[0].Представление, Состояние, Ложь, + Сотрудник.Сотрудник); КонецЦикла; Иначе - ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ.Значение, ПечатныеФормы[0].Значение,ПечатныеФормы[0].Представление, Состояние, Ложь); + ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ.Значение, + ПечатныеФормы[0].Значение, ПечатныеФормы[0].Представление, Состояние, Ложь); КонецЕсли; ЗаписатьОбщееСостояниеОригиналаДокумента(Документ.Значение,Состояние); Записано = Истина; @@ -62,26 +66,30 @@ Документ = ОбъектыПечати[0].Значение; Если УчетОригиналовПервичныхДокументов.ЭтоОбъектУчета(Документ) Тогда Если ПечатныеФормы.Количество() > 1 Тогда - ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьМногосотрудниковаДокумента(Документ); + ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьССотрудниками(Документ); Если ТЧ <> "" Тогда Для Каждого Сотрудник Из Документ[ТЧ] Цикл Для Каждого Форма Из ПечатныеФормы Цикл - ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, Форма.Значение,Форма.Представление, Состояние, Ложь,Сотрудник.Сотрудник); + ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, Форма.Значение, + Форма.Представление, Состояние, Ложь,Сотрудник.Сотрудник); КонецЦикла; КонецЦикла; Иначе Для Каждого Форма Из ПечатныеФормы Цикл - ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, Форма.Значение,Форма.Представление, Состояние, Ложь); + ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, Форма.Значение, + Форма.Представление, Состояние, Ложь); КонецЦикла; КонецЕсли; Иначе - ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьМногосотрудниковаДокумента(Документ); + ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьССотрудниками(Документ); Если ТЧ <> "" Тогда Для Каждого Сотрудник Из Документ[ТЧ] Цикл - ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, ПечатныеФормы[0].Значение,ПечатныеФормы[0].Представление, Состояние, Ложь, Сотрудник.Сотрудник); + ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, ПечатныеФормы[0].Значение, + ПечатныеФормы[0].Представление, Состояние, Ложь, Сотрудник.Сотрудник); КонецЦикла; Иначе - ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, ПечатныеФормы[0].Значение,ПечатныеФормы[0].Представление, Состояние, Ложь); + ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, ПечатныеФормы[0].Значение, + ПечатныеФормы[0].Представление, Состояние, Ложь); КонецЕсли; КонецЕсли; ЗаписатьОбщееСостояниеОригиналаДокумента(Документ,Состояние); @@ -101,14 +109,14 @@ // Состояние - Строка - наименование состояния оригинала печатной формы // - СправочникСсылка - ссылка на состояние оригинала печатной формы. // Извне - Булево - признак, показывающий принадлежит ли форма системе 1С. -// Сотрудник - СправочникСсылка - ссылка на сотрудника, если оригинал документа является многосотрудниковым. +// Сотрудник - СправочникСсылка - ссылка на сотрудника, если в оригинале документа есть сведения о сотрудниках. // -Процедура ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, ПечатнаяФорма, Представление, Состояние, Извне, Сотрудник = Неопределено) Экспорт +Процедура ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, ПечатнаяФорма, Представление, Состояние, + Извне, Сотрудник = Неопределено) Экспорт -УстановитьПривилегированныйРежим(Истина); - - НачатьТранзакцию(); + УстановитьПривилегированныйРежим(Истина); + НачатьТранзакцию(); Попытка ЗаписьСостоянияОригинала = РегистрыСведений.СостоянияОригиналовПервичныхДокументов.СоздатьМенеджерЗаписи(); @@ -127,7 +135,8 @@ Значения = Новый Структура("Представление, ФИО", Представление, ФИО); ПредставлениеСотрудник = СтрНайти(Представление, ФИО); Если ПредставлениеСотрудник = 0 Тогда - ЗаписьСостоянияОригинала.ПервичныйДокументПредставление = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(НСтр("ru='[Представление] [ФИО]'"), Значения); + ЗаписьСостоянияОригинала.ПервичныйДокументПредставление = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку( + НСтр("ru='[Представление] [ФИО]'"), Значения); Иначе ЗаписьСостоянияОригинала.ПервичныйДокументПредставление = Представление; КонецЕсли; @@ -150,8 +159,6 @@ ВызватьИсключение; КонецПопытки; - УстановитьПривилегированныйРежим(Ложь); - КонецПроцедуры // Делает запись общего состояния оригинала документа в регистр. @@ -164,8 +171,7 @@ УстановитьПривилегированныйРежим(Истина); - НачатьТранзакцию(); - + НачатьТранзакцию(); Попытка Блокировка = Новый БлокировкаДанных(); @@ -216,8 +222,6 @@ ВызватьИсключение; КонецПопытки; - УстановитьПривилегированныйРежим(Ложь); - КонецПроцедуры #КонецОбласти diff --git a/SSL/src/InformationRegisters/СтатистикаКонфигурации/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/СтатистикаКонфигурации/Forms/ФормаСписка/Form.form index 3709758f7..1d97de376 100644 --- a/SSL/src/InformationRegisters/СтатистикаКонфигурации/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/СтатистикаКонфигурации/Forms/ФормаСписка/Form.form @@ -26,7 +26,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/СтатистикаКонфигурации/ManagerModule.bsl b/SSL/src/InformationRegisters/СтатистикаКонфигурации/ManagerModule.bsl index 65009c515..83d6c8ec6 100644 --- a/SSL/src/InformationRegisters/СтатистикаКонфигурации/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/СтатистикаКонфигурации/ManagerModule.bsl @@ -339,7 +339,7 @@ ОперацииСсылки = Новый Соответствие; Для Каждого ТекОбъект Из СтатистикаКонфигурации Цикл Если ТекОбъект.Значение["ВидСтатистики"] = 0 Тогда - РезультатЗапроса = ПолучитьРезультат(ТекОбъект.Значение["Запрос"]); + РезультатЗапроса = ПолучитьРезультат(ТекОбъект.Значение["Запрос"]); // @skip-check query-in-loop - Сбор большого объема данных из разных таблиц. ОперацииСтатистики = ПолучитьРезультатОперацииСтатистики(ТекОбъект.Ключ, РезультатЗапроса); ИначеЕсли ТекОбъект.Значение["ВидСтатистики"] = 1 Тогда Значение = ?(Константы[ТекОбъект.Значение["Запрос"].Имя].Получить(), 1, 0); @@ -398,7 +398,7 @@ ЗаписьЖурналаРегистрации(НСтр("ru = 'Центр мониторинга'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, НСтр("ru = 'Не удалось установить разделение сеанса. Область данных'") + " = " + Формат(Выборка.ОбластьДанных, "ЧГ=0") - + Символы.ПС + ПодробноеПредставлениеОшибки(Инфо)); + + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(Инфо)); Если БазоваяФункциональностьВМоделиСервисаСуществует Тогда МодульРаботаВМоделиСервиса.ВыйтиИзОбластиДанных(); @@ -408,7 +408,7 @@ КонецПопытки; - Записать(СтатистикаКонфигурации, ОбластьДанныхСсылка); + Записать(СтатистикаКонфигурации, ОбластьДанныхСсылка); // @skip-check query-in-loop - Чтение и запись данных в разных областях данных. Если БазоваяФункциональностьВМоделиСервисаСуществует Тогда МодульРаботаВМоделиСервиса.ВыйтиИзОбластиДанных(); diff --git a/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаЗаписи/Form.form index 6e35cbfb2..82bfe70e5 100644 --- a/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаЗаписи/Form.form @@ -219,7 +219,6 @@ UsualGroup Vertical - Auto true true Auto @@ -353,7 +352,6 @@ UsualGroup Vertical - Auto true true Auto @@ -382,7 +380,6 @@ UsualGroup AlwaysHorizontal - Auto true true Auto diff --git a/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаСписка/Form.form index 982d59682..76878db9b 100644 --- a/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true diff --git a/SSL/src/InformationRegisters/ТаблицыГруппДоступа/ManagerModule.bsl b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/ManagerModule.bsl index 9856b4adf..5ad8d3f99 100644 --- a/SSL/src/InformationRegisters/ТаблицыГруппДоступа/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/ManagerModule.bsl @@ -273,7 +273,16 @@ |&УсловиеОтбораГруппДоступа2:СтарыеДанные.ГруппаДоступа"); Блокировка = Новый БлокировкаДанных; - Блокировка.Добавить("РегистрСведений.ТаблицыГруппДоступа"); + Если ГруппыДоступа = Неопределено Тогда + Блокировка.Добавить("РегистрСведений.ТаблицыГруппДоступа"); + Иначе + ЗначенияБлокировки = ?(ТипЗнч(ГруппыДоступа) = Тип("Массив"), ГруппыДоступа, + ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ГруппыДоступа)); + Для Каждого ЗначениеБлокировки Из ЗначенияБлокировки Цикл + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ТаблицыГруппДоступа"); + ЭлементБлокировки.УстановитьЗначение("ГруппаДоступа", ЗначениеБлокировки); + КонецЦикла; + КонецЕсли; НачатьТранзакцию(); Попытка diff --git a/SSL/src/InformationRegisters/УдалитьНастройкиТранспортаОбмена/УдалитьНастройкиТранспортаОбмена.mdo b/SSL/src/InformationRegisters/УдалитьНастройкиТранспортаОбмена/УдалитьНастройкиТранспортаОбмена.mdo index 354c06272..8441bdaa7 100644 --- a/SSL/src/InformationRegisters/УдалитьНастройкиТранспортаОбмена/УдалитьНастройкиТранспортаОбмена.mdo +++ b/SSL/src/InformationRegisters/УдалитьНастройкиТранспортаОбмена/УдалитьНастройкиТранспортаОбмена.mdo @@ -216,7 +216,7 @@ Учетная запись электронной почты - CatalogRef.УчетныеЗаписиЭлектроннойПочты + DefinedType.ОбменДаннымиУчетныеЗаписиЭлектроннойПочты ru diff --git a/SSL/src/InformationRegisters/УдаляемыеОбъекты/УдаляемыеОбъекты.mdo b/SSL/src/InformationRegisters/УдаляемыеОбъекты/УдаляемыеОбъекты.mdo index 4cfb23e5b..a71215d8c 100644 --- a/SSL/src/InformationRegisters/УдаляемыеОбъекты/УдаляемыеОбъекты.mdo +++ b/SSL/src/InformationRegisters/УдаляемыеОбъекты/УдаляемыеОбъекты.mdo @@ -47,23 +47,8 @@ + Second Managed - - ВремяБлокировки - - ru - Время блокировки - - - Date - - - - - Use - Use - - Объект diff --git a/SSL/src/InformationRegisters/ФайлыВРабочемКаталоге/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ФайлыВРабочемКаталоге/Forms/ФормаСписка/Form.form index ff2939a72..17e532113 100644 --- a/SSL/src/InformationRegisters/ФайлыВРабочемКаталоге/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ФайлыВРабочемКаталоге/Forms/ФормаСписка/Form.form @@ -25,7 +25,6 @@ UsualGroup Vertical - Auto WeakSeparation true true @@ -514,6 +513,38 @@ ФормаКоманднаяПанель -1 + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + СтрокаПоиска + 42 + + СтрокаПоискаРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 43 + true + + Список + + true + + Left true diff --git a/SSL/src/InformationRegisters/ФиксацияОбработкиДанныхОбработчиками/ManagerModule.bsl b/SSL/src/InformationRegisters/ФиксацияОбработкиДанныхОбработчиками/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb 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/ФиксацияОбработкиДанныхОбработчиками/ФиксацияОбработкиДанныхОбработчиками.mdo b/SSL/src/InformationRegisters/ФиксацияОбработкиДанныхОбработчиками/ФиксацияОбработкиДанныхОбработчиками.mdo new file mode 100644 index 000000000..67290f539 --- /dev/null +++ b/SSL/src/InformationRegisters/ФиксацияОбработкиДанныхОбработчиками/ФиксацияОбработкиДанныхОбработчиками.mdo @@ -0,0 +1,69 @@ + + + + + + + + + + + + ФиксацияОбработкиДанныхОбработчиками + + ru + Фиксация обработки данных обработчиками + + true + InDialog + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + ИдентификаторТранзакции + + ru + Идентификатор транзакции + + + UUID + + + + Use + Use + + true + + diff --git a/SSL/src/InformationRegisters/ЭлектронныеПодписи/ManagerModule.bsl b/SSL/src/InformationRegisters/ЭлектронныеПодписи/ManagerModule.bsl index 98ca6e1c0..b6b06bec0 100644 --- a/SSL/src/InformationRegisters/ЭлектронныеПодписи/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ЭлектронныеПодписи/ManagerModule.bsl @@ -23,8 +23,8 @@ |ИЗ | РегистрСведений.ЭлектронныеПодписи КАК ЭлектронныеПодписи |ГДЕ - | (ЭлектронныеПодписи.ИмяФайлаПодписи ПОДОБНО ""%\%"" - | ИЛИ ЭлектронныеПодписи.ИмяФайлаПодписи ПОДОБНО ""%/%"")"; + | (ЭлектронныеПодписи.ИмяФайлаПодписи ПОДОБНО ""%\%"" СПЕЦСИМВОЛ ""~"" + | ИЛИ ЭлектронныеПодписи.ИмяФайлаПодписи ПОДОБНО ""%/%"" СПЕЦСИМВОЛ ""~"")"; ДополнительныеПараметры = ОбновлениеИнформационнойБазы.ДополнительныеПараметрыОтметкиОбработки(); ДополнительныеПараметры.ЭтоНезависимыйРегистрСведений = Истина; @@ -82,7 +82,7 @@ НСтр("ru = 'Не удалось обработать запись регистра %1 по причине: |%2'"), ПолучитьНавигационнуюСсылку(КлючЗаписи), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЗаписьЖурналаРегистрации( ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, diff --git a/SSL/src/Reports/АнализЖурналаРегистрации/ManagerModule.bsl b/SSL/src/Reports/АнализЖурналаРегистрации/ManagerModule.bsl index c1cbeb621..b4127cfa2 100644 --- a/SSL/src/Reports/АнализЖурналаРегистрации/ManagerModule.bsl +++ b/SSL/src/Reports/АнализЖурналаРегистрации/ManagerModule.bsl @@ -144,11 +144,7 @@ Если ВариантОтчета = "АктивностьПользователя" Тогда ПользовательФильтр.Добавить(ИмяПользователяИБ(Пользователь)); ИначеЕсли ТипЗнч(ПользователиИГруппы) = Тип("СписокЗначений") Тогда - - Для Каждого Элемент Из ПользователиИГруппы Цикл - ПользователиДляАнализа(ПользовательФильтр, Элемент.Значение); - КонецЦикла; - + ПользователиДляАнализа(ПользовательФильтр, ПользователиИГруппы.ВыгрузитьЗначения()); Иначе ПользователиДляАнализа(ПользовательФильтр, ПользователиИГруппы); КонецЕсли; @@ -533,25 +529,33 @@ //////////////////////////////////////////////////////////////////////////////// // Анализ активности пользователей. -Функция ПользователиДляАнализа(ПользовательФильтр, Элемент) +Функция ПользователиДляАнализа(ПользовательФильтр, Знач ПользователиИГруппы) - Если ТипЗнч(Элемент) = Тип("СправочникСсылка.Пользователи") Тогда - ИмяПользователяИБ = ИмяПользователяИБ(Элемент); - - Если ИмяПользователяИБ <> Неопределено Тогда - ПользовательФильтр.Добавить(ИмяПользователяИБ); - КонецЕсли; - - ИначеЕсли ТипЗнч(Элемент) = Тип("СправочникСсылка.ГруппыПользователей") Тогда - - ВсеПользователи = Справочники.ГруппыПользователей.ВсеПользователи; - Если Элемент = ВсеПользователи Тогда + Если Не ТипЗнч(ПользователиИГруппы) = Тип("Массив") Тогда + ПользователиИГруппы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПользователиИГруппы); + КонецЕсли; + + ГруппыДляПолученияПользователей = Новый Массив; + ВсеПользователи = Справочники.ГруппыПользователей.ВсеПользователи; + Для Каждого ПользовательИлиГруппа Из ПользователиИГруппы Цикл + Если ТипЗнч(ПользовательИлиГруппа) = Тип("СправочникСсылка.Пользователи") Тогда + ИмяПользователяИБ = ИмяПользователяИБ(ПользовательИлиГруппа); + + Если ИмяПользователяИБ <> Неопределено Тогда + ПользовательФильтр.Добавить(ИмяПользователяИБ); + КонецЕсли; + ИначеЕсли ПользовательИлиГруппа = ВсеПользователи Тогда ПользовательФильтр.Добавить("ВсеПользователи"); Возврат ПользовательФильтр; + ИначеЕсли ТипЗнч(ПользовательИлиГруппа) = Тип("СправочникСсылка.ГруппыПользователей") Тогда + ГруппыДляПолученияПользователей.Добавить(ПользовательИлиГруппа); КонецЕсли; + КонецЦикла; + + Если ГруппыДляПолученияПользователей.Количество() > 0 Тогда Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Группа", Элемент); + Запрос.УстановитьПараметр("Группа", ГруппыДляПолученияПользователей); Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | СоставыГруппПользователей.Пользователь КАК Пользователь diff --git a/SSL/src/Reports/АнализЖурналаРегистрации/Templates/ПродолжительностьРаботыРегламентныхЗаданий/Template.mxlx b/SSL/src/Reports/АнализЖурналаРегистрации/Templates/ПродолжительностьРаботыРегламентныхЗаданий/Template.mxlx index 92421e6c1..cf5f07db1 100644 --- a/SSL/src/Reports/АнализЖурналаРегистрации/Templates/ПродолжительностьРаботыРегламентныхЗаданий/Template.mxlx +++ b/SSL/src/Reports/АнализЖурналаРегистрации/Templates/ПродолжительностьРаботыРегламентныхЗаданий/Template.mxlx @@ -3012,7 +3012,7 @@ 1 true 2016-07-01T00:00:00 - 2016-07-10T19:59:59 + 2016-07-10T18:59:59 2016-07-01T00:00:00 Gradient 3 @@ -3032,7 +3032,7 @@ Solid - Auto + Show Auto Auto Auto diff --git a/SSL/src/Reports/АнализОпроса/Forms/ФормаОтчета/Form.form b/SSL/src/Reports/АнализОпроса/Forms/ФормаОтчета/Form.form index 91d98a668..9d7d90cc7 100644 --- a/SSL/src/Reports/АнализОпроса/Forms/ФормаОтчета/Form.form +++ b/SSL/src/Reports/АнализОпроса/Forms/ФормаОтчета/Form.form @@ -133,7 +133,6 @@ UsualGroup HorizontalIfPossible - Auto true true Auto diff --git a/SSL/src/Reports/АнализОпроса/ObjectModule.bsl b/SSL/src/Reports/АнализОпроса/ObjectModule.bsl index 45a1febfa..e1b5170c6 100644 --- a/SSL/src/Reports/АнализОпроса/ObjectModule.bsl +++ b/SSL/src/Reports/АнализОпроса/ObjectModule.bsl @@ -39,11 +39,15 @@ #Область АнализОтветов -Процедура СформироватьОтчетАнализОтветов(ТаблицаОтчета,Опрос) +// Параметры: +// ТаблицаОтчета - ТабличныйДокумент +// Опрос - ДокументСсылка.НазначениеОпросов +// +Процедура СформироватьОтчетАнализОтветов(ТаблицаОтчета, Опрос) - РеквизитыОпрос = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Опрос,"ШаблонАнкеты,ДатаНачала,ДатаОкончания,Представление"); + РеквизитыОпрос = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Опрос, "ШаблонАнкеты,ДатаНачала,ДатаОкончания,Представление"); ШаблонАнкеты = РеквизитыОпрос.ШаблонАнкеты; - ПредставленияВопросов = Анкетирование.ПолучитьПредставленияЭлементарныхВопросовТабличногоВопроса(ШаблонАнкеты); + ПредставленияВопросов = Анкетирование.ПредставленияЭлементарныхВопросовТабличногоВопроса(ШаблонАнкеты); РезультатЗапроса = ВыполнитьЗапросПоВопросамШаблонаАнкеты(Опрос,ШаблонАнкеты); Если РезультатЗапроса.Пустой() Тогда @@ -52,7 +56,7 @@ Макет = ПолучитьМакет("МакетОтветы"); - Область = Макет.ПолучитьОбласть("Заголовок");// ТабличныйДокумент + Область = Макет.ПолучитьОбласть("Заголовок"); // ТабличныйДокумент Область.Параметры.Заголовок = ШаблонАнкеты.Заголовок; Область.Параметры.Опрос = ПредставлениеОпросаДляЗаголовка(РеквизитыОпрос); ТаблицаОтчета.Вывести(Область,1); diff --git a/SSL/src/Reports/АнализПравДоступа/ManagerModule.bsl b/SSL/src/Reports/АнализПравДоступа/ManagerModule.bsl index 28acbb2d9..7ab1ad405 100644 --- a/SSL/src/Reports/АнализПравДоступа/ManagerModule.bsl +++ b/SSL/src/Reports/АнализПравДоступа/ManagerModule.bsl @@ -58,29 +58,36 @@ МодульВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, НастройкиОтчета, Ложь); НастройкиОтчета.ОпределитьНастройкиФормы = Истина; - + НастройкиВарианта = МодульВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "АнализПравДоступа"); - НастройкиВарианта.Описание = НСтр("ru = 'Показывает текущие настройки прав доступа пользователей к таблицам информационной базы.'"); + НастройкиВарианта.Описание = НСтр("ru = 'Показывает права пользователей на таблицы информационной базы (можно включить группировку по отчетам).'"); НастройкиВарианта = МодульВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "ПраваПользователейНаТаблицы"); + НастройкиВарианта.Описание = НСтр("ru = 'Показывает права пользователей на таблицы информационной базы.'"); НастройкиВарианта.Включен = Ложь; - + НастройкиВарианта = МодульВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "ПраваПользователяНаТаблицы"); + НастройкиВарианта.Описание = НСтр("ru = 'Показывает права отдельного пользователя на разные таблицы информационной базы.'"); НастройкиВарианта.Включен = Ложь; - + НастройкиВарианта = МодульВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "ПраваПользователейНаТаблицу"); + НастройкиВарианта.Описание = НСтр("ru = 'Показывает права разных пользователей на одну таблицу информационной базы.'"); НастройкиВарианта.Включен = Ложь; НастройкиВарианта = МодульВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "ПраваПользователяНаТаблицу"); + НастройкиВарианта.Описание = НСтр("ru = 'Показывает права одного пользователя на одну таблицу информационной базы с настройками ограничений на уровне записей (RLS).'"); НастройкиВарианта.Включен = Ложь; - + НастройкиВарианта = МодульВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "ПраваПользователяНаТаблицыОтчета"); + НастройкиВарианта.Описание = НСтр("ru = 'Показывает права отдельного пользователя на разные таблицы информационной базы, используемые в отдельном отчете.'"); НастройкиВарианта.Включен = Ложь; - + НастройкиВарианта = МодульВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "ПраваПользователейНаТаблицыОтчета"); + НастройкиВарианта.Описание = НСтр("ru = 'Показывает права разных пользователей на разные таблицы информационной базы, используемые в отдельном отчете.'"); НастройкиВарианта.Включен = Ложь; - + НастройкиВарианта = МодульВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "ПраваПользователяНаТаблицыОтчетов"); + НастройкиВарианта.Описание = НСтр("ru = 'Показывает права отдельного пользователя на разные таблицы информационной базы, сгруппированные по отчетам.'"); НастройкиВарианта.Включен = Ложь; КонецПроцедуры @@ -418,6 +425,7 @@ ВидыДоступа.Свернуть("ВидДоступа"); ВидыДоступа.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150))); + ИспользуемыеВидыДоступа = УправлениеДоступомСлужебный.ИспользуемыеВидыДоступа(); Индекс = ВидыДоступа.Количество()-1; Пока Индекс >= 0 Цикл @@ -435,7 +443,7 @@ КонецЕсли; ИначеЕсли Не ТолькоИспользуемые - Или УправлениеДоступомСлужебный.ВидДоступаИспользуется(Строка.ВидДоступа) Тогда + Или ИспользуемыеВидыДоступа.Получить(СвойстваВидаДоступа.Ссылка) <> Неопределено Тогда Строка.Представление = УправлениеДоступомСлужебный.ПредставлениеВидаДоступа(СвойстваВидаДоступа); Иначе diff --git a/SSL/src/Reports/АнализПравДоступа/ObjectModule.bsl b/SSL/src/Reports/АнализПравДоступа/ObjectModule.bsl index b503dfb5c..89c8076fb 100644 --- a/SSL/src/Reports/АнализПравДоступа/ObjectModule.bsl +++ b/SSL/src/Reports/АнализПравДоступа/ObjectModule.bsl @@ -52,6 +52,10 @@ Форма.ВариантыКонтекста.Очистить(); Форма.ВариантыКонтекста.Добавить(Форма.КлючТекущегоВарианта); КонецЕсли; + Если ЗначениеЗаполнено(Форма.КонтекстВарианта) Тогда + Форма.ФормаПараметры.НачальныйКлючВарианта = Форма.КлючТекущегоВарианта; + Форма.ФормаПараметры.Отбор.Вставить("НачальныйОтбор"); + КонецЕсли; Если УправлениеДоступомСлужебный.УпрощенныйИнтерфейсНастройкиПравДоступа() Тогда Форма.НастройкиОтчета.СхемаМодифицирована = Истина; @@ -341,6 +345,7 @@ РасшифровкиСтрок.Вставить(НомерСтроки, ЗначенияПолей); Если ШрифтПравоНеНазначено = Неопределено Тогда ШрифтПравоНеНазначено = Область.Шрифт; + //@skip-check new-font - Используется стандартный шрифт, увеличенный до 120% с наклоном. ШрифтПравоРазрешено = Новый Шрифт(ШрифтПравоНеНазначено,,, Истина,,,, 120); ШрифтПравоЗапрещено = ШрифтПравоРазрешено; КонецЕсли; @@ -692,7 +697,7 @@ | ИНАЧЕ 0 | КОНЕЦ КАК Право, | СоставыГруппПользователей.Пользователь КАК Пользователь, - | СоставыГруппПользователей.Используется КАК ВходВПрограммуРазрешен + | ЕСТЬNULL(СведенияОПользователях.ВходВПрограммуРазрешен, ЛОЖЬ) КАК ВходВПрограммуРазрешен |ИЗ | ПраваПрофилейНаТаблицы КАК ПраваПрофилей | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа @@ -702,7 +707,10 @@ | ПО (УчастникиГруппДоступа.Ссылка = ГруппыДоступа.Ссылка) | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей | ПО (СоставыГруппПользователей.ГруппаПользователей = УчастникиГруппДоступа.Пользователь) - | И (СоставыГруппПользователей.Пользователь <> &ПользовательНеУказан)"; + | И (СоставыГруппПользователей.Пользователь <> &ПользовательНеУказан) + | И (&УсловиеОтбораПоПользователям) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях + | ПО (СведенияОПользователях.Пользователь = СоставыГруппПользователей.Пользователь)"; ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаНачало = "ВЫБРАТЬ @@ -721,7 +729,8 @@ | ПраваПрофилейНаТаблицы КАК ПраваПрофилей)) | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей | ПО (СоставыГруппПользователей.ГруппаПользователей = УчастникиГруппДоступа.Пользователь) - | И (СоставыГруппПользователей.Пользователь <> &ПользовательНеУказан)"; + | И (СоставыГруппПользователей.Пользователь <> &ПользовательНеУказан) + | И (&УсловиеОтбораПоПользователям)"; ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаВидыОграниченийПоСтарому = "ВЫБРАТЬ @@ -991,7 +1000,7 @@ | ИНАЧЕ ВидыИЗначенияДоступа.ЗначениеДоступа | КОНЕЦ КАК ЗначениеДоступа, | СоставыГруппПользователей.Пользователь КАК Пользователь, - | СоставыГруппПользователей.Используется КАК ВходВПрограммуРазрешен + | ЕСТЬNULL(СведенияОПользователях.ВходВПрограммуРазрешен, ЛОЖЬ) КАК ВходВПрограммуРазрешен |ИЗ | ПраваПрофилейНаТаблицы КАК ПраваПрофилей | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа @@ -1035,7 +1044,10 @@ | ПО (ПустыеСсылкиЗначенийДоступа.ПустаяСсылка = ВидыИЗначенияДоступа.ЗначениеДоступа) | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей | ПО (СоставыГруппПользователей.ГруппаПользователей = УчастникиГруппДоступа.Пользователь) - | И (СоставыГруппПользователей.Пользователь <> &ПользовательНеУказан)"; + | И (СоставыГруппПользователей.Пользователь <> &ПользовательНеУказан) + | И (&УсловиеОтбораПоПользователям) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях + | ПО (СведенияОПользователях.Пользователь = СоставыГруппПользователей.Пользователь)"; ТекстЗапросаСГруппировкойПоОтчетамДополнение = "ВЫБРАТЬ @@ -1210,7 +1222,7 @@ | ИНАЧЕ 0 | КОНЕЦ КАК Право, | СоставыГруппПользователей.Пользователь КАК Пользователь, - | СоставыГруппПользователей.Используется КАК ВходВПрограммуРазрешен + | ЕСТЬNULL(СведенияОПользователях.ВходВПрограммуРазрешен, ЛОЖЬ) КАК ВходВПрограммуРазрешен |ПОМЕСТИТЬ ПраваПользователей |ИЗ | ПраваПрофилей КАК ПраваПрофилей @@ -1221,7 +1233,10 @@ | ПО (УчастникиГруппДоступа.Ссылка = ГруппыДоступа.Ссылка) | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей | ПО (СоставыГруппПользователей.ГруппаПользователей = УчастникиГруппДоступа.Пользователь) - | И (СоставыГруппПользователей.Пользователь <> &ПользовательНеУказан)"; + | И (СоставыГруппПользователей.Пользователь <> &ПользовательНеУказан) + | И (&УсловиеОтбораПоПользователям) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях + | ПО (СведенияОПользователях.Пользователь = СоставыГруппПользователей.Пользователь)"; ТекстЗапросаСГруппировкойПоОтчетамКонечный = "ВЫБРАТЬ РАЗЛИЧНЫЕ @@ -1288,9 +1303,15 @@ Запрос = Новый Запрос; УсловиеОтбораПоПользователям = ""; + УсловиеОтбораПоВходВПрограммуРазрешен = ""; Если ОтборПоВходВПрограммуРазрешен() Тогда - УсловиеОтбораПоПользователям = " - | И СоставыГруппПользователей.Используется"; + ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаНачало = + ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаНачало + " + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях + | ПО (СведенияОПользователях.Пользователь = СоставыГруппПользователей.Пользователь) + | И (СведенияОПользователях.ВходВПрограммуРазрешен)"; + УсловиеОтбораПоВходВПрограммуРазрешен = " + | И (СведенияОПользователях.ВходВПрограммуРазрешен)"; КонецЕсли; ОтборПоВидуПользователей = ОтборПоВидуПользователей(); @@ -1298,7 +1319,7 @@ Если ЗначениеЗаполнено(ОтборПоПользователям.Значение) И ОтборПоПользователям.БезГрупп Тогда Запрос.УстановитьПараметр("ВыбранныеПользователиБезГрупп", ОтборПоПользователям.Значение); УсловиеОтбораПоПользователям = УсловиеОтбораПоПользователям + " - | И СоставыГруппПользователей.Пользователь В (&ВыбранныеПользователиБезГрупп)"; + | И (СоставыГруппПользователей.Пользователь В (&ВыбранныеПользователиБезГрупп))"; ИначеЕсли ЗначениеЗаполнено(ОтборПоПользователям.Значение) Тогда Запрос.УстановитьПараметр("ВыбранныеПользователиИГруппы", ОтборПоПользователям.Значение); @@ -1315,6 +1336,7 @@ УсловиеОтбораПоПользователям = УсловиеОтбораПоПользователям + " | И (ТИПЗНАЧЕНИЯ(СоставыГруппПользователей.Пользователь) = ТИП(Справочник.ВнешниеПользователи))"; КонецЕсли; + УсловиеОтбораПоПользователям = Сред(УсловиеОтбораПоПользователям, 4); ВключенаГруппировкаПоОтчетам = ВключенаГруппировкаПоОтчетам(); ВариантСОграничениямиДоступа = ВариантСОграничениямиДоступа(); @@ -1341,7 +1363,6 @@ Отчеты.АнализПравДоступа.ВидыОграниченийПрав()); КонецЕсли; ТекстЗапросаОсновной = ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаНачало - + УсловиеОтбораПоПользователям + ОбщегоНазначения.РазделительПакетаЗапросов() + ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаВидыОграничений + ОбщегоНазначения.РазделительПакетаЗапросов() @@ -1388,7 +1409,15 @@ Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборОтчетовПоТаблицам", "ИСТИНА"); КонецЕсли; - Запрос.Текст = Запрос.Текст + УсловиеОтбораПоПользователям; + Запрос.Текст = СтрЗаменить(Запрос.Текст, + "И (&УсловиеОтбораПоПользователям)", УсловиеОтбораПоПользователям); + + Если ЗначениеЗаполнено(УсловиеОтбораПоВходВПрограммуРазрешен) Тогда + Запрос.Текст = Запрос.Текст + УсловиеОтбораПоВходВПрограммуРазрешен; + Запрос.Текст = СтрЗаменить(Запрос.Текст, + "ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях", + "ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях"); + КонецЕсли; Если ВключенаГруппировкаПоОтчетам Тогда Запрос.Текст = Запрос.Текст + " diff --git a/SSL/src/Reports/АнализПравДоступа/Templates/Макет/Template.dcs b/SSL/src/Reports/АнализПравДоступа/Templates/Макет/Template.dcs index c2e04f15a..b93272f92 100644 --- a/SSL/src/Reports/АнализПравДоступа/Templates/Макет/Template.dcs +++ b/SSL/src/Reports/АнализПравДоступа/Templates/Макет/Template.dcs @@ -1001,6 +1001,18 @@ + + НачальныйОтбор + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Начальный отбор</v8:content> + </v8:item> + + + true + false +
  • Использовать альтернативный сервис "Морфер"